diff --git a/Makefile b/Makefile index 3ca7182f..2b866fbe 100644 --- a/Makefile +++ b/Makefile @@ -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..." diff --git a/bin/game b/bin/game deleted file mode 100755 index 890c72cc..00000000 --- a/bin/game +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -./gameserver -f ../conf/gameserver.conf > gameserver_$(date '+%y%m%d_%H%M').out & diff --git a/bin/login b/bin/login deleted file mode 100755 index 8f1a9d65..00000000 --- a/bin/login +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -./loginserver -f ../conf/loginserver.conf > loginserver_$(date '+%y%m%d_%H%M').out & diff --git a/bin/share b/bin/share deleted file mode 100755 index c1b51834..00000000 --- a/bin/share +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -./sharedserver -f ../conf/sharedserver.conf > sharedserver_$(date '+%y%m%d_%H%M').out & diff --git a/bin/start.sh b/bin/start.sh deleted file mode 100755 index 390067a9..00000000 --- a/bin/start.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh -killall gameserver -killall sharedserver -killall loginserver - -sleep 1 -cd /home/darkeden/vs/bin - -rm -rf loginserver*.out -rm -rf gameserver*.out -rm -rf sharedserver*.out - -sleep 3 -./login & -echo "login server started" - -sleep 1 -./share & -echo "shared server started" - -sleep 1 -./game & -echo "game server started" - - -echo "ALL - START" diff --git a/bin/stop.sh b/bin/stop.sh deleted file mode 100755 index 9955d899..00000000 --- a/bin/stop.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -killall gameserver -killall sharedserver -killall loginserver diff --git a/lib/.gitignore b/lib/.gitignore deleted file mode 100644 index e69de29b..00000000 diff --git a/src/Core/BloodBibleSignInfo.cpp b/src/Core/BloodBibleSignInfo.cpp index 97a02692..adbc7dd0 100644 --- a/src/Core/BloodBibleSignInfo.cpp +++ b/src/Core/BloodBibleSignInfo.cpp @@ -2,8 +2,8 @@ // // Filename : BloodBibleSignInfo.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -39,7 +39,7 @@ BloodBibleSignInfo::~BloodBibleSignInfo() { ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void BloodBibleSignInfo::read(SocketInputStream& iStream) { __BEGIN_TRY @@ -58,7 +58,7 @@ void BloodBibleSignInfo::read(SocketInputStream& iStream) { ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void BloodBibleSignInfo::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/BloodBibleSignInfo.h b/src/Core/BloodBibleSignInfo.h index 3e7d14ea..2d23a667 100644 --- a/src/Core/BloodBibleSignInfo.h +++ b/src/Core/BloodBibleSignInfo.h @@ -2,8 +2,8 @@ // Filename : BloodBibleSignInfo.h // Written By : elca@ewestsoft.com // Description : -// ԰ ִ ۵ Ʈ̴. -// ۿ BloodBibleSignSlotInfo ϸ ȴ. +// 입고 있는 기어 아이템들의 정보 리스트이다. +// 각각의 기어 아이템에 대한 정보는 BloodBibleSignSlotInfo를 참조하면 된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __BLOOD_BIBLE_SIGN_INFO_H__ diff --git a/src/Core/CGAbsorbSoul.h b/src/Core/CGAbsorbSoul.h index 7ee6a87a..b50244be 100644 --- a/src/Core/CGAbsorbSoul.h +++ b/src/Core/CGAbsorbSoul.h @@ -32,10 +32,10 @@ class CGAbsorbSoul : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -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 좌표 }; diff --git a/src/Core/CGAbsorbSoulHandler.cpp b/src/Core/CGAbsorbSoulHandler.cpp index f816981e..09952f21 100644 --- a/src/Core/CGAbsorbSoulHandler.cpp +++ b/src/Core/CGAbsorbSoulHandler.cpp @@ -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(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; diff --git a/src/Core/CGAcceptUnion.h b/src/Core/CGAcceptUnion.h index 9252753c..4e98059f 100644 --- a/src/Core/CGAcceptUnion.h +++ b/src/Core/CGAcceptUnion.h @@ -25,10 +25,10 @@ class CGAcceptUnion : public Packet { public: CGAcceptUnion() {}; ~CGAcceptUnion() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGAcceptUnionHandler.cpp b/src/Core/CGAcceptUnionHandler.cpp index ed83619e..1572eb38 100644 --- a/src/Core/CGAcceptUnionHandler.cpp +++ b/src/Core/CGAcceptUnionHandler.cpp @@ -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 @@ -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); @@ -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; @@ -108,7 +108,7 @@ void CGAcceptUnionHandler::execute(CGAcceptUnion* pPacket, Player* pPlayer) END_DB(pStmt) - // ոͰ վ̵ UNION_MASTER ϰ.. + // 연합마스터가 된 아한테 연합아이디와 UNION_MASTER를 보내줘야 하고.. Creature* pCreature = NULL; pCreature = pGamePlayer->getCreature(); @@ -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)) @@ -142,20 +142,20 @@ void CGAcceptUnionHandler::execute(CGAcceptUnion* pPacket, Player* pPlayer) ////////////////////////////// - // ִ 鿡 ˸. + // 내 서버에 있는 놈들에게 변경사항을 알린다. sendGCOtherModifyInfoGuildUnion(pTargetCreature); sendGCOtherModifyInfoGuildUnion(pCreature); - // ٸ ִ 鿡 ˸. + // 다른 서버에 있는 놈들에게 변경사항을 알린다. GuildUnionManager::Instance().sendModifyUnionInfo(dynamic_cast(pTargetCreature)->getGuildID()); GuildUnionManager::Instance().sendModifyUnionInfo(dynamic_cast(pCreature)->getGuildID()); - // GCModifyInformation / GCOtherModifyInfo ؼ . - // GCModifyInformation pPlayerCreature - // GCOtherModifyInfo broadcast Ѵ. - // ־ GuildUnionID GuildUnionGrade? + // GCModifyInformation / GCOtherModifyInfo 를 조립해서 날린다. + // GCModifyInformation 은 pPlayerCreature 에게 + // GCOtherModifyInfo 는 broadcast 한다. + // 넣어 보낼 정보는 GuildUnionID 와 GuildUnionGrade다? } #endif // __GAME_SERVER__ diff --git a/src/Core/CGAddGearToMouseHandler.cpp b/src/Core/CGAddGearToMouseHandler.cpp index d638f1b4..0a2fbf8a 100644 --- a/src/Core/CGAddGearToMouseHandler.cpp +++ b/src/Core/CGAddGearToMouseHandler.cpp @@ -43,16 +43,16 @@ void CGAddGearToMouseHandler::execute(CGAddGearToMouse* pPacket, Player* pPlayer Slayer* pSlayer = dynamic_cast(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; } @@ -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; } @@ -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; } diff --git a/src/Core/CGAddInjuriousCreature.cpp b/src/Core/CGAddInjuriousCreature.cpp index c2987794..6d45787c 100644 --- a/src/Core/CGAddInjuriousCreature.cpp +++ b/src/Core/CGAddInjuriousCreature.cpp @@ -11,7 +11,7 @@ void CGAddInjuriousCreature::read(SocketInputStream& iStream) { __BEGIN_TRY - // ̸ б + // 이름 읽기 BYTE szName; iStream.read(szName); @@ -32,7 +32,7 @@ void CGAddInjuriousCreature::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ̸ + // 이름 쓰기 BYTE szName = m_Name.size(); if (szName == 0) diff --git a/src/Core/CGAddInjuriousCreature.h b/src/Core/CGAddInjuriousCreature.h index 277a08d9..251a32ee 100644 --- a/src/Core/CGAddInjuriousCreature.h +++ b/src/Core/CGAddInjuriousCreature.h @@ -17,8 +17,8 @@ // // class CGAddInjuriousCreature; // -// Ŭ̾Ʈ AddInjuriousCreature Ŷ̴. -// ο AddInjuriousCreature String Ÿ ʵ . +// 클라이언트가 서버에게 보내는 AddInjuriousCreature 패킷이다. +// 내부에 AddInjuriousCreature String 만을 데이타 필드로 가진다. // ////////////////////////////////////////////////////////////////////// @@ -26,10 +26,10 @@ class CGAddInjuriousCreature : public Packet { public: CGAddInjuriousCreature() {}; ~CGAddInjuriousCreature() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -92,7 +92,7 @@ class CGAddInjuriousCreatureFactory : public PacketFactory { } // get packet's max body size - // message ִ ũ⿡ ʿϴ. + // message 의 최대 크기에 대한 설정이 필요하다. PacketSize_t getPacketMaxSize() const { return szBYTE + 10; } diff --git a/src/Core/CGAddInventoryToMouse.h b/src/Core/CGAddInventoryToMouse.h index a1e46dfb..00db108a 100644 --- a/src/Core/CGAddInventoryToMouse.h +++ b/src/Core/CGAddInventoryToMouse.h @@ -63,7 +63,7 @@ class CGAddInventoryToMouse : public Packet { private: ObjectID_t m_ObjectID; - // κ丮 Ʈ ̵. 0̸ κ丮 + // 보조 인벤토리 아이템의 오브젝트 아이디. 0이면 메인 인벤토리에서 꺼냄 ObjectID_t m_InventoryItemObjectID; CoordInven_t m_InvenX; diff --git a/src/Core/CGAddInventoryToMouseHandler.cpp b/src/Core/CGAddInventoryToMouseHandler.cpp index e6be1143..2661cf5f 100644 --- a/src/Core/CGAddInventoryToMouseHandler.cpp +++ b/src/Core/CGAddInventoryToMouseHandler.cpp @@ -57,7 +57,7 @@ void CGAddInventoryToMouseHandler::execute(CGAddInventoryToMouse* pPacket, Playe Inventory* pInventory = pPC->getInventory(); Assert(pInventory != NULL); - // κ丮 ǥ Ѿ ϴ... + // 인벤토리 좌표를 넘어가면 곤란하다... if (InvenX >= pInventory->getWidth() || InvenY >= pInventory->getHeight()) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -75,8 +75,8 @@ void CGAddInventoryToMouseHandler::execute(CGAddInventoryToMouse* pPacket, Playe return; } - // ϰ ϴ ų, ̹ 콺 پִٸ - // . + // 더하고자 하는 아이템이 없거나, 이미 마우스에 뭔가가 붙어있다면 + // 들 수 없다. if (pItem == NULL || pExtraSlotItem != NULL) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -84,9 +84,9 @@ void CGAddInventoryToMouseHandler::execute(CGAddInventoryToMouse* pPacket, Playe return; } - // Ϲ 콺 ϱ ƾ + // 일반적인 아이템 마우스 더하기 루틴 if (ItemOID != 0) { - // OID ġ ϴ... + // OID가 일치하지 않으면 곤란하다... if (pItem->getObjectID() != ItemOID) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -97,7 +97,7 @@ void CGAddInventoryToMouseHandler::execute(CGAddInventoryToMouse* pPacket, Playe pInventory->deleteItem(pItem->getObjectID()); pPC->addItemToExtraInventorySlot(pItem); // pItem->save(pPC->getName(), STORAGE_EXTRASLOT, 0, 0, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d, StorageID=0", STORAGE_EXTRASLOT); pItem->tinysave(pField); @@ -110,9 +110,9 @@ void CGAddInventoryToMouseHandler::execute(CGAddInventoryToMouse* pPacket, Playe pPlayer->sendPacket(&gcTradeVerify); } } - // ġ иϱ ƾ + // 겹치는 아이템 분리하기 루틴 else { - // ġ ƴϰų, ڰ 2 ̸̶ и . + // 겹치는 아이템이 아니거나, 현재 숫자가 2 미만이라면 분리할 수 없다. if (!isStackable(pItem) || pItem->getNum() < 2 || (pItem->getItemClass() == Item::ITEM_CLASS_MOON_CARD && pItem->getItemType() == 2 && pItem->getNum() == 99) || @@ -123,7 +123,7 @@ void CGAddInventoryToMouseHandler::execute(CGAddInventoryToMouse* pPacket, Playe return; } - // Ѵ. + // 기존의 아이템을 바탕으로 같은 아이템을 생성한다. Item::ItemClass IClass = pItem->getItemClass(); ItemType_t IType = pItem->getItemType(); const list& OType = pItem->getOptionTypeList(); @@ -131,18 +131,18 @@ void CGAddInventoryToMouseHandler::execute(CGAddInventoryToMouse* pPacket, Playe Item* pNewItem = g_pItemFactoryManager->createItem(IClass, IType, OType); Assert(pNewItem != NULL); - // 콺 OID , - // κ丮 ο OID ޾ƾ Ѵ. + // 마우스에다 더할 아이템은 기존의 OID를 가져가고, + // 인벤토리에 남을 아이템은 새로운 OID를 받아야 한다. Zone* pZone = pPC->getZone(); Assert(pZone != NULL); ObjectRegistry& OR = pZone->getObjectRegistry(); OR.registerObject(pNewItem); - // κ丮 ִ ڴ ڿ 1 ڰ ȴ. - // 콺 ŰǷ, ڰ 1 ȴ. - // κ丮 콺 Ű ϰ, - // Ѵ. + // 인벤토리에 남아있는 아이템의 숫자는 원래 숫자에서 1을 뺀 숫자가 된다. + // 기존의 아이템은 마우스로 옮겨졌으므로, 숫자가 1이 된다. + // 인벤토리에서 마우스로 옮겨진 아이템을 삭제하고, + // 새로 생성된 아이템을 더한다. pInventory->deleteItem(pItem->getObjectID()); pPC->addItemToExtraInventorySlot(pItem); @@ -152,23 +152,23 @@ void CGAddInventoryToMouseHandler::execute(CGAddInventoryToMouse* pPacket, Playe pInventory->addItem(InvenX, InvenY, pNewItem); - // ޶ ġ ̺Ѵ... + // 달라진 위치 정보를 세이브한다... // pItem->save(pPC->getName(), STORAGE_EXTRASLOT, 0, 0, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Num=%d, Storage=%d, StorageID=0", 1, STORAGE_EXTRASLOT); pItem->tinysave(pField); pNewItem->create(pPC->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); - // pNewItem->setNum(NewNum); // ߴµ ϳ. -_-; + // pNewItem->setNum(NewNum); // 위에서 했는데 또 하네. -_-; // pNewItem->save(pPC->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Num=%d, Storage=%d, StorageID=0", NewNum, STORAGE_INVENTORY); pNewItem->tinysave(pField); - // Ŭ̾ƮԴ GCCreateItem Ŷ ̿ - // κ丮 (?) ۿ ش. + // 클라이언트에게는 GCCreateItem 패킷을 이용해 + // 인벤토리에 새로이(?) 생성된 아이템에 대한 정보를 보내준다. GCCreateItem gcCreateItem; gcCreateItem.setObjectID(pNewItem->getObjectID()); gcCreateItem.setItemClass((BYTE)pNewItem->getItemClass()); diff --git a/src/Core/CGAddItemToItemHandler.cpp b/src/Core/CGAddItemToItemHandler.cpp index 0ddd3b4f..64c2ef88 100644 --- a/src/Core/CGAddItemToItemHandler.cpp +++ b/src/Core/CGAddItemToItemHandler.cpp @@ -5,20 +5,20 @@ ////////////////////////////////////////////////////////////////////////////// /* -//  ٸ ۿ ִ´. +// ÇÑ ¾ÆÀÌÅÛÀ» µé¾î¼­ ´Ù¸¥ ¾ÆÀÌÅÛ¿¡ ³Ö´Â´Ù. [Client] [Server] -- CGAddItemToItem (mouseItem_ObjectID, invenX, invenY) - =(콺 ִ , upgrade item XY) --> + =(¸¶¿ì½º¿¡ µé°íÀÖ´Â º°, upgradeÇÒ item XY) --> - <-- GCAddItemToItemVerify(ڵ, ð) --- + <-- GCAddItemToItemVerify(°á°úÄÚµå, °ü·Ã°ª) --- //-------------+--------------------------------------------- -// packet | client ó +// »ç¿ë packet | client ó¸® //-------------+--------------------------------------------- -// Ұ packet | Ұ message -// packet | message , , [ ] -// packet | , option +// ºÒ°¡ packet | ºÒ°¡ message Ãâ·Â +// ½ÇÆÐ packet | ½ÇÆÐ message Ãâ·Â, º° »èÁ¦, [¾ÆÀÌÅÛ Á¦°Å] +// ¼º°ø packet | º° »èÁ¦, optionº¯°æ //-------------+--------------------------------------------- */ @@ -68,7 +68,7 @@ void downgradeOptionType(Item* pItem, OptionType_t currentOptionType, OptionInfo void sendEnchantImpossible(GamePlayer* pGamePlayer); void sendEnchantOK(GamePlayer* pGamePlayer, DWORD optionChange); -// add by sonic Էصķ +// add by sonic ³åÈýÊôÐÔ·µ»ØµÄ·â°ü void sendEnchantOK(GamePlayer* pGamePlayer, DWORD optionChange, DWORD optionCHange2); #endif // __GAME_SERVER__ @@ -99,7 +99,7 @@ void CGAddItemToItemHandler::execute(CGAddItemToItem* pPacket, Player* pPlayer) CoordInven_t invenX = pPacket->getX(); CoordInven_t invenY = pPacket->getY(); - // κ丮 (ǥüũ ϰ ȴ.) + // Àκ¥Å丮¿¡ ¾ÆÀÌÅÛÀÌ ¾øÀ»¶§(ÁÂǥüũµµ ÇÏ°Ô µÈ´Ù.) if (!pInventory->hasItem(invenX, invenY)) { GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode(ADD_ITEM_TO_ITEM_VERIFY_ERROR); @@ -107,14 +107,14 @@ void CGAddItemToItemHandler::execute(CGAddItemToItem* pPacket, Player* pPlayer) return; } - // 콺 + // ¸¶¿ì½º ¾ÆÀÌÅÛ Item* pMouseItem = pPC->getExtraInventorySlotItem(); - // κ丮 ִ + // Àκ¥Å丮¿¡ ÀÖ´Â ¾ÆÀÌÅÛ Item* pItem = pInventory->getItem(invenX, invenY); - // ų - // objectID ߸ + // ¾ÆÀÌÅÛÀÌ ¾ø°Å³ª + // objectID°¡ À߸øµÈ °æ¿ì if (pMouseItem == NULL || pItem == NULL || pMouseItem->getObjectID() != objectID || pMouseItem->getNum() != 1) { // cout << "Wrong Item" << endl; @@ -131,7 +131,7 @@ void CGAddItemToItemHandler::execute(CGAddItemToItem* pPacket, Player* pPlayer) // ITEM_CLASS_EVENT_STAR // //--------------------------------------------------------- - // ɼ upgrade Ų. + // ¾ÆÀÌÅÛÀÇ ¿É¼ÇÀ» upgrade ½ÃŲ´Ù. //--------------------------------------------------------- case Item::ITEM_CLASS_EVENT_STAR: { ItemInfo* pItemInfo = g_pEventStarInfoManager->getItemInfo(pMouseItem->getItemType()); @@ -141,7 +141,7 @@ void CGAddItemToItemHandler::execute(CGAddItemToItem* pPacket, Player* pPlayer) Assert(pEventStarInfo != NULL); int optionSize = pItem->getOptionTypeSize(); - // װȼ + // Éý¼¶×°±¸µÈ¼¶ if ((pEventStarInfo->getFunctionFlag() & EventStarInfo::FUNCTION_UP_GRADE) != 0) { executeUpGrade(pGamePlayer, pMouseItem, pItem); } else if (pEventStarInfo->isFunctionTransKit()) { @@ -151,7 +151,7 @@ void CGAddItemToItemHandler::execute(CGAddItemToItem* pPacket, Player* pPlayer) else if (optionSize > 1) // by sigi. 2002.10.21 { if (pEventStarInfo->isFunctionEnchantRareOption()) { - if (pMouseItem->getItemType() == 6) // װ + if (pMouseItem->getItemType() == 6) // ³åÈýÊôÐÔ×°±¸ executeEnchantRareThreeOption(pGamePlayer, pMouseItem, pItem, invenX, invenY); else executeEnchantRareOption(pGamePlayer, pMouseItem, pItem, invenX, invenY); @@ -174,7 +174,7 @@ void CGAddItemToItemHandler::execute(CGAddItemToItem* pPacket, Player* pPlayer) case Item::ITEM_CLASS_PET_ENCHANT_ITEM: { // cout << "Trying Pet Enchant... " << endl; if (pItem->getItemClass() != Item::ITEM_CLASS_PET_ITEM) { - // cout << " ۿٰ Ѱ ƴԴ." << endl; + // cout << "Æê ¾ÆÀÌÅÛ¿¡´Ù°¡ ÇÑ°Ô ¾Æ´Ô´Ù." << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode(ADD_ITEM_TO_ITEM_VERIFY_ERROR); pGamePlayer->sendPacket(&gcAddItemToItemVerify); @@ -188,7 +188,7 @@ void CGAddItemToItemHandler::execute(CGAddItemToItem* pPacket, Player* pPlayer) PetItem* pPetItem = dynamic_cast(pItem); PetInfo* pPetInfo = NULL; if (pPetItem == NULL || (pPetInfo = pPetItem->getPetInfo()) == NULL) { - // cout << " ƴϰų ۿ ° ϴ." << endl; + // cout << "Æê ¾ÆÀÌÅÛÀÌ ¾Æ´Ï°Å³ª Æê ¾ÆÀÌÅÛ¿¡ Æê »óŰ¡ ¾ø½À´Ï´Ù." << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode(ADD_ITEM_TO_ITEM_VERIFY_ERROR); pGamePlayer->sendPacket(&gcAddItemToItemVerify); @@ -204,19 +204,19 @@ void CGAddItemToItemHandler::execute(CGAddItemToItem* pPacket, Player* pPlayer) switch (pItemInfo->getFunction()) { case PetEnchantItemInfo::ENCHANT_FUNCTION: { if (pPetInfo->getPetAttr() != 0xff) { - // cout << "̹ æƮ Դϴ." << endl; + // cout << "ÀÌ¹Ì ÀÎæƮµÈ ¾ÆÀÌÅÛÀÔ´Ï´Ù." << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode(ADD_ITEM_TO_ITEM_VERIFY_ERROR); pGamePlayer->sendPacket(&gcAddItemToItemVerify); return; } - // cout << "ǥ æƮ õԴϴ." << endl; + // cout << "Ç¥ÁØ ÀÎæƮ ½ÃµµÁßÀÔ´Ï´Ù." << endl; pPC->deleteItemFromExtraInventorySlot(); pMouseItem->destroy(); SAFE_DELETE(pMouseItem); if (PetAttrInfoManager::Instance().enchantRandomAttr(pPetInfo, pItemInfo->getFunctionGrade())) { - // cout << "æƮ ." << endl; + // cout << "ÀÎæƮ ¼º°ø." << endl; pPetItem->savePetInfo(); GCAddItemToItemVerify gcAddItemToItemVerify; @@ -227,13 +227,13 @@ void CGAddItemToItemHandler::execute(CGAddItemToItem* pPacket, Player* pPlayer) pGamePlayer->sendPacket(&gcAddItemToItemVerify); if (pPC->getPetInfo() == pPetInfo) { - // cout << "̹ ҷ־ Ŷ Դϴ." << endl; + // cout << "ÀÌ¹Ì ºÒ·¯Á®À־ ÆÐŶ º¸³»´Â ÁßÀÔ´Ï´Ù." << endl; sendPetInfo(pGamePlayer, true); pPC->initAllStatAndSend(); } return; } else { - // cout << "æƮ " << endl; + // cout << "ÀÎæƮ ½ÇÆÐ" << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode(ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_FAIL); pGamePlayer->sendPacket(&gcAddItemToItemVerify); @@ -242,7 +242,7 @@ void CGAddItemToItemHandler::execute(CGAddItemToItem* pPacket, Player* pPlayer) } break; case PetEnchantItemInfo::SPEC_OPTION_FUNCTION: { if (pPetInfo->getPetAttr() != 0xff) { - // cout << "̹ æƮ Դϴ." << endl; + // cout << "ÀÌ¹Ì ÀÎæƮµÈ ¾ÆÀÌÅÛÀÔ´Ï´Ù." << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode(ADD_ITEM_TO_ITEM_VERIFY_ERROR); pGamePlayer->sendPacket(&gcAddItemToItemVerify); @@ -276,9 +276,9 @@ void CGAddItemToItemHandler::execute(CGAddItemToItem* pPacket, Player* pPlayer) } } break; case PetEnchantItemInfo::RARE_FUNCTION: { - // cout << " æƮ Դϴ." << endl; + // cout << "Æê ·¹¾î ÀÎæƮ ÁßÀÔ´Ï´Ù." << endl; if (pPetInfo->getPetLevel() != 49) { - // cout << " ȵ æƮ " << endl; + // cout << "·¹º§µµ ¾ÈµÈ ³Ñ ÀÎæƮÇÏÁö ¸¶¼À" << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode(ADD_ITEM_TO_ITEM_VERIFY_ERROR); pGamePlayer->sendPacket(&gcAddItemToItemVerify); @@ -321,9 +321,9 @@ void CGAddItemToItemHandler::execute(CGAddItemToItem* pPacket, Player* pPlayer) pItem->tinysave(query); } break; case PetEnchantItemInfo::REVIVAL_FUNCTION: { - // cout << "Ȱ õ Դϴ." << endl; + // cout << "ºÎȰ ½ÃµµÁß ÀÔ´Ï´Ù." << endl; if (pPetInfo->getPetHP() != 0) { - // cout << " ȰŰ " << endl; + // cout << "¾È Á×Àº ¾Ö ºÎȰ½ÃŰÁö ¸¶¼À" << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode(ADD_ITEM_TO_ITEM_VERIFY_ERROR); pGamePlayer->sendPacket(&gcAddItemToItemVerify); @@ -361,7 +361,7 @@ void CGAddItemToItemHandler::execute(CGAddItemToItem* pPacket, Player* pPlayer) } break; case PetEnchantItemInfo::MUTANT_FUNCTION: { if (pPetInfo->getPetType() != 1) { - cout << " ƴ϶ϴ." << endl; + cout << "¿ïÇÁµ¶ÀÌ ¾Æ´Ï¶ø´Ï´Ù." << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode(ADD_ITEM_TO_ITEM_VERIFY_ERROR); pGamePlayer->sendPacket(&gcAddItemToItemVerify); @@ -423,7 +423,7 @@ void CGAddItemToItemHandler::execute(CGAddItemToItem* pPacket, Player* pPlayer) case Item::ITEM_CLASS_MIXING_ITEM: { if (pItem->getItemClass() != Item::ITEM_CLASS_PET_ITEM) { - // cout << " ۿٰ Ѱ ƴԴ." << endl; + // cout << "Æê ¾ÆÀÌÅÛ¿¡´Ù°¡ ÇÑ°Ô ¾Æ´Ô´Ù." << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode(ADD_ITEM_TO_ITEM_VERIFY_ERROR); pGamePlayer->sendPacket(&gcAddItemToItemVerify); @@ -435,7 +435,7 @@ void CGAddItemToItemHandler::execute(CGAddItemToItem* pPacket, Player* pPlayer) Assert(pItemInfo != NULL); if (pItemInfo->getType() != MixingItemInfo::TYPE_DETACH) { - // cout << " ۿٰ Ѱ ƴԴ." << endl; + // cout << "Æê ¾ÆÀÌÅÛ¿¡´Ù°¡ ÇÑ°Ô ¾Æ´Ô´Ù." << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode(ADD_ITEM_TO_ITEM_VERIFY_ERROR); pGamePlayer->sendPacket(&gcAddItemToItemVerify); @@ -445,7 +445,7 @@ void CGAddItemToItemHandler::execute(CGAddItemToItem* pPacket, Player* pPlayer) PetItem* pPetItem = dynamic_cast(pItem); PetInfo* pPetInfo = NULL; if (pPetItem == NULL || (pPetInfo = pPetItem->getPetInfo()) == NULL || pPetInfo->getPetOption() == 0) { - // cout << " ƴϰų ۿ ° ϴ." << endl; + // cout << "Æê ¾ÆÀÌÅÛÀÌ ¾Æ´Ï°Å³ª Æê ¾ÆÀÌÅÛ¿¡ Æê »óŰ¡ ¾ø½À´Ï´Ù." << endl; GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode(ADD_ITEM_TO_ITEM_VERIFY_ERROR); pGamePlayer->sendPacket(&gcAddItemToItemVerify); @@ -466,7 +466,7 @@ void CGAddItemToItemHandler::execute(CGAddItemToItem* pPacket, Player* pPlayer) pGamePlayer->sendPacket(&gcAddItemToItemVerify); if (pPC->getPetInfo() == pPetInfo) { - // cout << "̹ ҷ־ Ŷ Դϴ." << endl; + // cout << "ÀÌ¹Ì ºÒ·¯Á®À־ ÆÐŶ º¸³»´Â ÁßÀÔ´Ï´Ù." << endl; sendPetInfo(pGamePlayer, true); pPC->initAllStatAndSend(); } @@ -533,12 +533,12 @@ void executeEnchantRareThreeOption(GamePlayer* pGamePlayer, Item* pMouseItem, It PlayerCreature* pPC = dynamic_cast(pCreature); // Inventory* pInventory = pPC->getInventory(); - // Ȯ itemType ؼ ȴ. + // ½ÇÆÐÇÒ È®·üÀº itemType¿¡ ÀÇÇØ¼­ °áÁ¤µÈ´Ù. const ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo(pItem->getItemClass(), pItem->getItemType()); - // æƮ ҷ ɼ 2 ƴϰų - // ũ - // Ȥ 2 ̻ æƮҶ + // ÀÎæƮ ÇÒ·Á´Â ¾ÆÀÌÅÛÀÇ ÇöÀç ¿É¼ÇÀÌ 2°³°¡ ¾Æ´Ï°Å³ª + // À¯´ÏÅ© ¾ÆÀÌÅÛÀÎ °æ¿ì + // ȤÀº º°À» 2°³ ÀÌ»ó µé°í ÀÎæƮÇÒ¶ó°í ÇÒ ¶§ if (pItem->getOptionTypeSize() != 3 || pItemInfo->isUnique() || pMouseItem->getNum() != 1) { // cout << "no Option " << endl; sendEnchantImpossible(pGamePlayer); @@ -574,16 +574,16 @@ void executeEnchantRareThreeOption(GamePlayer* pGamePlayer, Item* pMouseItem, It // cout << "firstOption : " << pFirstOptionInfo->getName() << endl; // cout << "secondOption : " << pSecondOptionInfo->getName() << endl; // cout << "thirdOption : " << pThirdOptionInfo->getName() << endl; - // ƷԼ + // Éý¼¶ÎïÆ·ÊôÐÔ¼ì²é if (pFirstOptionInfo == NULL || pSecondOptionInfo == NULL || pThirdOptionInfo == NULL) { sendEnchantImpossible(pGamePlayer); return; } - // ǷǿƷ + // ¼ì²âÊÇ·ñÊÇ¿ÉÉý¼¶ÎïÆ· bool bFirstUpgradePossible = pFirstOptionInfo->isUpgradePossible(); bool bSecondUpgradePossible = pSecondOptionInfo->isUpgradePossible(); bool bThirdUpgradePossible = pThirdOptionInfo->isUpgradePossible(); - // + // ¼ì²âÊôÐÔÉý¼¶¿ÉÄÜ if (!bFirstUpgradePossible && !bSecondUpgradePossible && !bThirdUpgradePossible) { sendEnchantImpossible(pGamePlayer); return; @@ -591,18 +591,18 @@ void executeEnchantRareThreeOption(GamePlayer* pGamePlayer, Item* pMouseItem, It // if ((rand() %6000) > diceValue) // diceValue*=2; if (bFirstUpgradePossible) { - // ù° ɼ æƮ Ȯ 2 Ȯ . + // ù¹øÂ° ¿É¼ÇÀÇ ÀÎæƮ È®·üÀº ºí·çµå·Ó 2ÀÇ È®·ü¿¡ µû¸¥´Ù. int succeedRatio = pFirstOptionInfo->getUpgradeSecondRatio() * (pItemInfo->getUpgradeRatio() + (rand() % 50)); // int dice = rand()%10000; int dice = rand() % diceValue; cout << "dice : " << (int)dice << endl; cout << "diceValue : " << (int)diceValue << endl; - // cout << "ù° ɼ : " << pFirstOptionInfo->getHName() << " æƮ Ȯ " << succeedRatio << endl; + // cout << "ù¹øÂ° ¿É¼Ç : " << pFirstOptionInfo->getHName() << " ÀÎæƮ È®·ü " << succeedRatio << endl; // dice =succeedRatio-1; - if (dice < succeedRatio) // ͨװ + if (dice < succeedRatio) // Èç¹ûͨ¹ý£¬ÔòÉý¼¶×°±¸ { - // cout << "æƮ " << endl; + // cout << "ÀÎæƮ ¼º°ø" << endl; processUpgradeOptionType(pItem, firstOption, pFirstOptionInfo); OptionType_t upgradeOptionType = pFirstOptionInfo->getUpgradeType(); @@ -616,12 +616,12 @@ void executeEnchantRareThreeOption(GamePlayer* pGamePlayer, Item* pMouseItem, It int downgradeRatio = 46; dice = rand() % 100; - cout << "downgradeRatio" << pItemInfo->getName() << " ɼǶ Ȯ " << downgradeRatio << endl; + cout << "downgradeRatio" << pItemInfo->getName() << " ¿É¼Ç¶³¾îÁú È®·ü " << downgradeRatio << endl; if (dice < noChangeRatio) { - // ȭ + // º¯È­¾øÀ½ } else if (dice < noChangeRatio + downgradeRatio) { - // ɼǶ + // ¿É¼Ç¶³¾îÁü downgradeOptionType(pItem, firstOption, pFirstOptionInfo); OptionType_t previousOptionType = pFirstOptionInfo->getPreviousType(); @@ -633,7 +633,7 @@ void executeEnchantRareThreeOption(GamePlayer* pGamePlayer, Item* pMouseItem, It shiftValue -= 16; if (bSecondUpgradePossible) { - // ι° ɼ æƮ Ȯ ù° ɼ ο . + // µÎ¹øÂ° ¿É¼ÇÀÇ ÀÎæƮ È®·üÀº ù¹øÂ° ¿É¼ÇÀÇ ¼º°ø¿©ºÎ¿¡ µû¸¥´Ù. int succeedRatio = g_pOptionInfoManager->getRareUpgradeRatio(secondOption, bFirstSucceed) * (pItemInfo->getUpgradeRatio() + (rand() % 50)); @@ -641,10 +641,10 @@ void executeEnchantRareThreeOption(GamePlayer* pGamePlayer, Item* pMouseItem, It // int dice = rand() %10000; int dice = rand() % diceValue; - // cout << "ι° ɼ : " << pSecondOptionInfo->getHName() << " æƮ Ȯ " << succeedRatio << endl; + // cout << "µÎ¹øÂ° ¿É¼Ç : " << pSecondOptionInfo->getHName() << " ÀÎæƮ È®·ü " << succeedRatio << endl; // dice =succeedRatio-1; if (dice < succeedRatio) { - // cout << "æƮ " << endl; + // cout << "ÀÎæƮ ¼º°ø" << endl; processUpgradeOptionType(pItem, secondOption, pSecondOptionInfo); OptionType_t upgradeOptionType = pSecondOptionInfo->getUpgradeType(); @@ -658,12 +658,12 @@ void executeEnchantRareThreeOption(GamePlayer* pGamePlayer, Item* pMouseItem, It int downgradeRatio = 46; dice = rand() % 100; - cout << "downgradeRatio" << pItemInfo->getName() << " ɼǶ Ȯ " << downgradeRatio << endl; + cout << "downgradeRatio" << pItemInfo->getName() << " ¿É¼Ç¶³¾îÁú È®·ü " << downgradeRatio << endl; if (dice < noChangeRatio) { - // ȭ + // º¯È­¾øÀ½ } else if (dice < noChangeRatio + downgradeRatio) { - // ɼǶ + // ¿É¼Ç¶³¾îÁü downgradeOptionType(pItem, secondOption, pSecondOptionInfo); OptionType_t previousOptionType = pSecondOptionInfo->getPreviousType(); @@ -674,16 +674,16 @@ void executeEnchantRareThreeOption(GamePlayer* pGamePlayer, Item* pMouseItem, It } shiftValue = 0; if (bThirdUpgradePossible) { - // ι° ɼ æƮ Ȯ ù° ɼ ο . + // µÎ¹øÂ° ¿É¼ÇÀÇ ÀÎæƮ È®·üÀº ù¹øÂ° ¿É¼ÇÀÇ ¼º°ø¿©ºÎ¿¡ µû¸¥´Ù. int succeedRatio = g_pOptionInfoManager->getRareUpgradeRatio(thirdOption, bFirstSucceed) * (pItemInfo->getUpgradeRatio() + (rand() % 50)); // int dice = rand() %10000; int dice = rand() % diceValue; - // cout << "ι° ɼ : " << pSecondOptionInfo->getHName() << " æƮ Ȯ " << succeedRatio << endl; + // cout << "µÎ¹øÂ° ¿É¼Ç : " << pSecondOptionInfo->getHName() << " ÀÎæƮ È®·ü " << succeedRatio << endl; // dice =succeedRatio-1; if (dice < succeedRatio) { - // cout << "æƮ " << endl; + // cout << "ÀÎæƮ ¼º°ø" << endl; processUpgradeOptionType(pItem, thirdOption, pThirdOptionInfo); OptionType_t upgradeOptionType = pThirdOptionInfo->getUpgradeType(); @@ -696,12 +696,12 @@ void executeEnchantRareThreeOption(GamePlayer* pGamePlayer, Item* pMouseItem, It int downgradeRatio = 46; dice = rand() % 100; - cout << "downgradeRatio" << pItemInfo->getName() << " ɼǶ Ȯ " << downgradeRatio << endl; + cout << "downgradeRatio" << pItemInfo->getName() << " ¿É¼Ç¶³¾îÁú È®·ü " << downgradeRatio << endl; if (dice < noChangeRatio) { - // ȭ + // º¯È­¾øÀ½ } else if (dice < noChangeRatio + downgradeRatio) { - // ɼǶ + // ¿É¼Ç¶³¾îÁü downgradeOptionType(pItem, thirdOption, pThirdOptionInfo); OptionType_t previousOptionType = pThirdOptionInfo->getPreviousType(); @@ -712,16 +712,16 @@ void executeEnchantRareThreeOption(GamePlayer* pGamePlayer, Item* pMouseItem, It } EnOK: //{ - // ִ + // µé°í ÀÖ´Â º° »èÁ¦ pPC->deleteItemFromExtraInventorySlot(); - // DB + // DB¿¡¼­ »èÁ¦ pMouseItem->destroy(); - // ޸𸮿 + // ¸Þ¸ð¸®¿¡¼­ »èÁ¦ SAFE_DELETE(pMouseItem); - // Ŷ + // °á°ú ÆÐŶ º¸³»±â cout << "optionChange : " << optionChange << endl; sendEnchantOK(pGamePlayer, optionChange, optionChange2); @@ -737,16 +737,16 @@ void executeEnchantRareOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* p PlayerCreature* pPC = dynamic_cast(pCreature); // Inventory* pInventory = pPC->getInventory(); - // Ȯ itemType ؼ ȴ. + // ½ÇÆÐÇÒ È®·üÀº itemType¿¡ ÀÇÇØ¼­ °áÁ¤µÈ´Ù. const ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo(pItem->getItemClass(), pItem->getItemType()); - // æƮ ҷ ɼ 2 ƴϰų - // ũ - // Ȥ 2 ̻ æƮҶ - /* // add by Coffee 2006.11.2 жǷΪƷǾ͵¼ӵijԺ + // ÀÎæƮ ÇÒ·Á´Â ¾ÆÀÌÅÛÀÇ ÇöÀç ¿É¼ÇÀÌ 2°³°¡ ¾Æ´Ï°Å³ª + // À¯´ÏÅ© ¾ÆÀÌÅÛÀÎ °æ¿ì + // ȤÀº º°À» 2°³ ÀÌ»ó µé°í ÀÎæƮÇÒ¶ó°í ÇÒ ¶§ + /* // add by Coffee 2006.11.2 ÅжÏÊÇ·ñΪÈýÊôÐÔÎïÆ·£¬Èç¹ûÊǾ͵÷ÓÃмӵijäÈýÊôÐÔº¯Êý if (pItem->getOptionTypeSize() ==3); { - //װ + //³åÈýÊôÐÔ×°±¸ executeEnchantRareThreeOption(pGamePlayer, pMouseItem, pItem, invenX, invenY); return; } @@ -786,14 +786,14 @@ void executeEnchantRareOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* p } if (bFirstUpgradePossible) { - // ù° ɼ æƮ Ȯ 2 Ȯ . + // ù¹øÂ° ¿É¼ÇÀÇ ÀÎæƮ È®·üÀº ºí·çµå·Ó 2ÀÇ È®·ü¿¡ µû¸¥´Ù. int succeedRatio = pFirstOptionInfo->getUpgradeSecondRatio() * pItemInfo->getUpgradeRatio(); int dice = rand() % 10000; - // cout << "ù° ɼ : " << pFirstOptionInfo->getHName() << " æƮ Ȯ " << succeedRatio << endl; + // cout << "ù¹øÂ° ¿É¼Ç : " << pFirstOptionInfo->getHName() << " ÀÎæƮ È®·ü " << succeedRatio << endl; if (dice < succeedRatio) { - // cout << "æƮ " << endl; + // cout << "ÀÎæƮ ¼º°ø" << endl; processUpgradeOptionType(pItem, firstOption, pFirstOptionInfo); OptionType_t upgradeOptionType = pFirstOptionInfo->getUpgradeType(); @@ -805,22 +805,22 @@ void executeEnchantRareOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* p int downgradeRatio = pItemInfo->getDowngradeRatio(); dice = rand() % 100; - // cout << "æƮ : " << pItemInfo->getName() << " ɼǶ Ȯ " << downgradeRatio << endl; + // cout << "ÀÎæƮ ¾ÆÅÛ : " << pItemInfo->getName() << " ¿É¼Ç¶³¾îÁú È®·ü " << downgradeRatio << endl; if (dice < noChangeRatio) { - // ȭ + // º¯È­¾øÀ½ } else if (dice < noChangeRatio + downgradeRatio) { - // ɼǶ + // ¿É¼Ç¶³¾îÁü downgradeOptionType(pItem, firstOption, pFirstOptionInfo); OptionType_t previousOptionType = pFirstOptionInfo->getPreviousType(); optionChange = (firstOption << (shiftValue + 8)) | (previousOptionType << shiftValue); } else { - // ɼǾ + // ¿É¼Ç¾ø¾îÁü pItem->removeOptionType(firstOption); optionChange = (firstOption << (shiftValue + 8)); - // DB + // DBº¯°æ string optionField; setOptionTypeToField(pItem->getOptionTypeList(), optionField); @@ -833,29 +833,29 @@ void executeEnchantRareOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* p OptionType_t prev = pFirstOptionInfo->getPreviousType(); if (prev != 0) { - // ɼǶ Ȯ ؾ ȴ. + // ¿É¼Ç¶³¾îÁú È®·ü °è»êÇØ¾ß µÈ´Ù. int noChangeRatio = 33; int downgradeRatio = pItemInfo->getDowngradeRatio(); int dice = rand() % 100; - // cout << "ù° ɼ : " << pFirstOptionInfo->getHName() << " Ȯ : " << downgradeRatio << + // cout << "ù¹øÂ° ¿É¼Ç : " << pFirstOptionInfo->getHName() << " ¿É ¶³¾îÁú È®·ü : " << downgradeRatio << // endl; if (dice < noChangeRatio) { - // ȭ + // º¯È­¾øÀ½ } else if (dice < noChangeRatio + downgradeRatio) { - // ɼǶ + // ¿É¼Ç¶³¾îÁü downgradeOptionType(pItem, firstOption, pFirstOptionInfo); OptionType_t previousOptionType = pFirstOptionInfo->getPreviousType(); optionChange = (firstOption << (shiftValue + 8)) | (previousOptionType << shiftValue); } else { - // ɼǾ + // ¿É¼Ç¾ø¾îÁü pItem->removeOptionType(firstOption); optionChange = (firstOption << (shiftValue + 8)); - // DB + // DBº¯°æ string optionField; setOptionTypeToField(pItem->getOptionTypeList(), optionField); @@ -869,15 +869,15 @@ void executeEnchantRareOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* p shiftValue -= 16; if (bSecondUpgradePossible) { - // ι° ɼ æƮ Ȯ ù° ɼ ο . + // µÎ¹øÂ° ¿É¼ÇÀÇ ÀÎæƮ È®·üÀº ù¹øÂ° ¿É¼ÇÀÇ ¼º°ø¿©ºÎ¿¡ µû¸¥´Ù. int succeedRatio = g_pOptionInfoManager->getRareUpgradeRatio(secondOption, bFirstSucceed) * pItemInfo->getUpgradeRatio(); int dice = rand() % 10000; - // cout << "ι° ɼ : " << pSecondOptionInfo->getHName() << " æƮ Ȯ " << succeedRatio << endl; + // cout << "µÎ¹øÂ° ¿É¼Ç : " << pSecondOptionInfo->getHName() << " ÀÎæƮ È®·ü " << succeedRatio << endl; if (dice < succeedRatio) { - // cout << "æƮ " << endl; + // cout << "ÀÎæƮ ¼º°ø" << endl; processUpgradeOptionType(pItem, secondOption, pSecondOptionInfo); OptionType_t upgradeOptionType = pSecondOptionInfo->getUpgradeType(); @@ -889,22 +889,22 @@ void executeEnchantRareOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* p int downgradeRatio = pItemInfo->getDowngradeRatio(); dice = rand() % 100; - // cout << "æƮ : " << pItemInfo->getName() << " ɼǶ Ȯ " << downgradeRatio << endl; + // cout << "ÀÎæƮ ¾ÆÅÛ : " << pItemInfo->getName() << " ¿É¼Ç¶³¾îÁú È®·ü " << downgradeRatio << endl; if (dice < noChangeRatio) { - // ȭ + // º¯È­¾øÀ½ } else if (dice < noChangeRatio + downgradeRatio) { - // ɼǶ + // ¿É¼Ç¶³¾îÁü downgradeOptionType(pItem, secondOption, pSecondOptionInfo); OptionType_t previousOptionType = pSecondOptionInfo->getPreviousType(); optionChange |= (secondOption << (shiftValue + 8)) | (previousOptionType << shiftValue); } else { - // ɼǾ + // ¿É¼Ç¾ø¾îÁü pItem->removeOptionType(secondOption); optionChange |= (secondOption << (shiftValue + 8)); - // DB + // DBº¯°æ string optionField; setOptionTypeToField(pItem->getOptionTypeList(), optionField); @@ -917,28 +917,28 @@ void executeEnchantRareOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* p OptionType_t prev = pSecondOptionInfo->getPreviousType(); if (prev != 0) { - // ɼǶ Ȯ ؾ ȴ. + // ¿É¼Ç¶³¾îÁú È®·ü °è»êÇØ¾ß µÈ´Ù. int noChangeRatio = 33; int downgradeRatio = pItemInfo->getDowngradeRatio(); int dice = rand() % 100; - // cout << "ι° ɼ : " << pSecondOptionInfo->getHName() << " Ȯ : " << downgradeRatio << + // cout << "µÎ¹øÂ° ¿É¼Ç : " << pSecondOptionInfo->getHName() << " ¿É ¶³¾îÁú È®·ü : " << downgradeRatio << // endl; if (dice < noChangeRatio) { - // ȭ + // º¯È­¾øÀ½ } else if (dice < noChangeRatio + downgradeRatio) { - // ɼǶ + // ¿É¼Ç¶³¾îÁü downgradeOptionType(pItem, secondOption, pSecondOptionInfo); OptionType_t previousOptionType = pSecondOptionInfo->getPreviousType(); optionChange |= (secondOption << (shiftValue + 8)) | (previousOptionType << shiftValue); } else { - // ɼǾ + // ¿É¼Ç¾ø¾îÁü pItem->removeOptionType(secondOption); optionChange |= (secondOption << (shiftValue + 8)); - // DB + // DBº¯°æ string optionField; setOptionTypeToField(pItem->getOptionTypeList(), optionField); @@ -949,13 +949,13 @@ void executeEnchantRareOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* p } } - /* // ɼ Ұ ʴٰ .. - // ִ ´ Ȯϰ - // upgrade option 쿡... + /* // ¿É¼ÇÀÌ ¿©·¯°³ÀÎ °æ¿ì´Â ºÒ°¡´ÉÇÏÁö´Â ¾Ê´Ù°í º¸°í.. + // µé°í ÀÖ´Â ¾ÆÀÌÅÛÀÌ ¸Â´ÂÁö È®ÀÎÇϰí + // upgrade°¡´ÉÇÑ optionÀÎ °æ¿ì¿¡... //const list& optionList = pItem->getOptionTypeList(); - // ؼ .. + // º¹»çÇØ¼­ ¾´´Ù.. list::const_iterator itr = optionList.begin(); for (; itr!=optionList.end(); itr++) @@ -975,17 +975,17 @@ void executeEnchantRareOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* p if (bUpgradePossible) { //--------------------------------------------------------- - // item 1 츸 ֵ صд. - // 쵵 ϰ Ϸ - // ٿ߰.. client ؾ Ѵ. - // upgrade ұ? + // item°³¼ö°¡ 1°³ÀÎ °æ¿ì¸¸ ÇÒ ¼ö ÀÖµµ·Ï ÇØµÐ´Ù. + // ¿©·¯°³ÀÎ °æ¿ìµµ °¡´ÉÇÏ°Ô ÇÏ·Á¸é + // ¾ÆÀÌÅÛ °³¼ö¸¦ ÁÙ¿©¾ß°ÚÁö.. clientµµ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. + // upgrade ¼º°øÇÒ±î? //--------------------------------------------------------- - // ɼȮ * ŸȮ / 10000 + // ¿É¼ÇÈ®·ü * ŸÀÙÈ®·ü / 10000 //--------------------------------------------------------- - // ù° ɼ + // ù¹øÂ° ¿É¼Ç //--------------------------------------------------------- - // ù° ɼ ϸ ι° ɼȮ Ѵ. + // ù¹øÂ° ¿É¼ÇÀÌ ¼º°øÇÏ¸é µÎ¹øÂ° ¿É¼ÇÈ®·ü·Î °è»êÇÑ´Ù. int upgradeRatio = (bFirstSucceed? pOptionInfo->getUpgradeSecondRatio() : pOptionInfo->getUpgradeRatio()); @@ -1016,7 +1016,7 @@ void executeEnchantRareOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* p //cout << gcAddItemToItemVerify.toString().c_str() << endl; } //--------------------------------------------------------- - // upgrade + // upgrade ½ÇÆÐ //--------------------------------------------------------- else { @@ -1025,7 +1025,7 @@ void executeEnchantRareOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* p if ( bCrashItem ) { - // μ ItemTrace Log .; + // ¾ÆÀÌÅÛ ºÎ¼ö±â Àü¿¡ ItemTrace Log ³²±âÀÚ ¤Ñ.¤Ñ; if ( pItem != NULL && pItem->isTraceItem() ) { remainTraceLog( pItem, pCreature->getName(), "GOD", ITEM_LOG_DELETE, DETAIL_ENCHANT); @@ -1040,8 +1040,8 @@ void executeEnchantRareOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* p } else { - // list reference ⿡ ɼ ŵ Ƿ - // list iterator ~ɼ ִ. + // À§¿¡¼­ list¸¦ reference·Î ¾²¸é ¿©±â¿¡¼­ ¿É¼ÇÀÌ Á¦°ÅµÉ ¼ö ÀÖÀ¸¹Ç·Î + // list iterator°¡ ´ÙÀÌ~µÉ¼öµµ ÀÖ´Ù. downgradeOptionType( pItem, currentOptionType, pOptionInfo ); OptionType_t previousOptionType = pOptionInfo->getPreviousType(); @@ -1058,16 +1058,16 @@ void executeEnchantRareOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* p }*/ { - // ִ + // µé°í ÀÖ´Â º° »èÁ¦ pPC->deleteItemFromExtraInventorySlot(); - // DB + // DB¿¡¼­ »èÁ¦ pMouseItem->destroy(); - // ޸𸮿 + // ¸Þ¸ð¸®¿¡¼­ »èÁ¦ SAFE_DELETE(pMouseItem); - // Ŷ + // °á°ú ÆÐŶ º¸³»±â sendEnchantOK(pGamePlayer, optionChange); } @@ -1082,18 +1082,18 @@ void executeEnchantOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem PlayerCreature* pPC = dynamic_cast(pCreature); Inventory* pInventory = pPC->getInventory(); - // Item OptionInfo ´. + // ItemÀÇ OptionInfo¸¦ ¾ò¾î¿Â´Ù. OptionType_t currentOptionType = // pItem->getFirstOptionType(); pItem->getRandomOptionType(); int optionSize = pItem->getOptionTypeSize(); - // Ȯ itemType ؼ ȴ. + // ½ÇÆÐÇÒ È®·üÀº itemType¿¡ ÀÇÇØ¼­ °áÁ¤µÈ´Ù. const ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo(pItem->getItemClass(), pItem->getItemType()); - // æƮ ҷ ̰ų - // ̰ų - // ũ + // ÀÎæƮ ÇÒ·Á´Â ¾ÆÀÌÅÛÀÌ ¹«¿ÉÀ̰ųª + // ·¹¾î ¾ÆÀÌÅÛÀ̰ųª + // À¯´ÏÅ© ¾ÆÀÌÅÛÀÎ °æ¿ì if (optionSize != 1 || pItemInfo->isUnique()) { // cout << "no Option " << endl; sendEnchantImpossible(pGamePlayer); @@ -1109,29 +1109,29 @@ void executeEnchantOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem uint optionChange = 0; - // ɼ Ұ ʴٰ .. - // ִ ´ Ȯϰ - // upgrade option 쿡... + // ¿É¼ÇÀÌ ¿©·¯°³ÀÎ °æ¿ì´Â ºÒ°¡´ÉÇÏÁö´Â ¾Ê´Ù°í º¸°í.. + // µé°í ÀÖ´Â ¾ÆÀÌÅÛÀÌ ¸Â´ÂÁö È®ÀÎÇϰí + // upgrade°¡´ÉÇÑ optionÀÎ °æ¿ì¿¡... bool bUpgradePossible = pOptionInfo->isUpgradePossible(); if (optionSize > 1 || bUpgradePossible) { //--------------------------------------------------------- - // item 1 츸 ֵ صд. - // 쵵 ϰ Ϸ - // ٿ߰.. client ؾ Ѵ. - // upgrade ұ? + // item°³¼ö°¡ 1°³ÀÎ °æ¿ì¸¸ ÇÒ ¼ö ÀÖµµ·Ï ÇØµÐ´Ù. + // ¿©·¯°³ÀÎ °æ¿ìµµ °¡´ÉÇÏ°Ô ÇÏ·Á¸é + // ¾ÆÀÌÅÛ °³¼ö¸¦ ÁÙ¿©¾ß°ÚÁö.. clientµµ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. + // upgrade ¼º°øÇÒ±î? //--------------------------------------------------------- - // ɼȮ * ŸȮ / 10000 + // ¿É¼ÇÈ®·ü * ŸÀÙÈ®·ü / 10000 int succeedRatio = 0; if (pMouseItem->getItemType() == 15) { - // 2~ 2003.5.11 + // ºí·ç µå·Ó 2~ 2003.5.11 succeedRatio = pOptionInfo->getUpgradeSecondRatio() * pItemInfo->getUpgradeRatio(); } else { - // æƮ ۵ + // ±âÁ¸ ÀÎæƮ ¾ÆÅÛµé succeedRatio = pOptionInfo->getUpgradeRatio() * pItemInfo->getUpgradeRatio(); } - // cout << "ɼ " << pOptionInfo->getHName() << " æƮ Ȯ : " << succeedRatio << endl; + // cout << "¿É¼Ç " << pOptionInfo->getHName() << " ÀÎæƮ È®·ü : " << succeedRatio << endl; int dice = rand() % 10000; bool bSucceed = (dice < succeedRatio); @@ -1146,11 +1146,11 @@ void executeEnchantOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem // cout << "Before = " << getOptionTypeToString( pItem->getOptionTypeList() ) << endl; // cout << "CurrentOptionType = " << (int)currentOptionType << endl; - // ɼ پִ 쿡 ɼ upgrade Ұϴٸ з . - // if optionSize>1 üũ߱ .. bUpgradePossible 찡 ƴϸ, - // optionSize>1 ̶ Ǵ ִ. + // ¿É¼ÇÀÌ ¿©·¯°³ ºÙ¾îÀÖ´Â °æ¿ì¿¡ ÇöÀç ÁöÁ¤ÇÑ ¿É¼ÇÀÌ upgrade°¡ ºÒ°¡´ÉÇÏ´Ù¸é ½ÇÆÐ·Î º»´Ù. + // À§ÀÇ if¿¡¼­ optionSize>1 À» üũÇ߱⠶§¹®¿¡.. bUpgradePossibleÀÎ °æ¿ì°¡ ¾Æ´Ï¸é, + // optionSize>1 À̶ó°í ÆÇ´ÜÇÒ ¼ö ÀÖ´Ù. if (bUpgradePossible && pMouseItem->getNum() == 1 && bSucceed) { - // cout << "æƮ " << endl; + // cout << "ÀÎæƮ ¼º°ø" << endl; processUpgradeOptionType(pItem, currentOptionType, pOptionInfo); OptionType_t upgradeOptionType = pOptionInfo->getUpgradeType(); @@ -1161,17 +1161,17 @@ void executeEnchantOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem // cout << gcAddItemToItemVerify.toString().c_str() << endl; } //--------------------------------------------------------- - // upgrade + // upgrade ½ÇÆÐ //--------------------------------------------------------- else { // cout << "Failed!" << endl; bool bCrashItem = pItemInfo->isUpgradeCrash(); - // packet : μ ƴ + // ½ÇÆÐ packet : ¾ÆÀÌÅÛÀÌ ºÎ¼­Áö´ÂÁö ¾Æ´ÑÁö °áÁ¤ GCAddItemToItemVerify gcAddItemToItemVerify; if (bCrashItem) { - // μ ItemTrace Log .; + // ¾ÆÀÌÅÛ ºÎ¼ö±â Àü¿¡ ItemTrace Log ³²±âÀÚ ¤Ñ.¤Ñ; if (pItem != NULL && pItem->isTraceItem()) { remainTraceLog(pItem, pCreature->getName(), "GOD", ITEM_LOG_DELETE, DETAIL_ENCHANT); } @@ -1186,12 +1186,12 @@ void executeEnchantOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem int downgradeRatio = pItemInfo->getDowngradeRatio(); int dice = rand() % 100; - // cout << "æƮ : " << pItemInfo->getName() << " ɼǶ Ȯ " << downgradeRatio << endl; + // cout << "ÀÎæƮ ¾ÆÅÛ : " << pItemInfo->getName() << " ¿É¼Ç¶³¾îÁú È®·ü " << downgradeRatio << endl; if (dice < noChangeRatio) { - // ȭ + // º¯È­¾øÀ½ } else if (dice < noChangeRatio + downgradeRatio) { - // ɼǶ + // ¿É¼Ç¶³¾îÁü downgradeOptionType(pItem, currentOptionType, pOptionInfo); OptionType_t previousOptionType = pOptionInfo->getPreviousType(); @@ -1207,13 +1207,13 @@ void executeEnchantOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem // cout << "Upgrade Failed " << (bCrashItem? ": Crash!":" ") << endl; } - // ִ + // µé°í ÀÖ´Â º° »èÁ¦ pPC->deleteItemFromExtraInventorySlot(); - // DB + // DB¿¡¼­ »èÁ¦ pMouseItem->destroy(); - // ޸𸮿 + // ¸Þ¸ð¸®¿¡¼­ »èÁ¦ SAFE_DELETE(pMouseItem); } else { sendEnchantImpossible(pGamePlayer); @@ -1223,14 +1223,14 @@ void executeEnchantOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem __END_CATCH } -// ۿ ɼ ߰Ų. +// ¹«¿É ¾ÆÀÌÅÛ¿¡ ¿É¼ÇÀ» Ãß°¡½ÃŲ´Ù. void executeAddOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem, OptionType_t addOptionType) { __BEGIN_TRY Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); - // ̾ 񽺰 ƴ ȵ.. + // ÇÁ¸®¹Ì¾ö ¼­ºñ½º°¡ ¾Æ´Ñ °æ¿ì´Â ¾ÈµÇÁö.. /* if (!pGamePlayer->isPayPlaying() && !pGamePlayer->isPremiumPlay()) { @@ -1242,32 +1242,32 @@ void executeAddOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem, Op } */ - // Ŭ ִ ɼṴ̆.. - // ɼ - // ũ ƴϰ - // 콺 Ѱ ϴ 쿡 ɼ ߰ ϴ. + // ÀÌ Å¬·¡½º¿¡ ºÙÀ» ¼ö ÀÖ´Â ¿É¼ÇŬ·¡½ºÀ̰í.. + // ¿É¼ÇÀÌ ¾ø°í + // À¯´ÏÅ©°¡ ¾Æ´Ï°í + // ¸¶¿ì½º¿¡ ÇѰ³¸¸ µé°í ÇÏ´Â °æ¿ì¿¡ ¿É¼Ç Ãß°¡°¡ °¡´ÉÇÏ´Ù. if (isPossibleOptionItemClass(pItem->getItemClass()) && pItem->getOptionTypeSize() == 0 && !pItem->isUnique() && pMouseItem->getNum() == 1) { - // ɼ + // ¿É¼Ç º¯°æ pItem->addOptionType(addOptionType); string optionField; setOptionTypeToField(pItem->getOptionTypeList(), optionField); - // DB + // DBº¯°æ char pField[80]; sprintf(pField, "OptionType='%s'", optionField.c_str()); pItem->tinysave(pField); uint optionChange = addOptionType; - // ִ + // µé°í ÀÖ´Â º° »èÁ¦ pPC->deleteItemFromExtraInventorySlot(); - pMouseItem->destroy(); // DB - SAFE_DELETE(pMouseItem); // ޸𸮿 + pMouseItem->destroy(); // DB¿¡¼­ »èÁ¦ + SAFE_DELETE(pMouseItem); // ¸Þ¸ð¸®¿¡¼­ »èÁ¦ - // packet : upgrade option ־ش. + // ¼º°øpacket : upgradeµÉ optionÀ» ³Ö¾îÁØ´Ù. GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode(ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_OK); gcAddItemToItemVerify.setParameter(optionChange); @@ -1277,8 +1277,8 @@ void executeAddOption(GamePlayer* pGamePlayer, Item* pMouseItem, Item* pItem, Op } else { // cout << "Enchant Impossible" << endl; // cout << "impossibleOption : " << (int)currentOptionType << endl; - // upgrade option̴. - // Ұ packet + // upgrade ÇÒ ¼ö ¾ø´Â optionÀÌ´Ù. + // ºÒ°¡ packet GCAddItemToItemVerify gcAddItemToItemVerify; gcAddItemToItemVerify.setCode(ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_IMPOSSIBLE); pGamePlayer->sendPacket(&gcAddItemToItemVerify); @@ -1350,10 +1350,10 @@ void processUpgradeOptionType(Item* pItem, OptionType_t currentOptionType, Optio __BEGIN_TRY // cout << "Succeed!" << endl; - // upgrage option + // upgrageµÉ option OptionType_t upgradeOptionType = pOptionInfo->getUpgradeType(); - // ɼ + // ¿É¼Ç º¯°æ pItem->changeOptionType(currentOptionType, upgradeOptionType); // cout << "Succeed = " << getOptionTypeToString( pItem->getOptionTypeList() ); @@ -1365,7 +1365,7 @@ void processUpgradeOptionType(Item* pItem, OptionType_t currentOptionType, Optio // setOptionTypeFromField( op, optionField ); // cout << "Check = " << getOptionTypeToString( op ) << endl; - // DB + // DBº¯°æ char pField[80]; sprintf(pField, "OptionType='%s'", optionField.c_str()); pItem->tinysave(pField); @@ -1376,13 +1376,13 @@ void processUpgradeOptionType(Item* pItem, OptionType_t currentOptionType, Optio void crashItem(Item* pItem, Inventory* pInventory, CoordInven_t invenX, CoordInven_t invenY) { __BEGIN_TRY - // inventory + // inventory¿¡¼­ ¾ÆÀÌÅÛ Á¦°Å pInventory->deleteItem(invenX, invenY); - // DB + // DB¿¡¼­ Á¦°Å pItem->destroy(); - // ޸𸮿 + // ¸Þ¸ð¸®¿¡¼­ Á¦°Å SAFE_DELETE(pItem); __END_CATCH @@ -1391,13 +1391,13 @@ void crashItem(Item* pItem, Inventory* pInventory, CoordInven_t invenX, CoordInv void downgradeOptionType(Item* pItem, OptionType_t currentOptionType, OptionInfo* pOptionInfo) { __BEGIN_TRY - // ɼ Ѵܰ ߸. + // ¾ÆÀÌÅÛÀÇ ¿É¼ÇÀ» ÇÑ´Ü°è ¶³¾î¶ß¸°´Ù. OptionType_t previousOptionType = pOptionInfo->getPreviousType(); // cout << "FailBefore : " << getOptionTypeToString(pItem->getOptionTypeList()) << endl; - // ɼ - // ɼ ٸ ƿ ɼ ش. + // ¿É¼Ç º¯°æ + // ÀÌÀü ¿É¼ÇÀÌ ¾ø´Ù¸é ¾Æ¿¹ ¿É¼ÇÀ» ¾ø¾Ø´Ù. if (previousOptionType == 0) { pItem->removeOptionType(currentOptionType); // cout << "Remove = " << getOptionTypeToString( pItem->getOptionTypeList() ) << endl; @@ -1406,7 +1406,7 @@ void downgradeOptionType(Item* pItem, OptionType_t currentOptionType, OptionInfo // cout << "Down = " << getOptionTypeToString( pItem->getOptionTypeList() ) << endl; } - // DB + // DBº¯°æ string optionField; setOptionTypeToField(pItem->getOptionTypeList(), optionField); diff --git a/src/Core/CGAddMouseToGearHandler.cpp b/src/Core/CGAddMouseToGearHandler.cpp index 59fe9319..e0be3e72 100644 --- a/src/Core/CGAddMouseToGearHandler.cpp +++ b/src/Core/CGAddMouseToGearHandler.cpp @@ -58,11 +58,11 @@ void CGAddMouseToGearHandler::execute(CGAddMouseToGear* pPacket, Player* pPlayer ObjectID_t ItemObjectID = pItem->getObjectID(); SlotID_t SlotID = pPacket->getSlotID(); - // ObjectID ġϴ üũѴ. + // 아이템의 ObjectID가 일치하는지 체크한다. if (ItemObjectID == pPacket->getObjectID()) { Item::ItemClass IClass = pItem->getItemClass(); - switch (SlotID) // ´ Ѵ. + switch (SlotID) // 슬랏을 보고 그 슬랏에 맞는 아이템 유형인지 비교한다. { case Slayer::WEAR_HEAD: if (IClass == Item::ITEM_CLASS_HELM) @@ -143,7 +143,7 @@ void CGAddMouseToGearHandler::execute(CGAddMouseToGear* pPacket, Player* pPlayer break; } - // ´ Ϸ ϴ üũѴ. + // 그 슬랏에 맞는 아이템을 장착하려고 하는지 체크한다. if (Success) pSlayer->wearItem((Slayer::WearPart)SlotID); } @@ -163,11 +163,11 @@ void CGAddMouseToGearHandler::execute(CGAddMouseToGear* pPacket, Player* pPlayer ObjectID_t ItemObjectID = pItem->getObjectID(); SlotID_t SlotID = pPacket->getSlotID(); - // ObjectID ġϴ üũѴ. + // 아이템의 ObjectID가 일치하는지 체크한다. if (ItemObjectID == pPacket->getObjectID()) { Item::ItemClass IClass = pItem->getItemClass(); - switch (SlotID) // ´ Ѵ. + switch (SlotID) // 슬랏을 보고 그 슬랏에 맞는 아이템 유형인지 비교한다. { case Vampire::WEAR_NECK: if (IClass == Item::ITEM_CLASS_VAMPIRE_NECKLACE) @@ -253,7 +253,7 @@ void CGAddMouseToGearHandler::execute(CGAddMouseToGear* pPacket, Player* pPlayer break; } - // ´ Ϸ ϴ üũѴ. + // 그 슬랏에 맞는 아이템을 장착하려고 하는지 체크한다. if (Success) pVampire->wearItem((Vampire::WearPart)SlotID); } @@ -273,11 +273,11 @@ void CGAddMouseToGearHandler::execute(CGAddMouseToGear* pPacket, Player* pPlayer ObjectID_t ItemObjectID = pItem->getObjectID(); SlotID_t SlotID = pPacket->getSlotID(); - // ObjectID ġϴ üũѴ. + // 아이템의 ObjectID가 일치하는지 체크한다. if (ItemObjectID == pPacket->getObjectID()) { Item::ItemClass IClass = pItem->getItemClass(); - switch (SlotID) // ´ Ѵ. + switch (SlotID) // 슬랏을 보고 그 슬랏에 맞는 아이템 유형인지 비교한다. { case Ousters::WEAR_CIRCLET: if (IClass == Item::ITEM_CLASS_OUSTERS_CIRCLET) @@ -340,13 +340,13 @@ void CGAddMouseToGearHandler::execute(CGAddMouseToGear* pPacket, Player* pPlayer break; } - // ´ Ϸ ϴ üũѴ. + // 그 슬랏에 맞는 아이템을 장착하려고 하는지 체크한다. if (Success) pOusters->wearItem((Ousters::WearPart)SlotID); } } - // Adding Ͽ + // Adding에 실패 하였을 경우 if (!Success) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); diff --git a/src/Core/CGAddMouseToInventory.h b/src/Core/CGAddMouseToInventory.h index 80bacae2..b2a4cab0 100644 --- a/src/Core/CGAddMouseToInventory.h +++ b/src/Core/CGAddMouseToInventory.h @@ -62,7 +62,7 @@ class CGAddMouseToInventory : public Packet { private: ObjectID_t m_ObjectID; - // κ丮 Ʈ ̵. 0̸ κ丮 + // 보조 인벤토리 아이템의 오브젝트 아이디. 0이면 메인 인벤토리에서 꺼냄 // ObjectID_t m_InventoryItemObjectID; CoordInven_t m_InvenX; diff --git a/src/Core/CGAddMouseToInventoryHandler.cpp b/src/Core/CGAddMouseToInventoryHandler.cpp index c7d74fd3..4e68793d 100644 --- a/src/Core/CGAddMouseToInventoryHandler.cpp +++ b/src/Core/CGAddMouseToInventoryHandler.cpp @@ -83,7 +83,7 @@ void CGAddMouseToInventoryHandler::execute(CGAddMouseToInventory* pPacket, Playe return; } - // ObjectID ġϴ üũѴ. + // 아이템의 ObjectID가 일치하는지 체크한다. if (itemObjectID != pPacket->getObjectID()) { // cout << "wrong objectID" << endl; GCCannotAdd _GCCannotAdd; @@ -92,7 +92,7 @@ void CGAddMouseToInventoryHandler::execute(CGAddMouseToInventory* pPacket, Playe return; } - // κ丮 ִ üũѴ. + // 인벤토리에 넣을 수 있는지 체크한다. if (!pInventory->canAdding(InvenX, InvenY, pItem)) { // cout << "cannot add" << endl; GCCannotAdd _GCCannotAdd; @@ -107,16 +107,16 @@ void CGAddMouseToInventoryHandler::execute(CGAddMouseToInventory* pPacket, Playe // cout << "chk relic1" << endl; - // Inventory Slot Item ޾ƿ´. + // 넣을려는 Inventory Slot의 Item을 받아온다. Item* pPrevItem = pInventory->searchItem(InvenX, InvenY, pItem, pt); - // ҿ ִٸ + // 그 장소에 아이템이 있다면 if (pPrevItem != NULL) { // cout << "prevItem!=0" << endl; bool bisSame = true; - // Ŭ ڸ ÷ ְ 콺 ִ ش. + // 아이템 클래스가 같을때 숫자를 올려 주고 마우스에 있는 것은 없앤다. if (canStack(pItem, pPrevItem)) { - // add by sonic 2006.10.30 ֹʱƷһ + // add by sonic 2006.10.30 렝岺唐珂쇌掘齡膠틔렴瞳寧폅 if (pItem->isTimeLimitItem() | pPrevItem->isTimeLimitItem()) { // cout << "cannot add" << endl; GCCannotAdd _GCCannotAdd; @@ -148,9 +148,9 @@ void CGAddMouseToInventoryHandler::execute(CGAddMouseToInventory* pPacket, Playe } } - //  ۰ ִ ǥ ġ Ѵٸ? + // 들어갈 아이템과 들어있는 아이템의 좌표가 꼭 일치 한다면? if (bisSame) { - // ڰ 9 9 ɶ Add ϰ 콺 ޾Ƶд. + // 숫자가 9개를 넘으면 9개 될때까지만 Add 하고 나머지는 마우스에 달아둔다. if (pItem->getNum() + pPrevItem->getNum() > MaxStack) { ItemNum_t CurrentNum = pPrevItem->getNum(); ItemNum_t AddNum = pItem->getNum(); @@ -161,13 +161,13 @@ void CGAddMouseToInventoryHandler::execute(CGAddMouseToInventory* pPacket, Playe pInventory->increaseNum(MaxStack - CurrentNum); pInventory->increaseWeight(pItem->getWeight() * (MaxStack - CurrentNum)); // pPrevItem->save(pPC->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Num=%d, Storage=%d, X=%d, Y=%d", MaxStack, STORAGE_INVENTORY, InvenX, InvenY); pPrevItem->tinysave(pField); // pItem->save(pPC->getName(), STORAGE_EXTRASLOT, 0, 0, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Num=%d, Storage=%d", NewNum, STORAGE_EXTRASLOT); pItem->tinysave(pField); @@ -178,7 +178,7 @@ void CGAddMouseToInventoryHandler::execute(CGAddMouseToInventory* pPacket, Playe pInventory->increaseNum(pItem->getNum()); pInventory->increaseWeight(pItem->getWeight() * pItem->getNum()); // pPrevItem->save(pPC->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Num=%d, Storage=%d, X=%d, Y=%d", pPrevItem->getNum(), STORAGE_INVENTORY, InvenX, InvenY); @@ -236,13 +236,13 @@ void CGAddMouseToInventoryHandler::execute(CGAddMouseToInventory* pPacket, Playe pInventory->addItem(InvenX, InvenY, pItem); // pPrevItem->save(pPC->getName(), STORAGE_EXTRASLOT, 0, 0, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d", STORAGE_EXTRASLOT); pPrevItem->tinysave(pField); // pItem->save(pPC->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Storage=%d, X=%d, Y=%d", STORAGE_INVENTORY, InvenX, InvenY); pItem->tinysave(pField); @@ -250,7 +250,7 @@ void CGAddMouseToInventoryHandler::execute(CGAddMouseToInventory* pPacket, Playe Success = true; } - } else // Ŭ ٸų, ̴ ƴ϶. + } else // 아이템 클래스가 다르거나, 쌓이는 아이템이 아니라면. { pInventory->deleteItem(pPrevItem->getObjectID()); @@ -261,31 +261,31 @@ void CGAddMouseToInventoryHandler::execute(CGAddMouseToInventory* pPacket, Playe pInventory->addItem(InvenX, InvenY, pItem); // pPrevItem->save(pPC->getName(), STORAGE_EXTRASLOT, 0, 0, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d", STORAGE_EXTRASLOT); pPrevItem->tinysave(pField); // pItem->save(pPC->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Storage=%d, X=%d, Y=%d", STORAGE_INVENTORY, InvenX, InvenY); pItem->tinysave(pField); Success = true; } - } else // ҿ ٸ. + } else // 그 장소에 아이템이 없다면. { // cout << "prevItem is NULL" << endl; - // Inventory Ư ִ´. + // Inventory에 특정 아이템을 넣는다. pInventory->addItem(InvenX, InvenY, pItem); - // ֱ⿡ ϸ 콺 ޷ִ ش. + // 넣기에 성공하면 마우스에 달려있는 아이템을 없앤다. pPC->deleteItemFromExtraInventorySlot(); // pItem->save(pPC->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d, X=%d, Y=%d", STORAGE_INVENTORY, InvenX, InvenY); pItem->tinysave(pField); @@ -306,19 +306,19 @@ void CGAddMouseToInventoryHandler::execute(CGAddMouseToInventory* pPacket, Playe pPlayer->sendPacket(&gcTradeVerify); } - // Ʈ + // 트리 조각일 경우 if (pItem != NULL && pItem->getItemClass() == Item::ITEM_CLASS_EVENT_TREE) { ItemType_t itemtype = pItem->getItemType(); - // ũ Ʈ ̸ + // 크리스마스 트리 조각이면 if (itemtype <= 11) { - // ũ Ʈ . + // 크리스마스 트리 조각이 맞춰지는지 본다. TPOINT pt = checkEventPuzzle(pPC, InvenX, InvenY, 0); if (pt.x != -1 && pt.y != -1) { - // Ʈ . + // 맞춰진 트리 조각을 지운다. deleteInventoryItem(pInventory, pt.x, pt.y, pt.x + 2, pt.y + 3); - // Ʈ Ѵ. + // 트리를 생성한다. list optionType; Item* pTreeItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_EVENT_TREE, 12, optionType); @@ -326,21 +326,21 @@ void CGAddMouseToInventoryHandler::execute(CGAddMouseToInventory* pPacket, Playe pInventory->addItem(pt.x, pt.y, pTreeItem); pTreeItem->create(pPC->getName(), STORAGE_INVENTORY, 0, pt.x, pt.y); - // Ŭ̾Ʈ Ʈ ٴ ˸. + // 클라이언트에 트리가 만들어졌다는 걸 알린다. GCCreateItem gcCreateItem; makeGCCreateItem(&gcCreateItem, pTreeItem, pt.x, pt.y); pGamePlayer->sendPacket(&gcCreateItem); } } - // ũ Ʈ ̸ + // 크리스마스 트리 조각이면 else if (itemtype > 12 && itemtype <= 24) { - // ũ Ʈ . + // 크리스마스 트리 조각이 맞춰지는지 본다. TPOINT pt = checkEventPuzzle(pPC, InvenX, InvenY, 13); if (pt.x != -1 && pt.y != -1) { - // Ʈ . + // 맞춰진 트리 조각을 지운다. deleteInventoryItem(pInventory, pt.x, pt.y, pt.x + 2, pt.y + 3); - // Ʈ Ѵ. + // 트리를 생성한다. list optionType; Item* pTreeItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_EVENT_TREE, 25, optionType); @@ -349,21 +349,21 @@ void CGAddMouseToInventoryHandler::execute(CGAddMouseToInventory* pPacket, Playe pInventory->addItem(pt.x, pt.y, pTreeItem); pTreeItem->create(pPC->getName(), STORAGE_INVENTORY, 0, pt.x, pt.y); - // Ŭ̾Ʈ Ʈ ٴ ˸. + // 클라이언트에 트리가 만들어졌다는 걸 알린다. GCCreateItem gcCreateItem; makeGCCreateItem(&gcCreateItem, pTreeItem, pt.x, pt.y); pGamePlayer->sendPacket(&gcCreateItem); } } - // ũ Ʈ ̸ + // 크리스마스 트리 조각이면 else if (itemtype > 28 && itemtype <= 40) { - // ũ Ʈ . + // 크리스마스 트리 조각이 맞춰지는지 본다. TPOINT pt = checkEventPuzzle(pPC, InvenX, InvenY, 29); if (pt.x != -1 && pt.y != -1) { - // Ʈ . + // 맞춰진 트리 조각을 지운다. deleteInventoryItem(pInventory, pt.x, pt.y, pt.x + 2, pt.y + 3); - // Ʈ Ѵ. + // 트리를 생성한다. list optionType; Item* pTreeItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_EVENT_TREE, 41, optionType); @@ -372,7 +372,7 @@ void CGAddMouseToInventoryHandler::execute(CGAddMouseToInventory* pPacket, Playe pInventory->addItem(pt.x, pt.y, pTreeItem); pTreeItem->create(pPC->getName(), STORAGE_INVENTORY, 0, pt.x, pt.y); - // Ŭ̾Ʈ Ʈ ٴ ˸. + // 클라이언트에 트리가 만들어졌다는 걸 알린다. GCCreateItem gcCreateItem; makeGCCreateItem(&gcCreateItem, pTreeItem, pt.x, pt.y); pGamePlayer->sendPacket(&gcCreateItem); diff --git a/src/Core/CGAddMouseToQuickSlotHandler.cpp b/src/Core/CGAddMouseToQuickSlotHandler.cpp index 294714e0..dca6fcfb 100644 --- a/src/Core/CGAddMouseToQuickSlotHandler.cpp +++ b/src/Core/CGAddMouseToQuickSlotHandler.cpp @@ -53,7 +53,7 @@ void CGAddMouseToQuickSlotHandler::execute(CGAddMouseToQuickSlot* pPacket, Playe SlotID_t SlotID = pPacket->getSlotID(); Item::ItemClass IClass = pItem->getItemClass(); - // ObjectID ġϴ üũѴ. + // 아이템의 ObjectID가 일치하는지 체크한다. if (ItemObjectID != pPacket->getObjectID()) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -61,7 +61,7 @@ void CGAddMouseToQuickSlotHandler::execute(CGAddMouseToQuickSlot* pPacket, Playe return; } - // Ʈ ԰ ʴٸ Ʈ . + // 벨트를 입고 있지 않다면 벨트에다 아이템을 더할 수가 없다. if (!pSlayer->isWear(Slayer::WEAR_BELT)) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -69,7 +69,7 @@ void CGAddMouseToQuickSlotHandler::execute(CGAddMouseToQuickSlot* pPacket, Playe return; } - // ǵ ƴϰ, źâ ƴ϶ . + // 포션도 아니고, 탄창도 아니라면 더할 수가 없지. if (IClass != Item::ITEM_CLASS_POTION && IClass != Item::ITEM_CLASS_MAGAZINE && IClass != Item::ITEM_CLASS_EVENT_ETC && IClass != Item::ITEM_CLASS_KEY) { GCCannotAdd _GCCannotAdd; @@ -88,12 +88,12 @@ void CGAddMouseToQuickSlotHandler::execute(CGAddMouseToQuickSlot* pPacket, Playe Inventory* pBeltInventory = ((Belt*)pBelt)->getInventory(); if (pBeltInventory->canAdding(SlotID, 0, pItem)) { - // Ʈ ִ Item ޾ƿ´. + // 현재 벨트에 있는 Item을 받아온다. Item* pPrevItem = pBeltInventory->getItem(SlotID, 0); - // ڸ ִٸ... + // 지정한 자리에 아이템이 있다면... if (pPrevItem != NULL) { - // ̶... + // 아이템이 완전히 같은 아이템이라면... if (isStackable(pItem) && isSameItem(pItem, pPrevItem)) { int MaxStack = ItemMaxStack[pItem->getItemClass()]; @@ -107,27 +107,27 @@ void CGAddMouseToQuickSlotHandler::execute(CGAddMouseToQuickSlot* pPacket, Playe pBeltInventory->increaseNum(MaxStack - CurrentNum); pBeltInventory->increaseWeight(pItem->getWeight() * (MaxStack - CurrentNum)); // pPrevItem->save(pSlayer->getName(), STORAGE_BELT, pBelt->getItemID(), SlotID, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Num=%d, Storage=%d, StorageID=%lu, X=%d", MaxStack, STORAGE_BELT, pBelt->getItemID(), SlotID); pPrevItem->tinysave(pField); // pItem->save(pSlayer->getName(), STORAGE_EXTRASLOT, 0, 0, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Num=%d, Storage=%d", NewNum, STORAGE_EXTRASLOT); pItem->tinysave(pField); Success = true; - } else // ڰ 9 . + } else // 숫자가 9개를 넘지 않을 때. { pSlayer->deleteItemFromExtraInventorySlot(); pPrevItem->setNum(pPrevItem->getNum() + pItem->getNum()); pBeltInventory->increaseNum(pItem->getNum()); pBeltInventory->increaseWeight(pItem->getWeight() * pItem->getNum()); // pPrevItem->save(pSlayer->getName(), STORAGE_BELT , pBelt->getItemID(), SlotID, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Num=%d, Storage=%d, StorageID=%lu, X=%d", pPrevItem->getNum(), STORAGE_BELT, pBelt->getItemID(), SlotID); @@ -137,40 +137,40 @@ void CGAddMouseToQuickSlotHandler::execute(CGAddMouseToQuickSlot* pPacket, Playe SAFE_DELETE(pItem); Success = true; } - } else // Ŭ Ÿ + } else // 클래스랑 타입이 같지 않을때 { - // 콺 ޷ִ ۰ Ʈ ִ Ѵ. + // 마우스에 달려있는 아이템과 벨트에 있는 아이템을 제거한다. pSlayer->deleteItemFromExtraInventorySlot(); pBeltInventory->deleteItem(pPrevItem->getObjectID()); - // ġ ٲ ش. + // 둘의 위치를 바꿔 준다. pSlayer->addItemToExtraInventorySlot(pPrevItem); pBeltInventory->addItem(SlotID, 0, pItem); - // DBٰ Ѵ. + // DB에다가 저장을 한다. // pPrevItem->save(pSlayer->getName(), STORAGE_EXTRASLOT, 0, 0, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d", STORAGE_EXTRASLOT); pPrevItem->tinysave(pField); // pItem->save(pSlayer->getName(), STORAGE_BELT , pBelt->getItemID(), SlotID, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Storage=%d, StorageID=%lu, X=%d", STORAGE_BELT, pBelt->getItemID(), SlotID); pItem->tinysave(pField); Success = true; } - } else // ƹ . + } else // 슬랏에 아무런 기존의 아이템이 없을때. { - // Inventory Ư ִ´. + // Inventory에 특정 아이템을 넣는다. pBeltInventory->addItem(SlotID, 0, pItem); - // ֱ⿡ ϸ 콺 ޷ִ ش. + // 넣기에 성공하면 마우스에 달려있는 아이템을 없앤다. pSlayer->deleteItemFromExtraInventorySlot(); // pItem->save(pSlayer->getName(), STORAGE_BELT, pBelt->getItemID(), SlotID, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d, StorageID=%lu, X=%d", STORAGE_BELT, pBelt->getItemID(), SlotID); pItem->tinysave(pField); @@ -195,7 +195,7 @@ void CGAddMouseToQuickSlotHandler::execute(CGAddMouseToQuickSlot* pPacket, Playe SlotID_t SlotID = pPacket->getSlotID(); Item::ItemClass IClass = pItem->getItemClass(); - // ObjectID ġϴ üũѴ. + // 아이템의 ObjectID가 일치하는지 체크한다. if (ItemObjectID != pPacket->getObjectID()) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -207,7 +207,7 @@ void CGAddMouseToQuickSlotHandler::execute(CGAddMouseToQuickSlot* pPacket, Playe if (SlotID > 2) SlotID -= 3; - // ش Ͻ尡 + // 해당 암스밴드가 없다 if (!pOusters->isWear(part)) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -215,7 +215,7 @@ void CGAddMouseToQuickSlotHandler::execute(CGAddMouseToQuickSlot* pPacket, Playe return; } - // Ǫĵ ƴϰ, ̵ ƴ϶ . + // 푸파도 아니고, 콤포스메이도 아니라면 더할 수가 없지. if (IClass != Item::ITEM_CLASS_PUPA && IClass != Item::ITEM_CLASS_COMPOS_MEI && IClass != Item::ITEM_CLASS_EVENT_ETC) { GCCannotAdd _GCCannotAdd; @@ -235,12 +235,12 @@ void CGAddMouseToQuickSlotHandler::execute(CGAddMouseToQuickSlot* pPacket, Playe Inventory* pArmsbandInventory = ((OustersArmsband*)pArmsband)->getInventory(); if (pArmsbandInventory->canAdding(SlotID, 0, pItem)) { - // Ʈ ִ Item ޾ƿ´. + // 현재 벨트에 있는 Item을 받아온다. Item* pPrevItem = pArmsbandInventory->getItem(SlotID, 0); - // ڸ ִٸ... + // 지정한 자리에 아이템이 있다면... if (pPrevItem != NULL) { - // ̶... + // 아이템이 완전히 같은 아이템이라면... if (isSameItem(pItem, pPrevItem)) { int MaxStack = ItemMaxStack[pItem->getItemClass()]; @@ -254,27 +254,27 @@ void CGAddMouseToQuickSlotHandler::execute(CGAddMouseToQuickSlot* pPacket, Playe pArmsbandInventory->increaseNum(MaxStack - CurrentNum); pArmsbandInventory->increaseWeight(pItem->getWeight() * (MaxStack - CurrentNum)); // pPrevItem->save(pOusters->getName(), STORAGE_BELT, pArmsband->getItemID(), SlotID, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Num=%d, Storage=%d, StorageID=%lu, X=%d", MaxStack, STORAGE_BELT, pArmsband->getItemID(), SlotID); pPrevItem->tinysave(pField); // pItem->save(pOusters->getName(), STORAGE_EXTRASLOT, 0, 0, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Num=%d, Storage=%d", NewNum, STORAGE_EXTRASLOT); pItem->tinysave(pField); Success = true; - } else // ڰ 9 . + } else // 숫자가 9개를 넘지 않을 때. { pOusters->deleteItemFromExtraInventorySlot(); pPrevItem->setNum(pPrevItem->getNum() + pItem->getNum()); pArmsbandInventory->increaseNum(pItem->getNum()); pArmsbandInventory->increaseWeight(pItem->getWeight() * pItem->getNum()); // pPrevItem->save(pOusters->getName(), STORAGE_BELT , pArmsband->getItemID(), SlotID, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Num=%d, Storage=%d, StorageID=%lu, X=%d", pPrevItem->getNum(), STORAGE_BELT, pArmsband->getItemID(), SlotID); @@ -284,40 +284,40 @@ void CGAddMouseToQuickSlotHandler::execute(CGAddMouseToQuickSlot* pPacket, Playe SAFE_DELETE(pItem); Success = true; } - } else // Ŭ Ÿ + } else // 클래스랑 타입이 같지 않을때 { - // 콺 ޷ִ ۰ Ʈ ִ Ѵ. + // 마우스에 달려있는 아이템과 벨트에 있는 아이템을 제거한다. pOusters->deleteItemFromExtraInventorySlot(); pArmsbandInventory->deleteItem(pPrevItem->getObjectID()); - // ġ ٲ ش. + // 둘의 위치를 바꿔 준다. pOusters->addItemToExtraInventorySlot(pPrevItem); pArmsbandInventory->addItem(SlotID, 0, pItem); - // DBٰ Ѵ. + // DB에다가 저장을 한다. // pPrevItem->save(pOusters->getName(), STORAGE_EXTRASLOT, 0, 0, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d", STORAGE_EXTRASLOT); pPrevItem->tinysave(pField); // pItem->save(pOusters->getName(), STORAGE_BELT , pArmsband->getItemID(), SlotID, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Storage=%d, StorageID=%lu, X=%d", STORAGE_BELT, pArmsband->getItemID(), SlotID); pItem->tinysave(pField); Success = true; } - } else // ƹ . + } else // 슬랏에 아무런 기존의 아이템이 없을때. { - // Inventory Ư ִ´. + // Inventory에 특정 아이템을 넣는다. pArmsbandInventory->addItem(SlotID, 0, pItem); - // ֱ⿡ ϸ 콺 ޷ִ ش. + // 넣기에 성공하면 마우스에 달려있는 아이템을 없앤다. pOusters->deleteItemFromExtraInventorySlot(); // pItem->save(pOusters->getName(), STORAGE_BELT, pArmsband->getItemID(), SlotID, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d, StorageID=%lu, X=%d", STORAGE_BELT, pArmsband->getItemID(), SlotID); pItem->tinysave(pField); @@ -327,7 +327,7 @@ void CGAddMouseToQuickSlotHandler::execute(CGAddMouseToQuickSlot* pPacket, Playe } // end of if (pArmsbandInventory->canAdding(SlotID, 0, pItem)) } // if (pCreature->isOusters()) - // QuickSlot ִ Ͽ Ŷ . + // QuickSlot에 넣는 것을 실패 하였을때 실패 패킷을 날린다. if (!Success) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); diff --git a/src/Core/CGAddMouseToZoneHandler.cpp b/src/Core/CGAddMouseToZoneHandler.cpp index 9904b6ce..81d4266e 100644 --- a/src/Core/CGAddMouseToZoneHandler.cpp +++ b/src/Core/CGAddMouseToZoneHandler.cpp @@ -66,8 +66,8 @@ void CGAddMouseToZoneHandler::execute(CGAddMouseToZone* pPacket, Player* pPlayer Item* pItem = pExtraInventorySlot->getItem(); if (pItem == NULL) { - // throw ProtocolException("CGAddMouseToZoneHandler::execute() : ߸ ϴ - // ʽϴ."); + // throw ProtocolException("CGAddMouseToZoneHandler::execute() : 존에 떨어뜨리려 하는 아이템이 존재하지 + // 않습니다."); GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); pPlayer->sendPacket(&_GCCannotAdd); @@ -102,7 +102,7 @@ void CGAddMouseToZoneHandler::execute(CGAddMouseToZone* pPacket, Player* pPlayer { pPC->deleteItemFromExtraInventorySlot(); - // ItemTrace + // ItemTrace 를 남긴다 if (pItem != NULL && pItem->isTraceItem() ) { remainTraceLog(pItem, pCreature->getName(), "DropQuestItem", ITEM_LOG_DELETE, DETAIL_DROP); @@ -114,10 +114,10 @@ void CGAddMouseToZoneHandler::execute(CGAddMouseToZone* pPacket, Player* pPlayer Success = true; }*/ if (ItemObjectID == pPacket->getObjectID() && canDropToZone(pPC, pItem)) { - // Item Zone Access Ѵ. - // ϴ ڽ ġ Item Ʈ. - // ߿ Tile ãƾ Ѵ. - // CREATE_TYPE_GAME 10 Ѵ. + // Item을 Zone에 Access 한다. + // 일단 자신의 위치에 Item을 떨어 트린다. + // 나중엔 아이템이 떨어진 Tile을 찾아야 한다. + // CREATE_TYPE_GAME인 아이템은 10초 후 사라지게 한다. Turn_t decayTurn = 0; if (pItem->getCreateType() == Item::CREATE_TYPE_GAME) decayTurn = 100; @@ -127,13 +127,13 @@ void CGAddMouseToZoneHandler::execute(CGAddMouseToZone* pPacket, Player* pPlayer if (pt.x != -1) { pItem->whenPCLost(pPC); // pItem->save("", STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "OwnerID='', Storage=%d, StorageID=%u, X=%d, Y=%d", (int)STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y); pItem->tinysave(pField); - // belt Ʈ ۵鵵 Ѵ. 2003.3.22 by Sequoia + // belt일 경우 벨트 안의 아이템들도 모두 주인이 없어져야 한다. 2003.3.22 by Sequoia if (pItem->getItemClass() == Item::ITEM_CLASS_BELT) { sprintf(pField, "OwnerID=''"); @@ -151,7 +151,7 @@ void CGAddMouseToZoneHandler::execute(CGAddMouseToZone* pPacket, Player* pPlayer } } - // Ͻ ۵鵵 Ѵ. 2003.3.22 by Sequoia + // 암스밴드일 경우 안의 아이템들도 모두 주인이 없어져야 한다. 2003.3.22 by Sequoia if (pItem->getItemClass() == Item::ITEM_CLASS_OUSTERS_ARMSBAND) { sprintf(pField, "OwnerID=''"); @@ -179,7 +179,7 @@ void CGAddMouseToZoneHandler::execute(CGAddMouseToZone* pPacket, Player* pPlayer if (!pItem->isFlag(Effect::EFFECT_CLASS_RELIC_LOCK)) { EffectRelicLock* pLock = new EffectRelicLock(pItem); - pLock->setDeadline(10 * 10); // 10 + pLock->setDeadline(10 * 10); // 10초 pItem->setFlag(Effect::EFFECT_CLASS_RELIC_LOCK); pItem->getEffectManager().addEffect(pLock); } @@ -192,12 +192,12 @@ void CGAddMouseToZoneHandler::execute(CGAddMouseToZone* pPacket, Player* pPlayer if (!pItem->isFlag(Effect::EFFECT_CLASS_RELIC_LOCK)) { EffectRelicLock* pLock = new EffectRelicLock(pItem); - pLock->setDeadline(10 * 10); // 10 + pLock->setDeadline(10 * 10); // 10초 pItem->setFlag(Effect::EFFECT_CLASS_RELIC_LOCK); pItem->getEffectManager().addEffect(pLock); } - // ߸ ѷش. + // 떨어뜨린 걸 존에 뿌려준다. char race[15]; if (pCreature->isSlayer()) { sprintf(race, g_pStringPool->c_str(STRID_SLAYER)); @@ -221,26 +221,26 @@ void CGAddMouseToZoneHandler::execute(CGAddMouseToZone* pPacket, Player* pPlayer } - // Relic ٴڿ Effect ش. + // Relic 을 바닥에 놓는 경우라면 Effect를 없애준다. if (isRelicItem(pItem)) { deleteRelicEffect(pPC, pItem); - // ѵ ֿ Ʈ δ. + // 한동안 주울 수 없도록 이펙트를 붙인다. if (!pItem->isFlag(Effect::EFFECT_CLASS_RELIC_LOCK)) { EffectRelicLock* pLock = new EffectRelicLock(pItem); - pLock->setDeadline(10 * 10); // 10 + pLock->setDeadline(10 * 10); // 10초 pItem->setFlag(Effect::EFFECT_CLASS_RELIC_LOCK); pItem->getEffectManager().addEffect(pLock); } else { - // ãƼ ð ÷ش. + // 기존에꺼 찾아서 시간 늘려준다. } - // Relic ƴƴ ˷ֵ Ѵ. + // Relic이 떨어진 곳의 정보를 틈틈히 알려주도록 한다. /* if (!pItem->isFlag(Effect::EFFECT_CLASS_RELIC_POSITION)) { EffectRelicPosition* pPosition = new EffectRelicPosition(pItem); - pPosition->setNextTime(10); // 1 ޼ Ѹ. - pPosition->setTick(1*60*10); // 1и ѹ ˸. + pPosition->setNextTime(10); // 1초 후 메세지 뿌린다. + pPosition->setTick(1*60*10); // 1분마다 한번씩 알린다. pPosition->setZoneID(pZone->getZoneID()); pPosition->setX(pt.x); pPosition->setY(pt.y); @@ -250,18 +250,18 @@ void CGAddMouseToZoneHandler::execute(CGAddMouseToZone* pPacket, Player* pPlayer } else { - // ãƼ ٲش. + // 기존에꺼 찾아서 값을 바꿔준다. } */ - // ü ڿ Relic ٴ ޽ . + // 전체 사용자에게 Relic 이 떨어졌다는 메시지를 보낸다. /* ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(pZone->getZoneID()); Assert(pZoneInfo != NULL); StringStream msg; - msg << pRelicInfo->getName() << " " << pZoneInfo->getFullName() << " (" << pt.x << " , " << pt.y - << " ) ϴ."; + msg << pRelicInfo->getName() << " 성물이 " << pZoneInfo->getFullName() << " (" << pt.x << " , " << pt.y + << " ) 에 떨어졌습니다."; GCSystemMessage message; message.setMessage(msg.toString()); @@ -271,7 +271,7 @@ void CGAddMouseToZoneHandler::execute(CGAddMouseToZone* pPacket, Player* pPlayer // log(LOG_DROP_ITEM, pCreature->getName(), "", pItem->toString()); - // ItemTrace + // ItemTrace 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { char zoneName[15]; sprintf(zoneName, "%4d%3d%3d", pZone->getZoneID(), pt.x, pt.y); @@ -282,9 +282,9 @@ void CGAddMouseToZoneHandler::execute(CGAddMouseToZone* pPacket, Player* pPlayer if (pItem->isQuestItem() || (pItem->getItemClass() == Item::ITEM_CLASS_MOON_CARD && pItem->getItemType() == 2)) { - // Ʈ ٷ . - // ٺ Ŭ̾Ʈ 콺 ִ° ٷ . - // ׷ ̷ óѴ. + // 퀘스트 아이템일 경우 바로 지운다. + // 바보 클라이언트 때문에 마우스에 있는거 바로 못 지운다. + // 그래서 이렇게 처리한다. pZone->deleteItem(pItem, pt.x, pt.y); GCDeleteObject gcDeleteObject; @@ -297,7 +297,7 @@ void CGAddMouseToZoneHandler::execute(CGAddMouseToZone* pPacket, Player* pPlayer } } - // Adding Ͽ. + // Adding을 실패하였을때. if (!Success) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); diff --git a/src/Core/CGAddQuickSlotToMouseHandler.cpp b/src/Core/CGAddQuickSlotToMouseHandler.cpp index 1a15a91d..c76b6fed 100644 --- a/src/Core/CGAddQuickSlotToMouseHandler.cpp +++ b/src/Core/CGAddQuickSlotToMouseHandler.cpp @@ -59,7 +59,7 @@ void CGAddQuickSlotToMouseHandler::execute(CGAddQuickSlotToMouse* pPacket, Playe Item* pSlotItem = pBeltInventory->getItem(SlotID, 0); - // Ʈ ų, 콺 ִٸ . + // 벨트에 아이템이 없거나, 마우스에 뭔가를 들고 있다면 더할 수 없다. if (pSlotItem == NULL || pSlayer->getExtraInventorySlotItem() != NULL) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -67,11 +67,11 @@ void CGAddQuickSlotToMouseHandler::execute(CGAddQuickSlotToMouse* pPacket, Playe return; } - // Ʈ κ丮 Mouse ̵Ų. + // 아이템을 벨트 인벤토리에서 지우고 Mouse로 이동시킨다. pBeltInventory->deleteItem(SlotID, 0); pSlayer->addItemToExtraInventorySlot(pSlotItem); // pSlotItem->save(pSlayer->getName(), STORAGE_EXTRASLOT, 0, 0, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d", STORAGE_EXTRASLOT); pSlotItem->tinysave(pField); @@ -104,7 +104,7 @@ void CGAddQuickSlotToMouseHandler::execute(CGAddQuickSlotToMouse* pPacket, Playe Item* pSlotItem = pOustersArmsbandInventory->getItem(SlotID, 0); - // Ʈ ų, 콺 ִٸ . + // 벨트에 아이템이 없거나, 마우스에 뭔가를 들고 있다면 더할 수 없다. if (pSlotItem == NULL || pOusters->getExtraInventorySlotItem() != NULL) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -112,11 +112,11 @@ void CGAddQuickSlotToMouseHandler::execute(CGAddQuickSlotToMouse* pPacket, Playe return; } - // Ʈ κ丮 Mouse ̵Ų. + // 아이템을 벨트 인벤토리에서 지우고 Mouse로 이동시킨다. pOustersArmsbandInventory->deleteItem(SlotID, 0); pOusters->addItemToExtraInventorySlot(pSlotItem); // pSlotItem->save(pOusters->getName(), STORAGE_EXTRASLOT, 0, 0, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d", STORAGE_EXTRASLOT); pSlotItem->tinysave(pField); diff --git a/src/Core/CGAddZoneToMouseHandler.cpp b/src/Core/CGAddZoneToMouseHandler.cpp index cb34faef..04efc003 100644 --- a/src/Core/CGAddZoneToMouseHandler.cpp +++ b/src/Core/CGAddZoneToMouseHandler.cpp @@ -66,37 +66,37 @@ void CGAddZoneToMouseHandler::execute(CGAddZoneToMouse* pPacket, Player* pPlayer ZoneCoord_t ZoneX = pPacket->getZoneX(); ZoneCoord_t ZoneY = pPacket->getZoneY(); - // ٿ带 Ѿ ʴ üũѴ. + // 바운드를 넘어가지는 않는지 체크한다. if (!isValidZoneCoord(pZone, ZoneX, ZoneY)) goto ERROR; Tile& _Tile = pZone->getTile(ZoneX, ZoneY); - // ŸϿ ٸ 翬 . + // 타일에 아이템이 없다면 당연히 더할 수 없다. if (!_Tile.hasItem()) goto ERROR; - // Ͱ ̰ų, ̶ . + // 아이템 포인터가 널이거나, 주을 수 없는 아이템이라면 주을 수 없다. Item* pItem = _Tile.getItem(); if (pItem == NULL || !isPortableItem(pItem)) goto ERROR; if (!isAbleToPickupItem(pPC, pItem)) goto ERROR; - // ֿ ִ ȮѴ. --> isAbleToPickupItem ο ־. + // 피의 성서일 경우 주울 수 있는지 확인한다. --> isAbleToPickupItem 내부에 넣었다. ObjectID_t ItemObjectID = pItem->getObjectID(); - // ObjectID ġϴ üũѴ. + // 아이템의 ObjectID가 일치하는지 체크한다. if (ItemObjectID == pPacket->getObjectID()) { Item* pExtraItem = pPC->getExtraInventorySlotItem(); - // ̹ 𰡸 ִٸ, . + // 이미 무언가를 들고 있다면, 아이템을 더할 수 없다. if (pExtraItem != NULL) goto ERROR; - // 켱 پִ 쿡 Ǵ Ƽ ƴ϶ . + // 우선권이 붙어있는 아이템일 경우에는 주인 또는 주인파티가 아니라면 주을 수 없다. if (pItem->isFlag(Effect::EFFECT_CLASS_PRECEDENCE)) { Timeval currentTime; getCurrentTime(currentTime); @@ -107,20 +107,20 @@ void CGAddZoneToMouseHandler::execute(CGAddZoneToMouse* pPacket, Player* pPlayer dynamic_cast(rEffectManager.findEffect(Effect::EFFECT_CLASS_PRECEDENCE)); Assert(pEffectPrecedence != NULL); - // Relic̸ ƹ ֿ ִ. + // Relic이면 아무나 주울 수 있다. if (isRelicItem(pItem) || pEffectPrecedence->getDeadline() < currentTime) { - // ð ٸ ƹ ִ. Ҿ ⼭ Ʈ ش. + // 시간이 지났다면 아무나 주을 수 있다. 더불어 여기서 이펙트를 삭제해준다. rEffectManager.deleteEffect(Effect::EFFECT_CLASS_PRECEDENCE); pItem->removeFlag(Effect::EFFECT_CLASS_PRECEDENCE); } else { - // ð ʾҴٸ, Ǵ Ƽ ִ. + // 시간이 아직 지나지 않았다면, 주인 또는 주인 파티만이 주을 수 있다. if ((pEffectPrecedence->getHostName() == pPC->getName()) || (pPC->getPartyID() != 0 && pPC->getPartyID() == pEffectPrecedence->getHostPartyID())) { - // ִ. Ʈ ش. + // 주을 수 있다. 이펙트를 삭제해 준다. rEffectManager.deleteEffect(Effect::EFFECT_CLASS_PRECEDENCE); pItem->removeFlag(Effect::EFFECT_CLASS_PRECEDENCE); } else { - // . + // 주을 수 없다. goto ERROR; } } @@ -129,8 +129,8 @@ void CGAddZoneToMouseHandler::execute(CGAddZoneToMouse* pPacket, Player* pPlayer /* #ifdef __XMAS_EVENT_CODE__ Inventory* pInventory = pPC->getInventory(); - // ڶ, - // κ丮 ڸ ִٸ . + // 주으려는 아이템이 녹색 선물 상자라면, + // 인벤토리에 녹색 선물 상자를 가지고 있다면 주을 수 없다. if (pItem->getItemClass() == Item::ITEM_CLASS_EVENT_GIFT_BOX && pItem->getItemType() == 0 && pInventory->hasGreenGiftBox()) goto ERROR; @@ -141,16 +141,16 @@ void CGAddZoneToMouseHandler::execute(CGAddZoneToMouse* pPacket, Player* pPlayer Item::ItemClass itemclass = pItem->getItemClass(); // ItemType_t itemtype = pItem->getItemType(); - // relic ̹ ִ relic . - // ִٸ relic ٴ effect ɾְ - // CombatInfoManager ش. + // relic인 경우는 이미 갖고 있는 relic종류를 또 가질 수는 없다. + // 가질 수 있다면 relic을 가졌다는 effect를 걸어주고 + // CombatInfoManager에 소유자 값을 설정해준다. if (isRelicItem(itemclass)) { addRelicEffect(pPC, pItem); deleteEffectRelicPosition(pItem); } - // Flag 쿣 Flag ٿش. + // Flag인 경우엔 Flag 를 붙여준다. if (pItem->isFlagItem()) { addSimpleCreatureEffect(pPC, Effect::EFFECT_CLASS_HAS_FLAG); } @@ -170,7 +170,7 @@ void CGAddZoneToMouseHandler::execute(CGAddZoneToMouse* pPacket, Player* pPlayer pZone->broadcastPacket(pPC->getX(), pPC->getY(), &gcAddEffect); - // ֿ ý ޼ ѷش + // 주웠으면 존에 시스템 메세지 뿌려준다 char race[15]; if (pCreature->isSlayer()) { sprintf(race, g_pStringPool->c_str(STRID_SLAYER)); @@ -196,13 +196,13 @@ void CGAddZoneToMouseHandler::execute(CGAddZoneToMouse* pPacket, Player* pPlayer pZone->deleteItem(pItem, ZoneX, ZoneY); pPC->addItemToExtraInventorySlot(pItem); - // 𿡰 ־ٰ ˷ش. + // 주은 놈에게 잘 주었다고 결과를 알려준다. GCDeleteandPickUpOK _GCDeleteandPickUpOK; GCDeleteObject _GCDeleteObject; _GCDeleteandPickUpOK.setObjectID(pItem->getObjectID()); pPlayer->sendPacket(&_GCDeleteandPickUpOK); - // ó ִ ٸ 鿡 ۿ ٴ ش. + // 근처에 있는 다른 사람들에겐 아이템에 사라졌다는 것을 보내준다. _GCDeleteObject.setObjectID(pItem->getObjectID()); // pZone->broadcastPacket(pPC->getX(), pPC->getY(), &_GCDeleteObject, pPC); // pZone->broadcastPacket(ZoneX, ZoneY, &_GCDeleteObject, pPC); @@ -210,14 +210,14 @@ void CGAddZoneToMouseHandler::execute(CGAddZoneToMouse* pPacket, Player* pPlayer Success = true; - // Ѵ. + // 아이템을 저장한다. // pItem->save(pPC->getName(), STORAGE_EXTRASLOT, 0, 0, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "OwnerID='%s', Storage=%d", pPC->getName().c_str(), STORAGE_EXTRASLOT); pItem->tinysave(pField); - // Ʈ Ʈ ۵鵵 Ѿ Ѵ. 2003.3.22 by Sequoia + // 벨트일 경우 벨트 안의 아이템들도 모두 소유권이 넘어가야 한다. 2003.3.22 by Sequoia if (pItem->getItemClass() == Item::ITEM_CLASS_BELT) { sprintf(pField, "OwnerID='%s'", pPC->getName().c_str()); @@ -234,7 +234,7 @@ void CGAddZoneToMouseHandler::execute(CGAddZoneToMouse* pPacket, Player* pPlayer } } } - // Ͻ ۵鵵 Ѿ Ѵ. 2003.3.22 by Sequoia + // 암스밴드일 경우 안의 아이템들도 모두 소유권이 넘어가야 한다. 2003.3.22 by Sequoia if (pItem->getItemClass() == Item::ITEM_CLASS_OUSTERS_ARMSBAND) { sprintf(pField, "OwnerID='%s'", pPC->getName().c_str()); @@ -287,8 +287,8 @@ void CGAddZoneToMouseHandler::execute(CGAddZoneToMouse* pPacket, Player* pPlayer } ////////////////////////////////////////////////////////////////////////////// -// ̺Ʈ ڵ尡 ִ ̴. -// Ȱ ̺Ʈ 𸣴, ! -- by 輺 +// 이벤트 코드가 들어가있는 버전이다. +// 똑같은 이벤트가 또 실행될 지 모르니, 지우지 말 것! -- by 김성민 ////////////////////////////////////////////////////////////////////////////// /* void CGAddZoneToMouseHandler::execute (CGAddZoneToMouse* pPacket , Player* pPlayer) @@ -314,12 +314,12 @@ void CGAddZoneToMouseHandler::execute (CGAddZoneToMouse* pPacket , Player* pPlay ZoneCoord_t ZoneX = pPacket->getZoneX(); ZoneCoord_t ZoneY = pPacket->getZoneY(); - // ٿ带 Ѿ ʴ üũѴ. + // 바운드를 넘어가지는 않는지 체크한다. if (!isValidZoneCoord(pZone, ZoneX, ZoneY)) goto ERROR; Tile& _Tile = pZone->getTile(ZoneX, ZoneY); - // ŸϿ ٸ 翬 . + // 타일에 아이템이 없다면 당연히 더할 수 없다. if (!_Tile.hasItem()) { GCCannotAdd _GCCannotAdd; @@ -328,7 +328,7 @@ void CGAddZoneToMouseHandler::execute (CGAddZoneToMouse* pPacket , Player* pPlay return; } - // Ͱ ̶ 翬 . + // 아이템 포인터가 널이라면 당연히 더할 수 없다. Item* pItem = _Tile.getItem(); if (pItem == NULL) { @@ -340,12 +340,12 @@ void CGAddZoneToMouseHandler::execute (CGAddZoneToMouse* pPacket , Player* pPlay ObjectID_t ItemObjectID = pItem->getObjectID(); - // ObjectID ġϴ üũѴ. + // 아이템의 ObjectID가 일치하는지 체크한다. if (ItemObjectID == pPacket->getObjectID()) { Item* pExtraItem = pPC->getExtraInventorySlotItem(); - // ̹ 𰡸 ִٸ, . + // 이미 무언가를 들고 있다면, 아이템을 더할 수 없다. if (pExtraItem != NULL) { GCCannotAdd _GCCannotAdd; @@ -354,7 +354,7 @@ void CGAddZoneToMouseHandler::execute (CGAddZoneToMouse* pPacket , Player* pPlay return; } - // ٴڿ ִ ̺Ʈ ذ̶... + // 바닥에 떨어져 있는 아이템이 이벤트용 해골이라면... if (pItem->getItemClass() == Item::ITEM_CLASS_SKULL && 12 <= pItem->getItemType() && pItem->getItemType() <= 16) { @@ -364,68 +364,68 @@ void CGAddZoneToMouseHandler::execute (CGAddZoneToMouse* pPacket , Player* pPlay switch (pItem->getItemType()) { - case 12: scount += 1; break; // Ȳ ذ - case 15: scount += 4; break; // ذ - case 14: scount += 9; break; // ذ + case 12: scount += 1; break; // 황금 해골 + case 15: scount += 4; break; // 수정 해골 + case 14: scount += 9; break; // 검은 해골 default: break; } - // īƮ Ѵ. + // 카운트를 저장한다. pGamePlayer->setSpecialEventCount(scount); pGamePlayer->saveSpecialEventCount(); cur = scount/10; - // Ѵ. + // 존에서 아이템을 삭제한다. pZone->deleteItem(pItem, ZoneX, ZoneY); - // 𿡰 ־ٰ ش. + // 주은 놈에게 잘 주었다고 날려준다. GCDeleteandPickUpOK _GCDeleteandPickUpOK; GCDeleteObject _GCDeleteObject; _GCDeleteandPickUpOK.setObjectID(pItem->getObjectID()); pPlayer->sendPacket(&_GCDeleteandPickUpOK); - // ó ִ ٸ 鿡 ۿ ٴ ش. + // 근처에 있는 다른 사람들에겐 아이템에 사라졌다는 것을 보내준다. _GCDeleteObject.setObjectID(pItem->getObjectID()); pZone->broadcastPacket(pPC->getX(), pPC->getY(), &_GCDeleteObject, pPC); - // ü Ѵ. + // 마지막으로 실제 아이템 객체를 삭제한다. SAFE_DELETE(pItem); - // ش. + // 점수를 정기적으로 가르쳐준다. StringStream msg; - msg << " ̺Ʈ Ʈ " << pGamePlayer->getSpecialEventCount() << " Ʈ Դϴ."; + msg << "당신의 현재 이벤트 포인트는 " << pGamePlayer->getSpecialEventCount() << " 포인트 입니다."; GCSystemMessage gcMsg; gcMsg.setMessage(msg.toString()); pPlayer->sendPacket(&gcMsg); - // εijѴ. + // 점수를 정기적으로 브로드캐스팅한다. if (prev != cur) { StringStream msg; - msg << pPC->getName() << "Բ " << pGamePlayer->getSpecialEventCount() << " Ʈ ̺Ʈ - ȹϿϴ."; GCSystemMessage gcMsg; gcMsg.setMessage(msg.toString()); pPlayer->sendPacket(&gcMsg); + msg << pPC->getName() << "님께서 " << pGamePlayer->getSpecialEventCount() << " 포인트의 이벤트 +점수를 획득하였습니다."; GCSystemMessage gcMsg; gcMsg.setMessage(msg.toString()); pPlayer->sendPacket(&gcMsg); pZone->broadcastPacket(pPC->getX(), pPC->getY(), &gcMsg , pPC); } return; } - // ϰ, 콺 ޾ش. + // 존에서 아이템을 삭제하고, 마우스에다 달아준다. pZone->deleteItem(pItem, ZoneX, ZoneY); pPC->addItemToExtraInventorySlot(pItem); - // 𿡰 ־ٰ ˷ش. + // 주은 놈에게 잘 주었다고 결과를 알려준다. GCDeleteandPickUpOK _GCDeleteandPickUpOK; GCDeleteObject _GCDeleteObject; _GCDeleteandPickUpOK.setObjectID(pItem->getObjectID()); pPlayer->sendPacket(&_GCDeleteandPickUpOK); - // ó ִ ٸ 鿡 ۿ ٴ ش. + // 근처에 있는 다른 사람들에겐 아이템에 사라졌다는 것을 보내준다. _GCDeleteObject.setObjectID(pItem->getObjectID()); pZone->broadcastPacket(pPC->getX(), pPC->getY(), &_GCDeleteObject, pPC); Success = true; - // Ѵ. + // 아이템을 저장한다. pItem->save(pPC->getName(), STORAGE_EXTRASLOT, 0, 0, 0); } diff --git a/src/Core/CGAppointSubmasterHandler.cpp b/src/Core/CGAppointSubmasterHandler.cpp index 1d226431..16bc3475 100644 --- a/src/Core/CGAppointSubmasterHandler.cpp +++ b/src/Core/CGAppointSubmasterHandler.cpp @@ -40,7 +40,7 @@ void CGAppointSubmasterHandler::execute(CGAppointSubmaster* pPacket, Player* pPl #ifdef __OLD_GUILD_WAR__ GCSystemMessage gcSM; - gcSM.setMessage(" ʴ Դϴ."); + gcSM.setMessage("아직 지원되지 않는 기능입니다."); pGamePlayer->sendPacket(&gcSM); return; #endif @@ -48,8 +48,8 @@ void CGAppointSubmasterHandler::execute(CGAppointSubmaster* pPacket, Player* pPl SYSTEM_ASSERT(SYSTEM_GUILD); if (!g_pGuildManager->isGuildMaster(pPacket->getGuildID(), pPlayerCreature)) { - // GC_GUILD_RESPONSE ش. - // : Ͱ ƴڳ -.-+ + // GC_GUILD_RESPONSE 날려준다. + // 내용 : 길드 마스터가 아니자녀 -.-+ GCGuildResponse gcGR; gcGR.setCode(GuildUnionOfferManager::SOURCE_IS_NOT_MASTER); pPlayer->sendPacket(&gcGR); diff --git a/src/Core/CGAttack.h b/src/Core/CGAttack.h index 8769d4a5..448d09a2 100644 --- a/src/Core/CGAttack.h +++ b/src/Core/CGAttack.h @@ -36,10 +36,10 @@ class CGAttack : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -97,9 +97,9 @@ class CGAttack : public Packet { private: ObjectID_t m_ObjectID; // ObjectID - Coord_t m_X; // X ǥ - Coord_t m_Y; // Y ǥ - Dir_t m_Dir; // + Coord_t m_X; // X 좌표 + Coord_t m_Y; // Y 좌표 + Dir_t m_Dir; // 방향 }; diff --git a/src/Core/CGAttackHandler.cpp b/src/Core/CGAttackHandler.cpp index f2e2f7dc..7e438486 100644 --- a/src/Core/CGAttackHandler.cpp +++ b/src/Core/CGAttackHandler.cpp @@ -45,7 +45,7 @@ void CGAttackHandler::execute(CGAttack* pPacket, Player* pPlayer) GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Assert(pGamePlayer != NULL); // by sigi - // ÷̾ ° ƴ϶ Ѵ. + // 플레이어가 정상적인 상태가 아니라면 리턴한다. if (pGamePlayer->getPlayerStatus() != GPS_NORMAL) { GCSkillFailed1 _GCSkillFailed1; _GCSkillFailed1.setSkillType(SKILL_ATTACK_MELEE); @@ -59,7 +59,7 @@ void CGAttackHandler::execute(CGAttack* pPacket, Player* pPlayer) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ұ. by sigi. 2002.11.14 + // 완전 안전지대라면 기술 사용 불가. by sigi. 2002.11.14 ZoneLevel_t ZoneLevel = pZone->getZoneLevel(pCreature->getX(), pCreature->getY()); if (ZoneLevel & COMPLETE_SAFE_ZONE) { GCSkillFailed1 _GCSkillFailed1; @@ -78,7 +78,7 @@ void CGAttackHandler::execute(CGAttack* pPacket, Player* pPlayer) pCreature->setLastTarget(pTarget->getObjectID()); - // ʵ Ѵ. bezz 6.8 Ȯιٶ. + // 만약 같은 종족의 성물 보관대라면 공격하지 않도록 한다. bezz 6.8 수정 확인바람. /* if ( pTarget->isMonster() ) @@ -111,29 +111,29 @@ void CGAttackHandler::execute(CGAttack* pPacket, Player* pPlayer) switch(type) { case 371: - RelicName = "Ҹ"; + RelicName = "롬멜의훈장"; break; case 372: - RelicName = ""; + RelicName = "성의"; break; case 374: - RelicName = "ó"; + RelicName = "처녀의피"; break; case 375: - RelicName = "ڰ"; + RelicName = "역십자가"; break; default: RelicName = pMonster->getName(); } - // Ʈ + // 이펙트 만들기 EffectCombatMessage1* pEffect = new EffectCombatMessage1(); pEffect->setNextTime(30); pEffect->setDelay(30); pEffect->setDeadline(60); pEffect->setRelicName(RelicName); - // Zone Ʈ ̱ + // Zone에 이펙트 붙이기 (pZone->getObjectRegistry()).registerObject(pEffect); pZone->addEffect(pEffect); } diff --git a/src/Core/CGAuthKey.h b/src/Core/CGAuthKey.h index 602514bc..3a7a0a1a 100644 --- a/src/Core/CGAuthKey.h +++ b/src/Core/CGAuthKey.h @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////////////// // class CGAuthKey; -// NPC 縦 ֺ PC 鿡 Ѵ. +// NPC 의 대사를 주변의 PC 들에게 전송한다. ////////////////////////////////////////////////////////////////////////////// class CGAuthKey : public Packet { diff --git a/src/Core/CGAuthKeyHandler.cpp b/src/Core/CGAuthKeyHandler.cpp index 909b42b9..888f20c7 100644 --- a/src/Core/CGAuthKeyHandler.cpp +++ b/src/Core/CGAuthKeyHandler.cpp @@ -19,7 +19,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void CGAuthKeyHandler::execute(CGAuthKey* pPacket, Player* pPlayer) @@ -37,15 +37,15 @@ void CGAuthKeyHandler::execute(CGAuthKey* pPacket, Player* pPlayer) DWORD key = pPacket->getKey(); // if ( !pGamePlayer->getCSAuth().CheckAuthDword(key) ) // { - // filelog("CSAuth.log", "[%s] ߸Ǿϴ.", pGamePlayer->getID().c_str()); + // filelog("CSAuth.log", "[%s] 인증 값이 잘못되었습니다.", pGamePlayer->getID().c_str()); // GCSystemMessage gcSystemMessage; - // gcSystemMessage.setMessage("nProtect GameGuard֤ʧ.ִļGameGuardļ."); + // gcSystemMessage.setMessage("nProtect GameGuard훰聯呵겨.獵契匡숭댄轎샀GameGuard匡숭愆뻐."); // pGamePlayer->sendPacket( &gcSystemMessage ); // EventKick* pKick = new EventKick( pGamePlayer ); // pKick->setDeadline(100); - // // pKick->setMessage("GameGuard ڵ尡 ߸Ǿϴ. 10 ڿ ˴ϴ."); + // // pKick->setMessage("GameGuard 인증 코드가 잘못되었습니다. 10초 뒤에 연결이 종료됩니다."); // pKick->sendMessage(); // pGamePlayer->addEvent(pKick); diff --git a/src/Core/CGBloodDrain.h b/src/Core/CGBloodDrain.h index f3ec4f44..7c361e38 100644 --- a/src/Core/CGBloodDrain.h +++ b/src/Core/CGBloodDrain.h @@ -36,10 +36,10 @@ class CGBloodDrain : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -86,9 +86,9 @@ class CGBloodDrain : public Packet { private: ObjectID_t m_ObjectID; // ObjectID /* - Coord_t m_X; // X ǥ - Coord_t m_Y; // Y ǥ - Dir_t m_Dir; // + Coord_t m_X; // X 좌표 + Coord_t m_Y; // Y 좌표 + Dir_t m_Dir; // 방향 */ }; diff --git a/src/Core/CGBloodDrainHandler.cpp b/src/Core/CGBloodDrainHandler.cpp index befb8fb7..5696c5d2 100644 --- a/src/Core/CGBloodDrainHandler.cpp +++ b/src/Core/CGBloodDrainHandler.cpp @@ -39,13 +39,13 @@ void CGBloodDrainHandler::execute(CGBloodDrain* pPacket, Player* pPlayer) Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); - // ̾ ƴ . + // 뱀파이어가 아닌 놈이 흡혈을 할 수는 없다. if (!pCreature->isVampire()) return; Vampire* pVampire = dynamic_cast(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(pVampire, SKILL_BLOOD_DRAIN))) { GCSkillFailed1 gcSkillFailed1; @@ -54,7 +54,7 @@ void CGBloodDrainHandler::execute(CGBloodDrain* pPacket, Player* pPlayer) return; } - // Dark Revenge ¿ õϸ Ǯش. + // Dark Revenge 상태에서 흡혈을 시도하면 풀어준다. if (pVampire->isFlag(Effect::EFFECT_CLASS_EXTREME)) { EffectManager* pEffectManager = pVampire->getEffectManager(); Assert(pEffectManager != NULL); @@ -64,7 +64,7 @@ void CGBloodDrainHandler::execute(CGBloodDrain* pPacket, Player* pPlayer) } } - // ̴ ¿ õϸ, ̰ ش. + // 안 보이는 상태에서 흡혈을 시도하면, 보이게 해준다. if (pVampire->isFlag(Effect::EFFECT_CLASS_INVISIBILITY)) { Zone* pZone = pVampire->getZone(); Assert(pZone != NULL); diff --git a/src/Core/CGBuyStoreItem.cpp b/src/Core/CGBuyStoreItem.cpp index 53989d32..37d1e65e 100644 --- a/src/Core/CGBuyStoreItem.cpp +++ b/src/Core/CGBuyStoreItem.cpp @@ -1,10 +1,10 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CGBuyStoreItem.cpp -// Written By : 輺 +// Written By : 김성민 // Description : -// ÷̾ NPC â , ϰ -// Ŷ̴. ÷̾ κ丮 -// ڸ ִ ÷̾ ѱ. +// 플레이어가 상점 NPC의 진열창을 보고, 물건을 구입하고자 할 때 +// 보내는 패킷이다. 서버는 플레이어에게 충분한 돈과 인벤토리에 +// 자리가 있는지 검증한 후 플레이어에게 아이템을 넘긴다. //////////////////////////////////////////////////////////////////////////////// #include "CGBuyStoreItem.h" diff --git a/src/Core/CGBuyStoreItem.h b/src/Core/CGBuyStoreItem.h index 96165803..14625feb 100644 --- a/src/Core/CGBuyStoreItem.h +++ b/src/Core/CGBuyStoreItem.h @@ -1,10 +1,10 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CGBuyStoreItem.h -// Written By : 輺 +// Written By : 김성민 // Description : -// ÷̾ NPC â , ϰ -// Ŷ̴. ÷̾ κ丮 -// ڸ ִ , ÷̾ ѱ. +// 플레이어가 상점 NPC의 진열창을 보고, 물건을 구입하고자 할 때 +// 보내는 패킷이다. 서버는 플레이어에게 충분한 돈과 인벤토리에 +// 자리가 있는지 검증한 후, 플레이어에게 아이템을 넘긴다. //////////////////////////////////////////////////////////////////////////////// #ifndef __CG_BUY_STORE_ITEM_H__ diff --git a/src/Core/CGBuyStoreItemHandler.cpp b/src/Core/CGBuyStoreItemHandler.cpp index 3235397e..1dbbf079 100644 --- a/src/Core/CGBuyStoreItemHandler.cpp +++ b/src/Core/CGBuyStoreItemHandler.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGBuyStoreItemHandler.cpp -// Written By : 輺 +// Written By : ±è¼º¹Î // Description : ////////////////////////////////////////////////////////////////////////////// @@ -29,8 +29,8 @@ #endif ////////////////////////////////////////////////////////////////////////////// -// ÷̾ ϴ Ĵ NPC ִ -// Ȯϰ, Ϲ ۰ Ŭ óκ бѴ. +// Ç÷¹À̾ ¿øÇÏ´Â ¹°°ÇÀ» ÆÄ´Â NPC¿Í ±× ¾ÆÀÌÅÛÀÌ ÀÖ´ÂÁö +// È®ÀÎÇϰí, ÀÏ¹Ý ¾ÆÀÌÅÛ°ú ¸ðÅÍ »çÀÌŬ 󸮺κÐÀ¸·Î ºÐ±âÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// void CGBuyStoreItemHandler::execute(CGBuyStoreItem* pPacket, Player* pPlayer) @@ -52,32 +52,32 @@ void CGBuyStoreItemHandler::execute(CGBuyStoreItem* pPacket, Player* pPlayer) GCNoticeEvent errorNotice; if (pPacket->getIndex() > MAX_ITEM_NUM) { - filelog("Store.log", "[%s:%s] (%u) ߸ εԴϴ.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), + filelog("Store.log", "[%s:%s] (%u) À߸øµÈ À妽ºÀÔ´Ï´Ù.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), pPacket->getIndex()); return; } PlayerCreature* pStorePC = dynamic_cast(pPC->getZone()->getCreature(pPacket->getOwnerObjectID())); if (pStorePC == NULL) { - filelog("Store.log", "[%s:%s] (%u) ׷ ϴ.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), + filelog("Store.log", "[%s:%s] (%u) ±×·± À¯Àú°¡ ¾ø½À´Ï´Ù.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), pPacket->getOwnerObjectID()); - // errorMsg.setMessage("ش Ǹڸ ã ϴ."); + // errorMsg.setMessage("ÇØ´ç ÆÇ¸ÅÀÚ¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù."); errorNotice.setCode(NOTICE_EVENT_CANNOT_FIND_STORE); pGamePlayer->sendPacket(&errorNotice); return; } if (pStorePC->getRace() != pPC->getRace()) { - filelog("Store.log", "[%s:%s] (%s) ٸ õ߽ϴ.", pGamePlayer->getID().c_str(), + filelog("Store.log", "[%s:%s] (%s) ´Ù¸¥ Á¾Á·ÀÇ »óÁ¡À» ¿­·Á°í ½ÃµµÇß½À´Ï´Ù.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), pStorePC->getName().c_str()); return; } Store* pStore = pStorePC->getStore(); if (pStore == NULL || !pStore->isOpen()) { - filelog("Store.log", "[%s:%s] (%s) ʽϴ..", pGamePlayer->getID().c_str(), + filelog("Store.log", "[%s:%s] (%s) »óÁ¡ÀÌ ¿­·ÁÀÖÁö ¾Ê½À´Ï´Ù..", pGamePlayer->getID().c_str(), pPC->getName().c_str(), pStorePC->getName().c_str()); - // errorMsg.setMessage(" ̹ ϴ."); + // errorMsg.setMessage("»óÁ¡ÀÌ ÀÌ¹Ì ´ÝÇû½À´Ï´Ù."); errorNotice.setCode(NOTICE_EVENT_STORE_CLOSED); pGamePlayer->sendPacket(&errorNotice); return; @@ -85,9 +85,9 @@ void CGBuyStoreItemHandler::execute(CGBuyStoreItem* pPacket, Player* pPlayer) StoreItem& storeItem = pStore->getStoreItem(pPacket->getIndex()); if (!storeItem.isExists()) { - filelog("Store.log", "[%s:%s] (%s:%u) ش ġ ϴ..", pGamePlayer->getID().c_str(), + filelog("Store.log", "[%s:%s] (%s:%u) ÇØ´ç À§Ä¡¿¡ ¾ÆÀÌÅÛÀÌ ¾ø½À´Ï´Ù..", pGamePlayer->getID().c_str(), pPC->getName().c_str(), pStorePC->getName().c_str(), pPacket->getIndex()); - // errorMsg.setMessage(" ̹ ǸŵǾų Ǹڿ öȸǾϴ."); + // errorMsg.setMessage("¾ÆÀÌÅÛÀÌ ÀÌ¹Ì ÆÇ¸ÅµÇ¾ú°Å³ª ÆÇ¸ÅÀÚ¿¡ ÀÇÇØ öȸµÇ¾ú½À´Ï´Ù."); errorNotice.setCode(NOTICE_EVENT_ITEM_NOT_FOUND); pGamePlayer->sendPacket(&errorNotice); return; @@ -99,28 +99,28 @@ void CGBuyStoreItemHandler::execute(CGBuyStoreItem* pPacket, Player* pPlayer) Assert(pItem != NULL); if (pPC->getGold() < price) { - filelog("Store.log", "[%s:%s] (%s:%u) (%u<%u) ڶϴ.", pGamePlayer->getID().c_str(), + filelog("Store.log", "[%s:%s] (%s:%u) (%u<%u) µ·ÀÌ ¸ðÀÚ¶ø´Ï´Ù.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), pStorePC->getName().c_str(), pPacket->getIndex(), pPC->getGold(), price); - // errorMsg.setMessage(" ڶϴ."); + // errorMsg.setMessage("µ·ÀÌ ¸ðÀÚ¶ø´Ï´Ù."); errorNotice.setCode(NOTICE_EVENT_NOT_ENOUGH_MONEY); pGamePlayer->sendPacket(&errorNotice); return; } if (pStorePC->getGold() > MAX_MONEY - price) { - filelog("Store.log", "[%s:%s] (%s:%u) (%u,%u) Ĩϴ.", pGamePlayer->getID().c_str(), + filelog("Store.log", "[%s:%s] (%s:%u) (%u,%u) µ·ÀÌ ³ÑĨ´Ï´Ù.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), pStorePC->getName().c_str(), pPacket->getIndex(), pStorePC->getGold(), price); - // errorMsg.setMessage("Ǹڰ ʹ ־ ϴ."); + // errorMsg.setMessage("ÆÇ¸ÅÀÚ°¡ ³Ê¹« ¸¹Àº µ·À» °¡Áö°í À־ ±¸ÀÔÇÒ ¼ö ¾ø½À´Ï´Ù."); errorNotice.setCode(NOTICE_EVENT_TOO_MUCH_MONEY); pGamePlayer->sendPacket(&errorNotice); - errorMsg.setMessage("Ͻ̫,޷н."); + errorMsg.setMessage("ÉíÉϽð±ÒÌ«¶à,ÎÞ·¨½øÐн»Ò×."); pStorePC->getPlayer()->sendPacket(&errorMsg); pGamePlayer->sendPacket(&errorMsg); return; } if (pItem->isTimeLimitItem() || !canSell(pItem)) { - filelog("Store.log", "[%s:%s] (%s:%u) (%s) Դϴ.", pGamePlayer->getID().c_str(), + filelog("Store.log", "[%s:%s] (%s:%u) (%s) ÆÈ ¼ö ¾ø´Â ¾ÆÀÌÅÛÀÔ´Ï´Ù.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), pStorePC->getName().c_str(), pPacket->getIndex(), pItem->toString().c_str()); return; } @@ -130,10 +130,10 @@ void CGBuyStoreItemHandler::execute(CGBuyStoreItem* pPacket, Player* pPlayer) Item* pStoreItem = pStoreInventory->findItemOID(pItem->getObjectID(), storeX, storeY); if (pStoreItem != pItem) { - filelog("Store.log", "[%s:%s] (%s:%u) (%p!=%p) Ǹڰ Ȱ ְų ̻ Դϴ.", + filelog("Store.log", "[%s:%s] (%s:%u) (%p!=%p) ÆÇ¸ÅÀÚ°¡ ¾ÆÀÌÅÛÀ» ¾È°®°í Àְųª ÀÌ»óÇÑ ¾ÆÀÌÅÛÀÔ´Ï´Ù.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), pStorePC->getName().c_str(), pPacket->getIndex(), pStoreItem, pItem); - errorMsg.setMessage("ûпɳ۵ĵ."); + errorMsg.setMessage("µÀ¾ßÀ¸ÄÚûÓпɳöÊ۵ĵÀ¾ß."); pStorePC->getPlayer()->sendPacket(&errorMsg); return; } @@ -142,9 +142,9 @@ void CGBuyStoreItemHandler::execute(CGBuyStoreItem* pPacket, Player* pPlayer) _TPOINT emptyPos; if (!pInventory->getEmptySlot(pItem, emptyPos)) { - filelog("Store.log", "[%s:%s] (%s:%u) κ丮 ڸ ϴ.", pGamePlayer->getID().c_str(), + filelog("Store.log", "[%s:%s] (%s:%u) »ì »ç¶÷ Àκ¥Å丮¿¡ ÀÚ¸®°¡ ¾ø½À´Ï´Ù.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), pStorePC->getName().c_str(), pPacket->getIndex()); - // errorMsg.setMessage("κ丮  ϴ."); + // errorMsg.setMessage("Àκ¥Å丮¿¡ ºó °÷ÀÌ ¾ø¾î¼­ ±¸ÀÔÇÒ ¼ö ¾ø½À´Ï´Ù."); errorNotice.setCode(NOTICE_EVENT_NO_INVENTORY_SPACE); pGamePlayer->sendPacket(&errorNotice); return; @@ -155,7 +155,7 @@ void CGBuyStoreItemHandler::execute(CGBuyStoreItem* pPacket, Player* pPlayer) pStoreInventory->deleteItem(storeX, storeY); pStorePC->increaseGoldEx(price); - filelog("StoreBought.log", "[%s:%u/%u] ŵǾϴ.", pStorePC->getName().c_str(), + filelog("StoreBought.log", "[%s:%u/%u] ¾ÆÀÌÅÛÀÌ Á¦°ÅµÇ¾ú½À´Ï´Ù.", pStorePC->getName().c_str(), pItem->getItemClass(), pItem->getItemID()); GCShopSellOK gcSellOK; @@ -173,7 +173,7 @@ void CGBuyStoreItemHandler::execute(CGBuyStoreItem* pPacket, Player* pPlayer) emptyPos.y); pItem->tinysave(pField); - filelog("StoreBought.log", "[%s:%u/%u] ־ϴ.", pPC->getName().c_str(), pItem->getItemClass(), + filelog("StoreBought.log", "[%s:%u/%u] ¾ÆÀÌÅÛÀÌ ÁÖ¾îÁ³½À´Ï´Ù.", pPC->getName().c_str(), pItem->getItemClass(), pItem->getItemID()); if (pItem->isTraceItem()) { diff --git a/src/Core/CGCastingSkill.h b/src/Core/CGCastingSkill.h index e0c6ca61..a9933a70 100644 --- a/src/Core/CGCastingSkill.h +++ b/src/Core/CGCastingSkill.h @@ -31,10 +31,10 @@ class CGCastingSkill : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGCastingSkillHandler.cpp b/src/Core/CGCastingSkillHandler.cpp index 86821d8f..83493431 100644 --- a/src/Core/CGCastingSkillHandler.cpp +++ b/src/Core/CGCastingSkillHandler.cpp @@ -30,7 +30,7 @@ void CGCastingSkillHandler::execute(CGCastingSkill* pPacket, Player* pPlayer) GamePlayer* pGamePlayer = dynamic_cast(pPlayer); if (pGamePlayer->getPlayerStatus() == GPS_NORMAL) { - // Creature ޾ƿ´. + // Creature를 받아온다. Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); diff --git a/src/Core/CGConnect.h b/src/Core/CGConnect.h index eff46b45..7e747df2 100644 --- a/src/Core/CGConnect.h +++ b/src/Core/CGConnect.h @@ -17,9 +17,9 @@ // // class CGConnect; // -// Ŭ̾Ʈ Ŷ̴. -// ̵ Ǹ, Key ؼ -// ޴´. , ũó ̵ ִ. +// 클라이언트가 서버에게 보내는 연결 패킷이다. +// 서버간 이동에 사용되며, 이전 서버가 준 Key 를 새 서버에게 전송해서 +// 인증을 받는다. 또한, 새 서버에서 사용할 크리처 아이디를 담고 있다. // ////////////////////////////////////////////////////////////////////// @@ -27,10 +27,10 @@ class CGConnect : public Packet { public: CGConnect() {}; ~CGConnect() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -92,7 +92,7 @@ class CGConnect : public Packet { // Slayer or Vampire? PCType m_PCType; - // PC ̸ + // PC의 이름 string m_PCName; BYTE m_MacAddress[6]; diff --git a/src/Core/CGConnectHandler.cpp b/src/Core/CGConnectHandler.cpp index 740738f0..b815ea81 100644 --- a/src/Core/CGConnectHandler.cpp +++ b/src/Core/CGConnectHandler.cpp @@ -79,16 +79,16 @@ bool isAdultByBirthdayDate(const string& birthday); ////////////////////////////////////////////////////////////////////////////// // CGConnectHandler::execute() // -// Ŷ αμ ʷ , Ǵ -// ٸ ̵ , Ŭ̾Ʈ ϴ Ŷ̴. -// ̶ ÷̾ ü ܳ ̰, ÷̾ ü IPM -// Ǵ ̴. +// ÀÌ ÆÐŶÀº ·Î±×Àμ­¹ö¿¡¼­ ÃÖÃÊ·Î °ÔÀÓ ¼­¹ö·Î ¿¬°áÇÒ ¶§, ¶Ç´Â °ÔÀÓ ¼­¹ö¿¡¼­ +// ´Ù¸¥ °ÔÀÓ ¼­¹ö·Î À̵¿ÇÒ ¶§, Ŭ¶óÀÌ¾ðÆ®°¡ ¼­¹ö·Î Àü¼ÛÇÏ´Â ÃÖÃÊÀÇ ÆÐŶÀÌ´Ù. +// À̶§ Ç÷¹ÀÌ¾î °´Ã¼´Â »õ·Î »ý°Ü³­ »óÅÂÀ̰í, ÀÌ Ç÷¹ÀÌ¾î °´Ã¼´Â IPM ¿¡¼­ +// °ü¸®µÇ´Â »óÅÂÀÌ´Ù. // -// 翬 Ŷ ٸ Ŷ Ѿ , ̰ ŷ õ -// ϹǷ Ŷ ˻ؾ Ѵ. ̸ ؼ ÷̾ ü -// Ŷ ϰ Ƿ, NULL ǰڴ. +// ´ç¿¬È÷ ÃÖÃÊÀÇ ÆÐŶÀ¸·Î ´Ù¸¥ ÆÐŶÀÌ ³Ñ¾î¿À´Â °æ¿ì¶ó¸é, À̰ÍÀº ÇØÅ· ½Ãµµ¶ó°í +// ºÁµµ ¹«¹æÇϹǷΠÀÌ ÆÐŶÀÌ ÃÖÃÊÀÎÁö °Ë»çÇØ¾ß ÇÑ´Ù. À̸¦ À§Çؼ­ Ç÷¹ÀÌ¾î °´Ã¼¿¡ +// ÀÌÀü ÆÐŶÀ» ÀúÀåÇϰí ÀÖÀ¸¹Ç·Î, ÀÌ °ªÀÌ NULL ÀÎÁö¸¸ º¸¸é µÇ°Ú´Ù. // -// ߸ Ŷ̶, ban ϰ Ѵ. +// À߸øµÈ ÆÐŶÀ̶ó¸é, ban ¿¡ µî·ÏÇϰí Á¢¼ÓÀ» Á¾·áÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) @@ -105,13 +105,13 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) // set MAC Address pGamePlayer->setMacAddress(pPacket->getMacAddress()); - // Ŷ ConnectionInfo ü ´. - // ũĿ Ű ij ̸ ðȿ ߸ ϴ. + // ÀÌ ÆÐŶÀ» ConnectionInfo °´Ã¼¸¦ °®°í ¿Â´Ù. + // Å©·¡Ä¿´Â ۰ª°ú ij¸¯ÅÍ À̸§À» ÀÏÁ¤ ½Ã°£¾È¿¡ ¸ÂÃç¾ß¸¸ Á¢¼ÓÀÌ °¡´ÉÇÏ´Ù. try { ConnectionInfo* pConnectionInfo = g_pConnectionInfoManager->getConnectionInfo(pGamePlayer->getSocket()->getHost()); - // Ű Ѵ. + // ۰ªÀ» ÀÎÁõÇÑ´Ù. if (pPacket->getKey() != pConnectionInfo->getKey()) { FILELOG_INCOMING_CONNECTION("connectionError.log", "Wrong Key: [%s] %s", pConnectionInfo->getPCName().c_str(), @@ -119,7 +119,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) throw InvalidProtocolException("invalid key"); } - // ̸ Ѵ. + // À̸§À» ÀÎÁõÇÑ´Ù. if (pPacket->getPCName() != pConnectionInfo->getPCName()) { FILELOG_INCOMING_CONNECTION("connectionError.log", "Wrong PCName: [%s] %s", pConnectionInfo->getPCName().c_str(), @@ -127,19 +127,19 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) throw InvalidProtocolException("invalid pc name"); } - // ϴ ̸ Ѵ. ϸ ü ϴϱ ϴ. + // ÀÏ´Ü À̸§À» ÀúÀåÇÑ´Ù. ¾îÂ÷ÇÇ ´ÙÀ½¿¡ ½ÇÆÐÇÏ¸é °´Ã¼¸¦ »èÁ¦ÇÏ´Ï±î ¹«¹æÇÏ´Ù. pGamePlayer->setID(pConnectionInfo->getPlayerID()); - // CIM heartbeat DZ ɼ ִ. - // (Ÿ̹ heartbeat ֱ*2 ȿ ϸ ȴ.) - // , ð expire time Ѵ. + // CIMÀÇ heartbeat°¡ ½ÇÇàµÇ±â Àü¿¡ Àç¼öÁÁ°Ô Á¢¼ÓÇÒ °¡´É¼ºÀÌ ÀÖ´Ù. + // (ŸÀ̹ÖÀÌ ÁÁÀ¸¸é heartbeat ½ÇÇàÁÖ±â*2 ¾È¿¡¸¸ Á¢¼ÓÇÏ¸é µÈ´Ù.) + // µû¶ó¼­, ÇöÀç ½Ã°£°ú expire time À» ºñ±³ÇÑ´Ù. Timeval currentTime; getCurrentTime(currentTime); if (pConnectionInfo->getExpireTime() < currentTime) { FILELOG_INCOMING_CONNECTION("connectionError.log", "Expired: [%s] %s", pConnectionInfo->getPCName().c_str(), pGamePlayer->getSocket()->getHost().c_str()); - // ϴ Ѵ. + // ÀÏ´Ü »èÁ¦ÇÑ´Ù. g_pConnectionInfoManager->deleteConnectionInfo(pConnectionInfo->getClientIP()); throw InvalidProtocolException("session already expired"); } @@ -149,7 +149,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) pConnectionInfo->getPlayerID().c_str(), pConnectionInfo->getPCName().c_str(), pConnectionInfo->getClientIP().c_str(), pConnectionInfo->getKey()); - // Ǿ, ConnectionInfo Ѵ. + // ÀÎÁõµÇ¾úÀ¸´Ï, ConnectionInfo ¸¦ »èÁ¦ÇÑ´Ù. try { g_pConnectionInfoManager->deleteConnectionInfo(pConnectionInfo->getClientIP()); } catch (NoSuchElementException& nsee) { @@ -157,21 +157,21 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) pConnectionInfo->getPlayerID().c_str(), pConnectionInfo->getPCName().c_str(), pConnectionInfo->getClientIP().c_str(), pConnectionInfo->getKey()); } - } catch (NoSuchElementException& nsee) // ׷ IP CI + } catch (NoSuchElementException& nsee) // ±×·± IP¸¦ °¡Áø CI °¡ ¾øÀ» °æ¿ì { FILELOG_INCOMING_CONNECTION("connectionError.log", "NoSuchConnectionInfo: %s", pGamePlayer->getSocket()->getHost().c_str()); - // .. CGConnect Ŷ ̰ ʹ - // session expire ȴ. ̷ 쿡 ¥! - // ( , ῡ ״ · - //  , CGConnect Ŷ 뿡 expire ȴ.) + // Èì.. ¿¬°á ÀÌÈÄ CGConnect ÆÐŶÀ» º¸³»´Â µô·¹À̰¡ ³Ê¹« ±æ °æ¿ì + // session ÀÌ expire µÈ´Ù. ÀÌ·² °æ¿ì¿¡µµ Â¥¸£ÀÚ! + // (¿¹¸¦ µé¾î¼­, ÃÖÃÊ ¿¬°á¿¡¼­´Â ¼º°øÇßÀ¸³ª ±×´ÙÀ½¿¡ µð¹ö±ë »óÅ·Π+ // µé¾î°¥ °æ¿ì, CGConnect ÆÐŶÀ» º¸³¾ ¶§Âë¿¡´Â expire µÈ´Ù.) GCDisconnect gcDisconnect; gcDisconnect.setMessage(nsee.toString()); pGamePlayer->sendPacket(&gcDisconnect); - // ̷ IPM::processCommands() disconnect óѴ. + // ÀÌ·¸°Ô ´øÁö¸é »óÀ§ IPM::processCommands()¿¡¼­ disconnect ó¸®ÇÑ´Ù. throw InvalidProtocolException(nsee.toString().c_str()); } catch (InvalidProtocolException& ipe) { FILELOG_INCOMING_CONNECTION("connectionError.log", "%s: %s", ipe.toString().c_str(), @@ -187,17 +187,17 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) pGamePlayer->sendPacket(&gcDisconnect); - // ̷ IPM::processCommands() disconnect óѴ. + // ÀÌ·¸°Ô ´øÁö¸é »óÀ§ IPM::processCommands()¿¡¼­ disconnect ó¸®ÇÑ´Ù. throw; } //---------------------------------------------------------------------- - // α üũ + // ·Î±×ÀΠüũ //---------------------------------------------------------------------- Statement* pStmt = NULL; Result* pResult = NULL; - // ~ + // ºô¸µ~ PayType payType; string payPlayDate; uint payPlayHours; @@ -207,8 +207,8 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) try { - // ȡɫͣʹÿͻֹͣ - // ¹޸2006 05 31 + // È¡½ÇÉ«ÀàÐÍ£¬²»Ê¹Óÿͻ§¶ËÉÏÀ´µÄÀàÐÍ£¬·ÀÖ¹µôÏß + // ³Â¹â»ÔÐÞ¸Ä2006 05 31 pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pResult = pStmt->executeQuery("SELECT PlayerID,Race FROM Slayer WHERE Name = '%s'", pPacket->getPCName().c_str()); @@ -324,7 +324,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) pStmt->executeQuery("UPDATE Player SET LogOn='GAME' WHERE PlayerID = '%s' AND LogOn='LOGOFF'", playerID.c_str()); - // LogOn LOGOFF ƴϰų.. .. by sigi. 2002.5.15 + // LogOnÀÌ LOGOFF°¡ ¾Æ´Ï°Å³ª.. µîµî.. by sigi. 2002.5.15 if (pStmt->getAffectedRowCount() == 0) { SAFE_DELETE(pStmt); char str[80]; @@ -334,7 +334,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) string connectIP = pGamePlayer->getSocket()->getHost(); - // by sigi. 2002.5.31 + // ºô¸µ by sigi. 2002.5.31 #if defined(__CONNECT_BILLING_SYSTEM__) if (payType == PAY_TYPE_FREE) { pGamePlayer->setMetroFreePlayer(); @@ -346,7 +346,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) SAFE_DELETE(pStmt); throw ProtocolException("no pay account"); } -// by sigi. 2002.11.18. . - -; ϴ login +// by sigi. 2002.11.18. Á¦ÇÑÀû ¹«·á »ç¿ëÀÚ. - -; ÀÏ´Ü login #elif defined(__PAY_SYSTEM_FREE_LIMIT__) if (pGamePlayer->loginPayPlay(payType, payPlayDate, payPlayHours, payPlayFlag, connectIP, playerID)) { sendPayInfo(pGamePlayer); @@ -363,7 +363,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) } //---------------------------------------------------------------------- - // ̾ Ǵ ̾ ij͸ εѴ. + // ½½·¹ÀÌ¾î ¶Ç´Â ¹ìÆÄÀ̾î ij¸¯Å͸¦ ·ÎµùÇÑ´Ù. //---------------------------------------------------------------------- Slayer* pSlayer = NULL; Vampire* pVampire = NULL; @@ -380,11 +380,11 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) if (!pSlayer->load()) { filelog("connectDB_BUG.txt", "Failed to load SLAYER(%s) data from DB", pPacket->getPCName().c_str()); - cout << " dz" << endl; + cout << " ¿©±â´Â µÇ³ª¿ä" << endl; throw ProtocolException("Failed to load SLAYER data from DB"); } - // Ǵ ؿ üũ + // À¯·áÁ¸¿¡¼­¸¸ Àû¿ëµÇ´Â ¾ÆÀÌÅÛ ¶§¹®¿¡ ¹Ø¿¡¼­ üũ // pSlayer->loadItem(); // Assert(pSlayer->getName() == pPacket->getPCName()); if (pSlayer->getName() != pPacket->getPCName()) { @@ -395,31 +395,31 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) pGamePlayer->setCreature(pSlayer); - // Slayer TelephoneCenter Ѵ. + // Slayer¸¦ TelephoneCenter¿¡ µî·ÏÇÑ´Ù. // g_pTelephoneCenter->addSlayer(pSlayer); - // ֱ ȸ ̺Ʈ ÷̾ ü ߰Ѵ. - // ̶ ⺻ 10 ȸ Ģ Ѵ. - // (setDeadline Ķʹ 0.1 ʶ ) + // ÁÖ±â ȸº¹ À̺¥Æ®¸¦ Ç÷¹ÀÌ¾î °´Ã¼¿¡ Ãß°¡ÇÑ´Ù. + // À̶§ ±âº»ÀûÀ¸·Î 10ÃÊ È¸º¹À» ¿øÄ¢À¸·Î ÇÑ´Ù. + // (setDeadlineÀÇ ÆÄ¶ó¹ÌÅÍ´Â 0.1 Ãʶó´Â µ¥ À¯ÀÇÇÒ °Í) EventRegeneration* pEventRegeneration = new EventRegeneration(pGamePlayer); pEventRegeneration->setDeadline(10 * 10); pGamePlayer->addEvent(pEventRegeneration); - // PCFinder ߰Ѵ. - // PCFinder ~GamePlayer() Ѵ. + // PCFinder¿¡ Ãß°¡ÇÑ´Ù. + // PCFinderÀÇ »èÁ¦´Â ~GamePlayer()¿¡¼­¸¸ ÇÑ´Ù. try { g_pPCFinder->addCreature(pSlayer); } catch (DuplicatedException& de) { bAlreadyConnected = true; } - // ̹ 찡 ƴ϶.. by sigi. 2002.8.29 + // ÀÌ¹Ì Á¢¼ÓÁßÀÎ °æ¿ì°¡ ¾Æ´Ï¶ó¸é.. by sigi. 2002.8.29 if (!bAlreadyConnected) { - // Ʈ ߰Ѵ. + // ±æµå ÇöÀç Á¢¼Ó ¸â¹ö ¸®½ºÆ®¿¡ Ãß°¡ÇÑ´Ù. if (pSlayer->getGuildID() != 99) { Guild* pGuild = g_pGuildManager->getGuild(pSlayer->getGuildID()); if (pGuild != NULL) { - // sharedserver ˸ DB update Ѵ. + // sharedserver·Î Á¢¼ÓÀ» ¾Ë¸®°í DB µµ update ÇÑ´Ù. try { pGuild->addCurrentMember(pSlayer->getName()); @@ -431,7 +431,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) g_pSharedServerManager->sendPacket(&gsGuildMemberLogOn); - // DB Ʈ + // DB ¾÷µ¥ÀÌÆ® BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery("UPDATE GuildMember SET LogOn = 1 WHERE Name = '%s'", @@ -440,7 +440,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) END_DB(pStmt) } catch (DuplicatedException& t) { - // ϴ Ѵ. by sigi. 2002.8.29 + // ÀÏ´Ü ¹«½ÃÇÑ´Ù. by sigi. 2002.8.29 filelog("guildBug.log", "%s", t.toString().c_str()); } } else @@ -458,34 +458,34 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) throw ProtocolException("Failed to VAMPIRE data from DB"); } - // Ǵ ؿ üũ + // À¯·áÁ¸¿¡¼­¸¸ Àû¿ëµÇ´Â ¾ÆÀÌÅÛ ¶§¹®¿¡ ¹Ø¿¡¼­ üũ // pVampire->loadItem(); Assert(pVampire->getName() == pPacket->getPCName()); pGamePlayer->setCreature(pVampire); - // ֱ ȸ ̺Ʈ ÷̾ ü ߰Ѵ. - // ̶ ⺻ 10 ȸ Ģ Ѵ. - // (setDeadline Ķʹ 0.1 ʶ ) + // ÁÖ±â ȸº¹ À̺¥Æ®¸¦ Ç÷¹ÀÌ¾î °´Ã¼¿¡ Ãß°¡ÇÑ´Ù. + // À̶§ ±âº»ÀûÀ¸·Î 10ÃÊ È¸º¹À» ¿øÄ¢À¸·Î ÇÑ´Ù. + // (setDeadlineÀÇ ÆÄ¶ó¹ÌÅÍ´Â 0.1 Ãʶó´Â µ¥ À¯ÀÇÇÒ °Í) EventRegeneration* pEventRegeneration = new EventRegeneration(pGamePlayer); pEventRegeneration->setDeadline(10 * 10); pGamePlayer->addEvent(pEventRegeneration); - // PCFinder ߰Ѵ. - // PCFinder ~GamePlayer() Ѵ. + // PCFinder¿¡ Ãß°¡ÇÑ´Ù. + // PCFinderÀÇ »èÁ¦´Â ~GamePlayer()¿¡¼­¸¸ ÇÑ´Ù. try { g_pPCFinder->addCreature(pVampire); } catch (DuplicatedException& de) { bAlreadyConnected = true; } - // ̹ 찡 ƴ϶.. by sigi. 2002.8.29 + // ÀÌ¹Ì Á¢¼ÓÁßÀÎ °æ¿ì°¡ ¾Æ´Ï¶ó¸é.. by sigi. 2002.8.29 if (!bAlreadyConnected) { - // Ʈ ߰Ѵ. + // ±æµå ÇöÀç Á¢¼Ó ¸â¹ö ¸®½ºÆ®¿¡ Ãß°¡ÇÑ´Ù. if (pVampire->getGuildID() != 0) { Guild* pGuild = g_pGuildManager->getGuild(pVampire->getGuildID()); if (pGuild != NULL) { - // sharedserver ˸ DB update Ѵ. + // sharedserver ¿¡ Á¢¼ÓÀ» ¾Ë¸®°í DB µµ update ÇÑ´Ù. try { pGuild->addCurrentMember(pVampire->getName()); @@ -497,7 +497,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) g_pSharedServerManager->sendPacket(&gsGuildMemberLogOn); - // DB Ʈ + // DB ¾÷µ¥ÀÌÆ® BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery("UPDATE GuildMember SET LogOn = 1 WHERE Name = '%s'", @@ -505,7 +505,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) } END_DB(pStmt) } catch (DuplicatedException& t) { - // ϴ Ѵ. by sigi. 2002.8.29 + // ÀÏ´Ü ¹«½ÃÇÑ´Ù. by sigi. 2002.8.29 filelog("guildBug.log", "%s", t.toString().c_str()); } } else @@ -523,7 +523,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) throw ProtocolException("Failed to VAMPIRE data from DB"); } - // Ǵ ؿ üũ + // À¯·áÁ¸¿¡¼­¸¸ Àû¿ëµÇ´Â ¾ÆÀÌÅÛ ¶§¹®¿¡ ¹Ø¿¡¼­ üũ // pVampire->loadItem(); Assert(pOusters->getName() == pPacket->getPCName()); // filelog("Ousters.txt","CGConectHandler.cpp 0,HP:%d,MAXHP:%d,MP:%d,MAXMP:%d", (int)pOusters->getHP( @@ -532,28 +532,28 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) pGamePlayer->setCreature(pOusters); - // ֱ ȸ ̺Ʈ ÷̾ ü ߰Ѵ. - // ̶ ⺻ 10 ȸ Ģ Ѵ. - // (setDeadline Ķʹ 0.1 ʶ ) + // ÁÖ±â ȸº¹ À̺¥Æ®¸¦ Ç÷¹ÀÌ¾î °´Ã¼¿¡ Ãß°¡ÇÑ´Ù. + // À̶§ ±âº»ÀûÀ¸·Î 10ÃÊ È¸º¹À» ¿øÄ¢À¸·Î ÇÑ´Ù. + // (setDeadlineÀÇ ÆÄ¶ó¹ÌÅÍ´Â 0.1 Ãʶó´Â µ¥ À¯ÀÇÇÒ °Í) EventRegeneration* pEventRegeneration = new EventRegeneration(pGamePlayer); pEventRegeneration->setDeadline(10 * 10); pGamePlayer->addEvent(pEventRegeneration); - // PCFinder ߰Ѵ. - // PCFinder ~GamePlayer() Ѵ. + // PCFinder¿¡ Ãß°¡ÇÑ´Ù. + // PCFinderÀÇ »èÁ¦´Â ~GamePlayer()¿¡¼­¸¸ ÇÑ´Ù. try { g_pPCFinder->addCreature(pOusters); } catch (DuplicatedException& de) { bAlreadyConnected = true; } - // ̹ 찡 ƴ϶.. by sigi. 2002.8.29 + // ÀÌ¹Ì Á¢¼ÓÁßÀÎ °æ¿ì°¡ ¾Æ´Ï¶ó¸é.. by sigi. 2002.8.29 if (!bAlreadyConnected) { - // Ʈ ߰Ѵ. + // ±æµå ÇöÀç Á¢¼Ó ¸â¹ö ¸®½ºÆ®¿¡ Ãß°¡ÇÑ´Ù. if (pOusters->getGuildID() != 66) { Guild* pGuild = g_pGuildManager->getGuild(pOusters->getGuildID()); if (pGuild != NULL) { - // sharedserver ˸ DB update Ѵ. + // sharedserver ¿¡ Á¢¼ÓÀ» ¾Ë¸®°í DB µµ update ÇÑ´Ù. try { pGuild->addCurrentMember(pOusters->getName()); @@ -565,7 +565,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) g_pSharedServerManager->sendPacket(&gsGuildMemberLogOn); - // DB Ʈ + // DB ¾÷µ¥ÀÌÆ® BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery("UPDATE GuildMember SET LogOn = 1 WHERE Name = '%s'", @@ -573,7 +573,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) } END_DB(pStmt) } catch (DuplicatedException& t) { - // ϴ Ѵ. by sigi. 2002.8.29 + // ÀÏ´Ü ¹«½ÃÇÑ´Ù. by sigi. 2002.8.29 filelog("guildBug.log", "%s", t.toString().c_str()); } } else @@ -584,21 +584,21 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) } //} - cout << " dz2" << endl; + cout << " ¿©±â´Â µÇ³ª¿ä2" << endl; - // ?? ó. - // PCFinder DuplicatedException Ȯϰ óϱ ؼ - // ּ üũѴ. - // Ƹ DuplicatedException - // PCFinder . + // ÀÌ??Á¢¼Ó ÁßÀÎ °æ¿ìÀÇ Ã³¸®. + // PCFinder¿¡¼­ÀÇ DuplicatedExceptionÀ» ¸íÈ®ÇÏ°Ô Ã³¸®Çϱâ À§Çؼ­ + // º¯¼ö¸¦ µÖ¼­ üũÇÑ´Ù. + // ¾Æ¸¶ ±æµåÀÇ DuplicatedException¶§¹®¿¡ + // PCFinder¿¡¼­ ¹®Á¦°¡ »ý±ä°Í °°´Ù. // by sigi. 2002.8.29 if (bAlreadyConnected) { SAFE_DELETE(pSlayer); SAFE_DELETE(pVampire); SAFE_DELETE(pOusters); - pGamePlayer->setID(string("")); // LogOn 'LOGOFF' Ǵ° ´. - pGamePlayer->setCreature(NULL); // PCFinder deleteϴ° ´. + pGamePlayer->setID(string("")); // LogOnÀº 'LOGOFF'°¡ µÇ´Â°É ¸·´Â´Ù. + pGamePlayer->setCreature(NULL); // PCFinder¿¡¼­ deleteÇÏ´Â°É ¸·´Â´Ù. char str[80]; sprintf(str, "Already connected player ID3(Dup): %s", pPacket->getPCName().c_str()); @@ -606,7 +606,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) } //---------------------------------------------------------------------- - // PC PCFinder Ѵ. + // PC¸¦ PCFinder¿Í Á¸¿¡ µî·ÏÇÑ´Ù. //---------------------------------------------------------------------- Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); @@ -614,7 +614,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) EventHeadCount* pEventHeadCount = new EventHeadCount(pGamePlayer); pEventHeadCount->setDeadline(18000); pGamePlayer->addEvent(pEventHeadCount); - cout << " dz3" << endl; + cout << " ¿©±â´Â µÇ³ª¿ä3" << endl; if (pCreature->isGOD()) { EffectGhost* pEffect = new EffectGhost(pCreature); pCreature->getEffectManager()->addEffect(pEffect); @@ -624,7 +624,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) #ifdef __TEST_SERVER__ EventAuth* pAuth = new EventAuth(pGamePlayer); pGamePlayer->addEvent(pAuth); - cout << "Ʈ Ÿ̸ Դϴ : " << pGamePlayer->getID() << endl; + cout << "¿£ÇÁ·ÎÅØÆ® ÀÎÁõ ŸÀÌ¸Ó ºÙÀÔ´Ï´Ù : " << pGamePlayer->getID() << endl; #endif } @@ -635,8 +635,8 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) pCreature->addEffect(pEffect); pCreature->setFlag(pEffect->getEffectClass()); } - cout << " dz4" << endl; - // ̳ α . + cout << " ¿©±â´Â µÇ³ª¿ä4" << endl; + // ¼ºÀ̳ª ¼º ´øÀü ¾ÈÀ¸·Î ·Î±×ÀÎÇÒ ¼ö ¾ø´Ù. ZoneID_t castleZoneID; ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(pCreature->getZoneID()); @@ -662,7 +662,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) } } } - cout << " dz5" << endl; + cout << " ¿©±â´Â µÇ³ª¿ä5" << endl; Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); @@ -675,20 +675,20 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) PlayerCreature* pPC = dynamic_cast(pCreature); Assert(pPC != NULL); - // ̳ ̾ ƴ 30 ڿԴ ʴ´. + // À¯·á Á¸À̳ª ÇÁ¸®¹Ì¾ö Á¸ÀÌ ¾Æ´Ò °æ¿ì 30 ·¹º§ ÀÌÇÏÀÇ Á¾·®Á¦ »ç¿ëÀÚ¿¡°Ô´Â °ú±ÝÇÏÁö ¾Ê´Â´Ù. if ((pGamePlayer->isPayPlaying() || pGamePlayer->isPremiumPlay()) && pGamePlayer->getPayType() == PAY_TYPE_TIME && pPC->canPlayFree() && !(pZoneInfo->isPayPlay() || pZone->isPremiumZone())) { pGamePlayer->logoutPayPlay(pGamePlayer->getID(), false, false); } - // ȭ ̰ ƴϸ.. - // . 2003.03.16 Ϲ ʵ嵵 ̴̾. ڵ ʵδ α Ǿ Ѵ. + // À¯·áÈ­ Á¸À̰í À¯·á»ç¿ëÁßÀÌ ¾Æ´Ï¸é.. + // ¤Ì.¤Ð 2003.03.16 ÀÏ¹Ý Çʵ嵵 ÇÁ¸®¹Ì¾öÁ¸ÀÌ´Ù. ¹«·á»ç¿ëÀÚµµ Çʵå·Î´Â ·Î±×ÀÎ µÇ¾î¾ß ÇÑ´Ù. if ((pZoneInfo->isPayPlay()) //|| pZoneInfo->isPremiumZone()) && !pGamePlayer->isPayPlaying()) { - // Ұ - // ̾ Ȱϴ . - // ̾ Ȱϴ . + // À¯·á ¼­ºñ½º »ç¿ë ºÒ°¡ÀÎ °æ¿ì + // ½½·¹À̾î´Â ¿¡½½³²µ¿¿¡¼­ ºÎȰÇÏ´Â °÷À¸·Î °£´Ù. + // ¹ìÆÄÀ̾î´Â ¸²º¸³²µ¿¿¡¼­ ºÎȰÇÏ´Â °÷À¸·Î °£´Ù. ZONE_COORD zoneCoord; if (g_pResurrectLocationManager->getRaceDefaultPosition(pPC->getRace(), zoneCoord)) { @@ -697,7 +697,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) } } } catch (NoSuchElementException&) { - throw Error("ZoneInfo zoneID ."); + throw Error("ZoneInfo¿¡ zoneID°¡ ¾ø´Ù."); } #elif defined(__CONNECT_BILLING_SYSTEM__) if (pGamePlayer->isMetroFreePlayer()) { @@ -712,21 +712,21 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) PlayerCreature* pPC = dynamic_cast(pCreature); Assert(pPC != NULL); - // Ȯ ʾҴ. - // ȭ ̶ ϴ ڶ Ѵ. - // premium ƾ ϶ ZonePlayerManager Űش. + // ¾ÆÁ÷ ºô¸µ ¼­¹ö¿¡¼­ À¯·á »ç¿ëÀÚÀÎÁö ÀÎÁõ È®ÀÎÀ» ¹ÞÁö ¾Ê¾Ò´Ù. + // À¯·áÈ­ Á¸À̶ó¸é ÀÏ´Ü À¯·á »ç¿ëÀÚ¶ó·Î »ý°¢ÇÑ´Ù. + // premium À» ÄÑ ³õ¾Æ¾ßÁö ¹«·á »ç¿ëÀ϶§ ZonePlayerManager ¿¡¼­ ¹«·áÁ¸À¸·Î ¿Å°ÜÁØ´Ù. if (pZoneInfo->isPayPlay()) { pGamePlayer->setPremiumPlay(); } } catch (NoSuchElementException&) { - throw Error("ZoneInfo zoneID ."); + throw Error("ZoneInfo¿¡ zoneID°¡ ¾ø´Ù."); } - // session صд. by sigi. 2002.11.18 + // session °ªÀ» Á¤ÇصдÙ. by sigi. 2002.11.18 pGamePlayer->setBillingSession(); - // ˸. + // ºô¸µ¼­¹ö¿¡ °ÔÀÓ ½ÃÀÛÀ» ¾Ë¸°´Ù. pGamePlayer->sendBillingLogin(); } @@ -734,15 +734,15 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) try { ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(pZone->getZoneID()); - // ȭ ̰ ƴϸ.. + // À¯·áÈ­ Á¸À̰í À¯·á»ç¿ëÁßÀÌ ¾Æ´Ï¸é.. if (pZoneInfo != NULL && (pZoneInfo->isPayPlay() || pZoneInfo->isPremiumZone()) && !pGamePlayer->isPayPlaying()) { bool bEnterZone = true; string connectIP = pGamePlayer->getSocket()->getHost(); - // Ѱ? - // ȵǰ ̶  . + // À¯·á ¼­ºñ½º »ç¿ëÀÌ °¡´ÉÇѰ¡? + // À¯·á ¼­ºñ½º »ç¿ëÀÌ ¾ÈµÇ°í À¯·á Á¸À̶ó¸é µé¾î°¥ ¼ö ¾ø´Ù. if (!pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID()) && pZoneInfo->isPayPlay()) { bEnterZone = false; } @@ -758,9 +758,9 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) Assert(pPC != NULL); if (!bEnterZone) { - // Ұ - // ̾ Ȱϴ . - // ̾ Ȱϴ . + // À¯·á ¼­ºñ½º »ç¿ë ºÒ°¡ÀÎ °æ¿ì + // ½½·¹À̾î´Â ¿¡½½³²µ¿¿¡¼­ ºÎȰÇÏ´Â °÷À¸·Î °£´Ù. + // ¹ìÆÄÀ̾î´Â ¸²º¸³²µ¿¿¡¼­ ºÎȰÇÏ´Â °÷À¸·Î °£´Ù. ZONE_COORD zoneCoord; // bool bFindPos = false; @@ -771,39 +771,39 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) } } } catch (NoSuchElementException&) { - throw Error("ZoneInfo zoneID ."); + throw Error("ZoneInfo¿¡ zoneID°¡ ¾ø´Ù."); } #elif defined(__CONNECT_CBILLING_SYSTEM__) - // ֱ minus point/minute Ŷ ̺Ʈ δ. + // ºô¸µ ¼­¹ö·Î ÁÖ±âÀûÀ¸·Î minus point/minute ÆÐŶÀ» º¸³»´Â À̺¥Æ®¸¦ ºÙÀδÙ. EventCBilling* pEvent = new EventCBilling(pGamePlayer); pEvent->setDeadline(g_pCBillingPlayerManager->getMinusIntervalInt() * 600); pGamePlayer->addEvent(pEvent); - // ߱ ȭ ̹Ƿ Դٸ ̴. α . + // Áß±¹ ºô¸µÀº Àü¸é À¯·áÈ­ À̹ǷΠ¿©±â±îÁö ¿Ô´Ù¸é À¯·á »ç¿ëÀÚÀÌ´Ù. ¹«·á »ç¿ëÀÚÀÏ °æ¿ì ·Î±×ÀÎ ¼­¹ö¿¡¼­ ¸·Èù´Ù. pGamePlayer->setPayPlayer(true); pGamePlayer->setPremiumPlay(); // send Login pGamePlayer->setCBillingVerified(g_pCBillingPlayerManager->sendLogin(pGamePlayer)); #else - // ƹ͵ Ǿ - // ڶ ع + // ¾Æ¹«°Íµµ ¼³Á¤µÇ¾î ÀÖÁö ¾ÊÀ¸¸é + // °Á À¯·á »ç¿ëÀÚ¶ó°í ÇØ¹ö¸®ÀÚ pGamePlayer->setPremiumPlay(); #endif // test code /* - // α ϰ.. ٷ ޼ ѷִ κ. by sigi. 2002.12.11 + // ·Î±×ÀÎ Çϰí.. ¹Ù·Î ¹º°¡ ¸Þ¼¼Áö¸¦ »Ñ·ÁÁÖ´Â ºÎºÐ. by sigi. 2002.12.11 EventSystemMessage* pESM = new EventSystemMessage( pGamePlayer ); pESM->setDeadline( 0 ); - pESM->addMessage("̰ ׽Ʈ ý ޽"); - pESM->addMessage(" µDZ ٶ.. -_-;;"); + pESM->addMessage("À̰ÍÀº Å×½ºÆ® ½Ã½ºÅÛ ¸Þ½ÃÁö"); + pESM->addMessage("Á¦´ë·Î Ãâ·ÂµÇ±æ ¹Ù¶ö»Ó.. -_-;;"); pGamePlayer->addEvent( pESM ); */ - // Ǵ ⼭ üũ + // À¯·áÁ¸¿¡¼­¸¸ Àû¿ëµÇ´Â ¾ÆÀÌÅÛ ¶§¹®¿¡ ¿©±â¼­ üũ // 2002.8.26. by sigi - cout << " ε κ κ ȵǸ ̺κ ." << endl; + cout << " ¾ÆÀÌÅÛ ·Îµå ºÎºÐ ÀÌ ºÎºÐÀÌ ¾ÈµÇ¸é À̺κÐÀÌ ¿À·ù´Ù." << endl; if (pPacket->getPCType() == PC_SLAYER) { Assert(pSlayer != NULL); pSlayer->loadItem(true); @@ -816,8 +816,8 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) } - // ̾ , ̾ ο - // ϴ , HP äش. + // ½½·¹À̾î¶ó¸é ±æµå ³»ºÎ, ¹ìÆÄÀ̾î¶ó¸é ·¹¾î ³»ºÎ¿¡¼­ + // ½ÃÀÛÇÏ´Â °æ¿ì, HP¸¦ ¸¸¶¥À¸·Î ä¿öÁØ´Ù. if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -873,23 +873,23 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) } } - // Ʈ Ŵ εѴ. + // Äù½ºÆ® ¸Å´ÏÀú¸¦ ·ÎµåÇÑ´Ù. PlayerCreature* pPC = dynamic_cast(pCreature); pPC->getQuestManager()->load(); - // ũó ڽŰ ۵ OID Ҵ޴´. - // ̹ Creature::load() Zone Ǿ ־ Ѵ. + // Å©¸®Ã³ ÀڽŰú ¼ÒÀ¯ ¾ÆÀÌÅÛµéÀÇ OID¸¦ ÇÒ´ç¹Þ´Â´Ù. + // ÀÌ¹Ì Creature::load()¿¡¼­ Zone ÀÌ ÁöÁ¤µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. pCreature->registerObject(); - // ֱ ̺Ʈ ÷̾ ü ߰Ѵ. - // ̶ ⺻ 10 Ģ Ѵ. - // (setDeadline Ķʹ 0.1 ʶ ) + // ÁÖ±â ÀúÀå À̺¥Æ®¸¦ Ç÷¹ÀÌ¾î °´Ã¼¿¡ Ãß°¡ÇÑ´Ù. + // À̶§ ±âº»ÀûÀ¸·Î 10ºÐ ÀúÀåÀ» ¿øÄ¢À¸·Î ÇÑ´Ù. + // (setDeadlineÀÇ ÆÄ¶ó¹ÌÅÍ´Â 0.1 Ãʶó´Â µ¥ À¯ÀÇÇÒ °Í) // EventSave* pEventSave = new EventSave(pGamePlayer); // pEventSave->setDeadline(600* 10); // pGamePlayer->addEvent(pEventSave); #ifdef __USE_ENCRYPTER__ - // ȣȭ ڵ . objectID ϱ .. by sigi. 2002.11.27 + // ¾Ïȣȭ ÄÚµå µî·Ï. Áö±ÝÀº objectID·Î Çϱ⠶§¹®¿¡.. by sigi. 2002.11.27 pGamePlayer->setEncryptCode(); #endif @@ -897,10 +897,10 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) SEND_SYSTEM_AVAILABILITIES(pGamePlayer); //---------------------------------------------------------------------- - // GCUpdateInfo PC , SkillInfo Ѵ. + // GCUpdateInfo ¿ë PC Á¤º¸, SkillInfo ¸¦ ±¸¼ºÇÑ´Ù. //---------------------------------------------------------------------- - cout << " dz7" << endl; + cout << " ¿©±â´Â µÇ³ª¿ä7" << endl; GCUpdateInfo gcUpdateInfo; @@ -914,7 +914,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) IP_t IP = pGamePlayer->getSocket()->getHostIP(); - // IP DB INSERT Ѵ. + // ¸¶Áö¸·À¸·Î IPÀÇ Á¤º¸¸¦ DB¿¡ INSERT ÇÑ´Ù. //-------------------------------------------------- // change player status @@ -932,7 +932,7 @@ void CGConnectHandler::execute(CGConnect* pPacket, Player* pPlayer) ////////////////////////////////////////////////////////////////////////////// // -// YYYY-MM-DD Ǻ +// YYYY-MM-DD ·Î ¼ºÀÎ ÆÇº° // ////////////////////////////////////////////////////////////////////////////// bool isAdultByBirthdayDate(const string& birthday) { @@ -958,21 +958,21 @@ bool isAdultByBirthdayDate(const string& birthday) { int day = atoi(birthday.substr(8, 2).c_str()); if (Timec.tm_year - 18 + 1900 > year) { - cout << "" << endl; + cout << "¾î¸¥" << endl; return true; } else if (Timec.tm_year - 18 + 1900 == year) { if (Timec.tm_mon + 1 > month) { - cout << "" << endl; + cout << "¾î¸¥" << endl; return true; } else if (Timec.tm_mon + 1 == month) { if (Timec.tm_mday >= day) { - cout << "" << endl; + cout << "¾î¸¥" << endl; return true; } } } - cout << "ֵ" << endl; + cout << "¾Öµé" << endl; return false; } diff --git a/src/Core/CGConnectSetKey.h b/src/Core/CGConnectSetKey.h index b1168269..4108cb87 100644 --- a/src/Core/CGConnectSetKey.h +++ b/src/Core/CGConnectSetKey.h @@ -17,18 +17,18 @@ // // class CGConnectSetKey; // -// Ŭ̾Ʈ α ʿ ϴ Ŷ̴. -// ̵ н尡 ȣȭǾ ִ. +// 클라이언트가 로그인 서버에게 최초에 전송하는 패킷이다. +// 아이디와 패스워드가 암호화되어 있다. // //-------------------------------------------------------------------------------- class CGConnectSetKey : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGCrashReport.h b/src/Core/CGCrashReport.h index c2140771..75625154 100644 --- a/src/Core/CGCrashReport.h +++ b/src/Core/CGCrashReport.h @@ -121,7 +121,7 @@ class CGCrashReportFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGCrashReportPacketSize ؼ ϶. + // const static CGCrashReportPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return 19 + szWORD + 10 + szWORD + 100 + szWORD + 1024 + szWORD + 1024; } diff --git a/src/Core/CGCrashReportHandler.cpp b/src/Core/CGCrashReportHandler.cpp index 4e2b16c0..49326e09 100644 --- a/src/Core/CGCrashReportHandler.cpp +++ b/src/Core/CGCrashReportHandler.cpp @@ -44,7 +44,7 @@ void CGCrashReportHandler::execute(CGCrashReport* pPacket, Player* pPlayer) SAFE_DELETE(pStmt); } END_DB(pStmt) - // ̻Ѱ + // 누가 이상한거 날리면 무시하자 } catch (...) { filelog("CrashReport.log", "%s", pPacket->toString().c_str()); } diff --git a/src/Core/CGDenyUnion.h b/src/Core/CGDenyUnion.h index 7b96f0a9..7e0009de 100644 --- a/src/Core/CGDenyUnion.h +++ b/src/Core/CGDenyUnion.h @@ -25,10 +25,10 @@ class CGDenyUnion : public Packet { public: CGDenyUnion() {}; ~CGDenyUnion() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGDenyUnionHandler.cpp b/src/Core/CGDenyUnionHandler.cpp index 6d05a7d8..4ac24e21 100644 --- a/src/Core/CGDenyUnionHandler.cpp +++ b/src/Core/CGDenyUnionHandler.cpp @@ -45,7 +45,7 @@ void CGDenyUnionHandler::execute(CGDenyUnion* pPacket, Player* pPlayer) #ifdef __OLD_GUILD_WAR__ GCSystemMessage gcSM; - gcSM.setMessage(" ʴ Դϴ."); + gcSM.setMessage("아직 지원되지 않는 기능입니다."); pGamePlayer->sendPacket(&gcSM); return; #endif @@ -62,11 +62,11 @@ void CGDenyUnionHandler::execute(CGDenyUnion* 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); @@ -89,7 +89,7 @@ void CGDenyUnionHandler::execute(CGDenyUnion* pPacket, Player* pPlayer) string TargetGuildMaster = pGuild->getMaster(); - // cout << " źεǾ. 뺸 : " << TargetGuildMaster.c_str() << endl; + // cout << "가입이 거부되었다. 통보받을 유저는 : " << TargetGuildMaster.c_str() << endl; Statement* pStmt = NULL; @@ -99,13 +99,13 @@ void CGDenyUnionHandler::execute(CGDenyUnion* pPacket, Player* pPlayer) pStmt->executeQuery("INSERT INTO `Messages` (`Receiver`, `Message`) values ('%s','%s')", TargetGuildMaster.c_str(), g_pStringPool->c_str(374)); - // źѵڿ ȥ ִٸ? + // 거부한뒤에 나 혼자 남아있다면? Result* pResult = pStmt->executeQuery("SELECT count(*) FROM `GuildUnionMember` WHERE `UnionID`='%u'", pUnion->getUnionID()); pResult->next(); if (pResult->getInt(1) == 0) { - // cout << " źߴµ.. ̸ ȵǴϱ.." << endl; + // cout << "가입을 거부했는데..내가 계속 연합장이면 안되니까..지워버린다" << endl; pStmt->executeQuery("DELETE FROM `GuildUnionInfo` WHERE `UnionID`='%u'", pUnion->getUnionID()); GuildUnionManager::Instance().reload(); @@ -126,7 +126,7 @@ void CGDenyUnionHandler::execute(CGDenyUnion* pPacket, Player* pPlayer) pPlayer->sendPacket(&gcModifyInformation); - // 뺸 Union ٽ + // 통보받을 유저에게 길드Union정보를 다시 보낸다 Creature* pTargetCreature = NULL; __ENTER_CRITICAL_SECTION((*g_pPCFinder)) @@ -145,7 +145,7 @@ void CGDenyUnionHandler::execute(CGDenyUnion* pPacket, Player* pPlayer) sendGCOtherModifyInfoGuildUnion(pTargetCreature); sendGCOtherModifyInfoGuildUnion(pCreature); - // ٸ ִ 鿡 ˸. + // 다른 서버에 있는 놈들에게 변경사항을 알린다. GuildUnionManager::Instance().sendModifyUnionInfo(dynamic_cast(pTargetCreature)->getGuildID()); GuildUnionManager::Instance().sendModifyUnionInfo(dynamic_cast(pCreature)->getGuildID()); } diff --git a/src/Core/CGDepositPet.h b/src/Core/CGDepositPet.h index 4c5e8691..0f99f223 100644 --- a/src/Core/CGDepositPet.h +++ b/src/Core/CGDepositPet.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////////////////////////// // // Filename : CGDepositPet.h -// Written By : 輺 +// Written By : 김성민 // Description : // //////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGDialUp.h b/src/Core/CGDialUp.h index 12ac4421..684a075d 100644 --- a/src/Core/CGDialUp.h +++ b/src/Core/CGDialUp.h @@ -29,10 +29,10 @@ class CGDialUp : public Packet { ~CGDialUp(); public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -45,7 +45,7 @@ class CGDialUp : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CGDialUpPacketSize ؼ ϶. + // const static CGDialUpPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szPhoneNumber; } @@ -100,7 +100,7 @@ class CGDialUpFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGDialUpPacketSize ؼ ϶. + // const static CGDialUpPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szPhoneNumber; } diff --git a/src/Core/CGDialUpHandler.cpp b/src/Core/CGDialUpHandler.cpp index 51b799d2..4f7ac6b4 100644 --- a/src/Core/CGDialUpHandler.cpp +++ b/src/Core/CGDialUpHandler.cpp @@ -42,7 +42,7 @@ void CGDialUpHandler::execute(CGDialUp* pPacket, Player* pPlayer) SlotID_t PSlot = MAX_PHONE_SLOT; SlotID_t PSlot2 = MAX_PHONE_SLOT; - // ȣ ޾ƿ´. + // 폰 번호를 받아온다. PhoneNumber_t PNumber = pPacket->getPhoneNumber(); Slayer* pTargetSlayer = g_pTelephoneCenter->getSlayer(PNumber); @@ -60,28 +60,28 @@ void CGDialUpHandler::execute(CGDialUp* pPacket, Player* pPlayer) } if (Success) { - // ޾ƿ´. + // 상대방의 빈 슬랏을 받아온다. PSlot2 = pTargetSlayer->findEmptyPhoneSlot(); - // ڽ ã´. + // 자신의 빈 슬랏을 찾는다. PSlot = pSlayer->findEmptyPhoneSlot(); - // ڽ ȣ + // 상대방의 슬랏에 자신의 번호를 셋팅 pTargetSlayer->setPhoneSlotNumber(PSlot2, pSlayer->getPhoneNumber()); - // ڽ ȣ + // 자신의 슬랏에 상대방의 번호 셋팅 pSlayer->setPhoneSlotNumber(PSlot, PNumber); // cout << "Call Number : " << pSlayer->getPhoneNumber() << ", Called Number : " << PNumber << endl; // cout << "Call Slot : " << PSlot << ", Called Slot : " << PSlot2 << endl; - // ȭ 뿡 Ŷ + // 전화 받을 상대에게 날리는 패킷 GCRing gcRing; gcRing.setPhoneNumber(pSlayer->getPhoneNumber()); gcRing.setSlotID(PSlot2); gcRing.setName(pSlayer->getName()); - // ȭ ڿ Ŷ + // 전화 건 당사자에게 날리는 패킷 GCPhoneConnected gcPhoneConnected; gcPhoneConnected.setSlotID(PSlot); gcPhoneConnected.setName(pTargetSlayer->getName()); diff --git a/src/Core/CGDisplayItem.h b/src/Core/CGDisplayItem.h index d57147ee..1bdcb2e6 100644 --- a/src/Core/CGDisplayItem.h +++ b/src/Core/CGDisplayItem.h @@ -25,10 +25,10 @@ class CGDisplayItem : public Packet { public: CGDisplayItem() {}; ~CGDisplayItem() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGDisplayItemHandler.cpp b/src/Core/CGDisplayItemHandler.cpp index 862ff8fe..b5053bec 100644 --- a/src/Core/CGDisplayItemHandler.cpp +++ b/src/Core/CGDisplayItemHandler.cpp @@ -50,44 +50,44 @@ void CGDisplayItemHandler::execute(CGDisplayItem* pPacket, Player* pPlayer) { GCNoticeEvent errorNotice; if (pPacket->getIndex() > MAX_ITEM_NUM) { - filelog("Store.log", "[%s:%s] (%u) ߸ εԴϴ.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), + filelog("Store.log", "[%s:%s] (%u) 잘못된 인덱스입니다.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), pPacket->getIndex()); return; } if (pPacket->getX() >= pInventory->getWidth() || pPacket->getY() >= pInventory->getHeight()) { - filelog("Store.log", "[%s:%s] (%u,%u) κ丮 ǥ ߸ ϴ..", pGamePlayer->getID().c_str(), + filelog("Store.log", "[%s:%s] (%u,%u) 인벤토리 좌표를 잘못 보내줬습니다..", pGamePlayer->getID().c_str(), pPC->getName().c_str(), pPacket->getX(), pPacket->getY()); return; } Item* pItem = pInventory->getItem(pPacket->getX(), pPacket->getY()); if (pItem == NULL || pItem->getObjectID() != pPacket->getItemObjectID()) { - filelog("Store.log", "[%s:%s] (%u, %u) : %u ǥ ߸Ǿų Ʈ ̵ ߸Ǿϴ.", + filelog("Store.log", "[%s:%s] (%u, %u) : %u 아이템 좌표가 잘못되었거나 오브젝트 아이디가 잘못되었습니다.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), pPacket->getX(), pPacket->getY(), pPacket->getItemObjectID()); return; } if (pPC->getZone()->getTradeManager()->getTradeInfo(pPC->getName()) != NULL) { - filelog("Store.log", "[%s:%s] : ŷ߿ ÷ ϴ.", pGamePlayer->getID().c_str(), + filelog("Store.log", "[%s:%s] : 거래중에는 물건을 올려놓을 수 없습니다.", pGamePlayer->getID().c_str(), pPC->getName().c_str()); return; } if (pStore->hasItem(pItem)) { - filelog("Store.log", "[%s:%s] (%u, %u) ̹ ֽϴ.", pGamePlayer->getID().c_str(), + filelog("Store.log", "[%s:%s] (%u, %u) 이미 아이템이 상점에 있습니다.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), pItem->getObjectID(), pPacket->getIndex()); - // errorMsg.setMessage("̹ Դϴ."); + // errorMsg.setMessage("이미 진열된 아이템입니다."); errorNotice.setCode(NOTICE_EVENT_ALREADY_DISPLAYED); pGamePlayer->sendPacket(&errorNotice); return; } if (pItem->isTimeLimitItem() || !canSell(pItem) || !canTrade(pItem)) { - filelog("Store.log", "[%s:%s] (%s) Դϴ.", pGamePlayer->getID().c_str(), + filelog("Store.log", "[%s:%s] (%s) 팔 수 없는 아이템입니다.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), pItem->toString().c_str()); - // errorMsg.setMessage("Ǹ Դϴ."); + // errorMsg.setMessage("판매할 수 없는 아이템입니다."); errorNotice.setCode(NOTICE_EVENT_CANNOT_SELL); pGamePlayer->sendPacket(&errorNotice); return; @@ -95,7 +95,7 @@ void CGDisplayItemHandler::execute(CGDisplayItem* pPacket, Player* pPlayer) { BYTE result = pStore->setStoreItem(pPacket->getIndex(), pItem, pPacket->getPrice()); if (result != 0) { - filelog("Store.log", "[%s:%s] (%u) ϴ.", pGamePlayer->getID().c_str(), + filelog("Store.log", "[%s:%s] (%u) 아이템을 놓을 수 없습니다.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), result); return; } diff --git a/src/Core/CGDissectionCorpse.h b/src/Core/CGDissectionCorpse.h index f77b1deb..e09e8017 100644 --- a/src/Core/CGDissectionCorpse.h +++ b/src/Core/CGDissectionCorpse.h @@ -31,10 +31,10 @@ class CGDissectionCorpse : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGDissectionCorpseHandler.cpp b/src/Core/CGDissectionCorpseHandler.cpp index 99e1625c..cb6f84ef 100644 --- a/src/Core/CGDissectionCorpseHandler.cpp +++ b/src/Core/CGDissectionCorpseHandler.cpp @@ -83,7 +83,7 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl ZoneCoord_t ZoneX = pPacket->getX(); ZoneCoord_t ZoneY = pPacket->getY(); - // ٿ带 Ѿ ʴ üũѴ. + // 바운드를 넘어가지는 않는지 체크한다. if (!isValidZoneCoord(pZone, ZoneX, ZoneY)) { return; } @@ -91,13 +91,13 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl Tile& rTile = pZone->getTile(ZoneX, ZoneY); Item* pItem = rTile.getItem(); - // Coma¶ Ұ. by sigi. 2002.12.10 - // ¶ + // Coma상태라면 루팅 불가. by sigi. 2002.12.10 + // 현재 박쥐 상태라면 리턴 if (pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || pCreature->isFlag(Effect::EFFECT_CLASS_PARALYZE) || (pCreature->isVampire() && pCreature->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT))) return; - // ̾ Ÿ Ұ by sigi + // 슬레이어인 경우 오토바이 타고 있으면 아이템 루팅 불가 by sigi if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); if (pSlayer->hasRideMotorcycle()) { @@ -105,7 +105,7 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl } } - // ƿ콺 Ÿ Ұ by DEW + // 아우스터즈인 경우 실프 타고 있으면 루팅 불가 by DEW if (pCreature->isOusters()) { Ousters* pOusters = dynamic_cast(pCreature); if (pOusters->isFlag(Effect::EFFECT_CLASS_SUMMON_SYLPH)) { @@ -113,9 +113,9 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl } } - // ٴڿ - // Ʈ ̵ ġ - // ٴڿ ִ ü ƴϸ + // 바닥에 아이템이 없으면 리턴 + // 오브젝트 아이디가 일치하지 않으면 리턴 + // 바닥에 있는 아이템이 시체가 아니면 리턴 if (pItem == NULL || pItem->getObjectID() != pPacket->getObjectID() || pItem->getItemClass() != Item::ITEM_CLASS_CORPSE) { return; @@ -124,18 +124,18 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl bool bSlayerRelicTable = pItem->isFlag(Effect::EFFECT_CLASS_SLAYER_RELIC_TABLE); bool bVampireRelicTable = pItem->isFlag(Effect::EFFECT_CLASS_VAMPIRE_RELIC_TABLE); - // ̾ ̾ Ŭ , - // ̾ ̾ Ŭ . + // 슬레이어가 슬레이어의 성물보관함을 클릭할 수 없고, + // 뱀파이어도 뱀파이어의 성물보관함을 클릭할 수 없다. if ((pCreature->isSlayer() && bSlayerRelicTable) || (pCreature->isVampire() && bVampireRelicTable)) { return; } - // ƴ϶ Ŭ . - // ȣ Ŭ . + // 성단일 경우 전쟁중이 아니라면 클릭할 수 없다. + // 수호 성단일 경우 수비측에서는 클릭할 수 없다. if (pItem->getItemType() == MONSTER_CORPSE) { MonsterCorpse* pMonsterCorpse = dynamic_cast(pItem); if (pMonsterCorpse->getTreasureCount() > 200) { - // Ʈ ü. ¥ 200 õǴ ʹ --; + // 퀘스트용 시체. 설마 진짜로 200개 루팅되는 몬스터는 없겠지 --; PlayerCreature* pPC = dynamic_cast(pCreature); pPC->getGQuestManager()->touchWayPoint(pMonsterCorpse); return; @@ -153,7 +153,7 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl return; } } else if (pMonsterCorpse->isShrine()) { - // ȣ ɷ . + // 보호막이 걸려있으면 못 꺼낸다. if (pMonsterCorpse->isFlag(Effect::EFFECT_CLASS_SHRINE_SHIELD)) return; @@ -168,10 +168,10 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl isCastle = g_pCastleInfoManager->getCastleZoneID(pZone->getZoneID(), castleZoneID); if (isCastle && g_pWarSystem->hasCastleActiveWar(castleZoneID)) { - // ó + // 길드전쟁일 경우 처리 // if (pItem->getItemClass() != Item::ITEM_CLASS_CASTLE_SYMBOL ) return; - // Ŭ . + // 성에서는 방어측일 경우 클릭할 수 없다. #ifndef __OLD_GUILD_WAR__ #else if (g_pCastleShrineInfoManager->isDefenderOfGuardShrine(pPC, pMonsterCorpse)) @@ -186,28 +186,28 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl } if (g_pWarSystem->hasActiveRaceWar()) { - // ó + // 종족간 전쟁일 경우 처리 // if (pItem->getItemClass() != Item::ITEM_CLASS_BLOOD_BIBLE ) return; - // Ŭ . + // 성에서는 방어측일 경우 클릭할 수 없다. if (g_pShrineInfoManager->isDefenderOfGuardShrine(pPC, pMonsterCorpse)) return; hasWar = true; } - // ϰ͵ ܿ ϰ͵ . + // 전쟁이 암것도 없으면 성단에서 암것도 못 꺼낸다. if (!hasWar) { return; } } } - // ̱ Դٸ, Ŭ ̴. - // , EffectRelic ŭ ִ üũؾ Ѵ. + // 이까지 왔다면, 상대편 종족의 성물보관함을 클릭한 경우이다. + // 이 경우, 만약 EffectRelic이 얼만큼 남아 있는지 체크해야 한다. EffectRelicTable* pRelicTableEffect = NULL; - // پִ Effect ´. + // 성물 보관대 종류에 따라서 붙어있는 Effect를 얻어온다. if (bSlayerRelicTable) { pRelicTableEffect = dynamic_cast( pItem->getEffectManager().findEffect(Effect::EFFECT_CLASS_SLAYER_RELIC_TABLE)); @@ -216,9 +216,9 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl pItem->getEffectManager().findEffect(Effect::EFFECT_CLASS_VAMPIRE_RELIC_TABLE)); } - // 뿡  ִ ðΰ? - // SafeTime ʾ ȵȴ. - // LockTime ȵȴ. + // 성물 보관대에서 아이템을 빼어낼 수 있는 시간인가? + // SafeTime이 되지 않았으면 안된다. + // LockTime 동안은 안된다. if (pRelicTableEffect != NULL && (!pRelicTableEffect->isSafeTime() || pRelicTableEffect->isLockTime())) { GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(g_pStringPool->getString(STRID_CANNOT_TAKE_RELIC_NOW)); @@ -227,7 +227,7 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl return; } - // üũ ؾ Ѵ. + // 성향을 체크 해야 한다. if (pItem->getItemType() != MONSTER_CORPSE) { if (pPacket->isPet()) return; @@ -237,13 +237,13 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl PCSlayerInfo3& rPCSlayerInfo = pSlayerCorpse->getSlayerInfo(); - // ڱ ü ƴ϶ + // 자기 시체가 아니라면 if (rPCSlayerInfo.getName() != pCreature->getName()) { - // ü ȣ Ѵ.... + // 악한자의 시체는 보호받지 못한다.... if (g_pAlignmentManager->getAlignmentType(rPCSlayerInfo.getAlignment()) >= NEUTRAL) { Slayer* pSlayer = dynamic_cast(pCreature); - // -500 ~ + // 성향이 -500 내려간다~ Alignment_t NewAlignment = max(-10000, pSlayer->getAlignment() - 500); pSlayer->setAlignment(NewAlignment); @@ -255,13 +255,13 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl } else if (pItem->getItemType() == VAMPIRE_CORPSE && pCreature->isVampire()) { PCVampireInfo3& rPCVampireInfo = dynamic_cast(pItem)->getVampireInfo(); - // ڱ ü ƴ϶ + // 자기 시체가 아니라면 if (rPCVampireInfo.getName() != pCreature->getName()) { - // ü ȣ Ѵ.... + // 악한자의 시체는 보호받지 못한다.... if (g_pAlignmentManager->getAlignmentType(rPCVampireInfo.getAlignment()) >= NEUTRAL) { Vampire* pVampire = dynamic_cast(pCreature); - // -500 ~ + // 성향이 -500 내려간다~ Alignment_t NewAlignment = max(-10000, pVampire->getAlignment() - 500); pVampire->setAlignment(NewAlignment); @@ -273,13 +273,13 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl } else if (pItem->getItemType() == OUSTERS_CORPSE && pCreature->isOusters()) { PCOustersInfo3& rPCOustersInfo = dynamic_cast(pItem)->getOustersInfo(); - // ڱ ü ƴ϶ + // 자기 시체가 아니라면 if (rPCOustersInfo.getName() != pCreature->getName()) { - // ü ȣ Ѵ.... + // 악한자의 시체는 보호받지 못한다.... if (g_pAlignmentManager->getAlignmentType(rPCOustersInfo.getAlignment()) >= NEUTRAL) { Ousters* pOusters = dynamic_cast(pCreature); - // -500 ~ + // 성향이 -500 내려간다~ Alignment_t NewAlignment = max(-10000, pOusters->getAlignment() - 500); pOusters->setAlignment(NewAlignment); @@ -303,7 +303,7 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl if (pMonsterCorpse != NULL && g_pFlagManager->isFlagPole(pMonsterCorpse)) { if (!g_pFlagManager->hasFlagWar()) return; - // ̸ ̴´.. + // 같은 종족이면 못 뽑는다.. if (g_pFlagManager->getFlagPoleRace(pMonsterCorpse) == pPC->getRace()) return; @@ -343,8 +343,8 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl Corpse* pCorpse = dynamic_cast(pItem); bool bDissectAll = false; - // ü 3  ٻǹٳ. - // ̾Ƴ ѹ ´. + // 시체에 아이템이 3개 보다 더 많이 들어가 있으면 한 번에 다뽀바낸다. + // 펫이 뽑아내는 아이템은 한번에 다 뽑혀나온다. // 2003.1.14 by bezz, Sequoia, sigi if (pCorpse->getTreasureCount() > 3 || pPacket->isPet()) bDissectAll = true; @@ -377,15 +377,15 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl pTreasure->setFlag(Effect::EFFECT_CLASS_PET_DISSECT); //////////////////////////////////////////////////////////////// - // 2002 ̳ ̺Ʈ - // Կ ȯȴ. - // ׷Ƿ (ƮǺϾ7, жŰ 3) - // Ѱ . - // , - // ڸ ľؼ, ̸̻ ʵ Ѵ. + // 2002년 어린이날 이벤트 + // 검은별 아이템은 가족사진 촬영권으로 교환된다. + // 그러므로 개수가 일정 수준(트랜실베니아7개, 왈라키아 3개)을 + // 넘게 나올 수 없다. + // 만약 검은별 아이템이 나왔을 경우, + // 아이템의 숫자를 파악해서, 제한 개수 이상이면 나오지 않도록 한다. if (pTreasure->getItemClass() == Item::ITEM_CLASS_EVENT_STAR && pTreasure->getItemType() == 0) { - // cout << " " << endl; + // cout << "검은별 출현" << endl; Statement* pStmt = NULL; Result* pResult = NULL; @@ -402,7 +402,7 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl if (pResult->next()) { int BlackStarNumber = pResult->getInt(1); if (BlackStarNumber >= 7) - cout << " 10 Ѿϴ" << endl; + cout << "검은별이 10개 넘었습니다" << endl; else { (pZone->getObjectRegistry()).registerObject(pTreasure); @@ -411,9 +411,9 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl if (pItem->getItemType() == MONSTER_CORPSE) { MonsterCorpse* pMonsterCorpse = dynamic_cast(pItem); - // ü ̶ 켱 Ʈ ٿ־ Ѵ. - // Ȥö Ʈ ִٸ ְ, - // Ʈ Ѵ. + // 몬스터 시체에서 나온 아이템이라면 우선권 이펙트를 붙여주어야 한다. + // 혹시라도 기존의 이펙트가 있다면 삭제해주고, + // 새로이 이펙트를 더한다. const string& HostName = pMonsterCorpse->getHostName(); int HostPartyID = pMonsterCorpse->getHostPartyID(); @@ -435,16 +435,16 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl pTreasure->setFlag(Effect::EFFECT_CLASS_PRECEDENCE); } - // ذ̶ ٰ ü ϶ Ŷ ־ Ѵ. + // 만약 해골이라면 주위에다가 시체에서 목을 제거하라고 패킷을 날려주어야 한다. if (pTreasure->getItemClass() == Item::ITEM_CLASS_SKULL) { - // ڸ~~ by sigi + // 목 자르기~~ by sigi pMonsterCorpse->removeHead(); GCRemoveCorpseHead _GCRemoveCorpseHead; _GCRemoveCorpseHead.setObjectID(pItem->getObjectID()); // pZone->broadcastPacket(pt.x, pt.y, &_GCRemoveCorpseHead); pZone->broadcastPacket(ZoneX, ZoneY, - &_GCRemoveCorpseHead); // ü ǥ by sigi + &_GCRemoveCorpseHead); // 원래 시체 좌표 by sigi if (pCreature->getPartyID() != 0 && HostPartyID == pCreature->getPartyID()) { Party* pParty = @@ -456,8 +456,8 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl } } - // ItemID ״ Ѵ. - // ItemID 0̸.. create()Ҷ ٽ ItemID ޴´. + // 기존의 ItemID를 그대로 유지한다. + // ItemID가 0이면.. create()할때 다시 ItemID를 받는다. // by sigi. 2002.10.28 pTreasure->create("", STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y, pTreasure->getItemID()); @@ -472,7 +472,7 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl throw Error(sqe.toString()); } } else if (pTreasure->isFlagItem()) { - // ٷ κ丮 ־ش. + // 깃발은 바로 인벤토리로 넣어준다. PlayerCreature* pPC = dynamic_cast(pCreature); Assert(pPC != NULL); @@ -483,7 +483,7 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl if (!pInventory->getEmptySlot(pTreasure, tp) || pCorpse->getItemType() != MONSTER_CORPSE || !g_pFlagManager->getFlag(pPC, dynamic_cast(pCorpse))) { - // ִ´. + // 도로 넣는다. pCorpse->addTreasure(pTreasure); pCorpse->setFlag(Effect::EFFECT_CLASS_FLAG_INSERT); @@ -521,7 +521,7 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl MonsterCorpse* pMonsterCorpse = dynamic_cast(pItem); if (dissectionRelicItem(pCorpse, pTreasure, pt)) { - // pTreasure relicItem + // pTreasure가 relicItem인 경우 } treasureCount++; @@ -540,7 +540,7 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl pZone->broadcastPacket(pMonsterCorpse->getX(), pMonsterCorpse->getY(), &gcRE); } - // ѷش. + // 뽑으면 존에 뿌려준다. char safeRace[15]; if (pZone->getLevelWarManager()->getSafeIndex(pMonsterCorpse) == 0) { sprintf(safeRace, g_pStringPool->c_str(STRID_SLAYER)); @@ -576,11 +576,11 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl pZone->broadcastPacket(&gcSystemMessage); } - // ü ̶ 켱 Ʈ ٿ־ Ѵ. - // Ȥö Ʈ ִٸ ְ, - // Ʈ Ѵ. - // 2003.2.28 Ʈ ִٸ ׳ д. ü ٴڿ ߰ - // ٴڿ ִ  쿡 켱 Ʈ ʱ + // 몬스터 시체에서 나온 아이템이라면 우선권 이펙트를 붙여주어야 한다. + // 혹시라도 기존의 이펙트가 있다면 삭제해주고, + // 새로이 이펙트를 더한다. + // 2003.2.28 기존의 이펙트가 있다면 그냥 둔다. 시체에 가 바닥에 추가될 때 + // 바닥에 있던 아이템이 들어갈 경우에 우선권 이텍트를 붙이지 않기 위해 if (!bSlayerRelicTable && !bVampireRelicTable) { const string& HostName = pMonsterCorpse->getHostName(); int HostPartyID = pMonsterCorpse->getHostPartyID(); @@ -591,12 +591,12 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl && !pTreasure->isFlag(Effect::EFFECT_CLASS_PRECEDENCE)) { EffectPrecedence* pEffectPrecedence = new EffectPrecedence(pTreasure); if (!pTreasure->isQuestItem()) { - // Ʈ Ƽ ݴ´. + // 퀘스트 아이템은 파티원도 못 줍는다. pEffectPrecedence->setDeadline(100); pEffectPrecedence->setHostPartyID(HostPartyID); pEffectPrecedence->setHostName(HostName); } else { - // Ʈ 켱 . + // 퀘스트 아이템은 없어질때까지 우선권이 안 없어진다. pEffectPrecedence->setDeadline(999999); pEffectPrecedence->setHostName(pMonsterCorpse->getQuestHostName()); } @@ -607,15 +607,15 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl } } - // ذ̶ ٰ ü ϶ Ŷ ־ Ѵ. + // 만약 해골이라면 주위에다가 시체에서 목을 제거하라고 패킷을 날려주어야 한다. if (pTreasure->getItemClass() == Item::ITEM_CLASS_SKULL) { - // ڸ~~ by sigi + // 목 자르기~~ by sigi pMonsterCorpse->removeHead(); GCRemoveCorpseHead _GCRemoveCorpseHead; _GCRemoveCorpseHead.setObjectID(pItem->getObjectID()); // pZone->broadcastPacket(pt.x, pt.y, &_GCRemoveCorpseHead); - pZone->broadcastPacket(ZoneX, ZoneY, &_GCRemoveCorpseHead); // ü ǥ by sigi + pZone->broadcastPacket(ZoneX, ZoneY, &_GCRemoveCorpseHead); // 원래 시체 좌표 by sigi if (pCreature->getPartyID() != 0 && pMonsterCorpse->getHostPartyID() == pCreature->getPartyID()) { @@ -627,7 +627,7 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl } } - // DB Ѵ. + // DB에 저장한다. saveDissectionItem(pCreature, pTreasure, pt.x, pt.y); } else { SAFE_DELETE(pTreasure); @@ -637,7 +637,7 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl if (pItem->getItemType() == MONSTER_CORPSE) { MonsterCorpse* pMonsterCorpse = dynamic_cast(pItem); - // ġ + // 펫 경험치 주자 if (pPacket->isPet() && treasureCount != 0) { PlayerCreature* pPC = dynamic_cast(pCreature); GCModifyInformation gcMI; @@ -646,10 +646,10 @@ void CGDissectionCorpseHandler::execute(CGDissectionCorpse* pPacket, Player* pPl g_pMonsterInfoManager->getMonsterInfo(pMonsterCorpse->getMonsterType())->getLevel(), pPC->getPetInfo(), pGamePlayer); if (!increasePetExp(pPC->getPetInfo(), exp, &gcMI)) { - // cout << "ġ ٲ : " << gcMI.toString() << endl; + // cout << "경험치가 바뀌었어요 : " << gcMI.toString() << endl; pGamePlayer->sendPacket(&gcMI); } else { - // cout << " ߴ" << endl; + // cout << "레벨없을 했대요" << endl; sendPetInfo(pGamePlayer, true); } diff --git a/src/Core/CGDonationMoney.cpp b/src/Core/CGDonationMoney.cpp index e00ec06d..4e53fde8 100644 --- a/src/Core/CGDonationMoney.cpp +++ b/src/Core/CGDonationMoney.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGDonationMoney.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGDonationMoney.h b/src/Core/CGDonationMoney.h index 5983e86a..eb69960f 100644 --- a/src/Core/CGDonationMoney.h +++ b/src/Core/CGDonationMoney.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CGDonationMoney.h -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -11,7 +11,7 @@ #include "PacketFactory.h" //////////////////////////////////////////////////////////////////////////////// -// +// 기부 종류 //////////////////////////////////////////////////////////////////////////////// enum DonationType { DONATION_TYPE_200501_PERSONAL = 0, @@ -62,8 +62,8 @@ class CGDonationMoney : public Packet { } private: - Gold_t m_Gold; // ݾ - BYTE m_DonationType; // + Gold_t m_Gold; // 기부 금액 + BYTE m_DonationType; // 기부 종류 }; diff --git a/src/Core/CGDonationMoneyHandler.cpp b/src/Core/CGDonationMoneyHandler.cpp index 893d17b5..d09763da 100644 --- a/src/Core/CGDonationMoneyHandler.cpp +++ b/src/Core/CGDonationMoneyHandler.cpp @@ -40,44 +40,44 @@ void CGDonationMoneyHandler::execute(CGDonationMoney* pPacket, Player* pPlayer) PlayerCreature* pPC = dynamic_cast(pCreature); Assert(pPC != NULL); - // Ŷ + // 결과 패킷 GCNPCResponse gcNPCResponse; // Dimension ID static int dimensionID = g_pConfig->getPropertyInt("Dimension"); - // ID + // 월드 ID static int worldID = g_pConfig->getPropertyInt("WorldID"); // affectWorldID static int affectWorldID = dimensionID * 3 + worldID; - // Ƚ + // 기부 횟수 int sumBeforePersonal = 0; int sumAfterPersonal = 0; int sumBeforeGuild = 0; int sumAfterGuild = 0; - // ̺Ʈ Ȱȭ ȮѴ. + // 기부 이벤트가 활성화된 상태인지 확인한다. if (g_pVariableManager->getVariable(DONATION_EVENT_200501) != 1) { return; } - // Ȯ + // 돈이 충분한지 확인 if (pPC->getGold() < pPacket->getGold()) { gcNPCResponse.setCode(NPC_RESPONSE_NOT_ENOUGH_MONEY); pPlayer->sendPacket(&gcNPCResponse); return; } - // δ + // 인단 돈을 까고 pPC->decreaseGoldEx(pPacket->getGold()); - // ٲ ݾ . + // 바뀐 금액을 보낸다. GCModifyInformation gcModifyInformation; gcModifyInformation.addLongData(MODIFY_GOLD, pPC->getGold()); pPlayer->sendPacket(&gcModifyInformation); - // ݱ ȸ Ѵ. + // 지금까지의 기부 회수를 구한다. { Statement* pStmt = NULL; Result* pResult = NULL; @@ -102,7 +102,7 @@ void CGDonationMoneyHandler::execute(CGDonationMoney* pPacket, Player* pPlayer) END_DB(pStmt) } - // ̽ Ѵ. + // 기부 내용을 데이터 베이스에 기록한다. { Statement* pStmt = NULL; @@ -127,7 +127,7 @@ void CGDonationMoneyHandler::execute(CGDonationMoney* pPacket, Player* pPlayer) } } - // ݱ ȸ Ѵ. + // 지금까지의 기부 회수를 구한다. { Statement* pStmt = NULL; Result* pResult = NULL; @@ -143,24 +143,24 @@ void CGDonationMoneyHandler::execute(CGDonationMoney* pPacket, Player* pPlayer) if (pResult->next()) { sumAfterPersonal = pResult->getInt(1); - // ߰ؾߵǴ + // 닉 네임을 추가해야되는 경우 if (sumAfterPersonal == 1 && sumBeforePersonal != sumAfterPersonal) { NicknameBook* pNicknameBook = pPC->getNicknameBook(); Assert(pNicknameBook != NULL); - pNicknameBook->addNewNickname(" "); + pNicknameBook->addNewNickname("새해 복 많이 받으세요"); pNicknamePacket = pNicknameBook->getNicknameBookListPacket(); } else if (sumAfterPersonal == 3 && sumBeforePersonal != sumAfterPersonal) { NicknameBook* pNicknameBook = pPC->getNicknameBook(); Assert(pNicknameBook != NULL); - pNicknameBook->addNewNickname(" "); + pNicknameBook->addNewNickname("밝은세상을 위해 노력한"); pNicknamePacket = pNicknameBook->getNicknameBookListPacket(); } else if (sumAfterPersonal == 5 && sumBeforePersonal != sumAfterPersonal) { NicknameBook* pNicknameBook = pPC->getNicknameBook(); Assert(pNicknameBook != NULL); - pNicknameBook->addNewNickname(" ƴ"); + pNicknameBook->addNewNickname("진정한 사랑을 아는"); pNicknamePacket = pNicknameBook->getNicknameBookListPacket(); } } @@ -171,24 +171,24 @@ void CGDonationMoneyHandler::execute(CGDonationMoney* pPacket, Player* pPlayer) if (pResult->next()) { sumAfterGuild = pResult->getInt(1); - // ߰ؾߵǴ + // 닉 네임을 추가해야되는 경우 if (sumAfterGuild == 1 && sumBeforeGuild != sumAfterGuild) { NicknameBook* pNicknameBook = pPC->getNicknameBook(); Assert(pNicknameBook != NULL); - pNicknameBook->addNewNickname(" ô"); + pNicknameBook->addNewNickname("따뜻한 세상을 만듭시다"); pNicknamePacket = pNicknameBook->getNicknameBookListPacket(); } else if (sumAfterGuild == 3 && sumBeforeGuild != sumAfterGuild) { NicknameBook* pNicknameBook = pPC->getNicknameBook(); Assert(pNicknameBook != NULL); - pNicknameBook->addNewNickname(" ô"); + pNicknameBook->addNewNickname("밝은 세상을 만듭시다"); pNicknamePacket = pNicknameBook->getNicknameBookListPacket(); } else if (sumAfterGuild == 5 && sumBeforeGuild != sumAfterGuild) { NicknameBook* pNicknameBook = pPC->getNicknameBook(); Assert(pNicknameBook != NULL); - pNicknameBook->addNewNickname(" õ "); + pNicknameBook->addNewNickname("사랑을 실천한 사람들"); pNicknamePacket = pNicknameBook->getNicknameBookListPacket(); } } @@ -202,15 +202,15 @@ void CGDonationMoneyHandler::execute(CGDonationMoney* pPacket, Player* pPlayer) } - // Ʈ ߰Ѵ. + // 이펙트를 추가한다. if (!pPC->isFlag(Effect::EFFECT_CLASS_DONATION_200501)) { EffectDonation200501* pEffect = new EffectDonation200501(pPC); pPC->addEffect(pEffect); - // affect Ѵ. ȿ εij ó Ѵ. + // 강제로 affect 한다. 안에서 브로드캐스팅 등의 처리를 한다. pEffect->affect(); } - // ˸. + // 기부 결과를 알린다. gcNPCResponse.setCode(NPC_RESPONSE_SHOW_DONATION_COMPLETE_DIALOG); pPlayer->sendPacket(&gcNPCResponse); diff --git a/src/Core/CGDownSkill.h b/src/Core/CGDownSkill.h index 3d26ef22..57ec7578 100644 --- a/src/Core/CGDownSkill.h +++ b/src/Core/CGDownSkill.h @@ -43,7 +43,7 @@ class CGDownSkill : public Packet { } private: - SkillType_t m_SkillType; // + SkillType_t m_SkillType; // 기술의 종류 }; ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGDropMoney.h b/src/Core/CGDropMoney.h index 5f711118..9729cc36 100644 --- a/src/Core/CGDropMoney.h +++ b/src/Core/CGDropMoney.h @@ -29,10 +29,10 @@ class CGDropMoney : public Packet { ~CGDropMoney(); public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -45,7 +45,7 @@ class CGDropMoney : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CGDropMoneyPacketSize ؼ ϶. + // const static CGDropMoneyPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szGold; } @@ -98,7 +98,7 @@ class CGDropMoneyFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGDropMoneyPacketSize ؼ ϶. + // const static CGDropMoneyPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szGold; } diff --git a/src/Core/CGDropMoneyHandler.cpp b/src/Core/CGDropMoneyHandler.cpp index 6601dfc8..35718ee3 100644 --- a/src/Core/CGDropMoneyHandler.cpp +++ b/src/Core/CGDropMoneyHandler.cpp @@ -33,9 +33,9 @@ void CGDropMoneyHandler::execute(CGDropMoney* pPacket, Player* pPlayer) #ifdef __GAME_SERVER__ - // -_-; + // -_-; 무시 // return; - throw DisconnectException(" ϴ."); + throw DisconnectException("돈은 버릴 수 없습니다."); Assert(pPacket != NULL); Assert(pPlayer != NULL); @@ -52,8 +52,8 @@ void CGDropMoneyHandler::execute(CGDropMoney* pPacket, Player* pPlayer) ZoneCoord_t ZoneY = pPC->getY(); if (amount == 0) { - // μ Ѵ. - // ߸⸦ ߴٴ Ŷ ϴ ɱ? + // 현재로서는 걍 리턴한다. + // 돈 떨어뜨리기를 실패했다는 패킷을 만들어야 하는 걸까? return; } @@ -67,9 +67,9 @@ void CGDropMoneyHandler::execute(CGDropMoney* pPacket, Player* pPlayer) pOusters = dynamic_cast(pPC); pZone = pOusters->getZone(); } else - throw ProtocolException("CGDropMoneyHandler::execute() : ÷̾ ũ."); + throw ProtocolException("CGDropMoneyHandler::execute() : 알 수 없는 플레이어 크리쳐."); - // ÷̾ ߸ ϴ ׼ŭ ִ ȮѴ. + // 플레이어가 떨어뜨리고자 하는 액수만큼의 돈을 가지고 있는지 확인한다. Item* pItem = NULL; list optionNULL; if (pPC->isSlayer()) { @@ -89,18 +89,18 @@ void CGDropMoneyHandler::execute(CGDropMoney* pPacket, Player* pPlayer) pItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_MONEY, 2, optionNULL); } - // Ѵ. + // 돈 아이템을 생성한다. dynamic_cast(pItem)->setAmount(amount); - // Ѵ. + // 돈 아이템을 등록한다. pZone->getObjectRegistry().registerObject(pItem); - // ߸. + // 돈을 존에다 떨어뜨린다. TPOINT pt = pZone->addItem(pItem, ZoneX, ZoneY); if (pt.x != -1) { // pItem->save("", STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "OwnerID='', Storage=%d, StorageID=%lu, X=%d, Y=%d", STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y); @@ -108,7 +108,7 @@ void CGDropMoneyHandler::execute(CGDropMoney* pPacket, Player* pPlayer) // pItem->create("", STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y); - // α ׼ α + // 돈로그 남길 액수면 돈로그 남긴다 if (amount >= g_pVariableManager->getMoneyTraceLogLimit()) { char zoneName[15]; sprintf(zoneName, "%4d%3d%3d", pZone->getZoneID(), ZoneX, ZoneY); @@ -128,7 +128,7 @@ void CGDropMoneyHandler::execute(CGDropMoney* pPacket, Player* pPlayer) return; } - // ÷̾κ ´. + // 플레이어로부터 돈을 뺏는다. // if (pPC->isSlayer()) pSlayer->setGoldEx(pSlayer->getGold() - amount); // else if (pPC->isVampire()) pVampire->setGoldEx(pVampire->getGold() - amount); diff --git a/src/Core/CGExpelGuild.h b/src/Core/CGExpelGuild.h index d16147b4..f6fd6b1a 100644 --- a/src/Core/CGExpelGuild.h +++ b/src/Core/CGExpelGuild.h @@ -25,10 +25,10 @@ class CGExpelGuild : public Packet { public: CGExpelGuild() {}; ~CGExpelGuild() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGExpelGuildHandler.cpp b/src/Core/CGExpelGuildHandler.cpp index 3506132a..cb9df3eb 100644 --- a/src/Core/CGExpelGuildHandler.cpp +++ b/src/Core/CGExpelGuildHandler.cpp @@ -47,7 +47,7 @@ void CGExpelGuildHandler::execute(CGExpelGuild* pPacket, Player* pPlayer) #ifdef __OLD_GUILD_WAR__ GCSystemMessage gcSM; - gcSM.setMessage(" ʴ Դϴ."); + gcSM.setMessage("아직 지원되지 않는 기능입니다."); pGamePlayer->sendPacket(&gcSM); return; #endif @@ -62,11 +62,11 @@ void CGExpelGuildHandler::execute(CGExpelGuild* 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); @@ -74,7 +74,7 @@ void CGExpelGuildHandler::execute(CGExpelGuild* pPacket, Player* pPlayer) return; } - // ߹Ϸ ϸ? : + // 내가 나를 추방하려고 하면? : if (pUnion->getMasterGuildID() == pPacket->getGuildID()) { gcGuildResponse.setCode(GuildUnionOfferManager::MASTER_CANNOT_QUIT); pPlayer->sendPacket(&gcGuildResponse); @@ -94,7 +94,7 @@ void CGExpelGuildHandler::execute(CGExpelGuild* pPacket, Player* pPlayer) } string TargetGuildMaster = pGuild->getMaster(); - // cout << "տ 带 ߹Ų. 뺸 : " << TargetGuildMaster.c_str() << endl; + // cout << "연합에서 길드를 추방시킨다. 통보받을 유저는 : " << TargetGuildMaster.c_str() << endl; Statement* pStmt = NULL; @@ -109,7 +109,7 @@ void CGExpelGuildHandler::execute(CGExpelGuild* pPacket, Player* pPlayer) pResult->next(); if (pResult->getInt(1) == 0) { - // cout << "߹ϰ .. ϳ ֹ." << endl; + // cout << "추방하고 나서..멤버가 하나도 남지 않으면 연합정보를 없애버린다." << endl; pStmt->executeQuery("DELETE FROM `GuildUnionInfo` WHERE `UnionID`='%u'", pUnion->getUnionID()); GuildUnionManager::Instance().reload(); } @@ -129,7 +129,7 @@ void CGExpelGuildHandler::execute(CGExpelGuild* pPacket, Player* pPlayer) pPlayer->sendPacket(&gcModifyInformation); - // 뺸 Union ٽ + // 통보받을 유저에게 길드Union정보를 다시 보낸다 Creature* pTargetCreature = NULL; __ENTER_CRITICAL_SECTION((*g_pPCFinder)) @@ -148,7 +148,7 @@ void CGExpelGuildHandler::execute(CGExpelGuild* pPacket, Player* pPlayer) sendGCOtherModifyInfoGuildUnion(pTargetCreature); sendGCOtherModifyInfoGuildUnion(pCreature); - // ٸ ִ 鿡 ˸. + // 다른 서버에 있는 놈들에게 변경사항을 알린다. GuildUnionManager::Instance().sendModifyUnionInfo(dynamic_cast(pTargetCreature)->getGuildID()); GuildUnionManager::Instance().sendModifyUnionInfo(dynamic_cast(pCreature)->getGuildID()); diff --git a/src/Core/CGExpelGuildMember.h b/src/Core/CGExpelGuildMember.h index 8e439bd1..0666870b 100644 --- a/src/Core/CGExpelGuildMember.h +++ b/src/Core/CGExpelGuildMember.h @@ -25,10 +25,10 @@ class CGExpelGuildMember : public Packet { public: CGExpelGuildMember() {}; ~CGExpelGuildMember() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGExpelGuildMemberHandler.cpp b/src/Core/CGExpelGuildMemberHandler.cpp index d31ac502..caf7492f 100644 --- a/src/Core/CGExpelGuildMemberHandler.cpp +++ b/src/Core/CGExpelGuildMemberHandler.cpp @@ -35,7 +35,7 @@ void CGExpelGuildMemberHandler::execute(CGExpelGuildMember* pPacket, Player* pPl SYSTEM_ASSERT(SYSTEM_GUILD); - // 带 ´. + // 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); try { Assert(pGuild != NULL); @@ -43,9 +43,9 @@ void CGExpelGuildMemberHandler::execute(CGExpelGuildMember* pPacket, Player* pPl return; } - // ÷̾ ȮѴ. + // 플레이어가 길드의 마스터인지를 확인한다. if (pGuild->getMaster() != pPlayerCreature->getName()) { - // Ͱ ƴϴ. + // 마스터가 아니다. 무시 return; } diff --git a/src/Core/CGFailQuest.h b/src/Core/CGFailQuest.h index 8caa2f3f..393da391 100644 --- a/src/Core/CGFailQuest.h +++ b/src/Core/CGFailQuest.h @@ -25,10 +25,10 @@ class CGFailQuest : public Packet { public: CGFailQuest() {}; ~CGFailQuest() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGFailQuestHandler.cpp b/src/Core/CGFailQuestHandler.cpp index 9bda85a4..d5e6fd3f 100644 --- a/src/Core/CGFailQuestHandler.cpp +++ b/src/Core/CGFailQuestHandler.cpp @@ -43,9 +43,9 @@ void CGFailQuestHandler::execute(CGFailQuest* pPacket, Player* pPlayer) if (code == CANCEL_SUCCESS) { pPC->sendCurrentQuestInfo(); - // cout << "Quest " << pPC->getName() << " " << pPacket->getQuestID() << endl; + // cout << "Quest 시작 " << pPC->getName() << " " << pPacket->getQuestID() << endl; } else { - // cout << "Quest " << pPC->getName() << " " << (int)code << endl; + // cout << "Quest 시작 실패 " << pPC->getName() << " " << (int)code << endl; } #endif // __GAME_SERVER__ diff --git a/src/Core/CGGQuestAccept.h b/src/Core/CGGQuestAccept.h index 318d8697..f0fbc376 100644 --- a/src/Core/CGGQuestAccept.h +++ b/src/Core/CGGQuestAccept.h @@ -43,7 +43,7 @@ class CGGQuestAccept : public Packet { } private: - DWORD m_QuestID; // + DWORD m_QuestID; // 기술의 종류 }; ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGGQuestCancel.h b/src/Core/CGGQuestCancel.h index 03ee0deb..862bb787 100644 --- a/src/Core/CGGQuestCancel.h +++ b/src/Core/CGGQuestCancel.h @@ -43,7 +43,7 @@ class CGGQuestCancel : public Packet { } private: - DWORD m_QuestID; // + DWORD m_QuestID; // 기술의 종류 }; ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGGetEventItem.cpp b/src/Core/CGGetEventItem.cpp index e64a0010..891a058a 100644 --- a/src/Core/CGGetEventItem.cpp +++ b/src/Core/CGGetEventItem.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGGetEventItem.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGGetEventItem.h b/src/Core/CGGetEventItem.h index 012e1fc6..defe3fc4 100644 --- a/src/Core/CGGetEventItem.h +++ b/src/Core/CGGetEventItem.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CGGetEventItem.h -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -11,12 +11,12 @@ #include "PacketFactory.h" //////////////////////////////////////////////////////////////////////////////// -// +// 기부 종류 //////////////////////////////////////////////////////////////////////////////// enum EventType { - EVENT_TYPE_200501_COMBACK_ITEM = 0, // ƿ ֱ ̺Ʈ - EVENT_TYPE_200501_COMBACK_PREMIUM_ITEM, // ƿ ֱ ̺Ʈ - EVENT_TYPE_200501_COMBACK_RECOMMEND_ITEM, // ƿ õ ֱ ̺Ʈ + EVENT_TYPE_200501_COMBACK_ITEM = 0, // 돌아온 사용자 링 아이템 주기 이벤트 + EVENT_TYPE_200501_COMBACK_PREMIUM_ITEM, // 돌아온 사용자 결제 시 아이템 주기 이벤트 + EVENT_TYPE_200501_COMBACK_RECOMMEND_ITEM, // 돌아온 사용자 결제 시 추천 받은 자 아이템 주기 이벤트 EVENT_TYPE_MAX }; @@ -54,7 +54,7 @@ class CGGetEventItem : public Packet { } private: - BYTE m_EventType; // ̺Ʈ + BYTE m_EventType; // 이벤트 종류 }; diff --git a/src/Core/CGGetEventItemHandler.cpp b/src/Core/CGGetEventItemHandler.cpp index e6f3b634..feefc618 100644 --- a/src/Core/CGGetEventItemHandler.cpp +++ b/src/Core/CGGetEventItemHandler.cpp @@ -67,7 +67,7 @@ void CGGetEventItemHandler::executeCombackItem(CGGetEventItem* pPacket, Player* string RecvItemDate = pResult->getString(1); if (RecvItemDate == "0000-00-00") { - // ~ + // 아이템 주자~ Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); @@ -88,7 +88,7 @@ void CGGetEventItemHandler::executeCombackItem(CGGetEventItem* pPacket, Player* Grade_t iGrade = 6; list optionType; - // ɼ + // 옵션 결정 i = i ^ 1; if (i) { optionType.push_back(50); // DAM+3 @@ -98,7 +98,7 @@ void CGGetEventItemHandler::executeCombackItem(CGGetEventItem* pPacket, Player* optionType.push_back(184); // ATTR+2 } - // + // 종족 if (race == RACE_SLAYER) { iClass = Item::ITEM_CLASS_RING; } else if (race == RACE_VAMPIRE) { @@ -109,7 +109,7 @@ void CGGetEventItemHandler::executeCombackItem(CGGetEventItem* pPacket, Player* Assert(false); } - // + // 레벨 if (level <= 30) { iType = 3; } else if (level <= 60) { @@ -141,7 +141,7 @@ void CGGetEventItemHandler::executeCombackItem(CGGetEventItem* pPacket, Player* pItem->setGrade(iGrade); - // Ȯ + // 빈공간 확인 _TPOINT tp; if (!pInventory->getEmptySlot(pItem, tp)) { SAFE_DELETE(pItem); @@ -181,17 +181,17 @@ void CGGetEventItemHandler::executeCombackItem(CGGetEventItem* pPacket, Player* pPlayer->sendPacket(&gcCI); - // ٰ DB Ѵ. + // 가져갔다고 DB 에 기록한다. pStmt->executeQuery("UPDATE Event200501Main SET RecvItemDate = now() WHERE PlayerID = '%s'", pGamePlayer->getID().c_str()); - // Ŭ̾Ʈ ߴٴ ޽ . + // 클라이언트에 수령했다는 메시지를 보낸다. GCNPCResponse response; response.setCode(NPC_RESPONSE_SHOW_COMMON_MESSAGE_DIALOG); response.setParameter(YOU_GET_EVENT_ITEM); pPlayer->sendPacket(&response); - // г ߰ϰ Ŭ̾Ʈ Ŷ . + // 닉네임을 추가하고 클라이언트에 패킷을 보낸다. NicknameBook* pNicknameBook = pPC->getNicknameBook(); Assert(pNicknameBook != NULL); @@ -200,7 +200,7 @@ void CGGetEventItemHandler::executeCombackItem(CGGetEventItem* pPacket, Player* pGamePlayer->sendPacket(pNicknamePacket); SAFE_DELETE(pNicknamePacket); } else { - // ̹ ޾ư. + // 이미 아이템을 받아갔다. GCNPCResponse response; response.setCode(NPC_RESPONSE_SHOW_COMMON_MESSAGE_DIALOG); response.setParameter(ALEADY_GET_EVENT_ITEM); @@ -208,7 +208,7 @@ void CGGetEventItemHandler::executeCombackItem(CGGetEventItem* pPacket, Player* return; } } else { - // ڰ ƴϴ. + // 대상 자가 아니다. GCNPCResponse response; response.setCode(NPC_RESPONSE_SHOW_COMMON_MESSAGE_DIALOG); response.setParameter(YOU_ARE_NOT_EVENT_TARGET); @@ -249,7 +249,7 @@ void CGGetEventItemHandler::executeCombackPremiumItem(CGGetEventItem* pPacket, P } if (RecvItemDate == "0000-00-00") { - // ~ + // 아이템 주자~ Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); @@ -266,43 +266,43 @@ void CGGetEventItemHandler::executeCombackPremiumItem(CGGetEventItem* pPacket, P Item* pItem[5] = {NULL, NULL, NULL, NULL, NULL}; - // ɼ DAM_3 + // 옵션 DAM_3 list optionType; optionType.push_back(50); // DAM+3 if (race == RACE_SLAYER) { pItem[0] = - g_pItemFactoryManager->createItem(Item::ITEM_CLASS_NECKLACE, 8, optionType); // ũν + g_pItemFactoryManager->createItem(Item::ITEM_CLASS_NECKLACE, 8, optionType); // 블러드 크로스 pItem[1] = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_BRACELET, 8, - optionType); // ũν 극̽ + optionType); // 크로스 브레이슬릿 pItem[2] = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_BRACELET, 8, - optionType); // ũν 극̽ + optionType); // 크로스 브레이슬릿 pItem[3] = - g_pItemFactoryManager->createItem(Item::ITEM_CLASS_RING, 8, optionType); // ÷Ƽ ̷ + g_pItemFactoryManager->createItem(Item::ITEM_CLASS_RING, 8, optionType); // 플레티넘 스파이럴 pItem[4] = - g_pItemFactoryManager->createItem(Item::ITEM_CLASS_RING, 8, optionType); // ÷Ƽ ̷ + g_pItemFactoryManager->createItem(Item::ITEM_CLASS_RING, 8, optionType); // 플레티넘 스파이럴 } else if (race == RACE_VAMPIRE) { pItem[0] = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_NECKLACE, 8, - optionType); // ũ + optionType); // 블랙 앵크 pItem[1] = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_BRACELET, 7, - optionType); // 극̽ + optionType); // 바이퍼 브레이슬릿 pItem[2] = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_RING, 8, - optionType); // + optionType); // 링 오브 스컬즈 pItem[3] = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_EARRING, 8, - optionType); // ij + optionType); // 더 캐츠 아이 pItem[4] = - g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_AMULET, 8, optionType); // + g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_AMULET, 8, optionType); // 오달 } else if (race == RACE_OUSTERS) { pItem[0] = - g_pItemFactoryManager->createItem(Item::ITEM_CLASS_OUSTERS_RING, 8, optionType); // ũ + g_pItemFactoryManager->createItem(Item::ITEM_CLASS_OUSTERS_RING, 8, optionType); // 메크쟌의 링 pItem[1] = - g_pItemFactoryManager->createItem(Item::ITEM_CLASS_OUSTERS_RING, 8, optionType); // ũ + g_pItemFactoryManager->createItem(Item::ITEM_CLASS_OUSTERS_RING, 8, optionType); // 메크쟌의 링 pItem[2] = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_OUSTERS_PENDENT, 8, - optionType); // ũ + optionType); // 메크쟌의 링 pItem[3] = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_OUSTERS_PENDENT, 8, - optionType); // Ǿ Ʈ + optionType); // 피어리 펜던트 pItem[4] = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_OUSTERS_PENDENT, 8, - optionType); // Ǿ Ʈ + optionType); // 피어리 펜던트 } else { GCNPCResponse response; response.setCode(NPC_RESPONSE_SHOW_COMMON_MESSAGE_DIALOG); @@ -329,10 +329,10 @@ void CGGetEventItemHandler::executeCombackPremiumItem(CGGetEventItem* pPacket, P _TPOINT tp[5]; for (int i = 0; i < 5; ++i) { - // Ȯ + // 빈공간 확인 if (!pInventory->getEmptySlot(pItem[i], tp[i])) { - // Ŭ. ѹ + // 클리어. 롤백 for (int j = 0; j < i; ++j) { pInventory->deleteItem(pItem[j]->getObjectID()); } @@ -356,7 +356,7 @@ void CGGetEventItemHandler::executeCombackPremiumItem(CGGetEventItem* pPacket, P } if (!pInventory->addItem(pItem[i], tp[i])) { - // Ŭ. ѹ + // 클리어. 롤백 for (int j = 0; j < i; ++j) { pInventory->deleteItem(pItem[j]->getObjectID()); } @@ -373,8 +373,8 @@ void CGGetEventItemHandler::executeCombackPremiumItem(CGGetEventItem* pPacket, P } } - // DB α Ŭ̾Ʈ - // ð ߰ + // DB 에 생성 및 로그 남기고 클라이언트에 보내기 + // 시간 제한 추가 for (int i = 0; i < 5; ++i) { pItem[i]->create(pPC->getName(), STORAGE_INVENTORY, 0, tp[i].x, tp[i].y); @@ -386,23 +386,23 @@ void CGGetEventItemHandler::executeCombackPremiumItem(CGGetEventItem* pPacket, P pPlayer->sendPacket(&gcCI); - // ð + // 시간제한 pPC->addTimeLimitItem(pItem[i], 7 * 24 * 60 * 60); } pPC->sendTimeLimitItemInfo(); - // ٰ DB Ѵ. + // 가져갔다고 DB 에 기록한다. pStmt->executeQuery("UPDATE Event200501Main SET RecvPremiumItemDate = now() WHERE PlayerID = '%s'", pGamePlayer->getID().c_str()); - // Ŭ̾Ʈ ߴٴ ޽ . + // 클라이언트에 수령했다는 메시지를 보낸다. GCNPCResponse response; response.setCode(NPC_RESPONSE_SHOW_COMMON_MESSAGE_DIALOG); response.setParameter(YOU_GET_EVENT_ITEM); pPlayer->sendPacket(&response); } else { - // ̹ ޾ư. + // 이미 아이템을 받아갔다. GCNPCResponse response; response.setCode(NPC_RESPONSE_SHOW_COMMON_MESSAGE_DIALOG); response.setParameter(ALEADY_GET_EVENT_ITEM); @@ -410,7 +410,7 @@ void CGGetEventItemHandler::executeCombackPremiumItem(CGGetEventItem* pPacket, P return; } } else { - // ڰ ƴϴ. + // 대상 자가 아니다. GCNPCResponse response; response.setCode(NPC_RESPONSE_SHOW_COMMON_MESSAGE_DIALOG); response.setParameter(YOU_ARE_NOT_EVENT_TARGET); @@ -445,7 +445,7 @@ void CGGetEventItemHandler::executeCombackRecommendItem(CGGetEventItem* pPacket, string RecvItemDate = pResult->getString(2); if (RecvItemDate == "0000-00-00") { - // ~ + // 아이템 주자~ Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); @@ -466,7 +466,7 @@ void CGGetEventItemHandler::executeCombackRecommendItem(CGGetEventItem* pPacket, Grade_t iGrade = 6; list optionType; - // ɼ + // 옵션 결정 i = i ^ 1; if (i) { optionType.push_back(50); // DAM+3 @@ -476,7 +476,7 @@ void CGGetEventItemHandler::executeCombackRecommendItem(CGGetEventItem* pPacket, optionType.push_back(184); // ATTR+2 } - // + // 종족 if (race == RACE_SLAYER) { iClass = Item::ITEM_CLASS_RING; } else if (race == RACE_VAMPIRE) { @@ -487,7 +487,7 @@ void CGGetEventItemHandler::executeCombackRecommendItem(CGGetEventItem* pPacket, Assert(false); } - // + // 레벨 if (level <= 30) { iType = 3; } else if (level <= 60) { @@ -519,7 +519,7 @@ void CGGetEventItemHandler::executeCombackRecommendItem(CGGetEventItem* pPacket, pItem->setGrade(iGrade); - // Ȯ + // 빈공간 확인 _TPOINT tp; if (!pInventory->getEmptySlot(pItem, tp)) { SAFE_DELETE(pItem); @@ -558,17 +558,17 @@ void CGGetEventItemHandler::executeCombackRecommendItem(CGGetEventItem* pPacket, pPlayer->sendPacket(&gcCI); - // ٰ DB Ѵ. + // 가져갔다고 DB 에 기록한다. pStmt->executeQuery("UPDATE Event200501Recommend SET RecvItemDate = now() WHERE UniqueID = '%d'", UniqueID); - // Ŭ̾Ʈ ߴٴ ޽ . + // 클라이언트에 수령했다는 메시지를 보낸다. GCNPCResponse response; response.setCode(NPC_RESPONSE_SHOW_COMMON_MESSAGE_DIALOG); response.setParameter(YOU_GET_EVENT_ITEM); pPlayer->sendPacket(&response); } else { - // ̹ ޾ư. + // 이미 아이템을 받아갔다. GCNPCResponse response; response.setCode(NPC_RESPONSE_SHOW_COMMON_MESSAGE_DIALOG); response.setParameter(ALEADY_GET_EVENT_ITEM); @@ -576,7 +576,7 @@ void CGGetEventItemHandler::executeCombackRecommendItem(CGGetEventItem* pPacket, return; } } else { - // ڰ ƴϴ. + // 대상 자가 아니다. GCNPCResponse response; response.setCode(NPC_RESPONSE_SHOW_COMMON_MESSAGE_DIALOG); response.setParameter(YOU_ARE_NOT_EVENT_TARGET); diff --git a/src/Core/CGGetOffMotorCycle.h b/src/Core/CGGetOffMotorCycle.h index d43eeb1e..e0355f85 100644 --- a/src/Core/CGGetOffMotorCycle.h +++ b/src/Core/CGGetOffMotorCycle.h @@ -31,10 +31,10 @@ class CGGetOffMotorCycle : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGGetOffMotorCycleHandler.cpp b/src/Core/CGGetOffMotorCycleHandler.cpp index 0e3f4898..40593419 100644 --- a/src/Core/CGGetOffMotorCycleHandler.cpp +++ b/src/Core/CGGetOffMotorCycleHandler.cpp @@ -30,7 +30,7 @@ void CGGetOffMotorCycleHandler::execute(CGGetOffMotorCycle* pPacket, Player* pPl GamePlayer* pGamePlayer = dynamic_cast(pPlayer); - // ÷̾ ° ˻Ѵ. + // 플레이어의 상태가 정상적인 상태인지를 검사한다. if (pGamePlayer->getPlayerStatus() != GPS_NORMAL) { GCGetOffMotorCycleFailed _GCGetOffMotorCycleFailed; pPlayer->sendPacket(&_GCGetOffMotorCycleFailed); @@ -39,7 +39,7 @@ void CGGetOffMotorCycleHandler::execute(CGGetOffMotorCycle* pPacket, Player* pPl Creature* pCreature = pGamePlayer->getCreature(); - // ̾ ˻Ѵ. + // 슬레이어이인지를 검사한다. if (!pCreature->isSlayer()) { GCGetOffMotorCycleFailed _GCGetOffMotorCycleFailed; pPlayer->sendPacket(&_GCGetOffMotorCycleFailed); @@ -51,12 +51,12 @@ void CGGetOffMotorCycleHandler::execute(CGGetOffMotorCycle* pPacket, Player* pPl bool bSuccess = false; Zone* pZone = pSlayer->getZone(); - // ̸ Ÿ ִٸ... + // 오토바이를 타고 있다면... if (pMotorcycle != NULL) { ZoneCoord_t x = pSlayer->getX(); ZoneCoord_t y = pSlayer->getY(); - // Ϲ ƴ϶ (0 Ϲ ̴.), ڸ ִ. + // 일반 지역이 아니라면 (0이 일반 지역이다.), 운영자만이 내릴 수 있다. if (pZone->getZoneLevel(x, y) & SAFE_ZONE) { if (pSlayer->isGOD() || pSlayer->isDM()) bSuccess = true; diff --git a/src/Core/CGGlobalChat.h b/src/Core/CGGlobalChat.h index d2064a37..a805ede5 100644 --- a/src/Core/CGGlobalChat.h +++ b/src/Core/CGGlobalChat.h @@ -17,8 +17,8 @@ // // class CGGlobalChat; // -// Ŭ̾Ʈ GlobalChat Ŷ̴. -// ο GlobalChat String Ÿ ʵ . +// 클라이언트가 서버에게 보내는 GlobalChat 패킷이다. +// 내부에 GlobalChat String 만을 데이타 필드로 가진다. // ////////////////////////////////////////////////////////////////////// @@ -26,10 +26,10 @@ class CGGlobalChat : public Packet { public: CGGlobalChat() {}; ~CGGlobalChat() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -105,7 +105,7 @@ class CGGlobalChatFactory : public PacketFactory { } // get packet's max body size - // message ִ ũ⿡ ʿϴ. + // message 의 최대 크기에 대한 설정이 필요하다. PacketSize_t getPacketMaxSize() const { return szuint + szBYTE + 128; } diff --git a/src/Core/CGGlobalChatHandler.cpp b/src/Core/CGGlobalChatHandler.cpp index 621ab752..8c1850cd 100644 --- a/src/Core/CGGlobalChatHandler.cpp +++ b/src/Core/CGGlobalChatHandler.cpp @@ -16,10 +16,10 @@ #endif ////////////////////////////////////////////////////////////////////////////// -// Ӹ GlobalChat Ʈ ﶧ ϴ Ŷ̴. -// ũó ִ ÷̾ εijƮѴ. -// ϴ ÷̾(Ǵ ü ÷̾) -// GCGlobalChat Ŷ εijƮѴ. +// 머리위에 GlobalChat 스트링을 띄울때 사용하는 패킷이다. +// 이 크리처를 볼 수 있는 모든 플레이어에게 브로드캐스트한다. +// 일단은 현재 존의 모든 플레이어(또는 전체 플레이어)에게 +// GCGlobalChat 패킷을 브로드캐스트한다. ////////////////////////////////////////////////////////////////////////////// void CGGlobalChatHandler::execute(CGGlobalChat* pPacket, Player* pPlayer) @@ -41,7 +41,7 @@ void CGGlobalChatHandler::execute(CGGlobalChat* pPacket, Player* pPlayer) Assert(pCreature != NULL); - // Ŭ̾Ʈ ϹǷ GC- Ŷ ؾ Ѵ. + // 서버에서 클라이언트로 전송하므로 GC- 패킷을 사용해야 한다. GCGlobalChat gcGlobalChat; size_t i = pPacket->getMessage().find_first_of('*', 0); @@ -52,18 +52,18 @@ void CGGlobalChatHandler::execute(CGGlobalChat* pPacket, Player* pPlayer) // text color setting gcGlobalChat.setColor(pPacket->getColor()); - // ũó ̸ ޽ Ŷ Ѵ. + // 크리처 이름과 메시지를 패킷에 대입한다. StringStream msg; msg << pCreature->getName() << " " << pPacket->getMessage(); gcGlobalChat.setMessage(msg.toString()); gcGlobalChat.setRace(pCreature->getRace()); - // ֺ PC鿡 εijƮѴ. + // 주변 PC들에게 브로드캐스트한다. pCreature->getZone()->broadcastPacket(&gcGlobalChat, pCreature); - // ä α׸ . by sigi. 2002.10.30 + // 채팅 로그를 남긴다. by sigi. 2002.10.30 if (LogNameManager::getInstance().isExist(pCreature->getName())) { filelog("chatLog.txt", "[Global] %s> %s", pCreature->getName().c_str(), pPacket->getMessage().c_str()); } diff --git a/src/Core/CGGuildChatHandler.cpp b/src/Core/CGGuildChatHandler.cpp index 453e64a2..36d63488 100644 --- a/src/Core/CGGuildChatHandler.cpp +++ b/src/Core/CGGuildChatHandler.cpp @@ -49,7 +49,7 @@ void CGGuildChatHandler::execute(CGGuildChat* pPacket, Player* pPlayer) ggGuildChat.setColor(pPacket->getColor()); ggGuildChat.setMessage(pPacket->getMessage()); - // . + // 각 서버로 보낸다. HashMapGameServerInfo** pGameServerInfos = g_pGameServerInfoManager->getGameServerInfos(); static int myWorldID = g_pConfig->getPropertyInt("WorldID"); diff --git a/src/Core/CGJoinGuild.h b/src/Core/CGJoinGuild.h index ffcda3a7..8cdd83f2 100644 --- a/src/Core/CGJoinGuild.h +++ b/src/Core/CGJoinGuild.h @@ -25,10 +25,10 @@ class CGJoinGuild : public Packet { public: CGJoinGuild() {}; ~CGJoinGuild() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGJoinGuildHandler.cpp b/src/Core/CGJoinGuildHandler.cpp index 7c7d42ce..aa8ab53b 100644 --- a/src/Core/CGJoinGuildHandler.cpp +++ b/src/Core/CGJoinGuildHandler.cpp @@ -53,9 +53,9 @@ void CGJoinGuildHandler::execute(CGJoinGuild* pPacket, Player* pPlayer) // cout << pPacket->toString() << endl; BEGIN_DB { - // ƴٸ ⼭ üũҶ ɸ ȵȴ. - // ׷ ޽ Ŭ̾Ʈ ʴ´. - // ٸ Ҽ üũ + // 정상적인 과정을 거쳤다면 여기서 체크할때 걸리면 안된다. + // 그런 이유로 에러메시지를 클라이언트로 보내지 않는다. + // 다른 길드 소속인지 체크 pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pResult = pStmt->executeQuery("SELECT GuildID, `Rank`, ExpireDate FROM GuildMember WHERE Name = '%s'", pCreature->getName().c_str()); @@ -77,15 +77,15 @@ void CGJoinGuildHandler::execute(CGJoinGuild* pPacket, Player* pPlayer) Time.tm_min = 0; Time.tm_sec = 0; - // if ( difftime( daytime, mktime(&Time) ) < 604800 ) // ǽð 7 °? + // if ( difftime( daytime, mktime(&Time) ) < 604800 ) // 실시간 7일이 지났는가? if (difftime(daytime, mktime(&Time)) < - g_pVariableManager->getVariable(QUIT_GUILD_PENALTY_TERM) * 24 * 3600) // ǽð 7 °? + g_pVariableManager->getVariable(QUIT_GUILD_PENALTY_TERM) * 24 * 3600) // 실시간 7일이 지났는가? { /* if (Rank==GuildMember::GUILDMEMBER_RANK_DENY && GuildID != pPacket->getGuildID()) { - // rank4==߹/ź.. ֵ ٸ 忡  ִ. - // ִ GuildMember Ѵ. + // rank4==추방/거부..인 애들은 다른 길드에는 들어갈 수 있다. + // 기존에 있던 GuildMember에서 제거한다. pStmt->executeQuery( "DELETE FROM GuildMember WHERE Name = '%s'", pCreature->getName().c_str() ); } @@ -96,14 +96,14 @@ void CGJoinGuildHandler::execute(CGJoinGuild* pPacket, Player* pPlayer) return; }*/ - // ǽð 7 . + // 실시간 7일이 지나지 않으면 가입할 수 없다. 무조건 // 2003. 6. 25 by bezz SAFE_DELETE(pStmt); return; } } else { - // ̹ ٸ 忡 ҼӵǾ + // 이미 다른 길드에 소속되어 있음 SAFE_DELETE(pStmt); return; @@ -115,9 +115,9 @@ void CGJoinGuildHandler::execute(CGJoinGuild* pPacket, Player* pPlayer) END_DB(pStmt) - // Ÿ + // 스타팅 멤버로 가입할 경우 if (pPacket->getGuildMemberRank() == GuildMember::GUILDMEMBER_RANK_SUBMASTER) { - // 尡 ̹ ϵǾ ȮѴ. + // 길드가 이미 정식 길드로 등록되었는지 확인한다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); if (pGuild == NULL) return; @@ -131,10 +131,10 @@ void CGJoinGuildHandler::execute(CGJoinGuild* pPacket, Player* pPlayer) SkillDomainType_t highest = pSlayer->getHighestSkillDomain(); - // üũ - if ((pSlayer->getGold() >= REQUIRE_SLAYER_SUBMASTER_GOLD) && // Ϻ 5õ - (pSlayer->getFame() >= REQUIRE_SLAYER_SUBMASTER_FAME[highest]) && // ġ - (pSlayer->getSkillDomainLevel(highest) >= REQUIRE_SLAYER_SUBMASTER_SKILL_DOMAIN_LEVEL) // 40 ̻ + // 등록 가능 여부 체크 + if ((pSlayer->getGold() >= REQUIRE_SLAYER_SUBMASTER_GOLD) && // 등록비 5천만 + (pSlayer->getFame() >= REQUIRE_SLAYER_SUBMASTER_FAME[highest]) && // 명성치 + (pSlayer->getSkillDomainLevel(highest) >= REQUIRE_SLAYER_SUBMASTER_SKILL_DOMAIN_LEVEL) // 레벨 40 이상 ) { GSAddGuildMember gsAddGuildMember; @@ -151,9 +151,9 @@ void CGJoinGuildHandler::execute(CGJoinGuild* pPacket, Player* pPlayer) Vampire* pVampire = dynamic_cast(pCreature); Assert(pVampire != NULL); - // üũ - if ((pVampire->getGold() >= REQUIRE_VAMPIRE_SUBMASTER_GOLD) && // Ϻ 5õ - (pVampire->getLevel() >= REQUIRE_VAMPIRE_SUBMASTER_LEVEL) // 40 ̻ + // 등록 가능 여부 체크 + if ((pVampire->getGold() >= REQUIRE_VAMPIRE_SUBMASTER_GOLD) && // 등록비 5천만 + (pVampire->getLevel() >= REQUIRE_VAMPIRE_SUBMASTER_LEVEL) // 레벨 40 이상 ) { GSAddGuildMember gsAddGuildMember; @@ -169,9 +169,9 @@ void CGJoinGuildHandler::execute(CGJoinGuild* pPacket, Player* pPlayer) Ousters* pOusters = dynamic_cast(pCreature); Assert(pOusters != NULL); - // üũ - if ((pOusters->getGold() >= REQUIRE_OUSTERS_SUBMASTER_GOLD) && // Ϻ 5õ - (pOusters->getLevel() >= REQUIRE_OUSTERS_SUBMASTER_LEVEL) // 40 ̻ + // 등록 가능 여부 체크 + if ((pOusters->getGold() >= REQUIRE_OUSTERS_SUBMASTER_GOLD) && // 등록비 5천만 + (pOusters->getLevel() >= REQUIRE_OUSTERS_SUBMASTER_LEVEL) // 레벨 40 이상 ) { GSAddGuildMember gsAddGuildMember; @@ -185,7 +185,7 @@ void CGJoinGuildHandler::execute(CGJoinGuild* pPacket, Player* pPlayer) } } } else if (pPacket->getGuildMemberRank() == GuildMember::GUILDMEMBER_RANK_WAIT) { - // û, + // 길드 가입 신청, 대기 상태 GSAddGuildMember gsAddGuildMember; gsAddGuildMember.setGuildID(pPacket->getGuildID()); diff --git a/src/Core/CGLearnSkill.h b/src/Core/CGLearnSkill.h index 6728e3c6..5e909985 100644 --- a/src/Core/CGLearnSkill.h +++ b/src/Core/CGLearnSkill.h @@ -50,8 +50,8 @@ class CGLearnSkill : public Packet { } private: - SkillType_t m_SkillType; // - SkillDomainType_t m_DomainType; // + SkillType_t m_SkillType; // 기술의 종류 + SkillDomainType_t m_DomainType; // 기술의 도메인 }; ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGLearnSkillHandler.cpp b/src/Core/CGLearnSkillHandler.cpp index 3a74a163..ca4a49df 100644 --- a/src/Core/CGLearnSkillHandler.cpp +++ b/src/Core/CGLearnSkillHandler.cpp @@ -58,10 +58,10 @@ void CGLearnSkillHandler::execute(CGLearnSkill* pPacket, Player* pPlayer) PlayerCreature* pPC = dynamic_cast(pGamePlayer->getCreature()); GCLearnSkillFailed failpkt; - // üũѴ. + // ÇöÀç ±¸ÇöµÇÁö ¾ÊÀº ±â¼úÀ» ¹è¿ì·Á´ÂÁö üũÇÑ´Ù. switch (targetSkillType) { //////////////////////////////////////////////////////////// - // Ǵ + // Áö¿øµÇ´Â ±â¼ú //////////////////////////////////////////////////////////// case SKILL_DOUBLE_IMPACT: case SKILL_TRIPLE_SLASHER: @@ -165,7 +165,7 @@ void CGLearnSkillHandler::execute(CGLearnSkill* pPacket, Player* pPlayer) case SKILL_TRIPLE_SHOT: case SKILL_THROW_BOMB: case SKILL_DEATH: - // 2002.6.18߰ + // 2002.6.18Ãß°¡ case SKILL_SHADOW_DANCING: case SKILL_SWORD_MASTERY: case SKILL_SHIELD_MASTERY: @@ -182,7 +182,7 @@ void CGLearnSkillHandler::execute(CGLearnSkill* pPacket, Player* pPlayer) case SKILL_TRANSFUSION: case SKILL_BLOODY_SPEAR: case SKILL_MEPHISTO: - // 2002.6.19 ߰ + // 2002.6.19 Ãß°¡ case SKILL_SUMMON_CASKET: case SKILL_MENTAL_SWORD: case SKILL_OBSERVING_EYE: @@ -348,21 +348,21 @@ void CGLearnSkillHandler::execute(CGLearnSkill* pPacket, Player* pPlayer) case SKILL_HARPOON_BOMB: case SKILL_PASSING_HEAL: case SKILL_ROTTEN_APPLE: - // add by coffee 2007-2-18 ¼ - case SKILL_BLLODY_SCARIFY: // 374 Ѫ֮ӡ (Ѫ¼ ) - case SKILL_BLOOD_CURSE: // 375 Ѫ֮{ + // add by coffee 2007-2-18 м¼ÄÜ + case SKILL_BLLODY_SCARIFY: // 374 Ѫ֮ÀÓÓ¡ (ÎüѪ¹íм¼ÄÜ ) + case SKILL_BLOOD_CURSE: // 375 Ѫ֮Ô{Öä ////////////////////////////////////////////////////////////////////////// - // ༼ - case SKILL_SHINE_SWORD: // 376 ҫ֮ - case SKILL_BOMB_CRASH_WALK: // 377 ںը - case SKILL_SATELLITE_BOMB: // 378 Ǻ - case SKILL_ILLUSION_INVERSION: // 379 ֲþ - case SKILL_HEAVEN_GROUND: // 380 + // ÈËÀ༼ÄÜ + case SKILL_SHINE_SWORD: // 376 ÉÁÒ«Ö®½£ + case SKILL_BOMB_CRASH_WALK: // 377 ¾ÞÅÚºäÕ¨ + case SKILL_SATELLITE_BOMB: // 378 ÎÀÐǺä»÷ + case SKILL_ILLUSION_INVERSION: // 379 ¿Ö²À»Ã¾õ + case SKILL_HEAVEN_GROUND: // 380 ÌìÉñ½µÁÙ // add by coffee 2007-3-3 - case SKILL_DUMMY_DRAKE: // 382 ׿˿() - case SKILL_HYDRO_CONVERGENCE: // 383 ˮ(ˮ) - case SKILL_SUMMON_CLAY: // 384 ճٻ() - case SKILL_HETER_CHAKRAM: // 385 IJ(սʿ) + case SKILL_DUMMY_DRAKE: // 382 µÂÀ׿˿þÀÜ(»ð) + case SKILL_HYDRO_CONVERGENCE: // 383 ¸´ºÏË®ÁÆ(Ë®) + case SKILL_SUMMON_CLAY: // 384 Õ³ÍÁÕÙ»½(ÍÁ) + case SKILL_HETER_CHAKRAM: // 385 ÏIJ¼Àû»ùÒò(սʿ) case SKILL_Sky_Fire: case SKILL_Cut_Storm: case SKILL_XRL_Missile: @@ -378,7 +378,7 @@ void CGLearnSkillHandler::execute(CGLearnSkill* pPacket, Player* pPlayer) #endif break; //////////////////////////////////////////////////////////// - // ʴ + // Áö¿øµÇÁö ¾Ê´Â ±â¼ú //////////////////////////////////////////////////////////// case SKILL_ARMAGEDDON: case SKILL_HOLY_BLAST: @@ -415,9 +415,9 @@ void CGLearnSkillHandler::execute(CGLearnSkill* pPacket, Player* pPlayer) return; } - // ÷̾ ˻Ѵ. + // Ç÷¹À̾ Á¤»óÀûÀÎ »óÅÂÀÎÁö¸¦ °Ë»çÇÑ´Ù. if (pGamePlayer->getPlayerStatus() == GPS_NORMAL) { - // NPC ִ ˻Ѵ. + // NPC°¡ °¡¸£ÃÄ ÁÙ ¼ö ÀÖ´ÂÁö °Ë»çÇÑ´Ù. SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(targetSkillType); Assert(pSkillInfo != NULL); @@ -428,24 +428,24 @@ void CGLearnSkillHandler::execute(CGLearnSkill* pPacket, Player* pPlayer) pPlayer->sendPacket(&failpkt); return; } - // add by Coffee ӶԶתܵ + // add by Coffee Ôö¼Ó¶Ô¶þת¼¼ÄܵÄÏÞÖÆ switch (targetSkillType) { ////////////////////////////////////////////////////////////////////////// - // 170 - case SKILL_BLLODY_SCARIFY: // 374 Ѫ֮ӡ (Ѫ¼ ) - case SKILL_BLOOD_CURSE: // 375 Ѫ֮{ + // 170 ¼¶¼¼ÄÜ + case SKILL_BLLODY_SCARIFY: // 374 Ѫ֮ÀÓÓ¡ (ÎüѪ¹íм¼ÄÜ ) + case SKILL_BLOOD_CURSE: // 375 Ѫ֮Ô{Öä ////////////////////////////////////////////////////////////////////////// - // ༼ - case SKILL_SHINE_SWORD: // 376 ҫ֮ - case SKILL_BOMB_CRASH_WALK: // 377 ںը - case SKILL_SATELLITE_BOMB: // 378 Ǻ - case SKILL_ILLUSION_INVERSION: // 379 ֲþ - case SKILL_HEAVEN_GROUND: // 380 + // ÈËÀ༼ÄÜ + case SKILL_SHINE_SWORD: // 376 ÉÁÒ«Ö®½£ + case SKILL_BOMB_CRASH_WALK: // 377 ¾ÞÅÚºäÕ¨ + case SKILL_SATELLITE_BOMB: // 378 ÎÀÐǺä»÷ + case SKILL_ILLUSION_INVERSION: // 379 ¿Ö²À»Ã¾õ + case SKILL_HEAVEN_GROUND: // 380 ÌìÉñ½µÁÙ // add by coffee 2007-3-3 - case SKILL_DUMMY_DRAKE: // 382 ׿˿() - case SKILL_HYDRO_CONVERGENCE: // 383 ˮ(ˮ) - case SKILL_SUMMON_CLAY: // 384 ճٻ() - case SKILL_HETER_CHAKRAM: // 385 IJ(սʿ) + case SKILL_DUMMY_DRAKE: // 382 µÂÀ׿˿þÀÜ(»ð) + case SKILL_HYDRO_CONVERGENCE: // 383 ¸´ºÏË®ÁÆ(Ë®) + case SKILL_SUMMON_CLAY: // 384 Õ³ÍÁÕÙ»½(ÍÁ) + case SKILL_HETER_CHAKRAM: // 385 ÏIJ¼Àû»ùÒò(սʿ) case SKILL_Sky_Fire: case SKILL_Cut_Storm: case SKILL_XRL_Missile: @@ -486,7 +486,7 @@ void CGLearnSkillHandler::execute(CGLearnSkill* pPacket, Player* pPlayer) } } - // ÷̾ ̾ ̾ + // Ç÷¹À̾ ½½·¹À̾îÀÎÁö ¹ìÆÄÀ̾îÀÎÁö ±¸ºÐ if (pPC->isSlayer()) executeSlayerSkill(pPacket, pPlayer); else if (pPC->isVampire()) @@ -504,7 +504,7 @@ void CGLearnSkillHandler::execute(CGLearnSkill* pPacket, Player* pPlayer) } ////////////////////////////////////////////////////////////////////////////// -// ̾ ó +// ½½·¹ÀÌ¾î ±â¼ú ½ÀµæÀ» ó¸® ////////////////////////////////////////////////////////////////////////////// void CGLearnSkillHandler::executeSlayerSkill(CGLearnSkill* pPacket, Player* pPlayer) @@ -513,7 +513,7 @@ void CGLearnSkillHandler::executeSlayerSkill(CGLearnSkill* pPacket, Player* pPla #ifdef __GAME_SERVER__ - // Ŷ ̾Ƴ. + // ÆÐŶ Á¤º¸¸¦ »Ì¾Æ³½´Ù. SkillType_t targetSkillType = pPacket->getSkillType(); SkillDomainType_t targetDomainType = pPacket->getSkillDomainType(); GamePlayer* pGamePlayer = dynamic_cast(pPlayer); @@ -521,8 +521,8 @@ void CGLearnSkillHandler::executeSlayerSkill(CGLearnSkill* pPacket, Player* pPla Slayer* pSlayer = dynamic_cast(pPC); bool bSuccess = false; - // ETC ο ̴ ̴. - // ETC ؼ ̾ Ѵ. + // ETC µµ¸ÞÀÎÀÇ °æ¿ì ¸ðµç µµ¸ÞÀο¡¼­ °ø¿ëÀ¸·Î ¾²ÀÌ´Â ±â¼úÀÌ´Ù. + // ETC µµ¸ÞÀÎ ±â¼ú¿¡ ´ëÇØ¼­´Â ½½·¹À̾îÀÇ °¡Àå ³ôÀº µµ¸ÞÀÎ ·¹º§°ú ºñ±³ÇÑ´Ù. SkillDomainType_t actualDomainType = targetDomainType; if (actualDomainType == SKILL_DOMAIN_ETC) actualDomainType = pSlayer->getHighestSkillDomain(); @@ -536,7 +536,7 @@ void CGLearnSkillHandler::executeSlayerSkill(CGLearnSkill* pPacket, Player* pPla return; } - // ִ ٸ ִ. + // ±× ±â¼úÀ» ¹è¿ï ¼ö ÀÖ´Â ·¹º§ÀÌ ÇöÀç µµ¸ÞÀÎÀÇ ·¹º§ º¸´Ù ³·´Ù¸é ±â¼úÀ» ¹è¿ï ¼ö ÀÖ´Ù. SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(targetSkillType); // check skill type ,modified by chengh 2006 06 14 @@ -557,8 +557,8 @@ void CGLearnSkillHandler::executeSlayerSkill(CGLearnSkill* pPacket, Player* pPla if (pSkillInfo->getLevel() <= pSlayer->getSkillDomainLevel(actualDomainType)) bSuccess = true; - // ִ ġ ƴϸ . ̻ 츦 ġ üũѴ. - // ETC ܷ óѴ. + // ±â¼úÀ» ¹è¿ï¼ö ÀÖ´Â °æÇèÄ¡°¡ ¾Æ´Ï¸é ¹è¿ï ¼ö ¾ø´Ù. ·¹º§ÀÌ ÀÌ»óÀÌ ÀÖÀ» °æ¿ì¸¦ ´ëºñÇØ °æÇèÄ¡µµ üũÇÑ´Ù. + // ETC µµ¸ÞÀÎÀÏ °æ¿ì ¿¹¿Ü·Î ó¸®ÇÑ´Ù. if (targetDomainType != SKILL_DOMAIN_ETC) // if (pSlayer->getSkillDomainExp(pSkillInfo->getDomainType()) // >= g_pSkillDomainInfoManager->getDomainInfo((SkillDomain)pSkillInfo->getDomainType(), @@ -573,18 +573,18 @@ void CGLearnSkillHandler::executeSlayerSkill(CGLearnSkill* pPacket, Player* pPla } else - // θ üũؼ ˸ Ŷ . + // ¼º°ø ¿©ºÎ¸¦ Ã¼Å©ÇØ¼­ ¾Ë¸ÂÀº ÆÐŶÀ» ³¯¸°´Ù. if (bSuccess) { - // ϰ... + // ±â¼úÀ» ´õÇϰí... pSlayer->addSkill(targetSkillType); - // ٰ Ŷ ش. + // ±â¼ú ¹è¿ü´Ù°í ÆÐŶ ³¯·ÁÁØ´Ù. GCLearnSkillOK okpkt; okpkt.setSkillType(targetSkillType); okpkt.setSkillDomainType(targetDomainType); pPlayer->sendPacket(&okpkt); - // Ϻ ų ɷġ ٷ Ѵ. + // ÀϺΠ½ºÅ³µéÀº ´É·ÂÄ¡ °ü·Ã °ªµéÀÌ ¹Ù·Î º¯ÇÑ´Ù. switch (targetSkillType) { case SKILL_SWORD_MASTERY: case SKILL_SHIELD_MASTERY: @@ -621,7 +621,7 @@ void CGLearnSkillHandler::executeSlayerSkill(CGLearnSkill* pPacket, Player* pPla } ////////////////////////////////////////////////////////////////////////////// -// ̾ ó +// ¹ìÆÄÀÌ¾î ±â¼ú ½ÀµæÀ» ó¸® ////////////////////////////////////////////////////////////////////////////// void CGLearnSkillHandler::executeVampireSkill(CGLearnSkill* pPacket, Player* pPlayer) @@ -630,17 +630,17 @@ void CGLearnSkillHandler::executeVampireSkill(CGLearnSkill* pPacket, Player* pPl #ifdef __GAME_SERVER__ - // Ŷ ̾Ƴ. + // ÆÐŶ Á¤º¸¸¦ »Ì¾Æ³½´Ù. SkillType_t targetSkillType = pPacket->getSkillType(); SkillDomainType_t targetDomainType = pPacket->getSkillDomainType(); - // Ŷ ̾Ƴ + // ÆÐŶ¿¡¼­ »Ì¾Æ³½ Á¤º¸¸¦ °¡°ø GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pPC = pGamePlayer->getCreature(); Vampire* pVampire = dynamic_cast(pPC); bool bSuccess = false; - // ִ ٸ ִ. + // ±× ±â¼úÀ» ¹è¿ï ¼ö ÀÖ´Â ·¹º§ÀÌ ÇöÀç ·¹º§ º¸´Ù ³·´Ù¸é ±â¼úÀ» ¹è¿ï ¼ö ÀÖ´Ù. SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(targetSkillType); // check skill type ,modified by chengh 2006 06 14 @@ -660,7 +660,7 @@ void CGLearnSkillHandler::executeVampireSkill(CGLearnSkill* pPacket, Player* pPl if (pSkillInfo->getLevel() <= pVampire->getLevel()) bSuccess = true; - // θ üũؼ ˸ Ŷ . + // ¼º°ø ¿©ºÎ¸¦ Ã¼Å©ÇØ¼­ ¾Ë¸ÂÀº ÆÐŶÀ» ³¯¸°´Ù. if (bSuccess) { pVampire->addSkill(targetSkillType); @@ -701,11 +701,11 @@ void CGLearnSkillHandler::executeOustersSkill(CGLearnSkill* pPacket, Player* pPl __BEGIN_DEBUG_EX __BEGIN_TRY #ifdef __GAME_SERVER__ - // Ŷ ̾Ƴ. + // ÆÐŶ Á¤º¸¸¦ »Ì¾Æ³½´Ù. SkillType_t targetSkillType = pPacket->getSkillType(); SkillDomainType_t targetDomainType = pPacket->getSkillDomainType(); - // Ŷ ̾Ƴ + // ÆÐŶ¿¡¼­ »Ì¾Æ³½ Á¤º¸¸¦ °¡°ø GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pPC = pGamePlayer->getCreature(); Ousters* pOusters = dynamic_cast(pPC); @@ -740,7 +740,7 @@ void CGLearnSkillHandler::executeOustersSkill(CGLearnSkill* pPacket, Player* pPl if (pOustersSkillSlot != NULL) { //////////////////////////////////////// - // ų ̴. + // ½ºÅ³ÀÇ ·¹º§ ¾÷ÀÌ´Ù. //////////////////////////////////////// int LevelUpPoint = pSkillInfo->getLevelUpPoint(); @@ -847,7 +847,7 @@ void CGLearnSkillHandler::executeOustersSkill(CGLearnSkill* pPacket, Player* pPl #ifdef __GAME_SERVER__ -// ƿ콺 ųʿ ų ʿ ų üũѴ. +// ¾Æ¿ì½ºÅÍÁîÀÇ ½ºÅ³¸Ê¿¡¼­ ÀÌ ½ºÅ³À» ¹è¿ì±â À§ÇØ ÇÊ¿äÇÑ ½ºÅ³À» üũÇÑ´Ù. bool CheckRequiredSkill(SkillInfo* pSkillInfo, Ousters* pOusters, int domain) { if (pSkillInfo->getType() == SKILL_SOUL_CHAIN) { if (pOusters->getLevel() >= 100) @@ -858,22 +858,22 @@ bool CheckRequiredSkill(SkillInfo* pSkillInfo, Ousters* pOusters, int domain) { const list& RequiredSkills = pSkillInfo->getRequireSkills(); - // ʿ ų .. + // ÇÊ¿äÇÑ ½ºÅ³ÀÌ ¾øÀ¸¸é ¹«Á¶°Ç.. if (RequiredSkills.empty()) return true; list::const_iterator itr = RequiredSkills.begin(); list::const_iterator endItr = RequiredSkills.end(); - // ʿ ų߿ ϳ ȴ. + // ÇÊ¿äÇÑ ½ºÅ³Áß¿¡ Çϳª¶óµµ ÀÖÀ¸¸é µÈ´Ù. for (; itr != endItr; ++itr) { - // ʿ ų ETC , ųʿ üũؾ Ѵ. + // ÇÊ¿äÇÑ ½ºÅ³ÀÌ ETC µµ¸ÞÀÎÀÏ °æ¿ì, ¾î´ÀÂÊ ½ºÅ³¸Ê¿¡¼­ ¹è¿î°ÇÁö Ã¼Å©ÇØ¾ß ÇÑ´Ù. SkillInfo* pParentSkillInfo = g_pSkillInfoManager->getSkillInfo(*itr); if (pParentSkillInfo->getElementalDomain() == ELEMENTAL_DOMAIN_ETC) { if (!CheckRequiredSkill(pParentSkillInfo, pOusters, domain)) continue; } - // ʿ ų ų ų ʿ 쿣 üũָ ȵȴ. + // ÇÊ¿äÇÑ ½ºÅ³ÀÌ ¹è¿ï ½ºÅ³°ú °°Àº ½ºÅ³ ¸Ê¿¡ ÀÖÁö ¾ÊÀ» °æ¿ì¿£ Ã¼Å©ÇØÁÖ¸é ¾ÈµÈ´Ù. else if (domain != ELEMENTAL_DOMAIN_ETC && getSkillMapID((ElementalDomain)pParentSkillInfo->getElementalDomain()) != getSkillMapID((ElementalDomain)domain)) diff --git a/src/Core/CGLogout.h b/src/Core/CGLogout.h index 3d03973f..a4c9f5de 100644 --- a/src/Core/CGLogout.h +++ b/src/Core/CGLogout.h @@ -17,9 +17,9 @@ // // class CGLogout; // -// Ŭ̾Ʈ α׾ƿ ˸ Ŷ̴. -// data field getSize() 0 ϸ, read(), write() -// ޽ ƹ ҵ ʴ´. +// 클라이언트가 서버에게 로그아웃을 알리는 패킷이다. +// data field 가 없기 때문에 getSize()는 0 을 리턴하며, read(), write() +// 메쏘드는 아무런 역할도 하지 않는다. // ////////////////////////////////////////////////////////////////////// @@ -27,10 +27,10 @@ class CGLogout : public Packet { public: CGLogout() {}; ~CGLogout() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGLogoutHandler.cpp b/src/Core/CGLogoutHandler.cpp index 4861b15c..70e41388 100644 --- a/src/Core/CGLogoutHandler.cpp +++ b/src/Core/CGLogoutHandler.cpp @@ -34,8 +34,8 @@ ////////////////////////////////////////////////////////////////////////////// -// Ŭ̾Ʈ CGLogout Ŷ , ũó ϰ, -// ũó DB , Ѵ. +// 클라이언트가 CGLogout 패킷을 보내면, 게임 서버는 크리처를 존에서 삭제하고, +// 크리처와 아이템 정보를 DB에 저장한 후, 접속을 종료한다. ////////////////////////////////////////////////////////////////////////////// void CGLogoutHandler::execute(CGLogout* pPacket, Player* pPlayer) @@ -47,8 +47,8 @@ void CGLogoutHandler::execute(CGLogout* pPacket, Player* pPlayer) // Assert(pPacket != NULL); Assert(pPlayer != NULL); - // α Logout ϸ · Ѵ. - // Logout Ŷ ÷̾ IncomingPlayerManager . + // 새로그인 구조에서는 Logout을 하면 대기 상태로 나가야 한다. + // Logout 패킷을 받으면 플레이어를 IncomingPlayerManager로 보낸다. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); // cout << "CGLogoutHandler: " << pGamePlayer->getID() << endl; @@ -62,11 +62,11 @@ void CGLogoutHandler::execute(CGLogout* pPacket, Player* pPlayer) Assert(pZone != NULL); - // α׸ . + // 나는 나간다 라고 로그를 남긴다. pGamePlayer->logLoginoutDateTime(); try { - // α׾ƿҶ , ߸. + // 로그아웃할때 성물, 피의 성서 조각을 떨어뜨린다. // bool bSendPacket = false; // dropRelicToZone( pCreature, bSendPacket ); @@ -76,7 +76,7 @@ void CGLogoutHandler::execute(CGLogout* pPacket, Player* pPlayer) if (g_pConfig->hasKey("Hardcore") && g_pConfig->getPropertyInt("Hardcore") != 0 && pPacket == NULL) { } else { - // ũó Ѵ. + // 크리처의 정보를 저장한다. pCreature->save(); if (pCreature->isSlayer()) { @@ -91,16 +91,16 @@ void CGLogoutHandler::execute(CGLogout* pPacket, Player* pPlayer) } ////////////////////////////////////////////////////////////// - // ÷̾ COMA( ) α׾ƿ ڵ - // Ȱġ ij͸ ̵Ų. - // Login/Logout ݺ Ȱ ϰ + // 플레이어가 COMA상태(현재 죽은 상태)라면 로그아웃시 자동으로 + // 부활위치로 캐릭터를 이동시킨다. + // Login/Logout의 반복으로 부활기술을 사용하지 못하게 함 // - // Creature DB Ʈ Ʈ Ѵ. + // Creature의 정보를 먼저 DB에 업데이트한 후 새로 업데이트를 한다. ////////////////////////////////////////////////////////////// - // ʹƼ ѹ · α׾ƿϸ Ȱ ġ 󰣴. + // 이터니티를 한번 쓴 상태로 로그아웃하면 부활 위치로 날라간다. if (pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || pCreature->isFlag(Effect::EFFECT_CLASS_ETERNITY)) { - // cout << "COMA ¿ α׾ƿ" << endl; + // cout << "COMA 상태에서 로그아웃했음" << endl; ZoneID_t ZoneID = 0; ZoneCoord_t ZoneX = 0; @@ -189,7 +189,7 @@ void CGLogoutHandler::execute(CGLogout* pPacket, Player* pPlayer) throw Error("Critical Error: ResurrectInfo is not established"); } } - // Ѵ. + // 이제 정보를 저장한다. char pField[80]; sprintf(pField, "ZoneID=%d, XCoord=%d, YCoord=%d, CurrentHP=HP", ZoneID, ZoneX, ZoneY); pVampire->tinysave(pField); @@ -199,26 +199,26 @@ void CGLogoutHandler::execute(CGLogout* pPacket, Player* pPlayer) // - // , PC Ѵ. + // 이제, 존에서 PC를 삭제한다. // // *CAUTION* // - // pCreature ǥ pCreature ϴ Ÿ ǥ ƾ Ѵ. - // , ޽带 ȣϱ ǥ ٲ Ѵ.. + // pCreature의 좌표가 실제로 pCreature가 존재하는 타일의 좌표와 같아야 한다. + // 따라서, 이 메쏘드를 호출하기 전에 좌표를 잘 바꿔놔야 한당.. // pZone->deleteCreature(pCreature, pCreature->getX(), pCreature->getY()); ////cout << "PC deleted from Zone >> "; - // ׷ ZPM ÷̾ Ѵ. - // ZonePlayerManager ProcessCommand ȿ ̹Ƿ ݵ NoBlocked Ѵ. + // 존그룹의 ZPM에서 플레이어를 삭제한다. + // ZonePlayerManager의 ProcessCommand 안에서 지우는 것이므로 반드시 NoBlocked 으로 지워야 한다. pZone->getZoneGroup()->getZonePlayerManager()->deletePlayer(pGamePlayer->getSocket()->getSOCKET()); - // IPM ÷̾ ű. + // IPM으로 플레이어를 옮긴다. // g_pIncomingPlayerManager->pushPlayer(pGamePlayer); - // Core ٲٸ鼭 ϱ Ͽ ڿ Ѳ óϱ ؼ - // OutList ִ´. + // Core의 구조를 바꾸면서 쓰레드로 부터 독립적으로 행하기 위하여 뒤에 한꺼번에 처리하기 위해서 + // OutList로 넣는다. pZone->getZoneGroup()->getZonePlayerManager()->pushOutPlayer(pGamePlayer); ////cout << "Move PC to IPM >> "; @@ -226,8 +226,8 @@ void CGLogoutHandler::execute(CGLogout* pPacket, Player* pPlayer) throw DisconnectException(); } - // α GLIncomingConnection . - // PlayerName ClientIP Ǿ . + // 로그인 서버로 GLIncomingConnection을 보낸다. + // PlayerName과 ClientIP를 같이 실어서 보낸다. // add by zdj GLIncomingConnection glIncomingConnection; glIncomingConnection.setPlayerID(pGamePlayer->getID()); diff --git a/src/Core/CGLotterySelect.h b/src/Core/CGLotterySelect.h index e8789e3b..6de6a2fe 100644 --- a/src/Core/CGLotterySelect.h +++ b/src/Core/CGLotterySelect.h @@ -16,9 +16,9 @@ #include "Types.h" enum { - TYPE_SELECT_LOTTERY = 0, // - TYPE_FINISH_SCRATCH, // Ϸ - TYPE_OVER_ENDING, // + TYPE_SELECT_LOTTERY = 0, // 복권 선택 + TYPE_FINISH_SCRATCH, // 복권 긁음 완료 + TYPE_OVER_ENDING, // 엔딩 종료 TYPE_MAX, }; @@ -34,10 +34,10 @@ class CGLotterySelect : public Packet { public: CGLotterySelect() {}; ~CGLotterySelect() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGMakeItem.h b/src/Core/CGMakeItem.h index 491fb305..df6d0f30 100644 --- a/src/Core/CGMakeItem.h +++ b/src/Core/CGMakeItem.h @@ -29,10 +29,10 @@ class CGMakeItem : public Packet { ~CGMakeItem(); public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -45,7 +45,7 @@ class CGMakeItem : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CGMakeItemPacketSize ؼ ϶. + // const static CGMakeItemPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szItemClass + szItemType; } @@ -106,7 +106,7 @@ class CGMakeItemFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGMakeItemPacketSize ؼ ϶. + // const static CGMakeItemPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szItemClass + szItemType; } diff --git a/src/Core/CGMixItem.cpp b/src/Core/CGMixItem.cpp index d2728cba..6c7b1b7c 100644 --- a/src/Core/CGMixItem.cpp +++ b/src/Core/CGMixItem.cpp @@ -3,8 +3,8 @@ // Filename : CGMixItem.cpp // Written By : excel96 // Description : -// κ丮 , Ŭ̾Ʈ X, Y ObjectID -// Ŭ , ̿ ´ ڵ带 óѴ. +// 인벤토리 안의 아이템을 사용할 때, 클라이언트가 X, Y 및 ObjectID를 +// 보내면 아이템 클래스에 따라서, 서버가 이에 맞는 코드를 처리한다. ////////////////////////////////////////////////////////////////////////////// #include "CGMixItem.h" diff --git a/src/Core/CGMixItem.h b/src/Core/CGMixItem.h index 37d33d46..2840e236 100644 --- a/src/Core/CGMixItem.h +++ b/src/Core/CGMixItem.h @@ -2,8 +2,8 @@ // Filename : CGMixItem.h // Written By : excel96 // Description : -// κ丮 , Ŭ̾Ʈ X, Y ObjectID -// Ŭ , ̿ ´ ڵ带 óѴ. +// 인벤토리 안의 아이템을 사용할 때, 클라이언트가 X, Y 및 ObjectID를 +// 보내면 아이템 클래스에 따라서, 서버가 이에 맞는 코드를 처리한다. ////////////////////////////////////////////////////////////////////////////// #ifndef __CG_MIX_ITEM_H__ @@ -67,11 +67,11 @@ class CGMixItem : public Packet { } private: - ObjectID_t m_ObjectID; // object id - CoordInven_t m_InvenX; // κ丮 ǥ X - CoordInven_t m_InvenY; // κ丮 ǥ Y + ObjectID_t m_ObjectID; // 아이템의 object id + CoordInven_t m_InvenX; // 아이템의 인벤토리 좌표 X + CoordInven_t m_InvenY; // 아이템의 인벤토리 좌표 Y - ObjectID_t m_TargetObjectID[2]; // ĥ Ʈ ID + ObjectID_t m_TargetObjectID[2]; // 합칠 두 아이템의 오브젝트 ID }; diff --git a/src/Core/CGMixItemHandler.cpp b/src/Core/CGMixItemHandler.cpp index df210c9e..ca8c815b 100644 --- a/src/Core/CGMixItemHandler.cpp +++ b/src/Core/CGMixItemHandler.cpp @@ -55,9 +55,9 @@ void CGMixItemHandler::execute(CGMixItem* pPacket, Player* pPlayer) CoordInven_t InvenX = pPacket->getX(); CoordInven_t InvenY = pPacket->getY(); - // cout << "Ŷ : " << pPacket->toString() << endl; + // cout << "패킷날라옴 : " << pPacket->toString() << endl; - // κ丮 ǥ Ѿ ̶ ȴ. + // 인벤토리 좌표를 넘어가는 영역이라면 안 된다. if (InvenX >= pInventory->getWidth() || InvenY >= pInventory->getHeight()) { sendCannotUse(pPacket, pPlayer); return; @@ -65,25 +65,25 @@ void CGMixItemHandler::execute(CGMixItem* pPacket, Player* pPlayer) Item* pItem = pPC->findItemOID(pPacket->getObjectID()); - // // κ丮 ٸ . + // // 인벤토리에 그 아이템이 없다면 에러다. // Item* pItem = pInventory->getItem(InvenX, InvenY); if (pItem == NULL) { sendCannotUse(pPacket, pPlayer); return; } - // κ丮 ִ Object ޴´. + // 인벤토리에 있는 아이템의 Object를 받는다. // ObjectID_t ItemObjectID = pItem->getObjectID(); - // OID ġ ʰų, ̶ . + // OID가 일치하지 않거나, 사용할 수 없는 아이템이라면 에러다. // if (ItemObjectID != pPacket->getObjectID()) // { - // //cout << " Ұ. Ʈ Ƶ ´..." << endl; + // //cout << "아템 사용 불가. 옵젝트 아디가 안 맞던가..." << endl; // sendCannotUse( pPacket, pPlayer ); // return; // } - // ͽ ƴϸ ȵȴ -_- + // 믹싱 포지가 아니면 안된다 -_- if (pItem->getItemClass() != Item::ITEM_CLASS_MIXING_ITEM) { sendCannotUse(pPacket, pPlayer); return; @@ -279,7 +279,7 @@ void CGMixItemHandler::executeMix(CGMixItem* pPacket, Player* pPlayer, Item* pIt } pTargetItem1->addOptionType(option2); - // pTargetItem1 ̳ pTargetItem2 ϳ Ÿ ͵ + // pTargetItem1 이나 pTargetItem2 중 하나라도 남기는 거면 만들어지는 것도 남긴다 pTargetItem1->setTraceItem(pTargetItem1->isTraceItem() || pTargetItem2->isTraceItem()); pTargetItem1->setGrade(TargetGrade); @@ -456,7 +456,7 @@ void CGMixItemHandler::executeDetach(CGMixItem* pPacket, Player* pPlayer, Item* list oList = pTargetItem->getOptionTypeList(); Assert(oList.size() == 2); - // optionNo 0 ƴϸ 1̴. ( üũߴ.) + // optionNo는 0 아니면 1이다. (위에서 체크했다.) if (optionNo == 0) oList.pop_front(); else @@ -473,7 +473,7 @@ void CGMixItemHandler::executeDetach(CGMixItem* pPacket, Player* pPlayer, Item* // pInventory->deleteItem( pItem->getObjectID() ); Assert(pItem == pPC->getExtraInventorySlotItem()); - // ɼ 콺 ִ. + // 옵션 떼내는 아템은 마우스 위에 있다. 없음말고 pPC->deleteItemFromExtraInventorySlot(); if (pItem->isTraceItem()) { remainTraceLog(pItem, pPC->getName(), "Furitas", ITEM_LOG_DELETE, DETAIL_ENCHANT); @@ -579,18 +579,18 @@ void CGMixItemHandler::executeClearOption(CGMixItem* pPacket, Player* pPlayer, I return; } - // ɼ ֹ. + // 이제 옵션을 없애버린다. oList.clear(); pTargetItem->setOptionType(oList); - // ɼ ٰ DB Ѵ + // 옵션이 없다고 DB에 저장한다 pTargetItem->tinysave("OptionType=''"); pTargetItem->setTraceItem(bTraceLog(pTargetItem)); // pInventory->deleteItem( pItem->getObjectID() ); Assert(pItem == pPC->getExtraInventorySlotItem()); - // ɼ 콺 ִ. + // 옵션 떼내는 아템은 마우스 위에 있다. 없음말고 pPC->deleteItemFromExtraInventorySlot(); if (pItem->isTraceItem()) { remainTraceLog(pItem, pPC->getName(), "ClearOption", ITEM_LOG_DELETE, DETAIL_ENCHANT); diff --git a/src/Core/CGModifyGuildIntro.h b/src/Core/CGModifyGuildIntro.h index 919afb0d..27d844d7 100644 --- a/src/Core/CGModifyGuildIntro.h +++ b/src/Core/CGModifyGuildIntro.h @@ -25,10 +25,10 @@ class CGModifyGuildIntro : public Packet { public: CGModifyGuildIntro() {}; ~CGModifyGuildIntro() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGModifyGuildIntroHandler.cpp b/src/Core/CGModifyGuildIntroHandler.cpp index 87d7b9fe..e1bc6003 100644 --- a/src/Core/CGModifyGuildIntroHandler.cpp +++ b/src/Core/CGModifyGuildIntroHandler.cpp @@ -39,23 +39,23 @@ void CGModifyGuildIntroHandler::execute(CGModifyGuildIntro* pPacket, Player* pPl PlayerCreature* pPlayerCreature = dynamic_cast(pCreature); Assert(pPlayerCreature != NULL); - // 带 ´. + // 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); if (pGuild == NULL) return; - // ´. + // 길드 멤버 정보를 가져온다. GuildMember* pGuildMember = pGuild->getMember(pPlayerCreature->getName()); if (pGuildMember == NULL) return; - // ̾ Ѵ. + // 길드 마스터 이어야 한다. if (pGuild->getMaster() != pPlayerCreature->getName()) return; if (pGuildMember->getRank() != GuildMember::GUILDMEMBER_RANK_MASTER) return; - // Intro Ŷ . + // 길드 Intro 수정 패킷을 쉐어드 서버로 보낸다. GSModifyGuildIntro gsModifyGuildIntro; gsModifyGuildIntro.setGuildID(pGuild->getID()); gsModifyGuildIntro.setGuildIntro(pPacket->getGuildIntro()); diff --git a/src/Core/CGModifyGuildMember.h b/src/Core/CGModifyGuildMember.h index f074f5c4..fdb2e6f4 100644 --- a/src/Core/CGModifyGuildMember.h +++ b/src/Core/CGModifyGuildMember.h @@ -25,10 +25,10 @@ class CGModifyGuildMember : public Packet { public: CGModifyGuildMember() {}; ~CGModifyGuildMember() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGModifyGuildMemberHandler.cpp b/src/Core/CGModifyGuildMemberHandler.cpp index 6639cc01..8712b159 100644 --- a/src/Core/CGModifyGuildMemberHandler.cpp +++ b/src/Core/CGModifyGuildMemberHandler.cpp @@ -44,13 +44,13 @@ void CGModifyGuildMemberHandler::execute(CGModifyGuildMember* pPacket, Player* p PlayerCreature* pPlayerCreature = dynamic_cast(pCreature); Assert(pPlayerCreature != NULL); - // 带 ´. + // 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPlayerCreature->getGuildID()); // try { Assert(pGuild != NULL); } catch (Throwable& t ) { return; } if (pGuild == NULL) return; - // ´. + // 길드 멤버 정보를 가져온다. GuildMember* pGuildMember = pGuild->getMember(pPlayerCreature->getName()); // try { Assert(pGuild != NULL); } catch (Throwable& t ) { return; } if (pGuildMember == NULL) @@ -60,10 +60,10 @@ void CGModifyGuildMemberHandler::execute(CGModifyGuildMember* pPacket, Player* p if (pPacket->getGuildMemberRank() == GuildMember::GUILDMEMBER_RANK_DENY) { //////////////////////////////////////////////////////// - // ߹Ѵ. + // 길드 멤버를 추방한다. //////////////////////////////////////////////////////// - // Ͱ ƴϸ ߹ . + // 마스터가 아니면 추방할 수 없다. if (pGuildMember->getRank() != GuildMember::GUILDMEMBER_RANK_MASTER) return; @@ -91,10 +91,10 @@ void CGModifyGuildMemberHandler::execute(CGModifyGuildMember* pPacket, Player* p return; } /////////////////////////////////////////////////////// - // Ѵ. + // 길드 가입을 승인한다. /////////////////////////////////////////////////////// - // ͳ 긶 ̾ Ѵ. + // 마스터나 서브마스터 이어야 한다. if (pGuildMember->getRank() != GuildMember::GUILDMEMBER_RANK_MASTER && pGuildMember->getRank() != GuildMember::GUILDMEMBER_RANK_SUBMASTER) return; diff --git a/src/Core/CGModifyGuildMemberIntro.h b/src/Core/CGModifyGuildMemberIntro.h index ee4f23ee..a93b7ba8 100644 --- a/src/Core/CGModifyGuildMemberIntro.h +++ b/src/Core/CGModifyGuildMemberIntro.h @@ -25,10 +25,10 @@ class CGModifyGuildMemberIntro : public Packet { public: CGModifyGuildMemberIntro() {}; ~CGModifyGuildMemberIntro() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGModifyGuildMemberIntroHandler.cpp b/src/Core/CGModifyGuildMemberIntroHandler.cpp index 241c9fc3..5393aba4 100644 --- a/src/Core/CGModifyGuildMemberIntroHandler.cpp +++ b/src/Core/CGModifyGuildMemberIntroHandler.cpp @@ -37,12 +37,12 @@ void CGModifyGuildMemberIntroHandler::execute(CGModifyGuildMemberIntro* pPacket, PlayerCreature* pPlayerCreature = dynamic_cast(pCreature); Assert(pPlayerCreature != NULL); - // 带 ´. + // 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPlayerCreature->getGuildID()); if (pGuild == NULL) return; - // ´. + // 길드 멤버 정보를 가져온다. GuildMember* pGuildMember = pGuild->getMember(pPlayerCreature->getName()); if (pGuildMember == NULL) return; diff --git a/src/Core/CGModifyNicknameHandler.cpp b/src/Core/CGModifyNicknameHandler.cpp index 63ab73c5..f385bdc2 100644 --- a/src/Core/CGModifyNicknameHandler.cpp +++ b/src/Core/CGModifyNicknameHandler.cpp @@ -71,7 +71,7 @@ void CGModifyNicknameHandler::execute(CGModifyNickname* pPacket, Player* pPlayer pItem = dynamic_cast(pInventory->getItemWithObjectID(itemOID)); if (pItem == NULL) { - filelog("Nickname.log", "[%s:%s] ų EventGiftBox ƴմϴ.", pPlayer->getID().c_str(), + filelog("Nickname.log", "[%s:%s] 아이템이 없거나 EventGiftBox가 아닙니다.", pPlayer->getID().c_str(), pPC->getName().c_str()); gcNV.setCode(NICKNAME_MODIFY_FAIL_NO_ITEM); @@ -96,7 +96,7 @@ void CGModifyNicknameHandler::execute(CGModifyNickname* pPacket, Player* pPlayer } switch (pItem->getItemType()) { - // г ٲٱ + // 펫 닉네임 바꾸기 case 23: { PetInfo* pPetInfo = pPC->getPetInfo(); if (pPetInfo == NULL) { @@ -130,7 +130,7 @@ void CGModifyNicknameHandler::execute(CGModifyNickname* pPacket, Player* pPlayer return; } - // Ŀ г ٲٱ + // 커스텀 닉네임 바꾸기 case 22: case 25: { NicknameInfo* pNickname = pPC->getNicknameBook()->getNicknameInfo(0); @@ -184,7 +184,7 @@ void CGModifyNicknameHandler::execute(CGModifyNickname* pPacket, Player* pPlayer break; } - // г ߰ϱ + // 닉네임 추가하기 case 24: { if (pItem == NULL) { gcNV.setCode(NICKNAME_MODIFY_FAIL_NO_ITEM); diff --git a/src/Core/CGModifyTaxRatio.h b/src/Core/CGModifyTaxRatio.h index a15094fc..34202b72 100644 --- a/src/Core/CGModifyTaxRatio.h +++ b/src/Core/CGModifyTaxRatio.h @@ -25,10 +25,10 @@ class CGModifyTaxRatio : public Packet { public: CGModifyTaxRatio() {}; ~CGModifyTaxRatio() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGModifyTaxRatioHandler.cpp b/src/Core/CGModifyTaxRatioHandler.cpp index d46dfb7e..33396f14 100644 --- a/src/Core/CGModifyTaxRatioHandler.cpp +++ b/src/Core/CGModifyTaxRatioHandler.cpp @@ -36,7 +36,7 @@ void CGModifyTaxRatioHandler::execute(CGModifyTaxRatio* pPacket, Player* pPlayer #ifdef __OLD_GUILD_WAR__ GCSystemMessage gcSM; - gcSM.setMessage(" ʴ Դϴ."); + gcSM.setMessage("아직 지원되지 않는 기능입니다."); pGamePlayer->sendPacket(&gcSM); return; #endif @@ -63,8 +63,8 @@ void CGModifyTaxRatioHandler::execute(CGModifyTaxRatio* pPacket, Player* pPlayer } } - if (!g_pGuildManager->isGuildMaster(guildID, pPC) // Ͱ ƴϴ. - || !bOwner // ÷̾ 尡 ƴϴ. + if (!g_pGuildManager->isGuildMaster(guildID, pPC) // 길드 마스터가 아니다. + || !bOwner // 이 플레이어의 길드가 점령한 성이 아니다. || pPacket->getRatio() > 10) { GCNPCResponse fail; fail.setCode(NPC_RESPONSE_MODIFY_TAX_RATIO_FAIL); diff --git a/src/Core/CGMouseToStash.h b/src/Core/CGMouseToStash.h index 8c05fee7..a74f0d01 100644 --- a/src/Core/CGMouseToStash.h +++ b/src/Core/CGMouseToStash.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CGMouseToStash.h -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGMouseToStashHandler.cpp b/src/Core/CGMouseToStashHandler.cpp index ce97cf76..d016f835 100644 --- a/src/Core/CGMouseToStashHandler.cpp +++ b/src/Core/CGMouseToStashHandler.cpp @@ -46,9 +46,9 @@ void CGMouseToStashHandler::execute(CGMouseToStash* pPacket, Player* pPlayer) Item* pMouseItem = pPC->getExtraInventorySlotItem(); bool Success = false; - // 콺 ޷ֳ? - // ũ Կ ִ´. - // canPutInStash extract 2003. 3. 3 + // 마우스에 아이템이 달려있나? + // 유니크 아이템은 보관함에 못 넣는다. + // canPutInStash로 extract 2003. 3. 3 if (pMouseItem == NULL || !canPutInStash(pMouseItem) // || pMouseItem->isUnique()) ) { @@ -62,8 +62,8 @@ void CGMouseToStashHandler::execute(CGMouseToStash* pPacket, Player* pPlayer) BYTE rack = pPacket->getRack(); BYTE index = pPacket->getIndex(); - // ǥΰ? Ʈ ̵ ġϳ? - // Relic Կ . + // 정상적인 좌표값인가? 오브젝트 아이디는 일치하나? + // Relic은 보관함에 저장될 수 없다. if (rack >= STASH_RACK_MAX || index >= STASH_INDEX_MAX || rack >= pPC->getStashNum() || MouseItemOID != pPacket->getObjectID()) { GCCannotAdd _GCCannotAdd; @@ -72,12 +72,12 @@ void CGMouseToStashHandler::execute(CGMouseToStash* pPacket, Player* pPlayer) return; } - // Stash Slot Item ޾ƿ´. + // 넣을려는 Stash Slot의 Item을 받아온다. Item* pStashItem = pStash->get(rack, index); - // ҿ ִٸ + // 그 장소에 아이템이 있다면 if (pStashItem != NULL) { - // Ŭ ڸ ÷ ְ 콺 ִ ش. + // 아이템 클래스가 같을때 숫자를 올려 주고 마우스에 있는 것은 없앤다. if (isSameItem(pMouseItem, pStashItem) && isStackable(pMouseItem)) { int MaxStack = ItemMaxStack[pMouseItem->getItemClass()]; @@ -88,15 +88,15 @@ void CGMouseToStashHandler::execute(CGMouseToStash* pPacket, Player* pPlayer) pStashItem->setNum(MaxStack); pMouseItem->setNum(AddNum + CurrentNum - MaxStack); - // ٲ DB Ѵ. + // 바뀐 정보를 DB에 저장한다. // pStashItem->save(pPC->getName(), STORAGE_STASH, 0, rack, index); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Num=%d, Storage=%d, X=%d, Y=%d", MaxStack, STORAGE_STASH, rack, index); pStashItem->tinysave(pField); // pMouseItem->save(pPC->getName(), STORAGE_EXTRASLOT, 0, 0, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Num=%d, Storage=%d", pMouseItem->getNum(), STORAGE_EXTRASLOT); pMouseItem->tinysave(pField); @@ -110,7 +110,7 @@ void CGMouseToStashHandler::execute(CGMouseToStash* pPacket, Player* pPlayer) pStashItem->setNum(pStashItem->getNum() + pMouseItem->getNum()); // pStashItem->save(pPC->getName(), STORAGE_STASH, 0, rack, index); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Num=%d, Storage=%d, X=%d, Y=%d", pStashItem->getNum(), STORAGE_STASH, rack, index); pStashItem->tinysave(pField); @@ -118,35 +118,35 @@ void CGMouseToStashHandler::execute(CGMouseToStash* pPacket, Player* pPlayer) // log(LOG_STASH_ADD_ITEM, pPC->getName(), "", pMouseItem->toString()); - // ΰ ϳ Ǿϱ, - // ϶ ش. + // 두개의 아이템이 하나로 되었으니까, + // 더하라고 온 아이템은 삭제해 준다. pMouseItem->destroy(); SAFE_DELETE(pMouseItem); Success = true; } - } else // Ŭ ٸų, ̴ ƴ϶. + } else // 아이템 클래스가 다르거나, 쌓이는 아이템이 아니라면. { - // Կ ִ 콺 ޾ش. + // 보관함에 있던 것을 마우스에 달아준다. pPC->deleteItemFromExtraInventorySlot(); pPC->addItemToExtraInventorySlot(pStashItem); // pStashItem->whenPCTake(pPC); - // Stash 콺 ޷ִ ִ´. + // Stash에 마우스에 달려있던 아이템을 넣는다. pStash->remove(rack, index); pStash->insert(rack, index, pMouseItem); // pMouseItem->whenPCLost(pPC); // pStashItem->save(pPC->getName(), STORAGE_EXTRASLOT, 0, 0, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d", STORAGE_EXTRASLOT); pStashItem->tinysave(pField); // pMouseItem->save(pPC->getName(), STORAGE_STASH, 0, rack, index); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Storage=%d, X=%d, Y=%d", STORAGE_STASH, rack, index); pMouseItem->tinysave(pField); @@ -155,14 +155,14 @@ void CGMouseToStashHandler::execute(CGMouseToStash* pPacket, Player* pPlayer) Success = true; } - } else // ҿ ٸ. + } else // 그 장소에 아이템이 없다면. { - // Stash Ư ִ´. + // Stash에 특정 아이템을 넣는다. pStash->insert(rack, index, pMouseItem); pPC->deleteItemFromExtraInventorySlot(); // pMouseItem->whenPCLost(pPC); // pMouseItem->save(pPC->getName(), STORAGE_STASH, 0, rack, index); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d, X=%d, Y=%d", STORAGE_STASH, rack, index); pMouseItem->tinysave(pField); diff --git a/src/Core/CGMove.h b/src/Core/CGMove.h index 3daeb3f5..b1625960 100644 --- a/src/Core/CGMove.h +++ b/src/Core/CGMove.h @@ -24,10 +24,10 @@ class CGMove : public Packet { public: CGMove() {}; ~CGMove() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -40,7 +40,7 @@ class CGMove : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CGMovePacketSize ؼ ϶. + // const static CGMovePacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szCoord + szCoord + szDir; } @@ -79,9 +79,9 @@ class CGMove : public Packet { } private: - Coord_t m_X; // X ǥ - Coord_t m_Y; // Y ǥ - Dir_t m_Dir; // + Coord_t m_X; // X 좌표 + Coord_t m_Y; // Y 좌표 + Dir_t m_Dir; // 방향 }; @@ -112,7 +112,7 @@ class CGMoveFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGMovePacketSize ؼ ϶. + // const static CGMovePacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szCoord + szCoord + szDir; } diff --git a/src/Core/CGNPCAskAnswer.h b/src/Core/CGNPCAskAnswer.h index 2712ef57..6c5292b6 100644 --- a/src/Core/CGNPCAskAnswer.h +++ b/src/Core/CGNPCAskAnswer.h @@ -1,7 +1,7 @@ //-------------------------------------------------------------------------------- // // Filename : CGNPCAskAnswer.h -// Written By : 輺 +// Written By : 김성민 // //-------------------------------------------------------------------------------- @@ -22,10 +22,10 @@ class CGNPCAskAnswer : public Packet { public: CGNPCAskAnswer() {}; ~CGNPCAskAnswer() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -38,7 +38,7 @@ class CGNPCAskAnswer : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CGNPCAskAnswerPacketSize ؼ ϶. + // const static CGNPCAskAnswerPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szObjectID + szScriptID + szAnswerID; } @@ -109,7 +109,7 @@ class CGNPCAskAnswerFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGNPCAskAnswerPacketSize ؼ ϶. + // const static CGNPCAskAnswerPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szScriptID + szAnswerID; } diff --git a/src/Core/CGNPCAskAnswerHandler.cpp b/src/Core/CGNPCAskAnswerHandler.cpp index 020cc698..4d733f35 100644 --- a/src/Core/CGNPCAskAnswerHandler.cpp +++ b/src/Core/CGNPCAskAnswerHandler.cpp @@ -19,10 +19,10 @@ #endif ////////////////////////////////////////////////////////////////////////////// -// ÷̾ NPC Ŭ , Ŭ̾Ʈ CGNPCAskAnswer Ŷ -// Ѵ. Ŷ ڵ鸵 , -// NPC CONDITION_TALKED_BY ÷װ , -// ƮŸ Žϸ鼭 ƮŸ ãƼ ׼ Ѵ. +// 플레이어가 NPC를 클릭할 경우, 클라이언트가 CGNPCAskAnswer 패킷을 +// 서버로 전송한다. 서버는 이 패킷을 핸들링할 때, +// NPC에 CONDITION_TALKED_BY 컨디션 플래그가 켜져 있으면, +// 트리거를 탐색하면서 적절한 트리거를 찾아서 연관된 액션을 실행한다. ////////////////////////////////////////////////////////////////////////////// void CGNPCAskAnswerHandler::execute(CGNPCAskAnswer* pPacket, Player* pPlayer) @@ -53,13 +53,13 @@ void CGNPCAskAnswerHandler::execute(CGNPCAskAnswer* pPacket, Player* pPlayer) } catch (NoSuchElementException) { - //cout << " NPC ~" << endl; + //cout << "여기 NPC 없다~" << endl; pCreature = NULL; } */ // cout << pPacket->toString().c_str() << endl; - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 pCreature = pZone->getCreature(pPacket->getObjectID()); if (pCreature == NULL || !pCreature->isNPC()) { @@ -93,7 +93,7 @@ void CGNPCAskAnswerHandler::execute(CGNPCAskAnswer* pPacket, Player* pPlayer) // check all condition after check main condition if (pTrigger->hasCondition(Condition::CONDITION_ANSWERED_BY) && pTrigger->isAllSatisfied(Trigger::PASSIVE_TRIGGER, pNPC, pPC, (void*)&cond)) { - // ʷ ߰ߵ ƮŸ break Ѵ. + // 최초로 발견된 트리거만 실행한 다음 break 한다. pTrigger->activate(pNPC, pPC); break; } diff --git a/src/Core/CGNPCTalk.h b/src/Core/CGNPCTalk.h index e9b9c748..38ae54f3 100644 --- a/src/Core/CGNPCTalk.h +++ b/src/Core/CGNPCTalk.h @@ -22,10 +22,10 @@ class CGNPCTalk : public Packet { public: CGNPCTalk() {}; ~CGNPCTalk() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -38,7 +38,7 @@ class CGNPCTalk : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CGNPCTalkPacketSize ؼ ϶. + // const static CGNPCTalkPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szObjectID; } @@ -93,7 +93,7 @@ class CGNPCTalkFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGNPCTalkPacketSize ؼ ϶. + // const static CGNPCTalkPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID; } diff --git a/src/Core/CGNPCTalkHandler.cpp b/src/Core/CGNPCTalkHandler.cpp index c3f5e11b..f6778634 100644 --- a/src/Core/CGNPCTalkHandler.cpp +++ b/src/Core/CGNPCTalkHandler.cpp @@ -21,15 +21,15 @@ #endif const string DiffClanSpeech[] = { - "! ! 丮 ħؿԴ.", - "? ̰.. 丮 dz! ׳ Ƚó Ա!!", - " ? Ⱑ .. Abscede Hinc!!"}; + "경비병! 경비병! 여기 바토리의 종복들이 침입해왔다.", + "으흠? 이것은.. 바토리의 혈족들의 피냄새! 드디어 네놈들이 블라드님의 안식처까지 더럽히려 왔구나!!", + "네 놈은 누구야? 감히 여기가 어디라고.. Abscede Hinc!!"}; ////////////////////////////////////////////////////////////////////////////// -// ÷̾ NPC Ŭ , Ŭ̾Ʈ CGNPCTalk Ŷ -// Ѵ. Ŷ ڵ鸵 , NPC CONDITION_TALKED_BY -// ÷װ , ƮŸ Žϸ鼭 ƮŸ ãƼ -// ׼ Ѵ. +// 플레이어가 NPC를 클릭할 경우, 클라이언트가 CGNPCTalk 패킷을 서버로 +// 전송한다. 서버는 이 패킷을 핸들링할 때, NPC에 CONDITION_TALKED_BY +// 컨디션 플래그가 켜져 있으면, 트리거를 탐색하면서 적절한 트리거를 찾아서 +// 연관된 액션을 실행한다. ////////////////////////////////////////////////////////////////////////////// void CGNPCTalkHandler::execute(CGNPCTalk* pPacket, Player* pPlayer) @@ -46,13 +46,13 @@ void CGNPCTalkHandler::execute(CGNPCTalk* pPacket, Player* pPlayer) Assert(pPC != NULL); Zone* pZone = pPC->getZone(); - // ϴ Ŵ PC ִ ¿ Ѵ. - // ˻縦 ϴ ߵǾ ִ ̾, ð ؼ - // NPC HEAL û Ŀ, ؼ ׾, - // ϴ ٴڿ Ǵµ, ̾ NPC ؼ ġḦ ް ȴ. - // , HP Ǯε ٴڿ ְ ȴ. - // PCManager::heartbeat() killCreature  ʰ ȴٴ ̴. - // . ʴµ, Ͽư NPC ɷ ÷̾ ־ Ѵ. + // 일단 말을 거는 PC가 현재 살아있는 상태여야 한다. + // 이 검사를 하는 이유는 독에 중독되어 있는 슬레이어가, 시간 차로 인해서 + // NPC한테 HEAL을 요청한 직후에, 독에 의해서 죽어버리면, + // 일단 바닥에 쓰러지게 되는데, 곧이어 NPC에 의해서 치료를 받게 된다. + // 이 경우, HP는 풀인데 바닥에 쓰러져있게 된다. + // 이 말은 PCManager::heartbeat()에서 killCreature로 들어가지 않게 된다는 말이다. + // 음. 잘 설명이 되지 않는데, 하옇튼 NPC에게 말을 걸려면 플레이어는 살아있어야 한다. if (pPC->isDead()) { return; } @@ -66,12 +66,12 @@ void CGNPCTalkHandler::execute(CGNPCTalk* pPacket, Player* pPlayer) } catch (NoSuchElementException) { - // ׷ NPC ٸ Ѵ. + // 그런 NPC가 없다면 리턴한다. return; } */ - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 pNPCBase = pZone->getCreature(pPacket->getObjectID()); if (pNPCBase == NULL) { @@ -80,35 +80,35 @@ void CGNPCTalkHandler::execute(CGNPCTalk* pPacket, Player* pPlayer) NPC* pNPC = dynamic_cast(pNPCBase); - // ObjectID NPC ƴ ־. .. ΰ? Ŷ ΰǰ? - // ¶ ϵ. + // ObjectID가 NPC가 아닐 수도 있었다. 뭘까.. 사기인가? 패킷 꼬인건가? + // 어쨋든 무시하도록하자. // by sigi. 2002.11.25 if (pNPC == NULL) { return; } - // Ʈ ϶ ^^; + // 퀘스트로 만난 넘일때 ^^; if (pPC->getGQuestManager()->metNPC(pNPC)) { - // ϴ Ŭ̾Ʈ OKŶ . + // 일단 클라이언트를 위해 OK패킷을 함 날린다. GCNPCResponse gcNPCAskAnswer; pPlayer->sendPacket(&gcNPCAskAnswer); return; } - // ƴ NPC NP Ѵ. - // NPC ٸ. + // 아담의 성지에서는 NPC와 NP의 종족을 무시한다. + // 성에서는 종족별 NPC가 다르다. if (!pZone->isHolyLand() || pZone->isCastle()) { - // ̾ ̾ NPC ɾ 쿡 Ѵ. + // 뱀파이어가 슬레이어 NPC에게 말을 걸었을 경우에 무시한다. if (pNPC->getRace() == NPC_RACE_SLAYER && pPC->isVampire()) { - // ϴ Ŭ̾Ʈ OKŶ . + // 일단 클라이언트를 위해 OK패킷을 함 날린다. GCNPCResponse gcNPCAskAnswer; pPlayer->sendPacket(&gcNPCAskAnswer); - // ̾ ̾ NPC ɸ... + // 뱀파이어가 슬레이어 NPC에게 말을 걸면... GCNPCSayDynamic saypkt; saypkt.setObjectID(pNPC->getObjectID()); - // Event NPC ٸ Ѵ ;; + // Event 용 NPC 인 경우 다른 말을 한다 ;; if (pNPC->getNPCID() == 639) { saypkt.setMessage(g_pStringPool->c_str(STRID_EVENT_NPC_1)); } else { @@ -117,29 +117,29 @@ void CGNPCTalkHandler::execute(CGNPCTalk* pPacket, Player* pPlayer) pPlayer->sendPacket(&saypkt); return; } - // ƿ콺ͽ ̾ NPC ɾ 쿡 Ѵ. + // 아우스터스가 슬레이어 NPC에게 말을 걸었을 경우에 무시한다. else if (pNPC->getRace() == NPC_RACE_SLAYER && pPC->isOusters()) { - // ϴ Ŭ̾Ʈ OKŶ . + // 일단 클라이언트를 위해 OK패킷을 함 날린다. GCNPCResponse gcNPCAskAnswer; pPlayer->sendPacket(&gcNPCAskAnswer); - // ̾ ̾ NPC ɸ... + // 뱀파이어가 슬레이어 NPC에게 말을 걸면... GCNPCSayDynamic saypkt; saypkt.setObjectID(pNPC->getObjectID()); saypkt.setMessage(g_pStringPool->c_str(STRID_ALERT_OUSTERS_2)); pPlayer->sendPacket(&saypkt); return; } - // ̾ ̾ NPC ɾ Ѵ. + // 슬레이어가 뱀파이어 NPC에게 말을 걸어도 무시한다. else if (pNPC->getRace() == NPC_RACE_VAMPIRE && pPC->isSlayer()) { - // ϴ Ŭ̾Ʈ OKŶ . + // 일단 클라이언트를 위해 OK패킷을 함 날린다. GCNPCResponse gcNPCAskAnswer; pPlayer->sendPacket(&gcNPCAskAnswer); - // ̾ ̾ NPC ɸ... + // 슬레이어가 뱀파이어 NPC에게 말을 걸면... GCNPCSayDynamic saypkt; saypkt.setObjectID(pNPC->getObjectID()); - // Event NPC ٸ Ѵ ;; + // Event 용 NPC 인 경우 다른 말을 한다 ;; if (pNPC->getNPCID() == 638) { saypkt.setMessage(g_pStringPool->c_str(STRID_EVENT_NPC_2)); } else if (pNPC->getNPCID() == 636) { @@ -152,9 +152,9 @@ void CGNPCTalkHandler::execute(CGNPCTalk* pPacket, Player* pPlayer) pPlayer->sendPacket(&saypkt); return; } - // ƿ콺ͽ ̾ NPC ɾ Ѵ. + // 아우스터스가 뱀파이어 NPC에게 말을 걸어도 무시한다. else if (pNPC->getRace() == NPC_RACE_VAMPIRE && pPC->isOusters()) { - // ϴ Ŭ̾Ʈ OKŶ . + // 일단 클라이언트를 위해 OK패킷을 함 날린다. GCNPCResponse gcNPCAskAnswer; pPlayer->sendPacket(&gcNPCAskAnswer); @@ -164,9 +164,9 @@ void CGNPCTalkHandler::execute(CGNPCTalk* pPacket, Player* pPlayer) pPlayer->sendPacket(&saypkt); return; } - // ̾ ƿ콺ͽ NPC ɾ Ѵ. + // 슬레이어가 아우스터스 NPC에게 말을 걸어도 무시한다. else if (pNPC->getRace() == NPC_RACE_OUSTERS && pPC->isSlayer()) { - // ϴ Ŭ̾Ʈ OKŶ . + // 일단 클라이언트를 위해 OK패킷을 함 날린다. GCNPCResponse gcNPCAskAnswer; pPlayer->sendPacket(&gcNPCAskAnswer); @@ -176,9 +176,9 @@ void CGNPCTalkHandler::execute(CGNPCTalk* pPacket, Player* pPlayer) pPlayer->sendPacket(&saypkt); return; } - // ̾ ƿ콺ͽ NPC ɾ Ѵ. + // 뱀파이어가 아우스터스 NPC에게 말을 걸어도 무시한다. else if (pNPC->getRace() == NPC_RACE_OUSTERS && pPC->isVampire()) { - // ϴ Ŭ̾Ʈ OKŶ . + // 일단 클라이언트를 위해 OK패킷을 함 날린다. GCNPCResponse gcNPCAskAnswer; pPlayer->sendPacket(&gcNPCAskAnswer); @@ -190,11 +190,11 @@ void CGNPCTalkHandler::execute(CGNPCTalk* pPacket, Player* pPlayer) } } - // ̾ Ŭ ٸ NPC Ѵ. - // κ ڵ ߿ ٸ ؾ ̴. - // Ŭ ̱ ... + // 같은 뱀파이어끼리도 클랜이 다른 NPC일 경우 무시한다. + // 이 부분의 코드는 나중에 다른 방법으로 출력해야 할 것이다. + // 현재는 클랜이 오직 두 가지 뿐이기 때문에... // ..... - // Ŭ Ѱ ۿ ~~ + // 클랜 한가지 밖에 엄써~~ /* if (pPC->isVampire() && pNPC->getRace() == NPC_RACE_VAMPIRE) { if (pPC->getClanType() != pNPC->getClanType()) @@ -210,7 +210,7 @@ void CGNPCTalkHandler::execute(CGNPCTalk* pPacket, Player* pPlayer) } } */ - // ÷̾ ɾ 쿡 ϴ ׼ ִٸ... + // 플레이어가 말을 걸었을 경우에 반응하는 액션이 있다면... const TriggerManager& triggerManager = pNPC->getTriggerManager(); if (triggerManager.hasCondition(Condition::CONDITION_TALKED_BY)) { const list& triggers = triggerManager.getTriggers(); @@ -221,22 +221,22 @@ void CGNPCTalkHandler::execute(CGNPCTalk* pPacket, Player* pPlayer) // check all condition after check main condition if (pTrigger->hasCondition(Condition::CONDITION_TALKED_BY) && pTrigger->isAllSatisfied(Trigger::PASSIVE_TRIGGER, pNPC, pPC)) { - // ʷ ߰ߵ ƮŸ break Ѵ. + // 최초로 발견된 트리거만 실행한 다음 break 한다. pTrigger->activate(pNPC, pPC); break; } } } - // Ŭ̾Ʈ NPC Ŭ , ٸ , - // ׷ ׼ ƹ ͵ , Ŭ̾Ʈ (?) - // ¿ ȴ. װ ϱ ؼ ȭâ ޼ ش. + // 클라이언트는 NPC를 클릭했을 경우, 무조건 서버의 응답을 기다리기 때문에, + // 그런 액션이 존재하지 않을 때 아무 것도 하지 않으면, 클라이언트가 일종의 데드락(?) + // 상태에 빠지게 된다. 그것을 방지하기 위해서 대화창을 닫으라는 메세지를 보내준다. else { GCNPCResponse gcNPCResponse; gcNPCResponse.setCode(NPC_RESPONSE_QUIT_DIALOGUE); pPlayer->sendPacket(&gcNPCResponse); } } catch (Throwable& t) { - // cerr << " NPC Ʈ ̵ ̻ϰ ֳ?" << endl; + // cerr << "누가 NPC 오브젝트 아이디를 이상하게 보내주네?" << endl; // cerr << t.toString() << endl; } diff --git a/src/Core/CGPartyInvite.h b/src/Core/CGPartyInvite.h index 3c7dc438..b13b430a 100644 --- a/src/Core/CGPartyInvite.h +++ b/src/Core/CGPartyInvite.h @@ -11,7 +11,7 @@ #include "PacketFactory.h" ////////////////////////////////////////////////////////////////////////////// -// Ƽ ڵ +// 파티 가입 관련 코드 ////////////////////////////////////////////////////////////////////////////// enum { CG_PARTY_INVITE_REQUEST = 0, @@ -61,8 +61,8 @@ class CGPartyInvite : public Packet { } private: - ObjectID_t m_TargetObjectID; // OID - BYTE m_Code; // ڵ + ObjectID_t m_TargetObjectID; // 상대방의 OID + BYTE m_Code; // 코드 }; diff --git a/src/Core/CGPartyInviteHandler.cpp b/src/Core/CGPartyInviteHandler.cpp index 55471087..14c3b416 100644 --- a/src/Core/CGPartyInviteHandler.cpp +++ b/src/Core/CGPartyInviteHandler.cpp @@ -47,13 +47,13 @@ void CGPartyInviteHandler::execute(CGPartyInvite* pPacket, Player* pPlayer) PartyInviteInfoManager* pPIIM = pZone->getPartyInviteInfoManager(); - // Ƽ Ƴ κ̴. - // 輺 + // 파티 기능 버그 때문에 막아놓은 부분이다. + // 김성민 /* pPIIM->cancelInvite(pCreature); GCSystemMessage gcSystemMessage; - gcSystemMessage.setMessage("Ƽ ׷ Ͽ ʽϴ."); + gcSystemMessage.setMessage("파티 기능은 버그로 인하여 현재 지원되지 않습니다."); pPlayer->sendPacket(&gcSystemMessage); executeError(pPacket, pPlayer, GC_PARTY_ERROR_UNKNOWN); @@ -75,7 +75,7 @@ void CGPartyInviteHandler::execute(CGPartyInvite* pPacket, Player* pPlayer) } */ - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 pTargetCreature = pZone->getCreature(TargetOID); if (pTargetCreature == NULL) { @@ -85,31 +85,31 @@ void CGPartyInviteHandler::execute(CGPartyInvite* pPacket, Player* pPlayer) } - // Ƽ ʴ PC ƴϰų, ٸ Խų . + // 파티에 초대할 놈이 PC가 아니거나, 종족이 다르면 가입시킬 수가 없다. if (!pTargetCreature->isPC() || !isSameRace(pCreature, pTargetCreature)) { pPIIM->cancelInvite(pCreature); executeError(pPacket, pPlayer, GC_PARTY_ERROR_RACE_DIFFER); return; } - // Ÿ ÷̾ ޾ƿ´. + // 타겟의 플레이어를 받아온다. // PartyInviteInfo* pInfo1 = pPIIM->getInviteInfo(pCreature->getName()); PartyInviteInfo* pInfo2 = pPIIM->getInviteInfo(pTargetCreature->getName()); Player* pTargetPlayer = pTargetCreature->getPlayer(); GCPartyInvite gcPartyInvite; - // ٸ Ƽ ԽŰ + // 다른 사람을 파티에 가입시키고자 할 때 if (CODE == CG_PARTY_INVITE_REQUEST) { // cout << "CODE:CG_PARTY_INVITE_REQUEST" << endl; - // ʴ ̹ ٸ ʴ ̶... - // A B ʴѴ. , B A 䱸 - // ޹ ¿ A ʴѴ. - // CODE CG_PARTY_INVITE_REQUESTε... - // cancalInviteع, A B ư ȴ. - // װ ϱ ּóع. - // , 𸣰ڳ... -- excel96 + // 초대한 놈이 이미 다른 놈을 초대 중이라면... + // A가 B를 초대한다. 그 다음, B가 A의 요구를 + // 전달받지 못한 상태에서 A를 초대한다. + // 이 경우 둘 다 CODE가 CG_PARTY_INVITE_REQUEST인데... + // cancalInvite해버리면, A와 B의 정보가 날아가버리게 된다. + // 그것을 방지하기 위해 주석처리해버린다. + // 음, 무슨 말인지 내가 봐도 잘 모르겠네... -- excel96 /* if (pInfo1 != NULL) { @@ -118,8 +118,8 @@ void CGPartyInviteHandler::execute(CGPartyInvite* pPacket, Player* pPlayer) } */ - // ʴ ̹ ٸ ʴ ̶... - // ٻڴϰ ʴ뿡 . + // 초대받은 놈이 이미 다른 놈과 초대 관계 중이라면... + // 바쁘니가 초대에 응할 수 없다. if (pInfo2 != NULL) { // cout << "pInfo2 != NULL" << endl; @@ -135,7 +135,7 @@ void CGPartyInviteHandler::execute(CGPartyInvite* pPacket, Player* pPlayer) // cout << "Creature" << pCreature->getName() << "] PartyID = " << PartyID << endl; // cout << "TargetCreature" << pTargetCreature->getName() << "] PartyID = " << PartyID << endl; - // ʴ ʴ ٰ Ƽ ԵǾִٸ . + // 초대한 놈과 초대받은 놈 둘 다가 파티에 가입되어있다면 가입할 수가 없다. if (PartyID != 0 && TargetPartyID != 0) { gcPartyInvite.setTargetObjectID(pPacket->getTargetObjectID()); gcPartyInvite.setCode(GC_PARTY_INVITE_ANOTHER_PARTY); @@ -143,7 +143,7 @@ void CGPartyInviteHandler::execute(CGPartyInvite* pPacket, Player* pPlayer) return; } - // ʴ Ƽ ڰ ƽ ʴ . + // 초대한 놈의 파티 숫자가 맥스라면 초대할 수 없다. if (PartyID != 0) { if (!g_pGlobalPartyManager->canAddMember(PartyID)) { gcPartyInvite.setTargetObjectID(pPacket->getTargetObjectID()); @@ -153,7 +153,7 @@ void CGPartyInviteHandler::execute(CGPartyInvite* pPacket, Player* pPlayer) } } - // ʴ Ƽ ڰ ƽ ʴ . + // 초대받은 놈의 파티 숫자가 맥스라면 초대할 수 없다. if (TargetPartyID != 0) { if (!g_pGlobalPartyManager->canAddMember(TargetPartyID)) { gcPartyInvite.setTargetObjectID(pPacket->getTargetObjectID()); @@ -165,73 +165,73 @@ void CGPartyInviteHandler::execute(CGPartyInvite* pPacket, Player* pPlayer) // cout << "Sending Packet" << endl; - // Ŷ ش. + // 패킷을 보내준다. gcPartyInvite.setTargetObjectID(pCreature->getObjectID()); gcPartyInvite.setCode(GC_PARTY_INVITE_REQUEST); pTargetPlayer->sendPacket(&gcPartyInvite); // cout << "Sent gcPartyInvite" << endl; - // ʴ Ƿ, ʴ ش. + // 둘 다 초대모드로 들어갔으므로, 초대 정보를 생성해 준다. pPIIM->initInviteInfo(pCreature, pTargetCreature); // cout << "initInviteInfo OK" << endl; } - // Ƽ û + // 파티 가입 신청을 취소할 때 else if (CODE == CG_PARTY_INVITE_CANCEL) { - // ʴ üũѴ. + // 현재 초대 중인지를 체크한다. if (pPIIM->isInviting(pCreature, pTargetCreature)) { - // Ŷ غ ش. + // 패킷을 준비해 보내준다. gcPartyInvite.setTargetObjectID(pCreature->getObjectID()); gcPartyInvite.setCode(GC_PARTY_INVITE_CANCEL); pTargetPlayer->sendPacket(&gcPartyInvite); - // ʴ븦 ҽŲ. + // 초대를 취소시킨다. pPIIM->cancelInvite(pCreature, pTargetCreature); } else { executeError(pPacket, pPlayer, GC_PARTY_ERROR_NOT_INVITING); return; } } - // Ƽ û ޾Ƶ鿴 + // 파티 가입 요청을 받아들였을 때 else if (CODE == CG_PARTY_INVITE_ACCEPT) { if (pPIIM->isInviting(pCreature, pTargetCreature)) { int PartyID = pCreature->getPartyID(); int TargetPartyID = pTargetCreature->getPartyID(); - // Ƽ ִ Ƽ ʴ ʴ - // (Ƽ , Ƽ ִ ʴ뿡 ) + // 파티에 속해 있는 놈이 파티에 속하지 않는 놈을 초대했을 때 + // (파티에 속해있지 않은 놈이, 파티에 속해 있는 놈의 초대에 응했을 때) if (TargetPartyID != 0 && PartyID == 0) { - // ۷ι Ƽ Ŵ Ѵ. + // 글로벌 파티 매니저에 멤버를 더한다. if (g_pGlobalPartyManager->addPartyMember(TargetPartyID, pCreature)) { - // Ƽ Ŵ Ѵ. + // 로컬 파티 매니저에 멤버를 더한다. LocalPartyManager* pLocalPartyManager = pZone->getLocalPartyManager(); pLocalPartyManager->addPartyMember(TargetPartyID, pCreature); } } - // Ƽ Ƽ ִ ʴ - // (Ƽ ִ , Ƽ ʴ뿡 ) - // (Ƽ ִ , ܺ 㰡 ) + // 파티에 속해있지 않은 놈이 파티에 속해있는 놈을 초대했을 때 + // (파티에 속해있는 놈이, 파티에 속해있지 않은 놈의 초대에 응했을 때) + // (파티에 속해있는 놈이, 외부인의 진입을 허가했을 때) else if (PartyID != 0 && TargetPartyID == 0) { - // ۷ι Ƽ Ŵ Ѵ. + // 글로벌 파티 매니저에 멤버를 더한다. if (g_pGlobalPartyManager->addPartyMember(PartyID, pTargetCreature)) { - // Ƽ Ŵ Ѵ. + // 로컬 파티 매니저에 멤버를 더한다. LocalPartyManager* pLocalPartyManager = pZone->getLocalPartyManager(); pLocalPartyManager->addPartyMember(PartyID, pTargetCreature); } } - // ƹ Ƽ - // (ο Ƽ ) + // 두 놈 다 아무런 파티에 속해있지 않을 때 + // (새로운 파티를 생성할 때) else { - // ο Ƽ Ѵ. + // 새로운 파티를 만들어 등록한다. int NewPartyID = g_pGlobalPartyManager->registerParty(); - // ۷ι Ƽ Ŵ ۷ι Ƽ ϰ, Ѵ. + // 글로벌 파티 매니저에 글로벌 파티를 더하고, 멤버를 더한다. g_pGlobalPartyManager->createParty(NewPartyID, pTargetCreature->getCreatureClass()); g_pGlobalPartyManager->addPartyMember(NewPartyID, pCreature); g_pGlobalPartyManager->addPartyMember(NewPartyID, pTargetCreature); - // Ƽ Ŵ Ƽ ϰ, Ѵ. + // 로컬 파티 매니저에 로컬 파티를 더하고, 멤버를 더한다. LocalPartyManager* pLocalPartyManager = pZone->getLocalPartyManager(); pLocalPartyManager->createParty(NewPartyID, pTargetCreature->getCreatureClass()); pLocalPartyManager->addPartyMember(NewPartyID, pCreature); @@ -246,22 +246,22 @@ void CGPartyInviteHandler::execute(CGPartyInvite* pPacket, Player* pPlayer) } } - // Ƽ ʴ밡 Ƿ, Ƽ ʴ ش. + // 파티 초대가 끝났으므로, 파티 초대 정보를 삭제해준다. pPIIM->cancelInvite(pCreature, pTargetCreature); } else { executeError(pPacket, pPlayer, GC_PARTY_ERROR_NOT_INVITING); return; } } - // Ƽ û ź + // 파티 가입 요청을 거부했을 때 else if (CODE == CG_PARTY_INVITE_REJECT) { if (pPIIM->isInviting(pCreature, pTargetCreature)) { - // Ŷ . + // 패킷을 보낸다. gcPartyInvite.setTargetObjectID(pCreature->getObjectID()); gcPartyInvite.setCode(GC_PARTY_INVITE_REJECT); pTargetPlayer->sendPacket(&gcPartyInvite); - // Ƽ ʴ븦 źǷ ʴ ش. + // 파티 초대를 거부했으므로 초대 정보를 삭제시켜준다. pPIIM->cancelInvite(pCreature, pTargetCreature); } else { executeError(pPacket, pPlayer, GC_PARTY_ERROR_NOT_INVITING); diff --git a/src/Core/CGPartyLeave.cpp b/src/Core/CGPartyLeave.cpp index 1ddf8674..deac756d 100644 --- a/src/Core/CGPartyLeave.cpp +++ b/src/Core/CGPartyLeave.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGPartyLeave.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGPartyLeaveHandler.cpp b/src/Core/CGPartyLeaveHandler.cpp index b6bda227..49cdd771 100644 --- a/src/Core/CGPartyLeaveHandler.cpp +++ b/src/Core/CGPartyLeaveHandler.cpp @@ -42,57 +42,57 @@ void CGPartyLeaveHandler::execute(CGPartyLeave* pPacket, Player* pPlayer) int PartyID = pCreature->getPartyID(); if (PartyID == 0) { - // filelog("PARTY_EXCEPTION.log", "CGPartyLeaveHandler::execute() : ƼID 0Դϴ. [%s]", + // filelog("PARTY_EXCEPTION.log", "CGPartyLeaveHandler::execute() : 파티ID가 0입니다. [%s]", // pCreature->toString().c_str()); throw ProtocolException(); } GCPartyError gcPartyError; - // Ÿ ̸ NULL̶ Ƽ ϴ ̴. + // 타겟 이름이 NULL이라면 스스로 파티를 떠나고자 하는 것이다. if (TargetName == "") { - // ۷ι Ƽ ش. - // 2 ¿ ٸ ϳ ߹ߴٸ, - // ο ۷ι Ƽ ȴ. - // Ƽ ID 0 ٲ. - // cout << "===== Ƽ ۷ι Ƽ Ŵ " << endl; + // 글로벌 파티에서 삭제해 준다. + // 2명인 상태에서 다른 하나를 추방했다면, + // 이 내부에서 글로벌 파티는 삭제된다. + // 남은 파티원들의 ID는 0으로 바뀐다. + // cout << "===== 파티를 떠나기 전의 글로벌 파티 매니저 상태" << endl; // cout << g_pGlobalPartyManager->toString() << endl; // cout << "================================================" << endl; g_pGlobalPartyManager->deletePartyMember(PartyID, pCreature); - // cout << "===== Ƽ ۷ι Ƽ Ŵ " << endl; + // cout << "===== 파티를 떠난 후의 글로벌 파티 매니저 상태" << endl; // cout << g_pGlobalPartyManager->toString() << endl; // cout << "================================================" << endl; - // Ƽ ش. + // 로컬 파티에서 삭제해준다. LocalPartyManager* pLocalPartyManager = pZone->getLocalPartyManager(); Assert(pLocalPartyManager != NULL); pLocalPartyManager->deletePartyMember(PartyID, pCreature); } - // ̸ ٸٸ Ƽ ϴ ٸ Ƽ ߹ϰ ϴ ̴. + // 이름이 다르다면 파티 내에 존재하는 다른 파티원을 추방하고자 하는 것이다. else { - // cout << "===== ߹ ۷ι Ƽ Ŵ " << endl; + // cout << "===== 추방전의 글로벌 파티 매니저 상태" << endl; // cout << g_pGlobalPartyManager->toString() << endl; // cout << "=======================================" << endl; - // ۷ι Ƽ ش. - // 2 ¿ ٸ ϳ ߹ߴٸ, - // ο ۷ι Ƽ ȴ. - // Ƽ ID 0 ٲ. + // 글로벌 파티에서 삭제해준다. + // 2명인 상태에서 다른 하나를 추방했다면, + // 이 내부에서 글로벌 파티는 삭제된다. + // 남은 파티원들의 ID는 0으로 바뀐다. g_pGlobalPartyManager->expelPartyMember(PartyID, pCreature, TargetName); - // cout << "===== ߹ ۷ι Ƽ Ŵ " << endl; + // cout << "===== 추방후의 글로벌 파티 매니저 상태" << endl; // cout << g_pGlobalPartyManager->toString() << endl; // cout << "=======================================" << endl; - // Ƽ ش. + // 차인 놈을 로컬 파티에서 삭제해준다. __ENTER_CRITICAL_SECTION((*g_pPCFinder)) Creature* pTargetCreature = g_pPCFinder->getCreature_LOCKED(TargetName); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { g_pPCFinder->unlock(); return; @@ -103,12 +103,12 @@ void CGPartyLeaveHandler::execute(CGPartyLeave* pPacket, Player* pPlayer) LocalPartyManager* pLocalPartyManager = pTargetZone->getLocalPartyManager(); Assert(pLocalPartyManager != NULL); - // cout << "===== ߹ Ƽ Ŵ " << endl; + // cout << "===== 추방 전의 로컬 파티 매니저 상태" << endl; // cout << pLocalPartyManager->toString() << endl; // cout << "=======================================" << endl; pLocalPartyManager->deletePartyMember(PartyID, pTargetCreature); - // cout << " Ƽ ߹ ÷̾ ߽ϴ." << endl; + // cout << "로컬 파티에서 추방당한 플레이어를 삭제했습니다." << endl; __LEAVE_CRITICAL_SECTION((*g_pPCFinder)) } diff --git a/src/Core/CGPartySay.h b/src/Core/CGPartySay.h index 7dfb2507..467e0f6f 100644 --- a/src/Core/CGPartySay.h +++ b/src/Core/CGPartySay.h @@ -31,10 +31,10 @@ class CGPartySay : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGPetGambleHandler.cpp b/src/Core/CGPetGambleHandler.cpp index 8138d0bf..a9db50e4 100644 --- a/src/Core/CGPetGambleHandler.cpp +++ b/src/Core/CGPetGambleHandler.cpp @@ -25,7 +25,7 @@ void CGPetGambleHandler::execute(CGPetGamble* pPacket, Player* pPlayer) #ifdef __GAME_SERVER__ - // cout << " Դϴ" << endl; + // cout << "펫 갬블함니당" << endl; GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Assert(pGamePlayer != NULL); @@ -52,7 +52,7 @@ void CGPetGambleHandler::execute(CGPetGamble* pPacket, Player* pPlayer) } else if (pPetInfo->getPetType() > 2) { pPetInfo->setAttack(1); } - // cout << " !" << endl; + // cout << "갬블 성공!" << endl; } pPetInfo->getPetItem()->savePetInfo(); diff --git a/src/Core/CGPhoneDisconnect.h b/src/Core/CGPhoneDisconnect.h index 0685e468..bc4656b6 100644 --- a/src/Core/CGPhoneDisconnect.h +++ b/src/Core/CGPhoneDisconnect.h @@ -29,10 +29,10 @@ class CGPhoneDisconnect : public Packet { ~CGPhoneDisconnect(); public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -45,7 +45,7 @@ class CGPhoneDisconnect : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CGPhoneDisconnectPacketSize ؼ ϶. + // const static CGPhoneDisconnectPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szSlotID; } @@ -100,7 +100,7 @@ class CGPhoneDisconnectFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGPhoneDisconnectPacketSize ؼ ϶. + // const static CGPhoneDisconnectPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szSlotID; } diff --git a/src/Core/CGPhoneDisconnectHandler.cpp b/src/Core/CGPhoneDisconnectHandler.cpp index 9eedcb15..f1a5f210 100644 --- a/src/Core/CGPhoneDisconnectHandler.cpp +++ b/src/Core/CGPhoneDisconnectHandler.cpp @@ -51,30 +51,30 @@ void CGPhoneDisconnectHandler::execute(CGPhoneDisconnect* pPacket, Player* pPlay // cout << "Disconnect PhoneSlot : " << (int)PhoneSlot << ", Phone Number : " << (int)TargetPhoneNumber << endl; - // ã.... + // 찾았으면.... if (pTargetSlayer != NULL) { pTargetPlayer = pTargetSlayer->getPlayer(); if (pTargetSlayer->isSlotByPhoneNumber(PhoneNumber)) { - // ȣ ȣ ִ ã´. + // 폰 번호로 그 번호가 들어있는 슬랏을 찾는다. TargetPhoneSlot = pTargetSlayer->getSlotWithPhoneNumber(PhoneNumber); Success = true; } } - // ã + // 정상적으로 찾고 끊었을 경우 if (Success) { - // ̹Ƿ 0 . + // 이제 끊기는 마당이므로 0 으로 양측 다 셋팅. pTargetSlayer->setPhoneSlotNumber(TargetPhoneSlot, 0); pSlayer->setPhoneSlotNumber(PhoneSlot, 0); - // Ŷ + // 끊는 사람에게 날리는 패킷 GCPhoneDisconnected gcPhoneDisconnected; gcPhoneDisconnected.setPhoneNumber(TargetPhoneNumber); gcPhoneDisconnected.setSlotID(PhoneSlot); - // Ŷ + // 상대적으로 끊기는 사람에게 날리는 패킷 GCPhoneDisconnected gcPhoneDisconnected2; gcPhoneDisconnected2.setPhoneNumber(PhoneNumber); gcPhoneDisconnected2.setSlotID(TargetPhoneSlot); @@ -84,13 +84,13 @@ void CGPhoneDisconnectHandler::execute(CGPhoneDisconnect* pPacket, Player* pPlay // cout << "Disconnected Successfull" << endl; - // -_-; + // 비정상 적일 경우 -_-; } else { - // ϵ ȭȣ Ư ̴. - // ȣ ʱȭ ش. + // 등록된 전화번호를 가진 사람이 특정 이유로 나간 상태이다. + // 따라서 등록 번호를 초기화 시켜준다. pSlayer->setPhoneSlotNumber(PhoneSlot, 0); - // Ŷ + // 끊는 사람에게 날리는 패킷 GCPhoneDisconnected gcPhoneDisconnected; gcPhoneDisconnected.setPhoneNumber(TargetPhoneNumber); gcPhoneDisconnected.setSlotID(PhoneSlot); diff --git a/src/Core/CGPhoneSay.h b/src/Core/CGPhoneSay.h index 787465a7..137f0fe7 100644 --- a/src/Core/CGPhoneSay.h +++ b/src/Core/CGPhoneSay.h @@ -17,8 +17,8 @@ // // class CGPhoneSay; // -// Ŭ̾Ʈ PhoneSay Ŷ̴. -// ο PhoneSay String Ÿ ʵ . +// 클라이언트가 서버에게 보내는 PhoneSay 패킷이다. +// 내부에 PhoneSay String 만을 데이타 필드로 가진다. // ////////////////////////////////////////////////////////////////////// @@ -26,10 +26,10 @@ class CGPhoneSay : public Packet { public: CGPhoneSay() {}; ~CGPhoneSay() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -105,7 +105,7 @@ class CGPhoneSayFactory : public PacketFactory { } // get packet's max body size - // message ִ ũ⿡ ʿϴ. + // message 의 최대 크기에 대한 설정이 필요하다. PacketSize_t getPacketMaxSize() const { return szSlotID + szBYTE + 128; } diff --git a/src/Core/CGPhoneSayHandler.cpp b/src/Core/CGPhoneSayHandler.cpp index 29d5e90e..3a0cd527 100644 --- a/src/Core/CGPhoneSayHandler.cpp +++ b/src/Core/CGPhoneSayHandler.cpp @@ -54,16 +54,16 @@ void CGPhoneSayHandler::execute(CGPhoneSay* pPacket, Player* pPlayer) } } - // ϶ Message . + // 정상적인 통신 상태일때 Message를 날린다. if (Success) { SlotID_t TargetPhoneSlot = pTargetSlayer->getSlotWithPhoneNumber(PhoneNumber); Player* pTargetPlayer = pTargetSlayer->getPlayer(); - // Ŭ̾Ʈ ϹǷ GC- Ŷ ؾ Ѵ. + // 서버에서 클라이언트로 전송하므로 GC- 패킷을 사용해야 한다. GCPhoneSay gcPhoneSay; - // ũó ̸ ޽ Ŷ Ѵ. + // 크리처 이름과 메시지를 패킷에 대입한다. gcPhoneSay.setSlotID(TargetPhoneSlot); gcPhoneSay.setMessage(pPacket->getMessage()); @@ -71,7 +71,7 @@ void CGPhoneSayHandler::execute(CGPhoneSay* pPacket, Player* pPlayer) // cout << "Phone Say Successfull " << endl; - // ų ̻ Ÿ ߻.. + // 상대의 접속이 끊겼거나 이상한 짓거리가 발생했을때.. } else { GCPhoneDisconnected gcPhoneDisconnected; gcPhoneDisconnected.setSlotID(PhoneSlot); diff --git a/src/Core/CGPickupMoney.h b/src/Core/CGPickupMoney.h index 9c6c1b24..857c6fce 100644 --- a/src/Core/CGPickupMoney.h +++ b/src/Core/CGPickupMoney.h @@ -29,10 +29,10 @@ class CGPickupMoney : public Packet { ~CGPickupMoney(); public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -45,7 +45,7 @@ class CGPickupMoney : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CGPickupMoneyPacketSize ؼ ϶. + // const static CGPickupMoneyPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szObjectID + szCoord + szCoord; } @@ -87,7 +87,7 @@ class CGPickupMoney : public Packet { // ObjectID ObjectID_t m_ObjectID; - // ִ Zone X, Y ǥ. + // 아이템이 있는 Zone의 X, Y 좌표. Coord_t m_ZoneX; Coord_t m_ZoneY; }; @@ -120,7 +120,7 @@ class CGPickupMoneyFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGPickupMoneyPacketSize ؼ ϶. + // const static CGPickupMoneyPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szCoord + szCoord; } diff --git a/src/Core/CGPickupMoneyHandler.cpp b/src/Core/CGPickupMoneyHandler.cpp index 702c55a5..7d70095e 100644 --- a/src/Core/CGPickupMoneyHandler.cpp +++ b/src/Core/CGPickupMoneyHandler.cpp @@ -62,11 +62,11 @@ void CGPickupMoneyHandler::execute(CGPickupMoney* pPacket, Player* pPlayer) pOusters = dynamic_cast(pCreature); pZone = pOusters->getZone(); } else - throw ProtocolException("CGDropMoneyHandler::execute() : ÷̾ ũ."); + throw ProtocolException("CGDropMoneyHandler::execute() : 알 수 없는 플레이어 크리쳐."); Assert(pZone != NULL); - // ٿ带 Ѿ ȴ. + // 바운드를 넘어가면 안 된다. if (!isValidZoneCoord(pZone, ZoneX, ZoneY)) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -74,7 +74,7 @@ void CGPickupMoneyHandler::execute(CGPickupMoney* pPacket, Player* pPlayer) return; } - // ŸϿ ٸ ̴. + // 타일에 아이템이 없다면 리턴이다. Tile& _Tile = pZone->getTile(ZoneX, ZoneY); if (!_Tile.hasItem()) { GCCannotAdd _GCCannotAdd; @@ -88,7 +88,7 @@ void CGPickupMoneyHandler::execute(CGPickupMoney* pPacket, Player* pPlayer) Item::ItemClass IClass = pItem->getItemClass(); ObjectID_t ObjectID = pItem->getObjectID(); - // ´, ׸ Ʈ ID ´ üũѴ. + // 아이템이 돈이 맞는지, 그리고 오브젝트 ID가 맞는지 체크한다. if ((IClass == Item::ITEM_CLASS_MONEY) && (ObjectID == pPacket->getObjectID())) { Money* pMoney = dynamic_cast(pItem); itemGold = pMoney->getAmount(); @@ -101,7 +101,7 @@ void CGPickupMoneyHandler::execute(CGPickupMoney* pPacket, Player* pPlayer) else if (pCreature->isOusters()) currentGold = pOusters->getGold(); - // Ѵ. + // 상대방의 돈은 들지 못한다. if ((pCreature->isSlayer() && pItem->getItemType() != 0) || (pCreature->isVampire() && pItem->getItemType() != 1) || @@ -114,8 +114,8 @@ void CGPickupMoneyHandler::execute(CGPickupMoney* pPacket, Player* pPlayer) if (currentGold + itemGold > MAX_MONEY) { - // ٴڿ ִ ϸ ƽ ʰ - // ٴڿ ִ Ϻθ ֿ Ѵ. + // 현재 소유한 돈에다 바닥에 있는 돈을 더하면 맥스를 초과할 경우 + // 바닥에 있는 돈의 일부만을 주워야 한다. Gold_t pickupMoney = MAX_MONEY - currentGold; marginGold = currentGold + itemGold - MAX_MONEY; pMoney->setAmount(marginGold); @@ -146,7 +146,7 @@ void CGPickupMoneyHandler::execute(CGPickupMoney* pPacket, Player* pPlayer) bSuccess = true; bMargin = false; } - } else // ƴ 쿡 ׳ + } else // 돈이 아닐 경우에는 그냥 { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -157,7 +157,7 @@ void CGPickupMoneyHandler::execute(CGPickupMoney* pPacket, Player* pPlayer) if (bSuccess) { // log(LOG_PICKUP_MONEY, pCreature->getName(), "", pItem->toString()); - // ϴ κ Ѵ. + // 일단은 존으로부터 아이템을 삭제한다. pZone->deleteItem(pItem, ZoneX, ZoneY); GCDeleteandPickUpOK _GCDeleteandPickUpOK; @@ -165,35 +165,35 @@ void CGPickupMoneyHandler::execute(CGPickupMoney* pPacket, Player* pPlayer) pPlayer->sendPacket(&_GCDeleteandPickUpOK); if (pCreature->isSlayer()) { - // ó ִ ٸ 鿡 ۿ ٴ ش. + // 근처에 있는 다른 사람들에겐 아이템에 사라졌다는 것을 보내준다. GCDeleteObject _GCDeleteObject; _GCDeleteObject.setObjectID(pItem->getObjectID()); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCDeleteObject, pSlayer); } else if (pCreature->isVampire()) { - // ó ִ ٸ 鿡 ۿ ٴ ش. + // 근처에 있는 다른 사람들에겐 아이템에 사라졌다는 것을 보내준다. GCDeleteObject _GCDeleteObject; _GCDeleteObject.setObjectID(pItem->getObjectID()); pZone->broadcastPacket(pVampire->getX(), pVampire->getY(), &_GCDeleteObject, pVampire); } else if (pCreature->isOusters()) { - // ó ִ ٸ 鿡 ۿ ٴ ش. + // 근처에 있는 다른 사람들에겐 아이템에 사라졌다는 것을 보내준다. GCDeleteObject _GCDeleteObject; _GCDeleteObject.setObjectID(pItem->getObjectID()); pZone->broadcastPacket(pOusters->getX(), pOusters->getY(), &_GCDeleteObject, pOusters); } - // ִٸ ִ ׼ŭ ٽ ؼ ߸. + // 돈이 남아있다면 남아있는 액수만큼의 돈을 다시 생성해서 떨어뜨린다. if (bMargin) { TPOINT pt = pZone->addItem(pItem, ZoneX, ZoneY); if (pt.x != -1) { // pItem->save("", STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d, StorageID=%lu, X=%d, Y=%d", STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y); pItem->tinysave(pField); } else { - // ߸ ߴٸ ׳ Ѵ. + // 돈을 떨어뜨리지 못했다면 그냥 삭제한다. // cout << "#############################################" << endl; // cout << "# CRITICAL ERROR! CANNOT ADD MONEY TO ZONE! #" << endl; // cout << "#############################################" << endl; @@ -205,7 +205,7 @@ void CGPickupMoneyHandler::execute(CGPickupMoney* pPacket, Player* pPlayer) SAFE_DELETE(pItem); } - // α ׼ α + // 돈로그 남길 액수면 돈로그 남긴다 if ((itemGold - marginGold) >= g_pVariableManager->getMoneyTraceLogLimit()) { char zoneName[15]; sprintf(zoneName, "%4d%3d%3d", pZone->getZoneID(), ZoneX, ZoneY); diff --git a/src/Core/CGPortCheck.cpp b/src/Core/CGPortCheck.cpp index bbd17c32..35e1c545 100644 --- a/src/Core/CGPortCheck.cpp +++ b/src/Core/CGPortCheck.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void CGPortCheck::read(Datagram& iDatagram) @@ -38,7 +38,7 @@ void CGPortCheck::read(Datagram& iDatagram) ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void CGPortCheck::write(Datagram& oDatagram) const diff --git a/src/Core/CGPortCheck.h b/src/Core/CGPortCheck.h index 12e25507..5fbabd54 100644 --- a/src/Core/CGPortCheck.h +++ b/src/Core/CGPortCheck.h @@ -18,18 +18,18 @@ // // class CGPortCheck; // -// α ڰ Ϸ , α -//  ּҿ  ڰ  ũó α -// ̴.. ˷ִ Ŷ̴. +// 로그인 서버에서 사용자가 게임 서버로 접속하려고 할 때, 로그인 서버는 +// 그 게임 서버에게 어떤 주소에서 어떤 사용자가 어떤 크리처로 로그인할 +// 것이다.. 라고 알려주는 패킷이다. // // *CAUTION* // -// ũó ̸ ʿѰ? ϴ ǹ ְڴµ, -// 츦 ʿϰ ȴ. α κ Slot3 ij͸ -// س, ؼ SLOT2 ij͸ εش޶ -// ִ ̴. ̸ ؼ, CLSelectPC ij͸ -// ˷ ϸ, CGConnect ij ̵ ؼ -// ٷ εϵ ؾ Ѵ. +// 굳이 크리처 이름이 필요한가? 하는 의문이 있을 수 있겠는데, 다음과 같은 +// 경우를 고려했을때 필요하게 된다. 로그인 서버로부터 Slot3 캐릭터를 선택 +// 해놓고, 실제로 게임 서버에 접속해서는 SLOT2 캐릭터를 로딩해달라고 할 +// 수가 있는 것이다. 이를 막기 위해서, CLSelectPC로 선택한 캐릭터를 +// 게임 서버에게 알려줘야 하며, CGConnect 에서도 캐릭터 아이디를 포함해서 +// 바로 로딩하도록 해야 한다. // //---------------------------------------------------------------------- @@ -37,10 +37,10 @@ class CGPortCheck : public DatagramPacket { public: CGPortCheck() {}; ~CGPortCheck() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(Datagram& iDatagram); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(Datagram& oDatagram) const; // execute packet's handler @@ -106,7 +106,7 @@ class CGPortCheckFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGPortCheckPacketMaxSize , ϶. + // const static CGPortCheckPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + 20; // PC name } diff --git a/src/Core/CGPortCheckHandler.cpp b/src/Core/CGPortCheckHandler.cpp index f67b8d16..b568d55b 100644 --- a/src/Core/CGPortCheckHandler.cpp +++ b/src/Core/CGPortCheckHandler.cpp @@ -21,8 +21,8 @@ // // CGPortCheckHander::execute() // -// α κ CGPortCheck Ŷ ް Ǹ, -// ConnectionInfo ߰ϰ ȴ. +// 게임 서버가 로그인 서버로부터 CGPortCheck 패킷을 받게 되면, +// ConnectionInfo를 새로 추가하게 된다. // //---------------------------------------------------------------------- void CGPortCheckHandler::execute(CGPortCheck* pPacket) @@ -47,7 +47,7 @@ void CGPortCheckHandler::execute(CGPortCheck* pPacket) pPacket->getPCName().c_str(), IP, port, g_pConfig->getPropertyInt("ServerID")); if (pStmt->getAffectedRowCount() == 0) { - // ٽ ѹ õ + // 다시 한번 시도 pStmt->executeQuery("UPDATE UserIPInfo Set IP=%lu, Port=%u WHERE Name='%s'", IP, port, pPacket->getPCName().c_str()); @@ -59,7 +59,7 @@ void CGPortCheckHandler::execute(CGPortCheck* pPacket) } catch (SQLQueryException&) { /* try { - // ٽ ѹ õ + // 다시 한번 시도 pStmt->executeQuery( "UPDATE UserIPInfo Set IP=%ld, Port=%d WHERE Name='%s'", IP, port, @@ -72,7 +72,7 @@ void CGPortCheckHandler::execute(CGPortCheck* pPacket) } catch (SQLQueryException & sqe) { //se) { SAFE_DELETE(pStmt); - // Ѵ. + // 무시한다. //throw ProtocolException("Duplicated IPInfo"); } */ diff --git a/src/Core/CGQuitGuild.h b/src/Core/CGQuitGuild.h index 4dc28ac8..14956b63 100644 --- a/src/Core/CGQuitGuild.h +++ b/src/Core/CGQuitGuild.h @@ -25,10 +25,10 @@ class CGQuitGuild : public Packet { public: CGQuitGuild() {}; ~CGQuitGuild() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGQuitGuildHandler.cpp b/src/Core/CGQuitGuildHandler.cpp index 3990229a..9e47df11 100644 --- a/src/Core/CGQuitGuildHandler.cpp +++ b/src/Core/CGQuitGuildHandler.cpp @@ -33,7 +33,7 @@ void CGQuitGuildHandler::execute(CGQuitGuild* pPacket, Player* pPlayer) PlayerCreature* pPlayerCreature = dynamic_cast(pPlayer); Assert(pPlayerCreature != NULL); - // ÷̾ 带 ´. + // 플레이어가 속한 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); try { Assert(pGuild != NULL); @@ -41,7 +41,7 @@ void CGQuitGuildHandler::execute(CGQuitGuild* pPacket, Player* pPlayer) return; } - // ÷̾ ȮѴ. + // 플레이어가 길드의 멤버인지 확인한다. GuildMember* pGuildMember = pGuild->getMember(pPlayerCreature->getName()); if (pGuildMember == NULL) return; diff --git a/src/Core/CGQuitUnion.h b/src/Core/CGQuitUnion.h index f2e10d1e..c0aab1c2 100644 --- a/src/Core/CGQuitUnion.h +++ b/src/Core/CGQuitUnion.h @@ -24,16 +24,16 @@ class CGQuitUnion : public Packet { public: enum { - QUIT_NORMAL = 0, // û - QUIT_QUICK, // Ϲ Ż + QUIT_NORMAL = 0, // 절차에 따라 신청 + QUIT_QUICK, // 일방적으로 탈퇴 QUIT_MAX }; CGQuitUnion() {}; ~CGQuitUnion() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGQuitUnionAccept.h b/src/Core/CGQuitUnionAccept.h index e46f4e41..5bfbf909 100644 --- a/src/Core/CGQuitUnionAccept.h +++ b/src/Core/CGQuitUnionAccept.h @@ -25,10 +25,10 @@ class CGQuitUnionAccept : public Packet { public: CGQuitUnionAccept() {}; ~CGQuitUnionAccept() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGQuitUnionAcceptHandler.cpp b/src/Core/CGQuitUnionAcceptHandler.cpp index 8fea97a9..00ac3306 100644 --- a/src/Core/CGQuitUnionAcceptHandler.cpp +++ b/src/Core/CGQuitUnionAcceptHandler.cpp @@ -46,7 +46,7 @@ void CGQuitUnionAcceptHandler::execute(CGQuitUnionAccept* pPacket, Player* pPlay #ifdef __OLD_GUILD_WAR__ GCSystemMessage gcSM; - gcSM.setMessage("ûпŴ˹."); + gcSM.setMessage("뻘청唐역렴늪묘콘."); pGamePlayer->sendPacket(&gcSM); return; #endif @@ -63,11 +63,11 @@ void CGQuitUnionAcceptHandler::execute(CGQuitUnionAccept* pPacket, Player* pPlay 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); @@ -89,7 +89,7 @@ void CGQuitUnionAcceptHandler::execute(CGQuitUnionAccept* pPacket, Player* pPlay } string TargetGuildMaster = pGuild->getMaster(); - // cout << "Ż Ǿ. 뺸 : " << TargetGuildMaster.c_str() << endl; + // cout << "연합탈퇴가 수락되었다. 통보받을 유저는 : " << TargetGuildMaster.c_str() << endl; Statement* pStmt = NULL; @@ -99,13 +99,13 @@ void CGQuitUnionAcceptHandler::execute(CGQuitUnionAccept* pPacket, Player* pPlay pStmt->executeQuery("INSERT INTO Messages (Receiver, Message) values('%s','%s')", TargetGuildMaster.c_str(), g_pStringPool->c_str(375)); - // Żѵڿ ȥ ִٸ? + // 탈퇴수락한뒤에 나 혼자 남아있다면? Result* pResult = pStmt->executeQuery("SELECT count(*) FROM GuildUnionMember WHERE UnionID='%u'", pUnion->getUnionID()); pResult->next(); if (pResult->getInt(1) == 0) { - // cout << "Ż ..ִ ..̸ ȵǴϱ.." << endl; + // cout << "연합탈퇴가 수락된후..남아있는 멤버가 없으면..연합장이면 안되니까..지워버린다" << endl; pStmt->executeQuery("DELETE FROM GuildUnionInfo WHERE UnionID='%u'", pUnion->getUnionID()); GuildUnionManager::Instance().reload(); } @@ -115,7 +115,7 @@ void CGQuitUnionAcceptHandler::execute(CGQuitUnionAccept* pPacket, Player* pPlay } END_DB(pStmt) - // Żϸ ٲ ִ. ŵ ٽ ش. + // 연합탈퇴하면 연합정보가 바뀌었을 수도 있다. 갱신된 정보를 다시 보내준다. Creature* pCreature = NULL; pCreature = pGamePlayer->getCreature(); @@ -127,7 +127,7 @@ void CGQuitUnionAcceptHandler::execute(CGQuitUnionAccept* pPacket, Player* pPlay pPlayer->sendPacket(&gcModifyInformation); - // 뺸 Union ٽ + // 통보받을 유저에게 길드Union정보를 다시 보낸다 Creature* pTargetCreature = NULL; __ENTER_CRITICAL_SECTION((*g_pPCFinder)) @@ -145,7 +145,7 @@ void CGQuitUnionAcceptHandler::execute(CGQuitUnionAccept* pPacket, Player* pPlay sendGCOtherModifyInfoGuildUnion(pTargetCreature); sendGCOtherModifyInfoGuildUnion(pCreature); - // ٸ ִ 鿡 ˸. + // 다른 서버에 있는 놈들에게 변경사항을 알린다. GuildUnionManager::Instance().sendModifyUnionInfo(dynamic_cast(pTargetCreature)->getGuildID()); GuildUnionManager::Instance().sendModifyUnionInfo(dynamic_cast(pCreature)->getGuildID()); } diff --git a/src/Core/CGQuitUnionDeny.h b/src/Core/CGQuitUnionDeny.h index aab7230a..0b13c106 100644 --- a/src/Core/CGQuitUnionDeny.h +++ b/src/Core/CGQuitUnionDeny.h @@ -25,10 +25,10 @@ class CGQuitUnionDeny : public Packet { public: CGQuitUnionDeny() {}; ~CGQuitUnionDeny() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGQuitUnionDenyHandler.cpp b/src/Core/CGQuitUnionDenyHandler.cpp index 45851cf0..5cb6dd2d 100644 --- a/src/Core/CGQuitUnionDenyHandler.cpp +++ b/src/Core/CGQuitUnionDenyHandler.cpp @@ -41,7 +41,7 @@ void CGQuitUnionDenyHandler::execute(CGQuitUnionDeny* pPacket, Player* pPlayer) #ifdef __OLD_GUILD_WAR__ GCSystemMessage gcSM; - gcSM.setMessage("ûпŴ˹."); + gcSM.setMessage("뻘청唐역렴늪묘콘."); pGamePlayer->sendPacket(&gcSM); return; #endif @@ -58,11 +58,11 @@ void CGQuitUnionDenyHandler::execute(CGQuitUnionDeny* 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); @@ -84,7 +84,7 @@ void CGQuitUnionDenyHandler::execute(CGQuitUnionDeny* pPacket, Player* pPlayer) } string TargetGuildMaster = pGuild->getMaster(); - // cout << "Ż źεǾ. 뺸 : " << TargetGuildMaster.c_str() << endl; + // cout << "탈퇴가 거부되었다. 통보받을 유저는 : " << TargetGuildMaster.c_str() << endl; Statement* pStmt = NULL; diff --git a/src/Core/CGQuitUnionHandler.cpp b/src/Core/CGQuitUnionHandler.cpp index 4eae7577..f345d5b0 100644 --- a/src/Core/CGQuitUnionHandler.cpp +++ b/src/Core/CGQuitUnionHandler.cpp @@ -45,7 +45,7 @@ void CGQuitUnionHandler::execute(CGQuitUnion* pPacket, Player* pPlayer) #ifdef __OLD_GUILD_WAR__ GCSystemMessage gcSM; - gcSM.setMessage("ûпŴ˹."); + gcSM.setMessage("뻘청唐역렴늪묘콘."); pGamePlayer->sendPacket(&gcSM); return; #endif @@ -66,12 +66,12 @@ void CGQuitUnionHandler::execute(CGQuitUnion* pPacket, Player* pPlayer) uint tempUnionID = pUnion->getUnionID(); - // ûѳ ΰ? + // 요청한놈이 지가 속한 길드의 마스터인가? 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); @@ -83,7 +83,7 @@ void CGQuitUnionHandler::execute(CGQuitUnion* pPacket, Player* pPlayer) // cout << "CGQuitUnion - Guild : " << pPacket->getGuildID() << ", Method : " << (int)pPacket->getQuitMethod() << // endl; - // ûѴ + // 정상적으로 신청한다 if (pPacket->getQuitMethod() == CGQuitUnion::QUIT_NORMAL) { uint result = GuildUnionOfferManager::Instance().offerQuit(pPlayerCreature->getGuildID()); @@ -91,16 +91,16 @@ void CGQuitUnionHandler::execute(CGQuitUnion* pPacket, Player* pPlayer) pPlayer->sendPacket(&gcGuildResponse); // cout << "normal send quit result : " << result << endl; } - // ŻѴ + // 강제적으로 탈퇴한다 else if (pPacket->getQuitMethod() == CGQuitUnion::QUIT_QUICK) { - // 帶 ̵.. + // 길드마스터의 마스터 아이디.. string TargetGuildMaster = g_pGuildManager->getGuild(pUnion->getMasterGuildID())->getMaster(); if (GuildUnionManager::Instance().removeGuild(pUnion->getUnionID(), pPlayerCreature->getGuildID())) { gcGuildResponse.setCode(GuildUnionOfferManager::OK); pPlayer->sendPacket(&gcGuildResponse); - /* 10ϰ ٸտ ϵ гƼ óѴ. TODO + /* 10일간 다른연합에 가입하지 못하도록 패널티 처리한다. TODO */ Statement* pStmt = NULL; BEGIN_DB { @@ -115,13 +115,13 @@ void CGQuitUnionHandler::execute(CGQuitUnion* pPacket, Player* pPlayer) pStmt->executeQuery("INSERT INTO GuildUnionOffer values('%u','ESCAPE','%u',now())", tempUnionID, pPacket->getGuildID()); - // ոɹ ִ ..? + // 연합맴버가 있는지 보자..없으면? Result* pResult = pStmt->executeQuery("SELECT count(*) FROM GuildUnionMember WHERE UnionID='%u'", tempUnionID); pResult->next(); if (pResult->getInt(1) == 0) { - // cout << " Ż Ѵ..տ Ƿ .. : unionid " << + // cout << "강제적으로 탈퇴를 한다..연합에 멤버가 없으므로 연합을..지워버린다 : unionid " << // (int)tempUnionID << endl; pStmt->executeQuery("DELETE FROM GuildUnionInfo WHERE UnionID='%u'", tempUnionID); pStmt->executeQuery("INSERT INTO Messages (Receiver, Message) values('%s','%s')", @@ -166,7 +166,7 @@ void CGQuitUnionHandler::execute(CGQuitUnion* pPacket, Player* pPlayer) sendGCOtherModifyInfoGuildUnion(pTargetCreature); sendGCOtherModifyInfoGuildUnion(pCreature); - // ٸ ִ 鿡 ˸. + // 다른 서버에 있는 놈들에게 변경사항을 알린다. GuildUnionManager::Instance().sendModifyUnionInfo( dynamic_cast(pTargetCreature)->getGuildID()); GuildUnionManager::Instance().sendModifyUnionInfo(dynamic_cast(pCreature)->getGuildID()); diff --git a/src/Core/CGRangerSay.cpp b/src/Core/CGRangerSay.cpp index bd1d9d33..15294c9f 100644 --- a/src/Core/CGRangerSay.cpp +++ b/src/Core/CGRangerSay.cpp @@ -11,7 +11,7 @@ void CGRangerSay::read(SocketInputStream& iStream) { __BEGIN_TRY - // ޼ б + // 메세지 읽기 BYTE szMessage; iStream.read(szMessage); @@ -31,7 +31,7 @@ void CGRangerSay::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ޼ + // 메세지 쓰기 BYTE szMessage = m_Message.size(); if (szMessage == 0) diff --git a/src/Core/CGRangerSay.h b/src/Core/CGRangerSay.h index bb12dc90..6a660838 100644 --- a/src/Core/CGRangerSay.h +++ b/src/Core/CGRangerSay.h @@ -17,7 +17,7 @@ // // class CGRangerSay; // -// DragonEye ڰ Ranger ê Ҷ ϴ Ŷ +// DragonEye 를 가진 사용자가 Ranger 존챗을 할때 사용하는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -25,10 +25,10 @@ class CGRangerSay : public Packet { public: CGRangerSay() {}; ~CGRangerSay() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -93,7 +93,7 @@ class CGRangerSayFactory : public PacketFactory { } // get packet's max body size - // message ִ ũ⿡ ʿϴ. + // message 의 최대 크기에 대한 설정이 필요하다. PacketSize_t getPacketMaxSize() const { return szBYTE + 128; } diff --git a/src/Core/CGRangerSayHandler.cpp b/src/Core/CGRangerSayHandler.cpp index 63fc6f6d..fe384257 100644 --- a/src/Core/CGRangerSayHandler.cpp +++ b/src/Core/CGRangerSayHandler.cpp @@ -32,21 +32,21 @@ void CGRangerSayHandler::execute(CGRangerSay* pPacket, Player* pPlayer) Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); - // ũ ̸ ޽ Ŷ ִ´. + // 크리쳐 이름과 메시지를 패킷에 넣는다. StringStream msg; msg << pCreature->getName() << " " << pPacket->getMessage(); Race_t race = pCreature->getRace(); - // Ŷ + // 패킷 생성 GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(msg.toString()); gcSystemMessage.setType(SYSTEM_MESSAGE_RANGER_SAY); - // + // 필터 생성 BroadcastFilterRace filter(race); - // ڿ Ѹ + // 모든 사용자에게 뿌리기 g_pZoneGroupManager->pushBroadcastPacket(&gcSystemMessage, &filter); /* hash_map::const_iterator itr = g_pZoneGroupManager->getZoneGroups().begin(); diff --git a/src/Core/CGReady.h b/src/Core/CGReady.h index 400a6a22..b21e2104 100644 --- a/src/Core/CGReady.h +++ b/src/Core/CGReady.h @@ -23,10 +23,10 @@ class CGReady : public Packet { public: CGReady() {}; ~CGReady() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -39,7 +39,7 @@ class CGReady : public Packet { // get packet body size // *OPTIMIZATION HINT* - // const static CGReadyPacketSize , ϶. + // const static CGReadyPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return 0; } diff --git a/src/Core/CGReadyHandler.cpp b/src/Core/CGReadyHandler.cpp index 4b7b474c..b32a84ae 100644 --- a/src/Core/CGReadyHandler.cpp +++ b/src/Core/CGReadyHandler.cpp @@ -15,9 +15,9 @@ #endif ////////////////////////////////////////////////////////////////////////////// -// Ŭ̾Ʈ ε , CGReady Ŷ Ѵ. -// Ŷ Ŭ̾Ʈ Zone ť PC ־ְ, -// ÷̾ IPM ZPM ű. +// 클라이언트가 데이터 로딩을 끝내면, 게임 서버에게 CGReady 패킷을 전송한다. +// 이 패킷을 받은 클라이언트는 Zone의 큐에 PC를 넣어주고, 마지막으로 +// 플레이어를 IPM에서 ZPM으로 옮긴다. ////////////////////////////////////////////////////////////////////////////// void CGReadyHandler::execute(CGReady* pPacket, Player* pPlayer) @@ -37,21 +37,21 @@ void CGReadyHandler::execute(CGReady* pPacket, Player* pPlayer) Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); - // ּó by sigi. 2002.5.11 + // 주석처리 by sigi. 2002.5.11 // Zone* pZone = pCreature->getZone(); // Assert(pZone != NULL); // filelog("CGReadyTrace.txt", "CGReadyHandler : After pointer"); //-------------------------------------------------------------------------------- - // ÷̾ IPM ϰ ZPM ű. + // 플레이어를 IPM에서 삭제하고 ZPM으로 옮긴다. //-------------------------------------------------------------------------------- try { - // IncomingPlayer Process Commands ȿ Ǵ ̹Ƿ ݵ ̴. + // IncomingPlayer의 Process Commands 안에서 실행되는 것이므로 반드시 노 블락으로 지워야 할 것이다. // g_pIncomingPlayerManager->deletePlayer_NOBLOCKED(pGamePlayer->getSocket()->getSOCKET()); g_pIncomingPlayerManager->deletePlayer(pGamePlayer->getSocket()->getSOCKET()); - // Core 濡 ִ ϱ Ͽ heartbeat ϰ . + // Core의 구조 변경에 따라 쓰레드 간의 간섭을 최대한 억제하기 위하여 heartbeat에서 일괄적으로 보낸다. g_pIncomingPlayerManager->pushOutPlayer(pGamePlayer); // filelog("CGReadyTrace.txt", "CGReadyHandler : After deletePlayer[Name:%s]", pCreature->getName().c_str()); @@ -74,7 +74,7 @@ pCreature->getName().c_str()); //filelog("CGReadyTrace.txt", "CGReadyHandler : After pushPlayer[Name:%s]", pCreature->getName().c_str()); - // PC ť ִ´. + // PC를 존의 큐에 집어넣는다. //pGamePlayer->getCreature()->getZone()->pushPC(pGamePlayer->getCreature()); // pZone->pushPC(pCreature); @@ -85,11 +85,11 @@ pCreature->getName().c_str()); */ } catch (NoSuchElementException& nsee) { StringStream msg; - msg << "Critical Error : IPM ÷̾ ׿. .. - -;\n" << nsee.toString(); + msg << "Critical Error : IPM에 플레이어가 없네용. 무슨 일이지.. - -;\n" << nsee.toString(); throw Error(msg.toString()); } - // õ κ ʴ ̴. + // 잠시동안 적으로부터 공격을 받지 않는 상태이다. pGamePlayer->setPlayerStatus(GPS_NORMAL); // filelog("CGReadyTrace.txt", "CGReadyHandler : END"); diff --git a/src/Core/CGRegistGuild.h b/src/Core/CGRegistGuild.h index e6bc474b..a84ac02f 100644 --- a/src/Core/CGRegistGuild.h +++ b/src/Core/CGRegistGuild.h @@ -25,10 +25,10 @@ class CGRegistGuild : public Packet { public: CGRegistGuild() {}; ~CGRegistGuild() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGRegistGuildHandler.cpp b/src/Core/CGRegistGuildHandler.cpp index e84bfe6b..c8f915ac 100644 --- a/src/Core/CGRegistGuildHandler.cpp +++ b/src/Core/CGRegistGuildHandler.cpp @@ -47,7 +47,7 @@ void CGRegistGuildHandler::execute(CGRegistGuild* pPacket, Player* pPlayer) string GuildName = pPacket->getGuildName(); if (GuildName.find_first_of("'\\") < GuildName.size()) { - // ̹ ̸̴ + // 이미 사용 중인 길드 이름이다 if (pCreature->isSlayer()) { GCNPCResponse response; response.setCode(NPC_RESPONSE_TEAM_REGIST_FAIL_NAME); @@ -69,7 +69,7 @@ void CGRegistGuildHandler::execute(CGRegistGuild* pPacket, Player* pPlayer) Result* pResult; BEGIN_DB { - // ̸ ִ üũ + // 같은 길드 이름이 있는지 체크 pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pResult = pStmt->executeQuery("SELECT GuildID FROM GuildInfo WHERE GuildName = '%s' AND GuildState IN ( 0, 1 )", pPacket->getGuildName().c_str()); @@ -77,7 +77,7 @@ void CGRegistGuildHandler::execute(CGRegistGuild* pPacket, Player* pPlayer) if (pResult->getRowCount() != 0) { SAFE_DELETE(pStmt); - // ̹ ̸̴ + // 이미 사용 중인 길드 이름이다 if (pCreature->isSlayer()) { GCNPCResponse response; response.setCode(NPC_RESPONSE_TEAM_REGIST_FAIL_NAME); @@ -95,7 +95,7 @@ void CGRegistGuildHandler::execute(CGRegistGuild* pPacket, Player* pPlayer) return; } - // ٸ Ҽ üũ + // 다른 길드 소속인지 체크 pResult = pStmt->executeQuery("SELECT `Rank`, ExpireDate FROM GuildMember WHERE Name = '%s'", pCreature->getName().c_str()); @@ -103,7 +103,7 @@ void CGRegistGuildHandler::execute(CGRegistGuild* pPacket, Player* pPlayer) int Rank = pResult->getInt(1); string ExpireDate = pResult->getString(2); - // ٸ 忡 Ż 带 . + // 다른 길드에서 탈퇴한 경우는 길드를 생성할 수 없다. if (ExpireDate.size() == 7 && Rank == GuildMember::GUILDMEMBER_RANK_LEAVE) { time_t daytime = time(0); tm Time; @@ -111,11 +111,11 @@ void CGRegistGuildHandler::execute(CGRegistGuild* pPacket, Player* pPlayer) Time.tm_mon = atoi(ExpireDate.substr(3, 2).c_str()); Time.tm_mday = atoi(ExpireDate.substr(5, 2).c_str()); - // if ( difftime( daytime, mktime(&Time) ) < 604800 ) // ǽð 7 °? + // if ( difftime( daytime, mktime(&Time) ) < 604800 ) // 실시간 7일이 지났는가? if (difftime(daytime, mktime(&Time)) < - g_pVariableManager->getVariable(QUIT_GUILD_PENALTY_TERM) * 24 * 3600) // ǽð 7 °? + g_pVariableManager->getVariable(QUIT_GUILD_PENALTY_TERM) * 24 * 3600) // 실시간 7일이 지났는가? { - // ٴ ޼ + // 길드 생성할 수 없다는 메세지 GCNPCResponse response; if (pCreature->isSlayer()) @@ -133,7 +133,7 @@ void CGRegistGuildHandler::execute(CGRegistGuild* pPacket, Player* pPlayer) } } - // ش. + // 기존의 길드멤버 정보를 지워준다. pStmt->executeQuery("DELETE FROM GuildMember WHERE Name='%s'", pCreature->getName().c_str()); // SAFE_DELETE( pStmt ); @@ -151,10 +151,10 @@ void CGRegistGuildHandler::execute(CGRegistGuild* pPacket, Player* pPlayer) SkillDomainType_t highest = pSlayer->getHighestSkillDomain(); - // üũ - if ((pSlayer->getGold() >= REQUIRE_SLAYER_MASTER_GOLD) && // Ϻ 1 - (pSlayer->getFame() >= REQUIRE_SLAYER_MASTER_FAME[highest]) && // ġ - (pSlayer->getSkillDomainLevel(highest) >= REQUIRE_SLAYER_MASTER_SKILL_DOMAIN_LEVEL) // 50 ̻ + // 등록 가능 여부 체크 + if ((pSlayer->getGold() >= REQUIRE_SLAYER_MASTER_GOLD) && // 등록비 1억 + (pSlayer->getFame() >= REQUIRE_SLAYER_MASTER_FAME[highest]) && // 명성치 + (pSlayer->getSkillDomainLevel(highest) >= REQUIRE_SLAYER_MASTER_SKILL_DOMAIN_LEVEL) // 레벨 50 이상 ) { GSAddGuild gsAddGuild; @@ -176,8 +176,8 @@ void CGRegistGuildHandler::execute(CGRegistGuild* pPacket, Player* pPlayer) Vampire* pVampire = dynamic_cast(pCreature); Assert(pVampire != NULL); - // üũ - if ((pVampire->getGold() >= REQUIRE_VAMPIRE_MASTER_GOLD) && // Ϻ 1 + // 등록 가능 여부 체크 + if ((pVampire->getGold() >= REQUIRE_VAMPIRE_MASTER_GOLD) && // 등록비 1억 (pVampire->getLevel() >= REQUIRE_VAMPIRE_MASTER_LEVEL)) { GSAddGuild gsAddGuild; @@ -198,8 +198,8 @@ void CGRegistGuildHandler::execute(CGRegistGuild* pPacket, Player* pPlayer) Ousters* pOusters = dynamic_cast(pCreature); Assert(pOusters != NULL); - // üũ - if ((pOusters->getGold() >= REQUIRE_OUSTERS_MASTER_GOLD) && // Ϻ 1 + // 등록 가능 여부 체크 + if ((pOusters->getGold() >= REQUIRE_OUSTERS_MASTER_GOLD) && // 등록비 1억 (pOusters->getLevel() >= REQUIRE_OUSTERS_MASTER_LEVEL)) { GSAddGuild gsAddGuild; diff --git a/src/Core/CGRelicToObject.h b/src/Core/CGRelicToObject.h index 7ab269db..b860f934 100644 --- a/src/Core/CGRelicToObject.h +++ b/src/Core/CGRelicToObject.h @@ -31,10 +31,10 @@ class CGRelicToObject : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -91,7 +91,7 @@ class CGRelicToObject : public Packet { private: ObjectID_t m_ItemObjectID; // item object id - ObjectID_t m_ObjectID; // object id + ObjectID_t m_ObjectID; // 성물보관함 object id Coord_t m_X; Coord_t m_Y; diff --git a/src/Core/CGRelicToObjectHandler.cpp b/src/Core/CGRelicToObjectHandler.cpp index a2626509..095ddedf 100644 --- a/src/Core/CGRelicToObjectHandler.cpp +++ b/src/Core/CGRelicToObjectHandler.cpp @@ -58,47 +58,47 @@ void CGRelicToObjectHandler::execute(CGRelicToObject* pPacket, Player* pPlayer) #ifdef __GAME_SERVER__ // cout << "CGRelicToObject start" << endl; - // cout << " Ŷ( Ʈ)" << pPacket->getItemObjectID() - // << " Ŷ( )" << pPacket->getObjectID() << endl; + // cout << "받은 패킷(아이템 오브젝트)" << pPacket->getItemObjectID() + // << "받은 패킷(성물 보관함)" << pPacket->getObjectID() << endl; Assert(pPacket != NULL); Assert(pPlayer != NULL); - // ش Կ .. + // 렐릭을 해당 성물보관함에 넣을때.. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); - // 뿡 ̹ ִ - // 뿡 Slayer ְ pItem Slayer + // 성물 보관대에 이미 둘 다 있는 경우 + // 성물 보관대에 Slayer성물이 있고 pItem이 Slayer성물인 경우 PlayerCreature* pPlayerCreature = dynamic_cast(pCreature); if (pPlayerCreature == NULL) { - throw DisconnectException("CGRelicToObject : ̻ؿ"); + throw DisconnectException("CGRelicToObject : 이상해요"); return; } - // ִ == Relic ? + // 현재 들고 있는 아이템 == Relic ? InventorySlot* pExtraInventorySlot = pPlayerCreature->getExtraInventorySlot(); Item* pItem = pExtraInventorySlot->getItem(); if (pItem != NULL && pItem->getItemClass() == Item::ITEM_CLASS_EVENT_ITEM && pItem->getItemType() == 31) { static map scripts; if (scripts.empty()) { - // cout << "ũƮ ʱȭ" << endl; - scripts[""] = ". ʰڼ"; - scripts[""] = " ٸ 鵵 ּ. ŹԴϴ."; - scripts[""] = ". ܿ ұ."; - scripts["īź"] = " ֵ ҰԿ."; - scripts["̽"] = ". ʹ . ʹ ."; - scripts[""] = " ұ. ô"; - scripts["ɽ"] = " ٸ 鵵."; - scripts[""] = ". ʾ."; - scripts["ϳ̷"] = " ֵ ҰԿ."; - scripts[""] = "ޡ Ҵ."; - scripts["Ʈ"] = "ϴ. ٸھ."; - scripts[""] = " ٸ 鵵 ּ. ŹԴϴ."; - scripts["̷"] = ". ߾. ܿ ұ."; - scripts["Ű"] = " ֵ ҰԿ."; - scripts["״"] = " ˾ҽϴ."; + // cout << "스크립트 초기화" << endl; + scripts["존슨"] = "고맙소. 이 은혜 잊지않겠소"; + scripts["빌리"] = "얼른 다른 동료들도 구해주세요. 부탁입니다."; + scripts["리"] = "우웃…. 겨우 살았군."; + scripts["에즈카탄"] = "난 먼저 가있도록 할게요."; + scripts["루이스"] = "흐흑. 너무 힘들었소. 너무 고맙소."; + scripts["젠지"] = "이제 살았군. 마을에서 봅시다"; + scripts["케스이"] = "얼른 다른 동지들도…."; + scripts["파이"] = "우웃…. 몸에 힘이 남아있지 않아."; + scripts["니나이루"] = "난 먼저 가있도록 할게요."; + scripts["료"] = "휴… 살았다."; + scripts["페이트"] = "고맙습니다. 먼저가서 기다리겠어요."; + scripts["솔"] = "얼른 다른 동료들도 구해주세요. 부탁입니다."; + scripts["이루이"] = "우웃…. 지독했어요. 겨우 살았군요."; + scripts["젼키"] = "난 먼저 가있도록 할게요."; + scripts["그누"] = "당신이 올 줄 알았습니다."; } Zone* pZone = pPlayerCreature->getZone(); @@ -107,7 +107,7 @@ void CGRelicToObjectHandler::execute(CGRelicToObject* pPacket, Player* pPlayer) GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); pPlayer->sendPacket(&_GCCannotAdd); - // cout << "Ͱ ϴ." << endl; + // cout << "몬스터가 없습니다." << endl; return; } @@ -120,7 +120,7 @@ void CGRelicToObjectHandler::execute(CGRelicToObject* pPacket, Player* pPlayer) _GCCannotAdd.setObjectID(pPacket->getObjectID()); pPlayer->sendPacket(&_GCCannotAdd); - // cout << "̻ ̰ų ̸ Ʋϴ. : " << (int)pMonster->getMonsterType() << "," << + // cout << "이상한 몬스터이거나 몬스터 이름이 틀립니다. : " << (int)pMonster->getMonsterType() << "," << // pMonster->getName() << endl; return; @@ -164,12 +164,12 @@ void CGRelicToObjectHandler::execute(CGRelicToObject* pPacket, Player* pPlayer) } else if (pItem->getItemClass() == Item::ITEM_CLASS_CASTLE_SYMBOL) { executeCastleSymbol(pPacket, pPlayer); } else if (pItem->isFlagItem()) { - // cout << " ű!" << endl; + // cout << "깃발 꼽기!" << endl; executeFlag(pPacket, pPlayer); } else if (pItem->getItemClass() == Item::ITEM_CLASS_SWEEPER) { executeSweeper(pPacket, pPlayer); } else { - throw DisconnectException("Ѱ RelicToObject"); + throw DisconnectException("엉뚱한거 들고 RelicToObject보내지마"); } #endif @@ -184,15 +184,15 @@ void CGRelicToObjectHandler::executeRelic(CGRelicToObject* pPacket, Player* pPla #ifdef __GAME_SERVER__ - // ش Կ .. + // 렐릭을 해당 성물보관함에 넣을때.. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); - // 뿡 ̹ ִ - // 뿡 Slayer ְ pItem Slayer + // 성물 보관대에 이미 둘 다 있는 경우 + // 성물 보관대에 Slayer성물이 있고 pItem이 Slayer성물인 경우 PlayerCreature* pPlayerCreature = dynamic_cast(pCreature); - // ִ == Relic ? + // 현재 들고 있는 아이템 == Relic ? InventorySlot* pExtraInventorySlot = pPlayerCreature->getExtraInventorySlot(); Item* pItem = pExtraInventorySlot->getItem(); @@ -204,9 +204,9 @@ void CGRelicToObjectHandler::executeRelic(CGRelicToObject* pPacket, Player* pPla Item* pTableItem = pZone->getItem(pPacket->getObjectID()); - // ׷ item ų - // ü ƴϰų - // Monsterü ƴϸ 밡 ƴϴ. + // 그런 item이 없거나 + // 시체가 아니거나 + // Monster시체가 아니면 성물보관대가 아니다. if (pTableItem == NULL || pTableItem->getItemClass() != Item::ITEM_CLASS_CORPSE || pTableItem->getItemType() != MONSTER_CORPSE) { GCCannotAdd _GCCannotAdd; @@ -217,11 +217,11 @@ void CGRelicToObjectHandler::executeRelic(CGRelicToObject* pPacket, Player* pPla return; } - // + // 성물 보관대 MonsterCorpse* pCorpse = dynamic_cast(pTableItem); Assert(pCorpse != NULL); - // 2Ÿ ȿ ־ ȴ. + // 2타일 안에 있어야 된다. if (!verifyDistance(pCreature, pCorpse->getX(), pCorpse->getY(), 2)) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -231,7 +231,7 @@ void CGRelicToObjectHandler::executeRelic(CGRelicToObject* pPacket, Player* pPla return; } - // Relic θ üũѴ. + // Relic 소유 여부를 체크한다. bool bPlayerHasSlayerRelic = pCreature->isFlag(Effect::EFFECT_CLASS_HAS_SLAYER_RELIC); bool bPlayerHasVampireRelic = pCreature->isFlag(Effect::EFFECT_CLASS_HAS_VAMPIRE_RELIC); bool bTableHasSlayerRelic = pCorpse->isFlag(Effect::EFFECT_CLASS_SLAYER_RELIC); @@ -239,10 +239,10 @@ void CGRelicToObjectHandler::executeRelic(CGRelicToObject* pPacket, Player* pPla bool bSlayerRelicTable = pCorpse->isFlag(Effect::EFFECT_CLASS_SLAYER_RELIC_TABLE); bool bVampireRelicTable = pCorpse->isFlag(Effect::EFFECT_CLASS_VAMPIRE_RELIC_TABLE); - // ̹ ְų - // Player ų - // item ? - // ƴϰų + // 이미 두 성물이 다 있거나 + // Player가 두 성물이 다 없거나 + // item이 없는 경우? + // 성물이 아니거나 if ((bTableHasSlayerRelic && bTableHasVampireRelic) || (!bPlayerHasSlayerRelic && !bPlayerHasVampireRelic) || pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_RELIC) { GCCannotAdd _GCCannotAdd; @@ -255,7 +255,7 @@ void CGRelicToObjectHandler::executeRelic(CGRelicToObject* pPacket, Player* pPla ItemType_t relicIndex = pItem->getItemType(); - // RelicInfo ´. + // RelicInfo를 얻는다. const RelicInfo* pRelicInfo = dynamic_cast(g_pRelicInfoManager->getItemInfo(relicIndex)); if (pRelicInfo == NULL) { @@ -271,10 +271,10 @@ void CGRelicToObjectHandler::executeRelic(CGRelicToObject* pPacket, Player* pPla bool bSlayer = pCreature->isSlayer(); bool bVampire = pCreature->isVampire(); - // itemObjectID ߸Ǿų - // ִ ų - // ̰ų - // ̹ ִٸ . + // itemObjectID가 잘못되었거나 + // 들고 있는 아이템이 없거나 + // 남의 보관대이거나 + // 이미 같은 종족의 성물이 있다면 넣을 수 없다. if (pItem->getObjectID() != pPacket->getItemObjectID() || (bSlayer && bVampireRelicTable) || (bVampire && bSlayerRelicTable) || (bTableHasSlayerRelic && pRelicInfo->relicType == RELIC_TYPE_SLAYER) || (bTableHasVampireRelic && pRelicInfo->relicType == RELIC_TYPE_VAMPIRE)) { @@ -286,14 +286,14 @@ void CGRelicToObjectHandler::executeRelic(CGRelicToObject* pPacket, Player* pPla return; } - // ̾ , λ ̸ ȵǰ - // ̾ Ż, ̸ ȵȴ. + // 슬레이어인 경우는 오토바이, 스나이핑상태 이면 안되고 + // 뱀파이어인 경우는 변신상태, 투명상태이면 안된다. if (bSlayer) { Slayer* pSlayer = dynamic_cast(pCreature); - // ̸ Ÿ Ұϴ. + // 오토바이를 타고 있으면 불가능하다. if (!pSlayer->hasRideMotorcycle() && !pSlayer->isFlag(Effect::EFFECT_CLASS_SNIPING_MODE)) { - // Effect δ. + // Effect를 붙인다. Success = true; } } else if (bVampire) { @@ -305,17 +305,17 @@ void CGRelicToObjectHandler::executeRelic(CGRelicToObject* pPacket, Player* pPla } } - // 뿡 ִ + // 성물보관대에 성물을 넣을 수 있는 경우 if (Success) { - // Mouse + // Mouse에서 아이템을 지우고 pPlayerCreature->deleteItemFromExtraInventorySlot(); - // 뿡 ߰Ѵ. + // 성물을 성물 보관대에 추가한다. pCorpse->addTreasure(pItem); /* StringStream msg; - msg << pPlayerCreature->getName() << " 뿡 " - << "(" << pRelicInfo->getName() << ") ־ϴ."; */ + msg << pPlayerCreature->getName() << " 님이 성물 보관대에 " + << "성물(" << pRelicInfo->getName() << ")을 넣었습니다."; */ char msg[100]; sprintf(msg, g_pStringPool->c_str(STRID_PUT_RELIC_TO_RELIC_TABLE), pPlayerCreature->getName().c_str(), @@ -328,7 +328,7 @@ void CGRelicToObjectHandler::executeRelic(CGRelicToObject* pPacket, Player* pPla Effect::EffectClass effectClass; Effect::EffectClass effectClassTable; - // Creature Effect ϰ + // Creature에서 Effect를 제거하고 if (pRelicInfo->relicType == RELIC_TYPE_SLAYER) { effectClass = Effect::EFFECT_CLASS_HAS_SLAYER_RELIC; effectClassTable = Effect::EFFECT_CLASS_SLAYER_RELIC; @@ -340,12 +340,12 @@ void CGRelicToObjectHandler::executeRelic(CGRelicToObject* pPacket, Player* pPla Effect* pEffect = pCreature->findEffect(effectClass); Assert(pEffect != NULL); - // Creature flag - // GCRemoveEffect ȴ. + // Creature의 flag를 끄고 + // GCRemoveEffect를 보내게 된다. pEffect->unaffect(); pCreature->deleteEffect(effectClass); - // 밡 Relic ٴ Effect ٿش. + // 성물 보관대가 Relic을 가졌다는 Effect를 붙여준다. if (pRelicInfo->relicType == RELIC_TYPE_SLAYER) { EffectSlayerRelic* pEffect = new EffectSlayerRelic(pCorpse); @@ -360,14 +360,14 @@ void CGRelicToObjectHandler::executeRelic(CGRelicToObject* pPacket, Player* pPla pEffect->affect(pCorpse); } - // 뿡 Effect ΰ client ˸. + // 성물보관대에 Effect를 붙인걸 client에 알린다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pCorpse->getObjectID()); gcAddEffect.setEffectID(effectClassTable); gcAddEffect.setDuration(65000); pZone->broadcastPacket(pCorpse->getX(), pCorpse->getY(), &gcAddEffect); - // Ҵٰ ش. + // 성물 놓았다고 보내준다. GCDeleteObject gcDeleteObject; gcDeleteObject.setObjectID(pItem->getObjectID()); pPlayer->sendPacket(&gcDeleteObject); @@ -375,20 +375,20 @@ void CGRelicToObjectHandler::executeRelic(CGRelicToObject* pPacket, Player* pPla // RelicTable EffectRelicTable* pTableEffect = NULL; if (bSlayer) { - // Ѵ. + // 성물의 소유를 설정한다. g_pCombatInfoManager->setRelicOwner(relicIndex, CombatInfoManager::RELIC_OWNER_SLAYER); - // Ʈ ã´. + // 이펙트를 찾는다. Effect* pEffect = pCorpse->getEffectManager().findEffect(Effect::EFFECT_CLASS_SLAYER_RELIC_TABLE); Assert(pEffect != NULL); pTableEffect = dynamic_cast(pEffect); Assert(pTableEffect != NULL); } else { - // Ѵ. + // 성물의 소유를 설정한다. g_pCombatInfoManager->setRelicOwner(relicIndex, CombatInfoManager::RELIC_OWNER_VAMPIRE); - // Ʈ ã´. + // 이펙트를 찾는다. Effect* pEffect = pCorpse->getEffectManager().findEffect(Effect::EFFECT_CLASS_VAMPIRE_RELIC_TABLE); Assert(pEffect != NULL); @@ -396,25 +396,25 @@ void CGRelicToObjectHandler::executeRelic(CGRelicToObject* pPacket, Player* pPla Assert(pTableEffect != NULL); } - // ϳ  - // (10) . + // 성물이 하나 들어가면 + // 한 동안(10초)은 성물을 빼낼 수 없다. Timeval lockTime; getCurrentTime(lockTime); lockTime.tv_sec += 10; pTableEffect->setLockTime(lockTime); - // Ǵ + // 두 성물을 모두 갖게 되는 경우 if ((bTableHasSlayerRelic && pRelicInfo->relicType == RELIC_TYPE_VAMPIRE) || (bTableHasVampireRelic && pRelicInfo->relicType == RELIC_TYPE_SLAYER)) { - // 밡 ð + // 성물 보관대가 안전한 시간 설정 Timeval safeTime; getCurrentTime(safeTime); safeTime.tv_sec += g_pVariableManager->getCombatBonusTime() * 60; - // ¸ message ش. + // 승리 message 를 보내준다. GCSystemMessage gcSystemMessage; pTableEffect->setSafeTime(safeTime); @@ -427,10 +427,10 @@ void CGRelicToObjectHandler::executeRelic(CGRelicToObject* pPacket, Player* pPla g_pCombatInfoManager->setRelicOwner(relicIndex, CombatInfoManager::RELIC_OWNER_VAMPIRE); } - // Ǿ. + // 전쟁이 종료되었다. g_pCombatInfoManager->setCombat(false); - // ü ڿ message . + // 전체 사용자에게 message를 보낸다. g_pZoneGroupManager->broadcast(&gcSystemMessage); g_pCombatInfoManager->computeModify(); @@ -459,20 +459,20 @@ void CGRelicToObjectHandler::executeBloodBible(CGRelicToObject* pPacket, Player* Assert(pZone != NULL); - // 뿡 ̹ ִ - // 뿡 Slayer ְ pItem Slayer + // 성물 보관대에 이미 둘 다 있는 경우 + // 성물 보관대에 Slayer성물이 있고 pItem이 Slayer성물인 경우 PlayerCreature* pPlayerCreature = dynamic_cast(pCreature); - // ִ == Relic ? + // 현재 들고 있는 아이템 == Relic ? InventorySlot* pExtraInventorySlot = pPlayerCreature->getExtraInventorySlot(); Item* pItem = pExtraInventorySlot->getItem(); Item* pTableItem = pZone->getItem(pPacket->getObjectID()); - // ׷ item ų - // ü ƴϰų - // Monsterü ƴϰų - // ShrineGuard ShrineHoly ƴϸ.. ƴ. + // 그런 item이 없거나 + // 시체가 아니거나 + // Monster시체가 아니거나 + // ShrineGuard도 ShrineHoly도 아니면.. 성단이 아니지. if (pTableItem == NULL || pTableItem->getItemClass() != Item::ITEM_CLASS_CORPSE || pTableItem->getItemType() != MONSTER_CORPSE || (!pTableItem->isFlag(Effect::EFFECT_CLASS_SHRINE_GUARD) && @@ -485,12 +485,12 @@ void CGRelicToObjectHandler::executeBloodBible(CGRelicToObject* pPacket, Player* return; } - // + // 성단 MonsterCorpse* pCorpse = dynamic_cast(pTableItem); Assert(pCorpse != NULL); - // 2Ÿ ȿ ʰų - // shrine ȵǾ + // 2타일 안에 있지 않거나 + // shrine으로 설정이 안되어 있으면 if (!verifyDistance(pCreature, pCorpse->getX(), pCorpse->getY(), 2) || !pCorpse->isShrine()) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -501,7 +501,7 @@ void CGRelicToObjectHandler::executeBloodBible(CGRelicToObject* pPacket, Player* } if (g_pShrineInfoManager->putBloodBible(pPlayerCreature, pItem, pCorpse)) { - // putBloodBible ȿ óѴ. + // putBloodBible 안에서 처리한다. } #endif @@ -521,11 +521,11 @@ void CGRelicToObjectHandler::executeCastleSymbol(CGRelicToObject* pPacket, Playe Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // 뿡 ̹ ִ - // 뿡 Slayer ְ pItem Slayer + // 성물 보관대에 이미 둘 다 있는 경우 + // 성물 보관대에 Slayer성물이 있고 pItem이 Slayer성물인 경우 PlayerCreature* pPlayerCreature = dynamic_cast(pCreature); - // ִ == Relic ? + // 현재 들고 있는 아이템 == Relic ? InventorySlot* pExtraInventorySlot = pPlayerCreature->getExtraInventorySlot(); Item* pItem = pExtraInventorySlot->getItem(); @@ -534,10 +534,10 @@ void CGRelicToObjectHandler::executeCastleSymbol(CGRelicToObject* pPacket, Playe // cout << "executeCastleSymbol" << endl; - // ׷ item ų - // ü ƴϰų - // Monsterü ƴϰų - // ShrineGuard ShrineHoly ƴϸ.. ƴ. + // 그런 item이 없거나 + // 시체가 아니거나 + // Monster시체가 아니거나 + // ShrineGuard도 ShrineHoly도 아니면.. 성단이 아니지. if (pTableItem == NULL || pTableItem->getItemClass() != Item::ITEM_CLASS_CORPSE || pTableItem->getItemType() != MONSTER_CORPSE || (!pTableItem->isFlag(Effect::EFFECT_CLASS_CASTLE_SHRINE_GUARD) && @@ -550,12 +550,12 @@ void CGRelicToObjectHandler::executeCastleSymbol(CGRelicToObject* pPacket, Playe return; } - // + // 성단 MonsterCorpse* pCorpse = dynamic_cast(pTableItem); Assert(pCorpse != NULL); - // 2Ÿ ȿ ʰų - // shrine ȵǾ + // 2타일 안에 있지 않거나 + // shrine으로 설정이 안되어 있으면 if (!verifyDistance(pCreature, pCorpse->getX(), pCorpse->getY(), 2) || !pCorpse->isShrine()) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -574,7 +574,7 @@ void CGRelicToObjectHandler::executeCastleSymbol(CGRelicToObject* pPacket, Playe // } #else if (g_pCastleShrineInfoManager->putCastleSymbol(pPlayerCreature, pItem, pCorpse)) { - // putCastleSymbol ȿ óѴ. + // putCastleSymbol 안에서 처리한다. } #endif @@ -598,20 +598,20 @@ void CGRelicToObjectHandler::executeFlag(CGRelicToObject* pPacket, Player* pPlay Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // 뿡 ̹ ִ - // 뿡 Slayer ְ pItem Slayer + // 성물 보관대에 이미 둘 다 있는 경우 + // 성물 보관대에 Slayer성물이 있고 pItem이 Slayer성물인 경우 PlayerCreature* pPlayerCreature = dynamic_cast(pCreature); - // ִ == Flag ? + // 현재 들고 있는 아이템 == Flag ? InventorySlot* pExtraInventorySlot = pPlayerCreature->getExtraInventorySlot(); Item* pItem = pExtraInventorySlot->getItem(); Item* pTableItem = pZone->getItem(pPacket->getObjectID()); - // ׷ item ų - // ü ƴϰų - // Monsterü ƴϰų - // 밡 ƴϸ + // 그런 item이 없거나 + // 시체가 아니거나 + // Monster시체가 아니거나 + // 깃대가 아니면 if (pTableItem == NULL || pTableItem->getItemClass() != Item::ITEM_CLASS_CORPSE || pTableItem->getItemType() != MONSTER_CORPSE || !g_pFlagManager->isFlagPole(dynamic_cast(pTableItem))) { @@ -623,12 +623,12 @@ void CGRelicToObjectHandler::executeFlag(CGRelicToObject* pPacket, Player* pPlay return; } - // + // 성단 MonsterCorpse* pCorpse = dynamic_cast(pTableItem); Assert(pCorpse != NULL); - // 2Ÿ ȿ ʰų - // shrine ȵǾ + // 2타일 안에 있지 않거나 + // shrine으로 설정이 안되어 있으면 if (!verifyDistance(pCreature, pCorpse->getX(), pCorpse->getY(), 2) || !pCorpse->isShrine()) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -639,8 +639,8 @@ void CGRelicToObjectHandler::executeFlag(CGRelicToObject* pPacket, Player* pPlay } if (g_pFlagManager->putFlag(pPlayerCreature, pItem, pCorpse)) { - // putCastleSymbol ȿ óѴ. - // cout << " Ⱦ~" << endl; + // putCastleSymbol 안에서 처리한다. + // cout << "깃발 꽂았지롱~" << endl; } else { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -683,10 +683,10 @@ void CGRelicToObjectHandler::executeSweeper(CGRelicToObject* pPacket, Player* pP const SweeperInfo* pSweeperInfo = dynamic_cast(g_pSweeperInfoManager->getItemInfo(pItem->getItemType())); - // ׷ item ų - // ü ƴϰų - // Monsterü ƴϰų - // 밡 ƴϸ + // 그런 item이 없거나 + // 시체가 아니거나 + // Monster시체가 아니거나 + // 깃대가 아니면 if (pTableItem == NULL || pTableItem->getItemClass() != Item::ITEM_CLASS_CORPSE || pTableItem->getItemType() != MONSTER_CORPSE || !pLevelWarManager->isSafe(dynamic_cast(pTableItem))) { @@ -698,12 +698,12 @@ void CGRelicToObjectHandler::executeSweeper(CGRelicToObject* pPacket, Player* pP return; } - // + // 성단 MonsterCorpse* pCorpse = dynamic_cast(pTableItem); Assert(pCorpse != NULL); - // 2Ÿ ȿ ʰų - // shrine ȵǾ + // 2타일 안에 있지 않거나 + // shrine으로 설정이 안되어 있으면 if (!verifyDistance(pCreature, pCorpse->getX(), pCorpse->getY(), 2)) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -714,7 +714,7 @@ void CGRelicToObjectHandler::executeSweeper(CGRelicToObject* pPacket, Player* pP } if (pLevelWarManager->putSweeper(pPlayerCreature, pItem, pCorpse)) { - // Sweeper Ⱦ ִ ش + // Sweeper 를 꽂았으면 가지고 있던 건 지워준다 pPlayerCreature->deleteItemFromExtraInventorySlot(); GCDeleteInventoryItem gcDeleteInventoryItem; gcDeleteInventoryItem.setObjectID(pPacket->getItemObjectID()); @@ -725,7 +725,7 @@ void CGRelicToObjectHandler::executeSweeper(CGRelicToObject* pPacket, Player* pP pEffect->setDeadline(0); } - // Ⱦ ý ޼ ѷش + // 꽂았을 때 존에 시스템 메세지를 뿌려준다 char race[15]; if (pCreature->isSlayer()) { sprintf(race, g_pStringPool->c_str(STRID_SLAYER)); diff --git a/src/Core/CGReloadFromInventory.h b/src/Core/CGReloadFromInventory.h index 03cff6a9..75b7ed55 100644 --- a/src/Core/CGReloadFromInventory.h +++ b/src/Core/CGReloadFromInventory.h @@ -29,10 +29,10 @@ class CGReloadFromInventory : public Packet { ~CGReloadFromInventory(); public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -45,7 +45,7 @@ class CGReloadFromInventory : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CGReloadFromInventoryPacketSize ؼ ϶. + // const static CGReloadFromInventoryPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szObjectID + szCoordInven + szCoordInven; } @@ -88,7 +88,7 @@ class CGReloadFromInventory : public Packet { // ObjectID ObjectID_t m_ObjectID; - // Inventory X, Y ǥ + // Inventory의 X, Y 좌표 CoordInven_t m_InvenX; CoordInven_t m_InvenY; }; @@ -121,7 +121,7 @@ class CGReloadFromInventoryFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGReloadFromInventoryPacketSize ؼ ϶. + // const static CGReloadFromInventoryPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szCoordInven + szCoordInven; } diff --git a/src/Core/CGReloadFromInventoryHandler.cpp b/src/Core/CGReloadFromInventoryHandler.cpp index 0b456daa..3ee0edbb 100644 --- a/src/Core/CGReloadFromInventoryHandler.cpp +++ b/src/Core/CGReloadFromInventoryHandler.cpp @@ -61,7 +61,7 @@ void CGReloadFromInventoryHandler::execute(CGReloadFromInventory* pPacket, Playe return; } - // κ丮 ִ Object ޴´. + // 인벤토리 슬랏에 있는 아이템의 Object를 받는다. ItemObjectID = pItem->getObjectID(); if (ItemObjectID != pPacket->getObjectID()) { @@ -79,7 +79,7 @@ void CGReloadFromInventoryHandler::execute(CGReloadFromInventory* pPacket, Playe } } - // reload delay Ƿ effect Ų. + // reload delay가 있으므로 effect에 등록 시킨다. EffectManager* pEffectManager = pSlayer->getEffectManager(); if (pEffectManager == NULL) return; @@ -92,9 +92,9 @@ void CGReloadFromInventoryHandler::execute(CGReloadFromInventory* pPacket, Playe pEffect->setInventoryXY(x, y); if (pSlayer->hasSkill(SKILL_FAST_RELOAD)) - pEffect->setDeadline(7); // reload(0.7) + pEffect->setDeadline(7); // 빠른 reload(0.7초) else - pEffect->setDeadline(2 * 10); // reload(2sec) + pEffect->setDeadline(2 * 10); // 보통 reload(2sec) pSlayer->setFlag(Effect::EFFECT_CLASS_RELOAD_TIMER); pEffectManager->addEffect(pEffect); diff --git a/src/Core/CGReloadFromQuickSlot.h b/src/Core/CGReloadFromQuickSlot.h index de9c8832..89ce3e1f 100644 --- a/src/Core/CGReloadFromQuickSlot.h +++ b/src/Core/CGReloadFromQuickSlot.h @@ -29,10 +29,10 @@ class CGReloadFromQuickSlot : public Packet { ~CGReloadFromQuickSlot(); public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -45,7 +45,7 @@ class CGReloadFromQuickSlot : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CGReloadFromQuickSlotPacketSize ؼ ϶. + // const static CGReloadFromQuickSlotPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szObjectID + szSlotID; } @@ -80,7 +80,7 @@ class CGReloadFromQuickSlot : public Packet { // ObjectID ObjectID_t m_ObjectID; - // QuickSlot ID + // QuickSlot의 ID SlotID_t m_SlotID; }; @@ -112,7 +112,7 @@ class CGReloadFromQuickSlotFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGReloadFromQuickSlotPacketSize ؼ ϶. + // const static CGReloadFromQuickSlotPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szSlotID; } diff --git a/src/Core/CGReloadFromQuickSlotHandler.cpp b/src/Core/CGReloadFromQuickSlotHandler.cpp index 754c38c5..a742e0d1 100644 --- a/src/Core/CGReloadFromQuickSlotHandler.cpp +++ b/src/Core/CGReloadFromQuickSlotHandler.cpp @@ -81,10 +81,10 @@ void CGReloadFromQuickSlotHandler::execute(CGReloadFromQuickSlot* pPacket, Playe return; } - // ִ Object ޴´. + // 슬랏에 있는 아이템의 Object를 받는다. ItemObjectID = pBeltItem->getObjectID(); - // ִ ObjectID ġϴ üũѴ. + // 아이템이 있는지 그 아이템의 ObjectID가 일치하는지 체크한다. if (ItemObjectID == pPacket->getObjectID() && pBeltItem->getItemClass() == Item::ITEM_CLASS_MAGAZINE) { SkillSlot* pVivid = pSlayer->getSkill(SKILL_VIVID_MAGAZINE); bool hasVivid = (pVivid != NULL) && pVivid->canUse(); @@ -96,7 +96,7 @@ void CGReloadFromQuickSlotHandler::execute(CGReloadFromQuickSlot* pPacket, Playe } } - // Ŷ . + // 검증 패킷을 날린다. EffectManager* pEffectManager = pSlayer->getEffectManager(); if (Success && !pSlayer->isFlag(Effect::EFFECT_CLASS_RELOAD_TIMER)) { EffectReloadTimer* pEffect = new EffectReloadTimer(pSlayer); @@ -104,9 +104,9 @@ void CGReloadFromQuickSlotHandler::execute(CGReloadFromQuickSlot* pPacket, Playe pEffect->setObjectID(ItemObjectID); pEffect->setSlotID(SlotID); if (pSlayer->hasSkill(SKILL_FAST_RELOAD)) { - pEffect->setDeadline(7); // reload(0.7) + pEffect->setDeadline(7); // 빠른 reload(0.7초) } else { - pEffect->setDeadline(2 * 10); // reload(2sec) + pEffect->setDeadline(2 * 10); // 보통 reload(2sec) } pSlayer->setFlag(Effect::EFFECT_CLASS_RELOAD_TIMER); diff --git a/src/Core/CGRequestGuildList.h b/src/Core/CGRequestGuildList.h index 67b73d66..4e725f22 100644 --- a/src/Core/CGRequestGuildList.h +++ b/src/Core/CGRequestGuildList.h @@ -28,17 +28,17 @@ typedef BYTE GuildType_t; class CGRequestGuildList : public Packet { public: enum { - GUILDTYPE_WAIT, // ϴ . - GUILDTYPE_NORMAL, // ϵ (Ϲݱ). + GUILDTYPE_WAIT, // 등록대기중 길드. + GUILDTYPE_NORMAL, // 등록된 길드(일반길드). GUILDTYPE_MAX }; CGRequestGuildList() {}; virtual ~CGRequestGuildList() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGRequestGuildListHandler.cpp b/src/Core/CGRequestGuildListHandler.cpp index 2e4590f4..3d9fd130 100644 --- a/src/Core/CGRequestGuildListHandler.cpp +++ b/src/Core/CGRequestGuildListHandler.cpp @@ -46,14 +46,14 @@ void CGRequestGuildListHandler::execute(CGRequestGuildList* pPacket, Player* pPl #ifdef __OLD_GUILD_WAR__ GCSystemMessage gcSM; - gcSM.setMessage(" ʴ Դϴ."); + gcSM.setMessage("아직 지원되지 않는 기능입니다."); pGamePlayer->sendPacket(&gcSM); return; #endif GuildType_t tmpGuildType = pPacket->getGuildType(); - // ̸ + // 대기길드 이면 if (tmpGuildType == CGRequestGuildList::GUILDTYPE_WAIT) { GCWaitGuildList gcWaitGuildList; @@ -72,7 +72,7 @@ void CGRequestGuildListHandler::execute(CGRequestGuildList* pPacket, Player* pPl pPlayer->sendPacket(&gcWaitGuildList); } - // Ϲݱ ̸ + // 일반길드 이면 else if (tmpGuildType == CGRequestGuildList::GUILDTYPE_NORMAL) { GCActiveGuildList gcActiveGuildList; diff --git a/src/Core/CGRequestGuildMemberList.h b/src/Core/CGRequestGuildMemberList.h index 7ba4710f..b3a90a9b 100644 --- a/src/Core/CGRequestGuildMemberList.h +++ b/src/Core/CGRequestGuildMemberList.h @@ -25,10 +25,10 @@ class CGRequestGuildMemberList : public Packet { public: CGRequestGuildMemberList() {}; virtual ~CGRequestGuildMemberList() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGRequestGuildMemberListHandler.cpp b/src/Core/CGRequestGuildMemberListHandler.cpp index b28bb3b6..63567a12 100644 --- a/src/Core/CGRequestGuildMemberListHandler.cpp +++ b/src/Core/CGRequestGuildMemberListHandler.cpp @@ -37,7 +37,7 @@ void CGRequestGuildMemberListHandler::execute(CGRequestGuildMemberList* pPacket, PlayerCreature* pPlayerCreature = dynamic_cast(pGamePlayer->getCreature()); Assert(pPlayerCreature != NULL); - // 带 ´. + // 선택한 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPlayerCreature->getGuildID()); // try { Assert(pGuild != NULL); } catch (Throwable& ) { return; } if (pGuild == NULL) diff --git a/src/Core/CGRequestIP.cpp b/src/Core/CGRequestIP.cpp index f753672d..ccce6af4 100644 --- a/src/Core/CGRequestIP.cpp +++ b/src/Core/CGRequestIP.cpp @@ -2,7 +2,7 @@ // Filename : CGRequestIP.cpp // Written By : // Description : -// ϴ IP û +// 서버에 원하는 사람의 IP 요청 ////////////////////////////////////////////////////////////////////////////// #include "CGRequestIP.h" diff --git a/src/Core/CGRequestIP.h b/src/Core/CGRequestIP.h index 6205c904..dc2cdf4f 100644 --- a/src/Core/CGRequestIP.h +++ b/src/Core/CGRequestIP.h @@ -12,9 +12,9 @@ ////////////////////////////////////////////////////////////////////////////// // class CGRequestIP; -// client server IP ûϴµ -// ó ִٸ objectID ûϰ -// ƴϸ.. ij ̸ ûѴ. +// client에서 server로 누군가의 IP를 요청하는데 +// 누군가가 근처에 있다면 objectID로 요청하고 +// 아니면.. 캐릭터 이름으로 요청한다. ////////////////////////////////////////////////////////////////////////////// class CGRequestIP : public Packet { diff --git a/src/Core/CGRequestIPHandler.cpp b/src/Core/CGRequestIPHandler.cpp index 75cef032..e50e5443 100644 --- a/src/Core/CGRequestIPHandler.cpp +++ b/src/Core/CGRequestIPHandler.cpp @@ -28,7 +28,7 @@ void CGRequestIPHandler::execute(CGRequestIP* pPacket, Player* pPlayer) Assert(pPlayer != NULL); try { - // UserIPInfo ̺ IP Ѵ. + // UserIPInfo 테이블에서 사용자 IP를 쿼리 한다. Statement* pStmt = NULL; BEGIN_DB { @@ -38,7 +38,7 @@ void CGRequestIPHandler::execute(CGRequestIP* pPacket, Player* pPlayer) if (pResult->getRowCount() == 0) { SAFE_DELETE(pStmt); - throw NoSuchElementException("û ID IP ."); + throw NoSuchElementException("요청한 ID의 IP정보가 없음다."); } else { pResult->next(); IP_t IP = pResult->getDWORD(1); @@ -58,7 +58,7 @@ void CGRequestIPHandler::execute(CGRequestIP* pPacket, Player* pPlayer) } // catch (NoSuchElementException & nsee) catch (Throwable& t) { - // no such .. + // no such인 경우.. GCRequestFailed gcRequestFailed; gcRequestFailed.setCode(REQUEST_FAILED_IP); gcRequestFailed.setName(pPacket->getName()); diff --git a/src/Core/CGRequestInfo.h b/src/Core/CGRequestInfo.h index 62b53b07..2e1d84bf 100644 --- a/src/Core/CGRequestInfo.h +++ b/src/Core/CGRequestInfo.h @@ -1,7 +1,7 @@ //-------------------------------------------------------------------------------- // // Filename : CGRequestInfo.h -// Written By : 輺 +// Written By : 김성민 // //-------------------------------------------------------------------------------- @@ -30,10 +30,10 @@ class CGRequestInfo : public Packet { public: CGRequestInfo() {}; virtual ~CGRequestInfo() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -46,7 +46,7 @@ class CGRequestInfo : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CGRequestInfoPacketSize ؼ ϶. + // const static CGRequestInfoPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szBYTE + szuint; } @@ -110,7 +110,7 @@ class CGRequestInfoFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGRequestInfoPacketSize ؼ ϶. + // const static CGRequestInfoPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + szuint; } diff --git a/src/Core/CGRequestInfoHandler.cpp b/src/Core/CGRequestInfoHandler.cpp index e83d4b88..a673b837 100644 --- a/src/Core/CGRequestInfoHandler.cpp +++ b/src/Core/CGRequestInfoHandler.cpp @@ -17,7 +17,7 @@ #endif ////////////////////////////////////////////////////////////////////////////// -// ûϴ ̴. +// 뭔가에 대한 정보를 요청하는 경우이다. ////////////////////////////////////////////////////////////////////////////// void CGRequestInfoHandler::execute(CGRequestInfo* pPacket, Player* pPlayer) { __BEGIN_TRY __BEGIN_DEBUG_EX @@ -32,7 +32,7 @@ void CGRequestInfoHandler::execute(CGRequestInfo* pPacket, Player* pPlayer) { switch (pPacket->getCode()) { //------------------------------------------------------------ - // ٸ ij ûϴ + // 다른 캐릭터의 정보를 요청하는 경우 //------------------------------------------------------------ case CGRequestInfo::REQUEST_CHARACTER_INFO: { Creature* pCreature = pGamePlayer->getCreature(); @@ -44,7 +44,7 @@ void CGRequestInfoHandler::execute(CGRequestInfo* pPacket, Player* pPlayer) { Creature* pTargetCreature = pZone->getCreature(pPacket->getValue()); if (pTargetCreature != NULL && pTargetCreature->isPC()) { - //  ƴ 츸 ȴ. + // 볼려는 대상이 운영자 모양이 아닌 경우만 된다. if (pTargetCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pTargetCreature); if (pSlayer->getCompetenceShape() != 1) @@ -67,8 +67,8 @@ void CGRequestInfoHandler::execute(CGRequestInfo* pPacket, Player* pPlayer) { GCOtherModifyInfo gcOtherModifyInfo; GCOtherGuildName gcOtherGuildName; - // κ - // ش. + // 값 설정 부분 + // 같은 종족만 보여준다. if ((pCreature->isSlayer() || pCreature->getCompetenceShape() != 1) && pTargetCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pTargetCreature); diff --git a/src/Core/CGRequestRepair.cpp b/src/Core/CGRequestRepair.cpp index 79c2885f..260ff016 100644 --- a/src/Core/CGRequestRepair.cpp +++ b/src/Core/CGRequestRepair.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGRequestRepair.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGRequestRepair.h b/src/Core/CGRequestRepair.h index bbb419dd..cd6d29aa 100644 --- a/src/Core/CGRequestRepair.h +++ b/src/Core/CGRequestRepair.h @@ -1,7 +1,7 @@ //----------------------------------------------------------------------------- // // Filename : CGRequestRepair.h -// Written By : 輺 +// Written By : 김성민 // Description : // //----------------------------------------------------------------------------- @@ -23,10 +23,10 @@ class CGRequestRepair : public Packet { public: CGRequestRepair() {}; virtual ~CGRequestRepair() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGRequestRepairHandler.cpp b/src/Core/CGRequestRepairHandler.cpp index 4c73c479..062405b8 100644 --- a/src/Core/CGRequestRepairHandler.cpp +++ b/src/Core/CGRequestRepairHandler.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGRequestRepairHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -46,7 +46,7 @@ void CGRequestRepairHandler::execute(CGRequestRepair* pPacket, Player* pPlayer) bool bOusters = false; Item* pItem = NULL; - // ÷̾ ̾ ̾ . + // 플레이어가 슬레이어인지 뱀파이어인지 구분. if (pPC->isSlayer()) bSlayer = true; else if (pPC->isVampire()) @@ -57,7 +57,7 @@ void CGRequestRepairHandler::execute(CGRequestRepair* pPacket, Player* pPlayer) throw ProtocolException("CGRequestRepairHandler::execute() : Unknown player creature!"); if (ITEMOID == 0) { - // ObjectID 0̶ ϰ ϴ ̴. + // ObjectID가 0이라면 모든 아이템을 수리하고자 하는 것이다. executeAll(pPacket, pPlayer); } else { if (bSlayer) @@ -67,16 +67,16 @@ void CGRequestRepairHandler::execute(CGRequestRepair* pPacket, Player* pPlayer) else if (bOusters) pItem = (dynamic_cast(pPC))->findItemOID(ITEMOID); - // ÷̾ ִٸ + // 플레이어가 아이템을 가지고 있다면 if (pItem != NULL) { - // Ŭ Ű... + // 그 아이템이 모터 사이클 키라면... if (pItem->getItemClass() == Item::ITEM_CLASS_KEY && pItem->getItemType() == 2) { executeMotorcycle(pPacket, pPlayer); return; } else executeNormal(pPacket, pPlayer); } else { - // , 翬 . + // 아이템이 없으니, 당연히 수리할 수 없다. GCNPCResponse response; response.setCode(NPC_RESPONSE_REPAIR_FAIL_ITEM_NOT_EXIST); pPlayer->sendPacket(&response); @@ -89,7 +89,7 @@ void CGRequestRepairHandler::execute(CGRequestRepair* pPacket, Player* pPlayer) } ////////////////////////////////////////////////////////////////////////////// -// Ϲ óѴ. +// 일반 아이템을 처리한다. ////////////////////////////////////////////////////////////////////////////// void CGRequestRepairHandler::executeNormal(CGRequestRepair* pPacket, Player* pPlayer) @@ -114,7 +114,7 @@ void CGRequestRepairHandler::executeNormal(CGRequestRepair* pPacket, Player* pPl int Y = 0; GCNPCResponse response; - // ÷̾ ̾ ̾ . + // 플레이어가 슬레이어인지 뱀파이어인지 구분. if (pPC->isSlayer()) bSlayer = true; else if (pPC->isVampire()) @@ -122,7 +122,7 @@ void CGRequestRepairHandler::executeNormal(CGRequestRepair* pPacket, Player* pPl else if (pPC->isOusters()) bOusters = true; - // ÷̾ Ϸ ϴ ִ ˻ + // 플레이어가 수리하려고 하는 아이템을 가지고 있는지 검사 if (bSlayer) { pSlayer = dynamic_cast(pPC); playerMoney = pSlayer->getGold(); @@ -137,16 +137,16 @@ void CGRequestRepairHandler::executeNormal(CGRequestRepair* pPacket, Player* pPl pItem = pOusters->findItemOID(ITEMOID, storage, X, Y); } - // ÷̾ Ϸ ϴ ִ - // ˻縦 ϱ , pItem ϸ . - // , ˻Ѵ. + // 플레이어가 수리하려고 하는 아이템을 가지고 있는지 + // 상위에서 검사를 하기 때문에, pItem이 널일리는 없다. + // 단, 수리할 수 없는 아이템인지를 검사한다. if (isRepairableItem(pItem) == false) { response.setCode(NPC_RESPONSE_REPAIR_FAIL_ITEM_TYPE); pPlayer->sendPacket(&response); return; } - // Ѵ. + // 이전 내구도를 저장한다. Durability_t oldDurability = pItem->getDurability(); repairPrice = g_pPriceManager->getRepairPrice(pItem); @@ -157,10 +157,10 @@ void CGRequestRepairHandler::executeNormal(CGRequestRepair* pPacket, Player* pPl return; } - // Ѵ. + // 수리한다. repairItem(pItem); - // â ̰ 0 ̾ٸ Ѵ. + // 수리한 아이템이 기어창의 아이템이고 이전 내구도가 0 이었다면 정보를 새로 보내줘야한다. if (storage == STORAGE_GEAR && oldDurability == 0) { if (bSlayer && pSlayer != NULL) { pSlayer->initAllStatAndSend(); @@ -174,7 +174,7 @@ void CGRequestRepairHandler::executeNormal(CGRequestRepair* pPacket, Player* pPl } } - // δ. + // 돈을 줄인다. if (bSlayer) { // pSlayer->setGoldEx(playerMoney-repairPrice); // by sigi. 2002.9.4 @@ -190,13 +190,13 @@ void CGRequestRepairHandler::executeNormal(CGRequestRepair* pPacket, Player* pPl // log(LOG_REPAIR_ITEM, pOusters->getName(), "", pItem->toString()); } - // ߴٴ DBٰ ش. - // и STORAGE_STASH ƿ , - // Կ ִ Ѵٴ ǹǷ, - // ʴ´. + // 아이템을 수리했다는 정보를 DB에다가 저장해준다. + // 단 분명히 STORAGE_STASH가 돌아올 수 있지만, + // 보관함에 있는 것을 수리한다는 것은 말이 안 되므로, + // 저장하지 않는다. - // item ȭ. by sigi. 2002.5.17 + // item저장 최적화. by sigi. 2002.5.17 if (repairPrice > 0) { char pField[80]; @@ -214,10 +214,10 @@ void CGRequestRepairHandler::executeNormal(CGRequestRepair* pPacket, Player* pPl } /* - // Ƶ.. durability ٲٸ ȴ. - // ٵ.. ItemObject Durability field ͵ ְ - // Charge ؾ ϴ ͵ ִ. - // ׷.. ϴ ϴ save ̿ϵ Ѵ. + // 뭐가 됐든.. durability만 바꾸면 된다. + // 근데.. ItemObject에 Durability field가 없는 것도 있고 + // Charge를 저장해야 하는 것도 있다. + // 그래서.. 일단은 모두 다 저장하는 save를 이용하도록 한다. switch (storage) { case STORAGE_INVENTORY: @@ -244,7 +244,7 @@ void CGRequestRepairHandler::executeNormal(CGRequestRepair* pPacket, Player* pPl } */ - // OK Ŷ ش. + // OK 패킷을 날려준다. response.setCode(NPC_RESPONSE_REPAIR_OK); response.setParameter(playerMoney - repairPrice); pPlayer->sendPacket(&response); @@ -256,7 +256,7 @@ void CGRequestRepairHandler::executeNormal(CGRequestRepair* pPacket, Player* pPl ////////////////////////////////////////////////////////////////////////////// -// Ŭ óѴ. +// 모터 사이클을 처리한다. ////////////////////////////////////////////////////////////////////////////// void CGRequestRepairHandler::executeMotorcycle(CGRequestRepair* pPacket, Player* pPlayer) @@ -265,7 +265,7 @@ void CGRequestRepairHandler::executeMotorcycle(CGRequestRepair* pPacket, Player* #ifdef __GAME_SERVER__ - // Ŷ ̾Ƴ. + // 패킷 정보를 뽑아낸다. ObjectID_t ITEMOID = pPacket->getObjectID(); Creature* pPC = dynamic_cast(pPlayer)->getCreature(); Zone* pZone = pPC->getZone(); @@ -278,7 +278,7 @@ void CGRequestRepairHandler::executeMotorcycle(CGRequestRepair* pPacket, Player* bool bOusters = false; GCNPCResponse response; - // ÷̾ ̾ ̾ . + // 플레이어가 슬레이어인지 뱀파이어인지 구분. if (pPC->isSlayer()) bSlayer = true; else if (pPC->isVampire()) @@ -288,8 +288,8 @@ void CGRequestRepairHandler::executeMotorcycle(CGRequestRepair* pPacket, Player* else throw ProtocolException("CGRequestRepairHandler::execute() : Unknown player creature!"); - // ÷̾ Ϸ ϴ ִ - // ˻縦 ϱ , pItem ϸ . + // 플레이어가 수리하려고 하는 아이템을 가지고 있는지 + // 상위에서 검사를 하기 때문에, pItem이 널일리는 없다. if (bSlayer) { pItem = (dynamic_cast(pPC))->findItemOID(ITEMOID); playerMoney = (dynamic_cast(pPC))->getGold(); @@ -301,7 +301,7 @@ void CGRequestRepairHandler::executeMotorcycle(CGRequestRepair* pPacket, Player* playerMoney = (dynamic_cast(pPC))->getGold(); } - // ˻ؼ, Ŭ ִ ȮѴ. + // 주위 일정 범위를 검색해서, 모터 사이클이 있는지 확인한다. for (ZoneCoord_t zx = CenterX - 5; zx <= CenterX + 5; zx++) { for (ZoneCoord_t zy = CenterY - 5; zy <= CenterY + 5; zy++) { if (!isValidZoneCoord(pZone, zx, zy)) @@ -313,7 +313,7 @@ void CGRequestRepairHandler::executeMotorcycle(CGRequestRepair* pPacket, Player* Item* pItemOnTile = tile.getItem(); Assert(pItemOnTile != NULL); - // Ÿ , Ŭ ȮѴ. + // 만일 아이템이 타일 위에 있을 경우, 모터 사이클인지 확인한다. if (pItemOnTile->getItemClass() == Item::ITEM_CLASS_MOTORCYCLE) { DWORD targetID = dynamic_cast(pItem)->getTarget(); ItemID_t motorcycleID = pItemOnTile->getItemID(); @@ -327,18 +327,18 @@ void CGRequestRepairHandler::executeMotorcycle(CGRequestRepair* pPacket, Player* return; } - // Ѵ. + // 수리한다. repairItem(pItemOnTile); - // Ѵ. + // 저장한다. // pItemOnTile->save(pPC->getName(), STORAGE_ZONE, pZone->getZoneID(), zx, zy); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Durability=%d", pItemOnTile->getDurability()); pItemOnTile->tinysave(pField); - // δ. + // 돈을 줄인다. // if (bSlayer) (dynamic_cast(pPC))->setGoldEx(playerMoney-repairPrice); // else (dynamic_cast(pPC))->setGoldEx(playerMoney-repairPrice); @@ -356,8 +356,8 @@ void CGRequestRepairHandler::executeMotorcycle(CGRequestRepair* pPacket, Player* } // end of for (ZoneCoord_t zy=CenterY-5; zy<=CenterY+5; zy++) } // end of for (ZoneCoord_t zx=CenterX-5; zx<=CenterX+5; zx++) - // FOR , ̱ Դٴ ó ̰ ٴ ̴... - // ׷Ƿ Ŭ ȱⰡ ߴٴ ˸. + // FOR 루프를 다 돌고, 이까지 왔다는 것은 근처에 오토바이가 없다는 말이당... + // 그러므로 모터 사이클 팔기가 실패했다는 것을 알린다. response.setCode(NPC_RESPONSE_REPAIR_FAIL_ITEM_NOT_EXIST); pPlayer->sendPacket(&response); @@ -367,7 +367,7 @@ void CGRequestRepairHandler::executeMotorcycle(CGRequestRepair* pPacket, Player* } ////////////////////////////////////////////////////////////////////////////// -// ϱ +// 모든 아이템 수리하기 ////////////////////////////////////////////////////////////////////////////// void CGRequestRepairHandler::executeAll(CGRequestRepair* pPacket, Player* pPlayer) @@ -385,43 +385,43 @@ void CGRequestRepairHandler::executeAll(CGRequestRepair* pPacket, Player* pPlaye if (pPC->isSlayer()) { Slayer* pSlayer = dynamic_cast(pPC); - // Ѵ. + // 모든 아이템을 합한 수리비를 계산한다. for (int i = 0; i < Slayer::WEAR_MAX; i++) { Item* pItem = pSlayer->getWearItem((Slayer::WearPart)i); if (pItem != NULL) { if (i == Slayer::WEAR_RIGHTHAND && isTwohandWeapon(pItem)) { - // ̰, ִ Ⱑ ... - // ݿ Խų ʿ䰡 . + // 오른손이고, 현재 들고 있는 무기가 양손 무기라면... + // 수리 가격에 포함시킬 필요가 없다. } else { repairPrice += g_pPriceManager->getRepairPrice(pItem); } } } - // ڶٸ Ѵ. + // 돈이 모자라다면 리턴한다. if (pSlayer->getGold() < repairPrice) { response.setCode(NPC_RESPONSE_REPAIR_FAIL_MONEY); pPlayer->sendPacket(&response); return; } - // ϰ, DB Ѵ. + // 각각의 아이템을 수리하고, DB에 저장한다. char pField[80]; for (int i = 0; i < Slayer::WEAR_MAX; i++) { Item* pItem = pSlayer->getWearItem((Slayer::WearPart)i); if (pItem != NULL) { if (i == Slayer::WEAR_RIGHTHAND && isTwohandWeapon(pItem)) { - // ̰, ִ Ⱑ ... - // ʿ䰡 . + // 오른손이고, 현재 들고 있는 무기가 양손 무기라면... + // 수리할 필요가 없다. } else if (isRepairableItem(pItem)) { Durability_t oldDurability = pItem->getDurability(); repairItem(pItem); if (pItem->getDurability() != oldDurability) { - // DB ̱ ؼ - // ȭ 쿡 ̺Ѵ. + // DB 쿼리를 줄이기 위해서 + // 내구도의 변화가 생긴 경우에만 세이브한다. // pItem->save(pSlayer->getName(), STORAGE_GEAR, 0, i, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Durability=%d", pItem->getDurability()); pItem->tinysave(pField); } @@ -432,57 +432,57 @@ void CGRequestRepairHandler::executeAll(CGRequestRepair* pPacket, Player* pPlaye } } - // ̰... + // 돈을 줄이고... // pSlayer->setGoldEx(pSlayer->getGold() - repairPrice); // by sigi.2002.9.4 pSlayer->decreaseGoldEx(repairPrice); - // α׸ . + // 로그를 남긴다. // log(LOG_REPAIR_ITEM, pSlayer->getName(), "", "ALL"); - // OK Ŷ ش. + // OK 패킷을 날려준다. response.setCode(NPC_RESPONSE_REPAIR_OK); response.setParameter(pSlayer->getGold()); pPlayer->sendPacket(&response); } else if (pPC->isVampire()) { Vampire* pVampire = dynamic_cast(pPC); - // Ѵ. + // 모든 아이템을 합한 수리비를 계산한다. for (int i = 0; i < Vampire::VAMPIRE_WEAR_MAX; i++) { Item* pItem = pVampire->getWearItem((Vampire::WearPart)i); if (pItem != NULL) { if (i == Vampire::WEAR_RIGHTHAND && isTwohandWeapon(pItem)) { - // չ ʸ Ѵ. + // 양손무기는 한쪽만 수리한다. } else { repairPrice += g_pPriceManager->getRepairPrice(pItem); } } } - // ڶٸ Ѵ. + // 돈이 모자라다면 리턴한다. if (pVampire->getGold() < repairPrice) { response.setCode(NPC_RESPONSE_REPAIR_FAIL_MONEY); pPlayer->sendPacket(&response); return; } - // ϰ, DB Ѵ. + // 각각의 아이템을 수리하고, DB에 저장한다. char pField[80]; for (int i = 0; i < Vampire::VAMPIRE_WEAR_MAX; i++) { Item* pItem = pVampire->getWearItem((Vampire::WearPart)i); if (pItem != NULL) { if (i == Vampire::WEAR_RIGHTHAND && isTwohandWeapon(pItem)) { - // չ ʸ Ѵ. + // 양손무기는 한쪽만 수리한다. } else { Durability_t oldDurability = pItem->getDurability(); repairItem(pItem); if (pItem->getDurability() != oldDurability) { - // DB ̱ ؼ - // ȭ 쿡 ̺Ѵ. + // DB 쿼리를 줄이기 위해서 + // 내구도의 변화가 생긴 경우에만 세이브한다. // pItem->save(pVampire->getName(), STORAGE_GEAR, 0, i, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Durability=%d", pItem->getDurability()); pItem->tinysave(pField); } @@ -493,56 +493,56 @@ void CGRequestRepairHandler::executeAll(CGRequestRepair* pPacket, Player* pPlaye } } - // ̰... + // 돈을 줄이고... // pVampire->setGoldEx(pVampire->getGold() - repairPrice); // by sigi.2002.9.4 pVampire->decreaseGoldEx(repairPrice); - // α׸ . + // 로그를 남긴다. // log(LOG_REPAIR_ITEM, pVampire->getName(), "", "ALL"); - // OK Ŷ ش. + // OK 패킷을 날려준다. response.setCode(NPC_RESPONSE_REPAIR_OK); response.setParameter(pVampire->getGold()); pPlayer->sendPacket(&response); } else if (pPC->isOusters()) { Ousters* pOusters = dynamic_cast(pPC); - // Ѵ. + // 모든 아이템을 합한 수리비를 계산한다. for (int i = 0; i < Ousters::OUSTERS_WEAR_MAX; i++) { Item* pItem = pOusters->getWearItem((Ousters::WearPart)i); if (pItem != NULL) { if (i == Ousters::WEAR_RIGHTHAND && isTwohandWeapon(pItem)) { - // չ ʸ Ѵ. + // 양손무기는 한쪽만 수리한다. } else { repairPrice += g_pPriceManager->getRepairPrice(pItem); } } } - // ڶٸ Ѵ. + // 돈이 모자라다면 리턴한다. if (pOusters->getGold() < repairPrice) { response.setCode(NPC_RESPONSE_REPAIR_FAIL_MONEY); pPlayer->sendPacket(&response); return; } - // ϰ, DB Ѵ. + // 각각의 아이템을 수리하고, DB에 저장한다. char pField[80]; for (int i = 0; i < Ousters::OUSTERS_WEAR_MAX; i++) { Item* pItem = pOusters->getWearItem((Ousters::WearPart)i); if (pItem != NULL) { if (i == Ousters::WEAR_RIGHTHAND && isTwohandWeapon(pItem)) { - // չ ʸ Ѵ. + // 양손무기는 한쪽만 수리한다. } else { Durability_t oldDurability = pItem->getDurability(); repairItem(pItem); if (pItem->getDurability() != oldDurability) { - // DB ̱ ؼ - // ȭ 쿡 ̺Ѵ. + // DB 쿼리를 줄이기 위해서 + // 내구도의 변화가 생긴 경우에만 세이브한다. // pItem->save(pOusters->getName(), STORAGE_GEAR, 0, i, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Durability=%d", pItem->getDurability()); pItem->tinysave(pField); } @@ -553,15 +553,15 @@ void CGRequestRepairHandler::executeAll(CGRequestRepair* pPacket, Player* pPlaye } } - // ̰... + // 돈을 줄이고... // pOusters->setGoldEx(pOusters->getGold() - repairPrice); // by sigi.2002.9.4 pOusters->decreaseGoldEx(repairPrice); - // α׸ . + // 로그를 남긴다. // log(LOG_REPAIR_ITEM, pOusters->getName(), "", "ALL"); - // OK Ŷ ش. + // OK 패킷을 날려준다. response.setCode(NPC_RESPONSE_REPAIR_OK); response.setParameter(pOusters->getGold()); pPlayer->sendPacket(&response); diff --git a/src/Core/CGRequestStoreInfo.h b/src/Core/CGRequestStoreInfo.h index 7563b0f9..27d08ab7 100644 --- a/src/Core/CGRequestStoreInfo.h +++ b/src/Core/CGRequestStoreInfo.h @@ -25,10 +25,10 @@ class CGRequestStoreInfo : public Packet { public: CGRequestStoreInfo() {}; virtual ~CGRequestStoreInfo() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -60,7 +60,7 @@ class CGRequestStoreInfo : public Packet { } private: - ObjectID_t m_OwnerObjectID; // 0̸ ڱ ڽ + ObjectID_t m_OwnerObjectID; // 0이면 자기 자신의 상점 정보 }; diff --git a/src/Core/CGRequestStoreInfoHandler.cpp b/src/Core/CGRequestStoreInfoHandler.cpp index d78eb7ea..31eb096f 100644 --- a/src/Core/CGRequestStoreInfoHandler.cpp +++ b/src/Core/CGRequestStoreInfoHandler.cpp @@ -41,7 +41,7 @@ void CGRequestStoreInfoHandler::execute(CGRequestStoreInfo* pPacket, Player* pPl PlayerCreature* pTargetPC = dynamic_cast(pPC->getZone()->getCreature(pPacket->getOwnerObjectID())); if (pTargetPC != NULL && pTargetPC->getRace() == pPC->getRace()) { - // cout << pTargetPC->getName() << " ϴ." << endl; + // cout << pTargetPC->getName() << " 의 상점 정보를 보냅니다." << endl; GCOtherStoreInfo gcInfo; gcInfo.setObjectID(pTargetPC->getObjectID()); gcInfo.setRequested(1); diff --git a/src/Core/CGRequestUnion.h b/src/Core/CGRequestUnion.h index 731e0c3b..eed5d6ba 100644 --- a/src/Core/CGRequestUnion.h +++ b/src/Core/CGRequestUnion.h @@ -25,10 +25,10 @@ class CGRequestUnion : public Packet { public: CGRequestUnion() {}; virtual ~CGRequestUnion() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGRequestUnionHandler.cpp b/src/Core/CGRequestUnionHandler.cpp index f660c990..e3d53c12 100644 --- a/src/Core/CGRequestUnionHandler.cpp +++ b/src/Core/CGRequestUnionHandler.cpp @@ -43,7 +43,7 @@ void CGRequestUnionHandler::execute(CGRequestUnion* pPacket, Player* pPlayer) #ifdef __OLD_GUILD_WAR__ GCSystemMessage gcSM; - gcSM.setMessage(" ʴ Դϴ."); + gcSM.setMessage("아직 지원되지 않는 기능입니다."); pGamePlayer->sendPacket(&gcSM); return; #endif @@ -52,10 +52,10 @@ void CGRequestUnionHandler::execute(CGRequestUnion* pPacket, Player* pPlayer) GCGuildResponse gcGuildResponse; - // ûѳ ΰ? + // 요청한놈이 지가 속한 길드의 마스터인가? if (!g_pGuildManager->isGuildMaster(pPlayerCreature->getGuildID(), pPlayerCreature)) { - // GC_GUILD_RESPONSE ش. - // : Ͱ ƴڳ -.-+ + // GC_GUILD_RESPONSE 날려준다. + // 내용 : 길드 마스터가 아니자녀 -.-+ gcGuildResponse.setCode(GuildUnionOfferManager::SOURCE_IS_NOT_MASTER); pPlayer->sendPacket(&gcGuildResponse); @@ -68,7 +68,7 @@ void CGRequestUnionHandler::execute(CGRequestUnion* pPacket, Player* pPlayer) pPlayer->sendPacket(&gcGuildResponse); if (result == GuildUnionOfferManager::OK) { - // ̸ ؼ..ãƾ ڴ. + // 상대길드의 장이름을 구해서..찾아야 겠다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); if (pGuild != NULL) { diff --git a/src/Core/CGRequestUnionInfo.h b/src/Core/CGRequestUnionInfo.h index c962bd4d..e97a9d50 100644 --- a/src/Core/CGRequestUnionInfo.h +++ b/src/Core/CGRequestUnionInfo.h @@ -26,10 +26,10 @@ class CGRequestUnionInfo : public Packet { public: CGRequestUnionInfo() {}; virtual ~CGRequestUnionInfo() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGRequestUnionInfoHandler.cpp b/src/Core/CGRequestUnionInfoHandler.cpp index 755b04cf..6be40675 100644 --- a/src/Core/CGRequestUnionInfoHandler.cpp +++ b/src/Core/CGRequestUnionInfoHandler.cpp @@ -41,7 +41,7 @@ void CGRequestUnionInfoHandler::execute(CGRequestUnionInfo* pPacket, Player* pPl #ifdef __OLD_GUILD_WAR__ GCSystemMessage gcSM; - gcSM.setMessage(" ʴ Դϴ."); + gcSM.setMessage("아직 지원되지 않는 기능입니다."); pGamePlayer->sendPacket(&gcSM); return; #endif @@ -49,7 +49,7 @@ void CGRequestUnionInfoHandler::execute(CGRequestUnionInfo* pPacket, Player* pPl GCGuildResponse gcGuildResponse; GuildUnion* pGuildUnion = GuildUnionManager::Instance().getGuildUnion(pPlayerCreature->getGuildID()); - // ڱⰡ 尡 տ ԵǾִ ã´ + // 자기가 속한 길드가 연합에 가입되어있는지 찾는다 if (pGuildUnion == NULL) { gcGuildResponse.setCode(GuildUnionOfferManager::NOT_IN_UNION); pPlayer->sendPacket(&gcGuildResponse); @@ -57,7 +57,7 @@ void CGRequestUnionInfoHandler::execute(CGRequestUnionInfo* pPacket, Player* pPl return; } - // Master ´. + // Master 길드의 정보를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pGuildUnion->getMasterGuildID()); if (pGuild == NULL) { diff --git a/src/Core/CGResurrectHandler.cpp b/src/Core/CGResurrectHandler.cpp index cbf343fc..eb248a70 100644 --- a/src/Core/CGResurrectHandler.cpp +++ b/src/Core/CGResurrectHandler.cpp @@ -37,47 +37,47 @@ void CGResurrectHandler::execute(CGResurrect* pPacket, Player* pPlayer) if (pCreature->findEffect(Effect::EFFECT_CLASS_ETERNITY)) return; - // ũĿ COMA Ʈ پ ʴٸ . + // 현재 크리쳐에게 COMA 이펙트가 붙어있지 않다면 에러다. if (pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { - // cout << "÷ پ." << endl; + // cout << "플래그 붙어있음." << endl; - // COMA Ʈ Ѵ. + // COMA 이펙트에 접근한다. EffectManager* pEffectManager = pCreature->getEffectManager(); Assert(pEffectManager != NULL); EffectComa* pEffectComa = (EffectComa*)(pEffectManager->findEffect(Effect::EFFECT_CLASS_COMA)); Assert(pEffectComa != NULL); - // 5ʰ ʾҴٸ, ǻƳ . + // 죽은 지 5초가 아직 지나지 않았다면, 되살아날 수 없다. if (pEffectComa->canResurrect()) { - // cout << "5ʰ Ȱų ." << endl; + // cout << "5초가 지났으니 부활시킬 수 있음." << endl; /* if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); - //cout << " HP:" << pSlayer->getHP(ATTR_CURRENT); + //cout << "현재 HP:" << pSlayer->getHP(ATTR_CURRENT); } else if (pCreature->isVampire()) { Vampire* pVampire = dynamic_cast(pCreature); - //cout << " HP:" << pVampire->getHP(ATTR_CURRENT); + //cout << "현재 HP:" << pVampire->getHP(ATTR_CURRENT); } */ - // 0 ش. ̷ ϸ ƮƮ - // unaffectǸ鼭 ÷̾ ڵ ȰŰ ȴ. + // 데드라인을 0으로 만들어준다. 이렇게 하면 하트비트에서 + // unaffect되면서 플레이어를 자동으로 부활시키게 된다. pEffectComa->setDeadline(0); } else { - // cout << "5ʰ ʾҴ." << endl; + // cout << "5초가 지나지 않았다." << endl; } } else { - // cout << "÷װ ." << endl; + // cout << "플래그가 없다." << endl; - // Ȯ , 򰡿 ڿ - // ڸ Ʈ ư ų, ¿ HP ö󰡴 - // ߻ϴ ϴ. ׷ Ʈ ɷ Ȳ Ŷ - // ƿ ̴ ڵ带 ִ´. + // 어디서인지는 확실히 알 수 없으나, 어딘가에서 죽은 뒤에 + // 코마 이펙트가 날아가 버리거나, 죽은 상태에서 HP가 올라가는 현상이 + // 발생하는 듯 하다. 그래서 이펙트 걸려있지 않은 상황에서 패킷 + // 날아오면 강제로 죽이는 코드를 집어넣는다. if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); pSlayer->setHP(0, ATTR_CURRENT); diff --git a/src/Core/CGRideMotorCycle.h b/src/Core/CGRideMotorCycle.h index 8b5117b6..fb43f42c 100644 --- a/src/Core/CGRideMotorCycle.h +++ b/src/Core/CGRideMotorCycle.h @@ -31,10 +31,10 @@ class CGRideMotorCycle : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGRideMotorCycleHandler.cpp b/src/Core/CGRideMotorCycleHandler.cpp index 351cc35c..41061e16 100644 --- a/src/Core/CGRideMotorCycleHandler.cpp +++ b/src/Core/CGRideMotorCycleHandler.cpp @@ -57,7 +57,7 @@ void CGRideMotorCycleHandler::execute(CGRideMotorCycle* pPacket, Player* pPlayer ZoneCoord_t X = pPacket->getX(); ZoneCoord_t Y = pPacket->getY(); - // ǥ ٿ带 Ѿ ȴ. + // 좌표가 바운드를 넘어가면 안 된다. if (!isValidZoneCoord(pZone, X, Y) || SiegeManager::Instance().isSiegeZone(pZone->getZoneID())) { GCRideMotorCycleFailed _GCRideMotorCycleFailed; pGamePlayer->sendPacket(&_GCRideMotorCycleFailed); @@ -70,7 +70,7 @@ void CGRideMotorCycleHandler::execute(CGRideMotorCycle* pPacket, Player* pPlayer if (pSlayer->hasRelicItem() || pSlayer->isFlag(Effect::EFFECT_CLASS_REFINIUM_TICKET) || pSlayer->isFlag(Effect::EFFECT_CLASS_HAS_FLAG) || pSlayer->isFlag(Effect::EFFECT_CLASS_HAS_SWEEPER)) { - // cout << " ¿ ̸ Ż ϴ" << endl; + // cout << "성물을 가진 상태에서는 오토바이를 탈 수 없습니다" << endl; GCRideMotorCycleFailed _GCRideMotorCycleFailed; pGamePlayer->sendPacket(&_GCRideMotorCycleFailed); return; @@ -120,11 +120,11 @@ void CGRideMotorCycleHandler::execute(CGRideMotorCycle* pPacket, Player* pPlayer _GCRideMotorCycle.setTargetObjectID(pMotorcycle->getObjectID()); _GCRideMotorCycleOK.setObjectID(pMotorcycle->getObjectID()); - // ... + // 존에서 아이템을 지우고... pZone->deleteItem(pItem, X, Y); - // OK Ŷ ÷̾ ְ... + // OK 패킷을 플레이어에게 보내주고... pGamePlayer->sendPacket(&_GCRideMotorCycleOK); - // ͻŬ ٴ εij + // 모터사이클을 탔다는 정보를 브로드캐스팅 pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCRideMotorCycle); Success = true; diff --git a/src/Core/CGSMSSendHandler.cpp b/src/Core/CGSMSSendHandler.cpp index c675bc63..cbd35d56 100644 --- a/src/Core/CGSMSSendHandler.cpp +++ b/src/Core/CGSMSSendHandler.cpp @@ -38,7 +38,7 @@ void CGSMSSendHandler::execute(CGSMSSend* pPacket, Player* pPlayer) GCAddressListVerify gcVerify; if (pPC->getSMSCharge() < pPacket->getNumbersList().size()) { - filelog("SMS.log", "[%s:%s] Charge ڶϴ.", pGamePlayer->getID().c_str(), pPC->getName().c_str()); + filelog("SMS.log", "[%s:%s] Charge가 모자랍니다.", pGamePlayer->getID().c_str(), pPC->getName().c_str()); gcVerify.setCode(GCAddressListVerify::SMS_SEND_FAIL); gcVerify.setParameter(GCAddressListVerify::SMS_SEND_FAIL_NOT_ENOUGH_CHARGE); pGamePlayer->sendPacket(&gcVerify); diff --git a/src/Core/CGSay.h b/src/Core/CGSay.h index 20a80bc1..859a09c4 100644 --- a/src/Core/CGSay.h +++ b/src/Core/CGSay.h @@ -22,8 +22,8 @@ // // class CGSay; // -// Ŭ̾Ʈ Say Ŷ̴. -// ο Say String Ÿ ʵ . +// 클라이언트가 서버에게 보내는 Say 패킷이다. +// 내부에 Say String 만을 데이타 필드로 가진다. // ////////////////////////////////////////////////////////////////////// @@ -35,10 +35,10 @@ class CGSay : public Packet { public: CGSay() {}; virtual ~CGSay() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -114,7 +114,7 @@ class CGSayFactory : public PacketFactory { } // get packet's max body size - // message ִ ũ⿡ ʿϴ. + // message 의 최대 크기에 대한 설정이 필요하다. PacketSize_t getPacketMaxSize() const { return szuint + szBYTE + 128; } @@ -138,10 +138,10 @@ class CGSayHandler { static void opzone(string msg, int i); static void opguild(string msg, int i, Creature* pCreature); - // ý + // 전쟁 시스템 관련 static void opcombat(GamePlayer* pPlayer, string msg, int i); - // set ̺Ʈ Ȯ + // set 이벤트 아이템 확률 static void opset(GamePlayer* pPlayer, string msg, int i); static void opview(GamePlayer* pPlayer, string msg, int i); @@ -212,7 +212,7 @@ class CGSayHandler { // refresh info static void opload(GamePlayer* pPlayer, string msg, int i); - // ӽ + // 임시 static void opsoulchain(GamePlayer* pPlayer, string msg, int i); // credit diff --git a/src/Core/CGSelectBloodBible.h b/src/Core/CGSelectBloodBible.h index 98607451..ebda1a64 100644 --- a/src/Core/CGSelectBloodBible.h +++ b/src/Core/CGSelectBloodBible.h @@ -26,10 +26,10 @@ class CGSelectBloodBible : public Packet { public: CGSelectBloodBible() {}; virtual ~CGSelectBloodBible() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGSelectBloodBibleHandler.cpp b/src/Core/CGSelectBloodBibleHandler.cpp index a592ef59..2846776c 100644 --- a/src/Core/CGSelectBloodBibleHandler.cpp +++ b/src/Core/CGSelectBloodBibleHandler.cpp @@ -46,7 +46,7 @@ void CGSelectBloodBibleHandler::execute(CGSelectBloodBible* pPacket, Player* pPl if (pPC->getRace() != pBonus->getRace()) { GCSystemMessage gcSM; - gcSM.setMessage("޷ʹõʥ."); + gcSM.setMessage("轟랬賈痰돨加蝎."); pGamePlayer->sendPacket(&gcSM); return; } @@ -54,20 +54,20 @@ void CGSelectBloodBibleHandler::execute(CGSelectBloodBible* pPacket, Player* pPl BloodBibleSignInfo* pInfo = pPC->getBloodBibleSign(); if (pInfo->getOpenNum() <= pInfo->getList().size()) { GCSystemMessage gcSM; - gcSM.setMessage("ûп."); + gcSM.setMessage("청唐왕岱꾼."); pGamePlayer->sendPacket(&gcSM); return; } if (find(pInfo->getList().begin(), pInfo->getList().end(), pPacket->getBloodBibleID()) != pInfo->getList().end()) { GCSystemMessage gcSM; - gcSM.setMessage("װʥ."); + gcSM.setMessage("綠陋구돨加蝎."); pGamePlayer->sendPacket(&gcSM); return; } GCSystemMessage gcSM; - gcSM.setMessage("װѪ֮ʥ."); + gcSM.setMessage("綠陋구沂裂加蝎."); pGamePlayer->sendPacket(&gcSM); pInfo->getList().push_back(pPacket->getBloodBibleID()); diff --git a/src/Core/CGSelectGuild.h b/src/Core/CGSelectGuild.h index a1e23c3a..27370bba 100644 --- a/src/Core/CGSelectGuild.h +++ b/src/Core/CGSelectGuild.h @@ -25,10 +25,10 @@ class CGSelectGuild : public Packet { public: CGSelectGuild() {}; virtual ~CGSelectGuild() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGSelectGuildHandler.cpp b/src/Core/CGSelectGuildHandler.cpp index 3543b079..4308cb39 100644 --- a/src/Core/CGSelectGuildHandler.cpp +++ b/src/Core/CGSelectGuildHandler.cpp @@ -34,7 +34,7 @@ void CGSelectGuildHandler::execute(CGSelectGuild* pPacket, Player* pPlayer) GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = dynamic_cast(pGamePlayer->getCreature()); - // 带 ´. + // 선택한 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); // try { Assert( pGuild != NULL ); } catch ( Throwable& t ) { diff --git a/src/Core/CGSelectGuildMember.h b/src/Core/CGSelectGuildMember.h index ef403558..3fc6f5d7 100644 --- a/src/Core/CGSelectGuildMember.h +++ b/src/Core/CGSelectGuildMember.h @@ -25,10 +25,10 @@ class CGSelectGuildMember : public Packet { public: CGSelectGuildMember() {}; virtual ~CGSelectGuildMember() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGSelectGuildMemberHandler.cpp b/src/Core/CGSelectGuildMemberHandler.cpp index db785a93..41234c03 100644 --- a/src/Core/CGSelectGuildMemberHandler.cpp +++ b/src/Core/CGSelectGuildMemberHandler.cpp @@ -35,13 +35,13 @@ void CGSelectGuildMemberHandler::execute(CGSelectGuildMember* pPacket, Player* p PlayerCreature* pPlayerCreature = dynamic_cast(pGamePlayer->getCreature()); Assert(pPlayerCreature != NULL); - // 带 ´. + // 선택한 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPlayerCreature->getGuildID()); // try { Assert( pGuild != NULL ); } catch ( Throwable& ) { return; } if (pGuild == NULL) return; - // ´. + // 선택한 길드 멤버를 가져온다. GuildMember* pGuildMember = pGuild->getMember(pPacket->getName()); // try { Assert( pGuildMember != NULL ); } catch ( Throwable& ) { return; } if (pGuildMember == NULL) diff --git a/src/Core/CGSelectPortal.h b/src/Core/CGSelectPortal.h index 631b20b2..70afa8f0 100644 --- a/src/Core/CGSelectPortal.h +++ b/src/Core/CGSelectPortal.h @@ -31,10 +31,10 @@ class CGSelectPortal : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGSelectPortalHandler.cpp b/src/Core/CGSelectPortalHandler.cpp index 120f913d..123e998b 100644 --- a/src/Core/CGSelectPortalHandler.cpp +++ b/src/Core/CGSelectPortalHandler.cpp @@ -30,20 +30,20 @@ void CGSelectPortalHandler::execute(CGSelectPortal* pPacket, Player* pPlayer) try { GamePlayer* pGamePlayer = dynamic_cast(pPlayer); - // ÷̾ ° ƴ϶ Ѵ. + // 게임 플레이어의 상태가 정상이 아니라면 걍 리턴한다. if (pGamePlayer->getPlayerStatus() != GPS_NORMAL) return; Creature* pCreature = pGamePlayer->getCreature(); Zone* pZone = pCreature->getZone(); - // ũ ǥ ̶ Ѵ. + // 현재 크리쳐의 좌표가 비정상적이라면 리턴한다. if (!isValidZoneCoord(pZone, pCreature->getX(), pCreature->getY())) return; Tile& rTile = pZone->getTile(pCreature->getX(), pCreature->getY()); - // Ż 鼭, ũó PC .. (Ϳ NPC Ż ̵ ʴ´.) + // 만약 포탈이 있으면서, 크리처가 PC인 경우.. (몬스터와 NPC는 포탈 이동을 하지 않는다.) if (rTile.hasPortal()) { Portal* pPortal = rTile.getPortal(); diff --git a/src/Core/CGSelectQuest.h b/src/Core/CGSelectQuest.h index 13a1d560..dfd518e3 100644 --- a/src/Core/CGSelectQuest.h +++ b/src/Core/CGSelectQuest.h @@ -25,10 +25,10 @@ class CGSelectQuest : public Packet { public: CGSelectQuest() {}; virtual ~CGSelectQuest() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -71,7 +71,7 @@ class CGSelectQuest : public Packet { // Quest ID QuestID_t m_QuestID; - // NPC ObjectID + // NPC의 ObjectID ObjectID_t m_NPCOID; }; diff --git a/src/Core/CGSelectQuestHandler.cpp b/src/Core/CGSelectQuestHandler.cpp index ab671d09..18da2cc1 100644 --- a/src/Core/CGSelectQuestHandler.cpp +++ b/src/Core/CGSelectQuestHandler.cpp @@ -74,9 +74,9 @@ void CGSelectQuestHandler::execute(CGSelectQuest* pPacket, Player* pPlayer) if (code == START_SUCCESS) { pPC->sendCurrentQuestInfo(); - // cout << "Quest " << pPC->getName() << " " << pPacket->getQuestID() << endl; + // cout << "Quest 시작 " << pPC->getName() << " " << pPacket->getQuestID() << endl; } else { - // cout << "Quest " << pPC->getName() << " " << (int)code << endl; + // cout << "Quest 시작 실패 " << pPC->getName() << " " << (int)code << endl; } #endif // __GAME_SERVER__ diff --git a/src/Core/CGSelectRankBonus.h b/src/Core/CGSelectRankBonus.h index b19bf44f..2631c54b 100644 --- a/src/Core/CGSelectRankBonus.h +++ b/src/Core/CGSelectRankBonus.h @@ -20,10 +20,10 @@ class CGSelectRankBonus : public Packet { public: CGSelectRankBonus() {}; virtual ~CGSelectRankBonus() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGSelectTileEffect.h b/src/Core/CGSelectTileEffect.h index d4b12055..d22f8031 100644 --- a/src/Core/CGSelectTileEffect.h +++ b/src/Core/CGSelectTileEffect.h @@ -43,7 +43,7 @@ class CGSelectTileEffect : public Packet { } private: - ObjectID_t m_EffectObjectID; // Ʈ Ʈ ID + ObjectID_t m_EffectObjectID; // 선택한 이펙트의 오브젝트 ID }; diff --git a/src/Core/CGSelectTileEffectHandler.cpp b/src/Core/CGSelectTileEffectHandler.cpp index 816b44f7..2302242c 100644 --- a/src/Core/CGSelectTileEffectHandler.cpp +++ b/src/Core/CGSelectTileEffectHandler.cpp @@ -37,7 +37,7 @@ void CGSelectTileEffectHandler::execute(CGSelectTileEffect* pPacket, Player* pPl Assert(pPlayer != NULL); try { - // ÷̾ ° ƴ϶ Ѵ. + // 게임 플레이어의 상태가 정상이 아니라면 걍 리턴한다. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Assert(pGamePlayer != NULL); if (pGamePlayer->getPlayerStatus() != GPS_NORMAL) @@ -46,7 +46,7 @@ void CGSelectTileEffectHandler::execute(CGSelectTileEffect* pPacket, Player* pPl Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); - // Ż  . + // 성물 들고 있으면 포탈에 들어갈 수 없다. if (pCreature->hasRelicItem() || pCreature->isFlag(Effect::EFFECT_CLASS_HAS_FLAG) || pCreature->isFlag(Effect::EFFECT_CLASS_HAS_SWEEPER)) { return; @@ -57,7 +57,7 @@ void CGSelectTileEffectHandler::execute(CGSelectTileEffect* pPacket, Player* pPl Effect* pEffect = NULL; - // ̾ Ż Ŵ ã´. + // 먼저 뱀파이어 포탈 매니저에서 찾는다. EffectManager* pVampirePortalManager = pZone->getVampirePortalManager(); pEffect = pVampirePortalManager->findEffect(pPacket->getEffectObjectID()); @@ -76,7 +76,7 @@ void CGSelectTileEffectHandler::execute(CGSelectTileEffect* pPacket, Player* pPl } else { cout << "CGSelectTileEffectHandler::execute() : Effect DOES NOT Exist" << endl; - // ... ׷ OID Ʈ ¦ ش. + // 흠... 그런 OID를 가진 이펙트가 없을 때에는 살짝 무시해준다. } } catch (Throwable& t) { cerr << t.toString() << endl; @@ -102,7 +102,7 @@ void CGSelectTileEffectHandler::executeVampirePortal(CGSelectTileEffect* pPacket Assert(pEffect->getEffectClass() == Effect::EFFECT_CLASS_VAMPIRE_PORTAL); try { - // ÷̾ ° ƴ϶ Ѵ. + // 게임 플레이어의 상태가 정상이 아니라면 걍 리턴한다. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Assert(pGamePlayer != NULL); if (pGamePlayer->getPlayerStatus() != GPS_NORMAL) @@ -111,7 +111,7 @@ void CGSelectTileEffectHandler::executeVampirePortal(CGSelectTileEffect* pPacket Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); - // ̾ ̿ ִ. + // 뱀파이어만이 이용할 수 있다. if (!pCreature->isVampire()) return; @@ -124,9 +124,9 @@ void CGSelectTileEffectHandler::executeVampirePortal(CGSelectTileEffect* pPacket EffectVampirePortal* pEffectVampirePortal = dynamic_cast(pEffect); ZONE_COORD zonecoord = pEffectVampirePortal->getZoneCoord(); - // ׸޸δ . - // ƿ ͳ ؾ - // ̹ ǥ Ǿ ִ ־ ¿ ⼭ ´. + // 테메리에로는 갈 수 없다. + // 원래는 아예 블러디 터널을 만들 수 없도록해야 하지만 + // 이미 좌표가 설정되어 있는 씰이 있어서 어쩔 수 없이 여기서도 막는다. if (zonecoord.id == 1122 || zonecoord.id == 8000) { return; } @@ -135,18 +135,18 @@ void CGSelectTileEffectHandler::executeVampirePortal(CGSelectTileEffect* pPacket ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(zonecoord.id); #if defined(__PAY_SYSTEM_ZONE__) || defined(__PAY_SYSTEM_FREE_LIMIT__) - // ε ƴϸ... - // ׸ йи ƴϸ + // 유료존인데 유료사용중이 아니면... + // 그리고 패밀리 요금제 적용중인 아니면 if (pZoneInfo == NULL || ((pZoneInfo->isPayPlay() || pZoneInfo->isPremiumZone()) && !pGamePlayer->isPayPlaying() && !pGamePlayer->isFamilyFreePass())) { // Statement* pStmt = NULL; string connectIP = pGamePlayer->getSocket()->getHost(); - // Ѱ? + // 유료 서비스 사용이 가능한가? if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { sendPayInfo(pGamePlayer); } else if (pZoneInfo->isPayPlay()) { - // Ұ + // 유료 서비스 사용 불가인 경우 GCSystemMessage gcSystemMessage; if (g_pConfig->getPropertyInt("IsNetMarble") == 0) { @@ -166,13 +166,13 @@ void CGSelectTileEffectHandler::executeVampirePortal(CGSelectTileEffect* pPacket } if (pEffectVampirePortal->getCount() > 0) { - // ̾ ڽſ ÷׸ ɾش. - // ̴ Zone::addPC ̾ ߰ , Ѹ - // GCAddVampire Żκ ˸ ؼ̴. - // Zone::addPC ٽ Ǯָ ȴ. + // 뱀파이어 자신에게 플래그를 걸어준다. + // 이는 Zone::addPC에서 뱀파이어가 추가될 때, 주위에다 뿌리는 + // GCAddVampire 에다 포탈로부터 왔음을 알리기 위해서이다. + // Zone::addPC에서 다시 풀어주면 된다. pVampire->setFlag(Effect::EFFECT_CLASS_VAMPIRE_PORTAL); - // ٰ ̾ Ż ̿ ٴ ˷ش. + // 먼저 주위에다가 뱀파이어가 포탈을 이용해 사라진다는 사실을 알려준다. GCEnterVampirePortal gcEnterVampirePortal; gcEnterVampirePortal.setObjectID(pVampire->getObjectID()); gcEnterVampirePortal.setX(pEffectVampirePortal->getX()); @@ -180,10 +180,10 @@ void CGSelectTileEffectHandler::executeVampirePortal(CGSelectTileEffect* pPacket pZone->broadcastPacket(pVampire->getX(), pVampire->getY(), &gcEnterVampirePortal); pVampire->getGQuestManager()->illegalWarp(); - // ̵ Ų. + // 실제로 이동을 시킨다. transportCreature(pCreature, zonecoord.id, zonecoord.x, zonecoord.y, false); - // ̵״ٸ īƮ ̰, īƮ 0 Ǹ Ʈ . + // 이동시켰다면 카운트를 줄이고, 카운트가 0이 되면 이펙트는 사라진다. pEffectVampirePortal->setCount(pEffectVampirePortal->getCount() - 1); // if (pEffectVampirePortal->getCount() == 0) pEffectVampirePortal->setDeadline(0); } diff --git a/src/Core/CGSelectWayPoint.h b/src/Core/CGSelectWayPoint.h index 131504f9..700b4d30 100644 --- a/src/Core/CGSelectWayPoint.h +++ b/src/Core/CGSelectWayPoint.h @@ -2,7 +2,7 @@ // Filename : CGSelectWayPoint.h // Written By : excel96 // Description : -// ̾ ο Ż ̿ ٸ ̵ϰ Ŷ +// 슬레이어가 개인용 포탈을 이용해 다른 곳으로 이동하고자 할 때 보내는 패킷 ////////////////////////////////////////////////////////////////////////////// #ifndef __CG_SELECT_WAYPOINT_H__ @@ -58,9 +58,9 @@ class CGSelectWayPoint : public Packet { } private: - ZoneID_t m_ZoneID; // ϴ ID - Coord_t m_X; // ϴ ǥ X - Coord_t m_Y; // ϴ ǥ Y + ZoneID_t m_ZoneID; // 가고자 하는 존의 ID + Coord_t m_X; // 가고자 하는 존의 좌표 X + Coord_t m_Y; // 가고자 하는 존의 좌표 Y }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGSelectWayPointHandler.cpp b/src/Core/CGSelectWayPointHandler.cpp index aa6696f4..b55637e1 100644 --- a/src/Core/CGSelectWayPointHandler.cpp +++ b/src/Core/CGSelectWayPointHandler.cpp @@ -55,13 +55,13 @@ void CGSelectWayPointHandler::execute(CGSelectWayPoint* pPacket, Player* pPlayer executeEnterQuestZone(pPacket, pPlayer, targetDynamicZoneType); } - // ÷̾ ° ƴ϶ Ѵ. + // 게임 플레이어의 상태가 정상이 아니라면 걍 리턴한다. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Assert(pGamePlayer != NULL); if (pGamePlayer->getPlayerStatus() != GPS_NORMAL) return; - // ũİ ̾ ƴ϶ Ѵ. + // 크리쳐가 슬레이어가 아니라면 리턴한다. Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); @@ -73,11 +73,11 @@ void CGSelectWayPointHandler::execute(CGSelectWayPoint* pPacket, Player* pPlayer if (pCreature->hasRelicItem()) return; - // ũİ ׾ + // 크리쳐가 죽었으면 리턴 if (pCreature->isDead()) return; - // ʺ  쿣 ش. + // 초보존으로 들어가는 경우엔 종족 상관없이 보내준다. if (pPacket->getZoneID() == 1122) { ZONE_COORD pos(1122); @@ -96,21 +96,21 @@ void CGSelectWayPointHandler::execute(CGSelectWayPoint* pPacket, Player* pPlayer if (!canEnterBeginnerZone(pCreature)) return; - // ʺ ϼ ...? + // 초보존이 유료존일수도 있을라나...? #if defined(__PAY_SYSTEM_ZONE__) || defined(__PAY_SYSTEM_FREE_LIMIT__) ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(pos.id); - // ε ڰ ƴϸ... + // 유료존인데 유료사용자가 아니면... if (pZoneInfo == NULL || ((pZoneInfo->isPayPlay() || pZoneInfo->isPremiumZone()) && (!pGamePlayer->isPayPlaying() && !pGamePlayer->isFamilyFreePass()))) { // Statement* pStmt = NULL; string connectIP = pGamePlayer->getSocket()->getHost(); - // Ѱ? + // 유료 서비스 사용이 가능한가? if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { sendPayInfo(pGamePlayer); } else if (pZoneInfo->isPayPlay()) { - // Ұ + // 유료 서비스 사용 불가인 경우 GCSystemMessage gcSystemMessage; if (g_pConfig->getPropertyInt("IsNetMarble") == 0) { @@ -152,7 +152,7 @@ void CGSelectWayPointHandler::execute(CGSelectWayPoint* pPacket, Player* pPlayer } */ - // ũ ˾Ƽ ƨ =_=;; + // 크리쳐 정보 보고 알아서 튕겨주자 =_=;; ZONE_COORD pos(g_pLevelWarZoneInfoManager->getCreatureZoneID(pCreature)); if (g_pSweeperBonusManager->isAble(g_pLevelWarZoneInfoManager->getCreatureZoneID(pCreature))) { @@ -217,7 +217,7 @@ void CGSelectWayPointHandler::execute(CGSelectWayPoint* pPacket, Player* pPlayer } */ - // ũ ˾Ƽ ƨ =_=;; + // 크리쳐 정보 보고 알아서 튕겨주자 =_=;; ZONE_COORD pos; if (pCreature->isSlayer()) { @@ -236,7 +236,7 @@ void CGSelectWayPointHandler::execute(CGSelectWayPoint* pPacket, Player* pPlayer /*#if defined(__PAY_SYSTEM_ZONE__) || defined(__PAY_SYSTEM_FREE_LIMIT__) ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(pos.id); - // ε ڰ ƴϸ... + // 유료존인데 유료사용자가 아니면... if (pZoneInfo==NULL || (pZoneInfo->isPayPlay() || pZoneInfo->isPremiumZone()) && (!pGamePlayer->isPayPlaying() && !pGamePlayer->isFamilyFreePass() )) @@ -244,14 +244,14 @@ void CGSelectWayPointHandler::execute(CGSelectWayPoint* pPacket, Player* pPlayer //Statement* pStmt = NULL; string connectIP = pGamePlayer->getSocket()->getHost(); - // Ѱ? + // 유료 서비스 사용이 가능한가? if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { sendPayInfo(pGamePlayer); } else if (pZoneInfo->isPayPlay()) { - // Ұ + // 유료 서비스 사용 불가인 경우 GCSystemMessage gcSystemMessage; if (g_pConfig->getPropertyInt("IsNetMarble")==0) @@ -283,17 +283,17 @@ void CGSelectWayPointHandler::execute(CGSelectWayPoint* pPacket, Player* pPlayer } if (!pCreature->isSlayer() && !pCreature->isOusters()) { - // ؾ ? + // 뭔가를 해야하지 않을까? return; } if (pCreature->isFlag(Effect::EFFECT_CLASS_HAS_FLAG)) { - // ؾ ? + // 뭔가를 해야하지 않을까? return; } if (pCreature->isFlag(Effect::EFFECT_CLASS_HAS_SWEEPER)) { - // ؾ ? + // 뭔가를 해야하지 않을까? return; } @@ -302,7 +302,7 @@ void CGSelectWayPointHandler::execute(CGSelectWayPoint* pPacket, Player* pPlayer bool bCancel = false; - // Ʈ ɷ־ ̵̴. + // 이펙트가 걸려있어야 정상적인 이동이다. if (pCreature->isOusters() || (pCreature->isSlayer() && pCreature->isFlag(Effect::EFFECT_CLASS_SLAYER_PORTAL))) { ZoneID_t id = pPacket->getZoneID(); @@ -312,15 +312,15 @@ void CGSelectWayPointHandler::execute(CGSelectWayPoint* pPacket, Player* pPlayer if (id == 0 && x == 0 && y == 0) { bCancel = true; } else { - // ȭ . + // 석화 상태일 경우 생깐다. if (pCreature->isFlag(Effect::EFFECT_CLASS_PARALYZE)) { bCancel = true; } - // Ʈ Ŵ ؼ Ŭ̾Ʈ - // Ʈ Ʈ Ѵ. + // 웨이포인트 매니저를 통해서 클라이언트가 보내온 + // 웨이포인트가 정상적인 웨이포인트인지를 검증한다. if (!g_pWayPointManager->isValidWayPoint(id, x, y, pCreature->getRace())) { - // ؾ ? + // 뭔가를 해야하지 않을까? bCancel = true; // return; @@ -331,17 +331,17 @@ void CGSelectWayPointHandler::execute(CGSelectWayPoint* pPacket, Player* pPlayer #if defined(__PAY_SYSTEM_ZONE__) || defined(__PAY_SYSTEM_FREE_LIMIT__) ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(id); - // ε ڰ ƴϸ... + // 유료존인데 유료사용자가 아니면... if (pZoneInfo == NULL || ((pZoneInfo->isPayPlay() || pZoneInfo->isPremiumZone()) && (!pGamePlayer->isPayPlaying() && !pGamePlayer->isFamilyFreePass()))) { // Statement* pStmt = NULL; string connectIP = pGamePlayer->getSocket()->getHost(); - // Ѱ? + // 유료 서비스 사용이 가능한가? if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { sendPayInfo(pGamePlayer); } else if (pZoneInfo->isPayPlay()) { - // Ұ + // 유료 서비스 사용 불가인 경우 GCSystemMessage gcSystemMessage; if (g_pConfig->getPropertyInt("IsNetMarble") == 0) { @@ -358,7 +358,7 @@ void CGSelectWayPointHandler::execute(CGSelectWayPoint* pPacket, Player* pPlayer #endif if (!bCancel) { - // ̵Ű Ʈ Ѵ. + // 이동시키기 전에 이펙트를 삭제한다. if (pCreature->isSlayer()) pCreature->removeFlag(Effect::EFFECT_CLASS_SLAYER_PORTAL); @@ -368,7 +368,7 @@ void CGSelectWayPointHandler::execute(CGSelectWayPoint* pPacket, Player* pPlayer GCNoticeEvent gcNoticeEvent; - // Ҷ ÿ ξ Ѵ. + // 대지정령의 뿔을 사용할라면 시오람과 계약을 맺었어야 한다. if (!pOusters->getFlagSet()->isOn(FLAGSET_GNOMES_HORN)) { gcNoticeEvent.setCode(NOTICE_EVENT_CONTRACT_GNOMES_HORN); pPlayer->sendPacket(&gcNoticeEvent); @@ -400,7 +400,7 @@ void CGSelectWayPointHandler::execute(CGSelectWayPoint* pPacket, Player* pPlayer } } - // ùٸ Ʈ ̾ ̵ش. + // 올바른 웨이포인트라면 슬레이어를 이동시켜준다. pPC->getGQuestManager()->illegalWarp(); transportCreature(pCreature, id, x, y, false); } @@ -415,10 +415,10 @@ void CGSelectWayPointHandler::execute(CGSelectWayPoint* pPacket, Player* pPlayer Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // id, x, y 0 ̵ Ѵٴ ̴. + // id, x, y가 모두 0일 경우 이동을 취소한다는 뜻이다. pCreature->removeFlag(Effect::EFFECT_CLASS_SLAYER_PORTAL); - // ⸦ ϶ ѷش. + // 헬기를 제거하라고 뿌려준다. GCAddHelicopter gcAddHelicopter; gcAddHelicopter.setObjectID(pCreature->getObjectID()); gcAddHelicopter.setCode(1); diff --git a/src/Core/CGSetSlayerHotKey.h b/src/Core/CGSetSlayerHotKey.h index 60397f3b..e1004a3c 100644 --- a/src/Core/CGSetSlayerHotKey.h +++ b/src/Core/CGSetSlayerHotKey.h @@ -24,10 +24,10 @@ class CGSetSlayerHotKey : public Packet { public: CGSetSlayerHotKey() {}; virtual ~CGSetSlayerHotKey() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -40,7 +40,7 @@ class CGSetSlayerHotKey : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CGSetSlayerHotKeyPacketSize ؼ ϶. + // const static CGSetSlayerHotKeyPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szSkillType * 4; } @@ -94,7 +94,7 @@ class CGSetSlayerHotKeyFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGSetSlayerHotKeyPacketSize ؼ ϶. + // const static CGSetSlayerHotKeyPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szSkillType * 4; } diff --git a/src/Core/CGSetSlayerHotKeyHandler.cpp b/src/Core/CGSetSlayerHotKeyHandler.cpp index cd969892..1844c9e8 100644 --- a/src/Core/CGSetSlayerHotKeyHandler.cpp +++ b/src/Core/CGSetSlayerHotKeyHandler.cpp @@ -29,8 +29,8 @@ void CGSetSlayerHotKeyHandler::execute(CGSetSlayerHotKey* pPacket, Player* pPlay // if (pGamePlayer->getPlayerStatus() == GPS_NORMAL) { - // ¿ ũó ǰ εǾ ϹǷ, NULL ƴϾ Ѵ. - // PLAYER_INGAME ü ũó ε Ǿ ǹѴ. + // 이 상태에서는 크리처가 옳게 로딩되었어야 하므로, NULL 이 아니어야 한다. + // PLAYER_INGAME 자체가 크리처 로딩이 성공되었음을 의미한다. Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); if (pCreature->isSlayer()) { diff --git a/src/Core/CGSetVampireHotKeyHandler.cpp b/src/Core/CGSetVampireHotKeyHandler.cpp index c72d1ddb..955155e0 100644 --- a/src/Core/CGSetVampireHotKeyHandler.cpp +++ b/src/Core/CGSetVampireHotKeyHandler.cpp @@ -27,8 +27,8 @@ void CGSetVampireHotKeyHandler::execute(CGSetVampireHotKey* pPacket, Player* pPl // if (pGamePlayer->getPlayerStatus() == GPS_NORMAL) { - // ¿ ũó ǰ εǾ ϹǷ, NULL ƴϾ Ѵ. - // PLAYER_INGAME ü ũó ε Ǿ ǹѴ. + // 이 상태에서는 크리처가 옳게 로딩되었어야 하므로, NULL 이 아니어야 한다. + // PLAYER_INGAME 자체가 크리처 로딩이 성공되었음을 의미한다. Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); if (pCreature->isVampire()) { diff --git a/src/Core/CGShopRequestBuy.cpp b/src/Core/CGShopRequestBuy.cpp index b14b5b2a..409d845a 100644 --- a/src/Core/CGShopRequestBuy.cpp +++ b/src/Core/CGShopRequestBuy.cpp @@ -1,10 +1,10 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CGShopRequestBuy.cpp -// Written By : 輺 +// Written By : 김성민 // Description : -// ÷̾ NPC â , ϰ -// Ŷ̴. ÷̾ κ丮 -// ڸ ִ ÷̾ ѱ. +// 플레이어가 상점 NPC의 진열창을 보고, 물건을 구입하고자 할 때 +// 보내는 패킷이다. 서버는 플레이어에게 충분한 돈과 인벤토리에 +// 자리가 있는지 검증한 후 플레이어에게 아이템을 넘긴다. //////////////////////////////////////////////////////////////////////////////// #include "CGShopRequestBuy.h" diff --git a/src/Core/CGShopRequestBuy.h b/src/Core/CGShopRequestBuy.h index ce85f172..40a034f7 100644 --- a/src/Core/CGShopRequestBuy.h +++ b/src/Core/CGShopRequestBuy.h @@ -1,10 +1,10 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CGShopRequestBuy.h -// Written By : 輺 +// Written By : 김성민 // Description : -// ÷̾ NPC â , ϰ -// Ŷ̴. ÷̾ κ丮 -// ڸ ִ , ÷̾ ѱ. +// 플레이어가 상점 NPC의 진열창을 보고, 물건을 구입하고자 할 때 +// 보내는 패킷이다. 서버는 플레이어에게 충분한 돈과 인벤토리에 +// 자리가 있는지 검증한 후, 플레이어에게 아이템을 넘긴다. //////////////////////////////////////////////////////////////////////////////// #ifndef __CG_SHOP_REQUEST_BUY_H__ @@ -85,7 +85,7 @@ class CGShopRequestBuy : public Packet { ShopRackType_t m_RackType; // Rack type BYTE m_RackIndex; // Rack index ItemNum_t m_Num; // Number of item - Coord_t m_X; // ÷̾ κ丮 ǥ + Coord_t m_X; // 플레이어 인벤토리 내의 좌표값 Coord_t m_Y; }; diff --git a/src/Core/CGShopRequestBuyHandler.cpp b/src/Core/CGShopRequestBuyHandler.cpp index 3d977528..f912ec13 100644 --- a/src/Core/CGShopRequestBuyHandler.cpp +++ b/src/Core/CGShopRequestBuyHandler.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGShopRequestBuyHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -35,8 +35,8 @@ #endif ////////////////////////////////////////////////////////////////////////////// -// ÷̾ ϴ Ĵ NPC ִ -// Ȯϰ, Ϲ ۰ Ŭ óκ бѴ. +// 플레이어가 원하는 물건을 파는 NPC와 그 아이템이 있는지 +// 확인하고, 일반 아이템과 모터 사이클 처리부분으로 분기한다. ////////////////////////////////////////////////////////////////////////////// void CGShopRequestBuyHandler::execute(CGShopRequestBuy* pPacket, Player* pPlayer) @@ -48,7 +48,7 @@ void CGShopRequestBuyHandler::execute(CGShopRequestBuy* pPacket, Player* pPlayer Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Ŷ ̾Ƴ. + // 패킷 정보를 뽑아낸다. ObjectID_t NPCID = pPacket->getObjectID(); ShopRackType_t shopType = pPacket->getShopType(); BYTE shopIndex = pPacket->getShopIndex(); @@ -69,7 +69,7 @@ void CGShopRequestBuyHandler::execute(CGShopRequestBuy* pPacket, Player* pPlayer // try //{ - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 pNPCBase = pZone->getCreature(NPCID); //} if (pNPCBase == NULL) // catch (NoSuchElementException) @@ -92,7 +92,7 @@ void CGShopRequestBuyHandler::execute(CGShopRequestBuy* pPacket, Player* pPlayer NPC* pNPC = dynamic_cast(pNPCBase); /* - // ִ üũ + // 상점에 아이템 있는지 없는지 체크용 for (int i=0; i<=2; i++) { for (int j=0; j<20; j++) @@ -105,7 +105,7 @@ void CGShopRequestBuyHandler::execute(CGShopRequestBuy* pPacket, Player* pPlayer */ if (pNPC->getShopType() == SHOPTYPE_NORMAL) { - // ÷̾ ϰ ϴ NPC ִ ˻ + // 플레이어가 구입하고자 하는 아이템을 NPC가 가지고 있는지 검사 if (pNPC->isExistShopItem(shopType, shopIndex) == false) { GCShopBuyFail gcShopBuyFail; gcShopBuyFail.setCode(GC_SHOP_BUY_FAIL_ITEM_NOT_EXIST); @@ -127,13 +127,13 @@ void CGShopRequestBuyHandler::execute(CGShopRequestBuy* pPacket, Player* pPlayer } } - // ˻ + // 아이템 갯수가 정상적인지를 검사 if (itemNum < 1 || itemNum > ItemMaxStack[pItem->getItemClass()]) { - throw ProtocolException("CGShopRequestBuyHandler::execute() : !"); + throw ProtocolException("CGShopRequestBuyHandler::execute() : 아이템 갯수 오류!"); } - // 2 ̶̻ ˻ - // ִ ƴ϶ 1 ش. + // 아이템 갯수가 2개 이상이라면 정상적인 아이템인지를 검사 + // 쌓일 수 있는 아이템이 아니라면 갯수를 1로 세팅해 준다. if (itemNum > 1 && !isStackable(pItem->getItemClass())) pPacket->setItemNum(1); @@ -143,14 +143,14 @@ void CGShopRequestBuyHandler::execute(CGShopRequestBuy* pPacket, Player* pPlayer executeNormal(pPacket, pPlayer); } /////////////////////////////////////////////////////////////////////// -// 2001 ũ ̺Ʈ ؼ Լ̴. -// 2002 ̳ ̺Ʈ ؼ . -// XMAS_EVENT STAR_EVENT Ǿ -// 2002.5.2 ȫâ(changaya@metrotech.co.kr) +// 2001년 크리스마스 이벤트를 위해서 사용된 함수이다. +// 2002년 어린이날 이벤트를 위해서 재사용됨. +// XMAS_EVENT에서 STAR_EVENT로 수정되어야 할 것으로 예정 +// 2002.5.2 장홍창(changaya@metrotech.co.kr) ////////////////////////////////////////////////////////////////////// #ifdef __XMAS_EVENT_CODE__ else if (pNPC->getShopType() == SHOPTYPE_EVENT) { - // ÷̾ ϰ ϴ NPC ִ ˻ + // 플레이어가 구입하고자 하는 아이템을 NPC가 가지고 있는지 검사 if (pNPC->isExistShopItem(shopType, shopIndex) == false) { GCShopBuyFail gcShopBuyFail; gcShopBuyFail.setCode(GC_SHOP_BUY_FAIL_ITEM_NOT_EXIST); @@ -159,9 +159,9 @@ void CGShopRequestBuyHandler::execute(CGShopRequestBuy* pPacket, Player* pPlayer return; } - // ˻ + // 아이템 갯수가 정상적인지를 검사 if (itemNum != 1) - throw ProtocolException("CGShopRequestBuyHandler::execute() : !"); + throw ProtocolException("CGShopRequestBuyHandler::execute() : 아이템 갯수 오류!"); executeEvent(pPacket, pPlayer); } @@ -176,7 +176,7 @@ void CGShopRequestBuyHandler::execute(CGShopRequestBuy* pPacket, Player* pPlayer ////////////////////////////////////////////////////////////////////////////// -// Ϲ óѴ. +// 일반 아이템의 구입을 처리한다. ////////////////////////////////////////////////////////////////////////////// void CGShopRequestBuyHandler::executeNormal(CGShopRequestBuy* pPacket, Player* pPlayer) @@ -198,7 +198,7 @@ void CGShopRequestBuyHandler::executeNormal(CGShopRequestBuy* pPacket, Player* p NPC* pNPC = dynamic_cast(pZone->getCreature(NPCID)); Gold_t itemTax = 0; - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pNPC == NULL) return; @@ -206,7 +206,7 @@ void CGShopRequestBuyHandler::executeNormal(CGShopRequestBuy* pPacket, Player* p Price_t itemMoney; bool bMysteriousRack = (shopType == SHOP_RACK_MYSTERIOUS); - // Mysterious item ٸ. + // Mysterious item은 가격 계산이 다르다. if (bMysteriousRack) { // cout << pPacket->toString().c_str() << endl; itemMoney = g_pPriceManager->getMysteriousPrice(pItem->getItemClass(), pCreature); @@ -245,12 +245,12 @@ void CGShopRequestBuyHandler::executeNormal(CGShopRequestBuy* pPacket, Player* p return; } - // mysterious item ع. + // mysterious item을 생성해버린다. if (bMysteriousRack) { if (pZone->isPremiumZone() || pZone->isPayPlay()) { pItem = getRandomMysteriousItem(pCreature, IClass); } else { - // premium zone ƴϸ gamble level 30 Ѵ. + // premium zone이 아니면 gamble level을 30으로 제한한다. pItem = getRandomMysteriousItem(pCreature, IClass, 30); } @@ -258,7 +258,7 @@ void CGShopRequestBuyHandler::executeNormal(CGShopRequestBuy* pPacket, Player* p (pZone->getObjectRegistry()).registerObject(pItem); } - // ̳, źâ 쿡 ְ ... + // 먼저 포션이나, 탄창 같은 경우에는 아이템 갯수를 세팅해 주고 나서... if (isStackable(pItem)) { pItem->setNum(itemNum); } else { @@ -271,8 +271,8 @@ void CGShopRequestBuyHandler::executeNormal(CGShopRequestBuy* pPacket, Player* p gcShopBuyFail.setAmount(0); pPlayer->sendPacket(&gcShopBuyFail); - // mysterious item getRandomMysteriousItem() ؼ - // Ǿ Ѵ. + // mysterious item은 위에서 getRandomMysteriousItem()을 통해서 + // 생성되었기 때문에 지워줘야 한다. if (bMysteriousRack) SAFE_DELETE(pItem); @@ -283,17 +283,17 @@ void CGShopRequestBuyHandler::executeNormal(CGShopRequestBuy* pPacket, Player* p // if (pItem != NULL ) pItem->whenPCTake(pPC); - // ÷̾ ̶ ø. + // 플레이어가 산 아이템이 스페셜 아이템이라면 상점 버전을 올린다. if (shopType == SHOP_RACK_SPECIAL) { pNPC->increaseShopVersion(shopType); } - // ÷̾ δ. + // 플레이어의 돈을 줄인다. // pPC->setGoldEx(playerMoney - itemMoney); // by sigi. 2002.9.4 pPC->decreaseGoldEx(itemMoney); - filelog("Tax.log", "%s %s %u ŭ ½ϴ.", pPC->getName().c_str(), pNPC->getName().c_str(), + filelog("Tax.log", "%s 가 %s 에게 %u 만큼을 세금으로 냈습니다.", pPC->getName().c_str(), pNPC->getName().c_str(), itemTax); g_pCastleInfoManager->increaseTaxBalance(pNPC->getTaxingCastleZoneID(), itemTax); @@ -302,22 +302,22 @@ void CGShopRequestBuyHandler::executeNormal(CGShopRequestBuy* pPacket, Player* p Item* pReturnItem = pInventory->addItemEx(x, y, pItem); if (pReturnItem == pItem) { // cout << "add ok" << endl; - // pReturnItem pItem ٴ ̴ - // ƴϾٴ ̴. + // pReturnItem과 pItem이 같다는 말은 아이템이 쌓이는 아이템이 + // 아니었다는 말이다. - // ItemID ״ Ѵ. - // ItemID 0̸.. create()Ҷ ٽ ItemID ޴´. + // 기존의 ItemID를 그대로 유지한다. + // ItemID가 0이면.. create()할때 다시 ItemID를 받는다. // by sigi. 2002.10.28 pItem->create(pPC->getName(), STORAGE_INVENTORY, 0, x, y, pItem->getItemID()); - // ܼ create θ DB 1 . - // ׷Ƿ ٽ ̺긦 ҷ Ѵ. + // 단순히 create만 부르면 DB에는 포션의 갯수 같은 것을 1개로 만든다. + // 그러므로 다시 세이브를 불러서 실제적인 갯수를 세팅해줘야 한다. // pItem->save(pPC->getName(), STORAGE_INVENTORY, 0, x, y); - // ٷ ϵ create ߴ. - // item ȭ. by sigi. 2002.5.13 + // 개수를 바로 저장하도록 create를 수정했다. + // item저장 최적화. by sigi. 2002.5.13 - // OK Ŷ . + // OK 패킷을 보낸다. GCShopBuyOK OKPacket; OKPacket.setObjectID(NPCID); OKPacket.setShopVersion(pNPC->getShopVersion(shopType)); @@ -338,18 +338,18 @@ void CGShopRequestBuyHandler::executeNormal(CGShopRequestBuy* pPacket, Player* p // cout << "pile ok" << endl; // log(LOG_BUY_ITEM, pPC->getName(), "", pItem->toString()); - // pReturnItem pItem ٸٴ - // ̴ ̾ٴ ̴. ׷Ƿ ϶ pItem - // Ѵ. + // pReturnItem과 pItem이 다르다는 말은 아이템이 + // 쌓이는 아이템이었다는 말이다. 그러므로 더하라고 보낸 pItem은 + // 삭제해 줘야 한다. SAFE_DELETE(pItem); // pReturnItem->save(pPC->getName(), STORAGE_INVENTORY, 0, x, y); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Num=%d", pReturnItem->getNum()); pReturnItem->tinysave(pField); - // OK Ŷ . + // OK 패킷을 보낸다. GCShopBuyOK OKPacket; OKPacket.setObjectID(NPCID); OKPacket.setShopVersion(pNPC->getShopVersion(shopType)); @@ -366,29 +366,29 @@ void CGShopRequestBuyHandler::executeNormal(CGShopRequestBuy* pPacket, Player* p pPlayer->sendPacket(&OKPacket); } - // ItemTrace α׸ + // ItemTrace 로그를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { remainTraceLog(pItem, pNPC->getName(), pCreature->getName(), ITEM_LOG_CREATE, DETAIL_SHOPBUY); } // cout << "send OK" << endl; - // mysterious item ƴ .. + // mysterious item이 아닌 경우.. if (!bMysteriousRack) { pNPC->removeShopItem(shopType, shopIndex); } if (shopType == SHOP_RACK_NORMAL) { - // ȸ ̶ Ÿ, Ŭ Ѵ. + // 팔린 아이템이 노멀 아이템이라면 같은 타입, 클래스의 아이템을 생성한다. Item* pNewItem = g_pItemFactoryManager->createItem(IClass, IType, OType); Assert(pNewItem != NULL); (pZone->getObjectRegistry()).registerObject(pNewItem); pNPC->insertShopItem(shopType, shopIndex, pNewItem); } else if (bMysteriousRack) { - // mysterious item ״ θ ȴ. + // mysterious item인 경우는 상점은 그대로 두면 된다. // cout << "mysterious item" << endl; } else { - // ȸ ƴ϶, - // ó ÷̾鿡 ȷȴٴ ˷ Ѵ. + // 팔린 아이템이 노멀 아이템이 아니라면, + // 근처의 플레이어들에게 상점의 물건이 팔렸다는 사실을 알려줘야 한다. int CenterX = pNPC->getX(); int CenterY = pNPC->getY(); GCShopSold soldpkt; @@ -400,20 +400,20 @@ void CGShopRequestBuyHandler::executeNormal(CGShopRequestBuy* pPacket, Player* p try { for (int zx = CenterX - 5; zx <= CenterX + 5; zx++) { for (int zy = CenterY - 5; zy <= CenterY + 5; zy++) { - // ٿ带 Ѿ ʴ° üũ + // 바운드를 넘어가지 않는가 체크 if (!isValidZoneCoord(pZone, zx, zy)) continue; Tile& tile = pZone->getTile(zx, zy); - // ɾٴϴ ũĸ ˻ + // 걸어다니는 크리쳐를 검색 if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) { Creature* pNearCreature = tile.getCreature(Creature::MOVE_MODE_WALKING); if (pNearCreature != NULL) { - // ÷̾ + // 방금 아이템을 구입한 플레이어라면 생략 if (pNearCreature->getObjectID() == pPC->getObjectID()) continue; - // ÷̾ Ŷ ش. + // 만약 플레이어라면 패킷을 보내준다. if (pNearCreature->isPC()) { Player* pNearPlayer = pNearCreature->getPlayer(); if (pNearPlayer != NULL) @@ -421,14 +421,14 @@ void CGShopRequestBuyHandler::executeNormal(CGShopRequestBuy* pPacket, Player* p } } } - // ƴٴϴ ũĸ ˻ + // 날아다니는 크리쳐를 검색 if (tile.hasCreature(Creature::MOVE_MODE_FLYING)) { Creature* pNearCreature = tile.getCreature(Creature::MOVE_MODE_FLYING); if (pNearCreature != NULL) { - // ÷̾ + // 방금 아이템을 구입한 플레이어라면 생략 if (pNearCreature->getObjectID() == pPC->getObjectID()) continue; - // ÷̾ Ŷ ش. + // 만약 플레이어라면 패킷을 보내준다. if (pNearCreature->isPC()) { Player* pNearPlayer = pNearCreature->getPlayer(); if (pNearPlayer != NULL) @@ -436,8 +436,8 @@ void CGShopRequestBuyHandler::executeNormal(CGShopRequestBuy* pPacket, Player* p } } } - } // for (ZoneCoord_t zy...) - } // for (ZoneCoord_t zx...) + } // for (ZoneCoord_t zy...) 끝 + } // for (ZoneCoord_t zx...) 끝 } catch (Throwable& t) { filelog("shopbug_packet.log", "%s", t.toString().c_str()); } @@ -449,7 +449,7 @@ void CGShopRequestBuyHandler::executeNormal(CGShopRequestBuy* pPacket, Player* p } ////////////////////////////////////////////////////////////////////////////// -// Ŭ óѴ. +// 모터 사이클의 구입을 처리한다. ////////////////////////////////////////////////////////////////////////////// void CGShopRequestBuyHandler::executeMotorcycle(CGShopRequestBuy* pPacket, Player* pPlayer) @@ -458,7 +458,7 @@ void CGShopRequestBuyHandler::executeMotorcycle(CGShopRequestBuy* pPacket, Playe #ifdef __GAME_SERVER__ - // Ŷ ̾Ƴ. + // 패킷 정보를 뽑아낸다. ObjectID_t NPCID = pPacket->getObjectID(); ShopRackType_t shopType = pPacket->getShopType(); BYTE shopIndex = pPacket->getShopIndex(); @@ -470,7 +470,7 @@ void CGShopRequestBuyHandler::executeMotorcycle(CGShopRequestBuy* pPacket, Playe Zone* pZone = pPC->getZone(); NPC* pNPC = dynamic_cast(pZone->getCreature(NPCID)); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pNPC == NULL) return; @@ -504,24 +504,24 @@ void CGShopRequestBuyHandler::executeMotorcycle(CGShopRequestBuy* pPacket, Playe return; } - // ÷̾ ̶ ø. + // 플레이어가 산 아이템이 스페셜 아이템이라면 상점 버전을 올린다. if (shopType == SHOP_RACK_SPECIAL) pNPC->increaseShopVersion(shopType); - // ÷̾ δ. + // 플레이어의 돈을 줄인다. // pPC->setGoldEx(playerMoney - itemMoney); // by sigi. 2002.9.4 pPC->decreaseGoldEx(itemMoney); - // Ŭ NPC 忡 δ. - // ۰ DBٰ Ŭ ȷȴٴ . + // 먼저 모터 사이클을 NPC의 진열장에서 꺼내어 존에다 붙인다. + // 글고 DB에다가 모터 사이클이 팔렸다는 것을 쓴다. TPOINT pt = pZone->addItem(pItem, pPC->getX(), pPC->getY(), false); if (pt.x == -1) { - // NPCԼ ȸ Ŭ . + // 서버 측의 NPC에게서 방금 팔린 모터 사이클을 지운다. // pNPC->removeShopItem(shopType, shopIndex); // SAFE_DELETE(pItem); - // ̸ . Ʈ... . + // 오토바이를 존에다 더할 수가 없었다. 쉬트... 걍 리턴하자. cerr << "######################################################" << endl; cerr << "# CRITICAL ERROR!!! Cannot add MOTORCYCLE to ZONE!!! #" << endl; cerr << "######################################################" << endl; @@ -530,26 +530,26 @@ void CGShopRequestBuyHandler::executeMotorcycle(CGShopRequestBuy* pPacket, Playe pItem->create(pPC->getName(), STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y); ItemID_t MotorcycleID = pItem->getItemID(); - // ͻŬ ŷ Ϳ ش. + // 모터사이클을 뻑킹 센터에 등록해 준다. MotorcycleBox* pBox = new MotorcycleBox(dynamic_cast(pItem), pZone, pt.x, pt.y); Assert(pBox != NULL); g_pParkingCenter->addMotorcycleBox(pBox); - // Ŭ ´ Ű Ѵ. - // ۰ DBٰ Ŭ Ű ÷̾ Ѿٴ . + // 다음으로 방금 생성한 모터 사이클에 맞는 키를 생성한다. + // 글고 DB에다가 모터 사이클 키가 플레이어에게 넘어갔다는 것을 쓴다. Item* pKey = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_KEY, 2, optionNULL); Assert(pKey != NULL); (pZone->getObjectRegistry()).registerObject(pKey); dynamic_cast(pKey)->setTarget(MotorcycleID); pKey->create(pPC->getName(), STORAGE_INVENTORY, 0, x, y); - // Ŭ Ű ÷̾ κ丮 Ѵ. + // 모터 사이클 키를 플레이어의 인벤토리에 더한다. pInventory->addItemEx(x, y, pKey); - // NPCԼ ȸ Ŭ . + // 서버 측의 NPC에게서 방금 팔린 모터 사이클을 지운다. pNPC->removeShopItem(shopType, shopIndex); - // OK Ŷ . + // OK 패킷을 보낸다. GCShopBuyOK OKPacket; OKPacket.setObjectID(NPCID); OKPacket.setShopVersion(pNPC->getShopVersion(shopType)); @@ -565,8 +565,8 @@ void CGShopRequestBuyHandler::executeMotorcycle(CGShopRequestBuy* pPacket, Playe OKPacket.setPrice(playerMoney - itemMoney); pPlayer->sendPacket(&OKPacket); - // ȸ Ŭ Ŭ̶... - // Ÿ, Ŭ Ŭ Ѵ. + // 팔린 모터 사이클이 노멀 모터 사이클이라면... + // 같은 타입, 클래스의 모터 사이클을 생성한다. if (shopType == SHOP_RACK_NORMAL) { IClass = Item::ITEM_CLASS_MOTORCYCLE; IType = pItem->getItemType(); @@ -577,8 +577,8 @@ void CGShopRequestBuyHandler::executeMotorcycle(CGShopRequestBuy* pPacket, Playe pNPC->insertShopItem(shopType, shopIndex, pNewItem); } else if (shopType == SHOP_RACK_MYSTERIOUS) { } else { - // ȸ Ŭ Ŭ ƴ϶ ó ÷̾鿡 - // Ŭ ȷȴٴ ˷ Ѵ. + // 팔린 모터 사이클이 노멀 모터 사이클이 아니라면 근처의 플레이어들에게 + // 상점의 모터 사이클이 팔렸다는 사실을 알려줘야 한다. int CenterX = pNPC->getX(); int CenterY = pNPC->getY(); @@ -594,20 +594,20 @@ void CGShopRequestBuyHandler::executeMotorcycle(CGShopRequestBuy* pPacket, Playe try { for (int zx = CenterX - 5; zx <= CenterX + 5; zx++) { for (int zy = CenterY - 5; zy <= CenterY + 5; zy++) { - // ٿ带 Ѿ ʴ° üũ + // 바운드를 넘어가지 않는가 체크 if (!isValidZoneCoord(pZone, zx, zy)) continue; Tile& tile = pZone->getTile(zx, zy); if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) { - // ɾٴϴ ũĸ ˻ + // 걸어다니는 크리쳐를 검색 pNearCreature = tile.getCreature(Creature::MOVE_MODE_WALKING); if (pNearCreature != NULL) { - // ÷̾ + // 방금 아이템을 구입한 플레이어라면 생략 if (pNearCreature->getObjectID() == pPC->getObjectID()) continue; - // ÷̾ Ŷ ش. + // 만약 플레이어라면 패킷을 보내준다. if (pNearCreature->isPC()) { pNearPlayer = pNearCreature->getPlayer(); if (pNearPlayer != NULL) @@ -616,13 +616,13 @@ void CGShopRequestBuyHandler::executeMotorcycle(CGShopRequestBuy* pPacket, Playe } } if (tile.hasCreature(Creature::MOVE_MODE_FLYING)) { - // ƴٴϴ ũĸ ˻ + // 날아다니는 크리쳐를 검색 pNearCreature = tile.getCreature(Creature::MOVE_MODE_FLYING); if (pNearCreature != NULL) { - // ÷̾ + // 방금 아이템을 구입한 플레이어라면 생략 if (pNearCreature->getObjectID() == pPC->getObjectID()) continue; - // ÷̾ Ŷ ش. + // 만약 플레이어라면 패킷을 보내준다. if (pNearCreature->isPC()) { pNearPlayer = pNearCreature->getPlayer(); if (pNearPlayer != NULL) @@ -630,12 +630,12 @@ void CGShopRequestBuyHandler::executeMotorcycle(CGShopRequestBuy* pPacket, Playe } } } - } // for (ZoneCoord_t zy...) - } // for (ZoneCoord_t zx...) + } // for (ZoneCoord_t zy...) 끝 + } // for (ZoneCoord_t zx...) 끝 } catch (Throwable& t) { filelog("shopbug_packet.log", "%s", t.toString().c_str()); } - } // if (shopType == SHOP_RACK_NORMAL) else + } // if (shopType == SHOP_RACK_NORMAL) else 끝 SAFE_DELETE(pTestKey); @@ -645,7 +645,7 @@ void CGShopRequestBuyHandler::executeMotorcycle(CGShopRequestBuy* pPacket, Playe } ////////////////////////////////////////////////////////////////////////////// -// ̺Ʈ óѴ. +// 이벤트 아이템의 구입을 처리한다. ////////////////////////////////////////////////////////////////////////////// void CGShopRequestBuyHandler::executeEvent(CGShopRequestBuy* pPacket, Player* pPlayer) @@ -670,7 +670,7 @@ void CGShopRequestBuyHandler::executeEvent(CGShopRequestBuy* pPacket, Player* pP Zone* pZone = pPC->getZone(); NPC* pNPC = dynamic_cast(pZone->getCreature(NPCID)); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pNPC == NULL) return; @@ -683,15 +683,15 @@ void CGShopRequestBuyHandler::executeEvent(CGShopRequestBuy* pPacket, Player* pP Gold_t playerMoney = pPC->getGold(); XMAS_STAR star; - // ̺Ʈ ̺Ʈ Ѵ. + // 이벤트용 아이템의 이벤트 가격을 구한다. g_pPriceManager->getStarPrice(pItem, star); - // cout << " ϴ :" << endl << pItem->toString() << endl; - // cout << " ϴ :" << endl + // cout << "사려고 하는 아이템:" << endl << pItem->toString() << endl; + // cout << "사려고 하는 아이템의 가격:" << endl // << "COLOR:" << star.color << ",AMOUNT:" << star.amount << endl; - // ̳, źâ 쿡 ְ ... - // ̺Ʈ ۿ ̳ źâ ԵǾ ... + // 먼저 포션이나, 탄창 같은 경우에는 아이템 갯수를 세팅해 주고 나서... + // 사실 이벤트 아이템에는 포션이나 탄창이 포함되어 있지 않지만... switch (pItem->getItemClass()) { case Item::ITEM_CLASS_POTION: dynamic_cast(pItem)->setNum(itemNum); @@ -703,9 +703,9 @@ void CGShopRequestBuyHandler::executeEvent(CGShopRequestBuy* pPacket, Player* pP break; } - // κп شϴ ݸŭ ִ üũѴ. + // 이 부분에서 해당하는 가격만큼의 별을 가지고 있는지를 체크한다. if (!pInventory->hasEnoughStar(star)) { - // cout << "÷̾ شϴ ŭ մϴ." << endl; + // cout << "플레이어는 해당하는 만큼의 별을 가지고 있지 못합니다." << endl; GCShopBuyFail gcShopBuyFail; gcShopBuyFail.setCode(GC_SHOP_BUY_FAIL_NOT_ENOUGH_MONEY); @@ -714,11 +714,11 @@ void CGShopRequestBuyHandler::executeEvent(CGShopRequestBuy* pPacket, Player* pP return; } - // cout << "÷̾ شϴ ŭ ̻ ֽϴ." << endl; + // cout << "플레이어는 해당하는 만큼 이상의 별을 가지고 있습니다." << endl; - // Ȥö ڸ ٸ... + // 혹시라도 자리가 없다면... if (!pInventory->canAddingEx(x, y, pItem)) { - // cout << "κ丮 ڸ ϴ." << endl; + // cout << "인벤토리에 자리가 없습니다." << endl; GCShopBuyFail gcShopBuyFail; gcShopBuyFail.setCode(GC_SHOP_BUY_FAIL_NOT_ENOUGH_SPACE); @@ -727,29 +727,29 @@ void CGShopRequestBuyHandler::executeEvent(CGShopRequestBuy* pPacket, Player* pP return; } - // ÷̾ ̶ ø. + // 플레이어가 산 아이템이 스페셜 아이템이라면 상점 버전을 올린다. if (shopType == SHOP_RACK_SPECIAL) { pNPC->increaseShopVersion(shopType); } - // κп ÷̾ δ. + // 이 부분에서 플레이어의 별을 줄인다. pInventory->decreaseStar(star); - // cout << "÷̾ ٿϴ." << endl; + // cout << "플레이어의 별을 줄였습니다." << endl; Item* pReturnItem = pInventory->addItemEx(x, y, pItem); if (pReturnItem == pItem) { - // pReturnItem pItem ٴ ̴ - // ƴϾٴ ̴. + // pReturnItem과 pItem이 같다는 말은 아이템이 쌓이는 아이템이 + // 아니었다는 말이다. pItem->create(pPC->getName(), STORAGE_INVENTORY, 0, x, y); - // ܼ create θ DB 1 . - // ׷Ƿ ٽ ̺긦 ҷ Ѵ. + // 단순히 create만 부르면 DB에는 포션의 갯수 같은 것을 1개로 만든다. + // 그러므로 다시 세이브를 불러서 실제적인 갯수를 세팅해줘야 한다. // pItem->save(pPC->getName(), STORAGE_INVENTORY, 0, x, y); - // item create ϵ ٲ. - // item ȭ. by sigi. 2002.5.13 + // item의 create에서 개수를 저장하도록 바꿨다. + // item저장 최적화. by sigi. 2002.5.13 - // OK Ŷ . + // OK 패킷을 보낸다. GCShopBuyOK OKPacket; OKPacket.setObjectID(NPCID); OKPacket.setShopVersion(pNPC->getShopVersion(shopType)); @@ -769,18 +769,18 @@ void CGShopRequestBuyHandler::executeEvent(CGShopRequestBuy* pPacket, Player* pP } else { // log(LOG_BUY_ITEM, pPC->getName(), "", pItem->toString()); - // pReturnItem pItem ٸٴ - // ̴ ̾ٴ ̴. ׷Ƿ ϶ pItem - // Ѵ. + // pReturnItem과 pItem이 다르다는 말은 아이템이 + // 쌓이는 아이템이었다는 말이다. 그러므로 더하라고 보낸 pItem은 + // 삭제해 줘야 한다. SAFE_DELETE(pItem); // pReturnItem->save(pPC->getName(), STORAGE_INVENTORY, 0, x, y); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Num=%d", pReturnItem->getNum()); pReturnItem->tinysave(pField); - // OK Ŷ . + // OK 패킷을 보낸다. GCShopBuyOK OKPacket; OKPacket.setObjectID(NPCID); OKPacket.setShopVersion(pNPC->getShopVersion(shopType)); @@ -800,15 +800,15 @@ void CGShopRequestBuyHandler::executeEvent(CGShopRequestBuy* pPacket, Player* pP pNPC->removeShopItem(shopType, shopIndex); if (shopType == SHOP_RACK_NORMAL) { - // ȸ ̶ Ÿ, Ŭ Ѵ. + // 팔린 아이템이 노멀 아이템이라면 같은 타입, 클래스의 아이템을 생성한다. Item* pNewItem = g_pItemFactoryManager->createItem(IClass, IType, OType); Assert(pNewItem != NULL); (pZone->getObjectRegistry()).registerObject(pNewItem); pNPC->insertShopItem(shopType, shopIndex, pNewItem); } else if (shopType == SHOP_RACK_MYSTERIOUS) { } else { - // ȸ ƴ϶, - // ó ÷̾鿡 ȷȴٴ ˷ Ѵ. + // 팔린 아이템이 노멀 아이템이 아니라면, + // 근처의 플레이어들에게 상점의 물건이 팔렸다는 사실을 알려줘야 한다. int CenterX = pNPC->getX(); int CenterY = pNPC->getY(); GCShopSold soldpkt; @@ -822,20 +822,20 @@ void CGShopRequestBuyHandler::executeEvent(CGShopRequestBuy* pPacket, Player* pP try { for (int zx = CenterX - 5; zx <= CenterX + 5; zx++) { for (int zy = CenterY - 5; zy <= CenterY + 5; zy++) { - // ٿ带 Ѿ ʴ° üũ + // 바운드를 넘어가지 않는가 체크 if (!isValidZoneCoord(pZone, zx, zy)) continue; Tile& tile = pZone->getTile(zx, zy); - // ɾٴϴ ũĸ ˻ + // 걸어다니는 크리쳐를 검색 if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) { Creature* pNearCreature = tile.getCreature(Creature::MOVE_MODE_WALKING); if (pNearCreature != NULL) { - // ÷̾ + // 방금 아이템을 구입한 플레이어라면 생략 if (pNearCreature->getObjectID() == pPC->getObjectID()) continue; - // ÷̾ Ŷ ش. + // 만약 플레이어라면 패킷을 보내준다. if (pNearCreature->isPC()) { Player* pNearPlayer = pNearCreature->getPlayer(); if (pNearPlayer != NULL) @@ -843,14 +843,14 @@ void CGShopRequestBuyHandler::executeEvent(CGShopRequestBuy* pPacket, Player* pP } } } - // ƴٴϴ ũĸ ˻ + // 날아다니는 크리쳐를 검색 if (tile.hasCreature(Creature::MOVE_MODE_FLYING)) { Creature* pNearCreature = tile.getCreature(Creature::MOVE_MODE_FLYING); if (pNearCreature != NULL) { - // ÷̾ + // 방금 아이템을 구입한 플레이어라면 생략 if (pNearCreature->getObjectID() == pPC->getObjectID()) continue; - // ÷̾ Ŷ ش. + // 만약 플레이어라면 패킷을 보내준다. if (pNearCreature->isPC()) { Player* pNearPlayer = pNearCreature->getPlayer(); if (pNearPlayer != NULL) @@ -858,8 +858,8 @@ void CGShopRequestBuyHandler::executeEvent(CGShopRequestBuy* pPacket, Player* pP } } } - } // for (ZoneCoord_t zy...) - } // for (ZoneCoord_t zx...) + } // for (ZoneCoord_t zy...) 끝 + } // for (ZoneCoord_t zx...) 끝 } catch (Throwable& t) { filelog("shopbug_packet.log", "%s", t.toString().c_str()); } diff --git a/src/Core/CGShopRequestList.cpp b/src/Core/CGShopRequestList.cpp index 3f3fcc91..a4e4590e 100644 --- a/src/Core/CGShopRequestList.cpp +++ b/src/Core/CGShopRequestList.cpp @@ -1,10 +1,10 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGShopRequestList.cpp -// Written By : 輺 +// Written By : 김성민 // Description : -// ÷̾ ִ մ -// ٸ , ÷̾ ǰ Ʈ -// ûϰ ȴ. Ŷ ׶ Ǵ Ŷ̴. +// 플레이어가 가지고 있는 상점 버전과 서버가 가지고 잇는 상점의 +// 버전이 다를 경우, 플레이어는 서버에게 상품의 리스트를 +// 요청하게 된다. 이 패킷은 그때 보내게 되는 패킷이다. ////////////////////////////////////////////////////////////////////////////// #include "CGShopRequestList.h" diff --git a/src/Core/CGShopRequestListHandler.cpp b/src/Core/CGShopRequestListHandler.cpp index 2d41051c..aeb4e42a 100644 --- a/src/Core/CGShopRequestListHandler.cpp +++ b/src/Core/CGShopRequestListHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGShopRequestListHandler.cpp -// Written By : 輺 -// Description : CGShopRequestList ڵ鷯̴. +// Written By : 김성민 +// Description : CGShopRequestList의 핸들러이다. ////////////////////////////////////////////////////////////////////////////// #include "CGShopRequestList.h" @@ -31,11 +31,11 @@ void CGShopRequestListHandler::execute(CGShopRequestList* pPacket, Player* pPlay Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Ŷ ̾Ƴ. + // 패킷에서 정보를 뽑아낸다. ObjectID_t NPCID = pPacket->getObjectID(); ShopRackType_t type = pPacket->getRackType(); - // Ķ Ŷ ̾Ƴ + // 파라미터 및 패킷에서 뽑아낸 정보를 가공 GamePlayer* pGamePlayer = dynamic_cast(pPlayer); PlayerCreature* pPC = dynamic_cast(pGamePlayer->getCreature()); Zone* pZone = pPC->getZone(); @@ -52,7 +52,7 @@ void CGShopRequestListHandler::execute(CGShopRequestList* pPacket, Player* pPlay } */ - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 pNPCBase = pZone->getCreature(NPCID); if (pNPCBase == NULL || pNPCBase->isNPC() == false) { @@ -64,7 +64,7 @@ void CGShopRequestListHandler::execute(CGShopRequestList* pPacket, Player* pPlay NPC* pNPC = dynamic_cast(pNPCBase); if (type == SHOP_RACK_SPECIAL) { - // ǰ Ʈ Ŷ ۼѴ. + // 상품의 리스트를 패킷에다 작성한다. GCShopList pkt; pkt.setNPCShopType(pNPC->getShopType()); pkt.setObjectID(NPCID); @@ -72,7 +72,7 @@ void CGShopRequestListHandler::execute(CGShopRequestList* pPacket, Player* pPlay pkt.setShopType(type); for (BYTE i = 0; i < SHOP_RACK_INDEX_MAX; i++) { - // ´. + // 각각의 아이템 정보를 적는다. Item* pItem = pNPC->getShopItem(type, i); if (pItem != NULL) pkt.setShopItem(i, pItem); @@ -82,17 +82,17 @@ void CGShopRequestListHandler::execute(CGShopRequestList* pPacket, Player* pPlay // pkt.setMarketCondSell(pNPC->getMarketCondSell()); pkt.setMarketCondSell(pNPC->getTaxRatio(pPC)); - // Ŷ . + // 패킷을 보내자. pPlayer->sendPacket(&pkt); } else if (type == SHOP_RACK_MYSTERIOUS) { - // ǰ Ʈ Ŷ ۼѴ. + // 상품의 리스트를 패킷에다 작성한다. GCShopListMysterious pkt; pkt.setObjectID(NPCID); pkt.setShopVersion(pNPC->getShopVersion(type)); pkt.setShopType(type); for (BYTE i = 0; i < SHOP_RACK_INDEX_MAX; i++) { - // ´. + // 각각의 아이템 정보를 적는다. Item* pItem = pNPC->getShopItem(type, i); if (pItem != NULL) pkt.setShopItem(i, pItem); @@ -102,7 +102,7 @@ void CGShopRequestListHandler::execute(CGShopRequestList* pPacket, Player* pPlay // pkt.setMarketCondSell(pNPC->getMarketCondSell()); pkt.setMarketCondSell(pNPC->getTaxRatio(pPC)); - // Ŷ . + // 패킷을 보내자. pPlayer->sendPacket(&pkt); } else { throw ProtocolException("NORMAL shop item list not allowed!!!"); diff --git a/src/Core/CGShopRequestSell.cpp b/src/Core/CGShopRequestSell.cpp index 6b92a457..e5bea292 100644 --- a/src/Core/CGShopRequestSell.cpp +++ b/src/Core/CGShopRequestSell.cpp @@ -1,9 +1,9 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CGShopRequestSell.cpp -// Written By : 輺 +// Written By : 김성민 // Description : -// ÷̾ ڽ ִ NPC -// ȱ⸦ û ̴ Ŷ̴. +// 플레이어에게 자신이 가지고 있는 아이템을 상점 NPC에게 +// 팔기를 요청할 때 쓰이는 패킷이다. //////////////////////////////////////////////////////////////////////////////// #include "CGShopRequestSell.h" diff --git a/src/Core/CGShopRequestSell.h b/src/Core/CGShopRequestSell.h index facb96f3..9bb187f3 100644 --- a/src/Core/CGShopRequestSell.h +++ b/src/Core/CGShopRequestSell.h @@ -1,9 +1,9 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CGShopRequestSell.h -// Written By : 輺 +// Written By : 김성민 // Description : -// ÷̾ ڽ ִ NPC -// ȱ⸦ û ̴ Ŷ̴. +// 플레이어에게 자신이 가지고 있는 아이템을 상점 NPC에게 +// 팔기를 요청할 때 쓰이는 패킷이다. //////////////////////////////////////////////////////////////////////////////// #ifndef __CG_SHOP_REQUEST_SELL_H__ diff --git a/src/Core/CGShopRequestSellHandler.cpp b/src/Core/CGShopRequestSellHandler.cpp index 3645907d..09c31e81 100644 --- a/src/Core/CGShopRequestSellHandler.cpp +++ b/src/Core/CGShopRequestSellHandler.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGShopRequestSellHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -35,8 +35,8 @@ #endif ////////////////////////////////////////////////////////////////////////////// -// ÷̾ ȷ ϴ ִ Ȯ , -// Ϲ ۰ Ŭ ó κ бѴ. +// 플레이어가 팔려고 하는 아이템을 가지고 있는지 확인한 다음에, +// 일반 아이템과 모터 사이클 처리 부분으로 분기한다. ////////////////////////////////////////////////////////////////////////////// void CGShopRequestSellHandler::execute(CGShopRequestSell* pPacket, Player* pPlayer) { __BEGIN_TRY __BEGIN_DEBUG_EX @@ -53,7 +53,7 @@ void CGShopRequestSellHandler::execute(CGShopRequestSell* pPacket, Player* pPlay PlayerCreature* pPC = dynamic_cast(pCreature); if (OPCODE == SHOP_REQUEST_SELL_NORMAL) { - // ÷̾ ȷ ϴ ִ ˻ + // 플레이어가 팔려고 하는 아이템을 가지고 있는지 검사 Inventory* pInventory = pPC->getInventory(); if (pInventory->hasItem(ITEMOID) == false) throw ProtocolException("CGShopRequestSellHandler::execute() : No such item to sell!"); @@ -67,15 +67,15 @@ void CGShopRequestSellHandler::execute(CGShopRequestSell* pPacket, Player* pPlay // ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo( pItem->getItemClass(), pItem->getItemType() ); // Assert(pItemInfo!=NULL); - // ũ Ǵ. - // Ư Ŭ . by sigi. 2002.8.29 - // ڴ ִ. by bezz. 2002.12.13 - // Ŀø . by Sequoia. 2003. 3. 3 - // ItemUtil ȿ canSell Extract 2003. 3. 3 + // 유니크 아이템은 못판다. + // 특정 아이템 클래스는 팔 수 없다. by sigi. 2002.8.29 + // 선물 상자는 팔 수 있다. by bezz. 2002.12.13 + // 커플링은 팔 수 없다. by Sequoia. 2003. 3. 3 + // ItemUtil 안에 canSell 로 Extract 2003. 3. 3 if (!canSell(pItem)) { return sendFailPacket(pPacket, pPlayer); } - // ʱƵƷó + // 唐珂쇌掘齡돨膠틔꼇횻놔簡 // add by Coffee 2007-8-5 if (pItem->isTimeLimitItem()) { return sendFailPacket(pPacket, pPlayer); @@ -102,7 +102,7 @@ void CGShopRequestSellHandler::execute(CGShopRequestSell* pPacket, Player* pPlay ////////////////////////////////////////////////////////////////////////////// // -// Ϲ óѴ. +// 일반 아이템을 처리한다. // ////////////////////////////////////////////////////////////////////////////// void CGShopRequestSellHandler::executeNormal(CGShopRequestSell* pPacket, Player* pPlayer) { @@ -134,7 +134,7 @@ void CGShopRequestSellHandler::executeNormal(CGShopRequestSell* pPacket, Player* } */ - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 pNPCBase = pZone->getCreature(NPCID); if (pNPCBase == NULL || !pNPCBase->isNPC()) @@ -142,25 +142,25 @@ void CGShopRequestSellHandler::executeNormal(CGShopRequestSell* pPacket, Player* NPC* pNPC = dynamic_cast(pNPCBase); - // ÷̾ ȷ ϴ ִ ˻ + // 플레이어가 팔려고 하는 아이템을 가지고 있는지 검사 Inventory* pInventory = pPC->getInventory(); // Gold_t playerMoney = pPC->getGold(); Item* pItem = pInventory->getItemWithObjectID(ITEMOID); ItemNum_t itemNumber = pItem->getNum(); Price_t itemPrice = g_pPriceManager->getPrice(pItem, pNPC->getMarketCondBuy(), SHOP_RACK_NORMAL, pPC) * itemNumber; - // ÷̾ κ丮 Ѵ. + // 플레이어의 인벤토리에 아이템을 제거한다. pInventory->deleteItem(ITEMOID); pItem->whenPCLost(pPC); if (!pItem->destroy()) { filelog("shopDBBug.txt", "NoSuchItemInDB-destroy: %s", pItem->toString().c_str()); - throw DisconnectException(" µ DB ."); + throw DisconnectException("아이템 지울려는데 DB에 없다."); } - // Ʈ ȿ ִ ش. - // DB Belt::destroy() θ ͸ DZ ȴ. + // 만약 벨트라면 안에 있는 포션을 삭제해준다. + // DB에서 지우는 것은 Belt::destroy()를 부르는 것만으로 포션까지 삭제된다. if (pItem->getItemClass() == Item::ITEM_CLASS_BELT) { Inventory* pBeltInventory = dynamic_cast(pItem)->getInventory(); for (int y = 0; y < pBeltInventory->getHeight(); y++) { @@ -174,46 +174,46 @@ void CGShopRequestSellHandler::executeNormal(CGShopRequestSell* pPacket, Player* } } - // Skull Variable Manager Ӹ Ѵ + // Skull 일 경우 Variable Manager 에서 머리값 배수 값으로 가격을 새로 계산한다 if (pItem->getItemClass() == Item::ITEM_CLASS_SKULL) { itemPrice = itemPrice * (g_pVariableManager->getHeadPriceBonus() / 100); } - // ItemTrace Log ܾ Ѵٸ + // ItemTrace Log 를 남겨야 한다면 남긴다 if (pItem != NULL && pItem->isTraceItem()) { remainTraceLog(pItem, pCreature->getName(), pNPC->getName(), ITEM_LOG_DELETE, DETAIL_SHOPSELL); } - // ÷̾ ǰ Ѵ. + // 플레이어에게 물건값을 지불한다. // pPC->setGoldEx(playerMoney+itemPrice); // by sigi. 2002.9.4 pPC->increaseGoldEx(itemPrice); - // ÷̾ ó ͵ óѴ. + // 플레이어가 물건 팔 때 처리할 것들을 처리한다. pPC->sellItem(pItem); if (pItem->getItemClass() == Item::ITEM_CLASS_MOON_CARD && pItem->getItemType() == 4) { addOlympicStat(pPC, 4, (uint)(itemNumber)); } - // NPC ڸ ϴٸ ÷̾ Ѵ. - //  ɾ ٷ ش. - // ۸ Ѵ. 븻 ׳ . - // Ʈ ʰ . + // NPC에게 자리가 충분하다면 플레이어가 판 아이템을 보관한다. + // 운영자 명령어로 만든 아이템은 바로 없앤다. + // 단 스페셜 아이템만을 보관한다. 노말 아이템은 그냥 버림. + // 퀘스트 아이템은 보관하지 않고 버린다. if (pNPC->getShopType() == SHOPTYPE_NORMAL && pItem->getCreateType() != Item::CREATE_TYPE_CREATE && !pItem->getOptionTypeList().empty() && !pItem->isTimeLimitItem()) { bSpecialItem = true; index = pNPC->getFirstEmptySlot(SHOP_RACK_SPECIAL); if (index < SHOP_RACK_INDEX_MAX) { - // ߰Ѵ. + // 아이템을 추가한다. pNPC->insertShopItem(SHOP_RACK_SPECIAL, index, pItem); - // NPC 忡 ߰Ƿ, ö󰣴. + // 스페셜 아이템을 NPC가 진열장에 추가했으므로, 상점 버전이 올라간다. pNPC->increaseShopVersion(SHOP_RACK_SPECIAL); //////////////////////////////////////////////////////////////////////////// - // ó ÷̾鿡Դ GCShopBought... + // 근처의 플레이어들에게는 GCShopBought를... //////////////////////////////////////////////////////////////////////////// int CenterX = pNPC->getX(); @@ -245,23 +245,23 @@ void CGShopRequestSellHandler::executeNormal(CGShopRequestSell* pPacket, Player* try { for (int zx = CenterX - 5; zx <= CenterX + 5; zx++) { for (int zy = CenterY - 5; zy <= CenterY + 5; zy++) { - // ٿ带 Ѿ ʴ° üũ + // 바운드를 넘어가지 않는가를 체크 if (!isValidZoneCoord(pZone, zx, zy)) continue; Tile& tile = pZone->getTile(zx, zy); - // ɾٴϴ ũĸ ˻ + // 걸어다니는 크리쳐를 검색 if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) { pNearCreature = tile.getCreature(Creature::MOVE_MODE_WALKING); if (pNearCreature == NULL) continue; - // ÷̾ + // 방금 물건을 판 플레이어라면 생략 if (pNearCreature->getObjectID() == pPC->getObjectID()) continue; - // ÷̾ Ŷ ش. + // 만약 플레이어라면 패킷을 보내준다. if (pNearCreature->isPC()) { pNearPlayer = pNearCreature->getPlayer(); if (pNearPlayer == NULL) @@ -269,17 +269,17 @@ void CGShopRequestSellHandler::executeNormal(CGShopRequestSell* pPacket, Player* pNearPlayer->sendPacket(&boughtpkt); } } - // ƴٴϴ ũĸ ˻ + // 날아다니는 크리쳐를 검색 if (tile.hasCreature(Creature::MOVE_MODE_FLYING)) { pNearCreature = tile.getCreature(Creature::MOVE_MODE_FLYING); if (pNearCreature == NULL) continue; - // ÷̾ + // 방금 물건을 판 플레이어라면 생략 if (pNearCreature->getObjectID() == pPC->getObjectID()) continue; - // ÷̾ Ŷ ش. + // 만약 플레이어라면 패킷을 보내준다. if (pNearCreature->isPC()) { pNearPlayer = pNearCreature->getPlayer(); if (pNearPlayer == NULL) @@ -304,7 +304,7 @@ void CGShopRequestSellHandler::executeNormal(CGShopRequestSell* pPacket, Player* SAFE_DELETE(pItem); } - // ÷̾ GCShopSellOK.... + // 물건을 산 플레이어에게 GCShopSellOK를...보낸다. GCShopSellOK okpkt; okpkt.setObjectID(NPCID); if (bSpecialItem) @@ -313,7 +313,7 @@ void CGShopRequestSellHandler::executeNormal(CGShopRequestSell* pPacket, Player* okpkt.setShopVersion(pNPC->getShopVersion(SHOP_RACK_NORMAL)); okpkt.setItemObjectID(ITEMOID); // okpkt.setPrice(playerMoney+itemPrice); - // playerMoney + itemPrice MAX_MONEY Ѿ ִ. + // playerMoney + itemPrice 가 MAX_MONEY를 넘어갈 수 있다. // 2003.1.8 by bezz okpkt.setPrice(pPC->getGold()); pPlayer->sendPacket(&okpkt); @@ -326,7 +326,7 @@ void CGShopRequestSellHandler::executeNormal(CGShopRequestSell* pPacket, Player* ////////////////////////////////////////////////////////////////////////////// // -// Ŭ óѴ. +// 모터 사이클을 처리한다. // ////////////////////////////////////////////////////////////////////////////// void CGShopRequestSellHandler::executeMotorcycle(CGShopRequestSell* pPacket, Player* pPlayer) { @@ -334,7 +334,7 @@ void CGShopRequestSellHandler::executeMotorcycle(CGShopRequestSell* pPacket, Pla #ifdef __GAME_SERVER__ - // Ŷ ̾Ƴ. + // 패킷 정보를 뽑아낸다. ObjectID_t NPCID = pPacket->getObjectID(); ObjectID_t ITEMOID = pPacket->getItemObjectID(); GamePlayer* pGamePlayer = dynamic_cast(pPlayer); @@ -357,7 +357,7 @@ void CGShopRequestSellHandler::executeMotorcycle(CGShopRequestSell* pPacket, Pla } */ - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 pNPCBase = pZone->getCreature(NPCID); if (pNPCBase == NULL || !pNPCBase->isNPC()) @@ -367,18 +367,18 @@ void CGShopRequestSellHandler::executeMotorcycle(CGShopRequestSell* pPacket, Pla int CenterX = pNPC->getX(); int CenterY = pNPC->getY(); - // ÷̾ ȷ ϴ ִ ˻ + // 플레이어가 팔려고 하는 아이템을 가지고 있는지 검사 Inventory* pInventory = pPC->getInventory(); Gold_t playerMoney = pPC->getGold(); Item* pItem = pInventory->getItemWithObjectID(ITEMOID); if (pItem == NULL) return sendFailPacket(pPacket, pPlayer); - // ˻ؼ, Ŭ ִ ȮѴ. + // 주위 일정 범위를 검색해서, 모터 사이클이 있는지 확인한다. try { for (int zx = CenterX - 5; zx <= CenterX + 5; zx++) { for (int zy = CenterY - 5; zy <= CenterY + 5; zy++) { - // ٿ带 Ѿ ʴ° üũ + // 바운드를 넘어가지 않는가를 체크 if (!isValidZoneCoord(pZone, zx, zy)) continue; @@ -388,30 +388,30 @@ void CGShopRequestSellHandler::executeMotorcycle(CGShopRequestSell* pPacket, Pla if (pItemOnTile == NULL) continue; - // Ÿ , Ŭ ȮѴ. + // 만일 아이템이 타일 위에 있을 경우, 모터 사이클인지 확인한다. if (pItemOnTile->getItemClass() == Item::ITEM_CLASS_MOTORCYCLE) { DWORD targetID = dynamic_cast(pItem)->getTarget(); ItemID_t motorcycleID = pItemOnTile->getItemID(); if (targetID == motorcycleID) { - // ͻŬ DB Ѵ. + // 모터사이클을 DB에서 삭제한다. pItemOnTile->destroy(); - // ÷̾ κ丮 踦 Ѵ. + // 플레이어의 인벤토리에서 열쇠를 제거한다. pInventory->deleteItem(ITEMOID); pItem->destroy(); SAFE_DELETE(pItem); - // ƴ϶, Ѵ. + // 열쇠 값이 아니라, 오토바이 값을 줘야 한다. Price_t itemPrice = g_pPriceManager->getPrice(pItemOnTile, pNPC->getMarketCondBuy(), SHOP_RACK_NORMAL, pPC); - // ÷̾ ø. + // 플레이어의 돈을 늘린다. // pPC->setGoldEx(playerMoney+itemPrice); // by sigi. 2002.9.4 pPC->increaseGoldEx(itemPrice); - // ÷̾ GCShopSellOK.... + // 물건을 판 플레이어에게 GCShopSellOK를...보낸다. GCShopSellOK okpkt; okpkt.setObjectID(NPCID); if (!pItemOnTile->getOptionTypeList().empty()) @@ -422,19 +422,19 @@ void CGShopRequestSellHandler::executeMotorcycle(CGShopRequestSell* pPacket, Pla okpkt.setPrice(playerMoney + itemPrice); pPlayer->sendPacket(&okpkt); - // ŷ Ϳ ڽ ش. + // 뻑킹 센터에서 박스를 삭제해 준다. if (g_pParkingCenter->hasMotorcycleBox(motorcycleID)) g_pParkingCenter->deleteMotorcycleBox(motorcycleID); - // NPC ڸ ϴٸ ÷̾ Ѵ. - // ۸ Ѵ. 븻 ׳ . + // NPC에게 자리가 충분하다면 플레이어가 판 아이템을 보관한다. + // 단 스페셜 아이템만을 보관한다. 노말 아이템은 그냥 버림. // if (pItemOnTile->getOptionType() != 0) //{ // index = pNPC->getFirstEmptySlot(SHOP_RACK_SPECIAL); // if (index < SHOP_RACK_INDEX_MAX) // { // pNPC->insertShopItem(SHOP_RACK_SPECIAL, index, pItemOnTile); - // // NPC 忡 ߰Ƿ, ö󰣴. + // // 스페셜 아이템을 NPC가 진열장에 추가했으므로, 상점 버전이 올라간다. // pNPC->increaseShopVersion(SHOP_RACK_SPECIAL); // } //} @@ -443,7 +443,7 @@ void CGShopRequestSellHandler::executeMotorcycle(CGShopRequestSell* pPacket, Pla // SAFE_DELETE(pItemOnTile); //} - // Ŭ ãǷ, . + // 모터 사이클을 찾았으므로, 할 일이 끝났다. return; } } @@ -454,8 +454,8 @@ void CGShopRequestSellHandler::executeMotorcycle(CGShopRequestSell* pPacket, Pla filelog("shopbug_packet.log", "%s", t.toString().c_str()); } - // FOR , ̱ Դٴ ó ̰ ٴ ̴... - // ׷Ƿ Ŭ ȱⰡ ߴٴ ˸. + // FOR 루프를 다 돌고, 이까지 왔다는 것은 근처에 오토바이가 없다는 말이당... + // 그러므로 모터 사이클 팔기가 실패했다는 것을 알린다. GCShopSellFail failpkt; failpkt.setObjectID(NPCID); pPlayer->sendPacket(&failpkt); @@ -467,7 +467,7 @@ void CGShopRequestSellHandler::executeMotorcycle(CGShopRequestSell* pPacket, Pla ////////////////////////////////////////////////////////////////////////////// // -// ذ Ѳ ȱ⸦ Ѵ. +// 해골 한꺼번에 팔기를 실행한다. // ////////////////////////////////////////////////////////////////////////////// void CGShopRequestSellHandler::executeOpAllSkull(CGShopRequestSell* pPacket, Player* pPlayer) { @@ -496,7 +496,7 @@ void CGShopRequestSellHandler::executeOpAllSkull(CGShopRequestSell* pPacket, Pla } */ - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 pNPCBase = pZone->getCreature(NPCID); if (pNPCBase == NULL || !pNPCBase->isNPC()) @@ -513,9 +513,9 @@ void CGShopRequestSellHandler::executeOpAllSkull(CGShopRequestSell* pPacket, Pla for (uint x = 0; x < pInventory->getWidth(); x++) { pItem = pInventory->getItem(x, y); - // ϰ, ذ̶... + // 아이템이 존재하고, 해골이라면... if (pItem != NULL && pItem->getItemClass() == Item::ITEM_CLASS_SKULL) { - // ؼ ÷̾ Ѵ. + // 아이템 가격을 계산해서 플레이어의 돈에다 더한다. // itemPrice = g_pPriceManager->getPrice(pItem, pNPC->getMarketCondBuy(), SHOP_RACK_NORMAL, pPC) * // pItem->getNum(); playerMoney += itemPrice; @@ -523,7 +523,7 @@ void CGShopRequestSellHandler::executeOpAllSkull(CGShopRequestSell* pPacket, Pla itemPrice += g_pPriceManager->getPrice(pItem, pNPC->getMarketCondBuy(), SHOP_RACK_NORMAL, pPC) * pItem->getNum(); - // κ丮 DB Ѵ. + // 인벤토리 및 DB에서 아이템을 삭제한다. pInventory->deleteItem(x, y); pItem->destroy(); SAFE_DELETE(pItem); @@ -533,12 +533,12 @@ void CGShopRequestSellHandler::executeOpAllSkull(CGShopRequestSell* pPacket, Pla itemPrice = itemPrice * (g_pVariableManager->getHeadPriceBonus() / 100); - // ÷̾ ǰ Ѵ. + // 플레이어에게 물건값을 지불한다. // pPC->setGoldEx(playerMoney); // by sigi. 2002.9.4 pPC->increaseGoldEx(itemPrice); - // ÷̾ GCShopSellOK.... + // 물건을 산 플레이어에게 GCShopSellOK를...보낸다. GCShopSellOK okpkt; okpkt.setObjectID(NPCID); okpkt.setShopVersion(pNPC->getShopVersion(SHOP_RACK_NORMAL)); @@ -908,7 +908,7 @@ void CGShopRequestSellHandler::executeOpSwapAdvancementItem(CGShopRequestSell* p if (!pItem->destroy()) { filelog("shopDBBug.txt", "NoSuchItemInDB-destroy: %s", pItem->toString().c_str()); - throw DisconnectException(" µ DB ."); + throw DisconnectException("아이템 지울려는데 DB에 없다."); } pZone->registerObject(pNewItem); @@ -920,7 +920,7 @@ void CGShopRequestSellHandler::executeOpSwapAdvancementItem(CGShopRequestSell* p okpkt.setPrice(0); pGamePlayer->sendPacket(&okpkt); - // ItemTrace Log ܾ Ѵٸ + // ItemTrace Log 를 남겨야 한다면 남긴다 if (pItem != NULL && pItem->isTraceItem()) { remainTraceLog(pItem, pCreature->getName(), pNPC->getName(), ITEM_LOG_DELETE, DETAIL_SHOPSELL); } @@ -947,7 +947,7 @@ void CGShopRequestSellHandler::executeOpSwapAdvancementItem(CGShopRequestSell* p } ////////////////////////////////////////////////////////////////////////////// // -// ȱⰡ ߴٴ ش. +// 물건 팔기가 실패했다는 정보를 날려준댜. // ////////////////////////////////////////////////////////////////////////////// void CGShopRequestSellHandler::sendFailPacket(CGShopRequestSell* pPacket, Player* pPlayer) { diff --git a/src/Core/CGSilverCoating.cpp b/src/Core/CGSilverCoating.cpp index c8bcba21..8f36d185 100644 --- a/src/Core/CGSilverCoating.cpp +++ b/src/Core/CGSilverCoating.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGSilverCoating.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGSilverCoating.h b/src/Core/CGSilverCoating.h index 4f6255cc..45a241f4 100644 --- a/src/Core/CGSilverCoating.h +++ b/src/Core/CGSilverCoating.h @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGSilverCoating.h -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGSilverCoatingHandler.cpp b/src/Core/CGSilverCoatingHandler.cpp index 22b20463..d65dc4ee 100644 --- a/src/Core/CGSilverCoatingHandler.cpp +++ b/src/Core/CGSilverCoatingHandler.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGSilverCoatingHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -47,13 +47,13 @@ void CGSilverCoatingHandler::execute(CGSilverCoating* pPacket, Player* pPlayer) int Y = 0; GCNPCResponse response; - // ÷̾ ̾ ̾ . + // 플레이어가 슬레이어인지 뱀파이어인지 구분. if (pPC->isSlayer()) bSlayer = true; else if (pPC->isVampire()) bSlayer = false; - // ÷̾ Ϸ ϴ ִ ˻ + // 플레이어가 코팅하려고 하는 아이템을 가지고 있는지 검사 if (bSlayer) { pSlayer = dynamic_cast(pPC); playerMoney = pSlayer->getGold(); @@ -64,14 +64,14 @@ void CGSilverCoatingHandler::execute(CGSilverCoating* pPacket, Player* pPlayer) pItem = pVampire->findItemOID(ITEMOID, storage, X, Y); } - // ٸ 翬 . + // 아이템이 없다면 당연히 코팅할 수 없다. if (pItem == NULL) { response.setCode(NPC_RESPONSE_SILVER_COATING_FAIL_ITEM_NOT_EXIST); pPlayer->sendPacket(&response); return; } - // Ϸ õ ̶... + // 코팅하려는 아이템이 코팅될 수 없는 아이템이라면... switch (pItem->getItemClass()) { case Item::ITEM_CLASS_BLADE: case Item::ITEM_CLASS_SWORD: @@ -91,11 +91,11 @@ void CGSilverCoatingHandler::execute(CGSilverCoating* pPacket, Player* pPlayer) return; } - // ִ ݷ ͼ... Ѵ. + // 최대 은 도금량을 얻어와서... 도금한다. ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo(pItem->getItemClass(), pItem->getItemType()); pItem->setSilver(pItemInfo->getMaxSilver()); - // δ. + // 돈을 줄인다. if (bSlayer) { // pSlayer->setGoldEx(playerMoney - coatingPrice); @@ -110,16 +110,16 @@ void CGSilverCoatingHandler::execute(CGSilverCoating* pPacket, Player* pPlayer) // log(LOG_REPAIR_ITEM, pVampire->getName(), "", pItem->toString()); } - // silver ϸ ȴ. - // ȭ. by sigi. 2002.5.13 + // silver만 저장하면 된다. + // 아이템 저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Silver=%d", pItem->getSilver()); pItem->tinysave(pField); - // ߴٴ DBٰ ش. - // и STORAGE_STASH ƿ , - // Կ ִ Ѵٴ ǹǷ, - // ʴ´. + // 아이템을 은으로 코팅했다는 정보를 DB에다가 저장해준다. + // 단 분명히 STORAGE_STASH가 돌아올 수 있지만, + // 보관함에 있는 것을 수리한다는 것은 말이 안 되므로, + // 저장하지 않는다. /* switch (storage) { @@ -135,7 +135,7 @@ void CGSilverCoatingHandler::execute(CGSilverCoating* pPacket, Player* pPlayer) } */ - // OK Ŷ ش. + // OK 패킷을 날려준다. response.setCode(NPC_RESPONSE_SILVER_COATING_OK); response.setParameter(playerMoney - coatingPrice); pPlayer->sendPacket(&response); diff --git a/src/Core/CGSkillToInventory.h b/src/Core/CGSkillToInventory.h index 21b18716..a970aae3 100644 --- a/src/Core/CGSkillToInventory.h +++ b/src/Core/CGSkillToInventory.h @@ -85,7 +85,7 @@ class CGSkillToInventory : public Packet { private: SkillType_t m_SkillType; // SkillType ObjectID_t m_ObjectID; // ObjectID - // κ丮 Ʈ ̵. 0̸ κ丮 + // 보조 인벤토리 아이템의 오브젝트 아이디. 0이면 메인 인벤토리에서 사용 ObjectID_t m_InventoryItemObjectID; CoordInven_t m_X; // Coord X CoordInven_t m_Y; // Coord Y diff --git a/src/Core/CGSkillToInventoryHandler.cpp b/src/Core/CGSkillToInventoryHandler.cpp index ab53a78e..404dbc5f 100644 --- a/src/Core/CGSkillToInventoryHandler.cpp +++ b/src/Core/CGSkillToInventoryHandler.cpp @@ -36,7 +36,7 @@ void CGSkillToInventoryHandler::execute(CGSkillToInventory* pPacket, Player* pPl SkillType_t SkillType = pPacket->getSkillType(); - // Ұ. by sigi. 2002.11.14 + // 완전 안전지대라면 기술 사용 불가. by sigi. 2002.11.14 ZoneLevel_t ZoneLevel = pZone->getZoneLevel(pCreature->getX(), pCreature->getY()); if (ZoneLevel & COMPLETE_SAFE_ZONE) { GCSkillFailed1 _GCSkillFailed1; diff --git a/src/Core/CGSkillToNamed.h b/src/Core/CGSkillToNamed.h index fc882fae..ea8c6913 100644 --- a/src/Core/CGSkillToNamed.h +++ b/src/Core/CGSkillToNamed.h @@ -31,10 +31,10 @@ class CGSkillToNamed : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGSkillToNamedHandler.cpp b/src/Core/CGSkillToNamedHandler.cpp index 2b6e101a..e78a533c 100644 --- a/src/Core/CGSkillToNamedHandler.cpp +++ b/src/Core/CGSkillToNamedHandler.cpp @@ -41,7 +41,7 @@ void CGSkillToNamedHandler::execute(CGSkillToNamed* pPacket, Player* pPlayer) SkillType_t SkillType = pPacket->getSkillType(); - // Ұ. by sigi. 2002.11.14 + // 완전 안전지대라면 기술 사용 불가. by sigi. 2002.11.14 ZoneLevel_t ZoneLevel = pZone->getZoneLevel(pCreature->getX(), pCreature->getY()); if ((ZoneLevel & COMPLETE_SAFE_ZONE) || (pCreature->isFlag(Effect::EFFECT_CLASS_PARALYZE)) || (pCreature->isFlag(Effect::EFFECT_CLASS_CAUSE_CRITICAL_WOUNDS)) || diff --git a/src/Core/CGSkillToObject.h b/src/Core/CGSkillToObject.h index 885ed6d9..c6c1b541 100644 --- a/src/Core/CGSkillToObject.h +++ b/src/Core/CGSkillToObject.h @@ -31,10 +31,10 @@ class CGSkillToObject : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGSkillToObjectHandler.cpp b/src/Core/CGSkillToObjectHandler.cpp index c9d04c01..456a8f63 100644 --- a/src/Core/CGSkillToObjectHandler.cpp +++ b/src/Core/CGSkillToObjectHandler.cpp @@ -49,7 +49,7 @@ void CGSkillToObjectHandler::execute(CGSkillToObject* pPacket, Player* pPlayer) SkillType_t SkillType = pPacket->getSkillType(); - // Ұ. by sigi. 2002.11.14 + // 완전 안전지대라면 기술 사용 불가. by sigi. 2002.11.14 ZoneLevel_t ZoneLevel = pZone->getZoneLevel(pCreature->getX(), pCreature->getY()); if ((ZoneLevel & COMPLETE_SAFE_ZONE) || (pCreature->isFlag(Effect::EFFECT_CLASS_PARALYZE)) || (pCreature->isFlag(Effect::EFFECT_CLASS_CAUSE_CRITICAL_WOUNDS)) || @@ -117,7 +117,7 @@ void CGSkillToObjectHandler::execute(CGSkillToObject* pPacket, Player* pPlayer) g_Sniping.checkRevealRatio(pSlayer, 20, 10); } */ - // ࿡ ̶ ʴ´. + // 만약에 같은 종족의 성물보관함이라면 기술이 사용되지 않는다. /* if (pTargetCreature->isMonster() ) { Monster* pMonster = dynamic_cast(pTargetCreature); @@ -148,7 +148,7 @@ void CGSkillToObjectHandler::execute(CGSkillToObject* pPacket, Player* pPlayer) VampireSkillSlot* pVampireSkillSlot = pVampire->hasSkill(SkillType); bool bSuccess = true; - // BITE OF DEATH üũ isAbleToUseObjectSkill ȿ Ѵ. + // BITE OF DEATH 워울프 체크는 isAbleToUseObjectSkill 안에서 한다. if (pVampireSkillSlot == NULL && SkillType != SKILL_BITE_OF_DEATH) bSuccess = false; if (!isAbleToUseObjectSkill(pVampire)) @@ -159,16 +159,16 @@ void CGSkillToObjectHandler::execute(CGSkillToObject* pPacket, Player* pPlayer) addVisibleCreature(pZone, pVampire, true); } */ - // EXTREME ¶ ־ Ѵ. - // EXTREME ٸ ؼ Ѵ. - // EXTREME ʹ ũ ̰. - // EXTREME ¿ ٸ Ҷ Effect ̴. + // 만약 EXTREME 기술을 사용한 상태라면 기술을 해제해 주어야 한다. + // EXTREME 기술은 다른 기술과 병행해서 사용하지 못한다. + // 이유는 EXTREME기술의 데미지 상승이 너무 크기 때문이고. + // EXTREME기술을 사용한 상태에서 다른 기술을 사용할때 Effect가 없기 때문이다. // 2002.4.1 - // EXTREME ¿ MELEE Attack ؼ 밡ϵ ߴ. - // Ǽ ݸδ ʹ ϴٴ ǰ߶ - // EXTREME ¿ ִ MELEE Skill - // ACID TOUCH, POISONOUS HAND, BLOODY NAIL ִ. + // EXTREME 기술을 사용한 상태에서 MELEE Attack에 대해서는 사용가능하도록 수정했다. + // 맨손 공격만으로는 너무 부족하다는 의견때문 + // EXTREME 기술을 사용한 상태에서 사용할 수 있는 MELEE Skill은 + // ACID TOUCH, POISONOUS HAND, BLOODY NAIL이 있다. // /* if (pVampire->isFlag(Effect::EFFECT_CLASS_EXTREME)) @@ -186,7 +186,7 @@ void CGSkillToObjectHandler::execute(CGSkillToObject* pPacket, Player* pPlayer) } */ /* - // ࿡ ̶ ʴ´. + // 만약에 같은 종족의 성물보관함이라면 기술이 사용되지 않는다. if (pTargetCreature->isMonster() ) { Monster* pMonster = dynamic_cast(pTargetCreature); diff --git a/src/Core/CGSkillToSelfHandler.cpp b/src/Core/CGSkillToSelfHandler.cpp index 08774a3d..02dd2606 100644 --- a/src/Core/CGSkillToSelfHandler.cpp +++ b/src/Core/CGSkillToSelfHandler.cpp @@ -48,7 +48,7 @@ void CGSkillToSelfHandler::execute(CGSkillToSelf* pPacket, Player* pPlayer) SkillType_t SkillType = pPacket->getSkillType(); - // Ұ. by sigi. 2002.11.14 + // 완전 안전지대라면 기술 사용 불가. by sigi. 2002.11.14 ZoneLevel_t ZoneLevel = pZone->getZoneLevel(pCreature->getX(), pCreature->getY()); if ((ZoneLevel & COMPLETE_SAFE_ZONE) || (pCreature->isFlag(Effect::EFFECT_CLASS_PARALYZE)) || (pCreature->isFlag(Effect::EFFECT_CLASS_CAUSE_CRITICAL_WOUNDS)) || @@ -93,7 +93,7 @@ void CGSkillToSelfHandler::execute(CGSkillToSelf* pPacket, Player* pPlayer) g_Sniping.checkRevealRatio(pSlayer, 20, 10); } */ - // UN_TRANSFORM -_- ȥ ڵ鷯 ~_~ + // UN_TRANSFORM 인 경우 -_- 혼자 딴 핸들러 가지고 논다 ~_~ if (SkillType == SKILL_UN_TRANSFORM) { if (pSlayer->isFlag(Effect::EFFECT_CLASS_INSTALL_TURRET)) { SkillHandler* pSkillHandler = g_pSkillHandlerManager->getSkillHandler(SKILL_UN_TRANSFORM); @@ -127,7 +127,7 @@ void CGSkillToSelfHandler::execute(CGSkillToSelf* pPacket, Player* pPlayer) if ((SkillType == SKILL_TRANSFORM_TO_BAT || SkillType == SKILL_TRANSFORM_TO_WOLF) && (pVampire->hasRelicItem() || pVampire->isFlag(Effect::EFFECT_CLASS_HAS_FLAG) || pVampire->isFlag(Effect::EFFECT_CLASS_HAS_SWEEPER))) { - // cout << " ¿ ϴ" << endl; + // cout << "성물을 가진 상태에서는 변신할 수 없습니다" << endl; GCSkillFailed1 _GCSkillFailed1; _GCSkillFailed1.setSkillType(SkillType); @@ -207,7 +207,7 @@ void CGSkillToSelfHandler::execute(CGSkillToSelf* pPacket, Player* pPlayer) OustersSkillSlot* pOustersSkillSlot = ((Ousters*)pCreature)->hasSkill(SkillType); bool bSuccess = true; - // UN_TRANSFORM -_- ȥ ڵ鷯 ~_~ + // UN_TRANSFORM 인 경우 -_- 혼자 딴 핸들러 가지고 논다 ~_~ if (SkillType == SKILL_UN_TRANSFORM) { if (pOusters->isFlag(Effect::EFFECT_CLASS_SUMMON_SYLPH)) { SkillHandler* pSkillHandler = g_pSkillHandlerManager->getSkillHandler(SKILL_UN_TRANSFORM); diff --git a/src/Core/CGSkillToTile.h b/src/Core/CGSkillToTile.h index fadf0c3a..3b1848ad 100644 --- a/src/Core/CGSkillToTile.h +++ b/src/Core/CGSkillToTile.h @@ -31,10 +31,10 @@ class CGSkillToTile : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGSkillToTileHandler.cpp b/src/Core/CGSkillToTileHandler.cpp index c710521d..31eaf1e7 100644 --- a/src/Core/CGSkillToTileHandler.cpp +++ b/src/Core/CGSkillToTileHandler.cpp @@ -35,7 +35,7 @@ void CGSkillToTileHandler::execute(CGSkillToTile* pPacket, Player* pPlayer) Assert(pPlayer != NULL); try { - // Ư ׽Ʈ ؼ ӽ÷ ־δ ڵ̴. + // 특수기술 테스트를 위해서 임시로 넣어두는 코드이다. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Assert(pGamePlayer != NULL); // by sigi @@ -49,7 +49,7 @@ void CGSkillToTileHandler::execute(CGSkillToTile* pPacket, Player* pPlayer) SkillType_t SkillType = pPacket->getSkillType(); - // Ұ. by sigi. 2002.11.14 + // 완전 안전지대라면 기술 사용 불가. by sigi. 2002.11.14 ZoneLevel_t ZoneLevel = pZone->getZoneLevel(pCreature->getX(), pCreature->getY()); if ((ZoneLevel & COMPLETE_SAFE_ZONE) || (pCreature->isFlag(Effect::EFFECT_CLASS_PARALYZE)) || (pCreature->isFlag(Effect::EFFECT_CLASS_CAUSE_CRITICAL_WOUNDS)) || diff --git a/src/Core/CGStashDeposit.cpp b/src/Core/CGStashDeposit.cpp index 959c2ba0..94de9ae8 100644 --- a/src/Core/CGStashDeposit.cpp +++ b/src/Core/CGStashDeposit.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGStashDeposit.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGStashDeposit.h b/src/Core/CGStashDeposit.h index 2f227777..f02c6ec8 100644 --- a/src/Core/CGStashDeposit.h +++ b/src/Core/CGStashDeposit.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CGStashDeposit.h -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGStashDepositHandler.cpp b/src/Core/CGStashDepositHandler.cpp index dd010d69..05bbb2be 100644 --- a/src/Core/CGStashDepositHandler.cpp +++ b/src/Core/CGStashDepositHandler.cpp @@ -35,9 +35,9 @@ void CGStashDepositHandler::execute(CGStashDeposit* pPacket, Player* pPlayer) { Gold_t amount = pPacket->getAmount(); if (!pPC->checkGoldIntegrity() || !pPC->checkStashGoldIntegrity()) { - filelog("GoldBug.log", "CGStashDeposit : DB ´´! [%s:%s]", pGamePlayer->getID().c_str(), + filelog("GoldBug.log", "CGStashDeposit : 돈이 DB랑 안 맞는다! [%s:%s]", pGamePlayer->getID().c_str(), pPC->getName().c_str()); - throw DisconnectException("CGStashDeposit : DB ´´!"); + throw DisconnectException("CGStashDeposit : 돈이 DB랑 안 맞는다!"); } @@ -50,8 +50,8 @@ void CGStashDepositHandler::execute(CGStashDeposit* pPacket, Player* pPlayer) { if (pSlayer->getGold() < amount) return; - // Կ  ִ Ѵٸ - // Ϻθ ְ, ÷̾ ܳƾ Ѵ. + // 보관함에 들어갈 수 있는 돈보다 많은 양의 돈을 넣으려 한다면 + // 일부만 넣고, 나머지는 걍 플레이어에게 남겨놓아야 한다. if (pSlayer->getStashGold() + amount > MAX_MONEY) { Gold_t margin = MAX_MONEY - pSlayer->getStashGold(); // pSlayer->setGoldEx(pSlayer->getGold() - margin); diff --git a/src/Core/CGStashList.cpp b/src/Core/CGStashList.cpp index ae58f7d1..8643204c 100644 --- a/src/Core/CGStashList.cpp +++ b/src/Core/CGStashList.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGStashList.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGStashList.h b/src/Core/CGStashList.h index 63ce3b8b..a0e2672c 100644 --- a/src/Core/CGStashList.h +++ b/src/Core/CGStashList.h @@ -1,9 +1,9 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CGStashList.h -// Written By : 輺 +// Written By : 김성민 // Description : -// Ŭ̾Ʈ ȿ ִ Ʈ 䱸 ̴ -// Ŷ̴. +// 클라이언트가 보관함 안에 들어있는 아이템의 리스트를 요구할 때 쓰이는 +// 패킷이다. //////////////////////////////////////////////////////////////////////////////// #ifndef __CG_STASH_LIST_H__ @@ -46,7 +46,7 @@ class CGStashList : public Packet { } private: - ObjectID_t m_ObjectID; // ÷̾ ũ object id + ObjectID_t m_ObjectID; // 플레이어 크리쳐의 object id }; diff --git a/src/Core/CGStashListHandler.cpp b/src/Core/CGStashListHandler.cpp index 793658a9..61ba7aca 100644 --- a/src/Core/CGStashListHandler.cpp +++ b/src/Core/CGStashListHandler.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGStashListHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -29,7 +29,7 @@ void CGStashListHandler::execute(CGStashList* pPacket, Player* pPlayer) GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pPC = pGamePlayer->getCreature(); - // Ŷ object id PC object id ٸ . + // 패킷에서의 object id와 PC의 object id가 다르면 안 되지. if (PlayerOID != pPC->getObjectID()) return; diff --git a/src/Core/CGStashRequestBuy.cpp b/src/Core/CGStashRequestBuy.cpp index beae93c1..fffb52f1 100644 --- a/src/Core/CGStashRequestBuy.cpp +++ b/src/Core/CGStashRequestBuy.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGStashRequestBuy.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGStashRequestBuy.h b/src/Core/CGStashRequestBuy.h index 2b82b7dd..6ab44614 100644 --- a/src/Core/CGStashRequestBuy.h +++ b/src/Core/CGStashRequestBuy.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////////////////////////// // // Filename : CGStashRequestBuy.h -// Written By : 輺 +// Written By : 김성민 // Description : // //////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGStashRequestBuyHandler.cpp b/src/Core/CGStashRequestBuyHandler.cpp index 57bd7580..b91c4704 100644 --- a/src/Core/CGStashRequestBuyHandler.cpp +++ b/src/Core/CGStashRequestBuyHandler.cpp @@ -34,7 +34,7 @@ void CGStashRequestBuyHandler::execute(CGStashRequestBuy* pPacket, Player* pPlay BYTE curStashNum = pPlayerCreature->getStashNum(); - // ִ ƽ + // 가지고 있는 보관함이 맥스라면 리턴 if (curStashNum >= STASH_RACK_MAX) { GCNPCResponse failpkt; failpkt.setCode(NPC_RESPONSE_STASH_SELL_FAIL_MAX); @@ -44,7 +44,7 @@ void CGStashRequestBuyHandler::execute(CGStashRequestBuy* pPacket, Player* pPlay Price_t price = g_pPriceManager->getStashPrice(curStashNum + 1); - // ڶ . + // 돈이 모자라도 실패쥐. if (pPlayerCreature->getGold() < price) { GCNPCResponse failpkt; failpkt.setCode(NPC_RESPONSE_STASH_SELL_FAIL_MONEY); @@ -52,16 +52,16 @@ void CGStashRequestBuyHandler::execute(CGStashRequestBuy* pPacket, Player* pPlay return; } - // ĭ ÷ְ... + // 보관함 갯수를 한 칸 늘려주고... pPlayerCreature->setStashNumEx(curStashNum + 1); - // δ. + // 돈을 줄인다. // pPlayerCreature->setGoldEx(pPlayerCreature->getGold() - price); // by sigi. 2002.9.4 pPlayerCreature->decreaseGoldEx(price); - // OK Ŷ ش. + // 마지막으로 OK 패킷을 날려준다. GCNPCResponse okpkt; okpkt.setCode(NPC_RESPONSE_STASH_SELL_OK); pPlayer->sendPacket(&okpkt); diff --git a/src/Core/CGStashToMouse.h b/src/Core/CGStashToMouse.h index 1e415141..76765b11 100644 --- a/src/Core/CGStashToMouse.h +++ b/src/Core/CGStashToMouse.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////////////////////////// // // Filename : CGStashToMouse.h -// Written By : 輺 +// Written By : 김성민 // Description : // //////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGStashToMouseHandler.cpp b/src/Core/CGStashToMouseHandler.cpp index 9f8b3804..07537a48 100644 --- a/src/Core/CGStashToMouseHandler.cpp +++ b/src/Core/CGStashToMouseHandler.cpp @@ -38,8 +38,8 @@ void CGStashToMouseHandler::execute(CGStashToMouse* pPacket, Player* pPlayer) BYTE rack = pPacket->getRack(); BYTE index = pPacket->getIndex(); - // ƽ ʰϴ - // ڱⰡ ִ ִ ʰص . + // 맥스 범위를 초과하는 것 말고도 + // 자기가 가지고 있는 최대한의 랙을 초과해도 에러당. if (rack >= STASH_RACK_MAX || index >= STASH_INDEX_MAX || rack >= pPC->getStashNum()) { GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); @@ -51,12 +51,12 @@ void CGStashToMouseHandler::execute(CGStashToMouse* pPacket, Player* pPlayer) Item* pStashItem = pStash->get(rack, index); Item* pMouseItem = pPC->getExtraInventorySlotItem(); - // Կ ų, 콺 ޷ִ - // 콺 ޾ ƴѰ? + // 보관함에 아이템이 없거나, 마우스에 아이템이 달려있는 경우 + // 아이템을 마우스에 또 달아줄 수는 없는 것 아닌가? if (pStashItem == NULL || pMouseItem != NULL) { - // throw ProtocolException("CGStashToMouseHandler::executeSlayer() : ų, 콺 - // ޷ֽϴ."); - // ų...콺 ޷־ 쿡 . + // throw ProtocolException("CGStashToMouseHandler::executeSlayer() : 아이템이 없거나, 마우스에 아이템이 + // 달려있습니다."); + // 아이템이 없었거나...마우스에 아이템이 달려있었을 경우에는 더할 수 없다. GCCannotAdd _GCCannotAdd; _GCCannotAdd.setObjectID(pPacket->getObjectID()); pPlayer->sendPacket(&_GCCannotAdd); @@ -72,12 +72,12 @@ void CGStashToMouseHandler::execute(CGStashToMouse* pPacket, Player* pPlayer) return; } - // Կ ϰ, 콺 ޾ DB . + // 보관함에서 아이템을 제거하고, 마우스에다 달아준 후 DB에다 저장. pStash->remove(rack, index); pPC->addItemToExtraInventorySlot(pStashItem); // pStashItem->whenPCTake(pPC); // pStashItem->save(pPC->getName(), STORAGE_EXTRASLOT, 0, 0, 0); - // ȭ. by sigi. 2002.5.13 + // 아이템 저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d", STORAGE_EXTRASLOT); pStashItem->tinysave(pField); diff --git a/src/Core/CGStashWithdraw.cpp b/src/Core/CGStashWithdraw.cpp index 07f62b85..4e8c4bb1 100644 --- a/src/Core/CGStashWithdraw.cpp +++ b/src/Core/CGStashWithdraw.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGStashWithdraw.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGStashWithdraw.h b/src/Core/CGStashWithdraw.h index ad87b2cc..aee11917 100644 --- a/src/Core/CGStashWithdraw.h +++ b/src/Core/CGStashWithdraw.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CGStashWithdraw.h -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGStashWithdrawHandler.cpp b/src/Core/CGStashWithdrawHandler.cpp index 3ef4d32b..08a3e020 100644 --- a/src/Core/CGStashWithdrawHandler.cpp +++ b/src/Core/CGStashWithdrawHandler.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGStashWithdrawHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -36,9 +36,9 @@ void CGStashWithdrawHandler::execute(CGStashWithdraw* pPacket, Player* pPlayer) Gold_t amount = pPacket->getAmount(); if (!pPC->checkGoldIntegrity() || !pPC->checkStashGoldIntegrity()) { - filelog("GoldBug.log", "CGStashWithdraw : DB ´´! [%s:%s]", pGamePlayer->getID().c_str(), + filelog("GoldBug.log", "CGStashWithdraw : 돈이 DB랑 안 맞는다! [%s:%s]", pGamePlayer->getID().c_str(), pPC->getName().c_str()); - throw DisconnectException("CGStashWithdraw : DB ´´!"); + throw DisconnectException("CGStashWithdraw : 돈이 DB랑 안 맞는다!"); } if (amount == 0) diff --git a/src/Core/CGStoreClose.h b/src/Core/CGStoreClose.h index ae3779ca..b6b3db6e 100644 --- a/src/Core/CGStoreClose.h +++ b/src/Core/CGStoreClose.h @@ -25,10 +25,10 @@ class CGStoreClose : public Packet { public: CGStoreClose() {}; virtual ~CGStoreClose() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGStoreCloseHandler.cpp b/src/Core/CGStoreCloseHandler.cpp index b42bf047..b2e15acb 100644 --- a/src/Core/CGStoreCloseHandler.cpp +++ b/src/Core/CGStoreCloseHandler.cpp @@ -37,13 +37,13 @@ void CGStoreCloseHandler::execute(CGStoreClose* pPacket, Player* pPlayer) Assert(pStore != NULL); if (!pStore->isOpen()) { - filelog("Store.log", "[%s:%s] ̹ ֽϴ..", pGamePlayer->getID().c_str(), + filelog("Store.log", "[%s:%s] 이미 상점이 닫혀있습니다..", pGamePlayer->getID().c_str(), pPC->getName().c_str()); return; } pStore->close(); - cout << pPC->getName() << " ϴو." << endl; + cout << pPC->getName() << " 의 상점이 닫혔습니다닏." << endl; GCMyStoreInfo gcInfo; gcInfo.setStoreInfo(&(pStore->getStoreInfo())); diff --git a/src/Core/CGStoreOpen.h b/src/Core/CGStoreOpen.h index 1ae65d1a..5f892fcb 100644 --- a/src/Core/CGStoreOpen.h +++ b/src/Core/CGStoreOpen.h @@ -25,10 +25,10 @@ class CGStoreOpen : public Packet { public: CGStoreOpen() {}; virtual ~CGStoreOpen() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGStoreSignHandler.cpp b/src/Core/CGStoreSignHandler.cpp index d4d93f6c..61e3cfc1 100644 --- a/src/Core/CGStoreSignHandler.cpp +++ b/src/Core/CGStoreSignHandler.cpp @@ -41,7 +41,7 @@ void CGStoreSignHandler::execute(CGStoreSign* pPacket, Player* pPlayer) Assert(pStore != NULL); if (pPacket->getSign().size() > MAX_SIGN_SIZE) { - filelog("Store.log", "[%s:%s] (%s) ̰ ʹ ϴ.", pGamePlayer->getID().c_str(), + filelog("Store.log", "[%s:%s] (%s) 간판 길이가 너무 깁니다.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), pPacket->getSign().c_str()); return; } diff --git a/src/Core/CGSubmitScore.h b/src/Core/CGSubmitScore.h index f332e32d..5ecc4aed 100644 --- a/src/Core/CGSubmitScore.h +++ b/src/Core/CGSubmitScore.h @@ -32,10 +32,10 @@ class CGSubmitScore : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGTameMonsterHandler.cpp b/src/Core/CGTameMonsterHandler.cpp index 4724fcdc..625256da 100644 --- a/src/Core/CGTameMonsterHandler.cpp +++ b/src/Core/CGTameMonsterHandler.cpp @@ -87,7 +87,7 @@ void CGTameMonsterHandler::execute(CGTameMonster* pPacket, Player* pPlayer) SAFE_DELETE(pItem); /* - * ⼭ Ȯ ؾ Ѵ. + * 여기서 뭔가 확인을 해야 한다. */ int ratio = rand() % 100; @@ -96,11 +96,11 @@ void CGTameMonsterHandler::execute(CGTameMonster* pPacket, Player* pPlayer) ratio = 100; } - // 길 ִ. + // 공용 펫만 꼬실 수 있다. PetTypeInfo* pPetTypeInfo = PetTypeInfoManager::getInstance()->getPetTypeInfo(petType); if (pPetTypeInfo == NULL || pPetTypeInfo->getOriginalMonsterType() != pMonster->getMonsterType() || ratio >= pPetFoodInfo->getTameRatio()) { - // cout << "ñ : " << ratio << endl; + // cout << "꼬시기 실패 : " << ratio << endl; SAFE_DELETE(pPetItem); pMonster->addEnemy(pPC); return; @@ -110,7 +110,7 @@ void CGTameMonsterHandler::execute(CGTameMonster* pPacket, Player* pPlayer) SAFE_DELETE(pMonster); /* - * ⼭ ش ; ȴ. + * 여기서 해당 펫의 정보를 가져와야 된다. */ PetInfo* pPetInfo = new PetInfo; @@ -127,7 +127,7 @@ void CGTameMonsterHandler::execute(CGTameMonster* pPacket, Player* pPlayer) pPetInfo->setPetHP(pPetFoodInfo->getPetHP()); pPetInfo->setFeedTime(VSDateTime::currentDateTime()); - // ũ + // 양방향 링크 pPetItem->setPetInfo(pPetInfo); pPetInfo->setPetItem(pPetItem); @@ -137,7 +137,7 @@ void CGTameMonsterHandler::execute(CGTameMonster* pPacket, Player* pPlayer) pPetItem->create(pPC->getName(), STORAGE_INVENTORY, 0, pt.x, pt.y); - // TraceLog . + // TraceLog 를 남긴다. remainTraceLog(pPetItem, "GOD", pPC->getName(), ITEM_LOG_CREATE, DETAIL_PICKUP); GCCreateItem gcCreateItem; diff --git a/src/Core/CGThrowBombHandler.cpp b/src/Core/CGThrowBombHandler.cpp index 16d8c1a8..43ddb331 100644 --- a/src/Core/CGThrowBombHandler.cpp +++ b/src/Core/CGThrowBombHandler.cpp @@ -26,11 +26,11 @@ #ifdef __GAME_SERVER__ -// Ÿ -// -// ũ +// 타입 +// 방향 +// 마스크 int BombMask[5][9][9] = { - // 0 Ÿ ź + // 0번 타입 폭탄 {{0, 0, 0, 0, 100, 0, 0, 0, 0}, {0, 0, 0, 0, 100, 0, 0, 0, 0}, {0, 0, 0, 0, 100, 0, 0, 0, 0}, @@ -40,7 +40,7 @@ int BombMask[5][9][9] = { {0, 0, 0, 0, 100, 0, 0, 0, 0}, {0, 0, 0, 0, 100, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}}, - // 1 Ÿ ź + // 1번 타입 폭탄 {{0, 0, 0, 0, 100, 0, 0, 0, 0}, {0, 0, 0, 0, 100, 0, 0, 0, 0}, {0, 0, 0, 0, 100, 0, 0, 0, 0}, @@ -50,7 +50,7 @@ int BombMask[5][9][9] = { {0, 0, 0, 0, 100, 0, 0, 0, 0}, {0, 0, 0, 0, 100, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}}, - // 2 Ÿ ź + // 2번 타입 폭탄 {{0, 0, 0, 0, 100, 0, 0, 0, 0}, {0, 0, 0, 0, 100, 0, 0, 0, 0}, {0, 0, 0, 0, 100, 0, 0, 0, 0}, @@ -60,7 +60,7 @@ int BombMask[5][9][9] = { {0, 0, 0, 0, 100, 0, 0, 0, 0}, {0, 0, 0, 0, 100, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}}, - // 3 Ÿ ź + // 3번 타입 폭탄 {{0, 50, 0, 0, 100, 0, 0, 50, 0}, {50, 0, 0, 0, 100, 0, 0, 0, 50}, {0, 0, 0, 50, 100, 50, 0, 0, 0}, @@ -70,7 +70,7 @@ int BombMask[5][9][9] = { {0, 0, 0, 50, 100, 50, 0, 0, 0}, {0, 0, 50, 0, 100, 0, 50, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0}}, - // 4 Ÿ ź + // 4번 타입 폭탄 {{0, 50, 0, 50, 100, 50, 0, 50, 0}, {50, 0, 50, 0, 100, 0, 50, 0, 50}, {0, 50, 0, 50, 100, 50, 0, 50, 0}, @@ -95,7 +95,7 @@ void CGThrowBombHandler::execute(CGThrowBomb* pPacket, Player* pPlayer) Assert(pPacket != NULL); Assert(pPlayer != NULL); - // ÷̾ ° ƴ϶ Ѵ. + // 게임 플레이어의 상태가 정상이 아니라면 걍 리턴한다. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); if (pGamePlayer->getPlayerStatus() != GPS_NORMAL) return; @@ -103,7 +103,7 @@ void CGThrowBombHandler::execute(CGThrowBomb* pPacket, Player* pPlayer) Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); - // ÷̾ ̾ ƴ϶ Ѵ. + // 플레이어가 슬레이어가 아니라면 걍 리턴한다. if (!pCreature->isSlayer()) return; @@ -121,7 +121,7 @@ void CGThrowBombHandler::execute(CGThrowBomb* pPacket, Player* pPlayer) Assert(pInventory != NULL); - // Ұ. by sigi. 2002.11.14 + // 완전 안전지대라면 기술 사용 불가. by sigi. 2002.11.14 ZoneLevel_t ZoneLevel = pZone->getZoneLevel(pSlayer->getX(), pSlayer->getY()); if ((ZoneLevel & COMPLETE_SAFE_ZONE) || (BombX >= pInventory->getWidth() || BombY >= pInventory->getHeight())) { GCSkillFailed1 _GCSkillFailed1; @@ -141,7 +141,7 @@ void CGThrowBombHandler::execute(CGThrowBomb* pPacket, Player* pPlayer) Item* pItem = pInventory->getItem(BombX, BombY); - // ̰ų ź ƴ϶... + // 아이템이 널이거나 폭탄이 아니라면... if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_BOMB) { GCSkillFailed1 _GCSkillFailed1; //_GCSkillFailed1.setSkillType(SKILL_THROW_BOMB); @@ -150,8 +150,8 @@ void CGThrowBombHandler::execute(CGThrowBomb* pPacket, Player* pPlayer) } /* - // 6 Ÿ... - // Ÿ ָ ϸ,  ϴ ? + // 6은 임의의 사정 거리다... + // 사정 거리보다 멀리 던지려고 하면, 어떻게 하는 것이 좋을까? if (!verifyDistance(pSlayer, ZoneX, ZoneY, 6)) { GCSkillFailed1 _GCSkillFailed1; @@ -161,7 +161,7 @@ void CGThrowBombHandler::execute(CGThrowBomb* pPacket, Player* pPlayer) } */ - // ź ´. + // 폭탄의 각종 정보를 얻어온다. Bomb* pBomb = dynamic_cast(pItem); ItemType_t BombType = pBomb->getItemType(); Damage_t MinDamage = pBomb->getMinDamage(); @@ -171,7 +171,7 @@ void CGThrowBombHandler::execute(CGThrowBomb* pPacket, Player* pPlayer) Level_t SkillLevel = pSkillSlot->getExpLevel(); Damage_t RealDamage = MinDamage + (max(0, ((int)MaxDamage * (int)SkillLevel / 100) - MinDamage)); - // ġ ġ Ѵ. + // 사용자의 위치와 던질 곳의 위치로 방향을 계산한다. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); Dir_t dir = calcDirection(myX, myY, ZoneX, ZoneY); @@ -190,7 +190,7 @@ void CGThrowBombHandler::execute(CGThrowBomb* pPacket, Player* pPlayer) bool bTimeCheck = verifyRunTime(pSkillSlot); bool bRangeCheck = verifyDistance(pSlayer, ZoneX, ZoneY, 6); - // µ ʾҵ ź ڴ ٿ־ Ѵ. + // 맞든 맞지 않았든 폭탄의 숫자는 줄여주어야 한다. decreaseItemNum(pBomb, pInventory, pSlayer->getName(), STORAGE_INVENTORY, 0, BombX, BombY); if (bManaCheck && bTimeCheck && bRangeCheck) { @@ -203,14 +203,14 @@ void CGThrowBombHandler::execute(CGThrowBomb* pPacket, Player* pPlayer) decreaseMana(pSlayer, RequiredMP, _GCThrowBombOK1); - // Ÿ 鼭 Ʈ üũ Ѵ. + // 각각의 타일을 돌면서 히트 체크를 한다. for (int tileY = ZoneY - 1; tileY <= ZoneY + 1; tileY++) { for (int tileX = ZoneX - 1; tileX <= ZoneX + 1; tileX++, count++) { - // ùٸ ǥ ƴ϶, continue + // 올바른 존 좌표가 아니라면, continue if (!isValidZoneCoord(pZone, tileX, tileY)) continue; - // mask 0̶, Ʈ ʿ䰡 ٸ continue + // mask가 0이라면, 즉 히트롤을 할 필요가 없다면 continue int Mask = BombMask[BombType][dir][count]; if (Mask == 0) continue; @@ -223,14 +223,14 @@ void CGThrowBombHandler::execute(CGThrowBomb* pPacket, Player* pPlayer) if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) { Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_WALKING); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pCreature != NULL && !pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) targetList.push_back(pCreature); } if (tile.hasCreature(Creature::MOVE_MODE_BURROWING)) { Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_BURROWING); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pCreature != NULL && !pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) targetList.push_back(pCreature); } @@ -254,8 +254,8 @@ void CGThrowBombHandler::execute(CGThrowBomb* pPacket, Player* pPlayer) bool bPK = verifyPK(pSlayer, pTargetCreature); bool bZoneLevelCheck = checkZoneLevelToHitTarget(pTargetCreature); - // ڰ Ÿ̶ ġ ȿø Ѵ. - // ܳ ֱ ̴. + // 사용자가 타겟이라면 경험치를 안올릴려구 노력 한다. + // 몸빵이 생겨날 수 있기 때문이다. if (tileX == ZoneX && tileY == ZoneY) { if (pTargetCreature->isSlayer()) { bRaceCheck = false; @@ -280,18 +280,18 @@ void CGThrowBombHandler::execute(CGThrowBomb* pPacket, Player* pPlayer) } } // for (int tileY = ZoneY-1; tileY <= ZoneY+1; tileY++) - // Ÿ üũ , ġ ణ ø, ڸ ٿش. + // 모든 타일 체크가 끝났으니, 경험치를 약간 올리고, 아이템 숫자를 줄여준다. if (bHit && bRaceCheck) { shareAttrExp(pSlayer, RealDamage, 1, 8, 1, _GCThrowBombOK1); increaseDomainExp(pSlayer, SKILL_DOMAIN_GUN, pSkillInfo->getPoint(), _GCThrowBombOK1); - // ų ų ġ ÷ش. + // 스킬을 사용할 수 있을 때만 스킬 경험치를 올려준다. // 2003. 1. 12 by bezz if (pSkillSlot->canUse()) increaseSkillExp(pSlayer, SKILL_DOMAIN_GUN, pSkillSlot, pSkillInfo, _GCThrowBombOK1); // increaseAlignment(pSlayer, SKILL_DOMAIN_GUN, _GCThrowBombOK1); // shareAttrExp(pSlayer, RealDamage, 1, 8, 1, _GCSkillToTileOK1); - // κп Ŷ ϴµ.. + // 이 부분에서 패킷을 보내줘야 하는데.. } _GCThrowBombOK1.setXYDir(ZoneX, ZoneY, dir); @@ -318,7 +318,7 @@ void CGThrowBombHandler::execute(CGThrowBomb* pPacket, Player* pPlayer) _GCThrowBombOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // ߸. + // 아이템의 내구력을 떨어뜨린다. decreaseDurability(NULL, pTargetCreature, pSkillInfo, NULL, &_GCThrowBombOK2); diff --git a/src/Core/CGThrowItem.h b/src/Core/CGThrowItem.h index d9886fdd..74ff7238 100644 --- a/src/Core/CGThrowItem.h +++ b/src/Core/CGThrowItem.h @@ -31,10 +31,10 @@ class CGThrowItem : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGThrowItemHandler.cpp b/src/Core/CGThrowItemHandler.cpp index bee24c9b..be2540c4 100644 --- a/src/Core/CGThrowItemHandler.cpp +++ b/src/Core/CGThrowItemHandler.cpp @@ -37,19 +37,19 @@ void CGThrowItemHandler::execute(CGThrowItem* pPacket, Player* pPlayer) try { GamePlayer* pGamePlayer = dynamic_cast(pPlayer); - // ÷̾ ° ƴ϶ Ѵ. + // 게임 플레이어의 상태가 정상이 아니라면 걍 리턴한다. if (pGamePlayer->getPlayerStatus() != GPS_NORMAL) return; Creature* pCreature = pGamePlayer->getCreature(); - // ÷̾ ̾ ƴ϶ Ѵ. + // 플레이어가 슬레이어가 아니라면 걍 리턴한다. if (!pCreature->isSlayer()) return; Slayer* pSlayer = dynamic_cast(pCreature); Assert(pSlayer != NULL); - // Ұ. by sigi. 2002.11.14 + // 완전 안전지대라면 기술 사용 불가. by sigi. 2002.11.14 ZoneLevel_t ZoneLevel = pSlayer->getZone()->getZoneLevel(pSlayer->getX(), pSlayer->getY()); if (ZoneLevel & COMPLETE_SAFE_ZONE) { GCSkillFailed1 _GCSkillFailed1; diff --git a/src/Core/CGTradeAddItem.cpp b/src/Core/CGTradeAddItem.cpp index d9c46bf4..eeaff9c8 100644 --- a/src/Core/CGTradeAddItem.cpp +++ b/src/Core/CGTradeAddItem.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGTradeAddItem.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGTradeAddItem.h b/src/Core/CGTradeAddItem.h index 5bc2ec6a..5f6370c0 100644 --- a/src/Core/CGTradeAddItem.h +++ b/src/Core/CGTradeAddItem.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CGTradeAddItem.h -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -50,8 +50,8 @@ class CGTradeAddItem : public Packet { } private: - ObjectID_t m_TargetObjectID; // ȯ ϴ ObjectID - ObjectID_t m_ItemObjectID; // ȯ Ʈ ߰ OID + ObjectID_t m_TargetObjectID; // 교환을 원하는 상대방의 ObjectID + ObjectID_t m_ItemObjectID; // 교환 리스트에 추가할 아이템의 OID }; diff --git a/src/Core/CGTradeAddItemHandler.cpp b/src/Core/CGTradeAddItemHandler.cpp index 2df19a6f..af98f6c3 100644 --- a/src/Core/CGTradeAddItemHandler.cpp +++ b/src/Core/CGTradeAddItemHandler.cpp @@ -53,7 +53,7 @@ void CGTradeAddItemHandler::execute(CGTradeAddItem* pPacket, Player* pPlayer) { TradeManager* pTradeManager = pZone->getTradeManager(); Assert(pTradeManager != NULL); - // ȯ ϴ ãƺ. + // 교환을 원하는 상대방을 존에서 찾아본다. Creature* pTargetPC = NULL; /* try @@ -66,31 +66,31 @@ void CGTradeAddItemHandler::execute(CGTradeAddItem* pPacket, Player* pPlayer) { } */ - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 pTargetPC = pZone->getCreature(TargetOID); - // ȯ 밡 ٸ . + // 교환 상대가 없다면 에러다. if (pTargetPC == NULL) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_TARGET_NOT_EXIST); return; } - // ȯ 밡 ƴϰų, ƴ϶ . + // 교환 상대가 사람이 아니거나, 같은 종족이 아니라면 에러다. if (!pTargetPC->isPC() || !isSameRace(pTargetPC, pPC)) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_RACE_DIFFER); return; } - // 뿡 ִ üũ Ѵ. + // 둘 다 안전 지대에 있는지 체크를 한다. if (!isInSafeZone(pPC) || !isInSafeZone(pTargetPC)) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_NOT_SAFE); return; } - // ̸ Ÿ ִٸ . + // 오토바이를 타고 있다면 에러다. if (pPC->isSlayer() && pTargetPC->isSlayer()) { Slayer* pSlayer1 = dynamic_cast(pPC); Slayer* pSlayer2 = dynamic_cast(pTargetPC); @@ -114,7 +114,7 @@ void CGTradeAddItemHandler::execute(CGTradeAddItem* pPacket, Player* pPlayer) { } } - // ̼ ȯ ϰ ִ ° ƴ϶ . + // 둘이서 교환을 하고 있는 상태가 아니라면 에러다. if (!pTradeManager->isTrading(pPC, pTargetPC)) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_NOT_TRADING); @@ -128,7 +128,7 @@ void CGTradeAddItemHandler::execute(CGTradeAddItem* pPacket, Player* pPlayer) { else if (pPC->isOusters()) executeOusters(pPacket, pPlayer); else - throw ProtocolException("CGTradeAddItemHandler::execute() : ÷̾ ũ"); + throw ProtocolException("CGTradeAddItemHandler::execute() : 알 수 없는 플레이어 크리쳐"); #endif @@ -143,8 +143,8 @@ void CGTradeAddItemHandler::executeSlayer(CGTradeAddItem* pPacket, Player* pPlay #ifdef __GAME_SERVER__ - // Լ ˻߱ , - // ⼭ Ͱ ˻ ʴ´. + // 상위 함수에서 에러를 검사했기 때문에, + // 여기서는 포인터가 널인지를 검사하지 않는다. ObjectID_t TargetOID = pPacket->getTargetObjectID(); ObjectID_t ItemOID = pPacket->getItemObjectID(); GamePlayer* pGamePlayer = dynamic_cast(pPlayer); @@ -152,7 +152,7 @@ void CGTradeAddItemHandler::executeSlayer(CGTradeAddItem* pPacket, Player* pPlay Zone* pZone = pPC->getZone(); Creature* pTargetPC = pZone->getCreature(TargetOID); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetPC == NULL) return; @@ -161,13 +161,13 @@ void CGTradeAddItemHandler::executeSlayer(CGTradeAddItem* pPacket, Player* pPlay TradeManager* pTradeManager = pZone->getTradeManager(); Assert(pTradeManager != NULL); - // ȯ ߰ ͸ . + // 교환 대상에 추가할 아이템의 포인터를 얻어낸다. CoordInven_t X, Y; Inventory* pInventory = pSender->getInventory(); Item* pItem = pInventory->findItemOID(ItemOID, X, Y); - // ߰ ٸ 翬 ̻ ó Ұ - // ߰ Relic̸ ߰ . + // 추가할 아이템이 없다면 당연히 더 이상 처리가 불가능 + // 추가할 아이템이 Relic이면 추가할 수 없다. if (pItem == NULL || !canTrade(pItem) || pSender->getStore()->hasItem(pItem)) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_ADD_ITEM); @@ -176,18 +176,18 @@ void CGTradeAddItemHandler::executeSlayer(CGTradeAddItem* pPacket, Player* pPlay ///* // #ifdef __XMAS_EVENT_CODE__ - // 쿡, 濡 ڰ ˻ , - // Ŷ Ѵ. + // 녹색 선물 상자인 경우에는, 상대방에게 적색 선물 상자가 없는지 검사한 후, + // 인증 패킷을 보내줘야 한다. if (pItem->getItemClass() == Item::ITEM_CLASS_EVENT_GIFT_BOX) { PlayerCreature* pReceiver = dynamic_cast(pTargetPC); Item* pExtraSlotItem = pReceiver->getExtraInventorySlotItem(); - // + // 녹색 선물 상자 if (pItem->getItemType() == 0) { - // ȯ ̹ ڸ ִ üũѴ. by sigi. 2002.12.16 + // 교환 받을 사람이 이미 녹색 선물 상자를 받은 적이 있는지 체크한다. by sigi. 2002.12.16 FlagSet* pFlagSet = pReceiver->getFlagSet(); if (pFlagSet->isOn(FLAGSET_RECEIVE_GREEN_GIFT_BOX)) { - // ڴ ȯ ǰ . + // 적색 선물 상자는 교환 품목의 대상이 될 수 없다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_ADD_ITEM_FAIL); pPlayer->sendPacket(&gcTradeVerify); @@ -196,7 +196,7 @@ void CGTradeAddItemHandler::executeSlayer(CGTradeAddItem* pPacket, Player* pPlay Inventory* pTargetInventory = pReceiver->getInventory(); if (pTargetInventory->hasRedGiftBox()) { - // ڸ ִٸ . ϽŲ. + // 적색 선물 상자를 가지고 있다면 더할 수 없다. 리턴시킨다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_ADD_ITEM_FAIL); pPlayer->sendPacket(&gcTradeVerify); @@ -210,15 +210,15 @@ void CGTradeAddItemHandler::executeSlayer(CGTradeAddItem* pPacket, Player* pPlay return; } } else { - // ڸ ʴٸ, Ѿ. + // 적색 선물 상자를 가지고 있지 않다면, 걍 넘어간다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_ADD_ITEM_OK); pPlayer->sendPacket(&gcTradeVerify); } } - // + // 빨간 선물 상자 else if (pItem->getItemType() == 1) { - // ڴ ȯ ǰ . + // 적색 선물 상자는 교환 품목의 대상이 될 수 없다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_ADD_ITEM_FAIL); pPlayer->sendPacket(&gcTradeVerify); @@ -256,34 +256,34 @@ void CGTradeAddItemHandler::executeSlayer(CGTradeAddItem* pPacket, Player* pPlay } - // TradeManager ȯ μ Ѵ. + // TradeManager에 교환 대상으로서 아이템을 더한다. // Assert(pInfo1->addItem(pItem)); pInfo1->addItem(pItem); - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // cout << "CGTradeRemoveItem [" << pSender->getName() << "] ° TRADE_FINISH̹Ƿ, Ŷ ش." + // cout << "CGTradeRemoveItem [" << pSender->getName() << "]의 상태가 TRADE_FINISH이므로, 인증 패킷을 보내준다." // << endl; - // Ŷ ش. + // 인증 패킷을 날려준다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_ADD_ITEM_WHEN_ACCEPT); pPlayer->sendPacket(&gcTradeVerify); } else { - // cout << "CGTradeRemoveItem [" << pSender->getName() << "] ° TRADE_FINISH ƴϹǷ, Ŷ - // ʴ´." << endl; + // cout << "CGTradeRemoveItem [" << pSender->getName() << "]의 상태가 TRADE_FINISH가 아니므로, 인증 패킷 날리지 + // 않는다." << endl; } - // ϰų , ° TRADE_FINISH - // TRADE_TRADING ٲ Ѵ. + // 아이템을 더하거나 뺄 경우, 상태가 TRADE_FINISH라면 + // TRADE_TRADING으로 바꿔줘야 한다. pInfo1->setStatus(TRADE_TRADING); pInfo2->setStatus(TRADE_TRADING); - // 濡 Ѵ. + // 상대방에게 날려줄 아이템 정보를 구성한다. GCTradeAddItem gcTradeAddItem; makeGCTradeAddItemPacket(&gcTradeAddItem, pSender->getObjectID(), pItem, X, Y); - // 濡 ȯ ش. + // 상대방에게 교환할 아이템 정보를 날려준다. Player* pTargetPlayer = pTargetPC->getPlayer(); pTargetPlayer->sendPacket(&gcTradeAddItem); @@ -301,8 +301,8 @@ void CGTradeAddItemHandler::executeVampire(CGTradeAddItem* pPacket, Player* pPla #ifdef __GAME_SERVER__ - // Լ ˻߱ , - // ⼭ Ͱ ˻ ʴ´. + // 상위 함수에서 에러를 검사했기 때문에, + // 여기서는 포인터가 널인지를 검사하지 않는다. ObjectID_t TargetOID = pPacket->getTargetObjectID(); ObjectID_t ItemOID = pPacket->getItemObjectID(); GamePlayer* pGamePlayer = dynamic_cast(pPlayer); @@ -310,7 +310,7 @@ void CGTradeAddItemHandler::executeVampire(CGTradeAddItem* pPacket, Player* pPla Zone* pZone = pPC->getZone(); Creature* pTargetPC = pZone->getCreature(TargetOID); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetPC == NULL) return; @@ -319,13 +319,13 @@ void CGTradeAddItemHandler::executeVampire(CGTradeAddItem* pPacket, Player* pPla TradeManager* pTradeManager = pZone->getTradeManager(); Assert(pTradeManager != NULL); - // ȯ ߰ ͸ . + // 교환 대상에 추가할 아이템의 포인터를 얻어낸다. CoordInven_t X, Y; Inventory* pInventory = pSender->getInventory(); Item* pItem = pInventory->findItemOID(ItemOID, X, Y); - // ߰ ٸ 翬 ̻ ó Ұ - // Relic ȯ . + // 추가할 아이템이 없다면 당연히 더 이상 처리가 불가능 + // Relic은 교환할 수 없다. if (pItem == NULL || !canTrade(pItem) || pSender->getStore()->hasItem(pItem)) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_ADD_ITEM); @@ -335,8 +335,8 @@ void CGTradeAddItemHandler::executeVampire(CGTradeAddItem* pPacket, Player* pPla // // #ifdef __XMAS_EVENT_CODE__ - // 쿡, 濡 ڰ ˻ , - // Ŷ Ѵ. + // 녹색 선물 상자인 경우에는, 상대방에게 적색 선물 상자가 없는지 검사한 후, + // 인증 패킷을 보내줘야 한다. if (pItem->getItemClass() == Item::ITEM_CLASS_EVENT_GIFT_BOX) { PlayerCreature* pReceiver = dynamic_cast(pTargetPC); Item* pExtraSlotItem = pReceiver->getExtraInventorySlotItem(); @@ -344,7 +344,7 @@ void CGTradeAddItemHandler::executeVampire(CGTradeAddItem* pPacket, Player* pPla if (pItem->getItemType() == 0) { Inventory* pTargetInventory = pReceiver->getInventory(); if (pTargetInventory->hasRedGiftBox()) { - // ڸ ִٸ . ϽŲ. + // 적색 선물 상자를 가지고 있다면 더할 수 없다. 리턴시킨다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_ADD_ITEM_FAIL); pPlayer->sendPacket(&gcTradeVerify); @@ -358,13 +358,13 @@ void CGTradeAddItemHandler::executeVampire(CGTradeAddItem* pPacket, Player* pPla return; } } else { - // ڸ ʴٸ, Ѿ. + // 적색 선물 상자를 가지고 있지 않다면, 걍 넘어간다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_ADD_ITEM_OK); pPlayer->sendPacket(&gcTradeVerify); } } else if (pItem->getItemType() == 1) { - // ڴ ȯ ǰ . + // 적색 선물 상자는 교환 품목이 될 수 없다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_ADD_ITEM_FAIL); pPlayer->sendPacket(&gcTradeVerify); @@ -402,34 +402,34 @@ void CGTradeAddItemHandler::executeVampire(CGTradeAddItem* pPacket, Player* pPla } - // TradeManager ȯ μ Ѵ. + // TradeManager에 교환 대상으로서 아이템을 더한다. // Assert(pInfo1->addItem(pItem)); pInfo1->addItem(pItem); - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // cout << "CGTradeRemoveItem [" << pSender->getName() << "] ° TRADE_FINISH̹Ƿ, Ŷ ش." + // cout << "CGTradeRemoveItem [" << pSender->getName() << "]의 상태가 TRADE_FINISH이므로, 인증 패킷을 보내준다." // << endl; - // Ŷ ش. + // 인증 패킷을 날려준다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_ADD_ITEM_WHEN_ACCEPT); pPlayer->sendPacket(&gcTradeVerify); } else { - // cout << "CGTradeRemoveItem [" << pSender->getName() << "] ° TRADE_FINISH ƴϹǷ, Ŷ - // ʴ´." << endl; + // cout << "CGTradeRemoveItem [" << pSender->getName() << "]의 상태가 TRADE_FINISH가 아니므로, 인증 패킷 날리지 + // 않는다." << endl; } - // ϰų , ° TRADE_FINISH - // TRADE_TRADING ٲ Ѵ. + // 아이템을 더하거나 뺄 경우, 상태가 TRADE_FINISH라면 + // TRADE_TRADING으로 바꿔줘야 한다. pInfo1->setStatus(TRADE_TRADING); pInfo2->setStatus(TRADE_TRADING); - // 濡 Ѵ. + // 상대방에게 날려줄 아이템 정보를 구성한다. GCTradeAddItem gcTradeAddItem; makeGCTradeAddItemPacket(&gcTradeAddItem, pSender->getObjectID(), pItem, X, Y); - // 濡 ȯ ش. + // 상대방에게 교환할 아이템 정보를 날려준다. Player* pTargetPlayer = pTargetPC->getPlayer(); pTargetPlayer->sendPacket(&gcTradeAddItem); @@ -445,8 +445,8 @@ void CGTradeAddItemHandler::executeOusters(CGTradeAddItem* pPacket, Player* pPla #ifdef __GAME_SERVER__ - // Լ ˻߱ , - // ⼭ Ͱ ˻ ʴ´. + // 상위 함수에서 에러를 검사했기 때문에, + // 여기서는 포인터가 널인지를 검사하지 않는다. ObjectID_t TargetOID = pPacket->getTargetObjectID(); ObjectID_t ItemOID = pPacket->getItemObjectID(); GamePlayer* pGamePlayer = dynamic_cast(pPlayer); @@ -454,7 +454,7 @@ void CGTradeAddItemHandler::executeOusters(CGTradeAddItem* pPacket, Player* pPla Zone* pZone = pPC->getZone(); Creature* pTargetPC = pZone->getCreature(TargetOID); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetPC == NULL) return; @@ -463,13 +463,13 @@ void CGTradeAddItemHandler::executeOusters(CGTradeAddItem* pPacket, Player* pPla TradeManager* pTradeManager = pZone->getTradeManager(); Assert(pTradeManager != NULL); - // ȯ ߰ ͸ . + // 교환 대상에 추가할 아이템의 포인터를 얻어낸다. CoordInven_t X, Y; Inventory* pInventory = pSender->getInventory(); Item* pItem = pInventory->findItemOID(ItemOID, X, Y); - // ߰ ٸ 翬 ̻ ó Ұ - // Relic ȯ . + // 추가할 아이템이 없다면 당연히 더 이상 처리가 불가능 + // Relic은 교환할 수 없다. if (pItem == NULL || !canTrade(pItem) || pSender->getStore()->hasItem(pItem)) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_ADD_ITEM); @@ -479,8 +479,8 @@ void CGTradeAddItemHandler::executeOusters(CGTradeAddItem* pPacket, Player* pPla // // #ifdef __XMAS_EVENT_CODE__ - // 쿡, 濡 ڰ ˻ , - // Ŷ Ѵ. + // 녹색 선물 상자인 경우에는, 상대방에게 적색 선물 상자가 없는지 검사한 후, + // 인증 패킷을 보내줘야 한다. if (pItem->getItemClass() == Item::ITEM_CLASS_EVENT_GIFT_BOX) { PlayerCreature* pReceiver = dynamic_cast(pTargetPC); Item* pExtraSlotItem = pReceiver->getExtraInventorySlotItem(); @@ -488,7 +488,7 @@ void CGTradeAddItemHandler::executeOusters(CGTradeAddItem* pPacket, Player* pPla if (pItem->getItemType() == 0) { Inventory* pTargetInventory = pReceiver->getInventory(); if (pTargetInventory->hasRedGiftBox()) { - // ڸ ִٸ . ϽŲ. + // 적색 선물 상자를 가지고 있다면 더할 수 없다. 리턴시킨다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_ADD_ITEM_FAIL); pPlayer->sendPacket(&gcTradeVerify); @@ -502,13 +502,13 @@ void CGTradeAddItemHandler::executeOusters(CGTradeAddItem* pPacket, Player* pPla return; } } else { - // ڸ ʴٸ, Ѿ. + // 적색 선물 상자를 가지고 있지 않다면, 걍 넘어간다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_ADD_ITEM_OK); pPlayer->sendPacket(&gcTradeVerify); } } else if (pItem->getItemType() == 1) { - // ڴ ȯ ǰ . + // 적색 선물 상자는 교환 품목이 될 수 없다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_ADD_ITEM_FAIL); pPlayer->sendPacket(&gcTradeVerify); @@ -546,34 +546,34 @@ void CGTradeAddItemHandler::executeOusters(CGTradeAddItem* pPacket, Player* pPla } - // TradeManager ȯ μ Ѵ. + // TradeManager에 교환 대상으로서 아이템을 더한다. // Assert(pInfo1->addItem(pItem)); pInfo1->addItem(pItem); - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // cout << "CGTradeRemoveItem [" << pSender->getName() << "] ° TRADE_FINISH̹Ƿ, Ŷ ش." + // cout << "CGTradeRemoveItem [" << pSender->getName() << "]의 상태가 TRADE_FINISH이므로, 인증 패킷을 보내준다." // << endl; - // Ŷ ش. + // 인증 패킷을 날려준다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_ADD_ITEM_WHEN_ACCEPT); pPlayer->sendPacket(&gcTradeVerify); } else { - // cout << "CGTradeRemoveItem [" << pSender->getName() << "] ° TRADE_FINISH ƴϹǷ, Ŷ - // ʴ´." << endl; + // cout << "CGTradeRemoveItem [" << pSender->getName() << "]의 상태가 TRADE_FINISH가 아니므로, 인증 패킷 날리지 + // 않는다." << endl; } - // ϰų , ° TRADE_FINISH - // TRADE_TRADING ٲ Ѵ. + // 아이템을 더하거나 뺄 경우, 상태가 TRADE_FINISH라면 + // TRADE_TRADING으로 바꿔줘야 한다. pInfo1->setStatus(TRADE_TRADING); pInfo2->setStatus(TRADE_TRADING); - // 濡 Ѵ. + // 상대방에게 날려줄 아이템 정보를 구성한다. GCTradeAddItem gcTradeAddItem; makeGCTradeAddItemPacket(&gcTradeAddItem, pSender->getObjectID(), pItem, X, Y); - // 濡 ȯ ش. + // 상대방에게 교환할 아이템 정보를 날려준다. Player* pTargetPlayer = pTargetPC->getPlayer(); pTargetPlayer->sendPacket(&gcTradeAddItem); @@ -589,7 +589,7 @@ void CGTradeAddItemHandler::makeGCTradeAddItemPacket(GCTradeAddItem* pPacket, Ob #ifdef __GAME_SERVER__ - // 濡 Ѵ. + // 상대방에게 날려줄 아이템 정보를 구성한다. pPacket->setTargetObjectID(Sender); pPacket->setItemObjectID(pItem->getObjectID()); pPacket->setX(X); @@ -604,7 +604,7 @@ void CGTradeAddItemHandler::makeGCTradeAddItemPacket(GCTradeAddItem* pPacket, Ob pPacket->setEnchantLevel(pItem->getEnchantLevel()); pPacket->clearList(); - //  ۵ ֱ ߰ ؾѴ. + // 어떤 아이템들을 정보를 보내주기 전에 추가적으로 가공을 해야한다. Item::ItemClass IClass = pItem->getItemClass(); if (IClass == Item::ITEM_CLASS_PET_ITEM) { @@ -628,7 +628,7 @@ void CGTradeAddItemHandler::makeGCTradeAddItemPacket(GCTradeAddItem* pPacket, Ob } } - // ſ Ѿ ڸ ־ش. + // 총 종류는 아이템 숫자 대신에 총알의 숫자를 넣어준다. else if (IClass == Item::ITEM_CLASS_AR) { AR* pAR = dynamic_cast(pItem); pPacket->setItemNum(pAR->getBulletCount()); @@ -642,8 +642,8 @@ void CGTradeAddItemHandler::makeGCTradeAddItemPacket(GCTradeAddItem* pPacket, Ob SMG* pSMG = dynamic_cast(pItem); pPacket->setItemNum(pSMG->getBulletCount()); } - // Ʈ 쿡 Ʈ ȿ ԵǾ ִ - // Ѵ. + // 벨트의 경우에는 벨트 안에 포함되어 있는 아이템 정보를 + // 같이 날려줘야 한다. else if (IClass == Item::ITEM_CLASS_BELT) { Belt* pBelt = dynamic_cast(pItem); Inventory* pBeltInventory = pBelt->getInventory(); @@ -666,8 +666,8 @@ void CGTradeAddItemHandler::makeGCTradeAddItemPacket(GCTradeAddItem* pPacket, Ob pPacket->setListNum(SubItemCount); } - // Ͻ 쿡 ȿ ԵǾ ִ - // Ѵ. + // 암스밴드의 경우에는 안에 포함되어 있는 아이템 정보를 + // 같이 날려줘야 한다. else if (IClass == Item::ITEM_CLASS_OUSTERS_ARMSBAND) { OustersArmsband* pOustersArmsband = dynamic_cast(pItem); Inventory* pOustersArmsbandInventory = pOustersArmsband->getInventory(); diff --git a/src/Core/CGTradeFinish.cpp b/src/Core/CGTradeFinish.cpp index 99bdce38..c331d9f7 100644 --- a/src/Core/CGTradeFinish.cpp +++ b/src/Core/CGTradeFinish.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGTradeFinish.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGTradeFinish.h b/src/Core/CGTradeFinish.h index e2be0212..eec2cafd 100644 --- a/src/Core/CGTradeFinish.h +++ b/src/Core/CGTradeFinish.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CGTradeFinish.h -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -11,17 +11,17 @@ #include "PacketFactory.h" //////////////////////////////////////////////////////////////////////////////// -// ȯ ڵ +// 교환 코드 //////////////////////////////////////////////////////////////////////////////// enum { - // ȯ ڵ + // 교환을 허락할 때 보내는 코드 CG_TRADE_FINISH_ACCEPT = 0, - // ȯ ź ڵ + // 교환을 거부할 때 보내는 코드 CG_TRADE_FINISH_REJECT, - // ȯ ڵ + // 교환을 재고려할 때 보내는 코드 CG_TRADE_FINISH_RECONSIDER, @@ -68,8 +68,8 @@ class CGTradeFinish : public Packet { } private: - ObjectID_t m_TargetObjectID; // ȯ ϴ ObjectID - BYTE m_Code; // ȯ ڵ + ObjectID_t m_TargetObjectID; // 교환을 원하는 상대방의 ObjectID + BYTE m_Code; // 교환 코드 }; diff --git a/src/Core/CGTradeFinishHandler.cpp b/src/Core/CGTradeFinishHandler.cpp index f629cb87..0c0227f0 100644 --- a/src/Core/CGTradeFinishHandler.cpp +++ b/src/Core/CGTradeFinishHandler.cpp @@ -42,7 +42,7 @@ void CGTradeFinishHandler::execute(CGTradeFinish* pPacket, Player* pPlayer) TradeManager* pTradeManager = pZone->getTradeManager(); Assert(pTradeManager != NULL); - // ȯ ϴ ãƺ. + // 교환을 원하는 상대방을 존에서 찾아본다. Creature* pTargetPC = NULL; /* try @@ -55,31 +55,31 @@ void CGTradeFinishHandler::execute(CGTradeFinish* pPacket, Player* pPlayer) } */ - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 pTargetPC = pZone->getCreature(TargetOID); - // ȯ 밡 ٸ + // 교환 상대가 없다면 에러다 if (pTargetPC == NULL) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_TARGET_NOT_EXIST); return; } - // ȯ 밡 ƴϰų, ƴ϶ . + // 교환 상대가 사람이 아니거나, 같은 종족이 아니라면 에러다. if (!pTargetPC->isPC() || !isSameRace(pTargetPC, pPC)) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_RACE_DIFFER); return; } - // 뿡 ִ üũ Ѵ. + // 둘 다 안전 지대에 있는지 체크를 한다. if (!isInSafeZone(pPC) || !isInSafeZone(pTargetPC)) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_NOT_SAFE); return; } - // ̸ Ÿ ִٸ . + // 오토바이를 타고 있다면 에러다. if (pPC->isSlayer() && pTargetPC->isSlayer()) { Slayer* pSlayer1 = dynamic_cast(pPC); Slayer* pSlayer2 = dynamic_cast(pTargetPC); @@ -103,7 +103,7 @@ void CGTradeFinishHandler::execute(CGTradeFinish* pPacket, Player* pPlayer) } } - // ̼ ȯ ϰ ִ ° ƴ϶ . + // 둘이서 교환을 하고 있는 상태가 아니라면 에러다. if (!pTradeManager->isTrading(pPC, pTargetPC)) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_NOT_TRADING); @@ -117,7 +117,7 @@ void CGTradeFinishHandler::execute(CGTradeFinish* pPacket, Player* pPlayer) else if (pPC->isOusters()) executeOusters(pPacket, pPlayer); else - throw ProtocolException("CGTradeFinishHanderl::execuete() : ÷̾ ũԴϴ."); + throw ProtocolException("CGTradeFinishHanderl::execuete() : 알 수 없는 플레이어 크리쳐입니다."); #endif @@ -133,8 +133,8 @@ void CGTradeFinishHandler::executeSlayer(CGTradeFinish* pPacket, Player* pPlayer #ifdef __GAME_SERVER__ - // Լ ˻߱ , - // ⼭ Ͱ ˻ ʴ´. + // 상위 함수에서 에러를 검사했기 때문에, + // 여기서는 포인터가 널인지를 검사하지 않는다. ObjectID_t TargetOID = pPacket->getTargetObjectID(); BYTE CODE = pPacket->getCode(); GamePlayer* pGamePlayer = dynamic_cast(pPlayer); @@ -142,7 +142,7 @@ void CGTradeFinishHandler::executeSlayer(CGTradeFinish* pPacket, Player* pPlayer Zone* pZone = pPC->getZone(); Creature* pTargetPC = pZone->getCreature(TargetOID); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetPC == NULL) return; @@ -157,37 +157,37 @@ void CGTradeFinishHandler::executeSlayer(CGTradeFinish* pPacket, Player* pPlayer Player* pTargetPlayer = pTargetPC->getPlayer(); GCTradeFinish gcTradeFinish; - // ð ´. + // 현재 시간을 얻어온다. Timeval currentTime; getCurrentTime(currentTime); - // ȯ ³ϴ ڵ. + // 교환을 승낙하는 코드다. if (CODE == CG_TRADE_FINISH_ACCEPT) { - // OK ƿ ð ƴ϶ . + // OK가 날아올 시간이 아니라면 에러다. if (pInfo1->isValidOKTime(currentTime) == false) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_UNKNOWN); return; } - // ȯ ³ߴٴ 濡 ˷ش. + // 교환을 승낙했다는 것을 상대방에게 알려준다. gcTradeFinish.setTargetObjectID(pSender->getObjectID()); gcTradeFinish.setCode(GC_TRADE_FINISH_ACCEPT); pTargetPlayer->sendPacket(&gcTradeFinish); - // ȯ ¸ ȯѴ. + // 교환 상태를 변환한다. pInfo1->setStatus(TRADE_FINISH); - // cout << "CGTradeFinish [" << pSender->getName() << "] ° TRADE_FINISH ٲ." << endl; + // cout << "CGTradeFinish [" << pSender->getName() << "]의 상태가 TRADE_FINISH로 바뀌었다." << endl; - // 浵 ȯ ϰ ִٸ, ȯ ϵ Ѵ. + // 상대방도 교환을 허락하고 있다면, 실제로 교환을 하도록 한다. if (pInfo2->getStatus() == TRADE_FINISH) { - // cout << "CGTradeFinish [" << pReceiver->getName() << "] µ TRADE_FINISH̹Ƿ, ȯ Ѵ." << + // cout << "CGTradeFinish [" << pReceiver->getName() << "]의 상태도 TRADE_FINISH이므로, 교환을 수행한다." << // endl; - // Ȯ ȯ ִٸ ȯ Ѵ. + // 확실히 교환을 할 수 있다면 교환을 한다. if (pTradeManager->canTrade(pSender, pReceiver) == 1) { - // ȯ ϶ Ŷ ش. + // 양 측에 교환을 수행하라는 패킷을 날려준다. gcTradeFinish.setTargetObjectID(pSender->getObjectID()); gcTradeFinish.setCode(GC_TRADE_FINISH_EXECUTE); pTargetPlayer->sendPacket(&gcTradeFinish); @@ -196,7 +196,7 @@ void CGTradeFinishHandler::executeSlayer(CGTradeFinish* pPacket, Player* pPlayer gcTradeFinish.setCode(GC_TRADE_FINISH_EXECUTE); pPlayer->sendPacket(&gcTradeFinish); - // ȯ Ѵ. + // 실제로 교환을 수행한다. pTradeManager->processTrade(pSender, pReceiver); } else if (pTradeManager->canTrade(pSender, pReceiver) == 2) { pTradeManager->cancelTrade(pPC); @@ -209,49 +209,49 @@ void CGTradeFinishHandler::executeSlayer(CGTradeFinish* pPacket, Player* pPlayer } } } - // ȯ źϴ ڵ. + // 교환을 거부하는 코드다. else if (CODE == CG_TRADE_FINISH_REJECT) { - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // Ŷ ش. + // 인증 패킷을 날려준다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_FINISH_REJECT); pPlayer->sendPacket(&gcTradeVerify); } - // ȯ ҽŲ. + // 교환을 취소시킨다. pTradeManager->cancelTrade(pSender, pReceiver); - // ȯ ҵǾٴ 濡 ˷ش. + // 교환이 취소되었다는 것을 상대방에게 알려준다. gcTradeFinish.setTargetObjectID(pSender->getObjectID()); gcTradeFinish.setCode(GC_TRADE_FINISH_REJECT); pTargetPlayer->sendPacket(&gcTradeFinish); } - // ȯ ϴ ڵ. + // 교환을 재고려하는 코드다. else if (CODE == CG_TRADE_FINISH_RECONSIDER) { - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // Ŷ ش. + // 인증 패킷을 날려준다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_FINISH_RECONSIDER); pPlayer->sendPacket(&gcTradeVerify); } - // ȯ ¸ ȯѴ. + // 교환 상태를 변환한다. pInfo1->setStatus(TRADE_TRADING); - // OK ٰ cancel , 4 OK ٽ ƿͼ - // ȴ. ׷Ƿ ⼭ ð ش. + // OK를 눌렀다가 cancel을 누르면, 다음 4초 동안은 OK가 다시 날아와서는 + // 안 된다. 그러므로 여기서 시간을 세팅해 준다. pInfo1->setNextTime(currentTime); - // ȯ Ǿٴ 濡 ˷ش. + // 교환이 재고려되었다는 것을 상대방에게 알려준다. gcTradeFinish.setTargetObjectID(pSender->getObjectID()); gcTradeFinish.setCode(GC_TRADE_FINISH_RECONSIDER); pTargetPlayer->sendPacket(&gcTradeFinish); } - // ˼ ڵ. ϰ ©ش. + // 알수 없는 코드다. 사뿐하게 짤라준다. else - throw ProtocolException("CGTradeFinish::executeSlayer() : ڵ"); + throw ProtocolException("CGTradeFinish::executeSlayer() : 알 수 없는 코드"); #endif @@ -267,8 +267,8 @@ void CGTradeFinishHandler::executeVampire(CGTradeFinish* pPacket, Player* pPlaye #ifdef __GAME_SERVER__ - // Լ ˻߱ , - // ⼭ Ͱ ˻ ʴ´. + // 상위 함수에서 에러를 검사했기 때문에, + // 여기서는 포인터가 널인지를 검사하지 않는다. ObjectID_t TargetOID = pPacket->getTargetObjectID(); BYTE CODE = pPacket->getCode(); GamePlayer* pGamePlayer = dynamic_cast(pPlayer); @@ -276,7 +276,7 @@ void CGTradeFinishHandler::executeVampire(CGTradeFinish* pPacket, Player* pPlaye Zone* pZone = pPC->getZone(); Creature* pTargetPC = pZone->getCreature(TargetOID); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetPC == NULL) return; @@ -291,34 +291,34 @@ void CGTradeFinishHandler::executeVampire(CGTradeFinish* pPacket, Player* pPlaye Player* pTargetPlayer = pTargetPC->getPlayer(); GCTradeFinish gcTradeFinish; - // ð ´. + // 현재 시간을 얻어온다. Timeval currentTime; getCurrentTime(currentTime); - // ȯ ³ϴ ڵ. + // 교환을 승낙하는 코드다. if (CODE == CG_TRADE_FINISH_ACCEPT) { - // OK ƿ ð ƴ϶ . + // OK가 날아올 시간이 아니라면 에러다. if (pInfo1->isValidOKTime(currentTime) == false) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_UNKNOWN); return; } - // ȯ ³ߴٴ 濡 ˷ش. + // 교환을 승낙했다는 것을 상대방에게 알려준다. gcTradeFinish.setTargetObjectID(pSender->getObjectID()); gcTradeFinish.setCode(GC_TRADE_FINISH_ACCEPT); pTargetPlayer->sendPacket(&gcTradeFinish); - // ȯ ¸ ȯѴ. + // 교환 상태를 변환한다. pInfo1->setStatus(TRADE_FINISH); - // 浵 ȯ ϰ ִٸ, ȯ ϵ Ѵ. + // 상대방도 교환을 허락하고 있다면, 실제로 교환을 하도록 한다. if (pInfo2->getStatus() == TRADE_FINISH) { - // Ȯ ȯ ִٸ ȯ Ѵ. - // cout << "CGTradeFinish [" << pReceiver->getName() << "] µ TRADE_FINISH̹Ƿ, ȯ Ѵ." << + // 확실히 교환을 할 수 있다면 교환을 한다. + // cout << "CGTradeFinish [" << pReceiver->getName() << "]의 상태도 TRADE_FINISH이므로, 교환을 수행한다." << // endl; if (pTradeManager->canTrade(pSender, pReceiver) == 1) { - // ȯ ϶ Ŷ ش. + // 양 측에 교환을 수행하라는 패킷을 날려준다. gcTradeFinish.setTargetObjectID(pSender->getObjectID()); gcTradeFinish.setCode(GC_TRADE_FINISH_EXECUTE); pTargetPlayer->sendPacket(&gcTradeFinish); @@ -327,7 +327,7 @@ void CGTradeFinishHandler::executeVampire(CGTradeFinish* pPacket, Player* pPlaye gcTradeFinish.setCode(GC_TRADE_FINISH_EXECUTE); pPlayer->sendPacket(&gcTradeFinish); - // ȯ Ѵ. + // 실제로 교환을 수행한다. pTradeManager->processTrade(pSender, pReceiver); } else if (pTradeManager->canTrade(pSender, pReceiver) == 2) { pTradeManager->cancelTrade(pPC); @@ -340,49 +340,49 @@ void CGTradeFinishHandler::executeVampire(CGTradeFinish* pPacket, Player* pPlaye } } } - // ȯ źϴ ڵ. + // 교환을 거부하는 코드다. else if (CODE == CG_TRADE_FINISH_REJECT) { - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // Ŷ ش. + // 인증 패킷을 날려준다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_FINISH_REJECT); pPlayer->sendPacket(&gcTradeVerify); } - // ȯ ҽŲ. + // 교환을 취소시킨다. pTradeManager->cancelTrade(pSender, pReceiver); - // ȯ ҵǾٴ 濡 ˷ش. + // 교환이 취소되었다는 것을 상대방에게 알려준다. gcTradeFinish.setTargetObjectID(pSender->getObjectID()); gcTradeFinish.setCode(GC_TRADE_FINISH_REJECT); pTargetPlayer->sendPacket(&gcTradeFinish); } - // ȯ ϴ ڵ. + // 교환을 재고려하는 코드다. else if (CODE == CG_TRADE_FINISH_RECONSIDER) { - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // Ŷ ش. + // 인증 패킷을 날려준다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_FINISH_RECONSIDER); pPlayer->sendPacket(&gcTradeVerify); } - // ȯ ¸ ȯѴ. + // 교환 상태를 변환한다. pInfo1->setStatus(TRADE_TRADING); - // OK ٰ cancel , 4 OK ٽ ƿͼ - // ȴ. ׷Ƿ ⼭ ð ش. + // OK를 눌렀다가 cancel을 누르면, 다음 4초 동안은 OK가 다시 날아와서는 + // 안 된다. 그러므로 여기서 시간을 세팅해 준다. pInfo1->setNextTime(currentTime); - // ȯ Ǿٴ 濡 ˷ش. + // 교환이 재고려되었다는 것을 상대방에게 알려준다. gcTradeFinish.setTargetObjectID(pSender->getObjectID()); gcTradeFinish.setCode(GC_TRADE_FINISH_RECONSIDER); pTargetPlayer->sendPacket(&gcTradeFinish); } - // ˼ ڵ. ϰ ©ش. + // 알수 없는 코드다. 사뿐하게 짤라준다. else - throw ProtocolException("CGTradeFinish::executeVampire() : ڵ"); + throw ProtocolException("CGTradeFinish::executeVampire() : 알 수 없는 코드"); #endif @@ -398,8 +398,8 @@ void CGTradeFinishHandler::executeOusters(CGTradeFinish* pPacket, Player* pPlaye #ifdef __GAME_SERVER__ - // Լ ˻߱ , - // ⼭ Ͱ ˻ ʴ´. + // 상위 함수에서 에러를 검사했기 때문에, + // 여기서는 포인터가 널인지를 검사하지 않는다. ObjectID_t TargetOID = pPacket->getTargetObjectID(); BYTE CODE = pPacket->getCode(); GamePlayer* pGamePlayer = dynamic_cast(pPlayer); @@ -407,7 +407,7 @@ void CGTradeFinishHandler::executeOusters(CGTradeFinish* pPacket, Player* pPlaye Zone* pZone = pPC->getZone(); Creature* pTargetPC = pZone->getCreature(TargetOID); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetPC == NULL) return; @@ -422,34 +422,34 @@ void CGTradeFinishHandler::executeOusters(CGTradeFinish* pPacket, Player* pPlaye Player* pTargetPlayer = pTargetPC->getPlayer(); GCTradeFinish gcTradeFinish; - // ð ´. + // 현재 시간을 얻어온다. Timeval currentTime; getCurrentTime(currentTime); - // ȯ ³ϴ ڵ. + // 교환을 승낙하는 코드다. if (CODE == CG_TRADE_FINISH_ACCEPT) { - // OK ƿ ð ƴ϶ . + // OK가 날아올 시간이 아니라면 에러다. if (pInfo1->isValidOKTime(currentTime) == false) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_UNKNOWN); return; } - // ȯ ³ߴٴ 濡 ˷ش. + // 교환을 승낙했다는 것을 상대방에게 알려준다. gcTradeFinish.setTargetObjectID(pSender->getObjectID()); gcTradeFinish.setCode(GC_TRADE_FINISH_ACCEPT); pTargetPlayer->sendPacket(&gcTradeFinish); - // ȯ ¸ ȯѴ. + // 교환 상태를 변환한다. pInfo1->setStatus(TRADE_FINISH); - // 浵 ȯ ϰ ִٸ, ȯ ϵ Ѵ. + // 상대방도 교환을 허락하고 있다면, 실제로 교환을 하도록 한다. if (pInfo2->getStatus() == TRADE_FINISH) { - // Ȯ ȯ ִٸ ȯ Ѵ. - // cout << "CGTradeFinish [" << pReceiver->getName() << "] µ TRADE_FINISH̹Ƿ, ȯ Ѵ." << + // 확실히 교환을 할 수 있다면 교환을 한다. + // cout << "CGTradeFinish [" << pReceiver->getName() << "]의 상태도 TRADE_FINISH이므로, 교환을 수행한다." << // endl; if (pTradeManager->canTrade(pSender, pReceiver) == 1) { - // ȯ ϶ Ŷ ش. + // 양 측에 교환을 수행하라는 패킷을 날려준다. gcTradeFinish.setTargetObjectID(pSender->getObjectID()); gcTradeFinish.setCode(GC_TRADE_FINISH_EXECUTE); pTargetPlayer->sendPacket(&gcTradeFinish); @@ -458,7 +458,7 @@ void CGTradeFinishHandler::executeOusters(CGTradeFinish* pPacket, Player* pPlaye gcTradeFinish.setCode(GC_TRADE_FINISH_EXECUTE); pPlayer->sendPacket(&gcTradeFinish); - // ȯ Ѵ. + // 실제로 교환을 수행한다. pTradeManager->processTrade(pSender, pReceiver); } else if (pTradeManager->canTrade(pSender, pReceiver) == 2) { pTradeManager->cancelTrade(pPC); @@ -471,49 +471,49 @@ void CGTradeFinishHandler::executeOusters(CGTradeFinish* pPacket, Player* pPlaye } } } - // ȯ źϴ ڵ. + // 교환을 거부하는 코드다. else if (CODE == CG_TRADE_FINISH_REJECT) { - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // Ŷ ش. + // 인증 패킷을 날려준다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_FINISH_REJECT); pPlayer->sendPacket(&gcTradeVerify); } - // ȯ ҽŲ. + // 교환을 취소시킨다. pTradeManager->cancelTrade(pSender, pReceiver); - // ȯ ҵǾٴ 濡 ˷ش. + // 교환이 취소되었다는 것을 상대방에게 알려준다. gcTradeFinish.setTargetObjectID(pSender->getObjectID()); gcTradeFinish.setCode(GC_TRADE_FINISH_REJECT); pTargetPlayer->sendPacket(&gcTradeFinish); } - // ȯ ϴ ڵ. + // 교환을 재고려하는 코드다. else if (CODE == CG_TRADE_FINISH_RECONSIDER) { - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // Ŷ ش. + // 인증 패킷을 날려준다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_FINISH_RECONSIDER); pPlayer->sendPacket(&gcTradeVerify); } - // ȯ ¸ ȯѴ. + // 교환 상태를 변환한다. pInfo1->setStatus(TRADE_TRADING); - // OK ٰ cancel , 4 OK ٽ ƿͼ - // ȴ. ׷Ƿ ⼭ ð ش. + // OK를 눌렀다가 cancel을 누르면, 다음 4초 동안은 OK가 다시 날아와서는 + // 안 된다. 그러므로 여기서 시간을 세팅해 준다. pInfo1->setNextTime(currentTime); - // ȯ Ǿٴ 濡 ˷ش. + // 교환이 재고려되었다는 것을 상대방에게 알려준다. gcTradeFinish.setTargetObjectID(pSender->getObjectID()); gcTradeFinish.setCode(GC_TRADE_FINISH_RECONSIDER); pTargetPlayer->sendPacket(&gcTradeFinish); } - // ˼ ڵ. ϰ ©ش. + // 알수 없는 코드다. 사뿐하게 짤라준다. else - throw ProtocolException("CGTradeFinish::executeOusters() : ڵ"); + throw ProtocolException("CGTradeFinish::executeOusters() : 알 수 없는 코드"); #endif diff --git a/src/Core/CGTradeMoney.cpp b/src/Core/CGTradeMoney.cpp index fd0170df..7a458d12 100644 --- a/src/Core/CGTradeMoney.cpp +++ b/src/Core/CGTradeMoney.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGTradeMoney.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGTradeMoney.h b/src/Core/CGTradeMoney.h index 1cf516aa..7649484e 100644 --- a/src/Core/CGTradeMoney.h +++ b/src/Core/CGTradeMoney.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CGTradeMoney.h -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -11,14 +11,14 @@ #include "PacketFactory.h" //////////////////////////////////////////////////////////////////////////////// -// ȯ ڵ +// 교환 코드 //////////////////////////////////////////////////////////////////////////////// enum { - // ȯ ׼ ø. + // 교환할 돈의 액수를 늘린다. CG_TRADE_MONEY_INCREASE = 0, - // ȯ ׼ δ. + // 교환할 돈의 액수를 줄인다. CG_TRADE_MONEY_DECREASE }; @@ -69,9 +69,9 @@ class CGTradeMoney : public Packet { } private: - ObjectID_t m_TargetObjectID; // ȯ ϴ ObjectID - Gold_t m_Gold; // ϴ ׼ - BYTE m_Code; // ڵ + ObjectID_t m_TargetObjectID; // 교환을 원하는 상대방의 ObjectID + Gold_t m_Gold; // 원하는 액수 + BYTE m_Code; // 코드 }; diff --git a/src/Core/CGTradeMoneyHandler.cpp b/src/Core/CGTradeMoneyHandler.cpp index f1ea701e..9bd4d77e 100644 --- a/src/Core/CGTradeMoneyHandler.cpp +++ b/src/Core/CGTradeMoneyHandler.cpp @@ -48,31 +48,31 @@ void CGTradeMoneyHandler::execute(CGTradeMoney* pPacket, Player* pPlayer) catch (NoSuchElementException) { pTargetPC = NULL; } */ - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 pTargetPC = pZone->getCreature(TargetOID); - // ȯ 밡 ٸ . + // 교환 상대가 없다면 에러다. if (pTargetPC == NULL) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_TARGET_NOT_EXIST); return; } - // ȯ 밡 ƴϰų, . + // 교환 상대가 사람이 아니거나, 같은 종족이 에러다. if (!pTargetPC->isPC() || !isSameRace(pTargetPC, pPC)) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_RACE_DIFFER); return; } - // 뿡 ִ üũ Ѵ. + // 둘 다 안전 지대에 있는지 체크를 한다. if (!isInSafeZone(pPC) || !isInSafeZone(pTargetPC)) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_NOT_SAFE); return; } - // ̸ Ÿ ִٸ . + // 오토바이를 타고 있다면 에러다. if (pPC->isSlayer() && pTargetPC->isSlayer()) { Slayer* pSlayer1 = dynamic_cast(pPC); Slayer* pSlayer2 = dynamic_cast(pTargetPC); @@ -96,7 +96,7 @@ void CGTradeMoneyHandler::execute(CGTradeMoney* pPacket, Player* pPlayer) } } - // ̼ ȯ ϰ ִ ° ƴ϶ . + // 둘이서 교환을 하고 있는 상태가 아니라면 에러다. if (!pTradeManager->isTrading(pPC, pTargetPC)) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_NOT_TRADING); @@ -110,7 +110,7 @@ void CGTradeMoneyHandler::execute(CGTradeMoney* pPacket, Player* pPlayer) else if (pPC->isOusters()) executeOusters(pPacket, pPlayer); else - throw ProtocolException("CGTradeMoney::execute() : ÷̾ ũ"); + throw ProtocolException("CGTradeMoney::execute() : 알 수 없는 플레이어 크리쳐"); #endif @@ -126,8 +126,8 @@ void CGTradeMoneyHandler::executeSlayer(CGTradeMoney* pPacket, Player* pPlayer) #ifdef __GAME_SERVER__ - // Լ ˻縦 ߱ , - // ⼭ Ͱ ˻ ʴ´. + // 상위 함수에서 검사를 했기 때문에, + // 여기서는 포인터가 널인지를 검사하지 않는다. ObjectID_t TargetOID = pPacket->getTargetObjectID(); Gold_t Amount = pPacket->getAmount(); BYTE Code = pPacket->getCode(); @@ -136,7 +136,7 @@ void CGTradeMoneyHandler::executeSlayer(CGTradeMoney* pPacket, Player* pPlayer) Zone* pZone = pPC->getZone(); Creature* pTargetPC = pZone->getCreature(TargetOID); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetPC == NULL) return; @@ -151,45 +151,45 @@ void CGTradeMoneyHandler::executeSlayer(CGTradeMoney* pPacket, Player* pPlayer) TradeManager* pTradeManager = pZone->getTradeManager(); Assert(pTradeManager != NULL); - // ȯ ° ´ üũ غѴ. + // 교환 상태가 맞는지 체크를 해봐야한다. TradeInfo* pInfo1 = pTradeManager->getTradeInfo(pSender->getName()); TradeInfo* pInfo2 = pTradeManager->getTradeInfo(pReceiver->getName()); - // κ丮 , ȯâ Ѵ. + // 인벤토리에서 돈을 덜어, 교환창에다 더한다. if (Code == CG_TRADE_MONEY_INCREASE) { - // ȯâ ׼ ־ Ѵ. + // 교환창에다 더할 액수보다 많은 돈을 가지고 있어야 한다. if (pSender->getGold() >= Amount) { - // ޴ ƽ ʰϰ ȴٸ, Ϻθ ־ Ѵ. - // ȯ ؼ . by sigi. 2003.1.8 + // 돈을 받는 쪽이 맥스를 초과하게 된다면, 일부만 넣어줘야 한다. + // 현재 교환 예정인 돈도 더해서 계산. by sigi. 2003.1.8 Gold_t receiverGold = pReceiver->getGold() + pInfo1->getGold(); if (receiverGold + Amount > MAX_MONEY) { margin = receiverGold + Amount - MAX_MONEY; finalAmount = finalAmount - margin; } - // κ丮 , ȯâ Ѵ. + // 인벤토리에서 돈을 빼고, 교환창에다 더한다. pSender->setGold(pSender->getGold() - finalAmount); pInfo1->setGold(pInfo1->getGold() + finalAmount); - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // Ŷ ش. + // 인증 패킷을 날려준다. gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_MONEY_INCREASE); pPlayer->sendPacket(&gcTradeVerify); } - // ϰų , ¸ ȯ Ѵ. + // 아이템을 더하거나 뺄 경우, 상태를 변환해줘야 한다. pInfo1->setStatus(TRADE_TRADING); pInfo2->setStatus(TRADE_TRADING); - // ø ڿ κ丮 - // ݾ ش. + // 돈을 올린 당사자에게 실제로 인벤토리에서 + // 빠진 금액이 얼마인지 보내준다. gcTradeMoney.setTargetObjectID(TargetOID); gcTradeMoney.setCode(GC_TRADE_MONEY_INCREASE_RESULT); gcTradeMoney.setAmount(finalAmount); pPlayer->sendPacket(&gcTradeMoney); - // 濡 ٲ ش. + // 상대방에게 바뀐 정보를 보내준다. gcTradeMoney.setTargetObjectID(pSender->getObjectID()); gcTradeMoney.setCode(GC_TRADE_MONEY_INCREASE); gcTradeMoney.setAmount(finalAmount); @@ -200,40 +200,40 @@ void CGTradeMoneyHandler::executeSlayer(CGTradeMoney* pPacket, Player* pPlayer) return; } } - // ȯâ , κ丮ٰ Ѵ. + // 교환창에서 돈을 덜어, 인벤토리에다가 더한다. else if (Code == CG_TRADE_MONEY_DECREASE) { - // κ丮 ׼ ȯâ ִ ƾ Ѵ. + // 인벤토리에다 더할 액수보다 교환창에 있는 돈이 많아야 한다. if (pInfo1->getGold() >= Amount) { - // ƽ ʰϰ ȴٸ, Ϻθ ִ. + // 돈이 맥스를 초과하게 된다면, 일부만 뺄 수 있다. Gold_t senderGold = pSender->getGold() + pInfo2->getGold(); if (senderGold + Amount > MAX_MONEY) { margin = senderGold + Amount - MAX_MONEY; finalAmount = finalAmount - margin; } - // κ丮ٰ ϰ, ȯâ . + // 인벤토리에다가 돈을 더하고, 교환창에서 돈을 뺀다. pSender->setGold(pSender->getGold() + finalAmount); pInfo1->setGold(pInfo1->getGold() - finalAmount); - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // Ŷ ش. + // 인증 패킷을 날려준다. gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_MONEY_DECREASE); pPlayer->sendPacket(&gcTradeVerify); } - // ϰų , ¸ ȯ Ѵ. + // 아이템을 더하거나 뺄 경우, 상태를 변환해줘야 한다. pInfo1->setStatus(TRADE_TRADING); pInfo2->setStatus(TRADE_TRADING); - // ø ڿ κ丮 - // ݾ ش. + // 돈을 올린 당사자에게 실제로 인벤토리에다 + // 더한 금액이 얼마인지 보내준다. gcTradeMoney.setTargetObjectID(TargetOID); gcTradeMoney.setCode(GC_TRADE_MONEY_DECREASE_RESULT); gcTradeMoney.setAmount(finalAmount); pPlayer->sendPacket(&gcTradeMoney); - // 濡 ٲ ش. + // 상대방에게 바뀐 정보를 보내준다. gcTradeMoney.setTargetObjectID(pSender->getObjectID()); gcTradeMoney.setCode(GC_TRADE_MONEY_DECREASE); gcTradeMoney.setAmount(finalAmount); @@ -259,8 +259,8 @@ void CGTradeMoneyHandler::executeVampire(CGTradeMoney* pPacket, Player* pPlayer) #ifdef __GAME_SERVER__ - // Լ ˻縦 ߱ , - // ⼭ Ͱ ˻ ʴ´. + // 상위 함수에서 검사를 했기 때문에, + // 여기서는 포인터가 널인지를 검사하지 않는다. ObjectID_t TargetOID = pPacket->getTargetObjectID(); Gold_t Amount = pPacket->getAmount(); BYTE Code = pPacket->getCode(); @@ -269,7 +269,7 @@ void CGTradeMoneyHandler::executeVampire(CGTradeMoney* pPacket, Player* pPlayer) Zone* pZone = pPC->getZone(); Creature* pTargetPC = pZone->getCreature(TargetOID); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetPC == NULL) return; @@ -284,45 +284,45 @@ void CGTradeMoneyHandler::executeVampire(CGTradeMoney* pPacket, Player* pPlayer) TradeManager* pTradeManager = pZone->getTradeManager(); Assert(pTradeManager != NULL); - // ȯ ° ´ üũ غѴ. + // 교환 상태가 맞는지 체크를 해봐야한다. TradeInfo* pInfo1 = pTradeManager->getTradeInfo(pSender->getName()); TradeInfo* pInfo2 = pTradeManager->getTradeInfo(pReceiver->getName()); - // κ丮 , ȯâ Ѵ. + // 인벤토리에서 돈을 덜어, 교환창에다 더한다. if (Code == CG_TRADE_MONEY_INCREASE) { - // ȯâ ׼ ־ Ѵ. + // 교환창에다 더할 액수보다 많은 돈을 가지고 있어야 한다. if (pSender->getGold() >= Amount) { - // ޴ ƽ ʰϰ ȴٸ, Ϻθ ־ Ѵ. - // ȯ ؼ . by sigi. 2003.1.8 + // 돈을 받는 쪽이 맥스를 초과하게 된다면, 일부만 넣어줘야 한다. + // 현재 교환 예정인 돈도 더해서 계산. by sigi. 2003.1.8 Gold_t receiverGold = pReceiver->getGold() + pInfo1->getGold(); if (receiverGold + Amount > MAX_MONEY) { margin = receiverGold + Amount - MAX_MONEY; finalAmount = finalAmount - margin; } - // κ丮 , ȯâ Ѵ. + // 인벤토리에서 돈을 빼고, 교환창에다 더한다. pSender->setGold(pSender->getGold() - finalAmount); pInfo1->setGold(pInfo1->getGold() + finalAmount); - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // Ŷ ش. + // 인증 패킷을 날려준다. gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_MONEY_INCREASE); pPlayer->sendPacket(&gcTradeVerify); } - // ϰų , ¸ ȯ Ѵ. + // 아이템을 더하거나 뺄 경우, 상태를 변환해줘야 한다. pInfo1->setStatus(TRADE_TRADING); pInfo2->setStatus(TRADE_TRADING); - // ø ڿ κ丮 - // ݾ ش. + // 돈을 올린 당사자에게 실제로 인벤토리에서 + // 빠진 금액이 얼마인지 보내준다. gcTradeMoney.setTargetObjectID(TargetOID); gcTradeMoney.setCode(GC_TRADE_MONEY_INCREASE_RESULT); gcTradeMoney.setAmount(finalAmount); pPlayer->sendPacket(&gcTradeMoney); - // 濡 ٲ ش. + // 상대방에게 바뀐 정보를 보내준다. gcTradeMoney.setTargetObjectID(pSender->getObjectID()); gcTradeMoney.setCode(GC_TRADE_MONEY_INCREASE); gcTradeMoney.setAmount(finalAmount); @@ -333,40 +333,40 @@ void CGTradeMoneyHandler::executeVampire(CGTradeMoney* pPacket, Player* pPlayer) return; } } - // ȯâ , κ丮ٰ Ѵ. + // 교환창에서 돈을 덜어, 인벤토리에다가 더한다. else if (Code == CG_TRADE_MONEY_DECREASE) { - // κ丮 ׼ ȯâ ִ ƾ Ѵ. + // 인벤토리에다 더할 액수보다 교환창에 있는 돈이 많아야 한다. if (pInfo1->getGold() >= Amount) { - // ƽ ʰϰ ȴٸ, Ϻθ ִ. + // 돈이 맥스를 초과하게 된다면, 일부만 뺄 수 있다. Gold_t senderGold = pSender->getGold() + pInfo2->getGold(); if (senderGold + Amount > MAX_MONEY) { margin = senderGold + Amount - MAX_MONEY; finalAmount = finalAmount - margin; } - // κ丮ٰ ϰ, ȯâ . + // 인벤토리에다가 돈을 더하고, 교환창에서 돈을 뺀다. pSender->setGold(pSender->getGold() + finalAmount); pInfo1->setGold(pInfo1->getGold() - finalAmount); - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // Ŷ ش. + // 인증 패킷을 날려준다. gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_MONEY_DECREASE); pPlayer->sendPacket(&gcTradeVerify); } - // ϰų , ¸ ȯ Ѵ. + // 아이템을 더하거나 뺄 경우, 상태를 변환해줘야 한다. pInfo1->setStatus(TRADE_TRADING); pInfo2->setStatus(TRADE_TRADING); - // ø ڿ κ丮 - // ݾ ش. + // 돈을 올린 당사자에게 실제로 인벤토리에다 + // 더한 금액이 얼마인지 보내준다. gcTradeMoney.setTargetObjectID(TargetOID); gcTradeMoney.setCode(GC_TRADE_MONEY_DECREASE_RESULT); gcTradeMoney.setAmount(finalAmount); pPlayer->sendPacket(&gcTradeMoney); - // 濡 ٲ ش. + // 상대방에게 바뀐 정보를 보내준다. gcTradeMoney.setTargetObjectID(pSender->getObjectID()); gcTradeMoney.setCode(GC_TRADE_MONEY_DECREASE); gcTradeMoney.setAmount(finalAmount); @@ -393,8 +393,8 @@ void CGTradeMoneyHandler::executeOusters(CGTradeMoney* pPacket, Player* pPlayer) #ifdef __GAME_SERVER__ - // Լ ˻縦 ߱ , - // ⼭ Ͱ ˻ ʴ´. + // 상위 함수에서 검사를 했기 때문에, + // 여기서는 포인터가 널인지를 검사하지 않는다. ObjectID_t TargetOID = pPacket->getTargetObjectID(); Gold_t Amount = pPacket->getAmount(); BYTE Code = pPacket->getCode(); @@ -403,7 +403,7 @@ void CGTradeMoneyHandler::executeOusters(CGTradeMoney* pPacket, Player* pPlayer) Zone* pZone = pPC->getZone(); Creature* pTargetPC = pZone->getCreature(TargetOID); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetPC == NULL) return; @@ -418,45 +418,45 @@ void CGTradeMoneyHandler::executeOusters(CGTradeMoney* pPacket, Player* pPlayer) TradeManager* pTradeManager = pZone->getTradeManager(); Assert(pTradeManager != NULL); - // ȯ ° ´ üũ غѴ. + // 교환 상태가 맞는지 체크를 해봐야한다. TradeInfo* pInfo1 = pTradeManager->getTradeInfo(pSender->getName()); TradeInfo* pInfo2 = pTradeManager->getTradeInfo(pReceiver->getName()); - // κ丮 , ȯâ Ѵ. + // 인벤토리에서 돈을 덜어, 교환창에다 더한다. if (Code == CG_TRADE_MONEY_INCREASE) { - // ȯâ ׼ ־ Ѵ. + // 교환창에다 더할 액수보다 많은 돈을 가지고 있어야 한다. if (pSender->getGold() >= Amount) { - // ޴ ƽ ʰϰ ȴٸ, Ϻθ ־ Ѵ. - // ȯ ؼ . by sigi. 2003.1.8 + // 돈을 받는 쪽이 맥스를 초과하게 된다면, 일부만 넣어줘야 한다. + // 현재 교환 예정인 돈도 더해서 계산. by sigi. 2003.1.8 Gold_t receiverGold = pReceiver->getGold() + pInfo1->getGold(); if (receiverGold + Amount > MAX_MONEY) { margin = receiverGold + Amount - MAX_MONEY; finalAmount = finalAmount - margin; } - // κ丮 , ȯâ Ѵ. + // 인벤토리에서 돈을 빼고, 교환창에다 더한다. pSender->setGold(pSender->getGold() - finalAmount); pInfo1->setGold(pInfo1->getGold() + finalAmount); - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // Ŷ ش. + // 인증 패킷을 날려준다. gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_MONEY_INCREASE); pPlayer->sendPacket(&gcTradeVerify); } - // ϰų , ¸ ȯ Ѵ. + // 아이템을 더하거나 뺄 경우, 상태를 변환해줘야 한다. pInfo1->setStatus(TRADE_TRADING); pInfo2->setStatus(TRADE_TRADING); - // ø ڿ κ丮 - // ݾ ش. + // 돈을 올린 당사자에게 실제로 인벤토리에서 + // 빠진 금액이 얼마인지 보내준다. gcTradeMoney.setTargetObjectID(TargetOID); gcTradeMoney.setCode(GC_TRADE_MONEY_INCREASE_RESULT); gcTradeMoney.setAmount(finalAmount); pPlayer->sendPacket(&gcTradeMoney); - // 濡 ٲ ش. + // 상대방에게 바뀐 정보를 보내준다. gcTradeMoney.setTargetObjectID(pSender->getObjectID()); gcTradeMoney.setCode(GC_TRADE_MONEY_INCREASE); gcTradeMoney.setAmount(finalAmount); @@ -467,40 +467,40 @@ void CGTradeMoneyHandler::executeOusters(CGTradeMoney* pPacket, Player* pPlayer) return; } } - // ȯâ , κ丮ٰ Ѵ. + // 교환창에서 돈을 덜어, 인벤토리에다가 더한다. else if (Code == CG_TRADE_MONEY_DECREASE) { - // κ丮 ׼ ȯâ ִ ƾ Ѵ. + // 인벤토리에다 더할 액수보다 교환창에 있는 돈이 많아야 한다. if (pInfo1->getGold() >= Amount) { - // ƽ ʰϰ ȴٸ, Ϻθ ִ. + // 돈이 맥스를 초과하게 된다면, 일부만 뺄 수 있다. Gold_t senderGold = pSender->getGold() + pInfo2->getGold(); if (senderGold + Amount > MAX_MONEY) { margin = senderGold + Amount - MAX_MONEY; finalAmount = finalAmount - margin; } - // κ丮ٰ ϰ, ȯâ . + // 인벤토리에다가 돈을 더하고, 교환창에서 돈을 뺀다. pSender->setGold(pSender->getGold() + finalAmount); pInfo1->setGold(pInfo1->getGold() - finalAmount); - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // Ŷ ش. + // 인증 패킷을 날려준다. gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_MONEY_DECREASE); pPlayer->sendPacket(&gcTradeVerify); } - // ϰų , ¸ ȯ Ѵ. + // 아이템을 더하거나 뺄 경우, 상태를 변환해줘야 한다. pInfo1->setStatus(TRADE_TRADING); pInfo2->setStatus(TRADE_TRADING); - // ø ڿ κ丮 - // ݾ ش. + // 돈을 올린 당사자에게 실제로 인벤토리에다 + // 더한 금액이 얼마인지 보내준다. gcTradeMoney.setTargetObjectID(TargetOID); gcTradeMoney.setCode(GC_TRADE_MONEY_DECREASE_RESULT); gcTradeMoney.setAmount(finalAmount); pPlayer->sendPacket(&gcTradeMoney); - // 濡 ٲ ش. + // 상대방에게 바뀐 정보를 보내준다. gcTradeMoney.setTargetObjectID(pSender->getObjectID()); gcTradeMoney.setCode(GC_TRADE_MONEY_DECREASE); gcTradeMoney.setAmount(finalAmount); diff --git a/src/Core/CGTradePrepare.h b/src/Core/CGTradePrepare.h index 7e60ee6b..027262ac 100644 --- a/src/Core/CGTradePrepare.h +++ b/src/Core/CGTradePrepare.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CGTradePrepare.h -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -11,23 +11,23 @@ #include "PacketFactory.h" //////////////////////////////////////////////////////////////////////////////// -// ȯ ڵ +// 교환 코드 //////////////////////////////////////////////////////////////////////////////// enum { - // ó ȯ ϴ ÷̾ ڵ Ŷ . + // 제일 처음 교환을 원하는 플레이어가 이 코드로 패킷을 날린다. CG_TRADE_PREPARE_CODE_REQUEST = 0, - // ó ȯ û ÷̾ Ҹ ߴ. + // 제일 처음 교환을 요청한 플레이어가 취소를 했다. CG_TRADE_PREPARE_CODE_CANCEL, - // ȯ û ÷̾ ȯ + // 교환을 요청받은 플레이어가 교환에 응할 경우 CG_TRADE_PREPARE_CODE_ACCEPT, - // ȯ û ÷̾ ȯ + // 교환을 요청받은 플레이어가 교환에 응하지 않을 경우 CG_TRADE_PREPARE_CODE_REJECT, - // ȯ û ÷̾ ȯ + // 교환을 요청받은 플레이어가 지금 교환을 할 수 없는 경우 CG_TRADE_PREPARE_CODE_BUSY, CG_TRADE_PREPARE_CODE_MAX @@ -73,8 +73,8 @@ class CGTradePrepare : public Packet { } private: - ObjectID_t m_TargetObjectID; // ȯ ϴ OID - BYTE m_Code; // ȯ ڵ + ObjectID_t m_TargetObjectID; // 교환을 원하는 상대방의 OID + BYTE m_Code; // 교환 코드 }; diff --git a/src/Core/CGTradePrepareHandler.cpp b/src/Core/CGTradePrepareHandler.cpp index bf322030..a8ff4af8 100644 --- a/src/Core/CGTradePrepareHandler.cpp +++ b/src/Core/CGTradePrepareHandler.cpp @@ -45,25 +45,25 @@ void CGTradePrepareHandler::execute(CGTradePrepare* pPacket, Player* pPlayer) TradeManager* pTradeManager = pZone->getTradeManager(); Assert(pTradeManager != NULL); - // ȯ ڸ ãƺ. + // 교환 상대자를 존에서 찾아본다. Creature* pReceiver = NULL; /* try { pReceiver = pZone->getCreature(TargetOID); } catch (NoSuchElementException) { pReceiver = NULL; } */ - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 pReceiver = pZone->getCreature(TargetOID); - // ȯ ʴ´ٸ 翬 ȯ . + // 교환을 할 놈이 존재하지 않는다면 당연히 교환할 수 없다. if (pReceiver == NULL) { pTradeManager->cancelTrade(pSender); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_TARGET_NOT_EXIST); return; } - // ȯ ̸ ٸ, ij̶ ߶. - // ̷ 찡 ߻ߴ. ... 2002-03-04 輺 + // 교환을 할 놈과 받을 놈의 이름이 같다면, 즉 같은 캐릭이라면 접속을 잘라버린다. + // 실제로 이런 경우가 발생했다. 듀얼 접속인 것 같은데... 2002-03-04 김성민 if (pSender->getName() == pReceiver->getName()) { StringStream msg; msg << "CGTradePrepare : Error, Same Creature!!! Name[" << pSender->getName() << "]"; @@ -71,21 +71,21 @@ void CGTradePrepareHandler::execute(CGTradePrepare* pPacket, Player* pPlayer) throw ProtocolException(msg.toString()); } - // ȯ PC ƴϰų, ٸٸ ȯ . + // 교환을 할 놈이 PC가 아니거나, 종족이 다르다면 교환을 할 수가 없다. if (!pReceiver->isPC() || !isSameRace(pSender, pReceiver)) { pTradeManager->cancelTrade(pSender); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_RACE_DIFFER); return; } - // 뿡 ִ üũ Ѵ. + // 둘 다 안전 지대에 있는지 체크를 한다. if (!isInSafeZone(pSender) || !isInSafeZone(pReceiver)) { pTradeManager->cancelTrade(pSender); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_NOT_SAFE); return; } - // ̸ Ÿ ִٸ . + // 오토바이를 타고 있다면 에러다. if (pSender->isSlayer() && pReceiver->isSlayer()) { Slayer* pSlayer1 = dynamic_cast(pSender); Slayer* pSlayer2 = dynamic_cast(pReceiver); @@ -113,22 +113,22 @@ void CGTradePrepareHandler::execute(CGTradePrepare* pPacket, Player* pPlayer) TradeInfo* pInfo2 = pTradeManager->getTradeInfo(pReceiver->getName()); Player* pReceiverPlayer = pReceiver->getPlayer(); - // A B ȯ ó 䱸ߴ... + // A가 B에게 교환을 제일 처음 요구했다... switch (CODE) { //////////////////////////////////////////////////////////// - // A B ȯ 䱸Ƿ, - // B A ȯ 䱸ϰ ִٴ ˷ش. + // A가 B에게 교환을 요구했으므로, + // B에게 A가 교환을 요구하고 있다는 사실을 알려준다. //////////////////////////////////////////////////////////// case CG_TRADE_PREPARE_CODE_REQUEST: - // ȯ 䱸 ȯ ̶... -_- + // 교환을 요구한 놈이 교환 중이라면... -_- if (pInfo1 != NULL) { pTradeManager->cancelTrade(pSender); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_ALREADY_TRADING); return; } - // ȯ 䱸 ȯ ̶, - // ٻڴϱ ȯ . + // 교환을 요구받은 놈이 교환 중이라면, + // 바쁘니까 교환에 응할 수 없다. if (pInfo2 != NULL) { gcTradePrepare.setTargetObjectID(pPacket->getTargetObjectID()); gcTradePrepare.setCode(GC_TRADE_PREPARE_CODE_BUSY); @@ -136,24 +136,24 @@ void CGTradePrepareHandler::execute(CGTradePrepare* pPacket, Player* pPlayer) return; } - // Ŷ ش. + // 패킷을 보내준다. gcTradePrepare.setTargetObjectID(pSender->getObjectID()); gcTradePrepare.setCode(GC_TRADE_PREPARE_CODE_REQUEST); pReceiverPlayer->sendPacket(&gcTradePrepare); - // ȯ Ƿ, TradeInfo ش. + // 둘 다 교환 모드로 들어갔으므로, TradeInfo를 생성해 준다. pTradeManager->initTrade(pSender, pReceiver); break; //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// case CG_TRADE_PREPARE_CODE_CANCEL: - // ȯ üũѴ. + // 교환 중인지를 체크한다. if (pTradeManager->isTrading(pSender, pReceiver)) { gcTradePrepare.setTargetObjectID(pSender->getObjectID()); gcTradePrepare.setCode(GC_TRADE_PREPARE_CODE_CANCEL); pReceiverPlayer->sendPacket(&gcTradePrepare); - // ȯ źǷ, TradeInfo ش. + // 교환을 거부했으므로, TradeInfo를 삭제해 준다. pTradeManager->cancelTrade(pSender, pReceiver); } else { executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_NOT_TRADING); @@ -162,10 +162,10 @@ void CGTradePrepareHandler::execute(CGTradePrepare* pPacket, Player* pPlayer) break; //////////////////////////////////////////////////////////// - // B ȯ Ѵٴ A ˷ش. + // B가 교환에 응한다는 사실을 A에게 알려준다. //////////////////////////////////////////////////////////// case CG_TRADE_PREPARE_CODE_ACCEPT: - // ȯ üũѴ. + // 교환 중인지를 체크한다. if (pTradeManager->isTrading(pSender, pReceiver)) { gcTradePrepare.setTargetObjectID(pSender->getObjectID()); gcTradePrepare.setCode(GC_TRADE_PREPARE_CODE_ACCEPT); @@ -177,15 +177,15 @@ void CGTradePrepareHandler::execute(CGTradePrepare* pPacket, Player* pPlayer) break; //////////////////////////////////////////////////////////// - // B ȯ źѴٴ A ˷ش. + // B가 교환을 거부한다는 사실을 A에게 알려준다. //////////////////////////////////////////////////////////// case CG_TRADE_PREPARE_CODE_REJECT: - // ȯ üũѴ. + // 교환 중인지를 체크한다. if (pTradeManager->isTrading(pSender, pReceiver)) { gcTradePrepare.setTargetObjectID(pSender->getObjectID()); gcTradePrepare.setCode(GC_TRADE_PREPARE_CODE_REJECT); pReceiverPlayer->sendPacket(&gcTradePrepare); - // ȯ źǷ, TradeInfo ش. + // 교환을 거부했으므로, TradeInfo를 삭제해 준다. pTradeManager->cancelTrade(pSender, pReceiver); } else { executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_NOT_TRADING); @@ -194,16 +194,16 @@ void CGTradePrepareHandler::execute(CGTradePrepare* pPacket, Player* pPlayer) break; //////////////////////////////////////////////////////////// - // B ȯ ( ִ ) - // A ˷ش. + // B가 현재 교환에 응할 수 없는 상태(상점에 있는 경우)라는 + // 것을 A에게 알려준다. //////////////////////////////////////////////////////////// case CG_TRADE_PREPARE_CODE_BUSY: if (pTradeManager->isTrading(pSender, pReceiver)) { - // Ŷ ش. + // 패킷을 보내준다. gcTradePrepare.setTargetObjectID(pSender->getObjectID()); gcTradePrepare.setCode(GC_TRADE_PREPARE_CODE_BUSY); pReceiverPlayer->sendPacket(&gcTradePrepare); - // ȯ źǷ, TradeInfo ش. + // 교환을 거부했으므로, TradeInfo를 삭제해준다. pTradeManager->cancelTrade(pSender, pReceiver); } else { executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_NOT_TRADING); @@ -211,9 +211,9 @@ void CGTradePrepareHandler::execute(CGTradePrepare* pPacket, Player* pPlayer) } break; - // ˼ ڵ... + // 알수 없는 코드다... default: - throw ProtocolException("CGTradePrepare::execute() : ڵ"); + throw ProtocolException("CGTradePrepare::execute() : 알 수 없는 코드"); } diff --git a/src/Core/CGTradeRemoveItem.cpp b/src/Core/CGTradeRemoveItem.cpp index c5a421e9..f4c394ed 100644 --- a/src/Core/CGTradeRemoveItem.cpp +++ b/src/Core/CGTradeRemoveItem.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGTradeRemoveItem.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGTradeRemoveItem.h b/src/Core/CGTradeRemoveItem.h index 8eb27c93..d835a9aa 100644 --- a/src/Core/CGTradeRemoveItem.h +++ b/src/Core/CGTradeRemoveItem.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CGTradeRemoveItem.h -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -50,8 +50,8 @@ class CGTradeRemoveItem : public Packet { } private: - ObjectID_t m_TargetObjectID; // ȯ ϴ ObjectID - ObjectID_t m_ItemObjectID; // ȯ Ʈ ߰ OID + ObjectID_t m_TargetObjectID; // 교환을 원하는 상대방의 ObjectID + ObjectID_t m_ItemObjectID; // 교환 리스트에 추가할 아이템의 OID }; diff --git a/src/Core/CGTradeRemoveItemHandler.cpp b/src/Core/CGTradeRemoveItemHandler.cpp index af9eaef2..c31a75ee 100644 --- a/src/Core/CGTradeRemoveItemHandler.cpp +++ b/src/Core/CGTradeRemoveItemHandler.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CGTradeRemoveItemHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -44,38 +44,38 @@ void CGTradeRemoveItemHandler::execute(CGTradeRemoveItem* pPacket, Player* pPlay TradeManager* pTradeManager = pZone->getTradeManager(); Assert(pTradeManager != NULL); - // ȯ ϴ ãƺ. + // 교환을 원하는 상대방을 존에서 찾아본다. Creature* pTargetPC = NULL; /* try { pTargetPC = pZone->getCreature(TargetOID); } catch (NoSuchElementException) { pTargetPC = NULL; } */ - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 pTargetPC = pZone->getCreature(TargetOID); - // ȯ 밡 ų, ƴ϶ + // 교환 상대가 없거나, 같은 종족이 아니라면 에러다 if (pTargetPC == NULL) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_TARGET_NOT_EXIST); return; } - // ȯ 밡 ƴϰų, ƴ϶ . + // 교환 상대가 사람이 아니거나, 같은 종족이 아니라면 에러다. if (!pTargetPC->isPC() || !isSameRace(pTargetPC, pPC)) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_RACE_DIFFER); return; } - // 뿡 ִ üũ Ѵ. + // 둘 다 안전 지대에 있는지 체크를 한다. if (!isInSafeZone(pPC) || !isInSafeZone(pTargetPC)) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_NOT_SAFE); return; } - // ̸ Ÿ ִٸ . + // 오토바이를 타고 있다면 에러다. if (pPC->isSlayer() && pTargetPC->isSlayer()) { Slayer* pSlayer1 = dynamic_cast(pPC); Slayer* pSlayer2 = dynamic_cast(pTargetPC); @@ -99,7 +99,7 @@ void CGTradeRemoveItemHandler::execute(CGTradeRemoveItem* pPacket, Player* pPlay } } - // ̼ ȯ ϰ ִ ° ƴ϶ . + // 둘이서 교환을 하고 있는 상태가 아니라면 에러다. if (!pTradeManager->isTrading(pPC, pTargetPC)) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_NOT_TRADING); @@ -113,7 +113,7 @@ void CGTradeRemoveItemHandler::execute(CGTradeRemoveItem* pPacket, Player* pPlay else if (pPC->isOusters()) executeOusters(pPacket, pPlayer); else - throw ProtocolException("CGTradeRemoveItem::execute() : ÷̾ ũ"); + throw ProtocolException("CGTradeRemoveItem::execute() : 알 수 없는 플레이어 크리쳐"); #endif @@ -129,8 +129,8 @@ void CGTradeRemoveItemHandler::executeSlayer(CGTradeRemoveItem* pPacket, Player* #ifdef __GAME_SERVER__ - // Լ ˻߱ - // ⼭ Ͱ ˻ ʴ´. + // 상위 함수에서 에러를 검사했기 때문에 + // 여기서는 포인터가 널인지를 검사하지 않는다. ObjectID_t TargetOID = pPacket->getTargetObjectID(); ObjectID_t ItemOID = pPacket->getItemObjectID(); GamePlayer* pGamePlayer = dynamic_cast(pPlayer); @@ -138,13 +138,13 @@ void CGTradeRemoveItemHandler::executeSlayer(CGTradeRemoveItem* pPacket, Player* Zone* pZone = pPC->getZone(); Creature* pTargetPC = pZone->getCreature(TargetOID); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetPC == NULL) return; Slayer* pSender = dynamic_cast(pPC); - // ȯ ߰ ͸ . + // 교환 대상에 추가할 아이템의 포인터를 얻어낸다. CoordInven_t X, Y; Inventory* pInventory = pSender->getInventory(); Item* pItem = pInventory->findItemOID(ItemOID, X, Y); @@ -152,7 +152,7 @@ void CGTradeRemoveItemHandler::executeSlayer(CGTradeRemoveItem* pPacket, Player* TradeManager* pTradeManager = pZone->getTradeManager(); Assert(pTradeManager != NULL); - // ٸ 翬 ̻ ó Ұϴ. + // 빼야할 아이템이 없다면 당연히 더 이상 처리가 불가능하다. if (pItem == NULL) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_REMOVE_ITEM); @@ -162,7 +162,7 @@ void CGTradeRemoveItemHandler::executeSlayer(CGTradeRemoveItem* pPacket, Player* TradeInfo* pInfo1 = pTradeManager->getTradeInfo(pSender->getName()); TradeInfo* pInfo2 = pTradeManager->getTradeInfo(pTargetPC->getName()); - // TradeManager ȯ  ִ Ѵ. + // TradeManager에서 교환 대상으로 들어가 있던 아이템을 제거한다. // Assert(pInfo1->removeItem(pItem)); pInfo1->removeItem(pItem); @@ -170,31 +170,31 @@ void CGTradeRemoveItemHandler::executeSlayer(CGTradeRemoveItem* pPacket, Player* getCurrentTime(currentTime); pInfo1->setNextTime(currentTime); - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // cout << "CGTradeRemoveItem [" << pSender->getName() << "] ° TRADE_FINISH̹Ƿ, Ŷ ش." + // cout << "CGTradeRemoveItem [" << pSender->getName() << "]의 상태가 TRADE_FINISH이므로, 인증 패킷을 보내준다." // << endl; - // Ŷ ش. + // 인증패킷을 날려준다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_REMOVE_ITEM); pPlayer->sendPacket(&gcTradeVerify); } else { - // cout << "CGTradeRemoveItem [" << pSender->getName() << "] ° TRADE_FINISH ƴϹǷ, Ŷ - // ʴ´." << endl; + // cout << "CGTradeRemoveItem [" << pSender->getName() << "]의 상태가 TRADE_FINISH가 아니므로, 인증 패킷 날리지 + // 않는다." << endl; } - // ϰų , ° TRADE_FINISH - // TRADE_TRADING ٲ Ѵ. + // 아이템을 더하거나 뺄 경우, 상태가 TRADE_FINISH라면 + // TRADE_TRADING으로 바꿔줘야 한다. pInfo1->setStatus(TRADE_TRADING); pInfo2->setStatus(TRADE_TRADING); - // 濡Լ Ѵ. + // 상대방에게서 날려줄 아이템 정보를 구성한다. GCTradeRemoveItem gcTradeRemoveItem; gcTradeRemoveItem.setTargetObjectID(pSender->getObjectID()); gcTradeRemoveItem.setItemObjectID(pItem->getObjectID()); - // 濡 ش. + // 상대방에게 빼야할 아이템의 정보를 날려준다. Player* pTargetPlayer = pTargetPC->getPlayer(); pTargetPlayer->sendPacket(&gcTradeRemoveItem); @@ -212,8 +212,8 @@ void CGTradeRemoveItemHandler::executeVampire(CGTradeRemoveItem* pPacket, Player #ifdef __GAME_SERVER__ - // Լ ˻߱ - // ⼭ Ͱ ˻ ʴ´. + // 상위 함수에서 에러를 검사했기 때문에 + // 여기서는 포인터가 널인지를 검사하지 않는다. ObjectID_t TargetOID = pPacket->getTargetObjectID(); ObjectID_t ItemOID = pPacket->getItemObjectID(); GamePlayer* pGamePlayer = dynamic_cast(pPlayer); @@ -221,7 +221,7 @@ void CGTradeRemoveItemHandler::executeVampire(CGTradeRemoveItem* pPacket, Player Zone* pZone = pPC->getZone(); Creature* pTargetPC = pZone->getCreature(TargetOID); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetPC == NULL) return; @@ -230,12 +230,12 @@ void CGTradeRemoveItemHandler::executeVampire(CGTradeRemoveItem* pPacket, Player TradeManager* pTradeManager = pZone->getTradeManager(); Assert(pTradeManager != NULL); - // ȯ ߰ ͸ . + // 교환 대상에 추가할 아이템의 포인터를 얻어낸다. CoordInven_t X, Y; Inventory* pInventory = pSender->getInventory(); Item* pItem = pInventory->findItemOID(ItemOID, X, Y); - // ٸ 翬 ̻ ó Ұϴ. + // 빼야할 아이템이 없다면 당연히 더 이상 처리가 불가능하다. if (pItem == NULL) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_REMOVE_ITEM); @@ -245,35 +245,35 @@ void CGTradeRemoveItemHandler::executeVampire(CGTradeRemoveItem* pPacket, Player TradeInfo* pInfo1 = pTradeManager->getTradeInfo(pSender->getName()); TradeInfo* pInfo2 = pTradeManager->getTradeInfo(pTargetPC->getName()); - // TradeManager ȯ  ִ Ѵ. + // TradeManager에서 교환 대상으로 들어가 있던 아이템을 제거한다. // Assert(pInfo1->removeItem(pItem)); pInfo1->removeItem(pItem); - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // cout << "CGTradeRemoveItem [" << pSender->getName() << "] ° TRADE_FINISH̹Ƿ, Ŷ ش." + // cout << "CGTradeRemoveItem [" << pSender->getName() << "]의 상태가 TRADE_FINISH이므로, 인증 패킷을 보내준다." // << endl; - // Ŷ ش. + // 인증패킷을 날려준다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_REMOVE_ITEM); pPlayer->sendPacket(&gcTradeVerify); } else { - // cout << "CGTradeRemoveItem [" << pSender->getName() << "] ° TRADE_FINISH ƴϹǷ, Ŷ - // ʴ´." << endl; + // cout << "CGTradeRemoveItem [" << pSender->getName() << "]의 상태가 TRADE_FINISH가 아니므로, 인증 패킷 날리지 + // 않는다." << endl; } - // ϰų , ° TRADE_FINISH - // TRADE_TRADING ٲ Ѵ. + // 아이템을 더하거나 뺄 경우, 상태가 TRADE_FINISH라면 + // TRADE_TRADING으로 바꿔줘야 한다. pInfo1->setStatus(TRADE_TRADING); pInfo2->setStatus(TRADE_TRADING); - // 濡Լ Ѵ. + // 상대방에게서 날려줄 아이템 정보를 구성한다. GCTradeRemoveItem gcTradeRemoveItem; gcTradeRemoveItem.setTargetObjectID(pSender->getObjectID()); gcTradeRemoveItem.setItemObjectID(pItem->getObjectID()); - // 濡 ش. + // 상대방에게 빼야할 아이템의 정보를 날려준다. Player* pTargetPlayer = pTargetPC->getPlayer(); pTargetPlayer->sendPacket(&gcTradeRemoveItem); @@ -292,8 +292,8 @@ void CGTradeRemoveItemHandler::executeOusters(CGTradeRemoveItem* pPacket, Player #ifdef __GAME_SERVER__ - // Լ ˻߱ - // ⼭ Ͱ ˻ ʴ´. + // 상위 함수에서 에러를 검사했기 때문에 + // 여기서는 포인터가 널인지를 검사하지 않는다. ObjectID_t TargetOID = pPacket->getTargetObjectID(); ObjectID_t ItemOID = pPacket->getItemObjectID(); GamePlayer* pGamePlayer = dynamic_cast(pPlayer); @@ -301,7 +301,7 @@ void CGTradeRemoveItemHandler::executeOusters(CGTradeRemoveItem* pPacket, Player Zone* pZone = pPC->getZone(); Creature* pTargetPC = pZone->getCreature(TargetOID); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetPC == NULL) return; @@ -310,12 +310,12 @@ void CGTradeRemoveItemHandler::executeOusters(CGTradeRemoveItem* pPacket, Player TradeManager* pTradeManager = pZone->getTradeManager(); Assert(pTradeManager != NULL); - // ȯ ߰ ͸ . + // 교환 대상에 추가할 아이템의 포인터를 얻어낸다. CoordInven_t X, Y; Inventory* pInventory = pSender->getInventory(); Item* pItem = pInventory->findItemOID(ItemOID, X, Y); - // ٸ 翬 ̻ ó Ұϴ. + // 빼야할 아이템이 없다면 당연히 더 이상 처리가 불가능하다. if (pItem == NULL) { pTradeManager->cancelTrade(pPC); executeError(pPacket, pPlayer, GC_TRADE_ERROR_CODE_REMOVE_ITEM); @@ -325,35 +325,35 @@ void CGTradeRemoveItemHandler::executeOusters(CGTradeRemoveItem* pPacket, Player TradeInfo* pInfo1 = pTradeManager->getTradeInfo(pSender->getName()); TradeInfo* pInfo2 = pTradeManager->getTradeInfo(pTargetPC->getName()); - // TradeManager ȯ  ִ Ѵ. + // TradeManager에서 교환 대상으로 들어가 있던 아이템을 제거한다. // Assert(pInfo1->removeItem(pItem)); pInfo1->removeItem(pItem); - // OK ¶, Ŭ̾Ʈ Ŷ Ѵ. + // 현재 OK를 누른 상태라면, 클라이언트에게 인증 패킷을 보내줘야 한다. if (pInfo1->getStatus() == TRADE_FINISH) { - // cout << "CGTradeRemoveItem [" << pSender->getName() << "] ° TRADE_FINISH̹Ƿ, Ŷ ش." + // cout << "CGTradeRemoveItem [" << pSender->getName() << "]의 상태가 TRADE_FINISH이므로, 인증 패킷을 보내준다." // << endl; - // Ŷ ش. + // 인증패킷을 날려준다. GCTradeVerify gcTradeVerify; gcTradeVerify.setCode(GC_TRADE_VERIFY_CODE_REMOVE_ITEM); pPlayer->sendPacket(&gcTradeVerify); } else { - // cout << "CGTradeRemoveItem [" << pSender->getName() << "] ° TRADE_FINISH ƴϹǷ, Ŷ - // ʴ´." << endl; + // cout << "CGTradeRemoveItem [" << pSender->getName() << "]의 상태가 TRADE_FINISH가 아니므로, 인증 패킷 날리지 + // 않는다." << endl; } - // ϰų , ° TRADE_FINISH - // TRADE_TRADING ٲ Ѵ. + // 아이템을 더하거나 뺄 경우, 상태가 TRADE_FINISH라면 + // TRADE_TRADING으로 바꿔줘야 한다. pInfo1->setStatus(TRADE_TRADING); pInfo2->setStatus(TRADE_TRADING); - // 濡Լ Ѵ. + // 상대방에게서 날려줄 아이템 정보를 구성한다. GCTradeRemoveItem gcTradeRemoveItem; gcTradeRemoveItem.setTargetObjectID(pSender->getObjectID()); gcTradeRemoveItem.setItemObjectID(pItem->getObjectID()); - // 濡 ش. + // 상대방에게 빼야할 아이템의 정보를 날려준다. Player* pTargetPlayer = pTargetPC->getPlayer(); pTargetPlayer->sendPacket(&gcTradeRemoveItem); diff --git a/src/Core/CGTryJoinGuild.h b/src/Core/CGTryJoinGuild.h index 643b4a18..4bea8c29 100644 --- a/src/Core/CGTryJoinGuild.h +++ b/src/Core/CGTryJoinGuild.h @@ -25,10 +25,10 @@ class CGTryJoinGuild : public Packet { public: CGTryJoinGuild() {}; virtual ~CGTryJoinGuild() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGTryJoinGuildHandler.cpp b/src/Core/CGTryJoinGuildHandler.cpp index 808c929c..ef0ccdee 100644 --- a/src/Core/CGTryJoinGuildHandler.cpp +++ b/src/Core/CGTryJoinGuildHandler.cpp @@ -62,7 +62,7 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) Result* pResult; BEGIN_DB { - // ٸ Ҽ üũ + // 다른 길드 소속인지 체크 pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pResult = pStmt->executeQuery("SELECT GuildID, ExpireDate,`Rank` FROM GuildMember WHERE Name = '%s'", pCreature->getName().c_str()); @@ -79,7 +79,7 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) // int GuildID = pResult->getInt(1); // int rank = pResult->getInt(3); - // ѳ¥ rank : 5 ŻѰ iܳų źδ 忡 ٽ ϸ by + // 제한날짜가 있을때 rank : 5 탈퇴한경우와 쫒겨나거나 거부당한 길드에 다시 들어가려하면 에러 by 쑥갓 if (ExpireDate.size() == 7) { time_t daytime = time(0); @@ -92,20 +92,20 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) Time.tm_min = 0; Time.tm_sec = 0; - // if (difftime(daytime, mktime(&Time) ) < 604800 ) // ǽð 7 °? + // if (difftime(daytime, mktime(&Time) ) < 604800 ) // 실시간 7일이 지났는가? if (difftime(daytime, mktime(&Time)) < - g_pVariableManager->getVariable(QUIT_GUILD_PENALTY_TERM) * 24 * 3600) // ǽð 7 °? + g_pVariableManager->getVariable(QUIT_GUILD_PENALTY_TERM) * 24 * 3600) // 실시간 7일이 지났는가? { // if (rank==GuildMember::GUILDMEMBER_RANK_DENY // && GuildID != pGuild->getID()) // { - // // rank4==߹/ź.. ֵ ٸ 忡  ִ. + // // rank4==추방/거부..인 애들은 다른 길드에는 들어갈 수 있다. // } // else // { SAFE_DELETE(pStmt); - // Ż ǽð 7 + // 탈퇴한지 실시간 7일이 지나야 함 GCNPCResponse response; /* if (GuildID == pGuild->getID()) @@ -135,7 +135,7 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) } else { SAFE_DELETE(pStmt); - // ٸ 忡 ʾƾ + // 다른 길드에 속해 있지 않아야 함 if (pCreature->isSlayer()) { GCNPCResponse response; response.setCode(NPC_RESPONSE_TEAM_STARTING_FAIL_ALREADY_JOIN); @@ -165,9 +165,9 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) SkillDomainType_t highest = pSlayer->getHighestSkillDomain(); - // üũ + // 등록 가능 여부 체크 if (pSlayer->getSkillDomainLevel(highest) < REQUIRE_SLAYER_SUBMASTER_SKILL_DOMAIN_LEVEL) { - // + // 레벨이 낮음 GCNPCResponse response; response.setCode(NPC_RESPONSE_TEAM_STARTING_FAIL_LEVEL); pPlayer->sendPacket(&response); @@ -175,7 +175,7 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) return; } if (pSlayer->getGold() < REQUIRE_SLAYER_SUBMASTER_GOLD) { - // ڶ + // 돈이 모자람 GCNPCResponse response; response.setCode(NPC_RESPONSE_TEAM_STARTING_FAIL_MONEY); pPlayer->sendPacket(&response); @@ -183,7 +183,7 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) return; } if (pSlayer->getFame() < REQUIRE_SLAYER_SUBMASTER_FAME[highest]) { - // + // 명성이 낮음 GCNPCResponse response; response.setCode(NPC_RESPONSE_TEAM_STARTING_FAIL_FAME); pPlayer->sendPacket(&response); @@ -191,7 +191,7 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) return; } - // Ÿ â . + // 길드 스타팅 멤버 가입 창을 띄운다. GCShowGuildJoin gcShowGuildJoin; gcShowGuildJoin.setGuildID(pGuild->getID()); gcShowGuildJoin.setGuildName(pGuild->getName()); @@ -199,14 +199,14 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) gcShowGuildJoin.setJoinFee(REQUIRE_SLAYER_SUBMASTER_GOLD); pPlayer->sendPacket(&gcShowGuildJoin); - // cout << "Ÿ " << endl; + // cout << "스타팅 가입" << endl; } else if (pCreature->isVampire()) { Vampire* pVampire = dynamic_cast(pCreature); Assert(pVampire != NULL); - // üũ + // 등록 가능 여부 체크 if (pVampire->getLevel() < REQUIRE_VAMPIRE_SUBMASTER_LEVEL) { - // + // 레벨이 낮음 GCNPCResponse response; response.setCode(NPC_RESPONSE_CLAN_STARTING_FAIL_LEVEL); pPlayer->sendPacket(&response); @@ -214,7 +214,7 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) return; } if (pVampire->getGold() < REQUIRE_VAMPIRE_SUBMASTER_GOLD) { - // ڶ + // 돈이 모자람 GCNPCResponse response; response.setCode(NPC_RESPONSE_CLAN_STARTING_FAIL_MONEY); pPlayer->sendPacket(&response); @@ -223,7 +223,7 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) } // if (pVampire->getFame() < 400000 ) // { - // // + // // 명성이 낮음 // GCNPCResponse response; // response.setCode(NPC_RESPONSE_CLAN_STARTING_FAIL_FAME); // pPlayer->sendPacket(&response); @@ -231,7 +231,7 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) // return; // } - // Ÿ â . + // 길드 스타팅 멤버 가입 창을 띄운다. GCShowGuildJoin gcShowGuildJoin; gcShowGuildJoin.setGuildID(pGuild->getID()); gcShowGuildJoin.setGuildName(pGuild->getName()); @@ -240,14 +240,14 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) pPlayer->sendPacket(&gcShowGuildJoin); // cout << gcShowGuildJoin.toString() << endl; - // cout << "Ÿ " << endl; + // cout << "스타팅 가입" << endl; } else if (pCreature->isOusters()) { Ousters* pOusters = dynamic_cast(pCreature); Assert(pOusters != NULL); - // üũ + // 등록 가능 여부 체크 if (pOusters->getLevel() < REQUIRE_OUSTERS_SUBMASTER_LEVEL) { - // + // 레벨이 낮음 GCNPCResponse response; response.setCode(NPC_RESPONSE_GUILD_STARTING_FAIL_LEVEL); pPlayer->sendPacket(&response); @@ -255,7 +255,7 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) return; } if (pOusters->getGold() < REQUIRE_OUSTERS_SUBMASTER_GOLD) { - // ڶ + // 돈이 모자람 GCNPCResponse response; response.setCode(NPC_RESPONSE_GUILD_STARTING_FAIL_MONEY); pPlayer->sendPacket(&response); @@ -263,7 +263,7 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) return; } - // Ÿ â . + // 길드 스타팅 멤버 가입 창을 띄운다. GCShowGuildJoin gcShowGuildJoin; gcShowGuildJoin.setGuildID(pGuild->getID()); gcShowGuildJoin.setGuildName(pGuild->getName()); @@ -272,7 +272,7 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) pPlayer->sendPacket(&gcShowGuildJoin); // cout << gcShowGuildJoin.toString() << endl; - // cout << "Ÿ " << endl; + // cout << "스타팅 가입" << endl; } } else if (pPacket->getGuildMemberRank() == GuildMember::GUILDMEMBER_RANK_WAIT) { if (pGuild->getWaitMemberCount() >= MAX_GUILDMEMBER_WAIT_COUNT) { @@ -287,8 +287,8 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) return; } - // Ϲ - // â . + // 일반 가입인 경우 + // 길드 멤버 가입 창을 띄운다. GCShowGuildJoin gcShowGuildJoin; gcShowGuildJoin.setGuildID(pGuild->getID()); gcShowGuildJoin.setGuildName(pGuild->getName()); @@ -297,7 +297,7 @@ void CGTryJoinGuildHandler::execute(CGTryJoinGuild* pPacket, Player* pPlayer) pPlayer->sendPacket(&gcShowGuildJoin); // cout << gcShowGuildJoin.toString() << endl; - // cout << "Ϲ " << endl; + // cout << "일반 가입" << endl; } #endif // __GAME_SERVER__ diff --git a/src/Core/CGTypeStringList.cpp b/src/Core/CGTypeStringList.cpp index 48f6f99e..3688af28 100644 --- a/src/Core/CGTypeStringList.cpp +++ b/src/Core/CGTypeStringList.cpp @@ -37,9 +37,9 @@ void CGTypeStringList::read(SocketInputStream& iStream) iStream.read(szString); if (szString == 0) - throw InvalidProtocolException("String ̰ 0Դϴ."); + throw InvalidProtocolException("String 길이가 0입니다."); if (szString > MAX_STRING_LENGTH) - throw InvalidProtocolException("String ̰ ʹ ϴ."); + throw InvalidProtocolException("String 길이가 너무 깁니다."); iStream.read(temp, szString); diff --git a/src/Core/CGUnburrow.h b/src/Core/CGUnburrow.h index f735e948..f2b70f2f 100644 --- a/src/Core/CGUnburrow.h +++ b/src/Core/CGUnburrow.h @@ -24,10 +24,10 @@ class CGUnburrow : public Packet { public: CGUnburrow() {}; virtual ~CGUnburrow() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -40,7 +40,7 @@ class CGUnburrow : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CGUnburrowPacketSize ؼ ϶. + // const static CGUnburrowPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szCoord + szCoord + szDir; } @@ -79,9 +79,9 @@ class CGUnburrow : public Packet { } private: - Coord_t m_X; // X ǥ - Coord_t m_Y; // Y ǥ - Dir_t m_Dir; // + Coord_t m_X; // X 좌표 + Coord_t m_Y; // Y 좌표 + Dir_t m_Dir; // 방향 }; @@ -112,7 +112,7 @@ class CGUnburrowFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGUnburrowPacketSize ؼ ϶. + // const static CGUnburrowPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szCoord + szCoord + szDir; } diff --git a/src/Core/CGUnburrowHandler.cpp b/src/Core/CGUnburrowHandler.cpp index 9c448b8b..8288b8df 100644 --- a/src/Core/CGUnburrowHandler.cpp +++ b/src/Core/CGUnburrowHandler.cpp @@ -28,8 +28,8 @@ void CGUnburrowHandler::execute(CGUnburrow* pPacket, Player* pPlayer) GamePlayer* pGamePlayer = dynamic_cast(pPlayer); if (pGamePlayer->getPlayerStatus() == GPS_NORMAL) { - // ¿ ũó ǰ εǾ ϹǷ, NULL ƴϾ Ѵ. - // PLAYER_INGAME ü ũó ε Ǿ ǹѴ. + // 이 상태에서는 크리처가 옳게 로딩되었어야 하므로, NULL 이 아니어야 한다. + // PLAYER_INGAME 자체가 크리처 로딩이 성공되었음을 의미한다. Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); diff --git a/src/Core/CGUndisplayItem.h b/src/Core/CGUndisplayItem.h index e18a603b..c8afe718 100644 --- a/src/Core/CGUndisplayItem.h +++ b/src/Core/CGUndisplayItem.h @@ -25,10 +25,10 @@ class CGUndisplayItem : public Packet { public: CGUndisplayItem() {}; virtual ~CGUndisplayItem() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGUndisplayItemHandler.cpp b/src/Core/CGUndisplayItemHandler.cpp index f6a3294c..e28a80c4 100644 --- a/src/Core/CGUndisplayItemHandler.cpp +++ b/src/Core/CGUndisplayItemHandler.cpp @@ -38,14 +38,14 @@ void CGUndisplayItemHandler::execute(CGUndisplayItem* pPacket, Player* pPlayer) Assert(pStore != NULL); if (pPacket->getIndex() > MAX_ITEM_NUM) { - filelog("Store.log", "[%s:%s] (%u) ߸ εԴϴ.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), + filelog("Store.log", "[%s:%s] (%u) 잘못된 인덱스입니다.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), pPacket->getIndex()); return; } BYTE result = pStore->removeStoreItem(pPacket->getIndex()); if (result != 0) { - filelog("Store.log", "[%s:%s] (%u) ϴ.", pGamePlayer->getID().c_str(), + filelog("Store.log", "[%s:%s] (%u) 아이템을 뺄 수 없습니다.", pGamePlayer->getID().c_str(), pPC->getName().c_str(), result); return; } diff --git a/src/Core/CGUntransform.h b/src/Core/CGUntransform.h index a0ce64ad..66743ad6 100644 --- a/src/Core/CGUntransform.h +++ b/src/Core/CGUntransform.h @@ -2,7 +2,7 @@ // // Filename : CGUntransform.h // Written By : crazydog -// Description : 㳪 뿡 ƿ.. +// Description : 박쥐나 늑대에서 원래모습으로 돌아오고싶을때.. // ////////////////////////////////////////////////////////////////////// @@ -24,10 +24,10 @@ class CGUntransform : public Packet { public: CGUntransform() {}; virtual ~CGUntransform() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -40,7 +40,7 @@ class CGUntransform : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CGUntransformPacketSize ؼ ϶. + // const static CGUntransformPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return 0; } @@ -82,7 +82,7 @@ class CGUntransformFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGUntransformPacketSize ؼ ϶. + // const static CGUntransformPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return 0; } diff --git a/src/Core/CGUntransformHandler.cpp b/src/Core/CGUntransformHandler.cpp index a5c4f3bb..6b66fad1 100644 --- a/src/Core/CGUntransformHandler.cpp +++ b/src/Core/CGUntransformHandler.cpp @@ -40,11 +40,11 @@ void CGUntransformHandler::execute(CGUntransform* pPacket, Player* pPlayer) if (pOusters->isFlag(Effect::EFFECT_CLASS_SUMMON_SYLPH) ) { - // ÷̾ Flag ְ + // 플레이어에서 Flag 때주고 pOusters->removeFlag(Effect::EFFECT_CLASS_SUMMON_SYLPH); Zone* pZone = pCreature->getZone(); - // Ʈ ݴٰ ְ + // 존에 이펙트 없앴다고 보내주고 GCRemoveEffect removeEffect; removeEffect.setObjectID(pOusters->getObjectID()); removeEffect.addEffectList(Effect::EFFECT_CLASS_SUMMON_SYLPH); @@ -53,7 +53,7 @@ void CGUntransformHandler::execute(CGUntransform* pPacket, Player* pPlayer) GCModifyInformation gcMI; - // ٽ ؼ ְ + // 디펜 프텍 다시 계산해서 보내주고 OUSTERS_RECORD prev; pOusters->getOustersRecord(prev); pOusters->initAllStat(); diff --git a/src/Core/CGUseBonusPoint.h b/src/Core/CGUseBonusPoint.h index 349eeec5..cfcc81e8 100644 --- a/src/Core/CGUseBonusPoint.h +++ b/src/Core/CGUseBonusPoint.h @@ -2,7 +2,7 @@ // // Filename : CGUseBonusPoint.h // Written By : crazydog -// Description : vampire bonus point Ѵ. +// Description : vampire가 bonus point를 사용한다. // ////////////////////////////////////////////////////////////////////// @@ -37,10 +37,10 @@ class CGUseBonusPoint : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGUseBonusPointHandler.cpp b/src/Core/CGUseBonusPointHandler.cpp index 87505c3e..27a72d6e 100644 --- a/src/Core/CGUseBonusPointHandler.cpp +++ b/src/Core/CGUseBonusPointHandler.cpp @@ -31,7 +31,7 @@ void CGUseBonusPointHandler::execute(CGUseBonusPoint* pPacket, Player* pPlayer) Assert(pPacket != NULL); Assert(pPlayer != NULL); - // ° ƴ϶ + // 정상적인 상태가 아니라면 리턴 GamePlayer* pGamePlayer = dynamic_cast(pPlayer); if (pGamePlayer->getPlayerStatus() != GPS_NORMAL) return; @@ -69,7 +69,7 @@ void CGUseBonusPointHandler::execute(CGUseBonusPoint* pPacket, Player* pPlayer) return; } } else if (pCreature->isVampire()) { - // ʽ Ʈ ٸ + // 보너스 포인트가 없다면 리턴 Vampire* pVampire = dynamic_cast(pCreature); if (pVampire->getBonus() <= 0) { GCUseBonusPointFail failPkt; @@ -78,7 +78,7 @@ void CGUseBonusPointHandler::execute(CGUseBonusPoint* pPacket, Player* pPlayer) } VAMPIRE_RECORD oldRecord; - // ɷġ ø ɷġ Ѵ. + // 능력치를 올리기 전에 기존의 능력치를 저장한다. pVampire->getVampireRecord(oldRecord); if (which == INC_INT) { @@ -90,24 +90,24 @@ void CGUseBonusPointHandler::execute(CGUseBonusPoint* pPacket, Player* pPlayer) pVampire->tinysave(sst.toString()); /* - // INT ϸ ο ִ ɼ ִ. + // INT가 증가하면 새로운 기술을 배울 수 있는 가능성이 있다. SkillType_t lastSkill = pVampire->findLastSkill(); - // lastSkill level ã´. - // ãҴٸ ̻ ٴ . + // lastSkill의 다음 level의 기술을 찾는다. + // 못찾았다면 더이상 배울것이 없다는 것. for(int i = SKILL_BLOOD_DRAIN + 1 ; i < SKILL_MAX; i++) { SkillParentInfo* pParentInfo = g_pSkillParentInfoManager->getSkillParentInfo(i); - if (pParentInfo->hasParent(lastSkill))// ãҴ! + if (pParentInfo->hasParent(lastSkill))// 찾았다! { SkillInfo* pNewSkillInfo = g_pSkillInfoManager->getSkillInfo(i); if (pNewSkillInfo->getEXP() <= cur && pVampire->hasSkill(i) == NULL) { //cout << "(" << pVampire->getName() << ") can learn new skill >> "; - // ο ִ. + // 새로운 기술을 배울 수 있다. GCLearnSkillReady gcLSR; gcLSR.setSkillDomainType(SKILL_DOMAIN_VAMPIRE); pVampire->getPlayer()->sendPacket(&gcLSR); @@ -139,30 +139,30 @@ void CGUseBonusPointHandler::execute(CGUseBonusPoint* pPacket, Player* pPlayer) // log(LOG_USE_BONUS_POINT, pVampire->getName(), "", "DEX"); } - // ٲ ʽ Ʈ Ѵ. + // 바뀐 보너스 포인트를 저장한다. Bonus_t OldBonus = pVampire->getBonus(); pVampire->setBonus(OldBonus - 1); StringStream sst; sst << "Bonus = " << (int)(OldBonus - 1); pVampire->tinysave(sst.toString()); - // ɷġ ȭǾ, stat ģ. + // 능력치가 변화되었으니, stat을 새로 고친다. pVampire->initAllStat(); - // Ŭ̾Ʈ ׷ Ͽ, - // Ŷ Ŀ, ٲ ɷġ . - // ߿ CGUseBonusPointOK ٷ ٲ ɷġ - // Ǿ ؾ Ѵ. + // 클라이언트의 계산 순서 때문에 생기는 버그로 인하여, + // 먼저 인증 패킷을 날려준 후에, 바뀐 능력치에 대한 정보를 보낸다. + // 나중에 CGUseBonusPointOK에다 바로 바뀐 능력치에 대한 정보를 + // 실어보내도록 해야 한다. - // OK Ŷ ش. + // OK 패킷을 보내준다. GCUseBonusPointOK okpkt; pGamePlayer->sendPacket(&okpkt); - // ٲ ɷġ ش. + // 바뀐 능력치에 관한 정보를 보내준다. pVampire->sendModifyInfo(oldRecord); pVampire->sendRealWearingInfo(); } else if (pCreature->isOusters()) { - // ʽ Ʈ ٸ + // 보너스 포인트가 없다면 리턴 Ousters* pOusters = dynamic_cast(pCreature); if (pOusters->getBonus() <= 0) { GCUseBonusPointFail failPkt; @@ -171,7 +171,7 @@ void CGUseBonusPointHandler::execute(CGUseBonusPoint* pPacket, Player* pPlayer) } OUSTERS_RECORD oldRecord; - // ɷġ ø ɷġ Ѵ. + // 능력치를 올리기 전에 기존의 능력치를 저장한다. pOusters->getOustersRecord(oldRecord); if (which == INC_INT) { @@ -197,21 +197,21 @@ void CGUseBonusPointHandler::execute(CGUseBonusPoint* pPacket, Player* pPlayer) pOusters->tinysave(sst.toString()); } - // ٲ ʽ Ʈ Ѵ. + // 바뀐 보너스 포인트를 저장한다. Bonus_t OldBonus = pOusters->getBonus(); pOusters->setBonus(OldBonus - 1); StringStream sst; sst << "Bonus = " << (int)(OldBonus - 1); pOusters->tinysave(sst.toString()); - // ɷġ ȭǾ, stat ģ. + // 능력치가 변화되었으니, stat을 새로 고친다. pOusters->initAllStat(); - // OK Ŷ ش. + // OK 패킷을 보내준다. GCUseBonusPointOK okpkt; pGamePlayer->sendPacket(&okpkt); - // ٲ ɷġ ش. + // 바뀐 능력치에 관한 정보를 보내준다. pOusters->sendModifyInfo(oldRecord); pOusters->sendRealWearingInfo(); } else { diff --git a/src/Core/CGUseItemFromGQuestInventory.cpp b/src/Core/CGUseItemFromGQuestInventory.cpp index 417cc869..b4b64d6c 100644 --- a/src/Core/CGUseItemFromGQuestInventory.cpp +++ b/src/Core/CGUseItemFromGQuestInventory.cpp @@ -2,8 +2,8 @@ // Filename : CGUseItemFromGQuestInventory.cpp // Written By : excel96 // Description : -// κ丮 , Ŭ̾Ʈ X, Y ObjectID -// Ŭ , ̿ ´ ڵ带 óѴ. +// 인벤토리 안의 아이템을 사용할 때, 클라이언트가 X, Y 및 ObjectID를 +// 보내면 아이템 클래스에 따라서, 서버가 이에 맞는 코드를 처리한다. ////////////////////////////////////////////////////////////////////////////// #include "CGUseItemFromGQuestInventory.h" diff --git a/src/Core/CGUseItemFromGQuestInventory.h b/src/Core/CGUseItemFromGQuestInventory.h index 42b8d29a..8c7913b1 100644 --- a/src/Core/CGUseItemFromGQuestInventory.h +++ b/src/Core/CGUseItemFromGQuestInventory.h @@ -2,8 +2,8 @@ // Filename : CGUseItemFromGQuestInventory.h // Written By : excel96 // Description : -// κ丮 , Ŭ̾Ʈ X, Y ObjectID -// Ŭ , ̿ ´ ڵ带 óѴ. +// 인벤토리 안의 아이템을 사용할 때, 클라이언트가 X, Y 및 ObjectID를 +// 보내면 아이템 클래스에 따라서, 서버가 이에 맞는 코드를 처리한다. ////////////////////////////////////////////////////////////////////////////// #ifndef __CG_USE_ITEM_FROM_GQUEST_INVENTORY_H__ @@ -43,7 +43,7 @@ class CGUseItemFromGQuestInventory : public Packet { } private: - BYTE m_Index; // index + BYTE m_Index; // 아이템의 index }; diff --git a/src/Core/CGUseItemFromGQuestInventoryHandler.cpp b/src/Core/CGUseItemFromGQuestInventoryHandler.cpp index 6ffa0651..95bc86d9 100644 --- a/src/Core/CGUseItemFromGQuestInventoryHandler.cpp +++ b/src/Core/CGUseItemFromGQuestInventoryHandler.cpp @@ -132,7 +132,7 @@ void CGUseItemFromGQuestInventoryHandler::execute(CGUseItemFromGQuestInventory* giveLotto(pPC, 4, 3); filelog("ChoboEvent.log", "%s open %d box", pPC->getName().c_str(), iType); - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { remainTraceLog(pItem, "GQuestBox", pPC->getName(), ITEM_LOG_CREATE, DETAIL_EVENTNPC); } diff --git a/src/Core/CGUseItemFromGear.h b/src/Core/CGUseItemFromGear.h index 1d703cb5..4d158339 100644 --- a/src/Core/CGUseItemFromGear.h +++ b/src/Core/CGUseItemFromGear.h @@ -50,8 +50,8 @@ class CGUseItemFromGear : public Packet { } private: - ObjectID_t m_ObjectID; // object id - BYTE m_Part; // ִ slot + ObjectID_t m_ObjectID; // 아이템의 object id + BYTE m_Part; // 아이템이 있는 slot }; diff --git a/src/Core/CGUseItemFromGearHandler.cpp b/src/Core/CGUseItemFromGearHandler.cpp index 50db5836..f801d2af 100644 --- a/src/Core/CGUseItemFromGearHandler.cpp +++ b/src/Core/CGUseItemFromGearHandler.cpp @@ -86,7 +86,7 @@ void CGUseItemFromGearHandler::execute(CGUseItemFromGear* pPacket, Player* pPlay ObjectID_t ItemObjectID = pItem->getObjectID(); - // OID ġ ʰų, ̶ . + // OID가 일치하지 않거나, 사용할 수 없는 아이템이라면 에러다. if (ItemObjectID != pPacket->getObjectID() || !isUsableItem(pItem, pCreature)) { GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); @@ -94,7 +94,7 @@ void CGUseItemFromGearHandler::execute(CGUseItemFromGear* pPacket, Player* pPlay return; } - // , ó Լ б ش. + // 아이템의 종류에 따라, 처리 함수를 분기시켜 준다. // cout << pItem->getItemClass() << endl; switch (pItem->getItemClass()) { @@ -128,8 +128,8 @@ void CGUseItemFromGearHandler::executeCoupleRing(CGUseItemFromGear* pPacket, Gam Assert(pPacket != NULL); Assert(pGamePlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // 상위 함수에서 에러 체크를 많이 했기 때문에, + // 에러 체크를 대폭 축소한다. Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); CoupleRingBase* pCoupleRing = NULL; @@ -157,7 +157,7 @@ void CGUseItemFromGearHandler::executeCoupleRing(CGUseItemFromGear* pPacket, Gam bool bValidZone = false; - // trace ϴ κ + // trace 하는 부분 __ENTER_CRITICAL_SECTION((*g_pPCFinder)) pTargetCreature = g_pPCFinder->getCreature_LOCKED(targetName); @@ -172,7 +172,7 @@ void CGUseItemFromGearHandler::executeCoupleRing(CGUseItemFromGear* pPacket, Gam Zone* pTargetZone = pTargetCreature->getZone(); if (pTargetZone != NULL) { - // ɺ, ÿܰ, ̺Ʈ, ̺ƮOX , ͷ, , PK, ̳ δ . + // 야전사령부, 시외곽지역, 이벤트경기장, 이벤트OX 존, 마스터레어, 성지, PK존, 다이나믹 존으로는 갈 수 없다. bValidZone = pTargetZone->getZoneID() != 2101 && pTargetZone->getZoneID() != 2102 && pTargetZone->getZoneID() != 1005 && pTargetZone->getZoneID() != 1006 && pTargetZone->getZoneID() != 1122 && pTargetZone->getZoneID() != 1131 && @@ -183,7 +183,7 @@ void CGUseItemFromGearHandler::executeCoupleRing(CGUseItemFromGear* pPacket, Gam } __LEAVE_CRITICAL_SECTION((*g_pPCFinder)) - // ̶ д. + // 갈 수 없는 곳이라면 실패다. if (!bValidZone) { GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); @@ -191,7 +191,7 @@ void CGUseItemFromGearHandler::executeCoupleRing(CGUseItemFromGear* pPacket, Gam return; } - // 10 Ʈ δ. + // 10 초 동안 움직일 수 없도록 이펙트를 붙인다. EffectLoveChain* pEffect = new EffectLoveChain(pPC); pEffect->setItemObjectID(pPacket->getObjectID()); pEffect->setDeadline(100); diff --git a/src/Core/CGUseItemFromInventory.cpp b/src/Core/CGUseItemFromInventory.cpp index 89ddc698..cf9f91da 100644 --- a/src/Core/CGUseItemFromInventory.cpp +++ b/src/Core/CGUseItemFromInventory.cpp @@ -2,8 +2,8 @@ // Filename : CGUseItemFromInventory.cpp // Written By : excel96 // Description : -// κ丮 , Ŭ̾Ʈ X, Y ObjectID -// Ŭ , ̿ ´ ڵ带 óѴ. +// 인벤토리 안의 아이템을 사용할 때, 클라이언트가 X, Y 및 ObjectID를 +// 보내면 아이템 클래스에 따라서, 서버가 이에 맞는 코드를 처리한다. ////////////////////////////////////////////////////////////////////////////// #include "CGUseItemFromInventory.h" diff --git a/src/Core/CGUseItemFromInventory.h b/src/Core/CGUseItemFromInventory.h index 3f356aed..661c2923 100644 --- a/src/Core/CGUseItemFromInventory.h +++ b/src/Core/CGUseItemFromInventory.h @@ -2,8 +2,8 @@ // Filename : CGUseItemFromInventory.h // Written By : excel96 // Description : -// κ丮 , Ŭ̾Ʈ X, Y ObjectID -// Ŭ , ̿ ´ ڵ带 óѴ. +// 인벤토리 안의 아이템을 사용할 때, 클라이언트가 X, Y 및 ObjectID를 +// 보내면 아이템 클래스에 따라서, 서버가 이에 맞는 코드를 처리한다. ////////////////////////////////////////////////////////////////////////////// #ifndef __CG_USE_ITEM_FROM_INVENTORY_H__ @@ -64,11 +64,11 @@ class CGUseItemFromInventory : public Packet { } private: - ObjectID_t m_ObjectID; // object id - // κ丮 Ʈ ̵. 0̸ κ丮 + ObjectID_t m_ObjectID; // 아이템의 object id + // 보조 인벤토리 아이템의 오브젝트 아이디. 0이면 메인 인벤토리에서 사용 ObjectID_t m_InventoryItemObjectID; - CoordInven_t m_InvenX; // κ丮 ǥ X - CoordInven_t m_InvenY; // κ丮 ǥ Y + CoordInven_t m_InvenX; // 아이템의 인벤토리 좌표 X + CoordInven_t m_InvenY; // 아이템의 인벤토리 좌표 Y }; diff --git a/src/Core/CGUseItemFromInventoryHandler.cpp b/src/Core/CGUseItemFromInventoryHandler.cpp index 2898c306..61cff34d 100644 --- a/src/Core/CGUseItemFromInventoryHandler.cpp +++ b/src/Core/CGUseItemFromInventoryHandler.cpp @@ -124,9 +124,9 @@ void CGUseItemFromInventoryHandler::execute(CGUseItemFromInventory* pPacket, Pla CoordInven_t InvenX = pPacket->getX(); CoordInven_t InvenY = pPacket->getY(); - // cout << "Ŷ : " << pPacket->toString() << endl; + // cout << "ÆÐŶ³¯¶ó¿È : " << pPacket->toString() << endl; - // κ丮 ǥ Ѿ ̶ ȴ. + // Àκ¥Å丮 ÁÂÇ¥¸¦ ³Ñ¾î°¡´Â ¿µ¿ªÀ̶ó¸é ¾È µÈ´Ù. if (InvenX >= pInventory->getWidth() || InvenY >= pInventory->getHeight()) { GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); @@ -134,7 +134,7 @@ void CGUseItemFromInventoryHandler::execute(CGUseItemFromInventory* pPacket, Pla return; } - // κ丮 ٸ . + // Àκ¥Å丮¿¡ ±× ¾ÆÀÌÅÛÀÌ ¾ø´Ù¸é ¿¡·¯´Ù. Item* pItem = pInventory->getItem(InvenX, InvenY); if (pItem == NULL) { GCCannotUse _GCCannotUse; @@ -143,12 +143,12 @@ void CGUseItemFromInventoryHandler::execute(CGUseItemFromInventory* pPacket, Pla return; } - // κ丮 ִ Object ޴´. + // Àκ¥Å丮¿¡ ÀÖ´Â ¾ÆÀÌÅÛÀÇ Object¸¦ ¹Þ´Â´Ù. ObjectID_t ItemObjectID = pItem->getObjectID(); - // OID ġ ʰų, ̶ . + // OID°¡ ÀÏÄ¡ÇÏÁö ¾Ê°Å³ª, »ç¿ëÇÒ ¼ö ¾ø´Â ¾ÆÀÌÅÛÀ̶ó¸é ¿¡·¯´Ù. if (ItemObjectID != pPacket->getObjectID() || !isUsableItem(pItem, pCreature)) { - // cout << " Ұ. Ʈ Ƶ ´..." << endl; + // cout << "¾ÆÅÛ »ç¿ë ºÒ°¡. ¿ÉÁ§Æ® ¾Æµð°¡ ¾È ¸Â´ø°¡..." << endl; GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); pGamePlayer->sendPacket(&_GCCannotUse); @@ -156,8 +156,8 @@ void CGUseItemFromInventoryHandler::execute(CGUseItemFromInventory* pPacket, Pla } - // Ʒ̵ - // ̵ܿʹBUG + // ²éÕÒÎïÆ·ÊÇÔÚÉ̵êÖÐ + // ÐÞÕý¼¼ÄÜ¿¨ÔÚÉ̵êÖÐÎÞÏÞʹÓÃBUG if (pItem->getItemType() >= 5 && pItem->getItemType() <= 7) { BYTE bIndex = pPC->getStore()->getItemIndex(pItem); if (bIndex != 0xff) { @@ -174,7 +174,7 @@ void CGUseItemFromInventoryHandler::execute(CGUseItemFromInventory* pPacket, Pla return; } - // , ó Լ б ش. + // ¾ÆÀÌÅÛÀÇ Á¾·ù¿¡ µû¶ó, ó¸® ÇÔ¼ö¸¦ ºÐ±â½ÃÄÑ ÁØ´Ù. ////cout << pItem->getItemClass() << endl; switch (pItem->getItemClass()) { @@ -245,7 +245,7 @@ void CGUseItemFromInventoryHandler::execute(CGUseItemFromInventory* pPacket, Pla sprintf(buffer, "SMSCharge=%u", pPC->getSMSCharge()); pPC->tinysave(buffer); - // ʴ ٷιٷ ش. + // ½×ÀÌÁö ¾Ê´Â ¾ÆÀÌÅÛÀº ¹Ù·Î¹Ù·Î »èÁ¦ÇØÁØ´Ù. pInventory->deleteItem(InvenX, InvenY); pItem->destroy(); SAFE_DELETE(pItem); @@ -254,7 +254,7 @@ void CGUseItemFromInventoryHandler::execute(CGUseItemFromInventory* pPacket, Pla case Item::ITEM_CLASS_TRAP_ITEM: executeTrapItem(pPacket, pPlayer); break; - // add by Coffee 2007-6-9 ¼ܿ۳ + // add by Coffee 2007-6-9 Ôö¼Óм¼ÄÜ¿¨¿Û³ý´úÂë case Item::ITEM_CLASS_MOON_CARD: if (pItem->getItemType() >= 5 && pItem->getItemType() <= 7) { GCUseOK _GCUseOK; @@ -285,8 +285,8 @@ void CGUseItemFromInventoryHandler::executePotion(CGUseItemFromInventory* pPacke Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -301,9 +301,9 @@ void CGUseItemFromInventoryHandler::executePotion(CGUseItemFromInventory* pPacke Slayer* pSlayer = dynamic_cast(pCreature); - // ڸ ¶ . + // ÄÚ¸¶ »óŶó¸é »ç¿ëÇÒ ¼ö ¾ø´Ù. if (pSlayer->isFlag(Effect::EFFECT_CLASS_COMA) - // ڰ ƴϸ . + // ¼ÛÆíÀÎ °æ¿ì´Â À¯·á »ç¿ëÀÚ°¡ ¾Æ´Ï¸é »ç¿ëÇÒ ¼ö ¾ø´Ù. || pItem->getItemType() == 11 && !pGamePlayer->isPayPlaying() && !pGamePlayer->isPremiumPlay()) { GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); @@ -323,10 +323,10 @@ void CGUseItemFromInventoryHandler::executePotion(CGUseItemFromInventory* pPacke int HPDelayProvider = pPotion->getHPDelay(); int MPDelayProvider = pPotion->getMPDelay(); - // Activation Effect ɷִٸ ȸӵ 2谡 ȴ. + // Activation Effect°¡ °É·ÁÀÖ´Ù¸é ȸº¹¼Óµµ°¡ 2¹è°¡ µÈ´Ù. if (pSlayer->isFlag(Effect::EFFECT_CLASS_ACTIVATION)) { if (pPotion->getItemType() >= 14 && pPotion->getItemType() <= 17) { - // ִ. + // ¾µ ¼ö´Â ÀÖ´Ù. } else { HPDelayProvider = (HPDelayProvider >> 1); MPDelayProvider = (MPDelayProvider >> 1); @@ -340,7 +340,7 @@ void CGUseItemFromInventoryHandler::executePotion(CGUseItemFromInventory* pPacke int PotionHPAmount = 0, PotionMPAmount = 0; - // ٸ Relic ߴٸ, û/ ȿ 50% . + // ¸¸¾à ´Ù¸¥ Á¾ÀûÀÇ RelicÀ» ¼ÒÀ¯Çß´Ù¸é, Ç÷û/Æ÷¼ÇÀÇ È¿°ú°¡ 50%·Î ¶³¾îÁø´Ù. PotionHPAmount = pPotion->getHPAmount(); PotionMPAmount = pPotion->getMPAmount(); @@ -350,7 +350,7 @@ void CGUseItemFromInventoryHandler::executePotion(CGUseItemFromInventory* pPacke bool notRecoverHP = false; bool notRecoverMP = false; - // HP ȸ Ѵٸ... + // HP ȸº¹¾çÀÌ Á¸ÀçÇÑ´Ù¸é... if (HPAmount != 0 && HPQuantity != 0) { if (CurrentHP < MaxHP) { EffectManager* pEffectManager = pSlayer->getEffectManager(); @@ -363,27 +363,27 @@ void CGUseItemFromInventoryHandler::executePotion(CGUseItemFromInventory* pPacke Effect* pEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_HP_RECOVERY); EffectHPRecovery* pEffectHPRecoveryEffect = dynamic_cast(pEffect); - // Ƚ ä HP Ѵ. - // װ ȸ翡 Ѵ. + // ±âÁ¸ÀÇ ´ÜÀ§¾ç°ú Ƚ¼ö·Î ä¿ì´Â HP¾çÀ» °è»êÇÑ´Ù. + // ±×°ÍÀ» ÇöÀç ȸº¹¾ç¿¡ ´õÇÑ´Ù. int PrevHPAmount = pEffectHPRecoveryEffect->getHPQuantity() * pEffectHPRecoveryEffect->getPeriod(); HPAmount = min((int)(HPAmount + PrevHPAmount), MaxHP - CurrentHP); - // ߿ ū ȸ ̸ . + // µÑ Áß¿¡ Å« ´ÜÀ§È¸º¹¾ç°ú ÀÛÀº µô·¹À̸¦ ¾ò¾î³½´Ù. HPQuantity = max(HPQuantity, (int)(pEffectHPRecoveryEffect->getHPQuantity())); HPDelayProvider = min(HPDelayProvider, (int)(pEffectHPRecoveryEffect->getDelay())); - // ȸ , 󸶾 ȸ ΰ Ѵ. + // ÇöÀç ȸº¹¾çÀ» °¡Áö°í, ¾ó¸¶¾¿ ¸î¹ø¿¡ ȸº¹ÇÒ °ÍÀΰ¡¸¦ °áÁ¤ÇÑ´Ù. temp = (double)((double)HPAmount / (double)HPQuantity); Period = (uint)ceil(temp); Deadline = Period * HPDelayProvider; - // HP Recovery effect Ѵ. + // HP Recovery effect¸¦ °»½ÅÇÑ´Ù. pEffectHPRecoveryEffect->setDeadline(Deadline); pEffectHPRecoveryEffect->setDelay(HPDelayProvider); pEffectHPRecoveryEffect->setHPQuantity(HPQuantity); pEffectHPRecoveryEffect->setPeriod(Period); - // ȸ ϶ Ŷ ڽſ . + // ȸº¹ ½ÃÀÛÇ϶ó´Â ÆÐŶÀ» Àڽſ¡°Ô º¸³½´Ù. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; gcHPRecoveryStartToSelf.setPeriod(pEffectHPRecoveryEffect->getPeriod()); gcHPRecoveryStartToSelf.setDelay(pEffectHPRecoveryEffect->getDelay()); @@ -391,8 +391,8 @@ void CGUseItemFromInventoryHandler::executePotion(CGUseItemFromInventory* pPacke pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ٸ̵鿡 . - // ȸ Ŷ, ۰ Ŷ . + // ȸº¹ ½ÃÀÛÇ϶ó´Â ÆÐŶÀ» ´Ù¸¥À̵鿡°Ô º¸³½´Ù. + // ȸº¹ °»½Å ÆÐŶ, ½ÃÀÛ°ú ¶È °°Àº ÆÐŶÀ» º¸³½´Ù. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pSlayer->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(pEffectHPRecoveryEffect->getPeriod()); @@ -414,7 +414,7 @@ void CGUseItemFromInventoryHandler::executePotion(CGUseItemFromInventory* pPacke pEffectManager->addEffect(pEffectHPRecovery); - // ȸ ϶ Ŷ ڽſ . + // ȸº¹ ½ÃÀÛÇ϶ó´Â ÆÐŶÀ» Àڽſ¡°Ô º¸³½´Ù. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; gcHPRecoveryStartToSelf.setPeriod(Period); gcHPRecoveryStartToSelf.setDelay(HPDelayProvider); @@ -422,7 +422,7 @@ void CGUseItemFromInventoryHandler::executePotion(CGUseItemFromInventory* pPacke pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ̵鿡 . + // ȸº¹ ½ÃÀÛÇ϶ó´Â ÆÐŶÀ» º¸´ÂÀ̵鿡°Ô º¸³½´Ù. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pSlayer->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(Period); @@ -445,7 +445,7 @@ void CGUseItemFromInventoryHandler::executePotion(CGUseItemFromInventory* pPacke notRecoverHP = true; } - // MP ȸ Ѵٸ... + // MP ȸº¹¾çÀÌ Á¸ÀçÇÑ´Ù¸é... if (MPAmount != 0 && MPQuantity != 0) { if (CurrentMP < MaxMP) { EffectManager* pEffectManager = pSlayer->getEffectManager(); @@ -458,27 +458,27 @@ void CGUseItemFromInventoryHandler::executePotion(CGUseItemFromInventory* pPacke Effect* pEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_MP_RECOVERY); EffectMPRecovery* pEffectMPRecoveryEffect = dynamic_cast(pEffect); - // Ƚ ä MP Ѵ. - // װ ȸ翡 Ѵ. + // ±âÁ¸ÀÇ ´ÜÀ§¾ç°ú Ƚ¼ö·Î ä¿ì´Â MP¾çÀ» °è»êÇÑ´Ù. + // ±×°ÍÀ» ÇöÀç ȸº¹¾ç¿¡ ´õÇÑ´Ù. int PrevMPAmount = pEffectMPRecoveryEffect->getMPQuantity() * pEffectMPRecoveryEffect->getPeriod(); MPAmount = min((int)(MPAmount + PrevMPAmount), MaxMP - CurrentMP); - // ߿ ū ȸ ̸ . + // µÑ Áß¿¡ Å« ´ÜÀ§È¸º¹¾ç°ú ÀÛÀº µô·¹À̸¦ ¾ò¾î³½´Ù. MPQuantity = max(MPQuantity, (int)(pEffectMPRecoveryEffect->getMPQuantity())); MPDelayProvider = min(MPDelayProvider, (int)(pEffectMPRecoveryEffect->getDelay())); - // ȸ , 󸶾 ȸ ΰ Ѵ. + // ÇöÀç ȸº¹¾çÀ» °¡Áö°í, ¾ó¸¶¾¿ ¸î¹ø¿¡ ȸº¹ÇÒ °ÍÀΰ¡¸¦ °áÁ¤ÇÑ´Ù. temp = (double)((double)MPAmount / (double)MPQuantity); Period = (uint)ceil(temp); Deadline = Period * MPDelayProvider; - // MP Recovery effect Ѵ. + // MP Recovery effect¸¦ °»½ÅÇÑ´Ù. pEffectMPRecoveryEffect->setDeadline(Deadline); pEffectMPRecoveryEffect->setDelay(MPDelayProvider); pEffectMPRecoveryEffect->setMPQuantity(MPQuantity); pEffectMPRecoveryEffect->setPeriod(Period); - // ȸ ϶ Ŷ ڽſ . + // ȸº¹ ½ÃÀÛÇ϶ó´Â ÆÐŶÀ» Àڽſ¡°Ô º¸³½´Ù. GCMPRecoveryStart gcMPRecoveryStart; gcMPRecoveryStart.setPeriod(pEffectMPRecoveryEffect->getPeriod()); gcMPRecoveryStart.setDelay(pEffectMPRecoveryEffect->getDelay()); @@ -500,7 +500,7 @@ void CGUseItemFromInventoryHandler::executePotion(CGUseItemFromInventory* pPacke pEffectManager->addEffect(pEffectMPRecovery); - // ȸ ϶ Ŷ ڽſ . + // ȸº¹ ½ÃÀÛÇ϶ó´Â ÆÐŶÀ» Àڽſ¡°Ô º¸³½´Ù. GCMPRecoveryStart gcMPRecoveryStart; gcMPRecoveryStart.setPeriod(Period); gcMPRecoveryStart.setDelay(MPDelayProvider); @@ -547,8 +547,8 @@ void CGUseItemFromInventoryHandler::executeMagazine(CGUseItemFromInventory* pPac Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -575,7 +575,7 @@ void CGUseItemFromInventoryHandler::executeMagazine(CGUseItemFromInventory* pPac } } - // reload delay Ƿ effect Ų. + // reload delay°¡ ÀÖÀ¸¹Ç·Î effect¿¡ µî·Ï ½ÃŲ´Ù. EffectManager* pEffectManager = pSlayer->getEffectManager(); if (pEffectManager == NULL) return; @@ -587,11 +587,11 @@ void CGUseItemFromInventoryHandler::executeMagazine(CGUseItemFromInventory* pPac pEffect->setObjectID(ItemObjectID); pEffect->setInventoryXY(InvenX, InvenY); - // by sigi. 2002.12.3. 1 --> 0.7 + // by sigi. 2002.12.3. 1ÃÊ --> 0.7ÃÊ if (pSlayer->hasSkill(SKILL_FAST_RELOAD)) - pEffect->setDeadline(7); // reload(0.7) + pEffect->setDeadline(7); // ºü¸¥ reload(0.7ÃÊ) else - pEffect->setDeadline(2 * 10); // reload(2sec) + pEffect->setDeadline(2 * 10); // º¸Åë reload(2sec) pSlayer->setFlag(Effect::EFFECT_CLASS_RELOAD_TIMER); pEffectManager->addEffect(pEffect); @@ -618,8 +618,8 @@ void CGUseItemFromInventoryHandler::executeETC(CGUseItemFromInventory* pPacket, Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -630,12 +630,12 @@ void CGUseItemFromInventoryHandler::executeETC(CGUseItemFromInventory* pPacket, Item* pItem = pInventory->getItem(InvenX, InvenY); // ObjectID_t ItemObjectID = pItem->getObjectID(); - // ̴ ̶, - // ׸ŭ ش. + // ¾ÆÀÌÅÛÀÌ ½×ÀÌ´Â Á¾·ùÀÇ ¾ÆÀÌÅÛÀ̶ó¸é, + // »ç¿ëÀ» ÇßÀ¸´Ï ±×¸¸Å­ »èÁ¦¸¦ ÇØ ÁØ´Ù. if (isStackable(pItem)) { decreaseItemNum(pItem, pInventory, pCreature->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); } else { - // ʴ ٷιٷ ش. + // ½×ÀÌÁö ¾Ê´Â ¾ÆÀÌÅÛÀº ¹Ù·Î¹Ù·Î »èÁ¦ÇØÁØ´Ù. pInventory->deleteItem(InvenX, InvenY); pItem->destroy(); SAFE_DELETE(pItem); @@ -659,8 +659,8 @@ void CGUseItemFromInventoryHandler::executeSerum(CGUseItemFromInventory* pPacket Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -675,9 +675,9 @@ void CGUseItemFromInventoryHandler::executeSerum(CGUseItemFromInventory* pPacket Vampire* pVampire = dynamic_cast(pCreature); - // ڸ ¶ . + // ÄÚ¸¶ »óŶó¸é »ç¿ëÇÒ ¼ö ¾ø´Ù. if (pVampire->isFlag(Effect::EFFECT_CLASS_COMA) - // ڰ ƴϸ . + // ¼ÛÆíÀÎ °æ¿ì´Â À¯·á »ç¿ëÀÚ°¡ ¾Æ´Ï¸é »ç¿ëÇÒ ¼ö ¾ø´Ù. || pItem->getItemType() == 5 && !pGamePlayer->isPayPlaying() && !pGamePlayer->isPremiumPlay()) { GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); @@ -692,40 +692,40 @@ void CGUseItemFromInventoryHandler::executeSerum(CGUseItemFromInventory* pPacket RegenHP = pSerum->getHPAmount(); - int RegenPeriod = pSerum->getPeriod() * 10; // ð ֱ - int RegenCount = pSerum->getCount(); // ð ݺ ΰ? + int RegenPeriod = pSerum->getPeriod() * 10; // ´ÜÀ§ ½Ã°£ÀÇ ÁÖ±â + int RegenCount = pSerum->getCount(); // ¸î¹ø ´ÜÀ§ ½Ã°£À» ¹Ýº¹ÇÒ °ÍÀΰ¡? - int RegenHPUnit = (int)((float)MaxHP * (float)RegenHP * 0.01); // ѹ ȸϴ HP + int RegenHPUnit = (int)((float)MaxHP * (float)RegenHP * 0.01); // Çѹø¿¡ ȸº¹ÇÏ´Â HPÀÇ ¾ç int HPAmount = min(MaxHP - CurrentHP, RegenHPUnit * RegenCount); - // HP ȸ Ѵٸ... + // HP ȸº¹¾çÀÌ Á¸ÀçÇÑ´Ù¸é... if (HPAmount != 0) { - // 󸶾 ʸ. + // ¾ó¸¶¾¿ ¸î¹ø ¸îÃʸ¶´Ù. if (CurrentHP < MaxHP) { EffectManager* pEffectManager = pVampire->getEffectManager(); - Turn_t Period = RegenCount; // ȸŰ? - Turn_t Deadline = RegenPeriod * Period; // ? + Turn_t Period = RegenCount; // ¸î¹ø ȸº¹½ÃŰ³ª? + Turn_t Deadline = RegenPeriod * Period; // ¾ðÁ¦ ³¡³ª³ª? if (pVampire->isFlag(Effect::EFFECT_CLASS_HP_RECOVERY)) { Effect* pEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_HP_RECOVERY); EffectHPRecovery* pEffectHPRecoveryEffect = dynamic_cast(pEffect); - // ؾ Ѵٴ ش. + // ¸î¹ø ´õ ÇØ¾ß ÇÑ´Ù´Â °ÍÀ» °»½ÅÇØ ÁØ´Ù. Turn_t OldCount = pEffectHPRecoveryEffect->getPeriod(); Turn_t NewPeriod = OldCount + Period; pEffectHPRecoveryEffect->setPeriod(NewPeriod); pEffectHPRecoveryEffect->setDeadline(NewPeriod * RegenPeriod); - // ȸ ϶ Ŷ ڽſ . + // ȸº¹ ½ÃÀÛÇ϶ó´Â ÆÐŶÀ» Àڽſ¡°Ô º¸³½´Ù. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; - gcHPRecoveryStartToSelf.setPeriod(NewPeriod); // ȸϳ? - gcHPRecoveryStartToSelf.setDelay(RegenPeriod); // ϳ? - gcHPRecoveryStartToSelf.setQuantity(RegenHPUnit); // ѹ 󸶳 ȸϳ? + gcHPRecoveryStartToSelf.setPeriod(NewPeriod); // ¸î¹ø ȸº¹Çϳª? + gcHPRecoveryStartToSelf.setDelay(RegenPeriod); // ¸î ÃÊ ´ÜÀ§·Î Çϳª? + gcHPRecoveryStartToSelf.setQuantity(RegenHPUnit); // Çѹø¿¡ ¾ó¸¶³ª ȸº¹Çϳª? pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ٸ̵鿡 . - // ȸ Ŷ, ۰ Ŷ . + // ȸº¹ ½ÃÀÛÇ϶ó´Â ÆÐŶÀ» ´Ù¸¥À̵鿡°Ô º¸³½´Ù. + // ȸº¹ °»½Å ÆÐŶ, ½ÃÀÛ°ú ¶È °°Àº ÆÐŶÀ» º¸³½´Ù. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pVampire->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(NewPeriod); @@ -747,7 +747,7 @@ void CGUseItemFromInventoryHandler::executeSerum(CGUseItemFromInventory* pPacket pEffectManager->addEffect(pEffectHPRecovery); - // ȸ ϶ Ŷ ڽſ . + // ȸº¹ ½ÃÀÛÇ϶ó´Â ÆÐŶÀ» Àڽſ¡°Ô º¸³½´Ù. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; gcHPRecoveryStartToSelf.setPeriod(Period); gcHPRecoveryStartToSelf.setDelay(RegenPeriod); @@ -755,7 +755,7 @@ void CGUseItemFromInventoryHandler::executeSerum(CGUseItemFromInventory* pPacket pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ̵鿡 . + // ȸº¹ ½ÃÀÛÇ϶ó´Â ÆÐŶÀ» º¸´ÂÀ̵鿡°Ô º¸³½´Ù. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pVampire->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(Period); @@ -801,8 +801,8 @@ void CGUseItemFromInventoryHandler::executeVampireETC(CGUseItemFromInventory* pP Assert(pPlayer != NULL); /* - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -813,15 +813,15 @@ void CGUseItemFromInventoryHandler::executeVampireETC(CGUseItemFromInventory* pP Item* pItem = pInventory->getItem(InvenX, InvenY); ObjectID_t ItemObjectID = pItem->getObjectID(); - // ̴ ̶, - // ׸ŭ ش. + // ¾ÆÀÌÅÛÀÌ ½×ÀÌ´Â Á¾·ùÀÇ ¾ÆÀÌÅÛÀ̶ó¸é, + // »ç¿ëÀ» ÇßÀ¸´Ï ±×¸¸Å­ »èÁ¦¸¦ ÇØ ÁØ´Ù. if (isStackable(pItem)) { decreaseItemNum(pItem, pInventory, pCreature->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); } else { - // ʴ ٷιٷ ش. + // ½×ÀÌÁö ¾Ê´Â ¾ÆÀÌÅÛÀº ¹Ù·Î¹Ù·Î »èÁ¦ÇØÁØ´Ù. pInventory->deleteItem(InvenX, InvenY); pItem->destroy(); SAFE_DELETE(pItem); @@ -845,8 +845,8 @@ void CGUseItemFromInventoryHandler::executeSlayerPortalItem(CGUseItemFromInvento Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -873,14 +873,14 @@ void CGUseItemFromInventoryHandler::executeSlayerPortalItem(CGUseItemFromInvento return; } - // Relic ϰ ִٸ,⸦ θ . + // ¸¸¾à RelicÀ» ¼ÒÀ¯Çϰí ÀÖ´Ù¸é,Çï±â¸¦ ºÎ¸¦ ¼ö ¾ø´Ù. bool bHasRelic = false; if (pSlayer->hasRelicItem() || pSlayer->isFlag(Effect::EFFECT_CLASS_HAS_FLAG) || pSlayer->isFlag(Effect::EFFECT_CLASS_HAS_SWEEPER)) { bHasRelic = true; } - // ȭǾ ִٸ ⸦ θ . + // ¼®È­µÇ¾î ÀÖ´Ù¸é Çï±â¸¦ ºÎ¸¦ ¼ö ¾ø´Ù. bool bParalyze = pSlayer->isFlag(Effect::EFFECT_CLASS_PARALYZE) ? true : false; bool bZoneTypeCheck = (pZone->getZoneType() == ZONE_NORMAL_FIELD) ? true : false; @@ -891,23 +891,23 @@ void CGUseItemFromInventoryHandler::executeSlayerPortalItem(CGUseItemFromInvento // if (bZoneTypeCheck && bCanUseCheck && bChargeCheck && !bMotorcycleCheck) if (bZoneTypeCheck && bCanUseCheck && bChargeCheck && !bHasRelic && !bParalyze && !bZoneCheck) { - // ۿ ̰, ̾ Ʈ ɾش. + // ¾ÆÀÌÅÛ¿¡ Â÷Áö¸¦ ÁÙÀ̰í, ½½·¹À̾°Ô ÀÌÆåÆ®¸¦ °É¾îÁØ´Ù. pPortalItem->setCharge(pPortalItem->getCharge() - 1); - // pPortalItem->save(pSlayer->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); // Ѵ. - // ȭ. by sigi. 2002.5.13 + // pPortalItem->save(pSlayer->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); // ¾ÆÀÌÅÛ Á¤º¸¸¦ ÀúÀåÇÑ´Ù. + // ¾ÆÀÌÅÛ ÀúÀå ÃÖÀûÈ­. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Charge=%d", pPortalItem->getCharge()); pPortalItem->tinysave(pField); pSlayer->setFlag(Effect::EFFECT_CLASS_SLAYER_PORTAL); - // ֺٰ ϶ Ŷ Ѹ. + // ÁÖº¯¿¡´Ù°¡ Çï±â ´õÇ϶ó´Â ÆÐŶÀ» »Ñ¸°´Ù. GCAddHelicopter gcAddHelicopter; gcAddHelicopter.setObjectID(pSlayer->getObjectID()); gcAddHelicopter.setCode(0); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcAddHelicopter); - // Ŷ ش. + // ÀÎÁõ ÆÐŶÀ» º¸³»ÁØ´Ù. GCUseOK gcUseOK; pPlayer->sendPacket(&gcUseOK); } else { @@ -931,8 +931,8 @@ void CGUseItemFromInventoryHandler::executeOustersSummonItem(CGUseItemFromInvent Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -958,7 +958,7 @@ void CGUseItemFromInventoryHandler::executeOustersSummonItem(CGUseItemFromInvent Assert(pOusters != NULL); Assert(pSummonItem != NULL); - // Relic ϰ ִٸ,⸦ θ . + // ¸¸¾à RelicÀ» ¼ÒÀ¯Çϰí ÀÖ´Ù¸é,Çï±â¸¦ ºÎ¸¦ ¼ö ¾ø´Ù. bool bHasRelic = false; if (pOusters->hasRelicItem() || pOusters->isFlag(Effect::EFFECT_CLASS_REFINIUM_TICKET) || pOusters->isFlag(Effect::EFFECT_CLASS_SUMMON_SYLPH) || @@ -967,7 +967,7 @@ void CGUseItemFromInventoryHandler::executeOustersSummonItem(CGUseItemFromInvent bHasRelic = true; } - // ȭǾ ִٸ ⸦ θ . + // ¼®È­µÇ¾î ÀÖ´Ù¸é Çï±â¸¦ ºÎ¸¦ ¼ö ¾ø´Ù. bool bParalyze = pOusters->isFlag(Effect::EFFECT_CLASS_PARALYZE) ? true : false; bool bCanUseCheck = pOusters->isRealWearing(pSummonItem); @@ -992,15 +992,15 @@ void CGUseItemFromInventoryHandler::executeOustersSummonItem(CGUseItemFromInvent GCModifyInformation gcMI; decreaseMana(pOusters, RequireMP, gcMI); - // ۿ ̰, ̾ Ʈ ɾش. + // ¾ÆÀÌÅÛ¿¡ Â÷Áö¸¦ ÁÙÀ̰í, ½½·¹À̾°Ô ÀÌÆåÆ®¸¦ °É¾îÁØ´Ù. pSummonItem->setCharge(pSummonItem->getCharge() - 1); - // pSummonItem->save(pOusters->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); // Ѵ. - // ȭ. by sigi. 2002.5.13 + // pSummonItem->save(pOusters->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); // ¾ÆÀÌÅÛ Á¤º¸¸¦ ÀúÀåÇÑ´Ù. + // ¾ÆÀÌÅÛ ÀúÀå ÃÖÀûÈ­. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Charge=%d", pSummonItem->getCharge()); pSummonItem->tinysave(pField); - // Ʈ Ŭ δ. + // ÀÌÆÑÆ® Ŭ·¡½º¸¦ ¸¸µé¾î ºÙÀδÙ. EffectSummonSylph* pEffect = new EffectSummonSylph(pOusters); pEffect->setEClass((Effect::EffectClass)pItemInfo->getEffectID()); pOusters->addEffect(pEffect); @@ -1011,7 +1011,7 @@ void CGUseItemFromInventoryHandler::executeOustersSummonItem(CGUseItemFromInvent pOusters->initAllStat(); pOusters->addModifyInfo(prev, gcMI); - // Ŷ ش. + // ÀÎÁõ ÆÐŶÀ» º¸³»ÁØ´Ù. GCUseOK gcUseOK; pPlayer->sendPacket(&gcUseOK); pPlayer->sendPacket(&gcMI); @@ -1055,8 +1055,8 @@ void CGUseItemFromInventoryHandler::executeKeyItem(CGUseItemFromInventory* pPack Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -1074,16 +1074,16 @@ void CGUseItemFromInventoryHandler::executeKeyItem(CGUseItemFromInventory* pPack return; } - // SLAYER ƴ϶ ̸ ȣ . + // SLAYER°¡ ¾Æ´Ï¶ó¸é ¿ÀÅä¹ÙÀ̸¦ È£ÃâÇÒ ¼ö ¾ø´Ù. Assert(pCreature->isSlayer()); Slayer* pSlayer = dynamic_cast(pCreature); - // ȯ Ǿ־ Ѵ. - // ڸ ¶ . - // ƴ϶, ̸ ȣ . - //  Ż Ұ ȯ Ұ - // premium ڸ ȣⰡϴ. + // ¼Òȯ °¡´É »óÅ ¼³Á¤ÀÌ µÇ¾îÀÖ¾î¾ß ÇÑ´Ù. + // ÄÚ¸¶ »óŶó¸é »ç¿ëÇÒ ¼ö ¾ø´Ù. + // ¾ÆÀÌÅÛÀÌ ¿­¼è ¾ÆÀÌÅÛÀÌ ¾Æ´Ï¶ó¸é, ¿ÀÅä¹ÙÀ̸¦ È£ÃâÇÒ ¼ö ¾ø´Ù. + // ¸¶½ºÅÍ ·¹¾î³ª Æ÷Å» »ç¿ë ºÒ°¡ Áö¿ª¿£ ¿ÀÅä¹ÙÀÌ ¼Òȯ ºÒ°¡ + // premium »ç¿ëÀÚ¸¸ È£Ãâ°¡´ÉÇÏ´Ù. if (!g_pVariableManager->isSummonMotorcycle() || pSlayer->hasRideMotorcycle() || pItem->getItemClass() != Item::ITEM_CLASS_KEY || pSlayer->isFlag(Effect::EFFECT_CLASS_COMA) || (pZone->getZoneLevel(pCreature->getX(), pCreature->getY()) & SAFE_ZONE) || pZone->isMasterLair() || @@ -1096,24 +1096,24 @@ void CGUseItemFromInventoryHandler::executeKeyItem(CGUseItemFromInventory* pPack return; } - // Ǿ ִ ȮѴ. + // ±âÁ¸¿¡ ¾ÆÀÌÅÛÀÌ »ý¼ºµÇ¾î ÀÖ´ÂÁö¸¦ È®ÀÎÇÑ´Ù. ItemID_t targetID = dynamic_cast(pItem)->getTarget(); Statement* pStmt = NULL; Result* pResult = NULL; - // targetID 0 .. targetID(motorcycleObject ItemID) ȵ . - // ӽ÷ targetID key ItemID ϸ ȴ... . - // targetID motorcycle itemID  .. - // broadcasting .. Assert() ؼ ٿǾ... . - -; + // targetID°¡ 0ÀÎ °æ¿ì´Â.. targetID(motorcycleObjectÀÇ ItemID)°¡ ¼³Á¤ÀÌ ¾ÈµÈ °æ¿ì´Ù. + // ÀÌ ¶§´Â Àӽ÷ΠtargetID¸¦ keyÀÇ ItemID¿Í °°°Ô ÇÏ¸é µÈ´Ù...°í º»´Ù. + // targetID°¡ motorcycleÀÇ itemID·Î µé¾î°¡±â ¶§¹®¿¡.. + // broadcasting µî¿¡¼­.. Assert()¿¡ ÀÇÇØ¼­ ´Ù¿îµÇ¾ú´Ù...°í º¸¿©Áø´Ù. - -; // by sigi. 2002.12.25 x-mas T_T; if (targetID == 0) { Key* pKey = dynamic_cast(pItem); Assert(pKey != NULL); targetID = pKey->setNewMotorcycle(pSlayer); - /* // (!) MotorcycleObject ϰ MotorcycleItemID==Target ޾ƾ Ѵ. - // ڵ Լ ⸦.. -_-; by sigi + /* // (!) MotorcycleObject¸¦ »ý¼ºÇϰí MotorcycleItemID==Target¸¦ ¹Þ¾Æ¾ß ÇÑ´Ù. + // ÀÌ ÄÚµå Á¦¹ß ÇÔ¼ö·Î »©±â¸¦.. -_-; by sigi Key* pKey = dynamic_cast(pItem); KeyInfo* pKeyInfo = dynamic_cast(g_pItemInfoManager->getItemInfo( pKey->getItemClass(), @@ -1132,7 +1132,7 @@ void CGUseItemFromInventoryHandler::executeKeyItem(CGUseItemFromInventory* pPack targetID = pMotorcycle->getItemID(); - // targetID DB updateѾ Ѵ. + // targetID¸¦ DB¿¡µµ update½ÃÄÑ¾ß ÇÑ´Ù. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); @@ -1148,11 +1148,11 @@ void CGUseItemFromInventoryHandler::executeKeyItem(CGUseItemFromInventory* pPack filelog("motorcycle.txt", "[SetTargetID] Owner = %s, KeyID = %lu, Key's targetID = %lu, MotorcycleID = %lu", pSlayer->getName().c_str(), pKey->getItemID(), pKey->getTarget(), pMotorcycle->getItemID() ); - // ؿ pMotorcycle ص ǰ, ڵ ǵ帱 ⼭ . + // ¹Ø¿¡¼­ pMotorcycleÀ» »ç¿ëÇØµµ µÇ°ÚÁö¸¸, ±âÁ¸ ÄÚµå ¾È °Çµå¸±·Á°í ¿©±â¼­ Áö¿î´Ù. SAFE_DELETE(pMotorcycle);*/ } else { - // ѹ ͻŬ̶ Ű ƴµ ͻŬ ڲ 쳪. - // Ű ͻŬ ִ üũϰ  ־ش. + // Çѹø ¸ðÅÍ»çÀÌŬÀ̶û ۶û ¿¬°áµÆ´Âµ¥ ¸ðÅÍ»çÀÌŬÀ» ´©°¡ ÀÚ²Ù Áö¿ì³ªº¸´Ù. + // Ű¿¡ ¿¬°áµÈ ¸ðÅÍ»çÀÌŬÀÌ ½ÇÁ¦·Î µðºñ¿¡ ÀÖ´ÂÁö üũÇÏ°í ¾øÀ¸¸é »õ·Î ¸¸µé¾î¼­ ³Ö¾îÁØ´Ù. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pResult = pStmt->executeQuery("SELECT ItemID FROM MotorcycleObject WHERE ItemID=%lu", targetID); @@ -1170,7 +1170,7 @@ void CGUseItemFromInventoryHandler::executeKeyItem(CGUseItemFromInventory* pPack } - // ʻ ڵ -_-; + // ÇÊ»ì ¹æ¾î ÄÚµå -_-; if (targetID == 0) { filelog("errorLog.txt", "[ActionRedeemMotorcycle] itemID=%lu, motorItemID=%lu", (int)pItem->getItemID(), (int)targetID); @@ -1179,7 +1179,7 @@ void CGUseItemFromInventoryHandler::executeKeyItem(CGUseItemFromInventory* pPack if (g_pParkingCenter->hasMotorcycleBox(targetID)) { - ////cout << " ҷ ̰ ֽϴ" << endl; + ////cout << "±âÁ¸¿¡ ºÒ·ÁÁø ¿ÀÅä¹ÙÀ̰¡ ÀÖ½À´Ï´Ù" << endl; MotorcycleBox* pMotorcycleBox = g_pParkingCenter->getMotorcycleBox(targetID); @@ -1189,24 +1189,24 @@ void CGUseItemFromInventoryHandler::executeKeyItem(CGUseItemFromInventory* pPack ZoneCoord_t motorY = pMotorcycleBox->getY(); Motorcycle* pMotorcycle = pMotorcycleBox->getMotorcycle(); - // ִ - // Ÿ ʹ θ ~ + // °°Àº Á¸¿¡ ÀÖ´Â °æ¿ì + // °Å¸®°¡ ³Ê¹« °¡±î¿ì¸é ºÎ¸£Áö ¸»ÀÚ~ if (pMotorZone != pZone || pSlayer->getDistance(motorX, motorY) > 15) { - // ٸ zone ̵̶ ǥѴ. + // ´Ù¸¥ zoneÀ¸·Î À̵¿ÁßÀ̶ó°í Ç¥½ÃÇÑ´Ù. pMotorcycleBox->setTransport(); - // motorcycle slayer zone ű. + // motorcycleÀ» slayerÀÇ zoneÀ¸·Î ¿Å±ä´Ù. pMotorZone->transportItem(motorX, motorY, pMotorcycle, pZone, pSlayer->getX(), pSlayer->getY()); - // Use OK ̴. - // Useϸ ׷ ʹ. - -; + // Use OK ´ë¿ëÀÌ´Ù. + // UseÇÏ¸é ¾ÆÀÌÅÛÀÌ »ç¶óÁö´ø°¡ ±×·¸Áö ½Í´Ù. - -; /* GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); pGamePlayer->sendPacket(&_GCCannotUse); */ - // ѵ delay ϴµ.. + // Çѵ¿¾È delay¸¦ Áà¾ßÇϴµ¥.. } } @@ -1245,7 +1245,7 @@ void CGUseItemFromInventoryHandler::executeKeyItem(CGUseItemFromInventory* pPack durability = 300; } - // ο ü Ѵ. + // »õ·Î¿î ¿ÀÅä¹ÙÀÌ °´Ã¼¸¦ »ý¼ºÇÑ´Ù. Motorcycle* pMotorcycle = new Motorcycle(itemType, optionTypes); Assert(pMotorcycle != NULL); @@ -1253,22 +1253,22 @@ void CGUseItemFromInventoryHandler::executeKeyItem(CGUseItemFromInventory* pPack pMotorcycle->setItemID(itemID); pMotorcycle->setDurability(durability); - // Object ID Ҵޱ + // Object ID ÇÒ´ç¹Þ±â (pZone->getObjectRegistry()).registerObject(pMotorcycle); - // ̸ ߰Ѵ. - ////cout << "̸ ߰մϴ" << pSlayer->getX() << " " << pSlayer->getY() << endl; + // ¿ÀÅä¹ÙÀ̸¦ Á¸¿¡ Ãß°¡ÇÑ´Ù. + ////cout << "¿ÀÅä¹ÙÀ̸¦ Á¸¿¡ Ãß°¡ÇÕ´Ï´Ù" << pSlayer->getX() << " " << pSlayer->getY() << endl; TPOINT pt = pZone->addItem(pMotorcycle, pSlayer->getX(), pSlayer->getY(), false); if (pt.x == -1) { StringStream msg; - msg << "̸ ϴ: " + msg << "¿ÀÅä¹ÙÀ̸¦ Á¸¿¡ ³ÖÀ» ¼ö ¾ø½À´Ï´Ù: " << "ZoneID=" << (int)pZone->getZoneID() << ", X=" << (int)pSlayer->getX() << ", Y=" << (int)pSlayer->getY(); filelog("motorError.txt", "%s", msg.toString().c_str()); - // throw Error("̸ ϴ"); + // throw Error("¿ÀÅä¹ÙÀ̸¦ Á¸¿¡ ³ÖÀ» ¼ö ¾ø½À´Ï´Ù"); SAFE_DELETE(pMotorcycle); } else { @@ -1281,14 +1281,14 @@ void CGUseItemFromInventoryHandler::executeKeyItem(CGUseItemFromInventory* pPack durability); } - // ̸ Parking Center Ѵ. + // ¿ÀÅä¹ÙÀ̸¦ Parking Center¿¡ µî·ÏÇÑ´Ù. MotorcycleBox* pBox = new MotorcycleBox(pMotorcycle, pZone, pt.x, pt.y); Assert(pBox != NULL); g_pParkingCenter->addMotorcycleBox(pBox); } - // Ŷ̴. + // °ËÁõ ÆÐŶÀÌ´Ù. GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); pGamePlayer->sendPacket(&_GCCannotUse); @@ -1345,8 +1345,8 @@ void CGUseItemFromInventoryHandler::executeFirecraker(CGUseItemFromInventory* pP Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -1435,8 +1435,8 @@ void CGUseItemFromInventoryHandler::executeFirecraker(CGUseItemFromInventory* pP pPlayer->sendPacket(&gcMI); } } else { - // ŸϿ ų ̶ ִ üũѴ. - // 뿡 . + // ŸÀÏ¿¡ ½ºÅ³À» ¾²´Â °ÍÀ̶ó°í º¸°í ¾µ ¼ö ÀÖ´ÂÁö¸¦ üũÇÑ´Ù. + // ¾ÈÀüÁö´ë¿¡¼­´Â »ç¿ëÇÒ ¼ö ¾ø´Ù. if (!isAbleToUseTileSkill(pCreature) || (pZone->getZoneLevel(pCreature->getX(), pCreature->getY()) & COMPLETE_SAFE_ZONE) || ItemObjectID != pPacket->getObjectID()) { @@ -1474,12 +1474,12 @@ void CGUseItemFromInventoryHandler::executeFirecraker(CGUseItemFromInventory* pP Assert(false); break; }*/ - // Ʈ  εij Ѵ. + // ¿¡ÆåÆ®¸¦ ¸¸µé¾î¼­ ºê·Îµåij½ºÆÃ ÇÑ´Ù. GCAddEffectToTile gcAddEffectToTile; gcAddEffectToTile.setObjectID(pCreature->getObjectID()); gcAddEffectToTile.setEffectID(effectClass); gcAddEffectToTile.setXY(pCreature->getX(), pCreature->getY()); - gcAddEffectToTile.setDuration(10); // ǹ ׳ 1 + gcAddEffectToTile.setDuration(10); // º° ÀÇ¹Ì ¾ø´Ù ±×³É 1ÃÊ pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcAddEffectToTile); } @@ -1487,13 +1487,13 @@ void CGUseItemFromInventoryHandler::executeFirecraker(CGUseItemFromInventory* pP if (isStackable(pItem)) { decreaseItemNum(pItem, pInventory, pCreature->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); } else { - // ʴ ٷιٷ ش. + // ½×ÀÌÁö ¾Ê´Â ¾ÆÀÌÅÛÀº ¹Ù·Î¹Ù·Î »èÁ¦ÇØÁØ´Ù. pInventory->deleteItem(InvenX, InvenY); pItem->destroy(); SAFE_DELETE(pItem); } - // ߴٰ Ŭ̾Ʈ ˸. + // ¾ÆÀÌÅÛÀ» »ç¿ëÇß´Ù°í Ŭ¶óÀÌ¾ðÆ®¿¡ ¾Ë¸°´Ù. GCUseOK gcUseOK; pGamePlayer->sendPacket(&gcUseOK); @@ -1511,8 +1511,8 @@ void CGUseItemFromInventoryHandler::executeDyePotion(CGUseItemFromInventory* pPa Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -1560,7 +1560,7 @@ void CGUseItemFromInventoryHandler::executeDyePotion(CGUseItemFromInventory* pPa case DyePotionInfo::FUNCTION_SEX: { int code = changeSexEx(pPC); if (code != 0) { - // -_-; ȯ ۸ Ʈ ̵𿡴ٰ ڵ ־ش. . + // -_-; ¼ºÀüȯ ¾ÆÀÌÅÛ¸¸ ¿ÀºêÁ§Æ® ¾ÆÀ̵𿡴ٰ¡ ¿¡·¯ÄÚµå ³Ö¾îÁØ´Ù. ¤Ì.¤Ð GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID((ObjectID_t)code); pPlayer->sendPacket(&_GCCannotUse); @@ -1667,7 +1667,7 @@ void CGUseItemFromInventoryHandler::executeDyePotion(CGUseItemFromInventory* pPa if (isStackable(pItem)) { decreaseItemNum(pItem, pInventory, pCreature->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); } else { - // ʴ ٷιٷ ش. + // ½×ÀÌÁö ¾Ê´Â ¾ÆÀÌÅÛÀº ¹Ù·Î¹Ù·Î »èÁ¦ÇØÁØ´Ù. pInventory->deleteItem(InvenX, InvenY); pItem->destroy(); SAFE_DELETE(pItem); @@ -1852,8 +1852,8 @@ void CGUseItemFromInventoryHandler::executeResurrectItem(CGUseItemFromInventory* Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -1865,16 +1865,16 @@ void CGUseItemFromInventoryHandler::executeResurrectItem(CGUseItemFromInventory* ResurrectItemInfo* pItemInfo = dynamic_cast(g_pItemInfoManager->getItemInfo(pItem->getItemClass(), pItem->getItemType())); - // cout << "Resurrection : " << pPC->getName() << " : " << pItem->getItemType() << endl; + // cout << "Resurrection ¾ÆÀÌÅÛÀ» »ç¿ëÇÔ : " << pPC->getName() << " : " << pItem->getItemType() << endl; if (pItem->getObjectID() != pPacket->getObjectID() || pItemInfo == NULL) { - // cout << " Ʈ Ƶ Ʋ" << endl; + // cout << "¾ÆÅÛ ¿ÀºêÁ§Æ® ¾Æµð°¡ Ʋ¸²" << endl; sendCannotUse(pPacket, pPlayer); return; } if (!pPC->isFlag(Effect::EFFECT_CLASS_COMA)) { - // cout << " ° ƴ" << endl; + // cout << "Á×Àº »óŰ¡ ¾Æ´Ô" << endl; sendCannotUse(pPacket, pPlayer); return; } @@ -1919,7 +1919,7 @@ void CGUseItemFromInventoryHandler::executeResurrectItem(CGUseItemFromInventory* } if (GDRLairManager::Instance().isGDRLairZone(pPC->getZoneID())) { - filelog("GDRLair.log", "%s %d Ȱ ũ ߽ϴ.", pPC->getName().c_str(), + filelog("GDRLair.log", "%s°¡ %dÁ¸¿¡¼­ ºÎȰ ½ºÅ©·ÑÀ» »ç¿ëÇß½À´Ï´Ù.", pPC->getName().c_str(), pPC->getZoneID()); } } break; @@ -1943,20 +1943,20 @@ void CGUseItemFromInventoryHandler::executeResurrectItem(CGUseItemFromInventory* gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_BLOOD_DRAIN); - // ƸƮ ϱ Ʈ ٿش. + // ÈíÇ÷ ¾Æ¸£¹ÙÀÌÆ®¸¦ ¹æÁöÇϱâ À§ÇÑ ÈÄÀ¯Áõ ÀÌÆåÆ®¸¦ ºÙ¿©ÁØ´Ù. if (pSlayer->isFlag(Effect::EFFECT_CLASS_AFTERMATH)) { Effect* pEffect = pSlayer->getEffectManager()->findEffect(Effect::EFFECT_CLASS_AFTERMATH); EffectAftermath* pEffectAftermath = dynamic_cast(pEffect); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5ºÐ µ¿¾È Áö¼ÓµÈ´Ù. } else { EffectAftermath* pEffectAftermath = new EffectAftermath(pSlayer); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5ºÐ µ¿¾È Áö¼ÓµÈ´Ù. pSlayer->getEffectManager()->addEffect(pEffectAftermath); pSlayer->setFlag(Effect::EFFECT_CLASS_AFTERMATH); pEffectAftermath->create(pSlayer->getName()); } - // ġϸ ɷġ ȭϰ ȴ. + // ÈíÇ÷À» Ä¡·áÇÏ¸é ´É·ÂÄ¡°¡ º¯È­ÇÏ°Ô µÈ´Ù. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); @@ -1982,7 +1982,7 @@ void CGUseItemFromInventoryHandler::executeResurrectItem(CGUseItemFromInventory* } if (GDRLairManager::Instance().isGDRLairZone(pPC->getZoneID())) { - filelog("GDRLair.log", "%s %d ũ ߽ϴ.", pPC->getName().c_str(), + filelog("GDRLair.log", "%s°¡ %dÁ¸¿¡¼­ ¿¤¸¯¼­ ½ºÅ©·ÑÀ» »ç¿ëÇß½À´Ï´Ù.", pPC->getName().c_str(), pPC->getZoneID()); } } break; @@ -2013,7 +2013,7 @@ void CGUseItemFromInventoryHandler::executeResurrectItem(CGUseItemFromInventory* if (isStackable(pItem)) { decreaseItemNum(pItem, pInventory, pCreature->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); } else { - // ʴ ٷιٷ ش. + // ½×ÀÌÁö ¾Ê´Â ¾ÆÀÌÅÛÀº ¹Ù·Î¹Ù·Î »èÁ¦ÇØÁØ´Ù. pInventory->deleteItem(InvenX, InvenY); pItem->destroy(); SAFE_DELETE(pItem); @@ -2033,8 +2033,8 @@ void CGUseItemFromInventoryHandler::executeTranslator(CGUseItemFromInventory* pP Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -2047,7 +2047,7 @@ void CGUseItemFromInventoryHandler::executeTranslator(CGUseItemFromInventory* pP if (pItem->getObjectID() != pPacket->getObjectID() || pItemInfo == NULL || pPC->isFlag(Effect::EFFECT_CLASS_TRANSLATION)) { - ////cout << " Ʈ Ƶ Ʋ" << endl; + ////cout << "¾ÆÅÛ ¿ÀºêÁ§Æ® ¾Æµð°¡ Ʋ¸²" << endl; sendCannotUse(pPacket, pPlayer); return; } @@ -2055,7 +2055,7 @@ void CGUseItemFromInventoryHandler::executeTranslator(CGUseItemFromInventory* pP EffectTranslation* pEffect = new EffectTranslation(pPC); Assert(pEffect != NULL); - pEffect->setDeadline(6000); // 10 + pEffect->setDeadline(6000); // 10ºÐ pPC->addEffect(pEffect); pPC->setFlag(Effect::EFFECT_CLASS_TRANSLATION); @@ -2071,7 +2071,7 @@ void CGUseItemFromInventoryHandler::executeTranslator(CGUseItemFromInventory* pP if (isStackable(pItem)) { decreaseItemNum(pItem, pInventory, pCreature->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); } else { - // ʴ ٷιٷ ش. + // ½×ÀÌÁö ¾Ê´Â ¾ÆÀÌÅÛÀº ¹Ù·Î¹Ù·Î »èÁ¦ÇØÁØ´Ù. pInventory->deleteItem(InvenX, InvenY); pItem->destroy(); SAFE_DELETE(pItem); @@ -2090,8 +2090,8 @@ void CGUseItemFromInventoryHandler::executeEffectItem(CGUseItemFromInventory* pP Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -2128,7 +2128,7 @@ void CGUseItemFromInventoryHandler::executeEffectItem(CGUseItemFromInventory* pP if (isStackable(pItem)) { decreaseItemNum(pItem, pInventory, pCreature->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); } else { - // ʴ ٷιٷ ش. + // ½×ÀÌÁö ¾Ê´Â ¾ÆÀÌÅÛÀº ¹Ù·Î¹Ù·Î »èÁ¦ÇØÁØ´Ù. pInventory->deleteItem(InvenX, InvenY); pItem->destroy(); SAFE_DELETE(pItem); @@ -2148,8 +2148,8 @@ void CGUseItemFromInventoryHandler::executePetItem(CGUseItemFromInventory* pPack Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -2183,13 +2183,13 @@ void CGUseItemFromInventoryHandler::executePetItem(CGUseItemFromInventory* pPack if (pPetItem != NULL) { PetInfo* pTargetPetInfo = pPetItem->getPetInfo(); if (pTargetPetInfo->getPetHP() == 0) { - // cout << pPC->getName() << " θ " << endl; + // cout << pPC->getName() << " Á×Àº Æê ºÎ¸£Áö ¸¶¼À" << endl; sendCannotUse(pPacket, pPlayer); return; } if (pTargetPetInfo->getPetType() >= PET_CENTAURO && pPC->getQuestLevel() < 40) { - filelog("Pet.log", " ȵǴ 2 θ ׷ : [%s:%s]", pGamePlayer->getID().c_str(), + filelog("Pet.log", "·¹º§ ¾ÈµÇ´Â ³ÑÀÌ 2Â÷Æê ºÎ¸¦¶ó°í ±×·±´Ù : [%s:%s]", pGamePlayer->getID().c_str(), pPC->getName().c_str()); sendCannotUse(pPacket, pPlayer); return; @@ -2223,8 +2223,8 @@ void CGUseItemFromInventoryHandler::executePetFood(CGUseItemFromInventory* pPack Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -2294,8 +2294,8 @@ void CGUseItemFromInventoryHandler::executeEventGiftBox(CGUseItemFromInventory* Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -2306,9 +2306,9 @@ void CGUseItemFromInventoryHandler::executeEventGiftBox(CGUseItemFromInventory* Item* pItem = pInventory->getItem(InvenX, InvenY); // ObjectID_t ItemObjectID = pItem->getObjectID(); - // ڰ ƴ϶ + // °ËÀº»ö ¼±¹° »óÀÚ°¡ ¾Æ´Ï¶ó¸é »ç¿ëÇÒ ¼ö ¾ø´Ù if (pItem->getItemType() < 6 || (pItem->getItemType() >= 16 && pItem->getItemType() <= 18)) { - filelog("GiftBoxErrorLog.txt", "[Name] : %s , [ItemType] : %d : ߸ Ÿ\n", + filelog("GiftBoxErrorLog.txt", "[Name] : %s , [ItemType] : %d : À߸øµÈ ¾ÆÀÌÅÛ Å¸ÀÔ\n", pCreature->getName().c_str(), pItem->getItemType()); return; } @@ -2360,8 +2360,8 @@ void CGUseItemFromInventoryHandler::executeEventGiftBox(CGUseItemFromInventory* } } */ - // ڰ ϴ 2*2  ũ̹Ƿ Inventory ˻ - // (  Ȳ ߻ϸ ϹǷ) + // °ËÀº»óÀÚ°¡ º¯ÇÏ´Â ¾ÆÀÌÅÛÀÌ 2*2 ¿¡ ´Ù µé¾î°¡´Â Å©±âÀ̹ǷΠInventory °Ë»ç´Â »ý·« + // (¸¸¾à °ËÀº »óÀÚ Áö¿ì°í ³ª¼­ ¾È µé¾î°¡´Â »óȲ ¹ß»ýÇÏ¸é °ï¶õÇϹǷÎ) Item* pResultItem = NULL; bool bFullStack = true; @@ -2450,17 +2450,17 @@ void CGUseItemFromInventoryHandler::executeEventGiftBox(CGUseItemFromInventory* bFullStack = false; if (value < 70) { - // ũ + // ¿¤¸¯¼­ ½ºÅ©·Ñ pResultItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_RESURRECT_ITEM, 1, list()); } else if (value < 95) { - // + // »¡°£ ¶±±¹ pResultItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_EVENT_STAR, 8, list()); } else if (value < 99) { - // ũ + // ¿¤¸¯¼­ ½ºÅ©·Ñ ¹­À½ pResultItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_RESURRECT_ITEM, 1, list()); pResultItem->setNum(9); } else { - // Ǽ縮 ͽ A + // ¾Ç¼¼»ç¸® ¹Í½ÌÆ÷Áö AÇü pResultItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_MIXING_ITEM, 6, list()); } } else if (pItem->getItemType() == 20) { @@ -2468,17 +2468,17 @@ void CGUseItemFromInventoryHandler::executeEventGiftBox(CGUseItemFromInventory* bFullStack = false; if (value < 70) { - // Ȱ ũ + // ºÎȰ ½ºÅ©·Ñ pResultItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_RESURRECT_ITEM, 0, list()); } else if (value < 95) { - // Ķ + // ÆÄ¶õ ¶±±¹ pResultItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_EVENT_STAR, 10, list()); } else if (value < 99) { - // 50 + // ºí·ç¹öµå 50°³ pResultItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_EVENT_STAR, 12, list()); pResultItem->setNum(50); } else { - // Ƹ ͽ A + // ¾Æ¸Ó ¹Í½ÌÆ÷Áö AÇü pResultItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_MIXING_ITEM, 3, list()); } } @@ -2488,27 +2488,27 @@ void CGUseItemFromInventoryHandler::executeEventGiftBox(CGUseItemFromInventory* bFullStack = false; if (value < 70) { - // Ȱ ũ + // ºÎȰ ½ºÅ©·Ñ pResultItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_RESURRECT_ITEM, 0, list()); } else if (value < 95) { - // + // ³ì»ö ¶±±¹ pResultItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_EVENT_STAR, 9, list()); } else if (value < 99) { - // ˸ 3 + // ¾Ë¸²ÆÇ 3 pResultItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_EVENT_TREE, 28, list()); } else { - // Ǫ 4 + // Ǫ´õ 4°³ pResultItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_PET_FOOD, 4, list()); pResultItem->setNum(4); } } if (pResultItem == NULL) { - filelog("GiftBoxErrorLog.txt", "[Name] : %s : ִ \n", pCreature->getName().c_str()); + filelog("GiftBoxErrorLog.txt", "[Name] : %s : ÁÙ ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÌ ¾ø´Ù\n", pCreature->getName().c_str()); return; } - // ִ ̸ äش + // ½×ÀÏ ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÌ¸é ²Ë Ã¤¿öÁØ´Ù if (pResultItem->isStackable() && bFullStack) { int MaxStack = ItemMaxStack[pResultItem->getItemClass()]; pResultItem->setNum(MaxStack); @@ -2516,7 +2516,7 @@ void CGUseItemFromInventoryHandler::executeEventGiftBox(CGUseItemFromInventory* bool isChargingItem = false; int chargeNum = 0; - // Charging ۵ äش + // Charging ¾ÆÀÌÅÛµµ ²Ë ä¿öÁØ´Ù if (pResultItem->getItemClass() == Item::ITEM_CLASS_SLAYER_PORTAL_ITEM) { SlayerPortalItem* pSlayerPortalItem = dynamic_cast(pResultItem); pSlayerPortalItem->setCharge(pSlayerPortalItem->getMaxCharge()); @@ -2538,12 +2538,12 @@ void CGUseItemFromInventoryHandler::executeEventGiftBox(CGUseItemFromInventory* GCUseOK gcUseOK; pGamePlayer->sendPacket(&gcUseOK); - // ڸ ڸ ִ´ + // °ËÀº»ö ¼±¹° »óÀÚ¸¦ Áö¿ì°í ±× ÀÚ¸®¿¡ ¾ÆÀÌÅÛÀ» ³Ö´Â´Ù pInventory->deleteItem(InvenX, InvenY); pItem->destroy(); SAFE_DELETE(pItem); - // inventory ִ´. + // inventory¿¡ ³Ö´Â´Ù. if (pInventory->addItem(InvenX, InvenY, pResultItem)) { pResultItem->create(pPC->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); @@ -2564,13 +2564,13 @@ void CGUseItemFromInventoryHandler::executeEventGiftBox(CGUseItemFromInventory* pGamePlayer->sendPacket(&gcCreateItem); - // ItemTraceLog + // ItemTraceLog ¸¦ ³²±ä´Ù if (pResultItem != NULL && pResultItem->isTraceItem()) { remainTraceLog(pResultItem, "BLACK BOX", pCreature->getName(), ITEM_LOG_CREATE, DETAIL_EVENTNPC); } } else { - filelog("GiftBoxErrorLog.txt", "[Name] : %s : κ丮 . Item : %s\n", + filelog("GiftBoxErrorLog.txt", "[Name] : %s : Àκ¥Å丮¿¡ ¾ÆÀÌÅÛÀ» ³ÖÀ» ¼ö ¾ø´Ù. Item : %s\n", pCreature->getName().c_str(), pResultItem->toString().c_str()); return; } @@ -2588,8 +2588,8 @@ void CGUseItemFromInventoryHandler::executeTrapItem(CGUseItemFromInventory* pPac Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -2611,7 +2611,7 @@ void CGUseItemFromInventoryHandler::executeTrapItem(CGUseItemFromInventory* pPac if (pTrapItem != NULL && pInfo != NULL) { if (pTrapItem->getItemType() <= 3) { - // Ʈ + // Æ®·¦ if ((pCreature->getX() < 97 || pCreature->getX() > 121) || (pCreature->getY() < 135 || pCreature->getY() > 170)) { GCCannotUse _GCCannotUse; @@ -2620,7 +2620,7 @@ void CGUseItemFromInventoryHandler::executeTrapItem(CGUseItemFromInventory* pPac return; } } else { - // ֹ + // Àå¾Ö¹° if ((pCreature->getX() < 132 || pCreature->getX() > 152) || (pCreature->getY() < 105 || pCreature->getY() > 135)) { GCCannotUse _GCCannotUse; diff --git a/src/Core/CGUseMessageItemFromInventory.cpp b/src/Core/CGUseMessageItemFromInventory.cpp index d34f0830..597c2ba8 100644 --- a/src/Core/CGUseMessageItemFromInventory.cpp +++ b/src/Core/CGUseMessageItemFromInventory.cpp @@ -2,8 +2,8 @@ // Filename : CGUseMessageItemFromInventory.cpp // Written By : excel96 // Description : -// κ丮 , Ŭ̾Ʈ X, Y ObjectID -// Ŭ , ̿ ´ ڵ带 óѴ. +// 인벤토리 안의 아이템을 사용할 때, 클라이언트가 X, Y 및 ObjectID를 +// 보내면 아이템 클래스에 따라서, 서버가 이에 맞는 코드를 처리한다. ////////////////////////////////////////////////////////////////////////////// #include "CGUseMessageItemFromInventory.h" diff --git a/src/Core/CGUseMessageItemFromInventory.h b/src/Core/CGUseMessageItemFromInventory.h index 2ea0f316..f43b6745 100644 --- a/src/Core/CGUseMessageItemFromInventory.h +++ b/src/Core/CGUseMessageItemFromInventory.h @@ -2,8 +2,8 @@ // Filename : CGUseMessageItemFromInventory.h // Written By : excel96 // Description : -// κ丮 , Ŭ̾Ʈ X, Y ObjectID -// Ŭ , ̿ ´ ڵ带 óѴ. +// 인벤토리 안의 아이템을 사용할 때, 클라이언트가 X, Y 및 ObjectID를 +// 보내면 아이템 클래스에 따라서, 서버가 이에 맞는 코드를 처리한다. ////////////////////////////////////////////////////////////////////////////// #ifndef __CG_USE_MESSAGE_ITEM_FROM_INVENTORY_H__ diff --git a/src/Core/CGUseMessageItemFromInventoryHandler.cpp b/src/Core/CGUseMessageItemFromInventoryHandler.cpp index 5c7792b3..3c66552b 100644 --- a/src/Core/CGUseMessageItemFromInventoryHandler.cpp +++ b/src/Core/CGUseMessageItemFromInventoryHandler.cpp @@ -64,7 +64,7 @@ void CGUseMessageItemFromInventoryHandler::execute(CGUseMessageItemFromInventory CoordInven_t InvenX = pPacket->getX(); CoordInven_t InvenY = pPacket->getY(); - // κ丮 ǥ Ѿ ̶ ȴ. + // Àκ¥Å丮 ÁÂÇ¥¸¦ ³Ñ¾î°¡´Â ¿µ¿ªÀ̶ó¸é ¾È µÈ´Ù. if (InvenX >= pInventory->getWidth() || InvenY >= pInventory->getHeight()) { GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); @@ -72,7 +72,7 @@ void CGUseMessageItemFromInventoryHandler::execute(CGUseMessageItemFromInventory return; } - // κ丮 ٸ . + // Àκ¥Å丮¿¡ ±× ¾ÆÀÌÅÛÀÌ ¾ø´Ù¸é ¿¡·¯´Ù. Item* pItem = pInventory->getItem(InvenX, InvenY); if (pItem == NULL) { GCCannotUse _GCCannotUse; @@ -81,10 +81,10 @@ void CGUseMessageItemFromInventoryHandler::execute(CGUseMessageItemFromInventory return; } - // κ丮 ִ Object ޴´. + // Àκ¥Å丮¿¡ ÀÖ´Â ¾ÆÀÌÅÛÀÇ Object¸¦ ¹Þ´Â´Ù. ObjectID_t ItemObjectID = pItem->getObjectID(); - // OID ġ ʰų, ̶ . + // OID°¡ ÀÏÄ¡ÇÏÁö ¾Ê°Å³ª, »ç¿ëÇÒ ¼ö ¾ø´Â ¾ÆÀÌÅÛÀ̶ó¸é ¿¡·¯´Ù. if (ItemObjectID != pPacket->getObjectID() || !isUsableItem(pItem, pCreature)) { GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); @@ -99,7 +99,7 @@ void CGUseMessageItemFromInventoryHandler::execute(CGUseMessageItemFromInventory return; } - // , ó Լ б ش. + // ¾ÆÀÌÅÛÀÇ Á¾·ù¿¡ µû¶ó, ó¸® ÇÔ¼ö¸¦ ºÐ±â½ÃÄÑ ÁØ´Ù. switch (pItem->getItemClass()) { case Item::ITEM_CLASS_EVENT_TREE: executeEventTree(pPacket, pPlayer); @@ -135,8 +135,8 @@ void CGUseMessageItemFromInventoryHandler::executeEventTree(CGUseMessageItemFrom Assert(pPacket != NULL); Assert(pPlayer != NULL); - // Լ üũ ߱ , - // üũ Ѵ. + // »óÀ§ ÇÔ¼ö¿¡¼­ ¿¡·¯ üũ¸¦ ¸¹ÀÌ Ç߱⠶§¹®¿¡, + // ¿¡·¯ üũ¸¦ ´ëÆø Ãà¼ÒÇÑ´Ù. GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); PlayerCreature* pPC = dynamic_cast(pCreature); @@ -168,7 +168,7 @@ void CGUseMessageItemFromInventoryHandler::executeEventTree(CGUseMessageItemFrom time = 86400; break; default: { - filelog("EventTree.log", "̻ . : %s %d", pPC->getName().c_str(), pItem->getItemType()); + filelog("EventTree.log", "ÀÌ»óÇÑ ¾ÆÅÛÀ» ½è´Ù. : %s °¡ %d", pPC->getName().c_str(), pItem->getItemType()); GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); pGamePlayer->sendPacket(&_GCCannotUse); @@ -176,10 +176,10 @@ void CGUseMessageItemFromInventoryHandler::executeEventTree(CGUseMessageItemFrom return; } - // ŸϿ ų ̶ ִ üũѴ. - // 뿡 . - // ִ Ÿ Ѵ. ItemType 12 ͸ ִ. - // ó(÷̾ 5x5Ÿ ̳) ٸ Ʈ ִٸ . + // ŸÀÏ¿¡ ½ºÅ³À» ¾²´Â °ÍÀ̶ó°í º¸°í ¾µ ¼ö ÀÖ´ÂÁö¸¦ üũÇÑ´Ù. + // ¾ÈÀüÁö´ë¿¡¼­´Â »ç¿ëÇÒ ¼ö ¾ø´Ù. + // ¾µ ¼ö ÀÖ´Â ¾ÆÀÌÅÛ Å¸ÀÔÀÎÁö ¿ÎÀÎÇÑ´Ù. ItemType ÀÌ 12ÀÎ °Í¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. + // ±Ùó¿¡(Ç÷¹À̾î ÁÖÀ§ÀÇ 5x5ŸÀÏ À̳») ´Ù¸¥ Æ®¸®°¡ ÀÖ´Ù¸é »ç¿ëÇÒ ¼ö ¾ø´Ù. if (!isAbleToUseTileSkill(pCreature) || pZone->isMasterLair() || ItemObjectID != pPacket->getObjectID() || checkCorpse(pZone, MType, pPC->getX() - 2, pPC->getY() - 2, pPC->getX() + 2, pPC->getY() + 2)) { GCCannotUse _GCCannotUse; @@ -188,7 +188,7 @@ void CGUseMessageItemFromInventoryHandler::executeEventTree(CGUseMessageItemFrom return; } - // ̸ ִ. + // ¼ºÀÌ¸é ¼ºÁÖ ±æµå¿ø¸¸ ¾µ ¼ö ÀÖ´Ù. if (!pPC->isGOD()) { if (pZone->isCastle()) { if (!g_pCastleInfoManager->isCastleMember(pZone->getZoneID(), pPC)) { @@ -198,7 +198,7 @@ void CGUseMessageItemFromInventoryHandler::executeEventTree(CGUseMessageItemFrom return; } } - // ƴ 뿡 . + // ¼ºÀÌ ¾Æ´Ñ °÷ÀÇ ¾ÈÀüÁö´ë¿¡¼± Àý´ë ¸ø ¾´´Ù. else if (pZone->getZoneLevel(pCreature->getX(), pCreature->getY()) & SAFE_ZONE) { GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); @@ -207,16 +207,16 @@ void CGUseMessageItemFromInventoryHandler::executeEventTree(CGUseMessageItemFrom } } - /* // Ʈ ߰Ѵ. (Ʈ ü ̿Ѵ) + /* // Æ®¸®¸¦ Á¸¿¡ Ãß°¡ÇÑ´Ù. (Æ®¸®´Â ¸ó½ºÅÍ ½Ãü¸¦ ÀÌ¿ëÇÑ´Ù) MonsterCorpse* pMonsterCorpse = new MonsterCorpse( 482, pPacket->getMessage(), 2 ); Assert(pMonsterCorpse!=NULL); pZone->getObjectRegistry().registerObject( pMonsterCorpse ); - // ü ߰Ѵ. + // »ý¼ºµÈ ½Ãü¸¦ Á¸¿¡ Ãß°¡ÇÑ´Ù. int delayTime = g_pVariableManager->getVariable( CHRISTMAS_TREE_DECAY_TIME ); // by sigi. 2002.12.17 - TPOINT pt = pZone->addItem( pMonsterCorpse, pPC->getX(), pPC->getY(), true, delayTime ); // 6ð ڿ - Ʈ(ü) . if (pt.x == -1)*/ + TPOINT pt = pZone->addItem( pMonsterCorpse, pPC->getX(), pPC->getY(), true, delayTime ); // 6½Ã°£ µÚ¿¡ + Æ®¸®(½Ãü)°¡ »ç¶óÁø´Ù. if (pt.x == -1)*/ if (!createBulletinBoard(pZone, pPC->getX(), pPC->getY(), MType, pPacket->getMessage(), VSDateTime::currentDateTime().addSecs(time))) { GCCannotUse _GCCannotUse; @@ -226,12 +226,12 @@ void CGUseMessageItemFromInventoryHandler::executeEventTree(CGUseMessageItemFrom return; } - // ̹Ƿ ش. + // »ç¿ëÇÑ ¾ÆÀÌÅÛÀ̹ǷΠÁö¿öÁØ´Ù. pInventory->deleteItem(InvenX, InvenY); pItem->destroy(); SAFE_DELETE(pItem); - // ߴٰ Ŭ̾Ʈ ˸. + // ¾ÆÀÌÅÛÀ» »ç¿ëÇß´Ù°í Ŭ¶óÀÌ¾ðÆ®¿¡ ¾Ë¸°´Ù. GCUseOK gcUseOK; pGamePlayer->sendPacket(&gcUseOK); @@ -264,8 +264,8 @@ void CGUseMessageItemFromInventoryHandler::executeEventFromMessage(CGUseMessageI int time = 0; - // Ʒ - // ɫ green(ɫ) =0 blue(ɫ) = 1 yellow(ɫ) = 2 + // ¼ì²âÎïÆ· + // ÉèÖÃÑÕÉ« green(ÂÌÉ«) =0 blue(À¶É«) = 1 yellow(»ÆÉ«) = 2 string color = "0"; switch (pItem->getItemType()) { case 10: @@ -278,7 +278,7 @@ void CGUseMessageItemFromInventoryHandler::executeEventFromMessage(CGUseMessageI color = "2"; break; default: { - filelog("EventTree.log", "ʹøʾƳ ɫ: %s Ʒ%d", pPC->getName().c_str(), pItem->getItemType()); + filelog("EventTree.log", "ʹÓøæÊ¾ÅƳö´í ½ÇÉ«Ãû: %s ÎïÆ·ÀàÐÍ%d", pPC->getName().c_str(), pItem->getItemType()); GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); pGamePlayer->sendPacket(&_GCCannotUse); diff --git a/src/Core/CGUsePotionFromInventory.h b/src/Core/CGUsePotionFromInventory.h index da9208dd..fede0d02 100644 --- a/src/Core/CGUsePotionFromInventory.h +++ b/src/Core/CGUsePotionFromInventory.h @@ -29,10 +29,10 @@ class CGUsePotionFromInventory : public Packet { ~CGUsePotionFromInventory(); public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -45,7 +45,7 @@ class CGUsePotionFromInventory : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CGUsePotionFromInventoryPacketSize ؼ ϶. + // const static CGUsePotionFromInventoryPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szObjectID + szCoordInven + szCoordInven; } @@ -88,7 +88,7 @@ class CGUsePotionFromInventory : public Packet { // ObjectID ObjectID_t m_ObjectID; - // Inventory X, Y ǥ + // Inventory의 X, Y 좌표 CoordInven_t m_InvenX; CoordInven_t m_InvenY; }; @@ -121,7 +121,7 @@ class CGUsePotionFromInventoryFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGUsePotionFromInventoryPacketSize ؼ ϶. + // const static CGUsePotionFromInventoryPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szCoordInven + szCoordInven; } diff --git a/src/Core/CGUsePotionFromInventoryHandler.cpp b/src/Core/CGUsePotionFromInventoryHandler.cpp index 49b50ea2..2a441816 100644 --- a/src/Core/CGUsePotionFromInventoryHandler.cpp +++ b/src/Core/CGUsePotionFromInventoryHandler.cpp @@ -59,7 +59,7 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, if (pCreature == NULL) return; - // ڸ ¶ . + // 코마 상태라면 사용할 수 없다. if (pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); @@ -102,7 +102,7 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, return; } - // κ丮 ִ Object ޴´. + // 인벤토리에 있는 아이템의 Object를 받는다. ObjectID_t ItemObjectID = pItem->getObjectID(); if (ItemObjectID != pPacket->getObjectID()) { @@ -215,11 +215,11 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, MP_t CurrentMP = pSlayer->getMP(ATTR_CURRENT); Potion* pPotion = dynamic_cast(pItem); - // Ͽ ȸǴ + // 한턴에 회복되는 양 int HPQuantity = pPotion->getHPQuantity(); int MPQuantity = pPotion->getMPQuantity(); - // ΰ. + // 한턴이 몇초 인가. int HPDelayProvider = pPotion->getHPDelay(); int MPDelayProvider = pPotion->getMPDelay(); @@ -235,10 +235,10 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, bool notRecoverHP = false; bool notRecoverMP = false; - // Activation Effect ɷִٸ ȸӵ 2谡 ȴ. + // Activation Effect가 걸려있다면 회복속도가 2배가 된다. if (pSlayer->isFlag(Effect::EFFECT_CLASS_ACTIVATION)) { if (pPotion->getItemType() >= 14 && pPotion->getItemType() <= 17) { - // ִ. + // 쓸 수는 있다. } else { HPDelayProvider = (HPDelayProvider >> 1); MPDelayProvider = (MPDelayProvider >> 1); @@ -248,7 +248,7 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, } } - // HP ȸ Ѵٸ... + // HP 회복양이 존재한다면... if (HPAmount != 0 && HPQuantity != 0) { if (CurrentHP < MaxHP) { EffectManager* pEffectManager = pSlayer->getEffectManager(); @@ -261,27 +261,27 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, Effect* pEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_HP_RECOVERY); EffectHPRecovery* pEffectHPRecoveryEffect = dynamic_cast(pEffect); - // Ƚ ä HP Ѵ. - // װ ȸ翡 Ѵ. + // 기존의 단위양과 횟수로 채우는 HP양을 계산한다. + // 그것을 현재 회복양에 더한다. int PrevHPAmount = pEffectHPRecoveryEffect->getHPQuantity() * pEffectHPRecoveryEffect->getPeriod(); HPAmount = min((int)(HPAmount + PrevHPAmount), MaxHP - CurrentHP); - // ߿ ū ȸ ̸ . + // 둘 중에 큰 단위회복양과 작은 딜레이를 얻어낸다. HPQuantity = max(HPQuantity, (int)(pEffectHPRecoveryEffect->getHPQuantity())); HPDelayProvider = min(HPDelayProvider, (int)(pEffectHPRecoveryEffect->getDelay())); - // ȸ , 󸶾 ȸ ΰ Ѵ. + // 현재 회복양을 가지고, 얼마씩 몇번에 회복할 것인가를 결정한다. temp = (double)((double)HPAmount / (double)HPQuantity); Period = (uint)ceil(temp); Deadline = Period * HPDelayProvider; - // HP Recovery effect Ѵ. + // HP Recovery effect를 갱신한다. pEffectHPRecoveryEffect->setDeadline(Deadline); pEffectHPRecoveryEffect->setDelay(HPDelayProvider); pEffectHPRecoveryEffect->setHPQuantity(HPQuantity); pEffectHPRecoveryEffect->setPeriod(Period); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; gcHPRecoveryStartToSelf.setPeriod(pEffectHPRecoveryEffect->getPeriod()); gcHPRecoveryStartToSelf.setDelay(pEffectHPRecoveryEffect->getDelay()); @@ -289,8 +289,8 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ٸ̵鿡 . - // ȸ Ŷ, ۰ Ŷ . + // 회복 시작하라는 패킷을 다른이들에게 보낸다. + // 회복 갱신 패킷, 시작과 똑 같은 패킷을 보낸다. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pSlayer->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(pEffectHPRecoveryEffect->getPeriod()); @@ -312,7 +312,7 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, pEffectManager->addEffect(pEffectHPRecovery); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; gcHPRecoveryStartToSelf.setPeriod(Period); gcHPRecoveryStartToSelf.setDelay(HPDelayProvider); @@ -320,7 +320,7 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ̵鿡 . + // 회복 시작하라는 패킷을 보는이들에게 보낸다. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pSlayer->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(Period); @@ -341,7 +341,7 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, notRecoverHP = true; } - // MP ȸ Ѵٸ... + // MP 회복양이 존재한다면... if (MPAmount != 0 && MPQuantity != 0) { if (CurrentMP < MaxMP) { EffectManager* pEffectManager = pSlayer->getEffectManager(); @@ -354,27 +354,27 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, Effect* pEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_MP_RECOVERY); EffectMPRecovery* pEffectMPRecoveryEffect = dynamic_cast(pEffect); - // Ƚ ä MP Ѵ. - // װ ȸ翡 Ѵ. + // 기존의 단위양과 횟수로 채우는 MP양을 계산한다. + // 그것을 현재 회복양에 더한다. int PrevMPAmount = pEffectMPRecoveryEffect->getMPQuantity() * pEffectMPRecoveryEffect->getPeriod(); MPAmount = min((int)(MPAmount + PrevMPAmount), MaxMP - CurrentMP); - // ߿ ū ȸ ̸ . + // 둘 중에 큰 단위회복양과 작은 딜레이를 얻어낸다. MPQuantity = max(MPQuantity, (int)(pEffectMPRecoveryEffect->getMPQuantity())); MPDelayProvider = min(MPDelayProvider, (int)(pEffectMPRecoveryEffect->getDelay())); - // ȸ , 󸶾 ȸ ΰ Ѵ. + // 현재 회복양을 가지고, 얼마씩 몇번에 회복할 것인가를 결정한다. temp = (double)((double)MPAmount / (double)MPQuantity); Period = (uint)ceil(temp); Deadline = Period * MPDelayProvider; - // MP Recovery effect Ѵ. + // MP Recovery effect를 갱신한다. pEffectMPRecoveryEffect->setDeadline(Deadline); pEffectMPRecoveryEffect->setDelay(MPDelayProvider); pEffectMPRecoveryEffect->setMPQuantity(MPQuantity); pEffectMPRecoveryEffect->setPeriod(Period); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCMPRecoveryStart gcMPRecoveryStart; gcMPRecoveryStart.setPeriod(pEffectMPRecoveryEffect->getPeriod()); gcMPRecoveryStart.setDelay(pEffectMPRecoveryEffect->getDelay()); @@ -396,7 +396,7 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, pEffectManager->addEffect(pEffectMPRecovery); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCMPRecoveryStart gcMPRecoveryStart; gcMPRecoveryStart.setPeriod(Period); gcMPRecoveryStart.setDelay(MPDelayProvider); @@ -429,7 +429,7 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, Vampire* pVampire = dynamic_cast(pCreature); if (pItem->getItemClass() != Item::ITEM_CLASS_SERUM - // Mephisto Ʈ ɷ û Դ´. + // Mephisto 이펙트가 걸려있으면 혈청 못 먹는다. || pVampire->isFlag(Effect::EFFECT_CLASS_MEPHISTO)) { GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); @@ -445,41 +445,41 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, RegenHP = pSerum->getHPAmount(); - int RegenPeriod = pSerum->getPeriod(); // ð ֱ - int RegenCount = pSerum->getCount(); // ð ݺ ΰ? + int RegenPeriod = pSerum->getPeriod(); // 단위 시간의 주기 + int RegenCount = pSerum->getCount(); // 몇번 단위 시간을 반복할 것인가? - // int RegenHPUnit = (int)((float)MaxHP* (float)RegenHP*0.01); // ѹ ȸϴ HP + // int RegenHPUnit = (int)((float)MaxHP* (float)RegenHP*0.01); // 한번에 회복하는 HP의 양 int RegenHPUnit = RegenHP; int HPAmount = min(MaxHP - CurrentHP, RegenHPUnit * RegenCount); - // HP ȸ Ѵٸ... + // HP 회복양이 존재한다면... if (HPAmount != 0) { - // 󸶾 ʸ. + // 얼마씩 몇번 몇초마다. if (CurrentHP < MaxHP) { EffectManager* pEffectManager = pVampire->getEffectManager(); - Turn_t Period = RegenCount; // ȸŰ? - Turn_t Deadline = RegenPeriod * Period; // ? + Turn_t Period = RegenCount; // 몇번 회복시키나? + Turn_t Deadline = RegenPeriod * Period; // 언제 끝나나? if (pVampire->isFlag(Effect::EFFECT_CLASS_HP_RECOVERY)) { Effect* pEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_HP_RECOVERY); EffectHPRecovery* pEffectHPRecoveryEffect = dynamic_cast(pEffect); - // ؾ Ѵٴ ش. + // 몇번 더 해야 한다는 것을 갱신해 준다. Turn_t OldCount = pEffectHPRecoveryEffect->getPeriod(); Turn_t NewPeriod = OldCount + Period; pEffectHPRecoveryEffect->setPeriod(NewPeriod); pEffectHPRecoveryEffect->setDeadline(NewPeriod * RegenPeriod); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; - gcHPRecoveryStartToSelf.setPeriod(NewPeriod); // ȸϳ? - gcHPRecoveryStartToSelf.setDelay(RegenPeriod); // ϳ? - gcHPRecoveryStartToSelf.setQuantity(RegenHPUnit); // ѹ 󸶳 ȸϳ? + gcHPRecoveryStartToSelf.setPeriod(NewPeriod); // 몇번 회복하나? + gcHPRecoveryStartToSelf.setDelay(RegenPeriod); // 몇 초 단위로 하나? + gcHPRecoveryStartToSelf.setQuantity(RegenHPUnit); // 한번에 얼마나 회복하나? pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ٸ̵鿡 . - // ȸ Ŷ, ۰ Ŷ . + // 회복 시작하라는 패킷을 다른이들에게 보낸다. + // 회복 갱신 패킷, 시작과 똑 같은 패킷을 보낸다. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pVampire->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(NewPeriod); @@ -501,7 +501,7 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, pEffectManager->addEffect(pEffectHPRecovery); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; gcHPRecoveryStartToSelf.setPeriod(Period); gcHPRecoveryStartToSelf.setDelay(RegenPeriod); @@ -509,7 +509,7 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ̵鿡 . + // 회복 시작하라는 패킷을 보는이들에게 보낸다. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pVampire->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(Period); @@ -554,10 +554,10 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, Pupa* pPupa = dynamic_cast(pItem); - // Ͽ ȸǴ + // 한턴에 회복되는 양 HPQuantity = pPupa->getHPQuantity(); - // ΰ. + // 한턴이 몇초 인가. HPDelayProvider = pPupa->getHPDelay(); PupaHPAmount = pPupa->getHPAmount(); @@ -569,10 +569,10 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, ComposMei* pComposMei = dynamic_cast(pItem); - // Ͽ ȸǴ + // 한턴에 회복되는 양 HPQuantity = pComposMei->getHPQuantity(); - // ΰ. + // 한턴이 몇초 인가. HPDelayProvider = pComposMei->getHPDelay(); PupaHPAmount = pComposMei->getHPAmount(); @@ -580,7 +580,7 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, HPAmount = min(MaxHP - CurrentHP, (int)PupaHPAmount); } - // HP ȸ Ѵٸ... + // HP 회복양이 존재한다면... if (HPAmount != 0 && HPQuantity != 0) { if (CurrentHP < MaxHP) { EffectManager* pEffectManager = pOusters->getEffectManager(); @@ -593,27 +593,27 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, Effect* pEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_HP_RECOVERY); EffectHPRecovery* pEffectHPRecoveryEffect = dynamic_cast(pEffect); - // Ƚ ä HP Ѵ. - // װ ȸ翡 Ѵ. + // 기존의 단위양과 횟수로 채우는 HP양을 계산한다. + // 그것을 현재 회복양에 더한다. int PrevHPAmount = pEffectHPRecoveryEffect->getHPQuantity() * pEffectHPRecoveryEffect->getPeriod(); HPAmount = min((int)(HPAmount + PrevHPAmount), MaxHP - CurrentHP); - // ߿ ū ȸ ̸ . + // 둘 중에 큰 단위회복양과 작은 딜레이를 얻어낸다. HPQuantity = max(HPQuantity, (int)(pEffectHPRecoveryEffect->getHPQuantity())); HPDelayProvider = min(HPDelayProvider, (int)(pEffectHPRecoveryEffect->getDelay())); - // ȸ , 󸶾 ȸ ΰ Ѵ. + // 현재 회복양을 가지고, 얼마씩 몇번에 회복할 것인가를 결정한다. temp = (double)((double)HPAmount / (double)HPQuantity); Period = (uint)ceil(temp); Deadline = Period * HPDelayProvider; - // HP Recovery effect Ѵ. + // HP Recovery effect를 갱신한다. pEffectHPRecoveryEffect->setDeadline(Deadline); pEffectHPRecoveryEffect->setDelay(HPDelayProvider); pEffectHPRecoveryEffect->setHPQuantity(HPQuantity); pEffectHPRecoveryEffect->setPeriod(Period); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; gcHPRecoveryStartToSelf.setPeriod(pEffectHPRecoveryEffect->getPeriod()); gcHPRecoveryStartToSelf.setDelay(pEffectHPRecoveryEffect->getDelay()); @@ -621,8 +621,8 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ٸ̵鿡 . - // ȸ Ŷ, ۰ Ŷ . + // 회복 시작하라는 패킷을 다른이들에게 보낸다. + // 회복 갱신 패킷, 시작과 똑 같은 패킷을 보낸다. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pOusters->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(pEffectHPRecoveryEffect->getPeriod()); @@ -644,7 +644,7 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, pEffectManager->addEffect(pEffectHPRecovery); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; gcHPRecoveryStartToSelf.setPeriod(Period); gcHPRecoveryStartToSelf.setDelay(HPDelayProvider); @@ -652,7 +652,7 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ̵鿡 . + // 회복 시작하라는 패킷을 보는이들에게 보낸다. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pOusters->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(Period); @@ -682,10 +682,10 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, CurrentMP = pOusters->getMP(ATTR_CURRENT); ComposMei* pComposMei = dynamic_cast(pItem); - // Ͽ ȸǴ + // 한턴에 회복되는 양 MPQuantity = pComposMei->getMPQuantity(); - // ΰ. + // 한턴이 몇초 인가. MPDelayProvider = pComposMei->getMPDelay(); Attr_t INT = pOusters->getINT(); @@ -698,10 +698,10 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, CurrentMP = pOusters->getMP(ATTR_CURRENT); Pupa* pPupa = dynamic_cast(pItem); - // Ͽ ȸǴ + // 한턴에 회복되는 양 MPQuantity = pPupa->getMPQuantity(); - // ΰ. + // 한턴이 몇초 인가. MPDelayProvider = pPupa->getMPDelay(); Attr_t INT = pOusters->getINT(); @@ -711,7 +711,7 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, MPAmount = min(MaxMP - CurrentMP, (int)(ComposMeiMPAmount * (double)(1 + (double)((double)INT / 300.0)))); } - // MP ȸ Ѵٸ... + // MP 회복양이 존재한다면... if (MPAmount != 0 && MPQuantity != 0) { if (CurrentMP < MaxMP) { EffectManager* pEffectManager = pOusters->getEffectManager(); @@ -724,27 +724,27 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, Effect* pEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_MP_RECOVERY); EffectMPRecovery* pEffectMPRecoveryEffect = dynamic_cast(pEffect); - // Ƚ ä MP Ѵ. - // װ ȸ翡 Ѵ. + // 기존의 단위양과 횟수로 채우는 MP양을 계산한다. + // 그것을 현재 회복양에 더한다. int PrevMPAmount = pEffectMPRecoveryEffect->getMPQuantity() * pEffectMPRecoveryEffect->getPeriod(); MPAmount = min((int)(MPAmount + PrevMPAmount), MaxMP - CurrentMP); - // ߿ ū ȸ ̸ . + // 둘 중에 큰 단위회복양과 작은 딜레이를 얻어낸다. MPQuantity = max(MPQuantity, (int)(pEffectMPRecoveryEffect->getMPQuantity())); MPDelayProvider = min(MPDelayProvider, (int)(pEffectMPRecoveryEffect->getDelay())); - // ȸ , 󸶾 ȸ ΰ Ѵ. + // 현재 회복양을 가지고, 얼마씩 몇번에 회복할 것인가를 결정한다. temp = (double)((double)MPAmount / (double)MPQuantity); Period = (uint)ceil(temp); Deadline = Period * MPDelayProvider; - // MP Recovery effect Ѵ. + // MP Recovery effect를 갱신한다. pEffectMPRecoveryEffect->setDeadline(Deadline); pEffectMPRecoveryEffect->setDelay(MPDelayProvider); pEffectMPRecoveryEffect->setMPQuantity(MPQuantity); pEffectMPRecoveryEffect->setPeriod(Period); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCMPRecoveryStart gcMPRecoveryStart; gcMPRecoveryStart.setPeriod(pEffectMPRecoveryEffect->getPeriod()); gcMPRecoveryStart.setDelay(pEffectMPRecoveryEffect->getDelay()); @@ -766,7 +766,7 @@ void CGUsePotionFromInventoryHandler::execute(CGUsePotionFromInventory* pPacket, pEffectManager->addEffect(pEffectMPRecovery); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCMPRecoveryStart gcMPRecoveryStart; gcMPRecoveryStart.setPeriod(Period); gcMPRecoveryStart.setDelay(MPDelayProvider); diff --git a/src/Core/CGUsePotionFromQuickSlot.h b/src/Core/CGUsePotionFromQuickSlot.h index eb6e2bfc..978d97ab 100644 --- a/src/Core/CGUsePotionFromQuickSlot.h +++ b/src/Core/CGUsePotionFromQuickSlot.h @@ -29,10 +29,10 @@ class CGUsePotionFromQuickSlot : public Packet { ~CGUsePotionFromQuickSlot(); public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -45,7 +45,7 @@ class CGUsePotionFromQuickSlot : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CGUsePotionFromQuickSlotPacketSize ؼ ϶. + // const static CGUsePotionFromQuickSlotPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szObjectID + szSlotID; } @@ -80,7 +80,7 @@ class CGUsePotionFromQuickSlot : public Packet { // ObjectID ObjectID_t m_ObjectID; - // QuickSlot ID + // QuickSlot의 ID SlotID_t m_SlotID; }; @@ -112,7 +112,7 @@ class CGUsePotionFromQuickSlotFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGUsePotionFromQuickSlotPacketSize ؼ ϶. + // const static CGUsePotionFromQuickSlotPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szSlotID; } diff --git a/src/Core/CGUsePotionFromQuickSlotHandler.cpp b/src/Core/CGUsePotionFromQuickSlotHandler.cpp index 31389d28..e3517cf2 100644 --- a/src/Core/CGUsePotionFromQuickSlotHandler.cpp +++ b/src/Core/CGUsePotionFromQuickSlotHandler.cpp @@ -149,7 +149,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, GamePlayer* pGamePlayer = dynamic_cast(pPlayer); Creature* pCreature = pGamePlayer->getCreature(); - // ڸ ¶ . + // 코마 상태라면 사용할 수 없다. if (pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); @@ -177,13 +177,13 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, return; } - // Ʈ κ丮 ޾ƿ´. + // 벨트의 인벤토리를 받아온다. Inventory* pBeltInventory = ((Belt*)pBelt)->getInventory(); - // SlotID ޴´. + // SlotID를 받는다. SlotID_t SlotID = pPacket->getSlotID(); - // ʰϸ . + // 슬랏의 범위를 초과하면 사용할 수 없다. if (SlotID >= pBeltInventory->getWidth()) { GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); @@ -191,10 +191,10 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, return; } - // Ʈ ޾ƿ´. + // 벨트의 지정 슬랏의 아이템을 받아온다. Item* pBeltItem = pBeltInventory->getItem(SlotID, 0); - // 翬 . + // 아이템이 없으면 당연히 사용할 수 없다. if (pBeltItem == NULL) { GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); @@ -202,10 +202,10 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, return; } - // ִ Object ޴´. + // 슬랏에 있는 아이템의 Object를 받는다. ObjectID_t ItemObjectID = pBeltItem->getObjectID(); - // Ͱ ġ ʰų, ƴ϶ . + // 데이터가 일치하지 않거나, 포션이 아니라면 사용할 수 없다. if (ItemObjectID != pPacket->getObjectID() || (pBeltItem->getItemClass() != Item::ITEM_CLASS_POTION && pBeltItem->getItemClass() != Item::ITEM_CLASS_KEY)) { if (ItemObjectID != pPacket->getObjectID()) { @@ -248,7 +248,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, return; } - // Ǿ ִ ȮѴ. + // 기존에 아이템이 생성되어 있는지를 확인한다. ItemID_t targetID = dynamic_cast(pBeltItem)->getTarget(); Statement* pStmt = NULL; @@ -261,8 +261,8 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, targetID = pKey->setNewMotorcycle(pSlayer); } else { - // ѹ ͻŬ̶ Ű ƴµ ͻŬ ڲ 쳪. - // Ű ͻŬ ִ üũϰ  ־ش. + // 한번 모터사이클이랑 키랑 연결됐는데 모터사이클을 누가 자꾸 지우나보다. + // 키에 연결된 모터사이클이 실제로 디비에 있는지 체크하고 없으면 새로 만들어서 넣어준다. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pResult = pStmt->executeQuery("SELECT ItemID FROM MotorcycleObject WHERE ItemID=%lu", targetID); @@ -278,7 +278,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, } END_DB(pStmt); } - // ʻ ڵ -_-; + // 필살 방어 코드 -_-; if (targetID == 0) { filelog("errorLog.txt", "[ActionRedeemMotorcycle] itemID=%lu, motorItemID=%lu", (int)pBeltItem->getItemID(), (int)targetID); @@ -287,7 +287,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, if (g_pParkingCenter->hasMotorcycleBox(targetID)) { - cout << " ҷ ̰ ֽϴ" << endl; + cout << "기존에 불려진 오토바이가 있습니다" << endl; MotorcycleBox* pMotorcycleBox = g_pParkingCenter->getMotorcycleBox(targetID); @@ -297,13 +297,13 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, ZoneCoord_t motorY = pMotorcycleBox->getY(); Motorcycle* pMotorcycle = pMotorcycleBox->getMotorcycle(); - // ִ - // Ÿ ʹ θ ~ + // 같은 존에 있는 경우 + // 거리가 너무 가까우면 부르지 말자~ if (pMotorZone != pZone || pSlayer->getDistance(motorX, motorY) > 15) { - // ٸ zone ̵̶ ǥѴ. + // 다른 zone으로 이동중이라고 표시한다. pMotorcycleBox->setTransport(); - // motorcycle slayer zone ű. + // motorcycle을 slayer의 zone으로 옮긴다. /* pMotorZone->transportItem( motorX, motorY, pMotorcycle, pZone, pSlayer->getX(), pSlayer->getY() );*/ @@ -313,14 +313,14 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, pMotorZone->registerObject(pEffectRecallMotorcycle); pMotorZone->addEffect_LOCKING(pEffectRecallMotorcycle); - // Use OK ̴. - // Useϸ ׷ ʹ. - -; + // Use OK 대용이다. + // Use하면 아이템이 사라지던가 그렇지 싶다. - -; /* GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); */ - // ѵ delay ϴµ.. + // 한동안 delay를 줘야하는데.. } } @@ -359,7 +359,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, durability = 300; } - // ο ü Ѵ. + // 새로운 오토바이 객체를 생성한다. Motorcycle* pMotorcycle = new Motorcycle(itemType, optionTypes); Assert(pMotorcycle != NULL); @@ -367,22 +367,22 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, pMotorcycle->setItemID(itemID); pMotorcycle->setDurability(durability); - // Object ID Ҵޱ + // Object ID 할당받기 (pZone->getObjectRegistry()).registerObject(pMotorcycle); - // ̸ ߰Ѵ. - cout << "̸ ߰մϴ" << pSlayer->getX() << " " << pSlayer->getY() << endl; + // 오토바이를 존에 추가한다. + cout << "오토바이를 존에 추가합니다" << pSlayer->getX() << " " << pSlayer->getY() << endl; TPOINT pt = pZone->addItem(pMotorcycle, pSlayer->getX(), pSlayer->getY(), false); if (pt.x == -1) { StringStream msg; - msg << "̸ ϴ: " + msg << "오토바이를 존에 넣을 수 없습니다: " << "ZoneID=" << (int)pZone->getZoneID() << ", X=" << (int)pSlayer->getX() << ", Y=" << (int)pSlayer->getY(); filelog("motorError.txt", "%s", msg.toString().c_str()); - // throw Error("̸ ϴ"); + // throw Error("오토바이를 존에 넣을 수 없습니다"); SAFE_DELETE(pMotorcycle); } else { @@ -395,12 +395,12 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, pZone->getZoneID(), pt.x, pt.y, durability); } - // ̸ Parking Center Ѵ. + // 오토바이를 Parking Center에 등록한다. MotorcycleBox* pBox = new MotorcycleBox(pMotorcycle, pZone, pt.x, pt.y); Assert(pBox != NULL); g_pParkingCenter->addMotorcycleBox(pBox); - // Ÿ. + // 타버린다. CGRideMotorCycle cgRide; cgRide.setObjectID(pMotorcycle->getObjectID()); cgRide.setX(pt.x); @@ -409,7 +409,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, } - // Ŷ̴. + // 검증 패킷이다. GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); pGamePlayer->sendPacket(&_GCCannotUse); @@ -427,11 +427,11 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, MP_t CurrentMP = pSlayer->getMP(ATTR_CURRENT); Potion* pPotion = dynamic_cast(pBeltItem); - // Ͽ ȸǴ + // 한턴에 회복되는 양 int HPQuantity = pPotion->getHPQuantity(); int MPQuantity = pPotion->getMPQuantity(); - // ΰ. + // 한턴이 몇초 인가. int HPDelayProvider = pPotion->getHPDelay(); int MPDelayProvider = pPotion->getMPDelay(); @@ -447,7 +447,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, bool notRecoverHP = false; bool notRecoverMP = false; - // Activation Effect ɷִٸ ȸӵ 2谡 ȴ. + // Activation Effect가 걸려있다면 회복속도가 2배가 된다. if (pSlayer->isFlag(Effect::EFFECT_CLASS_ACTIVATION)) { if (pPotion->getItemType() >= 14 && pPotion->getItemType() <= 17) { } else { @@ -460,7 +460,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, } - // HP ȸ Ѵٸ... + // HP 회복양이 존재한다면... if (HPAmount != 0 && HPQuantity != 0) { if (CurrentHP < MaxHP) { EffectManager* pEffectManager = pSlayer->getEffectManager(); @@ -473,28 +473,28 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, Effect* pEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_HP_RECOVERY); EffectHPRecovery* pEffectHPRecoveryEffect = dynamic_cast(pEffect); - // Ƚ ä HP Ѵ. - // װ ȸ翡 Ѵ. + // 기존의 단위양과 횟수로 채우는 HP양을 계산한다. + // 그것을 현재 회복양에 더한다. int PrevHPAmount = pEffectHPRecoveryEffect->getHPQuantity() * pEffectHPRecoveryEffect->getPeriod(); HPAmount = min((int)(HPAmount + PrevHPAmount), MaxHP - CurrentHP); - // ߿ ū ȸ ̸ . + // 둘 중에 큰 단위회복양과 작은 딜레이를 얻어낸다. HPQuantity = max(HPQuantity, (int)(pEffectHPRecoveryEffect->getHPQuantity())); HPDelayProvider = min(HPDelayProvider, (int)(pEffectHPRecoveryEffect->getDelay())); - // ȸ , 󸶾 ȸ ΰ Ѵ. + // 현재 회복양을 가지고, 얼마씩 몇번에 회복할 것인가를 결정한다. temp = (double)((double)HPAmount / (double)HPQuantity); Period = (uint)ceil(temp); Deadline = Period * HPDelayProvider; - // HP Recovery effect Ѵ. + // HP Recovery effect를 갱신한다. pEffectHPRecoveryEffect->setDeadline(Deadline); pEffectHPRecoveryEffect->setDelay(HPDelayProvider); pEffectHPRecoveryEffect->setHPQuantity(HPQuantity); pEffectHPRecoveryEffect->setPeriod(Period); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; gcHPRecoveryStartToSelf.setPeriod(pEffectHPRecoveryEffect->getPeriod()); gcHPRecoveryStartToSelf.setDelay(pEffectHPRecoveryEffect->getDelay()); @@ -502,8 +502,8 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ٸ̵鿡 . - // ȸ Ŷ, ۰ Ŷ . + // 회복 시작하라는 패킷을 다른이들에게 보낸다. + // 회복 갱신 패킷, 시작과 똑 같은 패킷을 보낸다. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pSlayer->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(pEffectHPRecoveryEffect->getPeriod()); @@ -525,7 +525,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, pEffectManager->addEffect(pEffectHPRecovery); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; gcHPRecoveryStartToSelf.setPeriod(Period); gcHPRecoveryStartToSelf.setDelay(HPDelayProvider); @@ -533,7 +533,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ̵鿡 . + // 회복 시작하라는 패킷을 보는이들에게 보낸다. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pSlayer->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(Period); @@ -554,9 +554,9 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, notRecoverHP = true; } - // MP ȸ Ѵٸ... + // MP 회복양이 존재한다면... if (MPAmount != 0 && MPQuantity != 0) { - // 󸶾 ʸ. + // 얼마씩 몇번 몇초마다. if (CurrentMP < MaxMP) { EffectManager* pEffectManager = pSlayer->getEffectManager(); @@ -568,28 +568,28 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, Effect* pEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_MP_RECOVERY); EffectMPRecovery* pEffectMPRecoveryEffect = dynamic_cast(pEffect); - // Ƚ ä MP Ѵ. - // װ ȸ翡 Ѵ. + // 기존의 단위양과 횟수로 채우는 MP양을 계산한다. + // 그것을 현재 회복양에 더한다. int PrevMPAmount = pEffectMPRecoveryEffect->getMPQuantity() * pEffectMPRecoveryEffect->getPeriod(); MPAmount = min((int)(MPAmount + PrevMPAmount), MaxMP - CurrentMP); - // ߿ ū ȸ ̸ . + // 둘 중에 큰 단위회복양과 작은 딜레이를 얻어낸다. MPQuantity = max(MPQuantity, (int)(pEffectMPRecoveryEffect->getMPQuantity())); MPDelayProvider = min(MPDelayProvider, (int)(pEffectMPRecoveryEffect->getDelay())); - // ȸ , 󸶾 ȸ ΰ Ѵ. + // 현재 회복양을 가지고, 얼마씩 몇번에 회복할 것인가를 결정한다. temp = (double)((double)MPAmount / (double)MPQuantity); Period = (uint)ceil(temp); Deadline = Period * MPDelayProvider; - // MP Recovery effect Ѵ. + // MP Recovery effect를 갱신한다. pEffectMPRecoveryEffect->setDeadline(Deadline); pEffectMPRecoveryEffect->setDelay(MPDelayProvider); pEffectMPRecoveryEffect->setMPQuantity(MPQuantity); pEffectMPRecoveryEffect->setPeriod(Period); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCMPRecoveryStart gcMPRecoveryStart; gcMPRecoveryStart.setPeriod(pEffectMPRecoveryEffect->getPeriod()); gcMPRecoveryStart.setDelay(pEffectMPRecoveryEffect->getDelay()); @@ -611,7 +611,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, pEffectManager->addEffect(pEffectMPRecovery); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCMPRecoveryStart gcMPRecoveryStart; gcMPRecoveryStart.setPeriod(Period); gcMPRecoveryStart.setDelay(MPDelayProvider); @@ -645,7 +645,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, Ousters* pOusters = dynamic_cast(pCreature); Zone* pZone = pOusters->getZone(); - // SlotID ޴´. + // SlotID를 받는다. SlotID_t SlotID = pPacket->getSlotID(); Ousters::WearPart part = (SlotID > 2 ? Ousters::WEAR_ARMSBAND2 : Ousters::WEAR_ARMSBAND1); @@ -661,10 +661,10 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, return; } - // Ʈ κ丮 ޾ƿ´. + // 벨트의 인벤토리를 받아온다. Inventory* pOustersArmsbandInventory = ((OustersArmsband*)pOustersArmsband)->getInventory(); - // ʰϸ . + // 슬랏의 범위를 초과하면 사용할 수 없다. if (SlotID >= pOustersArmsbandInventory->getWidth()) { GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); @@ -672,10 +672,10 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, return; } - // Ʈ ޾ƿ´. + // 벨트의 지정 슬랏의 아이템을 받아온다. Item* pOustersArmsbandItem = pOustersArmsbandInventory->getItem(SlotID, 0); - // 翬 . + // 아이템이 없으면 당연히 사용할 수 없다. if (pOustersArmsbandItem == NULL) { GCCannotUse _GCCannotUse; _GCCannotUse.setObjectID(pPacket->getObjectID()); @@ -683,10 +683,10 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, return; } - // ִ Object ޴´. + // 슬랏에 있는 아이템의 Object를 받는다. ObjectID_t ItemObjectID = pOustersArmsbandItem->getObjectID(); - // Ͱ ġ ʰų, Ǫij ̰ ƴ϶ . + // 데이터가 일치하지 않거나, 푸파나 콤포스메이가 아니라면 사용할 수 없다. if (ItemObjectID != pPacket->getObjectID() || (pOustersArmsbandItem->getItemClass() != Item::ITEM_CLASS_PUPA && pOustersArmsbandItem->getItemClass() != Item::ITEM_CLASS_COMPOS_MEI)) { @@ -724,10 +724,10 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, Pupa* pPupa = dynamic_cast(pOustersArmsbandItem); - // Ͽ ȸǴ + // 한턴에 회복되는 양 HPQuantity = pPupa->getHPQuantity(); - // ΰ. + // 한턴이 몇초 인가. HPDelayProvider = pPupa->getHPDelay(); PupaHPAmount = pPupa->getHPAmount(); @@ -739,10 +739,10 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, ComposMei* pComposMei = dynamic_cast(pOustersArmsbandItem); - // Ͽ ȸǴ + // 한턴에 회복되는 양 HPQuantity = pComposMei->getHPQuantity(); - // ΰ. + // 한턴이 몇초 인가. HPDelayProvider = pComposMei->getHPDelay(); PupaHPAmount = pComposMei->getHPAmount(); @@ -750,7 +750,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, HPAmount = min(MaxHP - CurrentHP, (int)PupaHPAmount); } - // HP ȸ Ѵٸ... + // HP 회복양이 존재한다면... if (HPAmount != 0 && HPQuantity != 0) { if (CurrentHP < MaxHP) { EffectManager* pEffectManager = pOusters->getEffectManager(); @@ -763,28 +763,28 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, Effect* pEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_HP_RECOVERY); EffectHPRecovery* pEffectHPRecoveryEffect = dynamic_cast(pEffect); - // Ƚ ä HP Ѵ. - // װ ȸ翡 Ѵ. + // 기존의 단위양과 횟수로 채우는 HP양을 계산한다. + // 그것을 현재 회복양에 더한다. int PrevHPAmount = pEffectHPRecoveryEffect->getHPQuantity() * pEffectHPRecoveryEffect->getPeriod(); HPAmount = min((int)(HPAmount + PrevHPAmount), MaxHP - CurrentHP); - // ߿ ū ȸ ̸ . + // 둘 중에 큰 단위회복양과 작은 딜레이를 얻어낸다. HPQuantity = max(HPQuantity, (int)(pEffectHPRecoveryEffect->getHPQuantity())); HPDelayProvider = min(HPDelayProvider, (int)(pEffectHPRecoveryEffect->getDelay())); - // ȸ , 󸶾 ȸ ΰ Ѵ. + // 현재 회복양을 가지고, 얼마씩 몇번에 회복할 것인가를 결정한다. temp = (double)((double)HPAmount / (double)HPQuantity); Period = (uint)ceil(temp); Deadline = Period * HPDelayProvider; - // HP Recovery effect Ѵ. + // HP Recovery effect를 갱신한다. pEffectHPRecoveryEffect->setDeadline(Deadline); pEffectHPRecoveryEffect->setDelay(HPDelayProvider); pEffectHPRecoveryEffect->setHPQuantity(HPQuantity); pEffectHPRecoveryEffect->setPeriod(Period); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; gcHPRecoveryStartToSelf.setPeriod(pEffectHPRecoveryEffect->getPeriod()); gcHPRecoveryStartToSelf.setDelay(pEffectHPRecoveryEffect->getDelay()); @@ -792,8 +792,8 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ٸ̵鿡 . - // ȸ Ŷ, ۰ Ŷ . + // 회복 시작하라는 패킷을 다른이들에게 보낸다. + // 회복 갱신 패킷, 시작과 똑 같은 패킷을 보낸다. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pOusters->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(pEffectHPRecoveryEffect->getPeriod()); @@ -816,7 +816,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, pEffectManager->addEffect(pEffectHPRecovery); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; gcHPRecoveryStartToSelf.setPeriod(Period); gcHPRecoveryStartToSelf.setDelay(HPDelayProvider); @@ -824,7 +824,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ̵鿡 . + // 회복 시작하라는 패킷을 보는이들에게 보낸다. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pOusters->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(Period); @@ -856,10 +856,10 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, CurrentMP = pOusters->getMP(ATTR_CURRENT); ComposMei* pComposMei = dynamic_cast(pOustersArmsbandItem); - // Ͽ ȸǴ + // 한턴에 회복되는 양 MPQuantity = pComposMei->getMPQuantity(); - // ΰ. + // 한턴이 몇초 인가. MPDelayProvider = pComposMei->getMPDelay(); Attr_t INT = pOusters->getINT(); @@ -873,10 +873,10 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, CurrentMP = pOusters->getMP(ATTR_CURRENT); Pupa* pPupa = dynamic_cast(pOustersArmsbandItem); - // Ͽ ȸǴ + // 한턴에 회복되는 양 MPQuantity = pPupa->getMPQuantity(); - // ΰ. + // 한턴이 몇초 인가. MPDelayProvider = pPupa->getMPDelay(); Attr_t INT = pOusters->getINT(); @@ -887,7 +887,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, min(MaxMP - CurrentMP, (int)(ComposMeiMPAmount * (double)(1 + (double)((double)INT / 300.0)))); } - // MP ȸ Ѵٸ... + // MP 회복양이 존재한다면... if (MPAmount != 0 && MPQuantity != 0) { if (CurrentMP < MaxMP) { EffectManager* pEffectManager = pOusters->getEffectManager(); @@ -900,28 +900,28 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, Effect* pEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_MP_RECOVERY); EffectMPRecovery* pEffectMPRecoveryEffect = dynamic_cast(pEffect); - // Ƚ ä MP Ѵ. - // װ ȸ翡 Ѵ. + // 기존의 단위양과 횟수로 채우는 MP양을 계산한다. + // 그것을 현재 회복양에 더한다. int PrevMPAmount = pEffectMPRecoveryEffect->getMPQuantity() * pEffectMPRecoveryEffect->getPeriod(); MPAmount = min((int)(MPAmount + PrevMPAmount), MaxMP - CurrentMP); - // ߿ ū ȸ ̸ . + // 둘 중에 큰 단위회복양과 작은 딜레이를 얻어낸다. MPQuantity = max(MPQuantity, (int)(pEffectMPRecoveryEffect->getMPQuantity())); MPDelayProvider = min(MPDelayProvider, (int)(pEffectMPRecoveryEffect->getDelay())); - // ȸ , 󸶾 ȸ ΰ Ѵ. + // 현재 회복양을 가지고, 얼마씩 몇번에 회복할 것인가를 결정한다. temp = (double)((double)MPAmount / (double)MPQuantity); Period = (uint)ceil(temp); Deadline = Period * MPDelayProvider; - // MP Recovery effect Ѵ. + // MP Recovery effect를 갱신한다. pEffectMPRecoveryEffect->setDeadline(Deadline); pEffectMPRecoveryEffect->setDelay(MPDelayProvider); pEffectMPRecoveryEffect->setMPQuantity(MPQuantity); pEffectMPRecoveryEffect->setPeriod(Period); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCMPRecoveryStart gcMPRecoveryStart; gcMPRecoveryStart.setPeriod(pEffectMPRecoveryEffect->getPeriod()); gcMPRecoveryStart.setDelay(pEffectMPRecoveryEffect->getDelay()); @@ -943,7 +943,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, pEffectManager->addEffect(pEffectMPRecovery); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCMPRecoveryStart gcMPRecoveryStart; gcMPRecoveryStart.setPeriod(Period); gcMPRecoveryStart.setDelay(MPDelayProvider); @@ -977,10 +977,10 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, HP_t CurrentHP = pOusters->getHP(ATTR_CURRENT); Pupa* pPupa = dynamic_cast(pOustersArmsbandItem); - // Ͽ ȸǴ + // 한턴에 회복되는 양 int HPQuantity = pPupa->getHPQuantity(); - // ΰ. + // 한턴이 몇초 인가. int HPDelayProvider = pPupa->getHPDelay(); HP_t PupaHPAmount = 0; @@ -991,7 +991,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, bool notRecoverHP = false; - // HP ȸ Ѵٸ... + // HP 회복양이 존재한다면... if (HPAmount != 0 && HPQuantity != 0) { if (CurrentHP < MaxHP) @@ -1008,28 +1008,28 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, EffectHPRecovery* pEffectHPRecoveryEffect = dynamic_cast(pEffect); - // Ƚ ä HP Ѵ. - // װ ȸ翡 Ѵ. + // 기존의 단위양과 횟수로 채우는 HP양을 계산한다. + // 그것을 현재 회복양에 더한다. int PrevHPAmount = pEffectHPRecoveryEffect->getHPQuantity()* pEffectHPRecoveryEffect->getPeriod(); HPAmount = min((int)(HPAmount + PrevHPAmount), MaxHP - CurrentHP); - // ߿ ū ȸ ̸ . + // 둘 중에 큰 단위회복양과 작은 딜레이를 얻어낸다. HPQuantity = max(HPQuantity, (int)(pEffectHPRecoveryEffect->getHPQuantity())); HPDelayProvider = min(HPDelayProvider, (int)(pEffectHPRecoveryEffect->getDelay())); - // ȸ , 󸶾 ȸ ΰ Ѵ. + // 현재 회복양을 가지고, 얼마씩 몇번에 회복할 것인가를 결정한다. temp = (double)((double)HPAmount/(double)HPQuantity); Period = (uint)ceil(temp); Deadline = Period* HPDelayProvider; - // HP Recovery effect Ѵ. + // HP Recovery effect를 갱신한다. pEffectHPRecoveryEffect->setDeadline(Deadline); pEffectHPRecoveryEffect->setDelay(HPDelayProvider); pEffectHPRecoveryEffect->setHPQuantity(HPQuantity); pEffectHPRecoveryEffect->setPeriod(Period); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; gcHPRecoveryStartToSelf.setPeriod(pEffectHPRecoveryEffect->getPeriod()); gcHPRecoveryStartToSelf.setDelay(pEffectHPRecoveryEffect->getDelay()); @@ -1037,8 +1037,8 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ٸ̵鿡 . - // ȸ Ŷ, ۰ Ŷ . + // 회복 시작하라는 패킷을 다른이들에게 보낸다. + // 회복 갱신 패킷, 시작과 똑 같은 패킷을 보낸다. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pOusters->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(pEffectHPRecoveryEffect->getPeriod()); @@ -1061,7 +1061,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, pEffectManager->addEffect(pEffectHPRecovery); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; gcHPRecoveryStartToSelf.setPeriod(Period); gcHPRecoveryStartToSelf.setDelay(HPDelayProvider); @@ -1069,7 +1069,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, pGamePlayer->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ̵鿡 . + // 회복 시작하라는 패킷을 보는이들에게 보낸다. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pOusters->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(Period); @@ -1112,10 +1112,10 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, MP_t CurrentMP = pOusters->getMP(ATTR_CURRENT); ComposMei* pComposMei = dynamic_cast(pOustersArmsbandItem); - // Ͽ ȸǴ + // 한턴에 회복되는 양 int MPQuantity = pComposMei->getMPQuantity(); - // ΰ. + // 한턴이 몇초 인가. int MPDelayProvider = pComposMei->getMPDelay(); Attr_t INT = pOusters->getINT(); @@ -1127,10 +1127,10 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, int MPAmount = min(MaxMP - CurrentMP , (int)(pComposMei->getMPAmount()* (1 + (double)((double)INT / 300.0)))); bool notRecoverMP = false; - // MP ȸ Ѵٸ... + // MP 회복양이 존재한다면... if (MPAmount != 0 && MPQuantity != 0 ) { - // 󸶾 ʸ. + // 얼마씩 몇번 몇초마다. if (CurrentMP < MaxMP) { EffectManager* pEffectManager = pOusters->getEffectManager(); @@ -1145,28 +1145,28 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, EffectMPRecovery* pEffectMPRecoveryEffect = dynamic_cast(pEffect); - // Ƚ ä MP Ѵ. - // װ ȸ翡 Ѵ. + // 기존의 단위양과 횟수로 채우는 MP양을 계산한다. + // 그것을 현재 회복양에 더한다. int PrevMPAmount = pEffectMPRecoveryEffect->getMPQuantity()* pEffectMPRecoveryEffect->getPeriod(); MPAmount = min((int)(MPAmount + PrevMPAmount), MaxMP - CurrentMP); - // ߿ ū ȸ ̸ . + // 둘 중에 큰 단위회복양과 작은 딜레이를 얻어낸다. MPQuantity = max(MPQuantity, (int)(pEffectMPRecoveryEffect->getMPQuantity())); MPDelayProvider = min(MPDelayProvider, (int)(pEffectMPRecoveryEffect->getDelay())); - // ȸ , 󸶾 ȸ ΰ Ѵ. + // 현재 회복양을 가지고, 얼마씩 몇번에 회복할 것인가를 결정한다. temp = (double)((double)MPAmount/(double)MPQuantity); Period = (uint)ceil(temp); Deadline = Period* MPDelayProvider; - // MP Recovery effect Ѵ. + // MP Recovery effect를 갱신한다. pEffectMPRecoveryEffect->setDeadline(Deadline); pEffectMPRecoveryEffect->setDelay(MPDelayProvider); pEffectMPRecoveryEffect->setMPQuantity(MPQuantity); pEffectMPRecoveryEffect->setPeriod(Period); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCMPRecoveryStart gcMPRecoveryStart; gcMPRecoveryStart.setPeriod(pEffectMPRecoveryEffect->getPeriod()); gcMPRecoveryStart.setDelay(pEffectMPRecoveryEffect->getDelay()); @@ -1190,7 +1190,7 @@ void CGUsePotionFromQuickSlotHandler::execute(CGUsePotionFromQuickSlot* pPacket, pEffectManager->addEffect(pEffectMPRecovery); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCMPRecoveryStart gcMPRecoveryStart; gcMPRecoveryStart.setPeriod(Period); gcMPRecoveryStart.setDelay(MPDelayProvider); diff --git a/src/Core/CGUsePowerPointHandler.cpp b/src/Core/CGUsePowerPointHandler.cpp index 6000304a..57d54278 100644 --- a/src/Core/CGUsePowerPointHandler.cpp +++ b/src/Core/CGUsePowerPointHandler.cpp @@ -26,15 +26,15 @@ struct POWER_POINT_ITEM_TEMPLATE { uint Ratio; string ItemName; }; -// edit by Coffee 2006-12-10 ޸IJϵͳ +// edit by Coffee 2006-12-10 Ð޸IJ©²ÊϵͳµÀ¾ß const POWER_POINT_ITEM_TEMPLATE PowerPointItemTemplate[7] = { - {GCUsePowerPointResult::CANDY, Item::ITEM_CLASS_EVENT_ETC, 14, 20, "鵤"}, - {GCUsePowerPointResult::RESURRECTION_SCROLL, Item::ITEM_CLASS_RESURRECT_ITEM, 0, 20, ""}, - {GCUsePowerPointResult::ELIXIR_SCROLL, Item::ITEM_CLASS_RESURRECT_ITEM, 1, 20, ""}, - {GCUsePowerPointResult::MEGAPHONE, Item::ITEM_CLASS_EFFECT_ITEM, 0, 20, "Խ1"}, - {GCUsePowerPointResult::NAMING_PEN, Item::ITEM_CLASS_EVENT_GIFT_BOX, 22, 14, "dzǩ"}, - {GCUsePowerPointResult::SIGNPOST, Item::ITEM_CLASS_EVENT_STAR, 6, 1, "ʯ()"}, - {GCUsePowerPointResult::BLACK_RICE_CAKE_SOUP, Item::ITEM_CLASS_EVENT_STAR, 11, 5, "ɫף"} + {GCUsePowerPointResult::CANDY, Item::ITEM_CLASS_EVENT_ETC, 14, 20, "Á鵤"}, + {GCUsePowerPointResult::RESURRECTION_SCROLL, Item::ITEM_CLASS_RESURRECT_ITEM, 0, 20, "¸´»î¾íÖá"}, + {GCUsePowerPointResult::ELIXIR_SCROLL, Item::ITEM_CLASS_RESURRECT_ITEM, 1, 20, "Á¶½ð¾íÖá"}, + {GCUsePowerPointResult::MEGAPHONE, Item::ITEM_CLASS_EFFECT_ITEM, 0, 20, "¶Ô½²»ú1"}, + {GCUsePowerPointResult::NAMING_PEN, Item::ITEM_CLASS_EVENT_GIFT_BOX, 22, 14, "êdzÆÇ©Ãû±Ê"}, + {GCUsePowerPointResult::SIGNPOST, Item::ITEM_CLASS_EVENT_STAR, 6, 1, "À¶±¦Ê¯(×ãÇò)"}, + {GCUsePowerPointResult::BLACK_RICE_CAKE_SOUP, Item::ITEM_CLASS_EVENT_STAR, 11, 5, "ºÚɫף¸£"} }; #endif @@ -70,9 +70,9 @@ void CGUsePowerPointHandler::execute(CGUsePowerPoint* pPacket, Player* pPlayer) GCUsePowerPointResult gcUsePowerPointResult; - // Ŀ Ʈ ִ Ȯ + // ÆÄ¿ö Æ÷ÀÎÆ®°¡ ÀÖ´ÂÁö È®ÀÎ if (pPC->getPowerPoint() < 300) { - // Ŀ Ʈ ϴ. + // ÆÄ¿ö Æ÷ÀÎÆ®°¡ ºÎÁ·ÇÏ´Ù. gcUsePowerPointResult.setErrorCode(GCUsePowerPointResult::NOT_ENOUGH_POWER_POINT); pGamePlayer->sendPacket(&gcUsePowerPointResult); @@ -80,10 +80,10 @@ void CGUsePowerPointHandler::execute(CGUsePowerPoint* pPacket, Player* pPlayer) return; } - // κ丮 ִ ȮѴ. + // Àκ¥Å丮¿¡ °ø°£ÀÌ ÀÖ´ÂÁö È®ÀÎÇÑ´Ù. _TPOINT pt; if (!pPC->getInventory()->getEmptySlot(1, 2, pt)) { - // κ丮 ϴ. + // Àκ¥Å丮¿¡ °ø°£ÀÌ ºÎÁ·ÇÏ´Ù. gcUsePowerPointResult.setErrorCode(GCUsePowerPointResult::NOT_ENOUGH_INVENTORY_SPACE); pGamePlayer->sendPacket(&gcUsePowerPointResult); @@ -91,7 +91,7 @@ void CGUsePowerPointHandler::execute(CGUsePowerPoint* pPacket, Player* pPlayer) return; } - // + // ¾ÆÀÌÅÛ ·£´ý »ý¼º int ratio = rand() % 100 + 1; GCUsePowerPointResult::ITEM_CODE itemCode; @@ -114,20 +114,20 @@ void CGUsePowerPointHandler::execute(CGUsePowerPoint* pPacket, Player* pPlayer) } if (bFind) { - // ߰ + // ¾ÆÀÌÅÛ »ý¼º ¹× Ãß°¡ list nullOption; Item* pItem = g_pItemFactoryManager->createItem(itemClass, itemType, nullOption); pPC->getZone()->registerObject(pItem); if (pPC->getInventory()->addItem(pItem, pt)) { - // DB + // DB ¿¡ ¾ÆÀÌÅÛ »ý¼º pItem->create(pPC->getName(), STORAGE_INVENTORY, 0, pt.x, pt.y); - // ItemTraceLog . + // ItemTraceLog ¸¦ ¸¸±ä´Ù. remainTraceLog(pItem, "Mofus", pPC->getName(), ITEM_LOG_CREATE, DETAIL_EVENTNPC); - // Ŭ̾Ʈ ˸ + // °á°ú¸¦ Ŭ¶óÀÌ¾ðÆ®¿¡ ¾Ë¸®±â GCCreateItem gcCreateItem; gcCreateItem.setObjectID(pItem->getObjectID()); gcCreateItem.setItemClass(pItem->getItemClass()); @@ -140,13 +140,13 @@ void CGUsePowerPointHandler::execute(CGUsePowerPoint* pPacket, Player* pPlayer) pPlayer->sendPacket(&gcCreateItem); - // ʿ Ŀ¯ Ʈ + // ¾ÆÀÌÅÛ »ý¼º¿¡ ÇÊ¿äÇÑ ÆÄ¿ö¯ Æ÷ÀÎÆ® static int RequirePowerPoint = -300; - // Ŀ¯ Ʈ + // ÆÄ¿ö¯ Æ÷ÀÎÆ® ÀúÀå pPC->setPowerPoint(savePowerPoint(pPC->getName(), RequirePowerPoint)); - // Ŭ̾Ʈ ˸ + // °á°ú¸¦ Ŭ¶óÀÌ¾ðÆ®¿¡ ¾Ë¸®±â gcUsePowerPointResult.setErrorCode(GCUsePowerPointResult::NO_ERROR); gcUsePowerPointResult.setItemCode(itemCode); gcUsePowerPointResult.setPowerPoint(pPC->getPowerPoint()); @@ -161,10 +161,10 @@ void CGUsePowerPointHandler::execute(CGUsePowerPoint* pPacket, Player* pPlayer) filelog(MOFUS_LOG_FILE, "CREATE ITEM (name:%s,usepowerpoint:%d,createditem:%s", pPC->getName().c_str(), RequirePowerPoint, itemName.c_str()); } else { - cout << "κ丮 ֱ " << endl; + cout << "Àκ¥Å丮¿¡ ³Ö±â ½ÇÆÐ" << endl; } } else { - cout << " ratio : " << ratio << endl; + cout << "·£´ý ±¼¸®±â ½ÇÆÐ ratio : " << ratio << endl; } #endif diff --git a/src/Core/CGVerifyTimeHandler.cpp b/src/Core/CGVerifyTimeHandler.cpp index f6992d7a..b91bed6d 100644 --- a/src/Core/CGVerifyTimeHandler.cpp +++ b/src/Core/CGVerifyTimeHandler.cpp @@ -32,7 +32,7 @@ void CGVerifyTimeHandler::execute(CGVerifyTime* pPacket, Player* pPlayer) if (!(pGamePlayer->verifySpeed(pPacket))) { saveSpeedHackPlayer(pPlayer); - throw DisconnectException("ǵ ! ɷ!!"); + throw DisconnectException("스피드핵 딱! 걸려써!!"); } #endif @@ -69,7 +69,7 @@ void CGVerifyTimeHandler::saveSpeedHackPlayer(Player* pPlayer) { filelog("SpeedHack.log", "ID[%s], Name[%s], IP[%s]", ID.c_str(), Name.c_str(), IP.c_str()); ///////////////////////////////////////////////////////// - // ִ´. + // 디비에 관련 정보를 넣는다. ///////////////////////////////////////////////////////// Statement* pStmt = NULL; diff --git a/src/Core/CGVisible.h b/src/Core/CGVisible.h index dfcc2bf6..1ec68d46 100644 --- a/src/Core/CGVisible.h +++ b/src/Core/CGVisible.h @@ -2,7 +2,7 @@ // // Filename : CGVisible.h // Written By : crazydog -// Description : 㳪 뿡 ƿ.. +// Description : 박쥐나 늑대에서 원래모습으로 돌아오고싶을때.. // ////////////////////////////////////////////////////////////////////// @@ -24,10 +24,10 @@ class CGVisible : public Packet { public: CGVisible() {}; virtual ~CGVisible() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -40,7 +40,7 @@ class CGVisible : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CGVisiblePacketSize ؼ ϶. + // const static CGVisiblePacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return 0; } @@ -82,7 +82,7 @@ class CGVisibleFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static CGVisiblePacketSize ؼ ϶. + // const static CGVisiblePacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return 0; } diff --git a/src/Core/CGWhisper.cpp b/src/Core/CGWhisper.cpp index 66d3c192..9a5310dd 100644 --- a/src/Core/CGWhisper.cpp +++ b/src/Core/CGWhisper.cpp @@ -11,7 +11,7 @@ void CGWhisper::read(SocketInputStream& iStream) { __BEGIN_TRY - // ̸ б + // 이름 읽기 BYTE szName; iStream.read(szName); @@ -25,7 +25,7 @@ void CGWhisper::read(SocketInputStream& iStream) iStream.read(m_Name, szName); iStream.read(m_Color); - // ޼ б + // 메세지 읽기 BYTE szMessage; iStream.read(szMessage); @@ -46,7 +46,7 @@ void CGWhisper::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ̸ + // 이름 쓰기 BYTE szName = m_Name.size(); if (szName == 0) @@ -61,7 +61,7 @@ void CGWhisper::write(SocketOutputStream& oStream) const oStream.write(m_Color); - // ޼ + // 메세지 쓰기 BYTE szMessage = m_Message.size(); if (szMessage == 0) diff --git a/src/Core/CGWhisper.h b/src/Core/CGWhisper.h index f0a391d8..2fca7392 100644 --- a/src/Core/CGWhisper.h +++ b/src/Core/CGWhisper.h @@ -17,8 +17,8 @@ // // class CGWhisper; // -// Ŭ̾Ʈ Whisper Ŷ̴. -// ο Whisper String Ÿ ʵ . +// 클라이언트가 서버에게 보내는 Whisper 패킷이다. +// 내부에 Whisper String 만을 데이타 필드로 가진다. // ////////////////////////////////////////////////////////////////////// @@ -26,10 +26,10 @@ class CGWhisper : public Packet { public: CGWhisper() {}; virtual ~CGWhisper() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -115,7 +115,7 @@ class CGWhisperFactory : public PacketFactory { } // get packet's max body size - // message ִ ũ⿡ ʿϴ. + // message 의 최대 크기에 대한 설정이 필요하다. PacketSize_t getPacketMaxSize() const { return szBYTE + 10 + szuint + szBYTE + 128; } diff --git a/src/Core/CGWhisperHandler.cpp b/src/Core/CGWhisperHandler.cpp index 12f4ae29..761f899f 100644 --- a/src/Core/CGWhisperHandler.cpp +++ b/src/Core/CGWhisperHandler.cpp @@ -42,14 +42,14 @@ void CGWhisperHandler::execute(CGWhisper* pPacket, Player* pPlayer) bool Success = false; - // ̸ ڸ ãƿ´. + // 이름으로 사용자를 찾아온다. __ENTER_CRITICAL_SECTION((*g_pPCFinder)) Creature* pTargetCreature = g_pPCFinder->getCreature_LOCKED(pPacket->getName()); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature != NULL) { - // ä α׸ . by sigi. 2002.10.30 + // 채팅 로그를 남긴다. by sigi. 2002.10.30 if (LogNameManager::getInstance().isExist(pCreature->getName())) { filelog("chatLog.txt", "[Whisper] %s --> %s> %s", pCreature->getName().c_str(), pTargetCreature->getName().c_str(), pPacket->getMessage().c_str()); @@ -63,14 +63,14 @@ void CGWhisperHandler::execute(CGWhisper* pPacket, Player* pPlayer) Success = false; } - // ڸ ã Message + // 사용자를 성공적으로 찾았으면 Message 전송 if (Success) { if (((GamePlayer*)pTargetPlayer)->getPlayerStatus() == GPS_NORMAL) { if (pCreature != NULL && pTargetCreature != NULL) { - // Ŭ̾Ʈ ϹǷ GC- Ŷ ؾ Ѵ. + // 서버에서 클라이언트로 전송하므로 GC- 패킷을 사용해야 한다. GCWhisper gcWhisper; - // ũó ̸ ޽ Ŷ Ѵ. + // 크리처 이름과 메시지를 패킷에 대입한다. gcWhisper.setName(pCreature->getName()); gcWhisper.setColor(pPacket->getColor()); gcWhisper.setMessage(pPacket->getMessage()); @@ -84,14 +84,14 @@ void CGWhisperHandler::execute(CGWhisper* pPacket, Player* pPlayer) } } - // ׷ ڰ ų ̸ ߸ ־ Failed + // 그런 사용자가 없거나 이름을 잘못 넣었을때 Failed } else { /*inthesky*/ - /* DB ڸ ã´. DB Player, Logon , ServerID ǁٴ? - * ã شӼ GGServerChat Ŷ Ѵ (sender, Color, Message, Race(), - * GGServerChat Ŷ ̸ ÷̾ ãƼ GCWhisperŶ . - * (Failed). - * ڰ ִ ٴ DB Ǵ. DB ŷڵ..?????? + /* DB를 뒤져서 사용자를 찾는다. DB에서 가져올 정보는 Player, Logon 정보와, ServerID 정도가 되곘다? + * 찾으면 해당게임서버로 GGServerChat 패킷을 전송한다 (sender, Color, Message, Race(종족), + * GGServerChat 패킷을 받은 서버는 사용자 이름으로 플레이어를 찾아서 GCWhisper패킷을 만들어 쏜다. + * 없으면 말자(Failed보낸다). + * 사용자가 있다 없다는 DB에서만 판단하자. DB의 신뢰도는..?????? */ Statement* pStmt = NULL; Result* pResult = NULL; @@ -105,7 +105,7 @@ void CGWhisperHandler::execute(CGWhisper* pPacket, Player* pPlayer) BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); - // ũ̸ Slayer̺ PlayerID ã´. + // 크리쳐이름으로 Slayer테이블에서 PlayerID 를 찾는다. pResult = pStmt->executeQuery("SELECT PlayerID FROM Slayer WHERE Name='%s'", pPacket->getName().c_str()); @@ -113,17 +113,17 @@ void CGWhisperHandler::execute(CGWhisper* pPacket, Player* pPlayer) PlayerID = pResult->getString(1); SAFE_DELETE(pStmt); - // ã PlayerID Player̺ ServerGroupID LogOn ã´. + // 찾은 PlayerID로 Player테이블에서 ServerGroupID와 LogOn정보를 찾는다. pStmt = g_pDatabaseManager->getDistConnection("USERINFO")->createStatement(); pResult = pStmt->executeQuery( "SELECT CurrentServerGroupID, LogOn FROM Player WHERE PlayerID='%s'", PlayerID.c_str()); - // Player ãҴ. + // Player 정보를 찾았다. if (pResult->next()) { CurrentServerGroupID = pResult->getInt(1); LogOn = pResult->getString(2); - // ϶ bServerFind true flag + // 게임중인 상태일때 bServerFind에 true flag if (LogOn == "GAME") { bServerFind = true; SAFE_DELETE(pStmt); @@ -135,16 +135,16 @@ void CGWhisperHandler::execute(CGWhisper* pPacket, Player* pPlayer) SAFE_DELETE(pStmt); } - if (bServerFind) // ã + if (bServerFind) // 찾았을때 { - /* GGServerChat Ŷ  - * ...Ӽ.. - * pCreature->getName() = ũ ̸ - * pPacket->getName() = ޴ ũ ̸ - * PlayerID = ޴ ũ - * pPacket->getColor() = ڻ - * pPacket->getMessage() = ޼ - * pCreature->getRace() = ũ + /* GGServerChat 패킷을 만들어서 + * 쏜다...게임서버로.. + * pCreature->getName() = 보내는 크리쳐 이름 + * pPacket->getName() = 받는 크리쳐 이름 + * PlayerID = 받는 크리쳐 계정 + * pPacket->getColor() = 글자색 + * pPacket->getMessage() = 메세지 + * pCreature->getRace() = 보내는 크리쳐 종족 * */ diff --git a/src/Core/CGWithdrawPet.h b/src/Core/CGWithdrawPet.h index 775c0e4c..df0bffde 100644 --- a/src/Core/CGWithdrawPet.h +++ b/src/Core/CGWithdrawPet.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////////////////////////// // // Filename : CGWithdrawPet.h -// Written By : 輺 +// Written By : 김성민 // Description : // //////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/CGWithdrawTax.h b/src/Core/CGWithdrawTax.h index 618b6820..f437b312 100644 --- a/src/Core/CGWithdrawTax.h +++ b/src/Core/CGWithdrawTax.h @@ -25,10 +25,10 @@ class CGWithdrawTax : public Packet { public: CGWithdrawTax() {}; virtual ~CGWithdrawTax() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CGWithdrawTaxHandler.cpp b/src/Core/CGWithdrawTaxHandler.cpp index b416414d..2a458a3c 100644 --- a/src/Core/CGWithdrawTaxHandler.cpp +++ b/src/Core/CGWithdrawTaxHandler.cpp @@ -56,10 +56,10 @@ void CGWithdrawTaxHandler::execute(CGWithdrawTax* pPacket, Player* pPlayer) } } - if (!g_pGuildManager->isGuildMaster(guildID, pPC) // Ͱ ƴϴ. - || !bOwner // ÷̾ 尡 ƴϴ. - || gold == 0 // 峭ġ~ - || pCastleInfo->getTaxBalance() < gold // ڶ. + if (!g_pGuildManager->isGuildMaster(guildID, pPC) // 길드 마스터가 아니다. + || !bOwner // 이 플레이어의 길드가 점령한 성이 아니다. + || gold == 0 // 장난치나~ + || pCastleInfo->getTaxBalance() < gold // 돈이 모자란다. ) { GCNPCResponse fail; fail.setCode(NPC_RESPONSE_WITHDRAW_TAX_FAIL); @@ -68,17 +68,17 @@ void CGWithdrawTaxHandler::execute(CGWithdrawTax* pPacket, Player* pPlayer) return; } - // Ǿ. ãƼ ÷̾ ־ش. + // 모든 조건이 충족되었다. 이제 돈을 찾아서 플레이어에게 넣어준다. Gold_t remainBalance = pCastleInfo->decreaseTaxBalanceEx(gold); pPC->increaseGoldEx(gold); - // þٴ ش. + // 사용자의 돈이 늘어났다는 정보를 보내준다. GCModifyInformation gcMI; gcMI.addLongData(MODIFY_GOLD, pPC->getGold()); pGamePlayer->sendPacket(&gcMI); - // ã ߴٰ ˸. + // 돈을 찾는 데 성공했다고 알린다. GCNPCResponse success; success.setCode(NPC_RESPONSE_WITHDRAW_TAX_OK); success.setParameter(remainBalance); diff --git a/src/Core/CLAgreement.h b/src/Core/CLAgreement.h index 7bfc49b2..ed43bd9c 100644 --- a/src/Core/CLAgreement.h +++ b/src/Core/CLAgreement.h @@ -17,8 +17,8 @@ // // class CLAgreement; // -// Ŭ̾Ʈ α ʿ ϴ Ŷ̴. -// ̵ н尡 ȣȭǾ ִ. +// 클라이언트가 로그인 서버에게 최초에 전송하는 패킷이다. +// 아이디와 패스워드가 암호화되어 있다. // //-------------------------------------------------------------------------------- @@ -26,10 +26,10 @@ class CLAgreement : public Packet { public: CLAgreement() {}; virtual ~CLAgreement() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -54,7 +54,7 @@ class CLAgreement : public Packet { string toString() const; public: - // get/set agreement ݸ + // get/set agreement 넷마블 사용자 약관 동의 여부 bool isAgree() const { return (m_Agree ? true : false); } @@ -63,7 +63,7 @@ class CLAgreement : public Packet { } private: - // ݸ + // 넷마블 사용자 약관 동의 여부 BYTE m_Agree; }; diff --git a/src/Core/CLAgreementHandler.cpp b/src/Core/CLAgreementHandler.cpp index 67fd330a..48ec6344 100644 --- a/src/Core/CLAgreementHandler.cpp +++ b/src/Core/CLAgreementHandler.cpp @@ -13,10 +13,10 @@ #endif ////////////////////////////////////////////////////////////////////////////// -// Ŷ Ŭ̾Ʈ ̵ н带 ȣȭؼ -// α Ѵ. α Ŷ ޾Ƽ -// ÷̾ ̵ н尡 Ȯ DBκ о -// , α θ Ѵ. +// 이 패킷은 클라이언트가 아이디와 패스워드를 암호화해서 +// 로그인 서버로 전송한다. 로그인 서버는 이 패킷을 받아서 +// 플레이어의 아이디와 패스워드가 정확한지 DB로부터 읽어서 +// 비교한 후, 로그인의 성공 여부를 전송한다. ////////////////////////////////////////////////////////////////////////////// void CLAgreementHandler::execute(CLAgreement* pPacket, Player* pPlayer) @@ -37,13 +37,13 @@ void CLAgreementHandler::execute(CLAgreement* pPacket, Player* pPlayer) BEGIN_DB { //---------------------------------------------------------------------- - // ݸ ̵ Ʈ + // 넷마블 약관 미동의 리스트에서 삭제 //---------------------------------------------------------------------- pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery("DELETE FROM PrivateAgreementRemain WHERE PlayerID = '%s'", pLoginPlayer->getID().c_str()); - // ܰ ְ + // 다음 단계로 진행할 수 있게 설정 pLoginPlayer->setAgree(true); SAFE_DELETE(pStmt); diff --git a/src/Core/CLChangeServer.h b/src/Core/CLChangeServer.h index 8cc9987b..65c5d93f 100644 --- a/src/Core/CLChangeServer.h +++ b/src/Core/CLChangeServer.h @@ -23,10 +23,10 @@ class CLChangeServer : public Packet { public: CLChangeServer() {}; virtual ~CLChangeServer() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CLChangeServerHandler.cpp b/src/Core/CLChangeServerHandler.cpp index 752b4b6b..95968835 100644 --- a/src/Core/CLChangeServerHandler.cpp +++ b/src/Core/CLChangeServerHandler.cpp @@ -18,8 +18,8 @@ #endif ////////////////////////////////////////////////////////////////////////////// -// Ŭ̾Ʈ PC Ʈ ޶ ûؿ, α DBκ -// PC εؼ LCPCList Ŷ Ƽ Ѵ. +// 클라이언트가 PC 의 리스트를 달라고 요청해오면, 로그인 서버는 DB로부터 +// PC들의 정보를 로딩해서 LCPCList 패킷에 담아서 전송한다. ////////////////////////////////////////////////////////////////////////////// void CLChangeServerHandler::execute(CLChangeServer* pPacket, Player* pPlayer) @@ -42,7 +42,7 @@ void CLChangeServerHandler::execute(CLChangeServer* pPacket, Player* pPlayer) pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); //---------------------------------------------------------------------- - // LCPCList Ŷ  + // 이제 LCPCList 패킷을 만들어서 보내자 //---------------------------------------------------------------------- LCPCList lcPCList; @@ -53,12 +53,12 @@ void CLChangeServerHandler::execute(CLChangeServer* pPacket, Player* pPlayer) pStmt->executeQuery("UPDATE Player set CurrentServerGroupID = %d WHERE PlayerID = '%s'", (int)pPacket->getServerGroupID(), pLoginPlayer->getID().c_str()); - // ü Ѵ. + // 쿼리 결과 및 쿼리문 객체를 삭제한다. SAFE_DELETE(pStmt); } catch (SQLQueryException& sce) { // cout << sce.toString() << endl; - // ü Ѵ. + // 쿼리 결과 및 쿼리문 객체를 삭제한다. SAFE_DELETE(pStmt); throw DisconnectException(sce.toString()); diff --git a/src/Core/CLCreatePC.h b/src/Core/CLCreatePC.h index fac9996e..3e99a5c6 100644 --- a/src/Core/CLCreatePC.h +++ b/src/Core/CLCreatePC.h @@ -19,7 +19,7 @@ // // class CLCreatePC; // -// ̾ ij͸ , Ŷ Ƽ Ѵ. +// 슬레이어 캐릭터를 새로 만들 경우, 이 패킷에 정보를 담아서 서버로 전송한다. // //---------------------------------------------------------------------- @@ -41,10 +41,10 @@ class CLCreatePC : public Packet { public: CLCreatePC() {}; virtual ~CLCreatePC() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -57,12 +57,12 @@ class CLCreatePC : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static CLCreatePCPacketSize , ϶. + // const static CLCreatePCPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { - return szBYTE + m_Name.size() // ̸ - + szSlot // - + szBYTE // ̾ ÷(3 bit) - + szAttr * 3 + szColor * SLAYER_COLOR_MAX; // + return szBYTE + m_Name.size() // 이름 + + szSlot // 슬랏 + + szBYTE // 슬레이어 플래그(3 bit) + + szAttr * 3 + szColor * SLAYER_COLOR_MAX; // 색깔 정보 } // get packet's name @@ -174,16 +174,16 @@ class CLCreatePC : public Packet { private: - // PC ̸ + // PC의 이름 string m_Name; - // + // 슬랏 Slot m_Slot; - // ̾ ÷ + // 슬레이어 플래그 bitset m_BitSet; - // ̾ + // 슬레이어 색깔 정보 Color_t m_Colors[SLAYER_COLOR_MAX]; // STR, DEX, INTE @@ -191,7 +191,7 @@ class CLCreatePC : public Packet { Attr_t m_DEX; Attr_t m_INT; - // + // 종족 Race_t m_Race; }; @@ -223,13 +223,13 @@ class CLCreatePCFactory : public PacketFactory { // get packet's body size // *OPTIMIZATION HINT* - // const static CLCreatePCPacketSize , ϶. + // const static CLCreatePCPacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { - return szBYTE + 20 // ̸ - + szSlot // - + szBYTE // ̾ ÷(3 bit) - + szAttr * 3 + szColor * CLCreatePC::SLAYER_COLOR_MAX // - + szRace; // + return szBYTE + 20 // 이름 + + szSlot // 슬랏 + + szBYTE // 슬레이어 플래그(3 bit) + + szAttr * 3 + szColor * CLCreatePC::SLAYER_COLOR_MAX // 색깔 정보 + + szRace; // 종족 } }; diff --git a/src/Core/CLCreatePCHandler.cpp b/src/Core/CLCreatePCHandler.cpp index 1f5fb150..1c4b6db0 100644 --- a/src/Core/CLCreatePCHandler.cpp +++ b/src/Core/CLCreatePCHandler.cpp @@ -76,13 +76,13 @@ void CLCreatePCHandler::execute(CLCreatePC* pPacket, Player* pPlayer) { try { pStmt = g_pDatabaseManager->getConnection(WorldID)->createStatement(); - // ýۿ ϰų, ̸ ƴѱ Ѵ. + // 시스템에서 사용하거나, 금지된 이름은 아닌기 검증한다. // NONE, ZONE***, INV***, QUICK... // string text = pPacket->getName(); if (!isAvailableID(pPacket->getName().c_str())) { lcCreatePCError.setErrorID(ALREADY_REGISTER_ID); - throw DuplicatedException("̹ ϴ ̵Դϴ."); + throw DuplicatedException("이미 존재하는 아이디입니다."); } /* @@ -92,21 +92,21 @@ void CLCreatePCHandler::execute(CLCreatePC* pPacket, Player* pPlayer) { if (text.find(*itr) != string::npos) { lcCreatePCError.setErrorID(ALREADY_REGISTER_ID); - throw DuplicatedException("̹ ϴ ̵Դϴ."); + throw DuplicatedException("이미 존재하는 아이디입니다."); } } */ #if defined(__THAILAND_SERVER__) || defined(__CHINA_SERVER__) /* - * ± ڼ tis620 thailand charset ϴ ڸ ɸ ̸ - * ֵ Ѵ. + * 태국어 문자셋 tis620 thailand charset 에서 허용하는 문자만을 케릭터 이름으로 + * 쓸 수 있도록 제어한다. * * */ /* - * ߱ ڵ gb2312-simple chinese ϴ ڸ ɸ ̸ - * ֵ Ѵ. + * 중국어 문자코드셋 gb2312-simple chinese 에서 허용하는 문자만을 케릭터 이름으로 + * 쓸 수 있도록 제어한다. * * */ @@ -115,29 +115,29 @@ void CLCreatePCHandler::execute(CLCreatePC* pPacket, Player* pPlayer) { if (isAllowStr == false) { lcCreatePCError.setErrorID(ETC_ERROR); - throw DuplicatedException(" ʴ ڰ ԵǾ "); + throw DuplicatedException("허용하지 않는 문자가 포함되어 있음"); } #endif - // ̹ ϴ ij ̸ ƴ Ѵ. + // 이미 존재하는 캐릭터 이름이 아닌지 검증한다. ///* pResult = pStmt->executeQuery("SELECT Name FROM Slayer WHERE Name = '%s'", pPacket->getName().c_str()); if (pResult->getRowCount() != 0) { lcCreatePCError.setErrorID(ALREADY_REGISTER_ID); - throw DuplicatedException("̹ ϴ ̵Դϴ."); + throw DuplicatedException("이미 존재하는 아이디입니다."); } - // ش ijͰ ̹ Ѵ. + // 해당 슬랏에 캐릭터가 이미 있지는 않은지 검증한다. pResult = pStmt->executeQuery("SELECT Name FROM Slayer WHERE PlayerID ='%s' and Slot ='%s' AND Active='ACTIVE'", pLoginPlayer->getID().c_str(), Slot2String[pPacket->getSlot()].c_str()); if (pResult->getRowCount() != 0) { lcCreatePCError.setErrorID(ALREADY_REGISTER_ID); - throw DuplicatedException("̹ ϴ ̵Դϴ."); + throw DuplicatedException("이미 존재하는 아이디입니다."); } //*/ - // ϳ. 2002. 7. 13 by sigi. ̰ . - -; + // 두 쿼리를 하나로. 2002. 7. 13 by sigi. 이거 안좋다. - -; /* pResult = pStmt->executeQuery("SELECT Name FROM Slayer WHERE Name='%s' OR PlayerID='%s' AND Slot='%s'", pPacket->getName().c_str(), @@ -147,12 +147,12 @@ void CLCreatePCHandler::execute(CLCreatePC* pPacket, Player* pPlayer) { if (pResult->getRowCount() != 0) { lcCreatePCError.setErrorID(ALREADY_REGISTER_ID); - throw DuplicatedException("̹ ϴ ̵Դϴ."); + throw DuplicatedException("이미 존재하는 아이디입니다."); } */ - // ߸ ɷġ ij͸ Ϸ ϴ ƴ Ѵ. + // 잘못된 능력치를 가지고 캐릭터를 생성하려 하는 것은 아닌지 검증한다. bool bInvalidAttr = false; @@ -218,13 +218,13 @@ void CLCreatePCHandler::execute(CLCreatePC* pPacket, Player* pPlayer) { bInvalidAttr = true; // cout << "Slayer: " << nSTR << ", " << nDEX << ", " << nINT << endl; - } else if (pPacket->getRace() == RACE_VAMPIRE) // vampire . 20. by sigi. 2002.10.31 + } else if (pPacket->getRace() == RACE_VAMPIRE) // vampire인 경우. 무조건 20. by sigi. 2002.10.31 { if (nSTR != 20 || nDEX != 20 || nINT != 20) { bInvalidAttr = true; } else { - // vampire - // Slayer ɷġ ٽ Ѵ. -_-; + // 정상적인 vampire인 경우 + // Slayer의 능력치를 다시 설정해줘야 한다. -_-; // by sigi. 2002.11.7 nSTR = 5 + rand() % 16; // 5~20 nDEX = 5 + rand() % (21 - nSTR); @@ -256,11 +256,11 @@ void CLCreatePCHandler::execute(CLCreatePC* pPacket, Player* pPlayer) { throw InvalidProtocolException("CLCreatePCHandler::too large character attribute"); } - // ˻縦 ߴٸ ij͸ Ѵ. + // 모든 검사를 만족했다면 이제 캐릭터를 생성한다. ServerGroupID_t CurrentServerGroupID = pPlayer->getServerGroupID(); - // .. ϴ Ϸ static ߴ. - // ߿ ƿ α 㶧 ġ table loading εؾ ̴. 2002.7.13 by sigi + // 우헤헤.. 일단 쿼리를 줄일려고 static으로 삽질을 했다. + // 나중에 아예 로그인 서버 뜰때에 경험치 table들을 loading해 두도록해야할 것이다. 2002.7.13 by sigi static int STRGoalExp[100] = { 0, }; @@ -322,7 +322,7 @@ void CLCreatePCHandler::execute(CLCreatePC* pPacket, Player* pPlayer) { nINTExp = INTAccumExp[nINT - 1] = pResult->getInt(1); } - // ϴ .. / и.. + // 일단 복장은 없고.. 남/녀 구분만.. DWORD slayerShape = (pPacket->getSex() == 1 ? 1 : 0); DWORD vampireShape = slayerShape; @@ -401,7 +401,7 @@ void CLCreatePCHandler::execute(CLCreatePC* pPacket, Player* pPlayer) { pStmt->executeQuery(vampireSQL.toString()); */ - // ij ÿ ̾ ִ. + // 캐릭터 생성시에 뱀파이어를 선택할 수 있다. // by sigi. 2002.10.31 string race; switch (pPacket->getRace()) { @@ -416,7 +416,7 @@ void CLCreatePCHandler::execute(CLCreatePC* pPacket, Player* pPlayer) { break; default: lcCreatePCError.setErrorID(ETC_ERROR); - pLoginPlayer->sendPacket(&lcCreatePCError); // Ŭ̾Ʈ PC Ŷ . + pLoginPlayer->sendPacket(&lcCreatePCError); // 클라이언트에게 PC 생성 실패 패킷을 날린다. return; } @@ -436,10 +436,10 @@ void CLCreatePCHandler::execute(CLCreatePC* pPacket, Player* pPlayer) { (int)pPacket->getINT() * 2, slayerShape, (int)HelmetColor, (int)JacketColor, (int)PantsColor, (int)WeaponColor, (int)ShieldColor); - // ġ . by sigi. 2002.10.31 - // ƿ콺ͽ Ƿ ߿ ϳ . - // ٵ  𸥴ٴ ұ - // ׻ ׷ ¾ Ա⶧ ּ Ѵ Ǯִ°....~~ + // 생성 위치 변경. by sigi. 2002.10.31 + // 아우스터스로의 종족간 변신이 없으므로 둘중에 하나만 만든다. + // 근데 왠지 종족간 변신이 들어갈지도 모른다는 불길한 예간이 들고 + // 항상 그런 예감들은 맞아 왔기때문에 언젠가 이 주석을 보고 둘다 풀어주는게....으아~~ if (pPacket->getRace() != RACE_OUSTERS) { pStmt->executeQuery( "INSERT INTO Vampire ( Name, PlayerID, Slot, ServerGroupID, Active, Sex, SkinColor, STR, DEX, INTE, " @@ -470,7 +470,7 @@ void CLCreatePCHandler::execute(CLCreatePC* pPacket, Player* pPlayer) { pPacket->getName().c_str()); } - // Ŭ̾Ʈ PC Ŷ . + // 클라이언트에게 PC 생성 성공 패킷을 날린다. LCCreatePCOK lcCreatePCOK; pLoginPlayer->sendPacket(&lcCreatePCOK); pLoginPlayer->setPlayerStatus(LPS_WAITING_FOR_CL_GET_PC_LIST); @@ -478,11 +478,11 @@ void CLCreatePCHandler::execute(CLCreatePC* pPacket, Player* pPlayer) { SAFE_DELETE(pStmt); } catch (DuplicatedException& de) { SAFE_DELETE(pStmt); - pLoginPlayer->sendPacket(&lcCreatePCError); // Ŭ̾Ʈ PC Ŷ . + pLoginPlayer->sendPacket(&lcCreatePCError); // 클라이언트에게 PC 생성 실패 패킷을 날린다. } catch (SQLQueryException& sqe) { SAFE_DELETE(pStmt); lcCreatePCError.setErrorID(ETC_ERROR); - pLoginPlayer->sendPacket(&lcCreatePCError); // Ŭ̾Ʈ PC Ŷ . + pLoginPlayer->sendPacket(&lcCreatePCError); // 클라이언트에게 PC 생성 실패 패킷을 날린다. } #endif @@ -492,10 +492,10 @@ void CLCreatePCHandler::execute(CLCreatePC* pPacket, Player* pPlayer) { bool isAvailableID(const char* pID) { const int maxInvalidID = 10; - static const char* invalidID[maxInvalidID] = {"NONE", "", "", "", "", - "ȹ", "", "׽", "", "GM"}; + static const char* invalidID[maxInvalidID] = {"NONE", "관리자", "도우미", "담당자", "운영", + "기획자", "개발자", "테스터", "직원", "GM"}; - // . - -; 2002.7.13 by sigi. + // 좀 빠를까. - -; 2002.7.13 by sigi. for (int i = 0; i < maxInvalidID; i++) { if (strstr(pID, invalidID[i]) != NULL) { return false; @@ -607,11 +607,11 @@ bool isAllowString(string str) { int nNor = extTis620Normal(str); if (nNum == -1) - isAllow = false; // ڿ ó ڷ ϸ + isAllow = false; // 문자열의 처음이 숫자로 시작하면 if (nEng && nNor) - isAllow = false; // Ϲݹڿ ִٸ + isAllow = false; // 일반문자와 영문이 섞여 있다면 if (nASpc) - isAllow = false; // Ascii Ưڰ ߰ߵǸ + isAllow = false; // Ascii영역에서 특수문자가 발견되면 } return isAllow; @@ -621,10 +621,10 @@ bool isAllowString(string str) { #ifdef __CHINA_SERVER__ -// ڿ ڰ  ִ ã -// return : -1 ڿ ó ڰ ִ. -// return : 0 ڿ ڸ ã ߴ. -// return : x > 0 ڿ 1 ̻ ڸ ãҴ. +// 문자열에 숫자가 몇개 있는지 찾기 +// return : -1 문자열의 처음에 숫자가 있다. +// return : 0 문자열에서 숫자를 찾지 못했다. +// return : x > 0 문자열에서 1개 이상의 숫자를 찾았다. int extNumberic(string srcStr) { unsigned char ch; int nNumChar = 0; @@ -648,9 +648,9 @@ int extNumberic(string srcStr) { } -// ڿ ڰ  ִ ã´ -// return : 0 ڿ ڸ ã ߴ. -// return : x > 0 ڿ 1 ̻ ڸ ãҴ. x ã +// 문자열에서 영자가 몇개 있는지 찾는다 +// return : 0 문자열에서 숫자를 찾지 못했다. +// return : x > 0 문자열에서 1개 이상의 숫자를 찾았다. x는 찾은 갯수 int extEnglish(string srcStr) { unsigned char ch; int nEngChar = 0; @@ -670,7 +670,7 @@ int extEnglish(string srcStr) { return nEngChar; } -// GB2312 ڵ ڰ  ִ ִ ã´. +// GB2312 코드셋의 문자가 몇개 있는지 있는지 찾는다. int extGb2312Normal(string srcStr) { unsigned char ch; int nNormalChar = 0; @@ -758,13 +758,13 @@ bool isAllowString(string str) { int nASpc = extAsciiSpecial(str); if (nNum == -1) - isAllow = false; // ڿ ó ڷ ϸ + isAllow = false; // 문자열의 처음이 숫자로 시작하면 if (nSpc) - isAllow = false; // Ưڰ ԵǾ ִٸ (gb2312ȿ üũ + isAllow = false; // 특수문자가 포함되어 있다면 (gb2312안에서만 체크한 if (nEng && nNor) - isAllow = false; // Ϲݹڿ ִٸ + isAllow = false; // 일반문자와 영문이 섞여 있다면 if (nASpc) - isAllow = false; // Ascii Ưڰ ߰ߵǸ + isAllow = false; // Ascii영역에서 특수문자가 발견되면 } return isAllow; diff --git a/src/Core/CLDeletePC.h b/src/Core/CLDeletePC.h index 9cf71696..0d53de22 100644 --- a/src/Core/CLDeletePC.h +++ b/src/Core/CLDeletePC.h @@ -17,7 +17,7 @@ // // class CLDeletePC; // -// Ư PC ϴ Ŷ̴. +// 특정 슬랏의 PC 를 삭제하는 패킷이다. // //---------------------------------------------------------------------- @@ -25,10 +25,10 @@ class CLDeletePC : public Packet { public: CLDeletePC() {}; virtual ~CLDeletePC() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -83,7 +83,7 @@ class CLDeletePC : public Packet { // Slot Slot m_Slot; - // ֹεϹȣ + // 주민등록번호 string m_SSN; }; diff --git a/src/Core/CLDeletePCHandler.cpp b/src/Core/CLDeletePCHandler.cpp index b643fb05..4977b041 100644 --- a/src/Core/CLDeletePCHandler.cpp +++ b/src/Core/CLDeletePCHandler.cpp @@ -42,7 +42,7 @@ void CLDeletePCHandler::execute(CLDeletePC* pPacket, Player* pPlayer) { pStmt = g_pDatabaseManager->getConnection(WorldID)->createStatement(); //////////////////////////////////////////////////////////// - // ϴ ׷ ̾ ϴ üũѴ. + // 일단 그런 슬레이어가 존재하는지 체크한다. //////////////////////////////////////////////////////////// // printf("SELECT Active FROM Slayer WHERE Name = '%s' AND Active='ACTIVE' AND PlayerID='%s'", // pPacket->getName().c_str(), pPlayer->getID().c_str()); @@ -63,12 +63,12 @@ void CLDeletePCHandler::execute(CLDeletePC* pPacket, Player* pPlayer) { } //////////////////////////////////////////////////////////// - // ֹεϹȣ ȮѴ. + // 주민등록번호를 확인한다. //////////////////////////////////////////////////////////// // add by zdj 2005.5.11 - // + // 팁귁苟충侶뙈 /* @@ -76,7 +76,7 @@ void CLDeletePCHandler::execute(CLDeletePC* pPacket, Player* pPlayer) { if ( (pLoginPlayer->isFreePass() && !pLoginPlayer->isWebLogin() ) || g_pConfig->getPropertyInt("IsNetMarble")==1) { - // ִ. + // 무조건 지울 수 있다. pResult = pLoginStmt->executeQuery("SELECT length(Password) FROM Player Where PlayerID = '%s'", pPlayer->getID().c_str()); @@ -117,10 +117,10 @@ void CLDeletePCHandler::execute(CLDeletePC* pPacket, Player* pPlayer) { } #endif - */ // + */ //팁귁 //////////////////////////////////////////////////////////// - // ϴ ̾ ̺ Ȯ Ѵ. + // 일단 슬레이어 테이블에는 확실히 존재한다. //////////////////////////////////////////////////////////// #if defined(__CHINA_SERVER__) || defined(__THAILAND_SERVER__) || defined(__NETMARBLE_SERVER__) pResult = pStmt->executeQuery("DELETE FROM Slayer WHERE Name = '%s' AND Slot = '%s'", @@ -142,7 +142,7 @@ void CLDeletePCHandler::execute(CLDeletePC* pPacket, Player* pPlayer) { #endif //////////////////////////////////////////////////////////// - // ̾ ̺ . + // 뱀파이어 테이블을 지운다. //////////////////////////////////////////////////////////// #if defined(__CHINA_SERVER__) || defined(__THAILAND_SERVER__) || defined(__NETMARBLE_SERVER__) pResult = pStmt->executeQuery("DELETE FROM Vampire WHERE Name = '%s' AND Slot = '%s'", @@ -155,7 +155,7 @@ void CLDeletePCHandler::execute(CLDeletePC* pPacket, Player* pPlayer) { // successfully...." << endl; //////////////////////////////////////////////////////////// - // ƿ콺ͽ ̺ . + // 아우스터스 테이블을 지운다. //////////////////////////////////////////////////////////// #if defined(__CHINA_SERVER__) || defined(__THAILAND_SERVER__) || defined(__NETMARBLE_SERVER__) pResult = pStmt->executeQuery("DELETE FROM Ousters WHERE Name = '%s' AND Slot = '%s'", @@ -167,29 +167,29 @@ void CLDeletePCHandler::execute(CLDeletePC* pPacket, Player* pPlayer) { #if defined(__CHINA_SERVER__) || defined(__THAILAND_SERVER__) || defined(__NETMARBLE_SERVER__) //////////////////////////////////////////////////////////// - // ̾ ų . + // 슬레이어 스킬을 지운다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM SkillSave WHERE OwnerID = '%s'", pPacket->getName().c_str()); // cout << "Slayer(" << pPacket->getName() << ") deleted successfully...." << endl; //////////////////////////////////////////////////////////// - // ̾ ų ش. + // 뱀파이어 스킬을 지워준다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM VampireSkillSave WHERE OwnerID = '%s'", pPacket->getName().c_str()); //////////////////////////////////////////////////////////// - // ƿ콺 ų ش. + // 아우스터즈 스킬을 지워준다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM OustersSkillSave WHERE OwnerID = '%s'", pPacket->getName().c_str()); #endif //////////////////////////////////////////////////////////// - // ʽ ش. + // 계급 보너스를 지워준다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM RankBonusData WHERE OwnerID = '%s'", pPacket->getName().c_str()); //////////////////////////////////////////////////////////// - // ׸ . + // 아이템을 깡그리 지운다. //////////////////////////////////////////////////////////// // g_pItemDestroyer->destroyAll(pPacket->getName()); string ownerID = pPacket->getName(); @@ -285,13 +285,13 @@ void CLDeletePCHandler::execute(CLDeletePC* pPacket, Player* pPlayer) { pStmt->executeQueryString("DELETE FROM MittenObject WHERE OwnerID = '" + ownerID + "'"); //////////////////////////////////////////////////////////// - // Ŀ Ŀ Ͽ ش. + // 커플일 경우 커플 목록에서 지워준다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM CoupleInfo WHERE FemalePartnerName='%s'", ownerID.c_str()); pStmt->executeQuery("DELETE FROM CoupleInfo WHERE MalePartnerName='%s'", ownerID.c_str()); //////////////////////////////////////////////////////////// - // ִ Ʈ鵵 . + // 남아 있는 이펙트들도 지운다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM EffectAcidTouch where OwnerID='%s'", pPacket->getName().c_str()); pStmt->executeQuery("DELETE FROM EffectAftermath where OwnerID='%s'", pPacket->getName().c_str()); @@ -310,27 +310,27 @@ void CLDeletePCHandler::execute(CLDeletePC* pPacket, Player* pPlayer) { pStmt->executeQuery("DELETE FROM EnemyErase where OwnerID='%s'", pPacket->getName().c_str()); //////////////////////////////////////////////////////////// - // ÷ µ ش. + // 플래그 셋도 삭제해 준다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM FlagSet WHERE OwnerID='%s'", pPacket->getName().c_str()); //////////////////////////////////////////////////////////// - // ð ۵ ش. + // 시간제한 아이템도 삭제해 준다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM TimeLimitItems WHERE OwnerID='%s'", pPacket->getName().c_str()); //////////////////////////////////////////////////////////// - // ̺Ʈ ش. + // 이벤트 정보도 삭제해 준다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM EventQuestAdvance WHERE OwnerID='%s'", pPacket->getName().c_str()); //////////////////////////////////////////////////////////// - // ۽ Ŀ Ʈ .. + // 모퍼스 파워 포인트도 삭제.. 잇힝 //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM MofusPowerPoint WHERE OwnerID='%s'", pPacket->getName().c_str()); //////////////////////////////////////////////////////////// - // Ŭ̾Ʈ PC Ŷ . + // 클라이언트에게 PC 삭제 성공 패킷을 날린다. //////////////////////////////////////////////////////////// LCDeletePCOK lcDeletePCOK; pLoginPlayer->sendPacket(&lcDeletePCOK); @@ -344,7 +344,7 @@ void CLDeletePCHandler::execute(CLDeletePC* pPacket, Player* pPlayer) { SAFE_DELETE(pStmt); SAFE_DELETE(pLoginStmt); - // Ŭ̾Ʈ PC Ŷ . + // 클라이언트에게 PC 삭제 실패 패킷을 날린다. pLoginPlayer->sendPacket(&lcDeletePCError); } catch (SQLQueryException& sqe) { cout << "Fail to deletePC : " << sqe.toString() << endl; @@ -352,7 +352,7 @@ void CLDeletePCHandler::execute(CLDeletePC* pPacket, Player* pPlayer) { SAFE_DELETE(pStmt); SAFE_DELETE(pLoginStmt); - // Ŭ̾Ʈ PC Ŷ . + // 클라이언트에게 PC 삭제 실패 패킷을 날린다. pLoginPlayer->sendPacket(&lcDeletePCError); } diff --git a/src/Core/CLGetPCList.h b/src/Core/CLGetPCList.h index ffd64a39..99fb3bfc 100644 --- a/src/Core/CLGetPCList.h +++ b/src/Core/CLGetPCList.h @@ -23,10 +23,10 @@ class CLGetPCList : public Packet { public: CLGetPCList() {}; virtual ~CLGetPCList() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CLGetPCListHandler.cpp b/src/Core/CLGetPCListHandler.cpp index c0dbbe8c..80e3411e 100644 --- a/src/Core/CLGetPCListHandler.cpp +++ b/src/Core/CLGetPCListHandler.cpp @@ -16,8 +16,8 @@ #endif ////////////////////////////////////////////////////////////////////////////// -// Ŭ̾Ʈ PC Ʈ ޶ ûؿ, α DBκ -// PC εؼ LCPCList Ŷ Ƽ Ѵ. +// 클라이언트가 PC 의 리스트를 달라고 요청해오면, 로그인 서버는 DB로부터 +// PC들의 정보를 로딩해서 LCPCList 패킷에 담아서 전송한다. ////////////////////////////////////////////////////////////////////////////// void CLGetPCListHandler::execute(CLGetPCList* pPacket, Player* pPlayer) @@ -35,7 +35,7 @@ void CLGetPCListHandler::execute(CLGetPCList* pPacket, Player* pPlayer) //---------------------------------------------------------------------- - // LCPCList Ŷ + // 이제 LCPCList 패킷을 만들어 보낸다 //---------------------------------------------------------------------- LCPCList lcPCList; pLoginPlayer->makePCList(lcPCList); diff --git a/src/Core/CLGetServerList.h b/src/Core/CLGetServerList.h index eea9834d..81caafe5 100644 --- a/src/Core/CLGetServerList.h +++ b/src/Core/CLGetServerList.h @@ -23,10 +23,10 @@ class CLGetServerList : public Packet { public: CLGetServerList() {}; virtual ~CLGetServerList() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CLGetServerListHandler.cpp b/src/Core/CLGetServerListHandler.cpp index 312e61b1..27fc76c7 100644 --- a/src/Core/CLGetServerListHandler.cpp +++ b/src/Core/CLGetServerListHandler.cpp @@ -18,8 +18,8 @@ #endif ////////////////////////////////////////////////////////////////////////////// -// Ŭ̾Ʈ Ʈ ޶ ûؿ, α DBκ -// εؼ LCServerList Ŷ Ƽ Ѵ. +// 클라이언트가 서버의 리스트를 달라고 요청해오면, 로그인 서버는 DB로부터 +// 서버들의 정보를 로딩해서 LCServerList 패킷에 담아서 전송한다. ////////////////////////////////////////////////////////////////////////////// void CLGetServerListHandler::execute(CLGetServerList* pPacket, Player* pPlayer) diff --git a/src/Core/CLGetWorldListHandler.cpp b/src/Core/CLGetWorldListHandler.cpp index 674bc10b..7f081d6d 100644 --- a/src/Core/CLGetWorldListHandler.cpp +++ b/src/Core/CLGetWorldListHandler.cpp @@ -16,8 +16,8 @@ #endif ////////////////////////////////////////////////////////////////////////////// -// Ŭ̾Ʈ Ʈ ޶ ûؿ, α DBκ -// εؼ LCWorldList Ŷ Ƽ Ѵ. +// 클라이언트가 서버의 리스트를 달라고 요청해오면, 로그인 서버는 DB로부터 +// 서버들의 정보를 로딩해서 LCWorldList 패킷에 담아서 전송한다. ////////////////////////////////////////////////////////////////////////////// void CLGetWorldListHandler::execute(CLGetWorldList* pPacket, Player* pPlayer) @@ -50,7 +50,7 @@ void CLGetWorldListHandler::execute(CLGetWorldList* pPacket, Player* pPlayer) aWorldInfo[i] = pWorldInfo; - // Ʈ(2) + // 트랜실(2) 빼기 // if (i==2) pWorldInfo->setStat(WORLD_CLOSE); // cout << "AddWorld : " << pWorldInfo->getName() << endl; diff --git a/src/Core/CLLogin.cpp b/src/Core/CLLogin.cpp index c54e0eb5..4868b067 100644 --- a/src/Core/CLLogin.cpp +++ b/src/Core/CLLogin.cpp @@ -57,8 +57,8 @@ void CLLogin::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ݸ Cpsso õ ڵ Write ġ ʴ´ ( Ƿ ;;) - // Client ˾Ƽ óؼ ֵ Ѵ. + // 넷마블의 Cpsso 관련된 코드는 서버의 Write 에서는 고치지 않는다 (쓰이지 않으므로 ;;) + // Client 에서만 알아서 처리해서 보내주도록 한다. BYTE szID = m_ID.size(); if (szID == 0) diff --git a/src/Core/CLLogin.h b/src/Core/CLLogin.h index 048d6d3e..b4efadd0 100644 --- a/src/Core/CLLogin.h +++ b/src/Core/CLLogin.h @@ -17,12 +17,12 @@ // // class CLLogin; // -// Ŭ̾Ʈ α ʿ ϴ Ŷ̴. -// ̵ н尡 ȣȭǾ ִ. +// 클라이언트가 로그인 서버에게 최초에 전송하는 패킷이다. +// 아이디와 패스워드가 암호화되어 있다. // //-------------------------------------------------------------------------------- -// ִ MAC ADDRESS +// 최대 MAC ADDRESS 길이 #define MAX_LENGTH_MAC 6 @@ -34,10 +34,10 @@ class CLLogin : public Packet { virtual ~CLLogin() {}; public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -109,14 +109,14 @@ class CLLogin : public Packet { } private: - // ÷̾ ̵ + // 플레이어 아이디 string m_ID; - // ÷̾ н + // 플레이어 패스워드 string m_Password; - // ޴ ƴ ʿ䰡 ־ ߰ - // Size ʴ´. (ݸ Cpsso ִ ) + // 보내고 받는 건 아니지만 정보를 가지고 있을 필요가 있어서 멤버 변수 추가 + // Size 계산은 하지 않는다. (넷마블의 Cpsso 방식의 인증 정보에 들어 있는 내용 보관) bool m_bNetmarble; bool m_bAdult; diff --git a/src/Core/CLLoginHandler.cpp b/src/Core/CLLoginHandler.cpp index d84bd53c..14a2c945 100644 --- a/src/Core/CLLoginHandler.cpp +++ b/src/Core/CLLoginHandler.cpp @@ -3,44 +3,44 @@ // Written By : Reiot // Description : // -// Ŷ Ŭ̾Ʈ ̵ н带 ȣȭؼ -// α Ѵ. α Ŷ ޾Ƽ -// ÷̾ ̵ н尡 Ȯ DBκ о -// , α θ Ѵ. +// 이 패킷은 클라이언트가 아이디와 패스워드를 암호화해서 +// 로그인 서버로 전송한다. 로그인 서버는 이 패킷을 받아서 +// 플레이어의 아이디와 패스워드가 정확한지 DB로부터 읽어서 +// 비교한 후, 로그인의 성공 여부를 전송한다. // // *CAUTION* // -// Ư ̵ н带 ÷̾ ˻ϴ SQL  -// ȿϱ? +// 특정 아이디와 패스워드를 가진 플레이어를 검색하는 SQL 문으로 어떤 것이 +// 더 효율적일까? // -// (1) SELECT Password FROM Player WHERE ID = 'AAA' ˻ , -// н带 Ѵ. -// (2) SELECT ID FROM Player WHERE ID = 'AAA' AND Password = 'BBB' -// ˻ؼ ϴ row ִ üũѴ. +// (1) SELECT Password FROM Player WHERE ID = 'AAA' 으로 검색한 후, +// 패스워드를 비교한다. +// (2) SELECT ID FROM Player WHERE ID = 'AAA' AND Password = 'BBB' 으로 +// 검색해서 리턴하는 row 가 있는지 체크한다. // -// ̿ , ε  ϴ ǰڴ. +// 이에 따라서, 인덱스를 어떻게 설정하는지가 결정되겠다. // // (1) - CREATE INDEX PlayerIDIndex ON Player (ID) // (2) - CREATE INDEX PlayerIDPasswordIndex ON Player (ID , Password) // -// (2) ǰڴ. +// 현재의 선택은 (2) 되겠다. // // *CAUTION* // -// ÷̾ ؼ Player ̺ LogOn ÷ -// üũؾ Ѵ. LogOn = 'LOGON' , ̹ ϰ ִٰ -// ؾ ϹǷ, ̷ ؾ Ѵ. ( ޽ -// Ѵ.) +// 같은 플레이어의 동시 접속을 막기 위해서 Player 테이블의 LogOn 컬럼값을 +// 체크해야 한다. 만약 LogOn = 'LOGON' 일 경우, 이미 접속하고 있다고 간주 +// 해야 하므로, 이런 사람은 접속을 차단해야 한다. (물론 적절한 메시지를 +// 출력해줘야 한다.) // -// , crash LogOn ʵ带 -// LOGOFF ʱȭ Ѵٴ ̴. +// 주의할 점은, 서버가 crash 될 경우 새로 띄워질때 LogOn 필드를 모두 +// LOGOFF 로 초기화해줘야 한다는 점이다. ////////////////////////////////////////////////////////////////////////////// /* - // ݸ Player table ʿѰ . by sigi. 2002.10.23 + // 넷마블의 Player table에 필요한것 정리. by sigi. 2002.10.23 PlayerID, - Password, // ٸ ǹ. + Password, // 다른 의미. CurrentWorldID, CurrentServerGroupID, CurrentLoginServerID, @@ -54,7 +54,7 @@ LoginIP - // ݸ ۾ϴ + // 넷마블에서 작업해줘야하는 것 UPDATE Player SET Password='12345678' WHERE PlayerID='playerid'; if (getAffectedRowCount()==0) @@ -91,8 +91,8 @@ #endif -#define SYMBOL_TEST_CLIENT '#' // 系׽Ʈ -#define SYMBOL_NET_MARBLE_CLIENT '@' // ݸ ϴ +#define SYMBOL_TEST_CLIENT '#' // 사내테스트 버전인 경우 +#define SYMBOL_NET_MARBLE_CLIENT '@' // 넷마블에서 접속하는 경우 bool isAdultByBirthday(const string& birthday); void addLoginPlayerData(const string& ID, const string& ip, const string& SSN, const string& zipcode); @@ -116,7 +116,7 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) LoginPlayer* pLoginPlayer = dynamic_cast(pPlayer); Statement* pStmt = NULL; - // ¿ . by sigi. 2002.12.6 + // 좌우 공백 제거. by sigi. 2002.12.6 pPacket->setID(trim(pPacket->getID())); string connectIP = pLoginPlayer->getSocket()->getHost(); @@ -147,12 +147,12 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) return; } - // 系׽Ʈ '#sigi' <-- ̷ ´. + // 사내테스트 버전에서는 '#sigi' <-- 이런 식으로 계정이 들어온다. if (ID[0] == SYMBOL_TEST_CLIENT) { ID = ID.c_str() + 1; pPacket->setID(ID); - // α üũ + // 웹 로그인 체크 if (bWebLogin) { // cout << "WebLogin" << endl; @@ -164,7 +164,7 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) } else { // cout << "not WebLogin" << endl; - // ݸ ϴ + // 넷마블에서 접속하는 경우 // by sigi. 2002.10.23 if (!checkNetMarbleClient(pPacket, pPlayer)) { return; @@ -173,14 +173,14 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) bFreePass = pLoginPlayer->isFreePass(); if (!bWebLogin && bFreePass) { - // α ƴ FreePass ݸ ڷ ID տ ๮ڰ ϳ ִ. + // 웹로그인이 아닌 FreePass 는 넷마블 사용자로 ID 앞에 예약문자가 하나더 있다. ID = ID.c_str() + 1; pPacket->setID(ID); } - // cout << "׽Ʈ Ŭ̾Ʈ" << endl; + // cout << "테스트 클라이언트" << endl; BEGIN_DB { - // Ÿ . + // 증거를 남긴다. pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery("INSERT INTO TestClientUser (PlayerID, IP, LoginDate) VALUES ('%s', '%s', now())", ID.c_str(), connectIP.c_str()); @@ -189,9 +189,9 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) } END_DB(pStmt) } - // ݸ ϴ + // 넷마블에서 접속하는 경우 else { - // α üũ + // 웹 로그인 체크 if (bWebLogin) { // cout << "WebLogin" << endl; @@ -230,7 +230,7 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) string lastIP = ""; string lastMacAddress = ""; - // ~ by sigi. 2002.5.31 + // 빌링~ by sigi. 2002.5.31 PayType payType; string payPlayDate; string familyPayPlayDate; @@ -240,8 +240,8 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) try { //////////////////////////////////////////////////////////// - // ID PASSWORD ̻ ڰ - // ´. + // ID랑 PASSWORD에 이상한 문자가 들어있으면 + // 못 들어오게 막는다. //////////////////////////////////////////////////////////// bool bError = false; @@ -251,7 +251,7 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) bError = true; if (bError) { - // cout << "̻ " << endl; + // cout << "이상한 글자" << endl; // cout << "Error" << endl; LCLoginError lcLoginError; lcLoginError.setErrorID(INVALID_ID_PASSWORD); @@ -264,10 +264,10 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); Result* pResult = NULL; - // BINARY ̸. ҹ ϰ ȴ. - // ݱ ҹ login ־µ.. - // ̰ ýʿ ż ߴ. by sigi. 2002.12.20 - // BINARY PlayerID='%s'µ.. ׳ PlayerID ٽ оͼ ° Ƽ.. + // BINARY를 붙이면. 대소문자 구분을 하게 된다. + // 지금까지는 대소문자 관계없이 login할 수 있었는데.. + // 이게 빌링시스템쪽에서 문제가 돼서 수정했다. by sigi. 2002.12.20 + // BINARY PlayerID='%s'였는데.. 그냥 PlayerID를 다시 읽어와서 쓰는게 나을거 같아서.. if (bWebLogin) { pResult = pStmt->executeQuery( "SELECT PlayerID, SSN, CurrentServerGroupID, LogOn, Access, LoginIP, PayType, PayPlayDate, " @@ -301,24 +301,24 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) } // by sigi. 2002.10.30 - // Player : ݸ ƴ + // Player가 없다 : 없고 넷마블이 아닌 경우 bool bNoPlayer = ((pResult->getRowCount() == 0) && !bFreePass); - // ROW 0 ̶ - // invalid ID or Password ̴. + // 쿼리 결과 ROW 의 개수가 0 이라는 뜻은 + // invalid ID or Password 라는 뜻이다. if (bNoPlayer) // pResult->getRowCount() == 0) { // cout << "no Result : " << ID.c_str() << endl; - // cout << "÷̾ " << endl; + // cout << "플레이어 없음" << endl; LCLoginError lcLoginError; lcLoginError.setErrorID(INVALID_ID_PASSWORD); pLoginPlayer->sendPacket(&lcLoginError); filelog("loginfail.txt", "Error Code: INVALID_ID_PASSWORD, 3, PlayerID : %s", pPacket->getID().c_str()); - // ȸ 3 Ŭ , Ѵ. + // 실패 회수가 3보다 클 경우, 연결을 종료한다. uint nFailed = pLoginPlayer->getFailureCount(); - // cout << " ȸ " << nFailed << endl; + // cout << "실패 회수 " << nFailed << endl; if (nFailed > 3) { SAFE_DELETE(pStmt); @@ -330,8 +330,8 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) return; } - // ִٴ - // ùٸ ID н ̴... + // 쿼리 결과가 있다는 말은 + // 올바른 ID와 패스워드라는 말이다... else { int i = 0; @@ -353,7 +353,7 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) familyPayPlayDate = pResult->getString(++i); } else if (bFreePass) { - // ݸ 쿡.. ٸ.. ٷ ؾ Ѵ. + // 넷마블인 경우에.. 계정이 없다면.. 바로 생성해야 한다. if (pResult->getRowCount() == 0) { /* cout << "NetMarble New Player: " << ID.c_str() << endl; @@ -372,7 +372,7 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) payPlayFlag = 0; */ - // checkFreePass() ߰ϹǷ ־ Ѵ. + // checkFreePass()에서 추가하므로 있어야 한다. LCLoginError lcLoginError; lcLoginError.setErrorID(ETC_ERROR); pLoginPlayer->sendPacket(&lcLoginError); @@ -461,12 +461,12 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) #ifdef __PAY_SYSTEM_LOGIN__ - // by sigi. 2002.5.31 + // 빌링 by sigi. 2002.5.31 if (!pLoginPlayer->loginPayPlay(payType, payPlayDate, payPlayHours, payPlayFlag, connectIP, ID)) { - // ̴. ~~ + // 돈 안 낸 계정이다. 냥~~ LCLoginError lcLoginError; lcLoginError.setErrorID(NOT_PAY_ACCOUNT); pLoginPlayer->sendPacket(&lcLoginError); @@ -476,28 +476,28 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) return; } #elif defined(__PAY_SYSTEM_FREE_LIMIT__) - // by sigi. 2002.11.21 + // 빌링 by sigi. 2002.11.21 if (pLoginPlayer->loginPayPlay(payType, payPlayDate, payPlayHours, payPlayFlag, connectIP, ID)) { - // ϴ ׳ д. + // 일단 그냥 들어가둔다. } #else // elif defined(__PAY_SYSTEM_ZONE__) pLoginPlayer->setPayPlayValue(payType, payPlayDate, payPlayHours, payPlayFlag, familyPayPlayDate); #endif - // ̹ ߿ ӵǾ ִٸ, . + // 이미 게임 중에 접속되어 있다면, 접속할 수 없다. bool bSameIP = false; if (logon == "LOGON" || logon == "GAME") { - // LOGON¶ IP + // LOGON상태라면 같은 IP에서 접속했으면 접속 가능 // if (logon=="LOGON" && connectIP==lastIP) //{ //} - // (!) IP ٸ Ұ. + // (!) IP가 다르면 재접불가다. // else - // LOGON¿ Ұϴ. - // IP ٸ.. GAME̶ ӺҰ. + // LOGON상태에서는 재접 불가하다. + // IP 접속지가 다르면.. GAME이라도 접속불가다. if (logon == "LOGON" || connectIP != lastIP) // || !pPacket->checkMacAddress(lastMacAddress)) { LCLoginError lcLoginError; @@ -507,7 +507,7 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) filelog("loginfail.txt", "Error Code: ALREADY_CONNECTED, 7, PlayerID : %s", pPacket->getID().c_str()); - // ȸ 3 Ŭ , Ѵ. + // 실패 회수가 3보다 클 경우, 연결을 종료한다. uint nFailed = pLoginPlayer->getFailureCount(); if (nFailed > 3) { @@ -522,27 +522,27 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) // bSameIP = false; } - // GAMḚ IP + // GAME이고 IP가 같은 경우 else { bSameIP = true; } } - // -- - // '̹ 'ε.. - // Ű ٸ · Ѵ. + // -- 돈 복사 때문에 잠시 봉인 + // '이미 접속 중'인데.. + // 강제 접속 해제를 시키길 기다리는 상태로 설정한다. if (bSameIP) { if (!bFreePass || bWebLogin) // by sigi. 2002.10.23 { - // ѱ + // 한국 if (strstr(SSN.c_str(), "-") != NULL) { bAdult = isAdultByBirthday(SSN.substr(0, 6)); } - // ߱ + // 중국 else { #ifdef __CHINA_SERVER__ - // ߱ + // 중국은 무조건 성인 bAdult = true; #else if (SSN.size() == 15) { @@ -550,20 +550,20 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) } else if (SSN.size() == 18) { bAdult = isAdultByBirthday(SSN.substr(8, 14)); } else { - // ̷ ٰ ϴµ -_-a + // 이런 경우는 없다고 하는데 -_-a bAdult = false; } #endif } } - // ϴ PlayerID صд. + // 일단 PlayerID를 저장해둔다. pLoginPlayer->setID(ID); pLoginPlayer->setSSN(SSN); pLoginPlayer->setZipcode(zipcode); - // GameServer ޾ƾ LCLoginOK - // ϴ, ̿ؼ صд. + // 이 경우는 GameServer의 응답을 받아야지 LCLoginOK를 보내기 때문에 + // 일단, 쿼리 결과를 이용해서 값을 저장해둔다. pLoginPlayer->setAdult(bAdult); pLoginPlayer->sendLGKickCharacter(); @@ -581,13 +581,13 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) /* if (bSameIP) { - // αο , LogOn LOGOFF LOGON Ѵ. + // 로그인에 성공했으면, LogOn 정보를 LOGOFF 에서 LOGON 으로 변경한다. pStmt->executeQuery("UPDATE Player SET LogOn = 'LOGON' WHERE PlayerID = '%s'",ID.c_str()); } else { */ - // LOGOFF 츸 LOGON ٲ۴. + // LOGOFF인 경우만 LOGON으로 바꾼다. // by sigi. 2002.5.15 // pStmt->executeQuery("UPDATE Player SET LogOn = 'LOGON', LoginIP = '%s',MacAddress = //'%s', CurrentLoginServerID=%d, LastLoginDate=now() WHERE PlayerID = '%s' AND @@ -598,8 +598,8 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) connectIP.c_str(), g_pConfig->getPropertyInt("LoginServerID"), ID.c_str()); int affectedRowCount = pStmt->getAffectedRowCount(); - // ֱ IP 5 . IP Table Ѵ. - // LoginPlayerData IP Ƿ ʿ. by bezz 2003.04.21 + // 최근 접속 IP를 5개까지 남긴다. IP Table은 별도로 기록한다. + // LoginPlayerData 에 IP를 남기므로 필요없다. by bezz 2003.04.21 // pStmt->executeQuery("UPDATE PlayerIPList SET IP1=IP2, Date1=Date2, IP2=IP3, Date2=Date3, IP3=IP4, // Date3=Date4, IP4=IP5, Date4=Date5, IP5='%s', Date5=now() WHERE PlayerID='%s'",connectIP.c_str(), // ID.c_str()); @@ -610,17 +610,17 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) // ID.c_str()); // } - // LogOn LOGOFF ƴϰų. - // PlayerID ų.. -_- + // LogOn이 LOGOFF가 아니거나. + // PlayerID가 없거나.. -_- if (affectedRowCount == 0) { - // ٸ LoginServer ̹ ӵǾ ִ Ȯϰ - // ̹ ִٸ Player kickϰ - // ⼭ ְ ؾ Ѵ. + // 다른 LoginServer에 이미 접속되어 있는지 확인하고 + // 이미 있다면 그 Player를 kick하고 + // 여기서 접속할 수 있게 설정해야 한다. - // ϴ ´. ־ LogOn ´ ѳ - // ٽ Ǭ. by bezz 2003.07.07 + // 일단 다 막는다. 뭔가 문제가 있어서 LogOn 상태는 허용시켜놓은것 같은데 + // 문제가 생기면 다시 푼다. by bezz 2003.07.07 - // LogOn ´ ϴ . + // LogOn 상태는 일단 허용시켜 본다. // pStmt->executeQuery("UPDATE Player SET LoginIP = '%s', CurrentLoginServerID=%d, // LastLoginDate=now() WHERE PlayerID = '%s' AND LogOn='LOGON'",connectIP.c_str(), // g_pConfig->getPropertyInt("LoginServerID"), ID.c_str()); @@ -640,7 +640,7 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) return; //} - // LogOn· login + // LogOn상태로 login이 허용된 상태 } /* } @@ -648,11 +648,11 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) __END_DEBUG - // ϴ ǾǷ, ̵ α ÷̾ ü Ѵ. + // 일단 인증이 되었으므로, 아이디를 로그인 플레이어 객체에 저장한다. pLoginPlayer->setID(ID); - // loginserver billing κ Ѵ. - // ֵ û. by bezz 2003.04.22 + // loginserver 에서 billing 부분 빼기로 한다. + // 애드빌 요청. by bezz 2003.04.22 // #ifdef __CONNECT_BILLING_SYSTEM__ // by sigi. 2002.11.21 // pLoginPlayer->setBillingSession(); @@ -660,29 +660,29 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) // pLoginPlayer->sendBillingLogin(); // #endif #ifdef __CONNECT_CBILLING_SYSTEM__ - // ߱ α ϶ ˸. + // 중국 빌링 서버에 로그인 하라고 알린다. g_pCBillingPlayerManager->sendLogin(pLoginPlayer); #endif - // α Ӽ Ŷ - // DB ߸ ϵ ߺ α Ǵ ´ + // 로그인 전에는 무조건 게임서버에 이 패킷 보내서 + // 접속해 있지만 DB 에 잘못 기록되 중복 로긴이 되는 것을 막는다 // pLoginPlayer->sendLGKickCharacter(); - // α ˷ش. + // 로그인 성공을 알려준다. LCLoginOK lcLoginOK; lcLoginOK.setFamily(false); if (!bFreePass || bWebLogin) // by sigi. 2002.10.23 { - // ѱ + // 한국 if (strstr(SSN.c_str(), "-") != NULL) { bAdult = isAdultByBirthday(SSN.substr(0, 6)); } - // ߱ + // 중국 else { #ifdef __CHINA_SERVER__ - // ߱ + // 중국은 무조건 성인 bAdult = true; #else if (SSN.size() == 15) { @@ -690,7 +690,7 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) } else if (SSN.size() == 18) { bAdult = isAdultByBirthday(SSN.substr(8, 14)); } else { - // ̷ ٰ ϴµ -_-a + // 이런 경우는 없다고 하는데 -_-a bAdult = false; } #endif @@ -730,37 +730,37 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) lcLoginOK.setFamily(true); lcLoginOK.setLastDays(familyLastDays); - cout << "Family " << endl; + cout << "Family 요금제" << endl; } else { lcLoginOK.setFamily(false); lcLoginOK.setLastDays(lastDays); - cout << "Premium " << endl; + cout << "Premium 요금제" << endl; } } } - // cout << lcLoginOK.getLastDays() << " ҽϴ." << endl; + // cout << lcLoginOK.getLastDays() << "일 남았습니다." << endl; if (lcLoginOK.getLastDays() > 1000) filelog("PayPlayDateLog.txt", "UserID : %s , LastDays : %ld", ID.c_str(), lcLoginOK.getLastDays()); - // Ĺ ̺Ʈ + // 컴백 이벤트 관련 { pResult = pStmt->executeQuery( "SELECT PlayerID FROM Event200501Main WHERE PlayerID = '%s' AND RecvPremiumDate = '0000-00-00'", pLoginPlayer->getID().c_str()); if (pResult->next()) { - // Ĺ ̺Ʈ ڴ. - // ̾ 7 ־ + // 컴백 이벤트 대상자다. + // 프리미엄 7일을 넣어주자 pStmt->executeQuery("UPDATE Player SET PayPlayDate = IF (PayPlayDate < NOW(), NOW() + INTERVAL " "7 DAY, PayPlayDate + INTERVAL 7 DAY ) WHERE PlayerID = '%s'", pLoginPlayer->getID().c_str()); - // Ĺ ̺Ʈ ̾ 7 ޾Ҵٰ ־ + // 컴백 이벤트 프리미엄 7일을 받았다고 넣어주자 pStmt->executeQuery("UPDATE Event200501Main SET RecvPremiumDate = NOW() WHERE PlayerID = '%s'", pLoginPlayer->getID().c_str()); - // Ŭ̾Ʈ ̺Ʈ ڶ ˸ + // 클라이언트에 이벤트 대상자라고 알리기 lcLoginOK.setLastDays(0xfffd); } } @@ -768,7 +768,7 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) #endif #ifdef __NETMARBLE_SERVER__ - // ݸ üũ + // 넷마블 사용자 약관 동의 여부 체크 pResult = pStmt->executeQuery("SELECT PlayerID FROM PrivateAgreementRemain WHERE PlayerID = '%s'", pLoginPlayer->getID().c_str()); @@ -781,8 +781,8 @@ void CLLoginHandler::execute(CLLogin* pPacket, Player* pPlayer) } #endif /* - // ׷ ̸ Ѵ. - // ̵ ׷̵ ã ׷ ã´. + // 서버 그룹 이름을 셋팅한다. + // 서버 아이디로 서버의 그룹아이디를 찾은 다음 서버 그룹 정보를 찾는다. lcLoginOK.setGroupName(g_pGameServerGroupInfoManager->getGameServerGroupInfo(pLoginPlayer->getServerGroupID())->getGroupName()); lcLoginOK.setStat(SERVER_FREE); @@ -831,7 +831,7 @@ CurrentServerGroupID == 7 ) { throw Error(sqe.toString()); } - // ٸ ʿ ڵ. Լ . by sigi. 2002.5.8 + // 다른 곳에서도 필요한 코드라서. 함수로 뺏당. by sigi. 2002.5.8 addLoginPlayerData(ID, connectIP, SSN, zipcode); #endif @@ -842,7 +842,7 @@ CurrentServerGroupID == 7 ) { ////////////////////////////////////////////////////////////////////////////// // -// YYMMDD Ǻ +// YYMMDD 로 성인 판별 // ////////////////////////////////////////////////////////////////////////////// bool isAdultByBirthday(const string& birthday) { @@ -863,13 +863,13 @@ bool isAdultByBirthday(const string& birthday) { // cout << "SSN = " << birthday.c_str() << " ADULTSSN = " << AdultSSN.toString().c_str() << endl; - // ƴ ֹε ȣ üũ + // 성인인지 아닌지 주민등록 번호 체크 if (atoi(birthday.c_str()) <= atoi(AdultSSN.toString().c_str())) { - // cout << "" << endl; + // cout << "어른" << endl; return true; } - // cout << "ֵ" << endl; + // cout << "애들" << endl; return false; } @@ -878,8 +878,8 @@ bool isAdultByBirthday(const string& birthday) { // // add LoginPlayerdata // -// 踦 ؼ -// UserInfo DB LoginPlayerData Login ڸ ߰Ѵ. +// 접속자 통계를 위해서 +// UserInfo DB의 LoginPlayerData에 Login한 사용자를 추가한다. // ////////////////////////////////////////////////////////////////////////////// void addLoginPlayerData(const string& ID, const string& ip, const string& SSN, const string& zipcode) { @@ -887,19 +887,19 @@ void addLoginPlayerData(const string& ID, const string& ip, const string& SSN, c Statement* pStmt2 = NULL; - // [ȫâ] - // ؿ .. + // [홍창봐라] + // 밑에꺼 말고.. // UPDATE Player Set LoginFlagDay=1, LoginFlagWeek=1, LoginFlagMonth=1 WHERE PlayerID='%s' - // θ س .. - // ð ־ ʿ䰡 ִ Ȯ ʿϰ? - // ֱ ð UserInfo ̾Ƽ °? - // ٵ ̰ SSN ֳ? 赵 ̳? - // ۰. DARKEDEN̶ DB иä δ° ? - // ٹð ٸ ϱ. - - // ԷѴ. + // 이 정도로만 해놔도 괜찮지 않을까.. + // 시간을 넣어서 쓸 필요가 있는지 확인이 필요하겠지? + // 누구의 최근 접속 시간 같은걸 UserInfo에서 뽑아서 쓰는가? + // 근데 이거 SSN은 왜 넣노? 나이 통계도 뽑나? + // 글고. DARKEDEN이랑 DB는 분리된채로 두는게 나을까? + // 근무시간이 다르니 답답하군. + + // 유저 통계 관련 정보를 입력한다. BEGIN_DB { - // ð . + // 먼저 현재 시간을 얻어낸다. int year, month, day, hour, minute, second; getCurrentTimeEx(year, month, day, hour, minute, second); string currentDT = VSDateTime::currentDateTime().toDateTime(); @@ -947,7 +947,7 @@ bool CLLoginHandler::checkNetMarbleClient(CLLogin* pPacket, Player* pPlayer) return false; } - // Ϻ üũ.. FreePass Ѿ ȴ. + // 일부 체크에서.. FreePass로 넘어가게 된다. pLoginPlayer->setFreePass(true); @@ -973,9 +973,9 @@ bool CLLoginHandler::checkFreePass(CLLogin* pPacket, Player* pPlayer) // LoginPlayer* pLoginPlayer = dynamic_cast(pPlayer); - // key_code мؼ - // DB ID key_code Ѵ. - // true + // key_code를 분석해서 + // DB의 그 ID의 key_code와 비교한다. + // 같으면 true Statement* pStmt = NULL; try { @@ -999,13 +999,13 @@ bool CLLoginHandler::checkFreePass(CLLogin* pPacket, Player* pPlayer) } } else { // cout << "ID wrong: " << pPacket->getID().c_str() << endl; - // ȵǴ°ǵ.. - // ڴ ߰Ѵٰ ݸؼ ׷ ϶. ~~~ + // 원래는 안되는건데.. + // 새 사용자는 무조건 추가한다고 넷마블해서 그래 하라네. 헐~~~ cout << "NetMarble New Player: " << pPacket->getID().c_str() << endl; - // ݸ̶ . - // SpecialEventCount Į 2 ش. , ̺Ʈ ̹ذɷ - // డ ѵ ׸ ش. + // 여기까지 오면 무조건 넷마블이라고 본다. + // SpecialEventCount 칼럼은 2로 세팅해준다. 즉, 이벤트 아이템을 이미준걸로 생각 + // 예약가입 한 넘들 한테만 아이템 준다. // 2003.04.30 by bezz, DEW pStmt->executeQuery( "INSERT IGNORE INTO Player (PlayerID, Password, Name, SSN, SpecialEventCount, Event, " @@ -1013,7 +1013,7 @@ bool CLLoginHandler::checkFreePass(CLLogin* pPacket, Player* pPlayer) pPacket->getID().c_str(), pPacket->getPassword().c_str(), pPacket->getID().c_str()); // string connectIP = pPlayer->getSocket()->getHost(); - // LoginPlayerData IP Ƿ ʿ. by bezz 2003.04.21 + // LoginPlayerData 에 IP 정보를 남기므로 필요없다. by bezz 2003.04.21 // pStmt->executeQuery("INSERT IGNORE INTO PlayerIPList (PlayerID) Values('%s')", // pPacket->getID().c_str()); @@ -1070,15 +1070,15 @@ bool isBlockIP(const string& ip) { int index; switch (ipClass) { - // classC ° + // classC 가 맞고 범위가 지정된 경우 case 0: index = atoi(ip.substr(k + 1, ip.size() - k - 1).c_str()); break; - // classA ° + // classA 가 맞고 범위가 지정된 경우 case 1: index = atoi(ip.substr(i + 1, j - i - 1).c_str()); break; - // classB ° + // classB 가 맞고 범위가 지정된 경우 case 2: index = atoi(ip.substr(j + 1, k - j - 1).c_str()); break; @@ -1146,7 +1146,7 @@ bool CLLoginHandler::checkWebLogin(CLLogin* pPacket, Player* pPlayer) { // check key if (key != pPacket->getPassword()) { - // cout << "Ű Ʋ : " << pPacket->getPassword() << endl; + // cout << "키가 틀림 : " << pPacket->getPassword() << endl; LCLoginError lcLoginError; lcLoginError.setErrorID(INVALID_ID_PASSWORD); pLoginPlayer->sendPacket(&lcLoginError); @@ -1171,14 +1171,14 @@ bool CLLoginHandler::checkWebLogin(CLLogin* pPacket, Player* pPlayer) { return false; } - // Ϻ üũ.. FreePass Ѿ ȴ. + // 일부 체크에서.. FreePass로 넘어가게 된다. pLoginPlayer->setFreePass(true); - // Ű . + // 키를 지운다. pStmt->executeQuery("DELETE FROM WebLogin WHERE PlayerID = '%s'", pPacket->getID().c_str()); } else { - // cout << "Ű : " << pPacket->getID() << endl; - // Ű . + // cout << "키가 없다 : " << pPacket->getID() << endl; + // 키가 없다. LCLoginError lcLoginError; lcLoginError.setErrorID(NOT_FOUND_KEY); pLoginPlayer->sendPacket(&lcLoginError); diff --git a/src/Core/CLLogout.h b/src/Core/CLLogout.h index 7153cf5d..b0e76cb2 100644 --- a/src/Core/CLLogout.h +++ b/src/Core/CLLogout.h @@ -17,9 +17,9 @@ // // class CLLogout; // -// Ŭ̾Ʈ α׾ƿ ˸ Ŷ̴. -// data field getSize() 0 ϸ, read(), write() -// ޽ ƹ ҵ ʴ´. +// 클라이언트가 서버에게 로그아웃을 알리는 패킷이다. +// data field 가 없기 때문에 getSize()는 0 을 리턴하며, read(), write() +// 메쏘드는 아무런 역할도 하지 않는다. // ////////////////////////////////////////////////////////////////////// @@ -27,10 +27,10 @@ class CLLogout : public Packet { public: CLLogout() {}; virtual ~CLLogout() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CLQueryCharacterNameHandler.cpp b/src/Core/CLQueryCharacterNameHandler.cpp index e8ef0241..39a64ebf 100644 --- a/src/Core/CLQueryCharacterNameHandler.cpp +++ b/src/Core/CLQueryCharacterNameHandler.cpp @@ -20,7 +20,7 @@ bool isAvailableID(const char* pID); ////////////////////////////////////////////////////////////////////////////// -// DB κ Ư ÷̾ ̵ ãƼ θ Ŭ̾Ʈ ش. +// DB 로부터 특정 플레이어 아이디를 찾아서 그 여부를 클라이언트로 리턴해준다. ////////////////////////////////////////////////////////////////////////////// void CLQueryCharacterNameHandler::execute(CLQueryCharacterName* pPacket, Player* pPlayer) { __BEGIN_TRY __BEGIN_DEBUG_EX @@ -60,7 +60,7 @@ void CLQueryCharacterNameHandler::execute(CLQueryCharacterName* pPacket, Player* } //-------------------------------------------------------------------------------- - // ڿ õ ̸ ƴ Ѵ. + // 운영자와 관련된 이름은 아닌지 검증한다. //-------------------------------------------------------------------------------- // by sigi if (!isAvailableID(pPacket->getCharacterName().c_str())) { @@ -71,14 +71,14 @@ void CLQueryCharacterNameHandler::execute(CLQueryCharacterName* pPacket, Player* string text = pPacket->getCharacterName(); list InvalidTokenList; - InvalidTokenList.push_back(""); - InvalidTokenList.push_back(""); - InvalidTokenList.push_back(""); - InvalidTokenList.push_back(""); - InvalidTokenList.push_back("ȹ"); - InvalidTokenList.push_back(""); - InvalidTokenList.push_back("׽"); - InvalidTokenList.push_back(""); + InvalidTokenList.push_back("관리자"); + InvalidTokenList.push_back("도우미"); + InvalidTokenList.push_back("담당자"); + InvalidTokenList.push_back("운영"); + InvalidTokenList.push_back("기획자"); + InvalidTokenList.push_back("개발자"); + InvalidTokenList.push_back("테스터"); + InvalidTokenList.push_back("직원"); list::const_iterator itr = InvalidTokenList.begin(); for (; itr != InvalidTokenList.end(); itr++) { @@ -93,9 +93,9 @@ void CLQueryCharacterNameHandler::execute(CLQueryCharacterName* pPacket, Player* pLoginPlayer->sendPacket(&lcQueryResultCharacterName); - // Ƿ, LWFRP ̴. - // α׷ ¥ DOS Ƿ, - // ּ ð ־ Ѵٴ ̴. + // 쿼리가 여러 번 올 수 있으므로, 여전히 LWFRP 이다. + // 문제는 누군가가 프로그램을 짜서 DOS 공격을 할 수 있으므로, + // 최소 시간을 둬야 한다는 점이다. pLoginPlayer->setPlayerStatus(LPS_WAITING_FOR_CL_GET_PC_LIST); SAFE_DELETE(pStmt); diff --git a/src/Core/CLQueryPlayerID.h b/src/Core/CLQueryPlayerID.h index 655107e1..412960bb 100644 --- a/src/Core/CLQueryPlayerID.h +++ b/src/Core/CLQueryPlayerID.h @@ -17,8 +17,8 @@ // // class CLQueryPlayerID; // -// Ŭ̾Ʈ α ʿ ϴ Ŷ̴. -// ̵ н尡 ȣȭǾ ִ. +// 클라이언트가 로그인 서버에게 최초에 전송하는 패킷이다. +// 아이디와 패스워드가 암호화되어 있다. // //-------------------------------------------------------------------------------- @@ -26,10 +26,10 @@ class CLQueryPlayerID : public Packet { public: CLQueryPlayerID() {}; virtual ~CLQueryPlayerID() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -63,7 +63,7 @@ class CLQueryPlayerID : public Packet { } private: - // ÷̾ ̵ + // 플레이어 아이디 string m_PlayerID; }; diff --git a/src/Core/CLQueryPlayerIDHandler.cpp b/src/Core/CLQueryPlayerIDHandler.cpp index f1a5bbdb..05252533 100644 --- a/src/Core/CLQueryPlayerIDHandler.cpp +++ b/src/Core/CLQueryPlayerIDHandler.cpp @@ -17,7 +17,7 @@ #endif ////////////////////////////////////////////////////////////////////////////// -// DB κ Ư ÷̾ ̵ ãƼ θ Ŭ̾Ʈ ش. +// DB 로부터 특정 플레이어 아이디를 찾아서 그 여부를 클라이언트로 리턴해준다. ////////////////////////////////////////////////////////////////////////////// void CLQueryPlayerIDHandler::execute(CLQueryPlayerID* pPacket, Player* pPlayer) @@ -58,9 +58,9 @@ void CLQueryPlayerIDHandler::execute(CLQueryPlayerID* pPacket, Player* pPlayer) pLoginPlayer->sendPacket(&lcQueryResultPlayerID); - // Ƿ, LWFRP ̴. - // α׷ ¥ DOS Ƿ, - // ּ ð ־ Ѵٴ ̴. + // 쿼리가 여러 번 올 수 있으므로, 여전히 LWFRP 이다. + // 문제는 누군가가 프로그램을 짜서 DOS 공격을 할 수 있으므로, + // 최소 시간을 둬야 한다는 점이다. pLoginPlayer->setPlayerStatus(LPS_WAITING_FOR_CL_REGISTER_PLAYER); SAFE_DELETE(pStmt); diff --git a/src/Core/CLReconnectLogin.h b/src/Core/CLReconnectLogin.h index a0f52332..32411938 100644 --- a/src/Core/CLReconnectLogin.h +++ b/src/Core/CLReconnectLogin.h @@ -17,9 +17,9 @@ // // class CLReconnectLogin; // -// Ŭ̾Ʈ Ŷ̴. -// ̵ Ǹ, Key ؼ -// ޴´. , ũó ̵ ִ. +// 클라이언트가 서버에게 보내는 연결 패킷이다. +// 서버간 이동에 사용되며, 이전 서버가 준 Key 를 새 서버에게 전송해서 +// 인증을 받는다. 또한, 새 서버에서 사용할 크리처 아이디를 담고 있다. // ////////////////////////////////////////////////////////////////////// @@ -27,10 +27,10 @@ class CLReconnectLogin : public Packet { public: CLReconnectLogin() {}; virtual ~CLReconnectLogin() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CLReconnectLoginHandler.cpp b/src/Core/CLReconnectLoginHandler.cpp index 5a18c059..d3b558d5 100644 --- a/src/Core/CLReconnectLoginHandler.cpp +++ b/src/Core/CLReconnectLoginHandler.cpp @@ -22,16 +22,16 @@ ////////////////////////////////////////////////////////////////////////////// // CLReconnectLoginHandler::execute() // -// Ŷ αμ ʷ , Ǵ -// ٸ ̵ , Ŭ̾Ʈ ϴ Ŷ̴. -// ̶ ÷̾ ü ܳ ̰, ÷̾ ü IPM -// Ǵ ̴. +// 이 패킷은 로그인서버에서 최초로 게임 서버로 연결할 때, 또는 게임 서버에서 +// 다른 게임 서버로 이동할 때, 클라이언트가 서버로 전송하는 최초의 패킷이다. +// 이때 플레이어 객체는 새로 생겨난 상태이고, 이 플레이어 객체는 IPM 에서 +// 관리되는 상태이다. // -// 翬 Ŷ ٸ Ŷ Ѿ , ̰ ŷ õ -// ϹǷ Ŷ ˻ؾ Ѵ. ̸ ؼ ÷̾ ü -// Ŷ ϰ Ƿ, NULL ǰڴ. +// 당연히 최초의 패킷으로 다른 패킷이 넘어오는 경우라면, 이것은 해킹 시도라고 +// 봐도 무방하므로 이 패킷이 최초인지 검사해야 한다. 이를 위해서 플레이어 객체에 +// 이전 패킷을 저장하고 있으므로, 이 값이 NULL 인지만 보면 되겠다. // -// ߸ Ŷ̶, ban ϰ Ѵ. +// 잘못된 패킷이라면, ban 에 등록하고 접속을 종료한다. ////////////////////////////////////////////////////////////////////////////// void CLReconnectLoginHandler::execute(CLReconnectLogin* pPacket, Player* pPlayer) @@ -52,8 +52,8 @@ void CLReconnectLoginHandler::execute(CLReconnectLogin* pPacket, Player* pPlayer string PlayerID; //---------------------------------------------------------------------- - // Ŷ ReconnectLoginInfo ü ´. - // ũĿ Ű ij ̸ ðȿ ߸ ϴ. + // 이 패킷을 ReconnectLoginInfo 객체를 갖고 온다. + // 크래커는 키값과 캐릭터 이름을 일정 시간안에 맞춰야만 접속이 가능하다. //---------------------------------------------------------------------- try { ReconnectLoginInfo* pReconnectLoginInfo = @@ -61,37 +61,37 @@ void CLReconnectLoginHandler::execute(CLReconnectLogin* pPacket, Player* pPlayer PlayerID = pReconnectLoginInfo->getPlayerID(); - // ÷̾ ̸ Ѵ. + // 플레이어 이름을 저장한다. pLoginPlayer->setID(PlayerID); - // Ű Ѵ. + // 키값을 인증한다. if (pPacket->getKey() != pReconnectLoginInfo->getKey()) throw InvalidProtocolException("invalid key"); - // , ð expire time Ѵ. + // 따라서, 현재 시간과 expire time 을 비교한다. Timeval currentTime; getCurrentTime(currentTime); if (pReconnectLoginInfo->getExpireTime() < currentTime) { - // ϴ Ѵ. + // 일단 삭제한다. g_pReconnectLoginInfoManager->deleteReconnectLoginInfo(pReconnectLoginInfo->getClientIP()); throw InvalidProtocolException("session already expired"); } - // Ǿ, ReconnectLoginInfo Ѵ. + // 인증되었으니, ReconnectLoginInfo 를 삭제한다. g_pReconnectLoginInfoManager->deleteReconnectLoginInfo(pReconnectLoginInfo->getClientIP()); - } catch (NoSuchElementException& nsee) // ׷ IP CI + } catch (NoSuchElementException& nsee) // 그런 IP를 가진 CI 가 없을 경우 { - // .. CLReconnectLogin Ŷ ̰ ʹ - // session expire ȴ. ̷ 쿡 ¥! - // ( , ῡ ״ · - //  , CLReconnectLogin Ŷ 뿡 expire ȴ.) + // 흠.. 연결 이후 CLReconnectLogin 패킷을 보내는 딜레이가 너무 길 경우 + // session 이 expire 된다. 이럴 경우에도 짜르자! + // (예를 들어서, 최초 연결에서는 성공했으나 그다음에 디버깅 상태로 + // 들어갈 경우, CLReconnectLogin 패킷을 보낼 때쯤에는 expire 된다.) GCDisconnect gcDisconnect; gcDisconnect.setMessage(nsee.toString()); pLoginPlayer->sendPacket(&gcDisconnect); - // ̷ IPM::processCommands() disconnect óѴ. + // 이렇게 던지면 상위 IPM::processCommands()에서 disconnect 처리한다. throw InvalidProtocolException("fuck"); } catch (InvalidProtocolException& ipe) { cout << endl @@ -105,7 +105,7 @@ void CLReconnectLoginHandler::execute(CLReconnectLogin* pPacket, Player* pPlayer pLoginPlayer->sendPacket(&gcDisconnect); - // ̷ IPM::processCommands() disconnect óѴ. + // 이렇게 던지면 상위 IPM::processCommands()에서 disconnect 처리한다. throw; } @@ -114,7 +114,7 @@ void CLReconnectLoginHandler::execute(CLReconnectLogin* pPacket, Player* pPlayer Statement* pGStmt = NULL; Result* pGResult = NULL; - // ~ by sigi. 2002.5.31 + // 빌링~ by sigi. 2002.5.31 PayType payType; string payPlayDate; uint payPlayHours; @@ -127,7 +127,7 @@ void CLReconnectLoginHandler::execute(CLReconnectLogin* pPacket, Player* pPlayer "PayPlayDate, PayPlayHours, PayPlayFlag FROM Player WHERE PlayerID = '%s'", PlayerID.c_str()); - // α θ üũѴ. + // 로그인 여부를 체크한다. pGResult->next(); WorldID_t CurrentWorldID = pGResult->getInt(1); @@ -158,13 +158,13 @@ void CLReconnectLoginHandler::execute(CLReconnectLogin* pPacket, Player* pPlayer try { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); - /// LogOn 'LOGOFF' 츸 LOGON Ѵ. by sigi. 2002.5.15 + /// LogOn이 'LOGOFF'인 경우만 LOGON으로 설정한다. by sigi. 2002.5.15 pStmt->executeQuery( "UPDATE Player SET LogOn='LOGON', CurrentLoginServerID=%d WHERE PlayerID='%s' AND LogOn='LOGOFF'", g_pConfig->getPropertyInt("LoginServerID"), PlayerID.c_str()); - // ̹ 'LOGON'̾ - // PlayerID .. + // 이미 'LOGON'이었던 경우 + // PlayerID가 없는 경우.. if (pStmt->getAffectedRowCount() == 0) { // cout << endl << "+-----------------------+" << endl << "| Deny Multi Login |" << endl << // "+-----------------------+" << endl << endl; @@ -196,29 +196,29 @@ void CLReconnectLoginHandler::execute(CLReconnectLogin* pPacket, Player* pPlayer #ifdef __PAY_SYSTEM_LOGIN__ string connectIP = pLoginPlayer->getSocket()->getHost(); - // by sigi. 2002.5.31 + // 빌링 by sigi. 2002.5.31 if (!pLoginPlayer->loginPayPlay(payType, payPlayDate, payPlayHours, payPlayFlag, connectIP, PlayerID)) { SAFE_DELETE(pGStmt); throw InvalidProtocolException("Pay First!"); } #elif defined(__PAY_SYSTEM_FREE_LIMIT__) string connectIP = pLoginPlayer->getSocket()->getHost(); - // by sigi. 2002.5.31 + // 빌링 by sigi. 2002.5.31 if (pLoginPlayer->loginPayPlay(payType, payPlayDate, payPlayHours, payPlayFlag, connectIP, PlayerID)) { - // Reconnectߴµ PayPlay ϴٴ .. - // BillingPlay ƴϰ PayPlay ߴٴ ǹ̴. + // Reconnect했는데 PayPlay가 가능하다는 것은.. + // BillingPlay가 아니고 PayPlay로 게임을 했다는 의미이다. // by sigi. 2002.11.22 - // α billing κ ߴ. - // ֵ û . by bezz 2003.04.22 + // 로그인 서버에서 billing 연결 부분 빼기로 했다. + // 애드빌 요청 사항. by bezz 2003.04.22 // #ifdef __CONNECT_BILLING_SYSTEM__ // pLoginPlayer->setBillingLoginVerified(); // pLoginPlayer->setBillingUserStatus("XX"); // #endif } else { - //// BillingPlay ߾ٴ ǹ̴. + //// BillingPlay로 게임을 했었다는 의미이다. // by sigi. 2002.11.22 - // α billing κ ߴ. - // ֵ û . by bezz 2003.04.22 + // 로그인 서버에서 billing 연결 부분 빼기로 했다. + // 애드빌 요청 사항. by bezz 2003.04.22 // #ifdef __CONNECT_BILLING_SYSTEM__ // pLoginPlayer->setBillingLoginVerified(); // pLoginPlayer->setBillingUserStatus("HO"); @@ -232,7 +232,7 @@ void CLReconnectLoginHandler::execute(CLReconnectLogin* pPacket, Player* pPlayer SAFE_DELETE(pGStmt); } catch (SQLQueryException& sce) { // cout << sce.toString() << endl; - // ü Ѵ. + // 쿼리 결과 및 쿼리문 객체를 삭제한다. SAFE_DELETE(pGStmt); throw DisconnectException(sce.toString()); } @@ -245,7 +245,7 @@ void CLReconnectLoginHandler::execute(CLReconnectLogin* pPacket, Player* pPlayer //---------------------------------------------------------------------- - // LCPCList Ŷ  + // 이제 LCPCList 패킷을 만들어서 전송하자 //---------------------------------------------------------------------- LCPCList lcPCList; diff --git a/src/Core/CLRegisterPlayer.cpp b/src/Core/CLRegisterPlayer.cpp index 42edc80b..a0576774 100644 --- a/src/Core/CLRegisterPlayer.cpp +++ b/src/Core/CLRegisterPlayer.cpp @@ -11,7 +11,7 @@ void CLRegisterPlayer::read(SocketInputStream& iStream) { __BEGIN_TRY - // ÷̾ ⺻ (ID - Password) + // 플레이어 기본 정보 (ID - Password) BYTE szID; iStream.read(szID); if (szID == 0) @@ -32,7 +32,7 @@ void CLRegisterPlayer::read(SocketInputStream& iStream) throw InvalidProtocolException("too long Password length"); iStream.read(m_Password, szPassword); - // ÷̾ (Name - Sex - SSN) + // 플레이어 개인 정보 (Name - Sex - SSN) BYTE szName; iStream.read(szName); if (szName == 0) @@ -53,7 +53,7 @@ void CLRegisterPlayer::read(SocketInputStream& iStream) throw InvalidProtocolException("too long SSN length"); iStream.read(m_SSN, szSSN); - // ÷̾ ó (Telephone - Cellular - ZipCode - Address - Nation) + // 플레이어 연락처 (Telephone - Cellular - ZipCode - Address - Nation) BYTE szTelephone; iStream.read(szTelephone); if (szTelephone == 0) @@ -90,7 +90,7 @@ void CLRegisterPlayer::read(SocketInputStream& iStream) iStream.read(nation); m_Nation = (Nation)nation; - // ÷̾ (Email - Homepage) + // 플레이어 전자 정보 (Email - Homepage) BYTE szEmail; iStream.read(szEmail); if (szEmail == 0) @@ -107,7 +107,7 @@ void CLRegisterPlayer::read(SocketInputStream& iStream) throw InvalidProtocolException("too long Homepage length"); iStream.read(m_Homepage, szHomepage); - // Ÿ (Profile - Public) + // 기타 (Profile - Public) BYTE szProfile; iStream.read(szProfile); if (szProfile == 0) @@ -126,7 +126,7 @@ void CLRegisterPlayer::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ÷̾ ⺻ (ID - Password) + // 플레이어 기본 정보 (ID - Password) BYTE szID = m_ID.size(); if (szID == 0) throw InvalidProtocolException("szID == 0"); @@ -147,7 +147,7 @@ void CLRegisterPlayer::write(SocketOutputStream& oStream) const oStream.write(szPassword); oStream.write(m_Password); - // ÷̾ (Name - Sex - SSN) + // 플레이어 개인 정보 (Name - Sex - SSN) BYTE szName = m_Name.size(); if (szName == 0) throw InvalidProtocolException("szName == 0"); @@ -166,7 +166,7 @@ void CLRegisterPlayer::write(SocketOutputStream& oStream) const oStream.write(szSSN); oStream.write(m_SSN); - // ÷̾ ó (Telephone - Cellular - ZipCode - Address - Nation) + // 플레이어 연락처 (Telephone - Cellular - ZipCode - Address - Nation) BYTE szTelephone = m_Telephone.size(); if (szTelephone == 0) throw InvalidProtocolException("szTelephone == 0"); @@ -201,7 +201,7 @@ void CLRegisterPlayer::write(SocketOutputStream& oStream) const oStream.write((BYTE)m_Nation); - // ÷̾ (Email - Homepage) + // 플레이어 전자 정보 (Email - Homepage) BYTE szEmail = m_Email.size(); if (szEmail == 0) throw InvalidProtocolException("szEmail == 0"); @@ -218,7 +218,7 @@ void CLRegisterPlayer::write(SocketOutputStream& oStream) const oStream.write(szHomepage); oStream.write(m_Homepage); - // Ÿ (Profile - Public) + // 기타 (Profile - Public) BYTE szProfile = m_Profile.size(); if (szProfile == 0) throw InvalidProtocolException("szProfile == 0"); diff --git a/src/Core/CLRegisterPlayer.h b/src/Core/CLRegisterPlayer.h index e3010c91..0b5aef5c 100644 --- a/src/Core/CLRegisterPlayer.h +++ b/src/Core/CLRegisterPlayer.h @@ -16,8 +16,8 @@ // // class CLRegisterPlayer; // -// Ŭ̾Ʈ α ʿ ϴ Ŷ̴. -// ̵ н尡 ȣȭǾ ִ. ƴϴ.. +// 클라이언트가 로그인 서버에게 최초에 전송하는 패킷이다. +// 아이디와 패스워드가 암호화되어 있다. 아직은 아니당.. // //-------------------------------------------------------------------------------- @@ -25,10 +25,10 @@ class CLRegisterPlayer : public Packet { public: CLRegisterPlayer() {}; virtual ~CLRegisterPlayer() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -41,21 +41,21 @@ class CLRegisterPlayer : public Packet { // get packet's body size PacketSize_t getPacketSize() const { - // ȭ ̸ ϵ Ѵ. - return szBYTE + m_ID.size() // ̵ - + szBYTE + m_Password.size() // ȣ - + szBYTE + m_Name.size() // ̸ - + szBYTE // - + szBYTE + m_SSN.size() // ֹεϹȣ - + szBYTE + m_Telephone.size() // ȭȣ - + szBYTE + m_Cellular.size() // ޴ȣ - + szBYTE + m_ZipCode.size() // ȣ - + szBYTE + m_Address.size() // ּ - + szBYTE // ڵ - + szBYTE + m_Email.size() // ڸ - + szBYTE + m_Homepage.size() // Ȩ - + szBYTE + m_Profile.size() // ڱҰ - + szBYTE; // + // 최적화시 미리 계산된 상수를 사용하도록 한다. + return szBYTE + m_ID.size() // 아이디 + + szBYTE + m_Password.size() // 암호 + + szBYTE + m_Name.size() // 이름 + + szBYTE // 성별 + + szBYTE + m_SSN.size() // 주민등록번호 + + szBYTE + m_Telephone.size() // 전화번호 + + szBYTE + m_Cellular.size() // 휴대폰번호 + + szBYTE + m_ZipCode.size() // 우편번호 + + szBYTE + m_Address.size() // 주소 + + szBYTE // 국가코드 + + szBYTE + m_Email.size() // 전자메일 + + szBYTE + m_Homepage.size() // 홈페이지 + + szBYTE + m_Profile.size() // 자기소개글 + + szBYTE; // 공개여부 } // get packet name @@ -69,8 +69,8 @@ class CLRegisterPlayer : public Packet { public: //---------------------------------------------------------------------- // *CAUTION* - // setXXX() ִ ̸ üũؼ truncate , ּұ̴ - // üũ ʴ´. ּ ̴ read()/write() üũȴ. + // 각 setXXX()들은 최대 길이를 체크해서 truncate 하지만, 최소길이는 + // 체크하지 않는다. 최소 길이는 read()/write() 에서 체크된다. //---------------------------------------------------------------------- // get/set player's id @@ -187,34 +187,34 @@ class CLRegisterPlayer : public Packet { private: //-------------------------------------------------- - // ÷̾ ⺻ + // 플레이어 기본 정보 //-------------------------------------------------- - string m_ID; // ̵ - string m_Password; // н + string m_ID; // 아이디 + string m_Password; // 패스워드 //-------------------------------------------------- - // ÷̾ + // 플레이어 개인 정보 //-------------------------------------------------- - string m_Name; // ̸ - Sex m_Sex; // - string m_SSN; // ֹεϹȣ + string m_Name; // 이름 + Sex m_Sex; // 성별 + string m_SSN; // 주민등록번호 //-------------------------------------------------- - // ÷̾ ó/ּ + // 플레이어 연락처/주소 //-------------------------------------------------- - string m_Telephone; // ȭȣ - string m_Cellular; // ڵ - string m_ZipCode; // ȣ - string m_Address; // ּ - Nation m_Nation; // ڵ + string m_Telephone; // 전화번호 + string m_Cellular; // 핸드폰 + string m_ZipCode; // 우편번호 + string m_Address; // 주소 + Nation m_Nation; // 국가 코드 //-------------------------------------------------- - // ÷̾ + // 플레이어 전자정보 //-------------------------------------------------- - string m_Email; // ڸ - string m_Homepage; // Ȩ + string m_Email; // 전자메일 + string m_Homepage; // 홈페이지 //-------------------------------------------------- - // Ÿ + // 기타 //-------------------------------------------------- - string m_Profile; // ϰ¸ - bool m_bPublic; // + string m_Profile; // 하고픈말 + bool m_bPublic; // 공개 여부 }; @@ -245,21 +245,21 @@ class CLRegisterPlayerFactory : public PacketFactory { // get packet's max body size PacketSize_t getPacketMaxSize() const { - // ȭ ̸ ϵ Ѵ. - return szBYTE + maxIDLength // ̵ - + szBYTE + maxPasswordLength // н - + szBYTE + maxNameLength // ̸ - + szBYTE // - + szBYTE + maxSSNLength // ֹεϹȣ - + szBYTE + maxTelephoneLength // ȭȣ - + szBYTE + maxCellularLength // ޴ȣ - + szBYTE + maxZipCodeLength // ȣ - + szBYTE + maxAddressLength // ּ - + szBYTE // ڵ - + szBYTE + maxEmailLength // ڸ - + szBYTE + maxHomepageLength // Ȩ - + szBYTE + maxProfileLength // ڱҰ - + szBYTE; // + // 최적화시 미리 계산된 상수를 사용하도록 한다. + return szBYTE + maxIDLength // 아이디 + + szBYTE + maxPasswordLength // 패스워드 + + szBYTE + maxNameLength // 이름 + + szBYTE // 성별 + + szBYTE + maxSSNLength // 주민등록번호 + + szBYTE + maxTelephoneLength // 전화번호 + + szBYTE + maxCellularLength // 휴대폰번호 + + szBYTE + maxZipCodeLength // 우편번호 + + szBYTE + maxAddressLength // 주소 + + szBYTE // 국가코드 + + szBYTE + maxEmailLength // 전자메일 + + szBYTE + maxHomepageLength // 홈페이지 + + szBYTE + maxProfileLength // 자기소개 + + szBYTE; // 공개여부 } }; diff --git a/src/Core/CLSelectPC.h b/src/Core/CLSelectPC.h index 69fd8796..9469f8b2 100644 --- a/src/Core/CLSelectPC.h +++ b/src/Core/CLSelectPC.h @@ -18,7 +18,7 @@ // // class CLSelectPC; // -// ÷ PC ϴ Ŷ̴. +// 플레이할 PC 를 선택하는 패킷이다. // ////////////////////////////////////////////////////////////////////// @@ -26,10 +26,10 @@ class CLSelectPC : public Packet { public: CLSelectPC() {}; virtual ~CLSelectPC() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CLSelectServer.h b/src/Core/CLSelectServer.h index 5aae4458..89998415 100644 --- a/src/Core/CLSelectServer.h +++ b/src/Core/CLSelectServer.h @@ -23,10 +23,10 @@ class CLSelectServer : public Packet { public: CLSelectServer() {}; virtual ~CLSelectServer() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CLSelectServerHandler.cpp b/src/Core/CLSelectServerHandler.cpp index 7ffb2083..b54e3773 100644 --- a/src/Core/CLSelectServerHandler.cpp +++ b/src/Core/CLSelectServerHandler.cpp @@ -19,8 +19,8 @@ #endif ////////////////////////////////////////////////////////////////////////////// -// Ŭ̾Ʈ PC Ʈ ޶ ûؿ, α DBκ -// PC εؼ LCPCList Ŷ Ƽ Ѵ. +// 클라이언트가 PC 의 리스트를 달라고 요청해오면, 로그인 서버는 DB로부터 +// PC들의 정보를 로딩해서 LCPCList 패킷에 담아서 전송한다. ////////////////////////////////////////////////////////////////////////////// void CLSelectServerHandler::execute(CLSelectServer* pPacket, Player* pPlayer) @@ -65,13 +65,13 @@ void CLSelectServerHandler::execute(CLSelectServer* pPacket, Player* pPlayer) pLoginPlayer->setServerGroupID(CurrentServerGroupID); //---------------------------------------------------------------------- - // LCPCList Ŷ + // 이제 LCPCList 패킷을 만들어 보내자 //---------------------------------------------------------------------- LCPCList lcPCList; pLoginPlayer->makePCList(lcPCList); #ifdef __NETMARBLE_SERVER__ - // ݸ Ȯ + // 넷마블 사용자 약관 동의 여부 확인 lcPCList.setAgree(pLoginPlayer->isAgree()); #endif @@ -85,14 +85,14 @@ void CLSelectServerHandler::execute(CLSelectServer* pPacket, Player* pPlayer) pStmt->executeQuery("UPDATE Player set CurrentServerGroupID = %d WHERE PlayerID = '%s'", (int)pPacket->getServerGroupID(), pLoginPlayer->getID().c_str()); - // ü Ѵ. + // 쿼리 결과 및 쿼리문 객체를 삭제한다. SAFE_DELETE(pStmt); } catch (SQLQueryException & sce) { //cout << sce.toString() << endl; - // ü Ѵ. + // 쿼리 결과 및 쿼리문 객체를 삭제한다. SAFE_DELETE(pStmt); throw DisconnectException(sce.toString()); diff --git a/src/Core/CLSelectWorld.h b/src/Core/CLSelectWorld.h index 31a6c4b5..582ca76c 100644 --- a/src/Core/CLSelectWorld.h +++ b/src/Core/CLSelectWorld.h @@ -23,10 +23,10 @@ class CLSelectWorld : public Packet { public: CLSelectWorld() {}; virtual ~CLSelectWorld() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/CLSelectWorldHandler.cpp b/src/Core/CLSelectWorldHandler.cpp index ad751620..dfd34e57 100644 --- a/src/Core/CLSelectWorldHandler.cpp +++ b/src/Core/CLSelectWorldHandler.cpp @@ -26,7 +26,7 @@ #endif ////////////////////////////////////////////////////////////////////////////// -// +// 월드 선택 ////////////////////////////////////////////////////////////////////////////// void CLSelectWorldHandler::execute(CLSelectWorld* pPacket, Player* pPlayer) @@ -49,14 +49,14 @@ void CLSelectWorldHandler::execute(CLSelectWorld* pPacket, Player* pPlayer) throw DisconnectException("WorldID over"); } - // close ¿ . by sigi. 2002.1.7 + // close된 상태에서 못 들어오게 막기. by sigi. 2002.1.7 GameWorldInfo* pGameWorldInfo = g_pGameWorldInfoManager->getGameWorldInfo(WorldID); if (pGameWorldInfo->getStatus() == WORLD_CLOSE) { filelog("errorLogin.txt", "WorldClosed[%d]", (int)WorldID); throw DisconnectException("WorldClosed"); } - // Ʈ(2) + // 트랜실(2) 빼기 // if (WorldID==2) throw DisconnectException(); pLoginPlayer->setWorldID(WorldID); diff --git a/src/Core/CLVersionCheck.h b/src/Core/CLVersionCheck.h index 800a1fa5..3588f2b0 100644 --- a/src/Core/CLVersionCheck.h +++ b/src/Core/CLVersionCheck.h @@ -17,8 +17,8 @@ // // class CLVersionCheck; // -// Ŭ̾Ʈ α ʿ ϴ Ŷ̴. -// ̵ н尡 ȣȭǾ ִ. +// 클라이언트가 로그인 서버에게 최초에 전송하는 패킷이다. +// 아이디와 패스워드가 암호화되어 있다. // //-------------------------------------------------------------------------------- @@ -26,10 +26,10 @@ class CLVersionCheck : public Packet { public: CLVersionCheck() {}; ~CLVersionCheck() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -63,7 +63,7 @@ class CLVersionCheck : public Packet { } private: - // Ŭ̾Ʈ + // 클라이언트 버젼 DWORD m_Version; }; diff --git a/src/Core/DatagramPacket.h b/src/Core/DatagramPacket.h index a75c5ea4..35bdc375 100644 --- a/src/Core/DatagramPacket.h +++ b/src/Core/DatagramPacket.h @@ -19,10 +19,10 @@ // // class DatagramPacket; // -// UDP ſ Ǵ Ŷ ̽ Ŭ̴. -// ⺻ Ŷ ּ(address) Ʈ(port) -// ϰ ־ ϸ, Datagram а ޽带 override ؾ ϱ -// ԵǾ. +// 서버간의 UDP 통신에 사용되는 패킷의 베이스 클래스이다. +// 기본적으로 이 패킷들은 보낸 쪽의 주소(address)와 포트(port)를 저장 +// 하고 있어야 하며, Datagram에 읽고 쓰는 메쏘드를 override 해야 하기 +// 때문에 도입되었다. // ////////////////////////////////////////////////////////////////////// @@ -31,22 +31,22 @@ class DatagramPacket : public Packet { // destructor virtual ~DatagramPacket() {} - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. - // ͱ׷ Ŷ TCP ۵Ǿ Դٸ Ѵ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. + // 데이터그램 패킷이 TCP 소켓으로 전송되어 왔다면 프로토콜 에러로 간주한다. virtual void read(SocketInputStream& iStream) { throw ProtocolException("datagram packet from TCP socket"); } - // Datagram ü ͸ о Ŷ ʱȭѴ. + // Datagram 객체에서 데이터를 읽어서 패킷을 초기화한다. virtual void read(Datagram& iDatagram) = 0; - // ½Ʈ() Ŷ ̳ʸ ̹ . - // ͱ׷ Ŷ TCP . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. + // 데이터그램 패킷을 TCP 소켓으로 출력할 수 없다. virtual void write(SocketOutputStream& oStream) const { throw Error("cannot write datagram-packet to TCP-socket-stream"); } - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. virtual void write(Datagram& oDatagram) const = 0; // execute packet's handler diff --git a/src/Core/DatagramSocket.h b/src/Core/DatagramSocket.h index db3b4eb3..fa19fd46 100644 --- a/src/Core/DatagramSocket.h +++ b/src/Core/DatagramSocket.h @@ -19,8 +19,8 @@ // // class DatagramSocket; // -// ͱ׷ ۰ ͱ׷ Ŷ ִ ũ⺸ -// ũٸ, Ƹ Ŷ ߸ ̴. +// 만약 데이터그램 소켓의 내부 버퍼가 데이터그램 패킷의 최대 크기보다 +// 크다면, 아마도 패킷이 잘리는 일은 없을 것이다. // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/ExtraSlotInfo.h b/src/Core/ExtraSlotInfo.h index 171985ef..40d3ad6e 100644 --- a/src/Core/ExtraSlotInfo.h +++ b/src/Core/ExtraSlotInfo.h @@ -2,8 +2,8 @@ // Filename : ExtraSlotInfo.h // Written By : elca // Description : -// ÷̾ 콺 ޷ִ ۿ ۵Ǵ -// Ŷ̴. +// 플레이어의 마우스에 달려있는 아이템에 대한 정보를 가지고 전송되는 +// 패킷이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EXTRA_SLOT_INFO_H__ diff --git a/src/Core/GCActiveGuildList.h b/src/Core/GCActiveGuildList.h index 74472d93..9a7bb154 100644 --- a/src/Core/GCActiveGuildList.h +++ b/src/Core/GCActiveGuildList.h @@ -23,7 +23,7 @@ typedef list::const_iterator GuildInfoListConstItor; // // class GCActiveGuildList; // -// Ŭ̾Ʈ Ʈ . +// 클라이언트에 등록 대기중인 길드 리스트를 보낸다. // ////////////////////////////////////////////////////////////////////// @@ -35,10 +35,10 @@ class GCActiveGuildList : public Packet { // destructor ~GCActiveGuildList(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -116,7 +116,7 @@ class GCActiveGuildListFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCSystemMessagePacketMaxSize , ϶. + // const static GCSystemMessagePacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szWORD + (GuildInfo::getMaxSize() * 5000); } diff --git a/src/Core/GCAddBat.h b/src/Core/GCAddBat.h index 7510ab5d..92c583d3 100644 --- a/src/Core/GCAddBat.h +++ b/src/Core/GCAddBat.h @@ -13,7 +13,7 @@ ////////////////////////////////////////////////////////////////////////////// // class GCAddBat; // -// þ ȿ Bat , Ŷ Bat Ƽ ۹޴´. +// 시야 안에 Bat 가 들어왔을 경우, 이 패킷에 Bat 정보를 담아서 전송받는다. ////////////////////////////////////////////////////////////////////////////// class GCAddBat : public Packet { @@ -128,15 +128,15 @@ class GCAddBat : public Packet { private: ObjectID_t m_ObjectID; - string m_Name; // Bat ̸ + string m_Name; // Bat의 이름 /* - SpriteType_t m_SpriteType; // Ʈ Ÿ - Color_t m_MainColor; // Į - Color_t m_SubColor; // Į + SpriteType_t m_SpriteType; // 스프라이트 타입 + Color_t m_MainColor; // 메인 칼라 + Color_t m_SubColor; // 서브 칼라 */ - // + // 변신 아이템의 종류 ItemType_t m_ItemType; Coord_t m_X; // X diff --git a/src/Core/GCAddBurrowingCreature.h b/src/Core/GCAddBurrowingCreature.h index f2cbcd91..a2ab29c1 100644 --- a/src/Core/GCAddBurrowingCreature.h +++ b/src/Core/GCAddBurrowingCreature.h @@ -12,8 +12,8 @@ ////////////////////////////////////////////////////////////////////////////// // class GCAddBurrowingCreature; -// þ ȿ BurrowingCreature , -// Ŷ BurrowingCreature Ƽ ۹޴´. +// 시야 안에 BurrowingCreature 가 들어왔을 경우, +// 이 패킷에 BurrowingCreature 정보를 담아서 전송받는다. ////////////////////////////////////////////////////////////////////////////// class GCAddBurrowingCreature : public Packet { diff --git a/src/Core/GCAddHelicopter.cpp b/src/Core/GCAddHelicopter.cpp index 71e5340c..82757548 100644 --- a/src/Core/GCAddHelicopter.cpp +++ b/src/Core/GCAddHelicopter.cpp @@ -2,7 +2,7 @@ // Filename : GCAddHelicopter.cpp // Written By : excel96 // Description : -// ̾ ⸦ , ⸦ ȣ ư Ŷ +// 슬레이어가 무전기를 사용해, 헬기를 호출했을 때 날아가는 패킷 ////////////////////////////////////////////////////////////////////////////// #include "GCAddHelicopter.h" diff --git a/src/Core/GCAddHelicopter.h b/src/Core/GCAddHelicopter.h index f1819757..b6726a51 100644 --- a/src/Core/GCAddHelicopter.h +++ b/src/Core/GCAddHelicopter.h @@ -2,7 +2,7 @@ // Filename : GCAddHelicopter.h // Written By : excel96 // Description : -// ̾ ⸦ , ⸦ ȣ 쿡 ư Ŷ +// 슬레이어가 무전기를 사용해, 헬기를 호출했을 경우에 날아가는 패킷 ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_ADD_HELICOPTER_H__ @@ -51,8 +51,8 @@ class GCAddHelicopter : public Packet { } private: - ObjectID_t m_ObjectID; // ⸦ ȣ ̾ Ʈ ID - BYTE m_Code; // ȯ õ ڵ (0:ȣ, 1:) + ObjectID_t m_ObjectID; // 헬기를 호출한 슬레이어의 오브젝트 ID + BYTE m_Code; // 헬기 소환과 관련된 코드 (0:호출, 1:제거) }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCAddHelicopterHandler.cpp b/src/Core/GCAddHelicopterHandler.cpp index 3ad9ceee..f0c08a5a 100644 --- a/src/Core/GCAddHelicopterHandler.cpp +++ b/src/Core/GCAddHelicopterHandler.cpp @@ -2,7 +2,7 @@ // Filename : GCAddHelicopterHandler.cpp // Written By : excel96 // Description : -// ̾ ⸦ , ⸦ ȣ 쿡 ư Ŷ +// 슬레이어가 무전기를 사용해, 헬기를 호출했을 경우에 날아가는 패킷 ////////////////////////////////////////////////////////////////////////////// #include "GCAddHelicopter.h" diff --git a/src/Core/GCAddInjuriousCreature.cpp b/src/Core/GCAddInjuriousCreature.cpp index c5048807..5abbdd58 100644 --- a/src/Core/GCAddInjuriousCreature.cpp +++ b/src/Core/GCAddInjuriousCreature.cpp @@ -11,7 +11,7 @@ void GCAddInjuriousCreature::read(SocketInputStream& iStream) { __BEGIN_TRY - // ̸ б + // 이름 읽기 BYTE szName; iStream.read(szName); @@ -32,7 +32,7 @@ void GCAddInjuriousCreature::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ̸ + // 이름 쓰기 BYTE szName = m_Name.size(); if (szName == 0) diff --git a/src/Core/GCAddInjuriousCreature.h b/src/Core/GCAddInjuriousCreature.h index 3d3ba1d7..afc070cd 100644 --- a/src/Core/GCAddInjuriousCreature.h +++ b/src/Core/GCAddInjuriousCreature.h @@ -17,8 +17,8 @@ // // class GCAddInjuriousCreature; // -// Ŭ̾Ʈ AddInjuriousCreature Ŷ̴. -// ο AddInjuriousCreature String Ÿ ʵ . +// 클라이언트가 서버에게 보내는 AddInjuriousCreature 패킷이다. +// 내부에 AddInjuriousCreature String 만을 데이타 필드로 가진다. // ////////////////////////////////////////////////////////////////////// @@ -26,10 +26,10 @@ class GCAddInjuriousCreature : public Packet { public: GCAddInjuriousCreature() {}; ~GCAddInjuriousCreature() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -92,7 +92,7 @@ class GCAddInjuriousCreatureFactory : public PacketFactory { } // get packet's max body size - // message ִ ũ⿡ ʿϴ. + // message 의 최대 크기에 대한 설정이 필요하다. PacketSize_t getPacketMaxSize() const { return szBYTE + 10; } diff --git a/src/Core/GCAddItemToItemVerify.cpp b/src/Core/GCAddItemToItemVerify.cpp index 6bd7f0c7..85372d6d 100644 --- a/src/Core/GCAddItemToItemVerify.cpp +++ b/src/Core/GCAddItemToItemVerify.cpp @@ -7,7 +7,7 @@ #include "GCAddItemToItemVerify.h" ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCAddItemToItemVerify::read(SocketInputStream& iStream) @@ -17,7 +17,7 @@ void GCAddItemToItemVerify::read(SocketInputStream& iStream) iStream.read(m_Code); switch (m_Code) { - // Ķ͸ ϴ ڵ + // 파라미터를 써야 하는 코드 case ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_FAIL_DECREASE: case ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_OK: case ADD_ITEM_TO_ITEM_VERIFY_MIXING_OK: @@ -30,7 +30,7 @@ void GCAddItemToItemVerify::read(SocketInputStream& iStream) iStream.read(m_Parameter); iStream.read(m_Parameter2); break; - // Ķ͸ ʾƵ Ǵ ڵ + // 파라미터를 쓰지 않아도 되는 코드 default: break; } @@ -39,7 +39,7 @@ void GCAddItemToItemVerify::read(SocketInputStream& iStream) } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCAddItemToItemVerify::write(SocketOutputStream& oStream) const @@ -49,7 +49,7 @@ void GCAddItemToItemVerify::write(SocketOutputStream& oStream) const oStream.write(m_Code); switch (m_Code) { - // Ķ͸ ϴ ڵ + // 파라미터를 써야 하는 코드 case ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_FAIL_DECREASE: case ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_OK: case ADD_ITEM_TO_ITEM_VERIFY_MIXING_OK: @@ -62,7 +62,7 @@ void GCAddItemToItemVerify::write(SocketOutputStream& oStream) const oStream.write(m_Parameter); oStream.write(m_Parameter2); break; - // Ķ͸ ʾƵ Ǵ ڵ + // 파라미터를 쓰지 않아도 되는 코드 default: break; } @@ -84,7 +84,7 @@ void GCAddItemToItemVerify::execute(Player* pPlayer) } ////////////////////////////////////////////////////////////////////////////// -// Ŷ +// 패킷 사이즈 ////////////////////////////////////////////////////////////////////////////// PacketSize_t GCAddItemToItemVerify::getPacketSize() const @@ -95,7 +95,7 @@ PacketSize_t GCAddItemToItemVerify::getPacketSize() const PacketSize_t size = szBYTE; switch (m_Code) { - // Ķ͸ ϴ ڵ + // 파라미터를 써야 하는 코드 case ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_FAIL_DECREASE: case ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_OK: case ADD_ITEM_TO_ITEM_VERIFY_MIXING_OK: @@ -105,7 +105,7 @@ PacketSize_t GCAddItemToItemVerify::getPacketSize() const size += szuint; break; - // Ķ͸ ʾƵ Ǵ ڵ + // 파라미터를 쓰지 않아도 되는 코드 default: break; } diff --git a/src/Core/GCAddItemToItemVerify.h b/src/Core/GCAddItemToItemVerify.h index be87e24b..1140bae2 100644 --- a/src/Core/GCAddItemToItemVerify.h +++ b/src/Core/GCAddItemToItemVerify.h @@ -13,11 +13,11 @@ enum { ADD_ITEM_TO_ITEM_VERIFY_ERROR, // error - ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_IMPOSSIBLE, // enchant Ұ - ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_FAIL_CRASH, // enchant : μ - ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_FAIL_DECREASE, // enchant : ɼ - ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_OK, // enchant - ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_IMPOSSIBLE_NO_PREMIUM, // enchant Ұ : ̾ ƴ + ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_IMPOSSIBLE, // enchant 완전 불가 + ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_FAIL_CRASH, // enchant 실패: 아이템 부서짐 + ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_FAIL_DECREASE, // enchant 실패: 옵션 떨어짐 + ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_OK, // enchant 성공 + ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_IMPOSSIBLE_NO_PREMIUM, // enchant 불가 : 프리미엄 아님 ADD_ITEM_TO_ITEM_VERIFY_TRANS_OK, ADD_ITEM_TO_ITEM_VERIFY_TRANS_IMPOSSIBLE, @@ -25,13 +25,13 @@ enum { ADD_ITEM_TO_ITEM_VERIFY_MIXING_OK, ADD_ITEM_TO_ITEM_VERIFY_DETACHING_OK, - ADD_ITEM_TO_ITEM_VERIFY_MIXING_FAILED_SAME_OPTION_GROUP, // ɼ ׷ Ƽ ϴ. - ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_FAIL, // enchant + ADD_ITEM_TO_ITEM_VERIFY_MIXING_FAILED_SAME_OPTION_GROUP, // 아이템의 옵션 그룹이 같아서 섞을 수 없습니다. + ADD_ITEM_TO_ITEM_VERIFY_ENCHANT_FAIL, // enchant 실패 - ADD_ITEM_TO_ITEM_VERIFY_REVIVAL_OK, // Ȱ + ADD_ITEM_TO_ITEM_VERIFY_REVIVAL_OK, // 펫 부활 성공 - ADD_ITEM_TO_ITEM_VERIFY_CLEAR_OPTION_OK, // option - ADD_ITEM_TO_ITEM_VERIFY_UP_GRADE_OK, // gradeø + ADD_ITEM_TO_ITEM_VERIFY_CLEAR_OPTION_OK, // option 제거 성공 + ADD_ITEM_TO_ITEM_VERIFY_UP_GRADE_OK, // grade올리기 성공 // add by Coffee 2006.11.3 ADD_ITEM_TO_ITEM_VERIFY_THREE_ENCHANT_OK, @@ -91,7 +91,7 @@ class GCAddItemToItemVerify : public Packet { private: BYTE m_Code; uint m_Parameter; - // add by Coffee 2006.11.3 ڶ + // add by Coffee 2006.11.3 괏닸뒤랗몸橄昑 uint m_Parameter2; }; diff --git a/src/Core/GCAddItemToZone.h b/src/Core/GCAddItemToZone.h index 79e130ae..7a44a1c2 100644 --- a/src/Core/GCAddItemToZone.h +++ b/src/Core/GCAddItemToZone.h @@ -173,10 +173,10 @@ class GCAddItemToZone : public Packet { } protected: - // Item ObjectID + // Item의 ObjectID ObjectID_t m_ObjectID; - // Zone X, Y ǥ + // Zone의 X, Y 좌표 Coord_t m_X; Coord_t m_Y; diff --git a/src/Core/GCAddMonsterCorpse.cpp b/src/Core/GCAddMonsterCorpse.cpp index 80a1934f..2a0cbd74 100644 --- a/src/Core/GCAddMonsterCorpse.cpp +++ b/src/Core/GCAddMonsterCorpse.cpp @@ -10,7 +10,7 @@ //-------------------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void GCAddMonsterCorpse::read(SocketInputStream& iStream) { __BEGIN_TRY @@ -36,7 +36,7 @@ void GCAddMonsterCorpse::read(SocketInputStream& iStream) { //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCAddMonsterCorpse::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/GCAddMonsterCorpse.h b/src/Core/GCAddMonsterCorpse.h index 763db0f9..da8dc152 100644 --- a/src/Core/GCAddMonsterCorpse.h +++ b/src/Core/GCAddMonsterCorpse.h @@ -23,10 +23,10 @@ class GCAddMonsterCorpse : public Packet { public: GCAddMonsterCorpse() {}; ~GCAddMonsterCorpse() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -39,7 +39,7 @@ class GCAddMonsterCorpse : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCAddMonsterCorpsePacketSize , ϶. + // const static GCAddMonsterCorpsePacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szObjectID + szMonsterType + szBYTE + m_MonsterName.size() + szCoord + szCoord + szDir + szbool + szBYTE + szObjectID; @@ -127,14 +127,14 @@ class GCAddMonsterCorpse : public Packet { private: ObjectID_t m_ObjectID; // OID - MonsterType_t m_MonsterType; // Ÿ + MonsterType_t m_MonsterType; // 몬스터 타입 string m_MonsterName; - Coord_t m_X; // X ǥ - Coord_t m_Y; // Y ǥ - Dir_t m_Dir; // - bool m_bhasHead; // Ӹ ִ°? + Coord_t m_X; // X 좌표 + Coord_t m_Y; // Y 좌표 + Dir_t m_Dir; // 방향 + bool m_bhasHead; // 머리가 있는가? BYTE m_TreasureCount; @@ -169,7 +169,7 @@ class GCAddMonsterCorpseFactory : public PacketFactory { // get packet's body size // *OPTIMIZATION HINT* - // const static GCAddMonsterCorpsePacketSize , ϶. + // const static GCAddMonsterCorpsePacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szMonsterType + szBYTE + 128 + szCoord + szCoord + szDir + szbool + szBYTE + szObjectID; } diff --git a/src/Core/GCAddNPC.cpp b/src/Core/GCAddNPC.cpp index 2384581f..183225a9 100644 --- a/src/Core/GCAddNPC.cpp +++ b/src/Core/GCAddNPC.cpp @@ -11,14 +11,14 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCAddNPC::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); BYTE szName; @@ -48,14 +48,14 @@ void GCAddNPC::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCAddNPC::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); BYTE szName = m_Name.size(); diff --git a/src/Core/GCAddNPC.h b/src/Core/GCAddNPC.h index 4c183300..bc4c0924 100644 --- a/src/Core/GCAddNPC.h +++ b/src/Core/GCAddNPC.h @@ -16,7 +16,7 @@ // // class GCAddNPC; // -// þ ȿ NPC , Ŷ NPC Ƽ ۹޴´. +// 시야 안에 NPC 가 들어왔을 경우, 이 패킷에 NPC 정보를 담아서 전송받는다. // //-------------------------------------------------------------------------------- @@ -24,10 +24,10 @@ class GCAddNPC : public Packet { public: GCAddNPC() {}; ~GCAddNPC() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -40,7 +40,7 @@ class GCAddNPC : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCAddNPCPacketSize , ϶. + // const static GCAddNPCPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szObjectID + szBYTE + m_Name.size() + szNPCID + szSpriteType + szColor + szColor + szCoord + szCoord + szDir; @@ -129,23 +129,23 @@ class GCAddNPC : public Packet { } private: - // ũ ̵ ü ؼ Ѵ. + // 존 레벨에서 유니크한 아이디로 객체 구분을 위해서 사용한다. ObjectID_t m_ObjectID; - // NPC ̸ + // NPC의 이름 string m_Name; - // NPC ̵(Ʈ ̵ ƴϴ.) + // NPC의 아이디(오브젝트 아이디가 아니다.) NPCID_t m_NPCID; - // Ʈ Ÿ + // 스프라이트 타입 SpriteType_t m_SpriteType; - // + // 색깔 정보 Color_t m_MainColor; Color_t m_SubColor; - // X, Y + // X, Y 및 방향 Coord_t m_X; Coord_t m_Y; Dir_t m_Dir; @@ -179,7 +179,7 @@ class GCAddNPCFactory : public PacketFactory { // get packet's body size // *OPTIMIZATION HINT* - // const static GCAddNPCPacketSize , ϶. + // const static GCAddNPCPacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szBYTE + 40 + szNPCID + szSpriteType + szColor + szColor + szCoord + szCoord + szDir; } diff --git a/src/Core/GCAddNewItemToZone.h b/src/Core/GCAddNewItemToZone.h index 1953a0f6..4ef59c54 100644 --- a/src/Core/GCAddNewItemToZone.h +++ b/src/Core/GCAddNewItemToZone.h @@ -72,7 +72,7 @@ class GCAddNewItemToZoneFactory : public PacketFactory { // get packet's body size // *OPTIMIZATION HINT* - // const static GCAddNewItemToZonePacketSize , ϶. + // const static GCAddNewItemToZonePacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szCoord + szCoord + szBYTE + szItemType + szBYTE + 255 + szDurability + szItemNum + szBYTE + (szObjectID + szBYTE + szItemType + szItemNum + szSlotID) * 12; diff --git a/src/Core/GCAddOusters.h b/src/Core/GCAddOusters.h index 802568fa..7600f2a4 100644 --- a/src/Core/GCAddOusters.h +++ b/src/Core/GCAddOusters.h @@ -17,14 +17,14 @@ ////////////////////////////////////////////////////////////////////////////// // class GCAddOusters; -// α̳ Ż, ڷƮ ̾  , Ǵ -// ̾ ̵ ,(1) ̹ ̾ ִ -//( ̾ ִ..) ϴ PC鿡Դ GCMove Ŷ -// εijƮѴ. ׷,(2) ̾ ó Ǵ ϴ -// PC鿡Դ GCAddOusters Ŷ εijƮѴ. ,(3) ̾ -// ڽ ô þ(?) ȿ ϴ ̾ GCAddOusters -// Ƽ ް ȴ. -// ~~ +// 로그인이나 포탈, 텔레포트 등으로 슬레이어가 존에 새로 들어갔을 경우, 또는 +// 슬레이어가 존에서 이동할 경우,(1) 이미 이 슬레이어에 대한 정보를 갖고 있는 +//(즉 이 슬레이어를 보고 있는..) 영역에 존재하는 PC들에게는 GCMove 패킷을 +// 브로드캐스트한다. 그러나,(2) 이 슬레이어를 처음 보게 되는 영역에 존재하는 +// PC들에게는 GCAddOusters 패킷을 브로드캐스트한다. 또한,(3) 이 슬레이어는 +// 자신이 새로 개척한 시야(?) 안에 존재하는 슬레이어들의 정보를 GCAddOusters에 +// 담아서 받게 된다. +// 멍~~ ////////////////////////////////////////////////////////////////////////////// class GCAddOusters : public Packet { @@ -86,9 +86,9 @@ class GCAddOusters : public Packet { } private: - PCOustersInfo3 m_OustersInfo; // ̾ ܸ - EffectInfo* m_pEffectInfo; // ɷִ Ʈ - PetInfo* m_pPetInfo; // ɷִ Ʈ + PCOustersInfo3 m_OustersInfo; // 슬레이어의 외모 정보 + EffectInfo* m_pEffectInfo; // 걸려있는 이펙트 정보 + PetInfo* m_pPetInfo; // 걸려있는 이펙트 정보 NicknameInfo* m_pNicknameInfo; StoreOutlook m_StoreOutlook; }; diff --git a/src/Core/GCAddOustersCorpse.cpp b/src/Core/GCAddOustersCorpse.cpp index 35bf7a06..20811f4c 100644 --- a/src/Core/GCAddOustersCorpse.cpp +++ b/src/Core/GCAddOustersCorpse.cpp @@ -10,7 +10,7 @@ //---------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //---------------------------------------------------------------------- void GCAddOustersCorpse::read(SocketInputStream& iStream) @@ -25,7 +25,7 @@ void GCAddOustersCorpse::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCAddOustersCorpse::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCAddOustersCorpse.h b/src/Core/GCAddOustersCorpse.h index 30117f6a..b372ecfb 100644 --- a/src/Core/GCAddOustersCorpse.h +++ b/src/Core/GCAddOustersCorpse.h @@ -31,10 +31,10 @@ class GCAddOustersCorpse : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/GCAddSlayerCorpse.cpp b/src/Core/GCAddSlayerCorpse.cpp index e3afd3a4..117dd369 100644 --- a/src/Core/GCAddSlayerCorpse.cpp +++ b/src/Core/GCAddSlayerCorpse.cpp @@ -10,7 +10,7 @@ //-------------------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void GCAddSlayerCorpse::read(SocketInputStream& iStream) @@ -28,7 +28,7 @@ void GCAddSlayerCorpse::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCAddSlayerCorpse::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCAddSlayerCorpse.h b/src/Core/GCAddSlayerCorpse.h index 19d99efb..d6ddfa2c 100644 --- a/src/Core/GCAddSlayerCorpse.h +++ b/src/Core/GCAddSlayerCorpse.h @@ -17,7 +17,7 @@ // // class GCAddSlayerCorpse; // -// ̾ ü Ƽ Ŭ̾Ʈ Ѵ. +// 슬레이어의 시체 정보를 담아서 클라이언트에 전송한다. // //---------------------------------------------------------------------- @@ -32,10 +32,10 @@ class GCAddSlayerCorpse : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -81,10 +81,10 @@ class GCAddSlayerCorpse : public Packet { } private: - // ̾ ܸ + // 슬레이어의 외모 정보 PCSlayerInfo3 m_SlayerInfo; - // + // 보물 숫자 BYTE m_TreasureCount; }; @@ -116,7 +116,7 @@ class GCAddSlayerCorpseFactory : public PacketFactory { // get packet's body size // *OPTIMIZATION HINT* - // const static GCAddSlayerCorpsePacketSize , ϶. + // const static GCAddSlayerCorpsePacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return PCSlayerInfo3::getMaxSize() + szBYTE; } diff --git a/src/Core/GCAddStoreItemHandler.cpp b/src/Core/GCAddStoreItemHandler.cpp index 39943c8f..2f15605f 100644 --- a/src/Core/GCAddStoreItemHandler.cpp +++ b/src/Core/GCAddStoreItemHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCAddStoreItemHandler::execute(GCAddStoreItem* pPacket, Player* pPlayer) diff --git a/src/Core/GCAddVampire.h b/src/Core/GCAddVampire.h index 88f4d3ba..a11000a6 100644 --- a/src/Core/GCAddVampire.h +++ b/src/Core/GCAddVampire.h @@ -18,13 +18,13 @@ ////////////////////////////////////////////////////////////////////////////// // class GCAddVampire; // -// α̳ Ż, ڷƮ ̾  , Ǵ -// ̾ ̵ ,(1) ̹ ̾ ִ -//( ̾ ִ..) ϴ PC鿡Դ GCMove Ŷ -// εijƮѴ. ׷,(2) ̾ ó Ǵ ϴ -// PC鿡Դ GCAddVampire Ŷ εijƮѴ. ,(3) ̾ -// ڽ ô þ(?) ȿ ϴ ̾ GCAddVampire -// Ƽ ް ȴ. +// 로그인이나 포탈, 텔레포트 등으로 슬레이어가 존에 새로 들어갔을 경우, 또는 +// 슬레이어가 존에서 이동할 경우,(1) 이미 이 슬레이어에 대한 정보를 갖고 있는 +//(즉 이 슬레이어를 보고 있는..) 영역에 존재하는 PC들에게는 GCMove 패킷을 +// 브로드캐스트한다. 그러나,(2) 이 슬레이어를 처음 보게 되는 영역에 존재하는 +// PC들에게는 GCAddVampire 패킷을 브로드캐스트한다. 또한,(3) 이 슬레이어는 +// 자신이 새로 개척한 시야(?) 안에 존재하는 슬레이어들의 정보를 GCAddVampire에 +// 담아서 받게 된다. ////////////////////////////////////////////////////////////////////////////// class GCAddVampire : public Packet { @@ -113,12 +113,12 @@ class GCAddVampire : public Packet { } private: - PCVampireInfo3 m_VampireInfo; // ̾ ܸ - EffectInfo* m_pEffectInfo; // Ʈ - PetInfo* m_pPetInfo; // - NicknameInfo* m_pNicknameInfo; // - StoreOutlook m_StoreOutlook; // λ - BYTE m_FromFlag; // κΰ? 쿡 0, Ż 쿡 1 + PCVampireInfo3 m_VampireInfo; // 뱀파이어 외모 정보 + EffectInfo* m_pEffectInfo; // 이펙트 정보 + PetInfo* m_pPetInfo; // 펫 정보 + NicknameInfo* m_pNicknameInfo; // 펫 정보 + StoreOutlook m_StoreOutlook; // 개인상점 정보 + BYTE m_FromFlag; // 어디로부터인가? 정상일 경우에는 0, 포탈을 통했을 경우에는 1 }; diff --git a/src/Core/GCAddVampireCorpse.cpp b/src/Core/GCAddVampireCorpse.cpp index 7e757416..27c1f9c3 100644 --- a/src/Core/GCAddVampireCorpse.cpp +++ b/src/Core/GCAddVampireCorpse.cpp @@ -10,7 +10,7 @@ //---------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //---------------------------------------------------------------------- void GCAddVampireCorpse::read(SocketInputStream& iStream) @@ -25,7 +25,7 @@ void GCAddVampireCorpse::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCAddVampireCorpse::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCAddVampireCorpse.h b/src/Core/GCAddVampireCorpse.h index 0a7d0333..eb163bcc 100644 --- a/src/Core/GCAddVampireCorpse.h +++ b/src/Core/GCAddVampireCorpse.h @@ -18,13 +18,13 @@ // // class GCAddVampireCorpse; // -// α̳ Ż, ڷƮ ̾  , Ǵ -// ̾ ̵ ,(1) ̹ ̾ ִ -//( ̾ ִ..) ϴ PC鿡Դ GCMove Ŷ -// εijƮѴ. ׷,(2) ̾ ó Ǵ ϴ -// PC鿡Դ GCAddVampireCorpse Ŷ εijƮѴ. ,(3) ̾ -// ڽ ô þ(?) ȿ ϴ ̾ GCAddVampireCorpse -// Ƽ ް ȴ. +// 로그인이나 포탈, 텔레포트 등으로 슬레이어가 존에 새로 들어갔을 경우, 또는 +// 슬레이어가 존에서 이동할 경우,(1) 이미 이 슬레이어에 대한 정보를 갖고 있는 +//(즉 이 슬레이어를 보고 있는..) 영역에 존재하는 PC들에게는 GCMove 패킷을 +// 브로드캐스트한다. 그러나,(2) 이 슬레이어를 처음 보게 되는 영역에 존재하는 +// PC들에게는 GCAddVampireCorpse 패킷을 브로드캐스트한다. 또한,(3) 이 슬레이어는 +// 자신이 새로 개척한 시야(?) 안에 존재하는 슬레이어들의 정보를 GCAddVampireCorpse에 +// 담아서 받게 된다. // //---------------------------------------------------------------------- @@ -39,10 +39,10 @@ class GCAddVampireCorpse : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -88,7 +88,7 @@ class GCAddVampireCorpse : public Packet { } private: - // ̾ ܸ + // 뱀파이어 외모 정보 PCVampireInfo3 m_VampireInfo; BYTE m_TreasureCount; diff --git a/src/Core/GCAddVampirePortal.h b/src/Core/GCAddVampirePortal.h index e45b030b..9586718d 100644 --- a/src/Core/GCAddVampirePortal.h +++ b/src/Core/GCAddVampirePortal.h @@ -2,8 +2,8 @@ // Filename : GCAddVampirePortal.h // Written By : excel96 // Description : -// ̾ Ż Ʈ μ Ǵµ, Ŷ -// Ŭ̾Ʈ ٴڿ ̾ Ż Ʈ ̶ Ŷ̴. +// 뱀파이어 포탈은 현재 이펙트의 일종으로서 구현되는데, 이 패킷은 +// 클라이언트에게 바닥에다 뱀파이어 포탈 이펙트를 붙이라는 패킷이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_ADD_VAMPIRE_PORTAL_H__ @@ -102,15 +102,15 @@ class GCAddVampirePortal : public Packet { private: - ObjectID_t m_ObjectID; // Ʈ OID - string m_OwnerID; // Ż - Duration_t m_Duration; // Ż ð - Coord_t m_X; // Ż پִ Ÿ ǥ x - Coord_t m_Y; // Ż پִ Ÿ ǥ y - ZoneID_t m_TargetZoneID; // Ż ǥ ID - Coord_t m_TargetX; // Ż ǥ ǥ x - Coord_t m_TargetY; // Ż ǥ ǥ y - BYTE m_CreateFlag; // Ǿ°? (0̸ ð ...) + ObjectID_t m_ObjectID; // 이펙트의 OID + string m_OwnerID; // 포탈 주인 + Duration_t m_Duration; // 포탈의 지속 시간 + Coord_t m_X; // 포탈이 붙어있는 타일의 좌표 x + Coord_t m_Y; // 포탈이 붙어있는 타일의 좌표 y + ZoneID_t m_TargetZoneID; // 포탈의 목표 존 ID + Coord_t m_TargetX; // 포탈의 목표 좌표 x + Coord_t m_TargetY; // 포탈의 목표 좌표 y + BYTE m_CreateFlag; // 방금 생성되었는가? (0이면 생성된지 시간이 좀 지난 것...) }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCAddVampirePortalHandler.cpp b/src/Core/GCAddVampirePortalHandler.cpp index 5558fa87..eb19c825 100644 --- a/src/Core/GCAddVampirePortalHandler.cpp +++ b/src/Core/GCAddVampirePortalHandler.cpp @@ -2,8 +2,8 @@ // Filename : GCAddVampirePortalHandler.cpp // Written By : excel96 // Description : -// ̾ Ż Ʈ μ Ǵµ, Ŷ -// Ŭ̾Ʈ ٴڿ ̾ Ż Ʈ ̶ Ŷ̴. +// 뱀파이어 포탈은 현재 이펙트의 일종으로서 구현되는데, 이 패킷은 +// 클라이언트에게 바닥에다 뱀파이어 포탈 이펙트를 붙이라는 패킷이다. ////////////////////////////////////////////////////////////////////////////// #include "GCAddVampirePortal.h" diff --git a/src/Core/GCAddWolf.cpp b/src/Core/GCAddWolf.cpp index c77a6647..7defce74 100644 --- a/src/Core/GCAddWolf.cpp +++ b/src/Core/GCAddWolf.cpp @@ -10,14 +10,14 @@ #include "GCAddWolf.h" ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCAddWolf::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); BYTE szName; @@ -50,14 +50,14 @@ void GCAddWolf::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCAddWolf::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); BYTE szName = m_Name.size(); diff --git a/src/Core/GCAddWolf.h b/src/Core/GCAddWolf.h index bcd36c4b..0b80e17a 100644 --- a/src/Core/GCAddWolf.h +++ b/src/Core/GCAddWolf.h @@ -16,17 +16,17 @@ // // class GCAddWolf; // -// þ ȿ Wolf , Ŷ Wolf Ƽ ۹޴´. +// 시야 안에 Wolf 가 들어왔을 경우, 이 패킷에 Wolf 정보를 담아서 전송받는다. // //-------------------------------------------------------------------------------- class GCAddWolf : public Packet { public: GCAddWolf() {}; ~GCAddWolf() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -39,7 +39,7 @@ class GCAddWolf : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCAddWolfPacketSize , ϶. + // const static GCAddWolfPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szObjectID + szBYTE + m_Name.size() @@ -144,25 +144,25 @@ class GCAddWolf : public Packet { } private: - // ũ ̵ ü ؼ Ѵ. + // 존 레벨에서 유니크한 아이디로 객체 구분을 위해서 사용한다. ObjectID_t m_ObjectID; - // Wolf ̸ + // Wolf의 이름 string m_Name; - // + // 변신 아이템의 종류 ItemType_t m_ItemType; /* - // Ʈ Ÿ + // 스프라이트 타입 SpriteType_t m_SpriteType; - // + // 색깔 정보 Color_t m_SubColor; */ Color_t m_MainColor; - // X, Y + // X, Y 및 방향 Coord_t m_X; Coord_t m_Y; Dir_t m_Dir; @@ -200,7 +200,7 @@ class GCAddWolfFactory : public PacketFactory { // get packet's body size // *OPTIMIZATION HINT* - // const static GCAddWolfPacketSize , ϶. + // const static GCAddWolfPacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szBYTE + 20 diff --git a/src/Core/GCAddressListVerify.cpp b/src/Core/GCAddressListVerify.cpp index b84336cb..902d0d92 100644 --- a/src/Core/GCAddressListVerify.cpp +++ b/src/Core/GCAddressListVerify.cpp @@ -7,7 +7,7 @@ #include "GCAddressListVerify.h" ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCAddressListVerify::read(SocketInputStream& iStream) @@ -21,7 +21,7 @@ void GCAddressListVerify::read(SocketInputStream& iStream) } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCAddressListVerify::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCAttackArmsOK1.cpp b/src/Core/GCAttackArmsOK1.cpp index 9c0ed7d0..29642d3e 100644 --- a/src/Core/GCAttackArmsOK1.cpp +++ b/src/Core/GCAttackArmsOK1.cpp @@ -2,8 +2,8 @@ // // Filename : GCAttackArmsOK1.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -46,7 +46,7 @@ GCAttackArmsOK1::~GCAttackArmsOK1() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCAttackArmsOK1::read(SocketInputStream& iStream) @@ -67,7 +67,7 @@ void GCAttackArmsOK1::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCAttackArmsOK1::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/GCAttackArmsOK2.cpp b/src/Core/GCAttackArmsOK2.cpp index 685d5d3e..488cc69a 100644 --- a/src/Core/GCAttackArmsOK2.cpp +++ b/src/Core/GCAttackArmsOK2.cpp @@ -2,8 +2,8 @@ // // Filename : GCAttackArmsOK2.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -41,14 +41,14 @@ GCAttackArmsOK2::~GCAttackArmsOK2() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCAttackArmsOK2::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_SkillType); iStream.read(m_ObjectID); @@ -59,12 +59,12 @@ void GCAttackArmsOK2::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCAttackArmsOK2::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_SkillType); oStream.write(m_ObjectID); diff --git a/src/Core/GCAttackArmsOK2.h b/src/Core/GCAttackArmsOK2.h index d31c615c..5f495620 100644 --- a/src/Core/GCAttackArmsOK2.h +++ b/src/Core/GCAttackArmsOK2.h @@ -2,7 +2,7 @@ // // Filename : GCAttackArmsOK2.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCAttackArmsOK2; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCAttackArmsOK2 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCAttackArmsOK2 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szSkillType + szObjectID + ModifyInfo::getPacketSize(); } diff --git a/src/Core/GCAttackArmsOK3.cpp b/src/Core/GCAttackArmsOK3.cpp index 9cc8a0f0..4fe66e3f 100644 --- a/src/Core/GCAttackArmsOK3.cpp +++ b/src/Core/GCAttackArmsOK3.cpp @@ -2,8 +2,8 @@ // // Filename : GCAttackArmsOK3.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -41,14 +41,14 @@ GCAttackArmsOK3::~GCAttackArmsOK3() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCAttackArmsOK3::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_SkillType); iStream.read(m_ObjectID); // iStream.read(m_TargetObjectID); @@ -60,12 +60,12 @@ void GCAttackArmsOK3::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCAttackArmsOK3::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_SkillType); oStream.write(m_ObjectID); // oStream.write(m_TargetObjectID); diff --git a/src/Core/GCAttackArmsOK3.h b/src/Core/GCAttackArmsOK3.h index f81c25c4..63cba7ec 100644 --- a/src/Core/GCAttackArmsOK3.h +++ b/src/Core/GCAttackArmsOK3.h @@ -2,7 +2,7 @@ // // Filename : GCAttackArmsOK3.h // Written By : elca@ewestsoft.com -// Description : ڴ ְ, ڴ Ŷ +// Description : 기술 사용자는 볼 수 있고, 피해자는 볼 수 없는 사람에게 보내는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCAttackArmsOK3; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCAttackArmsOK3 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCAttackArmsOK3 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. // PacketSize_t getPacketSize() const { return szObjectID + szObjectID + szbool; } PacketSize_t getPacketSize() const { return szSkillType + szObjectID + szCoord * 2; diff --git a/src/Core/GCAttackArmsOK4.cpp b/src/Core/GCAttackArmsOK4.cpp index 714869e9..92251107 100644 --- a/src/Core/GCAttackArmsOK4.cpp +++ b/src/Core/GCAttackArmsOK4.cpp @@ -2,8 +2,8 @@ // // Filename : GCAttackArmsOK4.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -41,14 +41,14 @@ GCAttackArmsOK4::~GCAttackArmsOK4() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCAttackArmsOK4::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. // iStream.read(m_ObjectID); iStream.read(m_SkillType); iStream.read(m_TargetObjectID); @@ -61,12 +61,12 @@ void GCAttackArmsOK4::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCAttackArmsOK4::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. // oStream.write(m_ObjectID); oStream.write(m_SkillType); oStream.write(m_TargetObjectID); diff --git a/src/Core/GCAttackArmsOK4.h b/src/Core/GCAttackArmsOK4.h index 620c0d81..8d9d4d66 100644 --- a/src/Core/GCAttackArmsOK4.h +++ b/src/Core/GCAttackArmsOK4.h @@ -2,7 +2,7 @@ // // Filename : GCAttackArmsOK4.h // Written By : elca@ewestsoft.com -// Description : ڴ ְ, ڴ Ŷ +// Description : 기술 피해자는 볼 수 있고, 사용자는 볼 수 없는 사람에게 보내는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCAttackArmsOK4; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCAttackArmsOK4 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCAttackArmsOK4 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. // PacketSize_t getPacketSize() const { return szObjectID + szObjectID + szbool; } PacketSize_t getPacketSize() const { return szSkillType + szObjectID; diff --git a/src/Core/GCAttackArmsOK5.cpp b/src/Core/GCAttackArmsOK5.cpp index 44713d98..0eeb27ae 100644 --- a/src/Core/GCAttackArmsOK5.cpp +++ b/src/Core/GCAttackArmsOK5.cpp @@ -2,8 +2,8 @@ // // Filename : GCAttackArmsOK5.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -45,7 +45,7 @@ GCAttackArmsOK5::~GCAttackArmsOK5() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCAttackArmsOK5::read(SocketInputStream& iStream) @@ -53,7 +53,7 @@ void GCAttackArmsOK5::read(SocketInputStream& iStream) __BEGIN_TRY __BEGIN_DEBUG - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_SkillType); iStream.read(m_ObjectID); iStream.read(m_TargetObjectID); @@ -67,13 +67,13 @@ void GCAttackArmsOK5::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCAttackArmsOK5::write(SocketOutputStream& oStream) const { __BEGIN_TRY __BEGIN_DEBUG - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_SkillType); oStream.write(m_ObjectID); oStream.write(m_TargetObjectID); diff --git a/src/Core/GCAttackArmsOK5.h b/src/Core/GCAttackArmsOK5.h index 13fc7031..c62ce63b 100644 --- a/src/Core/GCAttackArmsOK5.h +++ b/src/Core/GCAttackArmsOK5.h @@ -2,7 +2,7 @@ // // Filename : GCAttackArmsOK5.h // Written By : elca@ewestsoft.com -// Description : ڴ ְ, ڴ Ŷ +// Description : 기술 사용자는 볼 수 있고, 피해자는 볼 수 없는 사람에게 보내는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCAttackArmsOK5; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCAttackArmsOK5 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCAttackArmsOK5 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szSkillType + szObjectID + szObjectID + szbool; } diff --git a/src/Core/GCAttackMeleeOK1.h b/src/Core/GCAttackMeleeOK1.h index 0297879f..9e5eb5ee 100644 --- a/src/Core/GCAttackMeleeOK1.h +++ b/src/Core/GCAttackMeleeOK1.h @@ -2,7 +2,7 @@ // // Filename : GCAttackMeleeOK1.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCAttackMeleeOK1; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCAttackMeleeOK1 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCAttackMeleeOK1 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + ModifyInfo::getPacketSize(); } diff --git a/src/Core/GCAttackMeleeOK2.cpp b/src/Core/GCAttackMeleeOK2.cpp index 032b6155..05ffb0e8 100644 --- a/src/Core/GCAttackMeleeOK2.cpp +++ b/src/Core/GCAttackMeleeOK2.cpp @@ -2,8 +2,8 @@ // // Filename : GCAttackMeleeOK2.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -36,14 +36,14 @@ GCAttackMeleeOK2::~GCAttackMeleeOK2() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCAttackMeleeOK2::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); ModifyInfo::read(iStream); __END_CATCH @@ -51,12 +51,12 @@ void GCAttackMeleeOK2::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCAttackMeleeOK2::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); ModifyInfo::write(oStream); diff --git a/src/Core/GCAttackMeleeOK2.h b/src/Core/GCAttackMeleeOK2.h index a6415113..478e8a07 100644 --- a/src/Core/GCAttackMeleeOK2.h +++ b/src/Core/GCAttackMeleeOK2.h @@ -2,7 +2,7 @@ // // Filename : GCAttackMeleeOK2.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCAttackMeleeOK2; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCAttackMeleeOK2 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCAttackMeleeOK2 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + ModifyInfo::getPacketSize(); } diff --git a/src/Core/GCAttackMeleeOK3.cpp b/src/Core/GCAttackMeleeOK3.cpp index 43aa9a2e..51f4f361 100644 --- a/src/Core/GCAttackMeleeOK3.cpp +++ b/src/Core/GCAttackMeleeOK3.cpp @@ -2,8 +2,8 @@ // // Filename : GCAttackMeleeOK3.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -35,14 +35,14 @@ GCAttackMeleeOK3::~GCAttackMeleeOK3() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCAttackMeleeOK3::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_TargetObjectID); @@ -51,12 +51,12 @@ void GCAttackMeleeOK3::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCAttackMeleeOK3::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_TargetObjectID); diff --git a/src/Core/GCAttackMeleeOK3.h b/src/Core/GCAttackMeleeOK3.h index f291b65f..ac0481e2 100644 --- a/src/Core/GCAttackMeleeOK3.h +++ b/src/Core/GCAttackMeleeOK3.h @@ -2,7 +2,7 @@ // // Filename : GCAttackMeleeOK3.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCAttackMeleeOK3; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCAttackMeleeOK3 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCAttackMeleeOK3 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szObjectID; } diff --git a/src/Core/GCAuthKey.h b/src/Core/GCAuthKey.h index 323ca54d..a6672345 100644 --- a/src/Core/GCAuthKey.h +++ b/src/Core/GCAuthKey.h @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////////////// // class GCAuthKey; -// NPC 縦 ֺ PC 鿡 Ѵ. +// NPC 의 대사를 주변의 PC 들에게 전송한다. ////////////////////////////////////////////////////////////////////////////// class GCAuthKey : public Packet { diff --git a/src/Core/GCAuthKeyHandler.cpp b/src/Core/GCAuthKeyHandler.cpp index ad14c5c7..cffa0743 100644 --- a/src/Core/GCAuthKeyHandler.cpp +++ b/src/Core/GCAuthKeyHandler.cpp @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCAuthKeyHandler::execute(GCAuthKey* pPacket, Player* pPlayer) diff --git a/src/Core/GCBloodBibleList.cpp b/src/Core/GCBloodBibleList.cpp index 612d28fa..f84ef0a3 100644 --- a/src/Core/GCBloodBibleList.cpp +++ b/src/Core/GCBloodBibleList.cpp @@ -19,7 +19,7 @@ GCBloodBibleList::~GCBloodBibleList() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCBloodBibleList::read(SocketInputStream& iStream) @@ -41,7 +41,7 @@ void GCBloodBibleList::read(SocketInputStream& iStream) } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCBloodBibleList::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCBloodBibleListHandler.cpp b/src/Core/GCBloodBibleListHandler.cpp index e9e49e9a..77e89b36 100644 --- a/src/Core/GCBloodBibleListHandler.cpp +++ b/src/Core/GCBloodBibleListHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCBloodBibleListHandler::execute(GCBloodBibleList* pPacket, Player* pPlayer) diff --git a/src/Core/GCBloodBibleSignInfo.cpp b/src/Core/GCBloodBibleSignInfo.cpp index 13077159..a2883096 100644 --- a/src/Core/GCBloodBibleSignInfo.cpp +++ b/src/Core/GCBloodBibleSignInfo.cpp @@ -19,7 +19,7 @@ GCBloodBibleSignInfo::~GCBloodBibleSignInfo() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCBloodBibleSignInfo::read(SocketInputStream& iStream) @@ -33,7 +33,7 @@ void GCBloodBibleSignInfo::read(SocketInputStream& iStream) } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCBloodBibleSignInfo::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCBloodBibleSignInfoHandler.cpp b/src/Core/GCBloodBibleSignInfoHandler.cpp index c097fb0e..f24ba64b 100644 --- a/src/Core/GCBloodBibleSignInfoHandler.cpp +++ b/src/Core/GCBloodBibleSignInfoHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCBloodBibleSignInfoHandler::execute(GCBloodBibleSignInfo* pPacket, Player* pPlayer) diff --git a/src/Core/GCBloodBibleStatus.cpp b/src/Core/GCBloodBibleStatus.cpp index f2e6c6a2..b6f5effe 100644 --- a/src/Core/GCBloodBibleStatus.cpp +++ b/src/Core/GCBloodBibleStatus.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCBloodBibleStatus::read(SocketInputStream& iStream) @@ -37,7 +37,7 @@ void GCBloodBibleStatus::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCBloodBibleStatus::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCBloodBibleStatus.h b/src/Core/GCBloodBibleStatus.h index e27e14ad..33a2d6f1 100644 --- a/src/Core/GCBloodBibleStatus.h +++ b/src/Core/GCBloodBibleStatus.h @@ -5,10 +5,10 @@ // ////////////////////////////////////////////////////////////////////// // -// STORAGE_CORPSE ItemType, ZoneID, Race, X, Y ʿ, Ű: load(), returnBloodBible() -// STORAGE_INVENTORY ItemType, ZoneID, OwnerName, Race, X, Y ֿ: CGAddZoneToInventory -// STORAGE_MOUSE ItemType, ZoneID, OwnerName, Race, X, Y ֿ: CGAddZoneToMouse -// STORAGE_ZONE ItemType, ZoneID, X, Y ٴڿ : CGAddMouseToZone, CGDissectionCorpse +// STORAGE_CORPSE ItemType, ZoneID, Race, X, Y 최초에, 옮겨졌을때: load(), returnBloodBible() +// STORAGE_INVENTORY ItemType, ZoneID, OwnerName, Race, X, Y 누군가가 주웠을때: CGAddZoneToInventory +// STORAGE_MOUSE ItemType, ZoneID, OwnerName, Race, X, Y 누군가가 주웠을때: CGAddZoneToMouse +// STORAGE_ZONE ItemType, ZoneID, X, Y 바닥에 떨어졌을때: CGAddMouseToZone, CGDissectionCorpse // ////////////////////////////////////////////////////////////////////// @@ -24,9 +24,9 @@ // // class GCBloodBibleStatus; // -// Ư ÷̾ BloodBibleStatus ٸ ÷̾鿡 εijƮ -// ϴ Ŷ̴. ο ij͸ BloodBibleStatus Ʈ Ÿ -// ʵ ִ. +// 게임 서버가 특정 플레이어의 BloodBibleStatus 를 다른 플레이어들에게 브로드캐스트 +// 할 때 전송하는 패킷이다. 내부에 캐릭터명과 BloodBibleStatus 스트링을 데이타 +// 필드로 가지고 있다. // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCBloodBibleStatus : public Packet { public: GCBloodBibleStatus() {}; ~GCBloodBibleStatus() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -127,7 +127,7 @@ class GCBloodBibleStatus : public Packet { } private: - ItemType_t m_ItemType; // + ItemType_t m_ItemType; // 피의 성서 종류 ZoneID_t m_ZoneID; @@ -167,7 +167,7 @@ class GCBloodBibleStatusFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCBloodBibleStatusPacketMaxSize , ϶. + // const static GCBloodBibleStatusPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szItemType + szZoneID + szStorage + szBYTE + 255 + szRace + szRace + szZoneCoord + szZoneCoord; } diff --git a/src/Core/GCBloodBibleStatusHandler.cpp b/src/Core/GCBloodBibleStatusHandler.cpp index e3f64a09..ad3ac6b2 100644 --- a/src/Core/GCBloodBibleStatusHandler.cpp +++ b/src/Core/GCBloodBibleStatusHandler.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCBloodBibleStatusHandler::execute(GCBloodBibleStatus* pPacket, Player* pPlayer) diff --git a/src/Core/GCBloodDrainOK1.cpp b/src/Core/GCBloodDrainOK1.cpp index 87a0aa4a..899ac639 100644 --- a/src/Core/GCBloodDrainOK1.cpp +++ b/src/Core/GCBloodDrainOK1.cpp @@ -2,8 +2,8 @@ // // Filename : GCBloodDrainOK1.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -35,14 +35,14 @@ GCBloodDrainOK1::~GCBloodDrainOK1() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCBloodDrainOK1::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); ModifyInfo::read(iStream); @@ -52,12 +52,12 @@ void GCBloodDrainOK1::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCBloodDrainOK1::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); ModifyInfo::write(oStream); diff --git a/src/Core/GCBloodDrainOK1.h b/src/Core/GCBloodDrainOK1.h index 24b7a073..d23214c9 100644 --- a/src/Core/GCBloodDrainOK1.h +++ b/src/Core/GCBloodDrainOK1.h @@ -2,7 +2,7 @@ // // Filename : GCBloodDrainOK1.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCBloodDrainOK1; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCBloodDrainOK1 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCBloodDrainOK1 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + ModifyInfo::getPacketSize(); } diff --git a/src/Core/GCBloodDrainOK2.cpp b/src/Core/GCBloodDrainOK2.cpp index 45bbd152..c688e7cf 100644 --- a/src/Core/GCBloodDrainOK2.cpp +++ b/src/Core/GCBloodDrainOK2.cpp @@ -2,8 +2,8 @@ // // Filename : GCBloodDrainOK2.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -36,14 +36,14 @@ GCBloodDrainOK2::~GCBloodDrainOK2() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCBloodDrainOK2::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); ModifyInfo::read(iStream); __END_CATCH @@ -51,12 +51,12 @@ void GCBloodDrainOK2::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCBloodDrainOK2::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); ModifyInfo::write(oStream); diff --git a/src/Core/GCBloodDrainOK2.h b/src/Core/GCBloodDrainOK2.h index db492831..c8518367 100644 --- a/src/Core/GCBloodDrainOK2.h +++ b/src/Core/GCBloodDrainOK2.h @@ -2,7 +2,7 @@ // // Filename : GCBloodDrainOK2.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCBloodDrainOK2; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCBloodDrainOK2 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCBloodDrainOK2 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + ModifyInfo::getPacketSize(); } diff --git a/src/Core/GCBloodDrainOK3.cpp b/src/Core/GCBloodDrainOK3.cpp index 697e4820..44a0f75f 100644 --- a/src/Core/GCBloodDrainOK3.cpp +++ b/src/Core/GCBloodDrainOK3.cpp @@ -2,8 +2,8 @@ // // Filename : GCBloodDrainOK3.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -35,14 +35,14 @@ GCBloodDrainOK3::~GCBloodDrainOK3() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCBloodDrainOK3::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_TargetObjectID); @@ -51,12 +51,12 @@ void GCBloodDrainOK3::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCBloodDrainOK3::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_TargetObjectID); diff --git a/src/Core/GCBloodDrainOK3.h b/src/Core/GCBloodDrainOK3.h index 6e8182a8..0814c436 100644 --- a/src/Core/GCBloodDrainOK3.h +++ b/src/Core/GCBloodDrainOK3.h @@ -2,7 +2,7 @@ // // Filename : GCBloodDrainOK3.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCBloodDrainOK3; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCBloodDrainOK3 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCBloodDrainOK3 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szObjectID; } diff --git a/src/Core/GCCannotAdd.cpp b/src/Core/GCCannotAdd.cpp index cd6ef4b2..e56448b8 100644 --- a/src/Core/GCCannotAdd.cpp +++ b/src/Core/GCCannotAdd.cpp @@ -2,8 +2,8 @@ // // Filename : GCCannotAdd.cc // Written By : elca@ewestsoft.com -// Description : CGMove ڱ ڽſ OK -// Ŷ Ŭ Լ +// Description : CGMove가 날아 왓을때 자기 자신에게 OK 사인을 날리기 +// 위한 패킷 클래스 함수 정의 // ////////////////////////////////////////////////////////////////////// @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCCannotAdd::read(SocketInputStream& iStream) @@ -26,7 +26,7 @@ void GCCannotAdd::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCCannotAdd::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCCannotAdd.h b/src/Core/GCCannotAdd.h index 4d02f4de..ca3e3aab 100644 --- a/src/Core/GCCannotAdd.h +++ b/src/Core/GCCannotAdd.h @@ -24,10 +24,10 @@ class GCCannotAdd : public Packet { public: GCCannotAdd() {}; ~GCCannotAdd() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -40,7 +40,7 @@ class GCCannotAdd : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCCannotAddPacketSize ؼ ϶. + // const static GCCannotAddPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szObjectID; } @@ -95,7 +95,7 @@ class GCCannotAddFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCCannotAddPacketSize ؼ ϶. + // const static GCCannotAddPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID; } diff --git a/src/Core/GCCannotUse.cpp b/src/Core/GCCannotUse.cpp index b496864e..d4941802 100644 --- a/src/Core/GCCannotUse.cpp +++ b/src/Core/GCCannotUse.cpp @@ -2,8 +2,8 @@ // // Filename : GCCannotUse.cc // Written By : elca@ewestsoft.com -// Description : CGMove ڱ ڽſ OK -// Ŷ Ŭ Լ +// Description : CGMove가 날아 왓을때 자기 자신에게 OK 사인을 날리기 +// 위한 패킷 클래스 함수 정의 // ////////////////////////////////////////////////////////////////////// @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCCannotUse::read(SocketInputStream& iStream) @@ -26,7 +26,7 @@ void GCCannotUse::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCCannotUse::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCCannotUse.h b/src/Core/GCCannotUse.h index c51c04fb..2dc0b776 100644 --- a/src/Core/GCCannotUse.h +++ b/src/Core/GCCannotUse.h @@ -24,10 +24,10 @@ class GCCannotUse : public Packet { public: GCCannotUse() {}; ~GCCannotUse() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -40,7 +40,7 @@ class GCCannotUse : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCCannotUsePacketSize ؼ ϶. + // const static GCCannotUsePacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szObjectID; } @@ -95,7 +95,7 @@ class GCCannotUseFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCCannotUsePacketSize ؼ ϶. + // const static GCCannotUsePacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID; } diff --git a/src/Core/GCCastingSkill.cpp b/src/Core/GCCastingSkill.cpp index a5332836..8b84f119 100644 --- a/src/Core/GCCastingSkill.cpp +++ b/src/Core/GCCastingSkill.cpp @@ -2,7 +2,7 @@ // // Filename : GCCastingSkill.cc // Written By : elca@ewestsoft.com -// Description : Skill ִ Ŷ +// Description : Skill이 실패 했을때 날려주는 패킷의 멤버 정의 // ////////////////////////////////////////////////////////////////////// @@ -30,7 +30,7 @@ GCCastingSkill::~GCCastingSkill() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCCastingSkill::read(SocketInputStream& iStream) @@ -44,7 +44,7 @@ void GCCastingSkill::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCCastingSkill::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCCastingSkill.h b/src/Core/GCCastingSkill.h index fb1a4546..d7fda9f0 100644 --- a/src/Core/GCCastingSkill.h +++ b/src/Core/GCCastingSkill.h @@ -2,7 +2,7 @@ // // Filename : GCCastingSkill.h // Written By : elca@ewestsoft.com -// Description : +// Description : Å // // ////////////////////////////////////////////////////////////////////// @@ -32,10 +32,10 @@ class GCCastingSkill : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // ÀԷ½ºÆ®¸²(¹öÆÛ)À¸·ÎºÎÅÍ µ¥ÀÌŸ¸¦ Àо ÆÐŶÀ» ÃʱâÈ­ÇÑ´Ù. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // Ãâ·Â½ºÆ®¸²(¹öÆÛ)À¸·Î ÆÐŶÀÇ ¹ÙÀ̳ʸ® À̹ÌÁö¸¦ º¸³½´Ù. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/GCChangeDarkLight.cpp b/src/Core/GCChangeDarkLight.cpp index 11f8ee83..8498daae 100644 --- a/src/Core/GCChangeDarkLight.cpp +++ b/src/Core/GCChangeDarkLight.cpp @@ -10,7 +10,7 @@ //-------------------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void GCChangeDarkLight::read(SocketInputStream& iStream) @@ -25,7 +25,7 @@ void GCChangeDarkLight::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCChangeDarkLight::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCChangeDarkLight.h b/src/Core/GCChangeDarkLight.h index 0701213f..093b3592 100644 --- a/src/Core/GCChangeDarkLight.h +++ b/src/Core/GCChangeDarkLight.h @@ -23,10 +23,10 @@ class GCChangeDarkLight : public Packet { public: GCChangeDarkLight() {}; ~GCChangeDarkLight() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -39,7 +39,7 @@ class GCChangeDarkLight : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCChangeDarkLightPacketSize , ϶. + // const static GCChangeDarkLightPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szDarkLevel + szLightLevel; } @@ -71,10 +71,10 @@ class GCChangeDarkLight : public Packet { public: - // ӱ(0 - 15) + // 존의 어둡기(0 - 15) DarkLevel_t m_DarkLevel; - // ũ(1 - 13) + // 존의 빛의 크기(1 - 13) LightLevel_t m_LightLevel; }; @@ -106,7 +106,7 @@ class GCChangeDarkLightFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCChangeDarkLightPacketSize , ϶. + // const static GCChangeDarkLightPacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szDarkLevel + szLightLevel; } diff --git a/src/Core/GCChangeInventoryItemNum.cpp b/src/Core/GCChangeInventoryItemNum.cpp index 6eaf0407..8586a781 100644 --- a/src/Core/GCChangeInventoryItemNum.cpp +++ b/src/Core/GCChangeInventoryItemNum.cpp @@ -2,8 +2,8 @@ // // Filename : GCChangeInventoryItemNum.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -37,14 +37,14 @@ GCChangeInventoryItemNum::~GCChangeInventoryItemNum() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCChangeInventoryItemNum::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ChangedItemListNum); int i; @@ -65,12 +65,12 @@ void GCChangeInventoryItemNum::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCChangeInventoryItemNum::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ChangedItemListNum); for (list::const_iterator itr = m_ChangedItemList.begin(); itr != m_ChangedItemList.end(); itr++) { @@ -88,7 +88,7 @@ void GCChangeInventoryItemNum::write(SocketOutputStream& oStream) const { // // GCChangeInventoryItemNum::addListElement() // -// (ȭ, ȭġ ) Ʈ ֱ Լ. +// (변화부위, 변화수치 ) 의 한 셋을 리스트에 넣기 위한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCChangeInventoryItemNum::addChangedItemListElement(ObjectID_t id, ItemNum_t num) @@ -96,11 +96,11 @@ void GCChangeInventoryItemNum::addChangedItemListElement(ObjectID_t id, ItemNum_ { __BEGIN_TRY - // ϴ List ִ´. + // 변하는 것이 무엇인지 List에 넣는다. m_ChangedItemList.push_back(id); m_ChangedItemNumList.push_back(num); - // ȭ ϳ Ų. + // 변화 셋의 갯수를 하나 증가 시킨다. m_ChangedItemListNum++; __END_CATCH diff --git a/src/Core/GCChangeInventoryItemNum.h b/src/Core/GCChangeInventoryItemNum.h index cf7c221c..24cd3f4e 100644 --- a/src/Core/GCChangeInventoryItemNum.h +++ b/src/Core/GCChangeInventoryItemNum.h @@ -2,7 +2,7 @@ // // Filename : GCChangeInventoryItemNum.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCChangeInventoryItemNum; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCChangeInventoryItemNum { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; PacketSize_t getPacketSize() const { @@ -80,9 +80,9 @@ class GCChangeInventoryItemNum { // List Element Number BYTE m_ChangedItemListNum; - // Inventory Item List - list m_ChangedItemList; // Item object id - list m_ChangedItemNumList; // Item object id . + // 수량등이 변경된 Inventory내의 Item List + list m_ChangedItemList; // 변경될 Item object id + list m_ChangedItemNumList; // 변경될 Item object id의 변경 수량. }; #endif diff --git a/src/Core/GCChangeShape.cpp b/src/Core/GCChangeShape.cpp index edfd6272..dc116007 100644 --- a/src/Core/GCChangeShape.cpp +++ b/src/Core/GCChangeShape.cpp @@ -36,7 +36,7 @@ GCChangeShape::~GCChangeShape() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCChangeShape::read(SocketInputStream& iStream) @@ -55,7 +55,7 @@ void GCChangeShape::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCChangeShape::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCChangeShape.h b/src/Core/GCChangeShape.h index 9847284b..e6090a74 100644 --- a/src/Core/GCChangeShape.h +++ b/src/Core/GCChangeShape.h @@ -23,8 +23,8 @@ // // class GCChangeShape; // -// Ư ڰ ٴ Ŭ̾Ʈ -// ϴ Ŷ ü̴.(CreatureID,X,Y,DIR) Ѵ. +// 게임 서버에서 특정 사용자가 움직였다는 정보를 클라이언트로 보내줄 +// 때 사용하는 패킷 객체이다.(CreatureID,X,Y,DIR) 을 포함한다. // ////////////////////////////////////////////////////////////////////// @@ -38,10 +38,10 @@ class GCChangeShape : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -53,7 +53,7 @@ class GCChangeShape : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szBYTE + szItemType + szOptionType + szSpeed + szBYTE; } @@ -114,7 +114,7 @@ class GCChangeShape : public Packet { } private: - // ũó ̵ + // 크리처 아이디 ObjectID_t m_ObjectID; // Item Class diff --git a/src/Core/GCChangeWeather.cpp b/src/Core/GCChangeWeather.cpp index 442b8291..07735b2d 100644 --- a/src/Core/GCChangeWeather.cpp +++ b/src/Core/GCChangeWeather.cpp @@ -10,7 +10,7 @@ //-------------------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void GCChangeWeather::read(SocketInputStream& iStream) @@ -28,7 +28,7 @@ void GCChangeWeather::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCChangeWeather::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCChangeWeather.h b/src/Core/GCChangeWeather.h index 9be4a355..e26483d3 100644 --- a/src/Core/GCChangeWeather.h +++ b/src/Core/GCChangeWeather.h @@ -23,10 +23,10 @@ class GCChangeWeather : public Packet { public: GCChangeWeather() {}; ~GCChangeWeather() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -39,7 +39,7 @@ class GCChangeWeather : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCChangeWeatherPacketSize , ϶. + // const static GCChangeWeatherPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szWeather + szWeatherLevel; } @@ -101,7 +101,7 @@ class GCChangeWeatherFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCChangeWeatherPacketSize , ϶. + // const static GCChangeWeatherPacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szWeather + szWeatherLevel; } diff --git a/src/Core/GCCreateItem.cpp b/src/Core/GCCreateItem.cpp index 66f8680b..7b1670bb 100644 --- a/src/Core/GCCreateItem.cpp +++ b/src/Core/GCCreateItem.cpp @@ -28,7 +28,7 @@ GCCreateItem::GCCreateItem() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCCreateItem::read(SocketInputStream& iStream) @@ -59,7 +59,7 @@ void GCCreateItem::read(SocketInputStream& iStream) } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCCreateItem::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCCreateItem.h b/src/Core/GCCreateItem.h index 15f731b7..be234b8a 100644 --- a/src/Core/GCCreateItem.h +++ b/src/Core/GCCreateItem.h @@ -29,17 +29,17 @@ class GCCreateItem : public Packet { return PACKET_GC_CREATE_ITEM; } PacketSize_t getPacketSize() const { - return szObjectID + // Ʈ ID - szBYTE + // Ŭ - szItemType + // Ÿ - szBYTE + m_OptionType.size() + // ɼ - szDurability + // - szSilver + // ݷ - szGrade + // - szEnchantLevel + // æƮ - szItemNum + // - szCoordInven + // X ǥ - szCoordInven; // Y ǥ + return szObjectID + // 아이템 오브젝트 ID + szBYTE + // 아이템 클래스 + szItemType + // 아이템 타입 + szBYTE + m_OptionType.size() + // 아이템 옵션 + szDurability + // 아이템 내구도 + szSilver + // 아이템 은 도금량 + szGrade + // 아이템 등급 + szEnchantLevel + // 아이템 인챈트 레벨 + szItemNum + // 아이템 숫자 + szCoordInven + // 아이템 X 좌표 + szCoordInven; // 아이템 Y 좌표 } string getPacketName() const { return "GCCreateItem"; @@ -138,17 +138,17 @@ class GCCreateItem : public Packet { } private: - ObjectID_t m_ObjectID; // Ʈ ID - BYTE m_ItemClass; // Ŭ - ItemType_t m_ItemType; // Ÿ - list m_OptionType; // ɼ Ÿ - Durability_t m_Durability; // - Silver_t m_Silver; // ݷ - Grade_t m_Grade; // - EnchantLevel_t m_EnchantLevel; // æƮ - ItemNum_t m_ItemNum; // - CoordInven_t m_InvenX; // κ丮 X ǥ - CoordInven_t m_InvenY; // κ丮 Y ǥ + ObjectID_t m_ObjectID; // 오브젝트 ID + BYTE m_ItemClass; // 아이템 클래스 + ItemType_t m_ItemType; // 아이템 타입 + list m_OptionType; // 옵션 타입 + Durability_t m_Durability; // 내구성 + Silver_t m_Silver; // 은 도금량 + Grade_t m_Grade; // 아이템 등급 + EnchantLevel_t m_EnchantLevel; // 인챈트 레벨 + ItemNum_t m_ItemNum; // 아이템의 숫자 + CoordInven_t m_InvenX; // 인벤토리 X 좌표 + CoordInven_t m_InvenY; // 인벤토리 Y 좌표 }; @@ -168,17 +168,17 @@ class GCCreateItemFactory : public PacketFactory { return Packet::PACKET_GC_CREATE_ITEM; } PacketSize_t getPacketMaxSize() const { - return szObjectID + // Ʈ ID - szBYTE + // Ŭ - szItemType + // Ÿ - szBYTE + 255 + // ɼ - szDurability + // - szSilver + // ݷ - szGrade + // - szEnchantLevel + // æƮ - szItemNum + // - szCoordInven + // X ǥ - szCoordInven; // Y ǥ + return szObjectID + // 아이템 오브젝트 ID + szBYTE + // 아이템 클래스 + szItemType + // 아이템 타입 + szBYTE + 255 + // 아이템 옵션 + szDurability + // 아이템 내구도 + szSilver + // 아이템 은 도금량 + szGrade + // 아이템 등급 + szEnchantLevel + // 아이템 인챈트 레벨 + szItemNum + // 아이템 숫자 + szCoordInven + // 아이템 X 좌표 + szCoordInven; // 아이템 Y 좌표 } }; diff --git a/src/Core/GCCreatureDied.cpp b/src/Core/GCCreatureDied.cpp index b65e4e67..455ae16a 100644 --- a/src/Core/GCCreatureDied.cpp +++ b/src/Core/GCCreatureDied.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCCreatureDied::read(SocketInputStream& iStream) @@ -26,7 +26,7 @@ void GCCreatureDied::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCCreatureDied::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCCreatureDied.h b/src/Core/GCCreatureDied.h index 6952403e..fa332a14 100644 --- a/src/Core/GCCreatureDied.h +++ b/src/Core/GCCreatureDied.h @@ -18,9 +18,9 @@ // // class GCCreatureDied; // -// Ư ÷̾ CreatureDied ٸ ÷̾鿡 εijƮ -// ϴ Ŷ̴. ο ij͸ CreatureDied Ʈ Ÿ -// ʵ ִ. +// 게임 서버가 특정 플레이어의 CreatureDied 를 다른 플레이어들에게 브로드캐스트 +// 할 때 전송하는 패킷이다. 내부에 캐릭터명과 CreatureDied 스트링을 데이타 +// 필드로 가지고 있다. // ////////////////////////////////////////////////////////////////////// @@ -28,10 +28,10 @@ class GCCreatureDied : public Packet { public: GCCreatureDied() {}; ~GCCreatureDied() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -97,7 +97,7 @@ class GCCreatureDiedFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCCreatureDiedPacketMaxSize , ϶. + // const static GCCreatureDiedPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID; } diff --git a/src/Core/GCCreatureDiedHandler.cpp b/src/Core/GCCreatureDiedHandler.cpp index 55af4100..a27385db 100644 --- a/src/Core/GCCreatureDiedHandler.cpp +++ b/src/Core/GCCreatureDiedHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCCreatureDiedHandler::execute(GCCreatureDied* pPacket, Player* pPlayer) diff --git a/src/Core/GCCrossCounterOK1.cpp b/src/Core/GCCrossCounterOK1.cpp index be88ede6..14d6cc75 100644 --- a/src/Core/GCCrossCounterOK1.cpp +++ b/src/Core/GCCrossCounterOK1.cpp @@ -2,8 +2,8 @@ // // Filename : GCCrossCounterOK1.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -35,14 +35,14 @@ GCCrossCounterOK1::~GCCrossCounterOK1() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCCrossCounterOK1::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); ModifyInfo::read(iStream); @@ -54,12 +54,12 @@ void GCCrossCounterOK1::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCCrossCounterOK1::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); ModifyInfo::write(oStream); diff --git a/src/Core/GCCrossCounterOK1.h b/src/Core/GCCrossCounterOK1.h index ae3c6987..93c56dad 100644 --- a/src/Core/GCCrossCounterOK1.h +++ b/src/Core/GCCrossCounterOK1.h @@ -2,7 +2,7 @@ // // Filename : GCCrossCounterOK1.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCCrossCounterOK1; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCCrossCounterOK1 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCCrossCounterOK1 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + ModifyInfo::getPacketSize() + szSkillType; } diff --git a/src/Core/GCCrossCounterOK2.cpp b/src/Core/GCCrossCounterOK2.cpp index f4a5fac2..44a99c05 100644 --- a/src/Core/GCCrossCounterOK2.cpp +++ b/src/Core/GCCrossCounterOK2.cpp @@ -2,8 +2,8 @@ // // Filename : GCCrossCounterOK2.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -36,14 +36,14 @@ GCCrossCounterOK2::~GCCrossCounterOK2() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCCrossCounterOK2::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); ModifyInfo::read(iStream); iStream.read(m_SkillType); @@ -53,12 +53,12 @@ void GCCrossCounterOK2::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCCrossCounterOK2::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); ModifyInfo::write(oStream); oStream.write(m_SkillType); diff --git a/src/Core/GCCrossCounterOK2.h b/src/Core/GCCrossCounterOK2.h index 5fff3677..a4d2fa32 100644 --- a/src/Core/GCCrossCounterOK2.h +++ b/src/Core/GCCrossCounterOK2.h @@ -2,7 +2,7 @@ // // Filename : GCCrossCounterOK2.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCCrossCounterOK2; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCCrossCounterOK2 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCCrossCounterOK2 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + ModifyInfo::getPacketSize() + szSkillType; } diff --git a/src/Core/GCCrossCounterOK3.cpp b/src/Core/GCCrossCounterOK3.cpp index 8df542ff..30a3f5d3 100644 --- a/src/Core/GCCrossCounterOK3.cpp +++ b/src/Core/GCCrossCounterOK3.cpp @@ -2,8 +2,8 @@ // // Filename : GCCrossCounterOK3.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -35,14 +35,14 @@ GCCrossCounterOK3::~GCCrossCounterOK3() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCCrossCounterOK3::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_TargetObjectID); iStream.read(m_SkillType); @@ -52,12 +52,12 @@ void GCCrossCounterOK3::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCCrossCounterOK3::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_TargetObjectID); oStream.write(m_SkillType); diff --git a/src/Core/GCCrossCounterOK3.h b/src/Core/GCCrossCounterOK3.h index b304be2f..76c66ea8 100644 --- a/src/Core/GCCrossCounterOK3.h +++ b/src/Core/GCCrossCounterOK3.h @@ -2,7 +2,7 @@ // // Filename : GCCrossCounterOK3.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCCrossCounterOK3; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCCrossCounterOK3 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCCrossCounterOK3 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szObjectID + szSkillType; } diff --git a/src/Core/GCDeleteEffectFromTile.cpp b/src/Core/GCDeleteEffectFromTile.cpp index eb65137f..50f9e6f4 100644 --- a/src/Core/GCDeleteEffectFromTile.cpp +++ b/src/Core/GCDeleteEffectFromTile.cpp @@ -33,14 +33,14 @@ GCDeleteEffectFromTile::~GCDeleteEffectFromTile() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCDeleteEffectFromTile::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_X); iStream.read(m_Y); @@ -51,12 +51,12 @@ void GCDeleteEffectFromTile::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCDeleteEffectFromTile::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_X); oStream.write(m_Y); diff --git a/src/Core/GCDeleteEffectFromTile.h b/src/Core/GCDeleteEffectFromTile.h index 209adae2..12fed71d 100644 --- a/src/Core/GCDeleteEffectFromTile.h +++ b/src/Core/GCDeleteEffectFromTile.h @@ -2,7 +2,7 @@ // // Filename : GCDeleteEffectFromTile.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCDeleteEffectFromTile; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCDeleteEffectFromTile : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCDeleteEffectFromTile : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szCoord * 2 + szEffectID; } diff --git a/src/Core/GCDeleteInventoryItem.cpp b/src/Core/GCDeleteInventoryItem.cpp index 29b14ec0..18daebd3 100644 --- a/src/Core/GCDeleteInventoryItem.cpp +++ b/src/Core/GCDeleteInventoryItem.cpp @@ -10,7 +10,7 @@ #include "GCDeleteInventoryItem.h" ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCDeleteInventoryItem::read(SocketInputStream& iStream) @@ -24,7 +24,7 @@ void GCDeleteInventoryItem::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCDeleteInventoryItem::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCDeleteInventoryItem.h b/src/Core/GCDeleteInventoryItem.h index f5219d71..8489d8f7 100644 --- a/src/Core/GCDeleteInventoryItem.h +++ b/src/Core/GCDeleteInventoryItem.h @@ -28,10 +28,10 @@ class GCDeleteInventoryItem : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/GCDeleteObject.cpp b/src/Core/GCDeleteObject.cpp index 5c3278cf..4aaf561e 100644 --- a/src/Core/GCDeleteObject.cpp +++ b/src/Core/GCDeleteObject.cpp @@ -10,7 +10,7 @@ #include "GCDeleteObject.h" ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCDeleteObject::read(SocketInputStream& iStream) @@ -24,7 +24,7 @@ void GCDeleteObject::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCDeleteObject::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCDeleteObject.h b/src/Core/GCDeleteObject.h index 57212e83..b047ca99 100644 --- a/src/Core/GCDeleteObject.h +++ b/src/Core/GCDeleteObject.h @@ -17,20 +17,20 @@ // // class GCDeleteObject; // -// Ư ü þ߿ 쿡 ۵Ǹ, Ŭ̾Ʈ Ŷ -// Ŷ OID ؼ شǴ ü ãƼ Ŭ̾Ʈ ؾ Ѵ. +// 존의 특정 객체가 시야에서 사라진 경우에 전송되며, 클라이언트는 이 패킷을 받으면 +// 패킷 내부의 OID를 사용해서 해당되는 객체를 찾아서 클라이언트의 존에서 삭제해야 한다. // -// Ŷ ۵Ǵ ü Ȳ ̴. +// 다음은 이 패킷이 전송되는 구체적인 상황의 예시이다. // -//(1) PC α׾ƿ -//(2) ũó ݴ -//(3) Ư Ʈ -//(4) ü +//(1) PC가 로그아웃한 경우 +//(2) 아이템을 크리처가 줍는 경우 +//(3) 특정 이펙트가 사라진 경우 +//(4) 시체가 사라진 경우 // // *CAUTION* // -//(3) Ư Ʈ .. Ʈ , ð ۵DZ -// , Ǿ ̴. -_-; +//(3) 특정 이펙트가 사라진 경우.. 는 이펙트가 생성될 때, 사라지는 시간이 전송되기 +// 때문에, 삭제되어도 무방할 것이다. -_-; // //-------------------------------------------------------------------------------- @@ -43,10 +43,10 @@ class GCDeleteObject : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/GCDeleteandPickUpOK.cpp b/src/Core/GCDeleteandPickUpOK.cpp index b42eae74..f4c65bd9 100644 --- a/src/Core/GCDeleteandPickUpOK.cpp +++ b/src/Core/GCDeleteandPickUpOK.cpp @@ -2,8 +2,8 @@ // // Filename : GCDeleteandPickUpOK.cc // Written By : elca@ewestsoft.com -// Description : CGMove ڱ ڽſ OK -// Ŷ Ŭ Լ +// Description : CGMove가 날아 왓을때 자기 자신에게 OK 사인을 날리기 +// 위한 패킷 클래스 함수 정의 // ////////////////////////////////////////////////////////////////////// @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCDeleteandPickUpOK::read(SocketInputStream& iStream) @@ -26,7 +26,7 @@ void GCDeleteandPickUpOK::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCDeleteandPickUpOK::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCDisconnect.cpp b/src/Core/GCDisconnect.cpp index 8e72bc1f..48479080 100644 --- a/src/Core/GCDisconnect.cpp +++ b/src/Core/GCDisconnect.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCDisconnect::read(SocketInputStream& iStream) @@ -35,7 +35,7 @@ void GCDisconnect::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCDisconnect::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCDisconnect.h b/src/Core/GCDisconnect.h index b4aebdb9..ce48fc3c 100644 --- a/src/Core/GCDisconnect.h +++ b/src/Core/GCDisconnect.h @@ -23,10 +23,10 @@ class GCDisconnect : public Packet { public: GCDisconnect() {}; ~GCDisconnect() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -91,7 +91,7 @@ class GCDisconnectFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCDisconnectPacketMaxSize , ϶. + // const static GCDisconnectPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + 128; } diff --git a/src/Core/GCDisconnectHandler.cpp b/src/Core/GCDisconnectHandler.cpp index c2aa7e4e..e93627eb 100644 --- a/src/Core/GCDisconnectHandler.cpp +++ b/src/Core/GCDisconnectHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCDisconnectHandler::execute(GCDisconnect* pPacket, Player* pPlayer) diff --git a/src/Core/GCDownSkillFailed.cpp b/src/Core/GCDownSkillFailed.cpp index 2f58d615..a128c9d1 100644 --- a/src/Core/GCDownSkillFailed.cpp +++ b/src/Core/GCDownSkillFailed.cpp @@ -2,7 +2,7 @@ // // Filename : GCDownSkillFailed.cc // Written By : elca@ewestsoft.com -// Description : Skill ִ Ŷ +// Description : Skill이 실패 했을때 날려주는 패킷의 멤버 정의 // ////////////////////////////////////////////////////////////////////// @@ -26,7 +26,7 @@ GCDownSkillFailed::~GCDownSkillFailed() } ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCDownSkillFailed::read(SocketInputStream& iStream) @@ -41,7 +41,7 @@ void GCDownSkillFailed::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCDownSkillFailed::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCDownSkillFailed.h b/src/Core/GCDownSkillFailed.h index 46d763de..3e267d09 100644 --- a/src/Core/GCDownSkillFailed.h +++ b/src/Core/GCDownSkillFailed.h @@ -29,10 +29,10 @@ class GCDownSkillFailed : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -74,8 +74,8 @@ class GCDownSkillFailed : public Packet { private: SkillType_t m_SkillType; - BYTE m_Desc; // ̴. - // ڼ CGDownSkillHandler ϵ. + BYTE m_Desc; // 기술을 배우는 데 실패한 이유이다. + // 자세한 내용은 CGDownSkillHandler를 참고하도록. }; diff --git a/src/Core/GCDownSkillOK.cpp b/src/Core/GCDownSkillOK.cpp index 03421dac..4605d2f6 100644 --- a/src/Core/GCDownSkillOK.cpp +++ b/src/Core/GCDownSkillOK.cpp @@ -2,7 +2,7 @@ // // Filename : GCDownSkillOK.cc // Written By : elca@ewestsoft.com -// Description : Skill ִ Ŷ +// Description : Skill이 실패 했을때 날려주는 패킷의 멤버 정의 // ////////////////////////////////////////////////////////////////////// @@ -30,7 +30,7 @@ GCDownSkillOK::~GCDownSkillOK() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCDownSkillOK::read(SocketInputStream& iStream) @@ -42,7 +42,7 @@ void GCDownSkillOK::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCDownSkillOK::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCDownSkillOK.h b/src/Core/GCDownSkillOK.h index 05cb3c8c..fb0a47ac 100644 --- a/src/Core/GCDownSkillOK.h +++ b/src/Core/GCDownSkillOK.h @@ -2,7 +2,7 @@ // // Filename : GCDownSkillOK.h // Written By : elca@ewestsoft.com -// Description : +// Description : Å // // ////////////////////////////////////////////////////////////////////// @@ -32,10 +32,10 @@ class GCDownSkillOK : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // ÀԷ½ºÆ®¸²(¹öÆÛ)À¸·ÎºÎÅÍ µ¥ÀÌŸ¸¦ Àо ÆÐŶÀ» ÃʱâÈ­ÇÑ´Ù. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // Ãâ·Â½ºÆ®¸²(¹öÆÛ)À¸·Î ÆÐŶÀÇ ¹ÙÀ̳ʸ® À̹ÌÁö¸¦ º¸³½´Ù. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/GCDropItemToZone.h b/src/Core/GCDropItemToZone.h index 0d919485..5f018468 100644 --- a/src/Core/GCDropItemToZone.h +++ b/src/Core/GCDropItemToZone.h @@ -90,7 +90,7 @@ class GCDropItemToZoneFactory : public PacketFactory { // get packet's body size // *OPTIMIZATION HINT* - // const static GCDropItemToZonePacketSize , ϶. + // const static GCDropItemToZonePacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szCoord + szCoord + szBYTE + szItemType + szBYTE + 255 + szDurability + szItemNum + szBYTE + (szObjectID + szBYTE + szItemType + szItemNum + szSlotID) * 12 + szObjectID; diff --git a/src/Core/GCEnterVampirePortal.h b/src/Core/GCEnterVampirePortal.h index 101d7b32..9f0d4215 100644 --- a/src/Core/GCEnterVampirePortal.h +++ b/src/Core/GCEnterVampirePortal.h @@ -2,8 +2,8 @@ // Filename : GCEnterVampirePortal.h // Written By : excel96 // Description : -// ̾ ̾ Ż  , -// εijõǴ Ŷ̴. +// 뱀파이어가 뱀파이어 포탈에 들어가서 사라지는 경우, +// 주위에 브로드캐스팅되는 패킷이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_ENTER_VAMPIRE_PORTAL_H__ diff --git a/src/Core/GCExecuteElement.cpp b/src/Core/GCExecuteElement.cpp index 0a97a5ad..015939a7 100644 --- a/src/Core/GCExecuteElement.cpp +++ b/src/Core/GCExecuteElement.cpp @@ -2,8 +2,8 @@ // // Filename : GCExecuteElement.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCExecuteElement.h b/src/Core/GCExecuteElement.h index 26c4c4d4..3cc558f0 100644 --- a/src/Core/GCExecuteElement.h +++ b/src/Core/GCExecuteElement.h @@ -2,7 +2,7 @@ // Filename : GCExecuteElement.h // Written By : elca@ewestsoft.com // Description : -// Ŷ Ŭ +// 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_EXECUTE_ELEMENT_H__ @@ -15,7 +15,7 @@ ////////////////////////////////////////////////////////////////////////////// // class GCExecuteElement; -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 ////////////////////////////////////////////////////////////////////////////// class GCExecuteElement : public Packet { @@ -70,8 +70,8 @@ class GCExecuteElement : public Packet { private: DWORD m_QuestID; - BYTE m_Condition; // ǿ ִ° 0 : Happen, 1 : Complete, 2 : Fail, 3 : Reward - WORD m_Index; // ش ° elementΰ + BYTE m_Condition; // 어느 조건에 있는가 0 : Happen, 1 : Complete, 2 : Fail, 3 : Reward + WORD m_Index; // 해당 조건의 몇번째 element인가 }; diff --git a/src/Core/GCFakeMove.cpp b/src/Core/GCFakeMove.cpp index 6582c07a..f984d8eb 100644 --- a/src/Core/GCFakeMove.cpp +++ b/src/Core/GCFakeMove.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCFakeMove::read(SocketInputStream& iStream) @@ -27,7 +27,7 @@ void GCFakeMove::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCFakeMove::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCFakeMove.h b/src/Core/GCFakeMove.h index 0549d4f4..b08a6bcd 100644 --- a/src/Core/GCFakeMove.h +++ b/src/Core/GCFakeMove.h @@ -18,8 +18,8 @@ // // class GCFakeMove; // -// Ư ڰ ٴ Ŭ̾Ʈ -// ϴ Ŷ ü̴.(ObjectID,X,Y,DIR) Ѵ. +// 게임 서버에서 특정 사용자가 움직였다는 정보를 클라이언트로 보내줄 +// 때 사용하는 패킷 객체이다.(ObjectID,X,Y,DIR) 을 포함한다. // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCFakeMove : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCFakeMove : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCFakeMovePacketSize , ϶. + // const static GCFakeMovePacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szObjectID + 2 * szCoord; } @@ -87,8 +87,8 @@ class GCFakeMove : public Packet { private: - ObjectID_t m_ObjectID; // ũó ̵ - Coord_t m_ToX, m_ToY; // ǥ + ObjectID_t m_ObjectID; // 크리처 아이디 + Coord_t m_ToX, m_ToY; // 도착좌표 }; @@ -119,7 +119,7 @@ class GCFakeMoveFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCFakeMovePacketSize , ϶. + // const static GCFakeMovePacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + 2 * szCoord; } diff --git a/src/Core/GCFastMove.cpp b/src/Core/GCFastMove.cpp index d13047cc..d13e408b 100644 --- a/src/Core/GCFastMove.cpp +++ b/src/Core/GCFastMove.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCFastMove::read(SocketInputStream& iStream) @@ -30,7 +30,7 @@ void GCFastMove::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCFastMove::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCFlagWarStatus.cpp b/src/Core/GCFlagWarStatus.cpp index 0d418590..35daf186 100644 --- a/src/Core/GCFlagWarStatus.cpp +++ b/src/Core/GCFlagWarStatus.cpp @@ -2,8 +2,8 @@ // // Filename : GCFlagWarStatus.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -33,7 +33,7 @@ GCFlagWarStatus::~GCFlagWarStatus() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCFlagWarStatus::read(SocketInputStream& iStream) @@ -50,7 +50,7 @@ void GCFlagWarStatus::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCFlagWarStatus::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/GCFlagWarStatus.h b/src/Core/GCFlagWarStatus.h index e8995fff..8b2be20f 100644 --- a/src/Core/GCFlagWarStatus.h +++ b/src/Core/GCFlagWarStatus.h @@ -2,7 +2,7 @@ // Filename : GCFlagWarStatus.h // Written By : elca@ewestsoft.com // Description : -// Ŷ Ŭ +// 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_FLAG_WAR_STATUS_H__ @@ -15,7 +15,7 @@ ////////////////////////////////////////////////////////////////////////////// // class GCFlagWarStatus; -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 ////////////////////////////////////////////////////////////////////////////// class GCFlagWarStatus : public Packet { diff --git a/src/Core/GCGQuestInventory.h b/src/Core/GCGQuestInventory.h index 7882a5bc..761cb107 100644 --- a/src/Core/GCGQuestInventory.h +++ b/src/Core/GCGQuestInventory.h @@ -2,7 +2,7 @@ // Filename : GCGQuestInventory.h // Written By : elca@ewestsoft.com // Description : -// Ŷ Ŭ +// 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_GQUEST_INVENTORY_H__ @@ -19,7 +19,7 @@ ////////////////////////////////////////////////////////////////////////////// // class GCGQuestInventory; -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 ////////////////////////////////////////////////////////////////////////////// class GCGQuestInventory : public Packet { diff --git a/src/Core/GCGQuestStatusInfo.cpp b/src/Core/GCGQuestStatusInfo.cpp index cc4c8d5f..c6060e4d 100644 --- a/src/Core/GCGQuestStatusInfo.cpp +++ b/src/Core/GCGQuestStatusInfo.cpp @@ -2,8 +2,8 @@ // // Filename : GCGQuestStatusInfo.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -41,7 +41,7 @@ GCGQuestStatusInfo::~GCGQuestStatusInfo() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCGQuestStatusInfo::read(SocketInputStream& iStream) @@ -63,14 +63,14 @@ void GCGQuestStatusInfo::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCGQuestStatusInfo::write(SocketOutputStream& oStream) const { __BEGIN_TRY BYTE size = m_Infos.size(); oStream.write(size); - // cout << "Ʈ : " << (int)size << endl; + // cout << "퀘스트 개수 : " << (int)size << endl; list::const_iterator itr = m_Infos.begin(); diff --git a/src/Core/GCGQuestStatusInfo.h b/src/Core/GCGQuestStatusInfo.h index 5c8ede89..3e22d14a 100644 --- a/src/Core/GCGQuestStatusInfo.h +++ b/src/Core/GCGQuestStatusInfo.h @@ -2,7 +2,7 @@ // Filename : GCGQuestStatusInfo.h // Written By : elca@ewestsoft.com // Description : -// Ŷ Ŭ +// 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_GGQUEST_STATUS_INFO_H__ @@ -21,7 +21,7 @@ ////////////////////////////////////////////////////////////////////////////// // class GCGQuestStatusInfo; -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 ////////////////////////////////////////////////////////////////////////////// class GCGQuestStatusInfo : public Packet { diff --git a/src/Core/GCGQuestStatusModify.cpp b/src/Core/GCGQuestStatusModify.cpp index 4a02b1f6..edc846fe 100644 --- a/src/Core/GCGQuestStatusModify.cpp +++ b/src/Core/GCGQuestStatusModify.cpp @@ -2,8 +2,8 @@ // // Filename : GCGQuestStatusModify.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCGQuestStatusModify.h b/src/Core/GCGQuestStatusModify.h index 35275bce..d2a7aa95 100644 --- a/src/Core/GCGQuestStatusModify.h +++ b/src/Core/GCGQuestStatusModify.h @@ -2,7 +2,7 @@ // Filename : GCGQuestStatusModify.h // Written By : elca@ewestsoft.com // Description : -// Ŷ Ŭ +// 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_GQUEST_STATUS_MODIFY_H__ @@ -16,16 +16,16 @@ ////////////////////////////////////////////////////////////////////////////// // class GCGQuestStatusModify; -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 ////////////////////////////////////////////////////////////////////////////// class GCGQuestStatusModify : public Packet { public: enum ModifyType { - NO_MODIFY, // ° ٲ ʾ - CURRENT, // Ʈ ۵Ǿ - SUCCESS, // Ʈ - FAIL, // Ʈ + NO_MODIFY, // 상태가 바뀌지 않았음 + CURRENT, // 퀘스트가 시작되었음 + SUCCESS, // 퀘스트가 성공했음 + FAIL, // 퀘스트가 실패했음 }; GCGQuestStatusModify(); diff --git a/src/Core/GCGetDamage.cpp b/src/Core/GCGetDamage.cpp index 697b8387..3324ab52 100644 --- a/src/Core/GCGetDamage.cpp +++ b/src/Core/GCGetDamage.cpp @@ -2,8 +2,8 @@ // // Filename : GCGetDamage.cc // Written By : elca@ewestsoft.com -// Description : CGMove ڱ ڽſ OK -// Ŷ Ŭ Լ +// Description : CGMove가 날아 왓을때 자기 자신에게 OK 사인을 날리기 +// 위한 패킷 클래스 함수 정의 // ////////////////////////////////////////////////////////////////////// @@ -31,7 +31,7 @@ GCGetDamage::~GCGetDamage() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCGetDamage::read(SocketInputStream& iStream) @@ -44,7 +44,7 @@ void GCGetDamage::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCGetDamage::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCGetDamage.h b/src/Core/GCGetDamage.h index becbcb23..1c4ffffb 100644 --- a/src/Core/GCGetDamage.h +++ b/src/Core/GCGetDamage.h @@ -2,9 +2,9 @@ // // Filename : GCGetDamage.h // Written By : elca@ewestsoft.com -// Description : Ŭ̾Ʈ CGMove Ŷ -// Ŭ̾Ʈ ص ٴ 㰡 -// ִ Ŷ Ŭ̴. +// Description : 클라이언트로 부터 CGMove 패킷이 날라 왔을때 +// 날린 클라이언트에게 무브해도 좋다는 허가를 낼때 +// 보내주는 패킷 클래스이다. // ////////////////////////////////////////////////////////////////////// @@ -21,8 +21,8 @@ // // class GCGetDamage; // -// Ư ڰ ٴ Ŭ̾Ʈ -// ϴ Ŷ ü̴.(CreatureID,X,Y,DIR) Ѵ. +// 게임 서버에서 특정 사용자가 움직였다는 정보를 클라이언트로 보내줄 +// 때 사용하는 패킷 객체이다.(CreatureID,X,Y,DIR) 을 포함한다. // ////////////////////////////////////////////////////////////////////// @@ -36,10 +36,10 @@ class GCGetDamage : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/GCGetOffMotorCycle.h b/src/Core/GCGetOffMotorCycle.h index d8bd755b..7f174a9a 100644 --- a/src/Core/GCGetOffMotorCycle.h +++ b/src/Core/GCGetOffMotorCycle.h @@ -2,7 +2,7 @@ // // Filename : GCGetOffMotorCycle.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCGetOffMotorCycle; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCGetOffMotorCycle : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCGetOffMotorCycle : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID; } diff --git a/src/Core/GCGetOffMotorCycleFailed.cpp b/src/Core/GCGetOffMotorCycleFailed.cpp index 31957cfa..5386c8f7 100644 --- a/src/Core/GCGetOffMotorCycleFailed.cpp +++ b/src/Core/GCGetOffMotorCycleFailed.cpp @@ -2,8 +2,8 @@ // // Filename : GCGetOffMotorCycleFailed.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -33,7 +33,7 @@ GCGetOffMotorCycleFailed::~GCGetOffMotorCycleFailed() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCGetOffMotorCycleFailed::read(SocketInputStream& iStream) @@ -45,7 +45,7 @@ void GCGetOffMotorCycleFailed::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCGetOffMotorCycleFailed::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/GCGetOffMotorCycleFailed.h b/src/Core/GCGetOffMotorCycleFailed.h index 15cf9df0..453130e1 100644 --- a/src/Core/GCGetOffMotorCycleFailed.h +++ b/src/Core/GCGetOffMotorCycleFailed.h @@ -2,7 +2,7 @@ // // Filename : GCGetOffMotorCycleFailed.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCGetOffMotorCycleFailed; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// class GCGetOffMotorCycleFailed : public Packet { @@ -32,10 +32,10 @@ class GCGetOffMotorCycleFailed : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -47,7 +47,7 @@ class GCGetOffMotorCycleFailed : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return 0; } diff --git a/src/Core/GCGetOffMotorCycleOK.cpp b/src/Core/GCGetOffMotorCycleOK.cpp index a300fd90..eaf03a12 100644 --- a/src/Core/GCGetOffMotorCycleOK.cpp +++ b/src/Core/GCGetOffMotorCycleOK.cpp @@ -2,8 +2,8 @@ // // Filename : GCGetOffMotorCycleOK.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -33,7 +33,7 @@ GCGetOffMotorCycleOK::~GCGetOffMotorCycleOK() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCGetOffMotorCycleOK::read(SocketInputStream& iStream) @@ -45,7 +45,7 @@ void GCGetOffMotorCycleOK::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCGetOffMotorCycleOK::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/GCGetOffMotorCycleOK.h b/src/Core/GCGetOffMotorCycleOK.h index 0aba698b..948161b3 100644 --- a/src/Core/GCGetOffMotorCycleOK.h +++ b/src/Core/GCGetOffMotorCycleOK.h @@ -2,7 +2,7 @@ // // Filename : GCGetOffMotorCycleOK.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCGetOffMotorCycleOK; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// class GCGetOffMotorCycleOK : public Packet { @@ -32,10 +32,10 @@ class GCGetOffMotorCycleOK : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -47,7 +47,7 @@ class GCGetOffMotorCycleOK : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return 0; } diff --git a/src/Core/GCGlobalChat.cpp b/src/Core/GCGlobalChat.cpp index f141e0b2..cd5cf41d 100644 --- a/src/Core/GCGlobalChat.cpp +++ b/src/Core/GCGlobalChat.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCGlobalChat::read(SocketInputStream& iStream) @@ -39,7 +39,7 @@ void GCGlobalChat::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCGlobalChat::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCGlobalChat.h b/src/Core/GCGlobalChat.h index 6fef5529..399e3986 100644 --- a/src/Core/GCGlobalChat.h +++ b/src/Core/GCGlobalChat.h @@ -18,9 +18,9 @@ // // class GCGlobalChat; // -// Ư ÷̾ GlobalChat ٸ ÷̾鿡 εijƮ -// ϴ Ŷ̴. ο ij͸ GlobalChat Ʈ Ÿ -// ʵ ִ. +// 게임 서버가 특정 플레이어의 GlobalChat 를 다른 플레이어들에게 브로드캐스트 +// 할 때 전송하는 패킷이다. 내부에 캐릭터명과 GlobalChat 스트링을 데이타 +// 필드로 가지고 있다. // ////////////////////////////////////////////////////////////////////// @@ -28,10 +28,10 @@ class GCGlobalChat : public Packet { public: GCGlobalChat() {}; ~GCGlobalChat() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -119,7 +119,7 @@ class GCGlobalChatFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCGlobalChatPacketMaxSize , ϶. + // const static GCGlobalChatPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szuint + szBYTE + 128 + szBYTE; } diff --git a/src/Core/GCGlobalChatHandler.cpp b/src/Core/GCGlobalChatHandler.cpp index cba735bc..13a03a70 100644 --- a/src/Core/GCGlobalChatHandler.cpp +++ b/src/Core/GCGlobalChatHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCGlobalChatHandler::execute(GCGlobalChat* pPacket, Player* pPlayer) diff --git a/src/Core/GCGoodsList.cpp b/src/Core/GCGoodsList.cpp index adbc7a9f..7ffb5093 100644 --- a/src/Core/GCGoodsList.cpp +++ b/src/Core/GCGoodsList.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCGoodsList.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -44,7 +44,7 @@ GCGoodsList::~GCGoodsList() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCGoodsList::read(SocketInputStream& iStream) @@ -86,7 +86,7 @@ void GCGoodsList::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCGoodsList::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCGoodsList.h b/src/Core/GCGoodsList.h index 43ff397a..3a466506 100644 --- a/src/Core/GCGoodsList.h +++ b/src/Core/GCGoodsList.h @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCGoodsList.h -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCGoodsListHandler.cpp b/src/Core/GCGoodsListHandler.cpp index b48a3888..a95a8e7e 100644 --- a/src/Core/GCGoodsListHandler.cpp +++ b/src/Core/GCGoodsListHandler.cpp @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : GCGoodsListHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCGuildChat.cpp b/src/Core/GCGuildChat.cpp index cd86717f..828b98a3 100644 --- a/src/Core/GCGuildChat.cpp +++ b/src/Core/GCGuildChat.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCGuildChat::read(SocketInputStream& iStream) @@ -56,7 +56,7 @@ void GCGuildChat::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCGuildChat::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCGuildChatHandler.cpp b/src/Core/GCGuildChatHandler.cpp index f50fac50..93b58119 100644 --- a/src/Core/GCGuildChatHandler.cpp +++ b/src/Core/GCGuildChatHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCGuildChatHandler::execute(GCGuildChat* pPacket, Player* pPlayer) diff --git a/src/Core/GCGuildMemberList.cpp b/src/Core/GCGuildMemberList.cpp index 118e809d..0eeaf31b 100644 --- a/src/Core/GCGuildMemberList.cpp +++ b/src/Core/GCGuildMemberList.cpp @@ -27,14 +27,14 @@ GCGuildMemberList::~GCGuildMemberList() { __BEGIN_TRY - // Ʈ ü + // 길드 리스트의 모든 객체를 삭제 clearGuildMemberInfoList(); __END_CATCH_NO_RETHROW } ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCGuildMemberList::read(SocketInputStream& iStream) @@ -57,7 +57,7 @@ void GCGuildMemberList::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCGuildMemberList::write(SocketOutputStream& oStream) const @@ -85,7 +85,7 @@ void GCGuildMemberList::clearGuildMemberInfoList() { __BEGIN_TRY - // GuildMemberInfoList Ѵ + // GuildMemberInfoList 를 삭제한다 while (!m_GuildMemberInfoList.empty()) { GuildMemberInfo* pGuildMemberInfo = m_GuildMemberInfoList.front(); m_GuildMemberInfoList.pop_front(); diff --git a/src/Core/GCGuildMemberList.h b/src/Core/GCGuildMemberList.h index ba352fe9..38756b47 100644 --- a/src/Core/GCGuildMemberList.h +++ b/src/Core/GCGuildMemberList.h @@ -23,7 +23,7 @@ typedef list::const_iterator GuildMemberInfoListConstItor; // // class GCGuildMemberList; // -// Ŭ̾Ʈ Ʈ . +// 클라이언트에 등록 대기중인 길드 리스트를 보낸다. // ////////////////////////////////////////////////////////////////////// @@ -35,10 +35,10 @@ class GCGuildMemberList : public Packet { // destructor ~GCGuildMemberList(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -124,7 +124,7 @@ class GCGuildMemberListFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCSystemMessagePacketMaxSize , ϶. + // const static GCSystemMessagePacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + GuildMemberInfo::getMaxSize(); } diff --git a/src/Core/GCGuildResponse.cpp b/src/Core/GCGuildResponse.cpp index ea06bf86..c16b0e9a 100644 --- a/src/Core/GCGuildResponse.cpp +++ b/src/Core/GCGuildResponse.cpp @@ -7,7 +7,7 @@ #include "GCGuildResponse.h" ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCGuildResponse::read(SocketInputStream& iStream) @@ -21,7 +21,7 @@ void GCGuildResponse::read(SocketInputStream& iStream) } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCGuildResponse::write(SocketOutputStream& oStream) const @@ -48,7 +48,7 @@ void GCGuildResponse::execute(Player* pPlayer) } ////////////////////////////////////////////////////////////////////////////// -// Ŷ +// 패킷 사이즈 ////////////////////////////////////////////////////////////////////////////// PacketSize_t GCGuildResponse::getPacketSize() const diff --git a/src/Core/GCHPRecoveryEndToOthers.cpp b/src/Core/GCHPRecoveryEndToOthers.cpp index 4a8565fe..150624ed 100644 --- a/src/Core/GCHPRecoveryEndToOthers.cpp +++ b/src/Core/GCHPRecoveryEndToOthers.cpp @@ -31,7 +31,7 @@ GCHPRecoveryEndToOthers::~GCHPRecoveryEndToOthers() } ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCHPRecoveryEndToOthers::read(SocketInputStream& iStream) @@ -46,7 +46,7 @@ void GCHPRecoveryEndToOthers::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCHPRecoveryEndToOthers::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCHPRecoveryEndToOthers.h b/src/Core/GCHPRecoveryEndToOthers.h index 88905ff6..4ac544aa 100644 --- a/src/Core/GCHPRecoveryEndToOthers.h +++ b/src/Core/GCHPRecoveryEndToOthers.h @@ -27,10 +27,10 @@ class GCHPRecoveryEndToOthers : public Packet { virtual ~GCHPRecoveryEndToOthers(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -43,7 +43,7 @@ class GCHPRecoveryEndToOthers : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCHPRecoveryEndToOthersPacketSize , ϶. + // const static GCHPRecoveryEndToOthersPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szObjectID + szHP; } @@ -74,10 +74,10 @@ class GCHPRecoveryEndToOthers : public Packet { } private: - // ũ ̵ ü ؼ Ѵ. + // 존 레벨에서 유니크한 아이디로 객체 구분을 위해서 사용한다. ObjectID_t m_ObjectID; - // ü + // 현재 체력 HP_t m_CurrentHP; }; @@ -109,7 +109,7 @@ class GCHPRecoveryEndToOthersFactory : public PacketFactory { // get packet's body size // *OPTIMIZATION HINT* - // const static GCHPRecoveryEndToOthersPacketSize , ϶. + // const static GCHPRecoveryEndToOthersPacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szHP; } diff --git a/src/Core/GCHPRecoveryEndToSelf.cpp b/src/Core/GCHPRecoveryEndToSelf.cpp index f77e77a6..6dee8bb4 100644 --- a/src/Core/GCHPRecoveryEndToSelf.cpp +++ b/src/Core/GCHPRecoveryEndToSelf.cpp @@ -30,7 +30,7 @@ GCHPRecoveryEndToSelf::~GCHPRecoveryEndToSelf() } ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCHPRecoveryEndToSelf::read(SocketInputStream& iStream) @@ -44,7 +44,7 @@ void GCHPRecoveryEndToSelf::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCHPRecoveryEndToSelf::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCHPRecoveryEndToSelf.h b/src/Core/GCHPRecoveryEndToSelf.h index eeef88be..e8ecad96 100644 --- a/src/Core/GCHPRecoveryEndToSelf.h +++ b/src/Core/GCHPRecoveryEndToSelf.h @@ -27,10 +27,10 @@ class GCHPRecoveryEndToSelf : public Packet { virtual ~GCHPRecoveryEndToSelf(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -43,7 +43,7 @@ class GCHPRecoveryEndToSelf : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCHPRecoveryEndToSelfPacketSize , ϶. + // const static GCHPRecoveryEndToSelfPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szHP; } @@ -66,7 +66,7 @@ class GCHPRecoveryEndToSelf : public Packet { } private: - // ü + // 현재 체력 HP_t m_CurrentHP; }; @@ -98,7 +98,7 @@ class GCHPRecoveryEndToSelfFactory : public PacketFactory { // get packet's body size // *OPTIMIZATION HINT* - // const static GCHPRecoveryEndToSelfPacketSize , ϶. + // const static GCHPRecoveryEndToSelfPacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szHP; } diff --git a/src/Core/GCHPRecoveryStartToOthers.cpp b/src/Core/GCHPRecoveryStartToOthers.cpp index 5f8136de..10e15061 100644 --- a/src/Core/GCHPRecoveryStartToOthers.cpp +++ b/src/Core/GCHPRecoveryStartToOthers.cpp @@ -2,8 +2,8 @@ // // Filename : GCHPRecoveryStartToOthers.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -33,14 +33,14 @@ GCHPRecoveryStartToOthers::~GCHPRecoveryStartToOthers() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCHPRecoveryStartToOthers::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_Delay); iStream.read(m_Period); @@ -51,12 +51,12 @@ void GCHPRecoveryStartToOthers::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCHPRecoveryStartToOthers::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_Delay); oStream.write(m_Period); diff --git a/src/Core/GCHPRecoveryStartToOthers.h b/src/Core/GCHPRecoveryStartToOthers.h index 69519009..d571358a 100644 --- a/src/Core/GCHPRecoveryStartToOthers.h +++ b/src/Core/GCHPRecoveryStartToOthers.h @@ -2,7 +2,7 @@ // // Filename : GCHPRecoveryStartToOthers.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCHPRecoveryStartToOthers; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCHPRecoveryStartToOthers : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCHPRecoveryStartToOthers : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szBYTE + szHP + szHP; } @@ -97,13 +97,13 @@ class GCHPRecoveryStartToOthers : public Packet { // ObjectID ObjectID_t m_ObjectID; - // + // 한 턴 BYTE m_Delay; - // + // 몇번 HP_t m_Period; - // 󸶳 + // 얼마나 HP_t m_Quantity; }; diff --git a/src/Core/GCHPRecoveryStartToSelf.h b/src/Core/GCHPRecoveryStartToSelf.h index 6fcc1aa0..9db09622 100644 --- a/src/Core/GCHPRecoveryStartToSelf.h +++ b/src/Core/GCHPRecoveryStartToSelf.h @@ -2,7 +2,7 @@ // // Filename : GCHPRecoveryStartToSelf.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCHPRecoveryStartToSelf; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCHPRecoveryStartToSelf : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCHPRecoveryStartToSelf : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szBYTE + szHP + szHP; } @@ -86,13 +86,13 @@ class GCHPRecoveryStartToSelf : public Packet { } private: - // + // 한 턴 BYTE m_Delay; - // + // 몇번 HP_t m_Period; - // 󸶳 + // 얼마나 HP_t m_Quantity; }; diff --git a/src/Core/GCHolyLandBonusInfo.cpp b/src/Core/GCHolyLandBonusInfo.cpp index fa360ac1..8991b58b 100644 --- a/src/Core/GCHolyLandBonusInfo.cpp +++ b/src/Core/GCHolyLandBonusInfo.cpp @@ -24,14 +24,14 @@ GCHolyLandBonusInfo::~GCHolyLandBonusInfo() { __BEGIN_TRY - // Ʈ ü + // 길드 리스트의 모든 객체를 삭제 clearBloodBibleBonusInfoList(); __END_CATCH_NO_RETHROW } ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCHolyLandBonusInfo::read(SocketInputStream& iStream) @@ -52,7 +52,7 @@ void GCHolyLandBonusInfo::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCHolyLandBonusInfo::write(SocketOutputStream& oStream) const @@ -79,7 +79,7 @@ void GCHolyLandBonusInfo::clearBloodBibleBonusInfoList() { __BEGIN_TRY - // BloodBibleBonusInfoList Ѵ + // BloodBibleBonusInfoList 를 삭제한다 while (!m_BloodBibleBonusInfoList.empty()) { BloodBibleBonusInfo* pBloodBibleBonusInfo = m_BloodBibleBonusInfoList.front(); m_BloodBibleBonusInfoList.pop_front(); diff --git a/src/Core/GCHolyLandBonusInfo.h b/src/Core/GCHolyLandBonusInfo.h index a3c226ac..84dc8972 100644 --- a/src/Core/GCHolyLandBonusInfo.h +++ b/src/Core/GCHolyLandBonusInfo.h @@ -32,10 +32,10 @@ class GCHolyLandBonusInfo : public Packet { // destructor ~GCHolyLandBonusInfo(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -110,7 +110,7 @@ class GCHolyLandBonusInfoFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCSystemMessagePacketMaxSize , ϶. + // const static GCSystemMessagePacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + BloodBibleBonusInfo::getMaxSize() * 12; } diff --git a/src/Core/GCKickMessage.cpp b/src/Core/GCKickMessage.cpp index 47ee76ea..ed9efc31 100644 --- a/src/Core/GCKickMessage.cpp +++ b/src/Core/GCKickMessage.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCKickMessage::read(SocketInputStream& iStream) @@ -28,7 +28,7 @@ void GCKickMessage::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCKickMessage::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCKickMessage.h b/src/Core/GCKickMessage.h index bd4b46d2..d03fb7c9 100644 --- a/src/Core/GCKickMessage.h +++ b/src/Core/GCKickMessage.h @@ -26,9 +26,9 @@ enum KickMessageType { // // class GCKickMessage; // -// Ư ÷̾ KickMessage ٸ ÷̾鿡 εijƮ -// ϴ Ŷ̴. ο ij͸ KickMessage Ʈ Ÿ -// ʵ ִ. +// 게임 서버가 특정 플레이어의 KickMessage 를 다른 플레이어들에게 브로드캐스트 +// 할 때 전송하는 패킷이다. 내부에 캐릭터명과 KickMessage 스트링을 데이타 +// 필드로 가지고 있다. // ////////////////////////////////////////////////////////////////////// @@ -37,10 +37,10 @@ class GCKickMessage : public Packet { GCKickMessage() : m_Type(KICK_MESSAGE_PAY_TIMEOUT) {} ~GCKickMessage() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -115,7 +115,7 @@ class GCKickMessageFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCKickMessagePacketMaxSize , ϶. + // const static GCKickMessagePacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + szuint; } diff --git a/src/Core/GCKickMessageHandler.cpp b/src/Core/GCKickMessageHandler.cpp index 90b999de..1bd7b5aa 100644 --- a/src/Core/GCKickMessageHandler.cpp +++ b/src/Core/GCKickMessageHandler.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCKickMessageHandler::execute(GCKickMessage* pPacket, Player* pPlayer) diff --git a/src/Core/GCKnocksTargetBackOK1.cpp b/src/Core/GCKnocksTargetBackOK1.cpp index a804a436..31a11af1 100644 --- a/src/Core/GCKnocksTargetBackOK1.cpp +++ b/src/Core/GCKnocksTargetBackOK1.cpp @@ -2,8 +2,8 @@ // // Filename : GCKnocksTargetBackOK1.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -40,7 +40,7 @@ GCKnocksTargetBackOK1::~GCKnocksTargetBackOK1() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCKnocksTargetBackOK1::read(SocketInputStream& iStream) @@ -62,7 +62,7 @@ void GCKnocksTargetBackOK1::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCKnocksTargetBackOK1::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/GCKnocksTargetBackOK1.h b/src/Core/GCKnocksTargetBackOK1.h index 0f7a0cce..e55fe96a 100644 --- a/src/Core/GCKnocksTargetBackOK1.h +++ b/src/Core/GCKnocksTargetBackOK1.h @@ -2,7 +2,7 @@ // // Filename : GCKnocksTargetBackOK1.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -20,7 +20,7 @@ // // class GCKnocksTargetBackOK1; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCKnocksTargetBackOK1 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCKnocksTargetBackOK1 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szSkillType + szDir + szCoord * 2 + szObjectID + szBullet + szbool + ModifyInfo::getPacketSize(); } @@ -118,8 +118,8 @@ class GCKnocksTargetBackOK1 : public ModifyInfo { bool m_bSuccess; - Coord_t m_X, m_Y; // ̵ ǥ. - Dir_t m_dir; // з . + Coord_t m_X, m_Y; // 이동된 좌표. + Dir_t m_dir; // 밀려난 방향. SkillType_t m_SkillType; }; diff --git a/src/Core/GCKnocksTargetBackOK2.cpp b/src/Core/GCKnocksTargetBackOK2.cpp index 4bd346ad..76972e3b 100644 --- a/src/Core/GCKnocksTargetBackOK2.cpp +++ b/src/Core/GCKnocksTargetBackOK2.cpp @@ -2,8 +2,8 @@ // // Filename : GCKnocksTargetBackOK2.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -32,14 +32,14 @@ GCKnocksTargetBackOK2::~GCKnocksTargetBackOK2() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCKnocksTargetBackOK2::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_SkillType); iStream.read(m_dir); iStream.read(m_X); @@ -53,12 +53,12 @@ void GCKnocksTargetBackOK2::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCKnocksTargetBackOK2::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_SkillType); oStream.write(m_dir); oStream.write(m_X); diff --git a/src/Core/GCKnocksTargetBackOK2.h b/src/Core/GCKnocksTargetBackOK2.h index 599fe0cf..a1826b15 100644 --- a/src/Core/GCKnocksTargetBackOK2.h +++ b/src/Core/GCKnocksTargetBackOK2.h @@ -2,7 +2,7 @@ // // Filename : GCKnocksTargetBackOK2.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCKnocksTargetBackOK2; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCKnocksTargetBackOK2 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCKnocksTargetBackOK2 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szSkillType + szCoord * 2 + szDir + szObjectID + ModifyInfo::getPacketSize(); } @@ -94,8 +94,8 @@ class GCKnocksTargetBackOK2 : public ModifyInfo { // ObjectID ObjectID_t m_ObjectID; - Coord_t m_X, m_Y; // ̵ ǥ. - Dir_t m_dir; // з . + Coord_t m_X, m_Y; // 이동된 좌표. + Dir_t m_dir; // 밀려난 방향. SkillType_t m_SkillType; }; diff --git a/src/Core/GCKnocksTargetBackOK4.cpp b/src/Core/GCKnocksTargetBackOK4.cpp index ae7a6118..c75b6a0e 100644 --- a/src/Core/GCKnocksTargetBackOK4.cpp +++ b/src/Core/GCKnocksTargetBackOK4.cpp @@ -2,8 +2,8 @@ // // Filename : GCKnocksTargetBackOK4.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -35,14 +35,14 @@ GCKnocksTargetBackOK4::~GCKnocksTargetBackOK4() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCKnocksTargetBackOK4::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. // iStream.read(m_ObjectID); iStream.read(m_TargetObjectID); // iStream.read(m_X); @@ -58,12 +58,12 @@ void GCKnocksTargetBackOK4::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCKnocksTargetBackOK4::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. // oStream.write(m_ObjectID); oStream.write(m_TargetObjectID); // oStream.write(m_X); diff --git a/src/Core/GCKnocksTargetBackOK4.h b/src/Core/GCKnocksTargetBackOK4.h index 6d34e666..9f3f7677 100644 --- a/src/Core/GCKnocksTargetBackOK4.h +++ b/src/Core/GCKnocksTargetBackOK4.h @@ -2,7 +2,7 @@ // // Filename : GCKnocksTargetBackOK4.h // Written By : elca@ewestsoft.com -// Description : ڴ ְ, ڴ Ŷ +// Description : 기술 피해자는 볼 수 있고, 사용자는 볼 수 없는 사람에게 보내는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCKnocksTargetBackOK4; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCKnocksTargetBackOK4 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCKnocksTargetBackOK4 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. // PacketSize_t getPacketSize() const { return szObjectID + szObjectID + szbool; } PacketSize_t getPacketSize() const { return szObjectID + szSkillType + szCoord * 2 + szDir; @@ -110,8 +110,8 @@ class GCKnocksTargetBackOK4 : public Packet { // TargetObjectID ObjectID_t m_TargetObjectID; - Coord_t m_X, m_Y; // ̵ ǥ. - Dir_t m_dir; // з . + Coord_t m_X, m_Y; // 이동된 좌표. + Dir_t m_dir; // 밀려난 방향. SkillType_t m_SkillType; // bool diff --git a/src/Core/GCKnocksTargetBackOK5.cpp b/src/Core/GCKnocksTargetBackOK5.cpp index 0d6da821..93eed45c 100644 --- a/src/Core/GCKnocksTargetBackOK5.cpp +++ b/src/Core/GCKnocksTargetBackOK5.cpp @@ -2,8 +2,8 @@ // // Filename : GCKnocksTargetBackOK5.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -37,7 +37,7 @@ GCKnocksTargetBackOK5::~GCKnocksTargetBackOK5() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCKnocksTargetBackOK5::read(SocketInputStream& iStream) @@ -45,7 +45,7 @@ void GCKnocksTargetBackOK5::read(SocketInputStream& iStream) __BEGIN_TRY __BEGIN_DEBUG - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_TargetObjectID); // iStream.read(m_X); @@ -62,13 +62,13 @@ void GCKnocksTargetBackOK5::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCKnocksTargetBackOK5::write(SocketOutputStream& oStream) const { __BEGIN_TRY __BEGIN_DEBUG - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_TargetObjectID); // oStream.write(m_X); diff --git a/src/Core/GCKnocksTargetBackOK5.h b/src/Core/GCKnocksTargetBackOK5.h index 700f066c..4070d078 100644 --- a/src/Core/GCKnocksTargetBackOK5.h +++ b/src/Core/GCKnocksTargetBackOK5.h @@ -2,7 +2,7 @@ // // Filename : GCKnocksTargetBackOK5.h // Written By : elca@ewestsoft.com -// Description : ڴ ְ, ڴ Ŷ +// Description : 기술 사용자는 볼 수 있고, 피해자는 볼 수 없는 사람에게 보내는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCKnocksTargetBackOK5; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCKnocksTargetBackOK5 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCKnocksTargetBackOK5 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szObjectID + szbool + szSkillType + szCoord * 2 + szDir; } @@ -121,8 +121,8 @@ class GCKnocksTargetBackOK5 : public Packet { // bool bool m_bSuccess; - Coord_t m_X, m_Y; // ̵ ǥ. - Dir_t m_dir; // з . + Coord_t m_X, m_Y; // 이동된 좌표. + Dir_t m_dir; // 밀려난 방향. SkillType_t m_SkillType; }; diff --git a/src/Core/GCLearnSkillFailed.cpp b/src/Core/GCLearnSkillFailed.cpp index 2cfcd92e..c1860136 100644 --- a/src/Core/GCLearnSkillFailed.cpp +++ b/src/Core/GCLearnSkillFailed.cpp @@ -2,7 +2,7 @@ // // Filename : GCLearnSkillFailed.cc // Written By : elca@ewestsoft.com -// Description : Skill ִ Ŷ +// Description : Skill이 실패 했을때 날려주는 패킷의 멤버 정의 // ////////////////////////////////////////////////////////////////////// @@ -26,7 +26,7 @@ GCLearnSkillFailed::~GCLearnSkillFailed() } ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCLearnSkillFailed::read(SocketInputStream& iStream) @@ -41,7 +41,7 @@ void GCLearnSkillFailed::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCLearnSkillFailed::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCLearnSkillFailed.h b/src/Core/GCLearnSkillFailed.h index 6c3c3d00..f008b0bc 100644 --- a/src/Core/GCLearnSkillFailed.h +++ b/src/Core/GCLearnSkillFailed.h @@ -2,7 +2,7 @@ // // Filename : GCLearnSkillFailed.h // Written By : elca@ewestsoft.com -// Description : +// Description : Å // // ////////////////////////////////////////////////////////////////////// @@ -29,10 +29,10 @@ class GCLearnSkillFailed : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // ÀԷ½ºÆ®¸²(¹öÆÛ)À¸·ÎºÎÅÍ µ¥ÀÌŸ¸¦ Àо ÆÐŶÀ» ÃʱâÈ­ÇÑ´Ù. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // Ãâ·Â½ºÆ®¸²(¹öÆÛ)À¸·Î ÆÐŶÀÇ ¹ÙÀ̳ʸ® À̹ÌÁö¸¦ º¸³½´Ù. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -74,8 +74,8 @@ class GCLearnSkillFailed : public Packet { private: SkillType_t m_SkillType; - BYTE m_Desc; // ̴. - // ڼ CGLearnSkillHandler ϵ. + BYTE m_Desc; // ±â¼úÀ» ¹è¿ì´Â µ¥ ½ÇÆÐÇÑ ÀÌÀ¯ÀÌ´Ù. + // ÀÚ¼¼ÇÑ ³»¿ëÀº CGLearnSkillHandler¸¦ Âü°íÇϵµ·Ï. }; diff --git a/src/Core/GCLearnSkillOK.cpp b/src/Core/GCLearnSkillOK.cpp index 7dc33b51..777cde96 100644 --- a/src/Core/GCLearnSkillOK.cpp +++ b/src/Core/GCLearnSkillOK.cpp @@ -2,7 +2,7 @@ // // Filename : GCLearnSkillOK.cc // Written By : elca@ewestsoft.com -// Description : Skill ִ Ŷ +// Description : Skill이 실패 했을때 날려주는 패킷의 멤버 정의 // ////////////////////////////////////////////////////////////////////// @@ -30,7 +30,7 @@ GCLearnSkillOK::~GCLearnSkillOK() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCLearnSkillOK::read(SocketInputStream& iStream) @@ -43,7 +43,7 @@ void GCLearnSkillOK::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCLearnSkillOK::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCLearnSkillOK.h b/src/Core/GCLearnSkillOK.h index d5740332..1dbb2e9c 100644 --- a/src/Core/GCLearnSkillOK.h +++ b/src/Core/GCLearnSkillOK.h @@ -2,7 +2,7 @@ // // Filename : GCLearnSkillOK.h // Written By : elca@ewestsoft.com -// Description : +// Description : Å // // ////////////////////////////////////////////////////////////////////// @@ -32,10 +32,10 @@ class GCLearnSkillOK : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // ÀԷ½ºÆ®¸²(¹öÆÛ)À¸·ÎºÎÅÍ µ¥ÀÌŸ¸¦ Àо ÆÐŶÀ» ÃʱâÈ­ÇÑ´Ù. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // Ãâ·Â½ºÆ®¸²(¹öÆÛ)À¸·Î ÆÐŶÀÇ ¹ÙÀ̳ʸ® À̹ÌÁö¸¦ º¸³½´Ù. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/GCLearnSkillReady.cpp b/src/Core/GCLearnSkillReady.cpp index a4aa2a8a..411059f5 100644 --- a/src/Core/GCLearnSkillReady.cpp +++ b/src/Core/GCLearnSkillReady.cpp @@ -2,7 +2,7 @@ // // Filename : GCLearnSkillReady.cc // Written By : elca@ewestsoft.com -// Description : Skill ִ Ŷ +// Description : Skill이 실패 했을때 날려주는 패킷의 멤버 정의 // ////////////////////////////////////////////////////////////////////// @@ -30,7 +30,7 @@ GCLearnSkillReady::~GCLearnSkillReady() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCLearnSkillReady::read(SocketInputStream& iStream) @@ -42,7 +42,7 @@ void GCLearnSkillReady::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCLearnSkillReady::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCLearnSkillReady.h b/src/Core/GCLearnSkillReady.h index 106e7a83..abd879b7 100644 --- a/src/Core/GCLearnSkillReady.h +++ b/src/Core/GCLearnSkillReady.h @@ -2,7 +2,7 @@ // // Filename : GCLearnSkillReady.h // Written By : elca@ewestsoft.com -// Description : +// Description : Å // // ////////////////////////////////////////////////////////////////////// @@ -32,10 +32,10 @@ class GCLearnSkillReady : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // ÀԷ½ºÆ®¸²(¹öÆÛ)À¸·ÎºÎÅÍ µ¥ÀÌŸ¸¦ Àо ÆÐŶÀ» ÃʱâÈ­ÇÑ´Ù. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // Ãâ·Â½ºÆ®¸²(¹öÆÛ)À¸·Î ÆÐŶÀÇ ¹ÙÀ̳ʸ® À̹ÌÁö¸¦ º¸³½´Ù. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -67,7 +67,7 @@ class GCLearnSkillReady : public Packet { } private: - // ų Ÿ + // ½ºÅ³ ŸÀÔ SkillDomainType_t m_SkillDomainType; }; diff --git a/src/Core/GCLightning.cpp b/src/Core/GCLightning.cpp index d23ffbbc..3a6202f7 100644 --- a/src/Core/GCLightning.cpp +++ b/src/Core/GCLightning.cpp @@ -10,7 +10,7 @@ //-------------------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void GCLightning::read(SocketInputStream& iStream) @@ -24,7 +24,7 @@ void GCLightning::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCLightning::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCLightning.h b/src/Core/GCLightning.h index 987a5215..26553550 100644 --- a/src/Core/GCLightning.h +++ b/src/Core/GCLightning.h @@ -17,7 +17,7 @@ // // class GCLightning; // -// , Ŭ̾Ʈ鿡 ϴ Ŷ̴. +// 번개가 쳤을 경우, 서버에서 그 존의 모든 클라이언트들에게 전송하는 패킷이다. // // ////////////////////////////////////////////////////////////////////// @@ -26,10 +26,10 @@ class GCLightning : public Packet { public: GCLightning() {}; ~GCLightning() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -42,7 +42,7 @@ class GCLightning : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCLightningPacketSize , ϶. + // const static GCLightningPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szBYTE; } @@ -66,8 +66,8 @@ class GCLightning : public Packet { private: - // ģ , õ ̽ð - // 1 -> 0.1 + // 번개가 친 후, 천둥이 올 때까지의 딜레이시간 + // 1 -> 0.1초 BYTE m_Delay; }; @@ -99,7 +99,7 @@ class GCLightningFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCLightningPacketSize , ϶. + // const static GCLightningPacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE; } diff --git a/src/Core/GCMPRecoveryEnd.cpp b/src/Core/GCMPRecoveryEnd.cpp index 2f713603..386b1ab0 100644 --- a/src/Core/GCMPRecoveryEnd.cpp +++ b/src/Core/GCMPRecoveryEnd.cpp @@ -30,7 +30,7 @@ GCMPRecoveryEnd::~GCMPRecoveryEnd() } ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCMPRecoveryEnd::read(SocketInputStream& iStream) @@ -44,7 +44,7 @@ void GCMPRecoveryEnd::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCMPRecoveryEnd::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCMPRecoveryEnd.h b/src/Core/GCMPRecoveryEnd.h index a8ce7bd3..8a208c07 100644 --- a/src/Core/GCMPRecoveryEnd.h +++ b/src/Core/GCMPRecoveryEnd.h @@ -27,10 +27,10 @@ class GCMPRecoveryEnd : public Packet { virtual ~GCMPRecoveryEnd(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -43,7 +43,7 @@ class GCMPRecoveryEnd : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCMPRecoveryEndPacketSize , ϶. + // const static GCMPRecoveryEndPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szMP; } @@ -66,7 +66,7 @@ class GCMPRecoveryEnd : public Packet { } private: - // ü + // 현재 체력 MP_t m_CurrentMP; }; @@ -98,7 +98,7 @@ class GCMPRecoveryEndFactory : public PacketFactory { // get packet's body size // *OPTIMIZATION HINT* - // const static GCMPRecoveryEndPacketSize , ϶. + // const static GCMPRecoveryEndPacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szMP; } diff --git a/src/Core/GCMPRecoveryStart.cpp b/src/Core/GCMPRecoveryStart.cpp index 333e8ef5..90cfdcd3 100644 --- a/src/Core/GCMPRecoveryStart.cpp +++ b/src/Core/GCMPRecoveryStart.cpp @@ -2,8 +2,8 @@ // // Filename : GCMPRecoveryStart.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -33,14 +33,14 @@ GCMPRecoveryStart::~GCMPRecoveryStart() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCMPRecoveryStart::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_Delay); iStream.read(m_Period); iStream.read(m_Quantity); @@ -50,12 +50,12 @@ void GCMPRecoveryStart::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCMPRecoveryStart::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_Delay); oStream.write(m_Period); oStream.write(m_Quantity); diff --git a/src/Core/GCMPRecoveryStart.h b/src/Core/GCMPRecoveryStart.h index 1bda5981..73b041df 100644 --- a/src/Core/GCMPRecoveryStart.h +++ b/src/Core/GCMPRecoveryStart.h @@ -2,7 +2,7 @@ // // Filename : GCMPRecoveryStart.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCMPRecoveryStart; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCMPRecoveryStart : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCMPRecoveryStart : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szBYTE + szMP + szMP; } @@ -86,13 +86,13 @@ class GCMPRecoveryStart : public Packet { } private: - // + // 한 턴 BYTE m_Delay; - // + // 몇번 MP_t m_Period; - // 󸶳 + // 얼마나 MP_t m_Quantity; }; diff --git a/src/Core/GCMakeItemFail.cpp b/src/Core/GCMakeItemFail.cpp index 6ae11c7c..f89b15f3 100644 --- a/src/Core/GCMakeItemFail.cpp +++ b/src/Core/GCMakeItemFail.cpp @@ -2,8 +2,8 @@ // // Filename : GCMakeItemFail.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -33,7 +33,7 @@ GCMakeItemFail::~GCMakeItemFail() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCMakeItemFail::read(SocketInputStream& iStream) @@ -48,7 +48,7 @@ void GCMakeItemFail::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCMakeItemFail::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/GCMakeItemFail.h b/src/Core/GCMakeItemFail.h index 38c224b9..c3b3ee5a 100644 --- a/src/Core/GCMakeItemFail.h +++ b/src/Core/GCMakeItemFail.h @@ -2,7 +2,7 @@ // // Filename : GCMakeItemFail.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -21,7 +21,7 @@ // // class GCMakeItemFail; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -35,10 +35,10 @@ class GCMakeItemFail : public GCChangeInventoryItemNum, public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -50,7 +50,7 @@ class GCMakeItemFail : public GCChangeInventoryItemNum, public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return GCChangeInventoryItemNum::getPacketSize() + ModifyInfo::getPacketSize(); } diff --git a/src/Core/GCMakeItemOK.cpp b/src/Core/GCMakeItemOK.cpp index 925335a1..65ce6471 100644 --- a/src/Core/GCMakeItemOK.cpp +++ b/src/Core/GCMakeItemOK.cpp @@ -2,8 +2,8 @@ // // Filename : GCMakeItemOK.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -33,7 +33,7 @@ GCMakeItemOK::~GCMakeItemOK() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCMakeItemOK::read(SocketInputStream& iStream) @@ -48,7 +48,7 @@ void GCMakeItemOK::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCMakeItemOK::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/GCMakeItemOK.h b/src/Core/GCMakeItemOK.h index f4929de8..fc49c2dd 100644 --- a/src/Core/GCMakeItemOK.h +++ b/src/Core/GCMakeItemOK.h @@ -2,7 +2,7 @@ // // Filename : GCMakeItemOK.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -22,7 +22,7 @@ // // class GCMakeItemOK; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -36,10 +36,10 @@ class GCMakeItemOK : public GCChangeInventoryItemNum, public GCAddItemToInventor public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -51,7 +51,7 @@ class GCMakeItemOK : public GCChangeInventoryItemNum, public GCAddItemToInventor } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return GCChangeInventoryItemNum::getPacketSize() + GCAddItemToInventory::getPacketSize() + ModifyInfo::getPacketSize(); diff --git a/src/Core/GCMineExplosionOK1.cpp b/src/Core/GCMineExplosionOK1.cpp index 2db1c0b7..e2f2b6f1 100644 --- a/src/Core/GCMineExplosionOK1.cpp +++ b/src/Core/GCMineExplosionOK1.cpp @@ -2,8 +2,8 @@ // // Filename : GCMineExplosionOK1.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -39,14 +39,14 @@ GCMineExplosionOK1::~GCMineExplosionOK1() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCMineExplosionOK1::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_X); iStream.read(m_Y); iStream.read(m_Dir); @@ -68,12 +68,12 @@ void GCMineExplosionOK1::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCMineExplosionOK1::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_X); oStream.write(m_Y); oStream.write(m_Dir); @@ -93,7 +93,7 @@ void GCMineExplosionOK1::write(SocketOutputStream& oStream) const { // // GCMineExplosionOK1::addListElement() // -// (ȭ, ȭġ ) Ʈ ֱ Լ. +// (변화부위, 변화수치 ) 의 한 셋을 리스트에 넣기 위한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCMineExplosionOK1::addCListElement(ObjectID_t ObjectID) @@ -101,10 +101,10 @@ void GCMineExplosionOK1::addCListElement(ObjectID_t ObjectID) { __BEGIN_TRY - // Creature ID ߰Ѵ. + // Creature ID를 추가한다. m_CList.push_back(ObjectID); - // ũó ID count Ų. + // 크리처 ID count를 증가시킨다. m_CListNum++; __END_CATCH @@ -115,7 +115,7 @@ void GCMineExplosionOK1::addCListElement(ObjectID_t ObjectID) // // GCMineExplosionOK1::deleteCListElement() // -// Creature List Ҹ ﶧ ʿ Լ. +// Creature List의 요소를 지울때 필요한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCMineExplosionOK1::deleteCListElement() @@ -123,10 +123,10 @@ void GCMineExplosionOK1::deleteCListElement() { __BEGIN_TRY - // ũ ̵ ϳ . + // 크리쳐 아이디를 하나 지운다. m_CList.pop_front(); - // ũó Ʈ ī͸ ϳ . + // 크리처 리스트 카운터를 하나 지운다. m_CListNum--; __END_CATCH diff --git a/src/Core/GCMineExplosionOK1.h b/src/Core/GCMineExplosionOK1.h index c0cdcee7..7867fd74 100644 --- a/src/Core/GCMineExplosionOK1.h +++ b/src/Core/GCMineExplosionOK1.h @@ -2,7 +2,7 @@ // // Filename : GCMineExplosionOK1.h // Written By : elca@ewestsoft.com -// Description : ڰ ޴ Ŷ +// Description : 기술에 당한 자가 받는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCMineExplosionOK1; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCMineExplosionOK1 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCMineExplosionOK1 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szCoord * 2 + szDir + szItemType + szBYTE + szObjectID * m_CListNum + ModifyInfo::getPacketSize(); } diff --git a/src/Core/GCMineExplosionOK2.cpp b/src/Core/GCMineExplosionOK2.cpp index 0c9d6344..f4be79fe 100644 --- a/src/Core/GCMineExplosionOK2.cpp +++ b/src/Core/GCMineExplosionOK2.cpp @@ -2,8 +2,8 @@ // // Filename : GCMineExplosionOK2.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -39,14 +39,14 @@ GCMineExplosionOK2::~GCMineExplosionOK2() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCMineExplosionOK2::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_X); iStream.read(m_Y); iStream.read(m_Dir); @@ -67,12 +67,12 @@ void GCMineExplosionOK2::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCMineExplosionOK2::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_X); oStream.write(m_Y); oStream.write(m_Dir); @@ -91,7 +91,7 @@ void GCMineExplosionOK2::write(SocketOutputStream& oStream) const { // // GCMineExplosionOK2::addListElement() // -// (ȭ, ȭġ ) Ʈ ֱ Լ. +// (변화부위, 변화수치 ) 의 한 셋을 리스트에 넣기 위한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCMineExplosionOK2::addCListElement(ObjectID_t ObjectID) @@ -99,10 +99,10 @@ void GCMineExplosionOK2::addCListElement(ObjectID_t ObjectID) { __BEGIN_TRY - // Creature ID ߰Ѵ. + // Creature ID를 추가한다. m_CList.push_back(ObjectID); - // ũó ID count Ų. + // 크리처 ID count를 증가시킨다. m_CListNum++; __END_CATCH @@ -113,7 +113,7 @@ void GCMineExplosionOK2::addCListElement(ObjectID_t ObjectID) // // GCMineExplosionOK2::deleteCListElement() // -// Creature List Ҹ ﶧ ʿ Լ. +// Creature List의 요소를 지울때 필요한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCMineExplosionOK2::deleteCListElement() @@ -121,10 +121,10 @@ void GCMineExplosionOK2::deleteCListElement() { __BEGIN_TRY - // ũ ̵ ϳ . + // 크리쳐 아이디를 하나 지운다. m_CList.pop_front(); - // ũó Ʈ ī͸ ϳ . + // 크리처 리스트 카운터를 하나 지운다. m_CListNum--; __END_CATCH diff --git a/src/Core/GCMineExplosionOK2.h b/src/Core/GCMineExplosionOK2.h index 3bbdca11..020a3f7e 100644 --- a/src/Core/GCMineExplosionOK2.h +++ b/src/Core/GCMineExplosionOK2.h @@ -2,7 +2,7 @@ // // Filename : GCMineExplosionOK2.h // Written By : elca@ewestsoft.com -// Description : ڰ ޴ Ŷ +// Description : 기술에 당한 자가 받는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCMineExplosionOK2; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCMineExplosionOK2 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCMineExplosionOK2 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szCoord * 2 + szDir + szItemType + szBYTE + szObjectID * m_CListNum; } diff --git a/src/Core/GCMiniGameScores.cpp b/src/Core/GCMiniGameScores.cpp index 9ab8a2f4..d74cff29 100644 --- a/src/Core/GCMiniGameScores.cpp +++ b/src/Core/GCMiniGameScores.cpp @@ -2,8 +2,8 @@ // // Filename : GCMiniGameScores.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -33,7 +33,7 @@ GCMiniGameScores::~GCMiniGameScores() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCMiniGameScores::read(SocketInputStream& iStream) @@ -62,7 +62,7 @@ void GCMiniGameScores::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCMiniGameScores::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/GCMiniGameScores.h b/src/Core/GCMiniGameScores.h index fa004513..9986a243 100644 --- a/src/Core/GCMiniGameScores.h +++ b/src/Core/GCMiniGameScores.h @@ -2,7 +2,7 @@ // Filename : GCMiniGameScores.h // Written By : elca@ewestsoft.com // Description : -// Ŷ Ŭ +// 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_MINI_GAME_SCORES_H__ @@ -20,7 +20,7 @@ enum GameType { GAME_MINE = 0, GAME_NEMO, GAME_PUSH, GAME_ARROW }; ////////////////////////////////////////////////////////////////////////////// // class GCMiniGameScores; -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 ////////////////////////////////////////////////////////////////////////////// class GCMiniGameScores : public Packet { diff --git a/src/Core/GCModifyGuildMemberInfo.cpp b/src/Core/GCModifyGuildMemberInfo.cpp index 382d7bbf..e4b8a879 100644 --- a/src/Core/GCModifyGuildMemberInfo.cpp +++ b/src/Core/GCModifyGuildMemberInfo.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCModifyGuildMemberInfo::read(SocketInputStream& iStream) @@ -38,7 +38,7 @@ void GCModifyGuildMemberInfo::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCModifyGuildMemberInfo::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCModifyGuildMemberInfo.h b/src/Core/GCModifyGuildMemberInfo.h index 2f1a1525..1c8b6945 100644 --- a/src/Core/GCModifyGuildMemberInfo.h +++ b/src/Core/GCModifyGuildMemberInfo.h @@ -17,9 +17,9 @@ // // class GCModifyGuildMemberInfo; // -// Ư ÷̾ ModifyGuildMemberInfo ٸ ÷̾鿡 εijƮ -// ϴ Ŷ̴. ο ij͸ ModifyGuildMemberInfo Ʈ Ÿ -// ʵ ִ. +// 게임 서버가 특정 플레이어의 ModifyGuildMemberInfo 를 다른 플레이어들에게 브로드캐스트 +// 할 때 전송하는 패킷이다. 내부에 캐릭터명과 ModifyGuildMemberInfo 스트링을 데이타 +// 필드로 가지고 있다. // ////////////////////////////////////////////////////////////////////// @@ -27,10 +27,10 @@ class GCModifyGuildMemberInfo : public Packet { public: GCModifyGuildMemberInfo() {}; ~GCModifyGuildMemberInfo() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -117,7 +117,7 @@ class GCModifyGuildMemberInfoFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCModifyGuildMemberInfoPacketMaxSize , ϶. + // const static GCModifyGuildMemberInfoPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID + szBYTE + 30 + szGuildMemberRank; } diff --git a/src/Core/GCModifyGuildMemberInfoHandler.cpp b/src/Core/GCModifyGuildMemberInfoHandler.cpp index ff601926..275a2366 100644 --- a/src/Core/GCModifyGuildMemberInfoHandler.cpp +++ b/src/Core/GCModifyGuildMemberInfoHandler.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCModifyGuildMemberInfoHandler::execute(GCModifyGuildMemberInfo* pPacket, Player* pPlayer) diff --git a/src/Core/GCModifyMoney.cpp b/src/Core/GCModifyMoney.cpp index f025346a..4369f3f1 100644 --- a/src/Core/GCModifyMoney.cpp +++ b/src/Core/GCModifyMoney.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCModifyMoney::read(SocketInputStream& iStream) @@ -24,7 +24,7 @@ void GCModifyMoney::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCModifyMoney::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCModifyMoney.h b/src/Core/GCModifyMoney.h index 79f79e95..18213159 100644 --- a/src/Core/GCModifyMoney.h +++ b/src/Core/GCModifyMoney.h @@ -17,7 +17,7 @@ // // class GCModifyMoney; // -// Ŭ̾Ʈ â 쵵 Ѵ. +// 클라이언트에 길드 등록 창을 띄우도록 한다. // ////////////////////////////////////////////////////////////////////// @@ -25,10 +25,10 @@ class GCModifyMoney : public Packet { public: GCModifyMoney() {}; ~GCModifyMoney() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -94,7 +94,7 @@ class GCModifyMoneyFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCSystemMessagePacketMaxSize , ϶. + // const static GCSystemMessagePacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGold; } diff --git a/src/Core/GCModifyNickname.cpp b/src/Core/GCModifyNickname.cpp index 03f24872..a4bad94b 100644 --- a/src/Core/GCModifyNickname.cpp +++ b/src/Core/GCModifyNickname.cpp @@ -36,7 +36,7 @@ GCModifyNickname::~GCModifyNickname() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCModifyNickname::read(SocketInputStream& iStream) @@ -51,7 +51,7 @@ void GCModifyNickname::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCModifyNickname::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCModyfyMoney.cpp b/src/Core/GCModyfyMoney.cpp index f025346a..4369f3f1 100644 --- a/src/Core/GCModyfyMoney.cpp +++ b/src/Core/GCModyfyMoney.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCModifyMoney::read(SocketInputStream& iStream) @@ -24,7 +24,7 @@ void GCModifyMoney::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCModifyMoney::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCModyfyMoney.h b/src/Core/GCModyfyMoney.h index 3e1696a2..7212dd62 100644 --- a/src/Core/GCModyfyMoney.h +++ b/src/Core/GCModyfyMoney.h @@ -17,7 +17,7 @@ // // class GCModifyMoney; // -// Ŭ̾Ʈ â 쵵 Ѵ. +// 클라이언트에 길드 등록 창을 띄우도록 한다. // ////////////////////////////////////////////////////////////////////// @@ -25,10 +25,10 @@ class GCModifyMoney : public Packet { public: GCModifyMoney() {}; ~GCModifyMoney() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -94,7 +94,7 @@ class GCModifyMoneyFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCSystemMessagePacketMaxSize , ϶. + // const static GCSystemMessagePacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGold; } diff --git a/src/Core/GCMonsterKillQuestInfo.cpp b/src/Core/GCMonsterKillQuestInfo.cpp index 8ae08911..6f503dd4 100644 --- a/src/Core/GCMonsterKillQuestInfo.cpp +++ b/src/Core/GCMonsterKillQuestInfo.cpp @@ -31,7 +31,7 @@ GCMonsterKillQuestInfo::~GCMonsterKillQuestInfo() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCMonsterKillQuestInfo::read(SocketInputStream& iStream) @@ -56,7 +56,7 @@ void GCMonsterKillQuestInfo::read(SocketInputStream& iStream) } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCMonsterKillQuestInfo::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCMonsterKillQuestStatus.cpp b/src/Core/GCMonsterKillQuestStatus.cpp index 3b6b7331..69d0f8e1 100644 --- a/src/Core/GCMonsterKillQuestStatus.cpp +++ b/src/Core/GCMonsterKillQuestStatus.cpp @@ -2,8 +2,8 @@ // // Filename : GCMonsterKillQuestStatus.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -33,14 +33,14 @@ GCMonsterKillQuestStatus::~GCMonsterKillQuestStatus() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCMonsterKillQuestStatus::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_QuestID); iStream.read(m_CurrentNum); iStream.read(m_Time); @@ -50,12 +50,12 @@ void GCMonsterKillQuestStatus::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCMonsterKillQuestStatus::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_QuestID); oStream.write(m_CurrentNum); oStream.write(m_Time); diff --git a/src/Core/GCMonsterKillQuestStatus.h b/src/Core/GCMonsterKillQuestStatus.h index 178e8fee..05efce14 100644 --- a/src/Core/GCMonsterKillQuestStatus.h +++ b/src/Core/GCMonsterKillQuestStatus.h @@ -2,7 +2,7 @@ // Filename : GCMonsterKillQuestStatus.h // Written By : elca@ewestsoft.com // Description : -// Ŷ Ŭ +// 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_MONSTER_KILL_QUEST_STATUS_H__ @@ -15,7 +15,7 @@ ////////////////////////////////////////////////////////////////////////////// // class GCMonsterKillQuestStatus; -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 ////////////////////////////////////////////////////////////////////////////// class GCMonsterKillQuestStatus : public Packet { diff --git a/src/Core/GCMorph1.cpp b/src/Core/GCMorph1.cpp index 1c573044..5a87da0f 100644 --- a/src/Core/GCMorph1.cpp +++ b/src/Core/GCMorph1.cpp @@ -32,7 +32,7 @@ GCMorph1::~GCMorph1() } //-------------------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void GCMorph1::read(SocketInputStream& iStream) @@ -75,7 +75,7 @@ void GCMorph1::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCMorph1::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCMorph1.h b/src/Core/GCMorph1.h index 56f3ebc7..cc8b6260 100644 --- a/src/Core/GCMorph1.h +++ b/src/Core/GCMorph1.h @@ -24,7 +24,7 @@ // // class GCMorph1; // -// slayer vampire Ҷ, Ͻô п Ŷ. +// slayer등이 vampire로 변신할때, 변신하시는 분에게 보내는 패킷. //-------------------------------------------------------------------------------- class GCMorph1 : public Packet { @@ -35,10 +35,10 @@ class GCMorph1 : public Packet { // destructor ~GCMorph1(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -110,7 +110,7 @@ class GCMorph1 : public Packet { //-------------------------------------------------------------------------------- // PC Information //-------------------------------------------------------------------------------- - // PCSlayerInfo2 Ǵ PCVampireInfo2 Ѵ. + // PCSlayerInfo2 또는 PCVampireInfo2 를 사용한다. PCInfo* m_pPCInfo; //-------------------------------------------------------------------------------- @@ -132,10 +132,10 @@ class GCMorph1 : public Packet { // quick item slot // gear - // (PDA) - // Ʈ - // , ̺Ʈ - // .. ó PDS ٿ.. - -; + // 저널(PDA) + // 수행 퀘스트 정보 + // 공지사항, 이벤트 정보 + // 흐흠.. 얘들은 처음 PDS를 켤 때 다운받을까나.. - -; }; @@ -166,7 +166,7 @@ class GCMorph1Factory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCMorph1PacketMaxSize , ϶. + // const static GCMorph1PacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + PCSlayerInfo2::getMaxSize() + InventoryInfo::getMaxSize() + GearInfo::getMaxSize() + ExtraInfo::getMaxSize(); diff --git a/src/Core/GCMorphSlayer2.cpp b/src/Core/GCMorphSlayer2.cpp index 65a29ca0..32277832 100644 --- a/src/Core/GCMorphSlayer2.cpp +++ b/src/Core/GCMorphSlayer2.cpp @@ -10,7 +10,7 @@ //---------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //---------------------------------------------------------------------- void GCMorphSlayer2::read(SocketInputStream& iStream) @@ -24,7 +24,7 @@ void GCMorphSlayer2::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCMorphSlayer2::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCMorphSlayer2.h b/src/Core/GCMorphSlayer2.h index 4fac92c9..0b5654e2 100644 --- a/src/Core/GCMorphSlayer2.h +++ b/src/Core/GCMorphSlayer2.h @@ -19,7 +19,7 @@ // // class GCMorphSlayer2; // -// slayer vampire ϴ Ѻ е鿡 . +// slayer등이 vampire로 변신하는 걸 지켜보는 분들에게 보낸다. //---------------------------------------------------------------------- class GCMorphSlayer2 : public Packet { @@ -30,10 +30,10 @@ class GCMorphSlayer2 : public Packet { ~GCMorphSlayer2() {}; public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -69,7 +69,7 @@ class GCMorphSlayer2 : public Packet { private: - // ܸ + // 외모 정보 PCSlayerInfo3 m_SlayerInfo3; }; diff --git a/src/Core/GCMorphVampire2.cpp b/src/Core/GCMorphVampire2.cpp index c4ea03e8..cbe61270 100644 --- a/src/Core/GCMorphVampire2.cpp +++ b/src/Core/GCMorphVampire2.cpp @@ -10,7 +10,7 @@ //---------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //---------------------------------------------------------------------- void GCMorphVampire2::read(SocketInputStream& iStream) @@ -24,7 +24,7 @@ void GCMorphVampire2::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCMorphVampire2::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCMorphVampire2.h b/src/Core/GCMorphVampire2.h index b5acf3c4..b551a30c 100644 --- a/src/Core/GCMorphVampire2.h +++ b/src/Core/GCMorphVampire2.h @@ -19,7 +19,7 @@ // // class GCMorphVampire2; // -// slayer vampire ϴ Ѻ е鿡 . +// slayer등이 vampire로 변신하는 걸 지켜보는 분들에게 보낸다. //---------------------------------------------------------------------- class GCMorphVampire2 : public Packet { @@ -30,10 +30,10 @@ class GCMorphVampire2 : public Packet { ~GCMorphVampire2() {}; public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -69,7 +69,7 @@ class GCMorphVampire2 : public Packet { private: - // ܸ + // 외모 정보 PCVampireInfo3 m_VampireInfo3; }; diff --git a/src/Core/GCMove.cpp b/src/Core/GCMove.cpp index 2681f7bc..6cb09c6b 100644 --- a/src/Core/GCMove.cpp +++ b/src/Core/GCMove.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCMove::read(SocketInputStream& iStream) @@ -30,7 +30,7 @@ void GCMove::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCMove::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCMove.h b/src/Core/GCMove.h index c5fc327e..c14ca825 100644 --- a/src/Core/GCMove.h +++ b/src/Core/GCMove.h @@ -18,8 +18,8 @@ // // class GCMove; // -// Ư ڰ ٴ Ŭ̾Ʈ -// ϴ Ŷ ü̴.(ObjectID,X,Y,DIR) Ѵ. +// 게임 서버에서 특정 사용자가 움직였다는 정보를 클라이언트로 보내줄 +// 때 사용하는 패킷 객체이다.(ObjectID,X,Y,DIR) 을 포함한다. // ////////////////////////////////////////////////////////////////////// @@ -32,10 +32,10 @@ class GCMove : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCMove : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCMovePacketSize , ϶. + // const static GCMovePacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szObjectID + szCoord + szCoord + szDir; } @@ -97,10 +97,10 @@ class GCMove : public Packet { private: - ObjectID_t m_ObjectID; // ũó ̵ - Coord_t m_X; // X ǥ - Coord_t m_Y; // Y ǥ - Dir_t m_Dir; // + ObjectID_t m_ObjectID; // 크리처 아이디 + Coord_t m_X; // X 좌표 + Coord_t m_Y; // Y 좌표 + Dir_t m_Dir; // 방향 }; @@ -131,7 +131,7 @@ class GCMoveFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCMovePacketSize , ϶. + // const static GCMovePacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szCoord + szCoord + szDir; } diff --git a/src/Core/GCMoveError.h b/src/Core/GCMoveError.h index f86a3afe..7667f445 100644 --- a/src/Core/GCMoveError.h +++ b/src/Core/GCMoveError.h @@ -28,10 +28,10 @@ class GCMoveError : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -79,8 +79,8 @@ class GCMoveError : public Packet { } private: - Coord_t m_X; // X ǥ - Coord_t m_Y; // Y ǥ + Coord_t m_X; // 현재 X 좌표 + Coord_t m_Y; // 현재 Y 좌표 }; diff --git a/src/Core/GCMoveOK.cpp b/src/Core/GCMoveOK.cpp index 9bb53130..aa1e838c 100644 --- a/src/Core/GCMoveOK.cpp +++ b/src/Core/GCMoveOK.cpp @@ -2,8 +2,8 @@ // // Filename : GCMoveOK.cc // Written By : elca@ewestsoft.com -// Description : CGMove ڱ ڽſ OK -// Ŷ Ŭ Լ +// Description : CGMove가 날아 왓을때 자기 자신에게 OK 사인을 날리기 +// 위한 패킷 클래스 함수 정의 // ////////////////////////////////////////////////////////////////////// @@ -15,7 +15,7 @@ #include "SocketEncryptOutputStream.h" ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCMoveOK::read(SocketInputStream& iStream) @@ -49,7 +49,7 @@ void GCMoveOK::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCMoveOK::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCMoveOK.h b/src/Core/GCMoveOK.h index 6559879a..c970eaee 100644 --- a/src/Core/GCMoveOK.h +++ b/src/Core/GCMoveOK.h @@ -16,8 +16,8 @@ // // class GCMoveOK; // -// Ư ڰ ٴ Ŭ̾Ʈ -// ϴ Ŷ ü̴.(CreatureID,X,Y,DIR) Ѵ. +// 게임 서버에서 특정 사용자가 움직였다는 정보를 클라이언트로 보내줄 +// 때 사용하는 패킷 객체이다.(CreatureID,X,Y,DIR) 을 포함한다. // ////////////////////////////////////////////////////////////////////// @@ -30,10 +30,10 @@ class GCMoveOK : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -46,7 +46,7 @@ class GCMoveOK : public Packet { // get packet body size // *OPTIMIZATION HINT* - // const static GCMoveOKPacketSize , ϶. + // const static GCMoveOKPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szCoord + szCoord + szDir; } @@ -93,9 +93,9 @@ class GCMoveOK : public Packet { private: - Coord_t m_X; // ǥ X ǥ - Coord_t m_Y; // ǥ Y ǥ - Dir_t m_Dir; // ǥ + Coord_t m_X; // 목표 X 좌표 + Coord_t m_Y; // 목표 Y 좌표 + Dir_t m_Dir; // 목표 방향 }; @@ -126,7 +126,7 @@ class GCMoveOKFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCMoveOKPacketSize , ϶. + // const static GCMoveOKPacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szCoord + szCoord + szDir; } diff --git a/src/Core/GCMoveOKHandler.cpp b/src/Core/GCMoveOKHandler.cpp index 60fc41b5..f607fedf 100644 --- a/src/Core/GCMoveOKHandler.cpp +++ b/src/Core/GCMoveOKHandler.cpp @@ -24,7 +24,7 @@ void GCMoveOKHandler::execute(GCMoveOK* pPacket, Player* pPlayer) ClientPlayer* pClientPlayer = dynamic_cast(pPlayer); - // ǥ ÷̾ ´. + // 다음 좌표를 플레이어에 지정해 놓는다. pClientPlayer->setX(pPacket->getX()); pClientPlayer->setY(pPacket->getY()); pClientPlayer->setDir(pPacket->getDir()); diff --git a/src/Core/GCMyStoreInfo.cpp b/src/Core/GCMyStoreInfo.cpp index a1953290..c99d47db 100644 --- a/src/Core/GCMyStoreInfo.cpp +++ b/src/Core/GCMyStoreInfo.cpp @@ -19,7 +19,7 @@ GCMyStoreInfo::~GCMyStoreInfo() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCMyStoreInfo::read(SocketInputStream& iStream) @@ -33,7 +33,7 @@ void GCMyStoreInfo::read(SocketInputStream& iStream) } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCMyStoreInfo::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCMyStoreInfoHandler.cpp b/src/Core/GCMyStoreInfoHandler.cpp index 2b90f5bc..367efe91 100644 --- a/src/Core/GCMyStoreInfoHandler.cpp +++ b/src/Core/GCMyStoreInfoHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCMyStoreInfoHandler::execute(GCMyStoreInfo* pPacket, Player* pPlayer) diff --git a/src/Core/GCNPCAsk.h b/src/Core/GCNPCAsk.h index a945a778..35b73707 100644 --- a/src/Core/GCNPCAsk.h +++ b/src/Core/GCNPCAsk.h @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////////////// // class GCNPCAsk; -// NPC 縦 ֺ PC 鿡 Ѵ. +// NPC 의 대사를 주변의 PC 들에게 전송한다. ////////////////////////////////////////////////////////////////////////////// class GCNPCAsk : public Packet { diff --git a/src/Core/GCNPCAskDynamic.cpp b/src/Core/GCNPCAskDynamic.cpp index 7d4fcab0..033f8c42 100644 --- a/src/Core/GCNPCAskDynamic.cpp +++ b/src/Core/GCNPCAskDynamic.cpp @@ -28,7 +28,7 @@ GCNPCAskDynamic::~GCNPCAskDynamic() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCNPCAskDynamic::read(SocketInputStream& iStream) @@ -49,10 +49,10 @@ void GCNPCAskDynamic::read(SocketInputStream& iStream) iStream.read(m_ContentsCount); for (int i = 0; i < m_ContentsCount; i++) { - // ڿ ̸ оδ. + // 문자열 길이를 읽어들인다. iStream.read(size); - // ִ ڿ̶ ü оδ. + // 내용이 있는 문자열이라면 내용 자체를 읽어들인다. if (size > 0) { string msg = ""; iStream.read(msg, size); @@ -64,7 +64,7 @@ void GCNPCAskDynamic::read(SocketInputStream& iStream) } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCNPCAskDynamic::write(SocketOutputStream& oStream) const @@ -87,11 +87,11 @@ void GCNPCAskDynamic::write(SocketOutputStream& oStream) const list::const_iterator itr = m_Contents.begin(); for (; itr != m_Contents.end(); itr++) { - // ڿ ̸ Ѵ. + // 문자열의 길이를 전송한다. size = (*itr).size(); oStream.write(size); - // ִ ڿ̶ ڿ ü Ѵ. + // 내용이 있는 문자열이라면 문자열 자체를 전송한다. if (size > 0) oStream.write(*itr); } diff --git a/src/Core/GCNPCAskDynamic.h b/src/Core/GCNPCAskDynamic.h index 58a525f7..6041e5e4 100644 --- a/src/Core/GCNPCAskDynamic.h +++ b/src/Core/GCNPCAskDynamic.h @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////////////// // class GCNPCAskDynamic; -// NPC 縦 ֺ PC 鿡 Ѵ. +// NPC 의 대사를 주변의 PC 들에게 전송한다. ////////////////////////////////////////////////////////////////////////////// class GCNPCAskDynamic : public Packet { diff --git a/src/Core/GCNPCAskDynamicHandler.cpp b/src/Core/GCNPCAskDynamicHandler.cpp index 903dc2e7..1e55eca7 100644 --- a/src/Core/GCNPCAskDynamicHandler.cpp +++ b/src/Core/GCNPCAskDynamicHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCNPCAskDynamicHandler::execute(GCNPCAskDynamic* pPacket, Player* pPlayer) diff --git a/src/Core/GCNPCAskHandler.cpp b/src/Core/GCNPCAskHandler.cpp index 65c3d1c3..df73dd07 100644 --- a/src/Core/GCNPCAskHandler.cpp +++ b/src/Core/GCNPCAskHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCNPCAskHandler::execute(GCNPCAsk* pPacket, Player* pPlayer) diff --git a/src/Core/GCNPCAskVariableHandler.cpp b/src/Core/GCNPCAskVariableHandler.cpp index f7142569..5edf380d 100644 --- a/src/Core/GCNPCAskVariableHandler.cpp +++ b/src/Core/GCNPCAskVariableHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCNPCAskVariableHandler::execute(GCNPCAskVariable* pPacket, Player* pPlayer) diff --git a/src/Core/GCNPCInfo.cpp b/src/Core/GCNPCInfo.cpp index dad71e45..3a64c15d 100644 --- a/src/Core/GCNPCInfo.cpp +++ b/src/Core/GCNPCInfo.cpp @@ -47,7 +47,7 @@ GCNPCInfo::~GCNPCInfo() } //-------------------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void GCNPCInfo::read(SocketInputStream& iStream) @@ -70,7 +70,7 @@ void GCNPCInfo::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCNPCInfo::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCNPCInfo.h b/src/Core/GCNPCInfo.h index d53c5548..3e2ccddf 100644 --- a/src/Core/GCNPCInfo.h +++ b/src/Core/GCNPCInfo.h @@ -23,16 +23,16 @@ #include "PacketFactory.h" #include "RideMotorcycleInfo.h" -#define FLAG_PREMIUM_ZONE 0x10 // premium ̴. -#define FLAG_PREMIUM_PLAY 0x01 // premium play ϴ ΰ? +#define FLAG_PREMIUM_ZONE 0x10 // premium으로 설정된 존이다. +#define FLAG_PREMIUM_PLAY 0x01 // premium play를 하는 중인가? //-------------------------------------------------------------------------------- // // class GCNPCInfo; // -// Ŭ̾Ʈ ؼ CGConnect Ŷ , ũó -// εؼ  غ ϰ ȴ. ״ PC , -// ׸ GCNPCInfo Ƽ Ŭ̾Ʈ ϰ ȴ. +// 클라이언트가 게임 서버에 접속해서 CGConnect 패킷을 보내면, 게임 서버는 크리처와 +// 소유 아이템을 로딩해서 존에 들어갈 준비를 하게 된다. 그다음 PC와 아이템 정보, +// 그리고 존 정보를 GCNPCInfo에 담아서 클라이언트로 전송하게 된다. // //-------------------------------------------------------------------------------- @@ -44,10 +44,10 @@ class GCNPCInfo : public Packet { // destructor ~GCNPCInfo(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -101,7 +101,7 @@ class GCNPCInfo : public Packet { // data members //-------------------------------------------------- private: - // ϴ NPC鿡 + // 현재 존에 존재하는 NPC들에 대한 정보 list m_NPCInfos; }; @@ -133,7 +133,7 @@ class GCNPCInfoFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCNPCInfoPacketMaxSize , ϶. + // const static GCNPCInfoPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { PacketSize_t size = 0; diff --git a/src/Core/GCNPCInfoHandler.cpp b/src/Core/GCNPCInfoHandler.cpp index 0dc3c769..f836fe4f 100644 --- a/src/Core/GCNPCInfoHandler.cpp +++ b/src/Core/GCNPCInfoHandler.cpp @@ -19,9 +19,9 @@ #endif //---------------------------------------------------------------------- -// Ŭ̾Ʈ κ GCNPCInfo Ŷ ް Ǹ, -// Ŷ ͵ Ŭ̾Ʈ , ε -// CGReady Ŷ ȴ. +// 클라이언트가 게임 서버로부터 GCNPCInfo 패킷을 받게 되면, +// 패킷 안의 데이터들을 클라이언트에 저장한 후, 데이터 로딩이 +// 끝이 나면 게임 서버로 CGReady 패킷을 보내면 된다. //---------------------------------------------------------------------- void GCNPCInfoHandler::execute(GCNPCInfo* pPacket, Player* pPlayer) diff --git a/src/Core/GCNPCResponse.cpp b/src/Core/GCNPCResponse.cpp index 1e1a50a2..58cae328 100644 --- a/src/Core/GCNPCResponse.cpp +++ b/src/Core/GCNPCResponse.cpp @@ -7,7 +7,7 @@ #include "GCNPCResponse.h" ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCNPCResponse::read(SocketInputStream& iStream) @@ -17,14 +17,14 @@ void GCNPCResponse::read(SocketInputStream& iStream) iStream.read(m_Code); switch (m_Code) { - // Ķ͸ ϴ ڵ + // 파라미터를 써야 하는 코드 case NPC_RESPONSE_REPAIR_OK: case NPC_RESPONSE_SILVER_COATING_OK: case NPC_RESPONSE_DONATION_OK: case NPC_RESPONSE_DECREASE_BALL: case NPC_RESPONSE_GUILD_SHOW_REGIST: case NPC_RESPONSE_SHOW_TAX_BALANCE: - case NPC_RESPONSE_WITHDRAW_TAX_OK: // Ͱ ã ߴ. + case NPC_RESPONSE_WITHDRAW_TAX_OK: // 길드 마스터가 세금을 찾는 데에 성공했다. case NPC_RESPONSE_COUPLE_CANNOT_MEET: case NPC_RESPONSE_NOT_COUPLE: case NPC_RESPONSE_QUEST: @@ -35,7 +35,7 @@ void GCNPCResponse::read(SocketInputStream& iStream) case NPC_RESPONSE_SHOW_COMMON_MESSAGE_DIALOG: iStream.read(m_Parameter); break; - // Ķ͸ ʾƵ Ǵ ڵ + // 파라미터를 쓰지 않아도 되는 코드 default: break; } @@ -44,7 +44,7 @@ void GCNPCResponse::read(SocketInputStream& iStream) } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCNPCResponse::write(SocketOutputStream& oStream) const @@ -54,14 +54,14 @@ void GCNPCResponse::write(SocketOutputStream& oStream) const oStream.write(m_Code); switch (m_Code) { - // Ķ͸ ϴ ڵ + // 파라미터를 써야 하는 코드 case NPC_RESPONSE_REPAIR_OK: case NPC_RESPONSE_SILVER_COATING_OK: case NPC_RESPONSE_DONATION_OK: case NPC_RESPONSE_DECREASE_BALL: case NPC_RESPONSE_GUILD_SHOW_REGIST: case NPC_RESPONSE_SHOW_TAX_BALANCE: - case NPC_RESPONSE_WITHDRAW_TAX_OK: // Ͱ ã ߴ. + case NPC_RESPONSE_WITHDRAW_TAX_OK: // 길드 마스터가 세금을 찾는 데에 성공했다. case NPC_RESPONSE_COUPLE_CANNOT_MEET: case NPC_RESPONSE_NOT_COUPLE: case NPC_RESPONSE_QUEST: @@ -72,7 +72,7 @@ void GCNPCResponse::write(SocketOutputStream& oStream) const case NPC_RESPONSE_SHOW_COMMON_MESSAGE_DIALOG: oStream.write(m_Parameter); break; - // Ķ͸ ʾƵ Ǵ ڵ + // 파라미터를 쓰지 않아도 되는 코드 default: break; } @@ -94,7 +94,7 @@ void GCNPCResponse::execute(Player* pPlayer) } ////////////////////////////////////////////////////////////////////////////// -// Ŷ +// 패킷 사이즈 ////////////////////////////////////////////////////////////////////////////// PacketSize_t GCNPCResponse::getPacketSize() const diff --git a/src/Core/GCNPCResponse.h b/src/Core/GCNPCResponse.h index de46a5c8..35649f29 100644 --- a/src/Core/GCNPCResponse.h +++ b/src/Core/GCNPCResponse.h @@ -11,7 +11,7 @@ #include "PacketFactory.h" enum { - // Ŭ̾Ʈ Ͽ ̽ ϴ ڵ + // 클라이언트로 하여금 적당한 인터페이스를 열도록 하는 코드 NPC_RESPONSE_INTERFACE_REPAIR = 0, NPC_RESPONSE_INTERFACE_STASHOPEN, // 1 NPC_RESPONSE_INTERFACE_SILVER_COATING, // 2 @@ -27,7 +27,7 @@ enum { NPC_RESPONSE_QUIT_DIALOGUE, // 10 NPC_RESPONSE_HEAL, // 11 - // Ŭ̾Ʈ Ŷ ڵ + // 클라이언트의 패킷에 대한 응답 코드 NPC_RESPONSE_REPAIR_OK, // 12 NPC_RESPONSE_REPAIR_FAIL_ITEM_NOT_EXIST, // 13 NPC_RESPONSE_REPAIR_FAIL_ITEM_TYPE, // 14 @@ -45,205 +45,205 @@ enum { NPC_RESPONSE_DONATION_OK, // 23 NPC_RESPONSE_DONATION_FAIL_MONEY, // 24 - // ӽÿ ̵ - // ġ ౸ NPC Response ؼ δ. + // 임시용 아이디 + // 월드컵 패치에서 축구공을 줄을 방법이 없는 관계로 NPC Response를 사용해서 줄인다. NPC_RESPONSE_DECREASE_BALL, // 25 - // - NPC_RESPONSE_TEAM_REGIST_FAIL_ALREADY_JOIN, // ѹ ? ڳ״ ̹ Ҽ̶ ֱ // + // 길드 관련 + NPC_RESPONSE_TEAM_REGIST_FAIL_ALREADY_JOIN, // 어디 한번 볼까? 자네는 이미 팀 소속이라고 나와 있군 // // 26 - NPC_RESPONSE_TEAM_REGIST_FAIL_QUIT_TIMEOUT, // ڳ״ ٸ Ż ʾұ. ϰ ϰ - // ൿϰ // 27 - NPC_RESPONSE_TEAM_REGIST_FAIL_CANCEL_TIMEOUT, // ڳ״ ʾұ. ǿ ϵ - // ڽ ⸣ . ϰ ȸ ϰ // + NPC_RESPONSE_TEAM_REGIST_FAIL_QUIT_TIMEOUT, // 자네는 다른 팀을 탈퇴한지 얼마 되지 않았군. 조금 더 신중하게 생각하고 + // 행동하게 // 27 + NPC_RESPONSE_TEAM_REGIST_FAIL_CANCEL_TIMEOUT, // 자네는 팀을 취소 당한 지 얼마 되지 않았군. 등록 조건에 부합하도록 + // 자신을 좀 더 기르고 오게. 좀 더 신중하게 기회를 엿보도록 하게 // // 28 - NPC_RESPONSE_TEAM_REGIST_FAIL_LEVEL, // Ǹ ν . Ƿ ۰ Գ // 29 - NPC_RESPONSE_TEAM_REGIST_FAIL_MONEY, // ʿϴٳ. ڳ״ ̴±... // 30 - NPC_RESPONSE_TEAM_REGIST_FAIL_FAME, // ̶.. ׷ ̸  ߴٳ. װ ڳװ - // Dz ǹ. Ƿ ۰ ٽ ãƿԳ // 31 - NPC_RESPONSE_TEAM_REGIST_FAIL_NAME, // ̸ ̹ ̰ ֱ, ٸ ̸ // 32 - NPC_RESPONSE_TEAM_REGIST_FAIL_DENY, // źεǾϴ. // 33 - - NPC_RESPONSE_TEAM_STARTING_FAIL_ALREADY_JOIN, // ̹ ٸ ԵǾ ֽϴ. // 34 - NPC_RESPONSE_TEAM_STARTING_FAIL_QUIT_TIMEOUT, // ڳ״ ٸ Ż ʾұ. ϰ - // ϰ ൿϰ // 35 - NPC_RESPONSE_TEAM_STARTING_FAIL_CANCEL_TIMEOUT, // ڳ״ ʾұ. ǿ ϵ - // ڽ ⸣ . ϰ ȸ ϰ + NPC_RESPONSE_TEAM_REGIST_FAIL_LEVEL, // 훌륭하지만 리더로써의 자질은 좀 부족한 것 같군. 실력을 닦고 오게나 // 29 + NPC_RESPONSE_TEAM_REGIST_FAIL_MONEY, // 팀을 만들려면 많은 돈이 필요하다네. 자네는 돈이 없어 보이는군... // 30 + NPC_RESPONSE_TEAM_REGIST_FAIL_FAME, // 이라.. 난 아직 그런 이름은 들어보지도 못했다네. 그건 자네가 + // 풋내기라는 것을 의미하지. 실력을 닦고 다시 찾아오게나 // 31 + NPC_RESPONSE_TEAM_REGIST_FAIL_NAME, // 팀 이름이 이미 쓰이고 있군, 다른 이름을 생각해 보게 // 32 + NPC_RESPONSE_TEAM_REGIST_FAIL_DENY, // 거부되었습니다. // 33 + + NPC_RESPONSE_TEAM_STARTING_FAIL_ALREADY_JOIN, // 당신은 이미 다른 팀에 가입되어 있습니다. // 34 + NPC_RESPONSE_TEAM_STARTING_FAIL_QUIT_TIMEOUT, // 자네는 다른 팀을 탈퇴한지 얼마 되지 않았군. 조금 더 신중하게 + // 생각하고 행동하게 // 35 + NPC_RESPONSE_TEAM_STARTING_FAIL_CANCEL_TIMEOUT, // 자네는 팀을 취소 당한 지 얼마 되지 않았군. 조건에 부합하도록 + // 자신을 좀 더 기르고 오게. 좀 더 신중하게 기회를 엿보도록 하게 // // 36 - NPC_RESPONSE_TEAM_STARTING_FAIL_LEVEL, // ڳ״ ̴±. Ƿ ۰ ãԳ. // + NPC_RESPONSE_TEAM_STARTING_FAIL_LEVEL, // 자네는 아직 부족한 점이 많아 보이는구만. 조금 더 실력을 닦고 찾게나. // // 37 - NPC_RESPONSE_TEAM_STARTING_FAIL_MONEY, // , ؼ ʿϴٳ // 38 - NPC_RESPONSE_TEAM_STARTING_FAIL_FAME, // ̶.. ׷ ̸  ߴٳ. װ ڳװ - // Dz ǹ. Ƿ ۰ ٽ ãƿԳ // 39 - NPC_RESPONSE_TEAM_STARTING_FAIL_DENY, // źεǾϴ. // 40 - - NPC_RESPONSE_CLAN_REGIST_FAIL_ALREADY_JOIN, // ѹ ? ڳ״ ̹ Ŭ ¶ - // ֱ // 41 - NPC_RESPONSE_CLAN_REGIST_FAIL_QUIT_TIMEOUT, // ڳ״ ٸ Ŭ Ż 󸶵 ʾұ. ̸ Ű - // ٴϴ . ϰ // 42 - NPC_RESPONSE_CLAN_REGIST_FAIL_CANCEL_TIMEOUT, // ڳ״ Ŭ ʾұ. ϰ ȸ - // ϰ // 43 - NPC_RESPONSE_CLAN_REGIST_FAIL_LEVEL, // Ǹ θӸν . Ƿ ۰ Գ. // + NPC_RESPONSE_TEAM_STARTING_FAIL_MONEY, // , 팀 등록을 위해서는 돈이 더 필요하다네 // 38 + NPC_RESPONSE_TEAM_STARTING_FAIL_FAME, // 이라.. 난 아직 그런 이름은 들어보지도 못했다네. 그건 자네가 + // 풋내기라는 것을 의미하지. 실력을 닦고 다시 찾아오게나 // 39 + NPC_RESPONSE_TEAM_STARTING_FAIL_DENY, // 거부되었습니다. // 40 + + NPC_RESPONSE_CLAN_REGIST_FAIL_ALREADY_JOIN, // 어디 한번 볼까? 자네는 이미 클랜과 서약을 맺은 상태라고 + // 나와있군 // 41 + NPC_RESPONSE_CLAN_REGIST_FAIL_QUIT_TIMEOUT, // 자네는 다른 클랜을 탈퇴한지 얼마되지 않았군. 나무 이리저리 옮겨 + // 다니는 것은 좋지 않지. 신중을 기하게 // 42 + NPC_RESPONSE_CLAN_REGIST_FAIL_CANCEL_TIMEOUT, // 자네는 클랜을 취소 당한 지 얼마 되지 않았군. 좀 더 신중하게 기회를 + // 엿보도록 하게 // 43 + NPC_RESPONSE_CLAN_REGIST_FAIL_LEVEL, // 훌륭하지만 우두머리로써의 자질은 좀 부족한 것 같군. 실력을 닦고 오게나. // // 44 - NPC_RESPONSE_CLAN_REGIST_FAIL_MONEY, // Ŭ Ϸ ʿϴٳ. ڳ״ ̴±... // 45 - NPC_RESPONSE_CLAN_REGIST_FAIL_FAME, // ̶..  ̾ΰ. Ǹ ð ٽ - // ãƿԳ. // 46 + NPC_RESPONSE_CLAN_REGIST_FAIL_MONEY, // 클랜을 등록하려면 많은 돈이 필요하다네. 자네는 돈이 없어보이는군... // 45 + NPC_RESPONSE_CLAN_REGIST_FAIL_FAME, // 이라.. 아직 어린 뱀파이어인가보군. 더 많은 피를 마시고 다시 + // 찾아오게나. // 46 NPC_RESPONSE_CLAN_REGIST_FAIL_NAME, // // 47 - NPC_RESPONSE_CLAN_REGIST_FAIL_DENY, // źεǾϴ. // 48 - - NPC_RESPONSE_CLAN_STARTING_FAIL_ALREADY_JOIN, // ̹ ٸ Ŭ ԵǾ ֽϴ. // 49 - NPC_RESPONSE_CLAN_STARTING_FAIL_QUIT_TIMEOUT, // ڳ״ ٸ Ŭ Ż 󸶵 ʾұ. ̸ Ű - // ٴϴ . ϰ // 50 - NPC_RESPONSE_CLAN_STARTING_FAIL_CANCEL_TIMEOUT, // ڳ״ Ŭ ʾұ. ϰ - // ȸ ϰ // 51 - NPC_RESPONSE_CLAN_STARTING_FAIL_LEVEL, // Ǹ ڰ DZ⿡ . ϰ - // Գ // 52 - NPC_RESPONSE_CLAN_STARTING_FAIL_MONEY, // ص Ŭ ִ ϸ Ŭ - // // 53 - NPC_RESPONSE_CLAN_STARTING_FAIL_FAME, // ̶.. ׷ ̸  ߴٳ. װ ڳװ - // Dz ǹ. Ƿ ۰ ٽ ãƿԳ // 54 - NPC_RESPONSE_CLAN_STARTING_FAIL_DENY, // źεǾϴ. // 55 - - NPC_RESPONSE_GUILD_SHOW_REGIST, // â // 56 - NPC_RESPONSE_GUILD_SHOW_STARTING_JOIN, // Ÿ â // 57 - NPC_RESPONSE_GUILD_SHOW_JOIN, // â // 58 - NPC_RESPONSE_GUILD_SHOW_QUIT, // Ż â // 59 - NPC_RESPONSE_GUILD_ERROR, // // 60 - - NPC_RESPONSE_TRADE_GIFT_BOX_OK, // ȯ // 61 - NPC_RESPONSE_TRADE_GIFT_BOX_NO_ITEM, // // 62 - NPC_RESPONSE_TRADE_GIFT_BOX_ALREADY_TRADE, // ڸ ̹ ѹ ȯߴ. // 63 - NPC_RESPONSE_TRADE_GIFT_BOX_ERROR, // ȯ Ÿ // 64 - - NPC_RESPONSE_REWARD_OK, // ޾ҽϴ. // 65 - NPC_RESPONSE_REWARD_FAIL, // ϴ. // 66 - NPC_RESPONSE_NO_EMPTY_SLOT, // ڸ ϴ. // 67 - - NPC_RESPONSE_SHOW_TAX_BALANCE, // ׿ִ ܾ ش. // 68 - NPC_RESPONSE_WITHDRAW_TAX_OK, // Ͱ ã ߴ. // 69 - NPC_RESPONSE_WITHDRAW_TAX_FAIL, // Ͱ ã ߴ. // 70 - - NPC_RESPONSE_NO_GUILD, // (Ŭ) ҼӵǾ ʽϴ. // 71 - NPC_RESPONSE_NOT_GUILD_MASTER, // (Ŭ) Ͱ ƴմϴ. // 72 - NPC_RESPONSE_HAS_NO_CASTLE, // (Ŭ) ϴ. // 73 - NPC_RESPONSE_NOT_YOUR_CASTLE, // (Ŭ) ƴմϴ. // 74 - - // - NPC_RESPONSE_NOT_ENOUGH_MONEY, // մϴ.(û -_-;) // 75 - NPC_RESPONSE_WAR_SCHEDULE_FULL, // áϴ. // 76 - NPC_RESPONSE_WAR_ALREADY_REGISTERED, // ̹ û߾ϴ. // 77 - NPC_RESPONSE_WAR_REGISTRATION_OK, // 쿡 Ǿϴ. // 78 - NPC_RESPONSE_ALREADY_HAS_CASTLE, // ̹ ֽϴ. // 79 - NPC_RESPONSE_WAR_UNAVAILABLE, // û ϴ. // 80 - - // - NPC_RESPONSE_RACE_WAR_JOIN_FAILED, // <> ûο áϴ. // 81 - NPC_RESPONSE_RACE_WAR_JOIN_OK, // û ߽ϴ. // 82 - NPC_RESPONSE_RACE_WAR_GO_FIRST_SERVER, // ù° û մϴ. // + NPC_RESPONSE_CLAN_REGIST_FAIL_DENY, // 거부되었습니다. // 48 + + NPC_RESPONSE_CLAN_STARTING_FAIL_ALREADY_JOIN, // 당신은 이미 다른 클랜에 가입되어 있습니다. // 49 + NPC_RESPONSE_CLAN_STARTING_FAIL_QUIT_TIMEOUT, // 자네는 다른 클랜을 탈퇴한지 얼마되지 않았군. 나무 이리저리 옮겨 + // 다니는 것은 좋지 않지. 신중을 기하게 // 50 + NPC_RESPONSE_CLAN_STARTING_FAIL_CANCEL_TIMEOUT, // 자네는 클랜을 취소 당한 지 얼마 되지 않았군. 좀 더 신중하게 + // 기회를 엿보도록 하게 // 51 + NPC_RESPONSE_CLAN_STARTING_FAIL_LEVEL, // 훌륭한 조력자가 되기에는 자질이 좀 부족한 것 같군. 가서 좀더 수련을 하고 + // 오게나 // 52 + NPC_RESPONSE_CLAN_STARTING_FAIL_MONEY, // 기술이 월등해도 클랜을 유지할 수 있는 돈이 부족하면 그 클랜은 무너지기 + // 쉽상이지 // 53 + NPC_RESPONSE_CLAN_STARTING_FAIL_FAME, // 이라.. 난 아직 그런 이름은 들어보지도 못했다네. 그건 자네가 + // 풋내기라는 것을 의미하지. 실력을 닦고 다시 찾아오게나 // 54 + NPC_RESPONSE_CLAN_STARTING_FAIL_DENY, // 거부되었습니다. // 55 + + NPC_RESPONSE_GUILD_SHOW_REGIST, // 길드 등록 창 띄우기 // 56 + NPC_RESPONSE_GUILD_SHOW_STARTING_JOIN, // 길드 스타팅 멤버 가입 창 띄우기 // 57 + NPC_RESPONSE_GUILD_SHOW_JOIN, // 길드 가입 창 띄우기 // 58 + NPC_RESPONSE_GUILD_SHOW_QUIT, // 길드 탈퇴 창 띄우기 // 59 + NPC_RESPONSE_GUILD_ERROR, // 길드 오류 // 60 + + NPC_RESPONSE_TRADE_GIFT_BOX_OK, // 선물 상자 교환 성공 // 61 + NPC_RESPONSE_TRADE_GIFT_BOX_NO_ITEM, // 선물 상자 없다 // 62 + NPC_RESPONSE_TRADE_GIFT_BOX_ALREADY_TRADE, // 선물 상자를 이미 한번 교환했다. // 63 + NPC_RESPONSE_TRADE_GIFT_BOX_ERROR, // 선물 상자 교환에 따른 기타 오류 // 64 + + NPC_RESPONSE_REWARD_OK, // 보상을 받았습니다. // 65 + NPC_RESPONSE_REWARD_FAIL, // 보상을 받을 수 없습니다. // 66 + NPC_RESPONSE_NO_EMPTY_SLOT, // 빈 자리가 없습니다. // 67 + + NPC_RESPONSE_SHOW_TAX_BALANCE, // 성에 쌓여있는 세금의 잔액을 보여준다. // 68 + NPC_RESPONSE_WITHDRAW_TAX_OK, // 길드 마스터가 세금을 찾는 데에 성공했다. // 69 + NPC_RESPONSE_WITHDRAW_TAX_FAIL, // 길드 마스터가 세금을 찾는 데에 실패했다. // 70 + + NPC_RESPONSE_NO_GUILD, // 팀(클랜)에 소속되어 있지 않습니다. // 71 + NPC_RESPONSE_NOT_GUILD_MASTER, // 팀(클랜) 마스터가 아닙니다. // 72 + NPC_RESPONSE_HAS_NO_CASTLE, // 팀(클랜)이 가진 성이 없습니다. // 73 + NPC_RESPONSE_NOT_YOUR_CASTLE, // 팀(클랜)이 소유한 성이 아닙니다. // 74 + + // 전쟁관련 + NPC_RESPONSE_NOT_ENOUGH_MONEY, // 돈이 부족합니다.(전쟁신청금 부족이지만 범용적으로 쓸려고 -_-;) // 75 + NPC_RESPONSE_WAR_SCHEDULE_FULL, // 전쟁 스케쥴이 꽉 찼습니다. // 76 + NPC_RESPONSE_WAR_ALREADY_REGISTERED, // 이미 전쟁을 신청했었습니다. // 77 + NPC_RESPONSE_WAR_REGISTRATION_OK, // 전쟁 스케쥴에 등록 되었습니다. // 78 + NPC_RESPONSE_ALREADY_HAS_CASTLE, // 이미 성을 가지고 있습니다. // 79 + NPC_RESPONSE_WAR_UNAVAILABLE, // 전쟁 신청을 할 수 없습니다. // 80 + + // 전쟁 참가 관련 + NPC_RESPONSE_RACE_WAR_JOIN_FAILED, // <사용자> 님 레벨대의 종족 전쟁 신청인원이 꽉 찼습니다. // 81 + NPC_RESPONSE_RACE_WAR_JOIN_OK, // 종족 전쟁 참가 신청을 했습니다. // 82 + NPC_RESPONSE_RACE_WAR_GO_FIRST_SERVER, // 종족 전쟁은 각 월드의 첫번째 서버에서만 신청 및 참가가 가능합니다. // // 83 - // ̺Ʈ - NPC_RESPONSE_GIVE_EVENT_ITEM_FAIL_NOW, // ̺Ʈ ϴ. // 84 - NPC_RESPONSE_GIVE_EVENT_ITEM_FAIL, // ̺Ʈ ϴ. // 85 - NPC_RESPONSE_GIVE_EVENT_ITEM_OK, // ̺Ʈ ޾ҽϴ. // 86 - NPC_RESPONSE_GIVE_PREMIUM_USER_ONLY, // ̾ ڸ ֽϴ. // 87 + // 이벤트 선물아이템 + NPC_RESPONSE_GIVE_EVENT_ITEM_FAIL_NOW, // 지금은 이벤트 아이템을 받을 수 없습니다. // 84 + NPC_RESPONSE_GIVE_EVENT_ITEM_FAIL, // 이벤트 아이템을 받을 수 없습니다. // 85 + NPC_RESPONSE_GIVE_EVENT_ITEM_OK, // 이벤트에 따른 아이템을 받았습니다. // 86 + NPC_RESPONSE_GIVE_PREMIUM_USER_ONLY, // 프리미엄서비스 사용자만 받을 수 있습니다. // 87 - // Ŀýû - NPC_RESPONSE_WAIT_FOR_MEET_COUPLE, // Ŀ û ̸ Էϼ // 88 - NPC_RESPONSE_COUPLE_MEET_SUCCESS, // Ŀ Ǿϴ. // 89 - NPC_RESPONSE_COUPLE_CANNOT_MEET, // Ŀ ϴ. // 90 - NPC_RESPONSE_MEET_WAIT_TIME_EXPIRED, // ð û ҵǾϴ. // 91 + // 커플신청 관련 + NPC_RESPONSE_WAIT_FOR_MEET_COUPLE, // 커플 신청 할 상대의 이름을 입력하세요 // 88 + NPC_RESPONSE_COUPLE_MEET_SUCCESS, // 커플이 성사되었습니다. // 89 + NPC_RESPONSE_COUPLE_CANNOT_MEET, // 커플이 성사될 수 없습니다. // 90 + NPC_RESPONSE_MEET_WAIT_TIME_EXPIRED, // 시간이 지나서 신청이 취소되었습니다. // 91 - NPC_RESPONSE_WAIT_FOR_APART_COUPLE, // ̸ Էϼ // 92 - NPC_RESPONSE_COUPLE_APART_SUCCESS, // ϴ. // 93 - NPC_RESPONSE_NOT_COUPLE, // Ŀ ƴ϶ ϴ. // 94 - NPC_RESPONSE_APART_WAIT_TIME_EXPIRED, // ð û ҵǾϴ. // 95 + NPC_RESPONSE_WAIT_FOR_APART_COUPLE, // 헤어질 상대의 이름을 입력하세요 // 92 + NPC_RESPONSE_COUPLE_APART_SUCCESS, // 헤어졌습니다. // 93 + NPC_RESPONSE_NOT_COUPLE, // 커플이 아니라서 헤어질 수 없습니다. // 94 + NPC_RESPONSE_APART_WAIT_TIME_EXPIRED, // 시간이 지나서 신청이 취소되었습니다. // 95 - NPC_RESPONSE_APART_COUPLE_FORCE, // Ϲ ̸ Էϼ. // 96 + NPC_RESPONSE_APART_COUPLE_FORCE, // 일방적으로 헤어질 상대의 이름을 입력하세요. // 96 - NPC_RESPONSE_QUEST, // Ʈ ޽ --; // 97 - NPC_RESPONSE_LOTTERY, // ֱ // 98 - NPC_RESPONSE_CANNOT_BUY, // ã ϴ. // 99 + NPC_RESPONSE_QUEST, // 퀘스트 관련 메시지 --; // 97 + NPC_RESPONSE_LOTTERY, // 복권 보여주기 // 98 + NPC_RESPONSE_CANNOT_BUY, // 지금은 구입한 아이템을 찾을 수 없습니다. // 99 - NPC_RESPONSE_CLEAR_RANK_BONUS_OK, // Ͻ ų Ǿϴ. // 100 - NPC_RESPONSE_NO_RANK_BONUS, // ش ڰ ϴ. // 101 - NPC_RESPONSE_ALREADY_CLEAR_RANK_BONUS, // Ͻ ų ֽϴ. // 102 + NPC_RESPONSE_CLEAR_RANK_BONUS_OK, // 선택하신 계급의 스킬이 삭제 되었습니다. // 100 + NPC_RESPONSE_NO_RANK_BONUS, // 해당 자격이 없습니다. // 101 + NPC_RESPONSE_ALREADY_CLEAR_RANK_BONUS, // 선택하신 계급 스킬을 삭제한 적이 있습니다. // 102 - NPC_RESPONSE_GNOME_CONTRACT_OK, // ɰ ξϴ. // 103 - NPC_RESPONSE_DOWN_SKILL, // ٿų ų ϼ>.< // 104 + NPC_RESPONSE_GNOME_CONTRACT_OK, // 대지 정령과의 계약을 맺었습니다. // 103 + NPC_RESPONSE_DOWN_SKILL, // 다운시킬 스킬을 선택하세요>.< // 104 - // ƿ콺 - NPC_RESPONSE_GUILD_REGIST_FAIL_ALREADY_JOIN, // ѹ ? ڳ״ ̹ Ҽ̶ ֱ + // 아우스터즈 길드 관련 + NPC_RESPONSE_GUILD_REGIST_FAIL_ALREADY_JOIN, // 어디 한번 볼까? 자네는 이미 길드 소속이라고 나와 있군 // // 105 - NPC_RESPONSE_GUILD_REGIST_FAIL_QUIT_TIMEOUT, // ڳ״ ٸ 带 Ż ʾұ. ϰ - // ϰ ൿϰ // 106 - NPC_RESPONSE_GUILD_REGIST_FAIL_CANCEL_TIMEOUT, // ڳ״ 带 ʾұ. ǿ - // ϵ ڽ ⸣ . ϰ ȸ - // ϰ // 107 - NPC_RESPONSE_GUILD_REGIST_FAIL_LEVEL, // Ǹ ν . Ƿ ۰ Գ // 108 - NPC_RESPONSE_GUILD_REGIST_FAIL_MONEY, // 带 ʿϴٳ. ڳ״ ̴±... // 109 - NPC_RESPONSE_GUILD_REGIST_FAIL_FAME, // ̶.. ׷ ̸  ߴٳ. װ ڳװ - // Dz ǹ. Ƿ ۰ ٽ ãƿԳ // 110 - NPC_RESPONSE_GUILD_REGIST_FAIL_NAME, // ̸ ̹ ̰ ֱ, ٸ ̸ // 111 - NPC_RESPONSE_GUILD_REGIST_FAIL_DENY, // źεǾϴ. // 112 - - NPC_RESPONSE_GUILD_STARTING_FAIL_ALREADY_JOIN, // ̹ ٸ 忡 ԵǾ ֽϴ. // 113 - NPC_RESPONSE_GUILD_STARTING_FAIL_QUIT_TIMEOUT, // ڳ״ ٸ 带 Ż ʾұ. ϰ - // ϰ ൿϰ // 114 - NPC_RESPONSE_GUILD_STARTING_FAIL_CANCEL_TIMEOUT, // ڳ״ 带 ʾұ. ǿ ϵ - // ڽ ⸣ . ϰ ȸ ϰ + NPC_RESPONSE_GUILD_REGIST_FAIL_QUIT_TIMEOUT, // 자네는 다른 길드를 탈퇴한지 얼마 되지 않았군. 조금 더 신중하게 + // 생각하고 행동하게 // 106 + NPC_RESPONSE_GUILD_REGIST_FAIL_CANCEL_TIMEOUT, // 자네는 길드를 취소 당한 지 얼마 되지 않았군. 등록 조건에 + // 부합하도록 자신을 좀 더 기르고 오게. 좀 더 신중하게 기회를 + // 엿보도록 하게 // 107 + NPC_RESPONSE_GUILD_REGIST_FAIL_LEVEL, // 훌륭하지만 리더로써의 자질은 좀 부족한 것 같군. 실력을 닦고 오게나 // 108 + NPC_RESPONSE_GUILD_REGIST_FAIL_MONEY, // 길드를 만들려면 많은 돈이 필요하다네. 자네는 돈이 없어 보이는군... // 109 + NPC_RESPONSE_GUILD_REGIST_FAIL_FAME, // 이라.. 난 아직 그런 이름은 들어보지도 못했다네. 그건 자네가 + // 풋내기라는 것을 의미하지. 실력을 닦고 다시 찾아오게나 // 110 + NPC_RESPONSE_GUILD_REGIST_FAIL_NAME, // 길드 이름이 이미 쓰이고 있군, 다른 이름을 생각해 보게 // 111 + NPC_RESPONSE_GUILD_REGIST_FAIL_DENY, // 거부되었습니다. // 112 + + NPC_RESPONSE_GUILD_STARTING_FAIL_ALREADY_JOIN, // 당신은 이미 다른 길드에 가입되어 있습니다. // 113 + NPC_RESPONSE_GUILD_STARTING_FAIL_QUIT_TIMEOUT, // 자네는 다른 길드를 탈퇴한지 얼마 되지 않았군. 조금 더 신중하게 + // 생각하고 행동하게 // 114 + NPC_RESPONSE_GUILD_STARTING_FAIL_CANCEL_TIMEOUT, // 자네는 길드를 취소 당한 지 얼마 되지 않았군. 조건에 부합하도록 + // 자신을 좀 더 기르고 오게. 좀 더 신중하게 기회를 엿보도록 하게 // // 115 - NPC_RESPONSE_GUILD_STARTING_FAIL_LEVEL, // ڳ״ ̴±. Ƿ ۰ ãԳ. // + NPC_RESPONSE_GUILD_STARTING_FAIL_LEVEL, // 자네는 아직 부족한 점이 많아 보이는구만. 조금 더 실력을 닦고 찾게나. // // 116 - NPC_RESPONSE_GUILD_STARTING_FAIL_MONEY, // , ؼ ʿϴٳ // 117 - NPC_RESPONSE_GUILD_STARTING_FAIL_FAME, // ̶.. ׷ ̸  ߴٳ. װ ڳװ - // Dz ǹ. Ƿ ۰ ٽ ãƿԳ // 118 - NPC_RESPONSE_GUILD_STARTING_FAIL_DENY, // źεǾϴ. // 119 - - NPC_RESPONSE_TOO_MANY_GUILD_REGISTERED, // û 尡 ʹ Ƽ û ϴ. // 120 - NPC_RESPONSE_REINFORCE_DENYED, // û ̹ źδؼ û ϴ. // 121 - NPC_RESPONSE_ALREADY_REINFORCE_ACCEPTED, // û 㰡 尡 ̹ ־ û ϴ. // + NPC_RESPONSE_GUILD_STARTING_FAIL_MONEY, // , 길드 등록을 위해서는 돈이 더 필요하다네 // 117 + NPC_RESPONSE_GUILD_STARTING_FAIL_FAME, // 이라.. 난 아직 그런 이름은 들어보지도 못했다네. 그건 자네가 + // 풋내기라는 것을 의미하지. 실력을 닦고 다시 찾아오게나 // 118 + NPC_RESPONSE_GUILD_STARTING_FAIL_DENY, // 거부되었습니다. // 119 + + NPC_RESPONSE_TOO_MANY_GUILD_REGISTERED, // 신청한 길드가 너무 많아서 신청할 수 없습니다. // 120 + NPC_RESPONSE_REINFORCE_DENYED, // 수비측 참전 신청이 이미 거부당해서 재신청 할 수 없습니다. // 121 + NPC_RESPONSE_ALREADY_REINFORCE_ACCEPTED, // 수비측 참전 신청이 허가된 길드가 이미 있어서 신청할 수 없습니다. // // 122 - NPC_RESPONSE_NO_WAR_REGISTERED, // û 尡  û ϴ. // 123 - NPC_RESPONSE_CANNOT_ACCEPT, // û ϴ. - NPC_RESPONSE_ACCEPT_OK, // û Ͽϴ. - NPC_RESPONSE_CANNOT_DENY, // û ź ϴ. - NPC_RESPONSE_DENY_OK, // û źϿϴ. + NPC_RESPONSE_NO_WAR_REGISTERED, // 공성 신청한 길드가 없어서 수비측 참전 신청을 할 수 없습니다. // 123 + NPC_RESPONSE_CANNOT_ACCEPT, // 수비측 참전 신청을 수락할 수 없습니다. + NPC_RESPONSE_ACCEPT_OK, // 참전 신청을 수락하였습니다. + NPC_RESPONSE_CANNOT_DENY, // 수비측 참전 신청을 거부할 수 없습니다. + NPC_RESPONSE_DENY_OK, // 참전 신청을 거부하였습니다. - NPC_RESPONSE_SHOW_TAX_RATIO, // ش. - NPC_RESPONSE_MODIFY_TAX_RATIO_OK, // ߴ. - NPC_RESPONSE_MODIFY_TAX_RATIO_FAIL, // ߴ. + NPC_RESPONSE_SHOW_TAX_RATIO, // 성의 세율을 보여준다. + NPC_RESPONSE_MODIFY_TAX_RATIO_OK, // 성의 세율을 조절했다. + NPC_RESPONSE_MODIFY_TAX_RATIO_FAIL, // 성의 세율을 조절했다. - NPC_RESPONSE_SWAP_ADVANCEMENT_ITEM, // ȯش. - NPC_RESPONSE_NOT_ADVANCED, // ʾƼ ȯ ȵ˴ϴ. + NPC_RESPONSE_SWAP_ADVANCEMENT_ITEM, // 승직 아이템으로 교환해준다. + NPC_RESPONSE_NOT_ADVANCED, // 승직하지 않아서 아이템 교환이 안됩니다. - NPC_RESPONSE_SHOW_DONATION_DIALOG, // â . - NPC_RESPONSE_SHOW_DONATION_COMPLETE_DIALOG, // ֽ ݾ ձ ʿ ҿ ̿ Ͽ ϰ - // Դϴ. ݿ ּż մϴ. - NPC_RESPONSE_SHOW_CONFIRM_GET_EVENT_ITEM_DIALOG, // ̺Ʈ ޱ Ȯ ̾α׸ . - NPC_RESPONSE_SHOW_COMMON_MESSAGE_DIALOG, // ޽ ̾α׸ . + NPC_RESPONSE_SHOW_DONATION_DIALOG, // 기부창을 띄운다. + NPC_RESPONSE_SHOW_DONATION_COMPLETE_DIALOG, // 기부해주신 금액은 온정의 손길이 필요한 불우한 이웃을 위하여 소중하게 + // 쓰여질 것입니다. 모금에 참여해주셔서 감사합니다. + NPC_RESPONSE_SHOW_CONFIRM_GET_EVENT_ITEM_DIALOG, // 이벤트 아이템 받기 확인 다이얼로그를 띄운다. + NPC_RESPONSE_SHOW_COMMON_MESSAGE_DIALOG, // 각종 메시지 다이얼로그를 띄운다. NPC_RESPONSE_SHOW_DONATION_WEDDING_COMPLETE_DIALOG, // - NPC_RESPONSE_SHOW_ALEADY_DONATED_DIALOG, // ̹ DZ ̽ϴ. + NPC_RESPONSE_SHOW_ALEADY_DONATED_DIALOG, // 이미 축의금의 내셨습니다. NPC_RESPONSE_MAX // 139 }; enum CoupleMessage { - COUPLE_MESSAGE_NOT_EVENT_TERM = 1, // Ŀ ̺Ʈ Ⱓ ƴմϴ. - COUPLE_MESSAGE_ALREADY_WAITING, // ̹ 븦 ٸ ֽϴ. - COUPLE_MESSAGE_LOGOFF, // α ʾҽϴ. - COUPLE_MESSAGE_DIFFERENT_RACE, // ٸ Դϴ. - COUPLE_MESSAGE_SAME_SEX, // ̿ Ŀ ˴ϴ. - COUPLE_MESSAGE_NOT_PAY_PLAYER, // ڰ ƴմϴ. - COUPLE_MESSAGE_ALREADY_COUPLE, // ̹ ĿԴϴ. - COUPLE_MESSAGE_WAS_COUPLE, // Ŀ ֽϴ. - COUPLE_MESSAGE_NOT_ENOUGH_GOLD, // մϴ. - COUPLE_MESSAGE_NOT_ENOUGH_ATTR, // ɷġ մϴ. - COUPLE_MESSAGE_NOT_ENOUGH_LEVEL, // մϴ. - COUPLE_MESSAGE_INVENTORY_FULL, // Ŀø մϴ. - COUPLE_MESSAGE_NO_WAITING, // ٸ Ʈʰ ϴ. - COUPLE_MESSAGE_NOT_COUPLE, // Ŀ ƴմϴ. + COUPLE_MESSAGE_NOT_EVENT_TERM = 1, // 커플 이벤트 기간이 아닙니다. + COUPLE_MESSAGE_ALREADY_WAITING, // 이미 상대를 기다리고 있습니다. + COUPLE_MESSAGE_LOGOFF, // 상대방이 로그인 하지 않았습니다. + COUPLE_MESSAGE_DIFFERENT_RACE, // 서로 다른 종족입니다. + COUPLE_MESSAGE_SAME_SEX, // 남녀 사이에만 커플이 성립됩니다. + COUPLE_MESSAGE_NOT_PAY_PLAYER, // 유료 사용자가 아닙니다. + COUPLE_MESSAGE_ALREADY_COUPLE, // 이미 커플입니다. + COUPLE_MESSAGE_WAS_COUPLE, // 커플을 맺은 적이 있습니다. + COUPLE_MESSAGE_NOT_ENOUGH_GOLD, // 소지금이 부족합니다. + COUPLE_MESSAGE_NOT_ENOUGH_ATTR, // 능력치가 부족합니다. + COUPLE_MESSAGE_NOT_ENOUGH_LEVEL, // 레벨이 부족합니다. + COUPLE_MESSAGE_INVENTORY_FULL, // 커플링을 받을 공간이 부족합니다. + COUPLE_MESSAGE_NO_WAITING, // 당신을 기다리는 파트너가 없습니다. + COUPLE_MESSAGE_NOT_COUPLE, // 커플이 아닙니다. COUPLE_MESSAGE_MAX }; @@ -266,14 +266,14 @@ enum QuestMessage { }; enum CommonMessage { - YOU_CAN_GET_EVENT_200501_COMBACK_ITEM = 0, // 0 Ĺ ֽϴ. - YOU_CAN_GET_EVENT_200501_COMBACK_PREMIUM_ITEM, // 1 Ĺ ֽϴ. - YOU_CAN_GET_EVENT_200501_COMBACK_RECOMMEND_ITEM, // 2 Ĺ õ ֽϴ. - YOU_GET_EVENT_ITEM, // 3 ̺Ʈ ޾ҽϴ. - NOT_ENOUGH_INVENTORY_SPACE, // 4 κ丮 մϴ. - ALEADY_GET_EVENT_ITEM, // 5 ̹ ̺Ʈ ϼ̽ϴ. - FAIL_GET_EVENT_ITEM, // 6 ̺Ʈ ޱ - YOU_ARE_NOT_EVENT_TARGET, // 7 ̺Ʈ ڰ ƴϴ. + YOU_CAN_GET_EVENT_200501_COMBACK_ITEM = 0, // 0 컴백 사용자 아이템을 받을 수 있습니다. + YOU_CAN_GET_EVENT_200501_COMBACK_PREMIUM_ITEM, // 1 컴백 사용자 결제 아이템을 받을 수 있습니다. + YOU_CAN_GET_EVENT_200501_COMBACK_RECOMMEND_ITEM, // 2 컴백 사용자 추천 아이템을 받을 수 있습니다. + YOU_GET_EVENT_ITEM, // 3 이벤트 아이템을 받았습니다. + NOT_ENOUGH_INVENTORY_SPACE, // 4 인벤토리에 공간이 부족합니다. + ALEADY_GET_EVENT_ITEM, // 5 이미 이벤트 아이템을 수령하셨습니다. + FAIL_GET_EVENT_ITEM, // 6 이벤트 아이템 받기 실패 + YOU_ARE_NOT_EVENT_TARGET, // 7 이벤트 대상자가 아니다. COMMON_MESSAGE_MAX }; diff --git a/src/Core/GCNPCSay.h b/src/Core/GCNPCSay.h index 0e42e91b..18664041 100644 --- a/src/Core/GCNPCSay.h +++ b/src/Core/GCNPCSay.h @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////////////// // class GCNPCSay; -// NPC 縦 ֺ PC 鿡 Ѵ. +// NPC 의 대사를 주변의 PC 들에게 전송한다. ////////////////////////////////////////////////////////////////////////////// class GCNPCSay : public Packet { diff --git a/src/Core/GCNPCSayDynamic.h b/src/Core/GCNPCSayDynamic.h index 55fb13d1..b674eae1 100644 --- a/src/Core/GCNPCSayDynamic.h +++ b/src/Core/GCNPCSayDynamic.h @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////////////// // class GCNPCSayDynamic; -// NPC 縦 ֺ PC 鿡 Ѵ. +// NPC 의 대사를 주변의 PC 들에게 전송한다. ////////////////////////////////////////////////////////////////////////////// class GCNPCSayDynamic : public Packet { diff --git a/src/Core/GCNPCSayDynamicHandler.cpp b/src/Core/GCNPCSayDynamicHandler.cpp index 7f57e11e..9f7214b0 100644 --- a/src/Core/GCNPCSayDynamicHandler.cpp +++ b/src/Core/GCNPCSayDynamicHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCNPCSayDynamicHandler::execute(GCNPCSayDynamic* pPacket, Player* pPlayer) diff --git a/src/Core/GCNPCSayHandler.cpp b/src/Core/GCNPCSayHandler.cpp index fe21a270..ea3c397b 100644 --- a/src/Core/GCNPCSayHandler.cpp +++ b/src/Core/GCNPCSayHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCNPCSayHandler::execute(GCNPCSay* pPacket, Player* pPlayer) diff --git a/src/Core/GCNicknameList.cpp b/src/Core/GCNicknameList.cpp index e866c42f..dff73f16 100644 --- a/src/Core/GCNicknameList.cpp +++ b/src/Core/GCNicknameList.cpp @@ -2,8 +2,8 @@ // // Filename : GCNicknameList.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -31,7 +31,7 @@ GCNicknameList::~GCNicknameList() } ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCNicknameList::read(SocketInputStream& iStream) @@ -54,7 +54,7 @@ void GCNicknameList::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCNicknameList::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/GCNoticeEvent.cpp b/src/Core/GCNoticeEvent.cpp index 08b51757..5ebef2ae 100644 --- a/src/Core/GCNoticeEvent.cpp +++ b/src/Core/GCNoticeEvent.cpp @@ -7,7 +7,7 @@ #include "GCNoticeEvent.h" ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCNoticeEvent::read(SocketInputStream& iStream) @@ -17,7 +17,7 @@ void GCNoticeEvent::read(SocketInputStream& iStream) iStream.read(m_Code); switch (m_Code) { - // Ķ͸ ϴ ڵ + // 파라미터를 써야 하는 코드 case NOTICE_EVENT_MASTER_COMBAT_TIME: case NOTICE_EVENT_KICK_OUT_FROM_ZONE: case NOTICE_EVENT_CONTINUAL_GROUND_ATTACK: @@ -42,7 +42,7 @@ void GCNoticeEvent::read(SocketInputStream& iStream) case NOTICE_EVENT_CROWN_PRICE: iStream.read(m_Parameter); break; - // Ķ͸ ʾƵ Ǵ ڵ + // 파라미터를 쓰지 않아도 되는 코드 default: break; } @@ -51,7 +51,7 @@ void GCNoticeEvent::read(SocketInputStream& iStream) } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCNoticeEvent::write(SocketOutputStream& oStream) const @@ -61,7 +61,7 @@ void GCNoticeEvent::write(SocketOutputStream& oStream) const oStream.write(m_Code); switch (m_Code) { - // Ķ͸ ϴ ڵ + // 파라미터를 써야 하는 코드 case NOTICE_EVENT_MASTER_COMBAT_TIME: case NOTICE_EVENT_KICK_OUT_FROM_ZONE: case NOTICE_EVENT_CONTINUAL_GROUND_ATTACK: @@ -86,7 +86,7 @@ void GCNoticeEvent::write(SocketOutputStream& oStream) const case NOTICE_EVENT_CROWN_PRICE: oStream.write(m_Parameter); break; - // Ķ͸ ʾƵ Ǵ ڵ + // 파라미터를 쓰지 않아도 되는 코드 default: break; } @@ -108,7 +108,7 @@ void GCNoticeEvent::execute(Player* pPlayer) } ////////////////////////////////////////////////////////////////////////////// -// Ŷ +// 패킷 사이즈 ////////////////////////////////////////////////////////////////////////////// PacketSize_t GCNoticeEvent::getPacketSize() const @@ -119,7 +119,7 @@ PacketSize_t GCNoticeEvent::getPacketSize() const PacketSize_t size = szWORD; switch (m_Code) { - // Ķ͸ ϴ ڵ + // 파라미터를 써야 하는 코드 case NOTICE_EVENT_MASTER_COMBAT_TIME: case NOTICE_EVENT_KICK_OUT_FROM_ZONE: case NOTICE_EVENT_CONTINUAL_GROUND_ATTACK: @@ -144,7 +144,7 @@ PacketSize_t GCNoticeEvent::getPacketSize() const case NOTICE_EVENT_CROWN_PRICE: size += szuint; break; - // Ķ͸ ʾƵ Ǵ ڵ + // 파라미터를 쓰지 않아도 되는 코드 default: break; } diff --git a/src/Core/GCNoticeEvent.h b/src/Core/GCNoticeEvent.h index 5a80f07a..957c34c2 100644 --- a/src/Core/GCNoticeEvent.h +++ b/src/Core/GCNoticeEvent.h @@ -15,25 +15,25 @@ #endif enum { - NOTICE_EVENT_KICK_OUT_FROM_ZONE, // ߹ϴ ð() - NOTICE_EVENT_CONTINUAL_GROUND_ATTACK, // Ͼ () - NOTICE_EVENT_CONTINUAL_GROUND_ATTACK_END, // . - NOTICE_EVENT_MASTER_COMBAT_TIME, // Ϳ ο ִ ð() - NOTICE_EVENT_MASTER_COMBAT_END, // Ϳ ο° . - NOTICE_EVENT_METEOR_STRIKE, // ׿ () - NOTICE_EVENT_METEOR_STRIKE_END, // ׿ - NOTICE_EVENT_PREMIUM_HALF_START, // ̾ ڴ /û ݰ - NOTICE_EVENT_PREMIUM_HALF_END, // ̺Ʈ - NOTICE_EVENT_SHOP_TAX_CHANGE, // ٲ.() - - // - NOTICE_EVENT_WAR_OVER, // ﳡ(CastleZoneID) - NOTICE_EVENT_RACE_WAR_OVER, // ﳡ - - // ó ij + NOTICE_EVENT_KICK_OUT_FROM_ZONE, // 존에서 추방하는 시간(초) + NOTICE_EVENT_CONTINUAL_GROUND_ATTACK, // 존에서 지속적인 공격이 일어나는 경우(초) + NOTICE_EVENT_CONTINUAL_GROUND_ATTACK_END, // 존에서 지속적인 공격이 끝났다. + NOTICE_EVENT_MASTER_COMBAT_TIME, // 마스터와 싸울 수 있는 남은 시간(초) + NOTICE_EVENT_MASTER_COMBAT_END, // 마스터와 싸우는게 끝났다. + NOTICE_EVENT_METEOR_STRIKE, // 메테오 공격(초) + NOTICE_EVENT_METEOR_STRIKE_END, // 메테오 끝 + NOTICE_EVENT_PREMIUM_HALF_START, // 프리미엄 사용자는 포션/혈청 반값 + NOTICE_EVENT_PREMIUM_HALF_END, // 이벤트 끝 + NOTICE_EVENT_SHOP_TAX_CHANGE, // 상점 세금 바꼈다.(세율) + + // 전쟁관련 + NOTICE_EVENT_WAR_OVER, // 전쟁끝(CastleZoneID) + NOTICE_EVENT_RACE_WAR_OVER, // 종족 전쟁끝 + + // 처음 캐릭터 생성했을 때 NOTICE_EVENT_WELCOME_MESSAGE, - // Ʈ ҸӴ -_-; + // 퀘스트 할머니 만나기 -_-; NOTICE_EVENT_MEET_GRANDMA, NOTICE_EVENT_MEET_FISHSHOP_MASTER, @@ -42,68 +42,68 @@ enum { NOTICE_EVENT_RUN_HORN, - NOTICE_EVENT_MASTER_LAIR_OPEN, // (丮) Ƚϴ. - NOTICE_EVENT_MASTER_LAIR_CLOSED, // (丮) ϴ. - NOTICE_EVENT_MASTER_LAIR_COUNT, // (丮) ð 5 ҽϴ. + NOTICE_EVENT_MASTER_LAIR_OPEN, // 마스터 레어(바토리레어)가 열렸습니다. + NOTICE_EVENT_MASTER_LAIR_CLOSED, // 마스터 레어(바토리레어)가 닫혔습니다. + NOTICE_EVENT_MASTER_LAIR_COUNT, // 마스터 레어(바토리레어) 출입 가능 시간이 5분 남았습니다. - NOTICE_EVENT_CONTRACT_GNOMES_HORN, // ÿ ž Ͻ ֽϴ. - NOTICE_EVENT_NOT_ENOUGH_MONEY, // ڶϴ. + NOTICE_EVENT_CONTRACT_GNOMES_HORN, // 시오람에게 가서 계약을 맺으셔야 사용하실 수 있습니다. + NOTICE_EVENT_NOT_ENOUGH_MONEY, // 돈이 모자랍니다. - NOTICE_EVENT_MINI_GAME, // ã~ + NOTICE_EVENT_MINI_GAME, // 지뢰찾기~ - NOTICE_EVENT_GET_RIFINIUM, // ǴϿ ȹϿϴ. - NOTICE_EVENT_INVENTORY_FULL, // κ丮 մϴ. + NOTICE_EVENT_GET_RIFINIUM, // 리피니움을 획득하였습니다. + NOTICE_EVENT_INVENTORY_FULL, // 인벤토리 내의 여유 공간이 부족합니다. - NOTICE_EVENT_FLAG_WAR_READY, // Capture the Flag! ̺Ʈ ǽմϴ. - NOTICE_EVENT_FLAG_WAR_START, // ̺Ʈ մϴ. - NOTICE_EVENT_FLAG_WAR_FINISH, // ̺Ʈ ϴ. 3 ϴ. - NOTICE_EVENT_FLAG_POURED_ITEM, // Capture the Flag ̺Ʈ Խϴ. + NOTICE_EVENT_FLAG_WAR_READY, // Capture the Flag! 이벤트를 실시합니다. + NOTICE_EVENT_FLAG_WAR_START, // 이벤트를 시작합니다. + NOTICE_EVENT_FLAG_WAR_FINISH, // 이벤트가 끝났습니다. 3분 뒤 아이템이 터집니다. + NOTICE_EVENT_FLAG_POURED_ITEM, // Capture the Flag 이벤트 아이템이 나왔습니다. - NOTICE_EVENT_ENTER_BEGINNER_ZONE, // ʺ ðڽϱ? - NOTICE_EVENT_LOGIN_JUST_NOW, // α߽ϴ. + NOTICE_EVENT_ENTER_BEGINNER_ZONE, // 초보자존으로 들어가시겠습니까? + NOTICE_EVENT_LOGIN_JUST_NOW, // 방금 로그인했습니다. - NOTICE_EVENT_LEVEL_WAR_ARRANGED, // ۵˴ϴ. - NOTICE_EVENT_LEVEL_WAR_STARTED, // ۵Ǿϴ. + NOTICE_EVENT_LEVEL_WAR_ARRANGED, // 곧 레벨별 전쟁이 시작됩니다. + NOTICE_EVENT_LEVEL_WAR_STARTED, // 레벨별 전쟁이 시작되었습니다. - NOTICE_EVENT_RACE_WAR_SOON, // 3Ͼȿ մϴ. + NOTICE_EVENT_RACE_WAR_SOON, // 3일안에 종족전을 합니다. - NOTICE_EVENT_LEVEL_WAR_OVER, // . - NOTICE_EVENT_NETMARBLE_CARD_FULL, // 99 ݸ ī带 Ҵ. + NOTICE_EVENT_LEVEL_WAR_OVER, // 레벨별 전쟁이 끝났다. + NOTICE_EVENT_NETMARBLE_CARD_FULL, // 99개의 넷마블 카드를 다 모았다. - NOTICE_EVENT_HOLYDAY, // ̴. - NOTICE_EVENT_CAN_PET_QUEST, // Ʈ ִ. + NOTICE_EVENT_HOLYDAY, // 오늘은 국경일이다. + NOTICE_EVENT_CAN_PET_QUEST, // 펫 퀘스트를 할 수 있다. - NOTICE_EVENT_SEND_SMS, // SMS ̽ ּ + NOTICE_EVENT_SEND_SMS, // SMS보내게 인터페이스 띄워주셈 - NOTICE_EVENT_GDR_LAIR_ENDING_1, // 1 :) + NOTICE_EVENT_GDR_LAIR_ENDING_1, // 1차 엔딩 :) - NOTICE_EVENT_GOLD_MEDALS, // ݸ޴ ~ - NOTICE_EVENT_CROWN_PRICE, // + NOTICE_EVENT_GOLD_MEDALS, // 금메달 개수~ + NOTICE_EVENT_CROWN_PRICE, // 월계관 가격 - NOTICE_EVENT_GIVE_PRESENT_1, // 1 ϴ. - NOTICE_EVENT_GIVE_PRESENT_2, // 2 ϴ. - NOTICE_EVENT_GIVE_PRESENT_3, // 3 ϴ. - NOTICE_EVENT_GIVE_PRESENT_4, // 4 ϴ. - NOTICE_EVENT_GIVE_PRESENT_5, // 5 ϴ. - NOTICE_EVENT_GIVE_PRESENT_6, // 6 ϴ. - NOTICE_EVENT_GIVE_PRESENT_7, // 7 ϴ. - NOTICE_EVENT_GIVE_PRESENT_8, // 8 ϴ. - NOTICE_EVENT_CAN_OPEN_PRESENT_8, // 8 ֽϴ. + NOTICE_EVENT_GIVE_PRESENT_1, // 레벨 1 선물상자 줬습니다. + NOTICE_EVENT_GIVE_PRESENT_2, // 레벨 2 선물상자 줬습니다. + NOTICE_EVENT_GIVE_PRESENT_3, // 레벨 3 선물상자 줬습니다. + NOTICE_EVENT_GIVE_PRESENT_4, // 레벨 4 선물상자 줬습니다. + NOTICE_EVENT_GIVE_PRESENT_5, // 레벨 5 선물상자 줬습니다. + NOTICE_EVENT_GIVE_PRESENT_6, // 레벨 6 선물상자 줬습니다. + NOTICE_EVENT_GIVE_PRESENT_7, // 레벨 7 선물상자 줬습니다. + NOTICE_EVENT_GIVE_PRESENT_8, // 레벨 8 선물상자 줬습니다. + NOTICE_EVENT_CAN_OPEN_PRESENT_8, // 레벨 8 선물상자 열 수 있습니다. - NOTICE_EVENT_RACE_WAR_IN_20, // 20оȿ ۵˴ϴ. - NOTICE_EVENT_RACE_WAR_IN_5, // 5оȿ ۵˴ϴ. + NOTICE_EVENT_RACE_WAR_IN_20, // 20분안에 전쟁이 시작됩니다. + NOTICE_EVENT_RACE_WAR_IN_5, // 5분안에 전쟁이 시작됩니다. - NOTICE_EVENT_RACE_WAR_STARTED_IN_OTHER_SERVER, // ù° ۵ƽϴ. + NOTICE_EVENT_RACE_WAR_STARTED_IN_OTHER_SERVER, // 첫번째 서버에서 종족전이 시작됐습니다. - NOTICE_EVENT_CANNOT_FIND_STORE, // ش Ǹڸ ã ϴ. - NOTICE_EVENT_STORE_CLOSED, // ̹ ϴ. - NOTICE_EVENT_ITEM_NOT_FOUND, // ش ̹ ǸŵǾų Ǹڿ öȸǾϴ. - // NOTICE_EVENT_NOT_ENOUGH_MONEY, // ڶ ڽϴ. - NOTICE_EVENT_TOO_MUCH_MONEY, // Ǹڰ ʹ ־ ϴ. - NOTICE_EVENT_NO_INVENTORY_SPACE, // κ丮 ڸ ϴ. + NOTICE_EVENT_CANNOT_FIND_STORE, // 해당 판매자를 찾을 수 없습니다. + NOTICE_EVENT_STORE_CLOSED, // 상점이 이미 닫혔습니다. + NOTICE_EVENT_ITEM_NOT_FOUND, // 해당 아이템이 이미 판매되었거나 판매자에 의해 철회되었습니다. + // NOTICE_EVENT_NOT_ENOUGH_MONEY, // 돈이 모자라서 못 사겠습니다. + NOTICE_EVENT_TOO_MUCH_MONEY, // 판매자가 너무 많은 돈을 가지고 있어서 살 수 없습니다. + NOTICE_EVENT_NO_INVENTORY_SPACE, // 인벤토리에 빈 자리가 없습니다. - NOTICE_EVENT_ALREADY_DISPLAYED, // ̹ Դϴ. - NOTICE_EVENT_CANNOT_SELL, // Դϴ. + NOTICE_EVENT_ALREADY_DISPLAYED, // 이미 진열된 아이템입니다. + NOTICE_EVENT_CANNOT_SELL, // 팔 수 없는 아이템입니다. NOTICE_EVENT_MAX }; diff --git a/src/Core/GCNotifyWin.h b/src/Core/GCNotifyWin.h index dcd488c9..8fb874c3 100644 --- a/src/Core/GCNotifyWin.h +++ b/src/Core/GCNotifyWin.h @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////////////// // class GCNotifyWin; -// NPC 縦 ֺ PC 鿡 Ѵ. +// NPC 의 대사를 주변의 PC 들에게 전송한다. ////////////////////////////////////////////////////////////////////////////// class GCNotifyWin : public Packet { diff --git a/src/Core/GCNotifyWinHandler.cpp b/src/Core/GCNotifyWinHandler.cpp index 7e6c0e7a..9ad31c09 100644 --- a/src/Core/GCNotifyWinHandler.cpp +++ b/src/Core/GCNotifyWinHandler.cpp @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCNotifyWinHandler::execute(GCNotifyWin* pPacket, Player* pPlayer) diff --git a/src/Core/GCOtherGuildName.cpp b/src/Core/GCOtherGuildName.cpp index a876ea17..b23ab5f4 100644 --- a/src/Core/GCOtherGuildName.cpp +++ b/src/Core/GCOtherGuildName.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCOtherGuildName::read(SocketInputStream& iStream) @@ -38,7 +38,7 @@ void GCOtherGuildName::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCOtherGuildName::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCOtherGuildName.h b/src/Core/GCOtherGuildName.h index 0b45480c..3b2eb3b8 100644 --- a/src/Core/GCOtherGuildName.h +++ b/src/Core/GCOtherGuildName.h @@ -17,9 +17,9 @@ // // class GCOtherGuildName; // -// Ư ÷̾ OtherGuildName ٸ ÷̾鿡 εijƮ -// ϴ Ŷ̴. ο ij͸ OtherGuildName Ʈ Ÿ -// ʵ ִ. +// 게임 서버가 특정 플레이어의 OtherGuildName 를 다른 플레이어들에게 브로드캐스트 +// 할 때 전송하는 패킷이다. 내부에 캐릭터명과 OtherGuildName 스트링을 데이타 +// 필드로 가지고 있다. // ////////////////////////////////////////////////////////////////////// @@ -27,10 +27,10 @@ class GCOtherGuildName : public Packet { public: GCOtherGuildName() {}; ~GCOtherGuildName() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -115,7 +115,7 @@ class GCOtherGuildNameFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCOtherGuildNamePacketMaxSize , ϶. + // const static GCOtherGuildNamePacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szGuildID + szBYTE + 30; } diff --git a/src/Core/GCOtherGuildNameHandler.cpp b/src/Core/GCOtherGuildNameHandler.cpp index 04e26c82..347f69cf 100644 --- a/src/Core/GCOtherGuildNameHandler.cpp +++ b/src/Core/GCOtherGuildNameHandler.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCOtherGuildNameHandler::execute(GCOtherGuildName* pPacket, Player* pPlayer) diff --git a/src/Core/GCOtherStoreInfo.cpp b/src/Core/GCOtherStoreInfo.cpp index ac3f4854..f668c295 100644 --- a/src/Core/GCOtherStoreInfo.cpp +++ b/src/Core/GCOtherStoreInfo.cpp @@ -19,7 +19,7 @@ GCOtherStoreInfo::~GCOtherStoreInfo() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCOtherStoreInfo::read(SocketInputStream& iStream) @@ -34,7 +34,7 @@ void GCOtherStoreInfo::read(SocketInputStream& iStream) } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCOtherStoreInfo::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCOtherStoreInfoHandler.cpp b/src/Core/GCOtherStoreInfoHandler.cpp index da468996..bd4ddedb 100644 --- a/src/Core/GCOtherStoreInfoHandler.cpp +++ b/src/Core/GCOtherStoreInfoHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCOtherStoreInfoHandler::execute(GCOtherStoreInfo* pPacket, Player* pPlayer) diff --git a/src/Core/GCPartyError.cpp b/src/Core/GCPartyError.cpp index 8d9b75b4..ae9939aa 100644 --- a/src/Core/GCPartyError.cpp +++ b/src/Core/GCPartyError.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCPartyError.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCPartyError.h b/src/Core/GCPartyError.h index b2e603fc..de9bedc7 100644 --- a/src/Core/GCPartyError.h +++ b/src/Core/GCPartyError.h @@ -11,31 +11,31 @@ #include "PacketFactory.h" ////////////////////////////////////////////////////////////////////////////// -// Ƽ ڵ +// 파티 가입 관련 코드 ////////////////////////////////////////////////////////////////////////////// enum { - // Ƽ ԽŰų Żų ʴ´. + // 파티에 가입시키거나 탈퇴시킬 대상이 존재하지 않는다. GC_PARTY_ERROR_TARGET_NOT_EXIST = 0, - // Ƽ ԽŰų Żų ٸ ̴. + // 파티에 가입시키거나 탈퇴시킬 대상이 다른 종족이다. GC_PARTY_ERROR_RACE_DIFFER, - // 밡 ƴϴ. + // 안전지대가 아니다. GC_PARTY_ERROR_NOT_SAFE, - // 볪 ¿ . + // 늑대나 박쥐 상태에서는 할 수 없다. GC_PARTY_ERROR_NOT_NORMAL_FORM, - // ʴ ̸鼭 ʴ븦 Ϸ Ѵ. + // 초대 중이면서 또 초대를 하려고 한다. GC_TRADE_ERROR_ALREADY_INVITING, - // ʴ ƴϸ鼭 ʴ뿡 Դ. + // 초대 중이 아니면서 초대에 대한 응답을 보내왔다. GC_PARTY_ERROR_NOT_INVITING, - // Ƽ ߹ ִ . + // 파티원을 추방할 수 있는 권한이 없다. GC_PARTY_ERROR_NO_AUTHORITY, - // + // 알 수 없는 에러다 GC_TRADE_ERROR_UNKNOWN, GC_PARTY_ERROR_MAX @@ -80,7 +80,7 @@ class GCPartyError : public Packet { private: ObjectID_t m_TargetObjectID; - BYTE m_Code; // ڵ + BYTE m_Code; // 코드 }; diff --git a/src/Core/GCPartyErrorHandler.cpp b/src/Core/GCPartyErrorHandler.cpp index 2f22216e..6b6e5e3d 100644 --- a/src/Core/GCPartyErrorHandler.cpp +++ b/src/Core/GCPartyErrorHandler.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCPartyErrorHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCPartyInvite.h b/src/Core/GCPartyInvite.h index b8aa05d1..1f139da3 100644 --- a/src/Core/GCPartyInvite.h +++ b/src/Core/GCPartyInvite.h @@ -11,7 +11,7 @@ #include "PacketFactory.h" ////////////////////////////////////////////////////////////////////////////// -// Ƽ ڵ +// 파티 가입 관련 코드 ////////////////////////////////////////////////////////////////////////////// enum { GC_PARTY_INVITE_REQUEST = 0, @@ -64,7 +64,7 @@ class GCPartyInvite : public Packet { private: ObjectID_t m_TargetObjectID; - BYTE m_Code; // ڵ + BYTE m_Code; // 코드 }; diff --git a/src/Core/GCPartyInviteHandler.cpp b/src/Core/GCPartyInviteHandler.cpp index 48efd47b..6a649e00 100644 --- a/src/Core/GCPartyInviteHandler.cpp +++ b/src/Core/GCPartyInviteHandler.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCPartyInviteHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCPartyJoined.cpp b/src/Core/GCPartyJoined.cpp index 98e1ae9a..1cca8a09 100644 --- a/src/Core/GCPartyJoined.cpp +++ b/src/Core/GCPartyJoined.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCPartyJoined.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -27,16 +27,16 @@ PacketSize_t GCPartyJoined::getPacketSize() const PacketSize_t value = 0; - value += szBYTE; // īƮ + value += szBYTE; // 멤버 카운트 list::const_iterator itr = m_MemberInfoList.begin(); for (; itr != m_MemberInfoList.end(); itr++) { PARTY_MEMBER_INFO* pInfo = (*itr); - value += szBYTE; // ̸ - value += (pInfo->name).size(); // ̸ - value += szBYTE; // - value += szBYTE; // Ÿ + value += szBYTE; // 이름 길이 + value += (pInfo->name).size(); // 실제 이름 + value += szBYTE; // 성별 + value += szBYTE; // 헤어 스타일 value += szIP; // IP } @@ -107,7 +107,7 @@ void GCPartyJoined::read(SocketInputStream& iStream) { __BEGIN_TRY - // Ʈ  оδ. + // 먼저 리스트의 사이즈를 읽어들인다. iStream.read(m_MemberCount); for (uint i = 0; i < m_MemberCount; i++) { @@ -135,7 +135,7 @@ void GCPartyJoined::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // Ʈ  . + // 먼저 리스트의 사이즈를 쓴다. oStream.write(m_MemberCount); list::const_iterator itr = m_MemberInfoList.begin(); diff --git a/src/Core/GCPartyJoined.h b/src/Core/GCPartyJoined.h index 4ebe3ce7..a269eb9d 100644 --- a/src/Core/GCPartyJoined.h +++ b/src/Core/GCPartyJoined.h @@ -20,7 +20,7 @@ typedef struct { } PARTY_MEMBER_INFO; -// ü ƽ ũ(14) + ̸ (1) +// 구조체 맥스 크기(14) + 이름 길이 (1) const uint PARTY_MEMBER_INFO_MAX_SIZE = 17; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCPartyJoinedHandler.cpp b/src/Core/GCPartyJoinedHandler.cpp index d88676ee..ed7369fc 100644 --- a/src/Core/GCPartyJoinedHandler.cpp +++ b/src/Core/GCPartyJoinedHandler.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCPartyJoinedHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCPartyLeave.cpp b/src/Core/GCPartyLeave.cpp index 0ff6b511..007df962 100644 --- a/src/Core/GCPartyLeave.cpp +++ b/src/Core/GCPartyLeave.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCPartyLeave.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCPartyLeave.h b/src/Core/GCPartyLeave.h index f2404c1b..540692ab 100644 --- a/src/Core/GCPartyLeave.h +++ b/src/Core/GCPartyLeave.h @@ -48,13 +48,13 @@ class GCPartyLeave : public Packet { } private: - // ȥ Ƽ 쿡 - // ߹ ̸ NULL̴. - // ٸ ؼ 쿡 - // ߹ ̸ NULL ƴϴ. - // 쿡 ߹ ̸ NULL . - string m_Expeller; // ߹ - string m_Expellee; // ߹ + // 누군가가 혼자 파티에서 스스로 빠져나갔을 경우에는 + // 추방자의 이름이 NULL이다. + // 누군가가 다른 사람에 의해서 빠져나갔을 경우에는 + // 추방자의 이름이 NULL이 아니다. + // 어느 경우에도 추방당한 이의 이름이 NULL인 경우는 없다. + string m_Expeller; // 추방자 + string m_Expellee; // 추방당한 이 }; diff --git a/src/Core/GCPartyLeaveHandler.cpp b/src/Core/GCPartyLeaveHandler.cpp index 4bb8a898..8561e5ec 100644 --- a/src/Core/GCPartyLeaveHandler.cpp +++ b/src/Core/GCPartyLeaveHandler.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCPartyLeaveHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCPartyPosition.h b/src/Core/GCPartyPosition.h index 133c3f2b..d17958a5 100644 --- a/src/Core/GCPartyPosition.h +++ b/src/Core/GCPartyPosition.h @@ -18,8 +18,8 @@ // // class GCPartyPosition; // -// Ư ڰ ٴ Ŭ̾Ʈ -// ϴ Ŷ ü̴.(ObjectID,X,Y,DIR) Ѵ. +// 게임 서버에서 특정 사용자가 움직였다는 정보를 클라이언트로 보내줄 +// 때 사용하는 패킷 객체이다.(ObjectID,X,Y,DIR) 을 포함한다. // ////////////////////////////////////////////////////////////////////// @@ -27,10 +27,10 @@ class GCPartyPosition : public Packet { public: GCPartyPosition() {}; ~GCPartyPosition() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -43,7 +43,7 @@ class GCPartyPosition : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCPartyPositionPacketSize , ϶. + // const static GCPartyPositionPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szBYTE + m_Name.size() + szZoneID + szZoneCoord * 2 + szHP * 2; } @@ -133,7 +133,7 @@ class GCPartyPositionFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCPartyPositionPacketSize , ϶. + // const static GCPartyPositionPacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + 20 + szZoneID + szZoneCoord * 2 + szHP * 2; } diff --git a/src/Core/GCPartySay.cpp b/src/Core/GCPartySay.cpp index 5169dc33..42dca396 100644 --- a/src/Core/GCPartySay.cpp +++ b/src/Core/GCPartySay.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCPartySay::read(SocketInputStream& iStream) @@ -30,7 +30,7 @@ void GCPartySay::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCPartySay::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCPartySay.h b/src/Core/GCPartySay.h index fa99c651..a94366b8 100644 --- a/src/Core/GCPartySay.h +++ b/src/Core/GCPartySay.h @@ -18,8 +18,8 @@ // // class GCPartySay; // -// Ư ڰ ٴ Ŭ̾Ʈ -// ϴ Ŷ ü̴.(ObjectID,X,Y,DIR) Ѵ. +// 게임 서버에서 특정 사용자가 움직였다는 정보를 클라이언트로 보내줄 +// 때 사용하는 패킷 객체이다.(ObjectID,X,Y,DIR) 을 포함한다. // ////////////////////////////////////////////////////////////////////// @@ -27,10 +27,10 @@ class GCPartySay : public Packet { public: GCPartySay() {}; ~GCPartySay() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -43,7 +43,7 @@ class GCPartySay : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCPartySayPacketSize , ϶. + // const static GCPartySayPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szBYTE + m_Name.size() + szDWORD + szBYTE + m_Message.size(); } @@ -113,7 +113,7 @@ class GCPartySayFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCPartySayPacketSize , ϶. + // const static GCPartySayPacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + 20 + szDWORD + szBYTE + 128; } diff --git a/src/Core/GCPetInfo.cpp b/src/Core/GCPetInfo.cpp index 3ed0ecb3..3cb3c99f 100644 --- a/src/Core/GCPetInfo.cpp +++ b/src/Core/GCPetInfo.cpp @@ -37,7 +37,7 @@ GCPetInfo::~GCPetInfo() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCPetInfo::read(SocketInputStream& iStream) @@ -53,7 +53,7 @@ void GCPetInfo::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCPetInfo::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCPetStashList.cpp b/src/Core/GCPetStashList.cpp index 7e7c3a7f..b3fc0e24 100644 --- a/src/Core/GCPetStashList.cpp +++ b/src/Core/GCPetStashList.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCPetStashList.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -41,7 +41,7 @@ GCPetStashList::~GCPetStashList() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCPetStashList::read(SocketInputStream& iStream) @@ -67,7 +67,7 @@ void GCPetStashList::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCPetStashList::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCPetStashList.h b/src/Core/GCPetStashList.h index 707e98c0..a805ba43 100644 --- a/src/Core/GCPetStashList.h +++ b/src/Core/GCPetStashList.h @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCPetStashList.h -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCPetStashVerify.cpp b/src/Core/GCPetStashVerify.cpp index a582e3de..42e22b5c 100644 --- a/src/Core/GCPetStashVerify.cpp +++ b/src/Core/GCPetStashVerify.cpp @@ -7,7 +7,7 @@ #include "GCPetStashVerify.h" ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCPetStashVerify::read(SocketInputStream& iStream) @@ -20,7 +20,7 @@ void GCPetStashVerify::read(SocketInputStream& iStream) } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCPetStashVerify::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCPetUseSkill.cpp b/src/Core/GCPetUseSkill.cpp index 544b08a4..7bd5161a 100644 --- a/src/Core/GCPetUseSkill.cpp +++ b/src/Core/GCPetUseSkill.cpp @@ -2,8 +2,8 @@ // // Filename : GCPetUseSkill.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -33,7 +33,7 @@ GCPetUseSkill::~GCPetUseSkill() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCPetUseSkill::read(SocketInputStream& iStream) @@ -48,7 +48,7 @@ void GCPetUseSkill::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCPetUseSkill::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/GCPetUseSkill.h b/src/Core/GCPetUseSkill.h index a6152900..a5e5007d 100644 --- a/src/Core/GCPetUseSkill.h +++ b/src/Core/GCPetUseSkill.h @@ -2,7 +2,7 @@ // Filename : GCPetUseSkill.h // Written By : elca@ewestsoft.com // Description : -// Ŷ Ŭ +// 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_PET_USE_SKILL_H__ @@ -16,7 +16,7 @@ ////////////////////////////////////////////////////////////////////////////// // class GCPetUseSkill; -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 ////////////////////////////////////////////////////////////////////////////// class GCPetUseSkill : public Packet { diff --git a/src/Core/GCPhoneConnected.cpp b/src/Core/GCPhoneConnected.cpp index b0b7f044..c13ed669 100644 --- a/src/Core/GCPhoneConnected.cpp +++ b/src/Core/GCPhoneConnected.cpp @@ -30,7 +30,7 @@ GCPhoneConnected::~GCPhoneConnected() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCPhoneConnected::read(SocketInputStream& iStream) @@ -55,7 +55,7 @@ void GCPhoneConnected::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCPhoneConnected::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCPhoneConnected.h b/src/Core/GCPhoneConnected.h index e78cad7f..652682b9 100644 --- a/src/Core/GCPhoneConnected.h +++ b/src/Core/GCPhoneConnected.h @@ -19,8 +19,8 @@ // // class GCPhoneConnected; // -// Ư ڰ ٴ Ŭ̾Ʈ -// ϴ Ŷ ü̴.(CreatureID,X,Y,DIR) Ѵ. +// 게임 서버에서 특정 사용자가 움직였다는 정보를 클라이언트로 보내줄 +// 때 사용하는 패킷 객체이다.(CreatureID,X,Y,DIR) 을 포함한다. // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCPhoneConnected : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCPhoneConnected : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szPhoneNumber + szSlotID + szBYTE + m_Name.size(); } @@ -93,7 +93,7 @@ class GCPhoneConnected : public Packet { // SlotID SlotID_t m_SlotID; - // ȭ Ŵ ̸ + // 전화 거는 상대의 이름 string m_Name; }; diff --git a/src/Core/GCPhoneConnectionFailed.cpp b/src/Core/GCPhoneConnectionFailed.cpp index 025da3b1..4ba0aee6 100644 --- a/src/Core/GCPhoneConnectionFailed.cpp +++ b/src/Core/GCPhoneConnectionFailed.cpp @@ -30,7 +30,7 @@ GCPhoneConnectionFailed::~GCPhoneConnectionFailed() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCPhoneConnectionFailed::read(SocketInputStream& iStream) @@ -41,7 +41,7 @@ void GCPhoneConnectionFailed::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCPhoneConnectionFailed::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCPhoneConnectionFailed.h b/src/Core/GCPhoneConnectionFailed.h index a5ebe65b..98bb8d15 100644 --- a/src/Core/GCPhoneConnectionFailed.h +++ b/src/Core/GCPhoneConnectionFailed.h @@ -19,8 +19,8 @@ // // class GCPhoneConnectionFailed; // -// Ư ڰ ٴ Ŭ̾Ʈ -// ϴ Ŷ ü̴.(CreatureID,X,Y,DIR) Ѵ. +// 게임 서버에서 특정 사용자가 움직였다는 정보를 클라이언트로 보내줄 +// 때 사용하는 패킷 객체이다.(CreatureID,X,Y,DIR) 을 포함한다. // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCPhoneConnectionFailed : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCPhoneConnectionFailed : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return 0; } diff --git a/src/Core/GCPhoneDisconnected.cpp b/src/Core/GCPhoneDisconnected.cpp index 147dfaf9..bb34def4 100644 --- a/src/Core/GCPhoneDisconnected.cpp +++ b/src/Core/GCPhoneDisconnected.cpp @@ -30,7 +30,7 @@ GCPhoneDisconnected::~GCPhoneDisconnected() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCPhoneDisconnected::read(SocketInputStream& iStream) @@ -45,7 +45,7 @@ void GCPhoneDisconnected::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCPhoneDisconnected::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCPhoneDisconnected.h b/src/Core/GCPhoneDisconnected.h index e189be87..03f76a0b 100644 --- a/src/Core/GCPhoneDisconnected.h +++ b/src/Core/GCPhoneDisconnected.h @@ -19,8 +19,8 @@ // // class GCPhoneDisconnected; // -// Ư ڰ ٴ Ŭ̾Ʈ -// ϴ Ŷ ü̴.(CreatureID,X,Y,DIR) Ѵ. +// 게임 서버에서 특정 사용자가 움직였다는 정보를 클라이언트로 보내줄 +// 때 사용하는 패킷 객체이다.(CreatureID,X,Y,DIR) 을 포함한다. // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCPhoneDisconnected : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCPhoneDisconnected : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szPhoneNumber + szSlotID; } diff --git a/src/Core/GCPhoneSay.cpp b/src/Core/GCPhoneSay.cpp index aa58bd7c..b9c7465f 100644 --- a/src/Core/GCPhoneSay.cpp +++ b/src/Core/GCPhoneSay.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCPhoneSay::read(SocketInputStream& iStream) @@ -37,7 +37,7 @@ void GCPhoneSay::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCPhoneSay::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCPhoneSayHandler.cpp b/src/Core/GCPhoneSayHandler.cpp index fe45bcc9..05fed142 100644 --- a/src/Core/GCPhoneSayHandler.cpp +++ b/src/Core/GCPhoneSayHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCPhoneSayHandler::execute(GCPhoneSay* pPacket, Player* pPlayer) diff --git a/src/Core/GCQuestStatus.cpp b/src/Core/GCQuestStatus.cpp index e5492355..7c4a8c59 100644 --- a/src/Core/GCQuestStatus.cpp +++ b/src/Core/GCQuestStatus.cpp @@ -2,8 +2,8 @@ // // Filename : GCQuestStatus.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -33,14 +33,14 @@ GCQuestStatus::~GCQuestStatus() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCQuestStatus::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_QuestID); iStream.read(m_CurrentNum); iStream.read(m_Time); @@ -50,12 +50,12 @@ void GCQuestStatus::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCQuestStatus::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_QuestID); oStream.write(m_CurrentNum); oStream.write(m_Time); diff --git a/src/Core/GCQuestStatus.h b/src/Core/GCQuestStatus.h index 7a4b22b6..835592a7 100644 --- a/src/Core/GCQuestStatus.h +++ b/src/Core/GCQuestStatus.h @@ -2,7 +2,7 @@ // Filename : GCQuestStatus.h // Written By : elca@ewestsoft.com // Description : -// Ŷ Ŭ +// 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_QUEST_STATUS_H__ @@ -15,7 +15,7 @@ ////////////////////////////////////////////////////////////////////////////// // class GCQuestStatus; -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 ////////////////////////////////////////////////////////////////////////////// class GCQuestStatus : public Packet { diff --git a/src/Core/GCRankBonusInfo.cpp b/src/Core/GCRankBonusInfo.cpp index 19d8589f..fcc58f69 100644 --- a/src/Core/GCRankBonusInfo.cpp +++ b/src/Core/GCRankBonusInfo.cpp @@ -27,7 +27,7 @@ GCRankBonusInfo::~GCRankBonusInfo() } //-------------------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void GCRankBonusInfo::read(SocketInputStream& iStream) @@ -47,7 +47,7 @@ void GCRankBonusInfo::read(SocketInputStream& iStream) } //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCRankBonusInfo::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCRankBonusInfo.h b/src/Core/GCRankBonusInfo.h index 39cca0e3..75a4a2f3 100644 --- a/src/Core/GCRankBonusInfo.h +++ b/src/Core/GCRankBonusInfo.h @@ -25,10 +25,10 @@ class GCRankBonusInfo : public Packet { // destructor ~GCRankBonusInfo(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -108,7 +108,7 @@ class GCRankBonusInfoFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCRankBonusInfoPacketMaxSize , ϶. + // const static GCRankBonusInfoPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + (szDWORD * 100); } diff --git a/src/Core/GCRealWearingInfo.cpp b/src/Core/GCRealWearingInfo.cpp index 2d975efd..0f6da6b2 100644 --- a/src/Core/GCRealWearingInfo.cpp +++ b/src/Core/GCRealWearingInfo.cpp @@ -9,7 +9,7 @@ #include "GCRealWearingInfo.h" ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCRealWearingInfo::read(SocketInputStream& iStream) @@ -23,7 +23,7 @@ void GCRealWearingInfo::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCRealWearingInfo::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCRealWearingInfo.h b/src/Core/GCRealWearingInfo.h index 6d43abc1..afd87820 100644 --- a/src/Core/GCRealWearingInfo.h +++ b/src/Core/GCRealWearingInfo.h @@ -24,10 +24,10 @@ class GCRealWearingInfo : public Packet { public: GCRealWearingInfo() {}; ~GCRealWearingInfo() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -91,7 +91,7 @@ class GCRealWearingInfoFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCRealWearingInfoPacketSize ؼ ϶. + // const static GCRealWearingInfoPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szDWORD; } diff --git a/src/Core/GCReconnect.cpp b/src/Core/GCReconnect.cpp index 56e3436e..f40fb315 100644 --- a/src/Core/GCReconnect.cpp +++ b/src/Core/GCReconnect.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCReconnect::read(SocketInputStream& iStream) @@ -49,7 +49,7 @@ void GCReconnect::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCReconnect::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCReconnect.h b/src/Core/GCReconnect.h index 334ea50c..16d53675 100644 --- a/src/Core/GCReconnect.h +++ b/src/Core/GCReconnect.h @@ -17,9 +17,9 @@ // // class GCReconnect; // -// ̵, Ŭ̾Ʈ ϶ -// ϸ鼭 ϴ Ŷ̴. Ŭ̾Ʈ Ŷ , -// Ŷ IP/Port ϸ ȴ. +// 서버간 이동시, 이전 서버가 클라이언트에게 다음 서버로 연결하라고 +// 하면서 접속을 끊도록 하는 패킷이다. 클라이언트는 이 패킷을 받으면, +// 서버와의 연결을 끊고 패킷에 담긴 서버의 IP/Port 로 접속하면 된다. // ////////////////////////////////////////////////////////////////////// @@ -27,10 +27,10 @@ class GCReconnect : public Packet { public: GCReconnect() {}; ~GCReconnect() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -43,10 +43,10 @@ class GCReconnect : public Packet { // get packet's body size PacketSize_t getPacketSize() const { - return szBYTE + m_Name.size() // ij ̸ - + szPCType // ̾ or ̾? - + szBYTE + m_ServerIP.size() // IP - + szDWORD; // Ű + return szBYTE + m_Name.size() // 캐릭터 이름 + + szPCType // 슬레이어 or 뱀파이어? + + szBYTE + m_ServerIP.size() // 새로 접속할 게임 서버 IP + + szDWORD; // 인증 키 } // get packet name @@ -132,12 +132,12 @@ class GCReconnectFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCReconnectPacketMaxSize , ϶. + // const static GCReconnectPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { - return szBYTE + 20 // ij ̸ - + szPCType // ̾ or ̾? - + szBYTE + 15 // IP - + szDWORD; // Ű + return szBYTE + 20 // 캐릭터 이름 + + szPCType // 슬레이어 or 뱀파이어? + + szBYTE + 15 // 새로 접속할 게임 서버 IP + + szDWORD; // 인증 키 } }; diff --git a/src/Core/GCReconnectHandler.cpp b/src/Core/GCReconnectHandler.cpp index 92144122..ed1b236c 100644 --- a/src/Core/GCReconnectHandler.cpp +++ b/src/Core/GCReconnectHandler.cpp @@ -30,40 +30,40 @@ void GCReconnectHandler::execute(GCReconnect* pPacket, Player* pPlayer) /* - // ڵ Ǿ ϴ ڵ̴. Ư ڰ - // Ż ö , Ż ٸ + // 이 코드는 게임 서버에서 실행되어야 하는 코드이다. 즉 특정 사용자가 + // 존의 포탈위로 올라갔을 때, 이 포탈의 목적지가 다른 서버일 경우 // try { - // ϴ ũó Ÿ̽ ϰ, ؾ Ѵ. + // 일단 크리처를 데이타베이스에 저장하고, 존에서 삭제해야 한다. Creature * pCreature = pPlayer->getCreature(); // g_pDatabaseManager->saveCreature(pCreature); Zone * pZone = pCreature->getZone(); Tile & tile = pZone->getTile(pCreature->getX() , pCreature->getY()); tile.deleteCreature(pCreature->getMoveMode()); - // ÷̾ ü ׷ ÷̾Ŵ Ѵ. + // 플레이어 객체를 존그룹의 플레이어매니저에서 삭제한다. ZoneGroup * pZoneGroup = pZone->getZoneGroup(); ZonePlayerManager * pZonePlayerManager = pZoneGroup->getZonePlayerManager(); pZonePlayerManager->deletePlayer(pPlayer->getSocket()->getSOCKET()); - // ÷̾ GCReconnect Ŷ . + // 플레이어에게 GCReconnect 패킷을 던진다. GCReconnect gcReconnect; gcReconnect.setServerIP(...); gcReconnect.setKey(...); pPlayer->sendPacket(&gcReconnect); - // .. ÷ð Ǵ°.. ּ ۴ ÷ϰ Ѵ. + // 흠.. 플러시가 되는가.. 최소한 버퍼는 플러시하고나서 접속을 끊어야 한다. pPlayer->flush(); - // ϰ, ÷̾ ü Ѵ. + // 연결을 종료하고, 플레이어 객체를 삭제한다. SAFE_DELETE(pPlayer); } catch (NoSuchElementException & nsee ) { - // ߸ Ŷ̶ Ҹ. IncomingPlayer ° ƴ϶ . - // ŷ ؼ ƿ Ŷ̹Ƿ, Ban Manager ϰ, Ѵ. - // ϴ Ѵ. + // 잘못된 패킷이라는 소리다. 즉 IncomingPlayer 상태가 아니라는 뜻. + // 즉 해킹에 의해서 날아온 패킷이므로, Ban Manager 에 등록하고, 접속을 종료한다. + // 일단은 서버를 종료한다. throw Error(nsee.toString()); } diff --git a/src/Core/GCReconnectLogin.cpp b/src/Core/GCReconnectLogin.cpp index 225bb888..0ceed4d5 100644 --- a/src/Core/GCReconnectLogin.cpp +++ b/src/Core/GCReconnectLogin.cpp @@ -11,7 +11,7 @@ //---------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //---------------------------------------------------------------------- void GCReconnectLogin::read(SocketInputStream& iStream) @@ -48,7 +48,7 @@ void GCReconnectLogin::read(SocketInputStream& iStream) //---------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //---------------------------------------------------------------------- void GCReconnectLogin::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCReconnectLogin.h b/src/Core/GCReconnectLogin.h index e7e76a1d..84a899fc 100644 --- a/src/Core/GCReconnectLogin.h +++ b/src/Core/GCReconnectLogin.h @@ -17,9 +17,9 @@ // // class GCReconnectLogin; // -// α ް, ij͸ Ŭ̾Ʈ , -// ijͰ ῡ ߴ ˾Ƴ, ϴ -// ϶ Ŷ̴. +// 로그인 서버에서 인증을 받고, 캐릭터를 선택한 클라이언트의 경우, +// 캐릭터가 이전 연결에 존재했던 존을 알아내서, 그 존을 관리하는 +// 게임 서버로 재접속하라는 패킷이다. // ////////////////////////////////////////////////////////////////////// @@ -27,10 +27,10 @@ class GCReconnectLogin : public Packet { public: GCReconnectLogin() {}; ~GCReconnectLogin() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -43,9 +43,9 @@ class GCReconnectLogin : public Packet { // get packet's body size PacketSize_t getPacketSize() const { - return szBYTE + m_LoginServerIP.size() // - + szuint // Ʈ - + szDWORD; // Ű + return szBYTE + m_LoginServerIP.size() // 게임 서버 아이피 + + szuint // 게임 서버 포트 + + szDWORD; // 인증 키 } // get packet name @@ -120,11 +120,11 @@ class GCReconnectLoginFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCReconnectLoginPacketMaxSize , ϶. + // const static GCReconnectLoginPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { - return szBYTE + 15 // - + szuint // Ʈ - + szDWORD; // Ű + return szBYTE + 15 // 게임 서버 아이피 + + szuint // 게임 서버 포트 + + szDWORD; // 인증 키 } }; diff --git a/src/Core/GCReconnectLoginHandler.cpp b/src/Core/GCReconnectLoginHandler.cpp index 607bbfd1..be68a8c0 100644 --- a/src/Core/GCReconnectLoginHandler.cpp +++ b/src/Core/GCReconnectLoginHandler.cpp @@ -15,8 +15,8 @@ #endif //-------------------------------------------------------------------------------- -// αμκ ּҿ Ʈ, ׸ Ű -// , Ű CGConnect Ŷ Ѵ. +// 로그인서버로부터 게임 서버의 주소와 포트, 그리고 인증키를 받은 즉시 +// 게임 서버로 연결한 후, 인증키를 담은 CGConnect 패킷을 전송한다. //-------------------------------------------------------------------------------- void GCReconnectLoginHandler::execute(GCReconnectLogin* pPacket, Player* pPlayer) diff --git a/src/Core/GCRegenZoneStatus.cpp b/src/Core/GCRegenZoneStatus.cpp index 41c2b3b5..0c812cfe 100644 --- a/src/Core/GCRegenZoneStatus.cpp +++ b/src/Core/GCRegenZoneStatus.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCRegenZoneStatus::read(SocketInputStream& iStream) @@ -28,7 +28,7 @@ void GCRegenZoneStatus::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCRegenZoneStatus::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCRegenZoneStatus.h b/src/Core/GCRegenZoneStatus.h index 58354b0c..49b1869a 100644 --- a/src/Core/GCRegenZoneStatus.h +++ b/src/Core/GCRegenZoneStatus.h @@ -27,10 +27,10 @@ class GCRegenZoneStatus : public Packet { m_Statuses.push_back(0); } ~GCRegenZoneStatus() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -93,7 +93,7 @@ class GCRegenZoneStatusFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCRegenZoneStatusPacketMaxSize , ϶. + // const static GCRegenZoneStatusPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE * 8; } diff --git a/src/Core/GCReloadOK.cpp b/src/Core/GCReloadOK.cpp index 48661120..9dd69ec4 100644 --- a/src/Core/GCReloadOK.cpp +++ b/src/Core/GCReloadOK.cpp @@ -2,8 +2,8 @@ // // Filename : GCReloadOK.cc // Written By : elca@ewestsoft.com -// Description : CGMove ڱ ڽſ OK -// Ŷ Ŭ Լ +// Description : CGMove가 날아 왓을때 자기 자신에게 OK 사인을 날리기 +// 위한 패킷 클래스 함수 정의 // ////////////////////////////////////////////////////////////////////// @@ -35,7 +35,7 @@ GCReloadOK::~GCReloadOK() } ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCReloadOK::read(SocketInputStream& iStream) @@ -49,7 +49,7 @@ void GCReloadOK::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCReloadOK::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCRemoveCorpseHead.cpp b/src/Core/GCRemoveCorpseHead.cpp index 470f3d55..b4c13d2c 100644 --- a/src/Core/GCRemoveCorpseHead.cpp +++ b/src/Core/GCRemoveCorpseHead.cpp @@ -10,7 +10,7 @@ #include "GCRemoveCorpseHead.h" ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCRemoveCorpseHead::read(SocketInputStream& iStream) @@ -24,7 +24,7 @@ void GCRemoveCorpseHead::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCRemoveCorpseHead::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCRemoveCorpseHead.h b/src/Core/GCRemoveCorpseHead.h index 9d479acf..52bc6630 100644 --- a/src/Core/GCRemoveCorpseHead.h +++ b/src/Core/GCRemoveCorpseHead.h @@ -17,20 +17,20 @@ // // class GCRemoveCorpseHead; // -// Ư ü þ߿ 쿡 ۵Ǹ, Ŭ̾Ʈ Ŷ -// Ŷ OID ؼ شǴ ü ãƼ Ŭ̾Ʈ ؾ Ѵ. +// 존의 특정 객체가 시야에서 사라진 경우에 전송되며, 클라이언트는 이 패킷을 받으면 +// 패킷 내부의 OID를 사용해서 해당되는 객체를 찾아서 클라이언트의 존에서 삭제해야 한다. // -// Ŷ ۵Ǵ ü Ȳ ̴. +// 다음은 이 패킷이 전송되는 구체적인 상황의 예시이다. // -//(1) PC α׾ƿ -//(2) ũó ݴ -//(3) Ư Ʈ -//(4) ü +//(1) PC가 로그아웃한 경우 +//(2) 아이템을 크리처가 줍는 경우 +//(3) 특정 이펙트가 사라진 경우 +//(4) 시체가 사라진 경우 // // *CAUTION* // -//(3) Ư Ʈ .. Ʈ , ð ۵DZ -// , Ǿ ̴. -_-; +//(3) 특정 이펙트가 사라진 경우.. 는 이펙트가 생성될 때, 사라지는 시간이 전송되기 +// 때문에, 삭제되어도 무방할 것이다. -_-; // //-------------------------------------------------------------------------------- @@ -44,10 +44,10 @@ class GCRemoveCorpseHead : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/GCRemoveEffect.cpp b/src/Core/GCRemoveEffect.cpp index d5a24f2d..ca14c9e2 100644 --- a/src/Core/GCRemoveEffect.cpp +++ b/src/Core/GCRemoveEffect.cpp @@ -2,8 +2,8 @@ // // Filename : GCRemoveEffect.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -37,7 +37,7 @@ GCRemoveEffect::~GCRemoveEffect() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCRemoveEffect::read(SocketInputStream& iStream) @@ -46,7 +46,7 @@ void GCRemoveEffect::read(SocketInputStream& iStream) iStream.read(m_ObjectID); - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ListNum); EffectID_t value; @@ -60,14 +60,14 @@ void GCRemoveEffect::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCRemoveEffect::write(SocketOutputStream& oStream) const { __BEGIN_TRY oStream.write(m_ObjectID); - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ListNum); for (list::const_iterator itr = m_EffectList.begin(); itr != m_EffectList.end(); itr++) { @@ -97,7 +97,7 @@ void GCRemoveEffect::execute(Player* pPlayer) // // GCRemoveEffect::addListElement() // -// (ȭ, ȭġ ) Ʈ ֱ Լ. +// (변화부위, 변화수치 ) 의 한 셋을 리스트에 넣기 위한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCRemoveEffect::addEffectList(EffectID_t Value) @@ -105,10 +105,10 @@ void GCRemoveEffect::addEffectList(EffectID_t Value) { __BEGIN_TRY - // ϴ List ִ´. + // 변하는 것이 무엇인지 List에 넣는다. m_EffectList.push_back(Value); - // ȭ ϳ Ų. + // 변화 셋의 갯수를 하나 증가 시킨다. m_ListNum++; __END_CATCH diff --git a/src/Core/GCRemoveEffect.h b/src/Core/GCRemoveEffect.h index 3014509a..72054436 100644 --- a/src/Core/GCRemoveEffect.h +++ b/src/Core/GCRemoveEffect.h @@ -2,7 +2,7 @@ // // Filename : GCRemoveEffect.h // Written By : crazydog -// Description : Effect . +// Description : Effect 제거. // ////////////////////////////////////////////////////////////////////// @@ -19,8 +19,8 @@ // // class GCRemoveEffect; // -// Ӽ Ŭ̾Ʈ ڽ ͸ ˷ֱ ä -// RemoveEffectrmation, SkillToObjectOK  Ƿ ư. +// 게임서버에서 클라이언트로 자신의 변형된 데이터를 알려주기 위한 객채 +// RemoveEffectrmation, SkillToObjectOK 등에 실려서 날아간다. // ////////////////////////////////////////////////////////////////////// @@ -41,16 +41,16 @@ class GCRemoveEffect : public Packet { } - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler void execute(Player* pPlayer); // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szBYTE + szEffectID * m_ListNum; } diff --git a/src/Core/GCRemoveFromGear.cpp b/src/Core/GCRemoveFromGear.cpp index ad826de7..8348fd44 100644 --- a/src/Core/GCRemoveFromGear.cpp +++ b/src/Core/GCRemoveFromGear.cpp @@ -30,7 +30,7 @@ GCRemoveFromGear::~GCRemoveFromGear() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCRemoveFromGear::read(SocketInputStream& iStream) @@ -44,7 +44,7 @@ void GCRemoveFromGear::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCRemoveFromGear::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCRemoveFromGear.h b/src/Core/GCRemoveFromGear.h index 27973e18..80a4e3da 100644 --- a/src/Core/GCRemoveFromGear.h +++ b/src/Core/GCRemoveFromGear.h @@ -19,8 +19,8 @@ // // class GCRemoveFromGear; // -// Ư ڰ ٴ Ŭ̾Ʈ -// ϴ Ŷ ü̴.(CreatureID,X,Y,DIR) Ѵ. +// 게임 서버에서 특정 사용자가 움직였다는 정보를 클라이언트로 보내줄 +// 때 사용하는 패킷 객체이다.(CreatureID,X,Y,DIR) 을 포함한다. // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCRemoveFromGear : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCRemoveFromGear : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szSlotID; } diff --git a/src/Core/GCRemoveInjuriousCreature.cpp b/src/Core/GCRemoveInjuriousCreature.cpp index d39dd315..a25ae881 100644 --- a/src/Core/GCRemoveInjuriousCreature.cpp +++ b/src/Core/GCRemoveInjuriousCreature.cpp @@ -11,7 +11,7 @@ void GCRemoveInjuriousCreature::read(SocketInputStream& iStream) { __BEGIN_TRY - // ̸ б + // 이름 읽기 BYTE szName; iStream.read(szName); @@ -32,7 +32,7 @@ void GCRemoveInjuriousCreature::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ̸ + // 이름 쓰기 BYTE szName = m_Name.size(); if (szName == 0) diff --git a/src/Core/GCRemoveInjuriousCreature.h b/src/Core/GCRemoveInjuriousCreature.h index a6867980..498465e1 100644 --- a/src/Core/GCRemoveInjuriousCreature.h +++ b/src/Core/GCRemoveInjuriousCreature.h @@ -17,8 +17,8 @@ // // class GCRemoveInjuriousCreature; // -// Ŭ̾Ʈ RemoveInjuriousCreature Ŷ̴. -// ο RemoveInjuriousCreature String Ÿ ʵ . +// 클라이언트가 서버에게 보내는 RemoveInjuriousCreature 패킷이다. +// 내부에 RemoveInjuriousCreature String 만을 데이타 필드로 가진다. // ////////////////////////////////////////////////////////////////////// @@ -26,10 +26,10 @@ class GCRemoveInjuriousCreature : public Packet { public: GCRemoveInjuriousCreature() {}; ~GCRemoveInjuriousCreature() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -92,7 +92,7 @@ class GCRemoveInjuriousCreatureFactory : public PacketFactory { } // get packet's max body size - // message ִ ũ⿡ ʿϴ. + // message 의 최대 크기에 대한 설정이 필요하다. PacketSize_t getPacketMaxSize() const { return szBYTE + 10; } diff --git a/src/Core/GCRemoveStoreItem.cpp b/src/Core/GCRemoveStoreItem.cpp index 45d6c361..35f2b714 100644 --- a/src/Core/GCRemoveStoreItem.cpp +++ b/src/Core/GCRemoveStoreItem.cpp @@ -19,7 +19,7 @@ GCRemoveStoreItem::~GCRemoveStoreItem() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCRemoveStoreItem::read(SocketInputStream& iStream) @@ -33,7 +33,7 @@ void GCRemoveStoreItem::read(SocketInputStream& iStream) } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCRemoveStoreItem::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCRemoveStoreItemHandler.cpp b/src/Core/GCRemoveStoreItemHandler.cpp index 7c7c31e8..f2d7fea0 100644 --- a/src/Core/GCRemoveStoreItemHandler.cpp +++ b/src/Core/GCRemoveStoreItemHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCRemoveStoreItemHandler::execute(GCRemoveStoreItem* pPacket, Player* pPlayer) diff --git a/src/Core/GCRequestPowerPointResult.cpp b/src/Core/GCRequestPowerPointResult.cpp index 32673590..4065939b 100644 --- a/src/Core/GCRequestPowerPointResult.cpp +++ b/src/Core/GCRequestPowerPointResult.cpp @@ -24,7 +24,7 @@ GCRequestPowerPointResult::~GCRequestPowerPointResult() {} //-------------------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void GCRequestPowerPointResult::read(SocketInputStream& iStream) @@ -34,10 +34,10 @@ void GCRequestPowerPointResult::read(SocketInputStream& iStream) // Error code iStream.read(m_ErrorCode); - // Ŀ¯ Ʈ + // 현재 누적된 파워짱 포인트 iStream.read(m_SumPowerPoint); - // û Ŀ¯ Ʈ + // 요청으로 가져온 파워짱 포인트 iStream.read(m_RequestPowerPoint); __END_CATCH @@ -45,7 +45,7 @@ void GCRequestPowerPointResult::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCRequestPowerPointResult::write(SocketOutputStream& oStream) const @@ -55,10 +55,10 @@ void GCRequestPowerPointResult::write(SocketOutputStream& oStream) const // Error code oStream.write(m_ErrorCode); - // Ŀ¯ Ʈ + // 현재 누적된 파워짱 포인트 oStream.write(m_SumPowerPoint); - // û Ŀ¯ Ʈ + // 요청으로 가져온 파워짱 포인트 oStream.write(m_RequestPowerPoint); __END_CATCH diff --git a/src/Core/GCRequestPowerPointResult.h b/src/Core/GCRequestPowerPointResult.h index b3984a78..90553932 100644 --- a/src/Core/GCRequestPowerPointResult.h +++ b/src/Core/GCRequestPowerPointResult.h @@ -24,14 +24,14 @@ class GCRequestPowerPointResult : public Packet { public: enum RESULT_CODE { NO_ERROR = 0, - SERVER_ERROR, // Ŀ¯ ϴ Ȳ - PROCESS_ERROR, // ó (ex DB ) - NO_MEMBER, // Ŀ¯ ȸ ƴ - NO_POINT, // Ŀ¯ Ʈ - NO_MATCHING, // Ī . - // Ŀ¯ Ȩ Ī - // Ŀ¯ Ȩ Ī ϴ οش. - CONNECT_ERROR, // ڵ Ȯ Ŷ + SERVER_ERROR, // 파워짱 서버는 살아있으나 현재 정상적으로 동작하지 못하는 상황 + PROCESS_ERROR, // 서버 처리 오류 (ex DB 오류 ) + NO_MEMBER, // 파워짱 회원이 아닌 경우 + NO_POINT, // 누적된 파워짱 포인트가 없음 + NO_MATCHING, // 매칭 정보가 없음. + // 파워짱 홈페이지에서 게임 매칭을 하지 않은 경우 + // 파워짱 홈페이지에서 매칭을 유도하는 문장을 부여준다. + CONNECT_ERROR, // 게임코드 확인 실패 및 패킷 오류 }; public: @@ -39,10 +39,10 @@ class GCRequestPowerPointResult : public Packet { ~GCRequestPowerPointResult(); public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -94,13 +94,13 @@ class GCRequestPowerPointResult : public Packet { // data members //-------------------------------------------------- private: - // ڵ + // 에러 코드 BYTE m_ErrorCode; - // Ŀ¯ Ʈ + // 현재 누적된 파워짱 포인트 int m_SumPowerPoint; - // û Ŀ¯ Ʈ + // 요청으로 가져온 파워짱 포인트 int m_RequestPowerPoint; }; @@ -132,7 +132,7 @@ class GCRequestPowerPointResultFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCRequestPowerPointResultPacketMaxSize , ϶. + // const static GCRequestPowerPointResultPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + szint + szint; } diff --git a/src/Core/GCRideMotorCycle.cpp b/src/Core/GCRideMotorCycle.cpp index 1d91542f..acbc4c96 100644 --- a/src/Core/GCRideMotorCycle.cpp +++ b/src/Core/GCRideMotorCycle.cpp @@ -2,8 +2,8 @@ // // Filename : GCRideMotorCycle.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -33,14 +33,14 @@ GCRideMotorCycle::~GCRideMotorCycle() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCRideMotorCycle::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_TargetObjectID); @@ -49,12 +49,12 @@ void GCRideMotorCycle::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCRideMotorCycle::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_TargetObjectID); diff --git a/src/Core/GCRideMotorCycle.h b/src/Core/GCRideMotorCycle.h index 1d2e8fba..1ae7ab3f 100644 --- a/src/Core/GCRideMotorCycle.h +++ b/src/Core/GCRideMotorCycle.h @@ -2,7 +2,7 @@ // // Filename : GCRideMotorCycle.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCRideMotorCycle; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCRideMotorCycle : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCRideMotorCycle : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szObjectID; } diff --git a/src/Core/GCRideMotorCycleFailed.cpp b/src/Core/GCRideMotorCycleFailed.cpp index f9e9c65e..a534abea 100644 --- a/src/Core/GCRideMotorCycleFailed.cpp +++ b/src/Core/GCRideMotorCycleFailed.cpp @@ -2,8 +2,8 @@ // // Filename : GCRideMotorCycleFailed.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -33,14 +33,14 @@ GCRideMotorCycleFailed::~GCRideMotorCycleFailed() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCRideMotorCycleFailed::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); __END_CATCH @@ -48,12 +48,12 @@ void GCRideMotorCycleFailed::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCRideMotorCycleFailed::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); __END_CATCH diff --git a/src/Core/GCRideMotorCycleFailed.h b/src/Core/GCRideMotorCycleFailed.h index e879c74e..fb2ee204 100644 --- a/src/Core/GCRideMotorCycleFailed.h +++ b/src/Core/GCRideMotorCycleFailed.h @@ -2,7 +2,7 @@ // // Filename : GCRideMotorCycleFailed.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCRideMotorCycleFailed; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// class GCRideMotorCycleFailed : public Packet { @@ -32,10 +32,10 @@ class GCRideMotorCycleFailed : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -47,7 +47,7 @@ class GCRideMotorCycleFailed : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID; } diff --git a/src/Core/GCRideMotorCycleOK.cpp b/src/Core/GCRideMotorCycleOK.cpp index 8c2d9077..19e00b8e 100644 --- a/src/Core/GCRideMotorCycleOK.cpp +++ b/src/Core/GCRideMotorCycleOK.cpp @@ -2,8 +2,8 @@ // // Filename : GCRideMotorCycleOK.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -33,14 +33,14 @@ GCRideMotorCycleOK::~GCRideMotorCycleOK() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCRideMotorCycleOK::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); __END_CATCH @@ -48,12 +48,12 @@ void GCRideMotorCycleOK::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCRideMotorCycleOK::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); __END_CATCH diff --git a/src/Core/GCRideMotorCycleOK.h b/src/Core/GCRideMotorCycleOK.h index a3fa2ff2..8b6d9208 100644 --- a/src/Core/GCRideMotorCycleOK.h +++ b/src/Core/GCRideMotorCycleOK.h @@ -2,7 +2,7 @@ // // Filename : GCRideMotorCycleOK.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCRideMotorCycleOK; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// class GCRideMotorCycleOK : public Packet { @@ -32,10 +32,10 @@ class GCRideMotorCycleOK : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -47,7 +47,7 @@ class GCRideMotorCycleOK : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID; } diff --git a/src/Core/GCRing.cpp b/src/Core/GCRing.cpp index 122d6cdc..dadcb021 100644 --- a/src/Core/GCRing.cpp +++ b/src/Core/GCRing.cpp @@ -30,7 +30,7 @@ GCRing::~GCRing() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCRing::read(SocketInputStream& iStream) @@ -55,7 +55,7 @@ void GCRing::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCRing::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCRing.h b/src/Core/GCRing.h index 89efaf05..6c97a922 100644 --- a/src/Core/GCRing.h +++ b/src/Core/GCRing.h @@ -19,8 +19,8 @@ // // class GCRing; // -// Ư ڰ ٴ Ŭ̾Ʈ -// ϴ Ŷ ü̴.(CreatureID,X,Y,DIR) Ѵ. +// 게임 서버에서 특정 사용자가 움직였다는 정보를 클라이언트로 보내줄 +// 때 사용하는 패킷 객체이다.(CreatureID,X,Y,DIR) 을 포함한다. // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCRing : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCRing : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szPhoneNumber + szSlotID + szBYTE + m_Name.size(); } @@ -93,7 +93,7 @@ class GCRing : public Packet { // SlotID SlotID_t m_SlotID; - // ȭ ̸. + // 전화 건 사람의 이름. string m_Name; }; diff --git a/src/Core/GCSMSAddressList.cpp b/src/Core/GCSMSAddressList.cpp index 7359f965..79321588 100644 --- a/src/Core/GCSMSAddressList.cpp +++ b/src/Core/GCSMSAddressList.cpp @@ -2,8 +2,8 @@ // // Filename : GCSMSAddressList.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -73,7 +73,7 @@ GCSMSAddressList::~GCSMSAddressList() } ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSMSAddressList::read(SocketInputStream& iStream) @@ -96,7 +96,7 @@ void GCSMSAddressList::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSMSAddressList::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/GCSay.cpp b/src/Core/GCSay.cpp index fbb86ba4..68551853 100644 --- a/src/Core/GCSay.cpp +++ b/src/Core/GCSay.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSay::read(SocketInputStream& iStream) @@ -38,7 +38,7 @@ void GCSay::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSay::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCSay.h b/src/Core/GCSay.h index 10543fdc..d0ff492c 100644 --- a/src/Core/GCSay.h +++ b/src/Core/GCSay.h @@ -18,9 +18,9 @@ // // class GCSay; // -// Ư ÷̾ Say ٸ ÷̾鿡 εijƮ -// ϴ Ŷ̴. ο ij͸ Say Ʈ Ÿ -// ʵ ִ. +// 게임 서버가 특정 플레이어의 Say 를 다른 플레이어들에게 브로드캐스트 +// 할 때 전송하는 패킷이다. 내부에 캐릭터명과 Say 스트링을 데이타 +// 필드로 가지고 있다. // ////////////////////////////////////////////////////////////////////// @@ -28,10 +28,10 @@ class GCSay : public Packet { public: GCSay() {}; ~GCSay() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -119,7 +119,7 @@ class GCSayFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCSayPacketMaxSize , ϶. + // const static GCSayPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szuint + szBYTE + 128; } diff --git a/src/Core/GCSayHandler.cpp b/src/Core/GCSayHandler.cpp index 9f95bd23..441c3e4b 100644 --- a/src/Core/GCSayHandler.cpp +++ b/src/Core/GCSayHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCSayHandler::execute(GCSay* pPacket, Player* pPlayer) diff --git a/src/Core/GCSearchMotorcycleFail.h b/src/Core/GCSearchMotorcycleFail.h index c619f670..fdeba30b 100644 --- a/src/Core/GCSearchMotorcycleFail.h +++ b/src/Core/GCSearchMotorcycleFail.h @@ -1,8 +1,8 @@ //-------------------------------------------------------------------------------- // // Filename : GCSearchMotorcycleFail.h -// Written By : 輺 -// Description : ÷̾ ˷ ̴ Ŷ̴. +// Written By : 김성민 +// Description : 플레이어에게 서버 측의 상점 버전을 알려줄 때 쓰이는 패킷이다. // //-------------------------------------------------------------------------------- diff --git a/src/Core/GCSearchMotorcycleFailHandler.cpp b/src/Core/GCSearchMotorcycleFailHandler.cpp index 75fc9400..e704fa3e 100644 --- a/src/Core/GCSearchMotorcycleFailHandler.cpp +++ b/src/Core/GCSearchMotorcycleFailHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCSearchMotorcycleFailHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCSearchMotorcycleOK.cpp b/src/Core/GCSearchMotorcycleOK.cpp index d3c645df..130592bf 100644 --- a/src/Core/GCSearchMotorcycleOK.cpp +++ b/src/Core/GCSearchMotorcycleOK.cpp @@ -1,8 +1,8 @@ //-------------------------------------------------------------------------------- // // Filename : GCSearchMotorcycleOK.cpp -// Written By : 輺 -// Description : ÷̾ ˷ ̴ Ŷ̴. +// Written By : 김성민 +// Description : 플레이어에게 서버 측의 상점 버전을 알려줄 때 쓰이는 패킷이다. // //-------------------------------------------------------------------------------- @@ -12,7 +12,7 @@ #include "Assert1.h" //-------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------- void GCSearchMotorcycleOK::read(SocketInputStream& iStream) @@ -28,7 +28,7 @@ void GCSearchMotorcycleOK::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCSearchMotorcycleOK::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCSearchMotorcycleOKHandler.cpp b/src/Core/GCSearchMotorcycleOKHandler.cpp index 474fc039..3c5fbf20 100644 --- a/src/Core/GCSearchMotorcycleOKHandler.cpp +++ b/src/Core/GCSearchMotorcycleOKHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCShopSearchMotorcycleOKHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCSelectQuestID.cpp b/src/Core/GCSelectQuestID.cpp index 2cc04089..a1c088bd 100644 --- a/src/Core/GCSelectQuestID.cpp +++ b/src/Core/GCSelectQuestID.cpp @@ -19,7 +19,7 @@ GCSelectQuestID::~GCSelectQuestID() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCSelectQuestID::read(SocketInputStream& iStream) @@ -41,7 +41,7 @@ void GCSelectQuestID::read(SocketInputStream& iStream) } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCSelectQuestID::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCSelectQuestID.h b/src/Core/GCSelectQuestID.h index 6a21c156..cef2bec9 100644 --- a/src/Core/GCSelectQuestID.h +++ b/src/Core/GCSelectQuestID.h @@ -25,7 +25,7 @@ const BYTE maxQuestNum = 255; class GCSelectQuestID : public Packet { public: #ifdef __GAME_SERVER__ - // inItr container::input_iterator Ѵ. + // inItr은 container::input_iterator 여야 한다. template explicit GCSelectQuestID(inItr b, inItr e) { copy(b, e, back_inserter(m_QuestIDList)); } diff --git a/src/Core/GCSelectQuestIDHandler.cpp b/src/Core/GCSelectQuestIDHandler.cpp index 446858d0..416f29b5 100644 --- a/src/Core/GCSelectQuestIDHandler.cpp +++ b/src/Core/GCSelectQuestIDHandler.cpp @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCSelectQuestIDHandler::execute(GCSelectQuestID* pPacket, Player* pPlayer) diff --git a/src/Core/GCSelectRankBonusFailed.cpp b/src/Core/GCSelectRankBonusFailed.cpp index d8629906..b14950cb 100644 --- a/src/Core/GCSelectRankBonusFailed.cpp +++ b/src/Core/GCSelectRankBonusFailed.cpp @@ -2,7 +2,7 @@ // // Filename : GCSelectRankBonusFailed.cc // Written By : elca@ewestsoft.com -// Description : Skill ִ Ŷ +// Description : Skill이 실패 했을때 날려주는 패킷의 멤버 정의 // ////////////////////////////////////////////////////////////////////// @@ -26,7 +26,7 @@ GCSelectRankBonusFailed::~GCSelectRankBonusFailed() } ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSelectRankBonusFailed::read(SocketInputStream& iStream) @@ -41,7 +41,7 @@ void GCSelectRankBonusFailed::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSelectRankBonusFailed::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCSelectRankBonusFailed.h b/src/Core/GCSelectRankBonusFailed.h index 924024bf..c271727f 100644 --- a/src/Core/GCSelectRankBonusFailed.h +++ b/src/Core/GCSelectRankBonusFailed.h @@ -2,7 +2,7 @@ // // Filename : GCSelectRankBonusFailed.h // Written By : elca@ewestsoft.com -// Description : +// Description : Å // // ////////////////////////////////////////////////////////////////////// @@ -29,10 +29,10 @@ class GCSelectRankBonusFailed : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // ÀԷ½ºÆ®¸²(¹öÆÛ)À¸·ÎºÎÅÍ µ¥ÀÌŸ¸¦ Àо ÆÐŶÀ» ÃʱâÈ­ÇÑ´Ù. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // Ãâ·Â½ºÆ®¸²(¹öÆÛ)À¸·Î ÆÐŶÀÇ ¹ÙÀ̳ʸ® À̹ÌÁö¸¦ º¸³½´Ù. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -74,7 +74,7 @@ class GCSelectRankBonusFailed : public Packet { private: DWORD m_RankBonusType; - BYTE m_Desc; // ڵ + BYTE m_Desc; // ½ÇÆÐÄÚµå }; diff --git a/src/Core/GCSelectRankBonusOK.cpp b/src/Core/GCSelectRankBonusOK.cpp index 54d2f18a..d3c71feb 100644 --- a/src/Core/GCSelectRankBonusOK.cpp +++ b/src/Core/GCSelectRankBonusOK.cpp @@ -2,7 +2,7 @@ // // Filename : GCSelectRankBonusOK.cc // Written By : elca@ewestsoft.com -// Description : Skill ִ Ŷ +// Description : Skill이 실패 했을때 날려주는 패킷의 멤버 정의 // ////////////////////////////////////////////////////////////////////// @@ -30,7 +30,7 @@ GCSelectRankBonusOK::~GCSelectRankBonusOK() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSelectRankBonusOK::read(SocketInputStream& iStream) @@ -42,7 +42,7 @@ void GCSelectRankBonusOK::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSelectRankBonusOK::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCSelectRankBonusOK.h b/src/Core/GCSelectRankBonusOK.h index d8d8ed3a..09ee94c7 100644 --- a/src/Core/GCSelectRankBonusOK.h +++ b/src/Core/GCSelectRankBonusOK.h @@ -2,7 +2,7 @@ // // Filename : GCSelectRankBonusOK.h // Written By : elca@ewestsoft.com -// Description : +// Description : Å // // ////////////////////////////////////////////////////////////////////// @@ -32,10 +32,10 @@ class GCSelectRankBonusOK : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // ÀԷ½ºÆ®¸²(¹öÆÛ)À¸·ÎºÎÅÍ µ¥ÀÌŸ¸¦ Àо ÆÐŶÀ» ÃʱâÈ­ÇÑ´Ù. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // Ãâ·Â½ºÆ®¸²(¹öÆÛ)À¸·Î ÆÐŶÀÇ ¹ÙÀ̳ʸ® À̹ÌÁö¸¦ º¸³½´Ù. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/GCSetPosition.cpp b/src/Core/GCSetPosition.cpp index 697528b7..1cabc39f 100644 --- a/src/Core/GCSetPosition.cpp +++ b/src/Core/GCSetPosition.cpp @@ -10,7 +10,7 @@ #include "GCSetPosition.h" ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSetPosition::read(SocketInputStream& iStream) @@ -26,7 +26,7 @@ void GCSetPosition::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSetPosition::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCSetPosition.h b/src/Core/GCSetPosition.h index d65cd7d5..d0189f23 100644 --- a/src/Core/GCSetPosition.h +++ b/src/Core/GCSetPosition.h @@ -18,8 +18,8 @@ // // class GCSetPosition; // -// ÷̾ ġ ִ Ŷ̴. -// ߿ GCPatchPCInfo(Ī) Ŷ յ ̴. +// 게임 서버에서 플레이어의 위치를 설정해주는 패킷이다. +// 나중에 GCPatchPCInfo(가칭) 패킷에 통합될 전망이다. // //---------------------------------------------------------------------- @@ -27,10 +27,10 @@ class GCSetPosition : public Packet { public: GCSetPosition() {}; ~GCSetPosition() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -43,7 +43,7 @@ class GCSetPosition : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCSetPositionPacketSize ؼ ϶. + // const static GCSetPositionPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szCoord + szCoord + szDir; } @@ -81,9 +81,9 @@ class GCSetPosition : public Packet { } private: - Coord_t m_X; // X ǥ - Coord_t m_Y; // Y ǥ - Dir_t m_Dir; // + Coord_t m_X; // X 좌표 + Coord_t m_Y; // Y 좌표 + Dir_t m_Dir; // 방향 }; @@ -114,7 +114,7 @@ class GCSetPositionFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCSetPositionPacketSize ؼ ϶. + // const static GCSetPositionPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szCoord + szCoord + szDir; } diff --git a/src/Core/GCShopBought.cpp b/src/Core/GCShopBought.cpp index 8f84e139..e552e817 100644 --- a/src/Core/GCShopBought.cpp +++ b/src/Core/GCShopBought.cpp @@ -1,12 +1,12 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCShopBought.cpp -// Written By : 輺 +// Written By : 김성민 // Description : -// NPC ÷̾κ 鿴 , NPC -// ̾߱ϰ ִ ÷̾ 鿴ٴ -// ˷ֱ Ŷ . -// Ŭ̾Ʈ Ŷ شϴ شϴ -// NPC ǰ Ͽ ߰ؾ Ѵ. Ʈ~ +// 상점 NPC가 플레이어로부터 물건을 사들였을 때, 같은 NPC와 +// 이야기하고 있는 플레이어에게 물건을 사들였다는 사실을 +// 알려주기 위해 이 패킷을 보낸다. +// 클라이언트는 이 패킷을 받으면 해당하는 아이템을 해당하는 +// NPC의 상품 목록에 추가해야 한다. 상점 버전도 업데이트~ ////////////////////////////////////////////////////////////////////////////// #include "GCShopBought.h" @@ -47,7 +47,7 @@ GCShopBought::~GCShopBought() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCShopBought::read(SocketInputStream& iStream) @@ -80,7 +80,7 @@ void GCShopBought::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCShopBought::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCShopBought.h b/src/Core/GCShopBought.h index 5401bfe9..f1403276 100644 --- a/src/Core/GCShopBought.h +++ b/src/Core/GCShopBought.h @@ -1,12 +1,12 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCShopBought.h -// Written By : 輺 +// Written By : 김성민 // Description : -// NPC ÷̾κ 鿴 , NPC -// ̾߱ϰ ִ ÷̾ 鿴ٴ -// ˷ֱ Ŷ . -// Ŭ̾Ʈ Ŷ شϴ شϴ -// NPC ǰ Ͽ ߰ؾ Ѵ. Ʈ~ +// 상점 NPC가 플레이어로부터 물건을 사들였을 때, 같은 NPC와 +// 이야기하고 있는 플레이어에게 물건을 사들였다는 사실을 +// 알려주기 위해 이 패킷을 보낸다. +// 클라이언트는 이 패킷을 받으면 해당하는 아이템을 해당하는 +// NPC의 상품 목록에 추가해야 한다. 상점 버전도 업데이트~ ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_SHOP_BOUGHT_H__ @@ -152,17 +152,17 @@ class GCShopBought : public Packet { private: ObjectID_t m_ObjectID; // NPC's object id - ShopVersion_t m_Version; // - ShopRackType_t m_ShopType; // - BYTE m_ShopIndex; // ε - ObjectID_t m_ItemObjectID; // item OID - BYTE m_ItemClass; // item class - ItemType_t m_ItemType; // item type - list m_OptionType; // option type - Durability_t m_Durability; // durability - Silver_t m_Silver; // silver coating amount + ShopVersion_t m_Version; // 상점 버젼 + ShopRackType_t m_ShopType; // 상점 종류 + BYTE m_ShopIndex; // 상점 인덱스 + ObjectID_t m_ItemObjectID; // 사들인 아이템의 item OID + BYTE m_ItemClass; // 사들인 아이템의 item class + ItemType_t m_ItemType; // 사들인 아이템의 item type + list m_OptionType; // 사들인 아이템의 option type + Durability_t m_Durability; // 사들인 아이템의 durability + Silver_t m_Silver; // 사들인 아이템의 silver coating amount Grade_t m_Grade; - EnchantLevel_t m_EnchantLevel; // enchant level + EnchantLevel_t m_EnchantLevel; // 사들인 아이템의 enchant level }; diff --git a/src/Core/GCShopBoughtHandler.cpp b/src/Core/GCShopBoughtHandler.cpp index e44c06bd..44267502 100644 --- a/src/Core/GCShopBoughtHandler.cpp +++ b/src/Core/GCShopBoughtHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCShopBoughtHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCShopBuyFail.cpp b/src/Core/GCShopBuyFail.cpp index 2a628a91..46ba85e9 100644 --- a/src/Core/GCShopBuyFail.cpp +++ b/src/Core/GCShopBuyFail.cpp @@ -2,8 +2,8 @@ // Filename : GCShopBuyFail.cpp // Written By : excel96 // Description : -// ÷̾ Ϸ ߴµ, -// Ű 쿡 ÷̾ Ŷ. +// 플레이어가 상점에서 아이템을 구입하려고 했는데, +// 정상적인 구매가 실패했을 경우에 플레이어에게 보내는 패킷. ////////////////////////////////////////////////////////////////////////////// #include "GCShopBuyFail.h" diff --git a/src/Core/GCShopBuyFail.h b/src/Core/GCShopBuyFail.h index 3b44568f..019f8cc0 100644 --- a/src/Core/GCShopBuyFail.h +++ b/src/Core/GCShopBuyFail.h @@ -2,8 +2,8 @@ // Filename : GCShopBuyFail.h // Written By : excel96 // Description : -// ÷̾ Ϸ ߴµ, -// Ű 쿡 ÷̾ Ŷ. +// 플레이어가 상점에서 아이템을 구입하려고 했는데, +// 정상적인 구매가 실패했을 경우에 플레이어에게 보내는 패킷. ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_SHOP_BUY_FAIL_H__ @@ -13,19 +13,19 @@ #include "PacketFactory.h" enum GCShopBuyFailCode { - // ڶ. + // 돈이 모자란다. GC_SHOP_BUY_FAIL_NOT_ENOUGH_MONEY = 0, - // ڸ ڶ. + // 자리가 모자란다. GC_SHOP_BUY_FAIL_NOT_ENOUGH_SPACE, - // NPC ʴ´. + // NPC가 존재하지 않는다. GC_SHOP_BUY_FAIL_NPC_NOT_EXIST, - // NPC NPC ƴϴ. + // NPC라고 보내온 놈이 NPC가 아니다. GC_SHOP_BUY_FAIL_NOT_NPC, - // ġ ʴ´. + // 지정한 위치에 아이템이 존재하지 않는다. GC_SHOP_BUY_FAIL_ITEM_NOT_EXIST, GC_SHOP_BUY_FAIL_NOT_ENOUGH_BLACK_STAR, diff --git a/src/Core/GCShopBuyFailHandler.cpp b/src/Core/GCShopBuyFailHandler.cpp index dd78259b..97c076aa 100644 --- a/src/Core/GCShopBuyFailHandler.cpp +++ b/src/Core/GCShopBuyFailHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCShopBuyFailHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCShopBuyOK.h b/src/Core/GCShopBuyOK.h index e4b3287c..e9b5f85f 100644 --- a/src/Core/GCShopBuyOK.h +++ b/src/Core/GCShopBuyOK.h @@ -1,9 +1,9 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCShopBuyOK.h -// Written By : 輺 +// Written By : 김성민 // Description : -// ÷̾ NPC û , -// Ǹ Ŷ ÷̾ ư. +// 플레이어가 상점 NPC에게 물건 구입을 요청했을 때, 제대로 +// 인증이 되면 이 패킷이 플레이어에게 날아간다. ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_SHOP_BUY_OK_H__ @@ -146,17 +146,17 @@ class GCShopBuyOK : public Packet { private: ObjectID_t m_ObjectID; // NPC's object id - ShopVersion_t m_Version; // - ObjectID_t m_ItemObjectID; // ÷̾ OID - BYTE m_ItemClass; // ÷̾ class - ItemType_t m_ItemType; // ÷̾ type - list m_OptionType; // ÷̾ option type - Durability_t m_Durability; // ÷̾ durability - ItemNum_t m_ItemNum; // ÷̾ item num - Silver_t m_Silver; // ÷̾ silver coating amount - Grade_t m_Grade; // ÷̾ silver coating amount - EnchantLevel_t m_EnchantLevel; // ÷̾ enchant level - Price_t m_Price; // ÷̾ + ShopVersion_t m_Version; // 상점 버젼 + ObjectID_t m_ItemObjectID; // 플레이어가 산 아이템의 OID + BYTE m_ItemClass; // 플레이어가 산 아이템의 class + ItemType_t m_ItemType; // 플레이어가 산 아이템의 type + list m_OptionType; // 플레이어가 산 아이템의 option type + Durability_t m_Durability; // 플레이어가 산 아이템의 durability + ItemNum_t m_ItemNum; // 플레이어가 산 아이템의 item num + Silver_t m_Silver; // 플레이어가 산 아이템의 silver coating amount + Grade_t m_Grade; // 플레이어가 산 아이템의 silver coating amount + EnchantLevel_t m_EnchantLevel; // 플레이어가 산 아이템의 enchant level + Price_t m_Price; // 플레이어가 현재 돈 }; diff --git a/src/Core/GCShopBuyOKHandler.cpp b/src/Core/GCShopBuyOKHandler.cpp index 82a9040d..2dd6be8d 100644 --- a/src/Core/GCShopBuyOKHandler.cpp +++ b/src/Core/GCShopBuyOKHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCShopBuyOKHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCShopList.cpp b/src/Core/GCShopList.cpp index 6ed735d9..bb2bfce7 100644 --- a/src/Core/GCShopList.cpp +++ b/src/Core/GCShopList.cpp @@ -1,10 +1,10 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCShopList.cpp -// Written By : 輺 +// Written By : 김성민 // Description : -// ÷̾ ִ Ͱ ٸ , -// ÷̾ ִ ǰ 䱸ϰ ȴ. -// Ŷ ÷̾ ϰ Ǵ Ŷ̴. +// 플레이어가 가진 상점 버전이 서버에 있는 것과 다를 경우, +// 플레이어는 서버에 상점에 있는 상품 목록을 요구하게 된다. +// 이 패킷은 그 때 플레이어에게 전달하게 되는 패킷이다. ////////////////////////////////////////////////////////////////////////////// #include "GCShopList.h" @@ -42,7 +42,7 @@ GCShopList::~GCShopList() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCShopList::read(SocketInputStream& iStream) @@ -93,7 +93,7 @@ void GCShopList::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCShopList::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCShopList.h b/src/Core/GCShopList.h index 7c231a6e..f6b1c398 100644 --- a/src/Core/GCShopList.h +++ b/src/Core/GCShopList.h @@ -1,10 +1,10 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCShopList.h -// Written By : 輺 +// Written By : 김성민 // Description : -// ÷̾ ִ Ͱ ٸ , -// ÷̾ ִ ǰ 䱸ϰ ȴ. -// Ŷ ÷̾ ϰ Ǵ Ŷ̴. +// 플레이어가 가진 상점 버전이 서버에 있는 것과 다를 경우, +// 플레이어는 서버에 상점에 있는 상품 목록을 요구하게 된다. +// 이 패킷은 그 때 플레이어에게 전달하게 되는 패킷이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_SHOP_LIST_H__ @@ -104,9 +104,9 @@ class GCShopList : public Packet { ShopVersion_t m_Version; // Shop version ShopRackType_t m_RackType; // rack type SHOPLISTITEM m_pBuffer[SHOP_RACK_INDEX_MAX]; // actual item info - MarketCond_t m_MarketCondBuy; // ü - MarketCond_t m_MarketCondSell; // ü - BYTE m_ShopType; // (Ϲ or ̺Ʈ) + MarketCond_t m_MarketCondBuy; // 시장 시세 + MarketCond_t m_MarketCondSell; // 시장 시세 + BYTE m_ShopType; // 상점의 종류 (일반 or 이벤트) }; diff --git a/src/Core/GCShopListHandler.cpp b/src/Core/GCShopListHandler.cpp index f9ecbc64..d70f01e9 100644 --- a/src/Core/GCShopListHandler.cpp +++ b/src/Core/GCShopListHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCShopListHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCShopListMysterious.cpp b/src/Core/GCShopListMysterious.cpp index 05c914be..e3cd7a4a 100644 --- a/src/Core/GCShopListMysterious.cpp +++ b/src/Core/GCShopListMysterious.cpp @@ -1,10 +1,10 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCShopListMysterious.cpp -// Written By : 輺 +// Written By : 김성민 // Description : -// ÷̾ ִ Ͱ ٸ , -// ÷̾ ִ ǰ 䱸ϰ ȴ. -// Ŷ ÷̾ ϰ Ǵ Ŷ̴. +// 플레이어가 가진 상점 버전이 서버에 있는 것과 다를 경우, +// 플레이어는 서버에 상점에 있는 상품 목록을 요구하게 된다. +// 이 패킷은 그 때 플레이어에게 전달하게 되는 패킷이다. ////////////////////////////////////////////////////////////////////////////// #include "GCShopListMysterious.h" @@ -37,7 +37,7 @@ GCShopListMysterious::~GCShopListMysterious() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCShopListMysterious::read(SocketInputStream& iStream) @@ -71,7 +71,7 @@ void GCShopListMysterious::read(SocketInputStream& iStream) } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCShopListMysterious::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCShopListMysterious.h b/src/Core/GCShopListMysterious.h index 30d408a2..58aa1206 100644 --- a/src/Core/GCShopListMysterious.h +++ b/src/Core/GCShopListMysterious.h @@ -1,10 +1,10 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCShopListMysterious.h -// Written By : 輺 +// Written By : 김성민 // Description : -// ÷̾ ִ Ͱ ٸ , -// ÷̾ ִ ǰ 䱸ϰ ȴ. -// Ŷ ÷̾ ϰ Ǵ Ŷ̴. +// 플레이어가 가진 상점 버전이 서버에 있는 것과 다를 경우, +// 플레이어는 서버에 상점에 있는 상품 목록을 요구하게 된다. +// 이 패킷은 그 때 플레이어에게 전달하게 되는 패킷이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_SHOP_LIST_MYSTERIOUS_H__ @@ -91,7 +91,7 @@ class GCShopListMysterious : public Packet { ShopVersion_t m_Version; // Shop version ShopRackType_t m_RackType; // rack type SHOPLISTITEM_MYSTERIOUS m_pBuffer[SHOP_RACK_INDEX_MAX]; // buffer for i/o - MarketCond_t m_MarketCondBuy; // ü + MarketCond_t m_MarketCondBuy; // 시장 시세 MarketCond_t m_MarketCondSell; }; diff --git a/src/Core/GCShopListMysteriousHandler.cpp b/src/Core/GCShopListMysteriousHandler.cpp index 198b81fb..3f7106f6 100644 --- a/src/Core/GCShopListMysteriousHandler.cpp +++ b/src/Core/GCShopListMysteriousHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCShopListMysteriousHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCShopMarketCondition.cpp b/src/Core/GCShopMarketCondition.cpp index 723b17e3..dd5de036 100644 --- a/src/Core/GCShopMarketCondition.cpp +++ b/src/Core/GCShopMarketCondition.cpp @@ -1,8 +1,8 @@ //-------------------------------------------------------------------------------- // // Filename : GCShopMarketCondition.cpp -// Written By : 輺 -// Description : ÷̾ ˷ ̴ Ŷ̴. +// Written By : 김성민 +// Description : 플레이어에게 서버 측의 상점 버전을 알려줄 때 쓰이는 패킷이다. // //-------------------------------------------------------------------------------- @@ -36,7 +36,7 @@ GCShopMarketCondition::~GCShopMarketCondition() } //-------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------- void GCShopMarketCondition::read(SocketInputStream& iStream) @@ -55,7 +55,7 @@ void GCShopMarketCondition::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCShopMarketCondition::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCShopMarketCondition.h b/src/Core/GCShopMarketCondition.h index 23e480ee..0cddf4b5 100644 --- a/src/Core/GCShopMarketCondition.h +++ b/src/Core/GCShopMarketCondition.h @@ -1,8 +1,8 @@ //-------------------------------------------------------------------------------- // // Filename : GCShopMarketCondition.h -// Written By : 輺 -// Description : ÷̾ ˷ ̴ Ŷ̴. +// Written By : 김성민 +// Description : 플레이어에게 서버 측의 상점 버전을 알려줄 때 쓰이는 패킷이다. // //-------------------------------------------------------------------------------- @@ -25,10 +25,10 @@ class GCShopMarketCondition : public Packet { GCShopMarketCondition(); virtual ~GCShopMarketCondition(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -115,7 +115,7 @@ class GCShopMarketConditionFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCShopMarketConditionPacketMaxSize , ϶. + // const static GCShopMarketConditionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szMarketCond * 2; } diff --git a/src/Core/GCShopMarketConditionHandler.cpp b/src/Core/GCShopMarketConditionHandler.cpp index 8c9099ef..e1860ba0 100644 --- a/src/Core/GCShopMarketConditionHandler.cpp +++ b/src/Core/GCShopMarketConditionHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCShopMarketConditionHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCShopSellFail.cpp b/src/Core/GCShopSellFail.cpp index 9a614d8a..f373aa2b 100644 --- a/src/Core/GCShopSellFail.cpp +++ b/src/Core/GCShopSellFail.cpp @@ -1,9 +1,9 @@ //-------------------------------------------------------------------------------- // // Filename : GCShopSellFail.cpp -// Written By : 輺 -// Description : ÷̾ NPC ȷ ߴµ,  -// 쿡 Ŷ ÷̾ ش. +// Written By : 김성민 +// Description : 플레이어가 NPC에게 물건을 팔려고 했는데, 어떤 이유로 +// 실패했을 경우에는 이 패킷을 플레이어에게 보내준다. // //-------------------------------------------------------------------------------- @@ -38,7 +38,7 @@ GCShopSellFail::~GCShopSellFail() } //-------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------- void GCShopSellFail::read(SocketInputStream& iStream) @@ -55,7 +55,7 @@ void GCShopSellFail::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCShopSellFail::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCShopSellFail.h b/src/Core/GCShopSellFail.h index 2804b22f..10737370 100644 --- a/src/Core/GCShopSellFail.h +++ b/src/Core/GCShopSellFail.h @@ -1,9 +1,9 @@ //-------------------------------------------------------------------------------- // // Filename : GCShopSellFail.h -// Written By : 輺 -// Description : ÷̾ NPC ȷ ߴµ,  -// 쿡 Ŷ ÷̾ ش. +// Written By : 김성민 +// Description : 플레이어가 NPC에게 물건을 팔려고 했는데, 어떤 이유로 +// 실패했을 경우에는 이 패킷을 플레이어에게 보내준다. // //-------------------------------------------------------------------------------- @@ -26,10 +26,10 @@ class GCShopSellFail : public Packet { GCShopSellFail(); virtual ~GCShopSellFail(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -97,7 +97,7 @@ class GCShopSellFailFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCShopSellFailPacketMaxSize , ϶. + // const static GCShopSellFailPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID; } diff --git a/src/Core/GCShopSellFailHandler.cpp b/src/Core/GCShopSellFailHandler.cpp index 641b65e4..5d48c0ce 100644 --- a/src/Core/GCShopSellFailHandler.cpp +++ b/src/Core/GCShopSellFailHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCShopSellFailHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCShopSellOK.cpp b/src/Core/GCShopSellOK.cpp index 58f01baa..95a87557 100644 --- a/src/Core/GCShopSellOK.cpp +++ b/src/Core/GCShopSellOK.cpp @@ -1,12 +1,12 @@ //-------------------------------------------------------------------------------- // // Filename : GCShopSellOK.cpp -// Written By : 輺 -// Description : ÷̾ NPC û , -// Ǹ Ŷ ÷̾ ư. -// Ŭ̾Ʈ Ŷ ޾Ƽ Ʈϰ, -// Ʈ ID üũ , ̿ -// ÷̾ ƮѴ. +// Written By : 김성민 +// Description : 플레이어가 상점 NPC에게 물건 구입을 요청했을 때, 제대로 +// 인증이 되면 이 패킷이 플레이어에게 날아간다. +// 클라이언트는 이 패킷을 받아서 상점 버전을 업데이트하고, +// 오브젝트 ID로 아이템 정보를 체크해 놓고, 가격을 이용해 +// 플레이어의 돈을 업데이트한다. // //-------------------------------------------------------------------------------- @@ -41,7 +41,7 @@ GCShopSellOK::~GCShopSellOK() } //-------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------- void GCShopSellOK::read(SocketInputStream& iStream) @@ -58,7 +58,7 @@ void GCShopSellOK::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCShopSellOK::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCShopSellOK.h b/src/Core/GCShopSellOK.h index fc6a0cef..4e339cc7 100644 --- a/src/Core/GCShopSellOK.h +++ b/src/Core/GCShopSellOK.h @@ -1,12 +1,12 @@ //-------------------------------------------------------------------------------- // // Filename : GCShopSellOK.h -// Written By : 輺 -// Description : ÷̾ NPC û , -// Ǹ Ŷ ÷̾ ư. -// Ŭ̾Ʈ Ŷ ޾Ƽ Ʈϰ, -// Ʈ ID üũ , ̿ -// ÷̾ ƮѴ. +// Written By : 김성민 +// Description : 플레이어가 상점 NPC에게 물건 구입을 요청했을 때, 제대로 +// 인증이 되면 이 패킷이 플레이어에게 날아간다. +// 클라이언트는 이 패킷을 받아서 상점 버전을 업데이트하고, +// 오브젝트 ID로 아이템 정보를 체크해 놓고, 가격을 이용해 +// 플레이어의 돈을 업데이트한다. // //-------------------------------------------------------------------------------- @@ -29,10 +29,10 @@ class GCShopSellOK : public Packet { GCShopSellOK(); virtual ~GCShopSellOK(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -94,13 +94,13 @@ class GCShopSellOK : public Packet { // NPC's object id ObjectID_t m_ObjectID; - // + // 상점 버젼 ShopVersion_t m_Version; - // + // 아이템 정보 ObjectID_t m_ItemObjectID; - // + // 가격 Price_t m_Price; }; diff --git a/src/Core/GCShopSellOKHandler.cpp b/src/Core/GCShopSellOKHandler.cpp index cf25fc45..aa8d3512 100644 --- a/src/Core/GCShopSellOKHandler.cpp +++ b/src/Core/GCShopSellOKHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCShopSellOKHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCShopSold.cpp b/src/Core/GCShopSold.cpp index 3a36aa0a..86d49a62 100644 --- a/src/Core/GCShopSold.cpp +++ b/src/Core/GCShopSold.cpp @@ -1,11 +1,11 @@ //-------------------------------------------------------------------------------- // // Filename : GCShopSold.cpp -// Written By : 輺 -// Description : ÷̾ NPC ߴµ, -// ٸ ÷̾ NPC ȭ ̾ٸ, -// ÷̾ ȭ־ Ѵ. -// Ŷ ׸ Ŷ̴. +// Written By : 김성민 +// Description : 한 플레이어가 상점 NPC에게 물건을 구입했는데, +// 다른 플레이어도 같은 상점 NPC와 대화 중이었다면, +// 그 플레이어와 아이템 목록을 동기화시켜주어야 한다. +// 이 패킷은 그를 위한 패킷이다. // //-------------------------------------------------------------------------------- @@ -38,7 +38,7 @@ GCShopSold::~GCShopSold() } //-------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------- void GCShopSold::read(SocketInputStream& iStream) @@ -55,7 +55,7 @@ void GCShopSold::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCShopSold::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCShopSold.h b/src/Core/GCShopSold.h index 3ca55bb8..5b0c757f 100644 --- a/src/Core/GCShopSold.h +++ b/src/Core/GCShopSold.h @@ -1,11 +1,11 @@ //-------------------------------------------------------------------------------- // // Filename : GCShopSold.h -// Written By : 輺 -// Description : ÷̾ NPC ߴµ, -// ٸ ÷̾ NPC ȭ ̾ٸ, -// ÷̾ ȭ־ Ѵ. -// Ŷ ׸ Ŷ̴. +// Written By : 김성민 +// Description : 한 플레이어가 상점 NPC에게 물건을 구입했는데, +// 다른 플레이어도 같은 상점 NPC와 대화 중이었다면, +// 그 플레이어와 아이템 목록을 동기화시켜주어야 한다. +// 이 패킷은 그를 위한 패킷이다. // //-------------------------------------------------------------------------------- @@ -28,10 +28,10 @@ class GCShopSold : public Packet { GCShopSold(); virtual ~GCShopSold(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -93,13 +93,13 @@ class GCShopSold : public Packet { // NPC's object id ObjectID_t m_ObjectID; - // + // 상점 버젼 ShopVersion_t m_Version; - // + // 진열장 종류 ShopRackType_t m_RackType; - // ε + // 진열장 인덱스 BYTE m_RackIndex; }; @@ -131,7 +131,7 @@ class GCShopSoldFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCShopSoldPacketMaxSize , ϶. + // const static GCShopSoldPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szShopVersion + szShopRackType + szBYTE; } diff --git a/src/Core/GCShopSoldHandler.cpp b/src/Core/GCShopSoldHandler.cpp index 88e59a99..e88e198c 100644 --- a/src/Core/GCShopSoldHandler.cpp +++ b/src/Core/GCShopSoldHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCShopSoldHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCShopVersion.cpp b/src/Core/GCShopVersion.cpp index 5b83dd86..efb08e04 100644 --- a/src/Core/GCShopVersion.cpp +++ b/src/Core/GCShopVersion.cpp @@ -1,8 +1,8 @@ //-------------------------------------------------------------------------------- // // Filename : GCShopVersion.cpp -// Written By : 輺 -// Description : ÷̾ ˷ ̴ Ŷ̴. +// Written By : 김성민 +// Description : 플레이어에게 서버 측의 상점 버전을 알려줄 때 쓰이는 패킷이다. // //-------------------------------------------------------------------------------- @@ -36,7 +36,7 @@ GCShopVersion::~GCShopVersion() } //-------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------- void GCShopVersion::read(SocketInputStream& iStream) @@ -57,7 +57,7 @@ void GCShopVersion::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCShopVersion::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCShopVersion.h b/src/Core/GCShopVersion.h index a4eae43e..a31aa21f 100644 --- a/src/Core/GCShopVersion.h +++ b/src/Core/GCShopVersion.h @@ -1,8 +1,8 @@ //-------------------------------------------------------------------------------- // // Filename : GCShopVersion.h -// Written By : 輺 -// Description : ÷̾ ˷ ̴ Ŷ̴. +// Written By : 김성민 +// Description : 플레이어에게 서버 측의 상점 버전을 알려줄 때 쓰이는 패킷이다. // //-------------------------------------------------------------------------------- @@ -25,10 +25,10 @@ class GCShopVersion : public Packet { GCShopVersion(); virtual ~GCShopVersion(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -121,7 +121,7 @@ class GCShopVersionFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCShopVersionPacketMaxSize , ϶. + // const static GCShopVersionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szShopVersion * 3 + szMarketCond; } diff --git a/src/Core/GCShopVersionHandler.cpp b/src/Core/GCShopVersionHandler.cpp index 528f0725..41d9803e 100644 --- a/src/Core/GCShopVersionHandler.cpp +++ b/src/Core/GCShopVersionHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCShopVersionHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCShowGuildInfo.cpp b/src/Core/GCShowGuildInfo.cpp index d867baea..3c1537c4 100644 --- a/src/Core/GCShowGuildInfo.cpp +++ b/src/Core/GCShowGuildInfo.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCShowGuildInfo::read(SocketInputStream& iStream) @@ -53,7 +53,7 @@ void GCShowGuildInfo::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCShowGuildInfo::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCShowGuildInfo.h b/src/Core/GCShowGuildInfo.h index ba75ddbf..839f2cba 100644 --- a/src/Core/GCShowGuildInfo.h +++ b/src/Core/GCShowGuildInfo.h @@ -17,7 +17,7 @@ // // class GCShowGuildInfo; // -// Ŭ̾Ʈ â 쵵 Ѵ. +// 클라이언트에 길드 등록 창을 띄우도록 한다. // ////////////////////////////////////////////////////////////////////// @@ -25,10 +25,10 @@ class GCShowGuildInfo : public Packet { public: GCShowGuildInfo() {}; ~GCShowGuildInfo() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -169,7 +169,7 @@ class GCShowGuildInfoFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCSystemMessagePacketMaxSize , ϶. + // const static GCSystemMessagePacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID + // Guild ID szBYTE + // Guild Name length diff --git a/src/Core/GCShowGuildJoin.cpp b/src/Core/GCShowGuildJoin.cpp index 4041fa97..91c97bef 100644 --- a/src/Core/GCShowGuildJoin.cpp +++ b/src/Core/GCShowGuildJoin.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCShowGuildJoin::read(SocketInputStream& iStream) @@ -36,7 +36,7 @@ void GCShowGuildJoin::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCShowGuildJoin::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCShowGuildJoin.h b/src/Core/GCShowGuildJoin.h index 5cb3dd41..86d8bd96 100644 --- a/src/Core/GCShowGuildJoin.h +++ b/src/Core/GCShowGuildJoin.h @@ -17,7 +17,7 @@ // // class GCShowGuildJoin; // -// Ŭ̾Ʈ â 쵵 Ѵ. +// 클라이언트에 길드 등록 창을 띄우도록 한다. // ////////////////////////////////////////////////////////////////////// @@ -25,10 +25,10 @@ class GCShowGuildJoin : public Packet { public: GCShowGuildJoin() {}; ~GCShowGuildJoin() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -126,7 +126,7 @@ class GCShowGuildJoinFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCSystemMessagePacketMaxSize , ϶. + // const static GCSystemMessagePacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID + szBYTE + 30 + szGuildMemberRank + szGold; } diff --git a/src/Core/GCShowGuildMemberInfo.cpp b/src/Core/GCShowGuildMemberInfo.cpp index 3fd56e3d..af997e0f 100644 --- a/src/Core/GCShowGuildMemberInfo.cpp +++ b/src/Core/GCShowGuildMemberInfo.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCShowGuildMemberInfo::read(SocketInputStream& iStream) @@ -39,7 +39,7 @@ void GCShowGuildMemberInfo::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCShowGuildMemberInfo::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCShowGuildMemberInfo.h b/src/Core/GCShowGuildMemberInfo.h index 0833a912..795ae177 100644 --- a/src/Core/GCShowGuildMemberInfo.h +++ b/src/Core/GCShowGuildMemberInfo.h @@ -17,7 +17,7 @@ // // class GCShowGuildMemberInfo; // -// Ŭ̾Ʈ â 쵵 Ѵ. +// 클라이언트에 길드 등록 창을 띄우도록 한다. // ////////////////////////////////////////////////////////////////////// @@ -25,10 +25,10 @@ class GCShowGuildMemberInfo : public Packet { public: GCShowGuildMemberInfo() {}; ~GCShowGuildMemberInfo() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -131,7 +131,7 @@ class GCShowGuildMemberInfoFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCSystemMessagePacketMaxSize , ϶. + // const static GCSystemMessagePacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID + // Guild ID szBYTE + // Name length diff --git a/src/Core/GCShowGuildRegist.cpp b/src/Core/GCShowGuildRegist.cpp index cadfe27a..57bd564d 100644 --- a/src/Core/GCShowGuildRegist.cpp +++ b/src/Core/GCShowGuildRegist.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCShowGuildRegist::read(SocketInputStream& iStream) @@ -24,7 +24,7 @@ void GCShowGuildRegist::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCShowGuildRegist::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCShowMessageBox.cpp b/src/Core/GCShowMessageBox.cpp index d48fb50b..c7a907cb 100644 --- a/src/Core/GCShowMessageBox.cpp +++ b/src/Core/GCShowMessageBox.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCShowMessageBox::read(SocketInputStream& iStream) @@ -32,7 +32,7 @@ void GCShowMessageBox::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCShowMessageBox::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCShowMessageBox.h b/src/Core/GCShowMessageBox.h index aeba4e0d..bf0ad1a7 100644 --- a/src/Core/GCShowMessageBox.h +++ b/src/Core/GCShowMessageBox.h @@ -17,7 +17,7 @@ // // class GCShowMessageBox; // -// Ŭ̾Ʈ â 쵵 Ѵ. +// 클라이언트에 길드 등록 창을 띄우도록 한다. // ////////////////////////////////////////////////////////////////////// @@ -25,10 +25,10 @@ class GCShowMessageBox : public Packet { public: GCShowMessageBox() {}; ~GCShowMessageBox() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -94,7 +94,7 @@ class GCShowMessageBoxFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCSystemMessagePacketMaxSize , ϶. + // const static GCSystemMessagePacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + 256; } diff --git a/src/Core/GCShowUnionInfo.cpp b/src/Core/GCShowUnionInfo.cpp index b161db38..12229281 100644 --- a/src/Core/GCShowUnionInfo.cpp +++ b/src/Core/GCShowUnionInfo.cpp @@ -41,7 +41,7 @@ PacketSize_t GCShowUnionInfo::getPacketSize() const { } ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCShowUnionInfo::read(SocketInputStream& iStream) @@ -63,7 +63,7 @@ void GCShowUnionInfo::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCShowUnionInfo::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCShowUnionInfo.h b/src/Core/GCShowUnionInfo.h index 3566bd7b..5c82aa64 100644 --- a/src/Core/GCShowUnionInfo.h +++ b/src/Core/GCShowUnionInfo.h @@ -19,7 +19,7 @@ // // class GCShowUnionInfo; // -// Ŭ̾Ʈ â 쵵 Ѵ. +// 클라이언트에 길드 등록 창을 띄우도록 한다. // ////////////////////////////////////////////////////////////////////// @@ -207,10 +207,10 @@ class GCShowUnionInfo : public Packet { ~GCShowUnionInfo(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -273,7 +273,7 @@ class GCShowUnionInfoFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCSystemMessagePacketMaxSize , ϶. + // const static GCSystemMessagePacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return SingleGuildInfo::getMaxSize() * 4; } diff --git a/src/Core/GCShowWaitGuildInfo.cpp b/src/Core/GCShowWaitGuildInfo.cpp index c4c58134..a481a57f 100644 --- a/src/Core/GCShowWaitGuildInfo.cpp +++ b/src/Core/GCShowWaitGuildInfo.cpp @@ -11,7 +11,7 @@ #include ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCShowWaitGuildInfo::read(SocketInputStream& iStream) @@ -68,7 +68,7 @@ void GCShowWaitGuildInfo::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCShowWaitGuildInfo::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCShowWaitGuildInfo.h b/src/Core/GCShowWaitGuildInfo.h index 3ab6e397..1b7af5a2 100644 --- a/src/Core/GCShowWaitGuildInfo.h +++ b/src/Core/GCShowWaitGuildInfo.h @@ -19,7 +19,7 @@ // // class GCShowWaitGuildInfo; // -// Ŭ̾Ʈ â 쵵 Ѵ. +// 클라이언트에 길드 등록 창을 띄우도록 한다. // ////////////////////////////////////////////////////////////////////// @@ -27,10 +27,10 @@ class GCShowWaitGuildInfo : public Packet { public: GCShowWaitGuildInfo() {}; ~GCShowWaitGuildInfo() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -179,7 +179,7 @@ class GCShowWaitGuildInfoFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCSystemMessagePacketMaxSize , ϶. + // const static GCSystemMessagePacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID + // Guild ID szBYTE + // Guild Name length diff --git a/src/Core/GCSkillFailed1.cpp b/src/Core/GCSkillFailed1.cpp index 4c4b224d..f9098a8c 100644 --- a/src/Core/GCSkillFailed1.cpp +++ b/src/Core/GCSkillFailed1.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCSkillFailed1.cc // Written By : elca@ewestsoft.com -// Description : Skill ִ Ŷ +// Description : Skill이 실패 했을때 날려주는 패킷의 멤버 정의 ////////////////////////////////////////////////////////////////////////////// #include "GCSkillFailed1.h" diff --git a/src/Core/GCSkillFailed1.h b/src/Core/GCSkillFailed1.h index a408c9a7..75687821 100644 --- a/src/Core/GCSkillFailed1.h +++ b/src/Core/GCSkillFailed1.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCSkillFailed1.h // Written By : elca@ewestsoft.com -// Description : +// Description : Å ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_SKILL_FAILED_1_H__ diff --git a/src/Core/GCSkillFailed2.cpp b/src/Core/GCSkillFailed2.cpp index d917e92c..01a027f2 100644 --- a/src/Core/GCSkillFailed2.cpp +++ b/src/Core/GCSkillFailed2.cpp @@ -2,7 +2,7 @@ // // Filename : GCSkillFailed2.cc // Written By : elca@ewestsoft.com -// Description : Skill ִ Ŷ +// Description : Skill이 실패 했을때 날려주는 패킷의 멤버 정의 // ////////////////////////////////////////////////////////////////////// @@ -34,7 +34,7 @@ GCSkillFailed2::~GCSkillFailed2() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSkillFailed2::read(SocketInputStream& iStream) @@ -51,7 +51,7 @@ void GCSkillFailed2::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSkillFailed2::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCSkillFailed2.h b/src/Core/GCSkillFailed2.h index 436aa7de..f633438f 100644 --- a/src/Core/GCSkillFailed2.h +++ b/src/Core/GCSkillFailed2.h @@ -2,7 +2,7 @@ // // Filename : GCSkillFailed2.h // Written By : elca@ewestsoft.com -// Description : +// Description : Å // // ////////////////////////////////////////////////////////////////////// @@ -32,10 +32,10 @@ class GCSkillFailed2 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // ÀԷ½ºÆ®¸²(¹öÆÛ)À¸·ÎºÎÅÍ µ¥ÀÌŸ¸¦ Àо ÆÐŶÀ» ÃʱâÈ­ÇÑ´Ù. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // Ãâ·Â½ºÆ®¸²(¹öÆÛ)À¸·Î ÆÐŶÀÇ ¹ÙÀ̳ʸ® À̹ÌÁö¸¦ º¸³½´Ù. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/GCSkillInfo.cpp b/src/Core/GCSkillInfo.cpp index 8c36f4e3..0bd2b559 100644 --- a/src/Core/GCSkillInfo.cpp +++ b/src/Core/GCSkillInfo.cpp @@ -34,7 +34,7 @@ GCSkillInfo::~GCSkillInfo() } //-------------------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void GCSkillInfo::read(SocketInputStream& iStream) @@ -81,7 +81,7 @@ void GCSkillInfo::read(SocketInputStream& iStream) } //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCSkillInfo::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCSkillInfoHandler.cpp b/src/Core/GCSkillInfoHandler.cpp index 83f2685f..6bf1e0d9 100644 --- a/src/Core/GCSkillInfoHandler.cpp +++ b/src/Core/GCSkillInfoHandler.cpp @@ -10,9 +10,9 @@ #include "GCSkillInfo.h" //---------------------------------------------------------------------- -// Ŭ̾Ʈ κ GCSkillInfo Ŷ ް Ǹ, -// Ŷ ͵ Ŭ̾Ʈ , ε -// CGReady Ŷ ȴ. +// 클라이언트가 게임 서버로부터 GCSkillInfo 패킷을 받게 되면, +// 패킷 안의 데이터들을 클라이언트에 저장한 후, 데이터 로딩이 +// 끝이 나면 게임 서버로 CGReady 패킷을 보내면 된다. //---------------------------------------------------------------------- void GCSkillInfoHandler::execute(GCSkillInfo* pPacket, Player* pPlayer) diff --git a/src/Core/GCSkillToInventoryOK1.cpp b/src/Core/GCSkillToInventoryOK1.cpp index fbe443ce..30b9663f 100644 --- a/src/Core/GCSkillToInventoryOK1.cpp +++ b/src/Core/GCSkillToInventoryOK1.cpp @@ -2,8 +2,8 @@ // // Filename : GCSkillToInventoryOK1.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -33,14 +33,14 @@ GCSkillToInventoryOK1::~GCSkillToInventoryOK1() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSkillToInventoryOK1::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_SkillType); iStream.read(m_ObjectID); iStream.read(m_ItemType); @@ -56,12 +56,12 @@ void GCSkillToInventoryOK1::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSkillToInventoryOK1::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_SkillType); oStream.write(m_ObjectID); oStream.write(m_ItemType); diff --git a/src/Core/GCSkillToInventoryOK1.h b/src/Core/GCSkillToInventoryOK1.h index c901d6f5..81a1d341 100644 --- a/src/Core/GCSkillToInventoryOK1.h +++ b/src/Core/GCSkillToInventoryOK1.h @@ -2,7 +2,7 @@ // // Filename : GCSkillToInventoryOK1.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -20,7 +20,7 @@ // // class GCSkillToInventoryOK1; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCSkillToInventoryOK1 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCSkillToInventoryOK1 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szSkillType + szObjectID + szItemType + szCEffectID + szCoordInven * 2 + szDuration + ModifyInfo::getPacketSize(); diff --git a/src/Core/GCSkillToInventoryOK2.cpp b/src/Core/GCSkillToInventoryOK2.cpp index d88d8c67..b2966ab7 100644 --- a/src/Core/GCSkillToInventoryOK2.cpp +++ b/src/Core/GCSkillToInventoryOK2.cpp @@ -2,8 +2,8 @@ // // Filename : GCSkillToInventoryOK2.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -35,14 +35,14 @@ GCSkillToInventoryOK2::~GCSkillToInventoryOK2() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSkillToInventoryOK2::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_SkillType); iStream.read(m_Duration); @@ -52,12 +52,12 @@ void GCSkillToInventoryOK2::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSkillToInventoryOK2::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_SkillType); oStream.write(m_Duration); diff --git a/src/Core/GCSkillToInventoryOK2.h b/src/Core/GCSkillToInventoryOK2.h index 0f178231..b4ad41a2 100644 --- a/src/Core/GCSkillToInventoryOK2.h +++ b/src/Core/GCSkillToInventoryOK2.h @@ -2,7 +2,7 @@ // // Filename : GCSkillToInventoryOK2.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -20,7 +20,7 @@ // // class GCSkillToInventoryOK2; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCSkillToInventoryOK2 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCSkillToInventoryOK2 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szSkillType + szObjectID + szDuration; } diff --git a/src/Core/GCSkillToObjectOK1.cpp b/src/Core/GCSkillToObjectOK1.cpp index 837e3817..ec89cb45 100644 --- a/src/Core/GCSkillToObjectOK1.cpp +++ b/src/Core/GCSkillToObjectOK1.cpp @@ -2,8 +2,8 @@ // // Filename : GCSkillToObjectOK1.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -39,14 +39,14 @@ GCSkillToObjectOK1::~GCSkillToObjectOK1() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSkillToObjectOK1::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_SkillType); iStream.read(m_CEffectID); iStream.read(m_TargetObjectID); @@ -60,12 +60,12 @@ void GCSkillToObjectOK1::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSkillToObjectOK1::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_SkillType); oStream.write(m_CEffectID); oStream.write(m_TargetObjectID); diff --git a/src/Core/GCSkillToObjectOK1.h b/src/Core/GCSkillToObjectOK1.h index b9a3923f..6ac89be4 100644 --- a/src/Core/GCSkillToObjectOK1.h +++ b/src/Core/GCSkillToObjectOK1.h @@ -2,8 +2,8 @@ // // Filename : GCSkillToObjectOK1.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ -// ڽſ Ŷ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 +// 기술을 쓴 자신에게 보내는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -20,7 +20,7 @@ // // class GCSkillToObjectOK1; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCSkillToObjectOK1 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCSkillToObjectOK1 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szSkillType + szCEffectID + szObjectID + szDuration + szBYTE + ModifyInfo::getPacketSize(); } diff --git a/src/Core/GCSkillToObjectOK2.cpp b/src/Core/GCSkillToObjectOK2.cpp index 09861e67..b570a34b 100644 --- a/src/Core/GCSkillToObjectOK2.cpp +++ b/src/Core/GCSkillToObjectOK2.cpp @@ -2,8 +2,8 @@ // // Filename : GCSkillToObjectOK2.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -39,14 +39,14 @@ GCSkillToObjectOK2::~GCSkillToObjectOK2() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSkillToObjectOK2::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_SkillType); iStream.read(m_Duration); @@ -59,12 +59,12 @@ void GCSkillToObjectOK2::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSkillToObjectOK2::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_SkillType); oStream.write(m_Duration); diff --git a/src/Core/GCSkillToObjectOK2.h b/src/Core/GCSkillToObjectOK2.h index 9c2b0d52..5b18ca36 100644 --- a/src/Core/GCSkillToObjectOK2.h +++ b/src/Core/GCSkillToObjectOK2.h @@ -2,8 +2,8 @@ // // Filename : GCSkillToObjectOK2.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ -// е Ŷ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 +// 기술에 당한 분들이 받으실 패킷 // ////////////////////////////////////////////////////////////////////// @@ -20,7 +20,7 @@ // // class GCSkillToObjectOK2; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCSkillToObjectOK2 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCSkillToObjectOK2 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szSkillType + szDuration + szBYTE + ModifyInfo::getPacketSize(); } diff --git a/src/Core/GCSkillToObjectOK3.cpp b/src/Core/GCSkillToObjectOK3.cpp index 7ac01274..e93595ce 100644 --- a/src/Core/GCSkillToObjectOK3.cpp +++ b/src/Core/GCSkillToObjectOK3.cpp @@ -2,8 +2,8 @@ // // Filename : GCSkillToObjectOK3.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -37,14 +37,14 @@ GCSkillToObjectOK3::~GCSkillToObjectOK3() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSkillToObjectOK3::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_SkillType); iStream.read(m_TargetX); @@ -56,12 +56,12 @@ void GCSkillToObjectOK3::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSkillToObjectOK3::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_SkillType); oStream.write(m_TargetX); diff --git a/src/Core/GCSkillToObjectOK3.h b/src/Core/GCSkillToObjectOK3.h index 49b42c93..2170b68b 100644 --- a/src/Core/GCSkillToObjectOK3.h +++ b/src/Core/GCSkillToObjectOK3.h @@ -2,8 +2,8 @@ // // Filename : GCSkillToObjectOK3.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ -// ִ е ô Ŷ( ) +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 +// 기술을 사용한 사람을 볼 수 있는 분들이 받으시는 패킷(기술에 당한 사람은 볼수 없는) // ////////////////////////////////////////////////////////////////////// @@ -20,7 +20,7 @@ // // class GCSkillToObjectOK3; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCSkillToObjectOK3 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCSkillToObjectOK3 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szSkillType + szCoord * 2 + szBYTE; } diff --git a/src/Core/GCSkillToObjectOK4.h b/src/Core/GCSkillToObjectOK4.h index 5b5e0173..6343636e 100644 --- a/src/Core/GCSkillToObjectOK4.h +++ b/src/Core/GCSkillToObjectOK4.h @@ -2,8 +2,8 @@ // // Filename : GCSkillToObjectOK4.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ -// ִ е ô Ŷ( ) +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 +// 기술에 당한 사람을 볼 수 있는 분들이 받으시는 패킷(기술을 사용한 사람은 볼수 없는) // ////////////////////////////////////////////////////////////////////// @@ -20,7 +20,7 @@ // // class GCSkillToObjectOK4; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCSkillToObjectOK4 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCSkillToObjectOK4 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szSkillType + szDuration + szBYTE; } diff --git a/src/Core/GCSkillToObjectOK5.cpp b/src/Core/GCSkillToObjectOK5.cpp index f2c5c573..fe2610c8 100644 --- a/src/Core/GCSkillToObjectOK5.cpp +++ b/src/Core/GCSkillToObjectOK5.cpp @@ -2,8 +2,8 @@ // // Filename : GCSkillToObjectOK5.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -37,14 +37,14 @@ GCSkillToObjectOK5::~GCSkillToObjectOK5() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSkillToObjectOK5::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_TargetObjectID); iStream.read(m_SkillType); @@ -56,12 +56,12 @@ void GCSkillToObjectOK5::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSkillToObjectOK5::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_TargetObjectID); oStream.write(m_SkillType); diff --git a/src/Core/GCSkillToObjectOK5.h b/src/Core/GCSkillToObjectOK5.h index 63357a64..faab2a60 100644 --- a/src/Core/GCSkillToObjectOK5.h +++ b/src/Core/GCSkillToObjectOK5.h @@ -2,8 +2,8 @@ // // Filename : GCSkillToObjectOK5.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ -// , ִ п Ŷ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 +// 기술에 당한 사람, 기술을 사용한 사람 모두 볼수 있는 분에게 보내는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -20,7 +20,7 @@ // // class GCSkillToObjectOK5; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCSkillToObjectOK5 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCSkillToObjectOK5 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szSkillType + szObjectID + szDuration + szBYTE; } diff --git a/src/Core/GCSkillToObjectOK6.cpp b/src/Core/GCSkillToObjectOK6.cpp index 50566a8b..62c6ad6a 100644 --- a/src/Core/GCSkillToObjectOK6.cpp +++ b/src/Core/GCSkillToObjectOK6.cpp @@ -2,8 +2,8 @@ // // Filename : GCSkillToObjectOK6.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -39,14 +39,14 @@ GCSkillToObjectOK6::~GCSkillToObjectOK6() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSkillToObjectOK6::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_X); iStream.read(m_Y); iStream.read(m_SkillType); @@ -60,12 +60,12 @@ void GCSkillToObjectOK6::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSkillToObjectOK6::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_X); oStream.write(m_Y); oStream.write(m_SkillType); diff --git a/src/Core/GCSkillToObjectOK6.h b/src/Core/GCSkillToObjectOK6.h index 40f56d29..e5abcb34 100644 --- a/src/Core/GCSkillToObjectOK6.h +++ b/src/Core/GCSkillToObjectOK6.h @@ -2,8 +2,8 @@ // // Filename : GCSkillToObjectOK6.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ -// е Ŷ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 +// 기술에 당한 분들이 받으실 패킷 // ////////////////////////////////////////////////////////////////////// @@ -20,7 +20,7 @@ // // class GCSkillToObjectOK6; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCSkillToObjectOK6 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCSkillToObjectOK6 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szCoord * 2 + szSkillType + szDuration + szBYTE + ModifyInfo::getPacketSize(); } diff --git a/src/Core/GCSkillToSelfOK1.cpp b/src/Core/GCSkillToSelfOK1.cpp index 044f093c..269a61f7 100644 --- a/src/Core/GCSkillToSelfOK1.cpp +++ b/src/Core/GCSkillToSelfOK1.cpp @@ -2,8 +2,8 @@ // // Filename : GCSkillToSelfOK1.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -37,14 +37,14 @@ GCSkillToSelfOK1::~GCSkillToSelfOK1() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSkillToSelfOK1::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_SkillType); iStream.read(m_CEffectID); iStream.read(m_Duration); @@ -58,12 +58,12 @@ void GCSkillToSelfOK1::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSkillToSelfOK1::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_SkillType); oStream.write(m_CEffectID); oStream.write(m_Duration); diff --git a/src/Core/GCSkillToSelfOK1.h b/src/Core/GCSkillToSelfOK1.h index 6b21e17e..7e05c745 100644 --- a/src/Core/GCSkillToSelfOK1.h +++ b/src/Core/GCSkillToSelfOK1.h @@ -2,7 +2,7 @@ // // Filename : GCSkillToSelfOK1.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCSkillToSelfOK1; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCSkillToSelfOK1 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCSkillToSelfOK1 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szSkillType + szCEffectID + szDuration + szBYTE + ModifyInfo::getPacketSize(); } diff --git a/src/Core/GCSkillToSelfOK2.cpp b/src/Core/GCSkillToSelfOK2.cpp index 850b9fa2..f88cb05f 100644 --- a/src/Core/GCSkillToSelfOK2.cpp +++ b/src/Core/GCSkillToSelfOK2.cpp @@ -2,8 +2,8 @@ // // Filename : GCSkillToSelfOK2.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -37,14 +37,14 @@ GCSkillToSelfOK2::~GCSkillToSelfOK2() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSkillToSelfOK2::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_SkillType); iStream.read(m_Duration); @@ -55,12 +55,12 @@ void GCSkillToSelfOK2::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSkillToSelfOK2::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_SkillType); oStream.write(m_Duration); diff --git a/src/Core/GCSkillToSelfOK2.h b/src/Core/GCSkillToSelfOK2.h index ae096563..c9503279 100644 --- a/src/Core/GCSkillToSelfOK2.h +++ b/src/Core/GCSkillToSelfOK2.h @@ -2,7 +2,7 @@ // // Filename : GCSkillToSelfOK2.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCSkillToSelfOK2; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCSkillToSelfOK2 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCSkillToSelfOK2 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szSkillType + szDuration + szBYTE; } diff --git a/src/Core/GCSkillToSelfOK3.cpp b/src/Core/GCSkillToSelfOK3.cpp index 6a922807..22f63601 100644 --- a/src/Core/GCSkillToSelfOK3.cpp +++ b/src/Core/GCSkillToSelfOK3.cpp @@ -2,8 +2,8 @@ // // Filename : GCSkillToSelfOK3.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -37,14 +37,14 @@ GCSkillToSelfOK3::~GCSkillToSelfOK3() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSkillToSelfOK3::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_X); iStream.read(m_Y); iStream.read(m_SkillType); @@ -56,12 +56,12 @@ void GCSkillToSelfOK3::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSkillToSelfOK3::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_X); oStream.write(m_Y); oStream.write(m_SkillType); diff --git a/src/Core/GCSkillToSelfOK3.h b/src/Core/GCSkillToSelfOK3.h index 5c03504f..229b8c28 100644 --- a/src/Core/GCSkillToSelfOK3.h +++ b/src/Core/GCSkillToSelfOK3.h @@ -2,7 +2,7 @@ // // Filename : GCSkillToSelfOK3.h // Written By : elca@ewestsoft.com -// Description : ڽſ , ڸ +// Description : 자신에게 쓴 기술이 성공했을때, 기술 시행자를 볼 수 없는 경우 // ////////////////////////////////////////////////////////////////////// @@ -32,10 +32,10 @@ class GCSkillToSelfOK3 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -47,7 +47,7 @@ class GCSkillToSelfOK3 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szCoord * 2 + szSkillType + szDuration + szBYTE; } diff --git a/src/Core/GCSkillToTileOK1.cpp b/src/Core/GCSkillToTileOK1.cpp index 9688285b..0a1dfc6f 100644 --- a/src/Core/GCSkillToTileOK1.cpp +++ b/src/Core/GCSkillToTileOK1.cpp @@ -2,8 +2,8 @@ // // Filename : GCSkillToTileOK1.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -37,14 +37,14 @@ GCSkillToTileOK1::~GCSkillToTileOK1() { ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK1::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_SkillType); iStream.read(m_CEffectID); iStream.read(m_X); @@ -70,12 +70,12 @@ void GCSkillToTileOK1::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK1::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_SkillType); oStream.write(m_CEffectID); oStream.write(m_X); @@ -97,7 +97,7 @@ void GCSkillToTileOK1::write(SocketOutputStream& oStream) const { // // GCSkillToTileOK1::addListElement() // -// (ȭ, ȭġ ) Ʈ ֱ Լ. +// (변화부위, 변화수치 ) 의 한 셋을 리스트에 넣기 위한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK1::addCListElement(ObjectID_t ObjectID) @@ -105,10 +105,10 @@ void GCSkillToTileOK1::addCListElement(ObjectID_t ObjectID) { __BEGIN_TRY - // Creature ID ߰Ѵ. + // Creature ID를 추가한다. m_CList.push_back(ObjectID); - // ũó ID count Ų. + // 크리처 ID count를 증가시킨다. m_CListNum++; __END_CATCH @@ -119,7 +119,7 @@ void GCSkillToTileOK1::addCListElement(ObjectID_t ObjectID) // // GCSkillToTileOK1::deleteCListElement() // -// Creature List Ҹ ﶧ ʿ Լ. +// Creature List의 요소를 지울때 필요한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK1::deleteCListElement() @@ -127,10 +127,10 @@ void GCSkillToTileOK1::deleteCListElement() { __BEGIN_TRY - // ũ ̵ ϳ . + // 크리쳐 아이디를 하나 지운다. m_CList.pop_front(); - // ũó Ʈ ī͸ ϳ . + // 크리처 리스트 카운터를 하나 지운다. m_CListNum--; __END_CATCH diff --git a/src/Core/GCSkillToTileOK2.cpp b/src/Core/GCSkillToTileOK2.cpp index f43fd4d2..c5c2a3e1 100644 --- a/src/Core/GCSkillToTileOK2.cpp +++ b/src/Core/GCSkillToTileOK2.cpp @@ -2,8 +2,8 @@ // // Filename : GCSkillToTileOK2.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -42,14 +42,14 @@ GCSkillToTileOK2::~GCSkillToTileOK2() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK2::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_SkillType); iStream.read(m_X); @@ -74,12 +74,12 @@ void GCSkillToTileOK2::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK2::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_SkillType); oStream.write(m_X); @@ -107,7 +107,7 @@ void GCSkillToTileOK2::write(SocketOutputStream& oStream) const { // // GCSkillToTileOK2::addListElement() // -// (ȭ, ȭġ ) Ʈ ֱ Լ. +// (변화부위, 변화수치 ) 의 한 셋을 리스트에 넣기 위한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK2::addCListElement(ObjectID_t ObjectID) @@ -115,10 +115,10 @@ void GCSkillToTileOK2::addCListElement(ObjectID_t ObjectID) { __BEGIN_TRY - // Creature ID ߰Ѵ. + // Creature ID를 추가한다. m_CList.push_back(ObjectID); - // ũó ID count Ų. + // 크리처 ID count를 증가시킨다. m_CListNum++; __END_CATCH @@ -129,7 +129,7 @@ void GCSkillToTileOK2::addCListElement(ObjectID_t ObjectID) // // GCSkillToTileOK2::deleteCListElement() // -// Creature List Ҹ ﶧ ʿ Լ. +// Creature List의 요소를 지울때 필요한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK2::deleteCListElement() @@ -137,10 +137,10 @@ void GCSkillToTileOK2::deleteCListElement() { __BEGIN_TRY - // ũ ̵ ϳ . + // 크리쳐 아이디를 하나 지운다. m_CList.pop_front(); - // ũó Ʈ ī͸ ϳ . + // 크리처 리스트 카운터를 하나 지운다. m_CListNum--; __END_CATCH diff --git a/src/Core/GCSkillToTileOK2.h b/src/Core/GCSkillToTileOK2.h index 8b097f1e..8ce6e858 100644 --- a/src/Core/GCSkillToTileOK2.h +++ b/src/Core/GCSkillToTileOK2.h @@ -2,7 +2,7 @@ // // Filename : GCSkillToTileOK2.h // Written By : elca@ewestsoft.com -// Description : ڰ ޴ Ŷ +// Description : 기술에 당한 자가 받는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCSkillToTileOK2; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCSkillToTileOK2 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCSkillToTileOK2 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szSkillType + szCoord * 2 + szRange + szDuration + szBYTE + szObjectID * m_CListNum + szBYTE + ModifyInfo::getPacketSize(); diff --git a/src/Core/GCSkillToTileOK3.cpp b/src/Core/GCSkillToTileOK3.cpp index 324e91da..259e1bed 100644 --- a/src/Core/GCSkillToTileOK3.cpp +++ b/src/Core/GCSkillToTileOK3.cpp @@ -2,8 +2,8 @@ // // Filename : GCSkillToTileOK3.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -40,14 +40,14 @@ GCSkillToTileOK3::~GCSkillToTileOK3() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK3::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_SkillType); iStream.read(m_X); @@ -69,12 +69,12 @@ void GCSkillToTileOK3::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK3::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_SkillType); oStream.write(m_X); @@ -95,7 +95,7 @@ void GCSkillToTileOK3::write(SocketOutputStream& oStream) const { // // GCSkillToTileOK3::addListElement() // -// (ȭ, ȭġ ) Ʈ ֱ Լ. +// (변화부위, 변화수치 ) 의 한 셋을 리스트에 넣기 위한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK3::addCListElement(ObjectID_t ObjectID ) @@ -103,10 +103,10 @@ void GCSkillToTileOK3::addCListElement(ObjectID_t ObjectID ) { __BEGIN_TRY - // Creature ID ߰Ѵ. + // Creature ID를 추가한다. m_CList.push_back(ObjectID); - // ũó ID count Ų. + // 크리처 ID count를 증가시킨다. m_CListNum++; __END_CATCH @@ -118,7 +118,7 @@ void GCSkillToTileOK3::addCListElement(ObjectID_t ObjectID ) // // GCSkillToTileOK3::deleteCListElement() // -// Creature List Ҹ ﶧ ʿ Լ. +// Creature List의 요소를 지울때 필요한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK3::deleteCListElement() @@ -126,10 +126,10 @@ void GCSkillToTileOK3::deleteCListElement() { __BEGIN_TRY - // ũ ̵ ϳ . + // 크리쳐 아이디를 하나 지운다. m_CList.pop_front(); - // ũó Ʈ ī͸ ϳ . + // 크리처 리스트 카운터를 하나 지운다. m_CListNum--; __END_CATCH diff --git a/src/Core/GCSkillToTileOK3.h b/src/Core/GCSkillToTileOK3.h index 293c1fe7..f7fbbf35 100644 --- a/src/Core/GCSkillToTileOK3.h +++ b/src/Core/GCSkillToTileOK3.h @@ -2,7 +2,7 @@ // // Filename : GCSkillToTileOK3.h // Written By : elca@ewestsoft.com -// Description : ڴ ְ, ڴ Ŷ +// Description : 기술 사용자는 볼수 있고, 당한자는 볼 수 없는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -20,7 +20,7 @@ // // class GCSkillToTileOK3; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCSkillToTileOK3 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCSkillToTileOK3 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. // PacketSize_t getPacketSize() const { return szSkillType + szObjectID +(szCoord* 2) // + szDuration + szBYTE + szObjectID* m_CListNum; } PacketSize_t getPacketSize() const { diff --git a/src/Core/GCSkillToTileOK4.cpp b/src/Core/GCSkillToTileOK4.cpp index f5b01890..b635a8d0 100644 --- a/src/Core/GCSkillToTileOK4.cpp +++ b/src/Core/GCSkillToTileOK4.cpp @@ -2,8 +2,8 @@ // // Filename : GCSkillToTileOK4.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -40,14 +40,14 @@ GCSkillToTileOK4::~GCSkillToTileOK4() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK4::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_SkillType); iStream.read(m_X); iStream.read(m_Y); @@ -70,12 +70,12 @@ void GCSkillToTileOK4::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK4::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_SkillType); oStream.write(m_X); oStream.write(m_Y); @@ -96,7 +96,7 @@ void GCSkillToTileOK4::write(SocketOutputStream& oStream) const { // // GCSkillToTileOK4::addListElement() // -// (ȭ, ȭġ ) Ʈ ֱ Լ. +// (변화부위, 변화수치 ) 의 한 셋을 리스트에 넣기 위한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK4::addCListElement(ObjectID_t ObjectID) @@ -104,10 +104,10 @@ void GCSkillToTileOK4::addCListElement(ObjectID_t ObjectID) { __BEGIN_TRY - // Creature ID ߰Ѵ. + // Creature ID를 추가한다. m_CList.push_back(ObjectID); - // ũó ID count Ų. + // 크리처 ID count를 증가시킨다. m_CListNum++; __END_CATCH @@ -118,7 +118,7 @@ void GCSkillToTileOK4::addCListElement(ObjectID_t ObjectID) // // GCSkillToTileOK4::deleteCListElement() // -// Creature List Ҹ ﶧ ʿ Լ. +// Creature List의 요소를 지울때 필요한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK4::deleteCListElement() @@ -126,10 +126,10 @@ void GCSkillToTileOK4::deleteCListElement() { __BEGIN_TRY - // ũ ̵ ϳ . + // 크리쳐 아이디를 하나 지운다. m_CList.pop_front(); - // ũó Ʈ ī͸ ϳ . + // 크리처 리스트 카운터를 하나 지운다. m_CListNum--; __END_CATCH diff --git a/src/Core/GCSkillToTileOK4.h b/src/Core/GCSkillToTileOK4.h index e1ecc2b9..45607bfc 100644 --- a/src/Core/GCSkillToTileOK4.h +++ b/src/Core/GCSkillToTileOK4.h @@ -2,7 +2,7 @@ // // Filename : GCSkillToTileOK4.h // Written By : elca@ewestsoft.com -// Description : ڰ ޴ Ŷ +// Description : 기술에 당한 자가 받는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCSkillToTileOK4; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCSkillToTileOK4 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCSkillToTileOK4 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szSkillType + szCoord * 2 + szRange + szDuration + szBYTE + szObjectID * m_CListNum + szBYTE; } diff --git a/src/Core/GCSkillToTileOK5.cpp b/src/Core/GCSkillToTileOK5.cpp index 14b4257e..10eb877f 100644 --- a/src/Core/GCSkillToTileOK5.cpp +++ b/src/Core/GCSkillToTileOK5.cpp @@ -2,8 +2,8 @@ // // Filename : GCSkillToTileOK5.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -40,14 +40,14 @@ GCSkillToTileOK5::~GCSkillToTileOK5() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK5::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_SkillType); iStream.read(m_X); @@ -71,12 +71,12 @@ void GCSkillToTileOK5::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK5::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_SkillType); oStream.write(m_X); @@ -98,7 +98,7 @@ void GCSkillToTileOK5::write(SocketOutputStream& oStream) const { // // GCSkillToTileOK5::addListElement() // -// (ȭ, ȭġ ) Ʈ ֱ Լ. +// (변화부위, 변화수치 ) 의 한 셋을 리스트에 넣기 위한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK5::addCListElement(ObjectID_t ObjectID) @@ -106,10 +106,10 @@ void GCSkillToTileOK5::addCListElement(ObjectID_t ObjectID) { __BEGIN_TRY - // Creature ID ߰Ѵ. + // Creature ID를 추가한다. m_CList.push_back(ObjectID); - // ũó ID count Ų. + // 크리처 ID count를 증가시킨다. m_CListNum++; __END_CATCH @@ -120,7 +120,7 @@ void GCSkillToTileOK5::addCListElement(ObjectID_t ObjectID) // // GCSkillToTileOK5::deleteCListElement() // -// Creature List Ҹ ﶧ ʿ Լ. +// Creature List의 요소를 지울때 필요한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK5::deleteCListElement() @@ -128,10 +128,10 @@ void GCSkillToTileOK5::deleteCListElement() { __BEGIN_TRY - // ũ ̵ ϳ . + // 크리쳐 아이디를 하나 지운다. m_CList.pop_front(); - // ũó Ʈ ī͸ ϳ . + // 크리처 리스트 카운터를 하나 지운다. m_CListNum--; __END_CATCH diff --git a/src/Core/GCSkillToTileOK5.h b/src/Core/GCSkillToTileOK5.h index 89d09d4b..1d60f2ef 100644 --- a/src/Core/GCSkillToTileOK5.h +++ b/src/Core/GCSkillToTileOK5.h @@ -2,7 +2,7 @@ // // Filename : GCSkillToTileOK5.h // Written By : elca@ewestsoft.com -// Description : ڰ ޴ Ŷ +// Description : 기술에 당한 자가 받는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCSkillToTileOK5; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCSkillToTileOK5 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCSkillToTileOK5 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szSkillType + szCoord * 2 + szRange + szDuration + szBYTE + szObjectID * m_CListNum + szBYTE; diff --git a/src/Core/GCSkillToTileOK6.cpp b/src/Core/GCSkillToTileOK6.cpp index d1fd1829..17563620 100644 --- a/src/Core/GCSkillToTileOK6.cpp +++ b/src/Core/GCSkillToTileOK6.cpp @@ -2,8 +2,8 @@ // // Filename : GCSkillToTileOK6.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -40,14 +40,14 @@ GCSkillToTileOK6::~GCSkillToTileOK6() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK6::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_OrgX); iStream.read(m_OrgY); iStream.read(m_SkillType); @@ -73,12 +73,12 @@ void GCSkillToTileOK6::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK6::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_OrgX); oStream.write(m_OrgY); oStream.write(m_SkillType); @@ -102,7 +102,7 @@ void GCSkillToTileOK6::write(SocketOutputStream& oStream) const { // // GCSkillToTileOK6::addListElement() // -// (ȭ, ȭġ ) Ʈ ֱ Լ. +// (변화부위, 변화수치 ) 의 한 셋을 리스트에 넣기 위한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK6::addCListElement(ObjectID_t ObjectID) @@ -110,10 +110,10 @@ void GCSkillToTileOK6::addCListElement(ObjectID_t ObjectID) { __BEGIN_TRY - // Creature ID ߰Ѵ. + // Creature ID를 추가한다. m_CList.push_back(ObjectID); - // ũó ID count Ų. + // 크리처 ID count를 증가시킨다. m_CListNum++; __END_CATCH @@ -124,7 +124,7 @@ void GCSkillToTileOK6::addCListElement(ObjectID_t ObjectID) // // GCSkillToTileOK6::deleteCListElement() // -// Creature List Ҹ ﶧ ʿ Լ. +// Creature List의 요소를 지울때 필요한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCSkillToTileOK6::deleteCListElement() @@ -132,10 +132,10 @@ void GCSkillToTileOK6::deleteCListElement() { __BEGIN_TRY - // ũ ̵ ϳ . + // 크리쳐 아이디를 하나 지운다. m_CList.pop_front(); - // ũó Ʈ ī͸ ϳ . + // 크리처 리스트 카운터를 하나 지운다. m_CListNum--; __END_CATCH diff --git a/src/Core/GCSkillToTileOK6.h b/src/Core/GCSkillToTileOK6.h index 2eff4689..f5ec44af 100644 --- a/src/Core/GCSkillToTileOK6.h +++ b/src/Core/GCSkillToTileOK6.h @@ -2,7 +2,7 @@ // // Filename : GCSkillToTileOK6.h // Written By : elca@ewestsoft.com -// Description : ߴµ ڴ ڰ ޴ packet +// Description : 기술에 당했는데 사용자는 볼 수 없는 자가 받는 packet ////////////////////////////////////////////////////////////////////// #ifndef __GC_SKILL_TO_TILE_OK_6_H__ @@ -31,10 +31,10 @@ class GCSkillToTileOK6 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -46,7 +46,7 @@ class GCSkillToTileOK6 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szCoord * 2 + szSkillType + szCoord * 2 + szRange + szDuration + szBYTE + szObjectID * m_CListNum + szBYTE + ModifyInfo::getPacketSize(); @@ -150,7 +150,7 @@ class GCSkillToTileOK6 : public ModifyInfo { private: // ObjectID - Coord_t m_OrgX, m_OrgY; // ġ. + Coord_t m_OrgX, m_OrgY; // 기술 사용자의 위치. // SkillType SkillType_t m_SkillType; diff --git a/src/Core/GCStashList.cpp b/src/Core/GCStashList.cpp index 1614c942..5ad915ff 100644 --- a/src/Core/GCStashList.cpp +++ b/src/Core/GCStashList.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCStashList.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -59,7 +59,7 @@ GCStashList::~GCStashList() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCStashList::read(SocketInputStream& iStream) @@ -71,13 +71,13 @@ void GCStashList::read(SocketInputStream& iStream) BYTE rack = 0; BYTE index = 0; - // оδ. + // 보관함의 갯수를 읽어들인다. iStream.read(m_StashNum); - // ڸ оδ. + // 총 아이템의 숫자를 읽어들인다. iStream.read(nTotal); - // оδ. + // 각 아이템의 정보를 읽어들인다. for (i = 0; i < nTotal; i++) { iStream.read(rack); iStream.read(index); @@ -100,7 +100,7 @@ void GCStashList::read(SocketInputStream& iStream) iStream.read(item.grade); iStream.read(item.enchantLevel); - // sub оδ. + // sub 아이템 정보를 읽어들인다. iStream.read(m_SubItemsCount[rack][index]); for (int s = 0; s < m_SubItemsCount[rack][index]; s++) { SubItemInfo* pSubItemInfo = new SubItemInfo(); @@ -111,7 +111,7 @@ void GCStashList::read(SocketInputStream& iStream) m_bExist[rack][index] = true; } - // оδ. + // 돈의 양을 읽어들인다. iStream.read(m_StashGold); __END_CATCH @@ -119,7 +119,7 @@ void GCStashList::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCStashList::write(SocketOutputStream& oStream) const @@ -131,16 +131,16 @@ void GCStashList::write(SocketOutputStream& oStream) const BYTE i = 0; BYTE nTotal = 0; - // ڸ Ѵ. + // 총 아이템의 숫자를 계산한다. for (r = 0; r < STASH_RACK_MAX; r++) for (i = 0; i < STASH_INDEX_MAX; i++) if (m_bExist[r][i]) nTotal++; - // ش. + // 보관함의 갯수를 날려준다. oStream.write(m_StashNum); - // ڸ ش + // 총 아이템의 숫자를 날려준다 oStream.write(nTotal); // write each item info @@ -168,7 +168,7 @@ void GCStashList::write(SocketOutputStream& oStream) const oStream.write(item.grade); oStream.write(item.enchantLevel); - // sub . + // sub 아이템 정보를 쓴다. oStream.write(m_SubItemsCount[r][i]); list::const_iterator itr = m_pSubItems[r][i].begin(); @@ -180,7 +180,7 @@ void GCStashList::write(SocketOutputStream& oStream) const } } - // ش. + // 돈의 양을 써준다. oStream.write(m_StashGold); __END_DEBUG @@ -210,17 +210,17 @@ PacketSize_t GCStashList::getPacketSize() const __BEGIN_TRY __BEGIN_DEBUG - PacketSize_t size = szBYTE; // + PacketSize_t size = szBYTE; // 보관함의 갯수 - size += szBYTE; // + size += szBYTE; // 총 아이템 숫자 for (int r = 0; r < STASH_RACK_MAX; r++) { for (int i = 0; i < STASH_INDEX_MAX; i++) { if (m_bExist[r][i]) { - // rack ε + // rack과 인덱스 size += szBYTE * 2; - // + // 실제 정보 /* size += szObjectID; size += szBYTE; @@ -233,16 +233,16 @@ PacketSize_t GCStashList::getPacketSize() const */ size += m_pItems[r][i].getPacketSize(); - // Ʈ ִ + // 벨트에 들어있는 아이템의 숫자 size += szBYTE; - // Ʈ ִ ũ + // 벨트에 들어 있는 아이템의 크기 size += SubItemInfo::getSize() * m_SubItemsCount[r][i]; } } } - size += szGold; // Կ ִ + size += szGold; // 보관함에 들어있는 돈 return size; @@ -390,8 +390,8 @@ void GCStashList::setStashItem(BYTE rack, BYTE index, Item* pItem) m_pItems[rack][index].grade = pItem->getGrade(); m_pItems[rack][index].enchantLevel = pItem->getEnchantLevel(); - // Ʈ 쿡 ȿ ִ ۱ Բ Ѵ. - // , . + // 벨트일 경우에는 안에 있는 아이템까지 함께 세팅해줘야한다. + // 아, 씨바 졸라 귀찮네. pBelt = dynamic_cast(pItem); pItemInfo = g_pItemInfoManager->getItemInfo(pBelt->getItemClass(), pBelt->getItemType()); pocketCount = dynamic_cast(pItemInfo)->getPocketCount(); @@ -399,7 +399,7 @@ void GCStashList::setStashItem(BYTE rack, BYTE index, Item* pItem) for (i = 0; i < pocketCount; i++) { Item* pBeltItem = pBeltInventory->getItem((int)i, 0); - // ִٸ... + // 슬랏에 아이템이 있다면... if (pBeltItem != NULL) { SubItemInfo* pSubItemInfo = new SubItemInfo; Assert(pSubItemInfo != NULL); @@ -410,14 +410,14 @@ void GCStashList::setStashItem(BYTE rack, BYTE index, Item* pItem) pSubItemInfo->setItemNum(pBeltItem->getNum()); pSubItemInfo->setSlotID(i); - // شϴ Ʈٰ Ѵ. + // 만든 정보를 해당하는 리스트에다가 더한다. m_pSubItems[rack][index].push_back(pSubItemInfo); - // īƮ ÷ְ + // 카운트를 올려주고 subItemCount++; } } - // Ʈ  ִ ش. + // 리스트에 몇개나 들어있는지 세팅해 준다. m_SubItemsCount[rack][index] = subItemCount; break; @@ -432,8 +432,8 @@ void GCStashList::setStashItem(BYTE rack, BYTE index, Item* pItem) m_pItems[rack][index].grade = pItem->getGrade(); m_pItems[rack][index].enchantLevel = pItem->getEnchantLevel(); - // Ʈ 쿡 ȿ ִ ۱ Բ Ѵ. - // , . + // 벨트일 경우에는 안에 있는 아이템까지 함께 세팅해줘야한다. + // 아, 씨바 졸라 귀찮네. pOustersArmsband = dynamic_cast(pItem); pItemInfo = g_pItemInfoManager->getItemInfo(pOustersArmsband->getItemClass(), pOustersArmsband->getItemType()); pocketCount = dynamic_cast(pItemInfo)->getPocketCount(); @@ -441,7 +441,7 @@ void GCStashList::setStashItem(BYTE rack, BYTE index, Item* pItem) for (i = 0; i < pocketCount; i++) { Item* pOustersArmsbandItem = pOustersArmsbandInventory->getItem((int)i, 0); - // ִٸ... + // 슬랏에 아이템이 있다면... if (pOustersArmsbandItem != NULL) { SubItemInfo* pSubItemInfo = new SubItemInfo; Assert(pSubItemInfo != NULL); @@ -452,14 +452,14 @@ void GCStashList::setStashItem(BYTE rack, BYTE index, Item* pItem) pSubItemInfo->setItemNum(pOustersArmsbandItem->getNum()); pSubItemInfo->setSlotID(i); - // شϴ Ʈٰ Ѵ. + // 만든 정보를 해당하는 리스트에다가 더한다. m_pSubItems[rack][index].push_back(pSubItemInfo); - // īƮ ÷ְ + // 카운트를 올려주고 subItemCount++; } } - // Ʈ  ִ ش. + // 리스트에 몇개나 들어있는지 세팅해 준다. m_SubItemsCount[rack][index] = subItemCount; break; diff --git a/src/Core/GCStashList.h b/src/Core/GCStashList.h index 2a1a18a0..ef1302a3 100644 --- a/src/Core/GCStashList.h +++ b/src/Core/GCStashList.h @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCStashList.h -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -109,15 +109,15 @@ class GCStashListFactory : public PacketFactory { } PacketSize_t getPacketMaxSize() const { PacketSize_t size = 0; - PacketSize_t unit_size = szBYTE * 2 + // rack ε - // sizeof(STASHITEM) + // - STASHITEM::getPacketMaxSize() + szBYTE + // Ʈ ִ - SubItemInfo::getSize() * 8; // Ʈ (8 ƽ) - - size += szBYTE; // - size += szBYTE; // - size += unit_size * STASH_RACK_MAX * STASH_INDEX_MAX; // ִٸ... - size += szGold; // + PacketSize_t unit_size = szBYTE * 2 + // rack과 인덱스 + // sizeof(STASHITEM) + // 실제 정보 + STASHITEM::getPacketMaxSize() + szBYTE + // 벨트에 들어있는 아이템의 숫자 + SubItemInfo::getSize() * 8; // 벨트 아이템(8개가 맥스) + + size += szBYTE; // 보관함의 갯수 + size += szBYTE; // 총 아이템의 숫자 + size += unit_size * STASH_RACK_MAX * STASH_INDEX_MAX; // 아이템이 꽉 차 있다면... + size += szGold; // 돈 return size; } diff --git a/src/Core/GCStashListHandler.cpp b/src/Core/GCStashListHandler.cpp index 4f63dac8..5a8b5647 100644 --- a/src/Core/GCStashListHandler.cpp +++ b/src/Core/GCStashListHandler.cpp @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : GCStashListHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCStashSell.cpp b/src/Core/GCStashSell.cpp index 46356521..b60194e6 100644 --- a/src/Core/GCStashSell.cpp +++ b/src/Core/GCStashSell.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////////////////////////// // // Filename : GCStashSell.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // //////////////////////////////////////////////////////////////////////////////// @@ -10,7 +10,7 @@ #include "GCStashSell.h" //////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //////////////////////////////////////////////////////////////////////////////// void GCStashSell::read(SocketInputStream& iStream) @@ -26,7 +26,7 @@ void GCStashSell::read(SocketInputStream& iStream) //////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //////////////////////////////////////////////////////////////////////////////// void GCStashSell::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCStashSell.h b/src/Core/GCStashSell.h index 4da6eac2..24c80775 100644 --- a/src/Core/GCStashSell.h +++ b/src/Core/GCStashSell.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////////////////////////// // // Filename : GCStashSell.h -// Written By : 輺 +// Written By : 김성민 // Description : // //////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCStashSellHandler.cpp b/src/Core/GCStashSellHandler.cpp index 0270db66..22fdb36c 100644 --- a/src/Core/GCStashSellHandler.cpp +++ b/src/Core/GCStashSellHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCStashSellHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCStatusCurrentHP.cpp b/src/Core/GCStatusCurrentHP.cpp index 7aaa061b..3426bcbd 100644 --- a/src/Core/GCStatusCurrentHP.cpp +++ b/src/Core/GCStatusCurrentHP.cpp @@ -31,7 +31,7 @@ GCStatusCurrentHP::~GCStatusCurrentHP() } ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCStatusCurrentHP::read(SocketInputStream& iStream) @@ -46,7 +46,7 @@ void GCStatusCurrentHP::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCStatusCurrentHP::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCStatusCurrentHP.h b/src/Core/GCStatusCurrentHP.h index 480f20f7..624c6f85 100644 --- a/src/Core/GCStatusCurrentHP.h +++ b/src/Core/GCStatusCurrentHP.h @@ -27,10 +27,10 @@ class GCStatusCurrentHP : public Packet { virtual ~GCStatusCurrentHP(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -43,7 +43,7 @@ class GCStatusCurrentHP : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCStatusCurrentHPPacketSize , ϶. + // const static GCStatusCurrentHPPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szObjectID + szHP; } @@ -74,10 +74,10 @@ class GCStatusCurrentHP : public Packet { } private: - // ũ ̵ ü ؼ Ѵ. + // 존 레벨에서 유니크한 아이디로 객체 구분을 위해서 사용한다. ObjectID_t m_ObjectID; - // ü + // 몬스터 현재 체력 HP_t m_CurrentHP; }; @@ -109,7 +109,7 @@ class GCStatusCurrentHPFactory : public PacketFactory { // get packet's body size // *OPTIMIZATION HINT* - // const static GCStatusCurrentHPPacketSize , ϶. + // const static GCStatusCurrentHPPacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID + szHP; } diff --git a/src/Core/GCSubInventoryInfo.cpp b/src/Core/GCSubInventoryInfo.cpp index e827d8de..93ce3620 100644 --- a/src/Core/GCSubInventoryInfo.cpp +++ b/src/Core/GCSubInventoryInfo.cpp @@ -39,7 +39,7 @@ GCSubInventoryInfo::~GCSubInventoryInfo() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCSubInventoryInfo::read(SocketInputStream& iStream) @@ -55,7 +55,7 @@ void GCSubInventoryInfo::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCSubInventoryInfo::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCSweeperBonusInfo.cpp b/src/Core/GCSweeperBonusInfo.cpp index fc8473c8..0d123aa3 100644 --- a/src/Core/GCSweeperBonusInfo.cpp +++ b/src/Core/GCSweeperBonusInfo.cpp @@ -24,14 +24,14 @@ GCSweeperBonusInfo::~GCSweeperBonusInfo() { __BEGIN_TRY - // Ʈ ü + // 길드 리스트의 모든 객체를 삭제 clearSweeperBonusInfoList(); __END_CATCH_NO_RETHROW } ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSweeperBonusInfo::read(SocketInputStream& iStream) @@ -52,7 +52,7 @@ void GCSweeperBonusInfo::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSweeperBonusInfo::write(SocketOutputStream& oStream) const @@ -79,7 +79,7 @@ void GCSweeperBonusInfo::clearSweeperBonusInfoList() { __BEGIN_TRY - // SweeperBonusInfoList Ѵ + // SweeperBonusInfoList 를 삭제한다 while (!m_SweeperBonusInfoList.empty()) { SweeperBonusInfo* pSweeperBonusInfo = m_SweeperBonusInfoList.front(); m_SweeperBonusInfoList.pop_front(); diff --git a/src/Core/GCSweeperBonusInfo.h b/src/Core/GCSweeperBonusInfo.h index 720c86cc..62d7e23c 100644 --- a/src/Core/GCSweeperBonusInfo.h +++ b/src/Core/GCSweeperBonusInfo.h @@ -32,10 +32,10 @@ class GCSweeperBonusInfo : public Packet { // destructor ~GCSweeperBonusInfo(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -110,7 +110,7 @@ class GCSweeperBonusInfoFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCSystemMessagePacketMaxSize , ϶. + // const static GCSystemMessagePacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + SweeperBonusInfo::getMaxSize() * 12; } diff --git a/src/Core/GCSystemAvailabilities.cpp b/src/Core/GCSystemAvailabilities.cpp index d43c67b6..36bf2cd2 100644 --- a/src/Core/GCSystemAvailabilities.cpp +++ b/src/Core/GCSystemAvailabilities.cpp @@ -2,8 +2,8 @@ // // Filename : GCSystemAvailabilities.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -33,7 +33,7 @@ GCSystemAvailabilities::~GCSystemAvailabilities() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSystemAvailabilities::read(SocketInputStream& iStream) @@ -49,7 +49,7 @@ void GCSystemAvailabilities::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSystemAvailabilities::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/GCSystemAvailabilities.h b/src/Core/GCSystemAvailabilities.h index 7bbbefcf..0e77a369 100644 --- a/src/Core/GCSystemAvailabilities.h +++ b/src/Core/GCSystemAvailabilities.h @@ -2,7 +2,7 @@ // Filename : GCSystemAvailabilities.h // Written By : elca@ewestsoft.com // Description : -// Ŷ Ŭ +// 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_SYSTEM_AVAILABILITIES_H__ @@ -15,7 +15,7 @@ ////////////////////////////////////////////////////////////////////////////// // class GCSystemAvailabilities; -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 ////////////////////////////////////////////////////////////////////////////// class GCSystemAvailabilities : public Packet { diff --git a/src/Core/GCSystemMessage.cpp b/src/Core/GCSystemMessage.cpp index 982af5e7..7a3d572a 100644 --- a/src/Core/GCSystemMessage.cpp +++ b/src/Core/GCSystemMessage.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCSystemMessage::read(SocketInputStream& iStream) @@ -37,7 +37,7 @@ void GCSystemMessage::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCSystemMessage::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCSystemMessage.h b/src/Core/GCSystemMessage.h index d7134862..2196dbd8 100644 --- a/src/Core/GCSystemMessage.h +++ b/src/Core/GCSystemMessage.h @@ -15,13 +15,13 @@ enum SystemMessageType { SYSTEM_MESSAGE_NORMAL = 0, - SYSTEM_MESSAGE_OPERATOR, //  - SYSTEM_MESSAGE_MASTER_LAIR, // - SYSTEM_MESSAGE_COMBAT, // - SYSTEM_MESSAGE_INFO, // Ư - SYSTEM_MESSAGE_HOLY_LAND, // ƴ - SYSTEM_MESSAGE_RANGER_SAY, // Ranger Say, DragonEye Ranger ޽ - SYSTEM_MESSAGE_PLAYER, // ȫϢ + SYSTEM_MESSAGE_OPERATOR, // 운영자 말씀 + SYSTEM_MESSAGE_MASTER_LAIR, // 마스터 레어 관련 + SYSTEM_MESSAGE_COMBAT, // 전쟁 관련 + SYSTEM_MESSAGE_INFO, // 특정한 정보 관련 + SYSTEM_MESSAGE_HOLY_LAND, // 아담의 성지 관련 + SYSTEM_MESSAGE_RANGER_SAY, // Ranger Say, DragonEye 를 가진 Ranger의 메시지 + SYSTEM_MESSAGE_PLAYER, // 鯤소홍혐랙箇斤口 SYSTEM_MESSAGE_MAX }; @@ -29,9 +29,9 @@ enum SystemMessageType { // // class GCSystemMessage; // -// Ư ÷̾ SystemMessage ٸ ÷̾鿡 εijƮ -// ϴ Ŷ̴. ο ij͸ SystemMessage Ʈ Ÿ -// ʵ ִ. +// 게임 서버가 특정 플레이어의 SystemMessage 를 다른 플레이어들에게 브로드캐스트 +// 할 때 전송하는 패킷이다. 내부에 캐릭터명과 SystemMessage 스트링을 데이타 +// 필드로 가지고 있다. // ////////////////////////////////////////////////////////////////////// @@ -39,10 +39,10 @@ class GCSystemMessage : public Packet { public: GCSystemMessage() : m_Color(0x006040E8), m_Type(SYSTEM_MESSAGE_NORMAL) {} - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -138,7 +138,7 @@ class GCSystemMessageFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCSystemMessagePacketMaxSize , ϶. + // const static GCSystemMessagePacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + 256 + szuint + szBYTE; } diff --git a/src/Core/GCSystemMessageHandler.cpp b/src/Core/GCSystemMessageHandler.cpp index a0eec000..540493db 100644 --- a/src/Core/GCSystemMessageHandler.cpp +++ b/src/Core/GCSystemMessageHandler.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCSystemMessageHandler::execute(GCSystemMessage* pPacket, Player* pPlayer) diff --git a/src/Core/GCTakeOff.cpp b/src/Core/GCTakeOff.cpp index a8cdd2ed..69d97587 100644 --- a/src/Core/GCTakeOff.cpp +++ b/src/Core/GCTakeOff.cpp @@ -30,7 +30,7 @@ GCTakeOff::~GCTakeOff() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCTakeOff::read(SocketInputStream& iStream) @@ -45,7 +45,7 @@ void GCTakeOff::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCTakeOff::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCTakeOff.h b/src/Core/GCTakeOff.h index 76d7cc73..85f5bd9c 100644 --- a/src/Core/GCTakeOff.h +++ b/src/Core/GCTakeOff.h @@ -19,8 +19,8 @@ // // class GCTakeOff; // -// Ư ڰ ٴ Ŭ̾Ʈ -// ϴ Ŷ ü̴.(CreatureID,X,Y,DIR) Ѵ. +// 게임 서버에서 특정 사용자가 움직였다는 정보를 클라이언트로 보내줄 +// 때 사용하는 패킷 객체이다.(CreatureID,X,Y,DIR) 을 포함한다. // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCTakeOff : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCTakeOff : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szSlotID; } diff --git a/src/Core/GCTakeOutFail.cpp b/src/Core/GCTakeOutFail.cpp index 2e3831cb..1da6e168 100644 --- a/src/Core/GCTakeOutFail.cpp +++ b/src/Core/GCTakeOutFail.cpp @@ -3,8 +3,8 @@ // // Filename : GCTakeOutFail.cc // Written By : elca@ewestsoft.com -// Description : CGMove ڱ ڽſ Fail -// Ŷ Ŭ Լ +// Description : CGMove가 날아 왓을때 자기 자신에게 Fail 사인을 날리기 +// 위한 패킷 클래스 함수 정의 // ////////////////////////////////////////////////////////////////////// @@ -13,7 +13,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCTakeOutFail::read(SocketInputStream& iStream) @@ -27,7 +27,7 @@ void GCTakeOutFail::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCTakeOutFail::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCTakeOutFail.h b/src/Core/GCTakeOutFail.h index d5fb1209..33f8c6a9 100644 --- a/src/Core/GCTakeOutFail.h +++ b/src/Core/GCTakeOutFail.h @@ -24,10 +24,10 @@ class GCTakeOutFail : public Packet { public: GCTakeOutFail() {}; ~GCTakeOutFail() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -40,7 +40,7 @@ class GCTakeOutFail : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCTakeOutFailPacketSize ؼ ϶. + // const static GCTakeOutFailPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szObjectID; } @@ -95,7 +95,7 @@ class GCTakeOutFailFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCTakeOutFailPacketSize ؼ ϶. + // const static GCTakeOutFailPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID; } diff --git a/src/Core/GCTakeOutOK.h b/src/Core/GCTakeOutOK.h index 913455e5..03c96a07 100644 --- a/src/Core/GCTakeOutOK.h +++ b/src/Core/GCTakeOutOK.h @@ -24,10 +24,10 @@ class GCTakeOutOK : public Packet { public: GCTakeOutOK() {}; ~GCTakeOutOK() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -40,7 +40,7 @@ class GCTakeOutOK : public Packet { // get packet's body size // *OPTIMIZATION HINT* - // const static GCTakeOutOKPacketSize ؼ ϶. + // const static GCTakeOutOKPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return szObjectID; } @@ -95,7 +95,7 @@ class GCTakeOutOKFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCTakeOutOKPacketSize ؼ ϶. + // const static GCTakeOutOKPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return szObjectID; } diff --git a/src/Core/GCTeachSkillInfo.cpp b/src/Core/GCTeachSkillInfo.cpp index ba9cf646..c8e720ce 100644 --- a/src/Core/GCTeachSkillInfo.cpp +++ b/src/Core/GCTeachSkillInfo.cpp @@ -1,16 +1,16 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCTeachSkillInfo.cpp -// Written By : 輺 +// Written By : 김성민 // Description : -// NPC ÷̾ ų ÷̾ -// ۵Ǵ Ŷ̴. NPC ִ ϴ -// ̴ Ŷ̴. +// NPC가 플레이어에게 스킬을 가르쳐 줄 때 제일 먼저 플레이어에게 +// 전송되는 패킷이다. NPC가 가르쳐 줄 수 있는 기술의 범위를 기술하는 데 +// 쓰이는 패킷이다. ////////////////////////////////////////////////////////////////////////////// #include "GCTeachSkillInfo.h" ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCTeachSkillInfo::read(SocketInputStream& iStream) @@ -24,7 +24,7 @@ void GCTeachSkillInfo::read(SocketInputStream& iStream) } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCTeachSkillInfo::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCTeachSkillInfo.h b/src/Core/GCTeachSkillInfo.h index 8a2a6494..d5592fc3 100644 --- a/src/Core/GCTeachSkillInfo.h +++ b/src/Core/GCTeachSkillInfo.h @@ -1,10 +1,10 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCTeachSkillInfo.h -// Written By : 輺 +// Written By : 김성민 // Description : -// NPC ÷̾ ų ÷̾ -// ۵Ǵ Ŷ̴. NPC ִ ϴ -// ̴ Ŷ̴. +// NPC가 플레이어에게 스킬을 가르쳐 줄 때 제일 먼저 플레이어에게 +// 전송되는 패킷이다. NPC가 가르쳐 줄 수 있는 기술의 범위를 기술하는 +// 데 쓰이는 패킷이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __GC_TEACH_SKILL_INFO_H__ @@ -51,8 +51,8 @@ class GCTeachSkillInfo : public Packet { } private: - SkillDomainType_t m_DomainType; // NPC ִ Ÿ - SkillLevel_t m_TargetLevel; // ÷̾ + SkillDomainType_t m_DomainType; // NPC가 가르쳐주는 기술의 도메인 타입 + SkillLevel_t m_TargetLevel; // 플레이어가 이제 배울 기술 레벨 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCTeachSkillInfoHandler.cpp b/src/Core/GCTeachSkillInfoHandler.cpp index b84c8d75..e92d07cc 100644 --- a/src/Core/GCTeachSkillInfoHandler.cpp +++ b/src/Core/GCTeachSkillInfoHandler.cpp @@ -1,13 +1,13 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GCTeachSkillInfoHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// #include "GCTeachSkillInfo.h" ////////////////////////////////////////////////////////////////////// -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. ////////////////////////////////////////////////////////////////////// void GCTeachSkillInfoHandler::execute(GCTeachSkillInfo* pPacket, Player* pPlayer) diff --git a/src/Core/GCThrowBombOK1.cpp b/src/Core/GCThrowBombOK1.cpp index a4b86820..52b560bc 100644 --- a/src/Core/GCThrowBombOK1.cpp +++ b/src/Core/GCThrowBombOK1.cpp @@ -2,8 +2,8 @@ // // Filename : GCThrowBombOK1.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -40,14 +40,14 @@ GCThrowBombOK1::~GCThrowBombOK1() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCThrowBombOK1::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_X); iStream.read(m_Y); iStream.read(m_Dir); @@ -70,12 +70,12 @@ void GCThrowBombOK1::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCThrowBombOK1::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_X); oStream.write(m_Y); oStream.write(m_Dir); @@ -94,7 +94,7 @@ void GCThrowBombOK1::write(SocketOutputStream& oStream) const { // // GCThrowBombOK1::addListElement() // -// (ȭ, ȭġ ) Ʈ ֱ Լ. +// (변화부위, 변화수치 ) 의 한 셋을 리스트에 넣기 위한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCThrowBombOK1::addCListElement(ObjectID_t ObjectID) @@ -102,10 +102,10 @@ void GCThrowBombOK1::addCListElement(ObjectID_t ObjectID) { __BEGIN_TRY - // Creature ID ߰Ѵ. + // Creature ID를 추가한다. m_CList.push_back(ObjectID); - // ũó ID count Ų. + // 크리처 ID count를 증가시킨다. m_CListNum++; __END_CATCH @@ -116,7 +116,7 @@ void GCThrowBombOK1::addCListElement(ObjectID_t ObjectID) // // GCThrowBombOK1::deleteCListElement() // -// Creature List Ҹ ﶧ ʿ Լ. +// Creature List의 요소를 지울때 필요한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCThrowBombOK1::deleteCListElement() @@ -124,10 +124,10 @@ void GCThrowBombOK1::deleteCListElement() { __BEGIN_TRY - // ũ ̵ ϳ . + // 크리쳐 아이디를 하나 지운다. m_CList.pop_front(); - // ũó Ʈ ī͸ ϳ . + // 크리처 리스트 카운터를 하나 지운다. m_CListNum--; __END_CATCH diff --git a/src/Core/GCThrowBombOK1.h b/src/Core/GCThrowBombOK1.h index 605a1094..a452d7e0 100644 --- a/src/Core/GCThrowBombOK1.h +++ b/src/Core/GCThrowBombOK1.h @@ -2,8 +2,8 @@ // // Filename : GCThrowBombOK1.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ -// ڿ Ŷ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 +// 기술 사용자에게 보내는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -21,7 +21,7 @@ // // class GCThrowBombOK1; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -35,10 +35,10 @@ class GCThrowBombOK1 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -50,7 +50,7 @@ class GCThrowBombOK1 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szCoord * 2 + szBYTE + szDir + szItemType + szObjectID * m_CListNum + ModifyInfo::getPacketSize(); } diff --git a/src/Core/GCThrowBombOK2.cpp b/src/Core/GCThrowBombOK2.cpp index 6564ba3c..bff322be 100644 --- a/src/Core/GCThrowBombOK2.cpp +++ b/src/Core/GCThrowBombOK2.cpp @@ -2,8 +2,8 @@ // // Filename : GCThrowBombOK2.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -39,14 +39,14 @@ GCThrowBombOK2::~GCThrowBombOK2() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCThrowBombOK2::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_X); iStream.read(m_Y); @@ -69,12 +69,12 @@ void GCThrowBombOK2::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCThrowBombOK2::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_X); oStream.write(m_Y); @@ -96,7 +96,7 @@ void GCThrowBombOK2::write(SocketOutputStream& oStream) const { // // GCThrowBombOK2::addListElement() // -// (ȭ, ȭġ ) Ʈ ֱ Լ. +// (변화부위, 변화수치 ) 의 한 셋을 리스트에 넣기 위한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCThrowBombOK2::addCListElement(ObjectID_t ObjectID) @@ -104,10 +104,10 @@ void GCThrowBombOK2::addCListElement(ObjectID_t ObjectID) { __BEGIN_TRY - // Creature ID ߰Ѵ. + // Creature ID를 추가한다. m_CList.push_back(ObjectID); - // ũó ID count Ų. + // 크리처 ID count를 증가시킨다. m_CListNum++; __END_CATCH @@ -118,7 +118,7 @@ void GCThrowBombOK2::addCListElement(ObjectID_t ObjectID) // // GCThrowBombOK2::deleteCListElement() // -// Creature List Ҹ ﶧ ʿ Լ. +// Creature List의 요소를 지울때 필요한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCThrowBombOK2::deleteCListElement() @@ -126,10 +126,10 @@ void GCThrowBombOK2::deleteCListElement() { __BEGIN_TRY - // ũ ̵ ϳ . + // 크리쳐 아이디를 하나 지운다. m_CList.pop_front(); - // ũó Ʈ ī͸ ϳ . + // 크리처 리스트 카운터를 하나 지운다. m_CListNum--; __END_CATCH diff --git a/src/Core/GCThrowBombOK2.h b/src/Core/GCThrowBombOK2.h index dfec3131..d396938e 100644 --- a/src/Core/GCThrowBombOK2.h +++ b/src/Core/GCThrowBombOK2.h @@ -2,7 +2,7 @@ // // Filename : GCThrowBombOK2.h // Written By : elca@ewestsoft.com -// Description : ڰ ޴ Ŷ +// Description : 기술에 당한 자가 받는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCThrowBombOK2; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCThrowBombOK2 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCThrowBombOK2 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szCoord * 2 + szDir + szItemType + szBYTE + szObjectID * m_CListNum + ModifyInfo::getPacketSize(); diff --git a/src/Core/GCThrowBombOK3.cpp b/src/Core/GCThrowBombOK3.cpp index d54d038b..2542205c 100644 --- a/src/Core/GCThrowBombOK3.cpp +++ b/src/Core/GCThrowBombOK3.cpp @@ -2,8 +2,8 @@ // // Filename : GCThrowBombOK3.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -39,14 +39,14 @@ GCThrowBombOK3::~GCThrowBombOK3() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCThrowBombOK3::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_X); iStream.read(m_Y); @@ -69,12 +69,12 @@ void GCThrowBombOK3::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCThrowBombOK3::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_X); oStream.write(m_Y); @@ -94,7 +94,7 @@ void GCThrowBombOK3::write(SocketOutputStream& oStream) const { // // GCThrowBombOK3::addListElement() // -// (ȭ, ȭġ ) Ʈ ֱ Լ. +// (변화부위, 변화수치 ) 의 한 셋을 리스트에 넣기 위한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCThrowBombOK3::addCListElement(ObjectID_t ObjectID) @@ -102,10 +102,10 @@ void GCThrowBombOK3::addCListElement(ObjectID_t ObjectID) { __BEGIN_TRY - // Creature ID ߰Ѵ. + // Creature ID를 추가한다. m_CList.push_back(ObjectID); - // ũó ID count Ų. + // 크리처 ID count를 증가시킨다. m_CListNum++; __END_CATCH @@ -116,7 +116,7 @@ void GCThrowBombOK3::addCListElement(ObjectID_t ObjectID) // // GCThrowBombOK3::deleteCListElement() // -// Creature List Ҹ ﶧ ʿ Լ. +// Creature List의 요소를 지울때 필요한 멤버 함수. // ////////////////////////////////////////////////////////////////////// void GCThrowBombOK3::deleteCListElement() @@ -124,10 +124,10 @@ void GCThrowBombOK3::deleteCListElement() { __BEGIN_TRY - // ũ ̵ ϳ . + // 크리쳐 아이디를 하나 지운다. m_CList.pop_front(); - // ũó Ʈ ī͸ ϳ . + // 크리처 리스트 카운터를 하나 지운다. m_CListNum--; __END_CATCH diff --git a/src/Core/GCThrowBombOK3.h b/src/Core/GCThrowBombOK3.h index e221b419..a75c04ba 100644 --- a/src/Core/GCThrowBombOK3.h +++ b/src/Core/GCThrowBombOK3.h @@ -2,7 +2,7 @@ // // Filename : GCThrowBombOK3.h // Written By : elca@ewestsoft.com -// Description : ڰ ޴ Ŷ +// Description : 기술에 당한 자가 받는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCThrowBombOK3; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCThrowBombOK3 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCThrowBombOK3 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szCoord * 2 + szDir + szItemType + szBYTE + szObjectID * m_CListNum; } diff --git a/src/Core/GCThrowItemOK1.cpp b/src/Core/GCThrowItemOK1.cpp index 30f9755b..4edd2de9 100644 --- a/src/Core/GCThrowItemOK1.cpp +++ b/src/Core/GCThrowItemOK1.cpp @@ -2,8 +2,8 @@ // // Filename : GCThrowItemOK1.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -36,14 +36,14 @@ GCThrowItemOK1::~GCThrowItemOK1() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCThrowItemOK1::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); __END_CATCH @@ -51,12 +51,12 @@ void GCThrowItemOK1::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCThrowItemOK1::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); __END_CATCH diff --git a/src/Core/GCThrowItemOK1.h b/src/Core/GCThrowItemOK1.h index 8a76ea6b..6f9e2907 100644 --- a/src/Core/GCThrowItemOK1.h +++ b/src/Core/GCThrowItemOK1.h @@ -2,7 +2,7 @@ // // Filename : GCThrowItemOK1.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCThrowItemOK1; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCThrowItemOK1 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCThrowItemOK1 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID; } diff --git a/src/Core/GCThrowItemOK2.cpp b/src/Core/GCThrowItemOK2.cpp index 9a20083b..4aa592af 100644 --- a/src/Core/GCThrowItemOK2.cpp +++ b/src/Core/GCThrowItemOK2.cpp @@ -2,8 +2,8 @@ // // Filename : GCThrowItemOK2.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -33,14 +33,14 @@ GCThrowItemOK2::~GCThrowItemOK2() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCThrowItemOK2::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); ModifyInfo::read(iStream); @@ -50,12 +50,12 @@ void GCThrowItemOK2::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCThrowItemOK2::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); ModifyInfo::write(oStream); diff --git a/src/Core/GCThrowItemOK2.h b/src/Core/GCThrowItemOK2.h index f47c3c9e..a3e38f03 100644 --- a/src/Core/GCThrowItemOK2.h +++ b/src/Core/GCThrowItemOK2.h @@ -2,7 +2,7 @@ // // Filename : GCThrowItemOK2.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCThrowItemOK2; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCThrowItemOK2 : public ModifyInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCThrowItemOK2 : public ModifyInfo { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + ModifyInfo::getPacketSize(); } diff --git a/src/Core/GCThrowItemOK3.cpp b/src/Core/GCThrowItemOK3.cpp index 8043569f..41b7c095 100644 --- a/src/Core/GCThrowItemOK3.cpp +++ b/src/Core/GCThrowItemOK3.cpp @@ -2,8 +2,8 @@ // // Filename : GCThrowItemOK3.cpp // Written By : elca@ewestsoft.com -// Description : ڽſ ˸ Ŷ Ŭ -// . +// Description : 자신에게 쓰는 기술의 성공을 알리기 위한 패킷 클래스의 +// 멤버 정의. // ////////////////////////////////////////////////////////////////////// @@ -35,14 +35,14 @@ GCThrowItemOK3::~GCThrowItemOK3() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCThrowItemOK3::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(m_TargetObjectID); @@ -51,12 +51,12 @@ void GCThrowItemOK3::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCThrowItemOK3::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ObjectID); oStream.write(m_TargetObjectID); diff --git a/src/Core/GCThrowItemOK3.h b/src/Core/GCThrowItemOK3.h index ed3cb8ce..5aa6ba5c 100644 --- a/src/Core/GCThrowItemOK3.h +++ b/src/Core/GCThrowItemOK3.h @@ -2,7 +2,7 @@ // // Filename : GCThrowItemOK3.h // Written By : elca@ewestsoft.com -// Description : Ŷ Ŭ +// Description : 기술이 성공했을때 보내는 패킷을 위한 클래스 정의 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // class GCThrowItemOK3; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,10 +33,10 @@ class GCThrowItemOK3 : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -48,7 +48,7 @@ class GCThrowItemOK3 : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return szObjectID + szObjectID; } diff --git a/src/Core/GCTradeAddItem.cpp b/src/Core/GCTradeAddItem.cpp index 1f010340..ae65cb60 100644 --- a/src/Core/GCTradeAddItem.cpp +++ b/src/Core/GCTradeAddItem.cpp @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : GCTradeAddItem.cpp -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -42,7 +42,7 @@ GCTradeAddItem::~GCTradeAddItem() //////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //////////////////////////////////////////////////////////////////////////////// void GCTradeAddItem::read(SocketInputStream& iStream) @@ -81,7 +81,7 @@ void GCTradeAddItem::read(SocketInputStream& iStream) //////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //////////////////////////////////////////////////////////////////////////////// void GCTradeAddItem::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCTradeAddItem.h b/src/Core/GCTradeAddItem.h index 871133f9..d1ed95ae 100644 --- a/src/Core/GCTradeAddItem.h +++ b/src/Core/GCTradeAddItem.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : GCTradeAddItem.h -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -43,7 +43,7 @@ class GCTradeAddItem : public Packet { size += szDurability; // m_Durability size += szItemNum; // m_ItemNum size += szSilver; // silver coating amount - size += szGrade; // + size += szGrade; // 아이템 등급 size += szEnchantLevel; // enchant level size += szBYTE; // m_ListNum size += (SubItemInfo::getSize() * m_ListNum); // list m_InfoList; @@ -174,20 +174,20 @@ class GCTradeAddItem : public Packet { } private: - ObjectID_t m_TargetObjectID; // ȯ ϰ ִ OID - ObjectID_t m_ItemObjectID; // OID - CoordInven_t m_X; // κ丮 X ǥ - CoordInven_t m_Y; // κ丮 Y ǥ - BYTE m_ItemClass; // Ŭ - ItemType_t m_ItemType; // Ÿ - list m_OptionType; // ɼ Ÿ - Durability_t m_Durability; // - ItemNum_t m_ItemNum; // + ObjectID_t m_TargetObjectID; // 교환을 하고 있는 상대방의 OID + ObjectID_t m_ItemObjectID; // 아이템 OID + CoordInven_t m_X; // 인벤토리에서의 X 좌표 + CoordInven_t m_Y; // 인벤토리에서의 Y 좌표 + BYTE m_ItemClass; // 아이템 클래스 + ItemType_t m_ItemType; // 아이템 타입 + list m_OptionType; // 옵션 타입 + Durability_t m_Durability; // 내구도 + ItemNum_t m_ItemNum; // 아이템 숫자 Silver_t m_Silver; // silver coating amount - Grade_t m_Grade; // + Grade_t m_Grade; // 아이템 등급 EnchantLevel_t m_EnchantLevel; // enchant level - BYTE m_ListNum; // Ʈ , ȿ ִ - list m_InfoList; // Ʈ , ȿ ִ + BYTE m_ListNum; // 벨트일 경우, 안에 있는 아이템의 숫자 + list m_InfoList; // 벨트일 경우, 안에 있는 아이템의 정보 }; @@ -220,7 +220,7 @@ class GCTradeAddItemFactory : public PacketFactory { size += szDurability; // m_Durability size += szItemNum; // m_ItemNum size += szSilver; // silver coating amount - size += szGrade; // + size += szGrade; // 아이템 등급 size += szEnchantLevel; // enchant level size += szBYTE; // m_ListNum size += (SubItemInfo::getSize() * 8); // list m_InfoList; diff --git a/src/Core/GCTradeAddItemHandler.cpp b/src/Core/GCTradeAddItemHandler.cpp index 20c29618..44b61548 100644 --- a/src/Core/GCTradeAddItemHandler.cpp +++ b/src/Core/GCTradeAddItemHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCTradeAddItemHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCTradeError.cpp b/src/Core/GCTradeError.cpp index ab6826bc..2b70dd59 100644 --- a/src/Core/GCTradeError.cpp +++ b/src/Core/GCTradeError.cpp @@ -1,13 +1,13 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : GCTradeError.cpp -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// #include "GCTradeError.h" //////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //////////////////////////////////////////////////////////////////////////////// void GCTradeError::read(SocketInputStream& iStream) @@ -22,7 +22,7 @@ void GCTradeError::read(SocketInputStream& iStream) //////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //////////////////////////////////////////////////////////////////////////////// void GCTradeError::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCTradeError.h b/src/Core/GCTradeError.h index 34aa06eb..438c3606 100644 --- a/src/Core/GCTradeError.h +++ b/src/Core/GCTradeError.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : GCTradeError.h -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -11,50 +11,50 @@ #include "PacketFactory.h" //////////////////////////////////////////////////////////////////////////////// -// ڵ +// 에러 코드 //////////////////////////////////////////////////////////////////////////////// enum { - // ȯ 䱸 ʴ´ + // 교환을 요구한 대상이 존재하지 않는다 GC_TRADE_ERROR_CODE_TARGET_NOT_EXIST = 0, - // ȯ 䱸 ٸ ̴ + // 교환을 요구한 대상이 다른 종족이다 GC_TRADE_ERROR_CODE_RACE_DIFFER, - // ȯ Ϸ ϴ 밡 ƴϴ. + // 교환을 하려고 하는 곳이 안전 지대가 아니다. GC_TRADE_ERROR_CODE_NOT_SAFE, - // ͻŬ ź ä ȯ õϰ ִ. + // 모터사이클을 탄 채로 교환을 시도하고 있다. GC_TRADE_ERROR_CODE_MOTORCYCLE, - // 볪 ¿ ȯ . + // 늑대나 박쥐 상태에서는 교환을 할 수 없다. GC_TRADE_ERROR_CODE_BAT_OR_WOLF, - // ȯ ̸鼭 ٽ ȯ Ϸ Ѵ + // 교환 중이면서 다시 교환을 하려고 한다 GC_TRADE_ERROR_CODE_ALREADY_TRADING, - // ȯ ƴѵ, ȯ Ŷ ƿԴ. + // 교환 중이 아닌데, 교환 관련 패킷이 날아왔다. GC_TRADE_ERROR_CODE_NOT_TRADING, - // ȯ Ϸ ϴ ʴ + // 교환 대상에 더하려고 하는 아이템을 가지고 있지 않다 GC_TRADE_ERROR_CODE_ADD_ITEM, - // ȯ 󿡼 ϴ ʴ + // 교환 대상에서 빼려고 하는 아이템을 가지고 있지 않다 GC_TRADE_ERROR_CODE_REMOVE_ITEM, - // ȯ Ϸ ϴ ʴ. + // 교환 대상에 더하려고 하는 돈을 가지고 있지 않다. GC_TRADE_ERROR_CODE_INCREASE_MONEY, - // ȯ 󿡼 ϴ ʴ. + // 교환 대상에서 빼려고 하는 돈을 가지고 있지 않다. GC_TRADE_ERROR_CODE_DECREASE_MONEY, - // ȯ ߴµ, ڸ ڶ ߴ + // 교환을 했는데, 자리가 모자라서 실패했다 GC_TRADE_ERROR_CODE_NOT_ENOUGH_SPACE, - // ȯ ߴµ, ȯ ߴ + // 교환을 했는데, 선물 상자 교환 조건 때문에 실패했다 GC_TRADE_ERROR_CODE_EVENT_GIFT_BOX, - // ̴... + // 알 수 없는 에러이다... GC_TRADE_ERROR_CODE_UNKNOWN, GC_TRADE_ERROR_CODE_MAX @@ -100,8 +100,8 @@ class GCTradeError : public Packet { } private: - ObjectID_t m_TargetObjectID; // ȯ ̵ - BYTE m_Code; // ڵ + ObjectID_t m_TargetObjectID; // 교환의 대상 아이디 + BYTE m_Code; // 코드 }; diff --git a/src/Core/GCTradeErrorHandler.cpp b/src/Core/GCTradeErrorHandler.cpp index 4176c312..73f09038 100644 --- a/src/Core/GCTradeErrorHandler.cpp +++ b/src/Core/GCTradeErrorHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCTradeErrorHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCTradeFinish.cpp b/src/Core/GCTradeFinish.cpp index e05bb2a6..ded772da 100644 --- a/src/Core/GCTradeFinish.cpp +++ b/src/Core/GCTradeFinish.cpp @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : GCTradeFinish.cpp -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -8,7 +8,7 @@ #include "GCTradeFinish.h" //////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //////////////////////////////////////////////////////////////////////////////// void GCTradeFinish::read(SocketInputStream& iStream) @@ -23,7 +23,7 @@ void GCTradeFinish::read(SocketInputStream& iStream) //////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //////////////////////////////////////////////////////////////////////////////// void GCTradeFinish::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCTradeFinish.h b/src/Core/GCTradeFinish.h index 3dba5b49..fdc65337 100644 --- a/src/Core/GCTradeFinish.h +++ b/src/Core/GCTradeFinish.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : GCTradeFinish.h -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -11,20 +11,20 @@ #include "PacketFactory.h" //////////////////////////////////////////////////////////////////////////////// -// ȯ ڵ +// 교환 코드 //////////////////////////////////////////////////////////////////////////////// enum { - // ȯ ڵ + // 교환을 허락할 때 보내는 코드 GC_TRADE_FINISH_ACCEPT = 0, - // ȯ ź ڵ + // 교환을 거부할 때 보내는 코드 GC_TRADE_FINISH_REJECT, - // ȯ ڵ + // 교환을 재고려할 때 보내는 코드 GC_TRADE_FINISH_RECONSIDER, - // ȯ ϶ ڵ + // 교환을 실제적으로 하라는 코드 GC_TRADE_FINISH_EXECUTE, GC_TRADE_FINISH_MAX @@ -70,8 +70,8 @@ class GCTradeFinish : public Packet { } private: - ObjectID_t m_TargetObjectID; // ȯ ϴ ObjectID - BYTE m_Code; // ȯ ڵ + ObjectID_t m_TargetObjectID; // 교환을 원하는 상대방의 ObjectID + BYTE m_Code; // 교환 코드 }; diff --git a/src/Core/GCTradeFinishHandler.cpp b/src/Core/GCTradeFinishHandler.cpp index e1d330bd..03899efe 100644 --- a/src/Core/GCTradeFinishHandler.cpp +++ b/src/Core/GCTradeFinishHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCTradeFinishHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCTradeMoney.cpp b/src/Core/GCTradeMoney.cpp index ac6d974b..fc89a9d0 100644 --- a/src/Core/GCTradeMoney.cpp +++ b/src/Core/GCTradeMoney.cpp @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : GCTradeMoney.cpp -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -8,7 +8,7 @@ #include "GCTradeMoney.h" //////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //////////////////////////////////////////////////////////////////////////////// void GCTradeMoney::read(SocketInputStream& iStream) @@ -24,7 +24,7 @@ void GCTradeMoney::read(SocketInputStream& iStream) //////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //////////////////////////////////////////////////////////////////////////////// void GCTradeMoney::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCTradeMoney.h b/src/Core/GCTradeMoney.h index 9e1ca5d6..e94897e7 100644 --- a/src/Core/GCTradeMoney.h +++ b/src/Core/GCTradeMoney.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : GCTradeMoney.h -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -11,20 +11,20 @@ #include "PacketFactory.h" //////////////////////////////////////////////////////////////////////////////// -// ȯ ڵ +// 교환 코드 //////////////////////////////////////////////////////////////////////////////// enum { - // ȯ ׼ ÷ȴ. + // 상대방이 교환할 돈의 액수를 늘렸다. GC_TRADE_MONEY_INCREASE = 0, - // ȯ ׼ ٿ. + // 상대방이 교환할 돈의 액수를 줄였다. GC_TRADE_MONEY_DECREASE, - // κ丮 ݾ + // 실제로 인벤토리에서 빼낸 금액 GC_TRADE_MONEY_INCREASE_RESULT, - // κ丮 ݾ + // 실제로 인벤토리에다 더한 금액 GC_TRADE_MONEY_DECREASE_RESULT }; @@ -75,9 +75,9 @@ class GCTradeMoney : public Packet { } private: - ObjectID_t m_TargetObjectID; // ȯ ϴ ObjectID - Gold_t m_Gold; // ϴ ׼ - BYTE m_Code; // ڵ + ObjectID_t m_TargetObjectID; // 교환을 원하는 상대방의 ObjectID + Gold_t m_Gold; // 원하는 액수 + BYTE m_Code; // 코드 }; diff --git a/src/Core/GCTradeMoneyHandler.cpp b/src/Core/GCTradeMoneyHandler.cpp index 77d46f28..31ff2214 100644 --- a/src/Core/GCTradeMoneyHandler.cpp +++ b/src/Core/GCTradeMoneyHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCTradeMoneyHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCTradePrepare.cpp b/src/Core/GCTradePrepare.cpp index c340aea0..d15d031d 100644 --- a/src/Core/GCTradePrepare.cpp +++ b/src/Core/GCTradePrepare.cpp @@ -1,13 +1,13 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : GCTradePrepare.cpp -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// #include "GCTradePrepare.h" //////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //////////////////////////////////////////////////////////////////////////////// void GCTradePrepare::read(SocketInputStream& iStream) @@ -22,7 +22,7 @@ void GCTradePrepare::read(SocketInputStream& iStream) //////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //////////////////////////////////////////////////////////////////////////////// void GCTradePrepare::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCTradePrepareHandler.cpp b/src/Core/GCTradePrepareHandler.cpp index dda77a3f..eeaf4e70 100644 --- a/src/Core/GCTradePrepareHandler.cpp +++ b/src/Core/GCTradePrepareHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCTradePrepareHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCTradeRemoveItem.cpp b/src/Core/GCTradeRemoveItem.cpp index e9ec0ee5..b5fc3b90 100644 --- a/src/Core/GCTradeRemoveItem.cpp +++ b/src/Core/GCTradeRemoveItem.cpp @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : GCTradeRemoveItem.cpp -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -8,7 +8,7 @@ #include "GCTradeRemoveItem.h" //////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //////////////////////////////////////////////////////////////////////////////// void GCTradeRemoveItem::read(SocketInputStream& iStream) @@ -23,7 +23,7 @@ void GCTradeRemoveItem::read(SocketInputStream& iStream) //////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //////////////////////////////////////////////////////////////////////////////// void GCTradeRemoveItem::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCTradeRemoveItem.h b/src/Core/GCTradeRemoveItem.h index 20d2b92e..edfa2ab3 100644 --- a/src/Core/GCTradeRemoveItem.h +++ b/src/Core/GCTradeRemoveItem.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : GCTradeRemoveItem.h -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -50,8 +50,8 @@ class GCTradeRemoveItem : public Packet { } private: - ObjectID_t m_TargetObjectID; // ȯ ϴ ObjectID - ObjectID_t m_ItemObjectID; // ȯ Ʈ ߰ OID + ObjectID_t m_TargetObjectID; // 교환을 원하는 상대방의 ObjectID + ObjectID_t m_ItemObjectID; // 교환 리스트에 추가할 아이템의 OID }; diff --git a/src/Core/GCTradeVerify.cpp b/src/Core/GCTradeVerify.cpp index d4b3691f..6af0a8db 100644 --- a/src/Core/GCTradeVerify.cpp +++ b/src/Core/GCTradeVerify.cpp @@ -1,13 +1,13 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : GCTradeVerify.cpp -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// #include "GCTradeVerify.h" //////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //////////////////////////////////////////////////////////////////////////////// void GCTradeVerify::read(SocketInputStream& iStream) @@ -21,7 +21,7 @@ void GCTradeVerify::read(SocketInputStream& iStream) //////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //////////////////////////////////////////////////////////////////////////////// void GCTradeVerify::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCTradeVerify.h b/src/Core/GCTradeVerify.h index b56aada5..11dbe9dc 100644 --- a/src/Core/GCTradeVerify.h +++ b/src/Core/GCTradeVerify.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : GCTradeVerify.h -// Written By : 輺 +// Written By : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -11,44 +11,44 @@ #include "PacketFactory.h" //////////////////////////////////////////////////////////////////////////////// -// ڵ +// 에러 코드 //////////////////////////////////////////////////////////////////////////////// enum { - // ȯ ߰ϴ + // 교환 대상으로 아이템을 추가하는 것을 인증 GC_TRADE_VERIFY_CODE_ADD_ITEM_WHEN_ACCEPT, - // ȯ 󿡼 ϴ + // 교환 대상에서 아이템을 제거하는 것을 인증 GC_TRADE_VERIFY_CODE_REMOVE_ITEM, - // ȯ 󿡼 ߰ϴ + // 교환 대상에서 돈을 추가하는 것을 인증 GC_TRADE_VERIFY_CODE_MONEY_INCREASE, - // ȯ 󿡼 ϴ + // 교환 대상에서 돈을 제거하는 것을 인증 GC_TRADE_VERIFY_CODE_MONEY_DECREASE, - // ȯ Ȯϴ + // 교환 성립을 확인하는 것을 인증 GC_TRADE_VERIFY_CODE_FINISH_ACCEPT, - // ȯ ϴ + // 교환 성립을 취소하는 것을 인증 GC_TRADE_VERIFY_CODE_FINISH_REJECT, - // ȯ ϴ + // 교환 성립을 재고려하는 것을 인증 GC_TRADE_VERIFY_CODE_FINISH_RECONSIDER, - // ȯ ϰ 콺 κ丮 ű + // 교환을 하고 있을 때 마우스에 인벤토리로 아이템을 옮기는 것을 검증 GC_TRADE_VERIFY_CODE_MOUSE_TO_INVENTORY_OK, GC_TRADE_VERIFY_CODE_MOUSE_TO_INVENTORY_FAIL, - // ȯ ϰ κ丮 콺 ű + // 교환을 하고 있을 때 인벤토리에서 마우스로 아이템을 옮기는 것을 검증 GC_TRADE_VERIFY_CODE_INVENTORY_TO_MOUSE_OK, GC_TRADE_VERIFY_CODE_INVENTORY_TO_MOUSE_FAIL, - // μ ... + // 현재로서는 선물 상자인 경우... GC_TRADE_VERIFY_CODE_ADD_ITEM_OK, GC_TRADE_VERIFY_CODE_ADD_ITEM_FAIL, - // . + // 에러닷. GC_TRADE_VERIFY_CODE_MAX }; @@ -85,7 +85,7 @@ class GCTradeVerify : public Packet { } private: - BYTE m_Code; // ڵ + BYTE m_Code; // 코드 }; diff --git a/src/Core/GCTradeVerifyHandler.cpp b/src/Core/GCTradeVerifyHandler.cpp index 5f0833f8..94d77917 100644 --- a/src/Core/GCTradeVerifyHandler.cpp +++ b/src/Core/GCTradeVerifyHandler.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////// // // Filename : GCTradeVerifyHandler.cpp -// Written By : 輺 +// Written By : 김성민 // Description : // ////////////////////////////////////////////////////////////////////// diff --git a/src/Core/GCUnburrowFail.cpp b/src/Core/GCUnburrowFail.cpp index 8deb8ba8..6df297e9 100644 --- a/src/Core/GCUnburrowFail.cpp +++ b/src/Core/GCUnburrowFail.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCUnburrowFail::read(SocketInputStream& iStream) @@ -21,7 +21,7 @@ void GCUnburrowFail::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCUnburrowFail::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCUnburrowFail.h b/src/Core/GCUnburrowFail.h index 850c8f14..859b7be7 100644 --- a/src/Core/GCUnburrowFail.h +++ b/src/Core/GCUnburrowFail.h @@ -27,10 +27,10 @@ class GCUnburrowFail : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/GCUnburrowOK.cpp b/src/Core/GCUnburrowOK.cpp index 954b5ceb..f77ec2d2 100644 --- a/src/Core/GCUnburrowOK.cpp +++ b/src/Core/GCUnburrowOK.cpp @@ -2,8 +2,8 @@ // // Filename : GCUnburrowOK.cc // Written By : crazydog -// Description : CGUnburrow ڱ ڽſ OK -// Ŷ Ŭ Լ +// Description : CGUnburrow가 날아 왓을때 자기 자신에게 OK 사인을 날리기 +// 위한 패킷 클래스 함수 정의 // ////////////////////////////////////////////////////////////////////// @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCUnburrowOK::read(SocketInputStream& iStream) @@ -28,7 +28,7 @@ void GCUnburrowOK::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCUnburrowOK::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCUnburrowOK.h b/src/Core/GCUnburrowOK.h index 14205a34..93e249da 100644 --- a/src/Core/GCUnburrowOK.h +++ b/src/Core/GCUnburrowOK.h @@ -16,8 +16,8 @@ // // class GCUnburrowOK; // -// Ư ڰ ٴ Ŭ̾Ʈ -// ϴ Ŷ ü̴.(CreatureID,X,Y,DIR) Ѵ. +// 게임 서버에서 특정 사용자가 움직였다는 정보를 클라이언트로 보내줄 +// 때 사용하는 패킷 객체이다.(CreatureID,X,Y,DIR) 을 포함한다. // ////////////////////////////////////////////////////////////////////// @@ -30,10 +30,10 @@ class GCUnburrowOK : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -46,7 +46,7 @@ class GCUnburrowOK : public Packet { // get packet body size // *OPTIMIZATION HINT* - // const static GCUnburrowOKPacketSize , ϶. + // const static GCUnburrowOKPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szCoord + szCoord + szDir; } @@ -87,9 +87,9 @@ class GCUnburrowOK : public Packet { private: - Coord_t m_X; // ǥ X ǥ - Coord_t m_Y; // ǥ Y ǥ - Dir_t m_Dir; // ǥ + Coord_t m_X; // 목표 X 좌표 + Coord_t m_Y; // 목표 Y 좌표 + Dir_t m_Dir; // 목표 방향 }; @@ -120,7 +120,7 @@ class GCUnburrowOKFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCUnburrowOKPacketSize , ϶. + // const static GCUnburrowOKPacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szCoord + szCoord + szDir; } diff --git a/src/Core/GCUnburrowOKHandler.cpp b/src/Core/GCUnburrowOKHandler.cpp index 8155935d..6f54bbb6 100644 --- a/src/Core/GCUnburrowOKHandler.cpp +++ b/src/Core/GCUnburrowOKHandler.cpp @@ -24,7 +24,7 @@ void GCUnburrowOKHandler::execute(GCUnburrowOK* pPacket, Player* pPlayer) ClientPlayer* pClientPlayer = dynamic_cast(pPlayer); - // ǥ ÷̾ ´. + // 다음 좌표를 플레이어에 지정해 놓는다. pClientPlayer->setX(pPacket->getX()); pClientPlayer->setY(pPacket->getY()); pClientPlayer->setDir(pPacket->getDir()); diff --git a/src/Core/GCUnionOfferList.cpp b/src/Core/GCUnionOfferList.cpp index ab2ac643..0dbe5012 100644 --- a/src/Core/GCUnionOfferList.cpp +++ b/src/Core/GCUnionOfferList.cpp @@ -41,7 +41,7 @@ PacketSize_t GCUnionOfferList::getPacketSize() const { } ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCUnionOfferList::read(SocketInputStream& iStream) @@ -61,7 +61,7 @@ void GCUnionOfferList::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCUnionOfferList::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCUnionOfferList.h b/src/Core/GCUnionOfferList.h index 86a40624..34632e5d 100644 --- a/src/Core/GCUnionOfferList.h +++ b/src/Core/GCUnionOfferList.h @@ -19,7 +19,7 @@ // // class GCUnionOfferList; // -// Ŭ̾Ʈ û Ʈ  ش. +// 클라이언트에게 연합을 신청한 길드 리스트를 만들어서 보내준다. // ////////////////////////////////////////////////////////////////////// @@ -115,7 +115,7 @@ class SingleGuildUnionOffer { m_GuildID = GuildID; } - // get/set OfferGuild Type (JOIN-û , QUIT-Żû ) + // get/set OfferGuild Type (JOIN-신청자 목록, QUIT-탈퇴신청한 길드) BYTE getGuildType() const { return m_Type; } @@ -161,10 +161,10 @@ class GCUnionOfferList : public Packet { ~GCUnionOfferList(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -226,7 +226,7 @@ class GCUnionOfferListFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCSystemMessagePacketMaxSize , ϶. + // const static GCSystemMessagePacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return SingleGuildUnionOffer::getMaxSize() * 20; } diff --git a/src/Core/GCUntransformFail.cpp b/src/Core/GCUntransformFail.cpp index 03abd6d0..1206ae87 100644 --- a/src/Core/GCUntransformFail.cpp +++ b/src/Core/GCUntransformFail.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCUntransformFail::read(SocketInputStream& iStream) @@ -21,7 +21,7 @@ void GCUntransformFail::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCUntransformFail::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCUntransformFail.h b/src/Core/GCUntransformFail.h index de5589f9..9360a16e 100644 --- a/src/Core/GCUntransformFail.h +++ b/src/Core/GCUntransformFail.h @@ -27,10 +27,10 @@ class GCUntransformFail : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/GCUntransformOK.cpp b/src/Core/GCUntransformOK.cpp index 3e8bb1ec..e390ae2f 100644 --- a/src/Core/GCUntransformOK.cpp +++ b/src/Core/GCUntransformOK.cpp @@ -2,8 +2,8 @@ // // Filename : GCUntransformOK.cc // Written By : crazydog -// Description : CGUntransform ڱ ڽſ OK -// Ŷ Ŭ Լ +// Description : CGUntransform가 날아 왓을때 자기 자신에게 OK 사인을 날리기 +// 위한 패킷 클래스 함수 정의 // ////////////////////////////////////////////////////////////////////// @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCUntransformOK::read(SocketInputStream& iStream) @@ -28,7 +28,7 @@ void GCUntransformOK::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCUntransformOK::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCUntransformOK.h b/src/Core/GCUntransformOK.h index 8dcb0aaa..09002576 100644 --- a/src/Core/GCUntransformOK.h +++ b/src/Core/GCUntransformOK.h @@ -16,8 +16,8 @@ // // class GCUntransformOK; // -// Ư ڰ ٴ Ŭ̾Ʈ -// ϴ Ŷ ü̴.(CreatureID,X,Y,DIR) Ѵ. +// 게임 서버에서 특정 사용자가 움직였다는 정보를 클라이언트로 보내줄 +// 때 사용하는 패킷 객체이다.(CreatureID,X,Y,DIR) 을 포함한다. // ////////////////////////////////////////////////////////////////////// @@ -30,10 +30,10 @@ class GCUntransformOK : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -46,7 +46,7 @@ class GCUntransformOK : public Packet { // get packet body size // *OPTIMIZATION HINT* - // const static GCUntransformOKPacketSize , ϶. + // const static GCUntransformOKPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szCoord + szCoord + szDir; } @@ -87,9 +87,9 @@ class GCUntransformOK : public Packet { private: - Coord_t m_X; // ǥ X ǥ - Coord_t m_Y; // ǥ Y ǥ - Dir_t m_Dir; // ǥ + Coord_t m_X; // 목표 X 좌표 + Coord_t m_Y; // 목표 Y 좌표 + Dir_t m_Dir; // 목표 방향 }; @@ -120,7 +120,7 @@ class GCUntransformOKFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCUntransformOKPacketSize , ϶. + // const static GCUntransformOKPacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szCoord + szCoord + szDir; } diff --git a/src/Core/GCUntransformOKHandler.cpp b/src/Core/GCUntransformOKHandler.cpp index db44ee37..3a9c5e47 100644 --- a/src/Core/GCUntransformOKHandler.cpp +++ b/src/Core/GCUntransformOKHandler.cpp @@ -24,7 +24,7 @@ void GCUntransformOKHandler::execute(GCUntransformOK* pPacket, Player* pPlayer) ClientPlayer* pClientPlayer = dynamic_cast(pPlayer); - // ǥ ÷̾ ´. + // 다음 좌표를 플레이어에 지정해 놓는다. pClientPlayer->setX(pPacket->getX()); pClientPlayer->setY(pPacket->getY()); pClientPlayer->setDir(pPacket->getDir()); diff --git a/src/Core/GCUpdateInfo.cpp b/src/Core/GCUpdateInfo.cpp index f96c8d7c..e635c8cb 100644 --- a/src/Core/GCUpdateInfo.cpp +++ b/src/Core/GCUpdateInfo.cpp @@ -43,13 +43,13 @@ GCUpdateInfo::~GCUpdateInfo() SAFE_DELETE(m_pEffectInfo); SAFE_DELETE(m_pRideMotorcycleInfo); - // ʿ ο NPCInfo Ʈ Ѵ. - // Ʈ μ Һ̴. ׷Ƿ Ź NPCInfo - // new Ͽ, GCUpdateInfo ־ְ, ٽ deleteϴ - // ӵ 鿡 ش. ׷ GCUpdateInfo ȿ - // ִ NPCInfoList Zone NPCInfoList ͸ ׳ - // ش. ׷Ƿ ̸ ϸ ȴ. - // ׷ Ŭ̾Ʈ ̸ Ѵ. + // 서버 쪽에서는 존 내부에서 NPCInfo의 리스트가 존재한다. + // 이 리스트는 현재로서는 불변이다. 그러므로 매번 NPCInfo를 + // new로 생성하여, GCUpdateInfo에다 넣어주고, 다시 delete하는 것은 + // 속도 면에서 봤을 때 상당히 손해다. 그래서 GCUpdateInfo 안에 + // 있는 NPCInfoList에는 Zone의 NPCInfoList의 포인터를 그냥 + // 전달해 준다. 그러므로 서버 측에서는 이를 삭제하면 안 된다. + // 그러나 클라이언트에서는 이를 삭제해 줘야 한다. #ifdef __GAME_CLIENT__ list::iterator itr = m_NPCInfos.begin(); @@ -65,7 +65,7 @@ GCUpdateInfo::~GCUpdateInfo() } //-------------------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void GCUpdateInfo::read(SocketInputStream& iStream) @@ -173,10 +173,10 @@ void GCUpdateInfo::read(SocketInputStream& iStream) addNPCInfo(pInfo); } - // + // 서버 상태 iStream.read(m_ServerStat); - // ̾ + // 프리미엄 iStream.read(m_fPremium); iStream.read(m_SMSCharge); @@ -192,7 +192,7 @@ void GCUpdateInfo::read(SocketInputStream& iStream) m_pBloodBibleSign->read(iStream); - // Ŀ¯ Ʈ + // 파워짱 포인트 iStream.read(m_PowerPoint); __END_CATCH @@ -200,7 +200,7 @@ void GCUpdateInfo::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void GCUpdateInfo::write(SocketOutputStream& oStream) const @@ -299,10 +299,10 @@ void GCUpdateInfo::write(SocketOutputStream& oStream) const pInfo->write(oStream); } - // + // 서버 상태 oStream.write(m_ServerStat); - // ̾ + // 프리미엄 oStream.write(m_fPremium); oStream.write(m_SMSCharge); @@ -323,7 +323,7 @@ void GCUpdateInfo::write(SocketOutputStream& oStream) const m_pBloodBibleSign->write(oStream); - // Ŀ¯ Ʈ + // 파워짱 포인트 oStream.write(m_PowerPoint); __END_CATCH diff --git a/src/Core/GCUpdateInfoHandler.cpp b/src/Core/GCUpdateInfoHandler.cpp index 0e5aa3b1..50c13083 100644 --- a/src/Core/GCUpdateInfoHandler.cpp +++ b/src/Core/GCUpdateInfoHandler.cpp @@ -19,9 +19,9 @@ #endif //---------------------------------------------------------------------- -// Ŭ̾Ʈ κ GCUpdateInfo Ŷ ް Ǹ, -// Ŷ ͵ Ŭ̾Ʈ , ε -// CGReady Ŷ ȴ. +// 클라이언트가 게임 서버로부터 GCUpdateInfo 패킷을 받게 되면, +// 패킷 안의 데이터들을 클라이언트에 저장한 후, 데이터 로딩이 +// 끝이 나면 게임 서버로 CGReady 패킷을 보내면 된다. //---------------------------------------------------------------------- void GCUpdateInfoHandler::execute(GCUpdateInfo* pPacket, Player* pPlayer) @@ -35,14 +35,14 @@ void GCUpdateInfoHandler::execute(GCUpdateInfo* pPacket, Player* pPlayer) // cout << pPacket->toString() << endl; //-------------------------------------------------- - // ε Ѵ. + // 데이터 로딩을 시작한다. //-------------------------------------------------- pClientPlayer->setPlayerStatus(CPS_WAITING_FOR_LOADING); - // ... ε ε ... + // ... 로딩 로딩 ... //-------------------------------------------------- - // CGReady Ŷ . + // 게임 서버로 CGReady 패킷을 보낸다. //-------------------------------------------------- CGReady cgReady; pClientPlayer->sendPacket(&cgReady); diff --git a/src/Core/GCUseBonusPointFail.cpp b/src/Core/GCUseBonusPointFail.cpp index ca73c41b..e87ac844 100644 --- a/src/Core/GCUseBonusPointFail.cpp +++ b/src/Core/GCUseBonusPointFail.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCUseBonusPointFail::read(SocketInputStream& iStream) @@ -21,7 +21,7 @@ void GCUseBonusPointFail::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCUseBonusPointFail::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCUseBonusPointFail.h b/src/Core/GCUseBonusPointFail.h index ba4e9ac5..c3db5977 100644 --- a/src/Core/GCUseBonusPointFail.h +++ b/src/Core/GCUseBonusPointFail.h @@ -27,10 +27,10 @@ class GCUseBonusPointFail : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/GCUseBonusPointOK.cpp b/src/Core/GCUseBonusPointOK.cpp index 24909ea3..67cc6746 100644 --- a/src/Core/GCUseBonusPointOK.cpp +++ b/src/Core/GCUseBonusPointOK.cpp @@ -2,7 +2,7 @@ // // Filename : GCUseBonusPointOK.cc // Written By : crazydog -// Description : vamp bonus point 㰡 ޴. +// Description : vamp가 bonus point사용을 허가 받다. // ////////////////////////////////////////////////////////////////////// @@ -30,7 +30,7 @@ GCUseBonusPointOK::~GCUseBonusPointOK() } ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCUseBonusPointOK::read(SocketInputStream& iStream) @@ -44,7 +44,7 @@ void GCUseBonusPointOK::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCUseBonusPointOK::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCUseBonusPointOK.h b/src/Core/GCUseBonusPointOK.h index c6770f49..9e4daaae 100644 --- a/src/Core/GCUseBonusPointOK.h +++ b/src/Core/GCUseBonusPointOK.h @@ -2,7 +2,7 @@ // // Filename : GCUseBonusPointOK.h // Written By : crazydog -// Description : vamp bonus 㰡 ޴. +// Description : vamp가 bonus사용을 허가 받다. // ////////////////////////////////////////////////////////////////////// @@ -29,10 +29,10 @@ class GCUseBonusPointOK : public ModifyInfo { // Desctructor ~GCUseBonusPointOK(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -45,7 +45,7 @@ class GCUseBonusPointOK : public ModifyInfo { // get packet's body size // *OPTIMIZATION HINT* - // const static GCUseBonusPointOKPacketSize ؼ ϶. + // const static GCUseBonusPointOKPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketSize() const { return ModifyInfo::getPacketSize(); } @@ -87,7 +87,7 @@ class GCUseBonusPointOKFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCUseBonusPointOKPacketSize ؼ ϶. + // const static GCUseBonusPointOKPacketSize 를 정의해서 리턴하라. PacketSize_t getPacketMaxSize() const { return ModifyInfo::getPacketMaxSize(); } diff --git a/src/Core/GCUseOK.cpp b/src/Core/GCUseOK.cpp index b2a90c0b..d91dff3f 100644 --- a/src/Core/GCUseOK.cpp +++ b/src/Core/GCUseOK.cpp @@ -2,8 +2,8 @@ // // Filename : GCUseOK.cc // Written By : elca@ewestsoft.com -// Description : CGMove ڱ ڽſ OK -// Ŷ Ŭ Լ +// Description : CGMove가 날아 왓을때 자기 자신에게 OK 사인을 날리기 +// 위한 패킷 클래스 함수 정의 // ////////////////////////////////////////////////////////////////////// @@ -31,7 +31,7 @@ GCUseOK::~GCUseOK() } ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCUseOK::read(SocketInputStream& iStream) @@ -45,7 +45,7 @@ void GCUseOK::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCUseOK::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCUsePowerPointResult.h b/src/Core/GCUsePowerPointResult.h index efa3bde5..c4eae929 100644 --- a/src/Core/GCUsePowerPointResult.h +++ b/src/Core/GCUsePowerPointResult.h @@ -24,18 +24,18 @@ class GCUsePowerPointResult : public Packet { public: enum RESULT_CODE { NO_ERROR = 0, - NOT_ENOUGH_POWER_POINT, // Ŀ Ʈ մϴ. - NOT_ENOUGH_INVENTORY_SPACE, // κ丮 մϴ. + NOT_ENOUGH_POWER_POINT, // 파워 포인트가 부족합니다. + NOT_ENOUGH_INVENTORY_SPACE, // 인벤토리에 공간이 부족합니다. }; enum ITEM_CODE { - CANDY = 0, // 1 - RESURRECTION_SCROLL, // Ȱ ũ 1 - ELIXIR_SCROLL, // ũ 1 - MEGAPHONE, // Ȯ 30 - NAMING_PEN, // ̹ 1 - SIGNPOST, // ˸ 6ð - BLACK_RICE_CAKE_SOUP, // 1 + CANDY = 0, // 사탕 1개 + RESURRECTION_SCROLL, // 부활 스크롤 1개 + ELIXIR_SCROLL, // 엘릭서 스크롤 1개 + MEGAPHONE, // 확성기 30분 + NAMING_PEN, // 네이밍 펜 1개 + SIGNPOST, // 알림판 6시간 + BLACK_RICE_CAKE_SOUP, // 검은 떡국 1개 }; public: @@ -43,10 +43,10 @@ class GCUsePowerPointResult : public Packet { ~GCUsePowerPointResult(); public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -98,13 +98,13 @@ class GCUsePowerPointResult : public Packet { // data members //-------------------------------------------------- private: - // ڵ + // 에러 코드 BYTE m_ErrorCode; - // ڵ + // 아이템 코드 BYTE m_ItemCode; - // Ŀ Ʈ + // 파워 포인트 int m_PowerPoint; }; @@ -136,7 +136,7 @@ class GCUsePowerPointResultFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCUsePowerPointResultPacketMaxSize , ϶. + // const static GCUsePowerPointResultPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + szBYTE + szint; } diff --git a/src/Core/GCVisibleFail.cpp b/src/Core/GCVisibleFail.cpp index a9034b11..506d3a0a 100644 --- a/src/Core/GCVisibleFail.cpp +++ b/src/Core/GCVisibleFail.cpp @@ -10,7 +10,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCVisibleFail::read(SocketInputStream& iStream) @@ -21,7 +21,7 @@ void GCVisibleFail::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCVisibleFail::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCVisibleFail.h b/src/Core/GCVisibleFail.h index b05282a5..6bb932cf 100644 --- a/src/Core/GCVisibleFail.h +++ b/src/Core/GCVisibleFail.h @@ -27,10 +27,10 @@ class GCVisibleFail : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/GCVisibleOK.cpp b/src/Core/GCVisibleOK.cpp index 7c5e989c..f7edfd8b 100644 --- a/src/Core/GCVisibleOK.cpp +++ b/src/Core/GCVisibleOK.cpp @@ -2,8 +2,8 @@ // // Filename : GCVisibleOK.cc // Written By : crazydog -// Description : CGVisible ڱ ڽſ OK -// Ŷ Ŭ Լ +// Description : CGVisible가 날아 왓을때 자기 자신에게 OK 사인을 날리기 +// 위한 패킷 클래스 함수 정의 // ////////////////////////////////////////////////////////////////////// @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCVisibleOK::read(SocketInputStream& iStream) @@ -24,7 +24,7 @@ void GCVisibleOK::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCVisibleOK::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCVisibleOK.h b/src/Core/GCVisibleOK.h index 478f0500..5ec55b23 100644 --- a/src/Core/GCVisibleOK.h +++ b/src/Core/GCVisibleOK.h @@ -16,8 +16,8 @@ // // class GCVisibleOK; // -// Ư ڰ ٴ Ŭ̾Ʈ -// ϴ Ŷ ü̴.(CreatureID,X,Y,DIR) Ѵ. +// 게임 서버에서 특정 사용자가 움직였다는 정보를 클라이언트로 보내줄 +// 때 사용하는 패킷 객체이다.(CreatureID,X,Y,DIR) 을 포함한다. // ////////////////////////////////////////////////////////////////////// @@ -29,10 +29,10 @@ class GCVisibleOK : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -45,7 +45,7 @@ class GCVisibleOK : public Packet { // get packet body size // *OPTIMIZATION HINT* - // const static GCVisibleOKPacketSize , ϶. + // const static GCVisibleOKPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return 0; } @@ -90,7 +90,7 @@ class GCVisibleOKFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCVisibleOKPacketSize , ϶. + // const static GCVisibleOKPacketSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return 0; } diff --git a/src/Core/GCWaitGuildList.h b/src/Core/GCWaitGuildList.h index 614f5595..3694f351 100644 --- a/src/Core/GCWaitGuildList.h +++ b/src/Core/GCWaitGuildList.h @@ -23,7 +23,7 @@ typedef list::const_iterator GuildInfoListConstItor; // // class GCWaitGuildList; // -// Ŭ̾Ʈ Ʈ . +// 클라이언트에 등록 대기중인 길드 리스트를 보낸다. // ////////////////////////////////////////////////////////////////////// @@ -35,10 +35,10 @@ class GCWaitGuildList : public Packet { // destructor ~GCWaitGuildList(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -116,7 +116,7 @@ class GCWaitGuildListFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCSystemMessagePacketMaxSize , ϶. + // const static GCSystemMessagePacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szWORD + (GuildInfo::getMaxSize() * 5000); } diff --git a/src/Core/GCWarList.cpp b/src/Core/GCWarList.cpp index 79b06b5c..71e8f048 100644 --- a/src/Core/GCWarList.cpp +++ b/src/Core/GCWarList.cpp @@ -57,7 +57,7 @@ void GCWarList::clear() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCWarList::read(SocketInputStream& iStream) @@ -99,7 +99,7 @@ void GCWarList::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCWarList::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCWarScheduleList.cpp b/src/Core/GCWarScheduleList.cpp index f3c6d490..4e8a7b15 100644 --- a/src/Core/GCWarScheduleList.cpp +++ b/src/Core/GCWarScheduleList.cpp @@ -40,7 +40,7 @@ GCWarScheduleList::~GCWarScheduleList() } ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GCWarScheduleList::read(SocketInputStream& iStream) @@ -84,7 +84,7 @@ void GCWarScheduleList::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void GCWarScheduleList::write(SocketOutputStream& oStream) const @@ -187,10 +187,10 @@ string GCWarScheduleList::toString() const { msg << ", (WarScheduleInfo : " << (((*itr)->warType)?"WAR_TYPE_DIFFERENT_RACE, ":"WAR_TYPE_SAME_RACE, " ) - << (*itr)->year << " " - << (*itr)->month << " " - << (*itr)->day << "" - << (*itr)->hour << ""; + << (*itr)->year << "년 " + << (*itr)->month << "월 " + << (*itr)->day << "일" + << (*itr)->hour << "시"; if((*itr)->warType == 0 ) { diff --git a/src/Core/GCWarScheduleList.h b/src/Core/GCWarScheduleList.h index 6bb83239..1b9fb912 100644 --- a/src/Core/GCWarScheduleList.h +++ b/src/Core/GCWarScheduleList.h @@ -16,7 +16,7 @@ #define MAX_WAR_NUM 20 struct WarScheduleInfo { - BYTE warType; // 0 : 1 : + BYTE warType; // 0 : 동족간 1 : 종족간 WORD year; BYTE month; BYTE day; diff --git a/src/Core/GCWhisper.cpp b/src/Core/GCWhisper.cpp index a85fc9a3..973ea9da 100644 --- a/src/Core/GCWhisper.cpp +++ b/src/Core/GCWhisper.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCWhisper::read(SocketInputStream& iStream) @@ -51,7 +51,7 @@ void GCWhisper::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCWhisper::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCWhisper.h b/src/Core/GCWhisper.h index 06ec1f40..77430563 100644 --- a/src/Core/GCWhisper.h +++ b/src/Core/GCWhisper.h @@ -18,9 +18,9 @@ // // class GCWhisper; // -// Ư ÷̾ Whisper ٸ ÷̾鿡 εijƮ -// ϴ Ŷ̴. ο ij͸ Whisper Ʈ Ÿ -// ʵ ִ. +// 게임 서버가 특정 플레이어의 Whisper 를 다른 플레이어들에게 브로드캐스트 +// 할 때 전송하는 패킷이다. 내부에 캐릭터명과 Whisper 스트링을 데이타 +// 필드로 가지고 있다. // ////////////////////////////////////////////////////////////////////// @@ -28,10 +28,10 @@ class GCWhisper : public Packet { public: GCWhisper() {}; ~GCWhisper() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -129,7 +129,7 @@ class GCWhisperFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GCWhisperPacketMaxSize , ϶. + // const static GCWhisperPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + 10 + szuint + szBYTE + 128 + szBYTE; } diff --git a/src/Core/GCWhisperFailed.cpp b/src/Core/GCWhisperFailed.cpp index 7c7c3ffb..3cddfa69 100644 --- a/src/Core/GCWhisperFailed.cpp +++ b/src/Core/GCWhisperFailed.cpp @@ -30,7 +30,7 @@ GCWhisperFailed::~GCWhisperFailed() ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GCWhisperFailed::read(SocketInputStream& iStream) @@ -41,7 +41,7 @@ void GCWhisperFailed::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GCWhisperFailed::write(SocketOutputStream& oStream) const diff --git a/src/Core/GCWhisperFailed.h b/src/Core/GCWhisperFailed.h index 9edcb6d5..be7eaa4e 100644 --- a/src/Core/GCWhisperFailed.h +++ b/src/Core/GCWhisperFailed.h @@ -19,8 +19,8 @@ // // class GCWhisperFailed; // -// Ư ڰ ٴ Ŭ̾Ʈ -// ϴ Ŷ ü̴.(CreatureID,X,Y,DIR) Ѵ. +// 게임 서버에서 특정 사용자가 움직였다는 정보를 클라이언트로 보내줄 +// 때 사용하는 패킷 객체이다.(CreatureID,X,Y,DIR) 을 포함한다. // ////////////////////////////////////////////////////////////////////// @@ -34,10 +34,10 @@ class GCWhisperFailed : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -49,7 +49,7 @@ class GCWhisperFailed : public Packet { } // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getPacketSize() const { return 0; } diff --git a/src/Core/GCWhisperHandler.cpp b/src/Core/GCWhisperHandler.cpp index acfcb870..8ca2ea77 100644 --- a/src/Core/GCWhisperHandler.cpp +++ b/src/Core/GCWhisperHandler.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// // -// Ŭ̾Ʈ κ ޽ ޾ Ǵ ޽̴. +// 클라이언트에서 서버로부터 메시지를 받았을때 실행되는 메쏘드이다. // ////////////////////////////////////////////////////////////////////// void GCWhisperHandler::execute(GCWhisper* pPacket, Player* pPlayer) diff --git a/src/Core/GGCommand.cpp b/src/Core/GGCommand.cpp index a7277748..19623c42 100644 --- a/src/Core/GGCommand.cpp +++ b/src/Core/GGCommand.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GGCommand::read(Datagram& iDatagram) @@ -38,7 +38,7 @@ void GGCommand::read(Datagram& iDatagram) ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GGCommand::write(Datagram& oDatagram) const diff --git a/src/Core/GGCommand.h b/src/Core/GGCommand.h index 706515d5..b58340fb 100644 --- a/src/Core/GGCommand.h +++ b/src/Core/GGCommand.h @@ -18,18 +18,18 @@ // // class GGCommand; // -// α ڰ Ϸ , α -//  ּҿ  ڰ  ũó α -// ̴.. ˷ִ Ŷ̴. +// 로그인 서버에서 사용자가 게임 서버로 접속하려고 할 때, 로그인 서버는 +// 그 게임 서버에게 어떤 주소에서 어떤 사용자가 어떤 크리처로 로그인할 +// 것이다.. 라고 알려주는 패킷이다. // // *CAUTION* // -// ũó ̸ ʿѰ? ϴ ǹ ְڴµ, -// 츦 ʿϰ ȴ. α κ Slot3 ij͸ -// س, ؼ SLOT2 ij͸ εش޶ -// ִ ̴. ̸ ؼ, CLSelectPC ij͸ -// ˷ ϸ, CGConnect ij ̵ ؼ -// ٷ εϵ ؾ Ѵ. +// 굳이 크리처 이름이 필요한가? 하는 의문이 있을 수 있겠는데, 다음과 같은 +// 경우를 고려했을때 필요하게 된다. 로그인 서버로부터 Slot3 캐릭터를 선택 +// 해놓고, 실제로 게임 서버에 접속해서는 SLOT2 캐릭터를 로딩해달라고 할 +// 수가 있는 것이다. 이를 막기 위해서, CLSelectPC로 선택한 캐릭터를 +// 게임 서버에게 알려줘야 하며, CGConnect 에서도 캐릭터 아이디를 포함해서 +// 바로 로딩하도록 해야 한다. // //---------------------------------------------------------------------- @@ -37,10 +37,10 @@ class GGCommand : public DatagramPacket { public: GGCommand() {}; ~GGCommand() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(Datagram& iDatagram); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(Datagram& oDatagram) const; // execute packet's handler @@ -105,7 +105,7 @@ class GGCommandFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GGCommandPacketMaxSize , ϶. + // const static GGCommandPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + 80; } diff --git a/src/Core/GGCommandHandler.cpp b/src/Core/GGCommandHandler.cpp index 42fe5a58..9e087edd 100644 --- a/src/Core/GGCommandHandler.cpp +++ b/src/Core/GGCommandHandler.cpp @@ -20,8 +20,8 @@ // // GGCommandHander::execute() // -// α κ GGCommand Ŷ ް Ǹ, -// ReconnectLoginInfo ߰ϰ ȴ. +// 게임 서버가 로그인 서버로부터 GGCommand 패킷을 받게 되면, +// ReconnectLoginInfo를 새로 추가하게 된다. // //---------------------------------------------------------------------- void GGCommandHandler::execute(GGCommand* pPacket) @@ -31,7 +31,7 @@ void GGCommandHandler::execute(GGCommand* pPacket) #ifdef __GAME_SERVER__ - // pPacket ٸ GameServerκ ƿ° Ȯؾ Ѵ. + // pPacket이 다른 GameServer로부터 날아온것인지를 확인해야 한다. cout << "[" << pPacket->getHost().c_str() << ":" << pPacket->getPort() << "] " << pPacket->toString().c_str() << endl; @@ -70,9 +70,9 @@ void GGCommandHandler::execute(GGCommand* pPacket) } - // Լ ÿ Լ - // set type value · ǵȴ. - // 2002.5.8 Ȯ ϱ ؼ + // 각종 함수용 값 세팅용 함수 + // set type value 형태로 정의된다. + // 2002.5.8 별 확률을 자율적으로 조절하기 위해서 만듬 else if (msg.substr(i + 1, 3) == "set") { CGSayHandler::opset(NULL, msg, i); } diff --git a/src/Core/GGGuildChat.cpp b/src/Core/GGGuildChat.cpp index 490d13df..5c33f9cf 100644 --- a/src/Core/GGGuildChat.cpp +++ b/src/Core/GGGuildChat.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GGGuildChat::read(Datagram& iDatagram) @@ -52,7 +52,7 @@ void GGGuildChat::read(Datagram& iDatagram) ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GGGuildChat::write(Datagram& oDatagram) const diff --git a/src/Core/GGGuildChat.h b/src/Core/GGGuildChat.h index 87e64a90..dd6af976 100644 --- a/src/Core/GGGuildChat.h +++ b/src/Core/GGGuildChat.h @@ -22,10 +22,10 @@ class GGGuildChat : public DatagramPacket { public: - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(Datagram& iDatagram); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(Datagram& oDatagram) const; // execute packet's handler @@ -135,7 +135,7 @@ class GGGuildChatFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GGGuildChatPacketMaxSize , ϶. + // const static GGGuildChatPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + szGuildID + // GuildID szBYTE + 10 + // Sender diff --git a/src/Core/GGGuildChatHandler.cpp b/src/Core/GGGuildChatHandler.cpp index 1cb1cde2..e938bf36 100644 --- a/src/Core/GGGuildChatHandler.cpp +++ b/src/Core/GGGuildChatHandler.cpp @@ -57,7 +57,7 @@ void GGGuildChatHandler::execute(GGGuildChat* pPacket) #ifdef __GAME_SERVER__ - // ´. + // 길드의 현재 접속 중인 멤버를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); if (pGuild == NULL) { @@ -65,7 +65,7 @@ void GGGuildChatHandler::execute(GGGuildChat* pPacket) return; } - // ä Ŷ . + // 길드 채팅 패킷을 만든다. GCGuildChat gcGuildChat; gcGuildChat.setType(pPacket->getType()); gcGuildChat.setSendGuildName(pGuild->getName()); @@ -76,7 +76,7 @@ void GGGuildChatHandler::execute(GGGuildChat* pPacket) if (pPacket->getType() == 0) { broadcastGuild(pGuild, &gcGuildChat); } else { - // ä + // 연합 채팅 GuildUnion* pUnion = GuildUnionManager::Instance().getGuildUnion(pGuild->getID()); if (pUnion == NULL) { broadcastGuild(pGuild, &gcGuildChat); diff --git a/src/Core/GGServerChat.cpp b/src/Core/GGServerChat.cpp index adfcb4ed..a220a454 100644 --- a/src/Core/GGServerChat.cpp +++ b/src/Core/GGServerChat.cpp @@ -2,7 +2,7 @@ // // Filename : GGServerChat.cpp // Written By : inthesky -// Description : Whisper Chat Ѵ. +// Description : 서버간 Whisper Chat을 수행한다. // ////////////////////////////////////////////////////////////////////// @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GGServerChat::read(Datagram& iDatagram) @@ -53,7 +53,7 @@ void GGServerChat::read(Datagram& iDatagram) ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GGServerChat::write(Datagram& oDatagram) const diff --git a/src/Core/GGServerChat.h b/src/Core/GGServerChat.h index 46a28371..b420b102 100644 --- a/src/Core/GGServerChat.h +++ b/src/Core/GGServerChat.h @@ -3,7 +3,7 @@ // // Filename : GGServerChat.h // Written By : inthesky -// Description : Whisper ChatѴ. +// Description : 서버간 Whisper Chat수행한다. // //---------------------------------------------------------------------- @@ -25,10 +25,10 @@ class GGServerChat : public DatagramPacket { public: GGServerChat() {}; ~GGServerChat() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(Datagram& iDatagram); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(Datagram& oDatagram) const; // execute packet's handler @@ -143,7 +143,7 @@ class GGServerChatFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GGServerChatPacketMaxSize , ϶. + // const static GGServerChatPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + 10 + // Sender szBYTE + 10 + // Receiver diff --git a/src/Core/GGServerChatHandler.cpp b/src/Core/GGServerChatHandler.cpp index 0efcc7c4..67665507 100644 --- a/src/Core/GGServerChatHandler.cpp +++ b/src/Core/GGServerChatHandler.cpp @@ -2,7 +2,7 @@ // // Filename : GGServerChatHandler.cpp // Written By : inthesky -// Description : Whisper Chat Ѵ. +// Description : 서버간 Whisper Chat을 수행한다. // //---------------------------------------------------------------------- diff --git a/src/Core/GLIncomingConnection.cpp b/src/Core/GLIncomingConnection.cpp index 49e0fdd8..aa46ab5f 100644 --- a/src/Core/GLIncomingConnection.cpp +++ b/src/Core/GLIncomingConnection.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GLIncomingConnection::read(Datagram& iDatagram) { __BEGIN_TRY @@ -51,7 +51,7 @@ void GLIncomingConnection::read(Datagram& iDatagram) { ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GLIncomingConnection::write(Datagram& oDatagram) const { __BEGIN_TRY diff --git a/src/Core/GLIncomingConnection.h b/src/Core/GLIncomingConnection.h index 94aea999..ca9b5772 100644 --- a/src/Core/GLIncomingConnection.h +++ b/src/Core/GLIncomingConnection.h @@ -18,18 +18,18 @@ // // class GLIncomingConnection; // -// α ڰ Ϸ , α -//  ּҿ  ڰ  ũó α -// ̴.. ˷ִ Ŷ̴. +// 로그인 서버에서 사용자가 게임 서버로 접속하려고 할 때, 로그인 서버는 +// 그 게임 서버에게 어떤 주소에서 어떤 사용자가 어떤 크리처로 로그인할 +// 것이다.. 라고 알려주는 패킷이다. // // *CAUTION* // -// ũó ̸ ʿѰ? ϴ ǹ ְڴµ, -// 츦 ʿϰ ȴ. α κ Slot3 ij͸ -// س, ؼ SLOT2 ij͸ εش޶ -// ִ ̴. ̸ ؼ, CLSelectPC ij͸ -// ˷ ϸ, CGConnect ij ̵ ؼ -// ٷ εϵ ؾ Ѵ. +// 굳이 크리처 이름이 필요한가? 하는 의문이 있을 수 있겠는데, 다음과 같은 +// 경우를 고려했을때 필요하게 된다. 로그인 서버로부터 Slot3 캐릭터를 선택 +// 해놓고, 실제로 게임 서버에 접속해서는 SLOT2 캐릭터를 로딩해달라고 할 +// 수가 있는 것이다. 이를 막기 위해서, CLSelectPC로 선택한 캐릭터를 +// 게임 서버에게 알려줘야 하며, CGConnect 에서도 캐릭터 아이디를 포함해서 +// 바로 로딩하도록 해야 한다. // //---------------------------------------------------------------------- @@ -37,10 +37,10 @@ class GLIncomingConnection : public DatagramPacket { public: GLIncomingConnection() {}; ~GLIncomingConnection() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(Datagram& iDatagram); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(Datagram& oDatagram) const; // execute packet's handler @@ -86,7 +86,7 @@ class GLIncomingConnection : public DatagramPacket { // Player ID string m_PlayerID; - // Ŭ̾Ʈ IP + // 클라이언트의 IP string m_ClientIP; }; @@ -118,7 +118,7 @@ class GLIncomingConnectionFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GLIncomingConnectionPacketMaxSize , ϶. + // const static GLIncomingConnectionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return +szBYTE + 20 // creature name + szBYTE + 15; // client ip diff --git a/src/Core/GLIncomingConnectionError.cpp b/src/Core/GLIncomingConnectionError.cpp index b70139af..1d9057a9 100644 --- a/src/Core/GLIncomingConnectionError.cpp +++ b/src/Core/GLIncomingConnectionError.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GLIncomingConnectionError::read(Datagram& iDatagram) @@ -53,7 +53,7 @@ void GLIncomingConnectionError::read(Datagram& iDatagram) ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GLIncomingConnectionError::write(Datagram& oDatagram) const { __BEGIN_TRY diff --git a/src/Core/GLIncomingConnectionError.h b/src/Core/GLIncomingConnectionError.h index 0175d0ad..cacbf746 100644 --- a/src/Core/GLIncomingConnectionError.h +++ b/src/Core/GLIncomingConnectionError.h @@ -24,10 +24,10 @@ class GLIncomingConnectionError : public DatagramPacket { public: GLIncomingConnectionError() {}; ~GLIncomingConnectionError() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(Datagram& iDatagram); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(Datagram& oDatagram) const; // execute packet's handler @@ -103,7 +103,7 @@ class GLIncomingConnectionErrorFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GLIncomingConnectionErrorPacketMaxSize , ϶. + // const static GLIncomingConnectionErrorPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + 128; } diff --git a/src/Core/GLIncomingConnectionHandler.cpp b/src/Core/GLIncomingConnectionHandler.cpp index 0a243493..a23d5139 100644 --- a/src/Core/GLIncomingConnectionHandler.cpp +++ b/src/Core/GLIncomingConnectionHandler.cpp @@ -24,8 +24,8 @@ // // GLIncomingConnectionHander::execute() // -// α κ GLIncomingConnection Ŷ ް Ǹ, -// ReconnectLoginInfo ߰ϰ ȴ. +// 게임 서버가 로그인 서버로부터 GLIncomingConnection 패킷을 받게 되면, +// ReconnectLoginInfo를 새로 추가하게 된다. // //---------------------------------------------------------------------- void GLIncomingConnectionHandler::execute(GLIncomingConnection* pPacket) @@ -37,33 +37,33 @@ void GLIncomingConnectionHandler::execute(GLIncomingConnection* pPacket) //-------------------------------------------------------------------------------- // - // Ű Ѵ. + // 인증키를 생성한다. // // *NOTE* // - // α Ű ؼ Ӽ , Ŭ̾Ʈ - // ߴ. ̷ CLSelectPCHandler::execute() Ű ϰ - // GLIncomingConnectionOKHandler::execute() Ű Ŭ̾Ʈ Ǵµ, - // ó ޽尡 ٸǷ Ű 𿡼 Ǿ Ѵ. ܼ α - // ÷̾ ü ϸ Ǵµ.. ϴ. Ǵٸ ٽ - // α Ű ǵִ ε, ̴ Ʈũ Ű 2ȸ պѴٴ - // ʿϴ. + // 기존의 방식은 로그인 서버에서 인증키를 생성해서 게임서버에 보낸 후, 클라이언트로 + // 전송했다. 이렇게 할 경우 CLSelectPCHandler::execute()에서 인증키를 생성하고 + // GLIncomingConnectionOKHandler::execute()에서 인증키를 클라이언트로 보내게 되는데, + // 처리 메쏘드가 다르므로 키값이 어디에선가 유지되어야 한다. 가장 단순한 방법은 로그인 + // 플레이어 객체에 저장하면 되는데.. 뭔가 꾸지하다. 또다른 방법은 게임 서버에서 다시 + // 로그인 서버로 키값을 되돌려주는 것인데, 이는 네트워크상에 키값이 2회 왕복한다는 + // 점에서 불필요하다. // - // , α ؼ Ӽ ִ ξ ȴ. + // 따라서, 로그인 서버에서 생성해서 게임서버에 보내주는 편이 훨씬 깔끔해지게 된다. // // *TODO* // - // ־ , óƮũ ۸ؼ Ű ִ. (ϱ Ʈ - // н尡 ɼ ִµ.. - -; ̷ ž SSL ϴ°Ű..) - // ̸ ؼ GLIncomingConnectionOK Ŷ ȣȭǾ Ѵ. + // 최악의 경우, 로컬네트워크가 스니퍼링당해서 키값이 유출될 수 있다. (하긴 뭐 루트 + // 패스워드가 유출될 가능성도 있는데.. - -; 이런 거야 SSL을 써야 하는거고..) + // 이를 대비해서 GLIncomingConnectionOK 패킷은 암호화되어야 한다. // - // Ű Ұؾ Ѵ. ( ڵ带 .) + // 또한 키값은 예측불가능해야 한다. (어차피 코드를 보면 예측가능해진다.) // //-------------------------------------------------------------------------------- DWORD authKey = rand() << (time(0) % 10) + rand() >> (time(0) % 10); - // CI ü Ѵ. + // CI 객체를 생성한다. ReconnectLoginInfo* pReconnectLoginInfo = new ReconnectLoginInfo(); pReconnectLoginInfo->setClientIP(pPacket->getClientIP()); pReconnectLoginInfo->setPlayerID(pPacket->getPlayerID()); @@ -71,11 +71,11 @@ void GLIncomingConnectionHandler::execute(GLIncomingConnection* pPacket) //-------------------------------------------------------------------------------- // - // ð + 30 ĸ expire time Ѵ. + // 현재 시간 + 30 초 후를 expire time 으로 설정한다. // // *TODO* // - // expire period Config Ͽ ָ ڴ. + // expire period 역시 Config 파일에서 지정해주면 좋겠다. // //-------------------------------------------------------------------------------- Timeval currentTime; @@ -89,10 +89,10 @@ void GLIncomingConnectionHandler::execute(GLIncomingConnection* pPacket) // << authKey << endl; try { - // RLIM ߰Ѵ. + // RLIM 에 추가한다. g_pReconnectLoginInfoManager->addReconnectLoginInfo(pReconnectLoginInfo); - // α ٽ ˷ش. + // 로그인 서버에게 다시 알려준다. LGIncomingConnectionOK lgIncomingConnectionOK; lgIncomingConnectionOK.setPlayerID(pPacket->getPlayerID()); lgIncomingConnectionOK.setTCPPort(g_pConfig->getPropertyInt("LoginServerPort")); @@ -104,7 +104,7 @@ void GLIncomingConnectionHandler::execute(GLIncomingConnection* pPacket) } catch (DuplicatedException& de) { // cout << "Duplicated Exception Throwed Step 1" << endl; - // CI ϰ, α GLIncomingConnectionError Ŷ Ѵ. + // 실패했을 경우 CI 를 삭제하고, 로그인 서버에게 GLIncomingConnectionError 패킷을 전송한다. SAFE_DELETE(pReconnectLoginInfo); // cout << "Duplicated Exception Throwed Step 2" << endl; diff --git a/src/Core/GLIncomingConnectionOK.cpp b/src/Core/GLIncomingConnectionOK.cpp index 69dd9eec..da408ac6 100644 --- a/src/Core/GLIncomingConnectionOK.cpp +++ b/src/Core/GLIncomingConnectionOK.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GLIncomingConnectionOK::read(Datagram& iDatagram) { __BEGIN_TRY @@ -46,7 +46,7 @@ void GLIncomingConnectionOK::read(Datagram& iDatagram) { ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GLIncomingConnectionOK::write(Datagram& oDatagram) const diff --git a/src/Core/GLIncomingConnectionOK.h b/src/Core/GLIncomingConnectionOK.h index 27a1446a..7cb5919c 100644 --- a/src/Core/GLIncomingConnectionOK.h +++ b/src/Core/GLIncomingConnectionOK.h @@ -24,10 +24,10 @@ class GLIncomingConnectionOK : public DatagramPacket { public: GLIncomingConnectionOK() {}; ~GLIncomingConnectionOK() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(Datagram& iDatagram); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(Datagram& oDatagram) const; // execute packet's handler @@ -77,14 +77,14 @@ class GLIncomingConnectionOK : public DatagramPacket { } private: - //  ÷̾ LCReconnect Ŷ ϴ ˾ƾ Ѵ. + // 어떤 플레이어에게 LCReconnect 패킷을 보내야 하는지는 알아야 한다. string m_PlayerID; - // ڽ TCP Ʈ ˷ν - // α TCP Ʈ ϴ. + // 게임 서버가 자신의 TCP 포트를 알려줌으로써 + // 로그인 서버는 게임 서버의 TCP 포트를 몰라도 무방하다. uint m_TCPPort; - // Ű + // 게임 서버에서 생성한 인증 키 DWORD m_Key; }; @@ -116,7 +116,7 @@ class GLIncomingConnectionOKFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GLIncomingConnectionOKPacketMaxSize , ϶. + // const static GLIncomingConnectionOKPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + 20 + szuint + szDWORD; } diff --git a/src/Core/GLIncomingConnectionOKHandler.cpp b/src/Core/GLIncomingConnectionOKHandler.cpp index 840275d9..53d8614b 100644 --- a/src/Core/GLIncomingConnectionOKHandler.cpp +++ b/src/Core/GLIncomingConnectionOKHandler.cpp @@ -22,9 +22,9 @@ // // GLIncomingConnectionOKHander::execute() // -// κ GLIncomingConnectionOK Ŷ ƿ, α 㰡 -// ÷̾ 㰡 ãƳ Ѵ. , ÷̾ LCReconnect -// Ŷ Ѵ. +// 게임 서버로부터 GLIncomingConnectionOK 패킷이 날아오면, 로그인 서버는 이 허가가 +// 어느 플레이어에 대한 허가인지 찾아내야 한다. 그 후, 이 플레이어에게 LCReconnect +// 패킷을 던져줘야 한다. // //-------------------------------------------------------------------------------- void GLIncomingConnectionOKHandler::execute(GLIncomingConnectionOK* pPacket) @@ -35,7 +35,7 @@ void GLIncomingConnectionOKHandler::execute(GLIncomingConnectionOK* pPacket) try { - // ÷̾ ̵ ؼ ÷̾ ü Ѵ. + // 플레이어 아이디를 사용해서 플레이어 객체에 접근한다. __ENTER_CRITICAL_SECTION((*g_pLoginPlayerManager)) LoginPlayer* pLoginPlayer = g_pLoginPlayerManager->getPlayer_NOLOCKED(pPacket->getPlayerID()); @@ -52,7 +52,7 @@ void GLIncomingConnectionOKHandler::execute(GLIncomingConnectionOK* pPacket) lcReconnect.setGameServerPort(pPacket->getTCPPort()); lcReconnect.setKey(pPacket->getKey()); - // LCReconnect Ŷ Ѵ. + // LCReconnect 패킷을 전송한다. pLoginPlayer->sendPacket(&lcReconnect); // cout << "GLIncomingConnectionOKHandler Send to Client Required Reconnect ServerIP : " << @@ -61,14 +61,14 @@ void GLIncomingConnectionOKHandler::execute(GLIncomingConnectionOK* pPacket) // cout << "Invalid Player Status.. must be AFTER_SENDING_LG_INCOMING_CONNECTION" << endl; } - // Ѵ. + // 연결을 종료한다. // pLoginPlayer->disconnect(UNDISCONNECTED); pLoginPlayer->disconnect_nolog(UNDISCONNECTED); - // LPM Ѵ. + // LPM에서 삭제한다. g_pLoginPlayerManager->deletePlayer_NOLOCKED(pLoginPlayer->getSocket()->getSOCKET()); - // LoginPlayer ü Ѵ. + // LoginPlayer 객체를 삭제한다. SAFE_DELETE(pLoginPlayer); __LEAVE_CRITICAL_SECTION((*g_pLoginPlayerManager)) diff --git a/src/Core/GLKickVerify.cpp b/src/Core/GLKickVerify.cpp index 08cd9185..eda3f61f 100644 --- a/src/Core/GLKickVerify.cpp +++ b/src/Core/GLKickVerify.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GLKickVerify::read(Datagram& iDatagram) @@ -45,7 +45,7 @@ void GLKickVerify::read(Datagram& iDatagram) ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GLKickVerify::write(Datagram& oDatagram) const diff --git a/src/Core/GLKickVerify.h b/src/Core/GLKickVerify.h index 2b048df6..4ad11621 100644 --- a/src/Core/GLKickVerify.h +++ b/src/Core/GLKickVerify.h @@ -18,8 +18,8 @@ // // class GLKickVerify; // -// '̹ ' ذϱ ... -// LGKickCharacter ϴ Ŷ̴. +// '이미 접속 중' 문제를 해결하기 위한... +// LGKickCharacter에 대응하는 결과 패킷이다. // //---------------------------------------------------------------------- @@ -27,10 +27,10 @@ class GLKickVerify : public DatagramPacket { public: GLKickVerify() {}; ~GLKickVerify() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(Datagram& iDatagram); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(Datagram& oDatagram) const; // execute packet's handler @@ -116,7 +116,7 @@ class GLKickVerifyFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GLKickVerifyPacketMaxSize , ϶. + // const static GLKickVerifyPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + szBYTE + 20 + szuint; } diff --git a/src/Core/GLKickVerifyHandler.cpp b/src/Core/GLKickVerifyHandler.cpp index 43610b8e..d5639ae3 100644 --- a/src/Core/GLKickVerifyHandler.cpp +++ b/src/Core/GLKickVerifyHandler.cpp @@ -22,8 +22,8 @@ // // GLKickVerifyHander::execute() // -// α κ GLKickVerify Ŷ ް Ǹ, -// ReconnectLoginInfo ߰ϰ ȴ. +// 게임 서버가 로그인 서버로부터 GLKickVerify 패킷을 받게 되면, +// ReconnectLoginInfo를 새로 추가하게 된다. // //---------------------------------------------------------------------- void GLKickVerifyHandler::execute(GLKickVerify* pPacket) @@ -42,9 +42,9 @@ void GLKickVerifyHandler::execute(GLKickVerify* pPacket) Player* pPlayer = ((PlayerManager*)g_pLoginPlayerManager)->getPlayer(pPacket->getID()); LoginPlayer* pLoginPlayer = dynamic_cast(pPlayer); - if (pLoginPlayer != NULL) // NoSuch ϱ ϴ ص .. + if (pLoginPlayer != NULL) // NoSuch 사용하기 때문에 일단은 안해도 되지만.. { - // ij ̸ ƾ Ѵ. + // 캐릭터 이름이 같아야 한다. const string& name1 = pLoginPlayer->getLastCharacterName(); const string& name2 = pPacket->getPCName(); @@ -56,13 +56,13 @@ void GLKickVerifyHandler::execute(GLKickVerify* pPacket) // } // cout << "-_-" << endl; } else { - // ̴. Ű . + // 딴 사람이다. 신경 쓸거 없다. } } g_pLoginPlayerManager->unlock(); - } catch (Throwable&) { // (NoSuchException&) { // ǹ̾. + } catch (Throwable&) { // (NoSuchException&) { // 의미없겠지. g_pLoginPlayerManager->unlock(); } diff --git a/src/Core/GMServerInfoHandler.cpp b/src/Core/GMServerInfoHandler.cpp index f15e7186..758dbbba 100644 --- a/src/Core/GMServerInfoHandler.cpp +++ b/src/Core/GMServerInfoHandler.cpp @@ -20,8 +20,8 @@ // // GMServerInfoHander::execute() // -// α κ GMServerInfo Ŷ ް Ǹ, -// ReconnectLoginInfo ߰ϰ ȴ. +// 게임 서버가 로그인 서버로부터 GMServerInfo 패킷을 받게 되면, +// ReconnectLoginInfo를 새로 추가하게 된다. // //---------------------------------------------------------------------- void GMServerInfoHandler::execute(GMServerInfo* pPacket) diff --git a/src/Core/GSAddGuild.cpp b/src/Core/GSAddGuild.cpp index 359ebfcd..c0069022 100644 --- a/src/Core/GSAddGuild.cpp +++ b/src/Core/GSAddGuild.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GSAddGuild::read(SocketInputStream& iStream) @@ -54,7 +54,7 @@ void GSAddGuild::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GSAddGuild::write(SocketOutputStream& oStream) const diff --git a/src/Core/GSAddGuild.h b/src/Core/GSAddGuild.h index 36d4024a..e3d53eb0 100644 --- a/src/Core/GSAddGuild.h +++ b/src/Core/GSAddGuild.h @@ -18,7 +18,7 @@ // // class GSAddGuild; // -// ߰ ûѴ. +// 팀이 추가를 쉐어드 서버에 요청한다. // // *CAUTION* // @@ -28,10 +28,10 @@ class GSAddGuild : public Packet { public: GSAddGuild() {}; ~GSAddGuild() {}; - // Stream ü Ÿ о Ŷ ʱȭѴ. + // Stream 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // Stream ü Ŷ ̳ʸ ̹ . + // Stream 객체로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -161,7 +161,7 @@ class GSAddGuildFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionPacketMaxSize , ϶. + // const static LGIncomingConnectionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + // guild name length 30 + // guild name max length diff --git a/src/Core/GSAddGuildHandler.cpp b/src/Core/GSAddGuildHandler.cpp index 37881f83..dd77c67f 100644 --- a/src/Core/GSAddGuildHandler.cpp +++ b/src/Core/GSAddGuildHandler.cpp @@ -35,7 +35,7 @@ void GSAddGuildHandler::execute(GSAddGuild* pPacket, Player* pPlayer) Assert(pPacket != NULL); - // ƽ ID + 1 ID ϰ ƽ ID Ų + // 현재 길드의 맥스 ID + 1 을 길드 ID 로 하고 맥스 ID 를 증가 시킨다 GuildID_t GuildID = Guild::getMaxGuildID() + 1; Guild::setMaxGuildID(GuildID); @@ -43,7 +43,7 @@ void GSAddGuildHandler::execute(GSAddGuild* pPacket, Player* pPlayer) // cout << pPacket->toString().c_str() << endl; - // ƽ ID Ѵ. + // 맥스 존 ID 를 구한다. if (pPacket->getGuildRace() == Guild::GUILD_RACE_SLAYER) { zoneID = Guild::getMaxSlayerZoneID(); Guild::setMaxSlayerZoneID(zoneID + 1); @@ -57,7 +57,7 @@ void GSAddGuildHandler::execute(GSAddGuild* pPacket, Player* pPlayer) return; } - // Guild Object + // Guild Object 를 만든다 Guild* pGuild = new Guild(); pGuild->setID(GuildID); pGuild->setName(pPacket->getGuildName()); @@ -68,25 +68,25 @@ void GSAddGuildHandler::execute(GSAddGuild* pPacket, Player* pPlayer) pGuild->setMaster(pPacket->getGuildMaster()); pGuild->setIntro(pPacket->getGuildIntro()); - // 带 ִ´ + // 만든 길드를 디비에 넣는다 pGuild->create(); - // Ŵ ߰Ѵ. + // 길드 매니저에 추가한다. g_pGuildManager->addGuild(pGuild); - // ͸ ߰Ѵ. + // 마스터를 길드 멤버로 추가한다. GuildMember* pGuildMember = new GuildMember(); pGuildMember->setGuildID(pGuild->getID()); pGuildMember->setName(pGuild->getMaster()); pGuildMember->setRank(GuildMember::GUILDMEMBER_RANK_MASTER); - // DB Guild Member Ѵ. + // DB 에 Guild Member 를 저장한다. pGuildMember->create(); - // 忡 ߰Ѵ. + // 길드에 추가한다. pGuild->addMember(pGuildMember); - // Ŷ . + // 게임 서버로 보낼 패킷을 만든다. SGAddGuildOK sgAddGuildOK; sgAddGuildOK.setGuildID(pGuild->getID()); sgAddGuildOK.setGuildName(pGuild->getName()); @@ -97,7 +97,7 @@ void GSAddGuildHandler::execute(GSAddGuild* pPacket, Player* pPlayer) sgAddGuildOK.setGuildMaster(pGuild->getMaster()); sgAddGuildOK.setGuildIntro(pGuild->getIntro()); - // Ŷ . + // 게임 서버로 패킷을 보낸다. g_pGameServerManager->broadcast(&sgAddGuildOK); SGAddGuildMemberOK sgAddGuildMemberOK; @@ -106,7 +106,7 @@ void GSAddGuildHandler::execute(GSAddGuild* pPacket, Player* pPlayer) sgAddGuildMemberOK.setGuildMemberRank(pGuildMember->getRank()); sgAddGuildMemberOK.setServerGroupID(pPacket->getServerGroupID()); - // Ŷ . + // 게임 서버로 패킷을 보낸다. g_pGameServerManager->broadcast(&sgAddGuildMemberOK); #endif diff --git a/src/Core/GSAddGuildMember.cpp b/src/Core/GSAddGuildMember.cpp index ce4c2211..431b92dc 100644 --- a/src/Core/GSAddGuildMember.cpp +++ b/src/Core/GSAddGuildMember.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GSAddGuildMember::read(SocketInputStream& iStream) @@ -44,7 +44,7 @@ void GSAddGuildMember::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GSAddGuildMember::write(SocketOutputStream& oStream) const diff --git a/src/Core/GSAddGuildMember.h b/src/Core/GSAddGuildMember.h index a84379f1..a894186d 100644 --- a/src/Core/GSAddGuildMember.h +++ b/src/Core/GSAddGuildMember.h @@ -18,7 +18,7 @@ // // class GSAddGuildMember; // -// ߰ ûѴ. +// 길드 멤버 추가를 쉐어드 서버에 요청한다. // // *CAUTION* // @@ -28,10 +28,10 @@ class GSAddGuildMember : public Packet { public: GSAddGuildMember() {}; ~GSAddGuildMember() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -106,7 +106,7 @@ class GSAddGuildMember : public Packet { // Guild ID GuildID_t m_GuildID; - // ̸ + // 멤버 이름 string m_Name; // Guild Member Rank @@ -147,7 +147,7 @@ class GSAddGuildMemberFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionPacketMaxSize , ϶. + // const static LGIncomingConnectionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID + // guild id szBYTE + // member name length diff --git a/src/Core/GSAddGuildMemberHandler.cpp b/src/Core/GSAddGuildMemberHandler.cpp index 004c1f7a..83589cd6 100644 --- a/src/Core/GSAddGuildMemberHandler.cpp +++ b/src/Core/GSAddGuildMemberHandler.cpp @@ -43,27 +43,27 @@ void GSAddGuildMemberHandler::execute(GSAddGuildMember* pPacket, Player* pPlayer pGuildMember->setRequestDateTime(VSDateTime::currentDateTime()); } - // DB Guild Member Ѵ. + // DB 에 Guild Member 를 저장한다. pGuildMember->create(); - // Guild Member Intro DB Ѵ. + // Guild Member Intro 를 DB에 저장한다. pGuildMember->saveIntro(pPacket->getGuildMemberIntro()); - // 忡 ߰Ѵ. + // 길드에 추가한다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); pGuild->addMember(pGuildMember); - // Ŷ . + // 게임 서버로 보낼 패킷을 만든다. SGAddGuildMemberOK sgAddGuildMemberOK; sgAddGuildMemberOK.setGuildID(pGuildMember->getGuildID()); sgAddGuildMemberOK.setName(pGuildMember->getName()); sgAddGuildMemberOK.setGuildMemberRank(pGuildMember->getRank()); sgAddGuildMemberOK.setServerGroupID(pPacket->getServerGroupID()); - // Ŷ . + // 게임 서버로 패킷을 보낸다. g_pGameServerManager->broadcast(&sgAddGuildMemberOK); - // ̰ 5 ̻ Ǹ 尡 ȴ. + // 등록 대기 길드이고 길드원이 5명 이상이 되면 정식 길드가 된다. if (pGuild->getState() == Guild::GUILD_STATE_WAIT && pGuild->getActiveMemberCount() > 4) { HashMapGuildMember& Members = pGuild->getMembers(); HashMapGuildMemberItor itr = Members.begin(); @@ -71,8 +71,8 @@ void GSAddGuildMemberHandler::execute(GSAddGuildMember* pPacket, Player* pPlayer pGuildMember = itr->second; /////////////////////////////////////////////////////////////////////////// - // DB Slayer, Vampire, Ousters ̺ GuildID ٲ۴. - // DB Message ߰Ѵ. + // DB에 Slayer, Vampire, Ousters 테이블의 GuildID를 바꾼다. + // DB에 Message를 추가한다. /////////////////////////////////////////////////////////////////////////// Statement* pStmt = NULL; BEGIN_DB { diff --git a/src/Core/GSExpelGuildMember.h b/src/Core/GSExpelGuildMember.h index 3e3dda09..42c22543 100644 --- a/src/Core/GSExpelGuildMember.h +++ b/src/Core/GSExpelGuildMember.h @@ -18,7 +18,7 @@ // // class GSExpelGuildMember; // -// ߰ ûѴ. +// 팀이 추가를 쉐어드 서버에 요청한다. // // *CAUTION* // @@ -28,10 +28,10 @@ class GSExpelGuildMember : public Packet { public: GSExpelGuildMember() {}; ~GSExpelGuildMember() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -123,7 +123,7 @@ class GSExpelGuildMemberFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionPacketMaxSize , ϶. + // const static LGIncomingConnectionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID + // guild ID szBYTE + // name length diff --git a/src/Core/GSExpelGuildMemberHandler.cpp b/src/Core/GSExpelGuildMemberHandler.cpp index 9acb397a..2596a2ed 100644 --- a/src/Core/GSExpelGuildMemberHandler.cpp +++ b/src/Core/GSExpelGuildMemberHandler.cpp @@ -37,24 +37,24 @@ void GSExpelGuildMemberHandler::execute(GSExpelGuildMember* pPacket, Player* pPl Assert(pPacket != NULL); - // ÷̾ 带 ´. + // 플레이어가 속한 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); // try { Assert(pGuild != NULL); } catch (Throwable& ) { return; } if (pGuild == NULL) return; - // ÷̾ ȮѴ. + // 플레이어가 길드의 멤버인지 확인한다. GuildMember* pGuildMember = pGuild->getMember(pPacket->getName()); // try { Assert(pGuildMember != NULL); } catch (Throwable& ) { return; } if (pGuildMember == NULL) return; - // Ż α׸ . + // 길드 탈퇴 로그를 남긴다. filelog("GuildExit.log", "GuildID: %d, GuildName: %s, Expel: %s, By: %s", pGuild->getID(), pGuild->getName().c_str(), pPacket->getName().c_str(), pPacket->getSender().c_str()); /////////////////////////////////////////////////////////////////// - // DB Slayer, Vampire, Ousters ̺ GuildID ٲ۴. + // DB에 Slayer, Vampire, Ousters 테이블의 GuildID 를 바꾼다. /////////////////////////////////////////////////////////////////// Statement* pStmt = NULL; BEGIN_DB { @@ -72,28 +72,28 @@ void GSExpelGuildMemberHandler::execute(GSExpelGuildMember* pPacket, Player* pPl } END_DB(pStmt) - // Guild Member expire Ų. + // Guild Member 를 expire 시킨다. pGuildMember->expire(); - // Guild Ѵ. + // Guild 에서 삭제한다. pGuild->deleteMember(pGuildMember->getName()); - // Ŷ . + // 게임 서버로 보낼 패킷을 만든다. SGExpelGuildMemberOK sgExpelGuildMemberOK; sgExpelGuildMemberOK.setGuildID(pGuild->getID()); sgExpelGuildMemberOK.setName(pPacket->getName()); sgExpelGuildMemberOK.setSender(pPacket->getSender()); - // Ŷ . + // 게임 서버로 패킷을 보낸다. g_pGameServerManager->broadcast(&sgExpelGuildMemberOK); - // ο 5 ̸ 带 Ѵ. + // 길드 인원이 5명 미만이 될 경우 길드를 삭제한다. if (pGuild->getState() == Guild::GUILD_STATE_ACTIVE && pGuild->getActiveMemberCount() < MIN_GUILDMEMBER_COUNT) { - // α׸ . + // 길드 삭제 로그를 남긴다. filelog("GuildBroken.log", "GuildID: %d, GuildName: %s, MemberCount: %d, Expel: %s", pGuild->getID(), pGuild->getName().c_str(), pGuild->getActiveMemberCount(), pPacket->getName().c_str()); - // expire and delete + // 길드 멤버 expire and delete HashMapGuildMember& Members = pGuild->getMembers(); HashMapGuildMemberItor itr = Members.begin(); @@ -104,7 +104,7 @@ void GSExpelGuildMemberHandler::execute(GSExpelGuildMember* pPacket, Player* pPl GuildMember* pGuildMember = itr->second; /////////////////////////////////////////////////////////////////// - // DB Slayer, Vampire, Ousters ̺ GuildID ٲ۴. + // DB에 Slayer, Vampire, Ousters 테이블의 GuildID 를 바꾼다. /////////////////////////////////////////////////////////////////// if (pGuild->getRace() == Guild::GUILD_RACE_SLAYER) { pStmt->executeQuery("UPDATE Slayer SET GuildID = 99 WHERE Name = '%s'", @@ -117,12 +117,12 @@ void GSExpelGuildMemberHandler::execute(GSExpelGuildMember* pPacket, Player* pPl pGuildMember->getName().c_str()); } - // expire Ų. + // 길드 멤버를 expire 시킨다. pGuildMember->expire(); - // DB Ѵ. + // 완전히 DB에서 제거한다. // pGuildMember->destroy(); - // + // 길드 멤버를 삭제 SAFE_DELETE(pGuildMember); } @@ -132,14 +132,14 @@ void GSExpelGuildMemberHandler::execute(GSExpelGuildMember* pPacket, Player* pPl Members.clear(); - // 带 Ѵ + // 길드를 삭제한다 pGuild->setState(Guild::GUILD_STATE_BROKEN); pGuild->save(); SAFE_DELETE(pGuild); g_pGuildManager->deleteGuild(pPacket->getGuildID()); - // 带 ϵ Ŷ . + // 길드를 삭제하도록 패킷을 보낸다. SGDeleteGuildOK sgDeleteGuildOK; sgDeleteGuildOK.setGuildID(pPacket->getGuildID()); diff --git a/src/Core/GSGuildMemberLogOn.cpp b/src/Core/GSGuildMemberLogOn.cpp index 5c85535f..323edb3b 100644 --- a/src/Core/GSGuildMemberLogOn.cpp +++ b/src/Core/GSGuildMemberLogOn.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GSGuildMemberLogOn::read(SocketInputStream& iStream) @@ -37,7 +37,7 @@ void GSGuildMemberLogOn::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GSGuildMemberLogOn::write(SocketOutputStream& oStream) const diff --git a/src/Core/GSGuildMemberLogOnHandler.cpp b/src/Core/GSGuildMemberLogOnHandler.cpp index 75b8e03e..3a8c030d 100644 --- a/src/Core/GSGuildMemberLogOnHandler.cpp +++ b/src/Core/GSGuildMemberLogOnHandler.cpp @@ -35,13 +35,13 @@ void GSGuildMemberLogOnHandler::execute(GSGuildMemberLogOn* pPacket, Player* pPl Assert(pPacket != NULL); - // 带 ´. + // 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); // try { Assert(pGuild != NULL); } catch (Throwable& ) { return; } if (pGuild == NULL) return; - // ȮѴ. + // 길드의 멤버인지 확인한다. GuildMember* pGuildMember = pGuild->getMember(pPacket->getName()); // try { Assert(pGuildMember != NULL); } catch (Throwable& ) { return; } if (pGuildMember == NULL) @@ -49,7 +49,7 @@ void GSGuildMemberLogOnHandler::execute(GSGuildMemberLogOn* pPacket, Player* pPl pGuildMember->setLogOn(pPacket->getLogOn()); - // Ŷ . + // 게임 서버로 보낼 패킷을 만든다. SGGuildMemberLogOnOK sgGuildMemberLogOnOK; sgGuildMemberLogOnOK.setGuildID(pGuild->getID()); sgGuildMemberLogOnOK.setName(pPacket->getName()); @@ -57,7 +57,7 @@ void GSGuildMemberLogOnHandler::execute(GSGuildMemberLogOn* pPacket, Player* pPl sgGuildMemberLogOnOK.setServerID(pPacket->getServerID()); - // Ŷ . + // 게임 서버로 패킷을 보낸다. g_pGameServerManager->broadcast(&sgGuildMemberLogOnOK); #endif diff --git a/src/Core/GSModifyGuildIntro.cpp b/src/Core/GSModifyGuildIntro.cpp index fca16014..b74596d7 100644 --- a/src/Core/GSModifyGuildIntro.cpp +++ b/src/Core/GSModifyGuildIntro.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GSModifyGuildIntro::read(SocketInputStream& iStream) @@ -36,7 +36,7 @@ void GSModifyGuildIntro::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GSModifyGuildIntro::write(SocketOutputStream& oStream) const diff --git a/src/Core/GSModifyGuildIntro.h b/src/Core/GSModifyGuildIntro.h index b5445f24..24520fca 100644 --- a/src/Core/GSModifyGuildIntro.h +++ b/src/Core/GSModifyGuildIntro.h @@ -18,7 +18,7 @@ // // class GSModifyGuildIntro; // -// ߰ ûѴ. +// 팀이 추가를 쉐어드 서버에 요청한다. // // *CAUTION* // @@ -28,10 +28,10 @@ class GSModifyGuildIntro : public Packet { public: GSModifyGuildIntro() {}; ~GSModifyGuildIntro() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -110,7 +110,7 @@ class GSModifyGuildIntroFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionPacketMaxSize , ϶. + // const static LGIncomingConnectionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID + // guild ID szBYTE + // Guild Intro length diff --git a/src/Core/GSModifyGuildIntroHandler.cpp b/src/Core/GSModifyGuildIntroHandler.cpp index a703e1a1..e92fac07 100644 --- a/src/Core/GSModifyGuildIntroHandler.cpp +++ b/src/Core/GSModifyGuildIntroHandler.cpp @@ -33,19 +33,19 @@ void GSModifyGuildIntroHandler::execute(GSModifyGuildIntro* pPacket, Player* pPl Assert(pPacket != NULL); - // 带 ´. + // 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); if (pGuild == NULL) return; pGuild->saveIntro(pPacket->getGuildIntro()); - // Ŷ . + // 게임 서버로 보낼 패킷을 만든다. SGModifyGuildIntroOK sgModifyGuildIntroOK; sgModifyGuildIntroOK.setGuildID(pGuild->getID()); sgModifyGuildIntroOK.setGuildIntro(pPacket->getGuildIntro()); - // Ŷ . + // 게임 서버로 패킷을 보낸다. g_pGameServerManager->broadcast(&sgModifyGuildIntroOK); #endif diff --git a/src/Core/GSModifyGuildMember.cpp b/src/Core/GSModifyGuildMember.cpp index efc56755..56c6acc4 100644 --- a/src/Core/GSModifyGuildMember.cpp +++ b/src/Core/GSModifyGuildMember.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GSModifyGuildMember::read(SocketInputStream& iStream) @@ -44,7 +44,7 @@ void GSModifyGuildMember::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GSModifyGuildMember::write(SocketOutputStream& oStream) const diff --git a/src/Core/GSModifyGuildMember.h b/src/Core/GSModifyGuildMember.h index 594f63c3..7cbe2f41 100644 --- a/src/Core/GSModifyGuildMember.h +++ b/src/Core/GSModifyGuildMember.h @@ -18,7 +18,7 @@ // // class GSModifyGuildMember; // -// ߰ ûѴ. +// 팀이 추가를 쉐어드 서버에 요청한다. // // *CAUTION* // @@ -28,10 +28,10 @@ class GSModifyGuildMember : public Packet { public: GSModifyGuildMember() {}; ~GSModifyGuildMember() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -135,7 +135,7 @@ class GSModifyGuildMemberFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionPacketMaxSize , ϶. + // const static LGIncomingConnectionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID + // guild ID szBYTE + // name length diff --git a/src/Core/GSModifyGuildMemberHandler.cpp b/src/Core/GSModifyGuildMemberHandler.cpp index c8ed6131..16d462df 100644 --- a/src/Core/GSModifyGuildMemberHandler.cpp +++ b/src/Core/GSModifyGuildMemberHandler.cpp @@ -39,19 +39,19 @@ void GSModifyGuildMemberHandler::execute(GSModifyGuildMember* pPacket, Player* p Assert(pPacket != NULL); - // 带 ´. + // 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); // try { Assert(pGuild != NULL); } catch (Throwable& ) { return; } if (pGuild == NULL) return; - // ȮѴ. + // 길드의 멤버인지 확인한다. GuildMember* pGuildMember = pGuild->getMember(pPacket->getName()); // try { Assert(pGuildMember != NULL); } catch (Throwable& ) { return; } if (pGuildMember == NULL) return; - // ȮѴ. ( ͸ ٲܶ ) + // 보낸사람이 길드 마스터인지 확인한다. (길드 마스터를 바꿀때는 예외 ) if (pGuild->getMaster() != pPacket->getSender() && pPacket->getGuildMemberRank() != GuildMember::GUILDMEMBER_RANK_MASTER) return; @@ -59,7 +59,7 @@ void GSModifyGuildMemberHandler::execute(GSModifyGuildMember* pPacket, Player* p if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_WAIT && pPacket->getGuildMemberRank() == GuildMember::GUILDMEMBER_RANK_NORMAL) { /////////////////////////////////////////////////////////////////////////////////////// - // , DB Slayer, Vampire, Ousters ̺ GuildID ٲ۴. + // 길드 멤버 가입을 승인한 경우, DB에 Slayer, Vampire, Ousters 테이블의 GuildID 를 바꾼다. /////////////////////////////////////////////////////////////////////////////////////// Statement* pStmt = NULL; @@ -87,37 +87,37 @@ void GSModifyGuildMemberHandler::execute(GSModifyGuildMember* pPacket, Player* p } END_DB(pStmt) - // Guild Member Ѵ. + // Guild Member 정보를 변경한다. pGuild->modifyMemberRank(pGuildMember->getName(), pPacket->getGuildMemberRank()); } else if (pGuildMember->getRank() != GuildMember::GUILDMEMBER_RANK_MASTER && pPacket->getGuildMemberRank() == GuildMember::GUILDMEMBER_RANK_MASTER) { - // 帶 ũ 帶Ͱ Ǵ ũ ٲش. + // 길드마스터의 랭크를 새로 길드마스터가 되는 멤버의 원래 랭크로 바꿔준다. pGuild->modifyMemberRank(pGuild->getMaster(), pGuildMember->getRank()); - // 帶 ũ Ѵ. + // 새 길드마스터의 랭크를 세팅한다. pGuild->modifyMemberRank(pGuildMember->getName(), pPacket->getGuildMemberRank()); - // Ʈ Ʈ Ѵ. + // 길드 오브젝트에 새 길드 마스트로 세팅한다. pGuild->setMaster(pGuildMember->getName()); - // DB Ѵ. + // DB에 저장한다. char field[30]; sprintf(field, "Master='%s'", pGuildMember->getName().c_str()); pGuild->tinysave(field); } else if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_NORMAL && pPacket->getGuildMemberRank() == GuildMember::GUILDMEMBER_RANK_SUBMASTER) { - // α帶 ũ Ѵ. + // 새 부길드마스터의 랭크를 세팅한다. pGuild->modifyMemberRank(pGuildMember->getName(), pPacket->getGuildMemberRank()); } else { return; } - // Ŷ . + // 게임 서버로 보낼 패킷을 만든다. SGModifyGuildMemberOK sgModifyGuildMemberOK; sgModifyGuildMemberOK.setGuildID(pGuild->getID()); sgModifyGuildMemberOK.setName(pPacket->getName()); sgModifyGuildMemberOK.setGuildMemberRank(pGuildMember->getRank()); sgModifyGuildMemberOK.setSender(pPacket->getSender()); - // Ŷ . + // 게임 서버로 패킷을 보낸다. g_pGameServerManager->broadcast(&sgModifyGuildMemberOK); #endif diff --git a/src/Core/GSQuitGuild.cpp b/src/Core/GSQuitGuild.cpp index 2b3782fc..ac70fa40 100644 --- a/src/Core/GSQuitGuild.cpp +++ b/src/Core/GSQuitGuild.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GSQuitGuild::read(SocketInputStream& iStream) @@ -35,7 +35,7 @@ void GSQuitGuild::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GSQuitGuild::write(SocketOutputStream& oStream) const diff --git a/src/Core/GSQuitGuild.h b/src/Core/GSQuitGuild.h index 5e8dd5e4..65d12ba0 100644 --- a/src/Core/GSQuitGuild.h +++ b/src/Core/GSQuitGuild.h @@ -18,7 +18,7 @@ // // class GSQuitGuild; // -// ߰ ûѴ. +// 팀이 추가를 쉐어드 서버에 요청한다. // // *CAUTION* // @@ -28,10 +28,10 @@ class GSQuitGuild : public Packet { public: GSQuitGuild() {}; ~GSQuitGuild() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -110,7 +110,7 @@ class GSQuitGuildFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionPacketMaxSize , ϶. + // const static LGIncomingConnectionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID + // guild ID szBYTE + // name length diff --git a/src/Core/GSQuitGuildHandler.cpp b/src/Core/GSQuitGuildHandler.cpp index 7aa0b874..8fd72606 100644 --- a/src/Core/GSQuitGuildHandler.cpp +++ b/src/Core/GSQuitGuildHandler.cpp @@ -37,13 +37,13 @@ void GSQuitGuildHandler::execute(GSQuitGuild* pPacket, Player* pPlayer) Assert(pPacket != NULL); - // ÷̾ 带 ´. + // 플레이어가 속한 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); // try { Assert(pGuild != NULL); } catch (Throwable& ) { return; } if (pGuild == NULL) return; - // ÷̾ ȮѴ. + // 플레이어가 길드의 멤버인지 확인한다. GuildMember* pGuildMember = pGuild->getMember(pPacket->getName()); // try { Assert(pGuildMember != NULL); } catch (Throwable& ) { return; } if (pGuildMember == NULL) @@ -51,7 +51,7 @@ void GSQuitGuildHandler::execute(GSQuitGuild* pPacket, Player* pPlayer) Statement* pStmt = NULL; - // Ż α׸ . + // 길드 탈퇴 로그를 남긴다. GuildMemberRank_t rank = pGuildMember->getRank(); if (rank == GuildMember::GUILDMEMBER_RANK_NORMAL || rank == GuildMember::GUILDMEMBER_RANK_MASTER || rank == GuildMember::GUILDMEMBER_RANK_SUBMASTER) @@ -59,15 +59,15 @@ void GSQuitGuildHandler::execute(GSQuitGuild* pPacket, Player* pPlayer) pPacket->getName().c_str()); ////////////////////////////////////////////////////////////////////////////// - // 尡 active Żϴ Ŵ - // wait ְ Żϴ Ͷ 带 ҽŲ. + // 길드가 active 라면 걍 탈퇴하는 거다 + // wait 라면 돈도 돌려주고 탈퇴하는 사람이 마스터라면 길드를 취소시킨다. ////////////////////////////////////////////////////////////////////////////// if (pGuild->getState() == Guild::GUILD_STATE_ACTIVE) { - // + // 길드 마스터일 경우 무시 if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_MASTER) return; - // DB Slayer, Vampire, Ousters ̺ ̵ ٲ۴. + // DB 의 Slayer, Vampire, Ousters 테이블의 길드 아이디를 바꾼다. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); @@ -86,27 +86,27 @@ void GSQuitGuildHandler::execute(GSQuitGuild* pPacket, Player* pPlayer) } END_DB(pStmt) - // Guild Member leave Ų. + // Guild Member 를 leave 시킨다. pGuildMember->leave(); - // Guild Ѵ. + // Guild 에서 삭제한다. pGuild->deleteMember(pGuildMember->getName()); - // Ŷ . + // 게임 서버로 보낼 패킷을 만든다. SGQuitGuildOK sgQuitGuildOK; sgQuitGuildOK.setGuildID(pGuild->getID()); sgQuitGuildOK.setName(pPacket->getName()); - // Ŷ . + // 게임 서버로 패킷을 보낸다. g_pGameServerManager->broadcast(&sgQuitGuildOK); - // ο 5 ̸ + // 길드 인원이 5명 미만이 될 경우 if (pGuild->getState() == Guild::GUILD_STATE_ACTIVE && pGuild->getActiveMemberCount() < MIN_GUILDMEMBER_COUNT) { - // . + // 기록을 남긴다. filelog("GuildBroken.log", "GuildID: %d, GuildName: %s, MemberCount: %d, Quit: %s", pGuild->getID(), pGuild->getName().c_str(), pGuild->getActiveMemberCount(), pPacket->getName().c_str()); - // expire and delete + // 길드 멤버 expire and delete HashMapGuildMember& Members = pGuild->getMembers(); HashMapGuildMemberItor itr = Members.begin(); @@ -133,10 +133,10 @@ void GSQuitGuildHandler::execute(GSQuitGuild* pPacket, Player* pPlayer) pGuildMember->getName().c_str(), g_pStringPool->c_str(STRID_CLAN_BROKEN)); } - // expire Ų. + // 길드 멤버를 expire 시킨다. pGuildMember->expire(); - // + // 길드 멤버를 삭제 SAFE_DELETE(pGuildMember); } @@ -146,14 +146,14 @@ void GSQuitGuildHandler::execute(GSQuitGuild* pPacket, Player* pPlayer) Members.clear(); - // 带 Ѵ + // 길드를 삭제한다 pGuild->setState(Guild::GUILD_STATE_BROKEN); pGuild->save(); SAFE_DELETE(pGuild); g_pGuildManager->deleteGuild(pPacket->getGuildID()); - // 带 ϵ Ŷ . + // 길드를 삭제하도록 패킷을 보낸다. SGDeleteGuildOK sgDeleteGuildOK; sgDeleteGuildOK.setGuildID(pPacket->getGuildID()); @@ -162,8 +162,8 @@ void GSQuitGuildHandler::execute(GSQuitGuild* pPacket, Player* pPlayer) } else if (pGuild->getState() == Guild::GUILD_STATE_WAIT) { if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_MASTER) { //////////////////////////////////////////////////////////// - // 带 Ų. - // expire and delete + // 길드를 취소 시킨다. + // 길드 멤버 expire and delete //////////////////////////////////////////////////////////// HashMapGuildMember& Members = pGuild->getMembers(); HashMapGuildMemberItor itr = Members.begin(); @@ -194,20 +194,20 @@ void GSQuitGuildHandler::execute(GSQuitGuild* pPacket, Player* pPlayer) Gold = RETURN_SLAYER_SUBMASTER_GOLD; if (!Table.empty() && !Message.empty() && Gold != 0) { - // ޽ ִ´. + // 메시지를 넣는다. pStmt->executeQuery("INSERT INTO Messages (Receiver, Message ) VALUES ('%s', '%s' )", pGuildMember->getName().c_str(), Message.c_str()); - // Ϻ ȯѴ. ÷ ijʹ DB Ÿ gameserver ִ Ÿ ٸ - // ֱ⶧ ̷ ϸ ȵǴµ, ٽ Ʈ Ѵ. + // 등록비를 환불한다. 게임 플레이중인 캐릭터는 DB 데이타랑 gameserver에 있는 데이타랑 다를수도 + // 있기때문에 이렇게 하면 안되는데, 다시 게임 서버에서 새로 업데이트 한다. pStmt->executeQuery("UPDATE %s SET Gold = Gold + %d WHERE Name = '%s'", Table.c_str(), (int)Gold, pGuildMember->getName().c_str()); } - // expire Ų. + // 길드 멤버를 expire 시킨다. pGuildMember->expire(); - // + // 길드 멤버를 삭제 SAFE_DELETE(pGuildMember); } @@ -217,7 +217,7 @@ void GSQuitGuildHandler::execute(GSQuitGuild* pPacket, Player* pPlayer) Members.clear(); - // 带 Ѵ + // 길드를 삭제한다 pGuild->setState(Guild::GUILD_STATE_CANCEL); pGuild->save(); @@ -225,27 +225,27 @@ void GSQuitGuildHandler::execute(GSQuitGuild* pPacket, Player* pPlayer) g_pGuildManager->deleteGuild(pPacket->getGuildID()); - // 带 ϵ Ŷ . + // 길드를 삭제하도록 패킷을 보낸다. SGDeleteGuildOK sgDeleteGuildOK; sgDeleteGuildOK.setGuildID(pPacket->getGuildID()); g_pGameServerManager->broadcast(&sgDeleteGuildOK); } else if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_SUBMASTER) { ////////////////////////////////////////////////////////// - // Ÿ Ų. - // Guild Member expire Ų. + // 스타팅 멤버 가입을 취소 시킨다. + // Guild Member 를 expire 시킨다. ////////////////////////////////////////////////////////// pGuildMember->expire(); - // Guild Ѵ. + // Guild 에서 삭제한다. pGuild->deleteMember(pGuildMember->getName()); - // Ŷ . + // 게임 서버로 보낼 패킷을 만든다. SGQuitGuildOK sgQuitGuildOK; sgQuitGuildOK.setGuildID(pGuild->getID()); sgQuitGuildOK.setName(pPacket->getName()); - // Ŷ . + // 게임 서버로 패킷을 보낸다. g_pGameServerManager->broadcast(&sgQuitGuildOK); } } diff --git a/src/Core/GSRequestGuildInfo.cpp b/src/Core/GSRequestGuildInfo.cpp index 46d0d697..d15d0d99 100644 --- a/src/Core/GSRequestGuildInfo.cpp +++ b/src/Core/GSRequestGuildInfo.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GSRequestGuildInfo::read(SocketInputStream& iStream) @@ -22,7 +22,7 @@ void GSRequestGuildInfo::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GSRequestGuildInfo::write(SocketOutputStream& oStream) const diff --git a/src/Core/GSRequestGuildInfo.h b/src/Core/GSRequestGuildInfo.h index e8a59298..6ae039a7 100644 --- a/src/Core/GSRequestGuildInfo.h +++ b/src/Core/GSRequestGuildInfo.h @@ -18,7 +18,7 @@ // // class GSRequestGuildInfo; // -// ߰ ûѴ. +// 팀이 추가를 쉐어드 서버에 요청한다. // // *CAUTION* // @@ -28,10 +28,10 @@ class GSRequestGuildInfo : public Packet { public: GSRequestGuildInfo() {}; ~GSRequestGuildInfo() {}; - // Stream ü Ÿ о Ŷ ʱȭѴ. + // Stream 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // Stream ü Ŷ ̳ʸ ̹ . + // Stream 객체로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -86,7 +86,7 @@ class GSRequestGuildInfoFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionPacketMaxSize , ϶. + // const static LGIncomingConnectionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return 0; } diff --git a/src/Core/GSRequestGuildInfoHandler.cpp b/src/Core/GSRequestGuildInfoHandler.cpp index 8cd93c29..67f28283 100644 --- a/src/Core/GSRequestGuildInfoHandler.cpp +++ b/src/Core/GSRequestGuildInfoHandler.cpp @@ -42,7 +42,7 @@ void GSRequestGuildInfoHandler::execute(GSRequestGuildInfo* pPacket, Player* pPl g_pGuildManager->makeSGGuildInfo(sgGuildInfo); - // Ŷ . + // 게임 서버로 패킷을 보낸다. pGSPlayer->sendPacket(&sgGuildInfo); #endif diff --git a/src/Core/GameTime.cpp b/src/Core/GameTime.cpp index b6510aa6..86e490b6 100644 --- a/src/Core/GameTime.cpp +++ b/src/Core/GameTime.cpp @@ -48,7 +48,7 @@ void GameTime::write(SocketOutputStream& oStream) const { //-------------------------------------------------------------------------------- string GameTime::toString() const { StringStream msg; - msg << (int)m_Year << " " << (int)m_Month << " " << (int)m_Day << " " << (int)m_Hour << " " << (int)m_Minute - << " " << (int)m_Second << ""; + msg << (int)m_Year << "년 " << (int)m_Month << "월 " << (int)m_Day << "일 " << (int)m_Hour << "시 " << (int)m_Minute + << "분 " << (int)m_Second << "초"; return msg.toString(); } diff --git a/src/Core/GameTime.h b/src/Core/GameTime.h index ec7208ba..da7b3a14 100644 --- a/src/Core/GameTime.h +++ b/src/Core/GameTime.h @@ -16,14 +16,14 @@ //-------------------------------------------------------------------------------- // -// ð Ÿ. +// 게임 내에서의 시간을 나타낸다. // //-------------------------------------------------------------------------------- class GameTime { public: - // Ͽ embedding Ƿ ü ޽带 ؾ Ѵ. - // ߿ ̰ ̽ ذ ̴. + // 소켓에 embedding 되려는 객체는 다음과 같은 메쏘드를 구현해야 한다. + // 나중에는 이거 인터페이스로 해결할 전망이다. // read from socket input stream void read(SocketInputStream& iStream); diff --git a/src/Core/GearSlotInfo.cpp b/src/Core/GearSlotInfo.cpp index e8ec2789..23289aaf 100644 --- a/src/Core/GearSlotInfo.cpp +++ b/src/Core/GearSlotInfo.cpp @@ -12,10 +12,10 @@ void GearSlotInfo::read(SocketInputStream& iStream) { __BEGIN_TRY - // Ŭ о̰... + // 먼저 하위 클래스에서 읽어들이고... PCItemInfo::read(iStream); - // Ŭ ͸ оδ. + // 이 클래스의 데이터를 읽어들인다. iStream.read(m_SlotID); __END_CATCH @@ -27,10 +27,10 @@ void GearSlotInfo::read(SocketInputStream& iStream) { void GearSlotInfo::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // Ŭ о̰... + // 먼저 하위 클래스에서 읽어들이고... PCItemInfo::write(oStream); - // Ŭ ͸ оδ. + // 이 클래스의 데이터를 읽어들인다. oStream.write(m_SlotID); __END_CATCH diff --git a/src/Core/GearSlotInfo.h b/src/Core/GearSlotInfo.h index 2d3382a7..f1596047 100644 --- a/src/Core/GearSlotInfo.h +++ b/src/Core/GearSlotInfo.h @@ -14,7 +14,7 @@ #include "Types.h" ////////////////////////////////////////////////////////////////////////////// -// Inventory ִ ü. +// Inventory 정보를 담고 있는 객체. ////////////////////////////////////////////////////////////////////////////// class GearSlotInfo : public PCItemInfo { diff --git a/src/Core/Geometry.cpp b/src/Core/Geometry.cpp index ee1dec23..5791fd8e 100644 --- a/src/Core/Geometry.cpp +++ b/src/Core/Geometry.cpp @@ -28,8 +28,8 @@ uint getPointsFromLine(int x1, int y1, int x2, int y2, list& rList) { yStep = (double)(y2 - y1) / (double)(x2 - x1); Y = y1; for (xCount = x1; xCount <= x2; xCount++) { - // ̶ ⸦ ϰ, - // ǥ ִ´. + // 마지막 점이라면 기울기를 무시하고, + // 강제로 마지막 좌표를 집어넣는다. if (xCount == x2) { rList.push_front(POINT(x2, y2)); } else { @@ -89,11 +89,11 @@ uint getPointsFromLineEx(int x1, int y1, int x2, int y2, int range, list& } else if (xLength > yLength) { // cout << "xLength:" << xLength << endl; - // X ̰ Ÿ ٸ ׳ ׾ Ѵ. + // 현재의 X 길이가 사정거리보다 길다면 그냥 선을 그어서 리턴한다. if (xLength >= range) return getPointsFromLine(x1, y1, x2, y2, rList); - // ڶ ̸ Ѵ. + // 모자란 길이를 구한다. int xoffset = range - xLength; // cout << "xOffset:" << xoffset << endl; @@ -122,11 +122,11 @@ uint getPointsFromLineEx(int x1, int y1, int x2, int y2, int range, list& } else { // cout << "yLength:" << yLength << endl; - // Y ̰ Ÿ ٸ ׳ ׾ Ѵ. + // 현재의 Y 길이가 사정거리보다 길다면 그냥 선을 그어서 리턴한다. if (yLength >= range) return getPointsFromLine(x1, y1, x2, y2, rList); - // ڶ ̸ Ѵ. + // 모자란 길이를 구한다. int yoffset = range - yLength; // cout << "yOffset:" << yoffset << endl; @@ -153,12 +153,12 @@ uint getPointsFromLineEx(int x1, int y1, int x2, int y2, int range, list& getPointsFromLine(x1, y1, nx2, ny2, rList); } - // getPointsFromLineEx() x^2 + y^2 = r^2 y = ax ãƼ, - // ǥ Ʈ ϴ Լε, - // ˰ 󿡼 (x2,y2), ó ǥ ߴ - // ǥ 찡 ִ. - // ̷ 츦 ϱ ؼ Ʈ ǥ ǥ ٸ, - // ־ ش. + // getPointsFromLineEx()는 x^2 + y^2 = r^2과 y = ax의 교점을 찾아서, + // 원점에서 교점까지의 좌표들을 리스트로 리턴하는 함수인데, + // 알고리즘 상에서의 문제로 인해 (x2,y2), 즉 처음에 목표로 했던 + // 좌표가 빠지는 경우가 생길 수 있다. + // 이런 경우를 방지하기 위해서 리스트에 원래 목표 좌표가 없다면, + // 집어넣어 준다. bool bAdd = true; list::iterator itr = rList.begin(); for (; itr != rList.end(); itr++) { diff --git a/src/Core/GuildInfo2.cpp b/src/Core/GuildInfo2.cpp index 85967572..3784d1b0 100644 --- a/src/Core/GuildInfo2.cpp +++ b/src/Core/GuildInfo2.cpp @@ -38,7 +38,7 @@ GuildInfo2::~GuildInfo2() { void GuildInfo2::clearGuildMemberInfoList() { __BEGIN_TRY - // GuildInfoList Ѵ. + // GuildInfoList를 삭제한다. while (!m_GuildMemberInfoList.empty()) { GuildMemberInfo2* pGuildMemberInfo = m_GuildMemberInfoList.front(); m_GuildMemberInfoList.pop_front(); @@ -50,7 +50,7 @@ void GuildInfo2::clearGuildMemberInfoList() { ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GuildInfo2::read(SocketInputStream& iStream) { __BEGIN_TRY @@ -112,7 +112,7 @@ void GuildInfo2::read(SocketInputStream& iStream) { } ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GuildInfo2::write(SocketOutputStream& oStream) const { __BEGIN_TRY @@ -138,7 +138,7 @@ void GuildInfo2::write(SocketOutputStream& oStream) const { if (szIntro > 256) throw InvalidProtocolException("too long szIntro length"); - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_ID); oStream.write(szName); oStream.write(m_Name); diff --git a/src/Core/GuildInfo2.h b/src/Core/GuildInfo2.h index 14a233f4..900a551e 100644 --- a/src/Core/GuildInfo2.h +++ b/src/Core/GuildInfo2.h @@ -35,14 +35,14 @@ class GuildInfo2 { ~GuildInfo2(); public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getSize(); static uint getMaxSize() { @@ -158,10 +158,10 @@ class GuildInfo2 { } private: - // ̵ + // 길드 아이디 GuildID_t m_ID; - // ̸ + // 길드 이름 string m_Name; // guild type @@ -179,10 +179,10 @@ class GuildInfo2 { // guild zone ID ZoneID_t m_ZoneID; - // + // 길드 마스터 string m_Master; - // Expire Date + // 길드 Expire Date string m_Date; // guild intro diff --git a/src/Core/GuildMemberInfo2.cpp b/src/Core/GuildMemberInfo2.cpp index 6693c934..0b45c81f 100644 --- a/src/Core/GuildMemberInfo2.cpp +++ b/src/Core/GuildMemberInfo2.cpp @@ -30,7 +30,7 @@ GuildMemberInfo2::~GuildMemberInfo2() { ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GuildMemberInfo2::read(SocketInputStream& iStream) { __BEGIN_TRY @@ -53,7 +53,7 @@ void GuildMemberInfo2::read(SocketInputStream& iStream) { } ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GuildMemberInfo2::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/GuildMemberInfo2.h b/src/Core/GuildMemberInfo2.h index 09441e55..7715583f 100644 --- a/src/Core/GuildMemberInfo2.h +++ b/src/Core/GuildMemberInfo2.h @@ -18,7 +18,7 @@ // // class GuildMemberInfo2; // -// Ŭ̾Ʈ Ʈ . +// 클라이언트에 길드 리스트를 보낸다. // ////////////////////////////////////////////////////////////////////// @@ -31,14 +31,14 @@ class GuildMemberInfo2 { ~GuildMemberInfo2(); public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getSize(); static uint getMaxSize() { @@ -81,10 +81,10 @@ class GuildMemberInfo2 { } private: - // ̵ + // 길드 아이디 GuildID_t m_GuildID; - // ̸ + // 이름 string m_Name; // Guild Member Rank diff --git a/src/Core/GuildWarInfo.h b/src/Core/GuildWarInfo.h index 5bd979f6..d577ae88 100644 --- a/src/Core/GuildWarInfo.h +++ b/src/Core/GuildWarInfo.h @@ -18,7 +18,7 @@ // // class WarInfo; // -// ϳ £ +// 하나의 전쟁에 대한 정보 // //-------------------------------------------------------------------------------- @@ -30,10 +30,10 @@ class GuildWarInfo : public WarInfo { GuildWarInfo() {} ~GuildWarInfo() {} - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; PacketSize_t getSize() const { @@ -91,10 +91,10 @@ class GuildWarInfo : public WarInfo { } private: - ZoneID_t m_CastleID; // - string m_DefenseGuildName; // - string m_AttackGuildName; // - GuildIDList m_GuildIDs; // + ZoneID_t m_CastleID; // 전쟁중인 성 + string m_DefenseGuildName; // 방어 길드 + string m_AttackGuildName; // 공격 길드 + GuildIDList m_GuildIDs; // 참여길드들 }; #endif diff --git a/src/Core/InventorySlotInfo.cpp b/src/Core/InventorySlotInfo.cpp index 2b3b1b2b..c94aa23c 100644 --- a/src/Core/InventorySlotInfo.cpp +++ b/src/Core/InventorySlotInfo.cpp @@ -12,10 +12,10 @@ void InventorySlotInfo::read(SocketInputStream& iStream) { __BEGIN_TRY - // Ŭ оδ. + // 먼저 하위 클래스에서 읽어들인다. PCItemInfo::read(iStream); - // Ŭ شϴ ͸ оδ. + // 이 클래스에 해당하는 데이터를 읽어들인다. iStream.read(m_InvenX); iStream.read(m_InvenY); @@ -28,10 +28,10 @@ void InventorySlotInfo::read(SocketInputStream& iStream) { void InventorySlotInfo::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // Ŭ . + // 먼저 하위 클래스에서 쓴다. PCItemInfo::write(oStream); - // Ŭ شϴ ͸ . + // 이 클래스에 해당하는 데이터를 쓴다. oStream.write(m_InvenX); oStream.write(m_InvenY); diff --git a/src/Core/InventorySlotInfo.h b/src/Core/InventorySlotInfo.h index 3e906f9e..141a2d85 100644 --- a/src/Core/InventorySlotInfo.h +++ b/src/Core/InventorySlotInfo.h @@ -14,7 +14,7 @@ #include "Types.h" ////////////////////////////////////////////////////////////////////////////// -// Inventory ִ ü. +// Inventory 정보를 담고 있는 객체. ////////////////////////////////////////////////////////////////////////////// class InventorySlotInfo : public PCItemInfo { diff --git a/src/Core/ItemNameInfo.cpp b/src/Core/ItemNameInfo.cpp index 9c7428ee..47a75992 100644 --- a/src/Core/ItemNameInfo.cpp +++ b/src/Core/ItemNameInfo.cpp @@ -33,13 +33,13 @@ ItemNameInfo::~ItemNameInfo () ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void ItemNameInfo::read(SocketInputStream& iStream) { __BEGIN_TRY BYTE szName; - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_ObjectID); iStream.read(szName); iStream.read(m_Name, szName); @@ -48,7 +48,7 @@ void ItemNameInfo::read(SocketInputStream& iStream) { } ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void ItemNameInfo::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/ItemNameInfo.h b/src/Core/ItemNameInfo.h index 0de23d93..be21b5c3 100644 --- a/src/Core/ItemNameInfo.h +++ b/src/Core/ItemNameInfo.h @@ -30,10 +30,10 @@ class ItemNameInfo { } virtual ~ItemNameInfo() {} - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. virtual void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. virtual void write(SocketOutputStream& oStream) const; virtual PacketSize_t getSize() const; diff --git a/src/Core/LCCreatePCError.h b/src/Core/LCCreatePCError.h index 893e7954..c48e3849 100644 --- a/src/Core/LCCreatePCError.h +++ b/src/Core/LCCreatePCError.h @@ -13,8 +13,8 @@ ////////////////////////////////////////////////////////////////////////////// // class LCCreatePCError; // -// PC Creation , α Ŭ̾Ʈ Ŷ -// . +// PC Creation 이 실패했을 경우, 로그인 서버는 클라이언트에게 이 패킷을 +// 보낸다. ////////////////////////////////////////////////////////////////////////////// class LCCreatePCError : public Packet { diff --git a/src/Core/LCCreatePCOK.h b/src/Core/LCCreatePCOK.h index 9088b4f3..ab1e371a 100644 --- a/src/Core/LCCreatePCOK.h +++ b/src/Core/LCCreatePCOK.h @@ -17,7 +17,7 @@ // // class LCCreatePCOK; // -// αμ Ŭ̾Ʈ α ˷ִ Ŷ̴. +// 로그인서버가 클라이언트에게 로그인 성공을 알려주는 패킷이다. // ////////////////////////////////////////////////////////////////////// @@ -25,10 +25,10 @@ class LCCreatePCOK : public Packet { public: LCCreatePCOK() {}; ~LCCreatePCOK() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream) {} - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const {} // execute packet's handler @@ -41,7 +41,7 @@ class LCCreatePCOK : public Packet { // get packet body size // *OPTIMIZATION HINT* - // const static LCCreatePCOKPacketSize , ϶. + // const static LCCreatePCOKPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return 0; } diff --git a/src/Core/LCCreatePCOKHandler.cpp b/src/Core/LCCreatePCOKHandler.cpp index 11958e04..df94e7f1 100644 --- a/src/Core/LCCreatePCOKHandler.cpp +++ b/src/Core/LCCreatePCOKHandler.cpp @@ -32,7 +32,7 @@ void LCCreatePCOKHandler::execute(LCCreatePCOK* pPacket, Player* pPlayer) cout << "+--------------------------+" << endl; cout << " " << endl; - // ٽ PC LIST ޾ƿ; Ѵ. + // 다시 PC LIST 를 받아와야 한다. CLGetPCList clGetPCList; pClientPlayer->sendPacket(&clGetPCList); diff --git a/src/Core/LCDeletePCError.cpp b/src/Core/LCDeletePCError.cpp index 200257f0..2c9a2023 100644 --- a/src/Core/LCDeletePCError.cpp +++ b/src/Core/LCDeletePCError.cpp @@ -10,7 +10,7 @@ #include "LCDeletePCError.h" ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void LCDeletePCError::read(SocketInputStream& iStream) @@ -24,7 +24,7 @@ void LCDeletePCError::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void LCDeletePCError::write(SocketOutputStream& oStream) const diff --git a/src/Core/LCDeletePCError.h b/src/Core/LCDeletePCError.h index d9b32e48..6ead1fee 100644 --- a/src/Core/LCDeletePCError.h +++ b/src/Core/LCDeletePCError.h @@ -23,10 +23,10 @@ class LCDeletePCError : public Packet { public: LCDeletePCError() {}; ~LCDeletePCError() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -62,7 +62,7 @@ class LCDeletePCError : public Packet { } private: - // ޽ + // 에러 메시지 BYTE m_ErrorID; }; diff --git a/src/Core/LCDeletePCErrorHandler.cpp b/src/Core/LCDeletePCErrorHandler.cpp index fc29e606..f8c04165 100644 --- a/src/Core/LCDeletePCErrorHandler.cpp +++ b/src/Core/LCDeletePCErrorHandler.cpp @@ -10,8 +10,8 @@ #include "LCDeletePCError.h" //---------------------------------------------------------------------- -// ij ߴٴ ̴. -// غ, д ũŷ õ ƴѰ?? - -; +// 캐릭터의 삭제가 실패했다는 뜻이다. +// 가만히 생각해보니, 삭제 실패는 크래킹 시도가 아닌가?? - -; //---------------------------------------------------------------------- void LCDeletePCErrorHandler::execute(LCDeletePCError* pPacket, Player* pPlayer) diff --git a/src/Core/LCDeletePCOK.h b/src/Core/LCDeletePCOK.h index 69f04625..286c178a 100644 --- a/src/Core/LCDeletePCOK.h +++ b/src/Core/LCDeletePCOK.h @@ -23,10 +23,10 @@ class LCDeletePCOK : public Packet { public: LCDeletePCOK() {}; ~LCDeletePCOK() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -39,7 +39,7 @@ class LCDeletePCOK : public Packet { // get packet body size // *OPTIMIZATION HINT* - // const static LCDeletePCOKPacketSize , ϶. + // const static LCDeletePCOKPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return 0; } diff --git a/src/Core/LCDeletePCOKHandler.cpp b/src/Core/LCDeletePCOKHandler.cpp index cc07f3d9..4c3917b4 100644 --- a/src/Core/LCDeletePCOKHandler.cpp +++ b/src/Core/LCDeletePCOKHandler.cpp @@ -16,7 +16,7 @@ //-------------------------------------------------------------------------------- // -// PC ߴٴ ̴. +// PC 를 성공적으로 삭제했다는 뜻이다. // //-------------------------------------------------------------------------------- void LCDeletePCOKHandler::execute(LCDeletePCOK* pPacket, Player* pPlayer) @@ -36,7 +36,7 @@ void LCDeletePCOKHandler::execute(LCDeletePCOK* pPacket, Player* pPlayer) cout << "+--------------------------+" << endl; cout << " " << endl; - // ٽ PC LIST ޾ƿ; Ѵ. + // 다시 PC LIST 를 받아와야 한다. CLGetPCList clGetPCList; pClientPlayer->sendPacket(&clGetPCList); diff --git a/src/Core/LCLoginError.cpp b/src/Core/LCLoginError.cpp index 249f6a76..b43cfa13 100644 --- a/src/Core/LCLoginError.cpp +++ b/src/Core/LCLoginError.cpp @@ -2,7 +2,7 @@ // // Filename : LCLoginError.cpp // Written By : Reiot -// Description : α н α Ŭ̾Ʈ ϴ Ŷ +// Description : 로그인 실패시 로그인 서버에서 클라이언트에게 전송하는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -10,7 +10,7 @@ #include "LCLoginError.h" ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void LCLoginError::read(SocketInputStream& iStream) @@ -24,7 +24,7 @@ void LCLoginError::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void LCLoginError::write(SocketOutputStream& oStream) const diff --git a/src/Core/LCLoginError.h b/src/Core/LCLoginError.h index 634371c1..a1a57703 100644 --- a/src/Core/LCLoginError.h +++ b/src/Core/LCLoginError.h @@ -24,10 +24,10 @@ class LCLoginError : public Packet { public: LCLoginError() {}; ~LCLoginError() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -61,7 +61,7 @@ class LCLoginError : public Packet { } private: - // ID + // 에러 ID BYTE m_ErrorID; // string m_Message; diff --git a/src/Core/LCLoginOK.cpp b/src/Core/LCLoginOK.cpp index d111c677..764a8981 100644 --- a/src/Core/LCLoginOK.cpp +++ b/src/Core/LCLoginOK.cpp @@ -15,7 +15,7 @@ void LCLoginOK::read(SocketInputStream& iStream) { __BEGIN_TRY - // ׷ ̸ д´. + // 서버 그룹 이름을 읽는다. iStream.read(m_isAdult); iStream.read(m_bFamily); iStream.read(m_Stat); @@ -31,13 +31,13 @@ void LCLoginOK::read(SocketInputStream& iStream) { void LCLoginOK::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ׷ ̸ . + // 그룹 이름을 쓴다. oStream.write(m_isAdult); oStream.write(m_bFamily); oStream.write(m_Stat); oStream.write(m_LastDays); - // cout << "**************" << m_LastDays << " ҽϴ." << endl; + // cout << "**************" << m_LastDays << " 일 남았습니다." << endl; __END_CATCH } diff --git a/src/Core/LCLoginOK.h b/src/Core/LCLoginOK.h index 57bf55ef..ac14b9ca 100644 --- a/src/Core/LCLoginOK.h +++ b/src/Core/LCLoginOK.h @@ -17,7 +17,7 @@ // // class LCLoginOK; // -// αμ Ŭ̾Ʈ α ˷ִ Ŷ̴. +// 로그인서버가 클라이언트에게 로그인 성공을 알려주는 패킷이다. // ////////////////////////////////////////////////////////////////////// @@ -26,10 +26,10 @@ class LCLoginOK : public Packet { LCLoginOK() : m_LastDays(0xffff) {} ~LCLoginOK() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -42,7 +42,7 @@ class LCLoginOK : public Packet { // get packet body size // *OPTIMIZATION HINT* - // const static LCLoginOKPacketSize , ϶. + // const static LCLoginOKPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szBYTE + szBYTE + szBYTE + szWORD; } @@ -87,15 +87,15 @@ class LCLoginOK : public Packet { } private: - // : ÷̾ ̼ ΰ? - // true - // false ̼ + // 고어 레벨 : 현재 플레이어가 미성년자 인가? + // true일 경우 성인 + // false 일 경우 미성년자 bool m_isAdult; - // Family ΰ + // Family 사용자인가 bool m_bFamily; - // + // 서버의 상태 BYTE m_Stat; WORD m_LastDays; diff --git a/src/Core/LCLoginOKHandler.cpp b/src/Core/LCLoginOKHandler.cpp index dad06d71..8862b837 100644 --- a/src/Core/LCLoginOKHandler.cpp +++ b/src/Core/LCLoginOKHandler.cpp @@ -18,9 +18,9 @@ //---------------------------------------------------------------------- // -// α κ ̵ н ޾Ҵٴ Ҹ. +// 로그인 서버로부터 아이디와 패스워드의 인증을 받았다는 소리다. // -// α PC Ʈ ûϴ Ŷ ϸ ȴ. +// 이제 로그인 서버에게 PC 의 리스트를 요청하는 패킷을 전송하면 된다. // //---------------------------------------------------------------------- void LCLoginOKHandler::execute(LCLoginOK* pPacket, Player* pPlayer) @@ -36,7 +36,7 @@ void LCLoginOKHandler::execute(LCLoginOK* pPacket, Player* pPlayer) pClientPlayer->sendPacket(&clGetPCList); - // ÷̾ ¸ ٲ۴. + // 플레이어의 상태를 바꾼다. pClientPlayer->setPlayerStatus(CPS_AFTER_SENDING_CL_GET_PC_LIST); #endif diff --git a/src/Core/LCPCList.cpp b/src/Core/LCPCList.cpp index 125cc1b8..7c1990a4 100644 --- a/src/Core/LCPCList.cpp +++ b/src/Core/LCPCList.cpp @@ -30,7 +30,7 @@ LCPCList::LCPCList() LCPCList::~LCPCList() { - // heap PC Type ؾ Ѵ. + // heap 에 생성된 PC Type 변수들을 삭제해야 한다. for (uint i = 0; i < SLOT_MAX; i++) { SAFE_DELETE(m_pPCInfos[i]); } @@ -38,7 +38,7 @@ LCPCList::~LCPCList() //---------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //---------------------------------------------------------------------- void LCPCList::read(SocketInputStream& iStream) @@ -46,11 +46,11 @@ void LCPCList::read(SocketInputStream& iStream) __BEGIN_TRY //-------------------------------------------------- - // PC Ÿ ޾ƿ´. + // PC 타입 정보를 받아온다. // // *OPTMIZATION* // - // ߿ 1 Ʈ ־ Ʈ ϵ Ѵ. + // 나중에는 이 정보를 1 바이트에 넣어서 비트 연산을 하도록 한다. // //-------------------------------------------------- char pcTypes[SLOT_MAX]; @@ -59,7 +59,7 @@ void LCPCList::read(SocketInputStream& iStream) iStream.read(pcTypes[i]); //-------------------------------------------------- - // PC ü д´. + // PC 정보 본체를 읽는다. //-------------------------------------------------- for (uint j = 0; j < SLOT_MAX; j++) { switch (pcTypes[j]) { @@ -98,7 +98,7 @@ void LCPCList::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void LCPCList::write(SocketOutputStream& oStream) const @@ -106,9 +106,9 @@ void LCPCList::write(SocketOutputStream& oStream) const __BEGIN_TRY //-------------------------------------------------- - // ϴ PC Ÿ . + // 일단 PC 타입을 쓴다. // - // ߿ 1 Ʈ ־ Ʈ ϵ Ѵ. + // 나중에는 이 정보를 1 바이트에 넣어서 비트 연산을 하도록 한다. // // ex> // S0V : Slayer-EMPTY-VAMPIRE @@ -132,7 +132,7 @@ void LCPCList::write(SocketOutputStream& oStream) const } //-------------------------------------------------- - // ״ PCType ü ü . + // 그다음 PCType 객체 본체를 쓴다. //-------------------------------------------------- for (uint j = 0; j < SLOT_MAX; j++) { if (m_pPCInfos[j] != NULL) { diff --git a/src/Core/LCPCList.h b/src/Core/LCPCList.h index a59edf69..880f65a9 100644 --- a/src/Core/LCPCList.h +++ b/src/Core/LCPCList.h @@ -26,17 +26,17 @@ class LCPCList : public Packet { public: // constructor - // PCInfo* 迭 NULL Ѵ. + // PCInfo* 배열에 각각 NULL을 지정한다. LCPCList(); // destructor - // PCInfo* 迭 Ҵ ü Ѵ. + // PCInfo* 배열에 할당된 객체를 삭제한다. ~LCPCList(); - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -81,10 +81,10 @@ class LCPCList : public Packet { } private: - // ij + // 캐릭터 정보 PCInfo* m_pPCInfos[SLOT_MAX]; - // ݸ + // 넷마블 사용자 약관 동의 여부 BYTE m_Agree; }; @@ -116,8 +116,8 @@ class LCPCListFactory : public PacketFactory { // get packet's max body size PacketSize_t getPacketMaxSize() const { - // ̾ ̾  ũ , - // Ŷ ִ ũ ̾ 3 ̴. + // 슬레이어 정보가 뱀파이어 정보보다 사이즈가 크기 때문에, + // 이 패킷의 최대 크기는 슬레이어 3 명일 경우이다. return PCSlayerInfo::getMaxSize() * SLOT_MAX + SLOT_MAX + szBYTE; } }; diff --git a/src/Core/LCPCListHandler.cpp b/src/Core/LCPCListHandler.cpp index c53100ce..9d265f3c 100644 --- a/src/Core/LCPCListHandler.cpp +++ b/src/Core/LCPCListHandler.cpp @@ -19,9 +19,9 @@ #endif //---------------------------------------------------------------------- -// κ ij Ʈ ޾Ҵ. -// ij ̽ ۹ ־ -// . +// 서버로부터 캐릭터 리스트를 받았다. +// 이제 캐릭터 관리 인터페이스의 적절한 곳에 전송받은 값을 집어 넣어서 +// 출력하자. //---------------------------------------------------------------------- void LCPCListHandler::execute(LCPCList* pPacket, Player* pPlayer) @@ -72,7 +72,7 @@ void LCPCListHandler::execute(LCPCList* pPacket, Player* pPlayer) } if (nPCs == 0) { - // cout << "ijͰ ϳ ϴ." << endl; + // cout << "캐릭터가 하나도 없습니다." << endl; } char cmd[80 + 1]; @@ -117,9 +117,9 @@ void LCPCListHandler::execute(LCPCList* pPacket, Player* pPlayer) slot = SLOT1; clCreatePC.setSlot(slot); - cout << "Sex (/) : "; + cout << "Sex (남/여) : "; cin.getline(cmd, 80); - Sex sex = (strcmp(cmd, "") == 0) ? sex = MALE : sex = FEMALE; + Sex sex = (strcmp(cmd, "남") == 0) ? sex = MALE : sex = FEMALE; clCreatePC.setSex(sex); cout << "Sex : " << Sex2String[sex] << endl; @@ -208,7 +208,7 @@ void LCPCListHandler::execute(LCPCList* pPacket, Player* pPlayer) else clSelectPC.setPCType(PC_SLAYER); - // CGConnect Ϸ ⼭ ص־ Ѵ. + // CGConnect 때 사용하려면 여기서 저장해둬야 한다. pClientPlayer->setPCType(clSelectPC.getPCType()); pClientPlayer->setPCName(clSelectPC.getPCName()); @@ -227,8 +227,8 @@ void LCPCListHandler::execute(LCPCList* pPacket, Player* pPlayer) << "+------------------+" << endl << "select > "; - // ⿡ Խ ó κ  ȴ.. - // CLSelectBBS Ŷ  ǰڱ... + // 여기에 게시판 관련 처리 부분이 들어가면 된다.. + // CLSelectBBS 패킷을 만들어서 보내면 되겠군... cin.getline(cmd, 80); diff --git a/src/Core/LCQueryResultCharacterName.cpp b/src/Core/LCQueryResultCharacterName.cpp index 9d9a1725..6532e14d 100644 --- a/src/Core/LCQueryResultCharacterName.cpp +++ b/src/Core/LCQueryResultCharacterName.cpp @@ -11,7 +11,7 @@ //-------------------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void LCQueryResultCharacterName::read(SocketInputStream& iStream) @@ -43,7 +43,7 @@ void LCQueryResultCharacterName::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void LCQueryResultCharacterName::write(SocketOutputStream& oStream) const diff --git a/src/Core/LCQueryResultCharacterName.h b/src/Core/LCQueryResultCharacterName.h index 10c28301..be7648f5 100644 --- a/src/Core/LCQueryResultCharacterName.h +++ b/src/Core/LCQueryResultCharacterName.h @@ -17,8 +17,8 @@ // // class LCQueryResultCharacterName; // -// Ŭ̾Ʈ α ʿ ϴ Ŷ̴. -// ̵ н尡 ȣȭǾ ִ. +// 클라이언트가 로그인 서버에게 최초에 전송하는 패킷이다. +// 아이디와 패스워드가 암호화되어 있다. // ////////////////////////////////////////////////////////////////////// @@ -29,10 +29,10 @@ class LCQueryResultCharacterName : public Packet { ~LCQueryResultCharacterName() {}; public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/LCQueryResultPlayerID.cpp b/src/Core/LCQueryResultPlayerID.cpp index acff8d27..6d1c25d4 100644 --- a/src/Core/LCQueryResultPlayerID.cpp +++ b/src/Core/LCQueryResultPlayerID.cpp @@ -11,7 +11,7 @@ //-------------------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void LCQueryResultPlayerID::read(SocketInputStream& iStream) @@ -43,7 +43,7 @@ void LCQueryResultPlayerID::read(SocketInputStream& iStream) //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void LCQueryResultPlayerID::write(SocketOutputStream& oStream) const diff --git a/src/Core/LCQueryResultPlayerID.h b/src/Core/LCQueryResultPlayerID.h index 71d26182..55f9b899 100644 --- a/src/Core/LCQueryResultPlayerID.h +++ b/src/Core/LCQueryResultPlayerID.h @@ -17,8 +17,8 @@ // // class LCQueryResultPlayerID; // -// Ŭ̾Ʈ α ʿ ϴ Ŷ̴. -// ̵ н尡 ȣȭǾ ִ. +// 클라이언트가 로그인 서버에게 최초에 전송하는 패킷이다. +// 아이디와 패스워드가 암호화되어 있다. // ////////////////////////////////////////////////////////////////////// @@ -29,10 +29,10 @@ class LCQueryResultPlayerID : public Packet { ~LCQueryResultPlayerID() {}; public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/LCQueryResultPlayerIDHandler.cpp b/src/Core/LCQueryResultPlayerIDHandler.cpp index 182b173a..b71a66d7 100644 --- a/src/Core/LCQueryResultPlayerIDHandler.cpp +++ b/src/Core/LCQueryResultPlayerIDHandler.cpp @@ -50,7 +50,7 @@ void LCQueryResultPlayerIDHandler::execute(LCQueryResultPlayerID* pPacket, Playe if (cmd == "1") { //---------------------------------------------------------------------- - // Ư ̵ ̹ ϴ Ѵ. + // 특정 아이디가 이미 존재하는지 쿼리한다. //---------------------------------------------------------------------- cout << "+----------+" << endl << "| QUERY ID |" << endl << "+----------+" << endl << endl << "Query> "; @@ -62,12 +62,12 @@ void LCQueryResultPlayerIDHandler::execute(LCQueryResultPlayerID* pPacket, Playe pClientPlayer->sendPacket(&clQueryPlayerID); - // ÷̾ ¸ ٲ۴. + // 플레이어의 상태를 바꾼다. pClientPlayer->setPlayerStatus(CPS_AFTER_SENDING_CL_QUERY_PLAYER_ID); } else { //---------------------------------------------------------------------- - // Է ޴´. + // 새 사용자 등록 입력을 받는다. //---------------------------------------------------------------------- CLRegisterPlayer clRegisterPlayer; @@ -76,28 +76,28 @@ void LCQueryResultPlayerIDHandler::execute(LCQueryResultPlayerID* pPacket, Playe << "+---------------------+" << endl << endl; - cout << "̵ : "; + cout << "아이디 : "; string id; getline(cin, id); clRegisterPlayer.setID(id); - cout << "н : "; + cout << "패스워드 : "; string password; getline(cin, password); clRegisterPlayer.setPassword(password); - cout << "̸ : "; + cout << "이름 : "; string name; getline(cin, name); clRegisterPlayer.setName(name); - cout << " (/) : "; + cout << "성별 (남/여) : "; string _sex; getline(cin, _sex); - Sex sex = (_sex == "") ? MALE : FEMALE; + Sex sex = (_sex == "남") ? MALE : FEMALE; clRegisterPlayer.setSex(sex); - cout << "ֹεϹȣ : "; + cout << "주민등록번호 : "; string ssn; getline(cin, ssn); clRegisterPlayer.setSSN(ssn); @@ -105,19 +105,19 @@ void LCQueryResultPlayerIDHandler::execute(LCQueryResultPlayerID* pPacket, Playe clRegisterPlayer.setTelephone("02-222-3333"); clRegisterPlayer.setCellular("011-222-3333"); clRegisterPlayer.setZipCode("700-441"); - clRegisterPlayer.setAddress("Ư ǵ 缭 300"); + clRegisterPlayer.setAddress("서울특별시 영등포구 여의도동 사서함 300번지"); clRegisterPlayer.setNation(KOREA); clRegisterPlayer.setEmail("jhkim@mbc.com"); clRegisterPlayer.setHomepage("www.jhkim.com"); - clRegisterPlayer.setProfile("ũ "); + clRegisterPlayer.setProfile("테크노의 여왕 전지현"); clRegisterPlayer.setPublic(false); // cout << clRegisterPlayer.toString() << endl; - // Ŷ Ѵ. + // 등록 패킷을 전송한다. pClientPlayer->sendPacket(&clRegisterPlayer); - // ÷̾ ¸ ٲ۴. + // 플레이어의 상태를 바꾼다. pClientPlayer->setPlayerStatus(CPS_AFTER_SENDING_CL_REGISTER_PLAYER); } diff --git a/src/Core/LCReconnect.cpp b/src/Core/LCReconnect.cpp index c15393e3..51dfe36d 100644 --- a/src/Core/LCReconnect.cpp +++ b/src/Core/LCReconnect.cpp @@ -11,7 +11,7 @@ //---------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //---------------------------------------------------------------------- void LCReconnect::read(SocketInputStream& iStream) @@ -48,7 +48,7 @@ void LCReconnect::read(SocketInputStream& iStream) //---------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //---------------------------------------------------------------------- void LCReconnect::write(SocketOutputStream& oStream) const diff --git a/src/Core/LCReconnect.h b/src/Core/LCReconnect.h index 0b4de6f4..21797dac 100644 --- a/src/Core/LCReconnect.h +++ b/src/Core/LCReconnect.h @@ -17,9 +17,9 @@ // // class LCReconnect; // -// α ް, ij͸ Ŭ̾Ʈ , -// ijͰ ῡ ߴ ˾Ƴ, ϴ -// ϶ Ŷ̴. +// 로그인 서버에서 인증을 받고, 캐릭터를 선택한 클라이언트의 경우, +// 캐릭터가 이전 연결에 존재했던 존을 알아내서, 그 존을 관리하는 +// 게임 서버로 재접속하라는 패킷이다. // ////////////////////////////////////////////////////////////////////// @@ -27,10 +27,10 @@ class LCReconnect : public Packet { public: LCReconnect() {}; ~LCReconnect() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -43,9 +43,9 @@ class LCReconnect : public Packet { // get packet's body size PacketSize_t getPacketSize() const { - return szBYTE + m_GameServerIP.size() // - + szuint // Ʈ - + szDWORD; // Ű + return szBYTE + m_GameServerIP.size() // 게임 서버 아이피 + + szuint // 게임 서버 포트 + + szDWORD; // 인증 키 } // get packet name @@ -120,11 +120,11 @@ class LCReconnectFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LCReconnectPacketMaxSize , ϶. + // const static LCReconnectPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { - return szBYTE + 15 // - + szuint // Ʈ - + szDWORD; // Ű + return szBYTE + 15 // 게임 서버 아이피 + + szuint // 게임 서버 포트 + + szDWORD; // 인증 키 } }; diff --git a/src/Core/LCReconnectHandler.cpp b/src/Core/LCReconnectHandler.cpp index 80bcd7d1..8177635a 100644 --- a/src/Core/LCReconnectHandler.cpp +++ b/src/Core/LCReconnectHandler.cpp @@ -15,8 +15,8 @@ #endif //-------------------------------------------------------------------------------- -// αμκ ּҿ Ʈ, ׸ Ű -// , Ű CGConnect Ŷ Ѵ. +// 로그인서버로부터 게임 서버의 주소와 포트, 그리고 인증키를 받은 즉시 +// 게임 서버로 연결한 후, 인증키를 담은 CGConnect 패킷을 전송한다. //-------------------------------------------------------------------------------- void LCReconnectHandler::execute(LCReconnect* pPacket, Player* pPlayer) @@ -27,19 +27,19 @@ void LCReconnectHandler::execute(LCReconnect* pPacket, Player* pPlayer) ClientPlayer* pClientPlayer = dynamic_cast(pPlayer); - // α Ѵ - // ̶ α LCReconnect Ŷ 鼭 Ѵٴ ǿ ϶. + // 로그인 서버와의 연결을 종료한다 + // 이때 로그인 서버는 LCReconnect 패킷을 보내면서 연결을 종료한다는 사실에 유의하라. // cout << "Disconnecting from login server" << endl; pClientPlayer->disconnect(); - // LCReconnect Ŷ ִ ؼ, Ѵ. + // LCReconnect 패킷에 들어있는 정보를 사용해서, 게임 서버로 연결한다. // cout << "Reconnecting to " << pPacket->getGameServerIP() << ":" << pPacket->getGameServerPort() << endl; try { pClientPlayer->getSocket()->reconnect(pPacket->getGameServerIP(), pPacket->getGameServerPort()); - // reconnectϰ Ǹ ȴ. - // , ɼ Ѵ. + // reconnect하게 되면 소켓이 새로 만들어지게 된다. + // 따라서, 이 소켓 역시 옵션을 새로 지정해줘야 한다. pClientPlayer->getSocket()->setNonBlocking(); pClientPlayer->getSocket()->setLinger(0); @@ -47,8 +47,8 @@ void LCReconnectHandler::execute(LCReconnect* pPacket, Player* pPlayer) throw Error(ce.toString()); } - // ̷, ٷ CGConnect Ŷ Ѵ. - // Select PC Ÿ԰ ̸ Ŭ̾Ʈ ÷̾ ü صд. + // 연결이 이루어지면, 바로 CGConnect 패킷을 전송한다. + // 이전에 Select 한 PC의 타입과 이름을 클라이언트 플레이어 객체에 저장해둔다. // cout << "Sending CGConnect with Key(" << pPacket->getKey() << ")" << endl; CGConnect cgConnect; diff --git a/src/Core/LCRegisterPlayerError.cpp b/src/Core/LCRegisterPlayerError.cpp index 4e8baa38..e0b92043 100644 --- a/src/Core/LCRegisterPlayerError.cpp +++ b/src/Core/LCRegisterPlayerError.cpp @@ -2,7 +2,7 @@ // // Filename : LCRegisterPlayerError.cpp // Written By : Reiot -// Description : α н α Ŭ̾Ʈ ϴ Ŷ +// Description : 로그인 실패시 로그인 서버에서 클라이언트에게 전송하는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -10,7 +10,7 @@ #include "LCRegisterPlayerError.h" ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void LCRegisterPlayerError::read(SocketInputStream& iStream) @@ -24,7 +24,7 @@ void LCRegisterPlayerError::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void LCRegisterPlayerError::write(SocketOutputStream& oStream) const diff --git a/src/Core/LCRegisterPlayerError.h b/src/Core/LCRegisterPlayerError.h index f83741b4..653ea00d 100644 --- a/src/Core/LCRegisterPlayerError.h +++ b/src/Core/LCRegisterPlayerError.h @@ -23,10 +23,10 @@ class LCRegisterPlayerError : public Packet { public: LCRegisterPlayerError() {}; ~LCRegisterPlayerError() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -58,7 +58,7 @@ class LCRegisterPlayerError : public Packet { } private: - // ID + // 에러 ID BYTE m_ErrorID; }; diff --git a/src/Core/LCRegisterPlayerErrorHandler.cpp b/src/Core/LCRegisterPlayerErrorHandler.cpp index 83d3845b..f2695424 100644 --- a/src/Core/LCRegisterPlayerErrorHandler.cpp +++ b/src/Core/LCRegisterPlayerErrorHandler.cpp @@ -44,24 +44,24 @@ void LCRegisterPlayerErrorHandler::execute(LCRegisterPlayerError* pPacket, Playe CLRegisterPlayer clRegisterPlayer; char cmd[80]; - cout << "̵ : "; + cout << "아이디 : "; cin.getline(cmd, 80); clRegisterPlayer.setID(cmd); - cout << "н : "; + cout << "패스워드 : "; cin.getline(cmd, 80); clRegisterPlayer.setPassword(cmd); - cout << "̸ : "; + cout << "이름 : "; cin.getline(cmd, 80); clRegisterPlayer.setName(cmd); - cout << " (/) : "; + cout << "성별 (남/여) : "; cin.getline(cmd, 80); Sex sex; - if (strcmp(cmd, "") == 0) + if (strcmp(cmd, "남") == 0) sex = MALE; - if (strcmp(cmd, "") == 0) + if (strcmp(cmd, "여") == 0) sex = FEMALE; else sex = MALE; @@ -72,19 +72,19 @@ void LCRegisterPlayerErrorHandler::execute(LCRegisterPlayerError* pPacket, Playe clRegisterPlayer.setTelephone("02-222-3333"); clRegisterPlayer.setCellular("011-222-3333"); clRegisterPlayer.setZipCode("700-441"); - clRegisterPlayer.setAddress("Ư ǵ 缭 300"); + clRegisterPlayer.setAddress("서울특별시 영등포구 여의도동 사서함 300번지"); clRegisterPlayer.setNation(KOREA); clRegisterPlayer.setEmail("jhkim@mbc.com"); clRegisterPlayer.setHomepage("www.jhkim.com"); - clRegisterPlayer.setProfile("ũ "); + clRegisterPlayer.setProfile("테크노의 여왕 전지현"); clRegisterPlayer.setPublic(false); cout << clRegisterPlayer.toString() << endl; - // Ŷ Ѵ. + // 등록 패킷을 전송한다. pClientPlayer->sendPacket(&clRegisterPlayer); - // ÷̾ ¸ ٲ۴. + // 플레이어의 상태를 바꾼다. pClientPlayer->setPlayerStatus(CPS_AFTER_SENDING_CL_REGISTER_PLAYER); #endif diff --git a/src/Core/LCRegisterPlayerOK.h b/src/Core/LCRegisterPlayerOK.h index 9822ab58..6cea332a 100644 --- a/src/Core/LCRegisterPlayerOK.h +++ b/src/Core/LCRegisterPlayerOK.h @@ -17,7 +17,7 @@ // // class LCRegisterPlayerOK; // -// αμ Ŭ̾Ʈ α ˷ִ Ŷ̴. +// 로그인서버가 클라이언트에게 로그인 성공을 알려주는 패킷이다. // ////////////////////////////////////////////////////////////////////// @@ -25,10 +25,10 @@ class LCRegisterPlayerOK : public Packet { public: LCRegisterPlayerOK() {}; ~LCRegisterPlayerOK() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -41,7 +41,7 @@ class LCRegisterPlayerOK : public Packet { // get packet body size // *OPTIMIZATION HINT* - // const static LCRegisterPlayerOKPacketSize , ϶. + // const static LCRegisterPlayerOKPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return szBYTE + m_GroupName.size() + szBYTE; } @@ -74,12 +74,12 @@ class LCRegisterPlayerOK : public Packet { } private: - // ׷ ̸. + // 서버 그룹 이름. string m_GroupName; - // : ÷̾ ̼ ΰ? - // true - // false ̼ + // 고어 레벨 : 현재 플레이어가 미성년자 인가? + // true일 경우 성인 + // false 일 경우 미성년자 bool m_isAdult; }; diff --git a/src/Core/LCRegisterPlayerOKHandler.cpp b/src/Core/LCRegisterPlayerOKHandler.cpp index 611be060..31290f8f 100644 --- a/src/Core/LCRegisterPlayerOKHandler.cpp +++ b/src/Core/LCRegisterPlayerOKHandler.cpp @@ -16,7 +16,7 @@ //-------------------------------------------------------------------------------- // -// ÷̾ , α PC LIST ûѴ. +// 플레이어 등록이 성공적으로 끝났으면, 로그인 서버에게 PC LIST 를 요청한다. // //-------------------------------------------------------------------------------- void LCRegisterPlayerOKHandler::execute(LCRegisterPlayerOK* pPacket, Player* pPlayer) diff --git a/src/Core/LCSelectPCError.cpp b/src/Core/LCSelectPCError.cpp index 40e151d3..69f8b75d 100644 --- a/src/Core/LCSelectPCError.cpp +++ b/src/Core/LCSelectPCError.cpp @@ -10,7 +10,7 @@ #include "LCSelectPCError.h" ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void LCSelectPCError::read(SocketInputStream& iStream) @@ -24,7 +24,7 @@ void LCSelectPCError::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void LCSelectPCError::write(SocketOutputStream& oStream) const diff --git a/src/Core/LCSelectPCError.h b/src/Core/LCSelectPCError.h index 803795d4..3c06e4e4 100644 --- a/src/Core/LCSelectPCError.h +++ b/src/Core/LCSelectPCError.h @@ -16,19 +16,19 @@ enum SELECT_PC_ERROR { SELECT_PC_ERROR_NULL, - SELECT_PC_CANNOT_PLAY, // ij( ) - SELECT_PC_NOT_BILLING_CHECK, // üũ ʾҴ. - SELECT_PC_CANNOT_PLAY_BY_ATTR, // ɷġ ̻ Ѵ. - SELECT_PC_DIDNOT_AGREE, // ݸ ʾƼ ÷ . + SELECT_PC_CANNOT_PLAY, // 게임 할 수 없는 캐릭터(빌링 관련) + SELECT_PC_NOT_BILLING_CHECK, // 아직 결제 정보가 체크되지 않았다. + SELECT_PC_CANNOT_PLAY_BY_ATTR, // 능력치 문제로 더 이상 무료겜 못한다. + SELECT_PC_DIDNOT_AGREE, // 넷마블 약관에 동의하지 않아서 플레이 할 수 없다. }; ////////////////////////////////////////////////////////////////////// // // class LCSelectPCError; // -// ÷̾ PC , Ǵ α׾ƿߴ -// ٿǾ , Ǵ DB ٿǾ , -// Ŷ Ƽ Ŭ̾Ʈ Ѵ. +// 플레이어가 선택한 PC 가 존재하지 않을 경우, 또는 이전에 로그아웃했던 +// 존의 게임 서버가 다운되었을 경우, 또는 DB 서버가 다운되었을 경우, +// 이 패킷에 에러 이유를 담아서 클라이언트로 전송한다. // ////////////////////////////////////////////////////////////////////// @@ -36,10 +36,10 @@ class LCSelectPCError : public Packet { public: LCSelectPCError() {}; ~LCSelectPCError() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -72,7 +72,7 @@ class LCSelectPCError : public Packet { } private: - // ޽ + // 에러 메시지 BYTE m_Code; }; diff --git a/src/Core/LCServerListHandler.cpp b/src/Core/LCServerListHandler.cpp index 21a0dae8..f9017803 100644 --- a/src/Core/LCServerListHandler.cpp +++ b/src/Core/LCServerListHandler.cpp @@ -19,9 +19,9 @@ #endif //---------------------------------------------------------------------- -// κ ij Ʈ ޾Ҵ. -// ij ̽ ۹ ־ -// . +// 서버로부터 캐릭터 리스트를 받았다. +// 이제 캐릭터 관리 인터페이스의 적절한 곳에 전송받은 값을 집어 넣어서 +// 출력하자. //---------------------------------------------------------------------- void LCServerListHandler::execute(LCServerList* pPacket, Player* pPlayer) diff --git a/src/Core/LCVersionCheckError.cpp b/src/Core/LCVersionCheckError.cpp index 48c326b9..f644698d 100644 --- a/src/Core/LCVersionCheckError.cpp +++ b/src/Core/LCVersionCheckError.cpp @@ -2,7 +2,7 @@ // // Filename : LCVersionCheckError.cpp // Written By : Reiot -// Description : α н α Ŭ̾Ʈ ϴ Ŷ +// Description : 로그인 실패시 로그인 서버에서 클라이언트에게 전송하는 패킷 // ////////////////////////////////////////////////////////////////////// @@ -10,7 +10,7 @@ #include "LCVersionCheckError.h" ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void LCVersionCheckError::read(SocketInputStream& iStream) @@ -21,7 +21,7 @@ void LCVersionCheckError::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void LCVersionCheckError::write(SocketOutputStream& oStream) const diff --git a/src/Core/LCVersionCheckError.h b/src/Core/LCVersionCheckError.h index 5059bfd5..7aa15f0d 100644 --- a/src/Core/LCVersionCheckError.h +++ b/src/Core/LCVersionCheckError.h @@ -24,10 +24,10 @@ class LCVersionCheckError : public Packet { public: LCVersionCheckError() {}; virtual ~LCVersionCheckError() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler diff --git a/src/Core/LCVersionCheckOK.h b/src/Core/LCVersionCheckOK.h index cf47e474..384ee0d4 100644 --- a/src/Core/LCVersionCheckOK.h +++ b/src/Core/LCVersionCheckOK.h @@ -17,7 +17,7 @@ // // class LCVersionCheckOK; // -// αμ Ŭ̾Ʈ α ˷ִ Ŷ̴. +// 로그인서버가 클라이언트에게 로그인 성공을 알려주는 패킷이다. // ////////////////////////////////////////////////////////////////////// @@ -25,10 +25,10 @@ class LCVersionCheckOK : public Packet { public: LCVersionCheckOK() {}; virtual ~LCVersionCheckOK() {}; - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -41,7 +41,7 @@ class LCVersionCheckOK : public Packet { // get packet body size // *OPTIMIZATION HINT* - // const static LCVersionCheckOKPacketSize , ϶. + // const static LCVersionCheckOKPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const { return 0; } diff --git a/src/Core/LCVersionCheckOKHandler.cpp b/src/Core/LCVersionCheckOKHandler.cpp index e678305a..f4f5ad4b 100644 --- a/src/Core/LCVersionCheckOKHandler.cpp +++ b/src/Core/LCVersionCheckOKHandler.cpp @@ -11,9 +11,9 @@ //---------------------------------------------------------------------- // -// α κ ̵ н ޾Ҵٴ Ҹ. +// 로그인 서버로부터 아이디와 패스워드의 인증을 받았다는 소리다. // -// α PC Ʈ ûϴ Ŷ ϸ ȴ. +// 이제 로그인 서버에게 PC 의 리스트를 요청하는 패킷을 전송하면 된다. // //---------------------------------------------------------------------- void LCVersionCheckOKHandler::execute(LCVersionCheckOK* pPacket, Player* pPlayer) diff --git a/src/Core/LCWorldListHandler.cpp b/src/Core/LCWorldListHandler.cpp index c45f5fe9..211dd5dc 100644 --- a/src/Core/LCWorldListHandler.cpp +++ b/src/Core/LCWorldListHandler.cpp @@ -10,9 +10,9 @@ #include "LCWorldList.h" //---------------------------------------------------------------------- -// κ ij Ʈ ޾Ҵ. -// ij ̽ ۹ ־ -// . +// 서버로부터 캐릭터 리스트를 받았다. +// 이제 캐릭터 관리 인터페이스의 적절한 곳에 전송받은 값을 집어 넣어서 +// 출력하자. //---------------------------------------------------------------------- void LCWorldListHandler::execute(LCWorldList* pPacket, Player* pPlayer) diff --git a/src/Core/LGIncomingConnection.cpp b/src/Core/LGIncomingConnection.cpp index bef1b637..02c19c43 100644 --- a/src/Core/LGIncomingConnection.cpp +++ b/src/Core/LGIncomingConnection.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void LGIncomingConnection::read(Datagram& iDatagram) @@ -68,7 +68,7 @@ void LGIncomingConnection::read(Datagram& iDatagram) ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void LGIncomingConnection::write(Datagram& oDatagram) const diff --git a/src/Core/LGIncomingConnection.h b/src/Core/LGIncomingConnection.h index 37bdcc29..032f30eb 100644 --- a/src/Core/LGIncomingConnection.h +++ b/src/Core/LGIncomingConnection.h @@ -18,18 +18,18 @@ // // class LGIncomingConnection; // -// α ڰ Ϸ , α -//  ּҿ  ڰ  ũó α -// ̴.. ˷ִ Ŷ̴. +// 로그인 서버에서 사용자가 게임 서버로 접속하려고 할 때, 로그인 서버는 +// 그 게임 서버에게 어떤 주소에서 어떤 사용자가 어떤 크리처로 로그인할 +// 것이다.. 라고 알려주는 패킷이다. // // *CAUTION* // -// ũó ̸ ʿѰ? ϴ ǹ ְڴµ, -// 츦 ʿϰ ȴ. α κ Slot3 ij͸ -// س, ؼ SLOT2 ij͸ εش޶ -// ִ ̴. ̸ ؼ, CLSelectPC ij͸ -// ˷ ϸ, CGConnect ij ̵ ؼ -// ٷ εϵ ؾ Ѵ. +// 굳이 크리처 이름이 필요한가? 하는 의문이 있을 수 있겠는데, 다음과 같은 +// 경우를 고려했을때 필요하게 된다. 로그인 서버로부터 Slot3 캐릭터를 선택 +// 해놓고, 실제로 게임 서버에 접속해서는 SLOT2 캐릭터를 로딩해달라고 할 +// 수가 있는 것이다. 이를 막기 위해서, CLSelectPC로 선택한 캐릭터를 +// 게임 서버에게 알려줘야 하며, CGConnect 에서도 캐릭터 아이디를 포함해서 +// 바로 로딩하도록 해야 한다. // //---------------------------------------------------------------------- @@ -37,10 +37,10 @@ class LGIncomingConnection : public DatagramPacket { public: LGIncomingConnection() {}; ~LGIncomingConnection() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(Datagram& iDatagram); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(Datagram& oDatagram) const; // execute packet's handler @@ -98,7 +98,7 @@ class LGIncomingConnection : public DatagramPacket { // PC name string m_PCName; - // Ŭ̾Ʈ IP + // 클라이언트의 IP string m_ClientIP; }; @@ -130,7 +130,7 @@ class LGIncomingConnectionFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionPacketMaxSize , ϶. + // const static LGIncomingConnectionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return +szBYTE + 20 // creature name + szBYTE + 20 // PC name diff --git a/src/Core/LGIncomingConnectionError.h b/src/Core/LGIncomingConnectionError.h index 58686cf9..d89b2c6e 100644 --- a/src/Core/LGIncomingConnectionError.h +++ b/src/Core/LGIncomingConnectionError.h @@ -24,10 +24,10 @@ class LGIncomingConnectionError : public DatagramPacket { public: LGIncomingConnectionError() {}; ~LGIncomingConnectionError() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(Datagram& iDatagram); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(Datagram& oDatagram) const; // execute packet's handler @@ -103,7 +103,7 @@ class LGIncomingConnectionErrorFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionErrorPacketMaxSize , ϶. + // const static LGIncomingConnectionErrorPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + 128; } diff --git a/src/Core/LGIncomingConnectionErrorHandler.cpp b/src/Core/LGIncomingConnectionErrorHandler.cpp index c40bc38e..3fc66a74 100644 --- a/src/Core/LGIncomingConnectionErrorHandler.cpp +++ b/src/Core/LGIncomingConnectionErrorHandler.cpp @@ -25,23 +25,23 @@ void LGIncomingConnectionErrorHandler::execute(LGIncomingConnectionError* pPacke __BEGIN_TRY __BEGIN_DEBUG_EX #ifdef __GAME_SERVER__ - // α ÷̾ Ѵ. + // 로그인 플레이어에 접근한다. // // *CAUTION* // - // ̷ ִ. α ÷̾ Ŵ ÷̾ óϰ - // , Ʒ .. - -; .. ̷ Ǹ setPlayerStatus() - // ŷ ϴ°.. ϴ ̷ .. ( Է ̹Ƿ - // ó ʴ´..) + // 이런 접근 방식은 문제가 있다. 로그인 플레이어 매니저가 이 플레이어를 처리하고 있을 + // 경우, 아래와 같이 접속을 종료해 버리면.. - -; 흐흠.. 이렇게 되면 setPlayerStatus() + // 역시 락킹 버전으로 만들어야 하는가.. 일단은 이렇게 하장.. (대충 입력이 없을 것이므로 + // 처리받지는 않는다..) // - // , Է ̷ϴ Ұϴٴ ̴. ֳϸ, ̷ - // Է ۿ Ŷ ܼ Դٴ ̴. + // 주의할 점은, 입력으로 리다이렉션하는 것이 불가능하다는 것이다. 왜냐하면, 리다이렉션 + // 시점에서 입력 버퍼에 패킷이 딱 끊겨서 들어왔다는 것을 알 수 없기 때문이다. try { GamePlayer* pGamePlayer = g_pIncomingPlayerManager->getPlayer(pPacket->getPlayerID()); Assert(pGamePlayer->getPlayerStatus() == GPS_AFTER_SENDING_GL_INCOMING_CONNECTION); - // ÷̾ α Ƿ Ѵ. + // 이 플레이어의 로그인이 실패했으므로 접속을 종료한다. cout << "Fail to join game server...(" << pPacket->getPlayerID() << ")" << endl; int fd = -1; diff --git a/src/Core/LGIncomingConnectionHandler.cpp b/src/Core/LGIncomingConnectionHandler.cpp index 1cedc9ca..2579111b 100644 --- a/src/Core/LGIncomingConnectionHandler.cpp +++ b/src/Core/LGIncomingConnectionHandler.cpp @@ -25,8 +25,8 @@ // // LGIncomingConnectionHander::execute() // -// α κ LGIncomingConnection Ŷ ް Ǹ, -// ConnectionInfo ߰ϰ ȴ. +// 게임 서버가 로그인 서버로부터 LGIncomingConnection 패킷을 받게 되면, +// ConnectionInfo를 새로 추가하게 된다. // //---------------------------------------------------------------------- void LGIncomingConnectionHandler::execute(LGIncomingConnection* pPacket) @@ -38,33 +38,33 @@ void LGIncomingConnectionHandler::execute(LGIncomingConnection* pPacket) //-------------------------------------------------------------------------------- // - // Ű Ѵ. + // 인증키를 생성한다. // // *NOTE* // - // α Ű ؼ Ӽ , Ŭ̾Ʈ - // ߴ. ̷ CLSelectPCHandler::execute() Ű ϰ - // GLIncomingConnectionOKHandler::execute() Ű Ŭ̾Ʈ Ǵµ, - // ó ޽尡 ٸǷ Ű 𿡼 Ǿ Ѵ. ܼ α - // ÷̾ ü ϸ Ǵµ.. ϴ. Ǵٸ ٽ - // α Ű ǵִ ε, ̴ Ʈũ Ű 2ȸ պѴٴ - // ʿϴ. + // 기존의 방식은 로그인 서버에서 인증키를 생성해서 게임서버에 보낸 후, 클라이언트로 + // 전송했다. 이렇게 할 경우 CLSelectPCHandler::execute()에서 인증키를 생성하고 + // GLIncomingConnectionOKHandler::execute()에서 인증키를 클라이언트로 보내게 되는데, + // 처리 메쏘드가 다르므로 키값이 어디에선가 유지되어야 한다. 가장 단순한 방법은 로그인 + // 플레이어 객체에 저장하면 되는데.. 뭔가 꾸지하다. 또다른 방법은 게임 서버에서 다시 + // 로그인 서버로 키값을 되돌려주는 것인데, 이는 네트워크상에 키값이 2회 왕복한다는 + // 점에서 불필요하다. // - // , ؼ αμ ִ ξ ȴ. + // 따라서, 게임 서버에서 생성해서 로그인서버에 보내주는 편이 훨씬 깔끔해지게 된다. // // *TODO* // - // ־ , óƮũ ۸ؼ Ű ִ. (ϱ Ʈ - // н尡 ɼ ִµ.. - -; ̷ ž SSL ϴ°Ű..) - // ̸ ؼ GLIncomingConnectionOK Ŷ ȣȭǾ Ѵ. + // 최악의 경우, 로컬네트워크가 스니퍼링당해서 키값이 유출될 수 있다. (하긴 뭐 루트 + // 패스워드가 유출될 가능성도 있는데.. - -; 이런 거야 SSL을 써야 하는거고..) + // 이를 대비해서 GLIncomingConnectionOK 패킷은 암호화되어야 한다. // - // Ű Ұؾ Ѵ. ( ڵ带 .) + // 또한 키값은 예측불가능해야 한다. (어차피 코드를 보면 예측가능해진다.) // //-------------------------------------------------------------------------------- DWORD authKey = rand() << ((time(0) % 10) + rand()) >> (time(0) % 10); - // CI ü Ѵ. + // CI 객체를 생성한다. ConnectionInfo* pConnectionInfo = new ConnectionInfo(); pConnectionInfo->setClientIP(pPacket->getClientIP()); pConnectionInfo->setKey(authKey); @@ -73,11 +73,11 @@ void LGIncomingConnectionHandler::execute(LGIncomingConnection* pPacket) //-------------------------------------------------------------------------------- // - // ð + 20 ĸ expire time Ѵ. + // 현재 시간 + 20 초 후를 expire time 으로 설정한다. // // *TODO* // - // expire period Config Ͽ ָ ڴ. + // expire period 역시 Config 파일에서 지정해주면 좋겠다. // //-------------------------------------------------------------------------------- Timeval currentTime; @@ -96,7 +96,7 @@ void LGIncomingConnectionHandler::execute(LGIncomingConnection* pPacket) */ try { - // CIM ߰Ѵ. + // CIM 에 추가한다. g_pConnectionInfoManager->addConnectionInfo(pConnectionInfo); // by sigi. 2002.12.7 @@ -104,7 +104,7 @@ void LGIncomingConnectionHandler::execute(LGIncomingConnection* pPacket) pPacket->getPCName().c_str(), pPacket->getClientIP().c_str(), authKey); - // α ٽ ˷ش. + // 로그인 서버에게 다시 알려준다. GLIncomingConnectionOK glIncomingConnectionOK; glIncomingConnectionOK.setPlayerID(pPacket->getPlayerID()); glIncomingConnectionOK.setTCPPort(g_pConfig->getPropertyInt("TCPPort")); @@ -116,7 +116,7 @@ void LGIncomingConnectionHandler::execute(LGIncomingConnection* pPacket) cout << "LGIncomingConnectionHandler Send Packet to ServerPort : " << pPacket->getPort() << endl; } catch (DuplicatedException& de) { - // CI ϰ, α GLIncomingConnectionError Ŷ Ѵ. + // 실패했을 경우 CI 를 삭제하고, 로그인 서버에게 GLIncomingConnectionError 패킷을 전송한다. SAFE_DELETE(pConnectionInfo); // GLIncomingConnectionError glIncomingConnectionError; diff --git a/src/Core/LGIncomingConnectionOK.cpp b/src/Core/LGIncomingConnectionOK.cpp index a53d35f2..636efcdc 100644 --- a/src/Core/LGIncomingConnectionOK.cpp +++ b/src/Core/LGIncomingConnectionOK.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void LGIncomingConnectionOK::read(Datagram& iDatagram) @@ -48,7 +48,7 @@ void LGIncomingConnectionOK::read(Datagram& iDatagram) ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void LGIncomingConnectionOK::write(Datagram& oDatagram) const diff --git a/src/Core/LGIncomingConnectionOK.h b/src/Core/LGIncomingConnectionOK.h index dad3ed53..e3569306 100644 --- a/src/Core/LGIncomingConnectionOK.h +++ b/src/Core/LGIncomingConnectionOK.h @@ -24,10 +24,10 @@ class LGIncomingConnectionOK : public DatagramPacket { public: LGIncomingConnectionOK() {}; ~LGIncomingConnectionOK() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(Datagram& iDatagram); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(Datagram& oDatagram) const; // execute packet's handler @@ -77,14 +77,14 @@ class LGIncomingConnectionOK : public DatagramPacket { } private: - //  ÷̾ LCReconnect Ŷ ϴ ˾ƾ Ѵ. + // 어떤 플레이어에게 LCReconnect 패킷을 보내야 하는지는 알아야 한다. string m_PlayerID; - // ڽ TCP Ʈ ˷ν - // α TCP Ʈ ϴ. + // 게임 서버가 자신의 TCP 포트를 알려줌으로써 + // 로그인 서버는 게임 서버의 TCP 포트를 몰라도 무방하다. uint m_TCPPort; - // Ű + // 게임 서버에서 생성한 인증 키 DWORD m_Key; }; @@ -116,7 +116,7 @@ class LGIncomingConnectionOKFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionOKPacketMaxSize , ϶. + // const static LGIncomingConnectionOKPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + 20 + szuint + szDWORD; } diff --git a/src/Core/LGIncomingConnectionOKHandler.cpp b/src/Core/LGIncomingConnectionOKHandler.cpp index 327845ea..29124a62 100644 --- a/src/Core/LGIncomingConnectionOKHandler.cpp +++ b/src/Core/LGIncomingConnectionOKHandler.cpp @@ -25,9 +25,9 @@ // // LGIncomingConnectionOKHander::execute() // -// α κ LGIncomingConnectionOK Ŷ ƿ, 㰡 -// ÷̾ 㰡 ãƳ Ѵ. , ÷̾ LCReconnectLogin -// Ŷ Ѵ. +// 로그인 서버로부터 LGIncomingConnectionOK 패킷이 날아오면, 게임 서버는 이 허가가 +// 어느 플레이어에 대한 허가인지 찾아내야 한다. 그 후, 이 플레이어에게 LCReconnectLogin +// 패킷을 던져줘야 한다. // //-------------------------------------------------------------------------------- void LGIncomingConnectionOKHandler::execute(LGIncomingConnectionOK* pPacket) { @@ -36,7 +36,7 @@ void LGIncomingConnectionOKHandler::execute(LGIncomingConnectionOK* pPacket) { try { - // ÷̾ ̵ ؼ ÷̾ ü Ѵ. + // 플레이어 아이디를 사용해서 플레이어 객체에 접근한다. // __ENTER_CRITICAL_SECTION((*g_pIncomingPlayerManager)) GamePlayer* pGamePlayer = NULL; @@ -58,24 +58,24 @@ void LGIncomingConnectionOKHandler::execute(LGIncomingConnectionOK* pPacket) { (pSocket == NULL ? "NULL" : pSocket->getHost().c_str())); /* - // Ŭ̾Ʈ ϶ ˷ش. + // 클라이언트에게 게임 서버로 재접속하라고 알려준다. GCReconnectLogin gcReconnectLogin; gcReconnectLogin.setLoginServerIP(pPacket->getHost()); gcReconnectLogin.setLoginServerPort(pPacket->getTCPPort()); gcReconnectLogin.setKey(pPacket->getKey()); - // LCReconnectLogin Ŷ Ѵ. + // LCReconnectLogin 패킷을 전송한다. pGamePlayer->sendPacket(&gcReconnectLogin); cout << "LGIncomingConnectionOKHandler Send Packet to Client Required Reconnect ServerIP : " << pPacket->getHost() << endl; */ - // ׳ Ÿֿ̹ Ŷ ´µ.. - // Ÿ̹ ȵƴµ client ӿû ؿ - // ©.. - // GamePlayer صΰ.. IncomingPlayerManager disconnect()ɶ - // ص packet client . + // 원래는 그냥 이 타이밍에 패킷을 보냈는데.. + // 타이밍 문제로 접속해제가 제대로 안됐는데 client에서 접속요청을 해오기 때문에 + // 짤려서.. + // GamePlayer에 저장해두고.. IncomingPlayerManager에서 disconnect()될때 + // 저장해둔 packet을 client로 보낸다. GCReconnectLogin* gcReconnectLogin = new GCReconnectLogin; gcReconnectLogin->setLoginServerIP(pPacket->getHost()); gcReconnectLogin->setLoginServerPort(pPacket->getTCPPort()); @@ -97,19 +97,19 @@ void LGIncomingConnectionOKHandler::execute(LGIncomingConnectionOK* pPacket) { } - // ̷ θ, - // GamePlayer->processCommand() isPenaltyFlag()üũ ɷ - // IncomingPlayer->processCommands() ߸ ȴ. + // 이렇게 해 두면, + // GamePlayer->processCommand()에서 isPenaltyFlag()체크에서 걸려서 + // 다음 턴의 IncomingPlayer->processCommands()에서 잘리게 된다. pGamePlayer->setPenaltyFlag(PENALTY_TYPE_KICKED); pGamePlayer->setItemRatioBonusPoint(3); - // Ѵ. + // 연결을 종료한다. // pGamePlayer->disconnect(UNDISCONNECTED); - // LPM Ѵ. + // LPM에서 삭제한다. // g_pIncomingPlayerManager->deletePlayer_NOBLOCKED(pGamePlayer->getSocket()->getSOCKET()); - // GamePlayer ü Ѵ. + // GamePlayer 객체를 삭제한다. // SAFE_DELETE(pGamePlayer); //__LEAVE_CRITICAL_SECTION((*g_pIncomingPlayerManager)) diff --git a/src/Core/LGKickCharacter.cpp b/src/Core/LGKickCharacter.cpp index a923abd6..5b1dcb8d 100644 --- a/src/Core/LGKickCharacter.cpp +++ b/src/Core/LGKickCharacter.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void LGKickCharacter::read(Datagram& iDatagram) @@ -40,7 +40,7 @@ void LGKickCharacter::read(Datagram& iDatagram) ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void LGKickCharacter::write(Datagram& oDatagram) const diff --git a/src/Core/LGKickCharacter.h b/src/Core/LGKickCharacter.h index 25291ac0..816d18fc 100644 --- a/src/Core/LGKickCharacter.h +++ b/src/Core/LGKickCharacter.h @@ -18,10 +18,10 @@ // // class LGKickCharacter; // -// '̹ ' ذ ؼ -// ̹ ij͸ Ϸ ϴ Ŷ̴. +// '이미 접속중' 문제 해결을 위해서 +// 이미 접속중인 캐릭터를 제거하려고 하는 패킷이다. // -// packet LGKickVerify̴. +// 이 packet의 결과는 LGKickVerify이다. // //---------------------------------------------------------------------- @@ -29,10 +29,10 @@ class LGKickCharacter : public DatagramPacket { public: LGKickCharacter() {}; ~LGKickCharacter() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(Datagram& iDatagram); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(Datagram& oDatagram) const; // execute packet's handler @@ -108,7 +108,7 @@ class LGKickCharacterFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGKickCharacterPacketMaxSize , ϶. + // const static LGKickCharacterPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szBYTE + 20 // PC name + szuint; diff --git a/src/Core/LGKickCharacterHandler.cpp b/src/Core/LGKickCharacterHandler.cpp index 6b169903..2271b62f 100644 --- a/src/Core/LGKickCharacterHandler.cpp +++ b/src/Core/LGKickCharacterHandler.cpp @@ -24,8 +24,8 @@ // // LGKickCharacterHander::execute() // -// α κ LGKickCharacter Ŷ ް Ǹ, -// ConnectionInfo ߰ϰ ȴ. +// 게임 서버가 로그인 서버로부터 LGKickCharacter 패킷을 받게 되면, +// ConnectionInfo를 새로 추가하게 된다. // //---------------------------------------------------------------------- void LGKickCharacterHandler::execute(LGKickCharacter* pPacket) @@ -34,7 +34,7 @@ void LGKickCharacterHandler::execute(LGKickCharacter* pPacket) __BEGIN_TRY __BEGIN_DEBUG_EX #ifdef __GAME_SERVER__ - // + // 냐햐햐 /* if (!g_pPCFinder->setKickCharacter(pPacket->getPCName(), pPacket->getHost(), pPacket->getPort() )) { @@ -56,10 +56,10 @@ void LGKickCharacterHandler::execute(LGKickCharacter* pPacket) __ENTER_CRITICAL_SECTION((*g_pPCFinder)) - // ̸ ڸ ãƿ´. + // 이름으로 사용자를 찾아온다. Creature* pCreature = g_pPCFinder->getCreature_LOCKED(pPacket->getPCName()); - // ijͰ 쿡 GLKickVerify(false) . + // 캐릭터가 없는 경우에는 GLKickVerify(false)를 보낸다. if (pCreature == NULL) { GLKickVerify glKickVerify; glKickVerify.setKicked(false); @@ -81,14 +81,14 @@ void LGKickCharacterHandler::execute(LGKickCharacter* pPacket) try { pGamePlayer = dynamic_cast(pCreature->getPlayer()); } catch (Throwable& t) { - // pCreature->getPlayer()ȿ Assert(m_pPlayer!=NULL)̴. + // pCreature->getPlayer()안에서 Assert(m_pPlayer!=NULL)때문이다. // filelog("kickCharacterAssert.txt", "%s", t.toString().c_str()); g_pPCFinder->unlock(); return; } // Assert(pGamePlayer!=NULL); - if (pGamePlayer == NULL) //  ұ? -_-; + if (pGamePlayer == NULL) // 어떻게 가능할까? -_-; { g_pPCFinder->unlock(); return; @@ -103,12 +103,12 @@ void LGKickCharacterHandler::execute(LGKickCharacter* pPacket) (pSocket == NULL ? "NULL" : pSocket->getHost().c_str())); - // Ų. + // 강제 종료 시킨다. pGamePlayer->setPenaltyFlag(PENALTY_TYPE_KICKED); pGamePlayer->setItemRatioBonusPoint(4); pGamePlayer->setKickForLogin(true); - // , .. + // 접속 해제 후, 응답을 보내줄 곳.. pGamePlayer->setKickRequestHost(pPacket->getHost()); pGamePlayer->setKickRequestPort(pPacket->getPort()); diff --git a/src/Core/LevelWarInfo.cpp b/src/Core/LevelWarInfo.cpp index e2db8271..38722fcc 100644 --- a/src/Core/LevelWarInfo.cpp +++ b/src/Core/LevelWarInfo.cpp @@ -10,7 +10,7 @@ #include "LevelWarInfo.h" ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void LevelWarInfo::read(SocketInputStream& iStream) { __BEGIN_TRY @@ -23,7 +23,7 @@ void LevelWarInfo::read(SocketInputStream& iStream) { ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void LevelWarInfo::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/LevelWarInfo.h b/src/Core/LevelWarInfo.h index 18967a21..7590e749 100644 --- a/src/Core/LevelWarInfo.h +++ b/src/Core/LevelWarInfo.h @@ -25,10 +25,10 @@ class LevelWarInfo : public WarInfo { LevelWarInfo() {} ~LevelWarInfo() {} - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; PacketSize_t getSize() const { @@ -61,7 +61,7 @@ class LevelWarInfo : public WarInfo { } private: - int m_Level; // ΰ + int m_Level; // 몇 레벨 전쟁인가 }; #endif diff --git a/src/Core/NicknameInfo.h b/src/Core/NicknameInfo.h index c6b1b749..e7666af3 100644 --- a/src/Core/NicknameInfo.h +++ b/src/Core/NicknameInfo.h @@ -13,12 +13,12 @@ class NicknameInfo { public: enum { - NICK_NONE = 0, // г - NICK_BUILT_IN, // Ϲ ڵ ־ г (ε) - NICK_QUEST, // Ʈ Ŭ ޴ г (ε) - NICK_FORCED, // ٿ г (ε) - NICK_CUSTOM_FORCED, // ٿ г (Ʈ) - NICK_CUSTOM, // Ӱ г (Ʈ) + NICK_NONE = 0, // 닉네임 없음 + NICK_BUILT_IN, // 일반적으로 자동으로 주어지는 닉네임 (인덱스) + NICK_QUEST, // 퀘스트 클리어한 뒤 받는 닉네임 (인덱스) + NICK_FORCED, // 강제로 붙여진 닉네임 (인덱스) + NICK_CUSTOM_FORCED, // 강제로 붙여진 닉네임 (스트링) + NICK_CUSTOM, // 유저가 자유롭게 넣은 닉네임 (스트링) }; PacketSize_t getSize() const; @@ -59,7 +59,7 @@ class NicknameInfo { WORD m_NicknameID; BYTE m_NicknameType; string m_Nickname; - WORD m_NicknameIndex; // Ʈ Ǵ ε ϳ ȴ. + WORD m_NicknameIndex; // 스트링 또는 인덱스 하나만 사용된다. }; #endif diff --git a/src/Core/OustersSkillInfo.cpp b/src/Core/OustersSkillInfo.cpp index 26b8c7bd..a3d17192 100644 --- a/src/Core/OustersSkillInfo.cpp +++ b/src/Core/OustersSkillInfo.cpp @@ -32,7 +32,7 @@ OustersSkillInfo::OustersSkillInfo() { OustersSkillInfo::~OustersSkillInfo() { __BEGIN_TRY - // Ҽӵ ü Ѵ. + // 소속된 모든 객체들을 삭제한다. while (!m_SubOustersSkillInfoList.empty()) { SubOustersSkillInfo* pSubOustersSkillInfo = m_SubOustersSkillInfoList.front(); SAFE_DELETE(pSubOustersSkillInfo); @@ -44,12 +44,12 @@ OustersSkillInfo::~OustersSkillInfo() { ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void OustersSkillInfo::read(SocketInputStream& iStream) { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. iStream.read(m_bLearnNewSkill); iStream.read(m_ListNum); @@ -64,12 +64,12 @@ void OustersSkillInfo::read(SocketInputStream& iStream) { ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void OustersSkillInfo::write(SocketOutputStream& oStream) const { __BEGIN_TRY - // ȭ ۾ ũ⸦ ϵ Ѵ. + // 최적화 작업시 실제 크기를 명시하도록 한다. oStream.write(m_bLearnNewSkill); oStream.write(m_ListNum); diff --git a/src/Core/OustersSkillInfo.h b/src/Core/OustersSkillInfo.h index 4f460cfe..7d5751d0 100644 --- a/src/Core/OustersSkillInfo.h +++ b/src/Core/OustersSkillInfo.h @@ -20,7 +20,7 @@ // // class OustersSkillInfo; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -33,14 +33,14 @@ class OustersSkillInfo : public PCSkillInfo { ~OustersSkillInfo(); public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. PacketSize_t getSize(); static uint getMaxSize() { @@ -85,7 +85,7 @@ class OustersSkillInfo : public PCSkillInfo { } private: - // New ų ִ + // New 스킬을 배울 수 있느냐 없느냐 정보 bool m_bLearnNewSkill; // SubOustersSkillInfo List Total Number diff --git a/src/Core/PCInfo.h b/src/Core/PCInfo.h index 01e9eed2..85e51718 100644 --- a/src/Core/PCInfo.h +++ b/src/Core/PCInfo.h @@ -19,10 +19,10 @@ // // class PCInfo; // -// LCPCList Ŷ ܼ ƿ SlayerPCInfo, VampirePCInfo Ŭ ̽ -// Ŭ̴. LCPCList Ŷ PCInfo* [3] Ǹ, DB ij -// ڿ , ⿡ SlayerPCInfo, VampirePCInfo Ǵ NULL -// ȴ. +// LCPCList 패킷에 담겨서 날아오는 SlayerPCInfo, VampirePCInfo 클래스의 베이스 +// 클래스이다. LCPCList 패킷에는 PCInfo* [3] 이 저장되며, DB 상의 캐릭터의 +// 숫자에 따라서, 여기에 실제 SlayerPCInfo, VampirePCInfo 또는 NULL 이 저장 +// 된다. // //---------------------------------------------------------------------- @@ -31,11 +31,11 @@ class PCInfo { // destructor virtual ~PCInfo() {} - // νϽ ̾ ̾.. + // 현재 인스턴스가 슬레이어인지 뱀파이어인지.. virtual PCType getPCType() const = 0; //---------------------------------------------------------------------- - // Ŷ embedding Ƿ ü Ʒ Ÿ ؾ Ѵ. + // 패킷에 embedding 되려는 객체는 아래와 같은 데이타를 명시해야 한다. //---------------------------------------------------------------------- // read data from socket input stream diff --git a/src/Core/PCOustersInfo.cpp b/src/Core/PCOustersInfo.cpp index a30e7329..51bb5b0e 100644 --- a/src/Core/PCOustersInfo.cpp +++ b/src/Core/PCOustersInfo.cpp @@ -63,9 +63,9 @@ void PCOustersInfo::read(SocketInputStream& iStream) { BYTE shapeType; iStream.read(shapeType); - // 1,2,3 bit CoatType ̴ + // 1,2,3 bit 은 CoatType 이다 m_CoatType = (OustersCoatType)(shapeType & 7); - // 4 bit ArmType ̴ + // 4 bit 은 ArmType 이다 m_ArmType = (OustersArmType)((shapeType >> 3) & 1); //-------------------------------------------------- @@ -156,8 +156,8 @@ void PCOustersInfo::write(SocketOutputStream& oStream) const { //-------------------------------------------------- // write Shape //-------------------------------------------------- - // 1,2,3 bit CoatType ̴ - // 4 bit ArmType ̴ + // 1,2,3 bit 은 CoatType 이다 + // 4 bit 은 ArmType 이다 BYTE shapeType = 0; shapeType = (m_ArmType << 3) | m_CoatType; oStream.write(shapeType); diff --git a/src/Core/PCOustersInfo.h b/src/Core/PCOustersInfo.h index 5a468b01..b0bcef56 100644 --- a/src/Core/PCOustersInfo.h +++ b/src/Core/PCOustersInfo.h @@ -10,9 +10,9 @@ #include "PCInfo.h" ////////////////////////////////////////////////////////////////////////////// -// Ousters ִ ü. -// GCPCList Ŷ ܼ Ŭ̾Ʈ ۵ȴ. -// ̳ ɷִ ʴ. +// Ousters 정보를 담고 있는 객체. +// GCPCList 패킷에 담겨서 클라이언트에게 전송된다. +// 아이템이나 걸려있는 마법 같은 정보는 담겨있지 않다. ////////////////////////////////////////////////////////////////////////////// class PCOustersInfo : public PCInfo { @@ -35,42 +35,42 @@ class PCOustersInfo : public PCInfo { void write(SocketOutputStream& oStream) const; uint getSize() const { - return szBYTE // ̸ - + m_Name.size() // ƿ콺ͽ ̸ - + szSlot // - + szAlignment // - + szSex // - + szColor * OUSTERS_COLOR_MAX // - + szBYTE // , Ÿ - + szAttr * 3 // ɷġ + return szBYTE // 이름길이 + + m_Name.size() // 아우스터스 이름 + + szSlot // 슬롯 + + szAlignment // 성향 + + szSex // 성별 + + szColor * OUSTERS_COLOR_MAX // 색상 + + szBYTE // 옷, 무기 타입 + + szAttr * 3 // 능력치 + szHP * 2 // HP + szMP * 2 // MP - + szRank // - + szExp // ġ - + szLevel // - + szFame // - + szBonus // ʽ Ʈ - + szSkillBonus // ųʽ Ʈ + + szRank // 계급 + + szExp // 경험치 + + szLevel // 레벨 + + szFame // 명성 + + szBonus // 보너스 포인트 + + szSkillBonus // 스킬보너스 포인트 + szLevel; } // get max size of object static uint getMaxSize() { - return szBYTE + 20 // ƿ콺ͽ ̸ - + szSlot // - + szAlignment // - + szSex // - + szColor * OUSTERS_COLOR_MAX // - + szBYTE // , Ÿ - + szAttr * 3 // ɷġ + return szBYTE + 20 // 아우스터스 이름 + + szSlot // 슬롯 + + szAlignment // 성향 + + szSex // 성별 + + szColor * OUSTERS_COLOR_MAX // 색상 + + szBYTE // 옷, 무기 타입 + + szAttr * 3 // 능력치 + szHP * 2 // HP + szMP * 2 // MP - + szRank // - + szExp // ġ - + szFame // ġ - + szLevel // - + szBonus // ʽ Ʈ - + szSkillBonus // ų ʽ Ʈ + + szRank // 계급 + + szExp // 경험치 + + szFame // 명성치 + + szLevel // 레벨 + + szBonus // 보너스 포인트 + + szSkillBonus // 스킬 보너스 포인트 + szLevel; } @@ -273,7 +273,7 @@ class PCOustersInfo : public PCInfo { // PC name string m_Name; - // PC + // PC 슬롯 Slot m_Slot; // Alignment @@ -292,7 +292,7 @@ class PCOustersInfo : public PCInfo { OustersCoatType m_CoatType; OustersArmType m_ArmType; - // + // 계급 Rank_t m_Rank; // Exp diff --git a/src/Core/PCOustersInfo2.cpp b/src/Core/PCOustersInfo2.cpp index 2ca8f6f6..cab42840 100644 --- a/src/Core/PCOustersInfo2.cpp +++ b/src/Core/PCOustersInfo2.cpp @@ -105,13 +105,13 @@ void PCOustersInfo2::read(SocketInputStream& iStream) { iStream.read(m_Bonus); iStream.read(m_SkillBonus); - // + // 은도금 데미쥐 iStream.read(m_SilverDamage); - // + // 권한 iStream.read(m_Competence); - // ̵ + // 길드 아이디 iStream.read(m_GuildID); BYTE szGuildName; @@ -229,13 +229,13 @@ void PCOustersInfo2::write(SocketOutputStream& oStream) const { oStream.write(m_Bonus); oStream.write(m_SkillBonus); - // + // 은도금 데미지 oStream.write(m_SilverDamage); - // + // 권한 oStream.write(m_Competence); - // ̵ + // 길드 아이디 oStream.write(m_GuildID); BYTE szGuildName = m_GuildName.size(); diff --git a/src/Core/PCOustersInfo2.h b/src/Core/PCOustersInfo2.h index 6d84307c..179c7c43 100644 --- a/src/Core/PCOustersInfo2.h +++ b/src/Core/PCOustersInfo2.h @@ -10,9 +10,9 @@ #include "PCInfo.h" ////////////////////////////////////////////////////////////////////////////// -// Ousters ִ ü. -// GCPCList Ŷ ܼ Ŭ̾Ʈ ۵ȴ. -// ̳ ɷִ ʴ. +// Ousters 정보를 담고 있는 객체. +// GCPCList 패킷에 담겨서 클라이언트에게 전송된다. +// 아이템이나 걸려있는 마법 같은 정보는 담겨있지 않다. ////////////////////////////////////////////////////////////////////////////// class PCOustersInfo2 : public PCInfo { @@ -26,50 +26,50 @@ class PCOustersInfo2 : public PCInfo { uint getSize() const { return szObjectID // ObjectID - + szBYTE + m_Name.size() // ƿ콺ͽ ̸ - + szLevel // - + szSex // - + szColor // Ӹ - + szBYTE + szAlignment // - + szAttr * 3 * 3 // ɷġ + + szBYTE + m_Name.size() // 아우스터스 이름 + + szLevel // 레벨 + + szSex // 성별 + + szColor // 머리 색상 + + szBYTE + szAlignment // 성향 + + szAttr * 3 * 3 // 능력치 + szHP * 2 // HP + szMP * 2 // MP - + szRank + szRankExp // ġ - + szExp // ġ - + szGold // + + szRank + szRankExp // 계급 경험치 + + szExp // 경험치 + + szGold // 돈 + szFame // Fame - + szSight // þ - + szBonus // ʽ Ʈ - + szSkillBonus // ų ʽ Ʈ - + szSilver // ǹ - + szBYTE // - + szGuildID // ̵ - + szBYTE + m_GuildName.size() // ̸ + + szSight // 시야 + + szBonus // 보너스 포인트 + + szSkillBonus // 스킬 보너스 포인트 + + szSilver // 실버 데미지 + + szBYTE // 권한 + + szGuildID // 길드 아이디 + + szBYTE + m_GuildName.size() // 길드 이름 + szGuildMemberRank // guild member rank + szuint + szLevel + szExp; } static uint getMaxSize() { return szObjectID // ObjectID - + szBYTE + 20 // ƿ콺ͽ ̸ - + szLevel // - + szSex // - + szColor // - + szBYTE + szAlignment // - + szAttr * 3 * 3 // ɷġ + + szBYTE + 20 // 아우스터스 이름 + + szLevel // 레벨 + + szSex // 성별 + + szColor // 색상 + + szBYTE + szAlignment // 성향 + + szAttr * 3 * 3 // 능력치 + szHP * 2 // HP + szMP * 2 // MP - + szRank + szRankExp // ġ - + szExp // ġ - + szGold // + + szRank + szRankExp // 계급 경험치 + + szExp // 경험치 + + szGold // 돈 + szFame // Fame - + szSight // þ - + szBonus // ʽ Ʈ - + szSkillBonus // ų ʽ Ʈ - + szSilver // ǹ - + szBYTE // - + szGuildID // ̵ - + szBYTE + 30 // ̸ + + szSight // 시야 + + szBonus // 보너스 포인트 + + szSkillBonus // 스킬 보너스 포인트 + + szSilver // 실버 데미지 + + szBYTE // 권한 + + szGuildID // 길드 아이디 + + szBYTE + 30 // 길드 이름 + szGuildMemberRank // guild member rank + szuint + szLevel + szExp; } @@ -334,7 +334,7 @@ class PCOustersInfo2 : public PCInfo { // MP[0] = current mp, mp[1] == max mp MP_t m_MP[2]; - // + // 계급 Rank_t m_Rank; RankExp_t m_RankExp; @@ -347,22 +347,22 @@ class PCOustersInfo2 : public PCInfo { // Gold Gold_t m_Gold; - // þ + // 시야 Sight_t m_Sight; - // ʽ Ʈ + // 보너스 포인트 Bonus_t m_Bonus; - // ų ʽ Ʈ + // 스킬 보너스 포인트 SkillBonus_t m_SkillBonus; - // ǹ + // 실버 데미지 Silver_t m_SilverDamage; // Competence BYTE m_Competence; - // ID + // 길드 ID GuildID_t m_GuildID; // guild name diff --git a/src/Core/PCOustersInfo3.cpp b/src/Core/PCOustersInfo3.cpp index 764eac02..1bf4cca7 100644 --- a/src/Core/PCOustersInfo3.cpp +++ b/src/Core/PCOustersInfo3.cpp @@ -130,7 +130,7 @@ void PCOustersInfo3::write(SocketOutputStream& oStream) const { oStream.write(m_Rank); oStream.write(m_AdvancementLevel); - // cout << " : " << (int)m_AdvancementLevel << endl; + // cout << "승직 레벨 : " << (int)m_AdvancementLevel << endl; __END_CATCH } diff --git a/src/Core/PCOustersInfo3.h b/src/Core/PCOustersInfo3.h index bec741f5..e07c4f17 100644 --- a/src/Core/PCOustersInfo3.h +++ b/src/Core/PCOustersInfo3.h @@ -12,8 +12,8 @@ ////////////////////////////////////////////////////////////////////////////// // class PCOustersInfo3; -// ̾ ܸ ִ ü -// GCAddOusters, GCAddOustersCorpse ܼ ۵ȴ. +// 뱀파이어의 외모 정보를 담고 있는 객체 +// GCAddOusters, GCAddOustersCorpse 에 담겨서 전송된다. ////////////////////////////////////////////////////////////////////////////// class PCOustersInfo3 : public PCInfo { @@ -54,33 +54,33 @@ class PCOustersInfo3 : public PCInfo { uint getSize() const { return szObjectID // ObjectID - + szBYTE + m_Name.size() // ̾ ̸ - + szCoord + szCoord + szDir // ǥ - + szSex // + + szBYTE + m_Name.size() // 뱀파이어 이름 + + szCoord + szCoord + szDir // 좌표와 방향 + + szSex // 성별 + szBYTE // shape - + szColor * OUSTERS_COLOR_MAX // - + szBYTE + szHP * 2 // ִ ü - + szAlignment // - + szSpeed // ӵ - + szGuildID // ̵ - + szRank // - + szBYTE // + + szColor * OUSTERS_COLOR_MAX // 색상 + + szBYTE + szHP * 2 // 최대 체력 + + szAlignment // 성향 + + szSpeed // 공격 속도 + + szGuildID // 길드 아이디 + + szRank // 계급 + + szBYTE // 권한 + szuint + szLevel; } // get max size of object static uint getMaxSize() { return szObjectID // ObjectID - + szBYTE + 20 // ̾ ̸ - + szCoord + szCoord + szDir // ǥ - + szSex // + + szBYTE + 20 // 뱀파이어 이름 + + szCoord + szCoord + szDir // 좌표와 방향 + + szSex // 성별 + szBYTE // shape - + szColor * OUSTERS_COLOR_MAX // - + szBYTE + szHP * 2 // ִ ü - + szSpeed // ӵ - + szGuildID // ̵ - + szRank // - + szBYTE // + + szColor * OUSTERS_COLOR_MAX // 색상 + + szBYTE + szHP * 2 // 최대 체력 + + szSpeed // 공격 속도 + + szGuildID // 길드 아이디 + + szRank // 계급 + + szBYTE // 권한 + szuint + szLevel; } @@ -316,7 +316,7 @@ class PCOustersInfo3 : public PCInfo { // colors Color_t m_Colors[OUSTERS_COLOR_MAX]; - // Ʈ + // 마스터 이펙트 색깔 BYTE m_MasterEffectColor; // Current HP @@ -328,18 +328,18 @@ class PCOustersInfo3 : public PCInfo { // Attack Speed Speed_t m_AttackSpeed; - // + // 성향 Alignment_t m_Alignment; - // + // 권한 BYTE m_Competence; - // ̵ + // 길드 아이디 GuildID_t m_GuildID; uint m_UnionID; - // + // 계급 Rank_t m_Rank; Level_t m_AdvancementLevel; diff --git a/src/Core/PCSkillInfo.h b/src/Core/PCSkillInfo.h index 5ddaa62f..a0838703 100644 --- a/src/Core/PCSkillInfo.h +++ b/src/Core/PCSkillInfo.h @@ -2,7 +2,7 @@ // // Filename : PCSkillInfo.h // Written By : elca@ewestsoft.com -// Description : ų +// Description : 스킬의 정보들 // ////////////////////////////////////////////////////////////////////// @@ -18,7 +18,7 @@ // // class PCSkillInfo; // -// Ӽ Ŭ̾Ʈ ڽ ˷ֱ Ŭ +// 게임서버에서 클라이언트로 자신의 기술이 성공을 알려주기 위한 클래스 // ////////////////////////////////////////////////////////////////////// @@ -28,14 +28,14 @@ class PCSkillInfo { virtual ~PCSkillInfo() {} public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. virtual void read(SocketInputStream& iStream) = 0; - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. virtual void write(SocketOutputStream& oStream) const = 0; // get packet's body size - // ȭ, ̸ Ѵ. + // 최적화시, 미리 계산된 정수를 사용한다. virtual PacketSize_t getSize() = 0; // get packet's debug string diff --git a/src/Core/PCSlayerInfo.cpp b/src/Core/PCSlayerInfo.cpp index 478bd266..fee4803c 100644 --- a/src/Core/PCSlayerInfo.cpp +++ b/src/Core/PCSlayerInfo.cpp @@ -48,10 +48,10 @@ void PCSlayerInfo::read(SocketInputStream& iStream) { //-------------------------------------------------- // read slot // - // enum ũ Ʈ ũⰡ - // ٸ 찡 κ̹Ƿ, ũ - // ؼ о ٽ enum ȯؼ - // ϵ Ѵ. + // enum 변수들은 실제 크기와 스트림에 쓰여진 크기가 + // 다른 경우가 대부분이므로, 쓰여진 크기와 같은 변수 + // 를 사용해서 대신 읽어서 다시 enum 으로 변환해서 + // 저장하도록 한다. // // ex> Slot, Sex, HairStyle ... // @@ -163,7 +163,7 @@ void PCSlayerInfo::write(SocketOutputStream& oStream) const { //-------------------------------------------------- // write attributes - // ɷġ . + // 순수 능력치만 보낸다. //-------------------------------------------------- oStream.write(m_STR); oStream.write(m_DEX); diff --git a/src/Core/PCSlayerInfo.h b/src/Core/PCSlayerInfo.h index 157ad837..05cf298b 100644 --- a/src/Core/PCSlayerInfo.h +++ b/src/Core/PCSlayerInfo.h @@ -12,9 +12,9 @@ #include "PCInfo.h" ////////////////////////////////////////////////////////////////////////////// -// Slayer ִ ü. -// GCPCList Ŷ ܼ Ŭ̾Ʈ ۵ȴ. -// ̳ ɷִ ʴ. +// Slayer 정보를 담고 있는 객체. +// GCPCList 패킷에 담겨서 클라이언트에게 전송된다. +// 아이템이나 걸려있는 마법 같은 정보는 담겨있지 않다. ////////////////////////////////////////////////////////////////////////////// class PCSlayerInfo : public PCInfo { @@ -73,8 +73,8 @@ class PCSlayerInfo : public PCInfo { //+ szGold + szSkillLevel * 6 //+ szZoneID - + szDWORD // ̾ ÷ - + szColor * SLAYER_COLOR_MAX // + + szDWORD // 슬레이어 플래그 + + szColor * SLAYER_COLOR_MAX // 색깔 정보 + szLevel; } @@ -85,8 +85,8 @@ class PCSlayerInfo : public PCInfo { //+ szGold + szSkillLevel * 6 //+ szZoneID - + szDWORD // ̾ ÷ - + szColor * SLAYER_COLOR_MAX // + + szDWORD // 슬레이어 플래그 + + szColor * SLAYER_COLOR_MAX // 색깔 정보 + szLevel; } @@ -131,7 +131,7 @@ class PCSlayerInfo : public PCInfo { // get/set STR // *CAUTION* - // Assert() , NDEBUG 忡 disable ǹǷ if üũؾ Ѵ. + // Assert()로 할 경우, NDEBUG 모드에서는 disable 되므로 if 로 체크해야 한다. Attr_t getSTR() const { if (m_STR > maxSlayerAttr) throw Error("STR out of range"); @@ -413,20 +413,20 @@ class PCSlayerInfo : public PCInfo { Alignment_t m_Alignment; // *NOTE - // ATTR_BASIC : ɷġ. + // ATTR_BASIC : 순수 능력치. Attr_t m_STR; Attr_t m_DEX; Attr_t m_INT; - // ɷġ ø ġ - // ǥ ġ - // Ż ġ Client Exp Table Ƿ - // Ŭ̾Ʈ ϵ Ѵ. + // 능력치 올리는 현재 경험치 + // 다음 레벨로 가기 위한 목표 경험치와 + // 토탈 경험치는 Client에도 Exp Table을 가지므로 + // 클라이언트에서 연산 하도록 한다. Exp_t m_STRExp; Exp_t m_DEXExp; Exp_t m_INTExp; - // + // 계급 Rank_t m_Rank; // HP/MP @@ -445,12 +445,12 @@ class PCSlayerInfo : public PCInfo { Gold_t m_Gold; - // + // 최종적으로 놀던 존 ZoneID_t m_ZoneID; */ - bitset m_Outlook; // ̾ ܸ - Color_t m_Colors[SLAYER_COLOR_MAX]; // ̾ + bitset m_Outlook; // 슬레이어 외모 정보 + Color_t m_Colors[SLAYER_COLOR_MAX]; // 슬레이어 색깔 정보 Level_t m_AdvancementLevel; }; diff --git a/src/Core/PCSlayerInfo2.cpp b/src/Core/PCSlayerInfo2.cpp index cbb29458..1796a51d 100644 --- a/src/Core/PCSlayerInfo2.cpp +++ b/src/Core/PCSlayerInfo2.cpp @@ -153,7 +153,7 @@ void PCSlayerInfo2::write(SocketOutputStream& oStream) const { oStream.write(m_Alignment); // write attributes - // ִ ATTR_CURRENT, ATTR_MAX, ATTR_BASIC + // 넣는 순서는 ATTR_CURRENT, ATTR_MAX, ATTR_BASIC oStream.write(m_STR[ATTR_CURRENT]); oStream.write(m_STR[ATTR_MAX]); oStream.write(m_STR[ATTR_BASIC]); diff --git a/src/Core/PCSlayerInfo2.h b/src/Core/PCSlayerInfo2.h index 496abcda..942bd89a 100644 --- a/src/Core/PCSlayerInfo2.h +++ b/src/Core/PCSlayerInfo2.h @@ -10,8 +10,8 @@ #include "PCInfo.h" ////////////////////////////////////////////////////////////////////////////// -// Slayer (ɷġ,ɷִ¸ ) ִ ü. -// GCUpdateInfo Ŷ ܼ Ŭ̾Ʈ ۵ȴ. +// Slayer의 모든 정보(능력치,걸려있는마법 등)를 담고 있는 객체. +// GCUpdateInfo 패킷에 담겨서 클라이언트에게 전송된다. ////////////////////////////////////////////////////////////////////////////// class PCSlayerInfo2 : public PCInfo { @@ -335,7 +335,7 @@ class PCSlayerInfo2 : public PCInfo { Exp_t m_DEXExp; Exp_t m_INTExp; - // + // 계급 Rank_t m_Rank; RankExp_t m_RankExp; @@ -354,9 +354,9 @@ class PCSlayerInfo2 : public PCInfo { // sight Sight_t m_Sight; - // + // 길드 정보 - // Ű + // 핫 키 SkillType_t m_HotKey[4]; BYTE m_Competence; diff --git a/src/Core/PCSlayerInfo3.cpp b/src/Core/PCSlayerInfo3.cpp index adbbc948..2e75ab7f 100644 --- a/src/Core/PCSlayerInfo3.cpp +++ b/src/Core/PCSlayerInfo3.cpp @@ -61,7 +61,7 @@ void PCSlayerInfo3::read(SocketInputStream& iStream) { } ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// void PCSlayerInfo3::write(SocketOutputStream& oStream) const { __BEGIN_TRY @@ -110,7 +110,7 @@ void PCSlayerInfo3::write(SocketOutputStream& oStream) const { oStream.write(m_Rank); oStream.write(m_AdvancementLevel); - // cout << " : " << (int)m_AdvancementLevel << endl; + // cout << "승직 레벨 : " << (int)m_AdvancementLevel << endl; } catch (Throwable& t) { cout << t.toString() << endl; } diff --git a/src/Core/PCSlayerInfo3.h b/src/Core/PCSlayerInfo3.h index c005b41f..26713ccb 100644 --- a/src/Core/PCSlayerInfo3.h +++ b/src/Core/PCSlayerInfo3.h @@ -13,13 +13,13 @@ #include "PCInfo.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ . +// 슬레이어의 정보는 다음과 같다. // //(1) OID //(2) Name //(3) X,Y,Dir // -// bit_set ǥǴ +// bit_set 으로 표현되는 정보들 // //(4) Sex - MALE | FEMALE //(5) HairStyle - HAIR_STYLE1 | HAIR_STYLE2 | HAIR_STYLE3 @@ -29,7 +29,7 @@ //(11) Weapon Type - NONE | SWORD | BLADE | SHIELD | SWORD + SHIELD | AR | TR | SG | SMG | CROSS //(12) Motorcycle Type - NONE | MOTORCYCLE1 // -// /Ǹ ϸ κ ٲ. +// 상의/하의를 제외하면 모두 한 부분의 색상만이 바뀐다. // //(13) HairColor //(14) SkinColor @@ -99,7 +99,7 @@ class PCSlayerInfo3 : public PCInfo { m_Alignment(slayerInfo.m_Alignment), m_GuildID(slayerInfo.m_GuildID), m_Rank(slayerInfo.m_Rank), m_AdvancementLevel(slayerInfo.m_AdvancementLevel) { for (uint i = 0; i < SLAYER_COLOR_MAX; i++) - m_Colors[i] = slayerInfo.m_Colors[i]; // ̾ + m_Colors[i] = slayerInfo.m_Colors[i]; // 슬레이어 색깔 정보 m_Competence = slayerInfo.m_Competence; } @@ -114,32 +114,32 @@ class PCSlayerInfo3 : public PCInfo { void write(SocketOutputStream& oStream) const; uint getSize() const { - return szObjectID // ũó ̵ - + szBYTE + m_Name.size() // ̸ - + szCoord + szCoord + szDir // ǥ - + szDWORD // ̾ ÷ - + szColor * SLAYER_COLOR_MAX // - + szBYTE + szHP * 2 // ִ ü - + szAlignment // - + szRank // - + szSpeed // ǵ - + szGuildID // ǵ - + szBYTE // + return szObjectID // 크리처 아이디 + + szBYTE + m_Name.size() // 이름 + + szCoord + szCoord + szDir // 좌표와 방향 + + szDWORD // 슬레이어 플래그 + + szColor * SLAYER_COLOR_MAX // 색깔 정보 + + szBYTE + szHP * 2 // 최대 체력 + + szAlignment // 성향 + + szRank // 계급 + + szSpeed // 공격 스피드 + + szGuildID // 공격 스피드 + + szBYTE // 권한 + szuint + szLevel; } static uint getMaxSize() { - return szObjectID // ũó ̵ - + szBYTE + 20 // ̸ - + szCoord + szCoord + szDir // ǥ - + szDWORD // ̾ ÷ - + szColor * SLAYER_COLOR_MAX // - + szBYTE + szHP * 2 // ִ ü - + szAlignment // - + szRank // - + szSpeed // ǵ - + szGuildID // ǵ - + szBYTE // + return szObjectID // 크리처 아이디 + + szBYTE + 20 // 이름 + + szCoord + szCoord + szDir // 좌표와 방향 + + szDWORD // 슬레이어 플래그 + + szColor * SLAYER_COLOR_MAX // 색깔 정보 + + szBYTE + szHP * 2 // 최대 체력 + + szAlignment // 성향 + + szRank // 계급 + + szSpeed // 공격 스피드 + + szGuildID // 공격 스피드 + + szBYTE // 권한 + szuint + szLevel; } @@ -158,7 +158,7 @@ class PCSlayerInfo3 : public PCInfo { m_Alignment = slayerInfo.m_Alignment; for (uint i = 0; i < SLAYER_COLOR_MAX; i++) - m_Colors[i] = slayerInfo.m_Colors[i]; // ̾ + m_Colors[i] = slayerInfo.m_Colors[i]; // 슬레이어 색깔 정보 m_MasterEffectColor = slayerInfo.m_MasterEffectColor; @@ -420,21 +420,21 @@ class PCSlayerInfo3 : public PCInfo { private: ObjectID_t m_ObjectID; // OID - string m_Name; // PC ̸ - Coord_t m_X; // X ǥ - Coord_t m_Y; // Y ǥ - Dir_t m_Dir; // - bitset m_Outlook; // ܸ̾ - Color_t m_Colors[SLAYER_COLOR_MAX]; // ̾ - BYTE m_MasterEffectColor; // Ʈ - HP_t m_CurrentHP; // ̾ü - HP_t m_MaxHP; // ִ̾ü - Speed_t m_AttackSpeed; // ݼӵ - Alignment_t m_Alignment; // - BYTE m_Competence; // - GuildID_t m_GuildID; // ̵ + string m_Name; // PC의 이름 + Coord_t m_X; // X 좌표 + Coord_t m_Y; // Y 좌표 + Dir_t m_Dir; // 방향 + bitset m_Outlook; // 슬레이어외모정보 + Color_t m_Colors[SLAYER_COLOR_MAX]; // 슬레이어색깔정보 + BYTE m_MasterEffectColor; // 마스터 이펙트 색깔 + HP_t m_CurrentHP; // 슬레이어현재체력 + HP_t m_MaxHP; // 슬레이어최대체력 + Speed_t m_AttackSpeed; // 공격속도 + Alignment_t m_Alignment; // 성향 + BYTE m_Competence; // 권한 + GuildID_t m_GuildID; // 길드 아이디 uint m_UnionID; - Rank_t m_Rank; // + Rank_t m_Rank; // 계급 Level_t m_AdvancementLevel; }; diff --git a/src/Core/PCVampireInfo.cpp b/src/Core/PCVampireInfo.cpp index c9d4e6d4..a00dd740 100644 --- a/src/Core/PCVampireInfo.cpp +++ b/src/Core/PCVampireInfo.cpp @@ -10,8 +10,8 @@ #include "PCVampireInfo.h" void PCVampireInfo::setShapeInfo(DWORD flag, Color_t color[VAMPIRE_COLOR_MAX]) { - // vampire coat ٲǷ.. - // ߿ ٸ ٲٸ PCSlayerInfo ؼ ٲߵ ̴ + // 현재는 vampire coat만 모양이 바뀌므로.. + // 나중에 다른 부위도 바뀐다면 PCSlayerInfo를 참조해서 바꿔야될 것이다 m_CoatType = flag; //(flag & 7); m_CoatColor = color[0]; } diff --git a/src/Core/PCVampireInfo.h b/src/Core/PCVampireInfo.h index 8f9b8d89..02b56136 100644 --- a/src/Core/PCVampireInfo.h +++ b/src/Core/PCVampireInfo.h @@ -10,14 +10,14 @@ #include "PCInfo.h" ////////////////////////////////////////////////////////////////////////////// -// Vampire ִ ü. -// GCPCList Ŷ ܼ Ŭ̾Ʈ ۵ȴ. -// ̳ ɷִ ʴ. +// Vampire 정보를 담고 있는 객체. +// GCPCList 패킷에 담겨서 클라이언트에게 전송된다. +// 아이템이나 걸려있는 마법 같은 정보는 담겨있지 않다. ////////////////////////////////////////////////////////////////////////////// class PCVampireInfo : public PCInfo { public: - // bitset ʴ´. + // 아직 bitset은 사용하지 않는다. enum VampireBits { VAMPIRE_BIT_COAT1, VAMPIRE_BIT_COAT2, VAMPIRE_BIT_COAT3, VAMPIRE_BIT_MAX }; enum VampireColors { VAMPIRE_COLOR_COAT, VAMPIRE_COLOR_MAX }; @@ -32,41 +32,41 @@ class PCVampireInfo : public PCInfo { void write(SocketOutputStream& oStream) const; uint getSize() const { - return szBYTE // ̸ - + m_Name.size() // ̾ ̸ - + szSlot // - + szAlignment // - + szSex // - + szColor * 2 // - + szBYTE + szColor // Ÿ, - + szAttr * 3 // ɷġ + return szBYTE // 이름길이 + + m_Name.size() // 뱀파이어 이름 + + szSlot // 슬롯 + + szAlignment // 성향 + + szSex // 성별 + + szColor * 2 // 색상 + + szBYTE + szColor // 옷 타입, 색상 + + szAttr * 3 // 능력치 + szHP * 2 // HP - + szRank // - + szExp // ġ - + szLevel // ġ + + szRank // 계급 + + szExp // 경험치 + + szLevel // 경험치 + szFame - //+ szGold // - + szBonus // ʽ Ʈ + //+ szGold // 돈 + + szBonus // 보너스 포인트 //+ szZoneID; // ZoneID + szLevel; } // get max size of object static uint getMaxSize() { - return szBYTE + 20 // ̾ ̸ - + szSlot // - + szAlignment // - + szSex // - + szColor * 2 // - + szBYTE + szColor // Ÿ, - + szAttr * 3 // ɷġ + return szBYTE + 20 // 뱀파이어 이름 + + szSlot // 슬롯 + + szAlignment // 성향 + + szSex // 성별 + + szColor * 2 // 색상 + + szBYTE + szColor // 옷 타입, 색상 + + szAttr * 3 // 능력치 + szHP * 2 // HP - + szRank // - + szExp // ġ + + szRank // 계급 + + szExp // 경험치 + szFame + szLevel - //+ szGold // - + szBonus // ʽ Ʈ + //+ szGold // 돈 + + szBonus // 보너스 포인트 //+ szZoneID; // ZoneID + szLevel; } @@ -248,7 +248,7 @@ class PCVampireInfo : public PCInfo { // PC name string m_Name; - // PC + // PC 슬롯 Slot m_Slot; // Alignment @@ -265,7 +265,7 @@ class PCVampireInfo : public PCInfo { ItemType_t m_CoatType; Color_t m_CoatColor; - // + // 계급 Rank_t m_Rank; // Exp @@ -296,7 +296,7 @@ class PCVampireInfo : public PCInfo { Bonus_t m_Bonus; Level_t m_AdvancementLevel; - // ɷ ִ + // 걸려 있는 마법 }; #endif diff --git a/src/Core/PCVampireInfo2.cpp b/src/Core/PCVampireInfo2.cpp index 888831bf..80bcc704 100644 --- a/src/Core/PCVampireInfo2.cpp +++ b/src/Core/PCVampireInfo2.cpp @@ -106,13 +106,13 @@ void PCVampireInfo2::read(SocketInputStream& iStream) { iStream.read(m_HotKey[i]); } - // + // 은도금 데미쥐 iStream.read(m_SilverDamage); - // + // 권한 iStream.read(m_Competence); - // ̵ + // 길드 아이디 iStream.read(m_GuildID); BYTE szGuildName; @@ -231,13 +231,13 @@ void PCVampireInfo2::write(SocketOutputStream& oStream) const { oStream.write(m_HotKey[i]); } - // + // 은도금 데미지 oStream.write(m_SilverDamage); - // + // 권한 oStream.write(m_Competence); - // ̵ + // 길드 아이디 oStream.write(m_GuildID); BYTE szGuildName = m_GuildName.size(); diff --git a/src/Core/PCVampireInfo3.cpp b/src/Core/PCVampireInfo3.cpp index 5f972a49..9e6d98f6 100644 --- a/src/Core/PCVampireInfo3.cpp +++ b/src/Core/PCVampireInfo3.cpp @@ -133,7 +133,7 @@ void PCVampireInfo3::write(SocketOutputStream& oStream) const { oStream.write(m_Rank); oStream.write(m_AdvancementLevel); - // cout << " : " << (int)m_AdvancementLevel << endl; + // cout << "승직 레벨 : " << (int)m_AdvancementLevel << endl; __END_CATCH } diff --git a/src/Core/PCVampireInfo3.h b/src/Core/PCVampireInfo3.h index f2f8ce33..a00d45f9 100644 --- a/src/Core/PCVampireInfo3.h +++ b/src/Core/PCVampireInfo3.h @@ -12,8 +12,8 @@ ////////////////////////////////////////////////////////////////////////////// // class PCVampireInfo3; -// ̾ ܸ ִ ü -// GCAddSlayer, GCAddVampireCorpse ܼ ۵ȴ. +// 뱀파이어의 외모 정보를 담고 있는 객체 +// GCAddSlayer, GCAddVampireCorpse 에 담겨서 전송된다. ////////////////////////////////////////////////////////////////////////////// class PCVampireInfo3 : public PCInfo { @@ -53,35 +53,35 @@ class PCVampireInfo3 : public PCInfo { uint getSize() const { return szObjectID // ObjectID - + szBYTE + m_Name.size() // ̾ ̸ - + szCoord + szCoord + szDir // ǥ - + szSex // + + szBYTE + m_Name.size() // 뱀파이어 이름 + + szCoord + szCoord + szDir // 좌표와 방향 + + szSex // 성별 + szBYTE // coatType - + szColor * VAMPIRE_COLOR_MAX // - + szBYTE + szHP * 2 // ִ ü - + szAlignment // - + szShape // - + szSpeed // ӵ - + szGuildID // ̵ - + szRank // - + szBYTE // + + szColor * VAMPIRE_COLOR_MAX // 색상 + + szBYTE + szHP * 2 // 최대 체력 + + szAlignment // 성향 + + szShape // 모양 + + szSpeed // 공격 속도 + + szGuildID // 길드 아이디 + + szRank // 계급 + + szBYTE // 권한 + szuint + szLevel; } // get max size of object static uint getMaxSize() { return szObjectID // ObjectID - + szBYTE + 20 // ̾ ̸ - + szCoord + szCoord + szDir // ǥ - + szSex // + + szBYTE + 20 // 뱀파이어 이름 + + szCoord + szCoord + szDir // 좌표와 방향 + + szSex // 성별 + szBYTE // coatType - + szColor * VAMPIRE_COLOR_MAX // - + szBYTE + szHP * 2 // ִ ü - + szShape // - + szSpeed // ӵ - + szGuildID // ̵ - + szRank // - + szBYTE // + + szColor * VAMPIRE_COLOR_MAX // 색상 + + szBYTE + szHP * 2 // 최대 체력 + + szShape // 모양 + + szSpeed // 공격 속도 + + szGuildID // 길드 아이디 + + szRank // 계급 + + szBYTE // 권한 + szuint + szLevel; } @@ -295,7 +295,7 @@ class PCVampireInfo3 : public PCInfo { // colors Color_t m_Colors[VAMPIRE_COLOR_MAX]; - // Ʈ + // 마스터 이펙트 색깔 BYTE m_MasterEffectColor; // Current HP @@ -307,21 +307,21 @@ class PCVampireInfo3 : public PCInfo { // Attack Speed Speed_t m_AttackSpeed; - // + // 성향 Alignment_t m_Alignment; - // ̾ + // 뱀파이어 모양 Shape_t m_Shape; - // + // 권한 BYTE m_Competence; - // ̵ + // 길드 아이디 GuildID_t m_GuildID; uint m_UnionID; - // + // 계급 Rank_t m_Rank; Level_t m_AdvancementLevel; diff --git a/src/Core/Packet.h b/src/Core/Packet.h index 8d600839..8fb54c79 100644 --- a/src/Core/Packet.h +++ b/src/Core/Packet.h @@ -46,11 +46,11 @@ const uint szPacketHeader = szPacketID + szPacketSize + szSequenceSize; // // class Packet; // -// Ŷ Ÿ Ÿ ̽ Ŭ̴. +// 패킷 데이타를 나타내는 인터페이스 클래스이다. // -// read() write() DZ 캸. Է½Ʈ ½Ʈ -// Ŷ  а . , Ŷ ڽ -// Ʈ  а ˰ ־ Ѵ. +// read()와 write()를 주의깊게 살펴보라. 소켓입력스트림과 소켓출력스트림은 +// 모든 패킷을 어떻게 읽고 쓸 것인지를 알 수 없다. 따라서, 패킷 자신이 각 +// 스트림에 어떻게 읽고 쓸 것인지를 알고 있어야 한다. // //---------------------------------------------------------------------- @@ -557,23 +557,23 @@ class Packet { // destructor virtual ~Packet() {} - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. virtual void read(SocketInputStream& iStream) = 0; - // κ ͸ о Ŷ ʱȭѴ. + // 소켓으로부터 직접 데이터를 읽어서 패킷을 초기화한다. virtual void read(Socket* pSocket) { throw UnsupportedError(); } - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. virtual void write(SocketOutputStream& oStream) const = 0; - // Ŷ ̳ʸ ̹ . + // 소켓으로 직접 패킷의 바이너리 이미지를 보낸다. virtual void write(Socket* pSocket) const { throw UnsupportedError(); } - // Ʈ Ŷ ٵ . + // 출력 스트림에 패킷의 헤더와 바디를 모두 쓴다. void writeHeaderNBody(SocketOutputStream& oStream) const { oStream.write(getPacketID()); oStream.write(getPacketSize()); diff --git a/src/Core/PacketIDSet.cpp b/src/Core/PacketIDSet.cpp index 2ee0516f..b97d2cba 100644 --- a/src/Core/PacketIDSet.cpp +++ b/src/Core/PacketIDSet.cpp @@ -35,7 +35,7 @@ void PacketIDSet::addPacketID(PacketID_t packetID) { pair p = m_PacketIDSet.insert(packetID); - // ̹ Ű Ѵٴ Ҹ. + // 이미 같은 키가 존재한다는 소리다. if (!p.second) throw DuplicatedException(); @@ -65,18 +65,18 @@ bool PacketIDSet::hasPacketID(PacketID_t packetID) const { __BEGIN_TRY if (m_PacketIDSetType == PIST_NORMAL) { - // Ϲ , true Ѵ. + // 일반적인 경우, 존재할 때에만 true 를 리턴한다. PACKET_ID_SET::const_iterator itr = m_PacketIDSet.find(packetID); return itr != m_PacketIDSet.end(); } else if (m_PacketIDSetType == PIST_ANY) { - //  Ŷ ȴ. + // 그 어떤 패킷도 허용된다. return true; } else if (m_PacketIDSetType == PIST_IGNORE_EXCEPT) { - // Ŷ , true Ѵ. - // Ŷ , ؾ Ѵ. + // 패킷이 존재할 경우, true 를 리턴한다. + // 패킷이 존재하지 않으면, 무시해야 한다. PACKET_ID_SET::const_iterator itr = m_PacketIDSet.find(packetID); if (itr != m_PacketIDSet.end()) { diff --git a/src/Core/PetInfo.h b/src/Core/PetInfo.h index 7daefc65..d80dfee4 100644 --- a/src/Core/PetInfo.h +++ b/src/Core/PetInfo.h @@ -138,7 +138,7 @@ class PetInfo { m_IsSummonInfo = isSummon; } - // -_- Ӽʿ ؾ PetItem.cpp + // -_- 게임서버쪽에 정의해야쥐 PetItem.cpp 에 있음 ObjectID_t getItemObjectID() const; VSDateTime& getLastFeedTime() { diff --git a/src/Core/PlayerStatus.h b/src/Core/PlayerStatus.h index 0449c42a..8d1001c2 100644 --- a/src/Core/PlayerStatus.h +++ b/src/Core/PlayerStatus.h @@ -2,7 +2,7 @@ // // Filename : PlayerStatus.h // Written By : Reiot -// Description : ÷̾ ¿ Ŷ ̵ +// Description : Ç÷¹ÀÌ¾î »óÅ¿¡ µû¸¥ Çã¿ë °¡´ÉÇÑ ÆÐŶ ¾ÆÀ̵ðÀÇ ¸ÅÇÎ Á¤ÀÇ // //---------------------------------------------------------------------- @@ -14,95 +14,95 @@ enum PlayerStatus { #if defined(__GAME_CLIENT__) //---------------------------------------------------------------------- - // ClientPlayer ü + // ClientPlayer °´Ã¼°¡ »ý¼ºµÈ Á÷ÈÄ // Next Packets : NONE //---------------------------------------------------------------------- CPS_NONE, //---------------------------------------------------------------------- - // α α + // ·Î±×ÀÎ ¼­¹ö¿¡ ·Î±×ÀÎ Á¤º¸¸¦ º¸³»±â Àü // Next Packets : LCLoginOK, LCLoginError //---------------------------------------------------------------------- CPS_BEGIN_SESSION, //---------------------------------------------------------------------- - // CLLogin + // CLLogin À» º¸³½ Á÷ÈÄ // Next Packets : LCLoginOK, LCLoginError //---------------------------------------------------------------------- CPS_AFTER_SENDING_CL_LOGIN, //---------------------------------------------------------------------- - // CLQueryPlayerID + // CLQueryPlayerID À» º¸³½ Á÷ÈÄ // Next Packets : LCQueryResultPlayerID //---------------------------------------------------------------------- CPS_AFTER_SENDING_CL_QUERY_PLAYER_ID, //---------------------------------------------------------------------- - // CLRegisterPlayer + // CLRegisterPlayer À» º¸³½ Á÷ÈÄ // Next Packets : LCRegisterPlayerOK, LCRegisterPlayerError //---------------------------------------------------------------------- CPS_AFTER_SENDING_CL_REGISTER_PLAYER, //---------------------------------------------------------------------- - // CLGetPCList Ŷ + // CLGetPCList ÆÐŶÀ» º¸³½ Á÷ÈÄ // Next Packets : LCPCList //---------------------------------------------------------------------- CPS_AFTER_SENDING_CL_GET_PC_LIST, //---------------------------------------------------------------------- - // CLCreatePC + // CLCreatePC ¸¦ º¸³½ Á÷ÈÄ // Next Packets : LCCreatePCOK //---------------------------------------------------------------------- CPS_AFTER_SENDING_CL_CREATE_PC, //---------------------------------------------------------------------- - // CLDeletePC + // CLDeletePC ¸¦ º¸³½ Á÷ÈÄ // Next Packets : LCDeletePCOK, LCDeletePCError //---------------------------------------------------------------------- CPS_AFTER_SENDING_CL_DELETE_PC, //---------------------------------------------------------------------- - // CLSelectPC + // CLSelectPC ¸¦ º¸³½ Á÷ÈÄ // Next Packets : LCSelectPCOK, LCSelectPCError //---------------------------------------------------------------------- CPS_AFTER_SENDING_CL_SELECT_PC, //---------------------------------------------------------------------- - // CGConnect Ŷ . + // °ÔÀÓ ¼­¹ö·Î CGConnect ÆÐŶÀ» º¸³½´Ù. // Next Packets : GCUpdateInfo //---------------------------------------------------------------------- CPS_AFTER_SENDING_CG_CONNECT, //---------------------------------------------------------------------- - // ε ٸ. + // ·ÎµùÀÌ ³¡³¯ ¶§±îÁö ±â´Ù¸°´Ù. // Next Packets : NONE //---------------------------------------------------------------------- CPS_WAITING_FOR_LOADING, //---------------------------------------------------------------------- - // CGReady Ŷ , 󿡼 ڽ ġ DZ⸦ ٸ. + // CGReady ÆÐŶÀ» º¸³½ ÈÄ, ¼­¹ö»ó¿¡¼­ ÀÚ½ÅÀÇ À§Ä¡°¡ °áÁ¤µÇ±â¸¦ ±â´Ù¸°´Ù. // Next Packets : GCSetPosition //---------------------------------------------------------------------- CPS_WAITING_FOR_GC_SET_POSITION, //---------------------------------------------------------------------- - // Ϲ + // ÀϹÝÀûÀÎ °ÔÀÓ »óÅ //---------------------------------------------------------------------- CPS_NORMAL, //---------------------------------------------------------------------- - // LOGOUT CGReconnectLogin + // LOGOUTÈÄ CGReconnectLogin //---------------------------------------------------------------------- CPS_WAITING_FOR_GC_RECONNECT_LOGIN, //---------------------------------------------------------------------- - // α/ + // ·Î±×ÀÎ/°ÔÀÓ ¼­¹ö¿ÍÀÇ ¿¬°á Á¾·á //---------------------------------------------------------------------- CPS_END_SESSION, /* //---------------------------------------------------------------------- -// Խ +// °ÔÀÓ °Ô½ÃÆÇ ½ÃÀÛ //---------------------------------------------------------------------- //---------------------------------------------------------------------- @@ -150,57 +150,57 @@ CPS_AFTER_SENDING_CL_NEXT_PAGE, //---------------------------------------------------------------------- CPS_AFTER_SENDING_CL_SELECT_LIST, //---------------------------------------------------------------------- -// Խ +// °ÔÀÓ °Ô½ÃÆÇ ³¡½ //---------------------------------------------------------------------- */ #elif defined(__LOGIN_SERVER__) //---------------------------------------------------------------------- - // LoginPlayer ü + // LoginPlayer °´Ã¼°¡ »ý¼ºµÈ Á÷ÈÄ // Next Packets : NONE //---------------------------------------------------------------------- LPS_NONE, //---------------------------------------------------------------------- - // α + // ·Î±×ÀÎ ¼­¹ö¿¡ ¼ÒÄÏ ¿¬°á Á÷ÈÄ // Next Packets : CLLogin //---------------------------------------------------------------------- LPS_BEGIN_SESSION, //---------------------------------------------------------------------- - // ̵/н + // ¾ÆÀ̵ð/ÆÐ½º¿öµå Àü¼Û Á÷ÈÄ // Next Packets : CLGetPCList, CLLogout //---------------------------------------------------------------------- LPS_WAITING_FOR_CL_GET_PC_LIST, //---------------------------------------------------------------------- - // guest α׿ + // guest ·Î ·Î±×¿ÂÇßÀ» °æ¿ì // Next Packets : CLRegisterPlayer, CLQueryPlayerID //---------------------------------------------------------------------- LPS_WAITING_FOR_CL_REGISTER_PLAYER, //---------------------------------------------------------------------- - // ij + // ij¸¯ÅÍ °ü¸® »óÅ // Next Packets : CLCreatePC, CLDeletePC, CLSelectPC, CLLogout //---------------------------------------------------------------------- LPS_PC_MANAGEMENT, //---------------------------------------------------------------------- - // LGIncomingConnection Ŷ + // °ÔÀÓ ¼­¹ö·Î LGIncomingConnection ÆÐŶÀ» º¸³½ Á÷ÈÄ // Next Packets : GLIncomingConnectionOK, GLIncomingConnectionError //---------------------------------------------------------------------- LPS_AFTER_SENDING_LG_INCOMING_CONNECTION, //---------------------------------------------------------------------- - // '̹ ' .. - // ᰡ DZ⸦ ٸ + // 'ÀÌ¹Ì Á¢¼Ó Áß'ÀÎ °æ¿ì.. + // °­Á¦ Á¢¼Ó Á¾·á°¡ µÇ±â¸¦ ±â´Ù¸®´Â »óÅ //---------------------------------------------------------------------- LPS_WAITING_FOR_GL_KICK_VERIFY, //---------------------------------------------------------------------- - // α Ҷ + // ·Î±×ÀÎ ¼­¹ö¿ÍÀÇ ¿¬°áÀ» Á¾·áÇÒ¶§ // Next Packets : NONE //---------------------------------------------------------------------- LPS_END_SESSION, @@ -208,7 +208,7 @@ CPS_AFTER_SENDING_CL_SELECT_LIST, /* //---------------------------------------------------------------------- -// Խ +// °ÔÀÓ °Ô½ÃÆÇ ½ÃÀÛ //---------------------------------------------------------------------- //---------------------------------------------------------------------- @@ -227,49 +227,49 @@ CPS_AFTER_SENDING_CL_SELECT_LIST, LPS_AFTER_SENDING_LC_SEND_CONTENT, //---------------------------------------------------------------------- -// Խ +// °ÔÀÓ °Ô½ÃÆÇ ³¡Û //---------------------------------------------------------------------- */ #elif defined(__GAME_SERVER__) //---------------------------------------------------------------------- - // GamePlayer ü + // GamePlayer °´Ã¼°¡ »ý¼ºµÈ Á÷ÈÄ // Next Packets : NONE //---------------------------------------------------------------------- GPS_NONE, //---------------------------------------------------------------------- - // + // °ÔÀÓ ¼­¹ö¿¡ ¼ÒÄÏ ¿¬°á Á÷ÈÄ // Next Packets : CGConnect //---------------------------------------------------------------------- GPS_BEGIN_SESSION, //---------------------------------------------------------------------- - // + // »ç¿ëÀÚ ÀÎÁõ Á÷ÈÄ // Next Packets : CGReady //---------------------------------------------------------------------- GPS_WAITING_FOR_CG_READY, //---------------------------------------------------------------------- - // ӿ . ƹ Ŷ̳ Ͷ. + // °ÔÀÓ¿¡ µé¾î°¬´Ù. ÀÌÁ¦ ¾Æ¹« ÆÐŶÀ̳ª ¿Í¶ó. // Next Packets : ANY //---------------------------------------------------------------------- GPS_NORMAL, //---------------------------------------------------------------------- - // ƹ Ŷ ʴ ´. -_-; fuck suck + // ¾Æ¹« ÆÐŶµµ ¹ÞÁö ¾Ê´Â »óÅ´Ù. -_-; fuck suck //---------------------------------------------------------------------- GPS_IGNORE_ALL, //---------------------------------------------------------------------- - // α GLIncomingConnection Ŷ + // ·Î±×ÀÎ ¼­¹ö·Î GLIncomingConnection ÆÐŶÀ» º¸³½ Á÷ÈÄ // Next Packets : LGIncomingConnectionOK, LGIncomingConnectionError //---------------------------------------------------------------------- GPS_AFTER_SENDING_GL_INCOMING_CONNECTION, //---------------------------------------------------------------------- - // Ѵ. + // °ÔÀÓ ¼­¹ö¿ÍÀÇ ¿¬°áÀ» Á¾·áÇÑ´Ù. // Next Packets : NONE //---------------------------------------------------------------------- GPS_END_SESSION, @@ -278,31 +278,31 @@ CPS_AFTER_SENDING_CL_SELECT_LIST, #elif defined(__UPDATE_SERVER__) //---------------------------------------------------------------------- - // UpdateServerPlayer ü + // UpdateServerPlayer °´Ã¼°¡ »ý¼ºµÈ Á÷ÈÄ // Next Packets : NONE //---------------------------------------------------------------------- USPS_NONE, //---------------------------------------------------------------------- - // Ʈ Ŭ̾Ʈ + // ¾÷µ¥ÀÌÆ® Ŭ¶óÀÌ¾ðÆ®¿Í ¿¬°áÀÌ µÈ Á÷ÈÄ // Next Packets : CUBeginUpdate //---------------------------------------------------------------------- USPS_BEGIN_SESSION, //---------------------------------------------------------------------- - // UCUpdateList + // UCUpdateList ¸¦ º¸³½ Á÷ÈÄ // Next Packets : CURequest, CUEndUpdate //---------------------------------------------------------------------- USPS_AFTER_SENDING_UC_UPDATE_LIST, //---------------------------------------------------------------------- - // UCUpdate + // UCUpdate ¸¦ º¸³½ Á÷ÈÄ // Next Packets : CURequest, CUEndUpdate //---------------------------------------------------------------------- USPS_AFTER_SENDING_UC_UPDATE, //---------------------------------------------------------------------- - // CUEndUpdate + // CUEndUpdate ¸¦ ¹ÞÀº Á÷ÈÄ // Next Packets : NONE //---------------------------------------------------------------------- USPS_END_SESSION, @@ -310,31 +310,31 @@ CPS_AFTER_SENDING_CL_SELECT_LIST, #elif defined(__UPDATE_CLIENT__) //---------------------------------------------------------------------- - // UpdateClientPlayer ü + // UpdateClientPlayer °´Ã¼°¡ »ý¼ºµÈ Á÷ÈÄ // Next Packets : NONE //---------------------------------------------------------------------- UCPS_NONE, //---------------------------------------------------------------------- - // Ʈ + // ¾÷µ¥ÀÌÆ® ¼­¹ö¿¡ ¿¬°áÇÑ Á÷ÈÄ // Next Packets : NONE //---------------------------------------------------------------------- UCPS_BEGIN_SESSION, //---------------------------------------------------------------------- - // CUBeginUpdate Ŷ + // CUBeginUpdate ÆÐŶÀ» º¸³½ Á÷ÈÄ // Next Packets : UCUpdateList //---------------------------------------------------------------------- UCPS_WAITING_FOR_UC_UPDATE_LIST, //---------------------------------------------------------------------- - // CURequest Ŷ + // CURequest ÆÐŶÀ» º¸³½ Á÷ÈÄ // Next Packets : UCUpdate //---------------------------------------------------------------------- UCPS_WAITING_FOR_UC_UPDATE, //---------------------------------------------------------------------- - // Ʈ Ѵ. + // ¾÷µ¥ÀÌÆ® ¼­¹ö¿ÍÀÇ ¿¬°áÀ» Á¾·áÇÑ´Ù. // Next Packets : NONE //---------------------------------------------------------------------- UCPS_END_SESSION, @@ -342,7 +342,7 @@ CPS_AFTER_SENDING_CL_SELECT_LIST, #endif //-------------------------------------------------- - // Player Status 迭 ũ ȴ. + // Player Status ¹è¿­ÀÇ Å©±â µîÀ» ¼³Á¤ÇÒ ¶§ »ç¿ëµÈ´Ù. //-------------------------------------------------- PLAYER_STATUS_MAX diff --git a/src/Core/QuestStatusInfo.h b/src/Core/QuestStatusInfo.h index ba069469..d19ef738 100644 --- a/src/Core/QuestStatusInfo.h +++ b/src/Core/QuestStatusInfo.h @@ -12,18 +12,18 @@ struct MissionInfo { enum Status { - HIDE = 0, // - CURRENT, // ؾ Ǵ ̼ () - SUCCESS, // ̹ ̼ - FAIL, // + HIDE = 0, // 보여주지 않음 + CURRENT, // 지금 해야 되는 미션 (수행중) + SUCCESS, // 이미 성공한 미션 + FAIL, // 실패 }; - BYTE m_Condition; // ǿ ִ° 0 : Happen, 1 : Complete, 2 : Fail, 3 : Reward - WORD m_Index; // ش ° elementΰ - BYTE m_Status; // + BYTE m_Condition; // 어느 조건에 있는가 0 : Happen, 1 : Complete, 2 : Fail, 3 : Reward + WORD m_Index; // 해당 조건의 몇번째 element인가 + BYTE m_Status; // 현재 상태 - string m_StrArg; // ڿ - DWORD m_NumArg; // + string m_StrArg; // 찍어줄 문자열 + DWORD m_NumArg; // 찍어줄 숫자 MissionInfo() : m_StrArg(""), m_NumArg(0) {} @@ -66,13 +66,13 @@ struct MissionInfo { class QuestStatusInfo { public: enum Status { - CANNOT = 0, // Ұ - CAN_ACCEPT, // డ - DOING, // - SUCCESS, // ( ) - COMPLETE, // Ϸ (, Ұ) - FAIL, // ( Ұ) - CAN_REPLAY, // + CANNOT = 0, // 아직 불가능 + CAN_ACCEPT, // 수행가능 + DOING, // 수행중 + SUCCESS, // 성공 (아직 보상받지 않음) + COMPLETE, // 완료 (보상받음, 재수행 불가능) + FAIL, // 실패 (재수행 불가능) + CAN_REPLAY, // 재수행 가능 }; QuestStatusInfo(DWORD qID) : m_QuestID(qID), m_Status(CANNOT) {} @@ -84,7 +84,7 @@ class QuestStatusInfo { protected: DWORD m_QuestID; - BYTE m_Status; // enum + BYTE m_Status; // 위의 enum 참조 list m_Missions; }; diff --git a/src/Core/RaceWarInfo.cpp b/src/Core/RaceWarInfo.cpp index a2c4ed8b..016b68ea 100644 --- a/src/Core/RaceWarInfo.cpp +++ b/src/Core/RaceWarInfo.cpp @@ -10,7 +10,7 @@ #include "RaceWarInfo.h" ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void RaceWarInfo::read(SocketInputStream& iStream) { __BEGIN_TRY @@ -23,7 +23,7 @@ void RaceWarInfo::read(SocketInputStream& iStream) { ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void RaceWarInfo::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/RaceWarInfo.h b/src/Core/RaceWarInfo.h index 0c15b1d7..e11074a9 100644 --- a/src/Core/RaceWarInfo.h +++ b/src/Core/RaceWarInfo.h @@ -18,7 +18,7 @@ // // class WarInfo; // -// ϳ £ +// 하나의 전쟁에 대한 정보 // //-------------------------------------------------------------------------------- @@ -30,10 +30,10 @@ class RaceWarInfo : public WarInfo { RaceWarInfo() {} ~RaceWarInfo() {} - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; PacketSize_t getSize() const { @@ -66,7 +66,7 @@ class RaceWarInfo : public WarInfo { } private: - ZoneIDList m_CastleIDs; // + ZoneIDList m_CastleIDs; // 전쟁중인 성 }; #endif diff --git a/src/Core/Resource.cpp b/src/Core/Resource.cpp index 969df0e6..35e49493 100644 --- a/src/Core/Resource.cpp +++ b/src/Core/Resource.cpp @@ -19,7 +19,7 @@ Resource::Resource(Version_t version, const string& str) : m_Version(version), m //-------------------------------------------------------------------------------- // - // Է Ʈ . + // 입력 스트링의 구조는 다음과 같다. // // ex> "creature.spk 30021" // 012345678901234567 @@ -29,7 +29,7 @@ Resource::Resource(Version_t version, const string& str) : m_Version(version), m // //-------------------------------------------------------------------------------- if (str != "") { - // ù° ̽ ε Ѵ. + // 첫번째와 마지막 스페이스의 인덱스를 구한다. size_t firstspace = str.find_first_of(' '); if (firstspace == string::npos) diff --git a/src/Core/Resource.h b/src/Core/Resource.h index 77312a0a..0209521a 100644 --- a/src/Core/Resource.h +++ b/src/Core/Resource.h @@ -26,7 +26,7 @@ class Socket; // // class Resource // -// ٿε ޾ƾ Ÿ. +// 다운로드 받아야할 파일을 나타낸다. // //-------------------------------------------------------------------------------- @@ -113,9 +113,9 @@ class Resource { private: - Version_t m_Version; // Ŭ̾Ʈ - string m_Filename; // ٿ޾ƾ ϸ - DWORD m_FileSize; // ũ + Version_t m_Version; // 클라이언트 버전 + string m_Filename; // 다운받아야 할 파일명 + DWORD m_FileSize; // 파일 크기 }; #endif diff --git a/src/Core/ResourceManager.cpp b/src/Core/ResourceManager.cpp index 1ad27045..5a4eac0e 100644 --- a/src/Core/ResourceManager.cpp +++ b/src/Core/ResourceManager.cpp @@ -103,13 +103,13 @@ void ResourceManager::save(const string& filename) const { //-------------------------------------------------------------------------------- -// ٿ޴ ߺ üũؼ ٿε ð 뷮 ȭϵ Ѵ. -// ϴ ߺ θ üũѴ. +// 다운받는 파일의 중복 여부 등을 체크해서 다운로드 시간과 용량을 최적화하도록 한다. +// 일단은 실행 파일의 중복 여부만을 체크한다. //-------------------------------------------------------------------------------- void ResourceManager::optimize(){__BEGIN_TRY /* - // ڿ üũѴ. + // 뒤에서부터 체크한다. bool exefileFound = false; list< Resource * >::reverse_iterator before = m_Resources.rend(); @@ -117,19 +117,19 @@ void ResourceManager::optimize(){__BEGIN_TRY while ( current != m_Resources.rend() ) { - // ϸ ޾ƿ´. + // 파일명을 받아온다. string filename = (*current)->getFilename(); - //  ߶󳻰 ϰ ϸ صд. + // 파일 사이즈를 잘라내고 순수하게 파일명만을 저장해둔다. size_t i = filename.find_first_of(' '); filename = filename.substr(0,i); - // ϸȿ darkeden.exe Ե , ߺ üũ . + // 이 파일명안에 darkeden.exe 가 포함될 경우, 중복 체크에 들어간다. if ( filename == "DarkEden.exe" ) { if ( exefileFound == false ) { exefileFound = true; } else { - // 带 Ѵ. + // 노드를 삭제한다. if ( before == m_Resources.rend() ) { m_Resources.erase( current ); current = m_Resources.rbegin(); diff --git a/src/Core/ResourceManager.h b/src/Core/ResourceManager.h index fec8665e..7995e203 100644 --- a/src/Core/ResourceManager.h +++ b/src/Core/ResourceManager.h @@ -57,7 +57,7 @@ class ResourceManager { return m_Resources.empty(); } - // , ֽ ϰ Ѵ. + // 동일한 파일일 경우, 가장 최신 버전만을 유지하고 구버전의 파일은 삭제한다. void optimize(); // get debug string diff --git a/src/Core/RideMotorcycleSlotInfo.h b/src/Core/RideMotorcycleSlotInfo.h index 3507a1b6..91c5fa44 100644 --- a/src/Core/RideMotorcycleSlotInfo.h +++ b/src/Core/RideMotorcycleSlotInfo.h @@ -14,7 +14,7 @@ #include "Types.h" ////////////////////////////////////////////////////////////////////////////// -// RideMotorcycle ִ ü. +// RideMotorcycle 정보를 담고 있는 객체. ///////////////////////////////////////////////////////////////////////////// class RideMotorcycleSlotInfo : public PCItemInfo { diff --git a/src/Core/Rpackets/RCSay.cpp b/src/Core/Rpackets/RCSay.cpp index ba5555b4..577cdf37 100644 --- a/src/Core/Rpackets/RCSay.cpp +++ b/src/Core/Rpackets/RCSay.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void RCSay::read(Datagram& iDatagram) throw(ProtocolException, Error) { __BEGIN_TRY @@ -47,7 +47,7 @@ void RCSay::read(Datagram& iDatagram) throw(ProtocolException, Error) { ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void RCSay::write(Datagram& oDatagram) const throw(ProtocolException, Error) { __BEGIN_TRY diff --git a/src/Core/Rpackets/RCSay.h b/src/Core/Rpackets/RCSay.h index 05251b76..a3feae55 100644 --- a/src/Core/Rpackets/RCSay.h +++ b/src/Core/Rpackets/RCSay.h @@ -18,16 +18,16 @@ // // class RCSay; // -// ٸ Ŭ̾Ʈ ϴ Ŷ +// 내가 다른 클라이언트에게 말하는 패킷 // //---------------------------------------------------------------------- class RCSay : public DatagramPacket { public: - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(Datagram& iDatagram) throw(ProtocolException, Error); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(Datagram& oDatagram) const throw(ProtocolException, Error); // execute packet's handler diff --git a/src/Core/SGAddGuildMemberOK.cpp b/src/Core/SGAddGuildMemberOK.cpp index d041ee6b..fd3b6c9f 100644 --- a/src/Core/SGAddGuildMemberOK.cpp +++ b/src/Core/SGAddGuildMemberOK.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void SGAddGuildMemberOK::read(SocketInputStream& iStream) { __BEGIN_TRY @@ -36,7 +36,7 @@ void SGAddGuildMemberOK::read(SocketInputStream& iStream) { ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void SGAddGuildMemberOK::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/SGAddGuildMemberOK.h b/src/Core/SGAddGuildMemberOK.h index c8940a16..b48a8c2a 100644 --- a/src/Core/SGAddGuildMemberOK.h +++ b/src/Core/SGAddGuildMemberOK.h @@ -18,7 +18,7 @@ // // class SGAddGuildMemberOK; // -// ߰ Ǿ Ӽ ˸. +// 멤버가 추가 되었음을 게임서버에 알린다. // // *CAUTION* // @@ -28,10 +28,10 @@ class SGAddGuildMemberOK : public Packet { public: SGAddGuildMemberOK() {}; ~SGAddGuildMemberOK() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -134,7 +134,7 @@ class SGAddGuildMemberOKFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionPacketMaxSize , ϶. + // const static LGIncomingConnectionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID + // guild ID szBYTE + // name length diff --git a/src/Core/SGAddGuildMemberOKHandler.cpp b/src/Core/SGAddGuildMemberOKHandler.cpp index 61e1e2d3..4146b905 100644 --- a/src/Core/SGAddGuildMemberOKHandler.cpp +++ b/src/Core/SGAddGuildMemberOKHandler.cpp @@ -42,17 +42,17 @@ void SGAddGuildMemberOKHandler::execute(SGAddGuildMemberOK* pPacket) #ifdef __GAME_SERVER__ - // object . + // 길드 멤버 object 를 만든다. GuildMember* pGuildMember = new GuildMember(); pGuildMember->setGuildID(pPacket->getGuildID()); pGuildMember->setName(pPacket->getName()); pGuildMember->setRank(pPacket->getGuildMemberRank()); - // 忡 ߰Ѵ. + // 길드에 추가한다. Guild* pGuild = g_pGuildManager->getGuild(pGuildMember->getGuildID()); pGuild->addMember(pGuildMember); - // ޼ . + // 멤버에게 메세지를 보낸다. __ENTER_CRITICAL_SECTION((*g_pPCFinder)) Creature* pCreature = g_pPCFinder->getCreature_LOCKED(pGuildMember->getName()); @@ -61,7 +61,7 @@ void SGAddGuildMemberOKHandler::execute(SGAddGuildMemberOK* pPacket) Assert(pPlayer != NULL); if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_MASTER || - pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_SUBMASTER) // 帶ͳ 긶 + pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_SUBMASTER) // 길드마스터나 서브마스터일 경우 { PlayerCreature* pPlayerCreature = dynamic_cast(pCreature); Assert(pPlayerCreature != NULL); @@ -76,7 +76,7 @@ void SGAddGuildMemberOKHandler::execute(SGAddGuildMemberOK* pPacket) Gold_t CurMoney = pPlayerCreature->getGold(); if (CurMoney < Fee) { - // ūϳ + // 큰일났군 CurMoney = 0; } else CurMoney -= Fee; @@ -87,11 +87,11 @@ void SGAddGuildMemberOKHandler::execute(SGAddGuildMemberOK* pPacket) GCModifyInformation gcModifyInformation; gcModifyInformation.addLongData(MODIFY_GOLD, CurMoney); - // ٲ Ŭ̾Ʈ ش. + // 바뀐정보를 클라이언트에 보내준다. pPlayer->sendPacket(&gcModifyInformation); } - // ޽ ش. + // 길드 가입 메시지를 보여준다. GCSystemMessage gcSystemMessage; if (pGuild->getRace() == Guild::GUILD_RACE_SLAYER) gcSystemMessage.setMessage(g_pStringPool->getString(STRID_TEAM_JOIN_ACCEPTED)); @@ -102,7 +102,7 @@ void SGAddGuildMemberOKHandler::execute(SGAddGuildMemberOK* pPacket) pPlayer->sendPacket(&gcSystemMessage); } else if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_WAIT) { - // û ޽ . + // 길드 가입 신청 메시지를 보낸다. GCSystemMessage gcSystemMessage; if (pGuild->getRace() == Guild::GUILD_RACE_SLAYER) gcSystemMessage.setMessage(g_pStringPool->getString(STRID_TEAM_JOIN_TRY)); @@ -114,14 +114,14 @@ void SGAddGuildMemberOKHandler::execute(SGAddGuildMemberOK* pPacket) pPlayer->sendPacket(&gcSystemMessage); } } else { - // ȵǾ ִ. + // 접속이 안되어 있다. - // ͳ 긶 - // DB  Ѵ. + // 마스터나 서브마스터일 경우 + // DB 에서 돈을 까도록 한다. if ((pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_MASTER || - pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_SUBMASTER) // 帶ͳ 긶 + pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_SUBMASTER) // 길드마스터나 서브마스터일 경우 && - pPacket->getServerGroupID() == g_pConfig->getPropertyInt("ServerID")) // ߰ ΰ? + pPacket->getServerGroupID() == g_pConfig->getPropertyInt("ServerID")) // 이 게임 서버에서 추가한 길드원인가? { Gold_t Fee; if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_MASTER) @@ -153,7 +153,7 @@ void SGAddGuildMemberOKHandler::execute(SGAddGuildMemberOK* pPacket) } } - // Ϳ ޽ . + // 길드 마스터에게 메시지를 보낸다. pCreature = g_pPCFinder->getCreature_LOCKED(pGuild->getMaster()); if (pCreature != NULL && pCreature->isPC() && pGuildMember->getRank() != GuildMember::GUILDMEMBER_RANK_MASTER) { Player* pPlayer = pCreature->getPlayer(); diff --git a/src/Core/SGAddGuildOK.cpp b/src/Core/SGAddGuildOK.cpp index 85c8ffc6..07007c59 100644 --- a/src/Core/SGAddGuildOK.cpp +++ b/src/Core/SGAddGuildOK.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void SGAddGuildOK::read(SocketInputStream& iStream) { __BEGIN_TRY @@ -54,7 +54,7 @@ void SGAddGuildOK::read(SocketInputStream& iStream) { ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void SGAddGuildOK::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/SGAddGuildOK.h b/src/Core/SGAddGuildOK.h index a8c55bf6..3494b24e 100644 --- a/src/Core/SGAddGuildOK.h +++ b/src/Core/SGAddGuildOK.h @@ -18,7 +18,7 @@ // // class SGAddGuildOK; // -// ߰ Ǿ Ӽ ˸. +// 팀이 추가 되었음을 게임서버에 알린다. // // *CAUTION* // @@ -28,10 +28,10 @@ class SGAddGuildOK : public Packet { public: SGAddGuildOK() {}; ~SGAddGuildOK() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -184,7 +184,7 @@ class SGAddGuildOKFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionPacketMaxSize , ϶. + // const static LGIncomingConnectionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID + // guild ID szBYTE + // guild name length diff --git a/src/Core/SGDeleteGuildOK.h b/src/Core/SGDeleteGuildOK.h index 84e5d606..c65b9e8b 100644 --- a/src/Core/SGDeleteGuildOK.h +++ b/src/Core/SGDeleteGuildOK.h @@ -18,7 +18,7 @@ // // class SGDeleteGuildOK; // -// ߰ Ǿ Ӽ ˸. +// 팀이 추가 되었음을 게임서버에 알린다. // // *CAUTION* // @@ -28,10 +28,10 @@ class SGDeleteGuildOK : public Packet { public: SGDeleteGuildOK() {}; ~SGDeleteGuildOK() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -97,7 +97,7 @@ class SGDeleteGuildOKFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionPacketMaxSize , ϶. + // const static LGIncomingConnectionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID; // guild ID } diff --git a/src/Core/SGDeleteGuildOKHandler.cpp b/src/Core/SGDeleteGuildOKHandler.cpp index fe5c5c0e..e2242474 100644 --- a/src/Core/SGDeleteGuildOKHandler.cpp +++ b/src/Core/SGDeleteGuildOKHandler.cpp @@ -40,14 +40,14 @@ void SGDeleteGuildOKHandler::execute(SGDeleteGuildOK* pPacket) #ifdef __GAME_SERVER__ - // Ʈ ִ warp Ų. - // Ʈ Ѵ. - // warp Ʈ ٸ 忡 ZoneGroup Thread ο Ͼ ؾ Ż ϴ. - // ϴ д. Portal Ƿ ٽ  ̴. + // 길드 아지트에 있는 멤버를 warp 시킨다. + // 길드 아지트를 삭제한다. + // 멤버 warp와 길드 아지트 삭제 시 다른 쓰레드에서 ZoneGroup Thread 내부에서 일어나게 해야 별탈이 없을 듯 하다. + // 일단은 걍 둔다. Portal 이 막히므로 다시 들어갈 수 없을 것이다. Assert(pPacket != NULL); - // 带 ´. + // 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); try { Assert(pGuild != NULL); @@ -56,7 +56,7 @@ void SGDeleteGuildOKHandler::execute(SGDeleteGuildOK* pPacket) } - // Ȱ ¿ ü ¿ ü Ѵ. + // 길드 활동 중인 상태에서의 해체인지 대기 중인 상태에서의 해체인지 구별한다. if (pGuild->getState() == Guild::GUILD_STATE_ACTIVE) { HashMapGuildMember& Members = pGuild->getMembers(); HashMapGuildMemberItor itr = Members.begin(); @@ -64,7 +64,7 @@ void SGDeleteGuildOKHandler::execute(SGDeleteGuildOK* pPacket) for (; itr != Members.end(); itr++) { GuildMember* pGuildMember = itr->second; - // + // 접속해 있으면 __ENTER_CRITICAL_SECTION((*g_pPCFinder)) Creature* pCreature = g_pPCFinder->getCreature_LOCKED(pGuildMember->getName()); @@ -75,29 +75,29 @@ void SGDeleteGuildOKHandler::execute(SGDeleteGuildOK* pPacket) PlayerCreature* pPlayerCreature = dynamic_cast(pCreature); Assert(pPlayerCreature != NULL); - // Slayer, Vampire ̵ ٲ۴. + // Slayer, Vampire 의 길드 아이디를 바꾼다. if (pPlayerCreature->isSlayer()) { - pPlayerCreature->setGuildID(99); // ̾ Ծ ID + pPlayerCreature->setGuildID(99); // 슬레이어 가입안한 상태의 길드 ID - // Ŭ̾Ʈ ̵ ٲ ˸. + // 클라이언트에 길드 아이디가 바꼈음을 알린다. GCModifyGuildMemberInfo gcModifyGuildMemberInfo; gcModifyGuildMemberInfo.setGuildID(pPlayerCreature->getGuildID()); gcModifyGuildMemberInfo.setGuildName(""); gcModifyGuildMemberInfo.setGuildMemberRank(GuildMember::GUILDMEMBER_RANK_DENY); pPlayer->sendPacket(&gcModifyGuildMemberInfo); } else if (pPlayerCreature->isVampire()) { - pPlayerCreature->setGuildID(0); // ̾ Ծ ID + pPlayerCreature->setGuildID(0); // 뱀파이어 가입안한 상태의 길드 ID - // Ŭ̾Ʈ ̵ ٲ ˸. + // 클라이언트에 길드 아이디가 바꼈음을 알린다. GCModifyGuildMemberInfo gcModifyGuildMemberInfo; gcModifyGuildMemberInfo.setGuildID(pPlayerCreature->getGuildID()); gcModifyGuildMemberInfo.setGuildName(""); gcModifyGuildMemberInfo.setGuildMemberRank(GuildMember::GUILDMEMBER_RANK_DENY); pPlayer->sendPacket(&gcModifyGuildMemberInfo); } else if (pPlayerCreature->isOusters()) { - pPlayerCreature->setGuildID(66); // ƿ콺 Ծ ID + pPlayerCreature->setGuildID(66); // 아우스터즈 가입안한 상태의 길드 ID - // Ŭ̾Ʈ ̵ ٲ ˸. + // 클라이언트에 길드 아이디가 바꼈음을 알린다. GCModifyGuildMemberInfo gcModifyGuildMemberInfo; gcModifyGuildMemberInfo.setGuildID(pPlayerCreature->getGuildID()); gcModifyGuildMemberInfo.setGuildName(""); @@ -105,7 +105,7 @@ void SGDeleteGuildOKHandler::execute(SGDeleteGuildOK* pPacket) pPlayer->sendPacket(&gcModifyGuildMemberInfo); } - // Ŭ̾Ʈ ̵ ٲ ˸. + // 주위에 클라이언트에 길드 아이디가 바꼈음을 알린다. GCOtherModifyInfo gcOtherModifyInfo; gcOtherModifyInfo.setObjectID(pCreature->getObjectID()); gcOtherModifyInfo.addShortData(MODIFY_GUILDID, pPlayerCreature->getGuildID()); @@ -118,17 +118,17 @@ void SGDeleteGuildOKHandler::execute(SGDeleteGuildOK* pPacket) __LEAVE_CRITICAL_SECTION((*g_pPCFinder)) - // Guild Member ü Ѵ. + // Guild Member 객체를 삭제한다. SAFE_DELETE(pGuildMember); } - // Ѵ. + // 길드 멤버 맵을 삭제한다. Members.clear(); - // Ŵ 带 Ѵ. + // 길드 매니저에서 길드를 삭제한다. g_pGuildManager->deleteGuild(pGuild->getID()); - // ü Ѵ. + // 길드 객체를 삭제한다. SAFE_DELETE(pGuild); } else if (pGuild->getState() == Guild::GUILD_STATE_WAIT) { HashMapGuildMember& Members = pGuild->getMembers(); @@ -143,7 +143,7 @@ void SGDeleteGuildOKHandler::execute(SGDeleteGuildOK* pPacket) for (; itr != Members.end(); itr++) { GuildMember* pGuildMember = itr->second; - // + // 접속해 있으면 __ENTER_CRITICAL_SECTION((*g_pPCFinder)) Creature* pCreature = g_pPCFinder->getCreature_LOCKED(pGuildMember->getName()); @@ -154,7 +154,7 @@ void SGDeleteGuildOKHandler::execute(SGDeleteGuildOK* pPacket) PlayerCreature* pPlayerCreature = dynamic_cast(pCreature); Assert(pPlayerCreature != NULL); - // Ϻ ȯѴ. + // 등록비를 환불한다. Gold_t Gold = pPlayerCreature->getGold(); if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_MASTER) { Gold = min((uint64_t)(Gold + RETURN_SLAYER_MASTER_GOLD), (uint64_t)2000000000); @@ -168,7 +168,7 @@ void SGDeleteGuildOKHandler::execute(SGDeleteGuildOK* pPacket) gcModifyInformation.addLongData(MODIFY_GOLD, Gold); pPlayer->sendPacket(&gcModifyInformation); - // ޽ . + // 메시지를 보낸다. pResult = pStmt->executeQuery("SELECT Message FROM Messages WHERE Receiver = '%s'", pCreature->getName().c_str()); @@ -183,18 +183,18 @@ void SGDeleteGuildOKHandler::execute(SGDeleteGuildOK* pPacket) __LEAVE_CRITICAL_SECTION((*g_pPCFinder)) - // ü Ѵ. + // 길드 멤버 객체를 삭제한다. SAFE_DELETE(pGuildMember); } - // ؽ . + // 길드 멤버 해쉬 맵을 지운다. Members.clear(); - // Ŵ 带 Ѵ. + // 길드 매니저에서 길드를 삭제한다. g_pGuildManager->deleteGuild(pGuild->getID()); GuildUnionManager::Instance().removeMasterGuild(pGuild->getID()); - // ü Ѵ. + // 길드 객체를 삭제한다. SAFE_DELETE(pGuild); SAFE_DELETE(pStmt); diff --git a/src/Core/SGExpelGuildMemberOK.cpp b/src/Core/SGExpelGuildMemberOK.cpp index 66db0278..d05b8864 100644 --- a/src/Core/SGExpelGuildMemberOK.cpp +++ b/src/Core/SGExpelGuildMemberOK.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void SGExpelGuildMemberOK::read(SocketInputStream& iStream) { __BEGIN_TRY @@ -41,7 +41,7 @@ void SGExpelGuildMemberOK::read(SocketInputStream& iStream) { ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void SGExpelGuildMemberOK::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/SGExpelGuildMemberOK.h b/src/Core/SGExpelGuildMemberOK.h index 1e6d8c08..e60349a9 100644 --- a/src/Core/SGExpelGuildMemberOK.h +++ b/src/Core/SGExpelGuildMemberOK.h @@ -18,7 +18,7 @@ // // class SGExpelGuildMemberOK; // -// ߰ Ǿ Ӽ ˸. +// 팀이 추가 되었음을 게임서버에 알린다. // // *CAUTION* // @@ -28,10 +28,10 @@ class SGExpelGuildMemberOK : public Packet { public: SGExpelGuildMemberOK() {}; ~SGExpelGuildMemberOK() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -123,7 +123,7 @@ class SGExpelGuildMemberOKFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionPacketMaxSize , ϶. + // const static LGIncomingConnectionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID + // guild ID szBYTE + // name length diff --git a/src/Core/SGExpelGuildMemberOKHandler.cpp b/src/Core/SGExpelGuildMemberOKHandler.cpp index 4cc8940a..5dce2c21 100644 --- a/src/Core/SGExpelGuildMemberOKHandler.cpp +++ b/src/Core/SGExpelGuildMemberOKHandler.cpp @@ -43,7 +43,7 @@ void SGExpelGuildMemberOKHandler::execute(SGExpelGuildMemberOK* pPacket) Assert(pPacket != NULL); - // 带 ´. + // 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); try { Assert(pGuild != NULL); @@ -51,7 +51,7 @@ void SGExpelGuildMemberOKHandler::execute(SGExpelGuildMemberOK* pPacket) return; } - // ȮѴ. + // 길드 멤버인지 확인한다. GuildMember* pGuildMember = pGuild->getMember(pPacket->getName()); try { Assert(pGuildMember != NULL); @@ -61,13 +61,13 @@ void SGExpelGuildMemberOKHandler::execute(SGExpelGuildMemberOK* pPacket) if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_WAIT) { ////////////////////////////////////////////////////////// - // + // 가입 취소 ////////////////////////////////////////////////////////// - // 忡 Ѵ. + // 길드에서 삭제한다. pGuild->deleteMember(pGuildMember->getName()); - // ִٸ ޽ . + // 접속해 있다면 메시지를 보낸다. __ENTER_CRITICAL_SECTION((*g_pPCFinder)) Creature* pCreature = g_pPCFinder->getCreature_LOCKED(pPacket->getName()); @@ -76,7 +76,7 @@ void SGExpelGuildMemberOKHandler::execute(SGExpelGuildMemberOK* pPacket) Assert(pPlayer != NULL); // StringStream msg; - // msg << pGuild->getName() << " Խû ҵǾϴ."; + // msg << pGuild->getName() << " 길드 가입신청이 취소되었습니다."; char msg[100]; if (pGuild->getRace() == Guild::GUILD_RACE_SLAYER) @@ -85,20 +85,20 @@ void SGExpelGuildMemberOKHandler::execute(SGExpelGuildMemberOK* pPacket) sprintf(msg, g_pStringPool->c_str(STRID_CLAN_JOIN_DENY), pGuild->getName().c_str()); else if (pGuild->getRace() == Guild::GUILD_RACE_OUSTERS) sprintf(msg, g_pStringPool->c_str(STRID_CLAN_JOIN_DENY), pGuild->getName().c_str()); - // Խû ޽ . + // 길드 가입신청취소 메시지를 보낸다. GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(msg); pPlayer->sendPacket(&gcSystemMessage); } - // ҽŲ ޽ . + // 취소시킨 사람에게 메시지를 보낸다. pCreature = g_pPCFinder->getCreature_LOCKED(pPacket->getSender()); if (pCreature != NULL && pCreature->isPC()) { Player* pPlayer = pCreature->getPlayer(); Assert(pPlayer != NULL); // StringStream msg; - // msg << pPacket->getName() << " 尡 Ͽϴ."; + // msg << pPacket->getName() << "님의 길드가입을 취소하였습니다."; char msg[100]; if (pGuild->getRace() == Guild::GUILD_RACE_SLAYER) @@ -116,13 +116,13 @@ void SGExpelGuildMemberOKHandler::execute(SGExpelGuildMemberOK* pPacket) __LEAVE_CRITICAL_SECTION((*g_pPCFinder)) } else { /////////////////////////////////////////////////////////// - // 忡 ߹Ѵ. + // 길드에서 추방한다. /////////////////////////////////////////////////////////// - // 忡 Ѵ. + // 길드에서 삭제한다. pGuild->deleteMember(pGuildMember->getName()); - // ִٸ ޽ . + // 접속해 있다면 메시지를 보낸다. __ENTER_CRITICAL_SECTION((*g_pPCFinder)) Creature* pCreature = g_pPCFinder->getCreature_LOCKED(pPacket->getName()); @@ -134,27 +134,27 @@ void SGExpelGuildMemberOKHandler::execute(SGExpelGuildMemberOK* pPacket) Assert(pPlayerCreature != NULL); if (pPlayerCreature->isSlayer()) { - pPlayerCreature->setGuildID(99); // ̾ Ծ ID + pPlayerCreature->setGuildID(99); // 슬레이어의 가입안한 상태의 길드 ID - // Ŭ̾Ʈ ߹ ˸. + // 클라이언트에 길드 추방을 알린다. GCModifyGuildMemberInfo gcModifyGuildMember; gcModifyGuildMember.setGuildID(pPlayerCreature->getGuildID()); gcModifyGuildMember.setGuildName(""); gcModifyGuildMember.setGuildMemberRank(GuildMember::GUILDMEMBER_RANK_DENY); pPlayer->sendPacket(&gcModifyGuildMember); } else if (pPlayerCreature->isVampire()) { - pPlayerCreature->setGuildID(0); // ̾ Ծ ID + pPlayerCreature->setGuildID(0); // 뱀파이어의 가입안한 상태의 길드 ID - // Ŭ̾Ʈ ߹ ˸. + // 클라이언트에 길드 추방을 알린다. GCModifyGuildMemberInfo gcModifyGuildMember; gcModifyGuildMember.setGuildID(pPlayerCreature->getGuildID()); gcModifyGuildMember.setGuildName(""); gcModifyGuildMember.setGuildMemberRank(GuildMember::GUILDMEMBER_RANK_DENY); pPlayer->sendPacket(&gcModifyGuildMember); } else if (pPlayerCreature->isOusters()) { - pPlayerCreature->setGuildID(66); // ƿ콺 Ծ ID + pPlayerCreature->setGuildID(66); // 아우스터즈 가입안한 상태의 길드 ID - // Ŭ̾Ʈ ߹ ˸. + // 클라이언트에 길드 추방을 알린다. GCModifyGuildMemberInfo gcModifyGuildMember; gcModifyGuildMember.setGuildID(pPlayerCreature->getGuildID()); gcModifyGuildMember.setGuildName(""); @@ -162,9 +162,9 @@ void SGExpelGuildMemberOKHandler::execute(SGExpelGuildMemberOK* pPacket) pPlayer->sendPacket(&gcModifyGuildMember); } - // ߹ ޽ . + // 길드 추방 메시지를 보낸다. GCSystemMessage gcSystemMessage; - // gcSystemMessage.setMessage("忡 ߹߽ϴ."); + // gcSystemMessage.setMessage("길드에서 추방당했습니다."); if (pGuild->getRace() == Guild::GUILD_RACE_SLAYER) gcSystemMessage.setMessage(g_pStringPool->getString(STRID_EXPEL_TEAM_MEMBER)); @@ -176,7 +176,7 @@ void SGExpelGuildMemberOKHandler::execute(SGExpelGuildMemberOK* pPacket) pPlayer->sendPacket(&gcSystemMessage); if (pGuild->getState() == Guild::GUILD_STATE_ACTIVE) { - // ˸. + // 주위에 알린다. Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); @@ -188,14 +188,14 @@ void SGExpelGuildMemberOKHandler::execute(SGExpelGuildMemberOK* pPacket) } } - // ߹Ų ޽ . + // 추방시킨 사람에게 메시지를 보낸다. pCreature = g_pPCFinder->getCreature_LOCKED(pPacket->getSender()); if (pCreature != NULL && pCreature->isPC()) { Player* pPlayer = pCreature->getPlayer(); Assert(pPlayer != NULL); // StringStream msg; - // msg << pPacket->getName() << " 忡 ߹Ͽϴ."; + // msg << pPacket->getName() << "님을 길드에서 추방하였습니다."; char msg[100]; if (pGuild->getRace() == Guild::GUILD_RACE_SLAYER) diff --git a/src/Core/SGGuildInfoHandler.cpp b/src/Core/SGGuildInfoHandler.cpp index 219efd15..493bdd71 100644 --- a/src/Core/SGGuildInfoHandler.cpp +++ b/src/Core/SGGuildInfoHandler.cpp @@ -36,7 +36,7 @@ void SGGuildInfoHandler::execute(SGGuildInfo* pPacket) g_pGuildManager->lock(); - // Ѵ. + // 모든 길들 삭제한다. g_pGuildManager->clear_NOBLOCKED(); GuildInfo2* pGuildInfo = NULL; diff --git a/src/Core/SGGuildMemberLogOnOK.cpp b/src/Core/SGGuildMemberLogOnOK.cpp index 68f2ccd3..95cb9431 100644 --- a/src/Core/SGGuildMemberLogOnOK.cpp +++ b/src/Core/SGGuildMemberLogOnOK.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void SGGuildMemberLogOnOK::read(SocketInputStream& iStream) { __BEGIN_TRY @@ -35,7 +35,7 @@ void SGGuildMemberLogOnOK::read(SocketInputStream& iStream) { ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void SGGuildMemberLogOnOK::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/SGGuildMemberLogOnOKHandler.cpp b/src/Core/SGGuildMemberLogOnOKHandler.cpp index 7812293e..c4ed33f3 100644 --- a/src/Core/SGGuildMemberLogOnOKHandler.cpp +++ b/src/Core/SGGuildMemberLogOnOKHandler.cpp @@ -32,7 +32,7 @@ void SGGuildMemberLogOnOKHandler::execute(SGGuildMemberLogOnOK* pPacket) Assert(pPacket != NULL); - // 带 ´. + // 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); try { Assert(pGuild != NULL); @@ -40,7 +40,7 @@ void SGGuildMemberLogOnOKHandler::execute(SGGuildMemberLogOnOK* pPacket) return; } - // ȮѴ. + // 길드 멤버인지 확인한다. GuildMember* pGuildMember = pGuild->getMember(pPacket->getName()); try { Assert(pGuildMember != NULL); diff --git a/src/Core/SGModifyGuildIntroOK.cpp b/src/Core/SGModifyGuildIntroOK.cpp index 07377e4d..2a0d02b0 100644 --- a/src/Core/SGModifyGuildIntroOK.cpp +++ b/src/Core/SGModifyGuildIntroOK.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void SGModifyGuildIntroOK::read(SocketInputStream& iStream) { __BEGIN_TRY @@ -34,7 +34,7 @@ void SGModifyGuildIntroOK::read(SocketInputStream& iStream) { ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void SGModifyGuildIntroOK::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/SGModifyGuildIntroOK.h b/src/Core/SGModifyGuildIntroOK.h index 1aa7bd29..bafd7e0d 100644 --- a/src/Core/SGModifyGuildIntroOK.h +++ b/src/Core/SGModifyGuildIntroOK.h @@ -18,7 +18,7 @@ // // class SGModifyGuildIntroOK; // -// ߰ Ǿ Ӽ ˸. +// 팀이 추가 되었음을 게임서버에 알린다. // // *CAUTION* // @@ -28,10 +28,10 @@ class SGModifyGuildIntroOK : public Packet { public: SGModifyGuildIntroOK() {}; ~SGModifyGuildIntroOK() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -110,7 +110,7 @@ class SGModifyGuildIntroOKFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionPacketMaxSize , ϶. + // const static LGIncomingConnectionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID + // guild ID szBYTE + // Guild Intro length diff --git a/src/Core/SGModifyGuildIntroOKHandler.cpp b/src/Core/SGModifyGuildIntroOKHandler.cpp index 9d0dd1ae..2ae44649 100644 --- a/src/Core/SGModifyGuildIntroOKHandler.cpp +++ b/src/Core/SGModifyGuildIntroOKHandler.cpp @@ -36,7 +36,7 @@ void SGModifyGuildIntroOKHandler::execute(SGModifyGuildIntroOK* pPacket) Assert(pPacket != NULL); - // 带 ´. + // 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); try { Assert(pGuild != NULL); diff --git a/src/Core/SGModifyGuildMemberOK.cpp b/src/Core/SGModifyGuildMemberOK.cpp index 61996876..339a907f 100644 --- a/src/Core/SGModifyGuildMemberOK.cpp +++ b/src/Core/SGModifyGuildMemberOK.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void SGModifyGuildMemberOK::read(SocketInputStream& iStream) @@ -44,7 +44,7 @@ void SGModifyGuildMemberOK::read(SocketInputStream& iStream) ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void SGModifyGuildMemberOK::write(SocketOutputStream& oStream) const diff --git a/src/Core/SGModifyGuildMemberOK.h b/src/Core/SGModifyGuildMemberOK.h index b31057ae..79c32c2c 100644 --- a/src/Core/SGModifyGuildMemberOK.h +++ b/src/Core/SGModifyGuildMemberOK.h @@ -18,7 +18,7 @@ // // class SGModifyGuildMemberOK; // -// ߰ Ǿ Ӽ ˸. +// 팀이 추가 되었음을 게임서버에 알린다. // // *CAUTION* // @@ -28,10 +28,10 @@ class SGModifyGuildMemberOK : public Packet { public: SGModifyGuildMemberOK() {}; ~SGModifyGuildMemberOK() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -135,7 +135,7 @@ class SGModifyGuildMemberOKFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionPacketMaxSize , ϶. + // const static LGIncomingConnectionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID + // guild ID szBYTE + // name length diff --git a/src/Core/SGModifyGuildMemberOKHandler.cpp b/src/Core/SGModifyGuildMemberOKHandler.cpp index 1bc5fb01..84e301c6 100644 --- a/src/Core/SGModifyGuildMemberOKHandler.cpp +++ b/src/Core/SGModifyGuildMemberOKHandler.cpp @@ -44,7 +44,7 @@ void SGModifyGuildMemberOKHandler::execute(SGModifyGuildMemberOK* pPacket) Assert(pPacket != NULL); - // 带 ´. + // 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); try { Assert(pGuild != NULL); @@ -52,7 +52,7 @@ void SGModifyGuildMemberOKHandler::execute(SGModifyGuildMemberOK* pPacket) return; } - // ȮѴ. + // 길드 멤버인지 확인한다. GuildMember* pGuildMember = pGuild->getMember(pPacket->getName()); try { Assert(pGuildMember != NULL); @@ -63,13 +63,13 @@ void SGModifyGuildMemberOKHandler::execute(SGModifyGuildMemberOK* pPacket) if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_WAIT && pPacket->getGuildMemberRank() == GuildMember::GUILDMEMBER_RANK_NORMAL) { //////////////////////////////////////////////////////////////////////////// - // û ̴. + // 길드 가입 신청을 승인한 경우이다. //////////////////////////////////////////////////////////////////////////// - // Ѵ. + // 길드멤버 정보를 변경한다. pGuild->modifyMemberRank(pGuildMember->getName(), pPacket->getGuildMemberRank()); - // ִٸ ޽ . + // 접속해 있다면 메시지를 보낸다. __ENTER_CRITICAL_SECTION((*g_pPCFinder)) Creature* pCreature = g_pPCFinder->getCreature_LOCKED(pGuildMember->getName()); @@ -77,7 +77,7 @@ void SGModifyGuildMemberOKHandler::execute(SGModifyGuildMemberOK* pPacket) PlayerCreature* pPlayerCreature = dynamic_cast(pCreature); Assert(pPlayerCreature != NULL); - // ID Ѵ. + // 실제 길드 ID를 등록한다. pPlayerCreature->setGuildID(pGuildMember->getGuildID()); Player* pPlayer = pCreature->getPlayer(); @@ -86,14 +86,14 @@ void SGModifyGuildMemberOKHandler::execute(SGModifyGuildMemberOK* pPacket) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // ٲ ID ش. + // 바뀐 길드 ID 정보를 보내준다. GCModifyGuildMemberInfo gcModifyGuildMemberInfo; gcModifyGuildMemberInfo.setGuildID(pGuild->getID()); gcModifyGuildMemberInfo.setGuildName(pGuild->getName()); gcModifyGuildMemberInfo.setGuildMemberRank(pGuildMember->getRank()); pPlayer->sendPacket(&gcModifyGuildMemberInfo); - // ޽ . + // 길드 가입 승인 메시지를 보낸다. Statement* pStmt = NULL; Result* pResult = NULL; @@ -114,21 +114,21 @@ void SGModifyGuildMemberOKHandler::execute(SGModifyGuildMemberOK* pPacket) } END_DB(pStmt) - // ˸. + // 주위에 길드 가입을 알린다. GCOtherModifyInfo gcOtherModifyInfo; gcOtherModifyInfo.setObjectID(pCreature->getObjectID()); gcOtherModifyInfo.addShortData(MODIFY_GUILDID, pGuildMember->getGuildID()); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcOtherModifyInfo); } - // ޽ . + // 승인한 사람에게 메시지를 보낸다. pCreature = g_pPCFinder->getCreature_LOCKED(pPacket->getSender()); if (pCreature != NULL && pCreature->isPC()) { Player* pPlayer = pCreature->getPlayer(); Assert(pPlayer != NULL); // StringStream msg; - // msg << pGuildMember->getName() << " Ͽϴ."; + // msg << pGuildMember->getName() << "님의 길드 가입을 승인하였습니다."; char msg[100]; if (pGuild->getRace() == Guild::GUILD_RACE_SLAYER) @@ -147,22 +147,22 @@ void SGModifyGuildMemberOKHandler::execute(SGModifyGuildMemberOK* pPacket) } else if (pGuildMember->getRank() != GuildMember::GUILDMEMBER_RANK_MASTER && pPacket->getGuildMemberRank() == GuildMember::GUILDMEMBER_RANK_MASTER) { /////////////////////////////////////////////////////////// - // ͸ Ѵ. + // 길드 마스터를 변경한다. /////////////////////////////////////////////////////////// string sMaster = pGuild->getMaster(); - // 帶 ũ 帶Ͱ Ǵ ũ ٲش. + // 길드마스터의 랭크를 새로 길드마스터가 되는 멤버의 원래 랭크로 바꿔준다. pGuild->modifyMemberRank(sMaster, pGuildMember->getRank()); - // 帶 ũ Ѵ. + // 새 길드마스터의 랭크를 세팅한다. pGuild->modifyMemberRank(pGuildMember->getName(), pPacket->getGuildMemberRank()); - // Ʈ Ʈ Ѵ. + // 길드 오브젝트에 새 길드 마스트로 세팅한다. pGuild->setMaster(pGuildMember->getName()); - // ִٸ ޽ . + // 접속해 있다면 메시지를 보낸다. __ENTER_CRITICAL_SECTION((*g_pPCFinder)) - // 帶Ͱ Ӽ ִٸ ش. + // 새 길드마스터가 게임서버에 있다면 새 정보를 보내준다. Creature* pCreature = g_pPCFinder->getCreature_LOCKED(pGuildMember->getName()); if (pCreature != NULL && pCreature->isPC()) { PlayerCreature* pPlayerCreature = dynamic_cast(pCreature); @@ -171,7 +171,7 @@ void SGModifyGuildMemberOKHandler::execute(SGModifyGuildMemberOK* pPacket) Player* pPlayer = pCreature->getPlayer(); Assert(pPlayer != NULL); - // ٲ ID ش. + // 바뀐 길드 ID 정보를 보내준다. GCModifyGuildMemberInfo gcModifyGuildMemberInfo; gcModifyGuildMemberInfo.setGuildID(pGuild->getID()); gcModifyGuildMemberInfo.setGuildName(pGuild->getName()); @@ -179,7 +179,7 @@ void SGModifyGuildMemberOKHandler::execute(SGModifyGuildMemberOK* pPacket) pPlayer->sendPacket(&gcModifyGuildMemberInfo); } - // 帶Ͱ Ӽ ִٸ ش. + // 원래의 길드마스터가 게임서버에 있다면 새 정보를 보내준다. pCreature = g_pPCFinder->getCreature_LOCKED(sMaster); if (pCreature != NULL && pCreature->isPC()) { PlayerCreature* pPlayerCreature = dynamic_cast(pCreature); @@ -188,7 +188,7 @@ void SGModifyGuildMemberOKHandler::execute(SGModifyGuildMemberOK* pPacket) Player* pPlayer = pCreature->getPlayer(); Assert(pPlayer != NULL); - // ٲ ID ش. + // 바뀐 길드 ID 정보를 보내준다. GCModifyGuildMemberInfo gcModifyGuildMemberInfo; gcModifyGuildMemberInfo.setGuildID(pGuild->getID()); gcModifyGuildMemberInfo.setGuildName(pGuild->getName()); @@ -196,15 +196,15 @@ void SGModifyGuildMemberOKHandler::execute(SGModifyGuildMemberOK* pPacket) pPlayer->sendPacket(&gcModifyGuildMemberInfo); } - // 渶 ٲ ޽ . + // 길마를 바꾼 사람에게 메시지를 보낸다. pCreature = g_pPCFinder->getCreature_LOCKED(pPacket->getSender()); if (pCreature != NULL && pCreature->isPC()) { Player* pPlayer = pCreature->getPlayer(); Assert(pPlayer != NULL); // StringStream msg; - // msg << pGuild->getName() << " ͸ " << sMaster << " " - // << pGuildMember->getName() << " Ͽϴ."; + // msg << pGuild->getName() << "의 마스터를 " << sMaster << " 에서 " + // << pGuildMember->getName() << " 으로 변경하였습니다."; char msg[200]; sprintf(msg, g_pStringPool->c_str(STRID_MODIFY_GUILD_MASTER), pGuild->getName().c_str(), sMaster.c_str(), @@ -218,11 +218,11 @@ void SGModifyGuildMemberOKHandler::execute(SGModifyGuildMemberOK* pPacket) __LEAVE_CRITICAL_SECTION((*g_pPCFinder)) } else { /////////////////////////////////////////////////////////// - // Ѵ. + // 길드멤버 정보를 변경한다. /////////////////////////////////////////////////////////// pGuild->modifyMemberRank(pGuildMember->getName(), pPacket->getGuildMemberRank()); - // ִٸ ޽ . + // 접속해 있다면 메시지를 보낸다. __ENTER_CRITICAL_SECTION((*g_pPCFinder)) Creature* pCreature = g_pPCFinder->getCreature_LOCKED(pGuildMember->getName()); @@ -241,14 +241,14 @@ void SGModifyGuildMemberOKHandler::execute(SGModifyGuildMemberOK* pPacket) pPlayer->sendPacket(&gcSystemMessage); } - // Ų ޽ . + // 변경시킨 사람에게 메시지를 보낸다. pCreature = g_pPCFinder->getCreature_LOCKED(pPacket->getSender()); if (pCreature != NULL && pCreature->isPC()) { Player* pPlayer = pCreature->getPlayer(); Assert(pPlayer != NULL); // StringStream msg; - // msg << pGuildMember->getName() << " Ǿϴ."; + // msg << pGuildMember->getName() << "님의 길드 권한이 변경되었습니다."; char msg[100]; if (pGuild->getRace() == Guild::GUILD_RACE_SLAYER) diff --git a/src/Core/SGModifyGuildOK.cpp b/src/Core/SGModifyGuildOK.cpp index 798377e4..9be5f8c4 100644 --- a/src/Core/SGModifyGuildOK.cpp +++ b/src/Core/SGModifyGuildOK.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void SGModifyGuildOK::read(SocketInputStream& iStream) { __BEGIN_TRY @@ -24,7 +24,7 @@ void SGModifyGuildOK::read(SocketInputStream& iStream) { ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void SGModifyGuildOK::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/SGModifyGuildOK.h b/src/Core/SGModifyGuildOK.h index b8507ef1..c26d6084 100644 --- a/src/Core/SGModifyGuildOK.h +++ b/src/Core/SGModifyGuildOK.h @@ -18,7 +18,7 @@ // // class SGModifyGuildOK; // -// ߰ Ǿ Ӽ ˸. +// 팀이 추가 되었음을 게임서버에 알린다. // // *CAUTION* // @@ -28,10 +28,10 @@ class SGModifyGuildOK : public Packet { public: SGModifyGuildOK() {}; ~SGModifyGuildOK() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -109,7 +109,7 @@ class SGModifyGuildOKFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionPacketMaxSize , ϶. + // const static LGIncomingConnectionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID + // guild ID szGuildState; diff --git a/src/Core/SGModifyGuildOKHandler.cpp b/src/Core/SGModifyGuildOKHandler.cpp index e34b3a92..2b58c26e 100644 --- a/src/Core/SGModifyGuildOKHandler.cpp +++ b/src/Core/SGModifyGuildOKHandler.cpp @@ -45,11 +45,11 @@ void SGModifyGuildOKHandler::execute(SGModifyGuildOK* pPacket) if (pGuild->getState() == Guild::GUILD_STATE_WAIT && pPacket->getGuildState() == Guild::GUILD_STATE_ACTIVE) { ///////////////////////////////////////////////////////////// - // ߰ + // 존 추가 ///////////////////////////////////////////////////////////// /* if (pGuild->getServerGroupID() == g_pConfig->getPropertyInt("ServerID" ) ) { - // Ʈ . + // 이 게임 서버에 길드 아지트를 만든다. ////////////// // Zone Info @@ -96,7 +96,7 @@ void SGModifyGuildOKHandler::execute(SGModifyGuildOK* pPacket) } */ - // + // 정식 길드로 변경 pGuild->setState(Guild::GUILD_STATE_ACTIVE); HashMapGuildMember& Members = pGuild->getMembers(); @@ -104,7 +104,7 @@ void SGModifyGuildOKHandler::execute(SGModifyGuildOK* pPacket) for (; itr != Members.end(); itr++) { GuildMember* pGuildMember = itr->second; - // ִٸ + // 멤버가 접속해 있다면 __ENTER_CRITICAL_SECTION((*g_pPCFinder)) Creature* pCreature = g_pPCFinder->getCreature_LOCKED(pGuildMember->getName()); @@ -115,17 +115,17 @@ void SGModifyGuildOKHandler::execute(SGModifyGuildOK* pPacket) PlayerCreature* pPlayerCreature = dynamic_cast(pCreature); Assert(pPlayerCreature != NULL); - // ̵ ٲش. + // 길드 아이디를 바꿔준다. pPlayerCreature->setGuildID(pGuild->getID()); - // Ŭ̾Ʈ ̵ ٲ ˷ش. + // 클라이언트에 길드 아이디가 바꼈음을 알려준다. GCModifyGuildMemberInfo gcModifyGuildMemberInfo; gcModifyGuildMemberInfo.setGuildID(pGuild->getID()); gcModifyGuildMemberInfo.setGuildName(pGuild->getName()); gcModifyGuildMemberInfo.setGuildMemberRank(pGuildMember->getRank()); pPlayer->sendPacket(&gcModifyGuildMemberInfo); - // ˸. + // 주위에 알린다. Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); @@ -135,7 +135,7 @@ void SGModifyGuildOKHandler::execute(SGModifyGuildOK* pPacket) pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcOtherModifyInfo, pCreature); - // 尡 Ǿ ˸ + // 정식 길드가 되었음을 알림 Statement* pStmt = NULL; Result* pResult = NULL; diff --git a/src/Core/SGQuitGuildOK.cpp b/src/Core/SGQuitGuildOK.cpp index 07ccb1e8..f3740112 100644 --- a/src/Core/SGQuitGuildOK.cpp +++ b/src/Core/SGQuitGuildOK.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void SGQuitGuildOK::read(SocketInputStream& iStream) { __BEGIN_TRY @@ -34,7 +34,7 @@ void SGQuitGuildOK::read(SocketInputStream& iStream) { ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void SGQuitGuildOK::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/SGQuitGuildOK.h b/src/Core/SGQuitGuildOK.h index 1d7cbbc5..685c0f10 100644 --- a/src/Core/SGQuitGuildOK.h +++ b/src/Core/SGQuitGuildOK.h @@ -18,7 +18,7 @@ // // class SGQuitGuildOK; // -// ߰ Ǿ Ӽ ˸. +// 팀이 추가 되었음을 게임서버에 알린다. // // *CAUTION* // @@ -28,10 +28,10 @@ class SGQuitGuildOK : public Packet { public: SGQuitGuildOK() {}; ~SGQuitGuildOK() {}; - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -110,7 +110,7 @@ class SGQuitGuildOKFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static LGIncomingConnectionPacketMaxSize , ϶. + // const static LGIncomingConnectionPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const { return szGuildID + // guild ID szBYTE + // name length diff --git a/src/Core/SGQuitGuildOKHandler.cpp b/src/Core/SGQuitGuildOKHandler.cpp index e1ed7a1a..ead99e4b 100644 --- a/src/Core/SGQuitGuildOKHandler.cpp +++ b/src/Core/SGQuitGuildOKHandler.cpp @@ -42,13 +42,13 @@ void SGQuitGuildOKHandler::execute(SGQuitGuildOK* pPacket) Assert(pPacket != NULL); - // 带 ´. + // 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); // try { Assert(pGuild != NULL); } catch (Throwable& ) { return; } if (pGuild == NULL) return; - // ȮѴ. + // 길드 멤버인지 확인한다. GuildMember* pGuildMember = pGuild->getMember(pPacket->getName()); // try { Assert(pGuildMember != NULL); } catch (Throwable& ) { return; } if (pGuildMember == NULL) @@ -56,7 +56,7 @@ void SGQuitGuildOKHandler::execute(SGQuitGuildOK* pPacket) string memberName = pGuildMember->getName(); - // ִٸ ޽ . + // 접속해 있다면 메시지를 보낸다. __ENTER_CRITICAL_SECTION((*g_pPCFinder)) Creature* pCreature = g_pPCFinder->getCreature_LOCKED(memberName); @@ -69,30 +69,30 @@ void SGQuitGuildOKHandler::execute(SGQuitGuildOK* pPacket) if (pGuild->getState() == Guild::GUILD_STATE_ACTIVE) { //////////////////////////////////////////////////////////////////////////////// - // Ȱ ٸ Slayer, Vampire ̵ · ٲ۴. + // 활동 중인 길드 였다면 Slayer, Vampire 길드 아이디를 가입 안한 상태로 바꾼다. //////////////////////////////////////////////////////////////////////////////// if (pPlayerCreature->isSlayer()) { - pPlayerCreature->setGuildID(99); // ̾ Ծ ID + pPlayerCreature->setGuildID(99); // 슬레이어의 가입안한 상태의 길드 ID - // Ŭ̾Ʈ ޽ . + // 클라이언트로 메시지를 보낸다. GCModifyGuildMemberInfo gcModifyGuildMemberInfo; gcModifyGuildMemberInfo.setGuildID(pGuild->getID()); gcModifyGuildMemberInfo.setGuildName(pGuild->getName()); gcModifyGuildMemberInfo.setGuildMemberRank(pGuildMember->getRank()); pPlayer->sendPacket(&gcModifyGuildMemberInfo); } else if (pPlayerCreature->isVampire()) { - pPlayerCreature->setGuildID(0); // ̾ Ծ ID + pPlayerCreature->setGuildID(0); // 뱀파이어의 가입안한 상태의 길드 ID - // Ŭ̾Ʈ ޽ . + // 클라이언트로 메시지를 보낸다. GCModifyGuildMemberInfo gcModifyGuildMemberInfo; gcModifyGuildMemberInfo.setGuildID(pGuild->getID()); gcModifyGuildMemberInfo.setGuildName(pGuild->getName()); gcModifyGuildMemberInfo.setGuildMemberRank(pGuildMember->getRank()); pPlayer->sendPacket(&gcModifyGuildMemberInfo); } else if (pPlayerCreature->isOusters()) { - pPlayerCreature->setGuildID(66); // ƿ콺 Ծ ID + pPlayerCreature->setGuildID(66); // 아우스터즈의 가입안한 상태의 길드 ID - // Ŭ̾Ʈ ޽ . + // 클라이언트로 메시지를 보낸다. GCModifyGuildMemberInfo gcModifyGuildMemberInfo; gcModifyGuildMemberInfo.setGuildID(pGuild->getID()); gcModifyGuildMemberInfo.setGuildName(pGuild->getName()); @@ -104,7 +104,7 @@ void SGQuitGuildOKHandler::execute(SGQuitGuildOK* pPacket) if (pGuild->getState() == Guild::GUILD_STATE_WAIT && pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_SUBMASTER) { /////////////////////////////////////////////////////////// - // Ͷ Ϻ ȯѴ. + // 대기 중인 길드의 서브 마스터라면 등록비를 환불한다. /////////////////////////////////////////////////////////// Gold_t Gold = pPlayerCreature->getGold(); Gold = min((uint64_t)(Gold + RETURN_SLAYER_SUBMASTER_GOLD), (uint64_t)2000000000); @@ -115,7 +115,7 @@ void SGQuitGuildOKHandler::execute(SGQuitGuildOK* pPacket) pPlayer->sendPacket(&gcModifyInformation); } - // Ż ޽ . + // 길드 탈퇴 메시지를 보낸다. GCSystemMessage gcSystemMessage; if (pGuild->getRace() == Guild::GUILD_RACE_SLAYER) gcSystemMessage.setMessage(g_pStringPool->getString(STRID_QUIT_TEAM)); @@ -126,7 +126,7 @@ void SGQuitGuildOKHandler::execute(SGQuitGuildOK* pPacket) pPlayer->sendPacket(&gcSystemMessage); if (pGuild->getState() == Guild::GUILD_STATE_ACTIVE) { - // ˸. + // 주위에 알린다. Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); @@ -138,17 +138,17 @@ void SGQuitGuildOKHandler::execute(SGQuitGuildOK* pPacket) } } - // 忡 Ѵ. + // 길드에서 삭제한다. pGuild->deleteMember(memberName); - // Ϳ ޽ . + // 길드 마스터에게 메시지를 보낸다. pCreature = g_pPCFinder->getCreature_LOCKED(pGuild->getMaster()); if (pCreature != NULL && pCreature->isPC()) { Player* pPlayer = pCreature->getPlayer(); Assert(pPlayer != NULL); // StringStream msg; - // msg << memberName << " 带 ŻϿϴ."; + // msg << memberName << "님이 길드를 탈퇴하였습니다."; char msg[100]; if (pGuild->getRace() == Guild::GUILD_RACE_SLAYER) @@ -162,7 +162,7 @@ void SGQuitGuildOKHandler::execute(SGQuitGuildOK* pPacket) gcSystemMessage.setMessage(msg); pPlayer->sendPacket(&gcSystemMessage); } else { - // Ͱ . how? + // 같은 서버에 길드 마스터가 없는 경우. how? } __LEAVE_CRITICAL_SECTION((*g_pPCFinder)) diff --git a/src/Core/SXml.h b/src/Core/SXml.h index a94371bd..58c35baa 100644 --- a/src/Core/SXml.h +++ b/src/Core/SXml.h @@ -58,19 +58,19 @@ class XMLTree { typedef unordered_map CHILDREN_MAP; typedef vector CHILDREN_VECTOR; - string m_Name; ///< ̸ - string m_Text; ///< 忡 ؽƮ - XMLTree* m_pParent; ///< θ + string m_Name; ///< 노드의 이름 + string m_Text; ///< 노드에 속한 텍스트 + XMLTree* m_pParent; ///< 부모 노드의 포인터 - ATTRIBUTES_MAP m_AttributesMap; ///< ִ Ӽ - ATTRIBUTES_VECTOR m_AttributesVector; ///< ִ Ӽ - CHILDREN_MAP m_ChildrenMap; ///< ڽ - CHILDREN_VECTOR m_ChildrenVector; ///< ڽ + ATTRIBUTES_MAP m_AttributesMap; ///< 가지고 있는 속성값들 + ATTRIBUTES_VECTOR m_AttributesVector; ///< 가지고 있는 속성값들 + CHILDREN_MAP m_ChildrenMap; ///< 자식 노드들 + CHILDREN_VECTOR m_ChildrenVector; ///< 자식 노드들 public: XMLTree(); XMLTree(const string& name); - XMLTree(const XMLTree& xmlTree); // copy constructor : + XMLTree(const XMLTree& xmlTree); // copy constructor : 깊은 복사 virtual ~XMLTree(); public: diff --git a/src/Core/SerialDatagramPacket.h b/src/Core/SerialDatagramPacket.h index 21585de1..94f7a31f 100644 --- a/src/Core/SerialDatagramPacket.h +++ b/src/Core/SerialDatagramPacket.h @@ -19,10 +19,10 @@ // // class SerialDatagramPacket; // -// UDP ſ Ǵ Ŷ ̽ Ŭ̴. -// ⺻ Ŷ ּ(address) Ʈ(port) -// ϰ ־ ϸ, SerialDatagram а ޽带 override ؾ ϱ -// ԵǾ. +// 서버간의 UDP 통신에 사용되는 패킷의 베이스 클래스이다. +// 기본적으로 이 패킷들은 보낸 쪽의 주소(address)와 포트(port)를 저장 +// 하고 있어야 하며, SerialDatagram에 읽고 쓰는 메쏘드를 override 해야 하기 +// 때문에 도입되었다. // ////////////////////////////////////////////////////////////////////// @@ -31,22 +31,22 @@ class SerialDatagramPacket : public Packet { // destructor virtual ~SerialDatagramPacket() {} - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. - // ͱ׷ Ŷ TCP ۵Ǿ Դٸ Ѵ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. + // 데이터그램 패킷이 TCP 소켓으로 전송되어 왔다면 프로토콜 에러로 간주한다. virtual void read(SocketInputStream& iStream) { throw ProtocolException("datagram packet from TCP socket"); } - // SerialDatagram ü ͸ о Ŷ ʱȭѴ. + // SerialDatagram 객체에서 데이터를 읽어서 패킷을 초기화한다. virtual void read(SerialDatagram& iDatagram) = 0; - // ½Ʈ() Ŷ ̳ʸ ̹ . - // ͱ׷ Ŷ TCP . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. + // 데이터그램 패킷을 TCP 소켓으로 출력할 수 없다. virtual void write(SocketOutputStream& oStream) const { throw Error("cannot write datagram-packet to TCP-socket-stream"); } - // SerialDatagram ü Ŷ ̳ʸ ̹ . + // SerialDatagram 객체로 패킷의 바이너리 이미지를 보낸다. virtual void write(SerialDatagram& oDatagram) const = 0; // execute packet's handler diff --git a/src/Core/Shape.cpp b/src/Core/Shape.cpp index 49db839a..9be6c651 100644 --- a/src/Core/Shape.cpp +++ b/src/Core/Shape.cpp @@ -2,8 +2,8 @@ // Filename : Shape.cpp // Written by : excel96 // Description : -// α ȭ鿡 ̾ ܾ ִ ʿ Լ. -// ŸԿ Ѹ ϴ Լ̴. +// 로그인 화면에서 슬레이어의 외양을 보여주는 데 필요한 함수들. +// 아이템 타입에 따른 겉모습 상수를 리턴하는 함수들이다. ////////////////////////////////////////////////////////////////////////////// #include "Shape.h" diff --git a/src/Core/Shape.h b/src/Core/Shape.h index 96aa7389..ad0b136c 100644 --- a/src/Core/Shape.h +++ b/src/Core/Shape.h @@ -2,8 +2,8 @@ // Filename : Shape.h // Written by : excel96 // Description : -// αȭ鿡 ̾ ܾ ִ ʿ Լ. -// ŸԿ Ѹ ϴ Լ̴. +// 로그인화면에서 슬레이어의 외양을 보여주는 데 필요한 함수들. +// 아이템 타입에 따른 겉모습 상수를 리턴하는 함수들이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __SHAPE_H__ @@ -19,10 +19,10 @@ HelmetType getHelmetType(ItemType_t IType); ShieldType getShieldType(ItemType_t IType); MotorcycleType getMotorcycleType(ItemType_t IType); -// ̾ +// 뱀파이어 VampireCoatType getVampireCoatType(ItemType_t IType); -// ƿ콺ͽ +// 아우스터스 OustersCoatType getOustersCoatType(ItemType_t IType); OustersArmType getOustersArmType(ItemType_t IType); diff --git a/src/Core/SlotInfo.h b/src/Core/SlotInfo.h index 1fba0e58..cd019202 100644 --- a/src/Core/SlotInfo.h +++ b/src/Core/SlotInfo.h @@ -19,10 +19,10 @@ //---------------------------------------------------------------------- // -// Inventory ִ ü. +// Inventory 정보를 담고 있는 객체. // -// GCUpdateInfo Ŷ ܼ Ŭ̾Ʈ ۵ȴ. -// ̳ ɷִ ʴ. +// GCUpdateInfo 패킷에 담겨서 클라이언트에게 전송된다. +// 아이템이나 걸려있는 마법 같은 정보는 담겨있지 않다. // //---------------------------------------------------------------------- diff --git a/src/Core/SocketEncryptInputStream.h b/src/Core/SocketEncryptInputStream.h index 3f16c5ab..bfed188c 100644 --- a/src/Core/SocketEncryptInputStream.h +++ b/src/Core/SocketEncryptInputStream.h @@ -38,10 +38,10 @@ class SocketEncryptInputStream : public SocketInputStream { public: // read data to stream (output buffer) // *CAUTION* - // string ۿ writing , ڵ size տ ִ. - // ׷, string ũ⸦ BYTE/WORD ǹ̴. - // Ŷ ũ ٴ åϿ ʿ信 string size - // BYTE Ǵ WORD ϵ Ѵ. + // string 을 버퍼에 writing 할 때, 자동으로 size 를 앞에 붙일 수도 있다. + // 그러나, string 의 크기를 BYTE/WORD 중 어느 것으로 할 건지는 의문이다. + // 패킷의 크기는 작을 수록 좋다는 정책하에서 필요에 따라서 string size 값을 + // BYTE 또는 WORD 를 수동으로 사용하도록 한다. uint readEncrypt(bool& buf) { uint n = read(buf); buf = m_Encrypter.convert(buf); diff --git a/src/Core/SocketEncryptOutputStream.h b/src/Core/SocketEncryptOutputStream.h index 334a021d..26b8c4ef 100644 --- a/src/Core/SocketEncryptOutputStream.h +++ b/src/Core/SocketEncryptOutputStream.h @@ -38,10 +38,10 @@ class SocketEncryptOutputStream : public SocketOutputStream { public: // write data to stream (output buffer) // *CAUTION* - // string ۿ writing , ڵ size տ ִ. - // ׷, string ũ⸦ BYTE/WORD ǹ̴. - // Ŷ ũ ٴ åϿ ʿ信 string size - // BYTE Ǵ WORD ϵ Ѵ. + // string 을 버퍼에 writing 할 때, 자동으로 size 를 앞에 붙일 수도 있다. + // 그러나, string 의 크기를 BYTE/WORD 중 어느 것으로 할 건지는 의문이다. + // 패킷의 크기는 작을 수록 좋다는 정책하에서 필요에 따라서 string size 값을 + // BYTE 또는 WORD 를 수동으로 사용하도록 한다. uint writeEncrypt(bool buf) { buf = m_Encrypter.convert(buf); return write(buf); diff --git a/src/Core/StringStream.cpp b/src/Core/StringStream.cpp index 124446bb..0033835f 100644 --- a/src/Core/StringStream.cpp +++ b/src/Core/StringStream.cpp @@ -198,16 +198,16 @@ StringStream& StringStream::operator<<(const string& str) { // make string ////////////////////////////////////////////////////////////////////// const string& StringStream::toString() const { - // ϴ Ʈ ѹ س, - // ״ ȣ⶧ ߰ ʴ ״ Ѵ. + // 일단 스트링을 한번 생성해놓으면, + // 그다음 호출때에는 새로 추가되지 않는 한 그대로 사용한다. if (m_bInserted) { m_bInserted = false; - // ӵ ϴ ޸𸮸 Ƴ Ѵ. + // 속도를 위해 쓸데없는 복사 방지를 일단 메모리를 다 잡아놓고 시작한다. m_Buffer.reserve(m_Size); for (list::const_iterator itr = m_Strings.begin(); itr != m_Strings.end(); itr++) { - // ۿ ϳ ߰Ѵ. + // 버퍼에 하나씩 추가한다. m_Buffer.append(*itr); } } diff --git a/src/Core/SubItemInfo.h b/src/Core/SubItemInfo.h index 14f7e9ad..8e29df26 100644 --- a/src/Core/SubItemInfo.h +++ b/src/Core/SubItemInfo.h @@ -17,10 +17,10 @@ //---------------------------------------------------------------------- // -// Inventory ִ ü. +// Inventory 정보를 담고 있는 객체. // -// GCUpdateInfo Ŷ ܼ Ŭ̾Ʈ ۵ȴ. -// ̳ ɷִ ʴ. +// GCUpdateInfo 패킷에 담겨서 클라이언트에게 전송된다. +// 아이템이나 걸려있는 마법 같은 정보는 담겨있지 않다. // //---------------------------------------------------------------------- diff --git a/src/Core/SubOustersSkillInfo.h b/src/Core/SubOustersSkillInfo.h index 368837f2..28929500 100644 --- a/src/Core/SubOustersSkillInfo.h +++ b/src/Core/SubOustersSkillInfo.h @@ -73,16 +73,16 @@ class SubOustersSkillInfo { } private: - // ų Ÿ + // 스킬 타입 SkillType_t m_SkillType; - // ų + // 스킬 레벨 ExpLevel_t m_ExpLevel; - // ѹ + // 한번쓰고 다음에 쓸 딜레이 Turn_t m_Interval; - // ij Ÿ + // 캐스팅 타임 Turn_t m_CastingTime; }; diff --git a/src/Core/SubVampireSkillInfo.h b/src/Core/SubVampireSkillInfo.h index fbbc2b0c..51fcc84a 100644 --- a/src/Core/SubVampireSkillInfo.h +++ b/src/Core/SubVampireSkillInfo.h @@ -17,10 +17,10 @@ //---------------------------------------------------------------------- // -// Inventory ִ ü. +// Inventory 정보를 담고 있는 객체. // -// GCUpdateInfo Ŷ ܼ Ŭ̾Ʈ ۵ȴ. -// ̳ ɷִ ʴ. +// GCUpdateInfo 패킷에 담겨서 클라이언트에게 전송된다. +// 아이템이나 걸려있는 마법 같은 정보는 담겨있지 않다. // //---------------------------------------------------------------------- @@ -70,13 +70,13 @@ class SubVampireSkillInfo { } private: - // ų Ÿ + // 스킬 타입 SkillType_t m_SkillType; - // ѹ + // 한번쓰고 다음에 쓸 딜레이 Turn_t m_Interval; - // ij Ÿ + // 캐스팅 타임 Turn_t m_CastingTime; }; diff --git a/src/Core/SweeperBonusInfo.cpp b/src/Core/SweeperBonusInfo.cpp index b4d86460..cb37777b 100644 --- a/src/Core/SweeperBonusInfo.cpp +++ b/src/Core/SweeperBonusInfo.cpp @@ -39,7 +39,7 @@ SweeperBonusInfo::~SweeperBonusInfo() { ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void SweeperBonusInfo::read(SocketInputStream& iStream) { __BEGIN_TRY @@ -61,7 +61,7 @@ void SweeperBonusInfo::read(SocketInputStream& iStream) { } ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void SweeperBonusInfo::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/SweeperBonusInfo.h b/src/Core/SweeperBonusInfo.h index cc7104c2..b6956146 100644 --- a/src/Core/SweeperBonusInfo.h +++ b/src/Core/SweeperBonusInfo.h @@ -34,10 +34,10 @@ class SweeperBonusInfo { ~SweeperBonusInfo(); public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // get packet's body size diff --git a/src/Core/TOpackets/GTOAcknowledgement.cpp b/src/Core/TOpackets/GTOAcknowledgement.cpp index 90c045f1..482c33a0 100644 --- a/src/Core/TOpackets/GTOAcknowledgement.cpp +++ b/src/Core/TOpackets/GTOAcknowledgement.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// -// Datagram üκ Ÿ о Ŷ ʱȭѴ. +// Datagram 객체로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void GTOAcknowledgement::read(Datagram& iDatagram) throw(ProtocolException, Error) { __BEGIN_TRY @@ -26,7 +26,7 @@ void GTOAcknowledgement::read(Datagram& iDatagram) throw(ProtocolException, Erro iDatagram.read(m_Message, szMessage); if (m_Message != Message) { - filelog("TheOneServer.log", "߸ ޽ ߽ϴ. [%s:%d] : %s", getHost().c_str(), getPort(), + filelog("TheOneServer.log", "잘못된 메시지가 도착했습니다. [%s:%d] : %s", getHost().c_str(), getPort(), m_Message.c_str()); } @@ -40,7 +40,7 @@ void GTOAcknowledgement::read(Datagram& iDatagram) throw(ProtocolException, Erro ////////////////////////////////////////////////////////////////////// -// Datagram ü Ŷ ̳ʸ ̹ . +// Datagram 객체로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void GTOAcknowledgement::write(Datagram& oDatagram) const throw(ProtocolException, Error) { __BEGIN_TRY diff --git a/src/Core/TOpackets/GTOAcknowledgement.h b/src/Core/TOpackets/GTOAcknowledgement.h index 3bda7086..8e58c4af 100644 --- a/src/Core/TOpackets/GTOAcknowledgement.h +++ b/src/Core/TOpackets/GTOAcknowledgement.h @@ -22,18 +22,18 @@ const string Message = "One Server to rule them all, One Server to find them all // // class GTOAcknowledgement; // -// α ڰ Ϸ , α -//  ּҿ  ڰ  ũó α -// ̴.. ˷ִ Ŷ̴. +// 로그인 서버에서 사용자가 게임 서버로 접속하려고 할 때, 로그인 서버는 +// 그 게임 서버에게 어떤 주소에서 어떤 사용자가 어떤 크리처로 로그인할 +// 것이다.. 라고 알려주는 패킷이다. // // *CAUTION* // -// ũó ̸ ʿѰ? ϴ ǹ ְڴµ, -// 츦 ʿϰ ȴ. α κ Slot3 ij͸ -// س, ؼ SLOT2 ij͸ εش޶ -// ִ ̴. ̸ ؼ, CLSelectPC ij͸ -// ˷ ϸ, CGConnect ij ̵ ؼ -// ٷ εϵ ؾ Ѵ. +// 굳이 크리처 이름이 필요한가? 하는 의문이 있을 수 있겠는데, 다음과 같은 +// 경우를 고려했을때 필요하게 된다. 로그인 서버로부터 Slot3 캐릭터를 선택 +// 해놓고, 실제로 게임 서버에 접속해서는 SLOT2 캐릭터를 로딩해달라고 할 +// 수가 있는 것이다. 이를 막기 위해서, CLSelectPC로 선택한 캐릭터를 +// 게임 서버에게 알려줘야 하며, CGConnect 에서도 캐릭터 아이디를 포함해서 +// 바로 로딩하도록 해야 한다. // //---------------------------------------------------------------------- @@ -43,10 +43,10 @@ class GTOAcknowledgement : public DatagramPacket { m_Message = Message; } - // Datagram ü Ÿ о Ŷ ʱȭѴ. + // Datagram 객체에서부터 데이타를 읽어서 패킷을 초기화한다. void read(Datagram& iDatagram) throw(ProtocolException, Error); - // Datagram ü Ŷ ̳ʸ ̹ . + // Datagram 객체로 패킷의 바이너리 이미지를 보낸다. void write(Datagram& oDatagram) const throw(ProtocolException, Error); // execute packet's handler @@ -132,7 +132,7 @@ class GTOAcknowledgementFactory : public PacketFactory { // get packet's max body size // *OPTIMIZATION HINT* - // const static GTOAcknowledgementPacketMaxSize , ϶. + // const static GTOAcknowledgementPacketMaxSize 를 정의, 리턴하라. PacketSize_t getPacketMaxSize() const throw() { return szBYTE + szBYTE + 1024 + szBYTE + 15 + szuint; // client ip } diff --git a/src/Core/TOpackets/GTOAcknowledgementHandler.cpp b/src/Core/TOpackets/GTOAcknowledgementHandler.cpp index f64ce02e..7ce8973c 100644 --- a/src/Core/TOpackets/GTOAcknowledgementHandler.cpp +++ b/src/Core/TOpackets/GTOAcknowledgementHandler.cpp @@ -47,8 +47,8 @@ void GTOAcknowledgementHandler::execute(GTOAcknowledgement* pPacket) throw(Proto /* - ServerIP ActualIP Ű Policy . - ʴ´ٸ ROW ߰Ѵ. + ServerIP와 ActualIP 키를 가지고 현재 Policy를 본다. + 존재하지 않는다면 ROW를 추가한다. */ if (pResult->getRowCount() == 0) { if (strNewServerPolicy == "allow" || strNewServerPolicy == "ALLOW" || strNewServerPolicy == "Allow") { @@ -58,7 +58,7 @@ void GTOAcknowledgementHandler::execute(GTOAcknowledgement* pPacket) throw(Proto pPacket->getUDPPort(), pPacket->getMessage().c_str()); pStmt->executeQuery( - "INSERT IGNORE INTO %s VALUES ('%s',now(),'NEW','NEW','[%s] ߰ Ǿϴ.')", + "INSERT IGNORE INTO %s VALUES ('%s',now(),'NEW','NEW','[%s] 서버가 추가 되었습니다.')", strTargetTableName_Log.c_str(), pPacket->getHost().c_str(), pPacket->getHost().c_str()); } else { GGCommand ggCommand; @@ -69,8 +69,8 @@ void GTOAcknowledgementHandler::execute(GTOAcknowledgement* pPacket) throw(Proto ggCommand.setCommand("*shutdown 0"); g_pGameServerManager->sendPacket(pPacket->getHost(), pPacket->getUDPPort(), &ggCommand); - pStmt->executeQuery("INSERT IGNORE INTO %s VALUES ('%s',now(),'DENY','DENY','[%s] 㰡 " - "Ͽ KILL׽ϴ..')", + pStmt->executeQuery("INSERT IGNORE INTO %s VALUES ('%s',now(),'DENY','DENY','[%s] 서버가 허가없이 " + "접근하여 KILL시켰습니다..')", strTargetTableName_Log.c_str(), pPacket->getHost().c_str(), pPacket->getHost().c_str()); } @@ -78,7 +78,7 @@ void GTOAcknowledgementHandler::execute(GTOAcknowledgement* pPacket) throw(Proto } /* - Ѵٸ + 존재한다면 */ else { pResult->next(); @@ -92,11 +92,11 @@ void GTOAcknowledgementHandler::execute(GTOAcknowledgement* pPacket) throw(Proto if (strPolicy == "KILL") { cout << "strPolicy : KILL..." << endl; - // å KILL(׿)̴. Ŷ ϰڴ. - // Ŷ . - // POLICY FIELD "DEATH" س´. ׾ϱ. + // 정책이 KILL(죽여라)이다. 패킷을 날려야 하겠다. + // 패킷을 쏴버리자. + // POLICY FIELD를 "DEATH" 로 변경해놓는다. 죽었으니까. - // GGCommand kill_daemonctl ڿ. + // GGCommand 로 kill_daemonctl 을 보낸뒤에. GGCommand ggCommand; ggCommand.setCommand("*set KILL_DAEMONCTL 1"); @@ -109,8 +109,8 @@ void GTOAcknowledgementHandler::execute(GTOAcknowledgement* pPacket) throw(Proto pStmt->executeQuery("UPDATE %s SET Policy='DEATH' WHERE ActualIP='%s'", strTargetTableName.c_str(), pPacket->getHost().c_str()); - pStmt->executeQuery("INSERT IGNORE INTO %s VALUES ('%s',now(),'KILL','DEATH','[%s] KILLå " - " DEATH° Ǿϴ')", + pStmt->executeQuery("INSERT IGNORE INTO %s VALUES ('%s',now(),'KILL','DEATH','[%s] 서버가 KILL정책에 " + "따라 DEATH상태가 되었습니다')", strTargetTableName_Log.c_str(), pPacket->getHost().c_str(), pPacket->getHost().c_str()); @@ -132,8 +132,8 @@ void GTOAcknowledgementHandler::execute(GTOAcknowledgement* pPacket) throw(Proto pStmt->executeQuery("UPDATE %s SET Policy='CLEAR' WHERE ActualIP='%s'", strTargetTableName.c_str(), pPacket->getHost().c_str()); - pStmt->executeQuery("INSERT IGNORE INTO %s VALUES ('%s',now(),'REMOVE','CLEAR','[%s] " - "REMOVEå CLEAR° Ǿϴ')", + pStmt->executeQuery("INSERT IGNORE INTO %s VALUES ('%s',now(),'REMOVE','CLEAR','[%s] 서버가 " + "REMOVE정책에 따라 CLEAR상태가 되었습니다')", strTargetTableName_Log.c_str(), pPacket->getHost().c_str(), pPacket->getHost().c_str()); @@ -152,21 +152,21 @@ void GTOAcknowledgementHandler::execute(GTOAcknowledgement* pPacket) throw(Proto g_pGameServerManager->sendPacket(pPacket->getHost(), pPacket->getUDPPort(), &ggCommand); - pStmt->executeQuery("INSERT IGNORE INTO %s VALUES ('%s',now(),'CLEAR','REMOVE','[%s] " - "CLEARε Ͽ ٽ REMOVEŵϴ.')", + pStmt->executeQuery("INSERT IGNORE INTO %s VALUES ('%s',now(),'CLEAR','REMOVE','[%s] 서버가 " + "CLEAR상태인데도 접근하였기 때문에 다음에 다시 REMOVE시킵니다.')", strTargetTableName_Log.c_str(), pPacket->getHost().c_str(), pPacket->getHost().c_str()); } else if (strPolicy == "DEATH") { /* - // ε ƿԴ. - // LIVE ٲ. + // 죽은상태인데 또 날아왔다. + // LIVE 로 바꿔주자. pStmt->executeQuery( "UPDATE %s SET Policy='LIVE' WHERE ServerIP='%s'", strTargetTableName.c_str(), pPacket->getServerIP().c_str() ); - pStmt->executeQuery( "INSERT IGNORE INTO %s VALUES ('%s',now(),'DEATH','LIVE','[%s] - DEATHε Ͽ LIVE· ٲݴϴ.')", strTargetTableName_Log.c_str(), + pStmt->executeQuery( "INSERT IGNORE INTO %s VALUES ('%s',now(),'DEATH','LIVE','[%s] 서버가 + DEATH상태인데도 접근하였기 때문에 LIVE상태로 바꿔줍니다.')", strTargetTableName_Log.c_str(), pPacket->getServerIP().c_str(), pPacket->getServerIP().c_str()); */ @@ -178,21 +178,21 @@ void GTOAcknowledgementHandler::execute(GTOAcknowledgement* pPacket) throw(Proto ggCommand.setCommand("*shutdown 0"); g_pGameServerManager->sendPacket(pPacket->getHost(), pPacket->getUDPPort(), &ggCommand); - pStmt->executeQuery("INSERT IGNORE INTO %s VALUES ('%s',now(),'DEATH','LIVE','[%s] " - "DEATHε Ͽ ٽ KILL ׽ϴ..')", + pStmt->executeQuery("INSERT IGNORE INTO %s VALUES ('%s',now(),'DEATH','LIVE','[%s] 서버가 " + "DEATH상태인데도 접근하였기 때문에 다시 KILL 시켰습니다..')", strTargetTableName_Log.c_str(), pPacket->getHost().c_str(), pPacket->getHost().c_str()); - } else if (strPolicy == "LIVE") // 'LIVE' ϰ̴. ׳ . + } else if (strPolicy == "LIVE") // 'LIVE' 일것이다. 그냥 내비두자. { // continue.. cout << "strPolicy : LIVE..." << endl; } else { cout << "strPolicy : BAD! POLICY!" << endl; - pStmt->executeQuery("INSERT IGNORE INTO %s VALUES ('%s',now(),'UNKNOWN','UNKNOWN','[%s] " - " Ȳ ߻Ͽϴ.')", + pStmt->executeQuery("INSERT IGNORE INTO %s VALUES ('%s',now(),'UNKNOWN','UNKNOWN','[%s] 서버에서 알 수 " + "없는 상황이 발생하였습니다.')", strTargetTableName_Log.c_str(), pPacket->getHost().c_str(), pPacket->getHost().c_str()); } @@ -216,10 +216,10 @@ void GTOAcknowledgementHandler::execute(GTOAcknowledgement* pPacket) throw(Proto } END_DB(pStmt) - filelog("TheOneServer.log", "Ŷ ߽ϴ. : [%s:%05d] %s", pPacket->getHost().c_str(), pPacket->getPort(), + filelog("TheOneServer.log", "패킷이 도착했습니다. : [%s:%05d] %s", pPacket->getHost().c_str(), pPacket->getPort(), pPacket->toString().c_str()); cout << "Touch.[" << pPacket->getHost() << ":" << pPacket->getPort() << "].[Policy : " << strPolicy << "]" << endl; - // cout << "Ŷ ߽ϴ. : [" << pPacket->getHost() << ":" << pPacket->getPort() <<"] : " << + // cout << "패킷이 도착했습니다. : [" << pPacket->getHost() << ":" << pPacket->getPort() <<"] : " << // pPacket->toString() << endl; #endif diff --git a/src/Core/TimeChecker.cpp b/src/Core/TimeChecker.cpp index 3705e12e..d703977b 100644 --- a/src/Core/TimeChecker.cpp +++ b/src/Core/TimeChecker.cpp @@ -83,15 +83,15 @@ void TimeChecker::init() { } #endif - // ϱð + // 하교시간 TimePeriod* pAfterSchoolTimePeriod = new TimePeriod(VSTime(17, 0), VSTime(18, 0)); m_pTimePeriods[TIME_PERIOD_AFTER_SCHOOL] = pAfterSchoolTimePeriod; - // ٽð + // 퇴근시간 TimePeriod* pAfterWorkTimePeriod = new TimePeriod(VSTime(21, 0), VSTime(22, 0)); m_pTimePeriods[TIME_PERIOD_AFTER_WORK] = pAfterWorkTimePeriod; - // ɾ߽ð + // 심야시간 TimePeriod* pMidnightTimePeriod = new TimePeriod(VSTime(1, 0), VSTime(2, 0)); m_pTimePeriods[TIME_PERIOD_MIDNIGHT] = pMidnightTimePeriod; } diff --git a/src/Core/Upackets/CUBeginUpdate.cpp b/src/Core/Upackets/CUBeginUpdate.cpp index 3690ff78..94260f46 100644 --- a/src/Core/Upackets/CUBeginUpdate.cpp +++ b/src/Core/Upackets/CUBeginUpdate.cpp @@ -12,7 +12,7 @@ //-------------------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void CUBeginUpdate::read(SocketInputStream& iStream) throw(ProtocolException, Error) { __BEGIN_TRY @@ -40,7 +40,7 @@ void CUBeginUpdate::read(SocketInputStream& iStream) throw(ProtocolException, Er //-------------------------------------------------------------------------------- -// κ Ÿ о Ŷ ʱȭѴ. +// 소켓으로부터 직접 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void CUBeginUpdate::read(Socket* pSocket) throw(ProtocolException, Error) { __BEGIN_TRY @@ -68,7 +68,7 @@ void CUBeginUpdate::read(Socket* pSocket) throw(ProtocolException, Error) { //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void CUBeginUpdate::write(SocketOutputStream& oStream) const throw(ProtocolException, Error) { __BEGIN_TRY diff --git a/src/Core/Upackets/CUBeginUpdate.h b/src/Core/Upackets/CUBeginUpdate.h index 08965bf6..875463c4 100644 --- a/src/Core/Upackets/CUBeginUpdate.h +++ b/src/Core/Upackets/CUBeginUpdate.h @@ -17,8 +17,8 @@ // // class CUBeginUpdate; // -// Ʈ Ŭ̾Ʈ ʷ Ŷ̴. ο Ŭ̾Ʈ -// ִ. +// 업데이트서버와 연결한 클라이언트가 최초로 보내는 패킷이다. 내부에 클라이언트 +// 버전을 담고 있다. // //-------------------------------------------------------------------------------- @@ -27,13 +27,13 @@ class CUBeginUpdate : public Packet { enum TYPE { OLD_UPDATE, ONE_VERSION_KEY_BACK, TWO_VERSION_KEY_FRONT }; public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream) throw(ProtocolException, Error); - // κ ͸ о Ŷ ʱȭѴ. + // 소켓으로부터 직접 데이터를 읽어서 패킷을 초기화한다. void read(Socket* pSocket) throw(ProtocolException, Error); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const throw(ProtocolException, Error); // execute packet's handler @@ -91,11 +91,11 @@ class CUBeginUpdate : public Packet { } private: - // Ŭ̾Ʈ + // 클라이언트 버전 WORD m_Version; - // + // 길드 버전 WORD m_GuildVersion; - // + // 인포 버전 WORD m_InfoVersion; TYPE m_Type; diff --git a/src/Core/Upackets/CUBeginUpdateHandler.cpp b/src/Core/Upackets/CUBeginUpdateHandler.cpp index c742fa6b..6356a1b3 100644 --- a/src/Core/Upackets/CUBeginUpdateHandler.cpp +++ b/src/Core/Upackets/CUBeginUpdateHandler.cpp @@ -18,7 +18,7 @@ #include "UpdateServer.h" #include "UpdateServerPlayer.h" -// Ʈ 丮 ĵ +// 업데이트 디렉토리 스캔 관련 #include #include #include @@ -30,9 +30,9 @@ /* //-------------------------------------------------------------------------------- // -// Ŭ̾Ʈ ٷ ֽ Ʈ , -// Ʈ merge ؼ ȭ Ʈ Ʈ -// ؼ UCUpdateList Ŷ Ŭ̾Ʈ Ѵ. +// 클라이언트의 버전 바로 윗버전부터 최신 버전까지의 리스트를 생성한 후, +// 각 버전의 업데이트 명령을 merge 해서 최적화된 업데이트 명령의 리스트를 +// 생성해서 UCUpdateList 패킷에 담아 클라이언트로 전송한다. // //-------------------------------------------------------------------------------- void CUBeginUpdateHandler::execute ( CUBeginUpdate * pPacket , Player * pPlayer ) @@ -49,42 +49,42 @@ void CUBeginUpdateHandler::execute ( CUBeginUpdate * pPacket , Player * pPlayer //cout << "Client Version : " << pPacket->getVersion() << endl; //-------------------------------------------------------------------------------- - // ġ 丮 丮 Ʈ Ѵ. - // ̶ Ŭ̾Ʈ ų ص ȴ. + // 패치 디렉토리의 하위 디렉토리들의 리스트를 생성한다. + // 이때 클라이언트 버전보다 같거나 낮은 버전은 무시해도 된다. //-------------------------------------------------------------------------------- - // 丮 ̸ Ʈ + // 디렉토리 이름의 리스트 list directories; string patchDir = g_pConfig->getProperty("HomeDir") + separator + g_pConfig->getProperty("PatchDir"); //cout << "patchDir = " << patchDir << endl; - // ġ 丮 Ѵ. + // 패치 디렉토리를 오픈한다. DIR * pDIR = opendir( patchDir.c_str() ); - // ġ 丮 ¯ Ȳ! + // 패치 디렉토리가 없으면 말짱 황! Assert( pDIR != NULL ); - // ġ 丮 丮( 丮) оδ. + // 패치 디렉토리의 하위 디렉토리(버전 디렉토리)들을 읽어들인다. bool sameVersionFound = false; struct dirent * versionDir; while ( ( versionDir = readdir( pDIR ) ) != NULL ) { - // (inode==0) Ѵ... + // 빈 슬랏(inode==0)은 무시한다... if ( versionDir->d_ino != 0 ) { // - // 丮 v + 0 ä 5ڸ ڿ Ǿ ִ. + // 버전 디렉토리는 v + 0으로 채워진 5자리 정수 문자열로 되어 있다. // ex> v00001/ v00002/ v00003/ ... // string dir = versionDir->d_name; - // v ʴ 丮δ "." ".." ִ. -_-; + // v 로 시작하지 않는 하위 디렉토리로는 "." 과 ".." 이 있다. -_-; if ( dir[0] == 'v' ) { - // ϱ ؼ - // κ Ʈ ȯؼ ٽ ȯѴ. + // 버전을 비교하기 위해서는 + // 숫자 부분을 스트링으로 변환해서 다시 정수로 변환한다. Version_t version = atoi( dir.substr( 1 , 5 ).c_str() ); if ( version == pPacket->getVersion() ) @@ -105,14 +105,14 @@ void CUBeginUpdateHandler::execute ( CUBeginUpdate * pPacket , Player * pPlayer throw InvalidProtocolException("invalid client version"); } - // ׽Ʈ غ. + // 테스트로 출력해본다. for ( list::iterator itr = directories.begin() ; itr != directories.end() ; itr ++ ) //cout << "Newer Version : " << *itr << endl; //-------------------------------------------------------------------------------- - // ֽ 丮 ˻ϸ鼭, 丮 index.dat ϵ εؼ - // UpdateManager ü Ѵ. + // 최신 버전 디렉토리들을 검색하면서, 각 디렉토리의 index.dat 파일들을 로딩해서 + // UpdateManager 객체를 생성한다. //-------------------------------------------------------------------------------- UCUpdateList ucUpdateList; @@ -173,8 +173,8 @@ void CUBeginUpdateHandler::scan_Dir(const string Directory, CUBeginUpdate* pPack // cout << "Path : " << SubDirectory << " Path Size : " << List.st_size << endl; if (S_ISDIR(List.st_mode)) { - // ϱ ؼ - // κ Ʈ ȯؼ ٽ ȯѴ. + // 버전을 비교하기 위해서는 + // 숫자 부분을 스트링으로 변환해서 다시 정수로 변환한다. Version_t version = atoi(vName.substr(1, 5).c_str()); Version_t ClientVersion = pPacket->getVersion() - 3000; @@ -217,7 +217,7 @@ void CUBeginUpdateHandler::scan_Dir(const string Directory, CUBeginUpdate* pPack Update* pUpdate = new Update(); - // ClientVersion ٲ. by sigi. 2002.10.16 + // ClientVersion으로 바꿈. by sigi. 2002.10.16 Version_t ClientVersion = pPacket->getVersion(); if (ClientVersion > 3000) ClientVersion -= 3000; @@ -232,7 +232,7 @@ void CUBeginUpdateHandler::scan_Dir(const string Directory, CUBeginUpdate* pPack if (bHttpPatch) { srand(time(NULL)); int randomv = rand(); - // URL ۾....... ¼ ¼ + // URL 선정 작업....... 및 어쩌구 저쩌구 int Random = randomv % g_pConfig->getPropertyInt("MAXURL"); StringStream ConfigParam; ConfigParam << "URL" << Random; @@ -252,9 +252,9 @@ void CUBeginUpdateHandler::scan_Dir(const string Directory, CUBeginUpdate* pPack //-------------------------------------------------------------------------------- // -// Ŭ̾Ʈ ٷ ֽ Ʈ , -// Ʈ merge ؼ ȭ Ʈ Ʈ -// ؼ UCUpdateList Ŷ Ŭ̾Ʈ Ѵ. +// 클라이언트의 버전 바로 윗버전부터 최신 버전까지의 리스트를 생성한 후, +// 각 버전의 업데이트 명령을 merge 해서 최적화된 업데이트 명령의 리스트를 +// 생성해서 UCUpdateList 패킷에 담아 클라이언트로 전송한다. // //-------------------------------------------------------------------------------- void CUBeginUpdateHandler::execute(CUBeginUpdate* pPacket, Player* pPlayer) throw(ProtocolException, Error) { @@ -266,9 +266,9 @@ void CUBeginUpdateHandler::execute(CUBeginUpdate* pPacket, Player* pPlayer) thro bool bUpdaterPatch = false; - // 3000 ̻ 2002.7.12 ̴. - // ̻ ̹Ƿ - // 3000 ϴ ¥. + // 3000번 이상 버전은 2002.7.12 새버전부터이다. + // 이전 버전은 더 이상 유지하지 않을 예정이므로 + // 3000번 이하는 짜른다. if (pPacket->getVersion() < 3000) { throw DisconnectException("under3000"); } @@ -292,14 +292,14 @@ void CUBeginUpdateHandler::execute(CUBeginUpdate* pPacket, Player* pPlayer) thro } */ - // 3000 ̻ HTTP patch̴. + // 3000번 이상은 무조건 HTTP patch이다. if (bHttpPatch) { ((UpdateServerPlayer*)pPlayer)->setExpiredTime(5); } - // ⼭ ó ϰ ȴ. - // ͵ . 丮 о ȿ Ʈ - // ϸ ȴ. + // 이제 여기서 모든 처리를 하게 된다. + // 길게 갈 것도 없다. 현재 버젼의 디렉토리를 읽어서 그 안에 파일이 있으면 리스트를 만들어 보내고 + // 없으면 무시 하면 된다. UpdateServerPlayer* pUpdateServerPlayer = dynamic_cast(pPlayer); string Directory = g_pConfig->getProperty("HomeDir") + separator + g_pConfig->getProperty("PatchDir"); @@ -307,7 +307,7 @@ void CUBeginUpdateHandler::execute(CUBeginUpdate* pPacket, Player* pPlayer) thro UCUpdateList ucUpdateList; UpdateManager* pUpdateManager = ucUpdateList.getUpdateManager(); - // Info õǼ Ʈ ϳ ߰Ѵ. + // Info 관련되서 업데이트를 하나 추가한다. if (pPacket->getVersion() >= g_pConfig->getPropertyInt("InfoVersion")) { if (pPacket->getInfoVersion() < g_pConfig->getPropertyInt("InfoMarkVersion")) { Update* pUpdate = new Update(); @@ -346,8 +346,8 @@ void CUBeginUpdateHandler::execute(CUBeginUpdate* pPacket, Player* pPlayer) thro string KeyFileName = Directory + "/../" + g_pConfig->getProperty("KeyFile"); FILE* pKeyFile = fopen(KeyFileName.c_str(), "r"); if (pKeyFile == NULL) { - filelog("UpdateServerError.log", "Ű ."); - throw Error("Ű ."); + filelog("UpdateServerError.log", "키 파일이 없어요."); + throw Error("키 파일이 없슴당 ㅜ.ㅠ"); } fread((void*)ucUpdateList.getKeyArray(), szBYTE, 10, pKeyFile); diff --git a/src/Core/Upackets/CUEndUpdate.cpp b/src/Core/Upackets/CUEndUpdate.cpp index 1c5cb9a7..c960d269 100644 --- a/src/Core/Upackets/CUEndUpdate.cpp +++ b/src/Core/Upackets/CUEndUpdate.cpp @@ -10,7 +10,7 @@ //-------------------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void CUEndUpdate::read(SocketInputStream& iStream) throw(ProtocolException, Error) { __BEGIN_TRY @@ -19,7 +19,7 @@ void CUEndUpdate::read(SocketInputStream& iStream) throw(ProtocolException, Erro //-------------------------------------------------------------------------------- -// κ Ÿ о Ŷ ʱȭѴ. +// 소켓으로부터 직접 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void CUEndUpdate::read(Socket* pSocket) throw(ProtocolException, Error) { __BEGIN_TRY @@ -28,7 +28,7 @@ void CUEndUpdate::read(Socket* pSocket) throw(ProtocolException, Error) { //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void CUEndUpdate::write(SocketOutputStream& oStream) const throw(ProtocolException, Error) { __BEGIN_TRY diff --git a/src/Core/Upackets/CUEndUpdate.h b/src/Core/Upackets/CUEndUpdate.h index 8c1fece0..707be985 100644 --- a/src/Core/Upackets/CUEndUpdate.h +++ b/src/Core/Upackets/CUEndUpdate.h @@ -21,13 +21,13 @@ class CUEndUpdate : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream) throw(ProtocolException, Error); - // κ Ÿ о Ŷ ʱȭѴ. + // 소켓으로부터 직접 데이타를 읽어서 패킷을 초기화한다. void read(Socket* pSocket) throw(ProtocolException, Error); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const throw(ProtocolException, Error); // execute packet's handler diff --git a/src/Core/Upackets/CURequest.cpp b/src/Core/Upackets/CURequest.cpp index 1add93ea..f5c03529 100644 --- a/src/Core/Upackets/CURequest.cpp +++ b/src/Core/Upackets/CURequest.cpp @@ -10,7 +10,7 @@ //-------------------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void CURequest::read(SocketInputStream& iStream) throw(ProtocolException, Error) { __BEGIN_TRY @@ -22,7 +22,7 @@ void CURequest::read(SocketInputStream& iStream) throw(ProtocolException, Error) //-------------------------------------------------------------------------------- -// κ Ÿ о Ŷ ʱȭѴ. +// 소켓으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void CURequest::read(Socket* pSocket) throw(ProtocolException, Error) { __BEGIN_TRY @@ -34,7 +34,7 @@ void CURequest::read(Socket* pSocket) throw(ProtocolException, Error) { //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void CURequest::write(SocketOutputStream& oStream) const throw(ProtocolException, Error) { __BEGIN_TRY diff --git a/src/Core/Upackets/CURequest.h b/src/Core/Upackets/CURequest.h index 422c343d..df8c8827 100644 --- a/src/Core/Upackets/CURequest.h +++ b/src/Core/Upackets/CURequest.h @@ -24,13 +24,13 @@ class CURequest : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream) throw(ProtocolException, Error); - // κ Ÿ о Ŷ ʱȭѴ. + // 소켓으로부터 직접 데이타를 읽어서 패킷을 초기화한다. void read(Socket* pSocket) throw(ProtocolException, Error); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const throw(ProtocolException, Error); // execute packet's handler @@ -46,7 +46,7 @@ class CURequest : public Packet { return m_Resource.getSize(); } - // ӽ ڵ. -_-; + // 임시 코드당. -_-; static PacketSize_t getPacketMaxSize() throw() { return Resource::getMaxSize(); } diff --git a/src/Core/Upackets/CURequestHandler.cpp b/src/Core/Upackets/CURequestHandler.cpp index fff7e098..c50905de 100644 --- a/src/Core/Upackets/CURequestHandler.cpp +++ b/src/Core/Upackets/CURequestHandler.cpp @@ -24,8 +24,8 @@ //-------------------------------------------------------------------------------- // -// Ŭ̾Ʈ û ҽ ϴ üũ , -// , sendfile() ؼ Ŭ̾Ʈ Ѵ. +// 클라이언트가 요청한 리소스가 존재하는지 체크한 후, +// 존재할 경우, sendfile()을 사용해서 클라이언트로 전송한다. // //-------------------------------------------------------------------------------- void CURequestHandler::execute(CURequest* pPacket, Player* pPlayer) throw(ProtocolException, Error) { @@ -56,26 +56,26 @@ void CURequestHandler::execute(CURequest* pPacket, Player* pPlayer) throw(Protoc ifstream ifile(filename, ios::in | ios::binary); if (!ifile) { - // ʴ û ŷ Ѵ. - // α׸ , BAN Ѿ Ѵ. + // 존재하지 않는 파일을 요청한 것은 해킹으로 간주한다. + // 로그를 한 후, BAN 시켜야 한다. throw InvalidProtocolException(filename); } - // ũ⸦ ˾Ƴ ؼ ͸ ڷ δ. + // 파일 크기를 알아내기 위해서 파일 포인터를 맨 뒤로 움직인다. ifile.seekg(0, ios::end); FileSize_t filesize = ifile.tellg(); // cout << "Original FileSize : " << filesize << endl; // cout << "Requested FileSize : " << resource.getFileSize() << endl; - // Ŭ̾Ʈ û ũ ٸ , ŷ õ Ѵ. + // 클라이언트에서 요청한 파일의 크기와 다를 경우, 해킹 시도로 간주한다. if (resource.getFileSize() != filesize) { throw InvalidProtocolException("invalid filesize"); } //-------------------------------------------------------------------------------- - // CURequest ܿ ҽ ٽ UCUpdate Ƽ Ѵ. - // ״ Ѵ. + // CURequest 에 담겨온 리소스를 다시 UCUpdate 에 담아서 먼저 전송한다. + // 그다음 파일 내용을 전송한다. //-------------------------------------------------------------------------------- UCUpdate ucUpdate; ucUpdate.setResource(resource); @@ -85,7 +85,7 @@ void CURequestHandler::execute(CURequest* pPacket, Player* pPlayer) throw(Protoc //-------------------------------------------------------------------------------- // write file content //-------------------------------------------------------------------------------- - // ͸ ٽ ó ǵ. + // 파일 포인터를 다시 맨 처음으로 되돌린다. ifile.seekg(0); long offset = 0; @@ -93,17 +93,17 @@ void CURequestHandler::execute(CURequest* pPacket, Player* pPlayer) throw(Protoc // cout << resource.getFilename() << " (" << filesize << "bytes) : "; // TODO: make fd() work?? - // Ѵ. + // 파일 내용을 전송한다. // DWORD nSent = sendfile( pSocket->getSOCKET() , ifile.rdbuf()->fd() , &offset, filesize ); // cout << nSent << " bytes sent to client." << endl; // cout << "=======================================================================" << endl; // if ( nSent != filesize ) { - // throw Error(" "); + // throw Error("파일 전송 오류"); // } - // ݴ´. + // 파일을 닫는다. ifile.close(); pUpdateServerPlayer->setPlayerStatus(USPS_AFTER_SENDING_UC_UPDATE); diff --git a/src/Core/Upackets/CURequestLoginMode.cpp b/src/Core/Upackets/CURequestLoginMode.cpp index e8039836..ca90eba9 100644 --- a/src/Core/Upackets/CURequestLoginMode.cpp +++ b/src/Core/Upackets/CURequestLoginMode.cpp @@ -10,7 +10,7 @@ //-------------------------------------------------------------------------------- -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void CURequestLoginMode::read(SocketInputStream& iStream) throw(ProtocolException, Error) { __BEGIN_TRY @@ -19,7 +19,7 @@ void CURequestLoginMode::read(SocketInputStream& iStream) throw(ProtocolExceptio //-------------------------------------------------------------------------------- -// κ Ÿ о Ŷ ʱȭѴ. +// 소켓으로부터 직접 데이타를 읽어서 패킷을 초기화한다. //-------------------------------------------------------------------------------- void CURequestLoginMode::read(Socket* pSocket) throw(ProtocolException, Error) { __BEGIN_TRY @@ -28,7 +28,7 @@ void CURequestLoginMode::read(Socket* pSocket) throw(ProtocolException, Error) { //-------------------------------------------------------------------------------- -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. //-------------------------------------------------------------------------------- void CURequestLoginMode::write(SocketOutputStream& oStream) const throw(ProtocolException, Error) { __BEGIN_TRY diff --git a/src/Core/Upackets/CURequestLoginMode.h b/src/Core/Upackets/CURequestLoginMode.h index c9d14271..751307a0 100644 --- a/src/Core/Upackets/CURequestLoginMode.h +++ b/src/Core/Upackets/CURequestLoginMode.h @@ -16,20 +16,20 @@ // // class CURequestLoginMode; // -// α 带 ˾Ƴ Ŷ̴ +// 로그인 모드를 알아내기 위한 패킷이다 // // //-------------------------------------------------------------------------------- class CURequestLoginMode : public Packet { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream) throw(ProtocolException, Error); - // κ ͸ о Ŷ ʱȭѴ. + // 소켓으로부터 직접 데이터를 읽어서 패킷을 초기화한다. void read(Socket* pSocket) throw(ProtocolException, Error); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const throw(ProtocolException, Error); // execute packet's handler diff --git a/src/Core/Upackets/CURequestLoginModeHandler.cpp b/src/Core/Upackets/CURequestLoginModeHandler.cpp index da225e4f..2223059e 100644 --- a/src/Core/Upackets/CURequestLoginModeHandler.cpp +++ b/src/Core/Upackets/CURequestLoginModeHandler.cpp @@ -20,7 +20,7 @@ //-------------------------------------------------------------------------------- // -// α 带 Ȯؼ ˷ش +// 로그인 모드를 확인해서 알려준다 // //-------------------------------------------------------------------------------- void CURequestLoginModeHandler::execute(CURequestLoginMode* pPacket, Player* pPlayer) throw(ProtocolException, Error) { diff --git a/src/Core/Upackets/UCRequestLoginMode.h b/src/Core/Upackets/UCRequestLoginMode.h index e3931408..a3360b28 100644 --- a/src/Core/Upackets/UCRequestLoginMode.h +++ b/src/Core/Upackets/UCRequestLoginMode.h @@ -20,20 +20,20 @@ class UCRequestLoginMode : public Packet { public: - // Է½Ʈ()κ ͸ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이터를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream) throw(ProtocolException, Error) { throw UnsupportedError(__PRETTY_FUNCTION__); } - // κ ͸ о Ŷ ʱȭѴ. + // 소켓으로부터 직접 데이터를 읽어서 패킷을 초기화한다. void read(Socket* pSocket) throw(ProtocolException, Error); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const throw(ProtocolException, Error) { throw UnsupportedError(__PRETTY_FUNCTION__); } - // Ŷ ̳ʸ ̹ . + // 소켓으로 직접 패킷의 바이너리 이미지를 보낸다. void write(Socket* pSocket) const throw(ProtocolException, Error); // execute packet's handler @@ -46,12 +46,12 @@ class UCRequestLoginMode : public Packet { // get packet body size // *OPTIMIZATION HINT* - // const static UCRequestLoginModePacketSize , ϶. + // const static UCRequestLoginModePacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const throw() { return szBYTE; } - // ƹ Ŀ ް Ѵ. + // 아무리 커도 백메가는 받지 못한다. static PacketSize_t getPacketMaxSize() throw() { return szBYTE; } diff --git a/src/Core/Upackets/UCUpdate.h b/src/Core/Upackets/UCUpdate.h index 80f6f33b..bff096ea 100644 --- a/src/Core/Upackets/UCUpdate.h +++ b/src/Core/Upackets/UCUpdate.h @@ -21,20 +21,20 @@ class UCUpdate : public Packet { public: - // Է½Ʈ()κ ͸ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이터를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream) throw(ProtocolException, Error) { throw UnsupportedError(__PRETTY_FUNCTION__); } - // κ ͸ о Ŷ ʱȭѴ. + // 소켓으로부터 직접 데이터를 읽어서 패킷을 초기화한다. void read(Socket* pSocket) throw(ProtocolException, Error); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const throw(ProtocolException, Error) { throw UnsupportedError(__PRETTY_FUNCTION__); } - // Ŷ ̳ʸ ̹ . + // 소켓으로 직접 패킷의 바이너리 이미지를 보낸다. void write(Socket* pSocket) const throw(ProtocolException, Error); // execute packet's handler @@ -47,12 +47,12 @@ class UCUpdate : public Packet { // get packet body size // *OPTIMIZATION HINT* - // const static UCUpdatePacketSize , ϶. + // const static UCUpdatePacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const throw() { return m_Resource.getSize(); } - // ƹ Ŀ ް Ѵ. + // 아무리 커도 백메가는 받지 못한다. static PacketSize_t getPacketMaxSize() throw() { return Resource::getMaxSize(); } diff --git a/src/Core/Upackets/UCUpdateList.h b/src/Core/Upackets/UCUpdateList.h index 48aed50d..12b75006 100644 --- a/src/Core/Upackets/UCUpdateList.h +++ b/src/Core/Upackets/UCUpdateList.h @@ -37,20 +37,20 @@ class UCUpdateList : public Packet { public: - // Է½Ʈ()κ ͸ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이터를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream) throw(ProtocolException, Error) { throw UnsupportedError(__PRETTY_FUNCTION__); } - // κ Ÿ о Ŷ ʱȭѴ. + // 소켓으로부터 데이타를 읽어서 패킷을 초기화한다. void read(Socket* pSocket) throw(ProtocolException, Error); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const throw(ProtocolException, Error) { throw UnsupportedError(__PRETTY_FUNCTION__); } - // Ŷ ̳ʸ ̹ . + // 소켓으로 직접 패킷의 바이너리 이미지를 보낸다. void write(Socket* pSocket) const throw(ProtocolException, Error); // execute packet's handler @@ -63,7 +63,7 @@ class UCUpdateList : public Packet { // get packet body size // *OPTIMIZATION HINT* - // const static UCUpdateListPacketSize , ϶. + // const static UCUpdateListPacketSize 를 정의, 리턴하라. PacketSize_t getPacketSize() const throw() { return m_pUpdateManager->getSize() + ((m_Old) ? 0 : szBYTE * 10); } diff --git a/src/Core/Upackets/UCUpdateListHandler.cpp b/src/Core/Upackets/UCUpdateListHandler.cpp index b8f0613a..aee8389b 100644 --- a/src/Core/Upackets/UCUpdateListHandler.cpp +++ b/src/Core/Upackets/UCUpdateListHandler.cpp @@ -19,11 +19,11 @@ //-------------------------------------------------------------------------------- // -// (1) Ʈ Ŵ ÷̾ ü Ѵ. -// (2) ҽ Ŵ Ʈ Ŵ ´. -// (3) ҽ ҽ Ŵ ´. -// (4) ҽ ϸ, ûѴ. -// (5) ҽ Ѵ. +// (1) 업데이트 매니저를 플레이어 객체에 저장한다. +// (2) 리소스 매니저를 업데이트 매니저에서 가져온다. +// (3) 리소스를 리소스 매니저에서 가져온다. +// (4) 리소스가 존재하면, 서버로 요청한다. +// (5) 리소스가 존재하지 않으면 연결을 종료한다. // //-------------------------------------------------------------------------------- void UCUpdateListHandler::execute(UCUpdateList* pPacket, Player* pPlayer) throw(ProtocolException, Error) { diff --git a/src/Core/Update.h b/src/Core/Update.h index e38ddb53..f203961f 100644 --- a/src/Core/Update.h +++ b/src/Core/Update.h @@ -51,7 +51,7 @@ const string UPDATETYPE2String[] = { // // class Update; // -// Ư Smart Update ϳ Ǵ Ŭ̴. +// 특정 버전의 Smart Update 명령 하나와 대응되는 클래스이다. // //-------------------------------------------------------------------------------- class Update { diff --git a/src/Core/UpdateDef.h b/src/Core/UpdateDef.h index 6f71f5e8..9ac2bc2c 100755 --- a/src/Core/UpdateDef.h +++ b/src/Core/UpdateDef.h @@ -12,7 +12,7 @@ //-------------------------------------------------------------------------------- // -// Smart Update Ŭ ϴ Ÿ԰ ũ, limit +// Smart Update 관련 클래스에서 사용하는 각종 데이터 타입과 그 크기, limit 값들 // //-------------------------------------------------------------------------------- @@ -27,15 +27,15 @@ const uint maxFilename = 256; typedef WORD Version_t; const uint szVersion = sizeof(Version_t); -// Ķ Ÿ +// 파라미터 길이 타입 typedef WORD ParameterLen_t; const uint szParameterLen = sizeof(ParameterLen_t); -// Ķ ִ +// 파라미터의 최대 개수 const uint maxParams = 6; // max parameter length -// ִ ̴ ̸ (256) + ϻ(15ڸ)̴. +// 최대 길이는 파일이름의 길이(256) + 파일사이즈(15자리정수)이다. const uint maxParameterLen = 256 + 15; #endif diff --git a/src/Core/UpdateManager.cpp b/src/Core/UpdateManager.cpp index 591e2c1b..91bc0ce5 100644 --- a/src/Core/UpdateManager.cpp +++ b/src/Core/UpdateManager.cpp @@ -144,7 +144,7 @@ void UpdateManager::write(Socket* pSocket) const { WORD nUpdates = m_Updates.size(); // cout << "============================================"<< endl; - // cout << "Ʈ ׸ ϱ? : " << (int)nUpdates << endl; + // cout << "업데이트할 항목의 갯수는 얼마 일까요? : " << (int)nUpdates << endl; // cout << "============================================"<< endl; if (nUpdates > maxUpdates) @@ -169,18 +169,18 @@ void UpdateManager::write(Socket* pSocket) const { ResourceManager* UpdateManager::getResourceManager() { __BEGIN_TRY - // ҽŴ ʾ, Ʈ Ʈ empty ƴ + // 아직 리소스매니저를 생성하지 않았으며, 업데이트 리스트가 empty 가 아닐 경우 if (m_pResourceManager == NULL && !m_Updates.empty()) { - // ҽ Ŵ . + // 리소스 매니저를 생성하자. m_pResourceManager = new ResourceManager(); Resource* pResource; for (list::const_iterator itr = m_Updates.begin(); itr != m_Updates.end(); itr++) { - //  Ʈ Ư Ķʹ ҽ Ÿ. - // ׷ Ķ͸ ҽ ü  ҽ Ŵ ϽŰ. + // 어떤 업데이트 명령의 특정 파라미터는 리소스를 나타낸다. + // 그런 파라미터를 리소스 객체로 만들어서 리소스 매니저에 등록시키자. switch ((*itr)->getUpdateType()) { - // ɵ鿡 ҽ ʴ´. + // 다음 명령들에는 리소스가 존재하지 않는다. case UPDATETYPE_CREATE_DIRECTORY: case UPDATETYPE_DELETE_DIRECTORY: case UPDATETYPE_RENAME_DIRECTORY: diff --git a/src/Core/UpdateManager.h b/src/Core/UpdateManager.h index 76f47747..add88dcf 100644 --- a/src/Core/UpdateManager.h +++ b/src/Core/UpdateManager.h @@ -17,7 +17,7 @@ #include "Update.h" //-------------------------------------------------------------------------------- -// Ʈ 1024 ̴.. +// 업데이트 명령이 1024면 거의 죽음이당.. //-------------------------------------------------------------------------------- const uint maxUpdates = 1024; @@ -25,15 +25,15 @@ const uint maxUpdates = 1024; // // class UpdateManager // -// Ʈ ϴ Ŵ̴. +// 업데이트 명령을 관리하는 매니저이다. // -// Ŷ embedding Ǹ, Ͻýۿ save/load DZ , +// 패킷에 embedding 되며, 파일시스템에 save/load 되기 때문에, // // load/save // read(SocketInputStream&)/write(SocketOutputStream&) // read(Socket*)/write(Socket*) // -// ϵ . +// 모두 구현하도록 하자. // //-------------------------------------------------------------------------------- diff --git a/src/Core/Utility.cpp b/src/Core/Utility.cpp index e8719634..90e38763 100644 --- a/src/Core/Utility.cpp +++ b/src/Core/Utility.cpp @@ -1,8 +1,8 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : Utility.cpp -// Written by : 輺 +// Written by : 김성민 // Description : -// Ǵ ũ Լ ̴. +// 여러 곳에서 사용되는 매크로 및 간단한 함수를 정의한 파일이다. ////////////////////////////////////////////////////////////////////////////// #include "Utility.h" @@ -16,7 +16,7 @@ #include "VSDateTime.h" ////////////////////////////////////////////////////////////////////////////// -// 簢 Ŭ +// 사각형 클래스 ////////////////////////////////////////////////////////////////////////////// /* VSRect::VSRect(int l, int t, int r, int b) @@ -53,7 +53,7 @@ void VSRect::set(int l, int t, int r, int b) */ ////////////////////////////////////////////////////////////////////////////// -// ڸ ڿ ٲٱ +// 숫자를 문자열로 바꾸기 ////////////////////////////////////////////////////////////////////////////// string itos(int value) { char buf[100] = { @@ -64,8 +64,8 @@ string itos(int value) { } ////////////////////////////////////////////////////////////////////////////// -// ϱ -// origin dest Ÿũ⿡ ° Ѵ. client Դ. +// 방향 구하기 +// origin에서 dest의 방향을 타일크기에 맞게 구한다. client에서 가져왔다. ////////////////////////////////////////////////////////////////////////////// #define BASIS_DIRECTION_HIGH 2.0f #define BASIS_DIRECTION_LOW 0.5f @@ -134,7 +134,7 @@ Dir_t getDirection(int originX, int originY, int destX, int destY) } ////////////////////////////////////////////////////////////////////////////// -// ̾Ƴ +// 랜덤 숫자 뽑아내기 ////////////////////////////////////////////////////////////////////////////// int Random(int Min, int Max) { @@ -143,12 +143,12 @@ int Random(int Min, int Max) } ////////////////////////////////////////////////////////////////////////////// -// ݿøϱ +// 반올림하기 ////////////////////////////////////////////////////////////////////////////// int Round(float f) { return f - 0.5 >(int)f ?(int)f + 1 :(int)f; } ////////////////////////////////////////////////////////////////////////////// -// ̽ Լ +// 다이스 함수 ////////////////////////////////////////////////////////////////////////////// uint Dice(uint num , uint dice) { @@ -160,8 +160,8 @@ uint Dice(uint num , uint dice) */ ////////////////////////////////////////////////////////////////////////////// -// ڿ -// pos \n ε ȴ. +// 긴 문자열에서 한 라인 가져오기 +// pos 값은 \n 의 인덱스값이 된다. ////////////////////////////////////////////////////////////////////////////// string getline(const string& str, size_t& pos) { if (pos > str.size()) @@ -179,14 +179,14 @@ string getline(const string& str, size_t& pos) { /* uint oldpos = pos; - // 1 ָ, + // 1 을 더해주면, pos = str.find_first_of('\n',oldpos) + 1; return str.substr(oldpos ,(pos - 1) - oldpos); */ } ////////////////////////////////////////////////////////////////////////////// -// ڿ ϱ +// 문자열 앞 뒤의 공백 제거하기 ////////////////////////////////////////////////////////////////////////////// string trim(const string& str) { if (str.size() == 0) @@ -205,7 +205,7 @@ string trim(const string& str) { } ////////////////////////////////////////////////////////////////////////////// -// ð  +// 현재 시간 얻어내기 ////////////////////////////////////////////////////////////////////////////// void getCurrentTimeEx(int& year, int& month, int& day, int& hour, int& minute, int& sec) { time_t cur_time = time(NULL); @@ -237,7 +237,7 @@ string getCurrentTimeStringEx(void) { } ////////////////////////////////////////////////////////////////////////////// -// Ʈ Ʈ иŰ +// 워드 상위 바이트와 하위 바이트로 분리시키기 ////////////////////////////////////////////////////////////////////////////// /* void splitWord(WORD value, int& high, int& low) @@ -247,7 +247,7 @@ void splitWord(WORD value, int& high, int& low) } ////////////////////////////////////////////////////////////////////////////// -// 0 ʱȭŰ +// 0으로 초기화시키기 ////////////////////////////////////////////////////////////////////////////// void zerofill(void* pointer, size_t size) { @@ -255,7 +255,7 @@ void zerofill(void* pointer, size_t size) } ////////////////////////////////////////////////////////////////////////////// -// range ִ ˻ϱ +// range 내에 있는지 검사하기 ////////////////////////////////////////////////////////////////////////////// bool isInRange(int value, int min, int max) { @@ -264,7 +264,7 @@ bool isInRange(int value, int min, int max) } ////////////////////////////////////////////////////////////////////////////// -// ־ % ˾Ƴ +// 주어진 숫자의 %값 알아내기 ////////////////////////////////////////////////////////////////////////////// int getPercentValue(int value, int percent) { @@ -273,7 +273,7 @@ int getPercentValue(int value, int percent) */ ////////////////////////////////////////////////////////////////////////////// -// ־ % ˾Ƴ - Ҽ ùڸ +// 주어진 숫자의 %값 알아내기 - 소수 첫재자리 보정 ////////////////////////////////////////////////////////////////////////////// int getPercentValueEx(int value, int percent) { static int tick = 0; @@ -289,7 +289,7 @@ int getPercentValueEx(int value, int percent) { } ////////////////////////////////////////////////////////////////////////////// -// Ͽ αϱ +// 파일에다 로그하기 ////////////////////////////////////////////////////////////////////////////// void filelog(const char* szFilename, const char* fmt, ...) { __BEGIN_TRY @@ -318,7 +318,7 @@ void filelog(const char* szFilename, const char* fmt, ...) { } ////////////////////////////////////////////////////////////////////////////// -// 2 WORD DWORD ٲش. HIWORD, LOWORD +// 2개의 WORD 를 DWORD 로 바꿔준다. HIWORD, LOWORD ////////////////////////////////////////////////////////////////////////////// DWORD makeDWORD(WORD hiWord, WORD loWord) { DWORD dwResult = ((DWORD)hiWord << 16) | loWord; @@ -327,7 +327,7 @@ DWORD makeDWORD(WORD hiWord, WORD loWord) { } ////////////////////////////////////////////////////////////////////////////// -// DWORD HIWORD, LOWORD +// DWORD 의 HIWORD, LOWORD 가져오기 ////////////////////////////////////////////////////////////////////////////// WORD getHIWORD(DWORD dwValue) { WORD wResult = (WORD)(dwValue >> 16); diff --git a/src/Core/Utility.h b/src/Core/Utility.h index 0aec2e0d..f380bb56 100644 --- a/src/Core/Utility.h +++ b/src/Core/Utility.h @@ -1,8 +1,8 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : Utility.h -// Written by : 輺 +// Written by : 김성민 // Description : -// Ǵ ũ Լ ̴. +// 여러 곳에서 사용되는 매크로 및 간단한 함수를 정의한 파일이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __UTILITY_H__ @@ -13,7 +13,7 @@ #include ////////////////////////////////////////////////////////////////////////////// -// +// 포인터 지우기 ////////////////////////////////////////////////////////////////////////////// #define SAFE_DELETE(p) \ { \ @@ -38,7 +38,7 @@ ////////////////////////////////////////////////////////////////////////////// -// Ʈ Ŭ +// 포인트 클래스 ////////////////////////////////////////////////////////////////////////////// class POINT { public: @@ -52,7 +52,7 @@ class POINT { }; ////////////////////////////////////////////////////////////////////////////// -// Ʈ Ŭ +// 포인트 클래스 ////////////////////////////////////////////////////////////////////////////// class BPOINT { public: @@ -66,7 +66,7 @@ class BPOINT { }; ////////////////////////////////////////////////////////////////////////////// -// 簢 Ŭ +// 사각형 클래스 ////////////////////////////////////////////////////////////////////////////// class VSRect { public: @@ -109,12 +109,12 @@ class VSRect { }; ////////////////////////////////////////////////////////////////////////////// -// ڸ ڿ ٲٱ +// 숫자를 문자열로 바꾸기 ////////////////////////////////////////////////////////////////////////////// string itos(int value); ////////////////////////////////////////////////////////////////////////////// -// ϱ +// 방향 구하기 ////////////////////////////////////////////////////////////////////////////// Dir_t computeDirection(int originX, int originY, int destX, int destY); @@ -128,7 +128,7 @@ inline Dir_t getDirection(int originX, int originY, int destX, int destY) { ////////////////////////////////////////////////////////////////////////////// -// ̾Ƴ +// 랜덤 숫자 뽑아내기 ////////////////////////////////////////////////////////////////////////////// inline int Random(int Min, int Max) { if (Max == 0 || Min > Max) @@ -138,14 +138,14 @@ inline int Random(int Min, int Max) { ////////////////////////////////////////////////////////////////////////////// -// ݿøϱ +// 반올림하기 ////////////////////////////////////////////////////////////////////////////// inline int Round(float f) { return f - 0.5 > (int)f ? (int)f + 1 : (int)f; } ////////////////////////////////////////////////////////////////////////////// -// ̽ Լ +// 다이스 함수 ////////////////////////////////////////////////////////////////////////////// inline uint Dice(uint num, uint dice) { uint result = 0; @@ -156,23 +156,23 @@ inline uint Dice(uint num, uint dice) { ////////////////////////////////////////////////////////////////////////////// -// ڿ +// 긴 문자열에서 한 라인 가져오기 ////////////////////////////////////////////////////////////////////////////// string getline(const string& str, size_t& pos); ////////////////////////////////////////////////////////////////////////////// -// ڿ ϱ +// 문자열 앞 뒤의 공백 제거하기 ////////////////////////////////////////////////////////////////////////////// string trim(const string& str); ////////////////////////////////////////////////////////////////////////////// -// ð  +// 현재 시간 얻어내기 ////////////////////////////////////////////////////////////////////////////// void getCurrentTimeEx(int& year, int& month, int& day, int& hour, int& minute, int& sec); string getCurrentTimeStringEx(void); ////////////////////////////////////////////////////////////////////////////// -// Ʈ Ʈ иŰ +// 워드 상위바이트와 하위 바이트로 분리시키기 ////////////////////////////////////////////////////////////////////////////// inline void splitWord(WORD value, int& high, int& low) { high = value >> 8; @@ -181,7 +181,7 @@ inline void splitWord(WORD value, int& high, int& low) { ////////////////////////////////////////////////////////////////////////////// -// 0 ʱȭŰ +// 0으로 초기화시키기 ////////////////////////////////////////////////////////////////////////////// inline void zerofill(void* pointer, size_t size) { memset(pointer, 0, size); @@ -189,7 +189,7 @@ inline void zerofill(void* pointer, size_t size) { ////////////////////////////////////////////////////////////////////////////// -// range ִ ˻ϱ +// range 내에 있는지 검사하기 ////////////////////////////////////////////////////////////////////////////// inline bool isInRange(int value, int min, int max) { if (min <= value && value <= max) @@ -198,7 +198,7 @@ inline bool isInRange(int value, int min, int max) { } ////////////////////////////////////////////////////////////////////////////// -// ־ % ˾Ƴ +// 주어진 숫자의 %값 알아내기 ////////////////////////////////////////////////////////////////////////////// inline int getPercentValue(int value, int percent) { return (int)((long long)(value) * (long long)(percent) / 100); @@ -206,19 +206,19 @@ inline int getPercentValue(int value, int percent) { ////////////////////////////////////////////////////////////////////////////// -// ־ % ˾Ƴ - Ҽ ùڸ +// 주어진 숫자의 %값 알아내기 - 소수 첫재자리 보정 ////////////////////////////////////////////////////////////////////////////// int getPercentValueEx(int value, int percent); ////////////////////////////////////////////////////////////////////////////// -// Ͽ α +// 파일에다 로그 남기기 ////////////////////////////////////////////////////////////////////////////// void filelog(const char* szFilename, const char* fmt, ...); ////////////////////////////////////////////////////////////////////////////// -// ⺰ ũ +// 방향별 움직임을 위한 마스크 ////////////////////////////////////////////////////////////////////////////// const POINT dirMoveMask[] = { POINT(-1, 0), // 0 == LEFT @@ -233,12 +233,12 @@ const POINT dirMoveMask[] = { }; ////////////////////////////////////////////////////////////////////////////// -// 2 WORD DWORD ٲش. HIWORD, LOWORD +// 2개의 WORD 를 DWORD 로 바꿔준다. HIWORD, LOWORD ////////////////////////////////////////////////////////////////////////////// DWORD makeDWORD(WORD hiWord, WORD loWord); ////////////////////////////////////////////////////////////////////////////// -// DWORD HIWORD, LOWORD +// DWORD 의 HIWORD, LOWORD 가져오기 ////////////////////////////////////////////////////////////////////////////// WORD getHIWORD(DWORD dwValue); WORD getLOWORD(DWORD dwValue); diff --git a/src/Core/VSDateTime.h b/src/Core/VSDateTime.h index 97a01338..2de87b3f 100644 --- a/src/Core/VSDateTime.h +++ b/src/Core/VSDateTime.h @@ -152,10 +152,10 @@ class VSTime { public: ////////////////////////////////////////////////// - // start()ν ΰ, - // elapsed milli-second - // ˾Ƴ ϴ κ - // ִ. + // start()로써 시작점을 저장해 두고, + // elapsed로 몇 milli-second가 지났는지 + // 알아내면 딜레이 조사하는 부분 같은 곳에 + // 쓸 수 있다. ////////////////////////////////////////////////// void start(); int restart(); diff --git a/src/Core/VSTemplateLib.h b/src/Core/VSTemplateLib.h index ddb3004c..e860b088 100644 --- a/src/Core/VSTemplateLib.h +++ b/src/Core/VSTemplateLib.h @@ -66,22 +66,22 @@ template unsigned int UniqueSet::insert(const T value) { } template unsigned int UniqueSet::pick(unsigned int size, list& resultList) { - // ִ Ÿ ڰ 䱸 ں ٸ, - // ִ θ Ʈ ְ Ѵ. + // 현재 가지고 있는 데이타의 숫자가 요구된 데이터 숫자보다 적다면, + // 가지고 있는 데이터 모두를 결과 리스트에다 집어넣고 리턴한다. if (size >= m_CurSize) { for (unsigned int i = 0; i < m_CurSize; i++) { resultList.push_back(m_pData[i]); } } - // ƴ϶ ִ Ÿ Ϻθ 䱸 ڸŭ - // Ʈ Ƽ Ѵ. + // 아니라면 현재 가지고 있는 데이타 중의 일부를 요구된 숫자만큼 + // 결과 리스트에다 담아서 리턴한다. else { - // Ʒ ˰ ٽ . - // N Ÿ % ڸ ϳ ̾Ƴ. - // ͸ Խ״ٸ, Ϳ ü - // , N-1 ͸ Ѵ. N 1 δ. - // ٽ % ڸ ϳ ͸ ̴´. ̷ - // 䱸 ŭ unique ͸ ̾Ƴ ִ. + // 아래 알고리즘의 핵심은 다음과 같다. + // N개의 데이타가 있으면 % 연산자를 통해 그 중의 하나를 뽑아낸다. + // 데이터를 결과에 포함시켰다면, 그 데이터와 전체 데이터 중의 + // 마지막 데이터, 즉 N-1번의 데이터를 스왑한다. 그 다음 N을 1 줄인다. + // 다시 % 연산자를 통해 하나의 데이터를 뽑는다. 이런 식으로 + // 요구된 만큼의 unique한 데이터를 뽑아낼 수가 있다. int max = m_CurSize; int current = 0; @@ -103,22 +103,22 @@ template unsigned int UniqueSet::pick(unsigned int size, list& r } template unsigned int UniqueSet::pick(unsigned int size, vector& resultVector) { - // ִ Ÿ ڰ 䱸 ں ٸ, - // ִ θ Ʈ ְ Ѵ. + // 현재 가지고 있는 데이타의 숫자가 요구된 데이터 숫자보다 적다면, + // 가지고 있는 데이터 모두를 결과 리스트에다 집어넣고 리턴한다. if (size >= m_CurSize) { for (unsigned int i = 0; i < m_CurSize; i++) { resultVector.push_back(m_pData[i]); } } - // ƴ϶ ִ Ÿ Ϻθ 䱸 ڸŭ - // Ʈ Ƽ Ѵ. + // 아니라면 현재 가지고 있는 데이타 중의 일부를 요구된 숫자만큼 + // 결과 리스트에다 담아서 리턴한다. else { - // Ʒ ˰ ٽ . - // N Ÿ % ڸ ϳ ̾Ƴ. - // ͸ Խ״ٸ, Ϳ ü - // , N-1 ͸ Ѵ. N 1 δ. - // ٽ % ڸ ϳ ͸ ̴´. ̷ - // 䱸 ŭ unique ͸ ̾Ƴ ִ. + // 아래 알고리즘의 핵심은 다음과 같다. + // N개의 데이타가 있으면 % 연산자를 통해 그 중의 하나를 뽑아낸다. + // 데이터를 결과에 포함시켰다면, 그 데이터와 전체 데이터 중의 + // 마지막 데이터, 즉 N-1번의 데이터를 스왑한다. 그 다음 N을 1 줄인다. + // 다시 % 연산자를 통해 하나의 데이터를 뽑는다. 이런 식으로 + // 요구된 만큼의 unique한 데이터를 뽑아낼 수가 있다. int max = m_CurSize; int current = 0; diff --git a/src/Core/ValueList.h b/src/Core/ValueList.h index 045e8d96..aed1e48d 100644 --- a/src/Core/ValueList.h +++ b/src/Core/ValueList.h @@ -72,7 +72,7 @@ template class ValueList { ////////////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////////////// template void ValueList::read(SocketInputStream& iStream) { __BEGIN_TRY @@ -92,7 +92,7 @@ template void ValueList::read(SocketInputStream& iStream) { ////////////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////////////// template void ValueList::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/WarInfo.cpp b/src/Core/WarInfo.cpp index 423b3171..6e5d9404 100644 --- a/src/Core/WarInfo.cpp +++ b/src/Core/WarInfo.cpp @@ -10,7 +10,7 @@ #include "WarInfo.h" ////////////////////////////////////////////////////////////////////// -// Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. +// 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. ////////////////////////////////////////////////////////////////////// void WarInfo::read(SocketInputStream& iStream) { __BEGIN_TRY @@ -23,7 +23,7 @@ void WarInfo::read(SocketInputStream& iStream) { ////////////////////////////////////////////////////////////////////// -// ½Ʈ() Ŷ ̳ʸ ̹ . +// 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. ////////////////////////////////////////////////////////////////////// void WarInfo::write(SocketOutputStream& oStream) const { __BEGIN_TRY diff --git a/src/Core/WarInfo.h b/src/Core/WarInfo.h index aa9b1ad6..36cd69cb 100644 --- a/src/Core/WarInfo.h +++ b/src/Core/WarInfo.h @@ -19,7 +19,7 @@ // // class WarInfo; // -// ϳ £ +// 하나의 전쟁에 대한 정보 // //-------------------------------------------------------------------------------- @@ -31,10 +31,10 @@ class WarInfo { } virtual ~WarInfo() {} - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. virtual void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. virtual void write(SocketOutputStream& oStream) const; virtual PacketSize_t getSize() const { @@ -66,8 +66,8 @@ class WarInfo { } protected: - DWORD m_RemainTime; // ð() - DWORD m_StartTime; // ð(//) + DWORD m_RemainTime; // 남은 시간(초) + DWORD m_StartTime; // 시작 시간(년/월/일) }; #endif diff --git a/src/Core/md5.cpp b/src/Core/md5.cpp index cbe20cae..367b68fe 100644 --- a/src/Core/md5.cpp +++ b/src/Core/md5.cpp @@ -1,6 +1,6 @@ /****************************************************************************** FileName : md5.cpp -Description : ϣ㷨Ȩ +Description : 벗句炬랬,경홈백페鱗諒杰唐 Version : Date : 1991 Author : RSA Data Security, Inc. diff --git a/src/Core/md5.h b/src/Core/md5.h index 5604f7d2..855d16c3 100644 --- a/src/Core/md5.h +++ b/src/Core/md5.h @@ -1,6 +1,6 @@ /****************************************************************************** FileName : md5.h -Description : ϣ㷨Ȩ +Description : 벗句炬랬,경홈백페鱗諒杰唐 Version : Date : 1991 Author : RSA Data Security, Inc. diff --git a/src/Core/types/CreatureTypes.h b/src/Core/types/CreatureTypes.h index 746be46c..0c72ab12 100644 --- a/src/Core/types/CreatureTypes.h +++ b/src/Core/types/CreatureTypes.h @@ -22,29 +22,29 @@ const uint szPCType = szBYTE; enum RaceType { RACE_SLAYER, RACE_VAMPIRE, RACE_OUSTERS }; ////////////////////////////////////////////////////////////////////////////// -// +// 종족 ////////////////////////////////////////////////////////////////////////////// typedef BYTE Race_t; const int szRace = sizeof(Race_t); ////////////////////////////////////////////////////////////////////////////// -// +// 권한 ////////////////////////////////////////////////////////////////////////////// enum Competence { GOD = 0, DM, HELPER, PLAYER }; ////////////////////////////////////////////////////////////////////////////// -// Ŭ̾Ʈ ... +// 클라이언트와 복장 공유를 위한... ////////////////////////////////////////////////////////////////////////////// #ifndef __GAME_CLIENT__ enum ADDON { - ADDON_HAIR, // Ӹ - ADDON_HELM, // - ADDON_COAT, // - ADDON_TROUSER, // - ADDON_LEFTHAND, // ޼ - ADDON_RIGHTHAND, // - ADDON_MOTOR, // - ADDON_SHOULDER, // + ADDON_HAIR, // 머리 + ADDON_HELM, // 모자 + ADDON_COAT, // 상의 + ADDON_TROUSER, // 하의 + ADDON_LEFTHAND, // 왼손 + ADDON_RIGHTHAND, // 오른손 + ADDON_MOTOR, // 오토바이 + ADDON_SHOULDER, // 어깨 ADDON_MAX }; #endif @@ -132,7 +132,7 @@ const string OustersSylphType2String[] = {"OUSTERS_SYLPH_NONE", "OUSTERS_SYLPH1" ////////////////////////////////////////////////////////////////////////////// -// +// 성별 ////////////////////////////////////////////////////////////////////////////// enum Sex { FEMALE, // female == 0 -_-; why? don't know? @@ -143,7 +143,7 @@ const uint szSex = szBYTE; ////////////////////////////////////////////////////////////////////////////// -// Ÿ +// 헤어스타일 ////////////////////////////////////////////////////////////////////////////// enum HairStyle { HAIR_STYLE1, HAIR_STYLE2, HAIR_STYLE3 }; const string HairStyle2String[] = {"HAIR_STYLE1", "HAIR_STYLE2", "HAIR_STYLE3"}; @@ -159,7 +159,7 @@ const uint szSlot = szBYTE; ////////////////////////////////////////////////////////////////////////////// -// +// 색상 정보 ////////////////////////////////////////////////////////////////////////////// typedef WORD Color_t; const uint szColor = sizeof(Color_t); @@ -183,9 +183,9 @@ enum AttrType { ATTR_CURRENT = 0, ATTR_MAX, ATTR_BASIC }; typedef WORD Attr_t; const uint szAttr = sizeof(Attr_t); -// ɷġ ٿ ־.. -// Ѵ 350 ִ 2000 Ѵ. -// (!) ̰ ؿ Ƶΰ Error catchؼ log ° ... +// 능력치 오버로 서버 다운이 가끔 있어서.. +// 둘다 350으로 돼있던걸 2000으로 수정한당. +// (!) 이건 적당한 수준에 잡아두고 Error를 catch해서 log만 남기는게 더 좋겠지만... // by sigi. 2002.9.16 const uint maxSlayerAttr = 2000; const uint maxVampireAttr = 2000; @@ -197,15 +197,15 @@ const uint szHP = sizeof(HP_t); typedef WORD MP_t; const uint szMP = sizeof(MP_t); -// +// 방어력 typedef WORD Defense_t; const uint szDefense = sizeof(Defense_t); -// ؼ +// 프로텍션 typedef WORD Protection_t; const uint szProtection = sizeof(Protection_t); -// ߷ +// 명중률 typedef WORD ToHit_t; const uint szToHit = sizeof(ToHit_t); @@ -218,8 +218,8 @@ const uint szSkillPoint = sizeof(SkillPoint_t); ////////////////////////////////////////////////////////////////////////////// // defines for MODIFY bit flag //abcd -// ⺻ġ str, int, dex ȭ ȭ  ΰ -// Ÿ +// 기본치수 str, int, dex등의 변화에 따라서 변화된 값들이 어떤 값인가를 +// 나타냄 ////////////////////////////////////////////////////////////////////////////// #define MF_STR 0x01 #define MF_DEX 0x02 @@ -233,13 +233,13 @@ const uint szSkillPoint = sizeof(SkillPoint_t); enum Attribute { STR = 0, DEX, INTE, MP, HP, DEFENSE, TOHIT, PROTECT, DAM, SD, DUR, LEV, MAX_ATTR }; ////////////////////////////////////////////////////////////////////////////// -// Skill +// Skill 관련 ////////////////////////////////////////////////////////////////////////////// -// Skill Type . +// Skill의 Type 갯수. typedef WORD SkillType_t; const uint szSkillType = sizeof(SkillType_t); -// Client ִ EffectID. +// Client 에서 날려주는 EffectID. typedef WORD CEffectID_t; const uint szCEffectID = sizeof(CEffectID_t); @@ -247,7 +247,7 @@ const uint szCEffectID = sizeof(CEffectID_t); typedef WORD EffectID_t; const uint szEffectID = sizeof(EffectID_t); -// Slot +// Slot의 갯수 typedef BYTE SlotID_t; const uint szSlotID = sizeof(SlotID_t); @@ -274,7 +274,7 @@ enum SkillDomain { SKILL_DOMAIN_VAMPIRE, // 6 SKILL_DOMAIN_OUSTERS, // 6 SKILL_DOMAIN_MAX // 7 - // SKILL_DOMAIN_RIFLE , // 2...3 ... + // SKILL_DOMAIN_RIFLE , // 2...3번은 쓰이지 않쥐... }; enum SkillGrade { @@ -298,14 +298,14 @@ const string SkillDomain2String[] = {"SKILL_DOMAIN_BLADE", "SKILL_DOMAIN_SWORD", "SKILL_DOMAIN_VAMPIRE"}; ////////////////////////////////////////////////////////////////////////////// -// NPCκ ̴ ̴. -// ̻ Ÿ -// Ŷ ־ ̴. +// NPC로부터 기술을 배울 때 쓰이는 상수이다. +// 모든 레벨의 기술을 다 배워서 더 이상 배울 수 없음을 나타날 때 +// 패킷에다 넣어서 보내는 상수이다. ////////////////////////////////////////////////////////////////////////////// const SkillLevel_t ALL_SKILL_LEARNED = 100; ////////////////////////////////////////////////////////////////////////////// -// PC Ÿ Ÿ +// PC 기타 정보 타입 ////////////////////////////////////////////////////////////////////////////// typedef DWORD Fame_t; const uint szFame = sizeof(Fame_t); @@ -328,7 +328,7 @@ const uint szGold = sizeof(Gold_t); const Gold_t MAX_MONEY = 2000000000; ////////////////////////////////////////////////////////////////////////////// -// ǥ +// 좌표와 방향 ////////////////////////////////////////////////////////////////////////////// typedef BYTE Coord_t; const uint szCoord = sizeof(Coord_t); @@ -341,13 +341,13 @@ const string Dir2String[] = {"LEFT", "LEFTDOWN", "DOWN", "RIGHTDOWN", "RIGHT", " ////////////////////////////////////////////////////////////////////////////// -// þ +// 시야 관련 ////////////////////////////////////////////////////////////////////////////// typedef BYTE Vision_t; const uint szVision = sizeof(Vision_t); -// ij / þ ִ밪. þ ϰ Ī̴. +// 캐릭터의 가로/세로 시야 범위의 최대값. 시야 범위는 상하가 비대칭이다. // const Coord_t maxViewportWidth = 9; // const Coord_t maxViewportUpperHeight = 10; // const Coord_t maxViewportLowerHeight = 10; @@ -359,11 +359,11 @@ const uint szVision = sizeof(Vision_t); // const Coord_t maxViewportUpperHeight = 14; // const Coord_t maxViewportLowerHeight = 14; -// þ߻簢(vision) / ũ +// 시야사각형(vision)의 가로/세로 크기 // const Coord_t maxVisionWidth = maxViewportWidth * 2 + 1; // const Coord_t maxVisionHeight = maxViewportUpperHeight + maxViewportLowerHeight + 1; -// þ +// 시야 레벨 typedef BYTE Sight_t; const uint szSight = sizeof(Sight_t); const Sight_t minSight = 0; @@ -371,14 +371,14 @@ const Sight_t maxSight = 13; ////////////////////////////////////////////////////////////////////////////// -// (0.1) Ѵ. +// 게임 내에서의 턴(0.1초)을 계산할 때 사용한다. ////////////////////////////////////////////////////////////////////////////// typedef DWORD Turn_t; const uint szTurn = sizeof(Turn_t); ////////////////////////////////////////////////////////////////////////////// -// +// 몬스터 ////////////////////////////////////////////////////////////////////////////// typedef WORD MonsterType_t; const uint szMonsterType = sizeof(MonsterType_t); @@ -400,7 +400,7 @@ typedef WORD NPCID_t; const uint szNPCID = sizeof(NPCID_t); ////////////////////////////////////////////////////////////////////////////// -// ڵ& +// 핸드폰&슬랏 관련 ////////////////////////////////////////////////////////////////////////////// #define MAX_PHONE_SLOT 3 typedef DWORD PhoneNumber_t; @@ -427,26 +427,26 @@ typedef short Luck_t; const uint szLuck = sizeof(Luck_t); ////////////////////////////////////////////////////////////////////////////// -// ׷ +// 마법 저항력 ////////////////////////////////////////////////////////////////////////////// typedef short Resist_t; const uint szResist = sizeof(Resist_t); enum MagicDomain { - MAGIC_DOMAIN_NO_DOMAIN = 0, // Ӽ - MAGIC_DOMAIN_POISON = 1, // 迭 - MAGIC_DOMAIN_ACID = 2, // 迭 - MAGIC_DOMAIN_CURSE = 3, // 迭 - MAGIC_DOMAIN_BLOOD = 4, // 迭 + MAGIC_DOMAIN_NO_DOMAIN = 0, // 무속성 마법 + MAGIC_DOMAIN_POISON = 1, // 독 계열 마법 + MAGIC_DOMAIN_ACID = 2, // 산 계열 마법 + MAGIC_DOMAIN_CURSE = 3, // 저주 계열 마법 + MAGIC_DOMAIN_BLOOD = 4, // 피 계열 마법 MAGIC_DOMAIN_MAX }; -const string MagicDomain2String[] = {"NO_DOMAIN", // Ӽ - "POISON", // 迭 - "ACID", // 迭 - "CURSE", // 迭 - "BLOOD", // 迭 +const string MagicDomain2String[] = {"NO_DOMAIN", // 무속성 마법 + "POISON", // 독 계열 마법 + "ACID", // 산 계열 마법 + "CURSE", // 저주 계열 마법 + "BLOOD", // 피 계열 마법 "MAGIC_DOMAIN_MAX"}; const int MAX_RESIST = 90; @@ -458,21 +458,21 @@ const uint szShape = sizeof(Shape_t); enum Shape { SHAPE_NORMAL = 0, SHAPE_WOLF, SHAPE_BAT, SHAPE_WERWOLF, SHAPE_MAX }; ////////////////////////////////////////////////////////////////////////////// -// Ÿ Ÿ -// Ʈ ÷׷ν, ִ Ÿ Ѵ. +// 기술의 타겟 타입 +// 비트 플래그로써, 맞출 수 있는 타입을 결정한다. ////////////////////////////////////////////////////////////////////////////// const uint TARGET_UNDERGROUND = 0x01; const uint TARGET_GROUND = 0x02; const uint TARGET_AIR = 0x04; ////////////////////////////////////////////////////////////////////////////// -// Ŭ Ÿ +// 클랜 타입 ////////////////////////////////////////////////////////////////////////////// -typedef WORD ClanType_t; // BYTE WORD ٲ. by sigi. 2002.12.27 +typedef WORD ClanType_t; // BYTE에서 WORD로 바꿈. by sigi. 2002.12.27 const uint szClanType = sizeof(ClanType_t); ////////////////////////////////////////////////////////////////////////////// -// ġ ̺ ֱ +// 경험치 관련 세이브 주기 ////////////////////////////////////////////////////////////////////////////// const WORD ATTR_EXP_SAVE_PERIOD = 100; const WORD DOMAIN_EXP_SAVE_PERIOD = 100; @@ -485,23 +485,23 @@ const WORD OUSTERS_EXP_SAVE_PERIOD = 100; //////////////////////////////////////////////////////////////////////////////// // -// þ +// 시야 영역 상수들 // -// VisionState >= IN_SIGHT : ̹ ִ. -// VisionState == OUT_OF_SIGHT : ʴ´. +// VisionState >= IN_SIGHT : 이미 보고 있다. +// VisionState == OUT_OF_SIGHT : 보이지 않는다. // //////////////////////////////////////////////////////////////////////////////// enum VisionState { - OUT_OF_SIGHT, // þ 8 ܺ . ʴ´. - IN_SIGHT, // þ 8 . δ. ̹ ִ. - ON_SIGHT, // þ 8 . δ. ̹ ִ. - NEW_SIGHT // þ 8 . ij׿. δ. ó . + OUT_OF_SIGHT, // 시야 8각형의 외부 영역. 보이지 않는다. + IN_SIGHT, // 시야 8각형의 내부 영역. 보인다. 이미 보고 있다. + ON_SIGHT, // 시야 8각형의 경계 영역. 보인다. 이미 보고 있다. + NEW_SIGHT // 시야 8각형의 경계 영역. 스캐닝영역. 보인다. 처음 본다. }; const string VisionState2String[] = {"OUT_OF_SIGHT", "IN_SIGHT", "ON_SIGHT", "NEW_SIGHT"}; //////////////////////////////////////////////////////////////////////////////// -// ƿ콺ͽ Ż Ӽ +// 아우스터스 엘리멘탈 속성 //////////////////////////////////////////////////////////////////////////////// enum ElementalType { ELEMENTAL_ANY = -1, @@ -525,14 +525,14 @@ typedef WORD Elemental_t; const uint szElemental = sizeof(Elemental_t); enum ElementalDomain { - ELEMENTAL_DOMAIN_NO_DOMAIN = -1, // Ӽ - ELEMENTAL_DOMAIN_FIRE = 0, // Ұ迭 - ELEMENTAL_DOMAIN_WATER, // 迭 - ELEMENTAL_DOMAIN_EARTH, // 迭 - ELEMENTAL_DOMAIN_WIND, // ٶ迭 - ELEMENTAL_DOMAIN_COMBAT, // Ϲ 迭 - ELEMENTAL_DOMAIN_ELEMENTAL_COMBAT, // 迭 - ELEMENTAL_DOMAIN_ETC, // Ÿ(迭о) + ELEMENTAL_DOMAIN_NO_DOMAIN = -1, // 무속성 + ELEMENTAL_DOMAIN_FIRE = 0, // 불계열 + ELEMENTAL_DOMAIN_WATER, // 물계열 + ELEMENTAL_DOMAIN_EARTH, // 대지계열 + ELEMENTAL_DOMAIN_WIND, // 바람계열 + ELEMENTAL_DOMAIN_COMBAT, // 전투 일반 계열 + ELEMENTAL_DOMAIN_ELEMENTAL_COMBAT, // 전투 정령 계열 + ELEMENTAL_DOMAIN_ETC, // 기타(계열구분없음) ELEMENTAL_DOMAIN_MAX }; diff --git a/src/Core/types/GuildTypes.h b/src/Core/types/GuildTypes.h index db8ea5ad..ff6ff44a 100644 --- a/src/Core/types/GuildTypes.h +++ b/src/Core/types/GuildTypes.h @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GuildTypes.h -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -10,62 +10,62 @@ #include "SystemTypes.h" ////////////////////////////////////////////////////////////////////////////// -// ID +// 길드 ID ////////////////////////////////////////////////////////////////////////////// typedef WORD GuildID_t; const int szGuildID = sizeof(GuildID_t); ////////////////////////////////////////////////////////////////////////////// -// +// 길드의 종류 ////////////////////////////////////////////////////////////////////////////// typedef BYTE GuildType_t; const int szGuildType = sizeof(GuildType_t); ////////////////////////////////////////////////////////////////////////////// -// (ϴ, Ȱ, ü) +// 길드의 상태(등록대기, 활동, 해체) ////////////////////////////////////////////////////////////////////////////// typedef BYTE GuildState_t; const int szGuildState = sizeof(GuildState_t); ////////////////////////////////////////////////////////////////////////////// -// ( , , Ϲ ) +// 길드멤버의 계급 ( 마스터, 서버마스터, 일반 ) ////////////////////////////////////////////////////////////////////////////// typedef BYTE GuildMemberRank_t; const int szGuildMemberRank = sizeof(GuildMemberRank_t); ////////////////////////////////////////////////////////////////////////////// -// +// 길드의 종족 ////////////////////////////////////////////////////////////////////////////// typedef BYTE GuildRace_t; const int szGuildRace = sizeof(GuildRace_t); ////////////////////////////////////////////////////////////////////////////// -// ǥ +// 길드 투표의 종류 ////////////////////////////////////////////////////////////////////////////// typedef BYTE GuildVoteType_t; const int szGuildVoteType = sizeof(GuildVoteType_t); ////////////////////////////////////////////////////////////////////////////// -// ǥ ID +// 길드 투표의 ID ////////////////////////////////////////////////////////////////////////////// typedef uint GuildVoteID_t; const int szGuildVoteID = sizeof(GuildVoteID_t); ////////////////////////////////////////////////////////////////////////////// -// ̸ ִ +// 길드 이름 최대 길이 ////////////////////////////////////////////////////////////////////////////// const int GUILD_NAME_MAX_LENGTH = 20; ////////////////////////////////////////////////////////////////////////////// -// ִ +// 길드 세금 최대 양 ////////////////////////////////////////////////////////////////////////////// -const Gold_t GUILD_TAX_BALANCE_MAX = 2000000000; // 20 +const Gold_t GUILD_TAX_BALANCE_MAX = 2000000000; // 20억 #endif diff --git a/src/Core/types/ItemTypes.h b/src/Core/types/ItemTypes.h index a66f5e82..ef44f5f4 100644 --- a/src/Core/types/ItemTypes.h +++ b/src/Core/types/ItemTypes.h @@ -9,11 +9,11 @@ #include "SystemTypes.h" -// ItemType : Ŭ ŸԵ +// ItemType : 아이템 클래스 하위의 세부 아이템 타입들 typedef WORD ItemType_t; const uint szItemType = sizeof(ItemType_t); -// Item OptionType +// Item의 OptionType typedef BYTE OptionType_t; const uint szOptionType = sizeof(OptionType_t); @@ -21,19 +21,19 @@ const uint szOptionType = sizeof(OptionType_t); typedef BYTE DefaultOptionSetType_t; const uint szDefaultOptionSetType = sizeof(DefaultOptionSetType_t); -// Item DB ̵ +// Item의 DB 용 아이디 typedef DWORD ItemID_t; const uint szItemID_t = sizeof(ItemID_t); -// StorageID : ϴ +// StorageID : 아이템이 저장된 곳을 지정하는 변수 typedef DWORD StorageID_t; const uint szStorageID = sizeof(StorageID_t); -// ItemClass : class +// ItemClass : 아이템 class typedef BYTE ItemClass_t; const uint szItemClass = sizeof(ItemClass_t); -// +// 아이템의 가격 typedef DWORD Price_t; const uint szPrice = sizeof(Price_t); @@ -53,7 +53,7 @@ const string Volume2String[] = {"0x0", "1x1", "1x2", "1x3", "2x1", "2x2", "2x3"} typedef WORD Weight_t; const uint szWeight = sizeof(Weight_t); -// Storage - Ǵ ġ Ÿ. +// Storage - 아이템이 저장되는 위치를 나타낸다. enum Storage { STORAGE_INVENTORY, // 0 STORAGE_GEAR, // 1 @@ -68,7 +68,7 @@ enum Storage { STORAGE_GARBAGE, // 10 STORAGE_TIMEOVER, // 11 STORAGE_GOODSINVENTORY, // 12 - STORAGE_PET_STASH // 13 // pet + STORAGE_PET_STASH // 13 // pet 보관함 }; typedef BYTE Storage_t; @@ -78,80 +78,80 @@ const uint szStorage = sizeof(Storage_t); typedef DWORD Durability_t; const uint szDurability = sizeof(Durability_t); -// Ÿ +// 사정거리 typedef BYTE Range_t; const uint szRange = sizeof(Range_t); -// Inventory ǥ +// Inventory 좌표 typedef BYTE CoordInven_t; const uint szCoordInven = sizeof(CoordInven_t); -// Ȯ ( ġ ) +// 아이템 생성 확률 (상점 및 몬스터 해치웠을 때) typedef uint Ratio_t; const uint szRatio = sizeof(Ratio_t); -// Item FlagType +// Item의 FlagType typedef BYTE FlagType_t; const uint szFlagType = sizeof(FlagType_t); -// Inventory Item +// Inventory의 Item갯수 typedef BYTE ItemNum_t; const uint szItemNum = sizeof(ItemNum_t); -// , ð +// 내구성, 유지시간 typedef WORD Duration_t; const uint szDuration = sizeof(Duration_t); -// źȯ +// 탄환수 typedef BYTE Bullet_t; const uint szBullet = sizeof(Bullet_t); -// Ÿ ߿ .. ̰ɷ ִ° Ƽ.. +// 사정거리 나중에 지울 것임.. 현재는 이걸로 돼 있는게 넘 많아서.. typedef BYTE Distance_t; const uint szDistance = sizeof(Distance_t); -// º +// 상승부위 typedef BYTE AscentPart_t; const uint szAscentPart = sizeof(AscentPart_t); -// ȭġ +// 변화수치 typedef BYTE PlusValue_t; const uint szPlusValue = sizeof(PlusValue_t); -// ǵ +// 스피드 typedef BYTE Speed_t; const uint szSpeed = sizeof(Speed_t); -// Ʈ ϼ +// 벨트 포켓숫자 typedef BYTE PocketNum_t; const uint szPocketNum = sizeof(PocketNum_t); -// ź +// 폭탄 재료 숫자 typedef BYTE MaterialNum_t; const uint szMaterialNum = sizeof(MaterialNum_t); -// ִ +// 보관함 랙의 최대 숫자 const int STASH_RACK_MAX = 3; -//  ִ ִ +// 보관함 한 랙에 들어갈 수 있는 최대 아이템의 숫자 const int STASH_INDEX_MAX = 20; -// Ÿ +// 은 코팅 타입 typedef unsigned short Silver_t; const uint szSilver = sizeof(Silver_t); -// +// 아이템 등급 typedef int Grade_t; const uint szGrade = sizeof(Grade_t); -// þƮ +// 인첸트 레벨 typedef char EnchantLevel_t; const uint szEnchantLevel = sizeof(EnchantLevel_t); -// +// 성별 관련 제한 요소 enum GenderRestriction { GENDER_BOTH = 0, GENDER_MALE, GENDER_FEMALE, GENDER_MAX }; -// ũ ̺Ʈ Ŭ +// 크리스마스 이벤트 관련 클래스 enum { STAR_COLOR_BLACK = 0, STAR_COLOR_RED, diff --git a/src/Core/types/PlayerTypes.h b/src/Core/types/PlayerTypes.h index a9a042c6..c35bda53 100644 --- a/src/Core/types/PlayerTypes.h +++ b/src/Core/types/PlayerTypes.h @@ -10,7 +10,7 @@ #include "SystemTypes.h" ////////////////////////////////////////////////////////////////////////////// -// ÷̾ ID +// 플레이어 생성 및 변경 관련 에러 ID ////////////////////////////////////////////////////////////////////////////// enum ErrorID { INVALID_ID_PASSWORD, @@ -31,83 +31,83 @@ enum ErrorID { ETC_ERROR, IP_DENYED, CHILDGUARD_DENYED, - CANNOT_AUTHORIZE_BILLING, // ã ϴ. - CANNOT_CREATE_PC_BILLING, // ڰ ƴ϶ ij͸ ϴ. - KEY_EXPIRED, // Ű ȿⰣ . - NOT_FOUND_KEY // Ű . + CANNOT_AUTHORIZE_BILLING, // 빌링 정보를 찾을 수 없습니다. + CANNOT_CREATE_PC_BILLING, // 유료 사용자가 아니라서 캐릭터를 못 만듭니다. + KEY_EXPIRED, // 키 유효기간이 지났다. + NOT_FOUND_KEY // 키가 없다. }; ////////////////////////////////////////////////////////////////////////////// -// ÷̾ ̵ +// 플레이어 아이디 ////////////////////////////////////////////////////////////////////////////// const uint minIDLength = 4; const uint maxIDLength = 10; ////////////////////////////////////////////////////////////////////////////// -// ÷̾ ȣ +// 플레이어 암호 ////////////////////////////////////////////////////////////////////////////// const uint minPasswordLength = 6; const uint maxPasswordLength = 10; ////////////////////////////////////////////////////////////////////////////// -// ÷̾ ̸ +// 플레이어 이름 ////////////////////////////////////////////////////////////////////////////// const uint maxNameLength = 20; ////////////////////////////////////////////////////////////////////////////// -// ֹεϹȣ ( '-' ؾ Ѵ. ) +// 주민등록번호 ( '-' 를 포함해야 한다. ) ////////////////////////////////////////////////////////////////////////////// const uint maxSSNLength = 20; ////////////////////////////////////////////////////////////////////////////// -// ȭ +// 집전화 ////////////////////////////////////////////////////////////////////////////// const uint maxTelephoneLength = 15; ////////////////////////////////////////////////////////////////////////////// -// ޴ +// 휴대폰 ////////////////////////////////////////////////////////////////////////////// const uint maxCellularLength = 15; ////////////////////////////////////////////////////////////////////////////// -// ȣ +// 우편번호 ////////////////////////////////////////////////////////////////////////////// const uint maxZipCodeLength = 7; ////////////////////////////////////////////////////////////////////////////// -// ּ +// 집주소 ////////////////////////////////////////////////////////////////////////////// const uint maxAddressLength = 100; ////////////////////////////////////////////////////////////////////////////// -// ڸ +// 전자메일 ////////////////////////////////////////////////////////////////////////////// const uint maxEmailLength = 50; ////////////////////////////////////////////////////////////////////////////// -// Ȩ +// 홈페이지 ////////////////////////////////////////////////////////////////////////////// const uint maxHomepageLength = 50; ////////////////////////////////////////////////////////////////////////////// -// ڱҰ +// 자기소개글 ////////////////////////////////////////////////////////////////////////////// const uint maxProfileLength = 200; ////////////////////////////////////////////////////////////////////////////// -// +// 국적 ////////////////////////////////////////////////////////////////////////////// typedef BYTE Nation_t; const uint szNation = szBYTE; @@ -118,22 +118,22 @@ const string Nation2String[] = {"KOREA", "USA", "JAPAN"}; ////////////////////////////////////////////////////////////////////////////// -// гƼ Ÿ +// 패널티 타입 ////////////////////////////////////////////////////////////////////////////// enum PenaltyType { - PENALTY_TYPE_KICKED, // - PENALTY_TYPE_MUTE, // Ķ - PENALTY_TYPE_FREEZING, // + PENALTY_TYPE_KICKED, // 나가라 + PENALTY_TYPE_MUTE, // 닥쳐라 + PENALTY_TYPE_FREEZING, // 멈춰라 PENALTY_TYPE_MAX }; ////////////////////////////////////////////////////////////////////////////// -// α +// 로그인 모드 ////////////////////////////////////////////////////////////////////////////// enum LoginMode { - LOGIN_MODE_NORMAL = 0, // ׳ α - LOGIN_MODE_WEBLOGIN, // α + LOGIN_MODE_NORMAL = 0, // 그냥 로그인 + LOGIN_MODE_WEBLOGIN, // 웹에서 로그인 LOGIN_MODE_MAX }; diff --git a/src/Core/types/QuestTypes.h b/src/Core/types/QuestTypes.h index 6d42b17a..4b53f10a 100644 --- a/src/Core/types/QuestTypes.h +++ b/src/Core/types/QuestTypes.h @@ -10,31 +10,31 @@ #include "SystemTypes.h" ////////////////////////////////////////////////////////////////////////////// -// Ʈ ̵ +// 트리거 아이디 ////////////////////////////////////////////////////////////////////////////// typedef DWORD TriggerID_t; const uint szTriggerID = sizeof(TriggerID_t); ////////////////////////////////////////////////////////////////////////////// -// Ʈ ׷ ̵ +// 퀘스트 그룹 아이디 ////////////////////////////////////////////////////////////////////////////// typedef DWORD QuestGroupID_t; const uint szQuestGroupID = sizeof(QuestGroupID_t); ////////////////////////////////////////////////////////////////////////////// -// Ʈ ̵ +// 퀘스트 아이디 ////////////////////////////////////////////////////////////////////////////// typedef DWORD QuestID_t; const uint szQuestID = sizeof(QuestID_t); ////////////////////////////////////////////////////////////////////////////// -// Ʈ ܰ +// 퀘스트 수행할 단계 ////////////////////////////////////////////////////////////////////////////// typedef DWORD QuestGrade_t; const uint szQuestGrade = sizeof(QuestGrade_t); ////////////////////////////////////////////////////////////////////////////// -// Ʈ ǰ +// 퀘스트 보상품 ////////////////////////////////////////////////////////////////////////////// typedef DWORD RewardID_t; const uint szRewardID = sizeof(RewardID_t); @@ -43,42 +43,42 @@ typedef WORD RewardClass_t; const uint szRewardClass = sizeof(RewardClass_t); ////////////////////////////////////////////////////////////////////////////// -// Ÿ +// 컨디션 타입 ////////////////////////////////////////////////////////////////////////////// typedef WORD ConditionType_t; const uint szConditionType = sizeof(ConditionType_t); ////////////////////////////////////////////////////////////////////////////// -// ׼ Ÿ +// 액션 타입 ////////////////////////////////////////////////////////////////////////////// typedef WORD ActionType_t; const uint szActionType = sizeof(ActionType_t); ////////////////////////////////////////////////////////////////////////////// -// ũƮ Ÿ +// 스크립트 타입 ////////////////////////////////////////////////////////////////////////////// enum ScriptType { PUBLIC_SCRIPT, PRIVATE_SCRIPT }; const uint szScriptType = sizeof(BYTE); const string ScriptType2String[] = {"PUBLIC_SCRIPT", "PRIVATE_SCRIPT"}; ////////////////////////////////////////////////////////////////////////////// -// ũƮ ̵ Ÿ +// 스크립트 아이디 타입 ////////////////////////////////////////////////////////////////////////////// typedef DWORD ScriptID_t; const uint szScriptID = sizeof(ScriptID_t); ////////////////////////////////////////////////////////////////////////////// -// ũƮ ȣ Ÿ +// 스크립트 대답 번호 타입 ////////////////////////////////////////////////////////////////////////////// typedef BYTE AnswerID_t; const uint szAnswerID = sizeof(AnswerID_t); ////////////////////////////////////////////////////////////////////////////// -// Ÿ +// 반지름 타입 ////////////////////////////////////////////////////////////////////////////// typedef BYTE Radius_t; const uint szRadius = sizeof(Radius_t); diff --git a/src/Core/types/ShopTypes.h b/src/Core/types/ShopTypes.h index b63106be..46be16b1 100644 --- a/src/Core/types/ShopTypes.h +++ b/src/Core/types/ShopTypes.h @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : ShopTypes.h -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -11,7 +11,7 @@ #include "SystemTypes.h" ////////////////////////////////////////////////////////////////////////////// -// â +// 상점의 진열창 종류 ////////////////////////////////////////////////////////////////////////////// typedef BYTE ShopRackType_t; const int szShopRackType = sizeof(ShopRackType_t); @@ -20,27 +20,27 @@ enum SHOP_RACK_TYPE { SHOP_RACK_NORMAL, SHOP_RACK_SPECIAL, SHOP_RACK_MYSTERIOUS, ////////////////////////////////////////////////////////////////////////////// -// â ũ ε +// 상점 진열창의 크기 및 인덱스 ////////////////////////////////////////////////////////////////////////////// const int SHOP_RACK_INDEX_MAX = 5 * 4; // width*height = 20 ////////////////////////////////////////////////////////////////////////////// -// Ÿ üũ ̴ ڷ +// 상점 런타임 버전 체크에 쓰이는 자료형 ////////////////////////////////////////////////////////////////////////////// typedef int32_t ShopVersion_t; const int szShopVersion = sizeof(ShopVersion_t); ////////////////////////////////////////////////////////////////////////////// -// ǰ ڵ ̴ DB table ̴ ID +// 상점 상품 자동 생성에 쓰이는 DB table에 쓰이는 ID ////////////////////////////////////////////////////////////////////////////// typedef uint ShopTemplateID_t; const int szShopTemplateID = sizeof(ShopTemplateID_t); ////////////////////////////////////////////////////////////////////////////// -// ϴ ̴ ü Ÿ +// 상점 가격 변동을 결정하는 데 쓰이는 시세 변수의 타입 ////////////////////////////////////////////////////////////////////////////// typedef short MarketCond_t; const int szMarketCond = sizeof(MarketCond_t); diff --git a/src/Core/types/ZoneTypes.h b/src/Core/types/ZoneTypes.h index 52bf7465..da7366b7 100644 --- a/src/Core/types/ZoneTypes.h +++ b/src/Core/types/ZoneTypes.h @@ -15,21 +15,21 @@ #define LIGHT_MAX 15 ////////////////////////////////////////////////////////////////////////////// -// ׷ ̵ : ׷ Ŵ ϴ identifier̴. +// 존 그룹 아이디 : 존 그룹 매니저에서 존을 구분하는 identifier이다. ////////////////////////////////////////////////////////////////////////////// typedef WORD ZoneGroupID_t; const uint szZoneGroupID = sizeof(ZoneGroupID_t); ////////////////////////////////////////////////////////////////////////////// -// ̵ : Ŵ ϴ identifier̴. +// 존 아이디 : 존 매니저에서 존을 구분하는 identifier이다. ////////////////////////////////////////////////////////////////////////////// typedef WORD ZoneID_t; const uint szZoneID = sizeof(ZoneID_t); ////////////////////////////////////////////////////////////////////////////// -// +// 존 레벨 ////////////////////////////////////////////////////////////////////////////// typedef BYTE ZoneLevel_t; const uint szZoneLevel = sizeof(ZoneLevel_t); @@ -44,7 +44,7 @@ const BYTE OUSTERS_SAFE_ZONE = 0x10; ////////////////////////////////////////////////////////////////////////////// -// / ũ +// 존의 가로/세로 크기 ////////////////////////////////////////////////////////////////////////////// const uint maxZoneWidth = 256; const uint maxZoneHeight = 256; @@ -54,7 +54,7 @@ const uint szZoneCoord = sizeof(ZoneCoord_t); ////////////////////////////////////////////////////////////////////////////// -// , +// 존의 날씨, 날씨 레벨 ////////////////////////////////////////////////////////////////////////////// const uint szWeather = szBYTE; @@ -63,20 +63,20 @@ enum Weather { WEATHER_CLEAR, WEATHER_RAINY, WEATHER_SNOWY, WEATHER_MAX }; const string Weather2String[] = {"WEATHER_CLEAR", "WEATHER_RAINY", "WEATHER_SNOWY"}; -// 1 - 20 , Ÿ ̴. +// 1 - 20 사이의 정수로, 비나 눈의 양을 나타내는 단위이다. typedef BYTE WeatherLevel_t; const uint szWeatherLevel = sizeof(WeatherLevel_t); ////////////////////////////////////////////////////////////////////////////// -// NPC Monster ִ +// 존에서의 NPC와 Monster 종류의 최대 개수 ////////////////////////////////////////////////////////////////////////////// const uint maxNPCPerZone = 255; const uint maxMonsterPerZone = 255; ////////////////////////////////////////////////////////////////////////////// -// ӱ +// 존의 어둡기와 밝기 ////////////////////////////////////////////////////////////////////////////// typedef BYTE DarkLevel_t; const uint szDarkLevel = sizeof(DarkLevel_t); diff --git a/src/server/GameServerInfo.h b/src/server/GameServerInfo.h index f50e01c9..0b7607cf 100644 --- a/src/server/GameServerInfo.h +++ b/src/server/GameServerInfo.h @@ -2,7 +2,7 @@ // // Filename : GameServerInfo.h // Written By : Reiot -// Description : α ִ +// Description : 로그인 서버에서 갖고 있는 각 게임 서버에 대한 정보 // //---------------------------------------------------------------------- @@ -19,8 +19,8 @@ // // class GameServerInfo; // -// GAME DB GameServerInfo ̺ о -// Ŭ̴. +// GAME DB의 GameServerInfo 테이블에서 읽어들인 각 게임 서버의 정보를 +// 담은 클래스이다. // //---------------------------------------------------------------------- diff --git a/src/server/GameServerInfoManager.cpp b/src/server/GameServerInfoManager.cpp index 485e0bf7..85a0fb7a 100644 --- a/src/server/GameServerInfoManager.cpp +++ b/src/server/GameServerInfoManager.cpp @@ -24,10 +24,10 @@ GameServerInfoManager::~GameServerInfoManager() { void GameServerInfoManager::clear() { - // hashmap pair second, GameServerInfo ü ϰ - // pair ü ״ д. (GameServerInfo Ǿ ִٴ Ϳ - // ϶. ʻ ؾ Ѵ. ϱ, GSIM destruct ȴٴ - // α ˴ٿȴٴ ǹϴϱ.. - -;) + // hashmap 안의 각 pair 의 second, 즉 GameServerInfo 객체만을 삭제하고 + // pair 자체는 그대로 둔다. (GameServerInfo가 힙에 생성되어 있다는 것에 + // 유의하라. 즉 필살삭제를 해야 한다. 하긴, GSIM이 destruct 된다는 것은 + // 로그인 서버가 셧다운된다는 것을 의미하니깐.. - -;) for (int j = 1; j < m_MaxWorldID; j++) { for (int i = 0; i < m_MaxServerGroupID; i++) { HashMapGameServerInfo::iterator itr = m_pGameServerInfos[j][i].begin(); @@ -35,7 +35,7 @@ void GameServerInfoManager::clear() { SAFE_DELETE(itr->second); } - // ؽʾȿ ִ pair Ѵ. + // 이제 해쉬맵안에 있는 모든 pair 들을 삭제한다. m_pGameServerInfos[j][i].clear(); } } @@ -68,7 +68,7 @@ void GameServerInfoManager::load() { Statement* pStmt = NULL; - // MAX SERVER GROUP ID о鿩 Ѵ. + // 먼저 MAX SERVER GROUP ID를 읽어들여야 한다. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); Result* pResult = pStmt->executeQueryString("SELECT MAX(GroupID) FROM GameServerInfo"); @@ -142,12 +142,12 @@ for (uint i = 0 ; i < m_Width ; i++) m_pTiles[i] = new Tile [m_Height]; END_DB(pStmt) /////////////////////////////////////////////////////////////////////////////// - // PK Server ϱ - // DB PKServerList ̺ о Ѵ. - // PKServerList ÷̾(login) DB ִ. + // PK Server 세팅하기 + // DB의 PKServerList 테이블에서 읽어서 세팅한다. + // PKServerList 는 플레이어(login) DB 에 있다. /////////////////////////////////////////////////////////////////////////////// BEGIN_DB { - // PKServerList ÷̾(login) DB ִ. + // PKServerList 는 플레이어(login) DB 에 있다. pStmt = g_pDatabaseManager->getDistConnection("DARKEDEN")->createStatement(); Result* pResult = pStmt->executeQueryString("SELECT WorldID, ServerGroupID FROM NonPKServerList"); @@ -167,11 +167,11 @@ for (uint i = 0 ; i < m_Width ; i++) m_pTiles[i] = new Tile [m_Height]; END_DB(pStmt) /////////////////////////////////////////////////////////////////////////////// - // Castle Stat ε - //  ٲ + // Castle Stat 로딩 + // 이 서버에서 어떤 서버의 전쟁 결과에 따라 바뀌는지 /////////////////////////////////////////////////////////////////////////////// BEGIN_DB { - // ÷̾(login) DB ִ. + // 플레이어(login) DB 에 있다. pStmt = g_pDatabaseManager->getDistConnection("DARKEDEN")->createStatement(); Result* pResult = pStmt->executeQueryString("SELECT WorldID, ServerGroupID, FollowServerID FROM CastleStatInfo"); @@ -234,13 +234,13 @@ void GameServerInfoManager::deleteGameServerInfo(const ServerID_t ServerID, cons HashMapGameServerInfo::iterator itr = m_pGameServerInfos[WorldID][ServerGroupID].find(ServerID); if (itr != m_pGameServerInfos[WorldID][ServerGroupID].end()) { - // GameServerInfo Ѵ. + // GameServerInfo 를 삭제한다. delete itr->second; - // pair Ѵ. + // pair를 삭제한다. m_pGameServerInfos[WorldID][ServerGroupID].erase(itr); } else { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없을 때 throw NoSuchElementException(); } @@ -266,7 +266,7 @@ GameServerInfo * GameServerInfoManager::getGameServerInfo (const string & nickna } else { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없었을 때 throw NoSuchElementException(nickname); } @@ -284,7 +284,7 @@ GameServerInfo* GameServerInfoManager::getGameServerInfo(const ServerID_t Server GameServerInfo* pGameServerInfo = NULL; if (WorldID >= m_MaxWorldID || ServerGroupID >= m_MaxServerGroupID) { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없었을 때 throw NoSuchElementException(); } @@ -293,7 +293,7 @@ GameServerInfo* GameServerInfoManager::getGameServerInfo(const ServerID_t Server if (itr != m_pGameServerInfos[WorldID][ServerGroupID].end()) { pGameServerInfo = itr->second; } else { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없었을 때 throw NoSuchElementException(); } diff --git a/src/server/GameServerInfoManager.h b/src/server/GameServerInfoManager.h index 299dba05..50d09c24 100644 --- a/src/server/GameServerInfoManager.h +++ b/src/server/GameServerInfoManager.h @@ -17,8 +17,8 @@ typedef unordered_map HashMapGameServerInfo; ////////////////////////////////////////////////////////////////////////////// // class GameServerInfoManager; -// ID Ű ϴ GameServerInfo unordered_map -// ο ִ. +// 게임 서버의 ID 를 키값으로 하는 GameServerInfo의 unordered_map 을 +// 내부에 가지고 있다. ////////////////////////////////////////////////////////////////////////////// class GameServerInfoManager { diff --git a/src/server/GameWorldInfo.h b/src/server/GameWorldInfo.h index 24b8cb9d..e6b59693 100644 --- a/src/server/GameWorldInfo.h +++ b/src/server/GameWorldInfo.h @@ -2,7 +2,7 @@ // // Filename : GameWorldInfo.h // Written By : Reiot -// Description : α ִ +// Description : 로그인 서버에서 갖고 있는 각 게임 서버에 대한 정보 // //---------------------------------------------------------------------- @@ -19,8 +19,8 @@ // // class GameWorldInfo; // -// GAME DB GameWorldInfo ̺ о -// Ŭ̴. +// GAME DB의 GameWorldInfo 테이블에서 읽어들인 각 게임 서버의 정보를 +// 담은 클래스이다. // //---------------------------------------------------------------------- diff --git a/src/server/GameWorldInfoManager.cpp b/src/server/GameWorldInfoManager.cpp index 54164fb1..f47f16af 100644 --- a/src/server/GameWorldInfoManager.cpp +++ b/src/server/GameWorldInfoManager.cpp @@ -23,16 +23,16 @@ GameWorldInfoManager::GameWorldInfoManager() {} // destructor //---------------------------------------------------------------------- GameWorldInfoManager::~GameWorldInfoManager() throw() { - // hashmap pair second, GameWorldInfo ü ϰ - // pair ü ״ д. (GameWorldInfo Ǿ ִٴ Ϳ - // ϶. ʻ ؾ Ѵ. ϱ, GSIM destruct ȴٴ - // α ˴ٿȴٴ ǹϴϱ.. - -; ) + // hashmap 안의 각 pair 의 second, 즉 GameWorldInfo 객체만을 삭제하고 + // pair 자체는 그대로 둔다. (GameWorldInfo가 힙에 생성되어 있다는 것에 + // 유의하라. 즉 필살삭제를 해야 한다. 하긴, GSIM이 destruct 된다는 것은 + // 로그인 서버가 셧다운된다는 것을 의미하니깐.. - -; ) for (HashMapGameWorldInfo::iterator itr = m_GameWorldInfos.begin(); itr != m_GameWorldInfos.end(); itr++) { delete itr->second; itr->second = NULL; } - // ؽʾȿ ִ pair Ѵ. + // 이제 해쉬맵안에 있는 모든 pair 들을 삭제한다. m_GameWorldInfos.clear(); } @@ -79,11 +79,11 @@ void GameWorldInfoManager::load() { } cout << "End GameWorldInfoManager Load" << endl; - // ʻ ! + // 필살 삭제! SAFE_DELETE(pStmt); } catch (SQLQueryException& sqe) { - // ʻ ! + // 필살 삭제! SAFE_DELETE(pStmt); throw Error(sqe.toString()); @@ -140,14 +140,14 @@ void GameWorldInfoManager::deleteGameWorldInfo(const WorldID_t ID) { HashMapGameWorldInfo::iterator itr = m_GameWorldInfos.find(ID); if (itr != m_GameWorldInfos.end()) { - // GameWorldInfo Ѵ. + // GameWorldInfo 를 삭제한다. delete itr->second; - // pair Ѵ. + // pair를 삭제한다. m_GameWorldInfos.erase(itr); } else { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없을 때 throw NoSuchElementException(); } @@ -167,7 +167,7 @@ GameWorldInfo* GameWorldInfoManager::getGameWorldInfo(const WorldID_t ID) const if (itr != m_GameWorldInfos.end()) { pGameWorldInfo = itr->second; } else { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없었을 때 throw NoSuchElementException(); } @@ -193,7 +193,7 @@ string GameWorldInfoManager::toString() const { //-------------------------------------------------- // *OPTIMIZATION* // - // for_each() + // for_each()를 사용할 것 //-------------------------------------------------- for (HashMapGameWorldInfo::const_iterator itr = m_GameWorldInfos.begin(); itr != m_GameWorldInfos.end(); itr++) msg << itr->second->toString() << '\n'; diff --git a/src/server/GameWorldInfoManager.h b/src/server/GameWorldInfoManager.h index 9b0a3e7a..ed6ab633 100644 --- a/src/server/GameWorldInfoManager.h +++ b/src/server/GameWorldInfoManager.h @@ -22,8 +22,8 @@ typedef unordered_map HashMapGameWorldInfo; // // class GameWorldInfoManager; // -// ID Ű ϴ GameWorldInfo unordered_map -// ο ִ. +// 게임 서버의 ID 를 키값으로 하는 GameWorldInfo의 unordered_map 을 +// 내부에 가지고 있다. // //---------------------------------------------------------------------- diff --git a/src/server/IncomingPlayerManager.cpp b/src/server/IncomingPlayerManager.cpp index 08b359ad..7948a90f 100644 --- a/src/server/IncomingPlayerManager.cpp +++ b/src/server/IncomingPlayerManager.cpp @@ -40,7 +40,7 @@ ////////////////////////////////////////////////////////////////////////////// // constructor -// Ŵ Ÿ Ѵ. +// 하위 매니저 및 데이타 멤버들을 생성한다. ////////////////////////////////////////////////////////////////////////////// IncomingPlayerManager::IncomingPlayerManager() throw(Error) @@ -67,10 +67,10 @@ IncomingPlayerManager::IncomingPlayerManager() throw(Error) m_pServerSocket->setNonBlocking(); - // ũ͸ Ѵ. + // 서버 소켓 디스크립터를 지정한다. m_SocketID = m_pServerSocket->getSOCKET(); } catch (NoSuchElementException& nsee) { - // ȯ Ͽ ׷ element + // 환경 파일에 그런 element가 없을 경우 throw Error(nsee.toString()); } @@ -94,34 +94,34 @@ IncomingPlayerManager::~IncomingPlayerManager() throw(Error) { ////////////////////////////////////////////////////////////////////////////// -// Ŵ ʱȭѴ. +// 하위 매니저 및 데이터 멤버를 초기화한다. ////////////////////////////////////////////////////////////////////////////// void IncomingPlayerManager::init() throw(Error) { __BEGIN_TRY - // fd_set 0 ʱȭѴ. + // fd_set 들을 0 으로 초기화한다. FD_ZERO(&m_ReadFDs[0]); FD_ZERO(&m_WriteFDs[0]); FD_ZERO(&m_ExceptFDs[0]); - // Ʈ Ҵ. (write üũ ʿ䰡 .) + // 서버 소켓의 비트를 켠다. (write 는 체크할 필요가 없다.) FD_SET(m_SocketID, &m_ReadFDs[0]); FD_SET(m_SocketID, &m_ExceptFDs[0]); // set min/max fd m_MinFD = m_MaxFD = m_SocketID; - // m_Timeout ʱȭѴ. - // ߿ ֱ ɼ óϵ . - // ZonePlayerManager ؼ  ϴ..... + // m_Timeout 을 초기화한다. + // 나중에는 이 주기 역시 옵션으로 처리하도록 하자. + // ZonePlayerManager에 비해서 길어도 무방하다..... m_Timeout[0].tv_sec = 0; m_Timeout[0].tv_usec = 0; /* - // connection info manager ʱȭѴ. - // αμκ ޾ƾ .. - // ϴ 210.220.188.161 ~ 180 صд. + // connection info manager 를 초기화한다. + // 원래는 로그인서버로부터 받아야 하지만.. + // 일단 210.220.188.161 ~ 180 까지 등록해둔다. char buf[20]; for (int i = 0 ; i < 20 ; i ++) { @@ -148,7 +148,7 @@ void IncomingPlayerManager::init() throw(Error) { cout << "******************************************************" << endl; /* - // Login DB PCRoomDBInfo Table о Connection + // Login DB 의 PCRoomDBInfo Table 읽어서 Connection 만들기 pStmt = pDistConnection->createStatement(); Result * pResult = NULL; @@ -175,7 +175,7 @@ void IncomingPlayerManager::init() throw(Error) { } */ - // Player.LogOn ش. + // Player.LogOn 를 정리해준다. Statement* pStmt = NULL; Statement* pStmt2 = NULL; BEGIN_DB { @@ -191,8 +191,8 @@ void IncomingPlayerManager::init() throw(Error) { "SELECT PlayerID from Player WHERE LogOn='GAME' AND CurrentWorldID=%d AND CurrentServerGroupID=%d", g_pConfig->getPropertyInt("WorldID"), g_pConfig->getPropertyInt("ServerID")); - // ׹濡 ֵ ش. - // ~ by sigi 2002.5.31 + // 겜방에서 놀던애들 정리해준다. + // 빌링~ by sigi 2002.5.31 while (pResult->next()) { string playerID = pResult->getString(1); @@ -204,7 +204,7 @@ void IncomingPlayerManager::init() throw(Error) { g_pConfig->getPropertyInt("WorldID"), g_pConfig->getPropertyInt("ServerID")); /* - // ι ϴ° . by sigi. 2002.5.9 + // 두번 하는거 제거. by sigi. 2002.5.9 pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery("DELETE FROM UserIPInfo WHERE ServerID = %d", g_pConfig->getPropertyInt("ServerID") ); */ @@ -259,35 +259,35 @@ void IncomingPlayerManager::broadcast(Packet* pPacket) throw(Error) { ////////////////////////////////////////////////////////////////////////////// // call select() system call -// TimeoutException ÷̾ ó ʾƵ ȴ. +// 상위에서 TimeoutException 을 받으면 플레이어는 처리하지 않아도 된다. ////////////////////////////////////////////////////////////////////////////// void IncomingPlayerManager::select() throw(TimeoutException, InterruptedException, Error) { __BEGIN_TRY //__ENTER_CRITICAL_SECTION(m_Mutex) - // m_Timeout[0] m_Timeout[1] Ѵ. + // m_Timeout[0] 을 m_Timeout[1] 으로 복사한다. m_Timeout[1].tv_sec = m_Timeout[0].tv_sec; m_Timeout[1].tv_usec = m_Timeout[0].tv_usec; - // m_XXXFDs[0] m_XXXFDs[1] Ѵ. + // m_XXXFDs[0] 을 m_XXXFDs[1] 으로 복사한다. m_ReadFDs[1] = m_ReadFDs[0]; m_WriteFDs[1] = m_WriteFDs[0]; m_ExceptFDs[1] = m_ExceptFDs[0]; try { - // m_XXXFDs[1] select() ȣѴ. + // 이제 m_XXXFDs[1] 을 가지고 select() 를 호출한다. SocketAPI::select_ex(m_MaxFD + 1, &m_ReadFDs[1], &m_WriteFDs[1], &m_ExceptFDs[1], &m_Timeout[1]); } /* - // ּó by sigi. 2002.5.14 + // 주석처리 by sigi. 2002.5.14 catch (TimeoutException&) { // do nothing } */ catch (InterruptedException& ie) { - // ñ׳ ~~ + // 시그널이 올 리가 엄찌~~ log(LOG_GAMESERVER_ERROR, "", "", ie.toString()); } @@ -299,9 +299,9 @@ void IncomingPlayerManager::select() throw(TimeoutException, InterruptedExceptio ////////////////////////////////////////////////////////////////////////////// // process all players' inputs -// read flag , ο Ƿ -// ̸ óϰ, ٸ read flag , ο Ŷ -// Ƿ ÷̾ processInput() ȣϸ ȴ. +// 서버 소켓의 read flag가 켜졌을 경우, 새로운 접속이 들어왔으므로 +// 이를 처리하고, 다른 소켓의 read flag가 켜졌을 경우, 새로운 패킷이 +// 들어왔으므로 그 플레이어의 processInput()을 호출하면 된다. ////////////////////////////////////////////////////////////////////////////// void IncomingPlayerManager::processInputs() throw(IOException, Error) { __BEGIN_TRY @@ -319,9 +319,9 @@ void IncomingPlayerManager::processInputs() throw(IOException, Error) { for (int i = m_MinFD; i <= m_MaxFD; i++) { if (FD_ISSET(i, &m_ReadFDs[1])) { if (i == m_SocketID) { - // ο ߴٴ ̴. + // 서버 소켓일 경우 새로운 연결이 도착했다는 뜻이다. // by sigi. 2002.12.8 - for (int i = 0; i < 50; i++) // 50 - -; + for (int i = 0; i < 50; i++) // 50명만 받자 - -; { if (!acceptNewConnection()) break; @@ -337,7 +337,7 @@ void IncomingPlayerManager::processInputs() throw(IOException, Error) { pTempPlayer->getID().c_str(), (int)pTempPlayer->getPlayerStatus()); try { - // ̹ ǾǷ, ۸ ÷ؼ ȵȴ. + // 이미 연결이 종료되었으므로, 출력 버퍼를 플러시해서는 안된다. pTempPlayer->disconnect(DISCONNECTED); } catch (Throwable& t) { cerr << t.toString() << endl; @@ -348,10 +348,10 @@ void IncomingPlayerManager::processInputs() throw(IOException, Error) { // UserGateway::getInstance()->passUser( // UserGateway::USER_OUT_INCOMING_INPUT_ERROR ); - // ÷̾ ٴ ? ٸ ų, - // ٸ deletePlayer ϴ . - // PlayerManager Player ִ. - // ProcessCommand ٴ ̴. + // 플레이어가 없다는 말은? 다른 곳에서 지워 졌거나, + // 다른 곳에서 deletePlayer를 하는 곳은 없다. + // 오로지 각 PlayerManager에서만 Player를 지울 수 있다. + // ProcessCommand에서 사라졌다는 말이다. filelog("deletePlayer.log", "called in IncomingPlayerManager.cpp line 385"); deletePlayer(i); deleteQueuePlayer(pTempPlayer); @@ -368,9 +368,9 @@ void IncomingPlayerManager::processInputs() throw(IOException, Error) { "[Input] %s, PlayerID : %s, PlayerStatus : %d", ce.toString().c_str(), pTempPlayer->getID().c_str(), (int)pTempPlayer->getPlayerStatus()); - // Blocking ̹Ƿ, ConnectException Error  ܵ ߻ ʴ´. - // , αϰ ÷̾ Ŀ (εǾٸ) - // ÷̾ ü Ѵ. + // Blocking 소켓이므로, ConnectException과 Error를 제외한 어떤 예외도 발생하지 않는다. + // 연결이 끊겼을 경우, 로그하고 플레이어 정보를 저장한 후에 (로드되었다면) + // 플레이어 객체를 삭제한다. try { pTempPlayer->disconnect(); } catch (Throwable& t) { @@ -381,10 +381,10 @@ void IncomingPlayerManager::processInputs() throw(IOException, Error) { // UserGateway::getInstance()->passUser( // UserGateway::USER_OUT_INCOMING_INPUT_DISCONNECT ); - // ÷̾ ٴ ? ٸ ų, - // ٸ deletePlayer ϴ . - // PlayerManager Player ִ. - // ProcessCommand ٴ ̴. + // 플레이어가 없다는 말은? 다른 곳에서 지워 졌거나, + // 다른 곳에서 deletePlayer를 하는 곳은 없다. + // 오로지 각 PlayerManager에서만 Player를 지울 수 있다. + // ProcessCommand에서 사라졌다는 말이다. filelog("deletePlayer.log", "called in IncomingPlayerManager.cpp line 422"); deletePlayer(i); deleteQueuePlayer(pTempPlayer); @@ -434,7 +434,7 @@ void IncomingPlayerManager::processCommands() throw(IOException, Error) { FILELOG_INCOMING_CONNECTION("ICMPCSocketErr.log", "[Command] PlayerID : %s, PlayerStatus : %d", pTempPlayer->getID().c_str(), (int)pTempPlayer->getPlayerStatus()); try { - // ̹ ǾǷ, ۸ ÷ؼ ȵȴ. + // 이미 연결이 종료되었으므로, 출력 버퍼를 플러시해서는 안된다. pTempPlayer->disconnect(); } catch (Throwable& t) { cerr << t.toString() << endl; @@ -443,10 +443,10 @@ void IncomingPlayerManager::processCommands() throw(IOException, Error) { // by sigi. 2002.12.30 // UserGateway::getInstance()->passUser( UserGateway::USER_OUT_INCOMING_COMMAND_ERROR ); - // ÷̾ ٴ ? ٸ ų, - // ٸ deletePlayer ϴ . - // PlayerManager Player ִ. - // ProcessCommand ٴ ̴. + // 플레이어가 없다는 말은? 다른 곳에서 지워 졌거나, + // 다른 곳에서 deletePlayer를 하는 곳은 없다. + // 오로지 각 PlayerManager에서만 Player를 지울 수 있다. + // ProcessCommand에서 사라졌다는 말이다. filelog("deletePlayer.log", "called in IncomingPlayerManager.cpp line 491"); deletePlayer(i); deleteQueuePlayer(pTempPlayer); @@ -465,7 +465,7 @@ void IncomingPlayerManager::processCommands() throw(IOException, Error) { pTempPlayer->processCommand(false); } catch (ProtocolException& pe) { try { - // chengh 2005 08 16 ע͵䣬Ϊĵlogļ + // chengh 2005 08 16 鬧姦딜苟충侶얌,맣槨渴놔댄轎괩匡돨log匡숭; // FILELOG_INCOMING_CONNECTION( "ICMPCProtocolExcpt.log", "[Command] %s, PlayerID : %s, // PlayerStatus : %d", pe.toString().c_str(), pTempPlayer->getID().c_str(), // (int)pTempPlayer->getPlayerStatus() ); @@ -481,10 +481,10 @@ void IncomingPlayerManager::processCommands() throw(IOException, Error) { // UserGateway::getInstance()->passUser( // UserGateway::USER_OUT_INCOMING_COMMAND_DISCONNECT ); - // ÷̾ ٴ ? ٸ ų, - // ٸ deletePlayer ϴ . - // PlayerManager Player ִ. - // ProcessCommand ٴ ̴. + // 플레이어가 없다는 말은? 다른 곳에서 지워 졌거나, + // 다른 곳에서 deletePlayer를 하는 곳은 없다. + // 오로지 각 PlayerManager에서만 Player를 지울 수 있다. + // ProcessCommand에서 사라졌다는 말이다. filelog("deletePlayer.log", "called in IncomingPlayerManager.cpp line 535"); deletePlayer(i); deleteQueuePlayer(pTempPlayer); @@ -547,7 +547,7 @@ void IncomingPlayerManager::processOutputs() throw(IOException, Error) { FILELOG_INCOMING_CONNECTION("ICMPOSocketErr.log", "[Output] PlayerID : %s, PlayerStatus : %d", pTempPlayer->getID().c_str(), (int)pTempPlayer->getPlayerStatus()); try { - // ̹ ǾǷ, ۸ ÷ؼ ȵȴ. + // 이미 연결이 종료되었으므로, 출력 버퍼를 플러시해서는 안된다. pTempPlayer->disconnect(DISCONNECTED); } catch (Throwable& t) { cerr << t.toString() << endl; @@ -557,10 +557,10 @@ void IncomingPlayerManager::processOutputs() throw(IOException, Error) { // UserGateway::getInstance()->passUser( // UserGateway::USER_OUT_INCOMING_OUTPUT_ERROR ); - // ÷̾ ٴ ? ٸ ų, - // ٸ deletePlayer ϴ . - // PlayerManager Player ִ. - // ProcessCommand ٴ ̴. + // 플레이어가 없다는 말은? 다른 곳에서 지워 졌거나, + // 다른 곳에서 deletePlayer를 하는 곳은 없다. + // 오로지 각 PlayerManager에서만 Player를 지울 수 있다. + // ProcessCommand에서 사라졌다는 말이다. filelog("deletePlayer.log", "called in IncomingPlayerManager.cpp line 619"); deletePlayer(i); deleteQueuePlayer(pTempPlayer); @@ -581,7 +581,7 @@ void IncomingPlayerManager::processOutputs() throw(IOException, Error) { log(LOG_GAMESERVER_ERROR, "", "", msg.toString()); try { - // ̹ ǾǷ, ۸ ÷ؼ ȵȴ. + // 이미 연결이 종료되었으므로, 출력 버퍼를 플러시해서는 안된다. pTempPlayer->disconnect(DISCONNECTED); } catch (Throwable& t) { cerr << t.toString() << endl; @@ -591,10 +591,10 @@ void IncomingPlayerManager::processOutputs() throw(IOException, Error) { // UserGateway::getInstance()->passUser( // UserGateway::USER_OUT_INCOMING_OUTPUT_DISCONNECT ); - // ÷̾ ٴ ? ٸ ų, - // ٸ deletePlayer ϴ . - // PlayerManager Player ִ. - // ProcessCommand ٴ ̴. + // 플레이어가 없다는 말은? 다른 곳에서 지워 졌거나, + // 다른 곳에서 deletePlayer를 하는 곳은 없다. + // 오로지 각 PlayerManager에서만 Player를 지울 수 있다. + // ProcessCommand에서 사라졌다는 말이다. filelog("deletePlayer.log", "called in IncomingPlayerManager.cpp line 659"); deletePlayer(i); deleteQueuePlayer(pTempPlayer); @@ -611,7 +611,7 @@ void IncomingPlayerManager::processOutputs() throw(IOException, Error) { msg << "DISCONNECT " << pTempPlayer->getID() << "(" << cp.toString() << ")"; log(LOG_GAMESERVER_ERROR, "", "", cp.toString()); - // ̹ ǾǷ, ۸ ÷ؼ ȵȴ. + // 이미 연결이 종료되었으므로, 출력 버퍼를 플러시해서는 안된다. try { pTempPlayer->disconnect(DISCONNECTED); @@ -623,10 +623,10 @@ void IncomingPlayerManager::processOutputs() throw(IOException, Error) { // UserGateway::getInstance()->passUser( // UserGateway::USER_OUT_INCOMING_OUTPUT_DISCONNECT2 ); - // ÷̾ ٴ ? ٸ ų, - // ٸ deletePlayer ϴ . - // PlayerManager Player ִ. - // ProcessCommand ٴ ̴. + // 플레이어가 없다는 말은? 다른 곳에서 지워 졌거나, + // 다른 곳에서 deletePlayer를 하는 곳은 없다. + // 오로지 각 PlayerManager에서만 Player를 지울 수 있다. + // ProcessCommand에서 사라졌다는 말이다. filelog("deletePlayer.log", "called in IncomingPlayerManager.cpp line 694"); deletePlayer(i); deleteQueuePlayer(pTempPlayer); @@ -651,8 +651,8 @@ void IncomingPlayerManager::processOutputs() throw(IOException, Error) { ////////////////////////////////////////////////////////////////////////////// // process all players' exceptions -// OOB Ÿ ȹ . -// , OOB ִٸ ϰ Ȯ © . +// 현재까지는 OOB 데이타를 전송할 계획은 없다. +// 따라서, 만약 OOB가 켜져 있다면 에러로 간주하고 접속을 확 짤라 버린다. ////////////////////////////////////////////////////////////////////////////// void IncomingPlayerManager::processExceptions() throw(IOException, Error) { @@ -691,10 +691,10 @@ void IncomingPlayerManager::processExceptions() throw(IOException, Error) { // UserGateway::getInstance()->passUser( UserGateway::USER_OUT_INCOMING_EXCEPTION //); - // ÷̾ ٴ ? ٸ ų, - // ٸ deletePlayer ϴ . - // PlayerManager Player ִ. - // ProcessCommand ٴ ̴. + // 플레이어가 없다는 말은? 다른 곳에서 지워 졌거나, + // 다른 곳에서 deletePlayer를 하는 곳은 없다. + // 오로지 각 PlayerManager에서만 Player를 지울 수 있다. + // ProcessCommand에서 사라졌다는 말이다. filelog("deletePlayer.log", "called in IncomingPlayerManager.cpp line 769"); deletePlayer(i); deleteQueuePlayer(pTempPlayer); @@ -717,7 +717,7 @@ void IncomingPlayerManager::processExceptions() throw(IOException, Error) { ////////////////////////////////////////////////////////////////////////////// -// select ݿ nonblocking ʴ´. +// select 기반에서는 nonblocking 소켓을 사용하지 않는다. ////////////////////////////////////////////////////////////////////////////// bool IncomingPlayerManager::acceptNewConnection() throw(Error) { __BEGIN_TRY @@ -728,9 +728,9 @@ bool IncomingPlayerManager::acceptNewConnection() throw(Error) { int MinFD = (int)m_MinFD; int MaxFD = (int)m_MaxFD; - // ŷ connection ٸ - // ϵǴ NULL . - // NonBlockingIOException ߻ . + // 블록킹 방식으로 connection을 기다릴 경우 + // 리턴되는 값은 절대 NULL이 될 수 없다. + // 또한 NonBlockingIOException도 발생할 수 없다. Socket* client = NULL; try { @@ -758,9 +758,9 @@ bool IncomingPlayerManager::acceptNewConnection() throw(Error) { throw Error(); } - // ó Ͽ ־ ξµ Ѵ.. - // Ƹ Thread κп Ѵ - // Thread ó ӽ÷ . + // 에러 처리를 위하여 넣어 두었는데 원인을 꼭 밝혀야 한다.. + // 아마도 Thread의 소켓 관리 부분에서 문제가 생기지 않을까 생각 한다 + // Thread 관련 처리를 끝내기 전까지 임시로 들어간다. if (client->getSockError()) { m_CheckValue = 4; throw Error(); @@ -770,9 +770,9 @@ bool IncomingPlayerManager::acceptNewConnection() throw(Error) { client->setNonBlocking(); m_CheckValue = 6; - // ó Ͽ ־ ξµ Ѵ.. - // Ƹ Thread κп Ѵ - // Thread ó ӽ÷ . + // 에러 처리를 위하여 넣어 두었는데 원인을 꼭 밝혀야 한다.. + // 아마도 Thread의 소켓 관리 부분에서 문제가 생기지 않을까 생각 한다 + // Thread 관련 처리를 끝내기 전까지 임시로 들어간다. if (client->getSockError()) { m_CheckValue = 7; throw Error(); @@ -788,15 +788,15 @@ bool IncomingPlayerManager::acceptNewConnection() throw(Error) { m_CheckValue = 10; //---------------------------------------------------------------------- - // Incoming List ִ Ѵ. + // Incoming List 에 있는지 인증한다. //---------------------------------------------------------------------- - // toString() CI == NULL ߻ϱ⵵ Ѵ. -_-; .. + // toString()에서 CI == NULL 이 발생하기도 한다. -_-; 주의 요망.. - // ȿ ܰ ߻ϸ ¥. + // 이 안에서 예외가 발생하면 짜른다. g_pConnectionInfoManager->getConnectionInfo(client->getHost()); m_CheckValue = 11; - // Ŭ̾Ʈ Ķͷ ؼ ÷̾ ü Ѵ. + // 클라이언트 소켓을 파라미터로 사용해서 플레이어 객체를 생성한다. GamePlayer* pGamePlayer = new GamePlayer(client); m_CheckValue = 12; @@ -804,7 +804,7 @@ bool IncomingPlayerManager::acceptNewConnection() throw(Error) { pGamePlayer->setPlayerStatus(GPS_BEGIN_SESSION); m_CheckValue = 13; - // IPM Ѵ. + // IPM 에 등록한다. // addPlayer_NOBLOCKED(pGamePlayer); try { m_CheckValue = 14; @@ -839,7 +839,7 @@ bool IncomingPlayerManager::acceptNewConnection() throw(Error) { m_CheckValue += 1000; //----------------------------------------acceptNewConnection core!!! - // ̹Ƿ ¥. -_-; + // 인증되지 못한 연결이므로 짜른다. -_-; // client->send("Error : Unauthorized access",27); m_CheckValue += 1000; @@ -883,7 +883,7 @@ bool IncomingPlayerManager::acceptNewConnection() throw(Error) { ////////////////////////////////////////////////////////////////////// // -// ο ῡ õ ÷̾ ü IPM ߰Ѵ. +// 새로운 연결에 관련된 플레이어 객체를 IPM에 추가한다. // ////////////////////////////////////////////////////////////////////// void IncomingPlayerManager::addPlayer(Player* pGamePlayer) throw(DuplicatedException, Error) { @@ -896,12 +896,12 @@ void IncomingPlayerManager::addPlayer(Player* pGamePlayer) throw(DuplicatedExcep SOCKET fd = pGamePlayer->getSocket()->getSOCKET(); - // m_MinFD , m_MaxFD Ѵ. + // m_MinFD , m_MaxFD 를 재조정한다. m_MinFD = min(fd, m_MinFD); m_MaxFD = max(fd, m_MaxFD); - // fd_set fd Ʈ on Ų. - // m_XXXFDs[1] óָ ȴ. + // 모든 fd_set 에 fd 비트를 on 시킨다. + // m_XXXFDs[1] 은 다음번에 처리해주면 된다. FD_SET(fd, &m_ReadFDs[0]); FD_SET(fd, &m_WriteFDs[0]); FD_SET(fd, &m_ExceptFDs[0]); @@ -913,7 +913,7 @@ void IncomingPlayerManager::addPlayer(Player* pGamePlayer) throw(DuplicatedExcep ////////////////////////////////////////////////////////////////////// // -// ο ῡ õ ÷̾ ü IPM ߰Ѵ. +// 새로운 연결에 관련된 플레이어 객체를 IPM에 추가한다. // ////////////////////////////////////////////////////////////////////// void IncomingPlayerManager::addPlayer_NOBLOCKED(Player* pGamePlayer) throw(DuplicatedException, Error) { @@ -924,12 +924,12 @@ void IncomingPlayerManager::addPlayer_NOBLOCKED(Player* pGamePlayer) throw(Dupli SOCKET fd = pGamePlayer->getSocket()->getSOCKET(); - // m_MinFD , m_MaxFD Ѵ. + // m_MinFD , m_MaxFD 를 재조정한다. m_MinFD = min(fd, m_MinFD); m_MaxFD = max(fd, m_MaxFD); - // fd_set fd Ʈ on Ų. - // m_XXXFDs[1] óָ ȴ. + // 모든 fd_set 에 fd 비트를 on 시킨다. + // m_XXXFDs[1] 은 다음번에 처리해주면 된다. FD_SET(fd, &m_ReadFDs[0]); FD_SET(fd, &m_WriteFDs[0]); FD_SET(fd, &m_ExceptFDs[0]); @@ -946,11 +946,11 @@ void IncomingPlayerManager::deletePlayer_NOBLOCKED(SOCKET fd) throw(OutOfBoundEx Assert(m_pPlayers[fd] == NULL); - // m_MinFD , m_MaxFD Ѵ. - // fd == m_MinFD && fd == m_MaxFD ù° if óȴ. + // m_MinFD , m_MaxFD 를 재조정한다. + // fd == m_MinFD && fd == m_MaxFD 인 경우는 첫번째 if 에서 처리된다. if (fd == m_MinFD) { - // տ fd ã´. - // m_MinFD ڸ NULL Ǿ ϶. + // 앞에서부터 제일 작은 fd 를 찾는다. + // m_MinFD 자리는 현재 NULL 이 되어 있음을 유의하라. int i = m_MinFD; for (i = m_MinFD; i <= m_MaxFD; i++) { if (m_pPlayers[i] != NULL || i == m_SocketID) { @@ -959,14 +959,14 @@ void IncomingPlayerManager::deletePlayer_NOBLOCKED(SOCKET fd) throw(OutOfBoundEx } } - // m_MinFD ã , - // ̶ m_MinFD == m_MaxFD ̴. - // ̶ -1 . + // 적절한 m_MinFD를 찾지 못했을 경우, + // 이때에는 m_MinFD == m_MaxFD 인 경우이다. + // 이때에는 둘 다 -1 로 설정해주자. if (i > m_MaxFD) m_MinFD = m_MaxFD = -1; } else if (fd == m_MaxFD) { - // ڿ ū fd ã´. - // SocketID ! (SocketID Player ʹ NULL ̴.) + // 뒤에서부터 가장 큰 fd 를 찾는다. + // SocketID 에 유의할 것! (SocketID 의 경우 Player 포인터는 NULL 이다.) int i = m_MaxFD; for (i = m_MaxFD; i >= m_MinFD; i--) { if (m_pPlayers[i] != NULL || i == m_SocketID) { @@ -975,7 +975,7 @@ void IncomingPlayerManager::deletePlayer_NOBLOCKED(SOCKET fd) throw(OutOfBoundEx } } - // m_MinFD ã , + // 적절한 m_MinFD를 찾지 못했을 경우, if (i < m_MinFD) { FILELOG_INCOMING_CONNECTION("ICMFD.txt", "[ i < m_MinFD nbl] nPlayers : %d, MinFD : %d, MaxFD : %d, ServerSocket : %d", @@ -984,9 +984,9 @@ void IncomingPlayerManager::deletePlayer_NOBLOCKED(SOCKET fd) throw(OutOfBoundEx } } - // fd_set fd Ʈ off Ų. - // m_XXXFDs[1] ľ ϴ , ó ü µ - // ó Ȯ ֱ ̴. + // 모든 fd_set 에 fd 비트를 off 시킨다. + // m_XXXFDs[1]도 고쳐야 하는 이유는, 이후 처리에서 객체가 없어졌는데도 + // 처리받을 확률이 있기 때문이다. FD_CLR(fd, &m_ReadFDs[0]); FD_CLR(fd, &m_ReadFDs[1]); FD_CLR(fd, &m_WriteFDs[0]); @@ -1000,14 +1000,14 @@ void IncomingPlayerManager::deletePlayer_NOBLOCKED(SOCKET fd) throw(OutOfBoundEx ////////////////////////////////////////////////////////////////////// // -// Ư ÷̾ IPM Ѵ. +// 특정 플레이어를 IPM 에서 삭제한다. // -// ÷̾ IPM Ǵ . +// 플레이어가 IPM에서 삭제되는 이유는 다음과 같다. // -// (1) ZPM ü ű --> ÷̾ ü ϸ ȵȴ. -// (2) ӿ  . --> ÷̾ ü ؾ Ѵ. +// (1) ZPM으로 객체를 옮김 --> 플레이어 객체를 삭제하면 안된다. +// (2) 게임에 들어가기 전에 연결이 끊긴다. --> 플레이어 객체를 삭제해야 한다. // -// , ÷̾ ܺο ̷ Ѵ. +// 따라서, 플레이어 삭제는 외부에서 이루어져야 한다. // ////////////////////////////////////////////////////////////////////// void IncomingPlayerManager::deletePlayer(SOCKET fd) throw(OutOfBoundException, NoSuchElementException, Error) { @@ -1020,11 +1020,11 @@ void IncomingPlayerManager::deletePlayer(SOCKET fd) throw(OutOfBoundException, N Assert(m_pPlayers[fd] == NULL); - // m_MinFD , m_MaxFD Ѵ. - // fd == m_MinFD && fd == m_MaxFD ù° if óȴ. + // m_MinFD , m_MaxFD 를 재조정한다. + // fd == m_MinFD && fd == m_MaxFD 인 경우는 첫번째 if 에서 처리된다. if (fd == m_MinFD) { - // տ fd ã´. - // m_MinFD ڸ NULL Ǿ ϶. + // 앞에서부터 제일 작은 fd 를 찾는다. + // m_MinFD 자리는 현재 NULL 이 되어 있음을 유의하라. int i = m_MinFD; for (i = m_MinFD; i <= m_MaxFD; i++) { if (m_pPlayers[i] != NULL || i == m_SocketID) { @@ -1033,14 +1033,14 @@ void IncomingPlayerManager::deletePlayer(SOCKET fd) throw(OutOfBoundException, N } } - // m_MinFD ã , - // ̶ m_MinFD == m_MaxFD ̴. - // ̶ -1 . + // 적절한 m_MinFD를 찾지 못했을 경우, + // 이때에는 m_MinFD == m_MaxFD 인 경우이다. + // 이때에는 둘 다 -1 로 설정해주자. if (i > m_MaxFD) m_MinFD = m_MaxFD = -1; } else if (fd == m_MaxFD) { - // ڿ ū fd ã´. - // SocketID ! (SocketID Player ʹ NULL ̴.) + // 뒤에서부터 가장 큰 fd 를 찾는다. + // SocketID 에 유의할 것! (SocketID 의 경우 Player 포인터는 NULL 이다.) int i = m_MaxFD; for (i = m_MaxFD; i >= m_MinFD; i--) { if (m_pPlayers[i] != NULL || i == m_SocketID) { @@ -1049,7 +1049,7 @@ void IncomingPlayerManager::deletePlayer(SOCKET fd) throw(OutOfBoundException, N } } - // m_MinFD ã , + // 적절한 m_MinFD를 찾지 못했을 경우, if (i < m_MinFD) { FILELOG_INCOMING_CONNECTION("ICMFD.txt", "[ i < m_MinFD ] nPlayers : %d, MinFD : %d, MaxFD : %d, ServerSocket : %d", @@ -1058,9 +1058,9 @@ void IncomingPlayerManager::deletePlayer(SOCKET fd) throw(OutOfBoundException, N } } - // fd_set fd Ʈ off Ų. - // m_XXXFDs[1] ľ ϴ , ó ü µ - // ó Ȯ ֱ ̴. + // 모든 fd_set 에 fd 비트를 off 시킨다. + // m_XXXFDs[1]도 고쳐야 하는 이유는, 이후 처리에서 객체가 없어졌는데도 + // 처리받을 확률이 있기 때문이다. FD_CLR(fd, &m_ReadFDs[0]); FD_CLR(fd, &m_ReadFDs[1]); FD_CLR(fd, &m_WriteFDs[0]); @@ -1088,7 +1088,7 @@ GamePlayer* IncomingPlayerManager::getPlayer_NOBLOCKED(const string& id) throw(N } if (pGamePlayer == NULL) - throw NoSuchElementException("׷ ̵ ÷̾ ʽϴ."); + throw NoSuchElementException("그런 아이디를 가진 플레이어는 존재하지 않습니다."); return pGamePlayer; @@ -1164,18 +1164,18 @@ void IncomingPlayerManager::heartbeat() throw(Error) { __ENTER_CRITICAL_SECTION(m_Mutex) //-------------------------------------------------- - // PlayerQueue Player ޴ ߰Ѵ. + // PlayerQueue의 Player를 메니져에 추가한다. //-------------------------------------------------- - // ZPM IPM  Status óϴ ޶. - // ZPM IPM ΰ ִ. - // 1. ̵ GPS_WAITING_FOR_CG_READY . - // 2. α׾ƿ GPS_AFTER_SENDING_GL_INCOMING_CONNECTION + // ZPM에서 IPM으로 들어가는 경우는 Status에 따라서 처리하는 방식이 달라진다. + // ZPM에서 IPM으로 가는 종류에는 두가지가 있다. + // 1. 존이동을 할 경우 GPS_WAITING_FOR_CG_READY 상태. + // 2. 로그아웃을 할 경우 GPS_AFTER_SENDING_GL_INCOMING_CONNECTION while (!m_PlayerListQueue.empty()) { GamePlayer* pGamePlayer = m_PlayerListQueue.front(); if (pGamePlayer == NULL) { - filelog("ZoneBug.txt", "%s : %s", "Zone::heartbeat(1)", "pGamePlayer NULLԴϴ."); + filelog("ZoneBug.txt", "%s : %s", "Zone::heartbeat(1)", "pGamePlayer가 NULL입니다."); continue; } @@ -1184,18 +1184,18 @@ void IncomingPlayerManager::heartbeat() throw(Error) { //----------------------------------------------------------------------------- // * elcastle 's Note //----------------------------------------------------------------------------- - // Ѿ KICKED ÷װ ɷ ִٴ ̴. - // ׳ Disconnect ָ Ǵ ̴. - // α׾ƿ ϴ ܰ迡 KICKED ɷ ʴ. - // LGIncomingConnectionOK ܰ迡 KICKED ÷װ ɷ Ƿ 򰥸 . - // α׾ƿ üũ ɸ ϴ. - // , ⼭ ȴ. - // ⼭ ϰ ϴ Using ڿ Ŀη - // Ҿ 𸣴 츦 ؼ ̴. - // ε Ҿ Ÿ ִ. + // 넘어오는 과정에서 KICKED 플레그가 걸려 있다는 말은 비정상 종료라는 말이다. + // 이 경우는 그냥 Disconnect 해주면 되는 것이다. + // 로그아웃을 하는 경우는 이 단계에서 KICKED가 걸려 있지 않다. + // LGIncomingConnectionOK 단계에서 KICKED 플레그가 걸려 있으므로 헷갈리지 말자. + // 정상적인 로그아웃의 경우 이 체크에서 걸리는 것은 정상적이지 못하다. + // 소켓의 에러, 비정상 적인 종료의 경우 여기서 접속을 끊어 버리게 된다. + // 여기서 끊고 접속 하고를 다 하는 이유는 소켓의 Using 자원에 대한 커널레벨의 + // 불안정한 지원이 있을지도 모르는 경우를 대비해서 이다. + // 실제적으로도 불안정한 현상이 나타나고 있다. //----------------------------------------------------------------------------- if (pGamePlayer->isPenaltyFlag(PENALTY_TYPE_KICKED)) { - // ̹ ǾǷ, ۸ ÷ؼ ȵȴ. + // 이미 연결이 종료되었으므로, 출력 버퍼를 플러시해서는 안된다. int fd = -1; Socket* pSocket = pGamePlayer->getSocket(); if (pSocket != NULL) @@ -1214,8 +1214,8 @@ void IncomingPlayerManager::heartbeat() throw(Error) { try { pGamePlayer->disconnect(DISCONNECTED); - // Login ϱ ؼ ִ ij͸ ϴ ̴. - // .. LoginServer packet Ѵ. + // Login을 하기 위해서 기존에 있던 캐릭터를 제거하는 경우이다. + // 이 때는.. LoginServer로 결과 packet을 보내줘야 한다. // by sigi. 2002.5.4 if (pGamePlayer->isKickForLogin()) { // send GLKickVerify to LoginServer. 2002.5.6 @@ -1248,10 +1248,10 @@ void IncomingPlayerManager::heartbeat() throw(Error) { // filelog("ZoneHeartbeatTrace.txt", "Added Player[%s]", pGamePlayer->getID().c_str()); - // Ϻ Adding ó ش. Status . - // ZPM IPM Ϻ Ѿ 쿡 ׿ Ŷ . + // 완벽히 Adding을 끝낸 다음 다음과 같은 처리를 해준다. Status에 따라서. + // ZPM에서 IPM으로 완벽히 넘어온 경우에 그에 따른 패킷을 날린다. - // ̵ ϴ ̴. + // 존이동을 하는 경우이다. if (pGamePlayer->getPlayerStatus() == GPS_WAITING_FOR_CG_READY) { Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); @@ -1263,14 +1263,14 @@ void IncomingPlayerManager::heartbeat() throw(Error) { // Assert(pZone != NULL); if (pOldZone != NULL) { - //  ÷̾ + // 마스터 레어에서 플레이어가 나가는 경우 if (pOldZone->isMasterLair()) { MasterLairManager* pMasterLairManager = pOldZone->getMasterLairManager(); Assert(pMasterLairManager != NULL); pMasterLairManager->leaveCreature(pCreature); } - // PK ÷̾ + // PK 존에서 플레이어가 나가는 경우 if (pCreature->isPLAYER() && pZone != NULL && pOldZone->getZoneID() != pZone->getZoneID()) { if (g_pPKZoneInfoManager->isPKZone(pOldZone->getZoneID())) g_pPKZoneInfoManager->leavePKZone(pOldZone->getZoneID()); @@ -1286,18 +1286,18 @@ void IncomingPlayerManager::heartbeat() throw(Error) { pCreature->setXY(pCreature->getNewX(), pCreature->getNewY()); - // Zone  Ǵ + // 새 Zone에 들어가게 되는 경우 pCreature->registerObject(); } - // ȣȭ ڵ . objectID ϱ .. by sigi. 2002.11.27 + // 암호화 코드 등록. 지금은 objectID로 하기 때문에.. by sigi. 2002.11.27 #ifdef __USE_ENCRYPTER__ pGamePlayer->setEncryptCode(); #endif #if defined(__PAY_SYSTEM_ZONE__) || defined(__PAY_SYSTEM_FREE_LIMIT__) - // - // --> 30 ̴. + // 빌링 + // 유료존 --> 무료존으로 갈 경우 30레벨 이하의 종량제는 지불 끝이다. if ((pGamePlayer->isPayPlaying() || pGamePlayer->isPremiumPlay()) && pGamePlayer->getPayType() == PAY_TYPE_TIME) { Assert(pCreature->isPC()); @@ -1313,11 +1313,11 @@ void IncomingPlayerManager::heartbeat() throw(Error) { } #endif - // System Availabilities ش. + // System Availabilities 정보를 보내준다. SEND_SYSTEM_AVAILABILITIES(pGamePlayer); //-------------------------------------------------------------------------------- - // GCUpdateInfo Ŷ . + // GCUpdateInfo 패킷을 만들어 날린다. //-------------------------------------------------------------------------------- GCUpdateInfo gcUpdateInfo; @@ -1325,20 +1325,20 @@ void IncomingPlayerManager::heartbeat() throw(Error) { pGamePlayer->sendPacket(&gcUpdateInfo); - // α׾ƿ ϴ ̴. + // 로그아웃을 하는 경우이다. } else if (pGamePlayer->getPlayerStatus() == GPS_AFTER_SENDING_GL_INCOMING_CONNECTION) { // cout << "Logout..." << pGamePlayer->getID() << endl; /* Creature * pCreature = pGamePlayer->getCreature(); - // PK ÷̾ + // PK 존에서 플레이어가 나가는 경우 if ( pCreature != NULL && g_pPKZoneInfoManager->isPKZone( pCreature->getZoneID() )) { g_pPKZoneInfoManager->leavePKZone( pCreature->getZoneID() ); } */ - // α GLIncomingConnection . - // PlayerName ClientIP Ǿ . + // 로그인 서버로 GLIncomingConnection을 보낸다. + // PlayerName과 ClientIP를 같이 실어서 보낸다. GLIncomingConnection glIncomingConnection; glIncomingConnection.setPlayerID(pGamePlayer->getID()); glIncomingConnection.setClientIP(pGamePlayer->getSocket()->getHost()); @@ -1365,7 +1365,7 @@ void IncomingPlayerManager::heartbeat() throw(Error) { &glIncomingConnection); */ - // ׳ . by sigi. 2002.11.26 + // 그냥 보낸다. by sigi. 2002.11.26 g_pLoginServerManager->sendPacket(g_pConfig->getProperty("LoginServerIP"), port, &glIncomingConnection); } @@ -1374,9 +1374,9 @@ void IncomingPlayerManager::heartbeat() throw(Error) { __LEAVE_CRITICAL_SECTION(m_Mutex) - // ⿭ ִ ó ش. - // ZPM óϴ κ̴. ߰ ϸ ̴. - // ˾Ʊ ؼ Creatue Zone ϹǷ ̸ Zone ãƼ ξ . + // 나갈 대기열에 있는 사람을 처리 해 준다. + // ZPM으로 가는 사람들을 처리하는 부분이다. 기냥 추가 하면 될 것이다. + // 어느 존으로 가는지 알아기 위해선 Creatue의 Zone을 참조하므로 미리 Zone을 찾아서 셋팅해 두어야 할 것. // by sigi. 2002.12.10 __ENTER_CRITICAL_SECTION(m_MutexOut) @@ -1391,26 +1391,26 @@ void IncomingPlayerManager::heartbeat() throw(Error) { Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); - // getNewZone()  Zone̴. by sigi. 2002.5.11 + // getNewZone()이 새로 들어갈 Zone이다. by sigi. 2002.5.11 // Zone * pZone = pCreature->getZone(); // Assert(pZone != NULL); Zone* pZone = pCreature->getNewZone(); // Assert(pZone != NULL); - // newZone ȵ .. -_-; - // load()Ҷ NewZone Ѵ. + // newZone이 설정 안됐으면 기존 존으로.. -_-; + // load()할때는 NewZone설정을 안한다. if (pZone == NULL) { pZone = pCreature->getZone(); Assert(pZone != NULL); } - //  PlayerManager ã´. + // 들어갈 존의 PlayerManager를 찾는다. ZoneGroup* pZoneGroup = pZone->getZoneGroup(); Assert(pZoneGroup != NULL); ZonePlayerManager* pZonePlayerManager = pZoneGroup->getZonePlayerManager(); Assert(pZonePlayerManager != NULL); - // Push Ѵ. + // Push 한다. pZonePlayerManager->pushPlayer(pGamePlayer); } @@ -1423,9 +1423,9 @@ void IncomingPlayerManager::deleteQueuePlayer(GamePlayer* pGamePlayer) throw(NoS __BEGIN_TRY - // ʿ lockΰ . + // 필요없는 lock인거 같다. // by sigi. 2002.5.9 - // ٸ lock. 2002.12.10 + // 다른 lock사용. 2002.12.10 __ENTER_CRITICAL_SECTION(m_MutexOut) Assert(pGamePlayer != NULL); @@ -1443,12 +1443,12 @@ void IncomingPlayerManager::deleteQueuePlayer(GamePlayer* pGamePlayer) throw(NoS } //////////////////////////////////////////////////////////////////////// -// IncomingPlayerManager ִ ڸ Ѵ. +// IncomingPlayerManager 에 있는 모든 사용자를 정리한다. //////////////////////////////////////////////////////////////////////// void IncomingPlayerManager::clearPlayers() throw(Error) { __BEGIN_TRY - // PlayerListQueue ִ ֵ Ѵ. + // PlayerListQueue 에 있는 애들을 정리한다. while (!m_PlayerListQueue.empty()) { GamePlayer* pGamePlayer = m_PlayerListQueue.front(); @@ -1458,14 +1458,14 @@ void IncomingPlayerManager::clearPlayers() throw(Error) { try { pGamePlayer->disconnect(); } catch (Throwable& t) { - // + // 무시 } SAFE_DELETE(pGamePlayer); } } - // PlayerOutListQueue ִ ֵ Ѵ. + // PlayerOutListQueue 에 있는 애들을 정리한다. while (!m_PlayerOutListQueue.empty()) { GamePlayer* pGamePlayer = m_PlayerOutListQueue.front(); @@ -1475,7 +1475,7 @@ void IncomingPlayerManager::clearPlayers() throw(Error) { try { pGamePlayer->disconnect(); } catch (Throwable& t) { - // + // 무시 } SAFE_DELETE(pGamePlayer); @@ -1486,7 +1486,7 @@ void IncomingPlayerManager::clearPlayers() throw(Error) { if (m_MinFD == -1 && m_MaxFD == -1) return; - // ÷̾ Ѵ. + // 플레이어를 정리한다. for (int i = m_MinFD; i <= m_MaxFD; i++) { if (i != m_SocketID && m_pPlayers[i] != NULL) { GamePlayer* pGamePlayer = dynamic_cast(m_pPlayers[i]); @@ -1495,7 +1495,7 @@ void IncomingPlayerManager::clearPlayers() throw(Error) { try { pGamePlayer->disconnect(); } catch (Throwable& t) { - // + // 무시 } SAFE_DELETE(pGamePlayer); diff --git a/src/server/LogClient.cpp b/src/server/LogClient.cpp index d2c0cfca..fe6a6cfb 100644 --- a/src/server/LogClient.cpp +++ b/src/server/LogClient.cpp @@ -36,9 +36,9 @@ int LogClient::m_LogLevel = 0; void log(short type, const string& source, const string& target) { /* - // α Ÿ ˻ϴ LogClient::log() Լ - // üũؾ , ִ Լ ȣ ̱ ؼ - // Լ ߴ. + // 로그 타입을 검사하는 일은 LogClient::log() 함수 내에서 + // 체크해야 깔끔할 것 같지만, 될 수 있는 한 함수 호출을 줄이기 위해서 + // 전역 함수 내에서 했다. if (type < LogClient::getLogLevel()) { g_pLogClient->_log(type, source, target); @@ -49,9 +49,9 @@ void log(short type, const string& source, const string& target) { void log(short type, const string& source, const string& target, const string& content) { /* - // α Ÿ ˻ϴ LogClient::log() Լ - // üũؾ , ִ Լ ȣ ̱ ؼ - // Լ ߴ. + // 로그 타입을 검사하는 일은 LogClient::log() 함수 내에서 + // 체크해야 깔끔할 것 같지만, 될 수 있는 한 함수 호출을 줄이기 위해서 + // 전역 함수 내에서 했다. if (type < LogClient::getLogLevel()) { g_pLogClient->_log(type, source, target, content); @@ -62,9 +62,9 @@ void log(short type, const string& source, const string& target, const string& c void log(short type, const string& source, const string& target, const string& content, short zoneid) { /* - // α Ÿ ˻ϴ LogClient::log() Լ - // üũؾ , ִ Լ ȣ ̱ ؼ - // Լ ߴ. + // 로그 타입을 검사하는 일은 LogClient::log() 함수 내에서 + // 체크해야 깔끔할 것 같지만, 될 수 있는 한 함수 호출을 줄이기 위해서 + // 전역 함수 내에서 했다. if (type < LogClient::getLogLevel()) { g_pLogClient->_log(type, source, target, content, zoneid); diff --git a/src/server/LogClient.h b/src/server/LogClient.h index 1a072e9d..a9bb8634 100644 --- a/src/server/LogClient.h +++ b/src/server/LogClient.h @@ -11,66 +11,66 @@ ////////////////////////////////////////////////////////////////////////////// // LogType -// α ߿䵵 ׷ ִ. -// 1000 α ׷ Ѵ. -// LogClient LogLevel 1000 ϸ, -// ׷ α״ αϰ, α ʴ ϴ. +// 로그의 종류는 중요도에 따라 일정 그룹으로 구분할 수 있다. +// 현재는 1000 단위로 그 로그 그룹을 구분한다. +// LogClient 내부의 LogLevel을 1000 단위로 지정하면, +// 일정 그룹의 로그는 로그하고, 나머지는 로그하지 않는 일이 가능하다. ////////////////////////////////////////////////////////////////////////////// enum LogType { - LOG_SYSTEM = 0, // ý α - LOG_SYSTEM_ERROR = 10, // ý α + LOG_SYSTEM = 0, // 시스템 로그 + LOG_SYSTEM_ERROR = 10, // 시스템 에러 로그 - LOG_GAMESERVER = 20, // ޽ - LOG_GAMESERVER_ERROR = 30, // ޽ + LOG_GAMESERVER = 20, // 게임 서버 메시지 + LOG_GAMESERVER_ERROR = 30, // 게임 서버 에러 메시지 - LOG_LOGINSERVER = 40, // α ޽ - LOG_LOGINSERVER_ERROR = 50, // α ޽ + LOG_LOGINSERVER = 40, // 로그인 서버 메시지 + LOG_LOGINSERVER_ERROR = 50, // 로그인 서버 에러 메시지 - LOG_SHAREDSERVER = 60, // α ޽ - LOG_SHAREDSERVER_ERROR = 70, // α ޽ + LOG_SHAREDSERVER = 60, // 로그인 서버 메시지 + LOG_SHAREDSERVER_ERROR = 70, // 로그인 서버 에러 메시지 - LOG_CGCONNECT = 80, // α + LOG_CGCONNECT = 80, // 게임 서버에 로그인 - LOG_PICKUP_ITEM = 1010, // ݱ - LOG_DROP_ITEM = 1020, // ߸ + LOG_PICKUP_ITEM = 1010, // 아이템 줍기 + LOG_DROP_ITEM = 1020, // 아이템 떨어뜨리기 - LOG_PICKUP_MONEY = 1030, // ݱ - LOG_DROP_MONEY = 1040, // ߸ + LOG_PICKUP_MONEY = 1030, // 돈 줍기 + LOG_DROP_MONEY = 1040, // 돈 떨어뜨리기 - LOG_USE_ITEM = 1050, // ϱ - LOG_CREATE_ITEM = 1060, // ϱ ( ź) - LOG_REPAIR_ITEM = 1065, // - LOG_DESTROY_ITEM = 1070, // Ǿ μ + LOG_USE_ITEM = 1050, // 아이템 사용하기 + LOG_CREATE_ITEM = 1060, // 아이템 생성하기 (성수나 폭탄) + LOG_REPAIR_ITEM = 1065, // 아이템을 수리함 + LOG_DESTROY_ITEM = 1070, // 아이템 내구력이 다 되어 부서짐 - LOG_BUY_ITEM = 1080, // - LOG_SELL_ITEM = 1090, // ȱ - LOG_SHOP_CREATE_ITEM = 1100, // - LOG_SHOP_DESTROY_ITEM = 1110, // + LOG_BUY_ITEM = 1080, // 상점에서 아이템 사기 + LOG_SELL_ITEM = 1090, // 상점에서 아이템 팔기 + LOG_SHOP_CREATE_ITEM = 1100, // 상점에서 아이템이 생성 + LOG_SHOP_DESTROY_ITEM = 1110, // 상점에서 아이템이 사라짐 - LOG_DROP_ITEM_DIE = 1120, // 鼭 ߸ - LOG_DROP_ITEM_MORPH = 1130, // ϸ鼭 ߸ - LOG_LOOT_CORPSE = 1140, // ü + LOG_DROP_ITEM_DIE = 1120, // 죽으면서 아이템을 떨어뜨림 + LOG_DROP_ITEM_MORPH = 1130, // 변신하면서 아이템을 떨어뜨림 + LOG_LOOT_CORPSE = 1140, // 시체에서 아이템을 꺼냄 - LOG_STASH_ADD_ITEM = 1150, // Կ - LOG_STASH_REMOVE_ITEM = 1160, // Կ - LOG_STASH_ADD_MONEY = 1170, // Կ - LOG_STASH_REMOVE_MONEY = 1180, // Կ + LOG_STASH_ADD_ITEM = 1150, // 보관함에 아이템을 넣음 + LOG_STASH_REMOVE_ITEM = 1160, // 보관함에서 아이템을 뺌 + LOG_STASH_ADD_MONEY = 1170, // 보관함에 돈을 넣음 + LOG_STASH_REMOVE_MONEY = 1180, // 보관함에서 돈을 뺌 - LOG_USE_BONUS_POINT = 1190, // ʽ Ʈ + LOG_USE_BONUS_POINT = 1190, // 보너스 포인트를 사용 - LOG_TRADE = 1200, // ȯ + LOG_TRADE = 1200, // 교환 - LOG_KILL_PLAYER = 2000, // ÷̾ ÷̾ + LOG_KILL_PLAYER = 2000, // 플레이어가 플레이어를 죽임 - LOG_BLOODDRAIN = 2010, // Ǹ - LOG_BLOODDRAINED = 2020, // Ǹ + LOG_BLOODDRAIN = 2010, // 피를 빰 + LOG_BLOODDRAINED = 2020, // 피를 빨림 - LOG_SLAYER_TO_VAMPIRE = 2030, // ̾ ̾ - LOG_VAMPIRE_TO_SLAYER = 2040, // ̾ ̾ - LOG_HEAL = 2050, // ġḦ ޴ + LOG_SLAYER_TO_VAMPIRE = 2030, // 슬레이어에서 뱀파이어로 + LOG_VAMPIRE_TO_SLAYER = 2040, // 뱀파이어에서 슬레이어로 + LOG_HEAL = 2050, // 치료를 받다 - LOG_DEBUG_MSG = 3000, // ޽ + LOG_DEBUG_MSG = 3000, // 디버깅 관련 메시지 LOGTYPE_MAX }; @@ -78,14 +78,14 @@ enum LogType { ////////////////////////////////////////////////////////////////////////////// // class LogClient -// α׸ Ŭ̾Ʈ Ŭ̴. SIGNAL ó Ϻη -// ʾǷ, Ŭ ܺο SIGNAL ó Ѵ. ׷ -// α ׾. +// 로그를 위한 클라이언트 클래스이다. SIGNAL에 관한 처리는 일부러 +// 하지 않았으므로, 클래스 외부에서 SIGNAL 처리를 해줘야 한다. 그렇지 않으면 +// 로그 서버가 죽으면 같이 죽어버린다. // -// α (ū α׷ α׸ Ѵ.) -// 0 : ý 븸 αѴ. -// 1000 : ߿ κ αѴ. -// 2000 : ߿ κе αѴ. +// 로그 레벨 (큰 로그레벨은 하위 레벨의 로그를 포함한다.) +// 0 : 서버 시스템 관련 내용만 로그한다. +// 1000 : 게임 내에서 제일 중요한 부분을 로그한다. +// 2000 : 게임 내에서 별로 중요하지 않은 부분도 로그한다. ////////////////////////////////////////////////////////////////////////////// class LogClient { diff --git a/src/server/LogData.cpp b/src/server/LogData.cpp index db27c7fe..6ca5db61 100644 --- a/src/server/LogData.cpp +++ b/src/server/LogData.cpp @@ -46,21 +46,21 @@ LogData::~LogData() {} uint LogData::getSize(void) { uint rValue = 0; - // Ÿ + // 타입 사이즈 rValue += szshort; - // ̵ + // 존 아이디 rValue += szshort; - // ҽ + // 소스 rValue += szBYTE; rValue += m_Source.size(); - // Ÿ + // 타겟 rValue += szBYTE; rValue += m_Target.size(); - // Ʈ + // 컨텐트 rValue += szshort; rValue += m_Content.size(); diff --git a/src/server/LogData.h b/src/server/LogData.h index 31a9e026..9a45c342 100644 --- a/src/server/LogData.h +++ b/src/server/LogData.h @@ -65,11 +65,11 @@ class LogData { ///// Member data ///// protected: - short m_Type; // - short m_ZoneID; // Ͼ zone id - string m_Source; // ߻Ų ÷̾ ̸ - string m_Target; // (?) ÷̾ ̸ - string m_Content; // + short m_Type; // 사건의 종류 + short m_ZoneID; // 사건이 일어난 곳의 zone id + string m_Source; // 사건을 발생시킨 플레이어의 이름 + string m_Target; // 사건을 당한(?) 플레이어의 이름 + string m_Content; // 사건의 내용 }; #endif diff --git a/src/server/MutexAttr.h b/src/server/MutexAttr.h index 05e70061..d27b42f9 100644 --- a/src/server/MutexAttr.h +++ b/src/server/MutexAttr.h @@ -8,10 +8,10 @@ // // Mutex-Attribute Class // -// Mutex-Attribute Ŭ Ӽ(attribute) Mutex Ŭ -// ʿ䰡 pthread_mutex_init() Ķͷ -// ȴ. ϳ Mutex-Attribute ü س ȴٴ -// ̴. +// Mutex-Attribute 클래스는 동일한 속성(attribute)의 Mutex 클래스를 +// 여러 개 생성할 필요가 있을 때 pthread_mutex_init()의 파라미터로 +// 사용된다. 즉 하나의 Mutex-Attribute 객체만 생성해놓으면 된다는 +// 뜻이다. // ////////////////////////////////////////////////////////////////////// @@ -69,8 +69,8 @@ class MutexAttr { // // do not return pthread_mutexattr_t value !! // use pthread_mutexattr_t pointer instead. - // (pthread_mutexattr_t assignment - // ɼ ) + // (pthread_mutexattr_t 에 대해 assignment 가 지원되지 않을 + // 가능성 있음) // pthread_mutexattr_t* getAttr() { return &m_Attr; diff --git a/src/server/PaySystem.h b/src/server/PaySystem.h index 202f3626..b1a77bba 100644 --- a/src/server/PaySystem.h +++ b/src/server/PaySystem.h @@ -16,43 +16,43 @@ class Statement; ////////////////////////////////////////////////////////////////////////////// -// +// 요금제 ////////////////////////////////////////////////////////////////////////////// enum PayPlayType { - PAY_PLAY_TYPE_PERSON, // - PAY_PLAY_TYPE_PCROOM, // ӹ - PAY_PLAY_TYPE_ETC, // Ÿ(.. ׳ ־ -_-;) + PAY_PLAY_TYPE_PERSON, // 개인 요금 + PAY_PLAY_TYPE_PCROOM, // 게임방 요금 + PAY_PLAY_TYPE_ETC, // 기타(뭐지.. 그냥 넣어둠 -_-;) PAY_PLAY_TYPE_MAX }; enum PayType { - PAY_TYPE_FREE, // - PAY_TYPE_PERIOD, // - PAY_TYPE_TIME, // ð - PAY_TYPE_POST, // ĺ ð + PAY_TYPE_FREE, // 무료 사용자 + PAY_TYPE_PERIOD, // 월 사용자 + PAY_TYPE_TIME, // 시간제 사용자 + PAY_TYPE_POST, // 후불 시간제 사용자 PAY_TYPE_MAX }; enum PayIPType { - PAY_IP_TYPE_ALL, // IPü - PAY_IP_TYPE_LIMIT, // - PAY_IP_TYPE_ASSIGN, // ƯIP + PAY_IP_TYPE_ALL, // IP전체 + PAY_IP_TYPE_LIMIT, // 동시접속 사용대수 제한 + PAY_IP_TYPE_ASSIGN, // 특정IP PAY_IP_TYPE_MAX }; enum FamilyPayPartyType { FAMILY_PAY_PARTY_TYPE_NONE, - FAMILY_PAY_PARTY_TYPE_FREE_PASS, // йи Ƽ ԰ - FAMILY_PAY_PARTY_TYPE_FREE_PASS_END, // йи Ƽ ԰ + FAMILY_PAY_PARTY_TYPE_FREE_PASS, // 패밀리 요금제 파티 유료존 출입가능 + FAMILY_PAY_PARTY_TYPE_FREE_PASS_END, // 패밀리 요금제 파티 유료존 출입가능 끝 }; #define PAY_PLAY_FLAG_ALL 0xFFFF #define PAY_PLAY_FLAG_ZONE 0x0001 -#define __PAY_SYSTEM_ZONE__ // Zone Կο PaySystem -// #define __PAY_SYSTEM_LOGIN__ // Loginο PaySystem -// #define __PAY_SYSTEM_FREE_LIMIT__ // Ұ , ü 񽺷.. +#define __PAY_SYSTEM_ZONE__ // Zone 출입여부에 PaySystem을 적용 +// #define __PAY_SYSTEM_LOGIN__ // Login여부에 PaySystem을 적용 +// #define __PAY_SYSTEM_FREE_LIMIT__ // 게임 불가 사용자인 경우, 자체 무료 서비스로.. ////////////////////////////////////////////////////////////////////////////// @@ -105,17 +105,17 @@ class PaySystem { void setPayPlayAvailableDateTime(const string& pat); const VSDateTime& getPayPlayAvailableDateTime() const { return m_PayPlayAvailableDateTime; - } // playѰ? + } // 언제까지 play가능한가? void setFamilyPayPlayAvailableDateTime(const string& pat); const VSDateTime& getFamilyPayPlayAvailableDateTime() const { return m_FamilyPayPlayAvailableDateTime; - } // playѰ? + } // 언제까지 play가능한가? void setPayStartAvailableDateTime(const string& pat); const VSDateTime& getPayStartAvailableDateTime() const { return m_PayStartAvailableDateTime; - } // playѰ? + } // 언제부터 play가능한가? Timeval getPayPlayTime(const Timeval& currentTime) const { return timediff(m_PayPlayStartTime, currentTime); @@ -133,24 +133,24 @@ class PaySystem { public: - // üũ + // 사용 가능한지 체크 bool checkPayPlayAvailable(); - // ϴ + // 일단 값만 설정 void setPayPlayValue(PayType payType, const string& payPlayDate, int payPlayHours, uint payPlayFlag, const string& familyPayPlayDate = ""); - // pay + // pay시작 bool loginPayPlay(PayType payType, const string& payPlayDate, int payPlayHours, uint payPlayFlag, const string& ip, const string& playerID); - // pay + // pay시작 bool loginPayPlay(const string& ip, const string& playerID); - // pay ð update .. + // pay 시간 update 등.. bool updatePayPlayTime(const string& playerID, const VSDateTime& currentDateTime, const Timeval& currentTime); - // pay + // pay끝 void logoutPayPlay(const string& playerID, bool bClear = false, bool bDecreaseTime = true); // @@ -189,51 +189,51 @@ class PaySystem { return m_bPCRoomPlay; } - // ΰ? + // 개인 유료 정액 사용자인가? static bool isPayPlayingPeriodPersonal(const string& PlayerID); bool isPlayInPayPCRoom(const string& ip, const string& playerID); protected: - // PC ó + // PC방인 경우의 처리 bool loginPayPlayPCRoom(const string& ip, const string& playerID); void logoutPayPlayPCRoom(const string& playerID); - // ð ϶.. + // 정량제인 경우 시간 줄일때.. void decreasePayPlayTime(const string& playerID, uint mm); void decreasePayPlayTimePCRoom(uint mm); - // ̻ ڵ + // 이상한 정액제 코드 void increasePayPlayTimePCRoom(uint mm); - // Pay ϰ, ڷ . by sigi. 2002.11.18 + // 모든 Pay정보를 삭제하고, 무료 사용자로 만든다. by sigi. 2002.11.18 void clearPayPlayDateTime(const string& playerID); protected: - bool m_bSetPersonValue; // Ǿ. + bool m_bSetPersonValue; // 값이 설정되었나. - PayPlayType m_PayPlayType; // /׹.. - ObjectID_t m_PCRoomID; // PC ID - uint m_UserLimit; // () - uint m_UserMax; // ִ() + PayPlayType m_PayPlayType; // 개인/겜방.. + ObjectID_t m_PCRoomID; // PC방 ID + uint m_UserLimit; // 사용자 숫자 제한(종량제) + uint m_UserMax; // 사용자 숫자 최대제한(정량제) - PayType m_PayType; // /ð/Ⱓ/Ÿ.. - PayIPType m_PayIPType; // ӹ IP type + PayType m_PayType; // 무료/시간/기간/기타.. + PayIPType m_PayIPType; // 게임방인 경우의 IP type - VSDateTime m_PayStartAvailableDateTime; // playѰ? - VSDateTime m_PayPlayAvailableDateTime; // playѰ? - int m_PayPlayAvailableHours; // ð(ð ) - Timeval m_PayPlayStartTime; // ؼ play ð - VSDateTime m_FamilyPayPlayAvailableDateTime; // Family Pay play Ѱ? + VSDateTime m_PayStartAvailableDateTime; // 언제부터 play가능한가? + VSDateTime m_PayPlayAvailableDateTime; // 언제까지 play가능한가? + int m_PayPlayAvailableHours; // 사용 가능한 시간(시간제인 경우) + Timeval m_PayPlayStartTime; // 접속해서 play한 시간 + VSDateTime m_FamilyPayPlayAvailableDateTime; // 언제까지 Family Pay play가 가능한가? - uint m_PayPlayFlag; // 밡 + uint m_PayPlayFlag; // 사용가능한 서비스 bool m_bPremiumPlay; - bool m_bPCRoomPlay; // PC ΰ? - // PC ѿ PC 濡 ÷ϰ ִ°? + bool m_bPCRoomPlay; // PC 방 사용자인가? + // PC 방 유저 제한에 상관없이 유료 적용 중인 PC 방에서 플레이하고 있는가? - bool m_bFamilyPayAvailable; // йи ΰ? - FamilyPayPartyType m_FamilyPayPartyType; // йи Ƽ Ÿ + bool m_bFamilyPayAvailable; // 패밀리 요금제 사용자인가? + FamilyPayPartyType m_FamilyPayPartyType; // 패밀리 요금제 파티 적용 타입 }; #endif diff --git a/src/server/PlayerManager.h b/src/server/PlayerManager.h index adedc921..f2071669 100644 --- a/src/server/PlayerManager.h +++ b/src/server/PlayerManager.h @@ -24,22 +24,22 @@ class Packet; // // class PlayerManager; // -// ÷̾ ϴ ü̴. ӵ ؼ socket descriptor -// ε ϴ 迭 Ѵ. 迭 ũ -// ó ִ ִ ÷̾ ( ִ )̴. -// ޸ ֱ .. ̴. +// 플레이어를 관리하는 객체이다. 빠른 속도를 위해서 socket descriptor +// 를 인덱스로 하는 배열을 사용한다. 이 배열의 크기는 게임 서버에서 +// 처리할 수 있는 최대 플레이어의 숫자(소켓의 최대 숫자)이다. +// 비록 메모리 낭비가 있긴 하지만.. 감당할 수 있을 정도이다. // -// ׷쿡 100 ÷̾ ִٸ, +// 한 존그룹에 평균 100명의 플레이어가 있다면, // // 900 x 4(byte) x 10(#ZoneGroup) = 36k // -// ִ. +// 정도의 낭비가 있다. // //-------------------------------------------------------------------------------- class PlayerManager { public: - // ÷̾ 迭 ũ + // 내부 플레이어 배열의 크기 const static uint nMaxPlayers = 2000; public: @@ -52,21 +52,21 @@ class PlayerManager { // broadcast message virtual void broadcastPacket(Packet* pPacket); - // Ư ÷̾ Ŵ ߰Ѵ. + // 특정 플레이어를 매니저에 추가한다. virtual void addPlayer(Player* pPlayer); - // Ư ÷̾ Ŵ Ѵ. + // 특정 플레이어를 매니저에서 삭제한다. virtual void deletePlayer(SOCKET fd); - // Ư ÷̾ ü ´. + // 특정 플레이어 객체를 가져온다. virtual Player* getPlayer(SOCKET fd); - // Ư ÷̾ ü ´. + // 특정 폰을 가진 플레이어의 객체를 가져온다. virtual Player* getPlayerByPhoneNumber(PhoneNumber_t PhoneNumber) { return NULL; } - // ÷̾ ڸ Ѵ. + // 현재 관리중인 플레이어 숫자를 리턴한다. uint size() const { return m_nPlayers; } @@ -75,13 +75,13 @@ class PlayerManager { void copyPlayers(); protected: - // ÷̾ 迭̴. ũ͸ ε Ѵ. + // 플레이어의 포인터의 배열이다. 소켓 디스크립터를 인덱스로 사용한다. Player* m_pPlayers[nMaxPlayers]; // number of Players uint m_nPlayers; - // Player 纻 ϴ ̴. + // Player의 복사본을 저장하는 곳이다. Player* m_pCopyPlayers[nMaxPlayers]; }; diff --git a/src/server/Restore.cpp b/src/server/Restore.cpp index e44145a1..3795c15c 100644 --- a/src/server/Restore.cpp +++ b/src/server/Restore.cpp @@ -29,7 +29,7 @@ #include "TradeManager.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) throw(Error) { @@ -48,17 +48,17 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Creature* pFromCreature = pZone->getCreature(TargetObjectID); - // ̾ ǵ帱 ִ. - // NoSuch. by sigi. 2002.5.2 + // 뱀파이어만 건드릴 수가 있다. + // NoSuch제거. by sigi. 2002.5.2 if (pFromCreature == NULL || !pFromCreature->isVampire()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; } - GCSkillToObjectOK1 _GCSkillToObjectOK1; // ų ѿ... - GCMorph1 _GCMorph1; // ڿ.. - GCMorphSlayer2 _GCMorphSlayer2; // ۵鿡.. + GCSkillToObjectOK1 _GCSkillToObjectOK1; // 스킬 쓴 넘에게... + GCMorph1 _GCMorph1; // 변신 당사자에게.. + GCMorphSlayer2 _GCMorphSlayer2; // 변신 구경꾼들에게.. SkillType_t SkillType = pSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); @@ -71,27 +71,27 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk dropFlagToZone(pFromCreature); ////////////////////////////////////////////////////////////////////// - // ؾ Ѵ. + // 각종 존 레벨 정보를 삭제해야 한다. ////////////////////////////////////////////////////////////////////// - // Ƽ ʴ ̶ ش. + // 파티 초대 중이라면 정보를 삭제해 준다. PartyInviteInfoManager* pPIIM = pZone->getPartyInviteInfoManager(); Assert(pPIIM != NULL); pPIIM->cancelInvite(pFromCreature); - // Ƽ ش. + // 파티 관련 정보를 삭제해 준다. int PartyID = pFromCreature->getPartyID(); if (PartyID != 0) { - // ÿ ϰ... + // 먼저 로컬에서 삭제하고... LocalPartyManager* pLPM = pZone->getLocalPartyManager(); Assert(pLPM != NULL); pLPM->deletePartyMember(PartyID, pFromCreature); - // ۷ι ش. + // 글로벌에서도 삭제해 준다. deleteAllPartyInfo(pFromCreature); } - // Ʈ̵ ̾ٸ Ʈ̵ ش. + // 트레이드 중이었다면 트레이드 관련 정보를 삭제해준다. TradeManager* pTM = pZone->getTradeManager(); Assert(pTM != NULL); pTM->cancelTrade(pFromCreature); @@ -102,7 +102,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Slayer* pNewSlayer = new Slayer; Vampire* pVampire = dynamic_cast(pFromCreature); - // DB Ȥ 𸣴 ش. + // DB에서 혹시 남아있을 지 모르는 흡혈 정보를 삭제해준다. Statement* pStmt = NULL; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); @@ -115,13 +115,13 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pNewSlayer->setName(pFromCreature->getName()); - // ũ ÷̾ Ϳ ÷̾ ũ ͸ Ѵ. + // 크리쳐 안의 플레이어 포인터와 플레이어 안의 크리쳐 포인터를 갱신한다. Player* pFromPlayer = pFromCreature->getPlayer(); pNewSlayer->setPlayer(pFromPlayer); GamePlayer* pFromGamePlayer = dynamic_cast(pFromPlayer); pFromGamePlayer->setCreature(pNewSlayer); - // loadϸ load zone objectID Ƿ ٽ Ѵ. by sigi. 2002.6.4 + // load하면 load한 zone에서 objectID를 받으므로 다시 설정한다. by sigi. 2002.6.4 pNewSlayer->load(); pNewSlayer->setZone(pZone); pNewSlayer->setObjectID(pFromCreature->getObjectID()); @@ -133,13 +133,13 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Dir_t dir = pFromCreature->getDir(); Tile& tile = pZone->getTile(x, y); - // pFromCreature , ̾ ü ̹Ƿ, - // PCFinder  ִ ̴. - // ׷Ƿ ̾ ͸ ְ, ο ̾ ͸ Ѵ. + // 곧 pFromCreature 즉, 원래의 뱀파이어 객체는 지워질 것이므로, + // PCFinder에 들어가 있는 값은 쓰레기 값이 될 것이다. + // 그러므로 뱀파이어 포인터를 지워주고, 새로운 슬레이어 포인터를 더한다. g_pPCFinder->deleteCreature(pFromCreature->getName()); g_pPCFinder->addCreature(pNewSlayer); - // Ʈ Ѵ. + // 길드 현재 접속 멤버 리스트에서 삭제한다. if (pVampire->getGuildID() != 0) { Guild* pGuild = g_pGuildManager->getGuild(pVampire->getGuildID()); if (pGuild != NULL) { @@ -153,7 +153,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk g_pSharedServerManager->sendPacket(&gsGuildMemberLogOn); Statement* pStmt = NULL; - // Ʈ Ѵ. + // 디비에 업데이트 한다. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery("UPDATE GuildMember SET LogOn = 0 WHERE Name = '%s'", @@ -165,12 +165,12 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pVampire->getName().c_str()); } - // κ丮 ü. + // 인벤토리 교체. Inventory* pInventory = pVampire->getInventory(); pNewSlayer->setInventory(pInventory); pVampire->setInventory(NULL); - // ü + // 보관함 교체 pNewSlayer->deleteStash(); pNewSlayer->setStash(pVampire->getStash()); pNewSlayer->setStashNum(pVampire->getStashNum()); @@ -178,19 +178,19 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pVampire->setStash(NULL); /* - // ü + // 가비지 교체 while (true) { Item* pGarbage = pVampire->popItemFromGarbage(); - // ̻ ٸ 극ũ... + // 더 이상 없다면 브레이크... if (pGarbage == NULL) break; pNewSlayer->addItemToGarbage(pGarbage); } */ - // ÷ ü + // 플래그 셋 교체 pNewSlayer->deleteFlagSet(); pNewSlayer->setFlagSet(pVampire->getFlagSet()); pVampire->setFlagSet(NULL); @@ -198,24 +198,24 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Item* pItem = NULL; _TPOINT point; - // ԰ ִ ۵ κ丮 Ǵ ٴ ű. + // 입고 있는 아이템들을 인벤토리 또는 바닥으로 옮긴다. for (int part = 0; part < (int)Vampire::VAMPIRE_WEAR_MAX; part++) { pItem = pVampire->getWearItem((Vampire::WearPart)part); if (pItem != NULL) { - //  ϰ... + // 먼저 기어에서 삭제하고... if (isTwohandWeapon(pItem)) { Assert(((Vampire::WearPart)part == Vampire::WEAR_RIGHTHAND) || ((Vampire::WearPart)part == Vampire::WEAR_LEFTHAND)); Assert(pVampire->getWearItem(Vampire::WEAR_RIGHTHAND) == pVampire->getWearItem(Vampire::WEAR_LEFTHAND)); - // . + // 양손 아템. pVampire->deleteWearItem(Vampire::WEAR_RIGHTHAND); pVampire->deleteWearItem(Vampire::WEAR_LEFTHAND); } else { pVampire->deleteWearItem((Vampire::WearPart)part); } - // κ丮 ڸ κ丮 ϰ... + // 인벤토리에 자리가 있으면 인벤토리에 더하고... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); @@ -225,7 +225,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pItem->destroy(); SAFE_DELETE(pItem); } - // ڸ ٴڿ ߸. + // 자리가 없으면 바닥에 떨어뜨린다. else { ZoneCoord_t ZoneX = pVampire->getX(); ZoneCoord_t ZoneY = pVampire->getY(); @@ -237,14 +237,14 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk if (pt.x != -1) { pItem->save("", STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y); - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { char zoneName[15]; sprintf(zoneName, "%4d%3d%3d", pZone->getZoneID(), pt.x, pt.y); remainTraceLog(pItem, pFromCreature->getName(), zoneName, ITEM_LOG_MOVE, DETAIL_DROP); } } else { - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { remainTraceLog(pItem, pFromCreature->getName(), "GOD", ITEM_LOG_DELETE, DETAIL_DROP); } @@ -260,7 +260,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk if (pItem != NULL) { pVampire->deleteItemFromExtraInventorySlot(); - // κ丮 ڸ κ丮 ϰ... + // 인벤토리에 자리가 있으면 인벤토리에 더하고... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); @@ -270,7 +270,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pItem->destroy(); SAFE_DELETE(pItem); } - // ڸ ٴڿ ߸. + // 자리가 없으면 바닥에 떨어뜨린다. else { TPOINT pt; ZoneCoord_t ZoneX = pVampire->getX(); @@ -281,14 +281,14 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk if (pt.x != -1) { pItem->save("", STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y); - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { char zoneName[15]; sprintf(zoneName, "%4d%3d%3d", pZone->getZoneID(), pt.x, pt.y); remainTraceLog(pItem, pFromCreature->getName(), zoneName, ITEM_LOG_MOVE, DETAIL_DROP); } } else { - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { remainTraceLog(pItem, pFromCreature->getName(), "GOD", ITEM_LOG_DELETE, DETAIL_DROP); } @@ -299,20 +299,20 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk } } - // Ʈ ٽ εѴ. + // 퀘스트 아이템 정보를 다시 로드한다. pNewSlayer->loadTimeLimitItem(); - // ̾ ִ ̾ Űش. - // ̾ ִ ̾ Űܰ ʴ´. - // ο ̾ 0 Ѵ. + // 뱀파이어 가지고 있던 돈을 슬레이어로 옮겨준다. + // 뱀파이어가 가지고 있던 돈은 슬레이어로 옮겨가지 않는다. + // 새로운 슬레이어의 돈을 0으로 세팅한다. pNewSlayer->setGoldEx(0); pNewSlayer->setStashGoldEx(0); - // ų Ѵ. + // 스킬 정보를 전송한다. pNewSlayer->sendSlayerSkillInfo(); - // Ÿ ̾ ϰ, ο ̾ Ѵ. + // 타일 및 존에서 기존 뱀파이어를 삭제하고, 새로운 슬레이어를 더한다. tile.deleteCreature(pFromCreature->getObjectID()); pZone->deletePC(pFromCreature); @@ -324,7 +324,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pZone->addPC(pNewSlayer); - // þ update.. + // 시야 update.. pZone->updateHiddenScan(pNewSlayer); _GCMorph1.setPCInfo2(pNewSlayer->getSlayerInfo2()); @@ -377,7 +377,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk } ////////////////////////////////////////////////////////////////////////////// -// NPC Ʈ ڵ鷯 +// NPC 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { __BEGIN_TRY @@ -391,14 +391,14 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { Zone* pZone = pNPC->getZone(); Assert(pZone != NULL); - // ̾ ǵ帱 ִ. + // 뱀파이어만 건드릴 수가 있다. if (!pFromCreature->isVampire()) { // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; } - GCMorph1 _GCMorph1; // ڿ.. - GCMorphSlayer2 _GCMorphSlayer2; // ۵鿡.. + GCMorph1 _GCMorph1; // 변신 당사자에게.. + GCMorphSlayer2 _GCMorphSlayer2; // 변신 구경꾼들에게.. // SkillType_t SkillType = SKILL_RESTORE; @@ -408,27 +408,27 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { // if (bRangeCheck && bHitRoll) if (bHitRoll) { ////////////////////////////////////////////////////////////////////// - // ؾ Ѵ. + // 각종 존 레벨 정보를 삭제해야 한다. ////////////////////////////////////////////////////////////////////// - // Ƽ ʴ ̶ ش. + // 파티 초대 중이라면 정보를 삭제해 준다. PartyInviteInfoManager* pPIIM = pZone->getPartyInviteInfoManager(); Assert(pPIIM != NULL); pPIIM->cancelInvite(pFromCreature); - // Ƽ ش. + // 파티 관련 정보를 삭제해 준다. int PartyID = pFromCreature->getPartyID(); if (PartyID != 0) { - // ÿ ϰ... + // 먼저 로컬에서 삭제하고... LocalPartyManager* pLPM = pZone->getLocalPartyManager(); Assert(pLPM != NULL); pLPM->deletePartyMember(PartyID, pFromCreature); - // ۷ι ش. + // 글로벌에서도 삭제해 준다. deleteAllPartyInfo(pFromCreature); } - // Ʈ̵ ̾ٸ Ʈ̵ ش. + // 트레이드 중이었다면 트레이드 관련 정보를 삭제해준다. TradeManager* pTM = pZone->getTradeManager(); Assert(pTM != NULL); pTM->cancelTrade(pFromCreature); @@ -439,7 +439,7 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { Slayer* pNewSlayer = new Slayer; Vampire* pVampire = dynamic_cast(pFromCreature); - // DB Ȥ 𸣴 ش. + // DB에서 혹시 남아있을 지 모르는 흡혈 정보를 삭제해준다. Statement* pStmt = NULL; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); @@ -453,7 +453,7 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { pNewSlayer->setName(pFromCreature->getName()); pNewSlayer->setPlayer(pFromCreature->getPlayer()); pNewSlayer->load(); - // loadϸ load zone objectID Ƿ ٽ Ѵ. by sigi. 2002.6.4 + // load하면 load한 zone에서 objectID를 받으므로 다시 설정한다. by sigi. 2002.6.4 pNewSlayer->setZone(pZone); pNewSlayer->setObjectID(pFromCreature->getObjectID()); // pZone->getObjectRegistry().registerObject(pNewSlayer); @@ -466,19 +466,19 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { pNewSlayer->setXYDir(x, y, dir); - // ũ ÷̾ Ϳ ÷̾ ũ ͸ Ѵ. + // 크리쳐 안의 플레이어 포인터와 플레이어 안의 크리쳐 포인터를 갱신한다. Player* pFromPlayer = pFromCreature->getPlayer(); // pNewSlayer->setPlayer(pFromPlayer); GamePlayer* pFromGamePlayer = dynamic_cast(pFromPlayer); pFromGamePlayer->setCreature(pNewSlayer); - // pFromCreature , ̾ ü ̹Ƿ, - // PCFinder  ִ ̴. - // ׷Ƿ ̾ ͸ ְ, ο ̾ ͸ Ѵ. + // 곧 pFromCreature 즉, 원래의 뱀파이어 객체는 지워질 것이므로, + // PCFinder에 들어가 있는 값은 쓰레기 값이 될 것이다. + // 그러므로 뱀파이어 포인터를 지워주고, 새로운 슬레이어 포인터를 더한다. g_pPCFinder->deleteCreature(pFromCreature->getName()); g_pPCFinder->addCreature(pNewSlayer); - // Ʈ Ѵ. + // 길드 현재 접속 멤버 리스트에서 삭제한다. if (pVampire->getGuildID() != 0) { Guild* pGuild = g_pGuildManager->getGuild(pVampire->getGuildID()); if (pGuild != NULL) @@ -488,19 +488,19 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { pVampire->getName().c_str()); } - // κ丮 ü. + // 인벤토리 교체. Inventory* pInventory = pVampire->getInventory(); pNewSlayer->setInventory(pInventory); pVampire->setInventory(NULL); - // ü + // 보관함 교체 pNewSlayer->deleteStash(); pNewSlayer->setStash(pVampire->getStash()); pNewSlayer->setStashNum(pVampire->getStashNum()); pNewSlayer->setStashStatus(false); pVampire->setStash(NULL); - // ÷ ü + // 플래그 셋 교체 pNewSlayer->deleteFlagSet(); pNewSlayer->setFlagSet(pVampire->getFlagSet()); pVampire->setFlagSet(NULL); @@ -508,24 +508,24 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { Item* pItem = NULL; _TPOINT point; - // ԰ ִ ۵ κ丮 Ǵ ٴ ű. + // 입고 있는 아이템들을 인벤토리 또는 바닥으로 옮긴다. for (int part = 0; part < (int)Vampire::VAMPIRE_WEAR_MAX; part++) { pItem = pVampire->getWearItem((Vampire::WearPart)part); if (pItem != NULL) { - //  ϰ... + // 먼저 기어에서 삭제하고... if (isTwohandWeapon(pItem)) { Assert(((Vampire::WearPart)part == Vampire::WEAR_RIGHTHAND) || ((Vampire::WearPart)part == Vampire::WEAR_LEFTHAND)); Assert(pVampire->getWearItem(Vampire::WEAR_RIGHTHAND) == pVampire->getWearItem(Vampire::WEAR_LEFTHAND)); - // . + // 양손 아템. pVampire->deleteWearItem(Vampire::WEAR_RIGHTHAND); pVampire->deleteWearItem(Vampire::WEAR_LEFTHAND); } else { pVampire->deleteWearItem((Vampire::WearPart)part); } - // κ丮 ڸ κ丮 ϰ... + // 인벤토리에 자리가 있으면 인벤토리에 더하고... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); @@ -535,7 +535,7 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { pItem->destroy(); SAFE_DELETE(pItem); } - // ڸ ٴڿ ߸. + // 자리가 없으면 바닥에 떨어뜨린다. else { ZoneCoord_t ZoneX = pVampire->getX(); ZoneCoord_t ZoneY = pVampire->getY(); @@ -547,14 +547,14 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { if (pt.x != -1) { pItem->save("", STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y); - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { char zoneName[15]; sprintf(zoneName, "%4d%3d%3d", pZone->getZoneID(), pt.x, pt.y); remainTraceLog(pItem, pFromCreature->getName(), zoneName, ITEM_LOG_MOVE, DETAIL_DROP); } } else { - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { remainTraceLog(pItem, pFromCreature->getName(), "GOD", ITEM_LOG_DELETE, DETAIL_DROP); } @@ -570,7 +570,7 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { if (pItem != NULL) { pVampire->deleteItemFromExtraInventorySlot(); - // κ丮 ڸ κ丮 ϰ... + // 인벤토리에 자리가 있으면 인벤토리에 더하고... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); @@ -580,7 +580,7 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { pItem->destroy(); SAFE_DELETE(pItem); } - // ڸ ٴڿ ߸. + // 자리가 없으면 바닥에 떨어뜨린다. else { TPOINT pt; ZoneCoord_t ZoneX = pVampire->getX(); @@ -591,14 +591,14 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { if (pt.x != -1) { pItem->save("", STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y); - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { char zoneName[15]; sprintf(zoneName, "%4d%3d%3d", pZone->getZoneID(), pt.x, pt.y); remainTraceLog(pItem, pFromCreature->getName(), zoneName, ITEM_LOG_MOVE, DETAIL_DROP); } } else { - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { remainTraceLog(pItem, pFromCreature->getName(), "GOD", ITEM_LOG_DELETE, DETAIL_DROP); } @@ -611,14 +611,14 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { pNewSlayer->loadTimeLimitItem(); - // ̾ ִ ̾ Űش. - // ̾ ʱȭѴ. + // 뱀파이어 가지고 있던 돈을 슬레이어로 옮겨준다. + // 슬레이어돈을 초기화한다. // pNewSlayer->setGoldEx(pVampire->getGold()); pNewSlayer->setGoldEx(0); pNewSlayer->setStashGoldEx(0); - // ų Ѵ. + // 스킬 정보를 전송한다. pNewSlayer->sendSlayerSkillInfo(); _GCMorph1.setPCInfo2(pNewSlayer->getSlayerInfo2()); @@ -632,7 +632,7 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { // pFromGamePlayer->deleteEvent(Event::EVENT_CLASS_REGENERATION); - // Ÿ ̾ ϰ, ο ̾ Ѵ. + // 타일 및 존에서 기존 뱀파이어를 삭제하고, 새로운 슬레이어를 더한다. tile.deleteCreature(pFromCreature->getObjectID()); pZone->deletePC(pFromCreature); @@ -654,7 +654,7 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { SAFE_DELETE(pFromCreature); - // þ update.. + // 시야 update.. pZone->updateHiddenScan(pNewSlayer); EffectRestore* pEffectRestore = new EffectRestore(pNewSlayer); diff --git a/src/server/Restore2.cpp b/src/server/Restore2.cpp index a2e56056..aa4d5d46 100644 --- a/src/server/Restore2.cpp +++ b/src/server/Restore2.cpp @@ -19,7 +19,7 @@ #include "TradeManager.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) throw(Error) { @@ -39,17 +39,17 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Creature* pFromCreature = pZone->getCreature(TargetObjectID); - // ̾ ǵ帱 ִ. - // NoSuch. by sigi. 2002.5.2 + // 뱀파이어만 건드릴 수가 있다. + // NoSuch제거. by sigi. 2002.5.2 if (pFromCreature == NULL || !pFromCreature->isVampire()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; } - GCSkillToObjectOK1 _GCSkillToObjectOK1; // ų ѿ... - GCMorph1 _GCMorph1; // ڿ.. - GCMorphSlayer2 _GCMorphSlayer2; // ۵鿡.. + GCSkillToObjectOK1 _GCSkillToObjectOK1; // 스킬 쓴 넘에게... + GCMorph1 _GCMorph1; // 변신 당사자에게.. + GCMorphSlayer2 _GCMorphSlayer2; // 변신 구경꾼들에게.. SkillType_t SkillType = pSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); @@ -59,27 +59,27 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk if (bRangeCheck && bHitRoll) { ////////////////////////////////////////////////////////////////////// - // ؾ Ѵ. + // 각종 존 레벨 정보를 삭제해야 한다. ////////////////////////////////////////////////////////////////////// - // Ƽ ʴ ̶ ش. + // 파티 초대 중이라면 정보를 삭제해 준다. PartyInviteInfoManager* pPIIM = pZone->getPartyInviteInfoManager(); Assert(pPIIM != NULL); pPIIM->cancelInvite(pFromCreature); - // Ƽ ش. + // 파티 관련 정보를 삭제해 준다. int PartyID = pFromCreature->getPartyID(); if (PartyID != 0) { - // ÿ ϰ... + // 먼저 로컬에서 삭제하고... LocalPartyManager* pLPM = pZone->getLocalPartyManager(); Assert(pLPM != NULL); pLPM->deletePartyMember(PartyID, pFromCreature); - // ۷ι ش. + // 글로벌에서도 삭제해 준다. deleteAllPartyInfo(pFromCreature); } - // Ʈ̵ ̾ٸ Ʈ̵ ش. + // 트레이드 중이었다면 트레이드 관련 정보를 삭제해준다. TradeManager* pTM = pZone->getTradeManager(); Assert(pTM != NULL); pTM->cancelTrade(pFromCreature); @@ -90,7 +90,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Slayer* pNewSlayer = new Slayer; Vampire* pVampire = dynamic_cast(pFromCreature); - // DB Ȥ 𸣴 ش. + // DB에서 혹시 남아있을 지 모르는 흡혈 정보를 삭제해준다. Statement* pStmt = NULL; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); @@ -103,7 +103,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pNewSlayer->setName(pFromCreature->getName()); - // ũ ÷̾ Ϳ ÷̾ ũ ͸ Ѵ. + // 크리쳐 안의 플레이어 포인터와 플레이어 안의 크리쳐 포인터를 갱신한다. Player* pFromPlayer = pFromCreature->getPlayer(); pNewSlayer->setPlayer(pFromPlayer); GamePlayer* pFromGamePlayer = dynamic_cast(pFromPlayer); @@ -119,22 +119,22 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Dir_t dir = pFromCreature->getDir(); Tile& tile = pZone->getTile(x, y); - // pFromCreature , ̾ ü ̹Ƿ, - // PCFinder  ִ ̴. - // ׷Ƿ ̾ ͸ ְ, ο ̾ ͸ Ѵ. + // 곧 pFromCreature 즉, 원래의 뱀파이어 객체는 지워질 것이므로, + // PCFinder에 들어가 있는 값은 쓰레기 값이 될 것이다. + // 그러므로 뱀파이어 포인터를 지워주고, 새로운 슬레이어 포인터를 더한다. g_pPCFinder->deleteCreature(pFromCreature->getName()); g_pPCFinder->addCreature(pNewSlayer); - // Ʈ Ѵ. + // 길드 현재 접속 멤버 리스트에서 삭제한다. if (pVampire->getGuildID() != 0) g_pGuildManager->getGuild(pVampire->getGuildID())->deleteCurrentMember(pVampire->getName()); - // κ丮 ü. + // 인벤토리 교체. Inventory* pInventory = pVampire->getInventory(); pNewSlayer->setInventory(pInventory); pVampire->setInventory(NULL); - // ü + // 보관함 교체 pNewSlayer->deleteStash(); pNewSlayer->setStash(pVampire->getStash()); pNewSlayer->setStashNum(pVampire->getStashNum()); @@ -142,19 +142,19 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pVampire->setStash(NULL); /* - // ü + // 가비지 교체 while (true) { Item* pGarbage = pVampire->popItemFromGarbage(); - // ̻ ٸ 극ũ... + // 더 이상 없다면 브레이크... if (pGarbage == NULL) break; pNewSlayer->addItemToGarbage(pGarbage); } */ - // ÷ ü + // 플래그 셋 교체 pNewSlayer->deleteFlagSet(); pNewSlayer->setFlagSet(pVampire->getFlagSet()); pVampire->setFlagSet(NULL); @@ -162,19 +162,19 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Item* pItem = NULL; _TPOINT point; - // ԰ ִ ۵ κ丮 Ǵ ٴ ű. + // 입고 있는 아이템들을 인벤토리 또는 바닥으로 옮긴다. for (int part = 0; part < (int)Vampire::VAMPIRE_WEAR_MAX; part++) { pItem = pVampire->getWearItem((Vampire::WearPart)part); if (pItem != NULL) { - //  ϰ... + // 먼저 기어에서 삭제하고... pVampire->deleteWearItem((Vampire::WearPart)part); - // κ丮 ڸ κ丮 ϰ... + // 인벤토리에 자리가 있으면 인벤토리에 더하고... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); } - // ڸ ٴڿ ߸. + // 자리가 없으면 바닥에 떨어뜨린다. else { ZoneCoord_t ZoneX = pVampire->getX(); ZoneCoord_t ZoneY = pVampire->getY(); @@ -197,12 +197,12 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk if (pItem != NULL) { pVampire->deleteItemFromExtraInventorySlot(); - // κ丮 ڸ κ丮 ϰ... + // 인벤토리에 자리가 있으면 인벤토리에 더하고... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); } - // ڸ ٴڿ ߸. + // 자리가 없으면 바닥에 떨어뜨린다. else { TPOINT pt; ZoneCoord_t ZoneX = pVampire->getX(); @@ -219,10 +219,10 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk } } - // ̾ ִ ̾ Űش. + // 뱀파이어 가지고 있던 돈을 슬레이어로 옮겨준다. pNewSlayer->setGoldEx(pVampire->getGold()); - // ų Ѵ. + // 스킬 정보를 전송한다. pNewSlayer->sendSlayerSkillInfo(); _GCMorph1.setPCInfo2(pNewSlayer->getSlayerInfo2()); @@ -237,7 +237,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pZone->broadcastPacket(x, y, &_GCMorphSlayer2, pNewSlayer); - // Ÿ ̾ ϰ, ο ̾ Ѵ. + // 타일 및 존에서 기존 뱀파이어를 삭제하고, 새로운 슬레이어를 더한다. tile.deleteCreature(pFromCreature->getObjectID()); pZone->deletePC(pFromCreature); @@ -252,7 +252,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pNewSlayer->tinysave("Race='SLAYER'"); SAFE_DELETE(pFromCreature); - // þ update.. + // 시야 update.. pZone->updateHiddenScan(pNewSlayer); _GCSkillToObjectOK1.setSkillType(SkillType); @@ -283,7 +283,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk } ////////////////////////////////////////////////////////////////////////////// -// NPC Ʈ ڵ鷯 +// NPC 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { __BEGIN_TRY @@ -298,14 +298,14 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { Zone* pZone = pNPC->getZone(); Assert(pZone != NULL); - // ̾ ǵ帱 ִ. + // 뱀파이어만 건드릴 수가 있다. if (!pFromCreature->isVampire()) { // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; } - GCMorph1 _GCMorph1; // ڿ.. - GCMorphSlayer2 _GCMorphSlayer2; // ۵鿡.. + GCMorph1 _GCMorph1; // 변신 당사자에게.. + GCMorphSlayer2 _GCMorphSlayer2; // 변신 구경꾼들에게.. SkillType_t SkillType = SKILL_RESTORE; @@ -315,27 +315,27 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { // if (bRangeCheck && bHitRoll) if (bHitRoll) { ////////////////////////////////////////////////////////////////////// - // ؾ Ѵ. + // 각종 존 레벨 정보를 삭제해야 한다. ////////////////////////////////////////////////////////////////////// - // Ƽ ʴ ̶ ش. + // 파티 초대 중이라면 정보를 삭제해 준다. PartyInviteInfoManager* pPIIM = pZone->getPartyInviteInfoManager(); Assert(pPIIM != NULL); pPIIM->cancelInvite(pFromCreature); - // Ƽ ش. + // 파티 관련 정보를 삭제해 준다. int PartyID = pFromCreature->getPartyID(); if (PartyID != 0) { - // ÿ ϰ... + // 먼저 로컬에서 삭제하고... LocalPartyManager* pLPM = pZone->getLocalPartyManager(); Assert(pLPM != NULL); pLPM->deletePartyMember(PartyID, pFromCreature); - // ۷ι ش. + // 글로벌에서도 삭제해 준다. deleteAllPartyInfo(pFromCreature); } - // Ʈ̵ ̾ٸ Ʈ̵ ش. + // 트레이드 중이었다면 트레이드 관련 정보를 삭제해준다. TradeManager* pTM = pZone->getTradeManager(); Assert(pTM != NULL); pTM->cancelTrade(pFromCreature); @@ -346,7 +346,7 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { Slayer* pNewSlayer = new Slayer; Vampire* pVampire = dynamic_cast(pFromCreature); - // DB Ȥ 𸣴 ش. + // DB에서 혹시 남아있을 지 모르는 흡혈 정보를 삭제해준다. Statement* pStmt = NULL; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); @@ -370,35 +370,35 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { pNewSlayer->setXYDir(x, y, dir); - // ũ ÷̾ Ϳ ÷̾ ũ ͸ Ѵ. + // 크리쳐 안의 플레이어 포인터와 플레이어 안의 크리쳐 포인터를 갱신한다. Player* pFromPlayer = pFromCreature->getPlayer(); pNewSlayer->setPlayer(pFromPlayer); GamePlayer* pFromGamePlayer = dynamic_cast(pFromPlayer); pFromGamePlayer->setCreature(pNewSlayer); - // pFromCreature , ̾ ü ̹Ƿ, - // PCFinder  ִ ̴. - // ׷Ƿ ̾ ͸ ְ, ο ̾ ͸ Ѵ. + // 곧 pFromCreature 즉, 원래의 뱀파이어 객체는 지워질 것이므로, + // PCFinder에 들어가 있는 값은 쓰레기 값이 될 것이다. + // 그러므로 뱀파이어 포인터를 지워주고, 새로운 슬레이어 포인터를 더한다. g_pPCFinder->deleteCreature(pFromCreature->getName()); g_pPCFinder->addCreature(pNewSlayer); - // Ʈ Ѵ. + // 길드 현재 접속 멤버 리스트에서 삭제한다. if (pVampire->getGuildID() != 0) g_pGuildManager->getGuild(pVampire->getGuildID())->deleteCurrentMember(pVampire->getName()); - // κ丮 ü. + // 인벤토리 교체. Inventory* pInventory = pVampire->getInventory(); pNewSlayer->setInventory(pInventory); pVampire->setInventory(NULL); - // ü + // 보관함 교체 pNewSlayer->deleteStash(); pNewSlayer->setStash(pVampire->getStash()); pNewSlayer->setStashNum(pVampire->getStashNum()); pNewSlayer->setStashStatus(false); pVampire->setStash(NULL); - // ÷ ü + // 플래그 셋 교체 pNewSlayer->deleteFlagSet(); pNewSlayer->setFlagSet(pVampire->getFlagSet()); pVampire->setFlagSet(NULL); @@ -406,19 +406,19 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { Item* pItem = NULL; _TPOINT point; - // ԰ ִ ۵ κ丮 Ǵ ٴ ű. + // 입고 있는 아이템들을 인벤토리 또는 바닥으로 옮긴다. for (int part = 0; part < (int)Vampire::VAMPIRE_WEAR_MAX; part++) { pItem = pVampire->getWearItem((Vampire::WearPart)part); if (pItem != NULL) { - //  ϰ... + // 먼저 기어에서 삭제하고... pVampire->deleteWearItem((Vampire::WearPart)part); - // κ丮 ڸ κ丮 ϰ... + // 인벤토리에 자리가 있으면 인벤토리에 더하고... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); } - // ڸ ٴڿ ߸. + // 자리가 없으면 바닥에 떨어뜨린다. else { ZoneCoord_t ZoneX = pVampire->getX(); ZoneCoord_t ZoneY = pVampire->getY(); @@ -441,12 +441,12 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { if (pItem != NULL) { pVampire->deleteItemFromExtraInventorySlot(); - // κ丮 ڸ κ丮 ϰ... + // 인벤토리에 자리가 있으면 인벤토리에 더하고... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); } - // ڸ ٴڿ ߸. + // 자리가 없으면 바닥에 떨어뜨린다. else { TPOINT pt; ZoneCoord_t ZoneX = pVampire->getX(); @@ -463,10 +463,10 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { } } - // ̾ ִ ̾ Űش. + // 뱀파이어 가지고 있던 돈을 슬레이어로 옮겨준다. pNewSlayer->setGoldEx(pVampire->getGold()); - // ų Ѵ. + // 스킬 정보를 전송한다. pNewSlayer->sendSlayerSkillInfo(); _GCMorph1.setPCInfo2(pNewSlayer->getSlayerInfo2()); @@ -481,7 +481,7 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { pZone->broadcastPacket(x, y, &_GCMorphSlayer2, pNewSlayer); - // Ÿ ̾ ϰ, ο ̾ Ѵ. + // 타일 및 존에서 기존 뱀파이어를 삭제하고, 새로운 슬레이어를 더한다. tile.deleteCreature(pFromCreature->getObjectID()); pZone->deletePC(pFromCreature); @@ -496,11 +496,11 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) throw(Error) { pNewSlayer->tinysave("Race='SLAYER'"); SAFE_DELETE(pFromCreature); - // þ update.. + // 시야 update.. pZone->updateHiddenScan(pNewSlayer); EffectRestore* pEffectRestore = new EffectRestore(pNewSlayer); - // pEffectRestore->setDeadline(60*60*24*7*10); // 7 + // pEffectRestore->setDeadline(60*60*24*7*10); // 7일 pEffectRestore->setDeadline(60 * 60 * 12 * 10); // 12 hours,chengh modify at 2005 10 27 pNewSlayer->addEffect(pEffectRestore); pNewSlayer->setFlag(Effect::EFFECT_CLASS_RESTORE); diff --git a/src/server/Thread.h b/src/server/Thread.h index 565d7edc..a5b88774 100644 --- a/src/server/Thread.h +++ b/src/server/Thread.h @@ -8,25 +8,25 @@ // // POSIX Thread Class // -//  ƾ , ϴ Thread Ŭ -// ޾ derived Ŭ , run() Լ , -// derived Ŭ ü ؼ Start() Լ ϸ ȴ. +// 만일 어떤 루틴을 쓰레드로 돌리려면, 일단 Thread 클래스를 상속 +// 받아 derived 클래스를 설계, run() 멤버함수만 재정의한 후, +// derived 클래스의 객체를 생성해서 Start() 함수를 실행하면 된다. // -// . +// 사용방법은 다음과 같다. // // MDerivedThread * dt = new DerivedThread (...); // dt->Start(); // delete dt; // -// virtual destructor ǵ , Ȳ -// ϰ ϱ ؼ̴. ( Ŭ -// destructor ȣ ʴ´. ) +// virtual destructor 가 정의된 이유는, 다음과 같은 상황에서 제대로 +// 동작하게 하기 위해서이다. ( 만일 정의하지 않으면 하위 클래스의 +// destructor 는 호출되지 않는다. ) // // Thread * t = new DerivedThread (...); // t->Start(); // delete t; // -// ü ϴ Ͱ 带 Ű ϴ. +// 단 쓰레드 객체를 삭제하는 것과 쓰레드를 종료시키는 것은 무관하다. // ////////////////////////////////////////////////////////////////////// @@ -65,10 +65,10 @@ class Thread { ////////////////////////////////////////////////// public: enum ThreadStatus { - READY, // run غ Ǿ ִ - RUNNING, // running - EXITING, // ( ó ϰ ִ ) - EXIT // + READY, // run 할 준비가 되어 있는 상태 + RUNNING, // 실제로 running 중인 상태 + EXITING, // 종료 직전 상태 (실제로 처리는 하고 있는 중임) + EXIT // 완전히 종료한 상태 }; @@ -89,23 +89,23 @@ class Thread { ////////////////////////////////////////////////// public: - // 尡 ʷ ϵ ִ trigger ϴ Լ. - // ü Ŀ, Լ ȣϸ derived Ŭ - // run() Լ ȣϰ ȴ. + // 쓰레드가 최초로 동작하도록 해주는 trigger 의 역할을 하는 함수. 쓰레드 + // 객체를 생성한 후에, 이 함수를 호출하면 내부적으로 derived 클래스의 + // run() 멤버함수를 호출하게 된다. void start(); - // 带 ߴܽŲ. - // ο ؽ ϴ Ŭ ϴ. + // 동작중인 쓰레드를 중단시킨다. + // 내부에 뮤텍스를 사용하는 하위 쓰레드 클래스에서만 가능하다. virtual void stop(); - // 尡 ٸ. 尣 ȴ. - // 带 Ư ۾ Ų ó Ϸ - // Ų 带 ȴ. Ƽμ ȯ - // join Ѵ. + // 쓰레드가 종료할 때까지 기다린다. 역시 쓰레드간에 사용된다. 보통은 + // 쓰레드를 새로 생성시켜 특정 작업을 시킨 후 그 처리가 완료될 때까지 + // 생성시킨 쓰레드를 잠재우는 과정에서 사용된다. 멀티프로세싱 환경 + // 에서의 join 과 같은 역할을 한다. // - // pthread_join() ڵ带 ϴ 尡 - // Ķͷ 带 ٸٴ ̴. , Ư 尡 - // Ǵٸ Ư 带 ٸ . + // 주의할 점은 pthread_join() 은 현재 이 코드를 실행하는 쓰레드가 + // 파라미터로 지정받은 쓰레드를 기다린다는 것이다. 즉, 특정 쓰레드가 + // 또다른 특정 쓰레드를 기다리게 할 수는 없다. // // ex> Thread t; // Thread::Join ( t ); @@ -114,21 +114,21 @@ class Thread { static void join(const Thread& t, void* retval); static void join(const Thread* t, void* retval); - // 带 Detached ٲ۴. + // 쓰레드를 Detached 모드로 바꾼다. void detach(); - // Ѵ. Ư 带 Ųٴ ƴ϶, - // ޽带 ϴ 带 Ųٴ ̴. ̶, Ư - // ü Ķͷ Ѱν JOIN ϴ 尡 ޾Ƴ - // ִ. + // 현재 쓰레드들 종료한다. 즉 특정 쓰레드를 종료시킨다는 말이 아니라, + // 이 메쏘드를 수행하는 쓰레드를 종료시킨다는 말이다. 이때, 특정 + // 객체를 파라미터로 넘겨줌으로써 JOIN 하는 쓰레드가 그 값을 받아낼 + // 수도 있다. // // ex> Thread::Exit(); // or // Thread::Exit(retval); static void exit(void* retval = NULL); - // 忡 Ǵ ڵ尡  κ̴. Thread - // Ŭ ӹ Ŭ ׻ Լ Ѵ. + // 쓰레드에서 독립적으로 실행되는 코드가 들어가는 부분이다. Thread + // 클래스를 상속받은 하위 클래스는 항상 이 함수를 재정의해줘야 한다. virtual void run() {}; @@ -139,7 +139,7 @@ class Thread { // get current thread's tid static TID self(); - // ̴. 忡 string · ȯѴ. + // 디버깅용이다. 쓰레드에 대한 정보를 string 의 형태로 반환한다. virtual string toString() const; // get thread identifier diff --git a/src/server/ThreadAttr.cpp b/src/server/ThreadAttr.cpp index 60a33bdf..57062d49 100644 --- a/src/server/ThreadAttr.cpp +++ b/src/server/ThreadAttr.cpp @@ -49,7 +49,7 @@ ThreadAttr::~ThreadAttr() { ////////////////////////////////////////////////////////////////////// // -// DETACHED attribute Ѵ. +// 쓰레드의 DETACHED attribute를 리턴한다. // ////////////////////////////////////////////////////////////////////// int ThreadAttr::getDetachState() const { @@ -65,7 +65,7 @@ int ThreadAttr::getDetachState() const { ////////////////////////////////////////////////////////////////////// // -// DETACHED attribute Ѵ. +// 쓰레드의 DETACHED attribute를 설정한다. // ////////////////////////////////////////////////////////////////////// void ThreadAttr::setDetachState(int state) { diff --git a/src/server/ThreadAttr.h b/src/server/ThreadAttr.h index 4e47937e..1a88829e 100644 --- a/src/server/ThreadAttr.h +++ b/src/server/ThreadAttr.h @@ -28,15 +28,15 @@ class ThreadAttrException; // // class ThreadAttr; // -// Thread-Attribute Ŭ Ӽ(attribute) Thread Ŭ -// ʿ䰡 pthread_create() Ķͷ ȴ. -// ϳ Thread-Attribute ü س ȴٴ ̴. -// (ֶ󸮽 忡 ־ Ҷ thread-flag ߴ -// ǻ ~) +// Thread-Attribute 클래스는 동일한 속성(attribute)의 Thread 클래스를 +// 여러 개 생성할 필요가 있을 때 pthread_create()의 파라미터로 사용된다. +// 즉 하나의 Thread-Attribute 객체만 생성해놓으면 된다는 뜻이다. +// (솔라리스 쓰레드에 있어서 생성할때마다 thread-flag 를 지정했던 +// 기억을 되살려 보라~) // -// ׷, δ ϴ. ֳϸ ϰ -// setstacksize() , detach pthread_detach() -// ε ϱ ̴. +// 그런데, 실제로는 잘 쓰이지 않을 듯 하다. 왜냐하면 가장 유용하게 +// 사용될 setstacksize()가 제공되지 않으며, detach 는 pthread_detach() +// 로도 충분하기 때문이다. // ////////////////////////////////////////////////////////////////////// @@ -63,7 +63,7 @@ class ThreadAttr { // // do not return pthread_attr_t value !! // use pthread_attr_t pointer instead. - // (pthread_attr_t assignment ɼ ) + // (pthread_attr_t 에 대해 assignment 가 지원되지 않을 가능성 있음) // pthread_attr_t* getAttr() { return &attr; diff --git a/src/server/Timeval.cpp b/src/server/Timeval.cpp index 8265d805..ea8800c3 100644 --- a/src/server/Timeval.cpp +++ b/src/server/Timeval.cpp @@ -2,7 +2,7 @@ // // Filename : Timeval.cpp // Written By : Reiot -// Description : struct timeval õ operator Ƴ +// Description : struct timeval 에 관련된 operator 들을 모아놓은 파일 // ////////////////////////////////////////////////////////////////////// @@ -50,8 +50,8 @@ bool operator<(const Timeval& left, const Timeval& right) { //-------------------------------------------------------------------------------- -// timediff 쿡 Ѵ. -// ( ð Ѵٴ 콺 ̴. - -; ) +// timediff의 결과값끼리 더할 경우에 사용한다. +// (사실 현재 시간끼리 더한다는 것은 우스운 짓이다. - -; ) //-------------------------------------------------------------------------------- Timeval operator+(const Timeval& left, const Timeval& right) { Timeval result; @@ -69,7 +69,7 @@ Timeval operator+(const Timeval& left, const Timeval& right) { //-------------------------------------------------------------------------------- -// Timeval ð Ѵ. +// 두 Timeval 간의 시간차를 구한다. //-------------------------------------------------------------------------------- Timeval timediff(const Timeval& left, const Timeval& right) { Timeval result; diff --git a/src/server/Timeval.h b/src/server/Timeval.h index f402b1fd..edd4994f 100644 --- a/src/server/Timeval.h +++ b/src/server/Timeval.h @@ -2,7 +2,7 @@ // // Filename : Timeval.h // Written By : Reiot -// Description : struct timeval õ operator Ƴ +// Description : struct timeval 에 관련된 operator 들을 모아놓은 파일 // //-------------------------------------------------------------------------------- @@ -32,12 +32,12 @@ bool operator==(const Timeval& left, const Timeval& right); bool operator<=(const Timeval& left, const Timeval& right); bool operator<(const Timeval& left, const Timeval& right); -// timediff 쿡 Ѵ. -// ( ð Ѵٴ 콺 ̴. - -; ) +// timediff의 결과값끼리 더할 경우에 사용한다. +// (사실 현재 시간끼리 더한다는 것은 우스운 짓이다. - -; ) Timeval operator+(const Timeval& left, const Timeval& right); // -// Timeval ð Ѵ. +// 두 Timeval 간의 시간차를 구한다. // Timeval timediff(const Timeval& left, const Timeval& right); diff --git a/src/server/ZoneUtil.cpp b/src/server/ZoneUtil.cpp index a036091b..2f9dff0f 100644 --- a/src/server/ZoneUtil.cpp +++ b/src/server/ZoneUtil.cpp @@ -2,8 +2,8 @@ // Filename : ZoneUtil.cpp // Written by : excel96 // Description : -// õ Ư ۾ ϴ Լ ȿ ϱ, -// ʹ Ŀ ־, ܺη Լ̴. +// 존과 관련된 특정한 작업들을 수행하는 함수들을 존 안에 넣으니까, +// 존 파일이 너무 커지는 경향이 있어서, 존 파일 외부로 꺼낸 함수들이다. ////////////////////////////////////////////////////////////////////////////// #include "ZoneUtil.h" @@ -116,12 +116,12 @@ string correctString(const string& str) { ////////////////////////////////////////////////////////////////////////////// -// Ư ũĸ ִ ġ ã´. +// 특정 크리쳐를 더할 수 있는 위치를 찾는다. // -// Zone* pZone : -// ZoneCoord_t cx : ϰ ϴ ʱ ġ x -// ZoneCoord_t cy : ϰ ϴ ʱ ġ y -// Creature::MoveMode MMode : ũ +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t cx : 더하고자 하는 초기 위치 x +// ZoneCoord_t cy : 더하고자 하는 초기 위치 y +// Creature::MoveMode MMode : 크리쳐의 무브 모드 ////////////////////////////////////////////////////////////////////////////// TPOINT findSuitablePosition(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy, Creature::MoveMode MMode) throw() { __BEGIN_TRY @@ -192,13 +192,13 @@ TPOINT findSuitablePosition(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy, Creatur ////////////////////////////////////////////////////////////////////////////// -// Ư ִ ġ ã´. +// 특정 아이템을 더할 수 있는 위치를 찾는다. // -// Zone* pZone : -// ZoneCoord_t cx : ϰ ϴ ʱ ġ x -// ZoneCoord_t cy : ϰ ϴ ʱ ġ y -// bool bAllowCreature : ũİ ϴ ? -// bool bAllowSafeZone : Safe Zone ? +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t cx : 더하고자 하는 초기 위치 x +// ZoneCoord_t cy : 더하고자 하는 초기 위치 y +// bool bAllowCreature : 크리쳐가 존재하는 곳도 괜찮은가? +// bool bAllowSafeZone : Safe Zone 도 괜찮은가? ////////////////////////////////////////////////////////////////////////////// TPOINT findSuitablePositionForItem(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy, bool bAllowCreature, bool bAllowSafeZone, bool bForce) throw() { @@ -216,24 +216,24 @@ TPOINT findSuitablePositionForItem(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy, TPOINT pt; do { - // ȭ 輱  ϱ Ͽ - // ɼ ְ ߸ ִ üũ Ѵ. + // 화면의 경계선에 아이템이 들어가는 것을 방지하기 위하여 + // 일정 옵셋을 주고 떨어뜨릴 수 있는지 체크를 한다. if (x > 2 && y > 2 && x < pZone->getWidth() - 2 && y < pZone->getHeight() - 2) { Tile& rTile = pZone->getTile(x, y); - // GroundBlock ƴϰų (Block̴) ijͰ ִ by sigi + // GroundBlock이 아니거나 (Block이더라도)지상 캐릭터가 있는 경우 by sigi if ((!rTile.isGroundBlocked() || rTile.hasWalkingCreature()) && rTile.hasItem() == false && rTile.hasPortal() == false) { - // Safe ߸ ȵǴ üũ + // Safe 존에 떨어뜨리면 안되는 아이템인 경우 체크 if (bAllowSafeZone || !(pZone->getZoneLevel(x, y) & SAFE_ZONE)) { pt.x = x; pt.y = y; return pt; } - // ͻŬ , NPC ؿ ͻŬ Ǿ - // ÷̾ ͻŬ Ŭ ϴ 찡 ִ. - // ذϱ , ŸϿ ũİ ϴ üũ - // ̰ŵ ŵ ...̻ ڵ.. 2003.03.12 by bezz + // 모터사이클을 생성할 때, NPC 밑에 모터사이클이 생성되어서 + // 플레이어가 모터사이클을 클릭하지 못하는 경우가 있다. + // 이 문제를 해결하기 위해, 타일에 크리쳐가 존재하는지 체크 + // 이거든 저거든 무조건 통과네...이상한 코드네.. 2003.03.12 by bezz // if (bAllowCreature == false && rTile.hasCreature() == false) // { // pt.x = x; @@ -289,12 +289,12 @@ TPOINT findSuitablePositionForItem(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy, } ////////////////////////////////////////////////////////////////////////////// -// Ư Ʈ ִ ġ ã´. +// 특정 이펙트를 더할 수 있는 위치를 찾는다. // -// Zone* pZone : -// ZoneCoord_t cx : ϰ ϴ ʱ ġ x -// ZoneCoord_t cy : ϰ ϴ ʱ ġ y -// Effect::EffectClass EClass : ϰ ϴ Ʈ Ŭ +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t cx : 더하고자 하는 초기 위치 x +// ZoneCoord_t cy : 더하고자 하는 초기 위치 y +// Effect::EffectClass EClass : 더하고자 하는 이펙트 클래스 ////////////////////////////////////////////////////////////////////////////// TPOINT findSuitablePositionForEffect(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy, Effect::EffectClass EClass) throw() { __BEGIN_TRY @@ -313,11 +313,11 @@ TPOINT findSuitablePositionForEffect(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy do { if (x > 0 && y > 0 && x < pZone->getWidth() && y < pZone->getHeight()) { Tile& rTile = pZone->getTile(x, y); - // Ʈ ִ Ÿ̾ ϰ, Ʈ Ѵ. + // 이펙트를 더할 수 있는 타일이어야 하고, 같은 종류의 이펙트 또한 없어야 한다. if (rTile.canAddEffect() && rTile.getEffect(EClass) == NULL) { bool bNearTileCheck = true; - // 8ŸϿ Ʈ Ѵ. + // 주위 8타일에 같은 이펙트가 없어야 한다. for (int i = 0; i < 8; i++) { int tileX = x + dirMoveMask[i].x; int tileY = y + dirMoveMask[i].y; @@ -364,12 +364,12 @@ TPOINT findSuitablePositionForEffect(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy } ////////////////////////////////////////////////////////////////////////////// -// Ư ġ ũĸ ߰ ִ ˻Ѵ. +// 특정 위치에서 지정된 무브모드의 크리쳐를 추가할 수 있는지 검사한다. // -// Zone* pZone : -// ZoneCoord_t x : ϰ ϴ ǥ x -// ZoneCoord_t y : ϰ ϴ ǥ y -// Creature::MoveMode MMode : ũ +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t x : 변신하고자 하는 좌표 x +// ZoneCoord_t y : 변신하고자 하는 좌표 y +// Creature::MoveMode MMode : 크리쳐의 무브 모드 ////////////////////////////////////////////////////////////////////////////// bool canAddCreature(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, Creature::MoveMode MMode) throw() { __BEGIN_TRY @@ -389,11 +389,11 @@ bool canAddCreature(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, Creature::MoveMod ////////////////////////////////////////////////////////////////////////////// -// Ư ġ ο찡 üũ Ѵ. +// 특정 위치에 버로우가 가능한지 체크를 한다. // -// Zone* pZone : -// ZoneCoord_t x : οϰ ϴ ǥ x -// ZoneCoord_t y : οϰ ϴ ǥ y +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t x : 버로우하고자 하는 좌표 x +// ZoneCoord_t y : 버로우하고자 하는 좌표 y ////////////////////////////////////////////////////////////////////////////// bool canBurrow(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y) throw() { __BEGIN_TRY @@ -407,11 +407,11 @@ bool canBurrow(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y) throw() { ////////////////////////////////////////////////////////////////////////////// -// Ư ġ ο찡 üũ Ѵ. +// 특정 위치에 언버로우가 가능한지 체크를 한다. // -// Zone* pZone : -// ZoneCoord_t x : οϰ ϴ ǥ x -// ZoneCoord_t y : οϰ ϴ ǥ y +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t x : 버로우하고자 하는 좌표 x +// ZoneCoord_t y : 버로우하고자 하는 좌표 y ////////////////////////////////////////////////////////////////////////////// bool canUnburrow(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y) throw() { __BEGIN_TRY @@ -425,12 +425,12 @@ bool canUnburrow(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y) throw() { ////////////////////////////////////////////////////////////////////////////// -// ũĸ ڷ Ѵ. +// 크리쳐를 뒤로 물러나게 한다. // -// Zone* pZone : -// Creature* pCreature : ũ -// ZoneCoord_t originX : pCreature ǥ x -// ZoneCoord_t originY : pCreature ǥ y +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 물러나게 할 크리쳐 +// ZoneCoord_t originX : pCreature를 물러나게 한 상대방의 좌표 x +// ZoneCoord_t originY : pCreature를 물러나게 한 상대방의 좌표 y ////////////////////////////////////////////////////////////////////////////// Dir_t knockbackCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t originX, ZoneCoord_t originY) throw(ProtocolException, Error) { @@ -474,7 +474,7 @@ Dir_t knockbackCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t originX, // if ( pMonster->hasRelic() || pMonster->getBrain() == NULL ) return UP; } - // ũİ ǥ Ѵ. + // 크리쳐가 물러날 좌표 및 방향을 계산한다. ZoneCoord_t nx = pCreature->getX(); ZoneCoord_t ny = pCreature->getY(); ZoneCoord_t cx = nx; @@ -487,7 +487,7 @@ Dir_t knockbackCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t originX, if (rOriginTile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION) != NULL) return UP; - // ǥ Ѵ. + // 물러날 좌표를 꼐산한다. switch (dir) { case UP: if (ny > 0) { @@ -535,8 +535,8 @@ Dir_t knockbackCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t originX, break; } - // ӿ ִ ° ƴϾ ϰ - // ־ϰ, ũ ִ ¿ Ѵ. + // 관 속에 있는 상태가 아니어야 하고 + // 도착지점은 비어 있어야하고, 크리쳐 역시 움직일 수 있는 상태여야 한다. Tile& rTargetTile = pZone->getTile(nx, ny); if (!pCreature->isFlag(Effect::EFFECT_CLASS_CASKET) && !rTargetTile.isBlocked(pCreature->getMoveMode()) && !pCreature->isFlag(Effect::EFFECT_CLASS_HIDE) && !rTargetTile.hasPortal()) { @@ -544,16 +544,16 @@ Dir_t knockbackCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t originX, pCreature->setY(ny); try { - // ŸϿ ũĸ Ѵ. + // 이전 타일에서 크리쳐를 삭제한다. rOriginTile.deleteCreature(pCreature->getObjectID()); - // ŸϿ ũĸ ߰Ѵ. + // 새 타일에 크리쳐를 추가한다. if (!rTargetTile.addCreature(pCreature)) { - // Portal activateŲ ̴. by sigi. 2002.5.6 + // Portal을 activate시킨 경우이다. by sigi. 2002.5.6 return dir; } - // ڸ üũѴ. + // 지뢰를 체크한다. try { checkMine(pZone, pCreature, nx, ny); checkTrap(pZone, pCreature); @@ -561,7 +561,7 @@ Dir_t knockbackCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t originX, filelog("CheckMineBug.txt", "%s : %s", "KnockBackCreature", t.toString().c_str()); } - // GCMove/GCAddSlayer/GCAddVampire εijƮ. + // GCMove/GCAddSlayer/GCAddVampire를 브로드캐스트. if (pCreature->isPC()) { pZone->movePCBroadcast(pCreature, cx, cy, nx, ny, false, true); } else { @@ -572,7 +572,7 @@ Dir_t knockbackCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t originX, } catch (DuplicatedException& de) { throw Error("Thers's a creature on new tile"); } catch (PortalException&) { - // .. goto . + // 흐흐.. goto 다. } catch (Error& e) { filelog("assertTile.txt", "knockbackCreature : %s", e.toString().c_str()); throw; @@ -586,12 +586,12 @@ Dir_t knockbackCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t originX, ////////////////////////////////////////////////////////////////////////////// -// ̵带 ũĸ ߰Ѵ. +// 하이드를 쓴 크리쳐를 존에다 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̵带 ũ -// ZoneCoord_t cx : ũ ǥ x -// ZoneCoord_t cy : ũ ǥ y +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 하이드를 쓴 크리쳐 +// ZoneCoord_t cx : 크리쳐의 원래 좌표 x +// ZoneCoord_t cy : 크리쳐의 원래 좌표 y ////////////////////////////////////////////////////////////////////////////// void addBurrowingCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneCoord_t cy) throw(EmptyTileNotExistException, Error) { @@ -622,14 +622,14 @@ void addBurrowingCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Assert(pCreature == newTile.getCreature(pCreature->getMoveMode())); - // ũ ǥ Ѵ. + // 크리쳐의 좌표를 변경한다. pCreature->setXYDir(pt.x, pt.y, pCreature->getDir()); // scanPC(pCreature); - // GCDeleteObject gcDO; // ־.. ٽ ݴ. by sigi + // GCDeleteObject gcDO; // 잠시 넣었던거.. 다시 없앴다. by sigi // gcDO.setObjectID(pCreature->getObjectID()); - // ֺ PC鿡 ˸ GCAddBurrowingCreature + // 주변의 PC들에게 알릴 GCAddBurrowingCreature GCAddBurrowingCreature gcABC; gcABC.setObjectID(pCreature->getObjectID()); gcABC.setName(pCreature->getName()); @@ -638,11 +638,11 @@ void addBurrowingCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, //-------------------------------------------------------------------------------- // - // þ ¿ + 1 Ų. - // ⿡ ON_SIGHT DZ ̴. + // 시야 영역의 상하좌우 모두 + 1 씩 증가시킨다. + // 이유는 방향에 따른 ON_SIGHT 영역이 증가되기 때문이다. // //-------------------------------------------------------------------------------- - // ־ ٽ ݴ. by sigi + // 잠시 넣었던거 다시 없앴다. by sigi /* for (ZoneCoord_t ix = max(0, cx - maxViewportWidth - 1), endx = min(pZone->getWidth() - 1, cx + maxViewportWidth + 1) ; ix <= endx ; ix ++) @@ -665,12 +665,12 @@ void addBurrowingCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, { if (pViewer->isSlayer() && !pViewer->isFlag(Effect::EFFECT_CLASS_DETECT_HIDDEN)) { - // slayer̰ detect_hidden GCDeleteObject + // slayer이고 detect_hidden도 없으면 GCDeleteObject pViewer->getPlayer()->sendPacket(&gcDO); } else { - // vampirḛų.. detect_hidden ִٸ GCAddBurrowingCreature + // vampire이거나.. detect_hidden이 있다면 GCAddBurrowingCreature pViewer->getPlayer()->sendPacket(&gcABC); } }//if @@ -680,7 +680,7 @@ void addBurrowingCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, */ - // broadcastPacketο ִ óϴ.. + // broadcastPacket내부에서 볼수 있는지를 처리하더라.. pZone->broadcastPacket(pt.x, pt.y, &gcABC, pCreature); } else throw EmptyTileNotExistException("addBurrowingCreature() : Tile is not empty."); @@ -690,13 +690,13 @@ void addBurrowingCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ////////////////////////////////////////////////////////////////////////////// -// ̵带 Ǭ ũĸ ߰Ѵ. +// 하이드를 푼 크리쳐를 존에다 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̵带 Ǭ ũ -// ZoneCoord_t cx : ũ ǥ x -// ZoneCoord_t cy : ũ ǥ y -// Dir_t dir : ũİ +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 하이드를 푼 크리쳐 +// ZoneCoord_t cx : 크리쳐의 원래 좌표 x +// ZoneCoord_t cy : 크리쳐의 원래 좌표 y +// Dir_t dir : 나온 크리쳐가 향할 방향 ////////////////////////////////////////////////////////////////////////////// void addUnburrowCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneCoord_t cy, Dir_t dir) throw(EmptyTileNotExistException, Error) { @@ -714,16 +714,16 @@ void addUnburrowCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneC Tile& oldTile = pZone->getTile(oldX, oldY); Tile& newTile = pZone->getTile(pt.x, pt.y); - // ġ µ ִ Delete object . + // 이전 위치에서 숨었는데도 볼 수 있는 놈은 Delete object를 보낸다. GCDeleteObject gcDO; gcDO.setObjectID(pCreature->getObjectID()); pZone->broadcastPacket(oldX, oldY, &gcDO, pCreature); - // DeleteObject packet set. + // DeleteObject packet을 보낸후 set. pCreature->removeFlag(Effect::EFFECT_CLASS_HIDE); - // ŸϿ ũĸ , - // ŸϿ 带 ٲ㼭 ߰Ѵ. + // 옛날 타일에서 크리쳐를 지우고, + // 새 타일에 무브모드를 바꿔서 추가한다. try { oldTile.deleteCreature(pCreature->getObjectID()); } catch (Error& e) { @@ -735,20 +735,20 @@ void addUnburrowCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneC Assert(pCreature == newTile.getCreature(pCreature->getMoveMode())); - // ũó ǥ Ѵ. + // 크리처의 좌표를 지정한다. pCreature->setXYDir(pt.x, pt.y, dir); // scanPC(pCreature); Creature::CreatureClass CClass = pCreature->getCreatureClass(); if (CClass == Creature::CREATURE_CLASS_VAMPIRE) { - // ֺ PC鿡 ̾ ߰ϵ Ѵ. + // 주변의 PC들에게 뱀파이어를 추가하도록 한다. Vampire* pVampire = dynamic_cast(pCreature); GCAddVampireFromBurrowing gcAVFB(pVampire->getVampireInfo3()); gcAVFB.setEffectInfo(pVampire->getEffectInfo()); pZone->broadcastPacket(pt.x, pt.y, &gcAVFB, pCreature); - // Դٰ, ο ش. + // 땅에서 잘 나왔다고, 본인에게 보내준다. GCUnburrowOK gcUnburrowOK(pt.x, pt.y, dir); Player* pPlayer = pCreature->getPlayer(); GamePlayer* pGamePlayer = dynamic_cast(pPlayer); @@ -772,8 +772,8 @@ void addUnburrowCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneC throw Error("invalid creature type"); } } else { - // ڸ ã , - // ߴٰ ο ش. + // 적당한 자리를 찾지 못해, + // 땅에서 나오지 못했다고 본인에게 보내준다. if (pCreature->isPC()) { GCUnburrowFail gcUnburrowFail; pCreature->getPlayer()->sendPacket(&gcUnburrowFail); @@ -788,12 +788,12 @@ void addUnburrowCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneC ////////////////////////////////////////////////////////////////////////////// -// Ǭ ũĸ ߰Ѵ. +// 변신을 푼 크리쳐를 존에다 추가한다. // -// Zone* pZone : -// Creature* pCreature : Ǭ ũ -// bool bForce : Ʈ duration Ⱑ ʾҴµ, -// Ǫ ΰ? +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 변신을 푼 크리쳐 +// bool bForce : 이펙트의 duration이 만기가 되지 않았는데, +// 강제로 푸는 것인가? ////////////////////////////////////////////////////////////////////////////// void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) throw() { __BEGIN_TRY @@ -802,7 +802,7 @@ void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) throw Assert(pZone != NULL); Assert(pCreature != NULL); - // ° ´ üũ Ѵ. + // 현재 변신 상태가 맞는지 체크를 한다. Assert(pCreature->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF) || pCreature->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT) || pCreature->isFlag(Effect::EFFECT_CLASS_SUMMON_SYLPH) || @@ -827,17 +827,17 @@ void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) throw gcDO.setObjectID(pCreature->getObjectID()); pZone->broadcastPacket(oldX, oldY, &gcDO, pCreature); - // Ʈ ش. + // 이펙트를 삭제해 준다. EffectManager* pEffectManager = pCreature->getEffectManager(); Assert(pEffectManager != NULL); if (pCreature->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF)) { - pCreature->removeFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF); // DeleteObject packet set. + pCreature->removeFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF); // DeleteObject packet을 보낸후 set. - // Ʈ duraration Ⱑ ʾҴµ, Ʈ Ϸ - // deleteEffect Լ ҷ Ѵ. + // 이펙트의 duraration이 만기가 되지 않았는데, 이펙트를 삭제하려면 + // 강제로 deleteEffect 함수를 불러줘야 한다. if (bForce) { - // by sigi. 2002.7.2. RemoveEffect ش. + // by sigi. 2002.7.2. RemoveEffect 날려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList((EffectID_t)Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF); @@ -863,12 +863,12 @@ void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) throw } } if (pCreature->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WERWOLF)) { - pCreature->removeFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WERWOLF); // DeleteObject packet set. + pCreature->removeFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WERWOLF); // DeleteObject packet을 보낸후 set. - // Ʈ duraration Ⱑ ʾҴµ, Ʈ Ϸ - // deleteEffect Լ ҷ Ѵ. + // 이펙트의 duraration이 만기가 되지 않았는데, 이펙트를 삭제하려면 + // 강제로 deleteEffect 함수를 불러줘야 한다. if (bForce) { - // by sigi. 2002.7.2. RemoveEffect ش. + // by sigi. 2002.7.2. RemoveEffect 날려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList((EffectID_t)Effect::EFFECT_CLASS_TRANSFORM_TO_WERWOLF); @@ -893,12 +893,12 @@ void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) throw pMonster->initAllStat(); } } else if (pCreature->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT)) { - pCreature->removeFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT); // DeleteObject packet set. + pCreature->removeFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT); // DeleteObject packet을 보낸후 set. - // Ʈ duraration Ⱑ ʾҴµ, Ʈ Ϸ - // deleteEffect Լ ҷ Ѵ. + // 이펙트의 duraration이 만기가 되지 않았는데, 이펙트를 삭제하려면 + // 강제로 deleteEffect 함수를 불러줘야 한다. if (bForce) { - // by sigi. 2002.7.2. RemoveEffect ش. + // by sigi. 2002.7.2. RemoveEffect 날려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList((EffectID_t)Effect::EFFECT_CLASS_TRANSFORM_TO_BAT); @@ -924,8 +924,8 @@ void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) throw } } - // ŸϿ ũĸ ϰ, 带 ٲ - // ŸϿ ߰Ѵ. + // 기존 타일에서 크리쳐를 제거하고, 무브 모드를 바꿔준 다음에 + // 새 타일에 추가한다. Tile& oldTile = pZone->getTile(oldX, oldY); Tile& newTile = pZone->getTile(pt.x, pt.y); @@ -940,10 +940,10 @@ void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) throw Assert(pCreature == newTile.getCreature(pCreature->getMoveMode())); - // ũ ǥ ش. + // 크리쳐의 좌표를 지정해 준다. pCreature->setXYDir(pt.x, pt.y, pCreature->getDir()); - // ũ Ŭ , εijѴ. + // 크리쳐 클래스에 따라, 존에다 브로드캐스팅한다. Creature::CreatureClass CClass = pCreature->getCreatureClass(); if (CClass == Creature::CREATURE_CLASS_VAMPIRE) { @@ -983,9 +983,9 @@ void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) throw } } - // Ǭ ̾, ÷̾ ӵ ش. - // ̴ Ŭ̾Ʈ ӵ - // ̴. -- 輺 + // 변신을 푼 놈이 뱀파이어, 즉 플레이어라면 공격 속도를 보내준다. + // 이는 클라이언트에서 박쥐로 변신을 했을 때 이전의 공격 속도를 + // 저장할 수 없는 버그 때문이다. -- 김성민 if (pCreature->isVampire()) { Vampire* pVampire = dynamic_cast(pCreature); GCModifyInformation gcMI; @@ -999,12 +999,12 @@ void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) throw ////////////////////////////////////////////////////////////////////////////// -// ̴ ũĸ ߰Ѵ. +// 안 보이는 크리쳐를 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̴ ũ -// ZoneCoord_t cx : ũ ǥ x -// ZoneCoord_t cy : ũ ǥ y +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 안 보이는 크리쳐 +// ZoneCoord_t cx : 크리쳐의 원래 좌표 x +// ZoneCoord_t cy : 크리쳐의 원래 좌표 y ////////////////////////////////////////////////////////////////////////////// void addInvisibleCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneCoord_t cy) throw() { __BEGIN_TRY @@ -1012,7 +1012,7 @@ void addInvisibleCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone Assert(pZone != NULL); Assert(pCreature != NULL); - // ̾ ͸ ȭ ϴ. + // 뱀파이어나 몬스터만이 투명화가 가능하다. Assert(pCreature->isVampire() || pCreature->isMonster()); ObjectID_t creatureID = pCreature->getObjectID(); @@ -1031,8 +1031,8 @@ void addInvisibleCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone //-------------------------------------------------------------------------------- // - // þ ¿ + 1 Ų. - // ⿡ ON_SIGHT DZ ̴. + // 시야 영역의 상하좌우 모두 + 1 씩 증가시킨다. + // 이유는 방향에 따른 ON_SIGHT 영역이 증가되기 때문이다. // //-------------------------------------------------------------------------------- for (ZoneCoord_t ix = max(0, cx - maxViewportWidth - 1), @@ -1051,7 +1051,7 @@ void addInvisibleCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone Creature* pViewer = dynamic_cast(*itr); if (pViewer != pCreature && pViewer->isPC() && (pViewer->getVisionState(cx, cy) >= IN_SIGHT)) { - // Viewer ObservingEye Ʈ ´. + // Viewer 의 ObservingEye 이펙트를 가져온다. EffectObservingEye* pEffectObservingEye = NULL; if (pViewer->isFlag(Effect::EFFECT_CLASS_OBSERVING_EYE)) { pEffectObservingEye = @@ -1059,7 +1059,7 @@ void addInvisibleCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone // Assert( pEffectObservingEye != NULL ); } - // Viewer Gnome's Whisper Ʈ ´. + // Viewer 의 Gnome's Whisper 이펙트를 가져온다. EffectGnomesWhisper* pEffectGnomesWhisper = NULL; if (pViewer->isFlag(Effect::EFFECT_CLASS_GNOMES_WHISPER)) { pEffectGnomesWhisper = dynamic_cast( @@ -1083,7 +1083,7 @@ void addInvisibleCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone pViewer->getPlayer()->sendPacket(&gcDO); // cout << "send delete object" << endl; } - // invisbility ؼ, .. + // invisbility와 관련해서만, 볼 수 없는자.. /* if (!pViewer->isFlag(Effect::EFFECT_CLASS_DETECT_INVISIBILITY) && pViewer->isSlayer()) { @@ -1094,7 +1094,7 @@ void addInvisibleCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone pViewer->getPlayer()->sendPacket(&gcAddEffect); }*/ } else { - // Ƿ, ϰ͵ . + // 원래 볼 수 없었으므로, 암것도 할 일이 없다. } } // if } // for @@ -1105,11 +1105,11 @@ void addInvisibleCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone } ////////////////////////////////////////////////////////////////////////////// -// ̴ ũİ , ũĸ ߰Ѵ. +// 안 보이던 크리쳐가 보일 경우, 이 크리쳐를 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̴ ũ -// bool bForce : visible ° Ǿ? +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 안 보이던 크리쳐 +// bool bForce : 강제로 visible 상태가 되었나? ////////////////////////////////////////////////////////////////////////////// void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) throw() { __BEGIN_TRY @@ -1117,10 +1117,10 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) throw() Assert(pZone != NULL); Assert(pCreature != NULL); - // ̾ ͸ ȭ ϴ. + // 뱀파이어나 몬스터만이 투명화가 가능하다. Assert(pCreature->isVampire() || pCreature->isMonster()); - // ÷װ ־ Ѵ. + // 플래그가 켜져있어야 한다. Assert(pCreature->isFlag(Effect::EFFECT_CLASS_INVISIBILITY)); ZoneCoord_t cx = pCreature->getX(); @@ -1137,7 +1137,7 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) throw() if (CClass == Creature::CREATURE_CLASS_MONSTER) { Monster* pMonster = dynamic_cast(pCreature); - if (pCreature->isFlag(Effect::EFFECT_CLASS_HIDE)) // Ұ + if (pCreature->isFlag(Effect::EFFECT_CLASS_HIDE)) // 사실 불가능 { gcABC.setObjectID(pMonster->getObjectID()); gcABC.setName(pMonster->getName()); @@ -1146,9 +1146,9 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) throw() pGCAddXXX = &gcABC; } else { - // EffectManager ִ° ƴϱ ... - // ӽ÷ ؼ ش. - // ѽð Invisible - -; by sigi + // 몹의 EffectManager에 들어가있는게 아니기 때문에... + // 임시로 생성해서 보내준다. + // 몹은 무한시간 Invisible - -; by sigi EffectInfo* pEffectInfo = new EffectInfo; pEffectInfo->addListElement(Effect::EFFECT_CLASS_INVISIBILITY, 0xFFFF); @@ -1167,7 +1167,7 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) throw() } } else if (CClass == Creature::CREATURE_CLASS_VAMPIRE) { Vampire* pVampire = dynamic_cast(pCreature); - if (pCreature->isFlag(Effect::EFFECT_CLASS_HIDE)) // Ұ + if (pCreature->isFlag(Effect::EFFECT_CLASS_HIDE)) // 사실 불가능 { gcABC.setObjectID(pVampire->getObjectID()); gcABC.setName(pVampire->getName()); @@ -1196,8 +1196,8 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) throw() //-------------------------------------------------------------------------------- // - // þ ¿ + 1 Ų. - // ⿡ ON_SIGHT DZ ̴. + // 시야 영역의 상하좌우 모두 + 1 씩 증가시킨다. + // 이유는 방향에 따른 ON_SIGHT 영역이 증가되기 때문이다. // //-------------------------------------------------------------------------------- for (ZoneCoord_t ix = max(0, cx - maxViewportWidth - 1), @@ -1216,7 +1216,7 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) throw() Creature* pViewer = dynamic_cast(*itr); - // Viewer Revealer Ʈ ´. + // Viewer 의 Revealer 이펙트를 가져온다. // EffectRevealer* pEffectRevealer = NULL; // if ( pViewer->isFlag( Effect::EFFECT_CLASS_REVEALER ) ) // { @@ -1224,7 +1224,7 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) throw() // Effect::EFFECT_CLASS_REVEALER ) ); Assert( pEffectRevealer ); // } - // Viewer Observing Eye Ʈ ´. + // Viewer 의 Observing Eye 이펙트를 가져온다. EffectObservingEye* pEffectObservingEye = NULL; if (pViewer->isFlag(Effect::EFFECT_CLASS_OBSERVING_EYE)) { pEffectObservingEye = @@ -1232,7 +1232,7 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) throw() // Assert( pEffectObservingEye != NULL ); } - // Viewer Gnome's Whisper Ʈ ´. + // Viewer 의 Gnome's Whisper 이펙트를 가져온다. EffectGnomesWhisper* pEffectGnomesWhisper = NULL; if (pViewer->isFlag(Effect::EFFECT_CLASS_GNOMES_WHISPER)) { pEffectGnomesWhisper = @@ -1241,13 +1241,13 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) throw() } if (pViewer != pCreature && pViewer->isPC() && (pViewer->getVisionState(cx, cy) >= IN_SIGHT)) { - // ּó by sigi + // 주석처리 by sigi // if ((!pCreature->isFlag(Effect::EFFECT_CLASS_HIDE) // || pViewer->isFlag(Effect::EFFECT_CLASS_DETECT_HIDDEN))) { - // ij ֵ鿡 ؼ - // ij Addش. - // invisbility ؼ, .. + // 이전에 이 캐릭을 못 보던 애들에 한해서 + // 이 캐릭을 Add시켜준다. + // invisbility와 관련해서만, 볼 수 없는자.. if (!pViewer->isFlag(Effect::EFFECT_CLASS_DETECT_INVISIBILITY) && (pViewer->isSlayer() || pViewer->isOusters()) && !(pEffectObservingEye != NULL && pEffectObservingEye->canSeeInvisibility(pCreature)) && @@ -1257,10 +1257,10 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) throw() } // else { - // Ƿ, ϰ͵ . + // 원래 볼 수 없었으므로, 암것도 할 일이 없다. } - // ¶ų invisibleǮٴ° Ѵ. by sigi + // 어쨋거나 invisible풀린다는건 보내줘야한다. by sigi pViewer->getPlayer()->sendPacket(&gcRemoveEffect); } // if @@ -1273,7 +1273,7 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) throw() //-------------------------------------------- - // effect manager Effect Ѵ. + // effect manager에서 Effect를 강제 삭제한다. //-------------------------------------------- if (bForced == true) { EffectManager* pEffectManager = pCreature->getEffectManager(); @@ -1294,12 +1294,12 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) throw() } ////////////////////////////////////////////////////////////////////////////// -// ̴ ũĸ ߰Ѵ. +// 안 보이는 크리쳐를 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̴ ũ -// ZoneCoord_t cx : ũ ǥ x -// ZoneCoord_t cy : ũ ǥ y +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 안 보이는 크리쳐 +// ZoneCoord_t cx : 크리쳐의 원래 좌표 x +// ZoneCoord_t cy : 크리쳐의 원래 좌표 y ////////////////////////////////////////////////////////////////////////////// void addSnipingModeCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneCoord_t cy) throw() { __BEGIN_TRY @@ -1307,7 +1307,7 @@ void addSnipingModeCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zo Assert(pZone != NULL); Assert(pCreature != NULL); - // ̾ ִ. + // 슬레이어만 이 기술을 쓸 수 있다. Assert(pCreature->isSlayer()); ObjectID_t creatureID = pCreature->getObjectID(); @@ -1326,8 +1326,8 @@ void addSnipingModeCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zo //-------------------------------------------------------------------------------- // - // þ ¿ + 1 Ų. - // ⿡ ON_SIGHT DZ ̴. + // 시야 영역의 상하좌우 모두 + 1 씩 증가시킨다. + // 이유는 방향에 따른 ON_SIGHT 영역이 증가되기 때문이다. // //-------------------------------------------------------------------------------- for (ZoneCoord_t ix = max(0, cx - maxViewportWidth - 1), @@ -1346,14 +1346,14 @@ void addSnipingModeCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zo Creature* pViewer = dynamic_cast(*itr); if (pViewer != pCreature && pViewer->isPC() && (pViewer->getVisionState(cx, cy) >= IN_SIGHT)) { - // Viewer Revealer Ʈ ´. + // Viewer 의 Revealer 이펙트를 가져온다. // EffectRevealer* pEffectRevealer = NULL; // if ( pViewer->isFlag( Effect::EFFECT_CLASS_REVEALER ) ) // { // pEffectRevealer = dynamic_cast(pViewer->findEffect( // Effect::EFFECT_CLASS_REVEALER ) ); Assert( pEffectRevealer ); // } - // Viewer Gnome's Whisper Ʈ ´. + // Viewer 의 Gnome's Whisper 이펙트를 가져온다. EffectGnomesWhisper* pEffectGnomesWhisper = NULL; if (pViewer->isFlag(Effect::EFFECT_CLASS_GNOMES_WHISPER)) { pEffectGnomesWhisper = dynamic_cast( @@ -1377,7 +1377,7 @@ void addSnipingModeCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zo pViewer->getPlayer()->sendPacket(&gcDO); } - // invisbility ؼ, .. + // invisbility와 관련해서만, 볼 수 없는자.. /* if (!pViewer->isFlag(Effect::EFFECT_CLASS_DETECT_INVISIBILITY) || pViewer->isVampire()) { @@ -1388,7 +1388,7 @@ void addSnipingModeCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zo pViewer->getPlayer()->sendPacket(&gcAddEffect); }*/ } else { - // Ƿ, ϰ͵ . + // 원래 볼 수 없었으므로, 암것도 할 일이 없다. } } // if } // for @@ -1399,11 +1399,11 @@ void addSnipingModeCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zo } ////////////////////////////////////////////////////////////////////////////// -// ̴ ũİ , ũĸ ߰Ѵ. +// 안 보이던 크리쳐가 보일 경우, 이 크리쳐를 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̴ ũ -// bool bForce : visible ° Ǿ? +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 안 보이던 크리쳐 +// bool bForce : 강제로 visible 상태가 되었나? ////////////////////////////////////////////////////////////////////////////// void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) throw() { __BEGIN_TRY @@ -1411,10 +1411,10 @@ void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) th Assert(pZone != NULL); Assert(pCreature != NULL); - // ̾ ϴ. + // 슬레이어만이 스나이핑이 가능하다. Assert(pCreature->isSlayer()); - // ÷װ ־ Ѵ. + // 플래그가 켜져있어야 한다. Assert(pCreature->isFlag(Effect::EFFECT_CLASS_SNIPING_MODE)); ZoneCoord_t cx = pCreature->getX(); @@ -1442,8 +1442,8 @@ void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) th //-------------------------------------------------------------------------------- // - // þ ¿ + 1 Ų. - // ⿡ ON_SIGHT DZ ̴. + // 시야 영역의 상하좌우 모두 + 1 씩 증가시킨다. + // 이유는 방향에 따른 ON_SIGHT 영역이 증가되기 때문이다. // //-------------------------------------------------------------------------------- for (ZoneCoord_t ix = max(0, cx - maxViewportWidth - 1), @@ -1462,7 +1462,7 @@ void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) th Creature* pViewer = dynamic_cast(*itr); - // Viewer Revealer Ʈ ´. + // Viewer 의 Revealer 이펙트를 가져온다. // EffectRevealer* pEffectRevealer = NULL; // if ( pViewer->isFlag( Effect::EFFECT_CLASS_REVEALER ) ) // { @@ -1470,7 +1470,7 @@ void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) th // dynamic_cast(pViewer->findEffect(Effect::EFFECT_CLASS_REVEALER)); // Assert( pEffectRevealer ); // } - // Viewer Gnome's Whisper Ʈ ´. + // Viewer 의 Gnome's Whisper 이펙트를 가져온다. EffectGnomesWhisper* pEffectGnomesWhisper = NULL; if (pViewer->isFlag(Effect::EFFECT_CLASS_GNOMES_WHISPER)) { pEffectGnomesWhisper = @@ -1485,7 +1485,7 @@ void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) th // || ( pEffectRevealer != NULL && pEffectRevealer->canSeeHide( pCreature ) ) //)) { - // invisbility ؼ, .. + // invisbility와 관련해서만, 볼 수 없는자.. if (!pViewer->isFlag(Effect::EFFECT_CLASS_DETECT_INVISIBILITY) || (pEffectGnomesWhisper != NULL && pEffectGnomesWhisper->canSeeSniping())) // && !( pEffectRevealer != NULL && pEffectRevealer->canSeeSniping( @@ -1494,10 +1494,10 @@ void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) th pViewer->getPlayer()->sendPacket(pGCAddXXX); } } else { - // Ƿ, ϰ͵ . + // 원래 볼 수 없었으므로, 암것도 할 일이 없다. } - // sniping mode Ǯٴ ش. + // sniping mode 가 풀린다는 걸 보내준다. pViewer->getPlayer()->sendPacket(&gcRemoveEffect); } // if @@ -1510,7 +1510,7 @@ void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) th //-------------------------------------------- - // effect manager Effect Ѵ. + // effect manager에서 Effect를 강제 삭제한다. //-------------------------------------------- if (bForced == true) { EffectManager* pEffectManager = pCreature->getEffectManager(); @@ -1529,12 +1529,12 @@ void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) th } ////////////////////////////////////////////////////////////////////////////// -// ڸ Ѵ. +// 존에다 지뢰를 더한다. // -// Zone* pZone : -// Mine* pMine : ü -// ZoneCoord_t cx : ڸ ǥ x -// ZoneCoord_t cy : ڸ ǥ y +// Zone* pZone : 존에 대한 포인터 +// Mine* pMine : 지뢰 객체에 대한 포인터 +// ZoneCoord_t cx : 지뢰를 더할 좌표 x +// ZoneCoord_t cy : 지뢰를 더할 좌표 y ////////////////////////////////////////////////////////////////////////////// void addInstalledMine(Zone* pZone, Mine* pMine, ZoneCoord_t cx, ZoneCoord_t cy) throw() { __BEGIN_TRY @@ -1559,8 +1559,8 @@ void addInstalledMine(Zone* pZone, Mine* pMine, ZoneCoord_t cx, ZoneCoord_t cy) //-------------------------------------------------------------------------------- // - // þ ¿ + 1 Ų. - // ⿡ ON_SIGHT DZ ̴. + // 시야 영역의 상하좌우 모두 + 1 씩 증가시킨다. + // 이유는 방향에 따른 ON_SIGHT 영역이 증가되기 때문이다. // //-------------------------------------------------------------------------------- for (ZoneCoord_t ix = max(0, cx - maxViewportWidth - 1), @@ -1598,12 +1598,12 @@ void addInstalledMine(Zone* pZone, Mine* pMine, ZoneCoord_t cx, ZoneCoord_t cy) ////////////////////////////////////////////////////////////////////////////// -// Ư ũİ ڸ ʾҴ üũѴ. +// 특정 크리쳐가 지뢰를 밟지 않았는지 체크한다. // -// Zone* pZone : -// Creature* pCreature : ˻ ũ -// ZoneCoord_t X : ˻ ǥ x -// ZoneCoord_t Y : ˻ ǥ y +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 검사할 크리쳐 +// ZoneCoord_t X : 검사할 좌표 x +// ZoneCoord_t Y : 검사할 좌표 y ////////////////////////////////////////////////////////////////////////////// bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y) throw() { __BEGIN_TRY @@ -1617,20 +1617,20 @@ bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y) t if (bNonPK && pCreature->isPC()) return false; - // ̾ . + // 슬레이어가 밟을 순 없다. if (pCreature->isSlayer()) return false; Assert(pZone != NULL); - // ִ by sigi. 2002.11.7 - // ĽŰ ʴ´. + // 위에 있던걸 여기로 내림 by sigi. 2002.11.7 + // 만일 안전지대라면 폭파시키지 않는다. if (pZone->getZoneLevel(X, Y) & SAFE_ZONE) return false; Tile& rTile = pZone->getTile(X, Y); - // ŸϿ  ĽŰ ʴ´. + // 타일에 아이템이 없어도 폭파시키지 않는다. if (!rTile.hasItem()) return false; @@ -1638,8 +1638,8 @@ bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y) t Item* pItem = rTile.getItem(); - // ٴڿ ִ ν ڰ ƴϰų, - // ũİ ɾٴϴ ũİ ƴ϶ ڸ ĽŰ ʴ´. + // 바닥에 있는 아이템이 인스톨된 지뢰가 아니거나, + // 크리쳐가 걸어다니는 크리쳐가 아니라면 지뢰를 폭파시키지 않는다. if (pItem->getItemClass() != Item::ITEM_CLASS_MINE) return false; if (pItem->isFlag(Effect::EFFECT_CLASS_INSTALL) == false) @@ -1661,9 +1661,9 @@ bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y) t string InstallerName = pMine->getInstallerName(); int PartyID = pMine->getInstallerPartyID(); - BYTE explodeType = Type; // + BYTE explodeType = Type; // 폭발 형태 - // ڰ , ϴ ش. + // 지뢰가 폭발했으니, 일단 무조건 삭제해 준다. pZone->deleteItem(pMine, X, Y); GCDeleteObject gcDO; @@ -1698,7 +1698,7 @@ bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y) t const int* yOffsetByEType = NULL; int tiles = 0; - // ŸԿ offset ũ ´. + // 지뢰 타입에 따른 폭발 offset 마스크를 가져온다. getExplosionTypeXYOffset(explodeType, Dir, xOffsetByEType, yOffsetByEType, tiles); VSRect rect(0, 0, pZone->getWidth() - 1, pZone->getHeight() - 1); @@ -1708,18 +1708,18 @@ bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y) t tileY = Y + yOffsetByEType[tileI]; // cout << "Check1 Tile X : " << (int)tileX << "," << " Tile Y : " << (int)tileY << endl; - // ǥ ̰, 밡 ƴ϶... + // 현재 좌표가 존 내부이고, 안전 지대가 아니라면... if (rect.ptInRect(tileX, tileY) && !(pZone->getZoneLevel(tileX, tileY) & SAFE_ZONE)) { // if( tileX != X || tileY != Y ) checkMine( pZone, tileX, tileY ); const Tile& tile = pZone->getTile(tileX, tileY); const slist& oList = tile.getObjectList(); - // Ÿ Ʈ ؼ 縦 Ѵ. + // 타일 위의 모든 오브젝트에 대해서 조사를 한다. for (slist::const_iterator itr = oList.begin(); itr != oList.end(); itr++) { - // Ȯ + // 조건을 확인 Object* pObject = *itr; if (pObject->getObjectClass() == Object::OBJECT_CLASS_CREATURE) { - // Damage Դ ͵鸸 cList ߰Ų. + // Damage를 입는 것들만 cList에 추가시킨다. Creature* pTargetCreature = dynamic_cast(pObject); if (pTargetCreature->isSlayer()) { // Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); @@ -1763,9 +1763,9 @@ bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y) t } else if (pTargetCreature->isMonster()) { Monster* pMonster = dynamic_cast(pTargetCreature); - // ġ ߰ ش. - // ´ ̰, ڰ ̶, - // ϴ 켱 ̺ ־ Ѵ. + // 지뢰 설치자의 데미지를 추가해 준다. + // 맞는 놈이 몬스터이고, 공격자가 사람이라면, + // 데미지에 따라서 변하는 우선권 테이블을 갱신해 주어야 한다. pMonster->addPrecedence(InstallerName, PartyID, Damage); pMonster->setLastHitCreatureClass(Creature::CREATURE_CLASS_SLAYER); } @@ -1780,25 +1780,25 @@ bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y) t } ////////////////////////////////////////////////////////////////////////////// -// ڰ ƴ üũ Ѵ. +// 지뢰가 연쇄로 터지는지 아닌지 체크 한다. // -// Zone* pZone : -// Creature* pCreature : ˻ ũ -// ZoneCoord_t X : ˻ ǥ x -// ZoneCoord_t Y : ˻ ǥ y +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 검사할 크리쳐 +// ZoneCoord_t X : 검사할 좌표 x +// ZoneCoord_t Y : 검사할 좌표 y ////////////////////////////////////////////////////////////////////////////// bool checkMine(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y) throw() { __BEGIN_TRY Assert(pZone != NULL); - // ĽŰ ʴ´. + // 만일 안전지대라면 폭파시키지 않는다. if (pZone->getZoneLevel(X, Y) & SAFE_ZONE) return false; Tile& rTile = pZone->getTile(X, Y); - // ŸϿ  ĽŰ ʴ´. + // 타일에 아이템이 없어도 폭파시키지 않는다. if (rTile.hasItem() == false) return false; @@ -1806,8 +1806,8 @@ bool checkMine(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y) throw() { Item* pItem = rTile.getItem(); - // ٴڿ ִ ν ڰ ƴϰų, - // ũİ ɾٴϴ ũİ ƴ϶ ڸ ĽŰ ʴ´. + // 바닥에 있는 아이템이 인스톨된 지뢰가 아니거나, + // 크리쳐가 걸어다니는 크리쳐가 아니라면 지뢰를 폭파시키지 않는다. if (pItem->getItemClass() != Item::ITEM_CLASS_MINE) return false; if (pItem->isFlag(Effect::EFFECT_CLASS_INSTALL) == false) @@ -1827,7 +1827,7 @@ bool checkMine(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y) throw() { string InstallerName = pMine->getInstallerName(); int PartyID = pMine->getInstallerPartyID(); - BYTE explodeType = Type; // + BYTE explodeType = Type; // 폭발 형태 /* switch(Type) { @@ -1848,7 +1848,7 @@ bool checkMine(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y) throw() { }; */ - // ڰ , ϴ ش. + // 지뢰가 폭발했으니, 일단 삭제해 준다. pZone->deleteItem(pMine, X, Y); GCDeleteObject gcDO; @@ -1864,7 +1864,7 @@ bool checkMine(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y) throw() { const int* yOffsetByEType = NULL; int tiles = 0; - // ŸԿ offset ũ ´. + // 지뢰 타입에 따른 폭발 offset 마스크를 가져온다. getExplosionTypeXYOffset(explodeType, Dir, xOffsetByEType, yOffsetByEType, tiles); VSRect rect(0, 0, pZone->getWidth() - 1, pZone->getHeight() - 1); @@ -1874,19 +1874,19 @@ bool checkMine(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y) throw() { tileY = Y + yOffsetByEType[tileI]; // cout << "Check2 Tile X : " << (int)tileX << "," << " Tile Y : " << (int)tileY << endl; - // ǥ ̰, 밡 ƴ϶... + // 현재 좌표가 존 내부이고, 안전 지대가 아니라면... if (rect.ptInRect(tileX, tileY) && !(pZone->getZoneLevel(tileX, tileY) & SAFE_ZONE)) { // if( tileX != X || tileY != Y ) checkMine( pZone, tileX, tileY ); const Tile& tile = pZone->getTile(tileX, tileY); const slist& oList = tile.getObjectList(); - // Ÿ Ʈ ؼ 縦 Ѵ. + // 타일 위의 모든 오브젝트에 대해서 조사를 한다. for (slist::const_iterator itr = oList.begin(); itr != oList.end(); itr++) { - // Ȯ + // 조건을 확인 Object* pObject = *itr; if (pObject->getObjectClass() == Object::OBJECT_CLASS_CREATURE) { - // Damage Դ ͵鸸 cList ߰Ų. + // Damage를 입는 것들만 cList에 추가시킨다. Creature* pTargetCreature = dynamic_cast(pObject); if (pTargetCreature->isSlayer()) { // Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); @@ -1930,9 +1930,9 @@ bool checkMine(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y) throw() { } else if (pTargetCreature->isMonster()) { Monster* pMonster = dynamic_cast(pTargetCreature); - // ġ ߰ ش. - // ´ ̰, ڰ ̶, - // ϴ 켱 ̺ ־ Ѵ. + // 지뢰 설치자의 데미지를 추가해 준다. + // 맞는 놈이 몬스터이고, 공격자가 사람이라면, + // 데미지에 따라서 변하는 우선권 테이블을 갱신해 주어야 한다. pMonster->addPrecedence(InstallerName, PartyID, Damage); pMonster->setLastHitCreatureClass(Creature::CREATURE_CLASS_SLAYER); } @@ -1979,13 +1979,13 @@ bool checkTrap(Zone* pZone, Creature* pCreature) { } ////////////////////////////////////////////////////////////////////////////// -// Ư ũĸ ٸ ̵Ų. +// 특정 크리쳐를 다른 존으로 이동시킨다. // -// Creature* pCreature : ̵ ũ -// ZoneID_t TargetZoneID : ̵ ID -// ZoneCoord_t TargetX : ̵ ǥ X -// ZoneCoord_t TargetY : ̵ ǥ Y -// bool bSendMoveOK : GCMoveOK ִ° +// Creature* pCreature : 이동할 크리쳐 +// ZoneID_t TargetZoneID : 이동할 존 ID +// ZoneCoord_t TargetX : 이동할 존 좌표 X +// ZoneCoord_t TargetY : 이동할 존 좌표 Y +// bool bSendMoveOK : GCMoveOK를 보내주는가에 대한 여부 ////////////////////////////////////////////////////////////////////////////// void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t TX, ZoneCoord_t TY, bool bSendMoveOK) throw() { @@ -1996,8 +1996,8 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T GamePlayer* pGamePlayer = dynamic_cast(pCreature->getPlayer()); Zone* pZone = pCreature->getZone(); - // GPS_NORMAL 츸 transportCreature ִ. - // ٸ Ѵ. + // GPS_NORMAL인 경우만 transportCreature를 할 수 있다. + // 다른 경우는 무시한다. // by sigi. 2002.12.10 if (pGamePlayer->getPlayerStatus() != GPS_NORMAL) { @@ -2017,21 +2017,21 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T if (bSendMoveOK) { cout << "ZoneUtil.cpp step 2" << endl; - // ϴ ٺ Ŭ̾Ʈ ؼ GCMoveOK ش. + // 일단 바보 클라이언트를 위해서 GCMoveOK 를 날려준다. GCMoveOK gcMoveOK(pCreature->getX(), pCreature->getY(), pCreature->getDir()); pGamePlayer->sendPacket(&gcMoveOK); } // #if defined(__THAILAND_SERVER__) || defined(__CHINA_SERVER__) - // ZoneInfo OpenLevel warp/zone̵ ´. + // ZoneInfo 의 OpenLevel에 따라 warp/zone이동을 막는다. // add by inthesky 2004.07.26 ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(TargetZoneID); // add by Sonic 2006.10.21 - if (TargetZoneID == 1013) // ˹ﰺ + if (TargetZoneID == 1013) // 각薑쟁갰뒈인 { cout << "ZoneUtil.cpp step New1013" << endl; if (pZoneInfo->isNoPortalZone()) { @@ -2040,7 +2040,7 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T Item* pItem = pPC->getInventory()->findItem(Item::ITEM_CLASS_MONEY, fitItem); GCSystemMessage gcSystemMessage1; if (pItem == NULL) { - gcSystemMessage1.setMessage("õαӵ!"); + gcSystemMessage1.setMessage("쏵흙맡뒈인극矜撻唐陵귑!"); pGamePlayer->sendPacket(&gcSystemMessage1); return; } @@ -2056,7 +2056,7 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T } } GCSystemMessage gcSystemMessage1; - gcSystemMessage1.setMessage("ӭ'˹ﰺ򱦵'ϣҶ򵽺õı"); + gcSystemMessage1.setMessage("뻑短윱돕'각薑쟁갰댔괜뒈인',句寡댕소떼댔돕봤돨괜膠!"); pGamePlayer->sendPacket(&gcSystemMessage1); } // end by sonic @@ -2077,7 +2077,7 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T try { ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(TargetZoneID); - // ȭ ̰ ƴϸ.. + // 유료화 존이고 유료사용중이 아니면.. if (pZoneInfo != NULL && (pZoneInfo->isPayPlay() || pZoneInfo->isPremiumZone()) && !pGamePlayer->isPayPlaying() && !(g_pWarSystem->hasActiveRaceWar() && pZoneInfo->isHolyLand())) { cout << "ZoneUtil.cpp step 4" << endl; @@ -2087,21 +2087,21 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T // Statement* pStmt = NULL; string connectIP = pGamePlayer->getSocket()->getHost(); - // Ѱ? + // 유료 서비스 사용이 가능한가? if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { cout << "ZoneUtil.cpp step 5" << endl; sendPayInfo(pGamePlayer); - // ã´. + // 존을 찾는다. Zone* pZone = getZoneByZoneID(TargetZoneID); Assert(pZone != NULL); - //  ִ° - // PK̶  ִ°. + // 마스터 레어라면 들어갈 수 있는가 + // PK존이라면 들어갈 수 있는가. bEnterZone = enterMasterLair(pZone, pCreature); } else if (pZoneInfo->isPayPlay() && - !pGamePlayer->isFamilyFreePass()) // йи н ִ. + !pGamePlayer->isFamilyFreePass()) // 패밀리 프리 패스는 유료존으로 갈 수 있다. { cout << "ZoneUtil.cpp step 6" << endl; @@ -2111,11 +2111,11 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T if (!bEnterZone) { cout << "ZoneUtil.cpp step 7" << endl; - //  ̴. - // Ұ - // - // slayer : Ȱϴ . - // vampire : Ȱϴ . + // 현재 존에 들어갈 수 없는 경우이다. + // 유료 서비스 사용 불가인 경우 + // 마스터 레어인 경우 + // slayer : 에슬남동에서 부활하는 곳으로 간다. + // vampire : 림보남동에서 부활하는 곳으로 간다. ZONE_COORD zoneCoord; bool bFindPos = false; @@ -2133,7 +2133,7 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T bNoMoney = true; } else { - // , ̴... + // 아, 비상이닷... filelog("zoneUtilError.txt", "[ZoneUtil::transportCreature] ResurrectInfo is not esta.."); throw Error("Critical Error : ResurrectInfo is not established!1"); } @@ -2145,10 +2145,10 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T } - // 켱 PC ϰ, ÷̾ ZPM -> IPM ű. + // 우선 이전 존에서 PC 를 삭제하고, 플레이어를 ZPM -> IPM 으로 옮긴다. try { - // slayer ̸ Ÿ ִ - // ̸ ش. + // 요금 지불 안한 slayer가 오토바이를 타고 있는 경우는 + // 오토바이를 없앤다. if (bNoMoney && pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); if (pSlayer->hasRideMotorcycle()) { @@ -2161,14 +2161,14 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T } cout << "ZoneUtil.cpp step 8" << endl; - // ũó Ѵ. + // 크리처의 정보를 저장한다. pCreature->save(); ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(TargetZoneID); Assert(pZoneInfo != NULL); - // . - // ϴ . + // 피의 성서를 가지고 성지 밖으로 나갈 때는 피의 성서를 버린다. + // 성의 지하던젼으로 가지고 나갈때도 버린다. if (pCreature->isFlag(Effect::EFFECT_CLASS_HAS_BLOOD_BIBLE)) { if (pZone->isHolyLand()) { if (!pZoneInfo->isHolyLand() || (!pZoneInfo->isCastle() && g_pCastleInfoManager->isSameCastleZone( @@ -2177,11 +2177,11 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T } } - // ¡ ¡ . + // 성 상징을 가지고 성 밖으로 나갈 때는 성 상징을 버린다. if (pCreature->isFlag(Effect::EFFECT_CLASS_HAS_CASTLE_SYMBOL)) { if (pZone->isHolyLand() && !pZoneInfo->isHolyLand() || !g_pCastleInfoManager->isSameCastleZone(pCreature->getZone()->getZoneID(), TargetZoneID) - // . ¡ ʿ ֱ .. + // 성 안으로 못 들어간다. 성 상징은 성 지하 맵에 있기 때문에.. || pZoneInfo->isCastle()) { dropRelicToZone(pCreature); } @@ -2198,7 +2198,7 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T ; dropSweeperToZone(pCreature); - // ų ۿ ö initAllStat ҷش. + // 성지에서 성지 밖으로 나가거나 성지 밖에서 성지 안으로 들어올때는 initAllStat을 불러준다. if (pZone->isHolyLand() != pZoneInfo->isHolyLand()) { pCreature->setFlag(Effect::EFFECT_CLASS_INIT_ALL_STAT); } @@ -2212,24 +2212,24 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T pCreature->setFlag(Effect::EFFECT_CLASS_INIT_ALL_STAT); } - // , PC Ѵ. + // 이제, 존에서 PC를 삭제한다. // // *CAUTION* - // pCreature ǥ pCreature ϴ Ÿ ǥ ƾ Ѵ. - // , ޽带 ȣϱ ǥ ٲ Ѵ.. + // pCreature의 좌표가 실제로 pCreature가 존재하는 타일의 좌표와 같아야 한다. + // 따라서, 이 메쏘드를 호출하기 전에 좌표를 잘 바꿔놔야 한당.. pZone->deleteCreature(pCreature, pCreature->getX(), pCreature->getY()); - // ׷ ZPM ÷̾ Ѵ. + // 존그룹의 ZPM에서 플레이어를 삭제한다. // pZone->getZoneGroup()->getZonePlayerManager()->deletePlayer(pGamePlayer->getSocket()->getSOCKET()); // pZone->getZoneGroup()->getZonePlayerManager()->deletePlayer_NOBLOCKED(pGamePlayer->getSocket()->getSOCKET()); pZone->getZoneGroup()->getZonePlayerManager()->deletePlayer(pGamePlayer->getSocket()->getSOCKET()); - // ũó ο ǥ Ż ̴. + // 크리처의 새로운 좌표는 포탈의 도착 지점이다. // pCreature->setXY(TX, TY); // pCreature->setZone(NULL); cout << "ZoneUtil.cpp step 9" << endl; - // IPM ÷̾ ű. + // IPM으로 플레이어를 옮긴다. // g_pIncomingPlayerManager->addPlayer(pGamePlayer); // g_pIncomingPlayerManager->pushPlayer(pGamePlayer); pZone->getZoneGroup()->getZonePlayerManager()->pushOutPlayer(pGamePlayer); @@ -2238,29 +2238,29 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T throw Error(nsee.toString()); } - // ũóٰ ش. ̴ OID Ҵޱ ؼ̴. - // ̵ Ѵ. by sigi. 2002.5.11 + // 크리처에다가 존을 지정해준다. 이는 OID 를 할당받기 위해서이다. + // 이동할 존을 설정한다. by sigi. 2002.5.11 Zone* pNewZone = getZoneByZoneID(TargetZoneID); Assert(pNewZone != NULL); pCreature->setNewZone(pNewZone); pCreature->setNewXY(TX, TY); - // ũó ڽŰ ۵ OID Ҵ޴´. + // 크리처 자신과 소유 아이템들의 OID를 할당받는다. - // ZonePlayerManager heartbeat Ѵ. - // ּó by sigi. 2002.5.14 + // ZonePlayerManager의 heartbeat에서 한다. + // 주석처리 by sigi. 2002.5.14 // pCreature->registerObject(); /* - // GCUpdateInfo Ŷ д. + // GCUpdateInfo 패킷을 만들어둔다. GCUpdateInfo gcUpdateInfo; makeGCUpdateInfo(&gcUpdateInfo, pCreature); pGamePlayer->sendPacket(&gcUpdateInfo); */ - // ƴ ƴ ƴ ų - // ƴ + // 아담의 성지가 아닌 곳에서 아담의 성지로 가거나 + // 아담의 성지에서 딴 곳으로 가는 경우 if (!pZone->isHolyLand() && pNewZone->isHolyLand() || pZone->isHolyLand() && !pNewZone->isHolyLand()) { sendHolyLandWarpEffect(pCreature); cout << "ZoneUtil.cpp step 10" << endl; @@ -2275,8 +2275,8 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T } ////////////////////////////////////////////////////////////////////////////// -// Ư ID ãƼ ͸ Ѵ. -// ZoneID_t ZID : ã ϴ ID +// 특정 존ID를 가진 존을 찾아서 포인터를 리턴한다. +// ZoneID_t ZID : 찾고자 하는 존 ID ////////////////////////////////////////////////////////////////////////////// Zone* getZoneByZoneID(ZoneID_t ZID) throw(Error) { __BEGIN_TRY @@ -2295,16 +2295,16 @@ Zone* getZoneByZoneID(ZoneID_t ZID) throw(Error) { try { pZoneGroup = g_pZoneGroupManager->getZoneGroup(pZoneInfo->getZoneGroupID()); } catch (NoSuchElementException&) { - // ϴ 1̹Ƿ.. ״ ... + // 일단은 서버가 1대이므로.. 그대로 나간다... // cerr << "getZoneByZoneID() : No Such ZoneGroup" << endl; throw Error("getZoneByZoneID() : No Such ZoneGroup"); /* //-------------------------------------------------------------------------------- - // ׷Ŵ ׷ ׷ ߰ ٴ Ҹ - // и ٸ Ҽӵ ׷̶ ̴. , - // GGIncomingConnection Ŷ ؾ Ѵ. IP/Port - // ˾Ƴ Ѵ. + // 현재 게임 서버의 존그룹매니저에서 그런 존그룹을 발견할 수 없다는 소리는 + // 분명히 다른 게임 서버에 소속된 존그룹이라는 뜻이다. 따라서, 그 게임 + // 서버에게 GGIncomingConnection 패킷을 전송해야 한다. 즉 그 게임 서버의 IP/Port + // 를 알아내야 한다. //-------------------------------------------------------------------------------- GGIncomingConnection ggIncomingConnection; ggIncomingConnection.setClientIP(pCreature->getPlayer->getSocket()->getHost()); @@ -2326,7 +2326,7 @@ Zone* getZoneByZoneID(ZoneID_t ZID) throw(Error) { } ////////////////////////////////////////////////////////////////////////////// -//  ɾμ, Ư Ÿ ͸ ߰Ѵ. +// 운영자 명령어로서, 특정 타입의 몬스터를 존에다 추가한다. ////////////////////////////////////////////////////////////////////////////// void addMonstersToZone(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, SpriteType_t SType, MonsterType_t MType, int num, const SUMMON_INFO& summonInfo, list* pSummonedMonsters) throw() { @@ -2348,7 +2348,7 @@ void addMonstersToZone(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, SpriteType_t S const vector& monsterTypes = g_pMonsterInfoManager->getMonsterTypeBySprite(SType); if (!monsterTypes.empty()) { - // num + // num 마리의 몬스터 생성 for (int i = 0; i < num; i++) { MonsterType_t monsterType = monsterTypes[rand() % monsterTypes.size()]; @@ -2366,7 +2366,7 @@ void addMonstersToZone(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, SpriteType_t S } ////////////////////////////////////////////////////////////////////////////// -// Ư Ÿ ͸ ߰Ѵ. +// 특정 타입의 몬스터를 존에다 추가한다. ////////////////////////////////////////////////////////////////////////////// void addMonstersToZone(Zone* pZone, const SUMMON_INFO2& summonInfo, list* pSummonedMonsters) throw() { __BEGIN_TRY @@ -2397,7 +2397,7 @@ void addMonstersToZone(Zone* pZone, const SUMMON_INFO2& summonInfo, listgetMonsterTypeBySprite(monsterInfo.SpriteType); if (!monsterTypes.empty()) { - // Num + // Num 마리의 몬스터 생성 for (int i = 0; i < monsterInfo.Num; i++) { MonsterType_t monsterType = monsterTypes[rand() % monsterTypes.size()]; @@ -2419,8 +2419,8 @@ void addMonstersToZone(Zone* pZone, const SUMMON_INFO2& summonInfo, listisMasterLair()) { return true; } @@ -2473,7 +2473,7 @@ bool enterMasterLair(Zone* pZone, Creature* pCreature) throw(Error) { Assert(pMasterLairManager != NULL); if (pMasterLairManager->enterCreature(pCreature)) { - // + // 출입 가능 return true; } @@ -2483,7 +2483,7 @@ bool enterMasterLair(Zone* pZone, Creature* pCreature) throw(Error) { } void getNewbieTransportZoneInfo(Slayer* pSlayer, ZONE_COORD& zoneInfo) { - // ɷġ 40̰, ɺ̸ . by sigi. 2002.11.7 + // 능력치 합이 40이고, 야전사령부이면 딴데로 보낸다. by sigi. 2002.11.7 zoneInfo.x = 30; zoneInfo.y = 42; @@ -2509,7 +2509,7 @@ void getNewbieTransportZoneInfo(Slayer* pSlayer, ZONE_COORD& zoneInfo) { void checkNewbieTransportToGuild(Slayer* pSlayer) { try { if (pSlayer->isPLAYER() && g_pVariableManager->isNewbieTransportToGuild()) { - // ɷġ 40̰, ɺ̸ . by sigi. 2002.11.7 + // 능력치 합이 40이고, 야전사령부이면 딴데로 보낸다. by sigi. 2002.11.7 ZONE_COORD transportZone; getNewbieTransportZoneInfo(pSlayer, transportZone); @@ -2562,8 +2562,8 @@ void checkNewbieTransportToGuild(Slayer* pSlayer) { // transportCreature( pSlayer, ZoneID, ZoneX, ZoneY, false ); - Turn_t deadline = 600; // 1 - int timePenalty = (BasicSUM - 40) * 100; // ɷġ 1 10ʾ + Turn_t deadline = 600; // 1분 후 + int timePenalty = (BasicSUM - 40) * 100; // 능력치 1마다 10초씩 deadline -= min(500, timePenalty); /* @@ -2575,7 +2575,7 @@ void checkNewbieTransportToGuild(Slayer* pSlayer) { Zone* pZone = pSlayer->getZone(); Assert(pZone!=NULL); - // CreatureManager ó ߿ DZ Zone ٿѴ. + // CreatureManager 처리 중에 실행되기 때문에 Zone에 붙여야한다. //pSlayer->addEffect( pEffect ); ObjectRegistry & objectregister = pZone->getObjectRegistry(); @@ -2596,7 +2596,7 @@ void checkNewbieTransportToGuild(Slayer* pSlayer) { pEventTransport->setTargetZone(ZoneID, ZoneX, ZoneY); pEventTransport->setZoneName(ZoneName); - // Ŀ ̵Ѵ. ش. + // 몇 초후에 어디로 이동한다.고 보내준다. pEventTransport->sendMessage(); pGamePlayer->addEvent(pEventTransport); @@ -2612,18 +2612,18 @@ void checkNewbieTransportToGuild(Slayer* pSlayer) { } } -// Corpse +// Corpse가 bool addCorpseToZone(Corpse* pCorpse, Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy) throw(Error) { __BEGIN_TRY Assert(pCorpse != NULL); Assert(pZone != NULL); - // Ÿϰ Ŵ ũó Ѵ. + // 타일과 몬스터 매니저에서 크리처를 삭제한다. // Tile & tile = pZone->getTile(cx , cy); - // ü ŸϿ ߰Ѵ. - /* // ŸϿ Ѵٸ, + // 시체를 타일에 추가한다. + /* // 현재 타일에 아이템이 존재한다면, if (tile.hasItem()) { Item* pItem = tile.getItem(); @@ -2631,7 +2631,7 @@ bool addCorpseToZone(Corpse* pCorpse, Zone* pZone, ZoneCoord_t cx, ZoneCoord_t c switch (pItem->getItemClass()) { - // ü  ʴ Ŭ + // 시체에 들어가지 않는 아이템 클래스 case Item::ITEM_CLASS_CORPSE: case Item::ITEM_CLASS_MOTORCYCLE: case Item::ITEM_CLASS_MINE: @@ -2643,12 +2643,12 @@ bool addCorpseToZone(Corpse* pCorpse, Zone* pZone, ZoneCoord_t cx, ZoneCoord_t c break; default: - // ̹ ũ ü  Ƿ - // ũ ƴ϶ ü ߰Ѵ. + // 이미 생성된 유니크 아이템은 시체에 들어가지 않으므로 + // 유니크 아이템이 아니라면 시체에 추가한다. if (!pItem->isUnique() && !pItem->isQuestItem() && !pItem->isFlagItem() && !pItem->isFlag( Effect::EFFECT_CLASS_PET_DISSECT ) ) { - // ٴڿ ִٰ 󶳰ῡ  ٽ ö 켱 ٿ༱ ȵȴ. + // 바닥에 떨어져있다가 얼떨결에 들어가는 아이템은 다시 나올때도 우선권을 붙여줘선 안된다. if ( !pItem->isFlag(Effect::EFFECT_CLASS_PRECEDENCE) ) { EffectPrecedence* pEffect = new EffectPrecedence( pItem ); @@ -2661,8 +2661,8 @@ bool addCorpseToZone(Corpse* pCorpse, Zone* pZone, ZoneCoord_t cx, ZoneCoord_t c } pZone->deleteItem(pItem, cx, cy); - // ü create ϹǷ DB Ѵ. - // ߿ ȭ Ҷ ٸ .. + // 시체에서 꺼낼때 create 하므로 DB에서 지워줘야 한다. + // 나중에 최적화 할때는 다른 방법을 쓰도록.. pItem->destroy(); pCorpse->addTreasure(pItem); } @@ -2670,7 +2670,7 @@ bool addCorpseToZone(Corpse* pCorpse, Zone* pZone, ZoneCoord_t cx, ZoneCoord_t c } }*/ - // ü ߰Ѵ. + // 시체를 추가한다. TPOINT pt = pZone->addItem(pCorpse, cx, cy); if (pt.x == -1) { SAFE_DELETE(pCorpse); @@ -2686,8 +2686,8 @@ bool addCorpseToZone(Corpse* pCorpse, Zone* pZone, ZoneCoord_t cx, ZoneCoord_t c return true; } -// ȿ Ư ü ִ ȮѴ. -// true, false +// 범위 안에 특정한 몬스터 시체가 있는지 확인한다. +// 있으면 true, 없으면 false bool checkCorpse(Zone* pZone, MonsterType_t MType, ZoneCoord_t x1, ZoneCoord_t y1, ZoneCoord_t x2, ZoneCoord_t y2) throw() { __BEGIN_TRY @@ -2725,7 +2725,7 @@ bool checkCorpse(Zone* pZone, MonsterType_t MType, ZoneCoord_t x1, ZoneCoord_t y __END_CATCH } -//  Zone ޼ Ѹ ؼ ZoneIDList ʿ +// 몇개의 Zone 에만 메세지를 뿌리기 위해서 성에 속한 ZoneIDList가 필요함 void makeZoneIDList(const string& zoneIDs, list& zoneIDList) throw(Error) { __BEGIN_TRY @@ -2744,7 +2744,7 @@ void makeZoneIDList(const string& zoneIDs, list& zoneIDList) throw(Err string zoneID = trim(zoneIDs.substr(a, b - a)); - // -_- ׳ atoi ᵵ ɷ ;; + // 음 -_- 그냥 atoi 써도 될려나 ;; zoneIDList.push_back(atoi(zoneID.c_str())); a = b + 1; @@ -2791,10 +2791,10 @@ bool createBulletinBoard(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y, MonsterType_ g_pConfig->getPropertyInt("ServerID"), pZone->getZoneID(), pt.x, pt.y, dbmsg.c_str(), (uint)type, timeLimit.toDateTime().c_str()); - // UPDATE Result* ſ.. pStmt->getAffectedRowCount() + // UPDATE인 경우는 Result* 대신에.. pStmt->getAffectedRowCount() if (pStmt->getAffectedRowCount() == 0) { - filelog("BulletinBoard.log", "DB ȵǹȽϴ. : %u, %u, %u, [%u:%s]", pZone->getZoneID(), pt.x, + filelog("BulletinBoard.log", "DB에 저장이 안되버렸습니다. : %u, %u, %u, [%u:%s]", pZone->getZoneID(), pt.x, pt.y, type, msg.c_str()); } @@ -2820,7 +2820,7 @@ void loadBulletinBoard(Zone* pZone) { "SELECT ID, X, Y, Message, Type, TimeLimit FROM BulletinBoardObject WHERE ServerID = %u AND ZoneID = %u", g_pConfig->getPropertyInt("ServerID"), pZone->getZoneID()); - // UPDATE Result* ſ.. pStmt->getAffectedRowCount() + // UPDATE인 경우는 Result* 대신에.. pStmt->getAffectedRowCount() while (pResult->next()) { uint ID = pResult->getInt(1); @@ -2831,7 +2831,7 @@ void loadBulletinBoard(Zone* pZone) { VSDateTime timeLimit(pResult->getString(6)); if (timeLimit < currentDateTime) { - cout << "Խ ð ٵǼ ϴ." << ID << " : [" << X << "," << Y << "] " << msg << " [" + cout << "게시판 시간 다되서 지워버립니다." << ID << " : [" << X << "," << Y << "] " << msg << " [" << type << "] " << endl; Statement* pStmt2 = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt2->executeQuery("DELETE FROM BulletinBoardObject WHERE ID = %u", ID); @@ -2848,7 +2848,7 @@ void loadBulletinBoard(Zone* pZone) { TPOINT pt = pZone->addItem(pCorpse, X, Y, true, delayTime * 10); if (pt.x == -1) { - filelog("BulletinBoard.log", "DB оµ ȵȽϴ. : %u, %u, %u, [%u:%s]", + filelog("BulletinBoard.log", "DB에서 읽었는데 존에 안들어가버렸습니다. : %u, %u, %u, [%u:%s]", pZone->getZoneID(), X, Y, type, msg.c_str()); } } diff --git a/src/server/cacheserver/Query.h b/src/server/cacheserver/Query.h index ec75e725..9e2eef38 100644 --- a/src/server/cacheserver/Query.h +++ b/src/server/cacheserver/Query.h @@ -3,10 +3,10 @@ // Project : Query.cpp // Module : Database Cache Server // File Name : Query.h -// Description: Cache Server óǾ Query Difinition +// Description: Cache Server내에 처리되어야 할 Query의 Difinition // // Date : 2002.2.14 -// Writer : ȫ â (changaya@metrotech.co.kr) +// Writer : 장 홍 창 (changaya@metrotech.co.kr) // /////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/cacheserver/main.cpp b/src/server/cacheserver/main.cpp index a9292573..b0c68cd4 100644 --- a/src/server/cacheserver/main.cpp +++ b/src/server/cacheserver/main.cpp @@ -1,8 +1,8 @@ ////////////////////////////////////////////////////////////////////// // // Filename : main.cpp -// Written By : ȫ â changaya@metrotech.co.kr -// Description : Database Cache Server main function +// Written By : Àå È« â changaya@metrotech.co.kr +// Description : Database Cache Server¿ë main function // ////////////////////////////////////////////////////////////////////// @@ -35,7 +35,7 @@ void memoryError() { int main(int argc, char* argv[]) { cout << ">>> STARTING CACHE SERVER..." << endl; - // ޸ ..Լ Ѵ. + // ¸Þ¸ð¸® ¾ø´Ù..ÇÔ¼ö¸¦ ¼³Á¤ÇÑ´Ù. set_new_handler(memoryError); cout << ">>> MEMORY HANDLER INSTALL SUCCESS..." << endl; @@ -44,16 +44,16 @@ int main(int argc, char* argv[]) { pPointer = new int[500000000]; delete pPointer; - // ġ ãƺ. + // ÀûÀýÇÑ À§Ä¡¸¦ ã¾Æº¸ÀÚ. srand(time(0)); cout << ">>> RANDOMIZATION INITIALIZATION SUCCESS..." << endl; if (argc < 3) { - cout << "Usage : cacheserver -f ȯ" << endl; + cout << "Usage : cacheserver -f ȯ°æÆÄÀÏ" << endl; exit(1); } - // command-line parameter string ȯѴ. ^^; + // command-line parameter¸¦ string À¸·Î º¯È¯ÇÑ´Ù. ^^; string* Argv; Argv = new string[argc]; @@ -62,16 +62,16 @@ int main(int argc, char* argv[]) { cout << ">>> COMMAND-LINE PARAMETER READING SUCCESS..." << endl; - // ȯ оδ. - // $VSHOME/bin, ȯ $VSHOME/conf ؾ Ѵ. - // command line ȯ ֵ Ѵ. + // ȯ°æ ÆÄÀÏÀ» ÀоîµéÀδÙ. + // ´Ü ½ÇÇà ÆÄÀÏÀº $VSHOME/bin¿¡, ȯ°æ ÆÄÀÏÀº $VSHOME/conf ¿¡ Á¸ÀçÇØ¾ß ÇÑ´Ù.½ + // command line ¿¡¼­ ȯ°æ ÆÄÀÏÀ» ÁöÁ¤ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. try { if (Argv[1] != "-f") { - throw Error("Usage : cacheserver -f ȯ"); + throw Error("Usage : cacheserver -f ȯ°æÆÄÀÏ"); } - // ù° ĶͰ -f , ι° Ķʹ ȯ ġ ȴ. + // ù¹øÂ° ÆÄ¶ó¹ÌÅͰ¡ -f ÀÏ °æ¿ì, µÎ¹øÂ° ÆÄ¶ó¹ÌÅʹ ȯ°æÆÄÀÏÀÇ À§Ä¡°¡ µÈ´Ù. g_pConfig = new Properties(); g_pConfig->load(Argv[2]); @@ -80,11 +80,11 @@ int main(int argc, char* argv[]) { // cout << e.toString() << endl; } - // α Ŵ ϰ ʱȭ ȰȭŲ. - // α Ŵ ʱȭ ߻ ɼ ִ - // س ϹǷ ο ʱȭؼ ȵȴ. - // ٸ ü ϰ ʱȭϱ α׸Ŵ 켱 , - // ʱȭǾ Ѵ. + // ·Î±× ¸Å´ÏÀú¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇÑÈÄ È°¼ºÈ­½ÃŲ´Ù. + // ·Î±× ¸Å´ÏÀú´Â °ÔÀÓ ¼­¹öÀÇ ÃʱâÈ­°úÁ¤¿¡¼­ ¹ß»ýÇÒ °¡´É¼ºÀÌ ÀÖ´Â ¿¡·¯±îÁöµµ + // °ËÃâÇØ³»¾ß ÇϹǷΠ°ÔÀÓ ¼­¹ö ³»ºÎ¿¡¼­ ÃʱâÈ­ÇØ¼­´Â ¾ÈµÈ´Ù. + // ¶ÇÇÑ ´Ù¸¥ °´Ã¼¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇϱâÀü¿¡ ·Î±×¸Å´ÏÀú°¡ ¿ì¼±ÀûÀ¸·Î »ý¼º, + // ÃʱâÈ­µÇ¾î¾ß ÇÑ´Ù. try { string LogServerIP = g_pConfig->getProperty("LogServerIP"); int LogServerPort = g_pConfig->getPropertyInt("LogServerPort"); @@ -104,7 +104,7 @@ int main(int argc, char* argv[]) { cout << ">>> LOGCLIENT INITIALZATION SUCCESS..." << endl; // - // ü ϰ ʱȭ ȰȭŲ. + // °ÔÀÓ ¼­¹ö °´Ã¼¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇÑ ÈÄ È°¼ºÈ­½ÃŲ´Ù. // try { // what? @@ -113,29 +113,29 @@ int main(int argc, char* argv[]) { rl.rlim_max = RLIM_INFINITY; setrlimit(RLIMIT_CORE, &rl); - // ü Ѵ. + // °ÔÀÓ ¼­¹ö °´Ã¼¸¦ »ý¼ºÇÑ´Ù. g_pCacheServer = new CacheServer(); cout << ">>> CACHE SERVER INSTANCE CREATED..." << endl; - // ü ʱȭѴ. + // °ÔÀÓ ¼­¹ö °´Ã¼¸¦ ÃʱâÈ­ÇÑ´Ù. g_pCacheServer->init(); cout << ">>> CACHE SERVER INITIALIZATION SUCCESS..." << endl; - // ü ȰȭŲ. + // °ÔÀÓ ¼­¹ö °´Ã¼¸¦ Ȱ¼ºÈ­½ÃŲ´Ù. g_pCacheServer->start(); } catch (Throwable& e) { - // αװ ̷ 츦 ؼ + // ·Î±×°¡ ÀÌ·ïÁö±â Àü¿¡ ¼­¹ö°¡ ³¡³¯ °æ¿ì¸¦ ´ëºñÇØ¼­ ofstream ofile("../log/instant.log", ios::out); ofile << e.toString() << endl; ofile.close(); - // ǥ ε ش. + // Ç¥ÁØ Ãâ·ÂÀ¸·Îµµ Ãâ·ÂÇØÁØ´Ù. cout << e.toString() << endl; - // ߴܽŲ. - // ο Ŵ ߴܵǾ Ѵ. + // °ÔÀÓ ¼­¹ö¸¦ ÁߴܽÃŲ´Ù. + // ÀÌ ³»ºÎ¿¡¼­ ÇÏÀ§ ¸Å´ÏÀú ¿ª½Ã ÁߴܵǾî¾ß ÇÑ´Ù. g_pCacheServer->stop(); } catch (...) { cout << "unknown exception..." << endl; diff --git a/src/server/chinabilling/CBillingInfo.h b/src/server/chinabilling/CBillingInfo.h index 863bab82..ebe38a88 100644 --- a/src/server/chinabilling/CBillingInfo.h +++ b/src/server/chinabilling/CBillingInfo.h @@ -26,7 +26,7 @@ using namespace std; #endif ///////////////////////////////////////// -// PacketType +// PacketType 에 대한 값 ///////////////////////////////////////// enum CBillingPacketType { CBILLING_PACKET_REQUEST = 1, // request packet @@ -36,50 +36,50 @@ enum CBillingPacketType { }; ///////////////////////////////////////// -// MethodCode +// MethodCode 에 대한 값 ///////////////////////////////////////// enum CBillingMethodCode { - CBILLING_METHOD_CODE_LOGIN = 1001, // Login, ÷̾ - CBILLING_METHOD_CODE_MINUS_POINT = 1002, // minus point, ð Ʈ . - CBILLING_METHOD_CODE_MINUS_MINUTE = 1003, // minus minute, ð ð . - CBILLING_METHOD_CODE_LOGOUT = 1004, // Logout, ÷̾ - CBILLING_METHOD_CODE_INTERVAL_VALIDATION = 1005, // interval validation, Ȯο + CBILLING_METHOD_CODE_LOGIN = 1001, // Login, 플레이어의 접속 + CBILLING_METHOD_CODE_MINUS_POINT = 1002, // minus point, 일정 시간이 지난 후 포인트를 깐다. + CBILLING_METHOD_CODE_MINUS_MINUTE = 1003, // minus minute, 일정 시간이 지난 후 시간을 깐다. + CBILLING_METHOD_CODE_LOGOUT = 1004, // Logout, 플레이어의 접속 종료 + CBILLING_METHOD_CODE_INTERVAL_VALIDATION = 1005, // interval validation, 간격 확인용 CBILLING_METHOD_CODE_MAX }; ///////////////////////////////////////// -// ReturnCode +// ReturnCode 에 대한 값 ///////////////////////////////////////// enum CBillingReturnCode { - CBILLING_RETURN_CODE_SUCCESS = 0, // success, - CBILLING_RETURN_CODE_FAIL = 1, // fail, - CBILLING_RETURN_CODE_DB_ERROR = 2, // db error, ̽ - CBILLING_RETURN_CODE_INVALID_LOGIN_NAME = 11, // login name invalid, ȿ login name - CBILLING_RETURN_CODE_FAIL_MINUS_POINT = 12, // fail to minus point, minus point - CBILLING_RETURN_CODE_FAIL_MINUS_MINUTE = 13, // fail to minus minute, minus minute + CBILLING_RETURN_CODE_SUCCESS = 0, // success, 성공 + CBILLING_RETURN_CODE_FAIL = 1, // fail, 실패 + CBILLING_RETURN_CODE_DB_ERROR = 2, // db error, 데이터 베이스 에러 + CBILLING_RETURN_CODE_INVALID_LOGIN_NAME = 11, // login name invalid, 유효하지 않은 login name + CBILLING_RETURN_CODE_FAIL_MINUS_POINT = 12, // fail to minus point, minus point 에 대한 실패 + CBILLING_RETURN_CODE_FAIL_MINUS_MINUTE = 13, // fail to minus minute, minus minute 에 대한 실패 CBILLGIN_RETURN_CODE_MAX }; ///////////////////////////////////////// -// PlayerType +// PlayerType 에 대한 값 ///////////////////////////////////////// enum CBillingPlayerType { - CBILLING_PLAYER_TYPE_UNLIMITED = 1, // unlimited using, - CBILLING_PLAYER_TYPE_LIMITED = 2, // limited using, - CBILLING_PLAYER_TYPE_MONTHLY = 3, // monthly, - CBILLING_PLAYER_TYPE_POINT = 4, // point, point + CBILLING_PLAYER_TYPE_UNLIMITED = 1, // unlimited using, 무제한 사용자 + CBILLING_PLAYER_TYPE_LIMITED = 2, // limited using, 제한 사용자 + CBILLING_PLAYER_TYPE_MONTHLY = 3, // monthly, 월단위 사용자 + CBILLING_PLAYER_TYPE_POINT = 4, // point, point 사용자 CBILLING_PLAYER_TYPE_MAX }; ///////////////////////////////////////// -// PayType +// PayType 에 대한 값 ///////////////////////////////////////// enum CBillingPayType { - CBILLING_PAY_TYPE_PRE_PAID = 1, // PrePaid, - CBILLING_PAY_TYPE_POST_PAID = 2, // PostPaid, İ + CBILLING_PAY_TYPE_PRE_PAID = 1, // PrePaid, 선결제 + CBILLING_PAY_TYPE_POST_PAID = 2, // PostPaid, 후결제 CBILLING_PAY_TYPE_MAX }; diff --git a/src/server/chinabilling/CBillingPlayer.h b/src/server/chinabilling/CBillingPlayer.h index 2f756179..8c3e893d 100644 --- a/src/server/chinabilling/CBillingPlayer.h +++ b/src/server/chinabilling/CBillingPlayer.h @@ -53,9 +53,9 @@ class CBillingPlayer : public Player { virtual void sendPacket(Packet* pPacket); // disconnect - // ÷̾ , ϰ α׾ƿ - // ̹ Ƿ disconnect(DISCONNECTED) ϻ ؾ Ѵ. - // ݸ, ϰ α׾ƿ 쿡 disconnect(UNDISCONNECTED) ؾѴ. + // 플레이어의 연결을 종료할 때, 상대편이 적절하게 로그아웃하지 않을 경우 소켓의 연결이 + // 이미 끊겨 있으므로 disconnect(DISCONNECTED) 를 사용하새 연결을 종료해야 한다. + // 반면, 정장하게 로그아웃을 한 경우에는 disconnect(UNDISCONNECTED) 를 사용해야한다. virtual void disconnect(bool bDisconnected = DISCONNECTED); void setSocket(Socket* pSocket); @@ -75,7 +75,7 @@ class CBillingPlayer : public Player { #endif public: - // Ŷ ó Լ + // 패킷 처리용 함수들 void executeError(CBillingPacketHeader& header, CBillingPacketErrorBody& body); #ifdef __LOGIN_SERVER__ void executeLogin(CBillingPacketHeader& header, CBillingPacketResponseLoginBody& body); @@ -88,7 +88,7 @@ class CBillingPlayer : public Player { #endif #ifdef __GAME_SERVER__ - // DB packet α + // DB에 packet 로그 남기기 void logPacket(CBillingPacketHeader* header, CBillingPacketResponseLoginBody* login, CBillingPacketResponseMinusPointBody* point, CBillingPacketResponseLogoutBody* logout, CBillingPacketErrorBody* error); diff --git a/src/server/chinabilling/CBillingPlayerManager.h b/src/server/chinabilling/CBillingPlayerManager.h index 155244f4..4b4d3da0 100644 --- a/src/server/chinabilling/CBillingPlayerManager.h +++ b/src/server/chinabilling/CBillingPlayerManager.h @@ -26,7 +26,7 @@ class CBillingPlayer; ///////////////////////////////////////////////////// // class CBillingPlayerManager // -// ߱ ϴ +// 중국 빌링 서버와 통신을 전담하는 쓰레드 ///////////////////////////////////////////////////// class CBillingPlayerManager : public Thread { public: @@ -38,7 +38,7 @@ class CBillingPlayerManager : public Thread { void stop(); void run(); - // Ŷ Լ + // 빌링 관련 패킷 보내기 함수 #ifdef __LOGIN_SERVER__ void sendLogin(LoginPlayer* pLoginPlayer); #elif defined(__GAME_SERVER__) diff --git a/src/server/chinabilling/stress/SBillingPlayer.cpp b/src/server/chinabilling/stress/SBillingPlayer.cpp index 5f7591ae..54222c51 100644 --- a/src/server/chinabilling/stress/SBillingPlayer.cpp +++ b/src/server/chinabilling/stress/SBillingPlayer.cpp @@ -90,7 +90,7 @@ void SBillingPlayer::processOutput() throw(IOException, Error) { try { m_pOutputStream->flush(); } catch (InvalidProtocolException&) { - throw DisconnectException("̻ Ŷ"); + throw DisconnectException("이상한 패킷임"); } __END_CATCH @@ -101,13 +101,13 @@ void SBillingPlayer::processCommand() throw(IOException, Error) { __BEGIN_TRY try { - // Է ۿ ִ Ŷ óѴ. + // 입력 버퍼에 들어있는 완전한 패킷들을 모조리 처리한다. while (true) { - // + // 헤더를 저장할 버퍼 생성 CBillingPacketHeader header; - // ϴ д´. peek. Է¹ۿ ʴ´. - // н + // 일단 헤더를 읽는다. peek. 입력버퍼에서 지우지는 않는다. + // 헤더가 완전하지 않으면 패스 if (!m_pInputStream->peek((char*)&header, szCBillingPacketHeaderInfo)) return; @@ -118,104 +118,104 @@ void SBillingPlayer::processCommand() throw(IOException, Error) { header.Body_Length = ntohl(header.Body_Length); //////////////////////////////////////////////////////////////////////////////////// - // Packet_Type, Method_Code, Return_Code ٵ ϴ ȮѴ. + // Packet_Type, Method_Code, Return_Code 에 따라 바디가 완전히 존재하는지 확인한다. //////////////////////////////////////////////////////////////////////////////////// if (header.Packet_Type != CBILLING_PACKET_RESPONSE) { cout << "error" << endl; cout << header.toString().c_str() << endl; return; - // ~ + // 에러다 낭패~ } - // + // 실패일 경우 if (header.Return_Code != CBILLING_RETURN_CODE_SUCCESS) { - // ٵ ִ ȮѴ. + // 바디가 완전히 들어있는지 확인한다. if (m_pInputStream->length() < szCBillingPacketHeaderInfo + szCBillingPacketErrorBodyInfo) return; - // о . + // 이제 실제로 모조리 읽어 내자. CBillingPacketErrorBody body; header.read(*m_pInputStream); body.read(*m_pInputStream); executeError(header, body); - } else // + } else // 성공일 경우 { switch (header.Method_Code) { case CBILLING_METHOD_CODE_INTERVAL_VALIDATION: { - // ٵ ִ ȮѴ. + // 바디가 완전히 들어있는지 확인한다. if (m_pInputStream->length() < szCBillingPacketHeaderInfo + szCBillingPacketResponseIntervalValidationBodyInfo) return; - // о . + // 이제 실제로 모조리 읽어 내자. CBillingPacketResponseIntervalValidationBody body; header.read(*m_pInputStream); body.read(*m_pInputStream); - // + // 실행 executeIntervalValidation(header, body); break; } case CBILLING_METHOD_CODE_LOGIN: { - // ٵ ִ ȮѴ. + // 바디가 완전히 들어있는지 확인한다. if (m_pInputStream->length() < szCBillingPacketHeaderInfo + szCBillingPacketResponseLoginBodyInfo) return; - // о . + // 이제 실제로 모조리 읽어 내자. CBillingPacketResponseLoginBody body; header.read(*m_pInputStream); body.read(*m_pInputStream); - // + // 실행 executeLogin(header, body); break; } case CBILLING_METHOD_CODE_MINUS_POINT: { - // ٵ ִ ȮѴ. + // 바디가 완전히 들어있는지 확인한다. if (m_pInputStream->length() < szCBillingPacketHeaderInfo + szCBillingPacketResponseMinusPointBodyInfo) return; - // о . + // 이제 실제로 모조리 읽어 내자. CBillingPacketResponseMinusPointBody body; header.read(*m_pInputStream); body.read(*m_pInputStream); - // + // 실행 executeMinusPoint(header, body); break; } case CBILLING_METHOD_CODE_MINUS_MINUTE: { - // ٵ ִ ȮѴ. + // 바디가 완전히 들어있는지 확인한다. if (m_pInputStream->length() < szCBillingPacketHeaderInfo + szCBillingPacketResponseMinusMinuteBodyInfo) return; - // о . + // 이제 실제로 모조리 읽어 내자. CBillingPacketResponseMinusMinuteBody body; header.read(*m_pInputStream); body.read(*m_pInputStream); - // + // 실행 executeMinusMinute(header, body); break; } case CBILLING_METHOD_CODE_LOGOUT: { - // ٵ ִ ȮѴ. + // 바디가 완전히 들어있는지 확인한다. if (m_pInputStream->length() < szCBillingPacketHeaderInfo + szCBillingPacketResponseLogoutBodyInfo) return; - // о . + // 이제 실제로 모조리 읽어 내자. CBillingPacketResponseLogoutBody body; header.read(*m_pInputStream); body.read(*m_pInputStream); - // + // 실행 executeLogout(header, body); break; @@ -223,7 +223,7 @@ void SBillingPlayer::processCommand() throw(IOException, Error) { default: { throw Error("Invaild Code"); - // . + // 에러다. break; } } @@ -439,7 +439,7 @@ void SBillingPlayer::executeError(CBillingPacketHeader& header, CBillingPacketEr Error) { __BEGIN_TRY - // ©~ + // 유료 끝났다 짤려라~ PayUser* pPayUser = g_pPayUserManager->getUser(body.Login_Name); pPayUser->setRecvTime(); pPayUser->setLeftTime(0); @@ -463,7 +463,7 @@ void SBillingPlayer::executeIntervalValidation(CBillingPacketHeader& header, __BEGIN_TRY if (atoi(body.Parameter_Value) != g_pSBillingPlayerManager->getMinusIntervalInt()) { - // Ӽ ߱ minus interval ʴ. ׾ Ѵ. + // 게임서버와 중국 빌링 서버간에 minus interval 이 맞지 않다. 죽어야 한다. cerr << "-------------------------------------------------------------------------------" << endl; cerr << "Interval configuration is different between gameserver and china billing server" << endl; cerr << "gameserver interval : " << g_pSBillingPlayerManager->getMinusIntervalInt() @@ -475,7 +475,7 @@ void SBillingPlayer::executeIntervalValidation(CBillingPacketHeader& header, "billing server interval : %s", g_pSBillingPlayerManager->getMinusIntervalInt(), body.Parameter_Value); - // ׾. Ф. + // 죽어라. 흑흑 ㅠㅠ. // kill( getpid(), 9 ); } diff --git a/src/server/chinabilling/stress/SBillingPlayer.h b/src/server/chinabilling/stress/SBillingPlayer.h index a3c371b1..e5d89b67 100644 --- a/src/server/chinabilling/stress/SBillingPlayer.h +++ b/src/server/chinabilling/stress/SBillingPlayer.h @@ -48,9 +48,9 @@ class SBillingPlayer : public Player { virtual void sendPacket(Packet* pPacket) throw(ProtocolException, Error); // disconnect - // ÷̾ , ϰ α׾ƿ - // ̹ Ƿ disconnect(DISCONNECTED) ϻ ؾ Ѵ. - // ݸ, ϰ α׾ƿ 쿡 disconnect(UNDISCONNECTED) ؾѴ. + // 플레이어의 연결을 종료할 때, 상대편이 적절하게 로그아웃하지 않을 경우 소켓의 연결이 + // 이미 끊겨 있으므로 disconnect(DISCONNECTED) 를 사용하새 연결을 종료해야 한다. + // 반면, 정장하게 로그아웃을 한 경우에는 disconnect(UNDISCONNECTED) 를 사용해야한다. virtual void disconnect(bool bDisconnected = DISCONNECTED) throw(InvalidProtocolException, Error); void setSocket(Socket* pSocket) throw(); @@ -66,7 +66,7 @@ class SBillingPlayer : public Player { void sendLogout(PayUser* pPayUser) throw(ProtocolException, Error); public: - // Ŷ ó Լ + // 패킷 처리용 함수들 void executeError(CBillingPacketHeader& header, CBillingPacketErrorBody& body) throw(IOException, Error); void executeIntervalValidation(CBillingPacketHeader& header, CBillingPacketResponseIntervalValidationBody& body) throw(IOException, Error); diff --git a/src/server/chinabilling/stress/SBillingPlayerManager.cpp b/src/server/chinabilling/stress/SBillingPlayerManager.cpp index 06c23cf2..366d8c29 100644 --- a/src/server/chinabilling/stress/SBillingPlayerManager.cpp +++ b/src/server/chinabilling/stress/SBillingPlayerManager.cpp @@ -78,7 +78,7 @@ void SBillingPlayerManager::run() throw() { usleep(100); for (int i = 0; i < m_SBillingPlayers; ++i) { - // Ǿ ʴٸ õѴ. + // 연결 되어 있지 않다면 연결을 시도한다. if (m_pSBillingPlayer[i] == NULL) { Socket* pSocket = NULL; @@ -106,7 +106,7 @@ void SBillingPlayerManager::run() throw() { filelog(LOGFILE_CBILLING_PLAYER, "----- connection established(%s:%d) -----", SBillingServerIP.c_str(), SBillingServerPort); - // interval validation packet . + // interval validation packet 을 보낸다. sendIntervalValidation(i); } catch (Throwable& t) { cout << "connect to china billing server fail - " << SBillingServerIP.c_str() << ":" @@ -128,12 +128,12 @@ void SBillingPlayerManager::run() throw() { } __LEAVE_CRITICAL_SECTION(m_Mutex[i]) - // õ ð - usleep(1000000); // 1 + // 다음 접속 시도 시간 + usleep(1000000); // 1초 } } - // Ǿ ִٸ óѴ. + // 소켓이 연결되어 있다면 입출력을 처리한다. __ENTER_CRITICAL_SECTION(m_Mutex[i]) if (m_pSBillingPlayer[i] != NULL) { @@ -194,7 +194,7 @@ void SBillingPlayerManager::sendIntervalValidation(int i) throw(ProtocolExceptio if (m_pSBillingPlayer[i] != NULL) { m_pSBillingPlayer[i]->sendIntervalValidation(); - // ٷ . + // 바로 보내버린다. m_pSBillingPlayer[i]->processOutput(); } diff --git a/src/server/chinabilling/stress/SBillingPlayerManager.h b/src/server/chinabilling/stress/SBillingPlayerManager.h index 89c4710d..511cfa91 100644 --- a/src/server/chinabilling/stress/SBillingPlayerManager.h +++ b/src/server/chinabilling/stress/SBillingPlayerManager.h @@ -21,7 +21,7 @@ class SBillingPlayer; ///////////////////////////////////////////////////// // class SBillingPlayerManager // -// ߱ ϴ +// 중국 빌링 서버와 통신을 전담하는 쓰레드 ///////////////////////////////////////////////////// class SBillingPlayerManager : public Thread { public: @@ -33,7 +33,7 @@ class SBillingPlayerManager : public Thread { void stop() throw(Error); void run() throw(); - // Ŷ Լ + // 빌링 관련 패킷 보내기 함수 bool sendLogin(PayUser* pPayUser, int i) throw(ProtocolException, Error); void sendIntervalValidation(int i) throw(ProtocolException, Error); bool sendMinusPoint(PayUser* pPayUser, int i) throw(ProtocolException, Error); diff --git a/src/server/chinabilling/stress/main.cpp b/src/server/chinabilling/stress/main.cpp index 92d45d69..37c14e94 100644 --- a/src/server/chinabilling/stress/main.cpp +++ b/src/server/chinabilling/stress/main.cpp @@ -2,7 +2,7 @@ // // Filename : main.cpp // Written By : reiot@ewestsoft.com -// Description : α Լ +// Description : ·Î±×ÀÎ ¼­¹ö¿ë ¸ÞÀÎ ÇÔ¼ö // ////////////////////////////////////////////////////////////////////// @@ -32,31 +32,31 @@ void memoryError() { // ////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { - // ޸ .. Լ Ѵ. + // ¸Þ¸ð¸® ¾ø´Ù.. ÇÔ¼ö¸¦ ¼³Á¤ÇÑ´Ù. set_new_handler(memoryError); if (argc < 3) { - cout << "Usage : stress -f ȯ" << endl; + cout << "Usage : stress -f ȯ°æÆÄÀÏ" << endl; exit(1); } - // command-line parameter string ȯѴ. ^^; + // command-line parameter¸¦ string À¸·Î º¯È¯ÇÑ´Ù. ^^; string* Argv; Argv = new string[argc]; for (int i = 0; i < argc; i++) Argv[i] = argv[i]; - // ȯ оδ. - // $VSHOME/bin, ȯ $VSHOME/conf ؾ Ѵ. - // command line ȯ ֵ Ѵ. + // ȯ°æ ÆÄÀÏÀ» ÀоîµéÀδÙ. + // ´Ü ½ÇÇà ÆÄÀÏÀº $VSHOME/bin¿¡, ȯ°æ ÆÄÀÏÀº $VSHOME/conf ¿¡ Á¸ÀçÇØ¾ß ÇÑ´Ù.½ + // command line ¿¡¼­ ȯ°æ ÆÄÀÏÀ» ÁöÁ¤ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. try { if (Argv[1] != "-f") { - throw Error("Usage : stress -f ȯ"); + throw Error("Usage : stress -f ȯ°æÆÄÀÏ"); } - // ù° ĶͰ -f , ι° Ķʹ ȯ ġ ȴ. + // ù¹øÂ° ÆÄ¶ó¹ÌÅͰ¡ -f ÀÏ °æ¿ì, µÎ¹øÂ° ÆÄ¶ó¹ÌÅʹ ȯ°æÆÄÀÏÀÇ À§Ä¡°¡ µÈ´Ù. g_pConfig = new Properties(); g_pConfig->load(Argv[2]); @@ -66,14 +66,14 @@ int main(int argc, char* argv[]) { cout << e.toString() << endl; } - // α Ŵ ϰ ʱȭ ȰȭŲ. - // α Ŵ α ʱȭ ߻ ɼ ִ - // س ϹǷ α ο ʱȭؼ ȵȴ. - // ٸ ü ϰ ʱȭϱ α׸Ŵ 켱 , - // ʱȭǾ Ѵ. + // ·Î±× ¸Å´ÏÀú¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇÑÈÄ È°¼ºÈ­½ÃŲ´Ù. + // ·Î±× ¸Å´ÏÀú´Â ·Î±×ÀÎ ¼­¹öÀÇ ÃʱâÈ­°úÁ¤¿¡¼­ ¹ß»ýÇÒ °¡´É¼ºÀÌ ÀÖ´Â ¿¡·¯±îÁöµµ + // °ËÃâÇØ³»¾ß ÇϹǷΠ·Î±×ÀÎ ¼­¹ö ³»ºÎ¿¡¼­ ÃʱâÈ­ÇØ¼­´Â ¾ÈµÈ´Ù. + // ¶ÇÇÑ ´Ù¸¥ °´Ã¼¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇϱâÀü¿¡ ·Î±×¸Å´ÏÀú°¡ ¿ì¼±ÀûÀ¸·Î »ý¼º, + // ÃʱâÈ­µÇ¾î¾ß ÇÑ´Ù. // - // α ü ϰ ʱȭ ȰȭŲ. + // ·Î±×ÀÎ ¼­¹ö °´Ã¼¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇÑ ÈÄ È°¼ºÈ­½ÃŲ´Ù. // try { struct rlimit rl; @@ -81,31 +81,31 @@ int main(int argc, char* argv[]) { rl.rlim_max = RLIM_INFINITY; setrlimit(RLIMIT_CORE, &rl); - // α ü Ѵ. + // ·Î±×ÀÎ ¼­¹ö °´Ã¼¸¦ »ý¼ºÇÑ´Ù. g_pSBillingPlayerManager = new SBillingPlayerManager(); g_pPayUserManager = new PayUserManager(); g_pSProfile = new SProfile(); - // α ü ʱȭѴ. + // ·Î±×ÀÎ ¼­¹ö °´Ã¼¸¦ ÃʱâÈ­ÇÑ´Ù. g_pSBillingPlayerManager->init(); g_pPayUserManager->init(); - // α ü ȰȭŲ. + // ·Î±×ÀÎ ¼­¹ö °´Ã¼¸¦ Ȱ¼ºÈ­½ÃŲ´Ù. g_pSBillingPlayerManager->start(); g_pPayUserManager->start(); while (true) usleep(100); } catch (Throwable& e) { - // αװ ̷ 츦 ؼ + // ·Î±×°¡ ÀÌ·ïÁö±â Àü¿¡ ¼­¹ö°¡ ³¡³¯ °æ¿ì¸¦ ´ëºñÇØ¼­ ofstream ofile("../log/instant.log", ios::out); ofile << e.toString() << endl; ofile.close(); - // ǥ ε ش. + // Ç¥ÁØ Ãâ·ÂÀ¸·Îµµ Ãâ·ÂÇØÁØ´Ù. cout << e.toString() << endl; - // α ߴܽŲ. - // ο Ŵ ߴܵǾ Ѵ. + // ·Î±×ÀÎ ¼­¹ö¸¦ ÁߴܽÃŲ´Ù. + // ÀÌ ³»ºÎ¿¡¼­ ÇÏÀ§ ¸Å´ÏÀú ¿ª½Ã ÁߴܵǾî¾ß ÇÑ´Ù. } } diff --git a/src/server/chinabilling/testserver/CBillingServer.cpp b/src/server/chinabilling/testserver/CBillingServer.cpp index 92d29901..283c2a41 100644 --- a/src/server/chinabilling/testserver/CBillingServer.cpp +++ b/src/server/chinabilling/testserver/CBillingServer.cpp @@ -2,7 +2,7 @@ // // Filename : CBillingServer.cpp // Written By : reiot@ewestsoft.com -// Description : ߱ (׽Ʈ) Ŭ +// Description : 중국 빌링 서버(테스트)용 메인 클래스 // ////////////////////////////////////////////////////////////////////// @@ -18,7 +18,7 @@ // // constructor // -// ý Ŵ constructor Ŵ ü Ѵ. +// 시스템 매니저의 constructor에서는 하위 매니저 객체를 생성한다. // ////////////////////////////////////////////////////////////////////// CBillingServer::CBillingServer() throw(Error) { @@ -35,7 +35,7 @@ CBillingServer::CBillingServer() throw(Error) { // // destructor // -// ý Ŵ destructor Ŵ ü ؾ Ѵ. +// 시스템 매니저의 destructor에서는 하위 매니저 객체를 삭제해야 한다. // ////////////////////////////////////////////////////////////////////// CBillingServer::~CBillingServer() throw(Error) { @@ -57,7 +57,7 @@ void CBillingServer::init() throw(Error) { cout << "CBillingServer::init() start" << endl; - // Ŵ ʱȭѴ. + // 서버간 통신 매니저를 초기화한다. g_pGameServerManager->init(); __END_CATCH @@ -73,7 +73,7 @@ void CBillingServer::start() throw(Error) { __BEGIN_TRY cout << "---------- Start CBillingServer ---------" << endl; - // Ŵ Ѵ. + // 서버간 통신 매니저를 시작한다. g_pGameServerManager->start(); while (true) { @@ -88,15 +88,15 @@ void CBillingServer::start() throw(Error) { // // stop shared server // -// stop ϵ . ִ Ŵ -// stop Ѿ Ѵ. ݴ stop ų null pointer -// ߻ ִ. +// stop 순서에 유의하도록 하자. 가장 영향을 많이 주는 매니저부터 +// stop 시켜야 한다. 만일 반대의 순서로 stop 시킬 경우 null pointer +// 같은 현상이 발생할 수 있다. // ////////////////////////////////////////////////////////////////////// void CBillingServer::stop() throw(Error) { __BEGIN_TRY - // ߿ κ ڸƮȭؾ Ѵ. + // 나중에 이 부분을 코멘트화해야 한다. throw UnsupportedError(); // diff --git a/src/server/chinabilling/testserver/CBillingServer.h b/src/server/chinabilling/testserver/CBillingServer.h index a203222a..82e03c0b 100644 --- a/src/server/chinabilling/testserver/CBillingServer.h +++ b/src/server/chinabilling/testserver/CBillingServer.h @@ -2,7 +2,7 @@ // // Filename : CBillingServer.h // Written By : reiot@ewestsoft.com -// Description : α Ŭ +// Description : 로그인 서버용 메인 클래스 // ////////////////////////////////////////////////////////////////////// @@ -17,7 +17,7 @@ // // class CBillingServer // -// α ü Ÿ Ŭ̴. +// 로그인 서버 자체를 나타내는 클래스이다. // ////////////////////////////////////////////////////////////////////// diff --git a/src/server/chinabilling/testserver/GameServerManager.cpp b/src/server/chinabilling/testserver/GameServerManager.cpp index 20268d22..7e3557a7 100644 --- a/src/server/chinabilling/testserver/GameServerManager.cpp +++ b/src/server/chinabilling/testserver/GameServerManager.cpp @@ -19,7 +19,7 @@ ////////////////////////////////////////////////////////////////////////////// // constructor -// Ŵ Ÿ Ѵ. +// 하위 매니저 및 데이타 멤버들을 생성한다. ////////////////////////////////////////////////////////////////////////////// GameServerManager::GameServerManager() throw(Error) @@ -33,10 +33,10 @@ GameServerManager::GameServerManager() throw(Error) m_pServerSocket = new ServerSocket(g_pConfig->getPropertyInt("TCPPort")); m_pServerSocket->setNonBlocking(); - // ũ͸ Ѵ. + // 서버 소켓 디스크립터를 지정한다. m_SocketID = m_pServerSocket->getSOCKET(); } catch (NoSuchElementException& nsee) { - // ȯ Ͽ ׷ element + // 환경 파일에 그런 element가 없을 경우 throw Error(nsee.toString()); } @@ -55,26 +55,26 @@ GameServerManager::~GameServerManager() throw(Error) { ////////////////////////////////////////////////////////////////////////////// -// Ŵ ʱȭѴ. +// 하위 매니저 및 데이터 멤버를 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GameServerManager::init() throw(Error) { __BEGIN_TRY - // fd_set 0 ʱȭѴ. + // fd_set 들을 0 으로 초기화한다. FD_ZERO(&m_ReadFDs[0]); FD_ZERO(&m_WriteFDs[0]); FD_ZERO(&m_ExceptFDs[0]); - // Ʈ Ҵ. (write üũ ʿ䰡 .) + // 서버 소켓의 비트를 켠다. (write 는 체크할 필요가 없다.) FD_SET(m_SocketID, &m_ReadFDs[0]); FD_SET(m_SocketID, &m_ExceptFDs[0]); // set min/max fd m_MinFD = m_MaxFD = m_SocketID; - // m_Timeout ʱȭѴ. - // ߿ ֱ ɼ óϵ . + // m_Timeout 을 초기화한다. + // 나중에는 이 주기 역시 옵션으로 처리하도록 하자. m_Timeout[0].tv_sec = 0; m_Timeout[0].tv_usec = 0; @@ -155,27 +155,27 @@ void GameServerManager::broadcast(Packet* pPacket, Player* pPlayer) throw(Error) ////////////////////////////////////////////////////////////////////////////// // call select() system call -// TimeoutException ÷̾ ó ʾƵ ȴ. +// 상위에서 TimeoutException 을 받으면 플레이어는 처리하지 않아도 된다. ////////////////////////////////////////////////////////////////////////////// void GameServerManager::select() throw(TimeoutException, InterruptedException, Error) { __BEGIN_TRY //__ENTER_CRITICAL_SECTION(m_Mutex) - // m_Timeout[0] m_Timeout[1] Ѵ. + // m_Timeout[0] 을 m_Timeout[1] 으로 복사한다. m_Timeout[1].tv_sec = m_Timeout[0].tv_sec; m_Timeout[1].tv_usec = m_Timeout[0].tv_usec; - // m_XXXFDs[0] m_XXXFDs[1] Ѵ. + // m_XXXFDs[0] 을 m_XXXFDs[1] 으로 복사한다. m_ReadFDs[1] = m_ReadFDs[0]; m_WriteFDs[1] = m_WriteFDs[0]; m_ExceptFDs[1] = m_ExceptFDs[0]; try { - // m_XXXFDs[1] select() ȣѴ. + // 이제 m_XXXFDs[1] 을 가지고 select() 를 호출한다. SocketAPI::select_ex(m_MaxFD + 1, &m_ReadFDs[1], &m_WriteFDs[1], &m_ExceptFDs[1], &m_Timeout[1]); } catch (InterruptedException& ie) { - // ñ׳ ~~ + // 시그널이 올 리가 엄찌~~ // log(LOG_GAMESERVER_ERROR, "", "", ie.toString()); } @@ -187,9 +187,9 @@ void GameServerManager::select() throw(TimeoutException, InterruptedException, E ////////////////////////////////////////////////////////////////////////////// // process all players' inputs -// read flag , ο Ƿ -// ̸ óϰ, ٸ read flag , ο Ŷ -// Ƿ ÷̾ processInput() ȣϸ ȴ. +// 서버 소켓의 read flag가 켜졌을 경우, 새로운 접속이 들어왔으므로 +// 이를 처리하고, 다른 소켓의 read flag가 켜졌을 경우, 새로운 패킷이 +// 들어왔으므로 그 플레이어의 processInput()을 호출하면 된다. ////////////////////////////////////////////////////////////////////////////// void GameServerManager::processInputs() throw(IOException, Error) { __BEGIN_TRY @@ -205,7 +205,7 @@ void GameServerManager::processInputs() throw(IOException, Error) { for (int i = m_MinFD; i <= m_MaxFD; i++) { if (FD_ISSET(i, &m_ReadFDs[1])) { if (i == m_SocketID) { - // ο ߴٴ ̴. + // 서버 소켓일 경우 새로운 연결이 도착했다는 뜻이다. acceptNewConnection(); } else { if (m_pGameServerPlayers[i] != NULL) { @@ -215,7 +215,7 @@ void GameServerManager::processInputs() throw(IOException, Error) { if (pGameServerPlayer->getSocket()->getSockError()) { try { - // ̹ ǾǷ, ۸ ÷ؼ ȵȴ. + // 이미 연결이 종료되었으므로, 출력 버퍼를 플러시해서는 안된다. pGameServerPlayer->disconnect(DISCONNECTED); } catch (Throwable& t) { cerr << t.toString() << endl; @@ -228,9 +228,9 @@ void GameServerManager::processInputs() throw(IOException, Error) { try { pGameServerPlayer->processInput(); } catch (ConnectException& ce) { - // Blocking ̹Ƿ, ConnectException Error  ܵ ߻ ʴ´. - // , αϰ ÷̾ Ŀ (εǾٸ) - // ÷̾ ü Ѵ. + // Blocking 소켓이므로, ConnectException과 Error를 제외한 어떤 예외도 발생하지 않는다. + // 연결이 끊겼을 경우, 로그하고 플레이어 정보를 저장한 후에 (로드되었다면) + // 플레이어 객체를 삭제한다. try { pGameServerPlayer->disconnect(); } catch (Throwable& t) { @@ -279,7 +279,7 @@ void GameServerManager::processCommands() throw(IOException, Error) { if (pGameServerPlayer->getSocket()->getSockError()) { try { - // ̹ ǾǷ, ۸ ÷ؼ ȵȴ. + // 이미 연결이 종료되었으므로, 출력 버퍼를 플러시해서는 안된다. pGameServerPlayer->disconnect(); } catch (Throwable& t) { cerr << t.toString() << endl; @@ -344,7 +344,7 @@ void GameServerManager::processOutputs() throw(IOException, Error) { if (pGameServerPlayer->getSocket()->getSockError()) { try { - // ̹ ǾǷ, ۸ ÷ؼ ȵȴ. + // 이미 연결이 종료되었으므로, 출력 버퍼를 플러시해서는 안된다. pGameServerPlayer->disconnect(DISCONNECTED); } catch (Throwable& t) { cerr << t.toString() << endl; @@ -364,7 +364,7 @@ void GameServerManager::processOutputs() throw(IOException, Error) { // log(LOG_GAMESERVER_ERROR, "", "", msg.toString()); try { - // ̹ ǾǷ, ۸ ÷ؼ ȵȴ. + // 이미 연결이 종료되었으므로, 출력 버퍼를 플러시해서는 안된다. pGameServerPlayer->disconnect(DISCONNECTED); } catch (Throwable& t) { cerr << t.toString() << endl; @@ -378,7 +378,7 @@ void GameServerManager::processOutputs() throw(IOException, Error) { msg << "DISCONNECT " << pGameServerPlayer->getID() << "(" << cp.toString() << ")"; // log(LOG_GAMESERVER_ERROR, "", "", cp.toString()); - // ̹ ǾǷ, ۸ ÷ؼ ȵȴ. + // 이미 연결이 종료되었으므로, 출력 버퍼를 플러시해서는 안된다. try { pGameServerPlayer->disconnect(DISCONNECTED); @@ -403,8 +403,8 @@ void GameServerManager::processOutputs() throw(IOException, Error) { ////////////////////////////////////////////////////////////////////////////// // process all players' exceptions -// OOB Ÿ ȹ . -// , OOB ִٸ ϰ Ȯ © . +// 현재까지는 OOB 데이타를 전송할 계획은 없다. +// 따라서, 만약 OOB가 켜져 있다면 에러로 간주하고 접속을 확 짤라 버린다. ////////////////////////////////////////////////////////////////////////////// void GameServerManager::processExceptions() throw(IOException, Error) { @@ -454,14 +454,14 @@ void GameServerManager::processExceptions() throw(IOException, Error) { ////////////////////////////////////////////////////////////////////////////// -// select ݿ nonblocking ʴ´. +// select 기반에서는 nonblocking 소켓을 사용하지 않는다. ////////////////////////////////////////////////////////////////////////////// void GameServerManager::acceptNewConnection() throw(Error) { __BEGIN_TRY - // ŷ connection ٸ - // ϵǴ NULL . - // NonBlockingIOException ߻ . + // 블록킹 방식으로 connection을 기다릴 경우 + // 리턴되는 값은 절대 NULL이 될 수 없다. + // 또한 NonBlockingIOException도 발생할 수 없다. Socket* client = NULL; try { @@ -474,16 +474,16 @@ void GameServerManager::acceptNewConnection() throw(Error) { } try { - // ó Ͽ ־ ξµ Ѵ.. - // Ƹ Thread κп Ѵ - // Thread ó ӽ÷ . + // 에러 처리를 위하여 넣어 두었는데 원인을 꼭 밝혀야 한다.. + // 아마도 Thread의 소켓 관리 부분에서 문제가 생기지 않을까 생각 한다 + // Thread 관련 처리를 끝내기 전까지 임시로 들어간다. if (client->getSockError()) throw Error(); client->setNonBlocking(); - // ó Ͽ ־ ξµ Ѵ.. - // Ƹ Thread κп Ѵ - // Thread ó ӽ÷ . + // 에러 처리를 위하여 넣어 두었는데 원인을 꼭 밝혀야 한다.. + // 아마도 Thread의 소켓 관리 부분에서 문제가 생기지 않을까 생각 한다 + // Thread 관련 처리를 끝내기 전까지 임시로 들어간다. if (client->getSockError()) throw Error(); // set socket option (!NonBlocking, NoLinger) @@ -492,10 +492,10 @@ void GameServerManager::acceptNewConnection() throw(Error) { // StringStream msg; // cout << "NEW CONNECTION FROM " << client->getHost() << ":" << client->getPort(); - // Ŭ̾Ʈ Ķͷ ؼ ÷̾ ü Ѵ. + // 클라이언트 소켓을 파라미터로 사용해서 플레이어 객체를 생성한다. GameServerPlayer* pGameServerPlayer = new GameServerPlayer(client); - // IPM Ѵ. + // IPM 에 등록한다. try { addGameServerPlayer(pGameServerPlayer); } catch (DuplicatedException&) { @@ -509,7 +509,7 @@ void GameServerManager::acceptNewConnection() throw(Error) { msg2 << "ILLEGAL ACCESS FROM " << client->getHost() << ":" << client->getPort(); // log(LOG_GAMESERVER, "", "", msg2.toString()); - // ̹Ƿ ¥. -_-; + // 인증되지 못한 연결이므로 짜른다. -_-; client->send("Error : Unauthorized access", 27); client->close(); SAFE_DELETE(client); @@ -531,7 +531,7 @@ void GameServerManager::acceptNewConnection() throw(Error) { ////////////////////////////////////////////////////////////////////// // -// ο ῡ õ ÷̾ ü IPM ߰Ѵ. +// 새로운 연결에 관련된 플레이어 객체를 IPM에 추가한다. // ////////////////////////////////////////////////////////////////////// void GameServerManager::addGameServerPlayer(GameServerPlayer* pGameServerPlayer) throw(DuplicatedException, Error) { @@ -541,12 +541,12 @@ void GameServerManager::addGameServerPlayer(GameServerPlayer* pGameServerPlayer) SOCKET fd = pGameServerPlayer->getSocket()->getSOCKET(); - // m_MinFD , m_MaxFD Ѵ. + // m_MinFD , m_MaxFD 를 재조정한다. m_MinFD = min(fd, m_MinFD); m_MaxFD = max(fd, m_MaxFD); - // fd_set fd Ʈ on Ų. - // m_XXXFDs[1] óָ ȴ. + // 모든 fd_set 에 fd 비트를 on 시킨다. + // m_XXXFDs[1] 은 다음번에 처리해주면 된다. FD_SET(fd, &m_ReadFDs[0]); FD_SET(fd, &m_WriteFDs[0]); FD_SET(fd, &m_ExceptFDs[0]); @@ -560,7 +560,7 @@ void GameServerManager::addGameServerPlayer(GameServerPlayer* pGameServerPlayer) ////////////////////////////////////////////////////////////////////// // -// Ư ÷̾ IPM Ѵ. +// 특정 플레이어를 IPM 에서 삭제한다. // ////////////////////////////////////////////////////////////////////// void GameServerManager::deleteGameServerPlayer(SOCKET fd) throw(OutOfBoundException, NoSuchElementException, Error) { @@ -570,11 +570,11 @@ void GameServerManager::deleteGameServerPlayer(SOCKET fd) throw(OutOfBoundExcept m_pGameServerPlayers[fd] = NULL; - // m_MinFD , m_MaxFD Ѵ. - // fd == m_MinFD && fd == m_MaxFD ù° if óȴ. + // m_MinFD , m_MaxFD 를 재조정한다. + // fd == m_MinFD && fd == m_MaxFD 인 경우는 첫번째 if 에서 처리된다. if (fd == m_MinFD) { - // տ fd ã´. - // m_MinFD ڸ NULL Ǿ ϶. + // 앞에서부터 제일 작은 fd 를 찾는다. + // m_MinFD 자리는 현재 NULL 이 되어 있음을 유의하라. int i = m_MinFD; for (i = m_MinFD; i <= m_MaxFD; i++) { if (m_pGameServerPlayers[i] != NULL || i == m_SocketID) { @@ -583,14 +583,14 @@ void GameServerManager::deleteGameServerPlayer(SOCKET fd) throw(OutOfBoundExcept } } - // m_MinFD ã , - // ̶ m_MinFD == m_MaxFD ̴. - // ̶ -1 . + // 적절한 m_MinFD를 찾지 못했을 경우, + // 이때에는 m_MinFD == m_MaxFD 인 경우이다. + // 이때에는 둘 다 -1 로 설정해주자. if (i > m_MaxFD) m_MinFD = m_MaxFD = -1; } else if (fd == m_MaxFD) { - // ڿ ū fd ã´. - // SocketID ! (SocketID Player ʹ NULL ̴.) + // 뒤에서부터 가장 큰 fd 를 찾는다. + // SocketID 에 유의할 것! (SocketID 의 경우 Player 포인터는 NULL 이다.) int i = m_MaxFD; for (i = m_MaxFD; i >= m_MinFD; i--) { if (m_pGameServerPlayers[i] != NULL || i == m_SocketID) { @@ -599,15 +599,15 @@ void GameServerManager::deleteGameServerPlayer(SOCKET fd) throw(OutOfBoundExcept } } - // m_MinFD ã , + // 적절한 m_MinFD를 찾지 못했을 경우, if (i < m_MinFD) { throw UnknownError("m_MinFD & m_MaxFD problem."); } } - // fd_set fd Ʈ off Ų. - // m_XXXFDs[1] ľ ϴ , ó ü µ - // ó Ȯ ֱ ̴. + // 모든 fd_set 에 fd 비트를 off 시킨다. + // m_XXXFDs[1]도 고쳐야 하는 이유는, 이후 처리에서 객체가 없어졌는데도 + // 처리받을 확률이 있기 때문이다. FD_CLR(fd, &m_ReadFDs[0]); FD_CLR(fd, &m_ReadFDs[1]); FD_CLR(fd, &m_WriteFDs[0]); diff --git a/src/server/chinabilling/testserver/GameServerManager.h b/src/server/chinabilling/testserver/GameServerManager.h index 96b15a57..3b5510d3 100644 --- a/src/server/chinabilling/testserver/GameServerManager.h +++ b/src/server/chinabilling/testserver/GameServerManager.h @@ -28,7 +28,7 @@ class GameServerManager : public Thread { ~GameServerManager() throw(Error); public: - // 弭 ޾Ƶ̴ ִ Ӽ + // 쉐어드서버에서 받아들이는 최대 게임서버 수 const static uint nMaxGameServers = 100; // initialize @@ -74,23 +74,23 @@ class GameServerManager : public Thread { void heartbeat() throw(Error); private: - // TCP ϰ ũ + // TCP 서버 소켓과 소켓 디스크립터 ServerSocket* m_pServerSocket; SOCKET m_SocketID; - // Ҽӵ ÷̾ ũ ̴. - // m_XXXXFDs[0] ̸, m_XXXFDs[1] select() Ķͷ ȴ. - // select()ϱ [0] -> [1] 簡 ̷ Ѵ. + // 소속된 플레이어들의 소켓 디스크립터의 집합이다. + // m_XXXXFDs[0]은 저장용이며, m_XXXFDs[1]이 실제로 select()의 파라미터로 사용된다. + // 즉 select()하기 전에 [0] -> [1] 로 복사가 이루어져야 한다. fd_set m_ReadFDs[2]; fd_set m_WriteFDs[2]; fd_set m_ExceptFDs[2]; - // select Ǵ ð + // select에 사용되는 시간 Timeval m_Timeout[2]; // min_fd, max_fd - // select() iterating ӵ ؼ Ѵ. - // select() ù° Ķ͸ ϱ ؼ Ѵ. + // select()후 iterating 할 때 속도 증가를 위해서 사용한다. + // 또한 select()의 첫번째 파라미터를 계산하기 위해서 사용한다. SOCKET m_MinFD; SOCKET m_MaxFD; @@ -98,7 +98,7 @@ class GameServerManager : public Thread { mutable Mutex m_Mutex; - // Ӽ 迭. ũ͸ ε Ѵ. + // 게임서버의 포인터 배열. 소켓 디스크립터를 인덱스로 사용한다. GameServerPlayer* m_pGameServerPlayers[nMaxGameServers]; }; diff --git a/src/server/chinabilling/testserver/GameServerPlayer.cpp b/src/server/chinabilling/testserver/GameServerPlayer.cpp index aa41e794..875269a8 100644 --- a/src/server/chinabilling/testserver/GameServerPlayer.cpp +++ b/src/server/chinabilling/testserver/GameServerPlayer.cpp @@ -110,7 +110,7 @@ void GameServerPlayer::processOutput() throw(IOException, Error) { try { m_pOutputStream->flush(); } catch (InvalidProtocolException&) { - throw DisconnectException("̻ Ŷ"); + throw DisconnectException("이상한 패킷임"); } __END_CATCH @@ -126,14 +126,14 @@ void GameServerPlayer::processCommand() throw(IOException, Error) { __BEGIN_TRY try { - // Է¹ۿ ִ Ŷ óѴ. + // 입력버퍼에 들어있는 완전한 패킷들을 모조리 처리한다. while (true) { - // + // 헤더를 저장할 버퍼 생성 CBillingPacketHeader header; - // Է½Ʈ Ŷũ⸸ŭ о. - // ũ⸸ŭ Ʈ ٸ, - // Insufficient ܰ ߻ϰ, . + // 입력스트림에서 패킷헤더크기만큼 읽어본다. + // 만약 지정한 크기만큼 스트림에서 읽을 수 없다면, + // Insufficient 예외가 발생하고, 루프를 빠져나간다. if (!m_pInputStream->peek((char*)&header, szCBillingPacketHeaderInfo)) break; @@ -258,9 +258,9 @@ void GameServerPlayer::disconnect(bool bDisconnected) throw(InvalidProtocolExcep __BEGIN_TRY try { - // ϰ α׾ƿ 쿡 ۸ ÷ ִ. - // ׷, ҹ 𽺸 ɾٸ ݰǷ - // ÷ SIG_PIPE ް ȴ. + // 정당하게 로그아웃한 경우에는 출력 버퍼를 플러시할 수 있다. + // 그러나, 불법적인 디스를 걸었다면 소켓이 닫겼으므로 + // 플러시할 경우 SIG_PIPE 을 받게 된다. if (bDisconnected == UNDISCONNECTED) { m_pOutputStream->flush(); } @@ -270,7 +270,7 @@ void GameServerPlayer::disconnect(bool bDisconnected) throw(InvalidProtocolExcep cerr << "GameServerPlayer::disconnect Exception Check!!" << endl; cerr << t.toString() << endl; m_pSocket->close(); - // throw Error("..."); + // throw Error("씨바..."); } __END_CATCH @@ -338,7 +338,7 @@ void GameServerPlayer::executeLogin(CBillingPacketHeader& header, sHeader.Body_Length = szCBillingPacketResponseLoginBodyInfo; // sHeader.Body_Length = szCBillingPacketErrorBodyInfo; - // strcpy( sBody.Return_Message, "޷" ); + // strcpy( sBody.Return_Message, "메롱" ); strcpy(sBody.Login_Name, body.Login_Name); sBody.Player_Type = CBILLING_PLAYER_TYPE_UNLIMITED; sBody.Pay_Type = CBILLING_PAY_TYPE_PRE_PAID; diff --git a/src/server/chinabilling/testserver/GameServerPlayer.h b/src/server/chinabilling/testserver/GameServerPlayer.h index 2a740587..b67df9ad 100644 --- a/src/server/chinabilling/testserver/GameServerPlayer.h +++ b/src/server/chinabilling/testserver/GameServerPlayer.h @@ -47,9 +47,9 @@ class GameServerPlayer : public Player { virtual void sendPacket(Packet* pPacket) throw(ProtocolException, Error); // disconnect - // ÷̾ , ϰ α׾ƿ - // ̹ Ƿ disconnect(DISCONNECTED) ؼ ؾ Ѵ. ݸ, - // ϰ α׾ƿ 쿡 disconnect(UNDISCONNECTED) ؾ Ѵ. + // 플레이어의 연결을 종료할 때, 상대편이 적절하게 로그아웃하지 않을 경우 소켓의 연결이 + // 이미 끊겨 있으므로 disconnect(DISCONNECTED) 를 사용해서 연결을 종료해야 한다. 반면, + // 정당하게 로그아웃을 한 경우에는 disconnect(UNDISCONNECTED) 를 사용해야 한다. virtual void disconnect(bool bDisconnected = DISCONNECTED) throw(InvalidProtocolException, Error); // get/set socket diff --git a/src/server/chinabilling/testserver/main.cpp b/src/server/chinabilling/testserver/main.cpp index 7e258830..2162b4c8 100644 --- a/src/server/chinabilling/testserver/main.cpp +++ b/src/server/chinabilling/testserver/main.cpp @@ -2,7 +2,7 @@ // // Filename : main.cpp // Written By : reiot@ewestsoft.com -// Description : α Լ +// Description : ·Î±×ÀÎ ¼­¹ö¿ë ¸ÞÀÎ ÇÔ¼ö // ////////////////////////////////////////////////////////////////////// @@ -30,31 +30,31 @@ void memoryError() { // ////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { - // ޸ .. Լ Ѵ. + // ¸Þ¸ð¸® ¾ø´Ù.. ÇÔ¼ö¸¦ ¼³Á¤ÇÑ´Ù. set_new_handler(memoryError); if (argc < 3) { - cout << "Usage : cbillingserver -f ȯ" << endl; + cout << "Usage : cbillingserver -f ȯ°æÆÄÀÏ" << endl; exit(1); } - // command-line parameter string ȯѴ. ^^; + // command-line parameter¸¦ string À¸·Î º¯È¯ÇÑ´Ù. ^^; string* Argv; Argv = new string[argc]; for (int i = 0; i < argc; i++) Argv[i] = argv[i]; - // ȯ оδ. - // $VSHOME/bin, ȯ $VSHOME/conf ؾ Ѵ. - // command line ȯ ֵ Ѵ. + // ȯ°æ ÆÄÀÏÀ» ÀоîµéÀδÙ. + // ´Ü ½ÇÇà ÆÄÀÏÀº $VSHOME/bin¿¡, ȯ°æ ÆÄÀÏÀº $VSHOME/conf ¿¡ Á¸ÀçÇØ¾ß ÇÑ´Ù.½ + // command line ¿¡¼­ ȯ°æ ÆÄÀÏÀ» ÁöÁ¤ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. try { if (Argv[1] != "-f") { - throw Error("Usage : cbillingserver -f ȯ"); + throw Error("Usage : cbillingserver -f ȯ°æÆÄÀÏ"); } - // ù° ĶͰ -f , ι° Ķʹ ȯ ġ ȴ. + // ù¹øÂ° ÆÄ¶ó¹ÌÅͰ¡ -f ÀÏ °æ¿ì, µÎ¹øÂ° ÆÄ¶ó¹ÌÅʹ ȯ°æÆÄÀÏÀÇ À§Ä¡°¡ µÈ´Ù. g_pConfig = new Properties(); g_pConfig->load(Argv[2]); @@ -64,14 +64,14 @@ int main(int argc, char* argv[]) { cout << e.toString() << endl; } - // α Ŵ ϰ ʱȭ ȰȭŲ. - // α Ŵ α ʱȭ ߻ ɼ ִ - // س ϹǷ α ο ʱȭؼ ȵȴ. - // ٸ ü ϰ ʱȭϱ α׸Ŵ 켱 , - // ʱȭǾ Ѵ. + // ·Î±× ¸Å´ÏÀú¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇÑÈÄ È°¼ºÈ­½ÃŲ´Ù. + // ·Î±× ¸Å´ÏÀú´Â ·Î±×ÀÎ ¼­¹öÀÇ ÃʱâÈ­°úÁ¤¿¡¼­ ¹ß»ýÇÒ °¡´É¼ºÀÌ ÀÖ´Â ¿¡·¯±îÁöµµ + // °ËÃâÇØ³»¾ß ÇϹǷΠ·Î±×ÀÎ ¼­¹ö ³»ºÎ¿¡¼­ ÃʱâÈ­ÇØ¼­´Â ¾ÈµÈ´Ù. + // ¶ÇÇÑ ´Ù¸¥ °´Ã¼¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇϱâÀü¿¡ ·Î±×¸Å´ÏÀú°¡ ¿ì¼±ÀûÀ¸·Î »ý¼º, + // ÃʱâÈ­µÇ¾î¾ß ÇÑ´Ù. // - // α ü ϰ ʱȭ ȰȭŲ. + // ·Î±×ÀÎ ¼­¹ö °´Ã¼¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇÑ ÈÄ È°¼ºÈ­½ÃŲ´Ù. // try { struct rlimit rl; @@ -79,25 +79,25 @@ int main(int argc, char* argv[]) { rl.rlim_max = RLIM_INFINITY; setrlimit(RLIMIT_CORE, &rl); - // α ü Ѵ. + // ·Î±×ÀÎ ¼­¹ö °´Ã¼¸¦ »ý¼ºÇÑ´Ù. g_pCBillingServer = new CBillingServer(); - // α ü ʱȭѴ. + // ·Î±×ÀÎ ¼­¹ö °´Ã¼¸¦ ÃʱâÈ­ÇÑ´Ù. g_pCBillingServer->init(); - // α ü ȰȭŲ. + // ·Î±×ÀÎ ¼­¹ö °´Ã¼¸¦ Ȱ¼ºÈ­½ÃŲ´Ù. g_pCBillingServer->start(); } catch (Throwable& e) { - // αװ ̷ 츦 ؼ + // ·Î±×°¡ ÀÌ·ïÁö±â Àü¿¡ ¼­¹ö°¡ ³¡³¯ °æ¿ì¸¦ ´ëºñÇØ¼­ ofstream ofile("../log/instant.log", ios::out); ofile << e.toString() << endl; ofile.close(); - // ǥ ε ش. + // Ç¥ÁØ Ãâ·ÂÀ¸·Îµµ Ãâ·ÂÇØÁØ´Ù. cout << e.toString() << endl; - // α ߴܽŲ. - // ο Ŵ ߴܵǾ Ѵ. + // ·Î±×ÀÎ ¼­¹ö¸¦ ÁߴܽÃŲ´Ù. + // ÀÌ ³»ºÎ¿¡¼­ ÇÏÀ§ ¸Å´ÏÀú ¿ª½Ã ÁߴܵǾî¾ß ÇÑ´Ù. g_pCBillingServer->stop(); } } diff --git a/src/server/database/Connection.cpp b/src/server/database/Connection.cpp index ebd65487..fda4327d 100644 --- a/src/server/database/Connection.cpp +++ b/src/server/database/Connection.cpp @@ -2,7 +2,7 @@ // // File Name : Connection.cpp // Written by : Gday29@ewestsoft.com -// Description : Ŀؼ Ŭ +// Description : 커넥션 클래스 구현 // ////////////////////////////////////////////////////////////////////// @@ -15,8 +15,8 @@ // // constructor // -// ̽ ϰ, ͺ̽ Ѵ. -// ܸ κ ؾ Ѵ. +// 데이터 베이스와 연결하고, 데이터베이스를 선택한다. +// 예외를 던지는 부분은 수정해야 한다. // ////////////////////////////////////////////////////////////////////// @@ -25,7 +25,7 @@ Connection::Connection() : m_bConnected(false), m_bBusy(false) { m_Mutex.setName("Connection"); - // MYSQL ü ʱȭѴ. + // MYSQL 객체를 초기화한다. if (mysql_init(&m_Mysql) == NULL) { throw Error(mysql_error(&m_Mysql)); } @@ -37,9 +37,9 @@ Connection::Connection() : m_bConnected(false), m_bBusy(false) { // // *CAUTION* // -// connect() ȣ port , Ʈ 0 Ǹ -// ̶ MYSQL Ʈ Ʈ ȴ. ׷, ؼ MYSQL ٸ -// Ʈٰ ̴. , Ʈ ʿ䰡 ִ. +// connect()를 호출할 때 port 를 명시하지 않을 경우, 디폴트값인 0 이 사용되며 +// 이때 MYSQL의 디폴트 포트가 사용된다. 그렇지만, 보안을 위해서 MYSQL을 다른 +// 포트에다가 띄워놔야 할 것이다. 따라서, 포트를 지정할 필요가 있다. // ////////////////////////////////////////////////////////////////////// @@ -49,11 +49,11 @@ Connection::Connection(string host, string db, string user, string password, uin m_Mutex.setName("Connection"); - // MYSQL ü ʱȭѴ. + // MYSQL 객체를 초기화한다. if (mysql_init(&m_Mysql) == NULL) throw Error(mysql_error(&m_Mysql)); - // ٷ õѴ. + // 바로 연결을 시도한다. connect(m_Host, m_Database, m_User, m_Password, m_Port); __END_CATCH @@ -66,7 +66,7 @@ Connection::Connection(string host, string db, string user, string password, uin ////////////////////////////////////////////////////////////////////// Connection::~Connection() { - // Ǿ , ´. + // 연결되어 있을 경우, 연결을 끊는다. if (m_bConnected) { close(); } @@ -76,17 +76,17 @@ Connection::~Connection() { // // connect() // -// Connection ü , -// ϴ default constructor ؼ ü , -// ޾Ƽ ͸ ʱȭ Ѵ. +// Connection 객체가 생성될 때, 어디에 연결할 지 알지 못할 경우 +// 일단 default constructor 를 사용해서 객체를 생성한 다음, +// 연결할 때 값을 받아서 내부 데이터멤버들을 초기화한 후 연결한다. // // *CAUTION* // -// connect() ȣ port , Ʈ 0 Ǹ -// ̶ MYSQL Ʈ Ʈ ȴ. ׷, ؼ MYSQL ٸ -// Ʈٰ ̴. +// connect()를 호출할 때 port 를 명시하지 않을 경우, 디폴트값인 0 이 사용되며 +// 이때 MYSQL 의 디폴트 포트가 사용된다. 그렇지만, 보안을 위해서 MYSQL을 다른 +// 포트에다가 띄워놔야 할 것이다. // -// Ʈ Ķ͸ ؾ ϱ , Ʈ ĶͰ ڷ .. *_*; +// 디폴트 파라미터를 사용해야 하기 때문에, 포트 파라미터가 맨 뒤로 갔다.. *_*; // // ex> Connection conn; // conn.connect( "vampire.ewestsoft.com" , "bbs" , "bbsuser" , "bbspassword" ); @@ -113,8 +113,8 @@ void Connection::connect(string host, string db, string user, string password, u // // connect() // -// ڿ Է¹ , ٷ ޽带 ȣؼ -// õѴ. +// 생성자에서 직접 정보를 입력받을 경우, 바로 이 메쏘드를 호출해서 +// 연결을 시도한다. // ////////////////////////////////////////////////////////////////////// @@ -123,22 +123,22 @@ void Connection::connect() { __BEGIN_TRY - // Ϸ ϴµ ̹ Ǿִٸ . + // 연결을 하려구 하는데 이미 연결이 되어있다면 에러다. if (m_bConnected) { - // ̷ , ݾ ְ ܸ ̴. + // 이럴 경우, 연결은 닫아 주고 예외를 던져야 할 것이다. close(); throw SQLConnectException("Already Connected"); } //-------------------------------------------------- - // üũؾ ... + // 에러가 생기는지 체크해야 함... //-------------------------------------------------- m_bConnected = (mysql_real_connect(&m_Mysql, m_Host.c_str(), m_User.c_str(), m_Password.c_str(), m_Database.c_str(), m_Port, 0, 0) != NULL); // cout << "Connection Calls~~~" << endl; - // ° ƴ϶ . + // 연결상태가 아니라면 에러다. if (!m_bConnected) { throw SQLConnectException(mysql_error(&m_Mysql)); } @@ -150,7 +150,7 @@ void Connection::connect() // // close() // -// ´. +// 연결을 끊는다. // ////////////////////////////////////////////////////////////////////// @@ -163,7 +163,7 @@ void Connection::close() throw SQLConnectException("Not Connected"); } - // void ̹Ƿ .. - -; + // void 이므로 무시.. - -; mysql_close(&m_Mysql); m_bConnected = false; @@ -175,20 +175,20 @@ void Connection::close() // // createStatement // -// ο Statement ü ü ͸ Ѵ. +// 새로운 Statement 객체를 만들어 그 객체의 포인터를 리턴한다. // ////////////////////////////////////////////////////////////////////// Statement* Connection::createStatement() { __BEGIN_TRY - // ο Statement ü . + // 새로운 Statement 객체를 만든다. Statement* pStatement = new Statement(); - // ü Ŀؼ Ŀؼ ü ϰ.. + // 만든 객체의 커넥션 값을 이 커넥션 객체로 하고.. pStatement->setConnection(this); - // Ѵ. + // 리턴한다. return pStatement; __END_CATCH diff --git a/src/server/database/Connection.h b/src/server/database/Connection.h index fe4398e0..8de40586 100644 --- a/src/server/database/Connection.h +++ b/src/server/database/Connection.h @@ -2,7 +2,7 @@ // // File Name : Connection.h // Written by : Gday29@ewestsoft.com -// Description : Ÿ̽ ϴ Ŭ +// Description : 데이타베이스와의 연결을 담당하는 클래스 // ////////////////////////////////////////////////////////////////////// @@ -23,7 +23,7 @@ class Statement; // // class Connection; // -// ̽ ϰ, Ѵ. +// 데이터 베이스에 연결하고, 관리한다. // ////////////////////////////////////////////////////////////////////// @@ -41,10 +41,10 @@ class Connection { // close the connection to database void close(); - // Ÿ̽ õѴ. + // 데이타베이스에 연결을 시도한다. void connect(string host, string db, string user, string password, uint port = 0); - // Ÿ̽ õѴ. + // 데이타베이스에 연결을 시도한다. void connect(); // check the connection @@ -55,7 +55,7 @@ class Connection { return m_bConnected == false; } - // Statement ü ؼ Ѵ. + // Statement 객체를 생성해서 리턴한다. Statement* createStatement(); // get the MYSQL object @@ -126,28 +126,28 @@ class Connection { // is connected? bool m_bConnected; - // DBMS Ǵ ȣƮ + // DBMS 가 운영되는 호스트 명 string m_Host; - // DBMS Ʈ + // DBMS 의 연결 포트 uint m_Port; - // Ÿ̽ ̸ + // 데이타베이스 이름 string m_Database; - // ̵ + // 사용자 아이디 string m_User; - // н + // 사용자 패스워드 string m_Password; - // connection name(DatabaseManager Ű) + // connection name(DatabaseManager 에서 사용할 키값) string m_Name; - // Ŀؼΰ? + // 현재 사용중인 커넥션인가? bool m_bBusy; - // lock + // 동시 쿼리를 막기 위한 lock Mutex m_Mutex; }; diff --git a/src/server/database/DatabaseManager.h b/src/server/database/DatabaseManager.h index b19c283e..cb3f2f57 100644 --- a/src/server/database/DatabaseManager.h +++ b/src/server/database/DatabaseManager.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : DatabaseManager.h // Written By : elca -// Description : Ÿ̽ Ŵ +// Description : 데이타베이스 매니저 ////////////////////////////////////////////////////////////////////////////// #ifndef __DATABASE_MANAGER_H__ @@ -41,57 +41,57 @@ class DatabaseManager { //-------------------------------------------------------------------- // * elca's NOTE - // α ij ˾Ƴ Ͽ - // DB ġ ˾Ƴ ´. - // DB DB ġ ϴ Table ؾ Ѵ. - // GameServerIP ̾ DB GameServer ٸ 츦 - // Ͽ Ȯ强 Ѵ. + // 로그인 서버에서는 캐릭터의 정보를 어디서 얻어오는지 알아내기 위하여 + // DB의 위치를 알아내 온다. + // 메인 DB에서는 DB의 위치를 포함하는 Table이 존재해야 한다. + // GameServerIP로 뽑아 낼 수도 있지만 DB와 GameServer가 다른 경우를 + // 생각하여 확장성을 고려한다. //-------------------------------------------------------------------- //-------------------------------------------------------------------- // * elca's NOTE - // Parent/Main DB ˸ ȴ. - // DB ̵ 0 ̶ ϰ - // DB 0 ڷ ѱ. - // 0 ĿؼǸ ȴ. - // Ȥó ϴ ֱ ٸ Ŀؼ ʵ - // ϵ Ѵ. - // Ϲ ֱ - // Ű澲 ʵ Ѵ. + // 각 게임 서버의 경우 Parent/Main DB만을 알면 된다. + // 메인 DB 서버의 월드 아이디는 무조건 0 번이라고 약정하고 + // 메인 DB 서버에 쿼리는 0 번 인자로 넘긴다. + // 게임 서버일 경우 이 0 번의 커넥션만 가지고 있으면 된다. + // 혹시나 하는 버그의 우려가 있기 때문에 절대 다른 커넥션은 열지 않도록 + // 주의 하도록 한다. + // 일반 게임 서버에서의 쿼리는 쓰레드 별로 나뉘어져 있기 때문에 + // 신경쓰지 않도록 한다. //-------------------------------------------------------------------- Connection* getConnection(int TID); // void addConnection(WorldID_t WorldID, Connection * pConnection) throw(DuplicatedException); private: - // 庰 ϴ DB + // 각 쓰레드별로 존재하는 DB 연결 unordered_map m_Connections; - // 庰 ϴ Distribute DB + // 각 쓰레드별로 존재하는 Distribute DB 연결 unordered_map m_DistConnections; // unordered_map m_WorldConnections; unordered_map m_WorldConnections; - // 庰 ϴ CBilling DB + // 각 쓰레드별로 존재하는 CBilling DB 연결 unordered_map m_CBillingConnections; - // PC տ DB + // PC방 통합용 DB 연결 // unordered_map m_PCRoomConnections; - // 庰 ϴ DB + // 각 월드별로 존재하는 DB 연결 - // ó Ǵ ⺻ DB + // 제일 처음 생성되는 기본 DB 연결 Connection* m_pDefaultConnection; - // ó Ǵ DB ⺻ + // 제일 처음 생성되는 최 상위 DB의 기본 연결 Connection* m_pWorldDefaultConnection; - // DB + // 사용자 통계 관련 DB 연결 Connection* m_pUserInfoConnection; Connection* m_pDistConnection; - // PC տ DB default. α . + // PC방 통합용 DB 연결 default. 로그인 서버에서 쓴다. // Connection* m_pPCRoomConnection; mutable Mutex m_Mutex; diff --git a/src/server/database/DatabaseManager.old.cpp b/src/server/database/DatabaseManager.old.cpp index a720e7b5..8c3c3de1 100644 --- a/src/server/database/DatabaseManager.old.cpp +++ b/src/server/database/DatabaseManager.old.cpp @@ -28,12 +28,12 @@ DatabaseManager::DatabaseManager() throw() { DatabaseManager::~DatabaseManager() throw() { __BEGIN_TRY - // Connection ؾ Ѵ. + // 모든 Connection 를 삭제해야 한다. unordered_map::iterator itr = m_Connections.begin(); for (; itr != m_Connections.end(); itr++) SAFE_DELETE(itr->second); - // ؽʾȿ ִ pair Ѵ. + // 해쉬맵안에 있는 모든 pair 들을 삭제한다. m_Connections.clear(); SAFE_DELETE(m_pDefaultConnection); @@ -128,7 +128,7 @@ void DatabaseManager::addConnection(int TID, Connection* pConnection) #ifdef __GAME_SERVER - // World DB Connection ִ 찡 . + // 게임 서버일 경우 각 쓰레드 별로 World DB Connection이 있는 경우가 좋다. Statement* pStmt = NULL; pStmt = m_pDefaultConnection->createStatement(); Result* pResult = NULL; diff --git a/src/server/database/Result.cpp b/src/server/database/Result.cpp index e53ea624..38917e62 100644 --- a/src/server/database/Result.cpp +++ b/src/server/database/Result.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // File Name : Result.cc // Written By : Gday29@ewestsoft.com -// Description : Result class +// Description : Result class 구현 ////////////////////////////////////////////////////////////////////////////// #include "Result.h" @@ -21,7 +21,7 @@ Result::Result(T_RESULT* pResult, const string& statement) { Assert(m_pResult != NULL); - // #rows Ѵ. + // #rows 값을 지정한다. m_RowCount = mysql_num_rows(m_pResult); m_FieldCount = mysql_num_fields(m_pResult); @@ -60,7 +60,7 @@ Result::~Result() throw() { ////////////////////////////////////////////////////////////////////////////// // next() -// row true , false Ѵ. +// 다음 row 가 존재할 경우 true 를, 없을 경우 false 를 리턴한다. ////////////////////////////////////////////////////////////////////////////// bool Result::next() { @@ -75,8 +75,8 @@ bool Result::next() { ////////////////////////////////////////////////////////////////////////////// // getField -// Ķͷ ε ؼ ÷ Ѵ. -// 1 ÷ ȴ. (0 ƴϴ..) +// 파라미터로 인덱스를 지정해서 그 컬럼을 리턴한다. +// 1 이 최초의 컬럼이 된다. (0 이 아니당..) ////////////////////////////////////////////////////////////////////////////// char* Result::getField(uint index) { diff --git a/src/server/database/Result.h b/src/server/database/Result.h index 7a303750..fd06e8dc 100644 --- a/src/server/database/Result.h +++ b/src/server/database/Result.h @@ -23,7 +23,7 @@ class Statement; ////////////////////////////////////////////////////////////////////////////// // class Result; -// Result ʿ䰡 . ڴ Statement ϸ ȴ. +// Result 는 삭제할 필요가 없다. 사용자는 Statement 만 삭제하면 된다. ////////////////////////////////////////////////////////////////////////////// class Result { @@ -32,10 +32,10 @@ class Result { ~Result(); public: - // row Ѿ. + // 다음 row로 넘어간다. bool next(); - // Ư ʵ(÷) ´. + // 특정 필드(컬럼) 값을 가지고 온다. char* getField(uint index); char getChar(uint index) { return (getField(index))[0]; @@ -57,7 +57,7 @@ class Result { } const char* getString(uint index); - // ϴ row/column ڸ Ѵ. + // 쿼리 결과값이 포함하는 row/column의 숫자를 리턴한다. uint getRowCount() const { return m_RowCount; } @@ -70,11 +70,11 @@ class Result { } private: - T_RESULT* m_pResult; // Ÿ MYSQL structure - MYSQL_ROW m_pRow; // óϰ ִ row - uint m_RowCount; //  row + T_RESULT* m_pResult; // 결과값을 나타내는 MYSQL structure + MYSQL_ROW m_pRow; // 현재 처리하고 있는 row + uint m_RowCount; // 쿼리 결과로 얻어낸 row의 숫자 uint m_FieldCount; - string m_Statement; //  query ΰ...? + string m_Statement; // 어떤 query문에 의한 결과인가...? }; #endif // __RESULT_H__ diff --git a/src/server/database/testdb.cpp b/src/server/database/testdb.cpp index 093b4105..dc38c476 100644 --- a/src/server/database/testdb.cpp +++ b/src/server/database/testdb.cpp @@ -28,12 +28,12 @@ int main() { << ",Name:" << pResult->getString(3) << ",Password:" << pResult->getString(4) << ")" << endl; } - // Statement Result ڵ Ѵ. - // ܺο Ǹ ġ. - -; + // Statement 에서 이전 Result 는 자동으로 삭제한다. + // 괜히 외부에서 지우게 되면 골치아프다. - -; pResult = pStmt->executeQuery("SELECT ID, Name, Passwd FROM Player WHERE id = 11"); cout << "SELECT ID, Name, Passwd FROM Player WHERE id = 11" << endl; - // SELECT ϴ ƹ͵ ٸ, RowCount 0 ̴. + // SELECT 결과 조건을 만족하는 것이 아무것도 없다면, RowCount 가 0 이다. cout << "#Rows : " << pResult->getRowCount() << endl; cout << "#Cols : " << pResult->getFieldCount() << endl; diff --git a/src/server/gameserver/AbilityBalance.cpp b/src/server/gameserver/AbilityBalance.cpp index 575cd711..38b04e2e 100644 --- a/src/server/gameserver/AbilityBalance.cpp +++ b/src/server/gameserver/AbilityBalance.cpp @@ -1,8 +1,8 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : AbilityBalance.cpp -// Written By : 輺 +// Written By : 김성민 // Description : -// ũ ɷġ ϴ Լ Ƴ ̴. +// 각 크리쳐 별로 능력치를 계산하는 함수들을 모아놓은 파일이다. ////////////////////////////////////////////////////////////////////////////// #include "AbilityBalance.h" @@ -14,8 +14,8 @@ #include "Vampire.h" #include "VariableManager.h" -// ̰ ٲ Slayer::load(), Vampire::load(), Ousters::load() -// maxHP ؼ ִ κе ٲ Ѵ. by sigi. +// 이거 바뀌면 Slayer::load(), Vampire::load(), Ousters::load() 에서 +// maxHP를 계산해서 설정해주는 부분도 바꿔줘야 한다. by sigi. HP_t computeHP(Creature::CreatureClass CClass, BASIC_ATTR* pAttr, int enhance) { Assert(pAttr != NULL); @@ -26,18 +26,18 @@ HP_t computeHP(Creature::CreatureClass CClass, BASIC_ATTR* pAttr, int enhance) { double CLEVEL = pAttr->nLevel; Item* pWeapon = pAttr->pWeapon; /* - add by Coffee ޸ΪHPģʽ + add by Coffee 錦맣槨벴륩돨劤HP셕친駕 - + 훙잚 Sword, Blade STR*3+Domain Level*5 Gun, Enchant, heal STR*2+Domain Level*4 - + 뱁 (STR*3 + INT + DEX + Level)*1.5 + 10 - MOսʿ + MO濫却 (STR*3 + INT + DEX + Level)*1.5 + 10 - MOʦ + MO랬可 (STR*3 + (INT*0.7) + DEX + Level)*1.5 + 10 */ //========================================================== @@ -85,7 +85,7 @@ HP_t computeHP(Creature::CreatureClass CClass, BASIC_ATTR* pAttr, int enhance) { // cout << "STR:" << CSTR << " DEX/2:" << (int)(CDEX/2) << " INT:" << CINT << " LEV:" << CLEVEL << " HPMAX:" << // maxHP << endl; } - // ƿ콺ͽ ߰ by bezz 2003.04.22 + // 아우스터스 추가 by bezz 2003.04.22 else if (CClass == Creature::CREATURE_CLASS_OUSTERS) { // maxHP = (int)((CSTR*3.00 + CINT + CDEX + CLEVEL)); @@ -109,7 +109,7 @@ HP_t computeHP(Creature::CreatureClass CClass, BASIC_ATTR* pAttr, int enhance) { //================================================================================ /* - // ȥԭļ㹫ʽ + // 혼딜覩윱돨셕炬무駕 if (CClass == Creature::CREATURE_CLASS_SLAYER) { @@ -155,7 +155,7 @@ HP_t computeHP(Creature::CreatureClass CClass, BASIC_ATTR* pAttr, int enhance) { //cout << "STR:" << CSTR << " DEX/2:" << (int)(CDEX/2) << " INT:" << CINT << " LEV:" << CLEVEL << " HPMAX:" << maxHP << endl; } - // ƿ콺ͽ ߰ by bezz 2003.04.22 + // 아우스터스 추가 by bezz 2003.04.22 else if (CClass == Creature::CREATURE_CLASS_OUSTERS) { maxHP = (int)(CSTR*1.50 + CINT/2.00 + CDEX + CLEVEL ); @@ -192,7 +192,7 @@ MP_t computeMP(Creature::CreatureClass CClass, BASIC_ATTR* pAttr) { maxMP = (int)(CINTE * 2.0); maxMP = min((int)maxMP, SLAYER_MAX_MP); } - // ƿ콺ͽ ߰ by bezz 2003.04.22 + // 아우스터스 추가 by bezz 2003.04.22 else if (CClass == Creature::CREATURE_CLASS_OUSTERS) { maxMP = (int)((CINTE + CLEVEL) * 0.7); maxMP = min((int)maxMP, OUSTERS_MAX_MP); @@ -212,8 +212,8 @@ ToHit_t computeToHit(Creature::CreatureClass CClass, BASIC_ATTR* pAttr, int enha toHit = (int)(CDEX / 2); if (pAttr->pWeapon != NULL) { - // ⳪, ⸦ , - // ؼ ʽ Ʈ Ѵ. + // 무사 무기나, 군인 무기를 들고 있을 경우, + // 도메인 레벨에 의해서 보너스 포인트가 존재한다. if (pAttr->pWeapon->getItemClass() == Item::ITEM_CLASS_SWORD) { toHit += (int)(pAttr->pDomainLevel[SKILL_DOMAIN_SWORD] * 1.5); } else if (pAttr->pWeapon->getItemClass() == Item::ITEM_CLASS_BLADE) { @@ -232,7 +232,7 @@ ToHit_t computeToHit(Creature::CreatureClass CClass, BASIC_ATTR* pAttr, int enha toHit = (int)(CDEX + CLEVEL / 2.5); toHit = min((int)toHit, VAMPIRE_MAX_TOHIT); } - // ƿ콺ͽ ߰ by bezz 2003.04.22 + // 아우스터스 추가 by bezz 2003.04.22 else if (CClass == Creature::CREATURE_CLASS_OUSTERS) { toHit = (int)(CDEX / 2.0 + CLEVEL); toHit = min((int)toHit, OUSTERS_MAX_TOHIT); @@ -259,7 +259,7 @@ Defense_t computeDefense(Creature::CreatureClass CClass, BASIC_ATTR* pAttr, int Defense = (int)(CDEX / 2.0 + CLEVEL / 5.0); Defense = min((int)Defense, VAMPIRE_MAX_DEFENSE); } - // ƿ콺ͽ ߰ by bezz 2003.04.22 + // 아우스터스 추가 by bezz 2003.04.22 else if (CClass == Creature::CREATURE_CLASS_OUSTERS) { Defense = (int)(CDEX / 2.0 + CLEVEL / 5.0); Defense = min((int)Defense, OUSTERS_MAX_DEFENSE); @@ -289,7 +289,7 @@ Protection_t computeProtection(Creature::CreatureClass CClass, BASIC_ATTR* pAttr Protection = (int)(CSTR + CLEVEL / 5.0); Protection = min((int)Protection, VAMPIRE_MAX_PROTECTION); } - // ƿ콺ͽ ߰ by bezz 2003.04.22 + // 아우스터스 추가 by bezz 2003.04.22 else if (CClass == Creature::CREATURE_CLASS_OUSTERS) { Protection = (int)(CSTR + CLEVEL / 10.0); Protection = min((int)Protection, OUSTERS_MAX_PROTECTION); @@ -313,7 +313,7 @@ Damage_t computeMinDamage(Creature::CreatureClass CClass, BASIC_ATTR* pAttr, int minDamage = (int)(CSTR / 15.0); if (pAttr->pWeapon != NULL) { - // 쿡 ʽ ʴ´. + // 군인 무기 같은 경우에는 힘에 의한 보너스가 존재하지 않는다. if (isArmsWeapon(pAttr->pWeapon)) { minDamage = 1; } @@ -329,7 +329,7 @@ Damage_t computeMinDamage(Creature::CreatureClass CClass, BASIC_ATTR* pAttr, int minDamage = min((int)minDamage, VAMPIRE_MAX_DAMAGE); } - // ƿ콺ͽ ߰ by bezz 2003.04.22 + // 아우스터스 추가 by bezz 2003.04.22 else if (CClass == Creature::CREATURE_CLASS_OUSTERS) { minDamage = (int)(CSTR / 10.0 + CLEVEL / 10.0); @@ -355,7 +355,7 @@ Damage_t computeMaxDamage(Creature::CreatureClass CClass, BASIC_ATTR* pAttr, int maxDamage = (int)(CSTR / 10.0); if (pAttr->pWeapon != NULL) { - // 쿡 ʽ ʴ´. + // 군인 무기 같은 경우에는 힘에 의한 보너스가 존재하지 않는다. if (isArmsWeapon(pAttr->pWeapon)) { maxDamage = 2; } @@ -371,7 +371,7 @@ Damage_t computeMaxDamage(Creature::CreatureClass CClass, BASIC_ATTR* pAttr, int maxDamage = min((int)maxDamage, VAMPIRE_MAX_DAMAGE); } - // ƿ콺ͽ ߰ by bezz 2003.04.22 + // 아우스터스 추가 by bezz 2003.04.22 else if (CClass == Creature::CREATURE_CLASS_OUSTERS) { maxDamage = (int)(CSTR / 6.0 + CLEVEL / 6.0); @@ -395,18 +395,18 @@ Speed_t computeAttackSpeed(Creature::CreatureClass CClass, BASIC_ATTR* pAttr, in double CLEVEL = pAttr->nLevel; if (CClass == Creature::CREATURE_CLASS_SLAYER) { - // ⺻δ ǵ尡 ȴ. + // 기본적으로는 힘에 의해 어택 스피드가 결정된다. AttackSpeed = (int)(CSTR / 10.0); if (pAttr->pWeapon != NULL) { - // ⳪, ⸦ , - // ؼ ʽ Ʈ Ѵ. + // 무사 무기나, 군인 무기를 들고 있을 경우, + // 도메인 레벨에 의해서 보너스 포인트가 존재한다. if (pAttr->pWeapon->getItemClass() == Item::ITEM_CLASS_SWORD) { AttackSpeed += (int)(pAttr->pDomainLevel[SKILL_DOMAIN_SWORD] / 5.0); } else if (pAttr->pWeapon->getItemClass() == Item::ITEM_CLASS_BLADE) { AttackSpeed += (int)(pAttr->pDomainLevel[SKILL_DOMAIN_BLADE] / 5.0); } else if (isArmsWeapon(pAttr->pWeapon)) { - // 쿡 ǵ尡 ȴ. + // 군인 무기일 경우에는 덱스에 의해 어택 스피드가 결정된다. AttackSpeed = (int)(CDEX / 10.0); AttackSpeed += (int)(pAttr->pDomainLevel[SKILL_DOMAIN_GUN] / 5.0); } @@ -416,7 +416,7 @@ Speed_t computeAttackSpeed(Creature::CreatureClass CClass, BASIC_ATTR* pAttr, in AttackSpeed = (int)(CDEX / 10.0 + 10.0); AttackSpeed = min((Speed_t)VAMPIRE_MAX_ATTACK_SPEED, AttackSpeed); } - // ƿ콺ͽ ߰ by bezz 2003.04.22 + // 아우스터스 추가 by bezz 2003.04.22 else if (CClass == Creature::CREATURE_CLASS_OUSTERS) { AttackSpeed = (int)(CDEX / 10.0 + CLEVEL / 10.0); AttackSpeed = min((Speed_t)OUSTERS_MAX_ATTACK_SPEED, AttackSpeed); @@ -438,14 +438,14 @@ int computeCriticalRatio(Creature::CreatureClass CClass, BASIC_ATTR* pAttr, int } else if (pAttr->pWeapon->getItemClass() == Item::ITEM_CLASS_BLADE) { CriticalRatio = (int)(pAttr->pDomainLevel[SKILL_DOMAIN_BLADE] / 5.0); } else if (isArmsWeapon(pAttr->pWeapon)) { - // 쿡 ǵ尡 ȴ. + // 군인 무기일 경우에는 덱스에 의해 어택 스피드가 결정된다. CriticalRatio = (int)(pAttr->pDomainLevel[SKILL_DOMAIN_GUN] / 5.0); } } } else if (CClass == Creature::CREATURE_CLASS_VAMPIRE) { CriticalRatio = (int)((CDEX - 20.0) / 30.0); } - // ƿ콺ͽ ߰ by bezz 2003.04.22 + // 아우스터스 추가 by bezz 2003.04.22 else if (CClass == Creature::CREATURE_CLASS_OUSTERS) { CriticalRatio = (int)((CDEX - 20.0) / 30.0); } else if (CClass == Creature::CREATURE_CLASS_MONSTER) { @@ -457,7 +457,7 @@ int computeCriticalRatio(Creature::CreatureClass CClass, BASIC_ATTR* pAttr, int } Steal_t computeStealRatio(Creature::CreatureClass CClass, Steal_t amount, BASIC_ATTR* pAttr) { - // ƿϴ 0̶, ƿ Ȯ 0̴. + // 만일 스틸하는 양이 0이라면, 스틸할 확률 역시 0이다. if (amount == 0) return 0; @@ -480,7 +480,7 @@ Steal_t computeStealRatio(Creature::CreatureClass CClass, Steal_t amount, BASIC_ } else if (CClass == Creature::CREATURE_CLASS_VAMPIRE) { result = (Steal_t)(90.0 - (float)amount * 1.4); } - // ƿ콺ͽ ߰ by bezz 2003.04.22 + // 아우스터스 추가 by bezz 2003.04.22 else if (CClass == Creature::CREATURE_CLASS_OUSTERS) { result = (Steal_t)(90.0 - (float)amount * 1.4); } else if (CClass == Creature::CREATURE_CLASS_MONSTER) { diff --git a/src/server/gameserver/AbilityBalance.h b/src/server/gameserver/AbilityBalance.h index d4905372..1a95e565 100644 --- a/src/server/gameserver/AbilityBalance.h +++ b/src/server/gameserver/AbilityBalance.h @@ -1,8 +1,8 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : AbilityBalance.h -// Written By : 輺 +// Written By : 김성민 // Description : -// ũ ɷġ ϴ Լ Ƴ ̴. +// 각 크리쳐 별로 능력치를 계산하는 함수들을 모아놓은 파일이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ABILITY_BALANCE_H__ diff --git a/src/server/gameserver/AttrBalanceInfo.cpp b/src/server/gameserver/AttrBalanceInfo.cpp index 31ca5867..bed1598e 100644 --- a/src/server/gameserver/AttrBalanceInfo.cpp +++ b/src/server/gameserver/AttrBalanceInfo.cpp @@ -104,7 +104,7 @@ void STRBalanceInfoManager::load() throw Error("There is no data in STRBalanceInfo Table"); } - // ü Ѵ. + // 전체 갯수를 세팅한다. pResult->next(); m_STRBalanceCount = pResult->getInt(1) + 1; @@ -113,11 +113,11 @@ void STRBalanceInfoManager::load() m_STRBalanceInfoList = new STRBalanceInfo*[m_STRBalanceCount]; Assert(m_STRBalanceInfoList != NULL); - // 迭 ʱȭ + // 배열을 초기화 for (uint i = 0; i < m_STRBalanceCount; i++) m_STRBalanceInfoList[i] = NULL; - // ͸ ִ´. + // 데이터를 집어넣는다. pResult = pStmt->executeQuery("Select Level, GoalExp, AccumExp from STRBalanceInfo "); while (pResult->next()) { STRBalanceInfo* pSTRBalanceInfo = new STRBalanceInfo(); @@ -158,7 +158,7 @@ STRBalanceInfo* STRBalanceInfoManager::getSTRBalanceInfo(uint value) const __BEGIN_TRY if (value >= m_STRBalanceCount || m_STRBalanceInfoList[value] == NULL) { - filelog("AttrError.log", "STR ɷġ ʰ Ǵ ̸"); + filelog("AttrError.log", "STR 능력치 초과 또는 미만"); throw InvalidProtocolException(); } @@ -277,7 +277,7 @@ void DEXBalanceInfoManager::load() throw Error("There is no data in DEXBalanceInfo Table"); } - // ü Ѵ. + // 전체 갯수를 세팅한다. pResult->next(); m_DEXBalanceCount = pResult->getInt(1) + 1; @@ -286,11 +286,11 @@ void DEXBalanceInfoManager::load() m_DEXBalanceInfoList = new DEXBalanceInfo*[m_DEXBalanceCount]; Assert(m_DEXBalanceInfoList != NULL); - // 迭 ʱȭ + // 배열을 초기화 for (uint i = 0; i < m_DEXBalanceCount; i++) m_DEXBalanceInfoList[i] = NULL; - // ͸ ִ´. + // 데이터를 집어넣는다. pResult = pStmt->executeQuery("Select Level, GoalExp, AccumExp from DEXBalanceInfo "); while (pResult->next()) { DEXBalanceInfo* pDEXBalanceInfo = new DEXBalanceInfo(); @@ -331,7 +331,7 @@ DEXBalanceInfo* DEXBalanceInfoManager::getDEXBalanceInfo(uint value) const __BEGIN_TRY if (value >= m_DEXBalanceCount || m_DEXBalanceInfoList[value] == NULL) { - filelog("AttrError.log", "DEX ɷġ ʰ Ǵ ̸"); + filelog("AttrError.log", "DEX 능력치 초과 또는 미만"); throw InvalidProtocolException(); } @@ -450,7 +450,7 @@ void INTBalanceInfoManager::load() throw Error("There is no data in INTBalanceInfo Table"); } - // ü Ѵ. + // 전체 갯수를 세팅한다. pResult->next(); m_INTBalanceCount = pResult->getInt(1) + 1; @@ -460,11 +460,11 @@ void INTBalanceInfoManager::load() Assert(m_INTBalanceInfoList != NULL); - // 迭 ʱȭ + // 배열을 초기화 for (uint i = 0; i < m_INTBalanceCount; i++) m_INTBalanceInfoList[i] = NULL; - // ͸ ִ´. + // 데이터를 집어넣는다. pResult = pStmt->executeQuery("Select Level, GoalExp, AccumExp from INTBalanceInfo "); while (pResult->next()) { INTBalanceInfo* pINTBalanceInfo = new INTBalanceInfo(); @@ -507,7 +507,7 @@ INTBalanceInfo* INTBalanceInfoManager::getINTBalanceInfo(uint value) const __BEGIN_TRY if (value >= m_INTBalanceCount || m_INTBalanceInfoList[value] == NULL) { - filelog("AttrError.log", "INT ɷġ ʰ Ǵ ̸"); + filelog("AttrError.log", "INT 능력치 초과 또는 미만"); throw InvalidProtocolException(); } diff --git a/src/server/gameserver/BalloonHeadbandUtil.cpp b/src/server/gameserver/BalloonHeadbandUtil.cpp index 1a6bd40a..f7972732 100644 --- a/src/server/gameserver/BalloonHeadbandUtil.cpp +++ b/src/server/gameserver/BalloonHeadbandUtil.cpp @@ -67,7 +67,7 @@ Item* getBalloonHeadbandItem(BalloonHeadband kind) { } if (putInDB) { - filelog("BalloonHeadband.log", " Խϴ. : %d", (int)kind); + filelog("BalloonHeadband.log", "아이템이 나왔습니다. : %d", (int)kind); increaseEventItemCount(ret); } diff --git a/src/server/gameserver/CastleInfoManager.h b/src/server/gameserver/CastleInfoManager.h index d0cfd1df..0178db59 100644 --- a/src/server/gameserver/CastleInfoManager.h +++ b/src/server/gameserver/CastleInfoManager.h @@ -110,19 +110,19 @@ class CastleInfo { string toString() const; private: - ZoneID_t m_ZoneID; // ID - ShrineID_t m_ShrineID; // ¡ ShrineID - GuildID_t m_GuildID; // ID - string m_Name; // ̸ - int m_ItemTaxRatio; // (%) - Gold_t m_EntranceFee; // - Gold_t m_TaxBalance; // ׿ִ° - Race_t m_Race; // ΰ - - list m_BonusOptionList; // ʽ + ZoneID_t m_ZoneID; // 존ID + ShrineID_t m_ShrineID; // 성 상징의 ShrineID + GuildID_t m_GuildID; // 주인 길드 ID + string m_Name; // 성 이름 + int m_ItemTaxRatio; // 아이템 살 때 세율 (%) + Gold_t m_EntranceFee; // 입장료 + Gold_t m_TaxBalance; // 세금 쌓여있는거 + Race_t m_Race; // 어느 종족의 성인가 + + list m_BonusOptionList; // 종족 보너스 list m_CastleZoneIDList; - ZONE_COORD m_ResurrectPosition[CASTLE_RESURRECT_PRIORITY_MAX]; // Ȱ ġ + ZONE_COORD m_ResurrectPosition[CASTLE_RESURRECT_PRIORITY_MAX]; // 성의 부활 위치 }; class CastleInfoManager { @@ -168,7 +168,7 @@ class CastleInfoManager { bool getResurrectPosition(PlayerCreature* pPC, ZONE_COORD& zoneCoord); //---------------------------------------------------------------------- - // CastleZoneID + // CastleZoneID 관련 //---------------------------------------------------------------------- bool isCastleZone(ZoneID_t castleZoneID, ZoneID_t targetZoneID) const; bool isCastleZone(ZoneID_t zoneID) const; @@ -178,7 +178,7 @@ class CastleInfoManager { bool isSameCastleZone(ZoneID_t zoneID1, ZoneID_t zoneID2) const; //---------------------------------------------------------------------- - // Ǵ ͵ + // 모든 성에 적용 되는 것들 //---------------------------------------------------------------------- void releaseAllSafeZone(); void resetAllSafeZone(); diff --git a/src/server/gameserver/CastleShrineInfoManager.cpp b/src/server/gameserver/CastleShrineInfoManager.cpp index 329c24a0..79b21d5c 100644 --- a/src/server/gameserver/CastleShrineInfoManager.cpp +++ b/src/server/gameserver/CastleShrineInfoManager.cpp @@ -107,9 +107,9 @@ void CastleShrineInfoManager::load() pShrineSet->m_GuardShrine.setShrineType(ShrineInfo::SHRINE_GUARD); pShrineSet->m_HolyShrine.setShrineType(ShrineInfo::SHRINE_HOLY); - // ItemType Shrine ID ƾ Ѵ. DB ε ´. + // ItemType과 Shrine ID는 같아야 한다. 같지 않을 경우 DB설정 오류로 로딩과정에서 막는다. if (pShrineSet->m_ItemType != pShrineSet->m_ShrineID) { - cout << "ShrineID ItemType ʽϴ. DB ϼ." << endl; + cout << "ShrineID 와 ItemType이 맞지 않습니다. DB설정을 점검하세요." << endl; Assert(false); } @@ -128,7 +128,7 @@ ZoneID_t CastleShrineInfoManager::getGuardShrineZoneID(ZoneID_t castleZoneID) co HashMapShrineSetConstItor itr = m_ShrineSets.begin(); - // castleZoneID shrineID ˻Ҽ  ϳϳ Ѵ. -_-; + // castleZoneID의 shrineID를 검색할수가 없어서 하나하나 비교한다. -_-; for (; itr != m_ShrineSets.end(); itr++) { CastleShrineSet* pShrineSet = itr->second; @@ -143,7 +143,7 @@ ZoneID_t CastleShrineInfoManager::getGuardShrineZoneID(ZoneID_t castleZoneID) co } StringStream msg; - msg << "CastleZoneID õ GuardZoneID [" << (int)castleZoneID << "]"; + msg << "CastleZoneID와 관련된 GuardZoneID가 없다[" << (int)castleZoneID << "]"; throw Error(msg.toString()); __END_CATCH @@ -180,7 +180,7 @@ Item* CastleShrineInfoManager::addShrineToZone(ShrineInfo& shrineInfo, ItemType_ { __BEGIN_TRY - // ´. + // 성단을 넣을 존을 가져온다. Zone* pZone = getZoneByZoneID(shrineInfo.getZoneID()); Assert(pZone != NULL); @@ -223,7 +223,7 @@ Item* CastleShrineInfoManager::addShrineToZone(ShrineInfo& shrineInfo, ItemType_ TPOINT tp = pZone->addItem(pShrine, shrineInfo.getX(), shrineInfo.getY(), true); Assert(tp.x != -1); - // ¡ ߰ ʿ䰡 ִٸ ߰Ѵ. + // 성의 상징을 추가할 필요가 있다면 추가한다. if (shrineInfo.getShrineType() == ShrineInfo::SHRINE_GUARD) { // if ( AddBible[ itemType ] ) { @@ -240,10 +240,10 @@ Item* CastleShrineInfoManager::addShrineToZone(ShrineInfo& shrineInfo, ItemType_ pShrine->addTreasure(pItem); } - // ȣ̶° ǥصд. + // 수호성단이라는걸 표시해둔다. pShrine->setFlag(Effect::EFFECT_CLASS_CASTLE_SHRINE_GUARD); - // ȣܿ Shield Effect δ + // 모든 수호성단에 Shield Effect 붙인다 pShrine->setFlag(Effect::EFFECT_CLASS_SHRINE_SHIELD); EffectShrineShield* pEffect = new EffectShrineShield(pShrine); @@ -252,11 +252,11 @@ Item* CastleShrineInfoManager::addShrineToZone(ShrineInfo& shrineInfo, ItemType_ pShrine->getEffectManager().addEffect(pEffect); } else { - // ̶° ǥصд. + // 성지성단이라는걸 표시해둔다. pShrine->setFlag(Effect::EFFECT_CLASS_CASTLE_SHRINE_HOLY); } - // ǥ Ѵ. + // 성단 좌표를 새로 세팅한다. shrineInfo.setX(tp.x); shrineInfo.setY(tp.y); @@ -332,12 +332,12 @@ bool CastleShrineInfoManager::isMatchHolyShrine(Item* pItem, MonsterCorpse* pMon CastleShrineSet* pShrineSet = getShrineSet(shrineID); if (pShrineSet == NULL) { - // ¡ شϴ Shrine Set . + // 이 성의 상징에 해당하는 Shrine Set이 없다. return false; } - // ¡ شϴ Shrine set MonsterType - // Ѿ MonsterCorpse MonsterType ObjectID true + // 이 성의 상징에 해당하는 Shrine set의 성지성단의 MonsterType이 + // 넘어온 MonsterCorpse의 MonsterType과 같고 ObjectID도 같으면 true return pShrineSet->m_HolyShrine.getMonsterType() == pMonsterCorpse->getMonsterType() && pShrineSet->m_HolyShrine.getObjectID() == pMonsterCorpse->getObjectID(); @@ -352,7 +352,7 @@ bool CastleShrineInfoManager::isDefenderOfGuardShrine(PlayerCreature* pPC, Monst Zone* pZone = pShrine->getZone(); Assert(pZone != NULL); - // ƴϸ ~ + // 성이 아니면 삑~ /* if ( !pZone->isCastle() ) { @@ -378,7 +378,7 @@ bool CastleShrineInfoManager::isDefenderOfGuardShrine(PlayerCreature* pPC, Monst /* if ( pWar->getWarType() == WAR_RACE ) { - // ߿ ̸ defender ̴. + // 종족 전쟁 중에는 성의 소유 종족과 같은 종족이면 defender 이다. if ( pPC->getRace() == pCastleInfo->getRace() ) return true; } @@ -389,10 +389,10 @@ bool CastleShrineInfoManager::isDefenderOfGuardShrine(PlayerCreature* pPC, Monst Assert(pGuildWar != NULL); if (pCastleInfo->isCommon()) { - // 뼺 ݱ常 ƴϸ defender̴. + // 공용성인 경우는 공격길드만 아니면 defender이다. return pPC->getGuildID() != pGuildWar->getChallangerGuildID(); } else { - // ߿ 뼺 ƴ 尡 defender ̴. + // 동족 전쟁 중에는 공용성이 아닐 경우 성의 소유 길드가 defender 이다. if (pPC->getGuildID() == pCastleInfo->getGuildID()) return true; } @@ -403,13 +403,13 @@ bool CastleShrineInfoManager::isDefenderOfGuardShrine(PlayerCreature* pPC, Monst __END_CATCH } -// ¡ ִ°? +// 이 종족이 성의 상징 조각을 들 수 있는가? bool CastleShrineInfoManager::canPickupCastleSymbol(Race_t race, CastleSymbol* pCastleSymbol) const { __BEGIN_TRY - // ϴ ¡ £ ҼӵǾ ִ ˾ƿ´. + // 일단 이 성의 상징 조각이 어느 전쟁에 소속되어 있는지 알아온다. CastleShrineSet* pShrineSet = getShrineSet(pCastleSymbol->getItemType()); if (pShrineSet == NULL) { @@ -425,8 +425,8 @@ bool CastleShrineInfoManager::canPickupCastleSymbol(Race_t race, CastleSymbol* p War* pWar = g_pWarSystem->getActiveWar(castleZoneID); if (pWar == NULL) { - // ƽ 縮~ - filelog("WarError.log", "ﵵ ϴµ ¡ ֿ Ѵ. ItemType: %u", + // 아싸 삑사리다~ + filelog("WarError.log", "전쟁도 안하는데 성의 상징조각을 주울려고 한다. ItemType: %u", (int)pCastleSymbol->getItemType()); return false; } @@ -434,7 +434,7 @@ bool CastleShrineInfoManager::canPickupCastleSymbol(Race_t race, CastleSymbol* p /* if ( pWar->getWarType() == WAR_RACE ) { - // ̸ ޴´. + // 종족 전쟁이면 지나개나 다 줏는다. return true; } else @@ -443,8 +443,8 @@ bool CastleShrineInfoManager::canPickupCastleSymbol(Race_t race, CastleSymbol* p CastleInfo* pCastleInfo = g_pCastleInfoManager->getCastleInfo(castleZoneID); if (pCastleInfo == NULL) { - // ƽ 縮~ - filelog("WarError.log", " ƴϴ. ItemType: %u, ZoneID : %u", (int)pCastleSymbol->getItemType(), + // 아싸 삑사리다~ + filelog("WarError.log", "성이 아니다. ItemType: %u, ZoneID : %u", (int)pCastleSymbol->getItemType(), (int)castleZoneID); return false; } @@ -452,8 +452,8 @@ bool CastleShrineInfoManager::canPickupCastleSymbol(Race_t race, CastleSymbol* p return (race == pCastleInfo->getRace()); } - // ƽ 縮~ - filelog("WarError.log", "̻ ̴. WarType : %u", (int)pWar->getWarType()); + // 아싸 삑사리다~ + filelog("WarError.log", "이상한 전쟁이다. WarType : %u", (int)pWar->getWarType()); return false; __END_CATCH @@ -473,7 +473,7 @@ bool CastleShrineInfoManager::getMatchGuardShrinePosition(Item* pItem, ZoneItemP CastleShrineSet* pShrineSet = getShrineSet(shrineID); if (pShrineSet == NULL) { - // ¡ شϴ Shrine Set . + // 이 성의 상징에 해당하는 Shrine Set이 없다. return false; } @@ -486,17 +486,17 @@ bool CastleShrineInfoManager::getMatchGuardShrinePosition(Item* pItem, ZoneItemP __END_CATCH } -// putCastleSymbol ( ܿ ¡ ) ҷ bLock = false -// returnAllCastleSymbol ( ð Ǿ ) ҷ bLock = true -// true ٸ (WarSystem ư ) ҷǷ ο ɾ ϰ -// false ִ ׷콺忡 ưǷ ο ɾ ʾƾ Ѵ. +// putCastleSymbol ( 누군가 성지성단에 성의 상징을 놓았을때 ) 이 불려지면 bLock = false +// returnAllCastleSymbol ( 시간이 다 되었을 때 ) 이 불려지면 bLock = true +// true일 경우 다른 스레드 (WarSystem이 돌아가는 스레드)에서 불려지므로 내부에서 락을 걸어줘야 하고 +// false일 경우 성지성단이 있는 존과 같은 존그룹스레드에서 돌아가므로 내부에서 락을 걸어주지 않아야 한다. // 2003. 2. 5. by Sequoia bool CastleShrineInfoManager::returnCastleSymbol(ShrineID_t shrineID, bool bLock) const { __BEGIN_TRY - // shrineID õ CastleSymbol DB ̿ؼ ã´. + // shrineID와 관련된 CastleSymbol을 DB정보를 이용해서 찾는다. CastleShrineSet* pShrineSet = getShrineSet(shrineID); if (pShrineSet == NULL) @@ -530,7 +530,7 @@ bool CastleShrineInfoManager::returnCastleSymbol(ShrineID_t shrineID, bool bLock __END_CATCH } -// WarSystem θ. +// WarSystem에서만 부른다. bool CastleShrineInfoManager::returnAllCastleSymbol(ZoneID_t castleZoneID) const { @@ -540,7 +540,7 @@ bool CastleShrineInfoManager::returnAllCastleSymbol(ZoneID_t castleZoneID) const HashMapShrineSetConstItor itr = m_ShrineSets.begin(); - // castleZoneID shrineID ˻Ҽ  ϳϳ Ѵ. -_-; + // castleZoneID의 shrineID를 검색할수가 없어서 하나하나 비교한다. -_-; for (; itr != m_ShrineSets.end(); itr++) { CastleShrineSet* pShrineSet = itr->second; @@ -568,7 +568,7 @@ bool CastleShrineInfoManager::returnCastleSymbol(Zone* pZone, CastleSymbol* pCas Assert(pZone != NULL); Assert(pCastleSymbol != NULL); - // TargetZone, Shrine ã´. + // TargetZone, Shrine을 찾는다. ShrineID_t shrineID = pCastleSymbol->getItemType(); CastleShrineSet* pShrineSet = getShrineSet(shrineID); @@ -585,8 +585,8 @@ bool CastleShrineInfoManager::returnCastleSymbol(Zone* pZone, CastleSymbol* pCas pZone->transportItemToCorpse(pCastleSymbol, pTargetZone, CorpseObjectID); // StringStream msg; - // msg << " ¡ (" << GuardShrine.getName() << ") ȣ(" << GuardShrine.getName() << ") - // ưϴ."; + // msg << "성의 상징 조각(" << GuardShrine.getName() << ")이 수호성단(" << GuardShrine.getName() << ")으로 + // 돌아갔습니다."; char msg[200]; sprintf(msg, g_pStringPool->c_str(STRID_RETURN_TO_GUARD_SHRINE_CASTLE_SYMBOL), GuardShrine.getName().c_str(), @@ -613,13 +613,13 @@ bool CastleShrineInfoManager::putCastleSymbol(PlayerCreature* pPC, Item* pItem, ShrineID_t shrineID = pItem->getItemType(); - filelog("WarLog.txt", "%s ¡[%u] [%s] ־ϴ.", pPC->getName().c_str(), (uint)shrineID, + filelog("WarLog.txt", "%s가 성의 상징[%u]을 성지 성단[%s]에 넣었습니다.", pPC->getName().c_str(), (uint)shrineID, pCorpse->getName().c_str()); - // ¡  κ ¡ Ƽ ư Ÿ Ʈ ٿش. + // 성의 상징이 들어간 성단으로부터 성의 상징이 날아서 돌아감을 나타내는 이펙트를 붙여준다. // sendCastleSymbolEffect( pCorpse, Effect::EFFECT_CLASS_SHRINE_HOLY_WARP ); - // PCԼ ¡ Ѿ ȿ ִ´. + // PC에게서 성의 상징을 빼앗아 성단 안에 넣는다. Assert(pItem->getObjectID() == pPC->getExtraInventorySlotItem()->getObjectID()); pPC->deleteItemFromExtraInventorySlot(); @@ -642,17 +642,17 @@ bool CastleShrineInfoManager::putCastleSymbol(PlayerCreature* pPC, Item* pItem, bool isCastle = g_pCastleInfoManager->getCastleZoneID(guardZoneID, castleZoneID); Assert(isCastle == true); - // ˸ ܿ ȣ ư + // 알맞은 성단에 넣으면 전쟁이 끝나고 수호성단으로 돌아가고 if (isMatchHolyShrine(pItem, pCorpse) && g_pWarSystem->isModifyCastleOwner(castleZoneID, pPC)) { g_pWarSystem->endWar(pPC, castleZoneID); - // War::executeEnd ˾Ƽ ǵش. + // 전쟁 끝나는 War::executeEnd에서 알아서 되돌려준다. // returnCastleSymbol( shrineID, false ); return true; } - // ٸ ܿ ְų Ȳ ƴϸ ȣ ׳ ư + // 다른 성단에 넣거나 전쟁이 끝날 상황이 아니면 수호성단으로 그냥 돌아간다 returnCastleSymbol(shrineID, false); return false; @@ -660,7 +660,7 @@ bool CastleShrineInfoManager::putCastleSymbol(PlayerCreature* pPC, Item* pItem, __END_CATCH } -// pZone guardZone̴. +// pZone은 guardZone이다. bool CastleShrineInfoManager::removeShrineShield(Zone* pZone) { @@ -671,7 +671,7 @@ bool CastleShrineInfoManager::removeShrineShield(Zone* pZone) ZoneID_t guardZoneID = pZone->getZoneID(); - // castleZoneID shrineID ˻Ҽ  ϳϳ Ѵ. -_-; + // castleZoneID의 shrineID를 검색할수가 없어서 하나하나 비교한다. -_-; for (; itr != m_ShrineSets.end(); itr++) { CastleShrineSet* pShrineSet = itr->second; @@ -703,7 +703,7 @@ bool CastleShrineInfoManager::removeShrineShield(Zone* pZone) __END_CATCH } -// pZone guardZone̴. +// pZone은 guardZone이다. bool CastleShrineInfoManager::addShrineShield(Zone* pZone) { @@ -724,7 +724,7 @@ bool CastleShrineInfoManager::addShrineShield(Zone* pZone) __END_CATCH } -// pZone guardZone̴. +// pZone은 guardZone이다. bool CastleShrineInfoManager::addShrineShield_LOCKED(Zone* pZone) { @@ -735,7 +735,7 @@ bool CastleShrineInfoManager::addShrineShield_LOCKED(Zone* pZone) ZoneID_t guardZoneID = pZone->getZoneID(); - // castleZoneID shrineID ˻Ҽ  ϳϳ Ѵ. -_-; + // castleZoneID의 shrineID를 검색할수가 없어서 하나하나 비교한다. -_-; for (; itr != m_ShrineSets.end(); itr++) { CastleShrineSet* pShrineSet = itr->second; diff --git a/src/server/gameserver/CastleShrineInfoManager.h b/src/server/gameserver/CastleShrineInfoManager.h index d10f78e7..c0f76e52 100644 --- a/src/server/gameserver/CastleShrineInfoManager.h +++ b/src/server/gameserver/CastleShrineInfoManager.h @@ -29,11 +29,11 @@ class CastleShrineSet { string toString() const; public: - ShrineID_t m_ShrineID; // Shrine ID. ItemType ƾ Ѵ. - ShrineInfo m_GuardShrine; // ȿ ִ Shrine - ShrineInfo m_HolyShrine; // ƴ ִ Shrine - ItemType_t m_ItemType; // ItemType - ItemID_t m_ItemID; // ItemID + ShrineID_t m_ShrineID; // Shrine ID. ItemType과 같아야 한다. + ShrineInfo m_GuardShrine; // 성 안에 있는 Shrine + ShrineInfo m_HolyShrine; // 아담의 성지에 있는 Shrine + ItemType_t m_ItemType; // 성서 조각 ItemType + ItemID_t m_ItemID; // 성서 조각 ItemID }; diff --git a/src/server/gameserver/CombatInfoManager.cpp b/src/server/gameserver/CombatInfoManager.cpp index 81e73674..ad0952e7 100644 --- a/src/server/gameserver/CombatInfoManager.cpp +++ b/src/server/gameserver/CombatInfoManager.cpp @@ -57,7 +57,7 @@ void CombatInfoManager::computeModify() { m_VampireToHitModify = 0; for (int i = 0; i < maxRelic; i++) { - // bonus, penalty + // bonus, penalty 계산 } GCSystemMessage gcSystemMessage; @@ -67,33 +67,33 @@ void CombatInfoManager::computeModify() { bool bVampireBonus = m_RelicOwner[0] == RELIC_OWNER_VAMPIRE && m_RelicOwner[1] == RELIC_OWNER_VAMPIRE; - // ̾ ¸ + // 슬레이어 승리 if (bSlayerBonus) { // m_SlayerHPModify = g_pVariableManager->getCombatSlayerHPBonusRatio(); - // gcSystemMessage.setMessage("̾ ʽ ٱ?"); + // gcSystemMessage.setMessage("슬레이어에게 보너스를 뭐줄까?"); gcSystemMessage.setMessage(g_pStringPool->getString(STRID_APPLICATE_COMBAT_SLAYER_BONUS)); bSendMessage = true; } - // ̾ ¸ + // 뱀파이어 승리 else if (bVampireBonus) { // m_VampireHPModify = g_pVariableManager->getCombatVampireHPBonusRatio(); - // gcSystemMessage.setMessage("̾ ʽ ٱ?"); + // gcSystemMessage.setMessage("뱀파이어에게 보너스를 뭐줄까?"); gcSystemMessage.setMessage(g_pStringPool->getString(STRID_APPLICATE_COMBAT_VAMPIRE_BONUS)); bSendMessage = true; } else if (!bSlayerBonus && !bVampireBonus) { - // ǰ ִٰ ȵǴ + // 적용되고 있다가 적용안되는 경우 if (m_bSlayerBonus && m_bVampireBonus) { gcSystemMessage.setMessage(g_pStringPool->getString(STRID_NO_MORE_COMBAT_BONUS)); bSendMessage = true; } - // ̾ ʽ + // 슬레이어 보너스가 사라지는 경우 else if (m_bSlayerBonus) { gcSystemMessage.setMessage(g_pStringPool->getString(STRID_NO_MORE_COMBAT_SLAYER_BONUS)); bSendMessage = true; } - // ̾ ʽ + // 뱀파이어 보너스가 사라지는 경우 else if (m_bVampireBonus) { gcSystemMessage.setMessage(g_pStringPool->getString(STRID_NO_MORE_COMBAT_VAMPIRE_BONUS)); bSendMessage = true; diff --git a/src/server/gameserver/CombatInfoManager.h b/src/server/gameserver/CombatInfoManager.h index 6a13c9e0..00f4ebbf 100644 --- a/src/server/gameserver/CombatInfoManager.h +++ b/src/server/gameserver/CombatInfoManager.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : CombatInfoManager.h // Written by : bezz -// Description : п ؼ Ѵ. +// Description : 전쟁의 승패와 관련해서 관련 값들을 설정한다. ////////////////////////////////////////////////////////////////////////////// #ifndef __COMBAT_INFO_MANAGER_H__ @@ -16,15 +16,15 @@ ////////////////////////////////////////////////////////////////////////////// // class CombatInfoManager // -// Relic Onwer -// ׿ Bonus, Penalty Ͽ ˷ش. +// 현재 Relic의 Onwer를 가지고 있으며 +// 그에 따른 Bonus, Penalty 값을 계산하여 알려준다. ////////////////////////////////////////////////////////////////////////////// class CombatInfoManager { public: /////////////////////////////////////////////////////////////////// // Relic Owner - // Relic Ͽ Bonus, Penalty + // Relic을 소유하여 Bonus, Penalty를 받을 대상 /////////////////////////////////////////////////////////////////// enum RelicOwner { RELIC_OWNER_NULL, RELIC_OWNER_SLAYER, RELIC_OWNER_VAMPIRE }; @@ -32,17 +32,17 @@ class CombatInfoManager { // Constructor CombatInfoManager(); - // Bonus, Penalty ʱȭ Ѵ. + // Bonus, Penalty 값을 초기화 한다. void initModify(); - // Bonus, Penalty Ѵ. + // Bonus, Penalty를 계산한다. void computeModify(); - // Relic Onwer Ѵ. + // Relic Onwer를 설정한다. void setRelicOwner(int index, RelicOwner relicOwner); - // Bonus, Penalty return + // Bonus, Penalty 값을 return int getSlayerHPModify() const { return m_SlayerHPModify; } @@ -71,10 +71,10 @@ class CombatInfoManager { } private: - // Relic Owner + // 각 Relic의 Owner RelicOwner m_RelicOwner[maxRelic]; - // Bonus, Penalty + // Bonus, Penalty 값 int m_SlayerHPModify; int m_SlayerToHitModify; int m_VampireHPModify; diff --git a/src/server/gameserver/CombatSystemManager.h b/src/server/gameserver/CombatSystemManager.h index e31eefa6..4c07ba96 100644 --- a/src/server/gameserver/CombatSystemManager.h +++ b/src/server/gameserver/CombatSystemManager.h @@ -2,7 +2,7 @@ // // Filename : CombatSystemManager.h // Written by : intblue@metrotech.co.kr -// Description : ý Ŵ +// Description : 전투 시스템 매니저 // ////////////////////////////////////////////////////////////////////////////////////////// @@ -25,7 +25,7 @@ // // class CombatSystemManager; // -// ý ϴ Ŵ ü +// 전투 시스템을 관리하는 매니저 객체 // ////////////////////////////////////////////////////////////////////// const int VAMPIRE_HAS_SLAYER_HP_RELIC_POINT = 30; @@ -38,32 +38,32 @@ const int SAME_RACE_HAVE_RELIC = 1; const int ANOTHER_RACE_HAVE_RELIC = 2; const int RELIC_STAY_ON_ZONE = 3; -const string RELIC1NAME = "Ҹ"; -const string RELIC2NAME = ""; -const string RELIC3NAME = "ó"; -const string RELIC4NAME = "ڰ"; +const string RELIC1NAME = "롬멜훈장"; +const string RELIC2NAME = "성의"; +const string RELIC3NAME = "처녀의피"; +const string RELIC4NAME = "역십자가"; class CombatSystemManager { public: CombatSystemManager(); ~CombatSystemManager(); - void CheckCombat(); // Ȱȭ üũϿ /ı ǽ + void CheckCombat(); // 전투 활성화 여부 체크하여 생성/파괴 실시 - void ActiveCombat(); // - void DeactiveCombat(); // + void ActiveCombat(); // 전투 개시 + void DeactiveCombat(); // 전투 종료 - void BroadcastPacket(Packet*); // ڿ ޽ - void BroadcastPacket(Packet*, int condition, int minute); // ڿ ޽ + void BroadcastPacket(Packet*); // 모든 존의 사용자에게 메시지 전달 + void BroadcastPacket(Packet*, int condition, int minute); // 모든 존의 사용자에게 메시지 전달 - void ActiveMonster(); // - void DeactiveMonster(); // ı + void ActiveMonster(); // 전투 몬스터 생성 + void DeactiveMonster(); // 전투 몬스터 파괴 - // Relic ľ - // 0: 뿡 - // 1: ڽ - // 2: Ÿ - // 3: ٴڿ + // Relic의 상태 파악 + // 0: 성물 보관대에 소유 + // 1: 자신의 종족이 가지고 있음 + // 2: 타종족이 가지고 있음 + // 3: 바닥에 떨어져 있음 int getRelicStatus(int RelicIndex) { return m_RelicStatus[RelicIndex]; } @@ -71,7 +71,7 @@ class CombatSystemManager { m_RelicStatus[Relic] = Status; } - // Relic + // Relic의 소유주 string getRelicOwner(int RelicIndex) { return m_RelicOwner[RelicIndex]; } @@ -79,7 +79,7 @@ class CombatSystemManager { m_RelicOwner[RelicIndex] = Owner; } - // ٸ ʽ Ʈ + // 다른 종족의 성물을 가졌을 시 보너스 포인트 계산 int getSlayerToHitPoint() const { return m_SlayerToHitPoint; } @@ -188,7 +188,7 @@ class CombatSystemManager { void RelicToString(int index); private: - bool m_bCombat; // θ ǥϴ + bool m_bCombat; // 전투가 진행 중 인지 여부를 표현하는 변수 bool m_bCombatActive; bool m_bCombatDeactive; @@ -202,16 +202,16 @@ class CombatSystemManager { int m_VampireToHitPoint; int m_VampireHPPoint; - // ߴ° ϴ κ + // 각 렐릭이 출현했는가 하는 부분 bool m_Relic[5]; - // ġ + // 각 렐릭의 위치 정보 int m_RelicOwnerObjectID[5]; int m_RelicStorageID[5]; int m_RelicStorage[5]; ZoneCoord_t m_RelicX[5], m_RelicY[5]; - // Object ID + // 각 렐릭의 Object ID ObjectID_t m_RelicObjectID[5]; mutable Mutex m_Mutex; diff --git a/src/server/gameserver/ConcreteItem.h b/src/server/gameserver/ConcreteItem.h index e426fccc..544e7491 100644 --- a/src/server/gameserver/ConcreteItem.h +++ b/src/server/gameserver/ConcreteItem.h @@ -18,7 +18,7 @@ template class ConcreteItem : public Item { public: - // Լ üȭ + // 가상 함수 구체화 ItemClass getItemClass() const { return IClass; } @@ -47,7 +47,7 @@ class ConcreteItem : public Item { } public: - // ױ + // 아이템 쌓기 관련 bool isStackable() const { return m_Stack.hasValue(); } @@ -60,7 +60,7 @@ class ConcreteItem : public Item { } public: - // + // 내구도 관련 Durability_t getDurability() const { return m_Durability.getValue(); } @@ -77,7 +77,7 @@ class ConcreteItem : public Item { } public: - // ɼ + // 옵션 관련 bool hasOptionType() const { return m_Option.hasOptionType(); } @@ -107,7 +107,7 @@ class ConcreteItem : public Item { } public: - // + // 아이템 등급 관련 Grade_t getGrade() const { return m_Grade.getValue(); } @@ -120,7 +120,7 @@ class ConcreteItem : public Item { } public: - // ݷ Ӽ + // 공격력 관련 속성 Damage_t getMinDamage() const { return max(1, ((int)getItemInfo()->getMinDamage()) + ((int)getBonusDamage()) + m_Grade.getDamageOffset()); } @@ -169,7 +169,7 @@ class ConcreteItem : public Item { } public: - // Ӽ + // 방어력 관련 속성 Defense_t getDefenseBonus() const { return max(0, ((int)getItemInfo()->getDefenseBonus()) + m_Grade.getDefenseOffset()); } @@ -178,7 +178,7 @@ class ConcreteItem : public Item { } public: - // æƮ + // 인챈트 레벨 EnchantLevel_t getEnchantLevel() const { return m_EnchantLevel.getValue(); } diff --git a/src/server/gameserver/ConnectionInfo.h b/src/server/gameserver/ConnectionInfo.h index edf42406..d6f28626 100644 --- a/src/server/gameserver/ConnectionInfo.h +++ b/src/server/gameserver/ConnectionInfo.h @@ -13,7 +13,7 @@ ////////////////////////////////////////////////////////////////////////////// // class ConnectionInfo; -// ̵ ῡ Ÿ ü +// ¼­¹ö°£ À̵¿¿¡¼­ Á¤´çÇÑ ¿¬°á¿¡ ´ëÇÑ Á¤º¸¸¦ ³ªÅ¸³»´Â °´Ã¼ ////////////////////////////////////////////////////////////////////////////// class ConnectionInfo { @@ -63,20 +63,20 @@ class ConnectionInfo { string m_ClientIP; // valid client's ip string m_PlayerID; // PlayerID string m_PCName; // PC name - Timeval m_ExpireTime; // expire time : ϰ ־ ϴ.. + Timeval m_ExpireTime; // expire time : ¾ðÁ¦±îÁö ÀÌ Á¤º¸¸¦ À¯ÁöÇϰí ÀÖ¾î¾ß ÇÏ´ÂÁö.. DWORD m_Key; // validation key }; ////////////////////////////////////////////////////////////////////////////// // CompareConnectionInfo // -// priority_queue ConnectionInfo ϴ Ŭ +// priority_queue ¿¡¼­ ConnectionInfo ³¢¸® ºñ±³ÇÒ ¶§ »ç¿ëÇϴ Ŭ·¡½º¸ // // *CAUTION* // -// ð ̸(ð ) PQ top ġؾ Ѵ. -// PQ ascending order ̷ Ѵ. ׷ 캸⸦.. -// ð .. - -; +// ½Ã°£ÀûÀ¸·Î À̸¥(½Ã°£°ªÀÌ ÀÛÀº) ÂÊÀÌ PQ ÀÇ top ¿¡ À§Ä¡ÇØ¾ß ÇÑ´Ù. +// Áï PQ ´Â ascending order ¸¦ ÀÌ·ï¾ß ÇÑ´Ù. ¿Ö ±×·±Áö´Â Àß »ìÆìº¸±â¸¦.. +// ½Ã°£ÀÌ ¾ø´Â °ü°è·Î.. - -; ////////////////////////////////////////////////////////////////////////////// class CompareConnectionInfo { diff --git a/src/server/gameserver/ConnectionInfoManager.h b/src/server/gameserver/ConnectionInfoManager.h index 0dda4f53..b51e5e3f 100644 --- a/src/server/gameserver/ConnectionInfoManager.h +++ b/src/server/gameserver/ConnectionInfoManager.h @@ -18,7 +18,7 @@ typedef unordered_map HashMapConnectionInfo; ////////////////////////////////////////////////////////////////////////////// // class ConnectionInfoManager; -// IP Ʈ Ű ϴ unordered_map ο ִ. +// IP 스트링을 키값으로 하는 unordered_map 을 내부에 가지고 있다. ////////////////////////////////////////////////////////////////////////////// class ConnectionInfoManager { @@ -39,7 +39,7 @@ class ConnectionInfoManager { HashMapConnectionInfo m_ConnectionInfos; Timeval m_NextHeartbeat; - Timeval m_UpdateUserStatusTime; // ݸ by sigi. 2002.11.4 + Timeval m_UpdateUserStatusTime; // 넷마블용 by sigi. 2002.11.4 mutable Mutex m_Mutex; }; diff --git a/src/server/gameserver/Corpse.h b/src/server/gameserver/Corpse.h index 245f63f7..e3a81c59 100644 --- a/src/server/gameserver/Corpse.h +++ b/src/server/gameserver/Corpse.h @@ -13,7 +13,7 @@ #include "Types.h" ////////////////////////////////////////////////////////////////////////////// -// ü Ÿ +// 시체 타입 ////////////////////////////////////////////////////////////////////////////// enum CorpseType { SLAYER_CORPSE = 0, VAMPIRE_CORPSE, NPC_CORPSE, MONSTER_CORPSE, OUSTERS_CORPSE }; @@ -99,21 +99,21 @@ class Corpse : public Item { } protected: - list m_Treasures; // Ʈ - BYTE m_TreasureCount; // + list m_Treasures; // 보물의 리스트 + BYTE m_TreasureCount; // 보물의 숫자 - // 븦 ʻ ǥ ֱ - // ܿ ǥ ȵ Ƿ + // 성물 보관대를 위한 필살 좌표 넣기 + // 그 외에는 좌표가 제대로 설정 안될 수 있으므로 사용금지 ZoneCoord_t m_X, m_Y; Zone* m_pZone; - // ü ± ;;; - int m_Level; // -_-; - Exp_t m_Exp; // ̳ ̰ ġ; + // 시체에 별 내용이 다 들어가는군 ;;; + int m_Level; // 레벨 -_-; + Exp_t m_Exp; // 이넘 죽이고 얻은 경험치; - // Ͱ Relic ƴ ϴ - // Relic̶, ü ʵ ؾ Ѵ. + // 몬스터가 Relic인지 아닌지를 저장하는 변수 + // 만약 Relic이라면, 몬스터의 시체가 사라지지 않도록 해야 한다. }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/Creature.h b/src/server/gameserver/Creature.h index 6e617680..c2e7148c 100644 --- a/src/server/gameserver/Creature.h +++ b/src/server/gameserver/Creature.h @@ -21,11 +21,11 @@ // constants ////////////////////////////////////////////////////////////////////////////// -#define DEFAULT_SIGHT 13 // þ -#define DARKNESS_SIGHT 0 // Darkness þ -#define YELLOW_POISON_SIGHT 3 // Yellow Poison þ -#define LIGHTNESS_SIGHT 13 // Lightness þ -#define FLARE_SIGHT 3 // Flare þ +#define DEFAULT_SIGHT 13 // 원래시야 +#define DARKNESS_SIGHT 0 // Darkness에 의한 시야 +#define YELLOW_POISON_SIGHT 3 // Yellow Poison에 의한 시야 +#define LIGHTNESS_SIGHT 13 // Lightness에 의한 시야 +#define FLARE_SIGHT 3 // Flare에 의한 시야 const string MoveMode2String[] = {"MOVE_MODE_WALKING", "MOVE_MODE_FLYING", "MOVE_MODE_BURROWING"}; @@ -47,7 +47,7 @@ class LocalPartyManager; class Creature : public Object { public: - // Creature ٷ ӹ޴ Ŭ ⿡ Ѵ. + // Creature를 바로 상속받는 클래스들을 여기에 정의한다. enum CreatureClass { CREATURE_CLASS_SLAYER = 0, // PC Slayer CREATURE_CLASS_VAMPIRE, // PC Vampire @@ -76,8 +76,8 @@ class Creature : public Object { virtual void save() const = 0; // save to DB public: - // ũó ÷̾ Ѵ. - // ũó ؼ isPC() üũغ true 쿡 ȣؾ Ѵ. + // 크리처에서 플레이어로 접근한다. + // 현재 크리처에 대해서 isPC()를 체크해보고 true 인 경우에만 호출해야 한다. Player* getPlayer() const { Assert(m_pPlayer != NULL); return m_pPlayer; @@ -163,16 +163,16 @@ class Creature : public Object { public: //////////////////////////////////////////////////////////// - // Creature ִ ۵ Zone ϵǾ Ѵ. - // ̸ ؼ ۵ Zone visibleؾ ϴµ, - // ׷ ϴ. ׷ٰ, Zone Creature ۵ - // iteration ϴ ޽带 ϴ ͵ ϴ. - // , Creature ޽带 ΰ ⼭ Zone ؼ - // θ ϵ ̴. + // Creature가 가지고 있는 아이템들 역시 Zone에 등록되어야 한다. + // 이를 위해서는 소유 아이템들이 Zone레벨에서 visible해야 하는데, + // 그렇지 못하다. 그렇다고, Zone에서 Creature의 소유 아이템들을 + // iteration 하는 메쏘드를 제공하는 것도 어색하다. + // 따라서, Creature에 등록 메쏘드를 두고 여기서 Zone에 접근해서 + // 스스로를 등록하도록 한 것이다. //////////////////////////////////////////////////////////// virtual void registerObject() = 0; - // ũó Ư ǥ þ ¸ Ѵ. + // 크리처에 대한 특정 좌표의 시야 상태를 리턴한다. VisionState getVisionState(ZoneCoord_t x, ZoneCoord_t y); VisionState getVisionState(Coord_t x, Coord_t y, Sight_t sight); @@ -222,10 +222,10 @@ class Creature : public Object { //////////////////////////////////////////////////////////// // *CAUTION* - // , 2 ̻ ÿ ϴ set ޽ ! - //(Լ ȣ ڿ ̷ٴ !) - // ex> setXY(pResult->getInt(++i), pResult->getInt(++i)); setXY(y,x) - // ϰ ȴ... -_-; + // 쿼리 결과를 저장할 때, 2개 이상의 값을 동시에 지정하는 set 메쏘드는 사용하지 말 것! + //(함수 호출이 뒤에서 부터 이루어진다는 사실을 유념할 것!) + // ex> setXY(pResult->getInt(++i), pResult->getInt(++i)); 는 실제로 setXY(y,x) + // 를 실행하게 된당... -_-; //////////////////////////////////////////////////////////// void setXY(ZoneCoord_t x, ZoneCoord_t y) { m_X = x; @@ -237,7 +237,7 @@ class Creature : public Object { m_Dir = dir; } - //(nx,ny) ִ°? + //(nx,ny)로 움직일 수 있는가? bool canMove(ZoneCoord_t nx, ZoneCoord_t ny) const; bool isBlockedByCreature(ZoneCoord_t nx, ZoneCoord_t ny) const; @@ -273,7 +273,7 @@ class Creature : public Object { // get distance Distance_t getDistance(ZoneCoord_t x1, ZoneCoord_t y1, ZoneCoord_t x2, ZoneCoord_t y2) const; - // P(x1,y1) ġ Ÿ Ѵ. + // P(x1,y1)과 나의 위치사이의 거리를 측정한다. Distance_t getDistance(ZoneCoord_t x1, ZoneCoord_t y1) const; // get/set EffectInfo @@ -391,27 +391,27 @@ class Creature : public Object { } protected: - Player* m_pPlayer; // Player (Mob NPC NULL) + Player* m_pPlayer; // Player 에 대한 포인터(Mob 과 NPC 일 경우 NULL) MoveMode m_MoveMode; // Move Mode - Zone* m_pZone; // - ZoneCoord_t m_X; // x ǥ - ZoneCoord_t m_Y; // y ǥ - Dir_t m_Dir; // - ZoneCoord_t m_ViewportWidth; // Ʈ - ZoneCoord_t m_ViewportUpperHeight; // Ʈ - ZoneCoord_t m_ViewportLowerHeight; // Ʈ + Zone* m_pZone; // 현재 존에 대한 포인터 + ZoneCoord_t m_X; // 존 x 좌표 + ZoneCoord_t m_Y; // 존 y 좌표 + Dir_t m_Dir; // 현재 방향 + ZoneCoord_t m_ViewportWidth; // 뷰 포트 + ZoneCoord_t m_ViewportUpperHeight; // 뷰 포트 + ZoneCoord_t m_ViewportLowerHeight; // 뷰 포트 EffectManager* m_pEffectManager; // effect manager point bitset m_Flag; // effect flag Sight_t m_Sight; // current sight int m_PartyID; // partyid - Resist_t m_Resist[MAGIC_DOMAIN_MAX]; // ׷ + Resist_t m_Resist[MAGIC_DOMAIN_MAX]; // 마법 저항력 - //  , Ȱ . by sigi. 2002.5.11 - Zone* m_pNewZone; // - ZoneCoord_t m_NewX; // x ǥ - ZoneCoord_t m_NewY; // y ǥ + // 새로 들어갈 존, 부활할 존. by sigi. 2002.5.11 + Zone* m_pNewZone; // 현재 존에 대한 포인터 + ZoneCoord_t m_NewX; // 존 x 좌표 + ZoneCoord_t m_NewY; // 존 y 좌표 - // ׿ + // 디버그용 CreatureClass m_CClass; string m_Owner; bool m_bDeriveDestructed; diff --git a/src/server/gameserver/CreatureUtil.cpp b/src/server/gameserver/CreatureUtil.cpp index 6979ad84..32904704 100644 --- a/src/server/gameserver/CreatureUtil.cpp +++ b/src/server/gameserver/CreatureUtil.cpp @@ -1,11 +1,11 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CreatureUtil.cpp -// Written by : 輺 +// Written by : 김성민 // Description : -// Vampire Vampire ũ⸦ ִ ̱ ؼ Ǵ -// κ ̴. -// ߿ PlayerCreature Ŭ , ȿٰ -// ԽŰ ̴. +// Vampire와 Vampire 파일의 크기를 될 수 있는 한 줄이기 위해서 둘의 공통되는 +// 부분을 가능한 한 빼놓은 파일이다. +// 나중에 PlayerCreature 클래스가 나오면, 이 파일의 내용을 그 안에다가 +// 포함시키는 것이 좋을 것이다. //////////////////////////////////////////////////////////////////////////////// #include "CreatureUtil.h" @@ -67,7 +67,7 @@ #include "skill/SummonGroundElemental.h" //////////////////////////////////////////////////////////////////////////////// -// ũ Ŭΰ? +// 같은 크리쳐 클래스인가? //////////////////////////////////////////////////////////////////////////////// bool isSameRace(Creature* pCreature1, Creature* pCreature2) @@ -84,7 +84,7 @@ bool isSameRace(Creature* pCreature1, Creature* pCreature2) //////////////////////////////////////////////////////////////////////////////// // -// ObjectID ã +// ObjectID로 아이템 찾기 // //////////////////////////////////////////////////////////////////////////////// Item* findItemOID(Creature* pCreature, ObjectID_t id) @@ -124,7 +124,7 @@ Item* findItemOID(Creature* pCreature, ObjectID_t id, int& storage, int& x, int& CoordInven_t tx = 0; CoordInven_t ty = 0; - // κ丮 ˻ + // 인벤토리 검색 pItem = pInventory->findItemOID(id, tx, ty); if (pItem != NULL) { storage = STORAGE_INVENTORY; @@ -133,7 +133,7 @@ Item* findItemOID(Creature* pCreature, ObjectID_t id, int& storage, int& x, int& return pItem; } - // â ˻ + // 기어창 검색 if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -169,14 +169,14 @@ Item* findItemOID(Creature* pCreature, ObjectID_t id, int& storage, int& x, int& } } - // 콺 ˻ + // 마우스 검색 pItem = pPC->getExtraInventorySlotItem(); if (pItem != NULL && pItem->getObjectID() == id) { storage = STORAGE_EXTRASLOT; return pItem; } - // ˻ + // 보관함 검색 for (int r = 0; r < STASH_RACK_MAX; r++) { for (int i = 0; i < STASH_INDEX_MAX; i++) { pItem = pStash->get(r, i); @@ -209,7 +209,7 @@ Item* findItemOID(Creature* pCreature, ObjectID_t id, Item::ItemClass IClass, in CoordInven_t tx = 0; CoordInven_t ty = 0; - // κ丮 ˻ + // 인벤토리 검색 pItem = pInventory->findItemOID(id, IClass, tx, ty); if (pItem != NULL) { storage = STORAGE_INVENTORY; @@ -218,7 +218,7 @@ Item* findItemOID(Creature* pCreature, ObjectID_t id, Item::ItemClass IClass, in return pItem; } - // â ˻ + // 기어창 검색 if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -254,14 +254,14 @@ Item* findItemOID(Creature* pCreature, ObjectID_t id, Item::ItemClass IClass, in } } - // 콺 ˻ + // 마우스 검색 pItem = pPC->getExtraInventorySlotItem(); if (pItem != NULL && pItem->getObjectID() == id && pItem->getItemClass() == IClass) { storage = STORAGE_EXTRASLOT; return pItem; } - // ˻ + // 보관함 검색 for (int r = 0; r < STASH_RACK_MAX; r++) { for (int i = 0; i < STASH_INDEX_MAX; i++) { pItem = pStash->get(r, i); @@ -281,7 +281,7 @@ Item* findItemOID(Creature* pCreature, ObjectID_t id, Item::ItemClass IClass, in //////////////////////////////////////////////////////////////////////////////// // -// ItemID ã +// ItemID로 아이템 찾기 // //////////////////////////////////////////////////////////////////////////////// @@ -322,7 +322,7 @@ Item* findItemIID(Creature* pCreature, ItemID_t id, int& storage, int& x, int& y CoordInven_t tx = 0; CoordInven_t ty = 0; - // κ丮 ˻ + // 인벤토리 검색 pItem = pInventory->findItemIID(id, tx, ty); if (pItem != NULL) { storage = STORAGE_INVENTORY; @@ -331,7 +331,7 @@ Item* findItemIID(Creature* pCreature, ItemID_t id, int& storage, int& x, int& y return pItem; } - // â ˻ + // 기어창 검색 if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -367,14 +367,14 @@ Item* findItemIID(Creature* pCreature, ItemID_t id, int& storage, int& x, int& y } } - // 콺 ˻ + // 마우스 검색 pItem = pPC->getExtraInventorySlotItem(); if (pItem != NULL && pItem->getItemID() == id) { storage = STORAGE_EXTRASLOT; return pItem; } - // ˻ + // 보관함 검색 for (int r = 0; r < STASH_RACK_MAX; r++) { for (int i = 0; i < STASH_INDEX_MAX; i++) { pItem = pStash->get(r, i); @@ -407,7 +407,7 @@ Item* findItemIID(Creature* pCreature, ItemID_t id, Item::ItemClass IClass, int& CoordInven_t tx = 0; CoordInven_t ty = 0; - // κ丮 ˻ + // 인벤토리 검색 pItem = pInventory->findItemIID(id, IClass, tx, ty); if (pItem != NULL) { storage = STORAGE_INVENTORY; @@ -416,7 +416,7 @@ Item* findItemIID(Creature* pCreature, ItemID_t id, Item::ItemClass IClass, int& return pItem; } - // â ˻ + // 기어창 검색 if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -452,14 +452,14 @@ Item* findItemIID(Creature* pCreature, ItemID_t id, Item::ItemClass IClass, int& } } - // 콺 ˻ + // 마우스 검색 pItem = pPC->getExtraInventorySlotItem(); if (pItem != NULL && pItem->getItemID() == id && pItem->getItemClass() == IClass) { storage = STORAGE_EXTRASLOT; return pItem; } - // ˻ + // 보관함 검색 for (int r = 0; r < STASH_RACK_MAX; r++) { for (int i = 0; i < STASH_INDEX_MAX; i++) { pItem = pStash->get(r, i); @@ -478,9 +478,9 @@ Item* findItemIID(Creature* pCreature, ItemID_t id, Item::ItemClass IClass, int& } //////////////////////////////////////////////////////////////////////////////// -// ġ ϱ -// ̾  ũĸ ϰų, ׿ 쿡 ö󰡴 ġ -// ϴ Լ +// 경험치 계산하기 +// 뱀파이어가 어떤 크리쳐를 흡혈하거나, 죽였을 경우에 올라가는 경험치를 +// 계산하는 함수 //////////////////////////////////////////////////////////////////////////////// int computeCreatureExp(Creature* pCreature, int percent, Ousters* pOusters) @@ -493,8 +493,8 @@ int computeCreatureExp(Creature* pCreature, int percent, Ousters* pOusters) int exp = 0; if (pCreature->isSlayer()) { - // KILL_AFTERMATH ¿ ٽ ״´ٰų, - // AFTERMATH Ȳ ٽ Ǵ 쿡 ġ ʴ´. + // 만약 KILL_AFTERMATH가 붙은 상태에서 다시 죽는다거나, + // AFTERMATH가 붙은 상황에서 다시 흡혈이 되는 경우에는 경험치를 받지 않는다. if ((pCreature->isFlag(Effect::EFFECT_CLASS_KILL_AFTERMATH) == true && percent != BLOODDRAIN_EXP) || (pCreature->isFlag(Effect::EFFECT_CLASS_AFTERMATH) == true && percent == BLOODDRAIN_EXP)) { exp = 0; @@ -507,7 +507,7 @@ int computeCreatureExp(Creature* pCreature, int percent, Ousters* pOusters) exp = 1; } - // ̾ 쿡 BLOODDRAIN KILL exp ȯѴ. + // 만약 슬레이어를 흡혈한 경우에는 BLOODDRAIN과 KILL의 exp를 교환한다. if (g_pCombatInfoManager->isCombat()) { if (percent == BLOODDRAIN_EXP) percent = KILL_EXP; @@ -526,8 +526,8 @@ int computeCreatureExp(Creature* pCreature, int percent, Ousters* pOusters) exp = 1; } } else if (pCreature->isOusters()) { - // KILL_AFTERMATH ¿ ٽ ״´ٰų, - // AFTERMATH Ȳ ٽ Ǵ 쿡 ġ ʴ´. + // 만약 KILL_AFTERMATH가 붙은 상태에서 다시 죽는다거나, + // AFTERMATH가 붙은 상황에서 다시 흡혈이 되는 경우에는 경험치를 받지 않는다. if ((pCreature->isFlag(Effect::EFFECT_CLASS_KILL_AFTERMATH) == true && percent == KILL_EXP) || (pCreature->isFlag(Effect::EFFECT_CLASS_AFTERMATH) == true && percent == BLOODDRAIN_EXP) || pOusters != NULL) { @@ -542,7 +542,7 @@ int computeCreatureExp(Creature* pCreature, int percent, Ousters* pOusters) } } else if (pCreature->isMonster()) { Monster* pMonster = dynamic_cast(pCreature); - // ޸753Ѫ͹Ϊ޾ edit by coffee 2007-7-7 + // 錦맣753沂밗잚謹밍膠槨轟쒔駱 edit by coffee 2007-7-7 if (pMonster->getMonsterType() == 753) { return 0; } @@ -550,7 +550,7 @@ int computeCreatureExp(Creature* pCreature, int percent, Ousters* pOusters) return 0; } - // ƿ콺ͽ óش. ..Ѥ; + // 아우스터스는 따로 처리해준다. 우하하..ㅡㅡ; if (pOusters != NULL) { return getPercentValue(getPercentValue((int)(pMonster->getOustersExp(pOusters)), g_pVariableManager->getVariable(MONSTER_EXP_RATIO)), @@ -562,7 +562,7 @@ int computeCreatureExp(Creature* pCreature, int percent, Ousters* pOusters) exp += pMonster->getINT(); exp = (int)(exp * (0.75 + (double)(pMonster->getLevel() / 200.0))); - // 5 15 ̺Ʈ ʹ Ƿ ׾ Ѵ. + // 5월 15일 이벤트 몬스터는 흡혈을 당하지 않으므로 죽었을때 전부 보상한다. MonsterType_t MonsterType = pMonster->getMonsterType(); if (MonsterType == 358 || MonsterType == 359) exp = 1144; @@ -570,7 +570,7 @@ int computeCreatureExp(Creature* pCreature, int percent, Ousters* pOusters) exp = 1076; // cout << pMonster->getName() << " exp = " << exp << " percent=" << percent << endl; - // Enhance ʵ忡 ȭ ġ ش. + // Enhance 필드에 의한 변화 경험치를 계산해 준다. /* const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo(pMonster->getMonsterType()); int HPBoost = pMonsterInfo->getEnhanceHP(); @@ -584,7 +584,7 @@ int computeCreatureExp(Creature* pCreature, int percent, Ousters* pOusters) } else Assert(false); - // ɷġ ڵ... + // 능력치 보상을 위한 코드... // exp = (int)((float)exp * 1.5); exp = getPercentValue(exp, percent); exp = getPercentValue(exp, g_pVariableManager->getVariable(MONSTER_EXP_RATIO)); @@ -595,8 +595,8 @@ int computeCreatureExp(Creature* pCreature, int percent, Ousters* pOusters) } //////////////////////////////////////////////////////////////////////////////// -// computeCreatureExp AFTERMATH -// Ҷ HP ö󰡴°Ÿ Ѵ. ߺ ڵ.. -_-; by sigi. 2002.11.19 +// computeCreatureExp와 같은데 AFTERMATH 때문에 +// 흡혈할때 HP 올라가는거만 따로 계산한다. 중복 코드.. -_-; by sigi. 2002.11.19 //////////////////////////////////////////////////////////////////////////////// int computeBloodDrainHealPoint(Creature* pCreature, int percent) @@ -616,7 +616,7 @@ int computeBloodDrainHealPoint(Creature* pCreature, int percent) exp += pSlayer->getINT(ATTR_BASIC);*/ exp = 1; - // ̾ 쿡 BLOODDRAIN KILL exp ȯѴ. + // 만약 슬레이어를 흡혈한 경우에는 BLOODDRAIN과 KILL의 exp를 교환한다. if (g_pCombatInfoManager->isCombat()) { if (percent == BLOODDRAIN_EXP) percent = KILL_EXP; @@ -640,7 +640,7 @@ int computeBloodDrainHealPoint(Creature* pCreature, int percent) } else if (pCreature->isMonster()) { Monster* pMonster = dynamic_cast(pCreature); - // ޸753Ѫ͹Ϊ޾ edit by coffee 2007-7-7 + // 錦맣753沂밗잚謹밍膠槨轟쒔駱 edit by coffee 2007-7-7 if (pMonster->getMonsterType() == 753) { return 0; } @@ -650,7 +650,7 @@ int computeBloodDrainHealPoint(Creature* pCreature, int percent) exp += pMonster->getINT(); exp = (int)(exp * (0.75 + (double)(pMonster->getLevel() / 200.0))); - // 5 15 ̺Ʈ ʹ Ƿ ׾ Ѵ. + // 5월 15일 이벤트 몬스터는 흡혈을 당하지 않으므로 죽었을때 전부 보상한다. MonsterType_t MonsterType = pMonster->getMonsterType(); if (MonsterType == 358 || MonsterType == 359) exp = 1144; @@ -658,7 +658,7 @@ int computeBloodDrainHealPoint(Creature* pCreature, int percent) exp = 1076; // cout << pMonster->getName() << " exp = " << exp << " percent=" << percent << endl; - // Enhance ʵ忡 ȭ ġ ش. + // Enhance 필드에 의한 변화 경험치를 계산해 준다. /* const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo(pMonster->getMonsterType()); int HPBoost = pMonsterInfo->getEnhanceHP(); @@ -672,7 +672,7 @@ int computeBloodDrainHealPoint(Creature* pCreature, int percent) } else Assert(false); - // ɷġ ڵ... + // 능력치 보상을 위한 코드... // exp = (int)((float)exp * 1.5); exp = getPercentValue(exp, percent); @@ -682,7 +682,7 @@ int computeBloodDrainHealPoint(Creature* pCreature, int percent) } //////////////////////////////////////////////////////////////////////////////// -// ̺Ʈ ˻ϱ... +// 이벤트용 몹인지 검사하기... //////////////////////////////////////////////////////////////////////////////// bool isEventMonster(Creature* pCreature) @@ -712,32 +712,32 @@ bool isEventMonster(Creature* pCreature) } //////////////////////////////////////////////////////////////////////////////// -// ũİ ִ ΰ ˻ϴ Լ +// 임의의 크리쳐가 현재 움직일 수 있는 상태인가를 검사하는 함수 //////////////////////////////////////////////////////////////////////////////// bool isAbleToMove(Creature* pCreature) { Assert(pCreature != NULL); - // ̵ ɸ ¶... + // 하이드 걸린 상태라면... if (pCreature->isFlag(Effect::EFFECT_CLASS_HIDE)) { if (pCreature->isVampire()) return false; - // ʹ ̵ ¿ ̴ ϱ ... + // 몬스터는 하이드 상태에서도 움직이는 것이 가능하기 때문에... // if (pCreature->isMonster()) return false; if (pCreature->isSlayer()) return false; } - // ׾ִ ¶... + // 현재 죽어있는 상태라면... if (pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || pCreature->isDead() - // ɷִٸ... + // 현재 마비에 걸려있다면... || pCreature->isFlag(Effect::EFFECT_CLASS_PARALYZE) || pCreature->isFlag(Effect::EFFECT_CLASS_ETERNITY_PAUSE) // || pCreature->isFlag(Effect::EFFECT_CLASS_SANCTUARY) || pCreature->isFlag(Effect::EFFECT_CLASS_CASKET) - // Cause Critical Wounds ɷִٸ + // 현재 Cause Critical Wounds에 걸려있다면 || pCreature->isFlag(Effect::EFFECT_CLASS_CAUSE_CRITICAL_WOUNDS) || pCreature->isFlag(Effect::EFFECT_CLASS_SOUL_CHAIN) || pCreature->isFlag(Effect::EFFECT_CLASS_LOVE_CHAIN) || pCreature->isFlag(Effect::EFFECT_CLASS_GUN_SHOT_GUIDANCE_AIM) || @@ -759,23 +759,23 @@ bool isAbleToMove(Creature* pCreature) { } //////////////////////////////////////////////////////////////////////////////// -// ũİ ִ ΰ ˻ϴ Լ +// 임의의 크리쳐가 현재 기술을 사용할 수 있는 상태인가를 검사하는 함수 //////////////////////////////////////////////////////////////////////////////// bool isAbleToUseSelfSkill(Creature* pCreature, SkillType_t SkillType) { Assert(pCreature != NULL); if (pCreature->isFlag(Effect::EFFECT_CLASS_PLEASURE_EXPLOSION)) return false; - // ̵ ɸ ¿ . - // ¿ Eternity DZ . - // ȭǰ ִ ¿ . - // ¿ . - // ׾ּ . - // Cause Critical Wounds ɷִٸ . + // 하이드 걸린 상태에서는 기술을 사용할 수 없다. + // 죽은 상태에서는 Eternity 외의기술을 사용할 수 없다. + // 현재 투명화되고 있는 상태에서는 기술을 사용할 수 없다. + // 마비 상태에서는 기술을 사용할 수 없다. + // 박쥐 상테애서는 기술을 사용할 수 없다. + // Cause Critical Wounds에 걸려있다면 기술을 사용할 수 없다. if ((pCreature->isDead() || pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) && SkillType != SKILL_ETERNITY) return false; - // Dragon Eye ´ ų . + // Dragon Eye 상태는 스킬을 쓸 수 없다. if (pCreature->isFlag(Effect::EFFECT_CLASS_DRAGON_EYE)) return false; @@ -796,9 +796,9 @@ bool isAbleToUseSelfSkill(Creature* pCreature, SkillType_t SkillType) { return false; } - // ׾ּ ⳪ ü Ա ܿ ų . + // 늑대 상테애서는 울기나 시체 먹기 외에는 스킬을 사용할 수 없다. if (pCreature->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF)) { - // edit by coffee 2006-12-29 ǵ + // edit by coffee 2006-12-29 錦攣낚의딜窟狂痙 if (SkillType != SKILL_HOWL || SkillType != SKILL_EAT_CORPSE || SkillType != SKILL_UN_TRANSFORM) // end edit // if (SkillType != SKILL_HOWL && SkillType != SKILL_EAT_CORPSE && SkillType != SKILL_UN_TRANSFORM) @@ -813,13 +813,13 @@ bool isAbleToUseSelfSkill(Creature* pCreature, SkillType_t SkillType) { } } - // Ÿ Ʈۿ . + // 실프 타고 있을땐 언트랜스폼밖에 사용할 수 없다. if (pCreature->isFlag(Effect::EFFECT_CLASS_SUMMON_SYLPH)) { if (SkillType != SKILL_UN_TRANSFORM) return false; } - // ͻŬ ź ׿ . + // 모터사이클을 탄 상테에서는 기술을 사용할 수 없다. if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); if (pSlayer->hasRideMotorcycle()) { @@ -845,16 +845,16 @@ bool isAbleToUseObjectSkill(Creature* pCreature, SkillType_t SkillType) { if (pCreature->isFlag(Effect::EFFECT_CLASS_PLEASURE_EXPLOSION)) return false; - // Dragon Eye ´ ų . + // Dragon Eye 상태는 스킬을 쓸 수 없다. if (pCreature->isFlag(Effect::EFFECT_CLASS_DRAGON_EYE)) return false; - // ̵ ɸ ¿ . - // ¿ . - // ȭǰ ִ ¿ . - // ¿ . - // ׾ּ . - // Cause Critical Wounds ɷִٸ + // 하이드 걸린 상태에서는 기술을 사용할 수 없다. + // 죽은 상태에서는 기술을 사용할 수 없다. + // 현재 투명화되고 있는 상태에서는 기술을 사용할 수 없다. + // 마비 상태에서는 기술을 사용할 수 없다. + // 박쥐 상테애서는 기술을 사용할 수 없다. + // Cause Critical Wounds에 걸려있다면 기술을 사용할 수 없다 if (pCreature->isFlag(Effect::EFFECT_CLASS_HIDE) || pCreature->isFlag(Effect::EFFECT_CLASS_CASKET) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || pCreature->isDead() || pCreature->isFlag(Effect::EFFECT_CLASS_FADE_OUT) || pCreature->isFlag(Effect::EFFECT_CLASS_PARALYZE) || @@ -869,9 +869,9 @@ bool isAbleToUseObjectSkill(Creature* pCreature, SkillType_t SkillType) { pCreature->isFlag(Effect::EFFECT_CLASS_TRAPPED) || pCreature->isFlag(Effect::EFFECT_CLASS_EXPLOSION_WATER)) return false; - // ׾ּ ⳪ ü Ա ܿ ų . + // 늑대 상테애서는 울기나 시체 먹기 외에는 스킬을 사용할 수 없다. if (pCreature->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF)) { - // edit by coffee 2006-12-29 ǵ + // edit by coffee 2006-12-29 錦攣낚의딜窟狂痙 if (SkillType != SKILL_HOWL || SkillType != SKILL_EAT_CORPSE || SkillType != SKILL_ATTACK_MELEE) // end edit // if (SkillType != SKILL_HOWL && SkillType != SKILL_EAT_CORPSE && SkillType != SKILL_ATTACK_MELEE) @@ -887,7 +887,7 @@ bool isAbleToUseObjectSkill(Creature* pCreature, SkillType_t SkillType) { } } - // ͻŬ ź ׿ . + // 모터사이클을 탄 상테에서는 기술을 사용할 수 없다. if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); if (pSlayer->hasRideMotorcycle()) @@ -907,16 +907,16 @@ bool isAbleToUseTileSkill(Creature* pCreature, SkillType_t SkillType) { if (pCreature->isFlag(Effect::EFFECT_CLASS_PLEASURE_EXPLOSION)) return false; - // Dragon Eye ´ ų . + // Dragon Eye 상태는 스킬을 쓸 수 없다. if (pCreature->isFlag(Effect::EFFECT_CLASS_DRAGON_EYE)) return false; - // ̵ ɸ ¿ . - // ¿ . - // ȭǰ ִ ¿ . - // ¿ . - // ׾ּ . - // Cause Critical Wounds ɷִٸ + // 하이드 걸린 상태에서는 기술을 사용할 수 없다. + // 죽은 상태에서는 기술을 사용할 수 없다. + // 현재 투명화되고 있는 상태에서는 기술을 사용할 수 없다. + // 마비 상태에서는 기술을 사용할 수 없다. + // 박쥐 상테애서는 기술을 사용할 수 없다. + // Cause Critical Wounds에 걸려있다면 기술을 사용할 수 없다 if (pCreature->isFlag(Effect::EFFECT_CLASS_HIDE) || pCreature->isFlag(Effect::EFFECT_CLASS_CASKET) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || pCreature->isDead() || pCreature->isFlag(Effect::EFFECT_CLASS_FADE_OUT) || pCreature->isFlag(Effect::EFFECT_CLASS_PARALYZE) || @@ -931,9 +931,9 @@ bool isAbleToUseTileSkill(Creature* pCreature, SkillType_t SkillType) { pCreature->isFlag(Effect::EFFECT_CLASS_TRAPPED) || pCreature->isFlag(Effect::EFFECT_CLASS_EXPLOSION_WATER)) return false; - // ׾ּ ⳪ ü Ա ܿ ų . + // 늑대 상테애서는 울기나 시체 먹기 외에는 스킬을 사용할 수 없다. if (pCreature->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF)) { - // edit by coffee 2006-12-29 ǵ + // edit by coffee 2006-12-29 錦攣낚의딜窟狂痙 // if (SkillType != SKILL_HOWL && SkillType != SKILL_EAT_CORPSE) if (SkillType != SKILL_HOWL || SkillType != SKILL_EAT_CORPSE) // end edit @@ -949,7 +949,7 @@ bool isAbleToUseTileSkill(Creature* pCreature, SkillType_t SkillType) { } } - // ͻŬ ź ׿ . + // 모터사이클을 탄 상테에서는 기술을 사용할 수 없다. if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); if (pSlayer->hasRideMotorcycle()) @@ -969,17 +969,17 @@ bool isAbleToUseInventorySkill(Creature* pCreature, BYTE X, BYTE Y, BYTE TX, BYT if (pCreature->isFlag(Effect::EFFECT_CLASS_PLEASURE_EXPLOSION)) return false; - // Dragon Eye ´ ų . + // Dragon Eye 상태는 스킬을 쓸 수 없다. if (pCreature->isFlag(Effect::EFFECT_CLASS_DRAGON_EYE)) return false; - // κ丮 ǥ Ѿ 쿡 . - // ̵ ɸ ¿ . - // ¿ . - // ȭǰ ִ ¿ . - // ¿ . - // ׾ּ . - // Cause Critical Wounds ɷȴٸ + // 인벤토리 좌표가 넘어가는 경우에는 사용할 수 없다. + // 하이드 걸린 상태에서는 기술을 사용할 수 없다. + // 죽은 상태에서는 기술을 사용할 수 없다. + // 현재 투명화되고 있는 상태에서는 기술을 사용할 수 없다. + // 마비 상태에서는 기술을 사용할 수 없다. + // 박쥐 상테애서는 기술을 사용할 수 없다. + // Cause Critical Wounds에 걸렸다면 기술을 사용할 수 없다 // if (X >= 10 || Y >= 6 || TX >= 10 || TY >= 6) return false; if (X >= 10 || Y >= 6) return false; @@ -997,9 +997,9 @@ bool isAbleToUseInventorySkill(Creature* pCreature, BYTE X, BYTE Y, BYTE TX, BYT pCreature->isFlag(Effect::EFFECT_CLASS_TRAPPED) || pCreature->isFlag(Effect::EFFECT_CLASS_EXPLOSION_WATER)) return false; - // ׾ּ ⳪ ü Ա ܿ ų . + // 늑대 상테애서는 울기나 시체 먹기 외에는 스킬을 사용할 수 없다. if (pCreature->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF)) { - // edit by coffee 2006-12-29 ǵ + // edit by coffee 2006-12-29 錦攣낚의딜窟狂痙 // if (SkillType != SKILL_HOWL && SkillType != SKILL_EAT_CORPSE) if (SkillType != SKILL_HOWL || SkillType != SKILL_EAT_CORPSE) // end edit @@ -1015,7 +1015,7 @@ bool isAbleToUseInventorySkill(Creature* pCreature, BYTE X, BYTE Y, BYTE TX, BYT } } - // ͻŬ ź ׿ . + // 모터사이클을 탄 상테에서는 기술을 사용할 수 없다. if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); if (pSlayer->hasRideMotorcycle()) @@ -1031,16 +1031,16 @@ bool isAbleToUseInventorySkill(Creature* pCreature, BYTE X, BYTE Y, BYTE TX, BYT } //////////////////////////////////////////////////////////////////////////////// -// ũİ ִ ΰ ˻ϴ Լ +// 임의의 크리쳐가 아이템을 주을 수 있는 상태인가를 검사하는 함수 //////////////////////////////////////////////////////////////////////////////// bool isAbleToPickupItem(Creature* pCreature, Item* pItem) { Assert(pCreature != NULL); - // ¿ . - // ¿ . + // 죽은 상태에서는 아이템을 주을 수 없다. + // 박쥐 상태에서는 아이템을 주을 수 없다. if (pCreature->isFlag(Effect::EFFECT_CLASS_COMA) - // ɷִٸ.... by sigi. 2002.12.10 + // 현재 마비에 걸려있다면.... by sigi. 2002.12.10 || pCreature->isFlag(Effect::EFFECT_CLASS_PARALYZE) || pCreature->isFlag(Effect::EFFECT_CLASS_ETERNITY_PAUSE) // || pCreature->isFlag(Effect::EFFECT_CLASS_SANCTUARY) @@ -1053,7 +1053,7 @@ bool isAbleToPickupItem(Creature* pCreature, Item* pItem) { pCreature->isFlag(Effect::EFFECT_CLASS_INSTALL_TURRET)) return false; - // ߾ ȿ ´. + // 생추어리 안에 있으면 못 집는다. Zone* pZone = pCreature->getZone(); if (pZone != NULL) { Tile& rTile = pZone->getTile(pCreature->getX(), pCreature->getY()); @@ -1062,15 +1062,15 @@ bool isAbleToPickupItem(Creature* pCreature, Item* pItem) { } } - // ͻŬ ź ¿ . + // 모터사이클을 탄 상태에서는 아이템을 주을 수 없다. if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); if (pSlayer->hasRideMotorcycle()) return false; } - // QuestItem ϳۿ ֿ . - // ߿ ٲ. . - -; by sigi. 2002.9.4 + // QuestItem인 경우는 하나밖에 주울 수 없다. + // 나중에 또 바뀌겠지. 으흠. - -; by sigi. 2002.9.4 Item::ItemClass itemClass = pItem->getItemClass(); ItemType_t itemtype = pItem->getItemType(); @@ -1078,14 +1078,14 @@ bool isAbleToPickupItem(Creature* pCreature, Item* pItem) { PlayerCreature* pPC = dynamic_cast(pCreature); Inventory* pInventory = pPC->getInventory(); - // 콺 ְų + // 마우스에 갖고 있거나 Item* pMouseItem = pPC->getExtraInventorySlotItem(); if (pMouseItem != NULL && pMouseItem->getItemClass() == Item::ITEM_CLASS_QUEST_ITEM && pMouseItem->getItemType() < 4) return false; - // κ丮 ִ + // 인벤토리에 있는 경우 Item* pInvenItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM); if (pInvenItem != NULL && pInvenItem->getItemClass() == Item::ITEM_CLASS_QUEST_ITEM && @@ -1107,14 +1107,14 @@ bool isAbleToPickupItem(Creature* pCreature, Item* pItem) { return false; } - // Ʈ (ð ) ֿ . + // 퀘스트 아이템 (시간제한 아이템) 은 주울 수 없다. if (pItem->isTimeLimitItem()) return false; - // , , ¡.. + // 성물, 피의 성서, 성의 상징..등의 아이템인 경우 if (isRelicItem(itemClass)) { - // Relic ֿ ٴ Effect ɷִ ̰ų - // Ư ߿ Relic ֿ . + // Relic을 주울 수 없다는 Effect가 걸려있는 경우이거나 + // 특정 기술 사용중에는 Relic을 주울 수 없다. if (pItem->isFlag(Effect::EFFECT_CLASS_RELIC_LOCK) || pCreature->isFlag(Effect::EFFECT_CLASS_HIDE) || pCreature->isFlag(Effect::EFFECT_CLASS_INVISIBILITY) || pCreature->isFlag(Effect::EFFECT_CLASS_FADE_OUT) || pCreature->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF) || @@ -1127,7 +1127,7 @@ bool isAbleToPickupItem(Creature* pCreature, Item* pItem) { } switch (itemClass) { - // Relic ֿ ִ. + // 아직 없는 Relic만 주울 수 있다. case Item::ITEM_CLASS_RELIC: { const RelicInfo* pRelicInfo = dynamic_cast(g_pRelicInfoManager->getItemInfo(itemtype)); @@ -1152,7 +1152,7 @@ bool isAbleToPickupItem(Creature* pCreature, Item* pItem) { return false; } - // ޴ 뿡 ֿ . + // 줏는 넘이 안전지대에 있으면 주울 수 없다. ZoneLevel_t zoneLevel = pCreature->getZone()->getZoneLevel(pCreature->getX(), pCreature->getY()); if (zoneLevel & SAFE_ZONE) { return false; @@ -1178,7 +1178,7 @@ bool isAbleToPickupItem(Creature* pCreature, Item* pItem) { } break; case Item::ITEM_CLASS_WAR_ITEM: { - // 150 ̻ ִ. + // 150 레벨 이상만 들 수 있다. Level_t level = pCreature->getLevel(); if (level < 150) return false; @@ -1208,7 +1208,7 @@ bool isAbleToPickupItem(Creature* pCreature, Item* pItem) { return false; } - // ߰ ´. + // 깃발갖고 있으면 깃발 못 집는다. if (pItem->isFlagItem()) { if (!g_pFlagManager->hasFlagWar()) return false; @@ -1230,8 +1230,8 @@ bool isAbleToPickupItem(Creature* pCreature, Item* pItem) { if (pItem->isFlag(Effect::EFFECT_CLASS_OUSTERS_ONLY)) return false; - // Slayer vampire ۸ ݴ´. - // Ousters ۵ ݴ´ + // Slayer인 경우는 vampire 아이템만 못 줍는다. + // Ousters 아이템도 못 줍는다 switch (itemClass) { case Item::ITEM_CLASS_VAMPIRE_RING: case Item::ITEM_CLASS_VAMPIRE_BRACELET: @@ -1259,7 +1259,7 @@ bool isAbleToPickupItem(Creature* pCreature, Item* pItem) { case Item::ITEM_CLASS_FASCIA: case Item::ITEM_CLASS_MITTEN: // case Item::ITEM_CLASS_MONEY : - // vampire ̸ ݴ´. + // vampire 돈이면 못 줍는다. // edit by sonic 2006.10.31 // if (pItem->getItemType()==1) return false; return false; @@ -1278,8 +1278,8 @@ bool isAbleToPickupItem(Creature* pCreature, Item* pItem) { if (pItem->isFlag(Effect::EFFECT_CLASS_OUSTERS_ONLY)) return false; - // Vampire Vampire ۰ - // event ۸ ֿ ִ. + // Vampire인 경우는 Vampire 아이템과 + // event 아이템만 주울 수 있다. switch (pItem->getItemClass()) { case Item::ITEM_CLASS_VAMPIRE_RING: case Item::ITEM_CLASS_VAMPIRE_BRACELET: @@ -1319,7 +1319,7 @@ bool isAbleToPickupItem(Creature* pCreature, Item* pItem) { case Item::ITEM_CLASS_DERMIS: case Item::ITEM_CLASS_PERSONA: case Item::ITEM_CLASS_MONEY: - // vampire ̸ ݴ´. + // vampire 돈이면 줍는다. // edit by sonic 2006.10.31 // if (pItem->getItemType()==1) return true; return true; @@ -1339,8 +1339,8 @@ bool isAbleToPickupItem(Creature* pCreature, Item* pItem) { if (pItem->isFlag(Effect::EFFECT_CLASS_VAMPIRE_ONLY)) return false; - // Ousters Ousters ۰ - // event ۸ ֿ ִ. + // Ousters인 경우는 Ousters 아이템과 + // event 아이템만 주울 수 있다. switch (pItem->getItemClass()) { case Item::ITEM_CLASS_OUSTERS_ARMSBAND: case Item::ITEM_CLASS_OUSTERS_BOOTS: @@ -1382,7 +1382,7 @@ bool isAbleToPickupItem(Creature* pCreature, Item* pItem) { case Item::ITEM_CLASS_FASCIA: case Item::ITEM_CLASS_MITTEN: case Item::ITEM_CLASS_MONEY: - // Ousters ̸ ݴ´. + // Ousters 돈이면 줍는다. // edit by sonic 2006.10.31 // if (pItem->getItemType()==1) return true; return true; @@ -1407,7 +1407,7 @@ bool isAbleToPickupItem(Creature* pCreature, Item* pItem) { } bool canDropToZone(Creature* pCreature, Item* pItem) { - // Ʈ (ð ) . + // 퀘스트 아이템 (시간제한 아이템) 떨굴 수 없다. if (pItem->isTimeLimitItem()) return false; @@ -1429,7 +1429,7 @@ bool canDropToZone(Creature* pCreature, Item* pItem) { } break; case Item::ITEM_CLASS_MOON_CARD: - // ݴ ī ٴڿ . + // 반달 카드는 바닥에 버릴 수 없다. { if (pItem->getItemType() == 0) return false; @@ -1463,9 +1463,9 @@ bool canDropToZone(Creature* pCreature, Item* pItem) { return true; } -// ׷ ε ׷ Ʈ Ŭ̾Ʈ ֱ ҷش. +// 그랜드 마스터인데 그랜드 마스터 이펙트를 클라이언트에게 보내주기 곤란할 경우 불러준다. // 2002. 1. 13. Sequoia -// . -.- +// 사용되지 않음. -.- /*void confirmGrandMaster(Creature* pCreature) { if( pCreature == NULL ) return; @@ -1571,34 +1571,34 @@ bool getGuildIDFromDB(const string& Name, Race_t race, GuildID_t& guildID) bool canSee(const Creature* pSource, Creature* pTarget, EffectObservingEye* pEffectObservingEye, EffectGnomesWhisper* pEffectGnomesWhisper) { - // Target Ghost ̸ . + // Target이 Ghost 이면 무조건 볼 수 없다. if (pTarget->isFlag(Effect::EFFECT_CLASS_GHOST)) return false; // ZoneCoord_t targetX = pTarget->getX(), targetY = pTarget->getY(); - // ObservingEye Ʈ ´. + // ObservingEye 이펙트를 가져온다. if (pEffectObservingEye == NULL && pSource->isFlag(Effect::EFFECT_CLASS_OBSERVING_EYE)) { pEffectObservingEye = dynamic_cast(pSource->findEffect(Effect::EFFECT_CLASS_OBSERVING_EYE)); } - // GnomesWhisper Ʈ ´. + // GnomesWhisper 이펙트를 가져온다. if (pEffectGnomesWhisper == NULL && pSource->isFlag(Effect::EFFECT_CLASS_GNOMES_WHISPER)) { pEffectGnomesWhisper = dynamic_cast(pSource->findEffect(Effect::EFFECT_CLASS_GNOMES_WHISPER)); } - // ϴ þ߾ȿ ־ 絿 . + // 일단 시야안에 있어야 보든동 하지. // if (pSource->getVisionState(targetX, targetY) >= IN_SIGHT) //{ - // ̾ . + // 뱀파이어 끼리는 무조건 본다. if (pSource->isVampire() && pTarget->isVampire()) return true; if ((!pTarget->isFlag(Effect::EFFECT_CLASS_HIDE) || pSource->isFlag(Effect::EFFECT_CLASS_DETECT_HIDDEN) - // Revealer ̵ ѳ ִ. + // 이제 Revealer도 하이드 한놈 볼 수 있다. || pSource->isFlag(Effect::EFFECT_CLASS_REVEALER) || (pEffectGnomesWhisper != NULL && pEffectGnomesWhisper->canSeeHide())) && (!pTarget->isFlag(Effect::EFFECT_CLASS_INVISIBILITY) || @@ -1656,8 +1656,8 @@ int changeSexEx(PlayerCreature* pPC) { } else return 3; - // Դٴ° ȯ ̴. DBƮ - // ȯ ̸ ƿ콺ϸ Ƿ ̾ ̾ ̺ ִ. + // 여기까지 왔다는건 성전환 성공이다. DB업데이트 + // 성전환 성공이면 아우스터즈일리는 절대 없으므로 슬레이어와 뱀파이어 테이블 모두 정보가 있다. Statement* pStmt = NULL; BEGIN_DB { @@ -1749,10 +1749,10 @@ bool dropFlagToZone(PlayerCreature* pPC, Item* pItem) Zone* pZone = pPC->getZone(); Assert(pZone != NULL); - // cout << " ãҴ" << endl; + // cout << "깃발 찾았다" << endl; - // ϴ ٴڿ ߸. - // ü ĥ Ƿ.. ijͰ ߸. + // 일단 아이템을 바닥에 떨어뜨린다. + // 시체와 겹칠 수도 있으므로.. 캐릭터가 없는 곳에 떨어뜨린다. // TPOINT pt = pZone->addItem( pItem, pPC->getX(), pPC->getY(), false ); pZone->addItemDelayed(pItem, pPC->getX(), pPC->getY(), false); @@ -1762,12 +1762,12 @@ bool dropFlagToZone(PlayerCreature* pPC, Item* pItem) if (!pItem->isFlag(Effect::EFFECT_CLASS_RELIC_LOCK)) { EffectRelicLock* pLock = new EffectRelicLock(pItem); - pLock->setDeadline(10 * 10); // 10 + pLock->setDeadline(10 * 10); // 10초 pItem->setFlag(Effect::EFFECT_CLASS_RELIC_LOCK); pItem->getEffectManager().addEffect(pLock); } - /* if ( pt.x != -1 ) // ߸µ ߴٸ + /* if ( pt.x != -1 ) // 떨어뜨리는데 성공했다면 { char pField[80]; sprintf(pField, "OwnerID='', Storage=%d, StorageID=%u, X=%d, Y=%d", STORAGE_ZONE, pZone->getZoneID(), pt.x, @@ -1779,7 +1779,7 @@ bool dropFlagToZone(PlayerCreature* pPC, Item* pItem) if (!pItem->isFlag( Effect::EFFECT_CLASS_RELIC_LOCK )) { EffectRelicLock* pLock = new EffectRelicLock(pItem); - pLock->setDeadline( 10*10 ); // 10 + pLock->setDeadline( 10*10 ); // 10초 pItem->setFlag( Effect::EFFECT_CLASS_RELIC_LOCK ); pItem->getEffectManager().addEffect( pLock ); } @@ -1799,9 +1799,9 @@ bool dropFlagToZone(PlayerCreature* pPC, Item* pItem) pt = pZone->addItem( pItem, pPC->getX(), pPC->getY(), false ); if ( pt.x == -1 ) { - filelog("FlagWar.log", "-_- ׷ ߸ ڸ .... Xƴ."); - //throw Error(" ߸ ڸ ."); - // ü ߸°ų -_- + filelog("FlagWar.log", "-_- 그래도 깃발 떨어뜨릴 자리가 없다.... X됐다."); + //throw Error("깃발 떨어뜨릴 자리가 없다."); + // 대체 왜 못 떨어뜨리는거냐 -_- return false; } }*/ @@ -1816,16 +1816,16 @@ bool dropFlagToZone(Creature* pCreature, bool bSendPacket) { bool bDrop = false; - // mouse relic ִ üũ + // mouse에 relic이 있는지 체크 Item* pSlotItem = pPC->getExtraInventorySlotItem(); if (pSlotItem != NULL && pSlotItem->isFlagItem()) { if (dropFlagToZone(pPC, pSlotItem)) { pPC->deleteItemFromExtraInventorySlot(); - // player mouse Ѵ. - // client Ŷ - // mouse üũְ ߴ. + // player의 mouse에서 제거한다. + // client에서 이 패킷을 받으면 + // mouse에서도 함 체크해주게 했다. if (bSendPacket) { GCDeleteInventoryItem gcDeleteInventoryItem; @@ -1844,17 +1844,17 @@ bool dropFlagToZone(Creature* pCreature, bool bSendPacket) { Inventory* pInventory = pPC->getInventory(); Assert(pInventory != NULL); - // κ丮 Relic Item ãƺ. + // 인벤토리에서 Relic Item을 찾아본다. for (CoordInven_t y = 0; y < pInventory->getHeight(); y++) { for (CoordInven_t x = 0; x < pInventory->getWidth(); x++) { Item* pItem = pInventory->getItem(x, y); if (pItem != NULL && pItem->isFlagItem()) { - // ϴ ٴڿ ߸. + // 일단 아이템을 바닥에 떨어뜨린다. if (dropFlagToZone(pPC, pItem)) { - // κ丮 . + // 인벤토리에서 뺀다. pInventory->deleteItem(pItem->getObjectID()); - // player inventory Ѵ. + // player의 inventory에서 제거한다. if (bSendPacket) { GCDeleteInventoryItem gcDeleteInventoryItem; gcDeleteInventoryItem.setObjectID(pItem->getObjectID()); @@ -1950,7 +1950,7 @@ void giveUnderworldGift(Creature* pCreature) { Statement* pStmt = NULL; - filelog("Underworld.log", "[%s:%s] űǿ ÷Ǿϴ.", PlayerID.c_str(), PlayerName.c_str()); + filelog("Underworld.log", "[%s:%s] 언더월드 예매권에 당첨되었습니다.", PlayerID.c_str(), PlayerName.c_str()); try { BEGIN_DB { @@ -1962,7 +1962,7 @@ void giveUnderworldGift(Creature* pCreature) { } END_DB(pStmt) } catch (Throwable& t) { - filelog("Underworld.log", "DB Ʈ ߽ϴ. : %s", t.toString().c_str()); + filelog("Underworld.log", "DB에 업데이트를 실패했습니다. : %s", t.toString().c_str()); } GCNotifyWin gcNW; @@ -1992,7 +1992,7 @@ bool dropSweeperToZone(PlayerCreature* pPC, Item* pItem) if (!pItem->isFlag(Effect::EFFECT_CLASS_RELIC_LOCK)) { EffectRelicLock* pLock = new EffectRelicLock(pItem); - pLock->setDeadline(10 * 10); // 10 + pLock->setDeadline(10 * 10); // 10초 pItem->setFlag(Effect::EFFECT_CLASS_RELIC_LOCK); pItem->getEffectManager().addEffect(pLock); } @@ -2007,16 +2007,16 @@ bool dropSweeperToZone(Creature* pCreature, bool bSendPacket) { bool bDrop = false; - // mouse relic ִ üũ + // mouse에 relic이 있는지 체크 Item* pSlotItem = pPC->getExtraInventorySlotItem(); if (pSlotItem != NULL && pSlotItem->getItemClass() == Item::ITEM_CLASS_SWEEPER) { if (dropSweeperToZone(pPC, pSlotItem)) { pPC->deleteItemFromExtraInventorySlot(); - // player mouse Ѵ. - // client Ŷ - // mouse üũְ ߴ. + // player의 mouse에서 제거한다. + // client에서 이 패킷을 받으면 + // mouse에서도 함 체크해주게 했다. if (bSendPacket) { GCDeleteInventoryItem gcDeleteInventoryItem; @@ -2035,17 +2035,17 @@ bool dropSweeperToZone(Creature* pCreature, bool bSendPacket) { Inventory* pInventory = pPC->getInventory(); Assert(pInventory != NULL); - // κ丮 Relic Item ãƺ. + // 인벤토리에서 Relic Item을 찾아본다. for (CoordInven_t y = 0; y < pInventory->getHeight(); y++) { for (CoordInven_t x = 0; x < pInventory->getWidth(); x++) { Item* pItem = pInventory->getItem(x, y); if (pItem != NULL && pItem->getItemClass() == Item::ITEM_CLASS_SWEEPER) { - // ϴ ٴڿ ߸. + // 일단 아이템을 바닥에 떨어뜨린다. if (dropSweeperToZone(pPC, pItem)) { - // κ丮 . + // 인벤토리에서 뺀다. pInventory->deleteItem(pItem->getObjectID()); - // player inventory Ѵ. + // player의 inventory에서 제거한다. if (bSendPacket) { GCDeleteInventoryItem gcDeleteInventoryItem; gcDeleteInventoryItem.setObjectID(pItem->getObjectID()); @@ -2113,7 +2113,7 @@ void giveGoldMedal(PlayerCreature* pPC) { addSimpleCreatureEffect(pPC, Effect::EFFECT_CLASS_GOLD_MEDAL, 10, true); GCSystemMessage gcSM; - gcSM.setMessage("ŵһö."); + gcSM.setMessage("삿돤錤듕쏜탬寧철."); pGamePlayer->sendPacket(&gcSM); /* pStmt->executeQuery("UPDATE GoldMedalCount SET GoldMedalCount=GoldMedalCount+1 WHERE PlayerID='%s'", pGamePlayer->getID().c_str()); @@ -2157,7 +2157,7 @@ void giveLotto(PlayerCreature* pPC, BYTE type, uint num) { addSimpleCreatureEffect(pPC, Effect::EFFECT_CLASS_GOLD_MEDAL, 10); GCSystemMessage gcSM; - gcSM.setMessage( "׳ ݸ޴ 1 ȹ߽ϴ. ݸ ̺Ʈ ǰ Ȯϼ." ); + gcSM.setMessage( "아테네 금메달을 1개 획득했습니다. 넷마블 이벤트 페이지에서 상품을 확인하세요." ); pGamePlayer->sendPacket( &gcSM );*/ pStmt->executeQuery("UPDATE EventLotto SET count=count+%u WHERE PlayerID='%s' AND Type=%u", num, pGamePlayer->getID().c_str(), type); @@ -2172,7 +2172,7 @@ void giveLotto(PlayerCreature* pPC, BYTE type, uint num) { if (pResult->next()) { char buffer[256]; - sprintf(buffer, "ƱѴﵽ%d.ϸοٷҳ.", pResult->getInt(1)); + sprintf(buffer, "삶땡꽈튿鑒綠댐돕%d몸.圈玖코휭헝꽝옘바렘寮女.", pResult->getInt(1)); GCSystemMessage gcSM; gcSM.setMessage(buffer); pGamePlayer->sendPacket(&gcSM); @@ -2216,7 +2216,7 @@ void addOlympicStat(PlayerCreature* pPC, BYTE type, uint num) { if ( pResult->next() ) { char buffer[256]; - sprintf(buffer, "%uܰ %d Ǿϴ. ڼ Ȩ ϼ.", + sprintf(buffer, "%u단계 복권이 %d개가 되었습니다. 자세한 내용은 홈페이지를 참조하세요.", type, pResult->getInt(1)); GCSystemMessage gcSM; gcSM.setMessage( buffer ); @@ -2239,45 +2239,45 @@ void deletePC(PlayerCreature* pPC) { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); //////////////////////////////////////////////////////////// - // ϴ ̾ ̺ Ȯ Ѵ. + // 일단 슬레이어 테이블에는 확실히 존재한다. //////////////////////////////////////////////////////////// // pStmt->executeQuery("DELETE FROM Slayer WHERE Name = '%s'", pPC->getName().c_str()); pStmt->executeQuery("UPDATE Slayer SET Active='INACTIVE' WHERE Name = '%s'", pPC->getName().c_str()); //////////////////////////////////////////////////////////// - // ̾ ̺ . + // 뱀파이어 테이블을 지운다. //////////////////////////////////////////////////////////// // pStmt->executeQuery("DELETE FROM Vampire WHERE Name = '%s'", pPC->getName().c_str()); pStmt->executeQuery("UPDATE Vampire SET Active='INACTIVE' WHERE Name = '%s'", pPC->getName().c_str()); //////////////////////////////////////////////////////////// - // ƿ콺ͽ ̺ . + // 아우스터스 테이블을 지운다. //////////////////////////////////////////////////////////// // pStmt->executeQuery("DELETE FROM Ousters WHERE Name = '%s'", pPC->getName().c_str()); pStmt->executeQuery("UPDATE Ousters SET Active='INACTIVE' WHERE Name = '%s'", pPC->getName().c_str()); //////////////////////////////////////////////////////////// - // ̾ ų . + // 슬레이어 스킬을 지운다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM SkillSave WHERE OwnerID = '%s'", pPC->getName().c_str()); //////////////////////////////////////////////////////////// - // ̾ ų ش. + // 뱀파이어 스킬을 지워준다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM VampireSkillSave WHERE OwnerID = '%s'", pPC->getName().c_str()); //////////////////////////////////////////////////////////// - // ƿ콺 ų ش. + // 아우스터즈 스킬을 지워준다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM OustersSkillSave WHERE OwnerID = '%s'", pPC->getName().c_str()); //////////////////////////////////////////////////////////// - // ʽ ش. + // 계급 보너스를 지워준다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM RankBonusData WHERE OwnerID = '%s'", pPC->getName().c_str()); //////////////////////////////////////////////////////////// - // ׸ . + // 아이템을 깡그리 지운다. //////////////////////////////////////////////////////////// string ownerID = pPC->getName(); pStmt->executeQueryString("DELETE FROM ARObject WHERE OwnerID = '" + ownerID + "'"); @@ -2364,13 +2364,13 @@ void deletePC(PlayerCreature* pPC) { pStmt->executeQueryString("DELETE FROM TrapItemObject WHERE OwnerID = '" + ownerID + "'"); //////////////////////////////////////////////////////////// - // Ŀ Ŀ Ͽ ش. + // 커플일 경우 커플 목록에서 지워준다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM CoupleInfo WHERE FemalePartnerName='%s'", ownerID.c_str()); pStmt->executeQuery("DELETE FROM CoupleInfo WHERE MalePartnerName='%s'", ownerID.c_str()); //////////////////////////////////////////////////////////// - // ִ Ʈ鵵 . + // 남아 있는 이펙트들도 지운다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM EffectAcidTouch where OwnerID='%s'", pPC->getName().c_str()); pStmt->executeQuery("DELETE FROM EffectAftermath where OwnerID='%s'", pPC->getName().c_str()); @@ -2389,17 +2389,17 @@ void deletePC(PlayerCreature* pPC) { pStmt->executeQuery("DELETE FROM EnemyErase where OwnerID='%s'", pPC->getName().c_str()); //////////////////////////////////////////////////////////// - // ÷ µ ش. + // 플래그 셋도 삭제해 준다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM FlagSet WHERE OwnerID='%s'", pPC->getName().c_str()); //////////////////////////////////////////////////////////// - // ð ۵ ش. + // 시간제한 아이템도 삭제해 준다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM TimeLimitItems WHERE OwnerID='%s'", pPC->getName().c_str()); //////////////////////////////////////////////////////////// - // ̺Ʈ ش. + // 이벤트 정보도 삭제해 준다. //////////////////////////////////////////////////////////// pStmt->executeQuery("DELETE FROM EventQuestAdvance WHERE OwnerID='%s'", pPC->getName().c_str()); } diff --git a/src/server/gameserver/CreatureUtil.h b/src/server/gameserver/CreatureUtil.h index d2b42482..db784a38 100644 --- a/src/server/gameserver/CreatureUtil.h +++ b/src/server/gameserver/CreatureUtil.h @@ -1,11 +1,11 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : CreatureUtil.h -// Written by : 輺 +// Written by : 김성민 // Description : -// Slayer Vampire ũ⸦ ִ ̱ ؼ Ǵ -// κ ̴. -// ߿ PlayerCreature Ŭ , ȿٰ -// ԽŰ ̴. +// Slayer와 Vampire 파일의 크기를 될 수 있는 한 줄이기 위해서 둘의 공통되는 +// 부분을 가능한 한 빼놓은 파일이다. +// 나중에 PlayerCreature 클래스가 나오면, 이 파일의 내용을 그 안에다가 +// 포함시키는 것이 좋을 것이다. //////////////////////////////////////////////////////////////////////////////// #ifndef __CREATURE_UTIL_H__ @@ -21,12 +21,12 @@ class PlayerCreature; class GamePlayer; //////////////////////////////////////////////////////////////////////////////// -// ũ Ŭΰ? +// 같은 크리쳐 클래스인가? //////////////////////////////////////////////////////////////////////////////// bool isSameRace(Creature* pCreature1, Creature* pCreature2); //////////////////////////////////////////////////////////////////////////////// -// ObjectID ã +// ObjectID로 아이템 찾기 //////////////////////////////////////////////////////////////////////////////// Item* findItemOID(Creature* pCreature, ObjectID_t objectID); Item* findItemOID(Creature* pCreature, ObjectID_t objectID, Item::ItemClass IClass); @@ -34,7 +34,7 @@ Item* findItemOID(Creature* pCreature, ObjectID_t objectID, int& storage, int& x Item* findItemOID(Creature* pCreature, ObjectID_t objectID, Item::ItemClass IClass, int& storage, int& x, int& y); //////////////////////////////////////////////////////////////////////////////// -// ItemID ã +// ItemID로 아이템 찾기 //////////////////////////////////////////////////////////////////////////////// Item* findItemIID(Creature* pCreature, ItemID_t itemID); Item* findItemIID(Creature* pCreature, ItemID_t itemID, Item::ItemClass IClass); @@ -42,29 +42,29 @@ Item* findItemIID(Creature* pCreature, ItemID_t itemID, int& storage, int& x, in Item* findItemIID(Creature* pCreature, ItemID_t itemID, Item::ItemClass IClass, int& storage, int& x, int& y); //////////////////////////////////////////////////////////////////////////////// -// ġ ϱ -// ̾  ũĸ ϰų, ׿ 쿡 ö󰡴 ġ -// ϴ Լ +// 경험치 계산하기 +// 뱀파이어가 어떤 크리쳐를 흡혈하거나, 죽였을 경우에 올라가는 경험치를 +// 계산하는 함수 //////////////////////////////////////////////////////////////////////////////// -const int BLOODDRAIN_EXP = 70; // 70% -const int KILL_EXP = 30; // ׿ 30% +const int BLOODDRAIN_EXP = 70; // 흡혈했을 경우는 70% +const int KILL_EXP = 30; // 죽였을 경우는 30% int computeCreatureExp(Creature* pCreature, int percent, Ousters* pOusters = NULL); int computeBloodDrainHealPoint(Creature* pCreature, int percent); //////////////////////////////////////////////////////////////////////////////// -// ̺Ʈ ˻ϱ... +// 이벤트용 몹인지 검사하기... //////////////////////////////////////////////////////////////////////////////// bool isEventMonster(Creature* pCreature); //////////////////////////////////////////////////////////////////////////////// -// ũİ ִ ΰ ˻ϴ Լ +// 임의의 크리쳐가 현재 움직일 수 있는 상태인가를 검사하는 함수 //////////////////////////////////////////////////////////////////////////////// bool isAbleToMove(Creature* pCreature); //////////////////////////////////////////////////////////////////////////////// -// ũİ ִ ΰ ˻ϴ Լ +// 임의의 크리쳐가 현재 기술을 사용할 수 있는 상태인가를 검사하는 함수 //////////////////////////////////////////////////////////////////////////////// bool isAbleToUseSelfSkill(Creature* pCreature, SkillType_t SkillType = 0); bool isAbleToUseObjectSkill(Creature* pCreature, SkillType_t SkillType = 0); @@ -72,7 +72,7 @@ bool isAbleToUseTileSkill(Creature* pCreature, SkillType_t SkillType = 0); bool isAbleToUseInventorySkill(Creature* pCreature, BYTE X, BYTE Y, BYTE TX, BYTE TY, SkillType_t SkillType = 0); //////////////////////////////////////////////////////////////////////////////// -// ũİ ִ ΰ ˻ϴ Լ +// 임의의 크리쳐가 아이템을 주을 수 있는 상태인가를 검사하는 함수 //////////////////////////////////////////////////////////////////////////////// bool isAbleToPickupItem(Creature* pCreature, Item* pItem); bool canDropToZone(Creature* pCreature, Item* pItem); diff --git a/src/server/gameserver/DarkLightInfo.h b/src/server/gameserver/DarkLightInfo.h index cbd38edd..1607aacb 100644 --- a/src/server/gameserver/DarkLightInfo.h +++ b/src/server/gameserver/DarkLightInfo.h @@ -39,18 +39,18 @@ class DarkLightInfo { string toString() const; private: - // ӱ - // 0 - 15 , ȭ ο. + // 어둡기 레벨 + // 0 - 15 사이의 값으로, 높을 수록 화면이 어두워진다. DarkLevel_t m_DarkLevel; - // ũ - // 1 - 13 , Ŀ. + // 빛의 크기 + // 1 - 13 사이의 값으로, 높을 수록 빛의 범위가 커진다. LightLevel_t m_LightLevel; }; //////////////////////////////////////////////////////////////////////////////// -// DLIM DLI 迭 ũ +// DLIM 의 내부 DLI 의 배열의 크기 //////////////////////////////////////////////////////////////////////////////// const uint nDarkLightInfos = 12 * 24 * 6; diff --git a/src/server/gameserver/DefaultOptionSetInfo.cpp b/src/server/gameserver/DefaultOptionSetInfo.cpp index fbe48844..a9a0d907 100644 --- a/src/server/gameserver/DefaultOptionSetInfo.cpp +++ b/src/server/gameserver/DefaultOptionSetInfo.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : DefaultOptionSetInfo.cpp -// Written By : +// Written By : 배재형 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/DefaultOptionSetInfo.h b/src/server/gameserver/DefaultOptionSetInfo.h index 0d914dc1..f1303759 100644 --- a/src/server/gameserver/DefaultOptionSetInfo.h +++ b/src/server/gameserver/DefaultOptionSetInfo.h @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : DefaultOptionSetInfo.h -// Written By : +// Written By : 배재형 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -18,7 +18,7 @@ enum DefaultOptionSetTypes { - DEFAULT_OPTION_SET_FAMILY_PAY, // 0. йи . +7 + DEFAULT_OPTION_SET_FAMILY_PAY, // 0. 패밀리 요금제용. 모든저항 +7 DEFAULT_OPTION_SET_MAX }; diff --git a/src/server/gameserver/Directive.h b/src/server/gameserver/Directive.h index 4366ab25..89de7a0b 100644 --- a/src/server/gameserver/Directive.h +++ b/src/server/gameserver/Directive.h @@ -1,9 +1,9 @@ //////////////////////////////////////////////////////////////////////// // Filename : Directive.h -// Written By : 輺 +// Written By : 김성민 // Description : -// MonsterAI ൿ ϴ Directive DirectiveSet -// س ̴. +// MonsterAI에서 행동을 결정하는 Directive와 DirectiveSet을 +// 구현해놓은 파일이다. //////////////////////////////////////////////////////////////////////// #ifndef __DIRECTIVE_H__ @@ -15,7 +15,7 @@ #include "Types.h" //////////////////////////////////////////////////////////////////////// -// +// 조건 상수 //////////////////////////////////////////////////////////////////////// enum { @@ -132,7 +132,7 @@ const string DirectiveCondition2String[] = {"EnemyRangeMelee", // 0 "ConditionMAX"}; //////////////////////////////////////////////////////////////////////// -// ൿ +// 행동 상수 //////////////////////////////////////////////////////////////////////// enum { @@ -165,9 +165,9 @@ const string DirectiveAction2String[] = {"Approach", // 0 //////////////////////////////////////////////////////////////////////// // class Directive // -// ϳ ׼ǿ ǵ Ŭ̴. -// ǰ, ׼ǿ ʿ Ķ, ׸ Ȯ, ߿伺 -// ij Ŭ... +// 하나의 액션에 대한 임의의 조건들을 집어넣은 클래스이다. +// 즉 조건과, 그 액션에 필요한 파라미터, 그리고 확률, 중요성 등을 +// 뭉쳐놓은 클래스... //////////////////////////////////////////////////////////////////////// class Directive { @@ -231,10 +231,10 @@ class Directive { //////////////////////////////////////////////////////////////////////// // class DirectiveSet // -// Directive Ŭ ̴. Directive Weight -// ̿Ͽ ϰ ߴµ, Ʈ -// ϴ Ƽ ׳ ִ 켱 -// νϵ ߴ.(MonsterAI ) +// Directive 클래스의 집합이다. 원래 Directive의 Weight 변수를 +// 이용하여 소팅을 가능하게 만들려고 했는데, 생각보다 리스트를 +// 소팅하는 게 귀찮아서 그냥 집어넣는 순서대로 우선순위가 높은 것으로 +// 인식하도록 했다.(MonsterAI 참조) //////////////////////////////////////////////////////////////////////// class DirectiveSet { @@ -301,32 +301,32 @@ class DirectiveSetManager { ~DirectiveSetManager(); public: - // ü ʱȭѴ. + // 객체를 초기화한다. void init(); - // DBκ directive set εѴ. + // DB로부터 directive set을 로드한다. void load(); - // Ÿ directive set ͸ ȯѴ. + // 지정된 타입의 directive set 포인터를 반환한다. DirectiveSet* getDirectiveSet(uint index); protected: - // ڿ Ľؼ ε directive set Ѵ. + // 문자열을 파싱해서 지정된 인덱스에 directive set을 생성한다. void createDirectiveSet(uint index, const string& name, const string& text, const string& deadtext); - // directive Ķ͵ ĽѴ. + // directive에 딸려오는 파라미터들을 파싱한다. void parseDirectiveParameter(Directive* pDirective, const string& text, int mode); - // ڿκ condition Ѵ. + // 문자열로부터 condition 값을 리턴한다. int getCondition(const string& token); - // ڿκ action Ѵ. + // 문자열로부터 action 값을 리턴한다. int getAction(const string& token); - // ڿκ Ķ Ѵ. + // 문자열로부터 파라미터 값을 리턴한다. int getParameter(const string& token); - // ڿκ Ȯ Ѵ. + // 문자열로부터 확률을 리턴한다. int getRatio(const string& token); diff --git a/src/server/gameserver/DynamicZone.h b/src/server/gameserver/DynamicZone.h index 8b3500d5..7ba0522b 100644 --- a/src/server/gameserver/DynamicZone.h +++ b/src/server/gameserver/DynamicZone.h @@ -27,11 +27,11 @@ class DynamicZone { virtual ~DynamicZone(); public: - virtual void init() {} // ̳ ʱȭ - virtual void heartbeat() {} // ̳ ƮƮ + virtual void init() {} // 다이나믹 존 초기화 + virtual void heartbeat() {} // 다이나믹 존 하트비트 public: - // DynamicZone  ZoneGroup ߰Ѵ. + // 새로 DynamicZone을 만들어서 ZoneGroup 에 추가한다. void makeDynamicZone(); ZoneID_t getTemplateZoneID() const { diff --git a/src/server/gameserver/DynamicZoneAlterOfBlood.cpp b/src/server/gameserver/DynamicZoneAlterOfBlood.cpp index 33ed0053..ea9bfb5d 100644 --- a/src/server/gameserver/DynamicZoneAlterOfBlood.cpp +++ b/src/server/gameserver/DynamicZoneAlterOfBlood.cpp @@ -38,9 +38,9 @@ struct OFFERING_TEMPLATE { string Name[5]; }; -const OFFERING_TEMPLATE OfferingTemplate[3] = {{793, {"Լѷ", "", "", "˹̹", "·˹"}}, - {794, {"ղķ˹", "ɪ", "", "¬˹", "¬"}}, - {795, {"˹", "Ф", "¬˹", "ղ", "Ŭ"}}}; +const OFFERING_TEMPLATE OfferingTemplate[3] = {{793, {"Ô¼º²Ñ·", "±ÈÁ¦", "Àí²éµÂ", "°£Ë¹¿¨Ì¹", "·Ò×˹"}}, + {794, {"ղķ˹", "¿­Éª", "ÅÂÒ×", "ÄáÄǬ˹", "¬"}}, + {795, {"ÅåË¹ÌØ", "Ф", "°¢Â¬Ë¹", "Õ²ç÷", "¸ñŬ"}}}; struct OFFERING_COORDINATE { ZoneCoord_t X; @@ -125,7 +125,7 @@ void DynamicZoneAlterOfBlood::heartbeat() { bool DynamicZoneAlterOfBlood::checkPC() { Assert(m_pZone != NULL); - // PC üũ + // PC ¼ö üũ uint size = m_pZone->getPCManager()->getSize(); return size != 0; @@ -135,7 +135,7 @@ bool DynamicZoneAlterOfBlood::addOffering() { Assert(m_pZone != NULL); for (int i = 0; i < 5; ++i) { - // Ͽ ߰Ѵ. ʹ + // Á¦¹°À» »ý¼ºÇÏ¿© Ãß°¡ÇÑ´Ù. Á¦¹°Àº ³ú°¡ ¾ø´Â ¸ó½ºÅÍ´Ù Monster* pMonster = new Monster(OfferingTemplate[m_Race].MonsterType); Assert(pMonster != NULL); @@ -203,7 +203,7 @@ bool DynamicZoneAlterOfBlood::clearOffering() { } bool DynamicZoneAlterOfBlood::openGateToOut() { - // Ʈ Ų. + // Äù½ºÆ®¸¦ ÁøÇà½ÃŲ´Ù. unordered_map::const_iterator itr = m_pZone->getPCManager()->getCreatures().begin(); unordered_map::const_iterator endItr = m_pZone->getPCManager()->getCreatures().end(); @@ -219,7 +219,7 @@ bool DynamicZoneAlterOfBlood::openGateToOut() { } } - // Ż ġ ãƼ EffectTilePortal . + // Æ÷Å» À§Ä¡¸¦ ã¾Æ¼­ ±× À§¿¡´Ù EffectTilePortal À» º¸³½´Ù. int tx = -1; int ty = -1; for (int x = 0; x < m_pZone->getWidth(); x++) { @@ -246,7 +246,7 @@ bool DynamicZoneAlterOfBlood::openGateToOut() { } void DynamicZoneAlterOfBlood::processEntering() { - // Ʈ ˸ + // Äù½ºÆ® Á¸¿¡ µé¾î¿ÔÀ½À» ¾Ë¸°´Ù unordered_map::const_iterator itr = m_pZone->getPCManager()->getCreatures().begin(); unordered_map::const_iterator endItr = m_pZone->getPCManager()->getCreatures().end(); diff --git a/src/server/gameserver/DynamicZoneAlterOfBlood.h b/src/server/gameserver/DynamicZoneAlterOfBlood.h index 857752bc..42824f75 100644 --- a/src/server/gameserver/DynamicZoneAlterOfBlood.h +++ b/src/server/gameserver/DynamicZoneAlterOfBlood.h @@ -17,8 +17,8 @@ class DynamicZoneAlterOfBlood : public DynamicZone { virtual ~DynamicZoneAlterOfBlood(); public: - void init(); // ̳ ʱȭ - void heartbeat(); // ̳ ƮƮ + void init(); // 다이나믹 존 초기화 + void heartbeat(); // 다이나믹 존 하트비트 public: bool checkPC(); diff --git a/src/server/gameserver/DynamicZoneFactoryManager.cpp b/src/server/gameserver/DynamicZoneFactoryManager.cpp index 090b37ea..d7e75366 100644 --- a/src/server/gameserver/DynamicZoneFactoryManager.cpp +++ b/src/server/gameserver/DynamicZoneFactoryManager.cpp @@ -21,10 +21,10 @@ DynamicZoneFactoryManager::DynamicZoneFactoryManager() : m_Factories(NULL), m_Size(DYNAMIC_ZONE_MAX) { Assert(m_Size > 0); - // 丮迭 Ѵ. + // 컨디션팩토리배열을 생성한다. m_Factories = new DynamicZoneFactory*[m_Size]; - // 丮 ͵ NULL ʱȭѴ. + // 팩토리에 대한 포인터들을 NULL 로 초기화한다. for (int i = 0; i < m_Size; i++) m_Factories[i] = NULL; } @@ -36,7 +36,7 @@ DynamicZoneFactoryManager::DynamicZoneFactoryManager() : m_Factories(NULL), m_Si DynamicZoneFactoryManager::~DynamicZoneFactoryManager() { Assert(m_Factories != NULL); - // 丮 Ѵ. + // 각각의 컨디션팩토리들을 삭제한다. for (int i = 0; i < m_Size; i++) { if (m_Factories[i] != NULL) { delete m_Factories[i]; @@ -44,14 +44,14 @@ DynamicZoneFactoryManager::~DynamicZoneFactoryManager() { } } - // 丮迭 Ѵ. + // 컨디션팩토리배열을 삭제한다. delete[] m_Factories; m_Factories = NULL; } //////////////////////////////////////////////////////////////////////////////// -// ǵ 丮 ⿡ ߰Ѵ. +// 정의된 모든 컨디션팩토리들을 여기에 추가한다. //////////////////////////////////////////////////////////////////////////////// void DynamicZoneFactoryManager::init() { addFactory(new DynamicZoneGateOfAlterFactory()); @@ -75,7 +75,7 @@ void DynamicZoneFactoryManager::addFactory(DynamicZoneFactory* pFactory) { Assert(false); } - // 丮 Ѵ. + // 컨디션팩토리를 등록한다. m_Factories[pFactory->getDynamicZoneType()] = pFactory; } @@ -99,8 +99,8 @@ DynamicZone* DynamicZoneFactoryManager::createDynamicZone(int dynamicZoneType) c // get dynamiczone name with dynamiczone type //////////////////////////////////////////////////////////////////////////////// string DynamicZoneFactoryManager::getDynamicZoneName(int dynamicZoneType) const { - // Ÿ Ѿ ؼ Seg.Fault ߻ ʵ. - // ̷ ڴ © Ѵ. + // 타입이 범위를 넘어섬으로 인해서 Seg.Fault 가 발생하지 않도록. + // 이런 사용자는 당장 짤라야 한다. if (dynamicZoneType >= m_Size || m_Factories[dynamicZoneType] == NULL) { StringStream msg; msg << "invalid dynamiczone type (" << dynamicZoneType << ")"; diff --git a/src/server/gameserver/DynamicZoneGateOfAlter.cpp b/src/server/gameserver/DynamicZoneGateOfAlter.cpp index db226028..0c772877 100644 --- a/src/server/gameserver/DynamicZoneGateOfAlter.cpp +++ b/src/server/gameserver/DynamicZoneGateOfAlter.cpp @@ -152,7 +152,7 @@ void DynamicZoneGateOfAlter::heartbeat() { bool DynamicZoneGateOfAlter::addTileEffect() { Assert(m_pZone != NULL); - // ٴڿ Ʈ . + // 바닥에 이펙트를 깐다. for (ZoneCoord_t x = 0; x < m_pZone->getWidth(); ++x) // for ( ZoneCoord_t x = 15; x <= 17; ++x ) { @@ -160,21 +160,21 @@ bool DynamicZoneGateOfAlter::addTileEffect() { // for ( ZoneCoord_t y = 15; y <= 17; ++y ) { if (EffectMask[y][x] != 0) { - // Ÿ ͼ Ʈ ִ Ȯ + // 타일을 가져와서 이펙트를 생성할 수 있는지 확인 Tile& tile = m_pZone->getTile(x, y); if (!tile.canAddEffect() || tile.hasEffect()) continue; - // Ʈ Ʈ + // 이펙트 오브젝트 생성 EffectDeleteTile* pEffect = new EffectDeleteTile(m_pZone, x, y); pEffect->setDeadline(999999); - // OID + // 존에 OID 등록 m_pZone->registerObject(pEffect); m_pZone->addEffect(pEffect); - // Ÿ ̱ + // 타일 에 붙이기 tile.addEffect(pEffect); } } @@ -186,7 +186,7 @@ bool DynamicZoneGateOfAlter::addTileEffect() { bool DynamicZoneGateOfAlter::checkPC() { Assert(m_pZone != NULL); - // PC üũ + // PC 수 체크 uint size = m_pZone->getPCManager()->getSize(); return size != 0; @@ -195,7 +195,7 @@ bool DynamicZoneGateOfAlter::checkPC() { bool DynamicZoneGateOfAlter::checkNoEffect() { Assert(m_pZone != NULL); - // Ʈ üũ + // 이펙트 수 체크 uint size = m_pZone->getEffectManager()->getSize(); // char msg[8]; @@ -210,7 +210,7 @@ bool DynamicZoneGateOfAlter::checkNoEffect() { bool DynamicZoneGateOfAlter::openGateToAlter() { Assert(m_pZone != NULL); - // Ʈ Ų. + // 퀘스트를 진행시킨다. unordered_map::const_iterator itr = m_pZone->getPCManager()->getCreatures().begin(); unordered_map::const_iterator endItr = m_pZone->getPCManager()->getCreatures().end(); @@ -225,7 +225,7 @@ bool DynamicZoneGateOfAlter::openGateToAlter() { } } - // Ż ġ ãƼ EffectTilePortal . + // 포탈 위치를 찾아서 그 위에다 EffectTilePortal 을 보낸다. int tx = -1; int ty = -1; for (int x = 0; x < m_pZone->getWidth(); x++) { @@ -254,7 +254,7 @@ bool DynamicZoneGateOfAlter::openGateToAlter() { bool DynamicZoneGateOfAlter::removeTileEffect() { Assert(m_pZone != NULL); - // Ʈ . + // 모든 이펙트를 지운다. m_pZone->getEffectManager()->setTimeOutAllEffect(); return true; @@ -283,7 +283,7 @@ void DynamicZoneGateOfAlter::removeEffect(ZoneCoord_t x, ZoneCoord_t y) { void DynamicZoneGateOfAlter::addFakeEffect() { Assert(m_pZone != NULL); - // Żġ FakeEffect . + // 모든 포탈위치로 FakeEffect 를 보낸다. for (int x = 0; x < m_pZone->getWidth(); x++) { for (int y = 0; y < m_pZone->getHeight(); y++) { Tile& tile = m_pZone->getTile(x, y); @@ -299,7 +299,7 @@ void DynamicZoneGateOfAlter::addFakeEffect() { } void DynamicZoneGateOfAlter::processEntering() { - // Ʈ ˸. + // 퀘스트 존에 들어왔음을 알린다. unordered_map::const_iterator itr = m_pZone->getPCManager()->getCreatures().begin(); unordered_map::const_iterator endItr = m_pZone->getPCManager()->getCreatures().end(); diff --git a/src/server/gameserver/DynamicZoneGateOfAlter.h b/src/server/gameserver/DynamicZoneGateOfAlter.h index b70a4d1f..3c5b75d3 100644 --- a/src/server/gameserver/DynamicZoneGateOfAlter.h +++ b/src/server/gameserver/DynamicZoneGateOfAlter.h @@ -17,8 +17,8 @@ class DynamicZoneGateOfAlter : public DynamicZone { virtual ~DynamicZoneGateOfAlter(); public: - void init(); // ̳ ʱȭ - void heartbeat(); // ̳ ƮƮ + void init(); // 다이나믹 존 초기화 + void heartbeat(); // 다이나믹 존 하트비트 public: bool checkPC(); diff --git a/src/server/gameserver/DynamicZoneGroup.cpp b/src/server/gameserver/DynamicZoneGroup.cpp index 3180bb71..85a5e541 100644 --- a/src/server/gameserver/DynamicZoneGroup.cpp +++ b/src/server/gameserver/DynamicZoneGroup.cpp @@ -45,7 +45,7 @@ void DynamicZoneGroup::addDynamicZone(DynamicZone* pDynamicZone) { } bool DynamicZoneGroup::canEnter() { - // ִ DynamicZone ߿ ã´. + // 현재 있는 DynamicZone 중에서 가능한 넘을 찾는다. HashMapDynamicZoneItor itr = m_DynamicZones.begin(); HashMapDynamicZoneItor endItr = m_DynamicZones.end(); @@ -59,7 +59,7 @@ bool DynamicZoneGroup::canEnter() { } DynamicZone* DynamicZoneGroup::getAvailableDynamicZone() { - // ִ DynamicZone ߿ ã´. + // 현재 있는 DynamicZone 중에서 가능한 넘을 찾는다. HashMapDynamicZoneItor itr = m_DynamicZones.begin(); HashMapDynamicZoneItor endItr = m_DynamicZones.end(); @@ -71,8 +71,8 @@ DynamicZone* DynamicZoneGroup::getAvailableDynamicZone() { } } - // ִ DynamicZone ߿ . - // DynamicZone . + // 현재 있는 DynamicZone 중에는 가능한 넘이 없다. + // 새로 DynamicZone 을 만든다. DynamicZone* pDynamicZone = NULL; pDynamicZone = g_pDynamicZoneFactoryManager->createDynamicZone(m_DynamicZoneType); diff --git a/src/server/gameserver/DynamicZoneGroup.h b/src/server/gameserver/DynamicZoneGroup.h index 38f4de41..c0201072 100644 --- a/src/server/gameserver/DynamicZoneGroup.h +++ b/src/server/gameserver/DynamicZoneGroup.h @@ -54,7 +54,7 @@ class DynamicZoneGroup { private: int m_DynamicZoneType; - ZoneID_t m_TemplateZoneID; // Ʋ Ǵ ID + ZoneID_t m_TemplateZoneID; // 틀이 되는 존의 ID HashMapDynamicZone m_DynamicZones; uint m_MaxSize; }; diff --git a/src/server/gameserver/DynamicZoneInfo.cpp b/src/server/gameserver/DynamicZoneInfo.cpp index fc493b91..ba6c4e5c 100644 --- a/src/server/gameserver/DynamicZoneInfo.cpp +++ b/src/server/gameserver/DynamicZoneInfo.cpp @@ -30,7 +30,7 @@ DynamicZoneInfoManager::~DynamicZoneInfoManager() { } void DynamicZoneInfoManager::init() { - // Ա ߰ + // 제단 입구 존 추가 { DynamicZoneInfo* pDynamicZoneInfo = new DynamicZoneInfo; pDynamicZoneInfo->setDynamicZoneType(DYNAMIC_ZONE_GATE_OF_ALTER); @@ -39,7 +39,7 @@ void DynamicZoneInfoManager::init() { addDynamicZoneInfo(pDynamicZoneInfo); } - // ߰ + // 피의 제단 존 추가 { DynamicZoneInfo* pDynamicZoneInfo = new DynamicZoneInfo; pDynamicZoneInfo->setDynamicZoneType(DYNAMIC_ZONE_ALTER_OF_BLOOD); @@ -48,7 +48,7 @@ void DynamicZoneInfoManager::init() { addDynamicZoneInfo(pDynamicZoneInfo); } - // ̾ ɿ ſ ߰ + // 슬레이어 심연의 거울 존 추가 { DynamicZoneInfo* pDynamicZoneInfo = new DynamicZoneInfo; pDynamicZoneInfo->setDynamicZoneType(DYNAMIC_ZONE_SLAYER_MIRROR_OF_ABYSS); @@ -57,7 +57,7 @@ void DynamicZoneInfoManager::init() { addDynamicZoneInfo(pDynamicZoneInfo); } - // ̾ ɿ ſ ߰ + // 뱀파이어 심연의 거울 존 추가 { DynamicZoneInfo* pDynamicZoneInfo = new DynamicZoneInfo; pDynamicZoneInfo->setDynamicZoneType(DYNAMIC_ZONE_VAMPIRE_MIRROR_OF_ABYSS); @@ -66,7 +66,7 @@ void DynamicZoneInfoManager::init() { addDynamicZoneInfo(pDynamicZoneInfo); } - // ƿ콺 ɿ ſ ߰ + // 아우스터즈 심연의 거울 존 추가 { DynamicZoneInfo* pDynamicZoneInfo = new DynamicZoneInfo; pDynamicZoneInfo->setDynamicZoneType(DYNAMIC_ZONE_OUSTERS_MIRROR_OF_ABYSS); diff --git a/src/server/gameserver/DynamicZoneInfo.h b/src/server/gameserver/DynamicZoneInfo.h index e45394b0..76077d7f 100644 --- a/src/server/gameserver/DynamicZoneInfo.h +++ b/src/server/gameserver/DynamicZoneInfo.h @@ -45,7 +45,7 @@ class DynamicZoneInfo { private: int m_DynamicZoneType; // DynamicZoneType - ZoneID_t m_TemplateZoneID; // ̳ Ʋ̵Ǵ ID + ZoneID_t m_TemplateZoneID; // 다이나믹 존의 틀이되는 존 ID }; diff --git a/src/server/gameserver/DynamicZoneManager.cpp b/src/server/gameserver/DynamicZoneManager.cpp index 69c0874a..6bd0759c 100644 --- a/src/server/gameserver/DynamicZoneManager.cpp +++ b/src/server/gameserver/DynamicZoneManager.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // DynamicZoneManager.cpp -// ϴ ϴ +// 서버에서 생겼다 사라졌다하는 존을 관리하는 넘 ///////////////////////////////////////////////////////////////////////////// // include files @@ -13,8 +13,8 @@ // global variable DynamicZoneManager* g_pDynamicZoneManager = NULL; -// DynamicZoneID ġ -// 鶧 1 +// 새로 만들기 시작할 DynamicZoneID 시작 위치 +// 만들때마다 1 씩 증가 const ZoneID_t StartDynamicZoneID = 15001; // constructor @@ -28,10 +28,10 @@ DynamicZoneManager::~DynamicZoneManager() { } void DynamicZoneManager::init() { - // DynamicZoneGroup ߰. + // DynamicZoneGroup 추가. 수동 { - // Ա + // 제단 입구 DynamicZoneGroup* pDynamicZoneGroup = new DynamicZoneGroup(); pDynamicZoneGroup->setDynamicZoneType(DYNAMIC_ZONE_GATE_OF_ALTER); pDynamicZoneGroup->setTemplateZoneID( @@ -41,7 +41,7 @@ void DynamicZoneManager::init() { } { - // + // 피의 제단 DynamicZoneGroup* pDynamicZoneGroup = new DynamicZoneGroup(); pDynamicZoneGroup->setDynamicZoneType(DYNAMIC_ZONE_ALTER_OF_BLOOD); pDynamicZoneGroup->setTemplateZoneID( @@ -51,7 +51,7 @@ void DynamicZoneManager::init() { } { - // ̾ ɿ ſ + // 슬레이어 심연의 거울 DynamicZoneGroup* pDynamicZoneGroup = new DynamicZoneGroup(); pDynamicZoneGroup->setDynamicZoneType(DYNAMIC_ZONE_SLAYER_MIRROR_OF_ABYSS); pDynamicZoneGroup->setTemplateZoneID( @@ -61,7 +61,7 @@ void DynamicZoneManager::init() { } { - // ̾ ɿ ſ + // 뱀파이어 심연의 거울 DynamicZoneGroup* pDynamicZoneGroup = new DynamicZoneGroup(); pDynamicZoneGroup->setDynamicZoneType(DYNAMIC_ZONE_VAMPIRE_MIRROR_OF_ABYSS); pDynamicZoneGroup->setTemplateZoneID( @@ -71,7 +71,7 @@ void DynamicZoneManager::init() { } { - // ƿ콺 ɿ ſ + // 아우스터즈 심연의 거울 DynamicZoneGroup* pDynamicZoneGroup = new DynamicZoneGroup(); pDynamicZoneGroup->setDynamicZoneType(DYNAMIC_ZONE_OUSTERS_MIRROR_OF_ABYSS); pDynamicZoneGroup->setTemplateZoneID( diff --git a/src/server/gameserver/DynamicZoneManager.h b/src/server/gameserver/DynamicZoneManager.h index ab148c9c..e3146bf0 100644 --- a/src/server/gameserver/DynamicZoneManager.h +++ b/src/server/gameserver/DynamicZoneManager.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // DynamicZoneManager.h -// ϴ ϴ +// 서버에서 생겼다 사라졌다하는 존을 관리하는 넘 ///////////////////////////////////////////////////////////////////////////// #ifndef __DYNAMIC_ZONE_MANAGER_H__ @@ -30,10 +30,10 @@ class DynamicZoneManager { void init(); void clear(); - // DynamicZoneGroup ߰Ѵ. + // 새로 DynamicZoneGroup 을 추가한다. void addDynamicZoneGroup(DynamicZoneGroup* pDynamicZoneGroup); - // DynamicZoneGroup ãƼ ȯѴ. + // DynamicZoneGroup 을 찾아서 반환한다. DynamicZoneGroup* getDynamicZoneGroup(int dynamicZoneType); // get new dynamic zone id diff --git a/src/server/gameserver/DynamicZoneOustersMirrorOfAbyss.cpp b/src/server/gameserver/DynamicZoneOustersMirrorOfAbyss.cpp index ba925cce..04b22dfa 100644 --- a/src/server/gameserver/DynamicZoneOustersMirrorOfAbyss.cpp +++ b/src/server/gameserver/DynamicZoneOustersMirrorOfAbyss.cpp @@ -111,7 +111,7 @@ void DynamicZoneOustersMirrorOfAbyss::heartbeat() { bool DynamicZoneOustersMirrorOfAbyss::checkPC() { Assert(m_pZone != NULL); - // PC üũ + // PC 수 체크 uint size = m_pZone->getPCManager()->getSize(); return size != 0; @@ -120,11 +120,11 @@ bool DynamicZoneOustersMirrorOfAbyss::checkPC() { bool DynamicZoneOustersMirrorOfAbyss::addMono() { Assert(m_pZone != NULL); - // ̼ Ѵ. + // 이성의 봉인을 생성한다. Monster* pMonster = new Monster(792); Assert(pMonster != NULL); - pMonster->setName("֮ӡ"); + pMonster->setName("잿昑裂룐丹"); pMonster->setClanType(33); try { @@ -161,7 +161,7 @@ bool DynamicZoneOustersMirrorOfAbyss::clearMono() { bool DynamicZoneOustersMirrorOfAbyss::openGateToOut() { Assert(m_pZone != NULL); - // Ʈ Ų. + // 퀘스트를 진행시킨다. unordered_map::const_iterator itr = m_pZone->getPCManager()->getCreatures().begin(); unordered_map::const_iterator endItr = m_pZone->getPCManager()->getCreatures().end(); @@ -192,7 +192,7 @@ bool DynamicZoneOustersMirrorOfAbyss::checkComplete() { void DynamicZoneOustersMirrorOfAbyss::processEntering() { Assert(m_pZone != NULL); - // Ʈ ˸. + // 퀘스트 존에 들어왔음을 알린다. unordered_map::const_iterator itr = m_pZone->getPCManager()->getCreatures().begin(); unordered_map::const_iterator endItr = m_pZone->getPCManager()->getCreatures().end(); @@ -221,7 +221,7 @@ bool DynamicZoneOustersMirrorOfAbyss::checkMono() { void DynamicZoneOustersMirrorOfAbyss::killPC() { Assert(m_pZone != NULL); - // PC δ. + // PC 를 죽인다. unordered_map::const_iterator itr = m_pZone->getPCManager()->getCreatures().begin(); unordered_map::const_iterator endItr = m_pZone->getPCManager()->getCreatures().end(); diff --git a/src/server/gameserver/DynamicZoneOustersMirrorOfAbyss.h b/src/server/gameserver/DynamicZoneOustersMirrorOfAbyss.h index 688980c7..a2fd44fe 100644 --- a/src/server/gameserver/DynamicZoneOustersMirrorOfAbyss.h +++ b/src/server/gameserver/DynamicZoneOustersMirrorOfAbyss.h @@ -17,8 +17,8 @@ class DynamicZoneOustersMirrorOfAbyss : public DynamicZone { virtual ~DynamicZoneOustersMirrorOfAbyss(); public: - void init(); // ̳ ʱȭ - void heartbeat(); // ̳ ƮƮ + void init(); // 다이나믹 존 초기화 + void heartbeat(); // 다이나믹 존 하트비트 public: bool checkPC(); diff --git a/src/server/gameserver/DynamicZoneSlayerMirrorOfAbyss.cpp b/src/server/gameserver/DynamicZoneSlayerMirrorOfAbyss.cpp index dd7062ab..3caa700d 100644 --- a/src/server/gameserver/DynamicZoneSlayerMirrorOfAbyss.cpp +++ b/src/server/gameserver/DynamicZoneSlayerMirrorOfAbyss.cpp @@ -111,7 +111,7 @@ void DynamicZoneSlayerMirrorOfAbyss::heartbeat() { bool DynamicZoneSlayerMirrorOfAbyss::checkPC() { Assert(m_pZone != NULL); - // PC üũ + // PC 수 체크 uint size = m_pZone->getPCManager()->getSize(); return size != 0; @@ -120,11 +120,11 @@ bool DynamicZoneSlayerMirrorOfAbyss::checkPC() { bool DynamicZoneSlayerMirrorOfAbyss::addMono() { Assert(m_pZone != NULL); - // ̼ Ѵ. + // 이성의 봉인을 생성한다. Monster* pMonster = new Monster(792); Assert(pMonster != NULL); - pMonster->setName("֮ӡ"); + pMonster->setName("잿昑裂룐丹"); pMonster->setClanType(33); try { @@ -161,7 +161,7 @@ bool DynamicZoneSlayerMirrorOfAbyss::clearMono() { bool DynamicZoneSlayerMirrorOfAbyss::openGateToOut() { Assert(m_pZone != NULL); - // Ʈ Ų. + // 퀘스트를 진행시킨다. unordered_map::const_iterator itr = m_pZone->getPCManager()->getCreatures().begin(); unordered_map::const_iterator endItr = m_pZone->getPCManager()->getCreatures().end(); @@ -192,7 +192,7 @@ bool DynamicZoneSlayerMirrorOfAbyss::checkComplete() { void DynamicZoneSlayerMirrorOfAbyss::processEntering() { Assert(m_pZone != NULL); - // Ʈ ˸. + // 퀘스트 존에 들어왔음을 알린다. unordered_map::const_iterator itr = m_pZone->getPCManager()->getCreatures().begin(); unordered_map::const_iterator endItr = m_pZone->getPCManager()->getCreatures().end(); @@ -221,7 +221,7 @@ bool DynamicZoneSlayerMirrorOfAbyss::checkMono() { void DynamicZoneSlayerMirrorOfAbyss::killPC() { Assert(m_pZone != NULL); - // PC δ. + // PC 를 죽인다. unordered_map::const_iterator itr = m_pZone->getPCManager()->getCreatures().begin(); unordered_map::const_iterator endItr = m_pZone->getPCManager()->getCreatures().end(); diff --git a/src/server/gameserver/DynamicZoneSlayerMirrorOfAbyss.h b/src/server/gameserver/DynamicZoneSlayerMirrorOfAbyss.h index 34881986..01b4bd4a 100644 --- a/src/server/gameserver/DynamicZoneSlayerMirrorOfAbyss.h +++ b/src/server/gameserver/DynamicZoneSlayerMirrorOfAbyss.h @@ -17,8 +17,8 @@ class DynamicZoneSlayerMirrorOfAbyss : public DynamicZone { virtual ~DynamicZoneSlayerMirrorOfAbyss(); public: - void init(); // ̳ ʱȭ - void heartbeat(); // ̳ ƮƮ + void init(); // 다이나믹 존 초기화 + void heartbeat(); // 다이나믹 존 하트비트 public: bool checkPC(); diff --git a/src/server/gameserver/DynamicZoneVampireMirrorOfAbyss.cpp b/src/server/gameserver/DynamicZoneVampireMirrorOfAbyss.cpp index 4e74ee03..350a2c86 100644 --- a/src/server/gameserver/DynamicZoneVampireMirrorOfAbyss.cpp +++ b/src/server/gameserver/DynamicZoneVampireMirrorOfAbyss.cpp @@ -111,7 +111,7 @@ void DynamicZoneVampireMirrorOfAbyss::heartbeat() { bool DynamicZoneVampireMirrorOfAbyss::checkPC() { Assert(m_pZone != NULL); - // PC üũ + // PC 수 체크 uint size = m_pZone->getPCManager()->getSize(); return size != 0; @@ -120,11 +120,11 @@ bool DynamicZoneVampireMirrorOfAbyss::checkPC() { bool DynamicZoneVampireMirrorOfAbyss::addMono() { Assert(m_pZone != NULL); - // ̼ Ѵ. + // 이성의 봉인을 생성한다. Monster* pMonster = new Monster(792); Assert(pMonster != NULL); - pMonster->setName("֮ӡ"); + pMonster->setName("잿昑裂룐丹"); pMonster->setClanType(33); try { @@ -161,7 +161,7 @@ bool DynamicZoneVampireMirrorOfAbyss::clearMono() { bool DynamicZoneVampireMirrorOfAbyss::openGateToOut() { Assert(m_pZone != NULL); - // Ʈ Ų. + // 퀘스트를 진행시킨다. unordered_map::const_iterator itr = m_pZone->getPCManager()->getCreatures().begin(); unordered_map::const_iterator endItr = m_pZone->getPCManager()->getCreatures().end(); @@ -192,7 +192,7 @@ bool DynamicZoneVampireMirrorOfAbyss::checkComplete() { void DynamicZoneVampireMirrorOfAbyss::processEntering() { Assert(m_pZone != NULL); - // Ʈ ˸. + // 퀘스트 존에 들어왔음을 알린다. unordered_map::const_iterator itr = m_pZone->getPCManager()->getCreatures().begin(); unordered_map::const_iterator endItr = m_pZone->getPCManager()->getCreatures().end(); @@ -221,7 +221,7 @@ bool DynamicZoneVampireMirrorOfAbyss::checkMono() { void DynamicZoneVampireMirrorOfAbyss::killPC() { Assert(m_pZone != NULL); - // PC δ. + // PC 를 죽인다. unordered_map::const_iterator itr = m_pZone->getPCManager()->getCreatures().begin(); unordered_map::const_iterator endItr = m_pZone->getPCManager()->getCreatures().end(); diff --git a/src/server/gameserver/DynamicZoneVampireMirrorOfAbyss.h b/src/server/gameserver/DynamicZoneVampireMirrorOfAbyss.h index 2eb2b675..52fd1c0c 100644 --- a/src/server/gameserver/DynamicZoneVampireMirrorOfAbyss.h +++ b/src/server/gameserver/DynamicZoneVampireMirrorOfAbyss.h @@ -17,8 +17,8 @@ class DynamicZoneVampireMirrorOfAbyss : public DynamicZone { virtual ~DynamicZoneVampireMirrorOfAbyss(); public: - void init(); // ̳ ʱȭ - void heartbeat(); // ̳ ƮƮ + void init(); // 다이나믹 존 초기화 + void heartbeat(); // 다이나믹 존 하트비트 public: bool checkPC(); diff --git a/src/server/gameserver/Effect.cpp b/src/server/gameserver/Effect.cpp index 2cbde8a7..4669fbb4 100644 --- a/src/server/gameserver/Effect.cpp +++ b/src/server/gameserver/Effect.cpp @@ -57,10 +57,10 @@ void Effect::setNextTime(Turn_t delay) { __BEGIN_TRY - // ð Ѵ. + // 현재 시간을 측정한다. getCurrentTime(m_NextTime); - // ̶, delay 0.1 ʰ 1 ̴. + // 이때, delay 는 0.1 초가 1 이다. m_NextTime.tv_sec += delay / 10; m_NextTime.tv_usec += (delay % 10) * 100000; @@ -70,18 +70,18 @@ void Effect::setNextTime(Turn_t delay) void Effect::setDeadline(Turn_t delay) { __BEGIN_TRY - // ð Ѵ. + // 현재 시간을 측정한다. getCurrentTime(m_Deadline); - // Ѵ. - // ̶, delay 0.1 ʰ 1 ̴. + // 데드라인을 결정한다. + // 이때, delay 는 0.1 초가 1 이다. m_Deadline.tv_sec += delay / 10; m_Deadline.tv_usec += (delay % 10) * 100000; __END_CATCH } -// duration(1/10 ) +// 남은 duration(1/10초 단위) Duration_t Effect::getRemainDuration() { __BEGIN_TRY diff --git a/src/server/gameserver/Effect.h b/src/server/gameserver/Effect.h index 6695d826..99e4f9d9 100644 --- a/src/server/gameserver/Effect.h +++ b/src/server/gameserver/Effect.h @@ -17,21 +17,21 @@ class Zone; ////////////////////////////////////////////////////////////////////////////// // class Effect; // -// Ʈ ũó, ,  ðĿ Ͼ -// ȿ ǹѴ. +// ¼­¹ö¿¡¼­ÀÇ ÀÌÆåÆ®´Â Å©¸®Ã³, Á¸, ¾ÆÀÌÅÛ µî¿¡ ÀÏÁ¤ ½Ã°£ÈÄ¿¡ ÀϾ´Â +// ¿©·¯ °¡Áö È¿°úµéÀ» ÀǹÌÇÑ´Ù. // -// , ü ð Ŀ ̳, -// ɸ ŸϿ ũó ö󰡼 ߵ Ǵ Ʈ ȴ. -// , ۿ ɷִ Ʈ ȴ. +// °¡·É, ½Ãü°¡ ÀÏÁ¤ ½Ã°£ ÈÄ¿¡ ¼­¹ö¿¡¼­ »ç¶óÁö´Â °ÍÀ̳ª, °¡½º ¸¶¹ýÀÌ +// °É¸° ŸÀÏ¿¡ Å©¸®Ã³°¡ ¿Ã¶ó°¡¼­ Áßµ¶ÀÌ µÇ´Â °Í ¸ðµÎ ÀÌÆåÆ®·Î ±¸ÇöµÈ´Ù. +// ¶ÇÇÑ, ¶¥¿¡ ¶³¾îÁø ¾ÆÀÌÅÛ¿¡ °É·ÁÀÖ´Â ¸¶¹ý ¿ª½Ã ÀÌÆåÆ®·Î ±¸ÇöµÈ´Ù. // -// Ŭ affect(), unaffect() ޽带 ؼ پ -// ȿ ǥϵ Ѵ. +// ÇÏÀ§ Ŭ·¡½º¿¡¼­ affect(), unaffect() ¸Þ½îµå¸¦ ±¸ÇöÇØ¼­ ´Ù¾çÇÑ +// È¿°ú¸¦ Ç¥ÇöÇϵµ·Ï ÇÑ´Ù. // // *CAUTION* // -// Ÿ ִ Ʈ ü پִ Ʈ ٸ. -// Ÿ Ʈ ŸϿ Ҽӵ, ü Ʈ -// Ʈ Ŵ Ҽӵȴ. +// ŸÀÏ À§¿¡ ³õ¿© ÀÖ´Â ÀÌÆåÆ®¿Í ½Ãü¿¡ ºÙ¾îÀÖ´Â ÀÌÆåÆ®´Â °³³ä»ó ¸¹ÀÌ ´Ù¸£´Ù. +// ŸÀÏ À§ÀÇ ÀÌÆåÆ®´Â ŸÀÏ¿¡ ¼Ò¼ÓµÇÁö¸¸, ½ÃüÀÇ ÀÌÆåÆ®´Â ´ÜÁö Á¸ÀÇ +// ÀÌÆåÆ® ¸Å´ÏÀú¿¡¸¸ ¼Ò¼ÓµÈ´Ù. // // void SkillHandler::execute(...) // { @@ -70,7 +70,7 @@ class Effect : public Object { public: enum EffectClass { //////////////////////////////////////////////////////////// - // ߰Ǵ ؿ ־ּ!!!!!!!!!!! + // »õ·Î Ãß°¡µÇ´Â ±â¼úÀº Á¦ÀÏ ¹Ø¿¡ ³Ö¾îÁÖ¼¼¿ä!!!!!!!!!!! //////////////////////////////////////////////////////////// EFFECT_CLASS_LIGHT = 0, // 0 EFFECT_CLASS_DETECT_HIDDEN, // 1 @@ -144,7 +144,7 @@ class Effect : public Object { EFFECT_CLASS_PRECEDENCE, // 69 EFFECT_CLASS_RESTORE, // 70 - // ̰ ̸ ٲ Ѵ. + // À̰ŠÀ̸§ ¹Ù²¸¾ß ÇÑ´Ù. EFFECT_CLASS_CURE_CRITICAL_WOUNDS, // 70 EFFECT_CLASS_EXTREME, // 71 @@ -224,7 +224,7 @@ class Effect : public Object { EFFECT_CLASS_SOUL_CHAIN, // 123 // by sigi. 2002.11.7 - EFFECT_CLASS_TRANSPORT_CREATURE, // 124 - ȵ. + EFFECT_CLASS_TRANSPORT_CREATURE, // 124 - Á¦´ë·Î ±¸Çö ¾ÈµÊ. // by sigi. 2002.11.8 EFFECT_CLASS_GRAND_MASTER_SLAYER, // 125 @@ -308,8 +308,8 @@ class Effect : public Object { EFFECT_CLASS_SHRINE_HOLY_11, // 185 EFFECT_CLASS_SHRINE_HOLY_12, // 186 - EFFECT_CLASS_SHRINE_GUARD_WARP, // 187 ȣܿ ɶ - EFFECT_CLASS_SHRINE_HOLY_WARP, // 188 ܿ ɶ + EFFECT_CLASS_SHRINE_GUARD_WARP, // 187 ¼öÈ£¼º´Ü¿¡¼­ ¿öÇÁµÉ¶§ + EFFECT_CLASS_SHRINE_HOLY_WARP, // 188 ¼ºÁö¼º´Ü¿¡¼­ ¿öÇÁµÉ¶§ EFFECT_CLASS_CHANGE_CASTLE_CHANGED, // 189 EFFECT_CLASS_SHRINE_SHIELD, // 190 @@ -318,11 +318,11 @@ class Effect : public Object { EFFECT_CLASS_TRANSPORT_ITEM_TO_CORPSE, // 192 EFFECT_CLASS_ADD_ITEM_TO_CORPSE, // 193 - EFFECT_CLASS_WARP_BLOOD_BIBLE_FROM_ME, // 194 ִ Ǽ ɶ Ӹ ִ-_- Ʈ - EFFECT_CLASS_WARP_BLOOD_BIBLE_FROM_TILE, // 195 ִ Ǽ ɶ ŸϿ ִ Ʈ + EFFECT_CLASS_WARP_BLOOD_BIBLE_FROM_ME, // 194 ³»°¡ °¡Áö°íÀÖ´ø ÇÇÀǼº¼­°¡ ¿öÇÁµÉ¶§ ¸Ó¸®¿¡ Âï¾îÁÖ´Â-_- ÀÌÆåÆ® + EFFECT_CLASS_WARP_BLOOD_BIBLE_FROM_TILE, // 195 ¶¥¿¡ ¶³¾îÁ®ÀÖ´ø ÇÇÀǼº¼­°¡ ¿öÇÁµÉ¶§ ±× ŸÀÏ¿¡ Âï¾îÁÖ´Â ÀÌÆåÆ® - EFFECT_CLASS_WARP_HOLY_LAND_VAMPIRE, // 196 ̾ Ż ̵Ҷ - EFFECT_CLASS_WARP_HOLY_LAND_SLAYER, // 197 ̾ Ż ̵Ҷ + EFFECT_CLASS_WARP_HOLY_LAND_VAMPIRE, // 196 ¹ìÆÄÀ̾ Æ÷Å»·Î À̵¿ÇÒ¶§ + EFFECT_CLASS_WARP_HOLY_LAND_SLAYER, // 197 ½½·¹À̾ Æ÷Å»·Î À̵¿ÇÒ¶§ EFFECT_CLASS_HAS_CASTLE_SYMBOL, // 198 EFFECT_CLASS_HAS_CASTLE_SYMBOL_2, // 199 @@ -344,12 +344,12 @@ class Effect : public Object { EFFECT_CLASS_PK_ZONE_REGEN, // 209 EFFECT_CLASS_PK_ZONE_RESURRECTION, // 210 - EFFECT_CLASS_MAGIC_ELUSION, // 211 Ÿν - EFFECT_CLASS_POISON_MESH, // 212 ׸Ƽ콺 - EFFECT_CLASS_ILLUSION_OF_AVENGE, // 213 Ƽ - EFFECT_CLASS_WILL_OF_LIFE, // 214 Ƹ + EFFECT_CLASS_MAGIC_ELUSION, // 211 ¿ÁŸºÎ½º + EFFECT_CLASS_POISON_MESH, // 212 Å׸£Æ¼¿ì½º + EFFECT_CLASS_ILLUSION_OF_AVENGE, // 213 ¼ÁƼ¹«½º + EFFECT_CLASS_WILL_OF_LIFE, // 214 Äí¾Æ¸£Åõ½º - // ű ų Effect ߰ + // ½Å±Ô ½ºÅ³ Effect Ãß°¡ EFFECT_CLASS_DENIAL_MAGIC, // 215 EFFECT_CLASS_DENIAL_MAGIC_DAMAGED, // 216 EFFECT_CLASS_REQUITAL, // 217 @@ -433,8 +433,8 @@ class Effect : public Object { EFFECT_CLASS_REDIANCE, // 272 EFFECT_CLASS_HEART_CATALYST, // 273 - EFFECT_CLASS_WARP_HOLY_LAND_OUSTERS, // 274 ƿ콺 Ż ̵Ҷ - EFFECT_CLASS_FAMILY_BONUS, // 275 йи ʽ + EFFECT_CLASS_WARP_HOLY_LAND_OUSTERS, // 274 ¾Æ¿ì½ºÅÍÁî°¡ Æ÷Å»·Î À̵¿ÇÒ¶§ + EFFECT_CLASS_FAMILY_BONUS, // 275 ÆÐ¹Ð¸® ¿ä±ÝÁ¦ º¸³Ê½º EFFECT_CLASS_PROTECTION_FROM_BLOOD, // 276 EFFECT_CLASS_ETERNITY, // 277 @@ -443,8 +443,8 @@ class Effect : public Object { EFFECT_CLASS_ETERNITY_PAUSE, // 279 EFFECT_CLASS_TRAP_INSTALLED, // 280 - EFFECT_CLASS_TRAP_TRIGGERED, // 281 Ʈ ɷ (?) Ʈ - EFFECT_CLASS_TRAPPED, // 282 ũİ Ʈ ɷִ Ʈ + EFFECT_CLASS_TRAP_TRIGGERED, // 281 Æ®·¦¿¡ °É·ÈÀ» ¶§ ÀâÇô¸ÔÈ÷´Â(?) ÀÌÆåÆ® + EFFECT_CLASS_TRAPPED, // 282 Å©¸®Ãİ¡ Æ®·¦¿¡ °É·ÁÀÖ´Â ÀÌÆåÆ® EFFECT_CLASS_MERCY_GROUND, // 283 EFFECT_CLASS_HOLY_ARMOR, // 284 @@ -614,30 +614,30 @@ class Effect : public Object { EFFECT_CLASS_PK_COUNTED, // 410 EFFECT_CLASS_PUNISH_COUNTED, // 411 - EFFECT_CLASS_SIEGE_DEFENDER, // 412 // - EFFECT_CLASS_SIEGE_REINFORCE, // 413 // + EFFECT_CLASS_SIEGE_DEFENDER, // 412 // °ø¼ºÀü ¹æ¾îÃø + EFFECT_CLASS_SIEGE_REINFORCE, // 413 // °ø¼ºÀü ¹æ¾îÃø ¿ø±º - EFFECT_CLASS_SIEGE_ATTACKER_1, // 414 // 1 - EFFECT_CLASS_SIEGE_ATTACKER_2, // 415 // 2 - EFFECT_CLASS_SIEGE_ATTACKER_3, // 416 // 3 - EFFECT_CLASS_SIEGE_ATTACKER_4, // 417 // 4 - EFFECT_CLASS_SIEGE_ATTACKER_5, // 418 // 5 + EFFECT_CLASS_SIEGE_ATTACKER_1, // 414 // °ø¼ºÀü °ø°ÝÃø 1¹ø + EFFECT_CLASS_SIEGE_ATTACKER_2, // 415 // °ø¼ºÀü °ø°ÝÃø 2¹ø + EFFECT_CLASS_SIEGE_ATTACKER_3, // 416 // °ø¼ºÀü °ø°ÝÃø 3¹ø + EFFECT_CLASS_SIEGE_ATTACKER_4, // 417 // °ø¼ºÀü °ø°ÝÃø 4¹ø + EFFECT_CLASS_SIEGE_ATTACKER_5, // 418 // °ø¼ºÀü °ø°ÝÃø 5¹ø - EFFECT_CLASS_SHARE_HP, // 419 // HP ϱ~ + EFFECT_CLASS_SHARE_HP, // 419 // HP °øÀ¯Çϱâ~ - EFFECT_CLASS_LAND_MINE_EXPLOSION, // 420 // 帶 Ʈ - EFFECT_CLASS_CLAYMORE_EXPLOTION, // 421 // ũ Ʈ - EFFECT_CLASS_PLEASURE_EXPLOSION, // 422 // ÷ ̼ Ʈ - EFFECT_CLASS_TURRET_LASER, // 423 // ͷ 1Ÿ - EFFECT_CLASS_TURRET_LASER_ATTACK, // 424 // ͷ 1Ÿ ( ) - EFFECT_CLASS_AUTO_TURRET, // 425 // ͷ ִ° + EFFECT_CLASS_LAND_MINE_EXPLOSION, // 420 // ·£µå¸¶ÀÎ ÅÍÁö´Â ÀÌÆåÆ® + EFFECT_CLASS_CLAYMORE_EXPLOTION, // 421 // Å©·¹¸ð¾î ÅÍÁö´Â ÀÌÆåÆ® + EFFECT_CLASS_PLEASURE_EXPLOSION, // 422 // Ç÷¹Á® ½ºÅ×ÀÌ¼Ç ÅÍÁö´Â ÀÌÆåÆ® + EFFECT_CLASS_TURRET_LASER, // 423 // ÅÍ·¿ ·¹ÀÌÀú 1ŸÀÏ + EFFECT_CLASS_TURRET_LASER_ATTACK, // 424 // ÅÍ·¿ ·¹ÀÌÀú °ø°Ý 1ŸÀÏ (°ø°ÝÃø¿¡µµ º¸ÀÓ) + EFFECT_CLASS_AUTO_TURRET, // 425 // ¿ÀÅä ÅÍ·¿ ¼­Àִ°Š- EFFECT_CLASS_HIDE_TO_ATTACKER, // 426 // δ. + EFFECT_CLASS_HIDE_TO_ATTACKER, // 426 // °ø¼º °ø°ÝÃø¿¡´Â ¾È º¸ÀδÙ. EFFECT_CLASS_REPUTO_FACTUM, // 427 - EFFECT_CLASS_REPUTO_FACTUM_LAST, // 428 // Ʈ + EFFECT_CLASS_REPUTO_FACTUM_LAST, // 428 // Áö¼ÓÀÌÆåÆ® - EFFECT_CLASS_SWORD_OF_THOR, // 429 // ŸϿ پ Į + EFFECT_CLASS_SWORD_OF_THOR, // 429 // ŸÀÏ¿¡ ºÙ¾î¼­ ÅÍÁö´Â Ä® EFFECT_CLASS_BURNING_SOL_CHARGE_1, // 430 EFFECT_CLASS_BURNING_SOL_CHARGE_2, // 431 @@ -648,7 +648,7 @@ class Effect : public Object { EFFECT_CLASS_WHITSUNTIDE, // 435 EFFECT_CLASS_DRAGON_EYE, // 436 - EFFECT_CLASS_ROCKET_LAUNCHER, // 437 // Ŭ̾Ʈ + EFFECT_CLASS_ROCKET_LAUNCHER, // 437 // Ŭ¶óÀÌ¾ðÆ®¸¸ ¾´´Ù EFFECT_CLASS_PLASMA_ROCKET_LAUNCHER, // 438 EFFECT_CLASS_INTIMATE_GRAIL, // 439 @@ -684,33 +684,33 @@ class Effect : public Object { EFFECT_CLASS_TILE_PORTAL, // 464 // add by Coffee 2007-5-20 - EFFECT_CLASS_BLOOD_BLLODY_SCARIFY, // Ѫ֮ӡ(Ѫ) - EFFECT_CLASS_BLOOD_CURSE, // Ѫ֮{(Ѫ) + EFFECT_CLASS_BLOOD_BLLODY_SCARIFY, // Ѫ֮ÀÓÓ¡(ÎüѪ¹í) + EFFECT_CLASS_BLOOD_CURSE, // Ѫ֮Ô{Öä(ÎüѪ¹í) EFFECT_CLASS_SKILL_BOMB_CRASH_WALK_TO_ENEMY, // 465 - EFFECT_CLASS_SKILL_SATELLITE_BOMB_AIM, // Ǻ Ч () - EFFECT_CLASS_SKILL_SATELLITE_BOMB_POINT, // Ǻ Ч () - EFFECT_CLASS_SKILL_SATELLITE_BOMB_FIRE, // ǹЧ - EFFECT_CLASS_HEAVEN_GROUND, // ʦ - EFFECT_CLASS_DUMMY_DRAKE, // ׿˿(ħ) - EFFECT_CLASS_HYDRO_CONVERGENCE, // ˮ - EFFECT_CLASS_SUMMON_CLAY, // Summon Clay ճٻ (ħ¼ ) - EFFECT_CLASS_HETER_CHAKRAM, // Heter Chakram IJ (ħ¼ սʿ) + EFFECT_CLASS_SKILL_SATELLITE_BOMB_AIM, // ÎÀÐǺä»÷ Ч¹û¶¨Òå (ÈËÀà) + EFFECT_CLASS_SKILL_SATELLITE_BOMB_POINT, // ÎÀÐǺä»÷ Ч¹û¶¨Òå (ÈËÀà) + EFFECT_CLASS_SKILL_SATELLITE_BOMB_FIRE, // ¿ªÇ¹Ð§¹û + EFFECT_CLASS_HEAVEN_GROUND, // ·¨Ê¦ÌìÉñ½µÁÙ + EFFECT_CLASS_DUMMY_DRAKE, // µÂÀ׿˿þÀÜ(ħÁé) + EFFECT_CLASS_HYDRO_CONVERGENCE, // ¸´ºÏË®ÁÆ + EFFECT_CLASS_SUMMON_CLAY, // Summon Clay Õ³ÍÁÕÙ»½ (ħÁéм¼ÄÜ ÍÁ·¨) + EFFECT_CLASS_HETER_CHAKRAM, // Heter Chakram ÏIJ¼Àû»ùÒò (ħÁéм¼ÄÜ Õ½Ê¿) // add by viva - EFFECT_CLASS_XRL_Missile, // XRL ըѵ + EFFECT_CLASS_XRL_Missile, // XRL Õ¨Áѵ¼µ¯ EFFECTSTATUS_UNKOWN_VIVA2, EFFECTSTATUS_UNKOWN_VIVA3, EFFECTSTATUS_UNKOWN_VIVA4, - EFFECT_CLASS_Bramble_Halo, // Original Action:390 //⻷ //ף + EFFECT_CLASS_Bramble_Halo, // Original Action:390 //¾£¼¬¹â»· //×£¸£ EFFECTSTATUS_UNKOWN_VIVA5, // EffectSpriteType:1134 EFFECT_CLASS_Rapid_Freeze, // Original Action:396 EFFECT_CLASS_Penetrate_Wheel, // Orginal Action : 393 EFFECTSTATUS_UNKOWN_VIVA6, EFFECTSTATUS_VAMPIRE_TRANSFORM_TO_D_BAT, // Original Action : 409 EFFECTSTATUS_VAMPIRE_TRANSFORM_TO_D_ANGEL, // Original Action : 410 - EFFECTSTATUS_SUMMON_SYLPH1, // ٻ//ousters//Original Action : 247 + EFFECTSTATUS_SUMMON_SYLPH1, // ÕÙ»½¾«Áé//ousters//Original Action : 247 EFFECTSTATUS_SUMMON_SYLPH2, EFFECTSTATUS_UNKOWN_VIVA7, @@ -753,7 +753,7 @@ class Effect : public Object { return getEffectClass(); } - // Client ѷϴ Effectΰ? by sigi. 2002.11.14 + // Client¿¡ »Ñ·ÁÁà¾ßÇÏ´Â EffectÀΰ¡? by sigi. 2002.11.14 bool isBroadcastingEffect() { return m_bBroadcastingEffect; } @@ -780,7 +780,7 @@ class Effect : public Object { virtual void unaffect() = 0; virtual void unaffect(Creature* pCreature) { throw UnsupportedError(__PRETTY_FUNCTION__); - } // pure virtual̾µ EffectRelicTable ٲ. by sigi + } // ¿ø·¡´Â pure virtualÀ̾ú´Âµ¥ EffectRelicTable¶§¸Þ ¹Ù²å´Ù. by sigi virtual void unaffect(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, Object* pTarget) { throw UnsupportedError(__PRETTY_FUNCTION__); } @@ -846,14 +846,14 @@ class Effect : public Object { // data members //////////////////////////////////////////////////////////// protected: - Zone* m_pZone; // target object ġ + Zone* m_pZone; // target objectÀÇ À§Ä¡ ZoneCoord_t m_X; ZoneCoord_t m_Y; - Object* m_pTarget; // target object -  ü ɷ ִ°? - Timeval m_NextTime; // ؾ ϴ ð - Timeval m_Deadline; // ü ؾ ϴ°? Ÿ ð + Object* m_pTarget; // target object - ¾î¶² °´Ã¼¿¡ °É·Á Àִ°¡? + Timeval m_NextTime; // ´ÙÀ½ ¹ø¿¡ ½ÇÇàÇØ¾ß ÇÏ´Â ½Ã°£ + Timeval m_Deadline; // ¾ðÁ¦ ÀÌ °´Ã¼¸¦ »èÁ¦ÇØ¾ß Çϴ°¡?¸¦ ³ªÅ¸³»´Â ½Ã°£ - // Client ѷϴ Effectΰ? by sigi. 2002.11.14 + // Client¿¡ »Ñ·ÁÁà¾ßÇÏ´Â EffectÀΰ¡? by sigi. 2002.11.14 bool m_bBroadcastingEffect; }; diff --git a/src/server/gameserver/EffectAddItem.h b/src/server/gameserver/EffectAddItem.h index ddebabbb..85da395a 100644 --- a/src/server/gameserver/EffectAddItem.h +++ b/src/server/gameserver/EffectAddItem.h @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////////////// // class EffectAddItem; -// ð ٴڿ ִ µ, ׸ Ʈ̴. +// 일정 시간이 지나면 바닥에 있는 아이템은 사라지는데, 그를 위한 이펙트이다. ////////////////////////////////////////////////////////////////////////////// class Item; @@ -26,7 +26,7 @@ class EffectAddItem : public Effect { return EFFECT_CLASS_ADD_ITEM; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } diff --git a/src/server/gameserver/EffectAddItemToCorpse.cpp b/src/server/gameserver/EffectAddItemToCorpse.cpp index 1b90d47d..b613428e 100644 --- a/src/server/gameserver/EffectAddItemToCorpse.cpp +++ b/src/server/gameserver/EffectAddItemToCorpse.cpp @@ -28,7 +28,7 @@ EffectAddItemToCorpse::EffectAddItemToCorpse(Zone* pZone, Item* pItem, ObjectID_ : Effect(pZone, 0, 0, pItem, delay) { __BEGIN_TRY - // Effect̴. by sigi. 2002.11.14 + // 서버 전용 Effect이다. by sigi. 2002.11.14 m_bBroadcastingEffect = false; Assert(getZone() != NULL); @@ -53,8 +53,8 @@ EffectAddItemToCorpse::~EffectAddItemToCorpse() //---------------------------------------------------------------------- // affect to target -// Ʈ ŸϿ ӵ Ƿ, affect() ȣ ʴ´. -// ֳϸ, target ڿ Ǹ, ƹ ϵ ʱ ̴. +// 이 이펙트는 타일에 종속되지 않으므로, affect()는 호출되지 않는다. +// 왜냐하면, target은 생성자에서 지정되며, 아무런 일도 하지 않기 때문이다. //---------------------------------------------------------------------- void EffectAddItemToCorpse::affect(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, Object* pTarget) @@ -75,7 +75,7 @@ void EffectAddItemToCorpse::unaffect(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, { __BEGIN_TRY - // ùٸ ǥ̾ Ѵ. + // 올바른 좌표이어야 한다. Assert(pTarget != NULL); Item* pItem = dynamic_cast(pTarget); @@ -91,7 +91,7 @@ void EffectAddItemToCorpse::unaffect(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, pCorpse->addTreasure(pItem); } else { - throw Error("ü ƴϳ"); + throw Error("시체가 아니네"); } pTarget = NULL; diff --git a/src/server/gameserver/EffectAddItemToCorpse.h b/src/server/gameserver/EffectAddItemToCorpse.h index 0d818fa0..26be6894 100644 --- a/src/server/gameserver/EffectAddItemToCorpse.h +++ b/src/server/gameserver/EffectAddItemToCorpse.h @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////////////// // class EffectAddItemToCorpse; -// ü ߰Ѵ. +// 아이템을 시체에 추가한다. ////////////////////////////////////////////////////////////////////////////// class Item; @@ -26,7 +26,7 @@ class EffectAddItemToCorpse : public Effect { return EFFECT_CLASS_ADD_ITEM_TO_CORPSE; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } diff --git a/src/server/gameserver/EffectAddMonster.cpp b/src/server/gameserver/EffectAddMonster.cpp index 3fd26c03..037a4e89 100644 --- a/src/server/gameserver/EffectAddMonster.cpp +++ b/src/server/gameserver/EffectAddMonster.cpp @@ -23,7 +23,7 @@ EffectAddMonster::EffectAddMonster(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, Cr : Effect(pZone, x, y, pCreature, delay) { __BEGIN_TRY - // Effect̴. by sigi. 2002.11.14 + // 서버 전용 Effect이다. by sigi. 2002.11.14 m_bBroadcastingEffect = false; Assert(getZone() != NULL); @@ -52,8 +52,8 @@ EffectAddMonster::~EffectAddMonster() //---------------------------------------------------------------------- // affect to target -// Ʈ ŸϿ ӵ Ƿ, affect() ȣ ʴ´. -// ֳϸ, target ڿ Ǹ, ƹ ϵ ʱ ̴. +// 이 이펙트는 타일에 종속되지 않으므로, affect()는 호출되지 않는다. +// 왜냐하면, target은 생성자에서 지정되며, 아무런 일도 하지 않기 때문이다. //---------------------------------------------------------------------- void EffectAddMonster::affect(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, Creature* pTarget) @@ -74,7 +74,7 @@ void EffectAddMonster::unaffect(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, Creat { __BEGIN_TRY - // ùٸ ǥ̾ Ѵ. + // 올바른 좌표이어야 한다. Assert(pTarget != NULL); Assert(isValidZoneCoord(pZone, x, y)); @@ -85,15 +85,15 @@ void EffectAddMonster::unaffect(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, Creat TPOINT pt = pZone->addCreature(pMonster, x, y, 2); - cout << pZone->getZoneID() << " (" << x << "," << y << ") Ͱ ߰Ǿϴ" << endl; + cout << pZone->getZoneID() << "존의 (" << x << "," << y << ")에 몬스터가 추가되었습니다" << endl; if (pt.x == -1) { SAFE_DELETE(pMonster); - throw Error("Zone  ڸ "); + throw Error("Zone에 몬스터 들어갈 자리가 없다"); } } else { SAFE_DELETE(pMonster); - throw Error("EffectAddMonsterε item ƴѰ?"); + throw Error("EffectAddMonster인데 item이 아닌가?"); } pTarget = NULL; diff --git a/src/server/gameserver/EffectAddMonster.h b/src/server/gameserver/EffectAddMonster.h index 4ef78c8f..cd282b10 100644 --- a/src/server/gameserver/EffectAddMonster.h +++ b/src/server/gameserver/EffectAddMonster.h @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////////////// // class EffectAddMonster; -// ð ٴڿ ִ µ, ׸ Ʈ̴. +// 일정 시간이 지나면 바닥에 있는 아이템은 사라지는데, 그를 위한 이펙트이다. ////////////////////////////////////////////////////////////////////////////// class Item; @@ -26,7 +26,7 @@ class EffectAddMonster : public Effect { return EFFECT_CLASS_ADD_MONSTER; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } diff --git a/src/server/gameserver/EffectAlignmentRecovery.h b/src/server/gameserver/EffectAlignmentRecovery.h index 8f74b7d7..fbb3dd79 100644 --- a/src/server/gameserver/EffectAlignmentRecovery.h +++ b/src/server/gameserver/EffectAlignmentRecovery.h @@ -24,7 +24,7 @@ class EffectAlignmentRecovery : public Effect { return EFFECT_CLASS_ALIGNMENT_RECOVERY; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } @@ -67,13 +67,13 @@ class EffectAlignmentRecovery : public Effect { } private: - // ʸ TICK ߵ Ǵ°. + // 몇 초마다 TICK이 발동 되는가. Turn_t m_Delay; - // Ϸ ȸ + // 완료시 회복량 Alignment_t m_AlignmentQuantity; - // ȸ ϷǴµ ɸ ð. + // 회복이 완료되는데 걸리는 시간. Turn_t m_Period; }; diff --git a/src/server/gameserver/EffectCallMotorcycle.cpp b/src/server/gameserver/EffectCallMotorcycle.cpp index f6f566f0..02d696c5 100644 --- a/src/server/gameserver/EffectCallMotorcycle.cpp +++ b/src/server/gameserver/EffectCallMotorcycle.cpp @@ -31,7 +31,7 @@ EffectCallMotorcycle::EffectCallMotorcycle(Zone* pZone, ZoneCoord_t x, ZoneCoord m_ObjectID = pItem->getObjectID(); m_bDeleteFromDB = bDeleteFromDB; - // Effect̴. by sigi. 2002.11.14 + // 서버 전용 Effect이다. by sigi. 2002.11.14 m_bBroadcastingEffect = false; __END_CATCH @@ -54,8 +54,8 @@ EffectCallMotorcycle::~EffectCallMotorcycle() //---------------------------------------------------------------------- // affect to target -// Ʈ ŸϿ ӵ Ƿ, affect() ȣ ʴ´. -// ֳϸ, target ڿ Ǹ, ƹ ϵ ʱ ̴. +// 이 이펙트는 타일에 종속되지 않으므로, affect()는 호출되지 않는다. +// 왜냐하면, target은 생성자에서 지정되며, 아무런 일도 하지 않기 때문이다. //---------------------------------------------------------------------- void EffectCallMotorcycle::affect(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, Object* pTarget) @@ -76,22 +76,22 @@ void EffectCallMotorcycle::unaffect(Motorcycle* pMotorcycle, Slayer* pSlayer) { __BEGIN_TRY - // Slayer (Zone, x, y) Ѵ. + // Slayer의 정보(Zone, x, y)를 구한다. Zone* pZone = pSlayer->getZone(); Coord_t x = pSlayer->getX(); Coord_t y = pSlayer->get(); - // Slayer ȿ ˻Ѵ. + // Slayer의 정보가 유효한지 검사한다. - // Ÿ ´. + // 존의 타일 정보를 가져온다. Tile& tile = pZone->getTile(x, y); - // ش ִٸ?? + // 만약 해당 존에 아이템이 있다면?? if (tile.hasItem()) { } else { pZone->addItem(pMotorcycle, x, y); - // ̵ߴٴ Ŷ . + // 아이템이 이동했다는 패킷을 날린다. } __END_CATCH diff --git a/src/server/gameserver/EffectCallMotorcycle.h b/src/server/gameserver/EffectCallMotorcycle.h index c7d68d96..d39d9635 100644 --- a/src/server/gameserver/EffectCallMotorcycle.h +++ b/src/server/gameserver/EffectCallMotorcycle.h @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////////////// // class EffectCallMotorcycle; -// ð heartbeat ڿ ̸ ȣ ִ ̺Ʈ̴. +// 일정 시간 후 heartbeat시 사용자에게 오토바이를 호출해 주는 이벤트이다. ////////////////////////////////////////////////////////////////////////////// class Item; @@ -27,7 +27,7 @@ class EffectCallMotorcycle : public Effect { return EFFECT_CLASS_DECAY_ITEM; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } diff --git a/src/server/gameserver/EffectCarnelianForceScroll.cpp b/src/server/gameserver/EffectCarnelianForceScroll.cpp index c49c2c9f..9fae48e1 100644 --- a/src/server/gameserver/EffectCarnelianForceScroll.cpp +++ b/src/server/gameserver/EffectCarnelianForceScroll.cpp @@ -53,7 +53,7 @@ void EffectCarnelianForceScroll::affect(Creature* pCreature) ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(this); - // 9ɼ + // 모저 9옵션 적용 pPC->addEffectOption(getObjectID(), 182); pPC->initAllStatAndSend(); @@ -228,7 +228,7 @@ void EffectCarnelianForceScrollLoader::load(Creature* pCreature) ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // 9ɼ + // 모저 9옵션 적용 pPC->addEffectOption(pEffect->getObjectID(), 182); } diff --git a/src/server/gameserver/EffectCastingTrap.cpp b/src/server/gameserver/EffectCastingTrap.cpp index e77336c0..5683ce07 100644 --- a/src/server/gameserver/EffectCastingTrap.cpp +++ b/src/server/gameserver/EffectCastingTrap.cpp @@ -14,7 +14,7 @@ void EffectCastingIcicleTrap::affect() { // cout << "EffectCastingIcicleTrap::affect" << endl; - // 100 ãƵ ȵǸ д. + // 100번 찾아도 안되면 관둔다. for (int j = 0; j < 100; ++j) { int offset = rand() % m_Length; Dir_t dir90 = (m_Dir + 2) % 8; @@ -38,7 +38,7 @@ void EffectCastingIcicleTrap::affect() { } } - // cout << x << ", " << y << " Ʈ ϲ" << endl; + // cout << x << ", " << y << " 에 이펙트 붙일께용" << endl; if (m_bLarge) { EffectLargeIcicle* pEffectLargeIcicle = new EffectLargeIcicle(m_IcicleEffect, m_pZone, x, y); diff --git a/src/server/gameserver/EffectComa.h b/src/server/gameserver/EffectComa.h index b2dce001..b1ec3b72 100644 --- a/src/server/gameserver/EffectComa.h +++ b/src/server/gameserver/EffectComa.h @@ -2,9 +2,9 @@ // Filename : EffectComa.h // Written by : excel96 // Description : -// ̾ ̾ ׾ , ɸ Ʈ. -// Ʈ ɸ ̾ , -// , . +// 슬레이어나 뱀파이어가 죽었을 때, 걸리는 이펙트. +// 이 이펙트가 걸린 슬레이어는 움직일 수 없으며, 아이템 및 기술을 사용할 +// 수 없으며, 말도 할 수 없다. // (CGMove, CGUseItem, CGSkillTo..., CGSay) ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/EffectContinualGroundAttack.h b/src/server/gameserver/EffectContinualGroundAttack.h index 1b5e828f..56c394e9 100644 --- a/src/server/gameserver/EffectContinualGroundAttack.h +++ b/src/server/gameserver/EffectContinualGroundAttack.h @@ -25,7 +25,7 @@ class EffectContinualGroundAttack : public Effect { return EFFECT_CLASS_CONTINUAL_GROUND_ATTACK; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } diff --git a/src/server/gameserver/EffectDarknessForbidden.h b/src/server/gameserver/EffectDarknessForbidden.h index 3ae671f9..e5ca8d0b 100644 --- a/src/server/gameserver/EffectDarknessForbidden.h +++ b/src/server/gameserver/EffectDarknessForbidden.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectDarknessForbidden.h // Written by : elca@ewestsoft.com -// Description : DarknessForbidden Effect óֱ Ŭ̴. +// Description : 성직마법 DarknessForbidden의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_DARKNESS_FORBIDDEN__ diff --git a/src/server/gameserver/EffectDecayCorpse.h b/src/server/gameserver/EffectDecayCorpse.h index 9854f18d..3b870503 100644 --- a/src/server/gameserver/EffectDecayCorpse.h +++ b/src/server/gameserver/EffectDecayCorpse.h @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////////////// // class EffectDecayCorpse; -// ð , ü ϰ, Ѵ. +// 일정 시간이 지나면, 시체를 썩어 없어지게 하고, 내부의 아이템을 삭제한다. ////////////////////////////////////////////////////////////////////////////// class Corpse; @@ -26,7 +26,7 @@ class EffectDecayCorpse : public Effect { return EFFECT_CLASS_DECAY_CORPSE; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } diff --git a/src/server/gameserver/EffectDecayItem.h b/src/server/gameserver/EffectDecayItem.h index 333fecd4..4d6124fd 100644 --- a/src/server/gameserver/EffectDecayItem.h +++ b/src/server/gameserver/EffectDecayItem.h @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////////////// // class EffectDecayItem; -// ð ٴڿ ִ µ, ׸ Ʈ̴. +// 일정 시간이 지나면 바닥에 있는 아이템은 사라지는데, 그를 위한 이펙트이다. ////////////////////////////////////////////////////////////////////////////// class Item; @@ -26,7 +26,7 @@ class EffectDecayItem : public Effect { return EFFECT_CLASS_DECAY_ITEM; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } diff --git a/src/server/gameserver/EffectDecayMotorcycle.cpp b/src/server/gameserver/EffectDecayMotorcycle.cpp index d8b404f7..06234afe 100644 --- a/src/server/gameserver/EffectDecayMotorcycle.cpp +++ b/src/server/gameserver/EffectDecayMotorcycle.cpp @@ -31,7 +31,7 @@ EffectDecayMotorcycle::EffectDecayMotorcycle(Zone* pZone, ZoneCoord_t x, ZoneCoo m_ObjectID = pItem->getObjectID(); m_bDeleteFromDB = bDeleteFromDB; - // Effect̴. by sigi. 2002.11.14 + // 서버 전용 Effect이다. by sigi. 2002.11.14 m_bBroadcastingEffect = false; __END_CATCH @@ -54,8 +54,8 @@ EffectDecayMotorcycle::~EffectDecayMotorcycle() //---------------------------------------------------------------------- // affect to target -// Ʈ ŸϿ ӵ Ƿ, affect() ȣ ʴ´. -// ֳϸ, target ڿ Ǹ, ƹ ϵ ʱ ̴. +// 이 이펙트는 타일에 종속되지 않으므로, affect()는 호출되지 않는다. +// 왜냐하면, target은 생성자에서 지정되며, 아무런 일도 하지 않기 때문이다. //---------------------------------------------------------------------- void EffectDecayMotorcycle::affect(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, Object* pTarget) @@ -76,27 +76,27 @@ void EffectDecayMotorcycle::unaffect(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, { __BEGIN_TRY - // ùٸ ǥ̾ Ѵ. + // 올바른 좌표이어야 한다. Assert(isValidZoneCoord(pZone, x, y)); - // TempItem ´. + // TempItem 변수를 잡는다. Item* pTempItem = NULL; - // ⼭ , ٸ ִ. - // ۰ ٴڿ ִ Ͽ ؾ Ѵ. - // ϸ ȴ. + // 여기서는 지정 아이템이 없을 수 있으며, 또 다른 아이템이 놓여 있을 수도 있다. + // 이 경우는 오리지널 아이템과 지금 현재 바닥에 있는 아이템을 비교하여 삭제해야 한다. + // 없을 경우는 무시하면 된다. Tile& tile = pZone->getTile(x, y); if (tile.hasItem()) { pTempItem = tile.getItem(); if (pTempItem != NULL) { - // ObjectID ٴ ̶ ̴. + // ObjectID가 같다는 말은 같은 아이템이란 말이다. // if (pTempItem->getObjectID() == m_ObjectID) { if (pTempItem->getObjectID() == m_ObjectID) { pZone->deleteItem(pTempItem, x, y); - // ٴ Ŷ . + // 아이템이 사라졌다는 패킷을 날린다. GCDeleteObject gcDeleteObject; gcDeleteObject.setObjectID(m_ObjectID); @@ -111,9 +111,9 @@ void EffectDecayMotorcycle::unaffect(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, } } - // heartbeat EffectDecayMotorcycle óȴ. heartbeatÿ - // ڿ ̸ ȣ ־ Ѵ. - // ڴ Ʈ + // heartbeat시 EffectDecayMotorcycle이 처리된다. 그 이후 다음 heartbeat시에 + // 사용자에게 오토바이를 호출해 주어야 한다. + // 사용자는 오토바이의 오브젝트와 // EffectCallMotorcycle* pEffectCallMotorcycle = new EffectCallMotorcycle(pMotorcycleObject, pSlayer); // pTarget = NULL; diff --git a/src/server/gameserver/EffectDecayMotorcycle.h b/src/server/gameserver/EffectDecayMotorcycle.h index 724f5282..6a072d99 100644 --- a/src/server/gameserver/EffectDecayMotorcycle.h +++ b/src/server/gameserver/EffectDecayMotorcycle.h @@ -2,18 +2,18 @@ // Filename : EffectDecayMotorcycle.h // Written by : Reiot // Description : -// ð ٴڿ ִ ϴ -// EffectDecayItem , -// Motorcycle ȴ. -// Motorcycle ٸ Zone ִ ڰ -// Motorcycle callϰ Ǹ, motorcycle ְ -// ο Motorcycle ־ Ѵ. -// -// 1. ͻŬ ִ -// 2. ȭ Ͼ ϸ -// ٸ ļ ȴ. ׷Ƿ ̷ -// Effect ؼ heartbeatÿ motorcycle ְ -// ο Effect ؼ heartbeatÿ motorcycle . +// 일정 시간이 지나면 바닥에 있는 아이템을 사라지게 하는 +// EffectDecayItem의 별종으로, +// Motorcycle에만 적용된다. +// 기존에 Motorcycle을 다른 Zone에 가지고 있는 사용자가 +// Motorcycle을 call하게 되면, 기존의 motorcycle을 없애고 +// 새로운 Motorcycle을 만들어 주어야 한다. +// 이 과정에서 +// 1. 모터사이클을 없애는 과정 +// 2. 새로 생성화는 과정이 순차적으로 일어나야 하며 +// 다른 존에 영향을 끼쳐서는 안 된다. 그러므로 이런 방식으로 +// Effect를 통해서 heartbeat시에 motorcycle을 없애고 +// 새로운 Effect를 통해서 다음 heartbeat시에 motorcycle을 만든다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_DECAY_MOTORCYCLE_H__ @@ -36,7 +36,7 @@ class EffectDecayMotorcycle : public Effect { return EFFECT_CLASS_DECAY_ITEM; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } diff --git a/src/server/gameserver/EffectDeleteItem.h b/src/server/gameserver/EffectDeleteItem.h index bffb2630..1452188d 100644 --- a/src/server/gameserver/EffectDeleteItem.h +++ b/src/server/gameserver/EffectDeleteItem.h @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////////////// // class EffectDeleteItem; -// ð ٴڿ ִ µ, ׸ Ʈ̴. +// 일정 시간이 지나면 바닥에 있는 아이템은 사라지는데, 그를 위한 이펙트이다. ////////////////////////////////////////////////////////////////////////////// class Item; @@ -26,7 +26,7 @@ class EffectDeleteItem : public Effect { return EFFECT_CLASS_DELETE_ITEM; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } diff --git a/src/server/gameserver/EffectDeleteTile.cpp b/src/server/gameserver/EffectDeleteTile.cpp index b1ee7665..e09537c6 100644 --- a/src/server/gameserver/EffectDeleteTile.cpp +++ b/src/server/gameserver/EffectDeleteTile.cpp @@ -31,7 +31,7 @@ void EffectDeleteTile::affect() { __BEGIN_TRY - // ѷش. ->  + // 주위에 뿌려준다. -> 없어도 될 듯 /* GCAddEffectToTile gcAddEffectToTile; gcAddEffectToTile.setEffectID( getEffectClass() ); gcAddEffectToTile.setObjectID( getObjectID() ); @@ -72,7 +72,7 @@ void EffectDeleteTile::unaffect() Tile& EffectedTile = m_pZone->getTile(m_X, m_Y); EffectedTile.deleteEffect(m_ObjectID); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCDeleteEffectFromTile gcDeleteEffectFromTile; gcDeleteEffectFromTile.setEffectID(Effect::EFFECT_CLASS_DELETE_TILE); gcDeleteEffectFromTile.setObjectID(m_ObjectID); diff --git a/src/server/gameserver/EffectDeleteTile.h b/src/server/gameserver/EffectDeleteTile.h index fccecbbf..6e1f8e92 100644 --- a/src/server/gameserver/EffectDeleteTile.h +++ b/src/server/gameserver/EffectDeleteTile.h @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectDeleteTile.h -// Description : Ա ٴ Ʈ +// Description : 제단의 입구의 바닥을 지우는 이펙트 ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_DELETE_TILE__ diff --git a/src/server/gameserver/EffectDonation200501.cpp b/src/server/gameserver/EffectDonation200501.cpp index 18ffea0e..1757057b 100644 --- a/src/server/gameserver/EffectDonation200501.cpp +++ b/src/server/gameserver/EffectDonation200501.cpp @@ -47,7 +47,7 @@ void EffectDonation200501::affect(Creature* pCreature) pCreature->setFlag(Effect::EFFECT_CLASS_DONATION_200501); - // ѷش. + // 주위에 뿌려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pCreature->getObjectID()); gcAddEffect.setEffectID(getSendEffectClass()); @@ -78,7 +78,7 @@ void EffectDonation200501::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ÷׸ , + // 플래그를 끄고, pCreature->removeFlag(Effect::EFFECT_CLASS_DONATION_200501); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/EffectDragonEye.cpp b/src/server/gameserver/EffectDragonEye.cpp index 79afb381..d1fd6c03 100644 --- a/src/server/gameserver/EffectDragonEye.cpp +++ b/src/server/gameserver/EffectDragonEye.cpp @@ -35,7 +35,7 @@ void EffectDragonEye::affect(Creature* pCreature) { __BEGIN_TRY - // HP ι~ + // HP 가 두배~ if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); SLAYER_RECORD prev; @@ -66,7 +66,7 @@ void EffectDragonEye::unaffect(Creature* pCreature) { __BEGIN_TRY - // HP + // HP 원래대로 if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); SLAYER_RECORD prev; diff --git a/src/server/gameserver/EffectDragonEye.h b/src/server/gameserver/EffectDragonEye.h index 0361b30a..4e3f42bf 100644 --- a/src/server/gameserver/EffectDragonEye.h +++ b/src/server/gameserver/EffectDragonEye.h @@ -39,7 +39,7 @@ class EffectDragonEye : public EffectHasRelic { } private: - // DragonEye ID. GlobalPostionLoader + // DragonEye 아이템의 ID. GlobalPostionLoader 를 위한 멤버 ItemID_t m_ItemID; }; diff --git a/src/server/gameserver/EffectEventQuestReset.cpp b/src/server/gameserver/EffectEventQuestReset.cpp index cfcf2122..8c1af6d3 100644 --- a/src/server/gameserver/EffectEventQuestReset.cpp +++ b/src/server/gameserver/EffectEventQuestReset.cpp @@ -18,7 +18,7 @@ EffectEventQuestReset::EffectEventQuestReset(Creature* pCreature, int type) : m_ setTarget(pCreature); - // Effect̴. by sigi. 2002.11.14 + // ¼­¹ö Àü¿ë EffectÀÌ´Ù. by sigi. 2002.11.14 m_bBroadcastingEffect = false; __END_CATCH @@ -59,7 +59,7 @@ void EffectEventQuestReset::affect(Creature* pCreature) int lastMins = (lastSec % 3600) / 60; char buffer[256]; - sprintf(buffer, "涨ʱ仹ʣ%dСʱ%d.", lastHours, lastMins); + sprintf(buffer, "ÀëÈÎÎñ¹æ¶¨Ê±¼ä»¹Ê£ÏÂ%dСʱ%d·Ö.", lastHours, lastMins); GCSystemMessage gcSM; gcSM.setMessage(buffer); pPC->getPlayer()->sendPacket(&gcSM); @@ -104,7 +104,7 @@ void EffectEventQuestReset::unaffect(Creature* pCreature) pPC->getGQuestManager()->refreshQuest(); GCSystemMessage gcSM; - gcSM.setMessage("ѹ12СʱĹ涨ʱ.Aȼ."); + gcSM.setMessage("Òѹý12СʱµÄ¹æ¶¨Ê±¼ä.¿ÉÒÔÖØÐÂÉêÇëAµÈ¼¶ÈÎÎñ."); pPC->getPlayer()->sendPacket(&gcSM); __END_CATCH diff --git a/src/server/gameserver/EffectFlagInsert.h b/src/server/gameserver/EffectFlagInsert.h index c4dd9ebd..4c17b56c 100644 --- a/src/server/gameserver/EffectFlagInsert.h +++ b/src/server/gameserver/EffectFlagInsert.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectFlagInsert.h // Written by : -// Description : Doom ϰ effect +// Description : Doom에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_FLAG_INSERT__ @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////////////// // class EffectFlagInsert ////////////////////////////////////////////////////////////////////////////// -// 뿡 ٴ Ʈ̴. +// 성물 보관대에 붙는 이펙트이다. class EffectFlagInsert : public Effect { public: diff --git a/src/server/gameserver/EffectGDRLairClose.cpp b/src/server/gameserver/EffectGDRLairClose.cpp index e7e154ea..a1864ae0 100644 --- a/src/server/gameserver/EffectGDRLairClose.cpp +++ b/src/server/gameserver/EffectGDRLairClose.cpp @@ -10,7 +10,7 @@ void EffectGDRLairClose::affect() { setNextTime(600); char msg[200]; - sprintf(msg, "%dֺ,رȴй.", m_MinutesCount); + sprintf(msg, "%d롸빈,쉥밑균훑댐흩契묵흙왯.", m_MinutesCount); GCSystemMessage gcSM; gcSM.setMessage(msg); g_pZoneGroupManager->broadcast(&gcSM); @@ -20,11 +20,11 @@ void EffectGDRLairClose::affect() { void EffectGDRLairClose::unaffect() { __BEGIN_TRY - cout << "巹 ݽϴ." << endl; + cout << "질드레 레어 닫습니다." << endl; GDRLairManager::Instance().close(); GCSystemMessage gcSM; - gcSM.setMessage("ȴйѹر."); + gcSM.setMessage("훑댐흩契묵綠밑균."); g_pZoneGroupManager->broadcast(&gcSM); __END_CATCH diff --git a/src/server/gameserver/EffectGateWayMonster.cpp b/src/server/gameserver/EffectGateWayMonster.cpp index 0f21a6c3..65973081 100644 --- a/src/server/gameserver/EffectGateWayMonster.cpp +++ b/src/server/gameserver/EffectGateWayMonster.cpp @@ -24,7 +24,7 @@ EffectGateWayMonster::EffectGateWayMonster(Creature* pCreature) setTarget(pCreature); - // Effect̴. by sigi. 2002.11.14 + // 서버 전용 Effect이다. by sigi. 2002.11.14 m_bBroadcastingEffect = false; __END_CATCH @@ -47,7 +47,7 @@ void EffectGateWayMonster::affect(Creature* pCreature) HP_t HPRecovery = 1; if (pCreature->isSlayer() || pCreature->isVampire() || pCreature->isOusters()) { - cout << "̾ ̾ Ʈ " << endl; + cout << "슬레이어나 뱀파이어는 이 이펙트가 붙지 않음" << endl; return; } @@ -67,11 +67,11 @@ void EffectGateWayMonster::affect(Creature* pCreature) pkt.setCurrentHP(RemainHP); pZone->broadcastPacket(pMonster->getX(), pMonster->getY(), &pkt); } else { - cout << " ƴ϶ Ʈ " << endl; + cout << "성물 보관함이 아니라면 이 이펙트가 붙지 못함" << endl; return; } } else { - cout << "Ͱ ƴ϶ Ʈ " << endl; + cout << "몬스터가 아니라면 이펙트가 붙지 못함" << endl; return 0; } @@ -103,8 +103,8 @@ void EffectGateWayMonster::affect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_GATEWAY_MONSTER); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/EffectGateWayMonster.h b/src/server/gameserver/EffectGateWayMonster.h index 5d2ada6a..205baf28 100644 --- a/src/server/gameserver/EffectGateWayMonster.h +++ b/src/server/gameserver/EffectGateWayMonster.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectGateWayMonster.h // Written by : -// Description : Doom ϰ effect +// Description : Doom에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_GATEWAY_MONSTER__ diff --git a/src/server/gameserver/EffectGhost.cpp b/src/server/gameserver/EffectGhost.cpp index a798f6eb..63aad50d 100644 --- a/src/server/gameserver/EffectGhost.cpp +++ b/src/server/gameserver/EffectGhost.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectGhost.cpp -// Written by : +// Written by : 쉭 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -71,8 +71,8 @@ void EffectGhost::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_GHOST); /* diff --git a/src/server/gameserver/EffectGhost.h b/src/server/gameserver/EffectGhost.h index 6692cbf7..d61e8d36 100644 --- a/src/server/gameserver/EffectGhost.h +++ b/src/server/gameserver/EffectGhost.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectGhost.h // Written by : -// Description : ZoneID +// Description : ZoneID 마스터 레어 출입증 ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_GHOST__ diff --git a/src/server/gameserver/EffectGrandMasterOusters.cpp b/src/server/gameserver/EffectGrandMasterOusters.cpp index 9bec5a8a..44976191 100644 --- a/src/server/gameserver/EffectGrandMasterOusters.cpp +++ b/src/server/gameserver/EffectGrandMasterOusters.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectGrandMasterOusters.cpp -// Written by : +// Written by : 쉭 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -64,7 +64,7 @@ void EffectGrandMasterOusters::affect(Creature* pCreature) pCreature->setFlag(Effect::EFFECT_CLASS_GRAND_MASTER_OUSTERS); - // ѷش. + // 주위에 뿌려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pCreature->getObjectID()); gcAddEffect.setEffectID(getSendEffectClass()); diff --git a/src/server/gameserver/EffectGrandMasterOusters.h b/src/server/gameserver/EffectGrandMasterOusters.h index 3e959658..9d733f05 100644 --- a/src/server/gameserver/EffectGrandMasterOusters.h +++ b/src/server/gameserver/EffectGrandMasterOusters.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectGrandMasterOusters.h // Written by : -// Description : grand master Ƽ °. - -; by sigi. 2002.11.8 +// Description : grand master 티 내는거. - -; by sigi. 2002.11.8 ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_GRAND_MASTER_OUSTERS__ diff --git a/src/server/gameserver/EffectGrandMasterSlayer.cpp b/src/server/gameserver/EffectGrandMasterSlayer.cpp index 06a0f2b1..4d973ba4 100644 --- a/src/server/gameserver/EffectGrandMasterSlayer.cpp +++ b/src/server/gameserver/EffectGrandMasterSlayer.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectGrandMasterSlayer.cpp -// Written by : +// Written by : 쉭 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -64,7 +64,7 @@ void EffectGrandMasterSlayer::affect(Creature* pCreature) pCreature->setFlag(Effect::EFFECT_CLASS_GRAND_MASTER_SLAYER); - // ѷش. + // 주위에 뿌려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pCreature->getObjectID()); gcAddEffect.setEffectID(getSendEffectClass()); @@ -97,8 +97,8 @@ void EffectGrandMasterSlayer::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_GRAND_MASTER_SLAYER); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/EffectGrandMasterSlayer.h b/src/server/gameserver/EffectGrandMasterSlayer.h index 97ac1226..40b3d706 100644 --- a/src/server/gameserver/EffectGrandMasterSlayer.h +++ b/src/server/gameserver/EffectGrandMasterSlayer.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectGrandMasterSlayer.h // Written by : -// Description : grand master Ƽ °. - -; by sigi. 2002.11.8 +// Description : grand master 티 내는거. - -; by sigi. 2002.11.8 ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_GRAND_MASTER_SLAYER__ diff --git a/src/server/gameserver/EffectGrandMasterVampire.cpp b/src/server/gameserver/EffectGrandMasterVampire.cpp index a4d302e1..da1ba6d1 100644 --- a/src/server/gameserver/EffectGrandMasterVampire.cpp +++ b/src/server/gameserver/EffectGrandMasterVampire.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectGrandMasterVampire.cpp -// Written by : +// Written by : 쉭 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -64,7 +64,7 @@ void EffectGrandMasterVampire::affect(Creature* pCreature) pCreature->setFlag(Effect::EFFECT_CLASS_GRAND_MASTER_VAMPIRE); - // ѷش. + // 주위에 뿌려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pCreature->getObjectID()); gcAddEffect.setEffectID(getSendEffectClass()); @@ -97,8 +97,8 @@ void EffectGrandMasterVampire::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_GRAND_MASTER_VAMPIRE); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/EffectGrandMasterVampire.h b/src/server/gameserver/EffectGrandMasterVampire.h index c68339a0..af336cae 100644 --- a/src/server/gameserver/EffectGrandMasterVampire.h +++ b/src/server/gameserver/EffectGrandMasterVampire.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectGrandMasterVampire.h // Written by : -// Description : grand master Ƽ °. - -; by sigi. 2002.11.8 +// Description : grand master 티 내는거. - -; by sigi. 2002.11.8 ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_GRAND_MASTER_VAMPIRE__ diff --git a/src/server/gameserver/EffectHPRecovery.h b/src/server/gameserver/EffectHPRecovery.h index 61e6769a..5943dcd7 100644 --- a/src/server/gameserver/EffectHPRecovery.h +++ b/src/server/gameserver/EffectHPRecovery.h @@ -24,7 +24,7 @@ class EffectHPRecovery : public Effect { return EFFECT_CLASS_HP_RECOVERY; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } @@ -67,9 +67,9 @@ class EffectHPRecovery : public Effect { } private: - Turn_t m_Delay; // ʸ TICK ߵ Ǵ°. - HP_t m_HPQuantity; // Ϸ ȸ - Turn_t m_Period; // ȸ ϷǴµ ɸ ð. + Turn_t m_Delay; // 몇 초마다 TICK이 발동 되는가. + HP_t m_HPQuantity; // 완료시 회복량 + Turn_t m_Period; // 회복이 완료되는데 걸리는 시간. }; #endif diff --git a/src/server/gameserver/EffectHasBloodBible.cpp b/src/server/gameserver/EffectHasBloodBible.cpp index 561e4108..13caea4a 100644 --- a/src/server/gameserver/EffectHasBloodBible.cpp +++ b/src/server/gameserver/EffectHasBloodBible.cpp @@ -69,7 +69,7 @@ else msg << pVampire->getName(); } -msg << " ̾ ϴ."; +msg << " 님이 슬레이어 성물을 가졌습니다."; GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(msg.toString()); @@ -77,7 +77,7 @@ gcSystemMessage.setMessage(msg.toString()); g_pZoneGroupManager->broadcast( &gcSystemMessage ); */ - // ´. + // 존 정보를 얻는다. Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); @@ -85,11 +85,11 @@ g_pZoneGroupManager->broadcast( &gcSystemMessage ); ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo( pZone->getZoneID() ); Assert( pZoneInfo != NULL ); - // ġ ˸. + // 위치를 알린다. StringStream msg; - msg << pCreature->getName() << " (" << ( pCreature->isSlayer() ? "̾" : "̾" ) << ") " + msg << pCreature->getName() << " 님(" << ( pCreature->isSlayer() ? "슬레이어" : "뱀파이어" ) << ")이 " << pZoneInfo->getFullName() << "(" << (int)pCreature->getX() << ", " << (int)pCreature->getY() - << ") (" << m_PartName << ") ֽϴ."; + << ")에서 피의 성서 조각(" << m_PartName << ")을 가지고 있습니다."; GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(msg.toString()); @@ -134,10 +134,10 @@ void EffectHasBloodBible::affect(Item* pItem) ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo( m_pZone->getZoneID() ); Assert( pZoneInfo != NULL ); - // ġ ˸. + // 위치를 알린다. StringStream msg; msg << pZoneInfo->getFullName() << "(" << (int)m_X << ", " << (int)m_Y - << ") ܿ (" << m_PartName << ") ֽϴ."; + << ")의 성단에 피의 성서 조각(" << m_PartName << ")이 있습니다."; GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(msg.toString()); @@ -158,7 +158,7 @@ void EffectHasBloodBible::affect(Item* pItem) pGCBBS->setX(m_X); pGCBBS->setY(m_Y); - // 츸 ޼ ش. + // 성에 전쟁이 진행중인 경우만 메세지를 보내준다. if (g_pWarSystem->hasActiveRaceWar()) { g_pHolyLandManager->broadcast(pGCBBS); } diff --git a/src/server/gameserver/EffectHasBloodBible.h b/src/server/gameserver/EffectHasBloodBible.h index 9c0d19e7..55798e0f 100644 --- a/src/server/gameserver/EffectHasBloodBible.h +++ b/src/server/gameserver/EffectHasBloodBible.h @@ -32,7 +32,7 @@ class EffectHasBloodBible : public EffectHasRelic { void setPart(int part); private: - string m_PartName; // ̸ + string m_PartName; // 피의 성서 조각 이름 }; #endif diff --git a/src/server/gameserver/EffectHasCastleSymbol.cpp b/src/server/gameserver/EffectHasCastleSymbol.cpp index adb64df9..ff04dbc5 100644 --- a/src/server/gameserver/EffectHasCastleSymbol.cpp +++ b/src/server/gameserver/EffectHasCastleSymbol.cpp @@ -59,7 +59,7 @@ void EffectHasCastleSymbol::affect(Creature* pCreature) { __BEGIN_TRY - // ´. + // 존 정보를 얻는다. Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); @@ -69,13 +69,13 @@ void EffectHasCastleSymbol::affect(Creature* pCreature) PlayerCreature* pPC = dynamic_cast(pCreature); Assert(pPC != NULL); - // ġ ˸. + // 위치를 알린다. /* StringStream msg; - msg << pCreature->getName() << " (" - //<< ( pCreature->isSlayer() ? "̾" : "̾" ) << ") " - << g_pGuildManager->getGuildName( pPC->getGuildID() ) << ") " + msg << pCreature->getName() << " 님(" + //<< ( pCreature->isSlayer() ? "슬레이어" : "뱀파이어" ) << ")이 " + << g_pGuildManager->getGuildName( pPC->getGuildID() ) << ")이 " << pZoneInfo->getFullName() << "(" << (int)pCreature->getX() << ", " << (int)pCreature->getY() - << ") ¡(" << m_PartName << ") ֽϴ."; + << ")에서 성의 상징(" << m_PartName << ")을 가지고 있습니다."; */ char msg[300]; @@ -117,7 +117,7 @@ void EffectHasCastleSymbol::affect(Item* pItem) if (m_pZone == NULL) return; - // 츸 ޼ ش. + // 성에 전쟁이 진행중인 경우만 메세지를 보내준다. ZoneID_t castleZoneID; bool isCastle; @@ -127,10 +127,10 @@ void EffectHasCastleSymbol::affect(Item* pItem) ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(m_pZone->getZoneID()); Assert(pZoneInfo != NULL); - // ġ ˸. + // 위치를 알린다. /* StringStream msg; msg << pZoneInfo->getFullName() << "(" << (int)m_X << ", " << (int)m_Y - << ") ܿ " << m_PartName << " ¡ ֽϴ."; + << ")의 성단에 " << m_PartName << " 성의 상징 이 있습니다."; */ char msg[200]; diff --git a/src/server/gameserver/EffectHasCastleSymbol.h b/src/server/gameserver/EffectHasCastleSymbol.h index 43da7802..b23e1836 100644 --- a/src/server/gameserver/EffectHasCastleSymbol.h +++ b/src/server/gameserver/EffectHasCastleSymbol.h @@ -35,7 +35,7 @@ class EffectHasCastleSymbol : public EffectHasRelic { void setPart(int part); private: - string m_PartName; // ¡ ̸ + string m_PartName; // 성의 상징 이름 static const EffectClass EffectClasses[6]; }; diff --git a/src/server/gameserver/EffectHasPet.cpp b/src/server/gameserver/EffectHasPet.cpp index 724d37e4..1aee28cc 100644 --- a/src/server/gameserver/EffectHasPet.cpp +++ b/src/server/gameserver/EffectHasPet.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectHasPet.cpp -// Written by : +// Written by : 쉭 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -65,7 +65,7 @@ void EffectHasPet::affect(Creature* pCreature) PlayerCreature* pPC = dynamic_cast(pCreature); Assert(pPC != NULL); - // cout << pPC->getName() << " ƽϴ." << endl; + // cout << pPC->getName() << " 의 펫이 밥먹을때가 됐습니다." << endl; GamePlayer* pGamePlayer = dynamic_cast(pPC->getPlayer()); Assert(pGamePlayer != NULL); @@ -80,11 +80,11 @@ void EffectHasPet::affect(Creature* pCreature) PetInfo* pPetInfo = pPetItem->getPetInfo(); - // cout << pPC->getName() << " " << pPetItem->getObjectID() << " Խϴ." << + // cout << pPC->getName() << " 의 펫인 " << pPetItem->getObjectID() << " 번 펫이 밥먹습니다." << // pPetInfo->getPetHP() << endl; if (pPetInfo == NULL) { - filelog("PetBug.log", "EffectHasPet ưµ : %s", pPC->getName().c_str()); + filelog("PetBug.log", "EffectHasPet 돌아가는데 펫이 없다 : %s", pPC->getName().c_str()); continue; } @@ -96,17 +96,17 @@ void EffectHasPet::affect(Creature* pCreature) int secsLast = pPetInfo->getLastFeedTime().secsTo(currentTime); // if ( secsLast > 70 ) // { - // filelog( "PetBug.log", " Դµ 70 Ѱ ɷȴ. %d : %s", secsLast, pPC->getName().c_str() + // filelog( "PetBug.log", "펫이 밥먹는데 70초 넘게 걸렸다. %d초 : %s", secsLast, pPC->getName().c_str() //); // } - // 50 10п ѹ Դ´. + // 50레벨 펫은 10분에 한번씩 밥먹는다. if (pPetInfo->getPetLevel() == 50 && secsLast < 600) continue; pPetInfo->setCurrentFeedTurn(pPetInfo->getCurrentFeedTurn() + 1); - // δ. + // 가끔 밥먹인다. if (pPetInfo->getCurrentFeedTurn() >= pPetInfo->getFeedTurn()) { pPetInfo->setCurrentFeedTurn(0); @@ -114,8 +114,8 @@ void EffectHasPet::affect(Creature* pCreature) pPetInfo->setFeedTime(currentTime); if (pPetInfo->getPetHP() == 0) { - filelog("Pet.log", "%s ׾.", pPC->getName().c_str()); - // cout << pPC->getName() << " ׾" << endl; + filelog("Pet.log", "%s의 펫이 죽었다.", pPC->getName().c_str()); + // cout << pPC->getName() << "의 펫이 죽었다" << endl; if (pPC->getPetInfo() == pPetInfo) { pPC->setPetInfo(NULL); pPC->initAllStatAndSend(); @@ -177,10 +177,10 @@ void EffectHasPet::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // cout << "EffectHasPet ϴ." << endl; + // cout << "EffectHasPet 지웁니다." << endl; - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_HAS_PET); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/EffectHasRelic.cpp b/src/server/gameserver/EffectHasRelic.cpp index 7a5042ff..047c3b5c 100644 --- a/src/server/gameserver/EffectHasRelic.cpp +++ b/src/server/gameserver/EffectHasRelic.cpp @@ -110,8 +110,8 @@ void EffectHasRelic::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(getEffectClass()); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/EffectHasRelic.h b/src/server/gameserver/EffectHasRelic.h index 16010a2c..74737347 100644 --- a/src/server/gameserver/EffectHasRelic.h +++ b/src/server/gameserver/EffectHasRelic.h @@ -50,7 +50,7 @@ class EffectHasRelic : public Effect { } protected: - int m_Part; // ȣ + int m_Part; // 피의 성서 조각 번호 Turn_t m_Tick; }; diff --git a/src/server/gameserver/EffectHasSlayerRelic.cpp b/src/server/gameserver/EffectHasSlayerRelic.cpp index 40490bef..25286763 100644 --- a/src/server/gameserver/EffectHasSlayerRelic.cpp +++ b/src/server/gameserver/EffectHasSlayerRelic.cpp @@ -64,7 +64,7 @@ else msg << pVampire->getName(); } -msg << " ̾ ϴ."; +msg << " 님이 슬레이어 성물을 가졌습니다."; GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(msg.toString()); @@ -72,14 +72,14 @@ gcSystemMessage.setMessage(msg.toString()); g_pZoneGroupManager->broadcast( &gcSystemMessage ); */ - // ´. + // 존 정보를 얻는다. Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(pZone->getZoneID()); Assert(pZoneInfo != NULL); - // ġ ˸. + // 위치를 알린다. char msg[100]; const char* race; @@ -96,11 +96,11 @@ g_pZoneGroupManager->broadcast( &gcSystemMessage ); // STRID_VAMPIRE ) ), (int)pCreature->getX(), (int)pCreature->getY()); - /* // ġ ˸. + /* // 위치를 알린다. StringStream msg; - msg << pCreature->getName() << " (" << ( pCreature->isSlayer() ? "̾" : "̾" ) << ") " + msg << pCreature->getName() << " 님(" << ( pCreature->isSlayer() ? "슬레이어" : "뱀파이어" ) << ")이 " << pZoneInfo->getFullName() << "(" << (int)pCreature->getX() << ", " << (int)pCreature->getY() - << ") ̾ ֽϴ."; */ + << ")에서 슬레이어 성물을 가지고 있습니다."; */ GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(msg); @@ -128,16 +128,16 @@ void EffectHasSlayerRelic::affect(Item* pItem) { Slayer* pSlayer = dynamic_cast(pCreature); - msg << pSlayer->getName() << " "; + msg << pSlayer->getName() << " 님이 "; } else { Vampire* pVampire = dynamic_cast(pCreature); - msg << pVampire->getName() << " "; + msg << pVampire->getName() << " 님이 "; } - msg << " ̾ ֽϴ." << endl; + msg << " 슬레이어 성물을 가지고 있습니다." << endl; GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(msg.toString()); diff --git a/src/server/gameserver/EffectHasSlayerRelic.h b/src/server/gameserver/EffectHasSlayerRelic.h index 40c65ddf..4403e88b 100644 --- a/src/server/gameserver/EffectHasSlayerRelic.h +++ b/src/server/gameserver/EffectHasSlayerRelic.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectHasSlayerRelic.h // Written by : -// Description : Doom ϰ effect +// Description : Doom에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_HAS_SLAYER_RELIC__ diff --git a/src/server/gameserver/EffectHasVampireRelic.cpp b/src/server/gameserver/EffectHasVampireRelic.cpp index 9b1f2b2e..cb7948a2 100644 --- a/src/server/gameserver/EffectHasVampireRelic.cpp +++ b/src/server/gameserver/EffectHasVampireRelic.cpp @@ -65,21 +65,21 @@ void EffectHasVampireRelic::affect(Creature* pCreature) msg << pVampire->getName(); } - msg << " ̾ ϴ."; + msg << " 님이 뱀파이어 성물을 가졌습니다."; GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(msg.toString()); g_pZoneGroupManager->broadcast( &gcSystemMessage ); */ - // ´. + // 존 정보를 얻는다. Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(pZone->getZoneID()); Assert(pZoneInfo != NULL); - // ġ ˸. + // 위치를 알린다. char msg[100]; const char* race; @@ -96,11 +96,11 @@ void EffectHasVampireRelic::affect(Creature* pCreature) // STRID_VAMPIRE ) ), (int)pCreature->getX(), (int)pCreature->getY()); - /* // ġ ˸. + /* // 위치를 알린다. StringStream msg; - msg << pCreature->getName() << " (" << ( pCreature->isSlayer() ? "̾" : "̾" ) << ") " + msg << pCreature->getName() << " 님(" << ( pCreature->isSlayer() ? "슬레이어" : "뱀파이어" ) << ")이 " << pZoneInfo->getFullName() << "(" << (int)pCreature->getX() << ", " << (int)pCreature->getY() - << ") ̾ ֽϴ."; */ + << ")에서 뱀파이어 성물을 가지고 있습니다."; */ GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(msg); @@ -127,16 +127,16 @@ void EffectHasVampireRelic::affect(Item* pItem) { Slayer* pSlayer = dynamic_cast(pCreature); - msg << pSlayer->getName() << " "; + msg << pSlayer->getName() << " 님이 "; } else { Vampire* pVampire = dynamic_cast(pCreature); - msg << pVampire->getName() << " "; + msg << pVampire->getName() << " 님이 "; } - msg << " ̾ ֽϴ." << endl; + msg << " 뱀파이어 성물을 가지고 있습니다." << endl; GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(msg.toString()); diff --git a/src/server/gameserver/EffectHasVampireRelic.h b/src/server/gameserver/EffectHasVampireRelic.h index 5d1804c2..49e8195b 100644 --- a/src/server/gameserver/EffectHasVampireRelic.h +++ b/src/server/gameserver/EffectHasVampireRelic.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectHasVampireRelic.h // Written by : -// Description : Doom ϰ effect +// Description : Doom에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_HAS_VAMPIRE_RELIC__ diff --git a/src/server/gameserver/EffectIncreaseAttr.cpp b/src/server/gameserver/EffectIncreaseAttr.cpp index 733731cb..e85193d9 100644 --- a/src/server/gameserver/EffectIncreaseAttr.cpp +++ b/src/server/gameserver/EffectIncreaseAttr.cpp @@ -29,7 +29,7 @@ EffectIncreaseAttr::EffectIncreaseAttr(Creature* pCreature) setTarget(pCreature); - // Effect̴. by sigi. 2002.11.14 + // 서버 전용 Effect이다. by sigi. 2002.11.14 m_bBroadcastingEffect = false; __END_CATCH diff --git a/src/server/gameserver/EffectKickOut.cpp b/src/server/gameserver/EffectKickOut.cpp index c0176c2d..98577a6f 100644 --- a/src/server/gameserver/EffectKickOut.cpp +++ b/src/server/gameserver/EffectKickOut.cpp @@ -7,12 +7,12 @@ #include "Zone.h" void EffectKickOut::affect() { - // 1п ѹ + // 1분에 한번 setNextTime(600); m_MinutesCount--; char msg[200]; - sprintf(msg, "涨ʱ仹ʣ%d.", m_MinutesCount); + sprintf(msg, "잼방땍珂쇌뻘假苟%d롸.", m_MinutesCount); GCSystemMessage gcSM; gcSM.setMessage(msg); m_pZone->broadcastPacket(&gcSM); @@ -22,7 +22,7 @@ void EffectKickOut::unaffect() { __BEGIN_TRY GCSystemMessage gcSM; - gcSM.setMessage("ѹ涨ʱ. 10ƶص."); + gcSM.setMessage("綠법방땍珂쇌. 10취빈盧땡돕릿삶뒈듐."); m_pZone->broadcastPacket(&gcSM); if (m_pZone != NULL) diff --git a/src/server/gameserver/EffectLoud.cpp b/src/server/gameserver/EffectLoud.cpp index 72d12c63..c63df492 100644 --- a/src/server/gameserver/EffectLoud.cpp +++ b/src/server/gameserver/EffectLoud.cpp @@ -36,7 +36,7 @@ void EffectLoud::unaffect(Creature* pCreature) Assert(pCreature != NULL); // Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_LOUD); Zone* pZone = pCreature->getZone(); @@ -45,7 +45,7 @@ void EffectLoud::unaffect(Creature* pCreature) // Ousters* pTargetOusters = dynamic_cast(pCreature); // Assert( pTargetOusters != NULL ); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_LOUD); diff --git a/src/server/gameserver/EffectLoveChain.cpp b/src/server/gameserver/EffectLoveChain.cpp index 06a09cbb..38b6d271 100644 --- a/src/server/gameserver/EffectLoveChain.cpp +++ b/src/server/gameserver/EffectLoveChain.cpp @@ -2,8 +2,8 @@ // Filename : EffectLoveChain.cpp // Written by : elca // Description : -// α Sniping Ǵ ̾ Invisibility ؼ -// ִ( ִ) ũĿ ٴ Ʈ̴. +// 군인기술 Sniping 또는 뱀파이어 기술 Invisibility로 인해서 +// 현재 점점 희미해져가고 있는(사라지고 있는) 크리쳐에 붙는 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #include "EffectLoveChain.h" @@ -56,7 +56,7 @@ void EffectLoveChain::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // Ʈ ÷װ ٸ ׾ٰų ϴ transport ʰڴٴ° ǹѴ. + // 이펙트 플레그가 없다면 죽었다거나 하는 문제로 transport 하지 않겠다는걸 의미한다. if (!pCreature->isFlag(Effect::EFFECT_CLASS_LOVE_CHAIN)) return; @@ -76,13 +76,13 @@ void EffectLoveChain::unaffect(Creature* pCreature) ZoneCoord_t y = pCreature->getY(); pCreature->removeFlag(Effect::EFFECT_CLASS_LOVE_CHAIN); - // Effect ˸. + // Effect 가 없어졌음을 알린다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_LOVE_CHAIN); pZone->broadcastPacket(x, y, &gcRemoveEffect); - // Target üũؼ ϸ Ѵ. + // Target 을 체크해서 전송이 가능하면 전송한다. bool bValid = false; __ENTER_CRITICAL_SECTION((*g_pPCFinder)) @@ -91,14 +91,14 @@ void EffectLoveChain::unaffect(Creature* pCreature) if (pTargetCreature != NULL) { Zone* pTargetZone = pTargetCreature->getZone(); if (pTargetZone != NULL) { - // δ ̵ . + // 마스터 레어로는 이동할 수 없다. if (!pTargetZone->isMasterLair() && !GDRLairManager::Instance().isGDRLairZone(pTargetZone->getZoneID())) { - // ̿ Ѱ? + // 유료 서비스 이용이 가능한가? if (pGamePlayer->loginPayPlay(pGamePlayer->getSocket()->getHost(), pGamePlayer->getID()) || !(g_pZoneInfoManager->getZoneInfo(pTargetZone->getZoneID())->isPayPlay())) { if (!pTargetCreature->isPC() || !(dynamic_cast(pTargetCreature)->getStore()->isOpen())) { - // ɺ, ÿܰ, ̺Ʈ, ̺ƮOX δ . + // 야전사령부, 시외곽지역, 이벤트경기장, 이벤트OX 존으로는 갈 수 없다. if (pTargetZone->getZoneID() != 2101 && pTargetZone->getZoneID() != 2102 && pTargetZone->getZoneID() != 1005 && pTargetZone->getZoneID() != 1006 && pTargetZone->getZoneID() != 1131 && pTargetZone->getZoneID() != 1132 && diff --git a/src/server/gameserver/EffectLoveChain.h b/src/server/gameserver/EffectLoveChain.h index 0f3d2253..9de00206 100644 --- a/src/server/gameserver/EffectLoveChain.h +++ b/src/server/gameserver/EffectLoveChain.h @@ -2,8 +2,8 @@ // Filename : EffectLoveChain.h // Written by : elca@ewestsoft.com // Description : -// α Sniping Ǵ ̾ Invisibility ؼ -// ִ( ִ) ũĿ ٴ Ʈ̴. +// 군인기술 Sniping 또는 뱀파이어 기술 Invisibility로 인해서 +// 현재 점점 희미해져가고 있는(사라지고 있는) 크리쳐에 붙는 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_LOVE_CHAIN__ @@ -56,10 +56,10 @@ class EffectLoveChain : public Effect { } private: - ObjectID_t m_OwnerOID; // Ʈ ɸ OwnerID - Zone* m_pZone; // Zone + ObjectID_t m_OwnerOID; // 이펙트 걸린 놈의 OwnerID + Zone* m_pZone; // Zone 포인터 string m_TargetName; // Target Name - ObjectID_t m_ItemObjectID; // Ʈ ̵ + ObjectID_t m_ItemObjectID; // 아이템의 오브젝트 아이디 }; #endif diff --git a/src/server/gameserver/EffectMPRecovery.h b/src/server/gameserver/EffectMPRecovery.h index ad3493b3..d8a96073 100644 --- a/src/server/gameserver/EffectMPRecovery.h +++ b/src/server/gameserver/EffectMPRecovery.h @@ -24,7 +24,7 @@ class EffectMPRecovery : public Effect { return EFFECT_CLASS_MP_RECOVERY; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } @@ -67,9 +67,9 @@ class EffectMPRecovery : public Effect { } private: - Turn_t m_Delay; // ʸ TICK ߵ Ǵ°. - MP_t m_MPQuantity; // Ϸ ȸ - Turn_t m_Period; // ȸ ϷǴµ ɸ ð. + Turn_t m_Delay; // 몇 초마다 TICK이 발동 되는가. + MP_t m_MPQuantity; // 완료시 회복량 + Turn_t m_Period; // 회복이 완료되는데 걸리는 시간. }; #endif diff --git a/src/server/gameserver/EffectManager.h b/src/server/gameserver/EffectManager.h index 650f3f83..40d36d1e 100644 --- a/src/server/gameserver/EffectManager.h +++ b/src/server/gameserver/EffectManager.h @@ -37,27 +37,27 @@ class EffectManager { Effect* findEffect(Effect::EffectClass EClass) const; Effect* findEffect(ObjectID_t ObjectID) const; - // Enemy Erase Ʈ Լ̴. + // Enemy Erase 이펙트를 가려내기 위한 함수이다. Effect* findEffect(Effect::EffectClass EClass, string EnemyName) const; - // priority_queue ϰ, affectѴ. + // priority_queue에 등록하고, affect한다. void addEffect(Effect* pEffect); Effect* getEffect() const { return m_Effects.front(); } - // ִ Ʈ deadline 0 . + // 현재 있는 모든 이펙트의 deadline 을 0으로 만든다. void setTimeOutAllEffect(); - // ð Ǿ ϴ Ʈ ãƼ affect Űų, - // expire Ʈ Ѵ. + // 일정 시간마다 실행되어야 하는 이펙트를 찾아서 affect 시키거나, + // expire 된 이펙트를 삭제한다. // int heartbeat() ; int heartbeat(const Timeval& currentTime); void sendEffectInfo(Creature* pCreature, Zone* pZone, ZoneCoord_t x, ZoneCoord_t y); - // Ʈ ȯ + // 현재 이펙트 개수 반환 uint getSize() const { return m_Effects.size(); } diff --git a/src/server/gameserver/EffectMasterLairPass.cpp b/src/server/gameserver/EffectMasterLairPass.cpp index af29be8f..c9ad79a1 100644 --- a/src/server/gameserver/EffectMasterLairPass.cpp +++ b/src/server/gameserver/EffectMasterLairPass.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectMasterLairPass.cpp -// Written by : +// Written by : 쉭 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -23,7 +23,7 @@ EffectMasterLairPass::EffectMasterLairPass(Creature* pCreature, ZoneID_t zoneID) setTarget(pCreature); - // Effect̴. by sigi. 2002.11.14 + // 서버 전용 Effect이다. by sigi. 2002.11.14 m_bBroadcastingEffect = false; __END_CATCH @@ -76,8 +76,8 @@ void EffectMasterLairPass::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_MASTER_LAIR_PASS); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/EffectMasterLairPass.h b/src/server/gameserver/EffectMasterLairPass.h index a139c08d..adfced11 100644 --- a/src/server/gameserver/EffectMasterLairPass.h +++ b/src/server/gameserver/EffectMasterLairPass.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectMasterLairPass.h // Written by : -// Description : ZoneID +// Description : ZoneID 마스터 레어 출입증 ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_MASTER_LAIR_PASS__ diff --git a/src/server/gameserver/EffectOnBridge.cpp b/src/server/gameserver/EffectOnBridge.cpp index 5fb0441b..3314ddc7 100644 --- a/src/server/gameserver/EffectOnBridge.cpp +++ b/src/server/gameserver/EffectOnBridge.cpp @@ -111,7 +111,7 @@ void EffectOnBridgeLoader::load(Zone* pZone) if (tile.canAddEffect()) { EffectOnBridge* pEffect = new EffectOnBridge(pZone, X, Y); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->registerObject(pEffect); pZone->addEffect(pEffect); tile.addEffect(pEffect); diff --git a/src/server/gameserver/EffectOnBridge.h b/src/server/gameserver/EffectOnBridge.h index db0eeaca..292167b4 100644 --- a/src/server/gameserver/EffectOnBridge.h +++ b/src/server/gameserver/EffectOnBridge.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectOnBridge.h // Written by : -// Description : OnBridge ϰ effect +// Description : OnBridge에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_ON_BRIDGE__ diff --git a/src/server/gameserver/EffectPKZoneRegen.cpp b/src/server/gameserver/EffectPKZoneRegen.cpp index 6206941f..36e60ea4 100644 --- a/src/server/gameserver/EffectPKZoneRegen.cpp +++ b/src/server/gameserver/EffectPKZoneRegen.cpp @@ -106,7 +106,7 @@ void EffectPKZoneRegen::affect(Creature* pCreature) m_pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcHP, pSlayer); } - // HP ġ ° ɷ + // HP는 다 치료된 상태고 흡혈에 걸려있으면 if (pSlayer->getHP(ATTR_CURRENT) >= pSlayer->getHP(ATTR_MAX) && pSlayer->isFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN)) { EffectBloodDrain* pEffect = @@ -140,14 +140,14 @@ void EffectPKZoneRegen::affect(Creature* pCreature) pVampire->setHP(min((int)pVampire->getHP(ATTR_MAX), (int)pVampire->getHP(ATTR_CURRENT) + m_HP)); - // Ѹ + // 넘한테 뿌릴꺼 gcHP.setCurrentHP(pVampire->getHP(ATTR_CURRENT)); - // ڱ ٲ + // 자기한테 보여줄꺼 GCModifyInformation gcMI; gcMI.addShortData(MODIFY_CURRENT_HP, pVampire->getHP(ATTR_CURRENT)); - // HP ǹ Ѿ Ǹ ǹ ش. + // HP가 실버 데미지를 넘어서게 되면 실버데미지를 날려 준다. if (pVampire->getHP(ATTR_CURRENT) > pVampire->getHP(ATTR_MAX) - pVampire->getSilverDamage()) { pVampire->setSilverDamage(pVampire->getHP(ATTR_MAX) - pVampire->getHP(ATTR_CURRENT)); @@ -171,7 +171,7 @@ void EffectPKZoneRegen::affect(Creature* pCreature) GCModifyInformation gcMI; - // HP ǹ Ѿ Ǹ ǹ ش. + // HP가 실버 데미지를 넘어서게 되면 실버데미지를 날려 준다. if (pOusters->getHP(ATTR_CURRENT) > pOusters->getHP(ATTR_MAX) - pOusters->getSilverDamage()) { pOusters->setSilverDamage(pOusters->getHP(ATTR_MAX) - pOusters->getHP(ATTR_CURRENT)); @@ -202,9 +202,9 @@ void EffectPKZoneRegen::unaffect() msg << "EffectPKZoneRegen[" << m_pZone->getZoneID() << "|(" << m_Rect.left << "," << m_Rect.top << "," << m_Rect.right << "," << m_Rect.bottom << ")]" - << " Ʈ .."; + << " 이펙트가 사라졌다.."; - filelog("PKZone.txt", "EffectPKZoneRegen[%d|(%d,%d,%d,%d)] Ʈ .", m_pZone->getZoneID(), m_Rect.left, + filelog("PKZone.txt", "EffectPKZoneRegen[%d|(%d,%d,%d,%d)] 이펙트가 사라졌다.", m_pZone->getZoneID(), m_Rect.left, m_Rect.top, m_Rect.right, m_Rect.bottom); __END_CATCH diff --git a/src/server/gameserver/EffectPKZoneRegen.h b/src/server/gameserver/EffectPKZoneRegen.h index fd28d17a..4c5e39be 100644 --- a/src/server/gameserver/EffectPKZoneRegen.h +++ b/src/server/gameserver/EffectPKZoneRegen.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectPKZoneRegen.h // Written by : -// Description : PKZoneRegen ϰ effect +// Description : PKZoneRegen에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_PK_ZONE_REGEN__ diff --git a/src/server/gameserver/EffectPKZoneResurrection.h b/src/server/gameserver/EffectPKZoneResurrection.h index e6203db5..43b3d532 100644 --- a/src/server/gameserver/EffectPKZoneResurrection.h +++ b/src/server/gameserver/EffectPKZoneResurrection.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectPKZoneResurrection.h // Written by : -// Description : PKZoneResurrection ϰ effect +// Description : PKZoneResurrection에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_PK_ZONE_RESURRECTION__ diff --git a/src/server/gameserver/EffectPacketSend.h b/src/server/gameserver/EffectPacketSend.h index 526ff0e9..6b9131ed 100644 --- a/src/server/gameserver/EffectPacketSend.h +++ b/src/server/gameserver/EffectPacketSend.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectPacketSend.h // Written by : -// Description : PacketSend ϰ effect +// Description : PacketSend에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_PACKET_SEND__ @@ -21,7 +21,7 @@ class EffectPacketSend : public Effect { EffectPacketSend(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y); public: - // -_-; KIN + // 안 쓴다 -_-; KIN EffectClass getEffectClass() const { return EFFECT_CLASS_PK_ZONE_REGEN; } diff --git a/src/server/gameserver/EffectPrecedence.cpp b/src/server/gameserver/EffectPrecedence.cpp index b8927a11..cc526f8b 100644 --- a/src/server/gameserver/EffectPrecedence.cpp +++ b/src/server/gameserver/EffectPrecedence.cpp @@ -21,7 +21,7 @@ EffectPrecedence::EffectPrecedence(Creature* pCreature) setTarget(pCreature); - // Effect̴. by sigi. 2002.11.14 + // 서버 전용 Effect이다. by sigi. 2002.11.14 m_bBroadcastingEffect = false; m_bItem = false; @@ -39,7 +39,7 @@ EffectPrecedence::EffectPrecedence(Item* pItem) m_bItem = true; - // Effect̴. by sigi. 2002.11.14 + // 서버 전용 Effect이다. by sigi. 2002.11.14 m_bBroadcastingEffect = false; __END_CATCH diff --git a/src/server/gameserver/EffectPrecedence.h b/src/server/gameserver/EffectPrecedence.h index 78c3faaf..1a1b6755 100644 --- a/src/server/gameserver/EffectPrecedence.h +++ b/src/server/gameserver/EffectPrecedence.h @@ -23,7 +23,7 @@ class EffectPrecedence : public Effect { return EFFECT_CLASS_PRECEDENCE; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } diff --git a/src/server/gameserver/EffectRecallMotorcycle.h b/src/server/gameserver/EffectRecallMotorcycle.h index 48e49b82..8d6aac4f 100644 --- a/src/server/gameserver/EffectRecallMotorcycle.h +++ b/src/server/gameserver/EffectRecallMotorcycle.h @@ -11,8 +11,8 @@ ////////////////////////////////////////////////////////////////////////////// // class EffectRecallMotorcycle; -// ð ٴ -// ٸ Ű ȴ. +// 일정 시간이 지나서 바닥의 아이템은 사라지고 +// 다른 존으로 옮겨지게 된다. ////////////////////////////////////////////////////////////////////////////// class Item; @@ -28,7 +28,7 @@ class EffectRecallMotorcycle : public Effect { return EFFECT_CLASS_TRANSPORT_ITEM; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } diff --git a/src/server/gameserver/EffectRefiniumTicket.cpp b/src/server/gameserver/EffectRefiniumTicket.cpp index 0c3eca95..c0e68016 100644 --- a/src/server/gameserver/EffectRefiniumTicket.cpp +++ b/src/server/gameserver/EffectRefiniumTicket.cpp @@ -39,7 +39,7 @@ void EffectRefiniumTicket::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_REFINIUM_TICKET); __END_CATCH diff --git a/src/server/gameserver/EffectRelic.cpp b/src/server/gameserver/EffectRelic.cpp index 93874355..fc3ad8c7 100644 --- a/src/server/gameserver/EffectRelic.cpp +++ b/src/server/gameserver/EffectRelic.cpp @@ -51,7 +51,7 @@ void EffectRelic::affect(Creature* pCreature) HP_t PlusHP = min(500, CurrentHP + m_Point); if (PlusHP < 500) { - cout << " ȸմϴ: " << PlusHP << endl; + cout << "에너지를 회복합니다: " << PlusHP << endl; } pMonster->setHP(PlusHP, ATTR_CURRENT); @@ -62,11 +62,11 @@ void EffectRelic::affect(Creature* pCreature) pZone->broadcastPacket(pMonster->getX(), pMonster->getY(), &pkt); } } else { - cout << " ƴ϶ Ʈ " << endl; + cout << "성물 보관함이 아니라면 이 이펙트가 붙지 못함" << endl; return; } } else { - cout << "Ͱ ƴ϶ Ʈ " << endl; + cout << "몬스터가 아니라면 이펙트가 붙지 못함" << endl; return; } @@ -98,8 +98,8 @@ void EffectRelic::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_RELIC); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/EffectRelic.h b/src/server/gameserver/EffectRelic.h index 34b31281..ec302d7d 100644 --- a/src/server/gameserver/EffectRelic.h +++ b/src/server/gameserver/EffectRelic.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectRelic.h // Written by : -// Description : Doom ϰ effect +// Description : Doom에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_RELIC__ @@ -46,7 +46,7 @@ class EffectRelic : public Effect { } private: - HP_t m_Point; // ȸ + HP_t m_Point; // 회복 에너지량 Turn_t m_Tick; }; diff --git a/src/server/gameserver/EffectRelicLock.h b/src/server/gameserver/EffectRelicLock.h index 6dd441fd..b2420e75 100644 --- a/src/server/gameserver/EffectRelicLock.h +++ b/src/server/gameserver/EffectRelicLock.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectRelicLock.h // Written by : -// Description : Doom ϰ effect +// Description : Doom에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_RELIC_LOCK__ @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////////////// // class EffectRelicLock ////////////////////////////////////////////////////////////////////////////// -// 뿡 ٴ Ʈ̴. +// 성물 보관대에 붙는 이펙트이다. class EffectRelicLock : public Effect { public: diff --git a/src/server/gameserver/EffectRelicPosition.cpp b/src/server/gameserver/EffectRelicPosition.cpp index c6185a2e..bb55b161 100644 --- a/src/server/gameserver/EffectRelicPosition.cpp +++ b/src/server/gameserver/EffectRelicPosition.cpp @@ -52,21 +52,21 @@ void EffectRelicPosition::affect(Item* pItem) { __BEGIN_TRY - // ´. + // 존 정보를 얻는다. ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(m_ZoneID); Assert(pZoneInfo != NULL); if (pItem->getItemClass() == Item::ITEM_CLASS_RELIC) { - // ´. + // 성물의 정보를 얻는다. ItemType_t relicIndex = pItem->getItemType(); const RelicInfo* pRelicInfo = dynamic_cast(g_pRelicInfoManager->getItemInfo(relicIndex)); Assert(pRelicInfo != NULL); // StringStream msg; - /* // ġ ˸. - msg << "(" << pRelicInfo->getName() << ") " - << pZoneInfo->getFullName() << "(" << (int)m_X << ", " << (int)m_Y << ") ֽϴ."; */ + /* // 위치를 알린다. + msg << "성물(" << pRelicInfo->getName() << ")이 " + << pZoneInfo->getFullName() << "(" << (int)m_X << ", " << (int)m_Y << ")에 떨어져 있습니다."; */ char msg[100]; @@ -97,8 +97,8 @@ void EffectRelicPosition::affect(Item* pItem) g_pZoneGroupManager->broadcast(pGCBBS); g_pShrineInfoManager->registerBloodBibleStatus(m_Part, pGCBBS); /* - msg << " " - << pZoneInfo->getFullName() << "(" << (int)m_X << ", " << (int)m_Y << ") ֽϴ."; + msg << "피의 성서 조각이 " + << pZoneInfo->getFullName() << "(" << (int)m_X << ", " << (int)m_Y << ")에 떨어져 있습니다."; g_pZoneGroupManager->broadcast( &gcSystemMessage ); */ @@ -107,8 +107,8 @@ void EffectRelicPosition::affect(Item* pItem) } else if (pItem->getItemClass() == Item::ITEM_CLASS_CASTLE_SYMBOL) { // StringStream msg; - // msg << " ¡ " - // << pZoneInfo->getFullName() << "(" << (int)m_X << ", " << (int)m_Y << ") ֽϴ."; + // msg << "성의 상징이 " + // << pZoneInfo->getFullName() << "(" << (int)m_X << ", " << (int)m_Y << ")에 떨어져 있습니다."; char msg[200]; sprintf(msg, g_pStringPool->c_str(STRID_BROADCAST_CASTLE_SYMBOL_POSITION_3), pZoneInfo->getFullName().c_str(), diff --git a/src/server/gameserver/EffectRelicTable.cpp b/src/server/gameserver/EffectRelicTable.cpp index 42b33916..6a96b0ab 100644 --- a/src/server/gameserver/EffectRelicTable.cpp +++ b/src/server/gameserver/EffectRelicTable.cpp @@ -80,8 +80,8 @@ void EffectRelicTable::unaffect(Item* pItem) Assert(pItem != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pItem->removeFlag(Effect::EFFECT_CLASS_HAS_SLAYER_RELIC); Zone* pZone = pItem->getZone(); @@ -100,7 +100,7 @@ void EffectRelicTable::unaffect(Item* pItem) __END_CATCH } -// SafeTime ʾ . +// SafeTime 이 지나지 않았으면 성물을 꺼낼 수 없다. bool EffectRelicTable::isSafeTime() const { Timeval currentTime; getCurrentTime(currentTime); @@ -108,7 +108,7 @@ bool EffectRelicTable::isSafeTime() const { return currentTime > m_SafeTime; } -// LockTime . +// LockTime 동안은 성물을 꺼낼 수 없다. bool EffectRelicTable::isLockTime() const { Timeval currentTime; getCurrentTime(currentTime); diff --git a/src/server/gameserver/EffectRelicTable.h b/src/server/gameserver/EffectRelicTable.h index 1d079fda..e2d6fe6e 100644 --- a/src/server/gameserver/EffectRelicTable.h +++ b/src/server/gameserver/EffectRelicTable.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectRelicTable.h // Written by : -// Description : Doom ϰ effect +// Description : Doom에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_RELIC_TABLE__ diff --git a/src/server/gameserver/EffectRideMotorcycle.h b/src/server/gameserver/EffectRideMotorcycle.h index fff98d13..11cec923 100644 --- a/src/server/gameserver/EffectRideMotorcycle.h +++ b/src/server/gameserver/EffectRideMotorcycle.h @@ -11,8 +11,8 @@ ////////////////////////////////////////////////////////////////////////////// // class EffectRideMotorcycle; -// ð ٴ -// ٸ Ű ȴ. +// 일정 시간이 지나서 바닥의 아이템은 사라지고 +// 다른 존으로 옮겨지게 된다. ////////////////////////////////////////////////////////////////////////////// class Slayer; @@ -28,7 +28,7 @@ class EffectRideMotorcycle : public Effect { return EFFECT_CLASS_TRANSPORT_ITEM; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } diff --git a/src/server/gameserver/EffectSchedule.h b/src/server/gameserver/EffectSchedule.h index d6a8b220..ada5c295 100644 --- a/src/server/gameserver/EffectSchedule.h +++ b/src/server/gameserver/EffectSchedule.h @@ -55,8 +55,8 @@ class EffectScheduleWork { } private: - int m_Code; // Ʈ ۾ ڵ - void* m_pData; // Ʈ ۾ ڵ忡 ʿ + int m_Code; // 이펙트에 대한 작업 코드 + void* m_pData; // 이펙트 작업 코드에 필요한 데이터 }; @@ -70,7 +70,7 @@ class EffectSchedule { ~EffectSchedule(); public: - // ۾ Ʈ Ѵ. + // 작업 대상인 이펙트를 더한다. Effect* getEffect(void) const { return m_pEffect; } @@ -78,10 +78,10 @@ class EffectSchedule { m_pEffect = pEffect; } - // ۾ Ѵ. + // 작업을 더한다. void addWork(int WorkCode, void* pData); - // ۾ ߿ տ ִ ۾ ͸ Ѵ. + // 작업 중에 제일 앞에 있는 작업의 포인터를 리턴한다. EffectScheduleWork* getFrontWork(void); private: @@ -100,10 +100,10 @@ class EffectScheduleManager { ~EffectScheduleManager(); public: - // Ʈ Ѵ. + // 이펙트 스케쥴을 더한다. void addEffectSchedule(EffectSchedule* pEffectSchedule); - // Ʈ Ѵ. + // 이펙트 스케쥴을 실행한다. void heartbeat(void); protected: diff --git a/src/server/gameserver/EffectShrineGuard.cpp b/src/server/gameserver/EffectShrineGuard.cpp index ec887adf..ef4e6704 100644 --- a/src/server/gameserver/EffectShrineGuard.cpp +++ b/src/server/gameserver/EffectShrineGuard.cpp @@ -70,7 +70,7 @@ void EffectShrineGuard::affect(Creature* pCreature) msg << pVampire->getName(); } - msg << " ̾ ϴ."; + msg << " 님이 슬레이어 성물을 가졌습니다."; GCSystemMessage gcSystemMessage; @@ -80,7 +80,7 @@ void EffectShrineGuard::affect(Creature* pCreature) g_pZoneGroupManager->broadcast( &gcSystemMessage ); - // Effectδ. + // Effect붙인다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID( pCreature->getObjectID() ); gcAddEffect.setEffectID( getEffectClass() ); @@ -139,8 +139,8 @@ void EffectShrineGuard::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_SHRINE_GUARD); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/EffectShrineGuard.h b/src/server/gameserver/EffectShrineGuard.h index 1d1d53ee..a0a7d21c 100644 --- a/src/server/gameserver/EffectShrineGuard.h +++ b/src/server/gameserver/EffectShrineGuard.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectShrineGuard.h // Written by : -// Description : Doom ϰ effect +// Description : Doom에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_SHRINE_GUARD__ @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////////////// // class EffectShrineGuard ////////////////////////////////////////////////////////////////////////////// -// 뿡 ٴ Ʈ̴. +// 성물 보관대에 붙는 이펙트이다. class EffectShrineGuard : public Effect { public: diff --git a/src/server/gameserver/EffectShrineHoly.cpp b/src/server/gameserver/EffectShrineHoly.cpp index e1e4a646..af25b042 100644 --- a/src/server/gameserver/EffectShrineHoly.cpp +++ b/src/server/gameserver/EffectShrineHoly.cpp @@ -70,7 +70,7 @@ else msg << pVampire->getName(); } -msg << " ̾ ϴ."; +msg << " 님이 슬레이어 성물을 가졌습니다."; GCSystemMessage gcSystemMessage; @@ -80,7 +80,7 @@ gcSystemMessage.setMessage(msg.toString()); g_pZoneGroupManager->broadcast( &gcSystemMessage ); -// Effectδ. +// Effect붙인다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID( pCreature->getObjectID() ); gcAddEffect.setEffectID( getEffectClass() ); @@ -140,8 +140,8 @@ void EffectShrineHoly::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_SHRINE_HOLY); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/EffectShrineHoly.h b/src/server/gameserver/EffectShrineHoly.h index b583dcaf..927803c6 100644 --- a/src/server/gameserver/EffectShrineHoly.h +++ b/src/server/gameserver/EffectShrineHoly.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectShrineHoly.h // Written by : -// Description : Doom ϰ effect +// Description : Doom에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_SHRINE_HOLY__ @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////////////// // class EffectShrineHoly ////////////////////////////////////////////////////////////////////////////// -// 뿡 ٴ Ʈ̴. +// 성물 보관대에 붙는 이펙트이다. class EffectShrineHoly : public Effect { public: diff --git a/src/server/gameserver/EffectShrineShield.cpp b/src/server/gameserver/EffectShrineShield.cpp index 7b319581..b4910084 100644 --- a/src/server/gameserver/EffectShrineShield.cpp +++ b/src/server/gameserver/EffectShrineShield.cpp @@ -100,8 +100,8 @@ void EffectShrineShield::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_SHRINE_SHIELD); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/EffectShrineShield.h b/src/server/gameserver/EffectShrineShield.h index a6f0235b..dba8c408 100644 --- a/src/server/gameserver/EffectShrineShield.h +++ b/src/server/gameserver/EffectShrineShield.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectShrineShield.h // Written by : -// Description : Doom ϰ effect +// Description : Doom에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_SHRINE_SHIELD__ @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////////////// // class EffectShrineShield ////////////////////////////////////////////////////////////////////////////// -// 뿡 ٴ Ʈ̴. +// 성물 보관대에 붙는 이펙트이다. class EffectShrineShield : public Effect { public: diff --git a/src/server/gameserver/EffectShutDown.h b/src/server/gameserver/EffectShutDown.h index b030a24b..b1d23f6f 100644 --- a/src/server/gameserver/EffectShutDown.h +++ b/src/server/gameserver/EffectShutDown.h @@ -26,7 +26,7 @@ class EffectShutDown : public Effect { return EFFECT_CLASS_SHUT_DOWN; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } diff --git a/src/server/gameserver/EffectSlayerRelic.cpp b/src/server/gameserver/EffectSlayerRelic.cpp index 7bd72af6..2487dfa0 100644 --- a/src/server/gameserver/EffectSlayerRelic.cpp +++ b/src/server/gameserver/EffectSlayerRelic.cpp @@ -75,7 +75,7 @@ void EffectSlayerRelic::affect(Creature* pCreature) msg << pVampire->getName(); } - msg << " ̾ ϴ."; + msg << " 님이 슬레이어 성물을 가졌습니다."; */ char msg[50]; @@ -89,7 +89,7 @@ void EffectSlayerRelic::affect(Creature* pCreature) g_pZoneGroupManager->broadcast(&gcSystemMessage); - // Effectδ. + // Effect붙인다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pCreature->getObjectID()); gcAddEffect.setEffectID(getSendEffectClass()); @@ -118,16 +118,16 @@ if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); - msg << pSlayer->getName() << " "; + msg << pSlayer->getName() << " 님이 "; } else { Vampire* pVampire = dynamic_cast(pCreature); - msg << pVampire->getName() << " "; + msg << pVampire->getName() << " 님이 "; } -msg << " ̾ ֽϴ." << endl; +msg << " 슬레이어 성물을 가지고 있습니다." << endl; GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(msg.toString()); @@ -177,8 +177,8 @@ void EffectSlayerRelic::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_SLAYER_RELIC); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/EffectSlayerRelic.h b/src/server/gameserver/EffectSlayerRelic.h index 65359ba5..36ea8d48 100644 --- a/src/server/gameserver/EffectSlayerRelic.h +++ b/src/server/gameserver/EffectSlayerRelic.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectSlayerRelic.h // Written by : -// Description : Doom ϰ effect +// Description : Doom에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_SLAYER_RELIC__ @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////////////// // class EffectSlayerRelic ////////////////////////////////////////////////////////////////////////////// -// 뿡 ٴ Ʈ̴. +// 성물 보관대에 붙는 이펙트이다. class EffectSlayerRelic : public Effect { public: diff --git a/src/server/gameserver/EffectTilePortal.cpp b/src/server/gameserver/EffectTilePortal.cpp index 35005aa4..acc30844 100644 --- a/src/server/gameserver/EffectTilePortal.cpp +++ b/src/server/gameserver/EffectTilePortal.cpp @@ -54,11 +54,11 @@ void EffectTilePortal::unaffect() // cout << "EffectTilePortal::unaffect() begin" << endl; - // ŸϿ Ʈ ϰ... + // 타일에서 이펙트를 삭제하고... Tile& tile = m_pZone->getTile(m_X, m_Y); tile.deleteEffect(m_ObjectID); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCDeleteEffectFromTile gcDeleteEffectFromTile; gcDeleteEffectFromTile.setEffectID(Effect::EFFECT_CLASS_TILE_PORTAL); gcDeleteEffectFromTile.setObjectID(m_ObjectID); diff --git a/src/server/gameserver/EffectTilePortal.h b/src/server/gameserver/EffectTilePortal.h index 93f0b769..fd61a508 100644 --- a/src/server/gameserver/EffectTilePortal.h +++ b/src/server/gameserver/EffectTilePortal.h @@ -49,7 +49,7 @@ class EffectTilePortal : public Effect { } private: - ZONE_COORD m_ZoneCoord; // Ż ǥ ID ǥ + ZONE_COORD m_ZoneCoord; // 포탈의 목표 존 ID 및 좌표 }; #endif // __EFFECT_TILE_PORTAL__ diff --git a/src/server/gameserver/EffectTranslation.cpp b/src/server/gameserver/EffectTranslation.cpp index e45285aa..bd87f737 100644 --- a/src/server/gameserver/EffectTranslation.cpp +++ b/src/server/gameserver/EffectTranslation.cpp @@ -57,8 +57,8 @@ void EffectTranslation::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_TRANSLATION); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/EffectTranslation.h b/src/server/gameserver/EffectTranslation.h index 7d3b8d94..75716b18 100644 --- a/src/server/gameserver/EffectTranslation.h +++ b/src/server/gameserver/EffectTranslation.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectTranslation.h // Written by : -// Description : Doom ϰ effect +// Description : Doom에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_TRANSLATION__ diff --git a/src/server/gameserver/EffectTransportCreature.h b/src/server/gameserver/EffectTransportCreature.h index 43b98856..34777690 100644 --- a/src/server/gameserver/EffectTransportCreature.h +++ b/src/server/gameserver/EffectTransportCreature.h @@ -3,7 +3,7 @@ // Written by : Reiot // Description : ////////////////////////////////////////////////////////////////////////////// -// ̰ Effect ƴϴ. +// 이거 검증된 Effect가 아니다. #ifndef __EFFECT_TRANSPORT_CREATURE_H__ #define __EFFECT_TRANSPORT_CREATURE_H__ @@ -26,7 +26,7 @@ class EffectTransportCreature : public Effect { return EFFECT_CLASS_TRANSPORT_CREATURE; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } diff --git a/src/server/gameserver/EffectTransportItem.h b/src/server/gameserver/EffectTransportItem.h index f5690d31..5ead85e7 100644 --- a/src/server/gameserver/EffectTransportItem.h +++ b/src/server/gameserver/EffectTransportItem.h @@ -11,8 +11,8 @@ ////////////////////////////////////////////////////////////////////////////// // class EffectTransportItem; -// ð ٴ -// ٸ Ű ȴ. +// 일정 시간이 지나서 바닥의 아이템은 사라지고 +// 다른 존으로 옮겨지게 된다. ////////////////////////////////////////////////////////////////////////////// class Item; @@ -28,7 +28,7 @@ class EffectTransportItem : public Effect { return EFFECT_CLASS_TRANSPORT_ITEM; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } diff --git a/src/server/gameserver/EffectTransportItemToCorpse.h b/src/server/gameserver/EffectTransportItemToCorpse.h index 8497d2b7..7b9e8ea5 100644 --- a/src/server/gameserver/EffectTransportItemToCorpse.h +++ b/src/server/gameserver/EffectTransportItemToCorpse.h @@ -11,8 +11,8 @@ ////////////////////////////////////////////////////////////////////////////// // class EffectTransportItemToCorpse; -// ð ٴ -// ٸ Ű ȴ. +// 일정 시간이 지나서 바닥의 아이템은 사라지고 +// 다른 존으로 옮겨지게 된다. ////////////////////////////////////////////////////////////////////////////// class Item; @@ -27,7 +27,7 @@ class EffectTransportItemToCorpse : public Effect { return EFFECT_CLASS_TRANSPORT_ITEM_TO_CORPSE; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. virtual ObjectPriority getObjectPriority() const { return OBJECT_PRIORITY_NONE; } diff --git a/src/server/gameserver/EffectTrying.h b/src/server/gameserver/EffectTrying.h index 96967a2e..eb141374 100644 --- a/src/server/gameserver/EffectTrying.h +++ b/src/server/gameserver/EffectTrying.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectTrying.h // Written by : -// Description : grand master Ƽ °. - -; by sigi. 2002.11.8 +// Description : grand master 티 내는거. - -; by sigi. 2002.11.8 ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_TRYING__ diff --git a/src/server/gameserver/EffectTryingPosition.cpp b/src/server/gameserver/EffectTryingPosition.cpp index 8635116e..3a9c8d80 100644 --- a/src/server/gameserver/EffectTryingPosition.cpp +++ b/src/server/gameserver/EffectTryingPosition.cpp @@ -82,7 +82,7 @@ void EffectTryingPosition::affect(Creature* pCreature) { if (!RegenZoneManager::getInstance()->canTryRegenZone(pPC, m_pTower)) return; - // Ÿ ̶ Ʈ ش. + // 리젠존타워가 먹히는 중이라는 이펙트를 찍어준다. EffectTryRegenZone* pTowerEffect = new EffectTryRegenZone(m_pTower); Assert(pTowerEffect != NULL); diff --git a/src/server/gameserver/EffectTryingPosition.h b/src/server/gameserver/EffectTryingPosition.h index db095266..62850721 100644 --- a/src/server/gameserver/EffectTryingPosition.h +++ b/src/server/gameserver/EffectTryingPosition.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectTryingPosition.h // Written by : -// Description : TryingPosition ϰ effect +// Description : TryingPosition에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_TRYING_POSITION__ diff --git a/src/server/gameserver/EffectVampireRelic.cpp b/src/server/gameserver/EffectVampireRelic.cpp index d592cfdc..586339b3 100644 --- a/src/server/gameserver/EffectVampireRelic.cpp +++ b/src/server/gameserver/EffectVampireRelic.cpp @@ -77,7 +77,7 @@ void EffectVampireRelic::affect(Creature* pCreature) msg << pVampire->getName(); } - msg << " ̾ ϴ."; + msg << " 님이 뱀파이어 성물을 가졌습니다."; */ char msg[50]; @@ -93,7 +93,7 @@ void EffectVampireRelic::affect(Creature* pCreature) g_pZoneGroupManager->broadcast(&gcSystemMessage); - // Effectδ. + // Effect붙인다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pCreature->getObjectID()); gcAddEffect.setEffectID(getSendEffectClass()); @@ -121,16 +121,16 @@ if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); - msg << pSlayer->getName() << " "; + msg << pSlayer->getName() << " 님이 "; } else { Vampire* pVampire = dynamic_cast(pCreature); - msg << pVampire->getName() << " "; + msg << pVampire->getName() << " 님이 "; } -msg << " ̾ ֽϴ." << endl; +msg << " 뱀파이어 성물을 가지고 있습니다." << endl; GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(msg.toString()); @@ -180,8 +180,8 @@ void EffectVampireRelic::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_VAMPIRE_RELIC); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/EffectVampireRelic.h b/src/server/gameserver/EffectVampireRelic.h index 91556d87..94d9d944 100644 --- a/src/server/gameserver/EffectVampireRelic.h +++ b/src/server/gameserver/EffectVampireRelic.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectVampireRelic.h // Written by : -// Description : Doom ϰ effect +// Description : Doom에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_VAMPIRE_RELIC__ diff --git a/src/server/gameserver/EffectWithWarning.cpp b/src/server/gameserver/EffectWithWarning.cpp index 3513ee75..9baa92af 100644 --- a/src/server/gameserver/EffectWithWarning.cpp +++ b/src/server/gameserver/EffectWithWarning.cpp @@ -21,7 +21,7 @@ Effect::EffectClass EffectWithWarning::getEffectClass() const { } void EffectWithWarning::start() { - // cout << "" << m_SignDuration << endl; + // cout << "시작하지롱" << m_SignDuration << endl; setNextTime(m_SignDuration); setDeadline(m_SignDuration + m_MainDuration); @@ -41,7 +41,7 @@ void EffectWithWarning::start() { void EffectWithWarning::affect() { __BEGIN_TRY - // cout << "" << m_X << ", " << m_Y << endl; + // cout << "때리지롱" << m_X << ", " << m_Y << endl; if (!m_State) { GCDeleteEffectFromTile gcDET; @@ -110,7 +110,7 @@ void EffectIcicle::affect() { forward_list::const_iterator itr = rList.begin(); forward_list::const_iterator endItr = rList.end(); - // cout << "?" << endl; + // cout << "아프냐?" << endl; for (; itr != endItr; ++itr) { Object* pObject = *itr; @@ -155,12 +155,12 @@ void EffectIcicle::affect() { gcHP.setCurrentHP(finalHP); m_pZone->broadcastPacket(m_X, m_Y, &gcHP); - // cout << "" << endl; + // cout << "아프다" << endl; if (pCreature->isFlag(Effect::EFFECT_CLASS_ICE_FIELD_TO_CREATURE)) continue; - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectIceFieldToCreature* pEffect = new EffectIceFieldToCreature(pCreature); pEffect->setDeadline(50); pCreature->addEffect(pEffect); @@ -244,7 +244,7 @@ void EffectLargeIcicle::affect() { if (pCreature->isFlag(Effect::EFFECT_CLASS_ICE_FIELD_TO_CREATURE)) continue; - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectIceFieldToCreature* pEffect = new EffectIceFieldToCreature(pCreature); pEffect->setDeadline(50); pCreature->addEffect(pEffect); @@ -333,7 +333,7 @@ void EffectSideTrap::affect() { if (pCreature->isFlag(Effect::EFFECT_CLASS_ICE_FIELD_TO_CREATURE)) continue; - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectIceFieldToCreature* pEffect = new EffectIceFieldToCreature(pCreature); pEffect->setDeadline(50); pCreature->addEffect(pEffect); diff --git a/src/server/gameserver/Event.h b/src/server/gameserver/Event.h index 1a55beab..3574a96d 100644 --- a/src/server/gameserver/Event.h +++ b/src/server/gameserver/Event.h @@ -13,8 +13,8 @@ ////////////////////////////////////////////////////////////////////////////// // class Event; -// ÷̾ Ŭ Ǿ , -// ð Ŀ Ư ׼ ϵ ش. +// 플레이어 클래스에 연관되어 있으며, +// 일정 시간 후에 특정 액션을 취하도록 해준다. ////////////////////////////////////////////////////////////////////////////// class GamePlayer; @@ -22,20 +22,20 @@ class GamePlayer; class Event { public: enum EventClass { - EVENT_CLASS_RESURRECT, // ũó ׾ , ȰŰ.. - EVENT_CLASS_MORPH, // ̾ -> ̾ - EVENT_CLASS_RESTORE, // ̾ -> ̾ - EVENT_SAVE, // ֱ ũó ϱ - EVENT_CLASS_REGENERATION, // ̾ ֱ ȸֱ - EVENT_CLASS_RELOAD_INFO, // DB info reloadѴ. - EVENT_CLASS_TRANSPORT, // Zone̵ Ѵ. - EVENT_CLASS_KICK, // Ŀ kickѴ. - EVENT_CLASS_SYSTEM_MESSAGE, // Incoming System޼ ִٰ ѷش. - EVENT_CLASS_REFRESH_HOLY_LAND_PLAYER, // Holy Land Race Bonus ȭ Holy Land Player Stat - EVENT_CLASS_SHUTDOWN, // ڵ ϰ ˴ٿ - EVENT_CLASS_HEAD_COUNT, // 30п ѹ Ӹ - EVENT_CLASS_CBILLING, // ߱ . ֱ minus point/minute Ŷ . - EVENT_CLASS_AUTH, // Nprotect + EVENT_CLASS_RESURRECT, // 크리처가 죽었을 경우, 부활시키기.. + EVENT_CLASS_MORPH, // 슬레이어 -> 뱀파이어변신 + EVENT_CLASS_RESTORE, // 뱀파이어 -> 슬레이어 변신 + EVENT_SAVE, // 주기적으로 크리처 정보를 저장하기 + EVENT_CLASS_REGENERATION, // 뱀파이어를 주기적으로 회복해주기 + EVENT_CLASS_RELOAD_INFO, // DB에서 info를 reload한다. + EVENT_CLASS_TRANSPORT, // Zone이동 한다. + EVENT_CLASS_KICK, // 얼마 후에 kick한다. + EVENT_CLASS_SYSTEM_MESSAGE, // Incoming에서 받은 System메세지를 갖고 있다가 뿌려준다. + EVENT_CLASS_REFRESH_HOLY_LAND_PLAYER, // Holy Land Race Bonus 변화에 따라 Holy Land Player Stat 을 갱신 + EVENT_CLASS_SHUTDOWN, // 사용자들을 몽땅 정리하고 셧다운 + EVENT_CLASS_HEAD_COUNT, // 30분에 한번씩 머리 딴 갯수 세장 + EVENT_CLASS_CBILLING, // 중국 빌링. 주기적으로 minus point/minute 패킷을 보낸다. + EVENT_CLASS_AUTH, // Nprotect 인증 EVENT_CLASS_MAX }; @@ -47,7 +47,7 @@ class Event { virtual EventClass getEventClass() const = 0; // get event life-cycle - // ⺻ ̺Ʈ 1ȸ̴. + // 기본적으로 모든 이벤트들은 1회용이다. virtual bool isTemporary() const { return true; } @@ -65,8 +65,8 @@ class Event { virtual string toString() const = 0; protected: - GamePlayer* m_pGamePlayer; // ÷̾ ü - Timeval m_Deadline; // ð + GamePlayer* m_pGamePlayer; // 게임 플레이어 객체 + Timeval m_Deadline; // 실행 시간 }; #endif diff --git a/src/server/gameserver/EventAuth.cpp b/src/server/gameserver/EventAuth.cpp index 92359341..d688bca4 100644 --- a/src/server/gameserver/EventAuth.cpp +++ b/src/server/gameserver/EventAuth.cpp @@ -22,7 +22,7 @@ EventAuth::EventAuth(GamePlayer* pGamePlayer) : Event(pGamePlayer) { - // 1 + // 1분 setDeadline(600); } @@ -46,15 +46,15 @@ void EventAuth::activate() // if ( !m_pGamePlayer->getCSAuth().IsAuth() ) if (true) { - filelog("CSAuth.log", "[%s] ð ʰ߽ϴ.", m_pGamePlayer->getID().c_str()); + filelog("CSAuth.log", "[%s] 인증 시간 제한을 초과했습니다.", m_pGamePlayer->getID().c_str()); GCSystemMessage gcSystemMessage; - gcSystemMessage.setMessage("nProtect GameGuard ֤ʧ.ִļGameGuardļ."); + gcSystemMessage.setMessage("nProtect GameGuard 훰聯呵겨.獵契匡숭댄轎샀GameGuard匡숭愆뻐."); m_pGamePlayer->sendPacket(&gcSystemMessage); EventKick* pKick = new EventKick(m_pGamePlayer); pKick->setDeadline(100); - // pKick->setMessage("GameGuard ð ʰ߽ϴ.. 10 ڿ ˴ϴ."); + // pKick->setMessage("GameGuard 인증 제한 시간이 초과했습니다.. 10초 뒤에 접속이 종료됩니다."); pKick->sendMessage(); m_pGamePlayer->addEvent(pKick); @@ -66,7 +66,7 @@ void EventAuth::activate() } } - // 5п ѹ + // 5분에 한번 Timeval delay; delay.tv_sec = 300; delay.tv_usec = 0; diff --git a/src/server/gameserver/EventCBilling.cpp b/src/server/gameserver/EventCBilling.cpp index 78c11a8e..9e8c05b5 100644 --- a/src/server/gameserver/EventCBilling.cpp +++ b/src/server/gameserver/EventCBilling.cpp @@ -38,14 +38,14 @@ void EventCBilling::activate() Assert(m_pGamePlayer != NULL); if (!m_pGamePlayer->isCBillingVerified()) { - // Login Ŷ ߴٸ ٽ . ( ־ ̴. ) + // 아직 Login 패킷을 보내지 못했다면 다시 보낸다. ( 연결이 끊겨 있어서 보내지 못한 생태이다. ) m_pGamePlayer->setCBillingVerified(g_pCBillingPlayerManager->sendLogin(m_pGamePlayer)); m_TrySendLoginCount++; } - // Login Ŷ ´ٸ minus point packet , ƴ϶ ׾ д. + // Login 패킷을 보냈다면 minus point packet 을 보내고, 아니라면 쌓아 둔다. if (m_pGamePlayer->isCBillingVerified()) { - // Ŷ . minus point/minute + // 빌링 패킷을 보낸다. minus point/minute if (!g_pCBillingPlayerManager->sendMinusPoint(m_pGamePlayer)) { m_pGamePlayer->increaseMissedMinusPointPacket(); } @@ -59,11 +59,11 @@ void EventCBilling::activate() } } } else { - // Login packet ̴. minus packet ɷ ϰ ׾Ƶд. + // Login packet 을 보내지 못한 상태이다. minus packet 도 못보낸걸로 하고 쌓아둔다. m_pGamePlayer->increaseMissedMinusPointPacket(); } - // ð Ѵ. + // 다음에 보낼 시간 설정한다. 분 단위 static int interval = g_pCBillingPlayerManager->getMinusIntervalInt(); Timeval delay; diff --git a/src/server/gameserver/EventCBilling.h b/src/server/gameserver/EventCBilling.h index 7e63e8ef..81b2d3c6 100644 --- a/src/server/gameserver/EventCBilling.h +++ b/src/server/gameserver/EventCBilling.h @@ -37,7 +37,7 @@ class EventCBilling : public Event { } private: - int m_TrySendLoginCount; // Login Ŷ õ ȸ + int m_TrySendLoginCount; // Login 패킷을 보내기 시도 회수 }; #endif diff --git a/src/server/gameserver/EventItemUtil.cpp b/src/server/gameserver/EventItemUtil.cpp index 059ed199..d48bf3da 100644 --- a/src/server/gameserver/EventItemUtil.cpp +++ b/src/server/gameserver/EventItemUtil.cpp @@ -79,7 +79,7 @@ Item* getCardItem(MoonCard card) { } if (putInDB) { - filelog("MoonCard.log", " Խϴ. : %d", (int)card); + filelog("MoonCard.log", "아이템이 나왔습니다. : %d", (int)card); Statement* pStmt = NULL; BEGIN_DB { @@ -163,7 +163,7 @@ Item* getLuckyBagItem(LuckyBag luckybag) { } if (putInDB) { - filelog("LuckyBag.log", " Խϴ. : %d", (int)luckybag); + filelog("LuckyBag.log", "아이템이 나왔습니다. : %d", (int)luckybag); Statement* pStmt = NULL; BEGIN_DB { @@ -249,7 +249,7 @@ Item* getGiftBoxItem(GiftBox giftbox) { } if (putInDB) { - filelog("GiftBox.log", " Խϴ. : %d", (int)giftbox + 1); + filelog("GiftBox.log", "아이템이 나왔습니다. : %d", (int)giftbox + 1); Statement* pStmt = NULL; BEGIN_DB { @@ -266,7 +266,7 @@ Item* getGiftBoxItem(GiftBox giftbox) { } int getBlackGiftBoxType(int t1, int t2) { - // ʻ ϵڵ̴ -- + // 필살 하드코딩이다 -ㅠ- int min = 0; int max = 0; diff --git a/src/server/gameserver/EventMonsterNameManager.cpp b/src/server/gameserver/EventMonsterNameManager.cpp index 70688472..93ffbbc2 100644 --- a/src/server/gameserver/EventMonsterNameManager.cpp +++ b/src/server/gameserver/EventMonsterNameManager.cpp @@ -59,7 +59,7 @@ void MonsterNameManager::init() BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); - // First Name εѴ. + // First Name을 로드한다. pResult = pStmt->executeQuery("SELECT * FROM FirstNameInfo"); nCount = pResult->getRowCount(); if (nCount == 0) { @@ -76,7 +76,7 @@ void MonsterNameManager::init() nCount++; } - // Middle Name εѴ. + // Middle Name을 로드한다. pResult = pStmt->executeQuery("SELECT * FROM MiddleNameInfo"); nCount = pResult->getRowCount(); if (nCount == 0) { @@ -93,7 +93,7 @@ void MonsterNameManager::init() nCount++; } - // Last Name εѴ. + // Last Name을 로드한다. pResult = pStmt->executeQuery("SELECT * FROM LastNameInfo"); nCount = pResult->getRowCount(); if (nCount == 0) { @@ -142,21 +142,21 @@ string MonsterNameManager::getRandomName(Monster* pMonster) /* if (0 < MonsterLevel && MonsterLevel <= 33) { - // ϱ Ĵ Ʈ Ӹ ٴ´. + // 하급 뱀파는 라스트 네임만 붙는다. nFirstNameIndex = -1; nMiddleNameIndex = -1; nLastNameIndex = rand()%m_nLastNameCount; } else if (33 < MonsterLevel && MonsterLevel <= 66) { - // ߱ Ĵ ۽Ʈ Ʈ Ӹ ٴ´. + // 중급 뱀파는 퍼스트와 라스트 네임만 붙는다. nFirstNameIndex = rand()%m_nFirstNameCount; nMiddleNameIndex = -1; nLastNameIndex = rand()%m_nLastNameCount; } else { - // Ĵ ̸ ٴ´. + // 고급 뱀파는 모든 이름이 다 붙는다. nFirstNameIndex = rand()%m_nFirstNameCount; nMiddleNameIndex = rand()%m_nMiddleNameCount; nLastNameIndex = rand()%m_nLastNameCount; @@ -164,7 +164,7 @@ string MonsterNameManager::getRandomName(Monster* pMonster) */ /* - * ũ ̸ ߿ ٴ´ٳ... + * 존마다 유니크한 이름은 나중에다 붙는다네... * ulonglong NameKey = 0; @@ -194,10 +194,10 @@ string MonsterNameManager::getRandomName(Monster* pMonster) return Name; } - // trial 300 ʰϸ, ̸ ã ߴٴ - // ̴ϱ, ƹ ̸̳ ٿش. + // trial이 300번을 초과하면, 제대로 된 이름을 찾지 못했다는 + // 말이니까, 아무 이름이나 붙여준다. if (Name == "") - Name == ""; + Name == "무명씨"; return Name; diff --git a/src/server/gameserver/EventRefreshHolyLandPlayer.cpp b/src/server/gameserver/EventRefreshHolyLandPlayer.cpp index fa183dc8..eeb58052 100644 --- a/src/server/gameserver/EventRefreshHolyLandPlayer.cpp +++ b/src/server/gameserver/EventRefreshHolyLandPlayer.cpp @@ -36,15 +36,15 @@ void EventRefreshHolyLandPlayer::activate() unordered_map::const_iterator zItr = zones.begin(); for (; zItr != zones.end(); ++zItr) { - // cout << zItr->second->getZoneID() << " update" << endl; + // cout << zItr->second->getZoneID() << " 존 update" << endl; zItr->second->setRefreshHolyLandPlayer(true); } } - // ƴ ִ ÷̾ Ѵ.( ʽ) + // 아담의 성지에 있는 플레이어들의 정보를 새로 계산한다.(피의 성서 보너스) // g_pHolyLandManager->refreshHolyLandPlayers(); - /* // ƴ ʽ Ѹ. + /* // 아담의 성지 전역에 피의 성서 보너스 정보를 뿌린다. GCHolyLandBonusInfo gcHolyLandBonusInfo; g_pBloodBibleBonusManager->makeHolyLandBonusInfo( gcHolyLandBonusInfo ); g_pHolyLandManager->broadcast( &gcHolyLandBonusInfo ); diff --git a/src/server/gameserver/EventRegeneration.cpp b/src/server/gameserver/EventRegeneration.cpp index 6937eecb..5cc5b47e 100644 --- a/src/server/gameserver/EventRegeneration.cpp +++ b/src/server/gameserver/EventRegeneration.cpp @@ -52,19 +52,19 @@ void EventRegeneration::activate() if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); - HP_t oldHP = pSlayer->getHP(ATTR_CURRENT); // HP - MP_t oldMP = pSlayer->getMP(ATTR_CURRENT); // MP + HP_t oldHP = pSlayer->getHP(ATTR_CURRENT); // 현재 HP + MP_t oldMP = pSlayer->getMP(ATTR_CURRENT); // 현재 MP - HP_t maxHP = pSlayer->getHP(ATTR_MAX); // ƽ HP - MP_t maxMP = pSlayer->getMP(ATTR_MAX); // ƽ MP + HP_t maxHP = pSlayer->getHP(ATTR_MAX); // 현재 맥스 HP + MP_t maxMP = pSlayer->getMP(ATTR_MAX); // 현재 맥스 MP - // ȸų HP MP Ѵ. + // 리젠율에 따라 회복시킬 HP와 MP의 양을 계산한다. // HP_t regenHP = getPercentValue(maxHP, pSlayer->getHPRegen()); // MP_t regenMP = getPercentValue(maxMP, pSlayer->getMPRegen()); HP_t regenHP = pSlayer->getHPRegen() * 2; MP_t regenMP = pSlayer->getMPRegen() * 2; - // MAX Ѿ ϴ. + // MAX를 넘어가면 곤란하다. HP_t newHP = min((int)(oldHP + regenHP), (int)maxHP); MP_t newMP = min((int)(oldMP + regenMP), (int)maxMP); @@ -73,7 +73,7 @@ void EventRegeneration::activate() GCModifyInformation GCMI; - // HP Ǿ εijش. + // HP가 변경되었으니 브로드캐스팅해준다. if (oldHP != newHP) { GCMI.addShortData(MODIFY_CURRENT_HP, newHP); @@ -87,7 +87,7 @@ void EventRegeneration::activate() GCMI.addShortData(MODIFY_CURRENT_MP, newMP); } - // HP MP Ǿٸ, Ǿٴ ο ˷ش. + // HP나 MP가 변경되었다면, 변경되었다는 사실을 본인에게 알려준다. if (GCMI.getShortCount() != 0 || GCMI.getLongCount() != 0) m_pGamePlayer->sendPacket(&GCMI); } else if (pCreature->isVampire()) { @@ -100,26 +100,26 @@ void EventRegeneration::activate() /* if (pVampire->isFlag(Effect::EFFECT_CLASS_HIDE)) { - // ̵ϰ ú HP ȴ. + // 하이드하고 있을 때는 평상시보다 HP가 빨리 차게 된다. regenHP = getPercentValue(maxHP, 15 + pVampire->getHPRegen() + pVampire->getINT(ATTR_CURRENT)/60); newHP = min((int)(oldHP + regenHP), (int)maxHP); } else { - // ÿ... + // 평상시에는... regenHP = getPercentValue(maxHP, 10 + pVampire->getHPRegen() + pVampire->getINT(ATTR_CURRENT)/60); newHP = min((int)(oldHP + regenHP), (int)maxHP); } */ - // ΰ ƴѰ ˻Ѵ. - // ̵峪  ִ ˻簡 , - // ̵ ¿ HP ȸ ƾ Vampire::heartbeat()  ֱ ̴. + // 박쥐 상태인가 아닌가만을 검사한다. + // 하이드나 관에 들어가 있는 상태 검사가 없는 이유는, + // 이들 상태에 의한 HP 회복 루틴은 Vampire::heartbeat()에 들어가 있기 때문이다. if (pVampire->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT)) { - // ¿ HP ȸ ʴ´. + // 박쥐 상태에서는 HP가 회복되지 않는다. regenHP = 0; } else { - // ÿ... + // 평상시에는... regenHP = pVampire->getHPRegen() * 2; } @@ -129,7 +129,7 @@ void EventRegeneration::activate() GCModifyInformation GCMI; - // HP Ǿ εijش. + // HP가 변경되었으니 브로드캐스팅해준다. if (oldHP != newHP) { GCMI.addShortData(MODIFY_CURRENT_HP, newHP); @@ -139,25 +139,25 @@ void EventRegeneration::activate() pZone->broadcastPacket(pVampire->getX(), pVampire->getY(), &gcStatusCurrentHP, pVampire); } - // HP Ǿٴ ο ˷ش. + // HP가 변경되었다는 사실을 본인에게 알려준다. if (GCMI.getShortCount() != 0 || GCMI.getLongCount() != 0) m_pGamePlayer->sendPacket(&GCMI); } else if (pCreature->isOusters()) { Ousters* pOusters = dynamic_cast(pCreature); - HP_t oldHP = pOusters->getHP(ATTR_CURRENT); // HP - MP_t oldMP = pOusters->getMP(ATTR_CURRENT); // MP + HP_t oldHP = pOusters->getHP(ATTR_CURRENT); // 현재 HP + MP_t oldMP = pOusters->getMP(ATTR_CURRENT); // 현재 MP - HP_t maxHP = pOusters->getHP(ATTR_MAX); // ƽ HP - MP_t maxMP = pOusters->getMP(ATTR_MAX); // ƽ MP + HP_t maxHP = pOusters->getHP(ATTR_MAX); // 현재 맥스 HP + MP_t maxMP = pOusters->getMP(ATTR_MAX); // 현재 맥스 MP - // ȸų HP MP Ѵ. + // 리젠율에 따라 회복시킬 HP와 MP의 양을 계산한다. // HP_t regenHP = getPercentValue(maxHP, pOusters->getHPRegen()); // MP_t regenMP = getPercentValue(maxMP, pOusters->getMPRegen()); HP_t regenHP = pOusters->getHPRegen() * 2; MP_t regenMP = pOusters->getMPRegen() * 2; - // MAX Ѿ ϴ. + // MAX를 넘어가면 곤란하다. HP_t newHP = min((int)(oldHP + regenHP), (int)maxHP); MP_t newMP = min((int)(oldMP + regenMP), (int)maxMP); @@ -169,7 +169,7 @@ void EventRegeneration::activate() GCModifyInformation GCMI; - // HP Ǿ εijش. + // HP가 변경되었으니 브로드캐스팅해준다. if (oldHP != newHP) { GCMI.addShortData(MODIFY_CURRENT_HP, newHP); @@ -183,13 +183,13 @@ void EventRegeneration::activate() GCMI.addShortData(MODIFY_CURRENT_MP, newMP); } - // HP MP Ǿٸ, Ǿٴ ο ˷ش. + // HP나 MP가 변경되었다면, 변경되었다는 사실을 본인에게 알려준다. if (GCMI.getShortCount() != 0 || GCMI.getLongCount() != 0) m_pGamePlayer->sendPacket(&GCMI); } } - // 10 ʸ ȸ ֱ ؼ deadline Ѵ. + // 10 초마다 회복시켜 주기 위해서는 deadline 을 증가시켜 줘야 한다. Timeval delay; delay.tv_sec = 10; delay.tv_usec = 0; diff --git a/src/server/gameserver/EventReloadInfo.cpp b/src/server/gameserver/EventReloadInfo.cpp index 6089e5dc..5122397a 100644 --- a/src/server/gameserver/EventReloadInfo.cpp +++ b/src/server/gameserver/EventReloadInfo.cpp @@ -51,7 +51,7 @@ void EventReloadInfo::activate() __BEGIN_TRY __BEGIN_DEBUG - //(m_pGamePlayer != NULL);//NULL ִ. + //(m_pGamePlayer != NULL);//NULL일 수 있다. switch (m_InfoType) { case MASTER_LAIR_INFO: @@ -59,12 +59,12 @@ void EventReloadInfo::activate() break; case MONSTER_INFO: { - // m_InfoValue loading Monster SpriteType̴. + // m_InfoValue는 loading할 Monster의 SpriteType이다. if (m_InfoValue == 0) { - // loading + // 전부 다 loading g_pMonsterInfoManager->reload(0); } else { - // SpriteType õ ͵ ˾Ƴ. + // SpriteType과 관련된 몬스터들을 알아낸다. const vector& monsters = g_pMonsterInfoManager->getMonsterTypeBySprite(m_InfoValue); vector::const_iterator itr = monsters.begin(); @@ -87,7 +87,7 @@ void EventReloadInfo::activate() break; case ITEM_INFO: { - // m_InfoValue loading ItemInfo Class̴ + // m_InfoValue는 loading할 ItemInfo의 Class이다 g_pItemInfoManager->getInfoManager((Item::ItemClass)m_InfoValue)->reload(); } break; @@ -122,8 +122,8 @@ void EventReloadInfo::activate() pWarScheduler->load(); // StringStream msg; - // msg << "[" << (int)zoneID << "] " << pWarScheduler->getSize() << " - // غԴϴ."; + // msg << "[" << (int)zoneID << "] 성에는 " << pWarScheduler->getSize() << " + // 개의 전쟁이 준비중입니다."; char msg[100]; sprintf(msg, g_pStringPool->c_str(STRID_WAR_SCHEDULE_INFO), (int)zoneID, pWarScheduler->getSize()); diff --git a/src/server/gameserver/EventResurrect.cpp b/src/server/gameserver/EventResurrect.cpp index eb649fd0..e38d3a79 100644 --- a/src/server/gameserver/EventResurrect.cpp +++ b/src/server/gameserver/EventResurrect.cpp @@ -51,17 +51,17 @@ void EventResurrect::activate() Assert(pDeadPC != NULL); - // ̵ ¿ ׾ٸ, ̵带 Ǯش. + // 하이드한 상태에서 죽었다면, 하이드를 풀어준다. pDeadPC->removeFlag(Effect::EFFECT_CLASS_HIDE); - // 带 ٲش. + // 무브모드를 바꿔준다. if (pDeadPC->isVampire() && pDeadPC->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT)) { pDeadPC->setMoveMode(Creature::MOVE_MODE_FLYING); } else { pDeadPC->setMoveMode(Creature::MOVE_MODE_WALKING); } - // HP äش. + // HP를 채워준다. if (pDeadPC->isSlayer()) { Slayer* pSlayer = dynamic_cast(pDeadPC); pSlayer->setHP(pSlayer->getHP(ATTR_MAX), ATTR_CURRENT); @@ -73,38 +73,38 @@ void EventResurrect::activate() pOusters->setHP(pOusters->getHP(ATTR_MAX), ATTR_CURRENT); } - // zone ʴ´. by sigi. 2002.5.11 + // 새 zone을 설정하지 않는다. by sigi. 2002.5.11 Zone* pOldZone = pDeadPC->getZone(); Assert(pOldZone != NULL); try { - // ׷ ZPM ÷̾ Ѵ. + // 존그룹의 ZPM에서 플레이어를 삭제한다. pOldZone->getZoneGroup()->getZonePlayerManager()->deletePlayer(m_pGamePlayer->getSocket()->getSOCKET()); - // ⼭ Save ̺Ʈ IPM ʴ´. + // 여기서 설정해줘야지만 Save 이벤트가 IPM에서 동작하지 않는다. m_pGamePlayer->setPlayerStatus(GPS_WAITING_FOR_CG_READY); - // IPM ÷̾ ű. + // IPM으로 플레이어를 옮긴다. // g_pIncomingPlayerManager->pushPlayer(m_pGamePlayer); pOldZone->getZoneGroup()->getZonePlayerManager()->pushOutPlayer(m_pGamePlayer); } catch (NoSuchElementException& t) { filelog("eventRessurect.txt", "%s-%s", t.toString().c_str(), pDeadPC->getName().c_str()); cerr << "EventResurrect::activate() : NoSuchElementException" << endl; - // throw Error(" ÷̾ ʽϴ."); - //  .. -_-; - // ϰ.. ׳ Ѵ. + // throw Error("존에 플레이어가 존재하지 않습니다."); + // 어떻게 없어졌겠지.. -_-; + // 무시하고.. 그냥 진행한다. // by sigi. 2002.11.25 } - // ׾ killCreature ϱ ׳ Ҵ ȴ. + // 죽었을 당시 killCreature에서 존을 셋팅 하기 때문에 그냥 할당 받으면 된다. - // ̰Ŵ ZonePlayerManager heartbeat óѴ. - // ּó by sigi. 2002.5.14 + // 이거는 ZonePlayerManager의 heartbeat에서 처리한다. + // 주석처리 by sigi. 2002.5.14 // pDeadPC->registerObject(); /* - // GCUpdateInfo Ŷ д. + // GCUpdateInfo 패킷을 만들어둔다. GCUpdateInfo gcUpdateInfo; makeGCUpdateInfo(&gcUpdateInfo, pDeadPC); diff --git a/src/server/gameserver/EventResurrect.h b/src/server/gameserver/EventResurrect.h index 45bd606d..393eb74b 100644 --- a/src/server/gameserver/EventResurrect.h +++ b/src/server/gameserver/EventResurrect.h @@ -33,7 +33,7 @@ class EventResurrect : public Event { Zone* getResurrectZone() { return m_pResurrectZone; } void setResurrectZone(Zone* ResurrectZone) { m_pResurrectZone = ResurrectZone; } - // Ȱ ġ + // 부활할 위치 ZoneCoord_t getX() const { return m_X; } void setX(ZoneCoord_t x) { m_X = x; } diff --git a/src/server/gameserver/EventSave.h b/src/server/gameserver/EventSave.h index aa8ad7c6..6133a197 100644 --- a/src/server/gameserver/EventSave.h +++ b/src/server/gameserver/EventSave.h @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////////////// // class EventSave; -// ij͸ ֱ ϵ ִ ̺Ʈ̴. +// 각 캐릭터를 주기적으로 저장하도록 해주는 이벤트이다. ////////////////////////////////////////////////////////////////////////////// class EventSave : public Event { @@ -25,7 +25,7 @@ class EventSave : public Event { } // get event life-cycle - // EventSave ̺Ʈ ֱ Ǿ ϹǷ, Ǿ ȵȴ. + // EventSave 이벤트는 주기적으로 계속 실행되어야 하므로, 삭제되어서는 안된다. virtual bool isTemporary() const { return false; } diff --git a/src/server/gameserver/EventShutdown.cpp b/src/server/gameserver/EventShutdown.cpp index c3cdd04f..7a4790ab 100644 --- a/src/server/gameserver/EventShutdown.cpp +++ b/src/server/gameserver/EventShutdown.cpp @@ -43,22 +43,22 @@ void EventShutdown::activate() g_pIncomingPlayerManager->clearPlayers(); } catch (Throwable& t) { - // + // 무시 } #ifdef __CONNECT_BILLING_SYSTEM__ - // Ѵ. + // 모든 빌링 정보를 삭제한다. g_pBillingPlayerManager->sendPayInit(); #endif #if !defined(__THAILAND_SERVER__) && !defined(__CHINA_SERVER__) - // μ . ~ ׾~~ ~ + // 프로세스 종료. 꺄꺄~ 죽어라~~ 꺄꺄~ if (g_pVariableManager->isKillDaemonCtl() == 1) { kill(getppid(), 9); } #else - // μ . ~ ׾~~ ~ + // 프로세스 종료. 꺄꺄~ 죽어라~~ 꺄꺄~ if (g_pVariableManager->isKillDaemonCtl() == 1 && g_pVariableManager->isRemoveAllGame() == false && g_pVariableManager->isEggDummyDB() == false) { kill(getppid(), 9); diff --git a/src/server/gameserver/EventTransport.cpp b/src/server/gameserver/EventTransport.cpp index 3d3ecd44..5999dc6b 100644 --- a/src/server/gameserver/EventTransport.cpp +++ b/src/server/gameserver/EventTransport.cpp @@ -52,7 +52,7 @@ void EventTransport::sendMessage() Turn_t RemainTime = max(0, (int)(m_Deadline.tv_sec - currentTime.tv_sec)); // StringStream msg; - // msg << (int)RemainTime << " Ŀ " << m_ZoneName << " ̵˴ϴ."; + // msg << (int)RemainTime << "초 후에 " << m_ZoneName << "로 이동됩니다."; char msg[50]; sprintf(msg, g_pStringPool->c_str(STRID_TRANSPORT_CREATURE), (int)RemainTime, m_ZoneName.c_str()); @@ -91,28 +91,28 @@ void EventTransport::activate() dropFlagToZone(pPC, bSendPacket); dropSweeperToZone(pPC, bSendPacket); - // Zone Ѵ. + // Zone에서 제거한다. pOldZone->deleteCreature(pCreature, pCreature->getX(), pCreature->getY()); - // ̵ؾ Zone Ѵ. + // 이동해야할 Zone을 설정한다. pCreature->setNewZone(getZoneByZoneID(m_ZoneID)); pCreature->setNewXY(m_X, m_Y); try { - // ׷ ZPM ÷̾ Ѵ. + // 존그룹의 ZPM에서 플레이어를 삭제한다. pOldZone->getZoneGroup()->getZonePlayerManager()->deletePlayer(m_pGamePlayer->getSocket()->getSOCKET()); - // ⼭ Save ̺Ʈ IPM ʴ´. + // 여기서 설정해줘야지만 Save 이벤트가 IPM에서 동작하지 않는다. m_pGamePlayer->setPlayerStatus(GPS_WAITING_FOR_CG_READY); - // IPM ÷̾ ű. + // IPM으로 플레이어를 옮긴다. // g_pIncomingPlayerManager->pushPlayer(m_pGamePlayer); pOldZone->getZoneGroup()->getZonePlayerManager()->pushOutPlayer(m_pGamePlayer); } catch (NoSuchElementException& t) { filelog("eventTransport.txt", "%s", t.toString().c_str()); cerr << "EventTransport::activate() : NoSuchElementException" << endl; - throw Error(" ÷̾ ʽϴ."); + throw Error("존에 플레이어가 존재하지 않습니다."); } diff --git a/src/server/gameserver/FameLimitInfo.cpp b/src/server/gameserver/FameLimitInfo.cpp index 4083de33..186f5cb7 100644 --- a/src/server/gameserver/FameLimitInfo.cpp +++ b/src/server/gameserver/FameLimitInfo.cpp @@ -103,7 +103,7 @@ void FameLimitInfoManager::load() throw Error("There is no data in FameLimitInfo Table"); } - // ü Ѵ. + // 전체 갯수를 세팅한다. pResult->next(); int count = pResult->getInt(1) + 1; diff --git a/src/server/gameserver/FiniteStateMachine.cpp b/src/server/gameserver/FiniteStateMachine.cpp index ce7d065f..e69e5210 100644 --- a/src/server/gameserver/FiniteStateMachine.cpp +++ b/src/server/gameserver/FiniteStateMachine.cpp @@ -8,14 +8,14 @@ void FiniteStateMachine::heartbeat(Timeval currentTime) { } else nextState = m_pCurrentState->heartbeat(currentTime); - // ° ٲ + // 상태가 바뀌는 경우 if (nextState != 0) { - // ¸ + // 현재 상태를 끝내고 cout << "End state " << m_pCurrentState->toString() << endl; m_pCurrentState->end(); m_pStateFactory->wasteState(m_pCurrentState); - // · . + // 다음 상태로 간다. State* pNextState = m_pStateFactory->makeState(nextState); m_pCurrentState = pNextState; cout << "Start state " << m_pCurrentState->toString() << endl; diff --git a/src/server/gameserver/FiniteStateMachine.h b/src/server/gameserver/FiniteStateMachine.h index d38b131a..6502c13a 100644 --- a/src/server/gameserver/FiniteStateMachine.h +++ b/src/server/gameserver/FiniteStateMachine.h @@ -9,7 +9,7 @@ #include "VSDateTime.h" /** - * ⺻ abstract class + * 기본 abstract class들 **/ class State { public: @@ -18,7 +18,7 @@ class State { virtual DWORD getStateType() const = 0; - // ¸ return Ѵ. StateType 0 ° ʴ´ٴ ǹ. + // 다음 상태를 return 한다. StateType 0 은 상태가 변하지 않는다는 의미. virtual DWORD heartbeat(Timeval currentTime) = 0; virtual void start() {} @@ -65,11 +65,11 @@ class FiniteStateMachine { }; /** - * ɸ ⺻ class + * 자주 사용될만한 기본 class들 **/ class TimerState : public State { public: - // ʴ̴. + // 수명은 초단위이다. TimerState(DWORD nState, Turn_t life) : m_TimeOutState(nState), m_LifeSpan(life) {} void start(); DWORD heartbeat(Timeval currentTime); @@ -103,8 +103,8 @@ class SetTimeState : public State { Timeval m_Deadline; }; -// ׳ state ְ ִ ü Ѱش. -// ü ȿ ° ٸ FSM ȵǹǷ +// 그냥 모든 state를 갖고 있고 갖고 있는 객체를 넘겨준다. +// 객체 안에 상태가 들어있을 경우 서로 다른 FSM에서 공유가 안되므로 주의 class FlyweightStateFactory : public StateFactory { public: void registerState(State* pState) { diff --git a/src/server/gameserver/FlagSet.h b/src/server/gameserver/FlagSet.h index 65c12590..1b322be4 100644 --- a/src/server/gameserver/FlagSet.h +++ b/src/server/gameserver/FlagSet.h @@ -15,33 +15,33 @@ #define FLAG_SIZE_MAX 3 * 8 enum FlagSetType { - FLAGSET_RECEIVE_NEWBIE_ITEM, // 0 - ʺڿ + FLAGSET_RECEIVE_NEWBIE_ITEM, // 0 - 초보자용 아이템 받은 경우 FLAGSET_RECEIVE_NEWBIE_ITEM_FIGHTER, // 1 - sword, blade FLAGSET_RECEIVE_NEWBIE_ITEM_CLERIC, // 2 - heal, enchant FLAGSET_RECEIVE_NEWBIE_ITEM_GUNNER, // 3 - gun - FLAGSET_TRADE_GIFT_BOX_2002_12, // 4 - 2002.12 ũ ̺Ʈ ȯ - FLAGSET_RECEIVE_GREEN_GIFT_BOX, // 5 - ٸ κ ڸ ޾ҳ + FLAGSET_TRADE_GIFT_BOX_2002_12, // 4 - 2002.12 크리스마스 이벤트 빨간 선물 상자 교환 여부 + FLAGSET_RECEIVE_GREEN_GIFT_BOX, // 5 - 다른 사람으로부터 녹색 선물 상자를 받았나 - FLAGSET_RECEIVE_NEWBIE_ITEM_AUTO, // 6 - ʺڿ ڵ ޾ƾ ϴ + FLAGSET_RECEIVE_NEWBIE_ITEM_AUTO, // 6 - 초보자용 아이템을 자동으로 받아야 하는지 - FLAGSET_RECEIVE_PREMIUM_EVENT_ITEM_2003_3, // 7 - 2003.3.1 ̾ ڵ鿡 ش. + FLAGSET_RECEIVE_PREMIUM_EVENT_ITEM_2003_3, // 7 - 2003.3.1 프리미엄 사용자들에게 선물 준다. - FLAGSET_IS_COUPLE, // 7 - ̹ Ŀΰ. - FLAGSET_WAS_COUPLE, // 8 - Ŀ ̾. - 2003.3 Ŀ̺Ʈ + FLAGSET_IS_COUPLE, // 7 - 이미 커플인가. + FLAGSET_WAS_COUPLE, // 8 - 커플 이었다. - 2003.3 월 커플이벤트용 - FLAGSET_NOT_JUST_CREATED, // 9 - ijͰ ƴѰ. + FLAGSET_NOT_JUST_CREATED, // 9 - 막 생성된 캐릭터가 아닌가. - FLAGSET_CLEAR_RANK_BONUS_5, // 10 - 5 ų ʱȭ ִ°? - FLAGSET_CLEAR_RANK_BONUS_10, // 11 - 10 ų ʱȭ ִ°? - FLAGSET_CLEAR_RANK_BONUS_15, // 12 - 15 ų ʱȭ ִ°? - FLAGSET_CLEAR_RANK_BONUS_20, // 13 - 20 ų ʱȭ ִ°? + FLAGSET_CLEAR_RANK_BONUS_5, // 10 - 5 레벨 계급 스킬을 초기화 한 적이 있는가? + FLAGSET_CLEAR_RANK_BONUS_10, // 11 - 10 레벨 계급 스킬을 초기화 한 적이 있는가? + FLAGSET_CLEAR_RANK_BONUS_15, // 12 - 15 레벨 계급 스킬을 초기화 한 적이 있는가? + FLAGSET_CLEAR_RANK_BONUS_20, // 13 - 20 레벨 계급 스킬을 초기화 한 적이 있는가? - FLAGSET_GNOMES_HORN, // 14 - ξ° + FLAGSET_GNOMES_HORN, // 14 - 대지정령의 뿔 계약을 맺었는가 - FLAGSET_SWAP_COAT, // 15 -  Ǹ ٲ° - FLAGSET_SWAP_TROUSER, // 16 -  Ǹ ٲ° - FLAGSET_SWAP_WEAPON, // 17 - ⸦ ٲ° + FLAGSET_SWAP_COAT, // 15 - 방어구 상의를 바꿨는거 + FLAGSET_SWAP_TROUSER, // 16 - 방어구 하의를 바꿨는거 + FLAGSET_SWAP_WEAPON, // 17 - 무기를 바꿨는가 FLAGSET_MAX }; diff --git a/src/server/gameserver/GDRLairAbstractStates.cpp b/src/server/gameserver/GDRLairAbstractStates.cpp index 346db51d..662aee30 100644 --- a/src/server/gameserver/GDRLairAbstractStates.cpp +++ b/src/server/gameserver/GDRLairAbstractStates.cpp @@ -64,13 +64,13 @@ Turn_t GDRScene::ActionSay::execute() { gcSay.setMessage(g_pStringPool->getString(m_strID)); gcSay.setColor(0x00ffffff); - cout << "巹 մϴ : " << gcSay.getMessage() << endl; + cout << "질드레가 말합니다 : " << gcSay.getMessage() << endl; getTarget()->getZone()->broadcastPacket(getTarget()->getX(), getTarget()->getY(), &gcSay); GCGlobalChat gcGC; gcGC.setColor(0x00ffffff); - gcGC.setMessage("巹 " + g_pStringPool->getString(m_strID)); + gcGC.setMessage("질드레 " + g_pStringPool->getString(m_strID)); gcGC.setRace(RACE_VAMPIRE); getTarget()->getZone()->broadcastPacket(&gcGC); @@ -216,7 +216,7 @@ void MonsterSummonState::GroupSummonInfo::executeSummon(Zone* pZone) { for (; itr != endItr; ++itr) { for (int i = 0; i < (*itr)->m_MonsterNum; ++i) { - cout << " ȯ " << (*itr)->m_MonsterType << endl; + cout << "몬스터 소환 " << (*itr)->m_MonsterType << endl; Monster* pMonster = new Monster((*itr)->m_MonsterType); pMonster->setTreasure(false); try { diff --git a/src/server/gameserver/GDRLairAbstractStates.h b/src/server/gameserver/GDRLairAbstractStates.h index 13d3ffcf..ac7a2455 100644 --- a/src/server/gameserver/GDRLairAbstractStates.h +++ b/src/server/gameserver/GDRLairAbstractStates.h @@ -17,8 +17,8 @@ class GDRScene : public State { ACTION_SAY, ACTION_WALK, ACTION_EFFECT, - ACTION_HOLLYWOOD, // -_- ùķ̼ ׼ - ACTION_WARP, // ֵ ġ Ѵ + ACTION_HOLLYWOOD, // -_- 시뮬레이션 액션 + ACTION_WARP, // 애들 다 데리고 지정 위치로 워프한다 }; class Action { @@ -32,7 +32,7 @@ class GDRScene : public State { Action(Monster* pTarget) : m_pTarget(pTarget) {} virtual ~Action() {} virtual ActionType getActionType() const = 0; - // 0 . ƴϸ executeҶ ð + // 다 했으면 0을 리턴. 아니면 다음번 execute할때까지 시간을 리턴 virtual Turn_t execute() = 0; }; @@ -136,7 +136,7 @@ class GDRScene : public State { public: GDRScene(DWORD nState) : m_NextState(nState) {} - // Ŭ ݵ ڿ start ҷ ȴ. + // 하위 클래스에서는 반드시 세팅을 끝낸 뒤에 이 start 를 불러줘야 된다. void start(); DWORD heartbeat(Timeval currentTime); }; diff --git a/src/server/gameserver/GDRLairManager.h b/src/server/gameserver/GDRLairManager.h index 02090e46..9062fab6 100644 --- a/src/server/gameserver/GDRLairManager.h +++ b/src/server/gameserver/GDRLairManager.h @@ -28,7 +28,7 @@ enum GDRLairStatus { GDR_LAIR_KILL_ALL, }; -// . ְ ð Ǹ  ش. +// 평시. 레어는 쉬고 있고 시간이 되면 레어를 열어준다. class GDRLairIdle : public SetTimeState { public: DWORD getStateType() const { @@ -48,7 +48,7 @@ class GDRLairIdle : public SetTimeState { private: }; -// 20а  鼭 Ϸ Ȱȭȴ. +// 20분간 레어가 열리면서 일루젼스 웨이 함정이 활성화된다. class GDRLairEntrance : public TimerState { public: DWORD getStateType() const { @@ -67,9 +67,9 @@ class GDRLairEntrance : public TimerState { } }; -// Ա ڿ 5а Ϸ ̸ ִ ð ִ. -// ׳ 5 ð°Ű Ϸ ̸ Ѹ̶ ϸ ٷ Icepole -// State Ѿ. +// 레어 입구가 닫힌 뒤에도 5분간 일루젼스 웨이를 통과할 수 있는 시간이 있다. +// 그냥 5분 시간끄는거고 일루젼스 웨이를 한명이라도 통과하면 바로 Icepole +// State로 넘어간다. /*class GDRLairIllusionsWayOnly : public TimerState { public: @@ -84,9 +84,9 @@ class GDRLairEntrance : public TimerState { string toString() const { return "GDRLairIllusionsWayOnly"; } };*/ -// Ϸ ̸ ÷̾ ִٸ ִ ð -// ش. ȯϰ ڸ 1еڿ -// ִ Ʈ.. (--) +// 일루젼스 웨이를 통과한 플레이어가 있다면 얼음 기둥을 깰 수 있는 시간을 +// 준다. 시작할 때 얼음 기둥을 소환하고 얼음 기둥 깨지면 그 자리에 1분뒤에 +// 데미지를 주는 얼음기둥 이펙트가.. (--) class GDRLairIcepole : public State { public: void start(); @@ -106,8 +106,8 @@ class GDRLairIcepole : public State { Timeval m_BroadcastTime; }; -// ִٸ 巹 Ѵ. -// 巹 ȯǰ Ʈ ߻ϰ 巹 1 Ѵ. +// 얼음 기둥을 통과한 넘이 있다면 질드레가 등장한다. +// 질드레가 소환되고 이펙트가 발생하고 질드레 대사 1을 한다. class GDRLairScene1 : public GDRScene { public: GDRLairScene1() : GDRScene(GDR_LAIR_SUMMON_MONSTER) {} @@ -125,9 +125,9 @@ class GDRLairScene1 : public GDRScene { } }; -// 巹  Ϲ ͸ 10ȸ ȯѴ. -// Ƴ Idle -// 10ȸ ȯ ڿ Ƴ Scene2 +// 질드레 레어에 일반 몬스터를 10회 소환한다. +// 살아남은 넘이 없어지면 Idle로 +// 10회 소환한 뒤에도 살아남은 넘이 있으면 Scene2로 class GDRLairSummonMonster : public MonsterSummonState { public: GDRLairSummonMonster(); @@ -146,8 +146,8 @@ class GDRLairSummonMonster : public MonsterSummonState { } }; -// 巹 2 ϰ Ʈ ġ ̵ -// 3 Ѵ. +// 질드레가 대사 2를 하고 이펙트 시전 후 지정 위치로 이동한 뒤 +// 대사 3을 한다. class GDRLairScene2 : public GDRScene { public: GDRLairScene2() : GDRScene(GDR_LAIR_SUMMON_GDR_DUP) {} @@ -165,7 +165,7 @@ class GDRLairScene2 : public GDRScene { } }; -// 巹 н ȯѴ. +// 질드레가 분신을 소환한다. class GDRLairSummonGDRDup : public MonsterSummonState { public: GDRLairSummonGDRDup(); @@ -184,7 +184,7 @@ class GDRLairSummonGDRDup : public MonsterSummonState { } }; -// 巹 4 ϰ Ʈ Ѵ. +// 질드레가 대사 4를 하고 이펙트를 시전한다. class GDRLairScene3 : public GDRScene { public: GDRLairScene3() : GDRScene(GDR_LAIR_GDR_FIGHT) {} @@ -202,7 +202,7 @@ class GDRLairScene3 : public GDRScene { } }; -// 巹 ȰȭǾ ÷̾ ο. +// 질드레가 활성화되어 플레이어들과 싸운다. class GDRLairGDRFight : public State { public: DWORD getStateType() const { @@ -220,9 +220,9 @@ class GDRLairGDRFight : public State { } }; -// 巹 5 ϰ ´. -// 巹 ھ ÷̾ Űܹ -// 巹 ü 6 Ѵ. +// 질드레가 대사 5를 하고 엔딩 연출이 나온다. +// 이후 질드레 코어로 플레이어를 몽땅 옮겨버린뒤 +// 질드레 각성체가 대사 6을 한다. class GDRLairScene4 : public GDRScene { public: GDRLairScene4() : GDRScene(GDR_LAIR_AWAKENED_GDR_FIGHT) {} @@ -239,8 +239,8 @@ class GDRLairScene4 : public GDRScene { } }; -// 巹 ü ȰȭǾ ÷̾ ο. -// HP 50% Ʒ Scene5, Scene6. +// 질드레 각성체가 활성화되어 플레이어들과 싸운다. +// HP가 50% 아래로 떨어지면 Scene5로, 죽으면 Scene6으로. class GDRLairAwakenedGDRFight : public State { bool m_bGDRDamaged; @@ -260,7 +260,7 @@ class GDRLairAwakenedGDRFight : public State { } }; -// 7 ϰ ġ ̵ 8 Ѵ. +// 대사 7을 하고 지정 위치로 이동한 뒤 대사 8을 한다. class GDRLairScene5 : public GDRScene { public: GDRLairScene5() : GDRScene(GDR_LAIR_MINION_FIGHT) {} @@ -277,7 +277,7 @@ class GDRLairScene5 : public GDRScene { } }; -// ߰ ѵ ð ȿ ƾ Ѵ. +// 중간보스를 제한된 시간 안에 잡아야 한다. class GDRLairMinionFight : public MonsterSummonState { public: GDRLairMinionFight(); @@ -296,7 +296,7 @@ class GDRLairMinionFight : public MonsterSummonState { } }; -// 9 ϰ ġ ̵ 10 Ѵ. +// 대사 9를 하고 지정 위치로 이동한 뒤 대사 10을 한다. class GDRLairScene6 : public GDRScene { public: GDRLairScene6() : GDRScene(GDR_LAIR_AWAKENED_GDR_FIGHT) {} @@ -313,8 +313,8 @@ class GDRLairScene6 : public GDRScene { } }; -// 鼭 縦 ϰ Ѵ. -// -_- +// 죽으면서 대사를 하고 보상 아이템을 지급한다. +// 사실 별로 할 거 없다 -_- class GDRLairEnding : public TimerState { public: GDRLairEnding() : TimerState(GDR_LAIR_IDLE, 10) {} @@ -333,7 +333,7 @@ class GDRLairEnding : public TimerState { } }; -// 峵. ׾ +// 끝장났다. 다 죽어라 class GDRLairKillAll : public TimerState { public: GDRLairKillAll() : TimerState(GDR_LAIR_IDLE, 10) {} @@ -353,7 +353,7 @@ class GDRLairKillAll : public TimerState { } }; -// 巹  Ѱϴ Ŵ. ClientManager 忡 . +// 질드레 레어를 총괄하는 매니저. ClientManager의 스레드에서 돈다. class GDRLairManager : public FiniteStateMachine, public Thread { public: enum GDRLairZones { diff --git a/src/server/gameserver/GQuestAdvanceClassElement.cpp b/src/server/gameserver/GQuestAdvanceClassElement.cpp index ab85e6b6..611abc25 100644 --- a/src/server/gameserver/GQuestAdvanceClassElement.cpp +++ b/src/server/gameserver/GQuestAdvanceClassElement.cpp @@ -22,7 +22,7 @@ GQuestElement::ResultType GQuestAdvanceClassElement::checkCondition(PlayerCreatu return FAIL; Exp_t goalExp = pDomainInfo->getGoalExp(); Exp_t currentExp = goalExp - pSlayer->getGoalExp(domain); - cout << pPC->getName() << " ġ : " << currentExp << endl; + cout << pPC->getName() << "의 현재 경험치 : " << currentExp << endl; advExp = (Exp_t)(currentExp * 0.0688933574); } else if (pPC->isVampire()) { Vampire* pVampire = dynamic_cast(pPC); @@ -31,7 +31,7 @@ GQuestElement::ResultType GQuestAdvanceClassElement::checkCondition(PlayerCreatu return FAIL; Exp_t goalExp = pExpInfo->getGoalExp(); Exp_t currentExp = goalExp - pVampire->getGoalExp(); - cout << pPC->getName() << " ġ : " << currentExp << endl; + cout << pPC->getName() << "의 현재 경험치 : " << currentExp << endl; advExp = currentExp / 100; } else if (pPC->isOusters()) { Ousters* pOusters = dynamic_cast(pPC); @@ -40,12 +40,12 @@ GQuestElement::ResultType GQuestAdvanceClassElement::checkCondition(PlayerCreatu return FAIL; Exp_t goalExp = pExpInfo->getGoalExp(); Exp_t currentExp = goalExp - pOusters->getGoalExp(); - cout << pPC->getName() << " ġ : " << currentExp << endl; + cout << pPC->getName() << "의 현재 경험치 : " << currentExp << endl; advExp = currentExp / 100; } advExp = min((int)advExp, 18496191); - // ϵڵ -_- + // 하드코딩 -_- pPC->increaseAdvancementClassExp(advExp, false); return OK; diff --git a/src/server/gameserver/GQuestCheckPoint.cpp b/src/server/gameserver/GQuestCheckPoint.cpp index 26f0cd12..ffb05f50 100644 --- a/src/server/gameserver/GQuestCheckPoint.cpp +++ b/src/server/gameserver/GQuestCheckPoint.cpp @@ -23,7 +23,7 @@ void GQuestCheckPoint::load() { Assert(pChild->GetAttribute("y", y)); Assert(pChild->GetAttribute("id", id)); - MonsterCorpse* pMonsterCorpse = new MonsterCorpse(type, "ʬ", 2); + MonsterCorpse* pMonsterCorpse = new MonsterCorpse(type, "暇竟", 2); pMonsterCorpse->setTreasureCount(255); Zone* pZone = getZoneByZoneID(zoneid); Assert(pZone != NULL); @@ -84,7 +84,7 @@ string GQuestCheckPoint::getTargetList(Race_t race, Level_t level, DWORD grade, else pointnum += 2; - cout << (int)grade << "׷̵ " << (int)level << " " << pointnum << "" << endl; + cout << (int)grade << "그레이드 " << (int)level << "레벨 " << pointnum << "개" << endl; if (pointnum > waypoints.size()) pointnum = waypoints.size(); @@ -102,7 +102,7 @@ string GQuestCheckPoint::getTargetList(Race_t race, Level_t level, DWORD grade, } } - cout << " " << ret; + cout << "결과물 " << ret; return ret; } diff --git a/src/server/gameserver/GQuestGiveDomainExpElement.cpp b/src/server/gameserver/GQuestGiveDomainExpElement.cpp index d0b7b08c..24805ceb 100644 --- a/src/server/gameserver/GQuestGiveDomainExpElement.cpp +++ b/src/server/gameserver/GQuestGiveDomainExpElement.cpp @@ -17,7 +17,7 @@ GQuestElement::ResultType GQuestGiveDomainExpElement::checkCondition(PlayerCreat pSlayer->getPlayer()->sendPacket(&gcMI); GCSystemMessage gcSM; - gcSM.setMessage("øľֵ."); + gcSM.setMessage("삿돤맡혐堵돨쒔駱令."); pSlayer->getPlayer()->sendPacket(&gcSM); return OK; diff --git a/src/server/gameserver/GQuestGiveEventQuestItemElement.cpp b/src/server/gameserver/GQuestGiveEventQuestItemElement.cpp index b4477d22..1d71e7ba 100644 --- a/src/server/gameserver/GQuestGiveEventQuestItemElement.cpp +++ b/src/server/gameserver/GQuestGiveEventQuestItemElement.cpp @@ -12,10 +12,10 @@ #include "skill/SkillUtil.h" Exp_t ExpRewardTable[3][25] = { - // ̾ + // 슬레이어 {40, 50, 80, 135, 225, 360, 550, 800, 1130, 1530, 2030, 2620, 3320, 4140, 5090, 6170, 7390, 8780, 10300, 12000, 13900, 16000, 18300, 20700, 23400}, - // ̾ + // 뱀파이어 {110, 150, 190, 150, 320, 420, 540, 700, 920, 1200, 1550, 2020, 2620, 3400, 4430, 5760, 7490, 9730, 12650, 16450, 20560, 25700, 32120, 40150}, {110, 150, 190, 150, 320, 420, 540, 700, 920, 1200, 1550, 2020, @@ -28,7 +28,7 @@ void giveMemberReward(PlayerCreature* pPC, uint type) { Exp_t exp = ExpRewardTable[pPC->getRace()][pPC->getLevel()]; Gold_t gold = GoldRewardTable[pPC->getRace()][type]; - cout << exp << " ġ , " << gold << " " << endl; + cout << exp << " 경험치 , " << gold << " 돈" << endl; pPC->increaseGoldEx(gold); GCModifyInformation gcMI; diff --git a/src/server/gameserver/GQuestGiveItemElement.cpp b/src/server/gameserver/GQuestGiveItemElement.cpp index 28ec7a75..11dcab8f 100644 --- a/src/server/gameserver/GQuestGiveItemElement.cpp +++ b/src/server/gameserver/GQuestGiveItemElement.cpp @@ -38,7 +38,7 @@ GQuestElement::ResultType GQuestGiveItemElement::checkCondition(PlayerCreature* makeGCCreateItem(&gcCreateItem, pItem, pt.x, pt.y); pPC->getPlayer()->sendPacket(&gcCreateItem); - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem->isTraceItem()) { remainTraceLog(pItem, "GQuest", pPC->getName(), ITEM_LOG_CREATE, DETAIL_EVENTNPC); remainTraceLogNew(pItem, pPC->getName(), ITL_GET, ITLD_EVENTNPC, pPC->getZone()->getZoneID()); @@ -46,7 +46,7 @@ GQuestElement::ResultType GQuestGiveItemElement::checkCondition(PlayerCreature* } GCSystemMessage gcSM; - gcSM.setMessage("Ʒ."); + gcSM.setMessage("삿돤膠틔."); pPC->getPlayer()->sendPacket(&gcSM); return OK; diff --git a/src/server/gameserver/GQuestGiveMoneyElement.cpp b/src/server/gameserver/GQuestGiveMoneyElement.cpp index 88a83db5..0a0b127c 100644 --- a/src/server/gameserver/GQuestGiveMoneyElement.cpp +++ b/src/server/gameserver/GQuestGiveMoneyElement.cpp @@ -16,15 +16,15 @@ GQuestElement::ResultType GQuestGiveMoneyElement::checkCondition(PlayerCreature* GCSystemMessage gcSM; char buffer[256]; if (pPC->isSlayer()) { - sprintf(buffer, "%ld .", m_Amount); + sprintf(buffer, "삿돤%ld 陵귑.", m_Amount); gcSM.setMessage(buffer); pPC->getPlayer()->sendPacket(&gcSM); } else if (pPC->isVampire()) { - sprintf(buffer, "%ld .", m_Amount); + sprintf(buffer, "삿돤%ld 陵귑.", m_Amount); gcSM.setMessage(buffer); pPC->getPlayer()->sendPacket(&gcSM); } else if (pPC->isOusters()) { - sprintf(buffer, "%ld .", m_Amount); + sprintf(buffer, "삿돤%ld 陵귑.", m_Amount); gcSM.setMessage(buffer); pPC->getPlayer()->sendPacket(&gcSM); } diff --git a/src/server/gameserver/GQuestGiveOustersExpElement.cpp b/src/server/gameserver/GQuestGiveOustersExpElement.cpp index e7bbcf2f..f3dc073a 100644 --- a/src/server/gameserver/GQuestGiveOustersExpElement.cpp +++ b/src/server/gameserver/GQuestGiveOustersExpElement.cpp @@ -18,7 +18,7 @@ GQuestElement::ResultType GQuestGiveOustersExpElement::checkCondition(PlayerCrea pOusters->getPlayer()->sendPacket(&gcMI); GCSystemMessage gcSM; - gcSM.setMessage("þֵ."); + gcSM.setMessage("삿돤쒔駱令."); pOusters->getPlayer()->sendPacket(&gcSM); return OK; diff --git a/src/server/gameserver/GQuestGiveQuestItemElement.cpp b/src/server/gameserver/GQuestGiveQuestItemElement.cpp index 8d65eeb0..bff3c870 100644 --- a/src/server/gameserver/GQuestGiveQuestItemElement.cpp +++ b/src/server/gameserver/GQuestGiveQuestItemElement.cpp @@ -12,7 +12,7 @@ GQuestElement::ResultType GQuestGiveQuestItemElement::checkCondition(PlayerCreat pPC->getPlayer()->sendPacket(inventory.getInventoryPacket()); GCSystemMessage gcSM; - gcSM.setMessage("."); + gcSM.setMessage("삿돤훨蛟돛야."); pPC->getPlayer()->sendPacket(&gcSM); if (m_bSave) { diff --git a/src/server/gameserver/GQuestGiveVampireExpElement.cpp b/src/server/gameserver/GQuestGiveVampireExpElement.cpp index e86c1064..9337de04 100644 --- a/src/server/gameserver/GQuestGiveVampireExpElement.cpp +++ b/src/server/gameserver/GQuestGiveVampireExpElement.cpp @@ -17,7 +17,7 @@ GQuestElement::ResultType GQuestGiveVampireExpElement::checkCondition(PlayerCrea pVampire->getPlayer()->sendPacket(&gcMI); GCSystemMessage gcSM; - gcSM.setMessage("þֵ."); + gcSM.setMessage("삿돤쒔駱令."); pPC->getPlayer()->sendPacket(&gcSM); return OK; diff --git a/src/server/gameserver/GQuestInfo.cpp b/src/server/gameserver/GQuestInfo.cpp index f82db7be..40dc5b5e 100644 --- a/src/server/gameserver/GQuestInfo.cpp +++ b/src/server/gameserver/GQuestInfo.cpp @@ -36,7 +36,7 @@ void GQuestInfo::makeVector(XMLTree* pTree, ElementType type) { Assert(pTree != NULL); string checkType; if (pTree->GetAttribute("type", checkType)) { - cout << "üũ Ÿ !" << checkType << endl; + cout << "체크 타입 들어있음!" << checkType << endl; if (checkType == "sequence") m_CheckTypes[type] = SEQUENCE; @@ -59,7 +59,7 @@ void GQuestInfo::makeVector(XMLTree* pTree, ElementType type) { pElement->setCondition(type); m_Elements[type].push_back(pElement); } else { - cout << "Ʈ : " << pChild->GetName() << endl; + cout << "엘리먼트를 못 만들겠음 : " << pChild->GetName() << endl; Assert(false); } } diff --git a/src/server/gameserver/GQuestKillMonsterElement.cpp b/src/server/gameserver/GQuestKillMonsterElement.cpp index c94b9a35..512c06d8 100644 --- a/src/server/gameserver/GQuestKillMonsterElement.cpp +++ b/src/server/gameserver/GQuestKillMonsterElement.cpp @@ -19,7 +19,7 @@ GQuestMission* GQuestKillMonsterElement::makeInitMission(PlayerCreature* pPC) co int TotalNum = m_TargetList.size(); int TargetNum = min((int)m_TargetNum, TotalNum); int selected = 0; - cout << TotalNum << "߿ " << TargetNum << " õǾ մϴ." << endl; + cout << TotalNum << "중에 " << TargetNum << "개가 선택되어야 합니다." << endl; for (int i = 0; i < TotalNum; ++i) { int toSelect = TargetNum - selected; @@ -31,11 +31,11 @@ GQuestMission* GQuestKillMonsterElement::makeInitMission(PlayerCreature* pPC) co if ((rand() % last) < toSelect) { pMission->getTargetList().push_back(m_TargetList[i]); ++selected; - cout << (int)m_TargetList[i] << " õǾϴ." << endl; + cout << (int)m_TargetList[i] << "가 선택되었습니다." << endl; } } - cout << "ó~" << endl; + cout << "선택끝~" << endl; return pMission; } diff --git a/src/server/gameserver/GQuestLoseQuestItemElement.cpp b/src/server/gameserver/GQuestLoseQuestItemElement.cpp index 6b727de4..92c8235b 100644 --- a/src/server/gameserver/GQuestLoseQuestItemElement.cpp +++ b/src/server/gameserver/GQuestLoseQuestItemElement.cpp @@ -16,7 +16,7 @@ GQuestElement::ResultType GQuestLoseQuestItemElement::checkCondition(PlayerCreat pPC->getPlayer()->sendPacket(inventory.getInventoryPacket()); GCSystemMessage gcSM; - gcSM.setMessage("."); + gcSM.setMessage("삿돤훨蛟돛야."); pPC->getPlayer()->sendPacket(&gcSM); return OK; diff --git a/src/server/gameserver/GQuestManager.cpp b/src/server/gameserver/GQuestManager.cpp index 6745fd4a..24c377d7 100644 --- a/src/server/gameserver/GQuestManager.cpp +++ b/src/server/gameserver/GQuestManager.cpp @@ -40,7 +40,7 @@ void GQuestManager::load() if (sta != QuestStatusInfo::COMPLETE && sta != QuestStatusInfo::FAIL && sta != QuestStatusInfo::CAN_REPLAY) { - filelog("GQuestError.log", " Ʈ status ߸Ǿϴ : [%s]:%d/%d", + filelog("GQuestError.log", "저장된 퀘스트의 status가 잘못되었습니다 : [%s]:%d/%d", m_pOwner->getName().c_str(), qID, sta); } else { if (sta == QuestStatusInfo::CAN_REPLAY) @@ -56,9 +56,9 @@ void GQuestManager::load() int lastSec = pResult->getInt(3); if (lastSec > EVENT_QUEST_TIME_LIMIT) lastSec = EVENT_QUEST_TIME_LIMIT; - cout << " ð lastSec : " << lastSec << endl; + cout << "지난 시간 lastSec : " << lastSec << endl; pEffect->setDeadline((EVENT_QUEST_TIME_LIMIT - lastSec) * 10); - cout << " : " << (Turn_t)((EVENT_QUEST_TIME_LIMIT - lastSec) * 10) << endl; + cout << "데드라인 : " << (Turn_t)((EVENT_QUEST_TIME_LIMIT - lastSec) * 10) << endl; pEffect->setNextTime(((EVENT_QUEST_TIME_LIMIT - lastSec) % BROADCASTING_DELAY) * 10); m_pOwner->addEffect(pEffect); } @@ -135,18 +135,18 @@ Packet* GQuestManager::getStatusInfoPacket() const { void GQuestManager::accept(DWORD qID) { unordered_map::iterator itr = m_QuestStatuses.find(qID); if (itr == m_QuestStatuses.end()) { - cout << "accept : -_- " << qID << endl; + cout << "accept : 없다 -_- " << qID << endl; return; } // GQuestStatus* pQS = m_QuestStatuses[qID]; GQuestStatus* pQS = itr->second; if (pQS == NULL) { - cout << "accept : ̴ -_- " << qID << endl; + cout << "accept : 널이다 -_- " << qID << endl; return; } if (pQS->getStatus() != QuestStatusInfo::CAN_ACCEPT && pQS->getStatus() != QuestStatusInfo::CAN_REPLAY) { - cout << "accept : CAN_ACCEPT ƴϴ -_- " << (int)pQS->getStatus() << endl; + cout << "accept : CAN_ACCEPT가 아니다 -_- " << (int)pQS->getStatus() << endl; return; } @@ -163,18 +163,18 @@ void GQuestManager::accept(DWORD qID) { void GQuestManager::cancel(DWORD qID) { unordered_map::iterator itr = m_QuestStatuses.find(qID); if (itr == m_QuestStatuses.end()) { - cout << "accept : -_- " << qID << endl; + cout << "accept : 없다 -_- " << qID << endl; return; } // GQuestStatus* pQS = m_QuestStatuses[qID]; GQuestStatus* pQS = itr->second; if (pQS == NULL) { - cout << "cancel : ̴ -_- " << qID << endl; + cout << "cancel : 널이다 -_- " << qID << endl; return; } if (pQS->getStatus() != QuestStatusInfo::DOING) { - cout << "cancel : DOING ƴϴ -_- " << (int)pQS->getStatus() << endl; + cout << "cancel : DOING이 아니다 -_- " << (int)pQS->getStatus() << endl; return; } @@ -200,7 +200,7 @@ void GQuestManager::heartbeat() { Timeval endTime = pTimeMission->getEndTime(); if (gCurrentTime > endTime) { pTimeMission->m_pParent->update(); - // -_- ; + // -_- 땜빵; break; } } @@ -218,12 +218,12 @@ void GQuestManager::blooddrain() { char buffer[256]; if (m_pOwner->isVampire()) { - sprintf(buffer, "%uѪ.", pBloodDrainMission->getCurrent()); + sprintf(buffer, "쏵契죄%u늴俱沂.", pBloodDrainMission->getCurrent()); GCSystemMessage gcSM; gcSM.setMessage(buffer); m_pOwner->getPlayer()->sendPacket(&gcSM); } else if (m_pOwner->isOusters()) { - sprintf(buffer, "%u.", pBloodDrainMission->getCurrent()); + sprintf(buffer, "쏵契죄%u늴俱쥣.", pBloodDrainMission->getCurrent()); GCSystemMessage gcSM; gcSM.setMessage(buffer); m_pOwner->getPlayer()->sendPacket(&gcSM); @@ -238,7 +238,7 @@ void GQuestManager::blooddrain() { m_pOwner->getPlayer()->sendPacket(&gcSM); } - // -_- ; + // -_- 땜빵; // break; } } @@ -253,7 +253,7 @@ void GQuestManager::levelUp() { if (pLevelMission->isSuccess(m_pOwner)) { pLevelMission->m_pParent->update(); - // -_- ; + // -_- 땜빵; // break; } } @@ -280,7 +280,7 @@ bool GQuestManager::metNPC(NPC* pNPC) { GQuestSayNPCElement* pSayNPCElement = dynamic_cast(*pSayNPCMission->m_Position); if (pSayNPCElement == NULL) { - cout << "SayNPCElement ij !!!!" << endl; + cout << "SayNPCElement 캐스팅 실패!!!!" << endl; Assert(false); } @@ -289,7 +289,7 @@ bool GQuestManager::metNPC(NPC* pNPC) { if (pSayNPCElement->getTarget() == pNPC->getNPCID()) { pSayNPCMission->meet(); pSayNPCMission->m_pParent->update(); - // ѹ Ѹ + // 한번에 한명씩만 만나기 return true; } } @@ -324,7 +324,7 @@ void GQuestManager::killed() { pKilledMission->m_pParent->update(); } - // -_- ; + // -_- 땜빵; // break; } } @@ -357,7 +357,7 @@ void GQuestManager::rideMotorcycle(bool isParty) { pRideMotorcycleMission->m_pParent->update(); } - // -_- ; + // -_- 땜빵; // break; } @@ -395,14 +395,14 @@ void GQuestManager::touchWayPoint(MonsterCorpse* pWayPoint) { GQuestTouchWayPointElement* pTouchWayPointElement = dynamic_cast(*pTouchWayPointMission->m_Position); if (pTouchWayPointElement == NULL) { - cout << "TouchWayPointElement ij !!!!" << endl; + cout << "TouchWayPointElement 캐스팅 실패!!!!" << endl; Assert(false); } if (pTouchWayPointElement->m_ZoneID == m_pOwner->getZoneID() && pTouchWayPointElement->m_X == pWayPoint->getX() && pTouchWayPointElement->m_Y == pWayPoint->getY()) { if (pTouchWayPointElement->m_Type != pWayPoint->getMonsterType()) - cout << " Ÿ ٸ!! -_-" << endl; + cout << "몬스터 타입이 다르다!! 먼일이지 -_-" << endl; pTouchWayPointMission->touch(); pTouchWayPointMission->m_pParent->update(); @@ -444,7 +444,7 @@ void GQuestManager::killedMonster(Monster* pMonster) { GQuestKillMonsterElement* pKillMonsterElement = dynamic_cast(*pKillMonsterMission->m_Position); if (pKillMonsterElement == NULL) { - cout << "KillMonsterElement ij !!!!" << endl; + cout << "KillMonsterElement 캐스팅 실패!!!!" << endl; Assert(false); } if (pKillMonsterElement->getGoal() <= pKillMonsterMission->getCurrent()) { @@ -463,16 +463,16 @@ void GQuestManager::partyDissect(MonsterCorpse* pMonsterCorpse) { if (pPartyDissectMission == NULL) continue; - cout << "ǥ : " << pPartyDissectMission->m_StrArg << endl; - cout << " : " << (int)pPartyDissectMission->getTargetList().front() << endl; - cout << " : " << pMonsterCorpse->getMonsterType() << endl; + cout << "목표 : " << pPartyDissectMission->m_StrArg << endl; + cout << "숫자 : " << (int)pPartyDissectMission->getTargetList().front() << endl; + cout << "잡은놈 : " << pMonsterCorpse->getMonsterType() << endl; if (pPartyDissectMission->isTarget( g_pMonsterInfoManager->getMonsterInfo(pMonsterCorpse->getMonsterType())->getSpriteType())) { GQuestPartyDissectElement* pPartyDissectElement = dynamic_cast(*pPartyDissectMission->m_Position); if (pPartyDissectElement == NULL) { - cout << "PartyDissectElement ij !!!!" << endl; + cout << "PartyDissectElement 캐스팅 실패!!!!" << endl; Assert(false); } pPartyDissectMission->increase(); @@ -491,7 +491,7 @@ void GQuestManager::partyDissect(MonsterCorpse* pMonsterCorpse) { void GQuestManager::eventParty() { m_bPartyQuest = true; - cout << "̺Ʈ Ƽ ἺǾϴ. : " << m_pOwner->getName() << endl; + cout << "이벤트 파티가 결성되었습니다. : " << m_pOwner->getName() << endl; list::iterator itr = m_EventMissions[EVENT_PARTY].begin(); while (itr != m_EventMissions[EVENT_PARTY].end()) { GQuestEventPartyMission* pEventPartyMission = dynamic_cast((*itr)); @@ -502,7 +502,7 @@ void GQuestManager::eventParty() { GQuestEventPartyElement* pEventPartyElement = dynamic_cast(*pEventPartyMission->m_Position); if (pEventPartyElement == NULL) { - cout << "EventPartyElement ij !!!!" << endl; + cout << "EventPartyElement 캐스팅 실패!!!!" << endl; Assert(false); } @@ -515,7 +515,7 @@ void GQuestManager::eventParty() { void GQuestManager::eventPartyCrash() { m_bPartyQuest = false; - cout << "̺Ʈ Ƽ ϴ. : " << m_pOwner->getName() << endl; + cout << "이벤트 파티가 깨졌습니다. : " << m_pOwner->getName() << endl; list::iterator itr = m_EventMissions[EVENT_PARTY_CRASH].begin(); while (itr != m_EventMissions[EVENT_PARTY_CRASH].end()) { GQuestEventPartyCrashMission* pEventPartyCrashMission = dynamic_cast((*itr)); @@ -526,7 +526,7 @@ void GQuestManager::eventPartyCrash() { GQuestEventPartyCrashElement* pEventPartyCrashElement = dynamic_cast(*pEventPartyCrashMission->m_Position); if (pEventPartyCrashElement == NULL) { - cout << "EventPartyCrashElement ij !!!!" << endl; + cout << "EventPartyCrashElement 캐스팅 실패!!!!" << endl; Assert(false); } @@ -644,7 +644,7 @@ void GQuestManager::advancementClassLevelUp() { if (pAdvancementClassLevelMission->isSuccess(m_pOwner)) { pAdvancementClassLevelMission->m_pParent->update(); - // -_- ; + // -_- 땜빵; // break; } } @@ -663,7 +663,7 @@ void GQuestManager::clearDynamicZone(ZoneID_t zoneID) { if (pClearDynamicZoneMission->isClear()) { pClearDynamicZoneMission->m_pParent->update(); - // -_- ; + // -_- 땜빵; // break; } } @@ -680,7 +680,7 @@ void GQuestManager::enterDynamicZone(ZoneID_t zoneID) { if (pEnterDynamicZoneMission->isEnter()) { pEnterDynamicZoneMission->m_pParent->update(); - // -_- ; + // -_- 땜빵; // break; } } diff --git a/src/server/gameserver/GQuestNOTElement.cpp b/src/server/gameserver/GQuestNOTElement.cpp index 3a75512c..f76730aa 100644 --- a/src/server/gameserver/GQuestNOTElement.cpp +++ b/src/server/gameserver/GQuestNOTElement.cpp @@ -19,7 +19,7 @@ GQuestNOTElement* GQuestNOTElement::makeElement(XMLTree* pTree) { if (pElement != NULL) { pRet->m_Elements.push_back(pElement); } else { - cout << "Ʈ : " << pChild->GetName() << endl; + cout << "엘리먼트를 못 만들겠음 : " << pChild->GetName() << endl; Assert(false); } } diff --git a/src/server/gameserver/GQuestORElement.cpp b/src/server/gameserver/GQuestORElement.cpp index df536345..8386c7e7 100644 --- a/src/server/gameserver/GQuestORElement.cpp +++ b/src/server/gameserver/GQuestORElement.cpp @@ -21,7 +21,7 @@ GQuestORElement* GQuestORElement::makeElement(XMLTree* pTree) { if (pElement != NULL) { pRet->m_Elements.push_back(pElement); } else { - cout << "Ʈ : " << pChild->GetName() << endl; + cout << "엘리먼트를 못 만들겠음 : " << pChild->GetName() << endl; Assert(false); } } diff --git a/src/server/gameserver/GQuestPartyDissectElement.cpp b/src/server/gameserver/GQuestPartyDissectElement.cpp index 700f36d2..023a93d9 100644 --- a/src/server/gameserver/GQuestPartyDissectElement.cpp +++ b/src/server/gameserver/GQuestPartyDissectElement.cpp @@ -25,7 +25,7 @@ GQuestMission* GQuestPartyDissectElement::makeInitMission(PlayerCreature* pPC) c int TotalNum = pTargetList->size(); int TargetNum = min((int)m_TargetNum, TotalNum); int selected = 0; - cout << TotalNum << "߿ " << TargetNum << " õǾ մϴ." << endl; + cout << TotalNum << "중에 " << TargetNum << "개가 선택되어야 합니다." << endl; for (int i = 0; i < TotalNum; ++i) { int toSelect = TargetNum - selected; @@ -39,13 +39,13 @@ GQuestMission* GQuestPartyDissectElement::makeInitMission(PlayerCreature* pPC) c pMission->m_StrArg += ", "; pMission->getTargetList().push_back((*pTargetList)[i]); ++selected; - cout << (int)(*pTargetList)[i] << " õǾϴ." << endl; + cout << (int)(*pTargetList)[i] << "가 선택되었습니다." << endl; pMission->m_StrArg += g_pMonsterInfoManager->getNameBySpriteType((*pTargetList)[i]); } } - cout << "ó~" << endl; + cout << "선택끝~" << endl; return pMission; } diff --git a/src/server/gameserver/GQuestRandomElement.cpp b/src/server/gameserver/GQuestRandomElement.cpp index 2471a0a3..db835794 100644 --- a/src/server/gameserver/GQuestRandomElement.cpp +++ b/src/server/gameserver/GQuestRandomElement.cpp @@ -23,7 +23,7 @@ GQuestRandomElement* GQuestRandomElement::makeElement(XMLTree* pTree) { if (pElement != NULL) { pRet->m_Elements.push_back(pElement); } else { - cout << "Ʈ : " << pChild->GetName() << endl; + cout << "엘리먼트를 못 만들겠음 : " << pChild->GetName() << endl; Assert(false); } } diff --git a/src/server/gameserver/GQuestStatus.cpp b/src/server/gameserver/GQuestStatus.cpp index b781ec44..c8a1dc60 100644 --- a/src/server/gameserver/GQuestStatus.cpp +++ b/src/server/gameserver/GQuestStatus.cpp @@ -137,7 +137,7 @@ GQuestElement::ResultType GQuestStatus::checkElements(GQuestInfo::ElementType ty case GQuestInfo::OR: return checkElementsOR(type); default: - filelog("GQuestBug.log", "%u - GQuestStatus::checkElements(%u) : ߸ checkType : %d", + filelog("GQuestBug.log", "%u - GQuestStatus::checkElements(%u) : 잘못된 checkType : %d", m_pGQuestInfo->getQuestID(), type, m_pGQuestInfo->getCheckType(type)); Assert(false); } @@ -145,7 +145,7 @@ GQuestElement::ResultType GQuestStatus::checkElements(GQuestInfo::ElementType ty return GQuestElement::FAIL; } -// element checkؾ ȴ. տ ϰǾ ڿ üũѴ. +// element들을 순서대로 check해야 된다. 앞에꺼가 완결되어야 뒤에꺼를 체크한다. GQuestElement::ResultType GQuestStatus::checkElementsSEQ(GQuestInfo::ElementType type) { cout << "Checking SEQ : " << (int)type << endl; GQuestMission* pCurrentMission = m_MissionMap[m_ElementAdvance[type]]; @@ -198,7 +198,7 @@ GQuestElement::ResultType GQuestStatus::checkElementsSEQ(GQuestInfo::ElementType return GQuestElement::OK; } -// ϳ success ok. FAIL üũҶ . . +// 하나라도 success면 ok. FAIL 조건 체크할때 쓴다. ㅜ.ㅠ GQuestElement::ResultType GQuestStatus::checkElementsOR(GQuestInfo::ElementType type) { cout << "Checking OR : " << (int)type << endl; @@ -210,12 +210,12 @@ GQuestElement::ResultType GQuestStatus::checkElementsOR(GQuestInfo::ElementType if (pMission != NULL) { cout << "Checking Mission : " << pMission->getMissionName() << endl; if (pMission->m_Status == MissionInfo::SUCCESS) { - cout << "̹ ̼" << endl; + cout << "이미 성공한 미션임" << endl; return GQuestElement::OK; } if (pMission->m_Status == MissionInfo::FAIL) { - cout << "̹ ̼" << endl; + cout << "이미 실패한 미션임" << endl; } else { GQuestElement::ResultType result = (*itr)->checkMission(pMission); cout << "Result : " << result << endl; @@ -240,7 +240,7 @@ GQuestElement::ResultType GQuestStatus::checkElementsOR(GQuestInfo::ElementType cout << "Creating new mission..." << endl; GQuestMission* pNewMission = (*itr)->makeInitMission(m_pOwner); if (pNewMission == NULL) { - cout << "̼ !!!!" << endl; + cout << "미션 생성 실패!!!!" << endl; ++itr; continue; } @@ -271,7 +271,7 @@ GQuestElement::ResultType GQuestStatus::checkElementsOR(GQuestInfo::ElementType return GQuestElement::FAIL; } -// element Ѳ Ѵ. ٷ Ǵ°͵ Ѳ ٸ. +// 모든 element를 한꺼번에 평가한다. 기다려야 되는것도 한꺼번에 기다린다. GQuestElement::ResultType GQuestStatus::checkElementsAND(GQuestInfo::ElementType type) { cout << "Checking AND : " << (int)type << endl; @@ -285,10 +285,10 @@ GQuestElement::ResultType GQuestStatus::checkElementsAND(GQuestInfo::ElementType if (pMission != NULL) { cout << "Checking Mission : " << pMission->getMissionName() << endl; if (pMission->m_Status == MissionInfo::FAIL) { - cout << "̹ ̼" << endl; + cout << "이미 실패한 미션임" << endl; return GQuestElement::FAIL; } else if (pMission->m_Status == MissionInfo::SUCCESS) { - cout << "̹ ̼" << endl; + cout << "이미 성공한 미션임" << endl; } else { GQuestElement::ResultType result = (*itr)->checkMission(pMission); cout << "Result : " << result << endl; @@ -315,7 +315,7 @@ GQuestElement::ResultType GQuestStatus::checkElementsAND(GQuestInfo::ElementType cout << "Creating new mission..." << endl; GQuestMission* pNewMission = (*itr)->makeInitMission(m_pOwner); if (pNewMission == NULL) { - cout << "̼ !!!!" << endl; + cout << "미션 생성 실패!!!!" << endl; ++itr; continue; } diff --git a/src/server/gameserver/GamePlayer.cpp b/src/server/gameserver/GamePlayer.cpp index e0a808b6..a29657c2 100644 --- a/src/server/gameserver/GamePlayer.cpp +++ b/src/server/gameserver/GamePlayer.cpp @@ -47,10 +47,10 @@ ////////////////////////////////////////////////////////////////////////////// -// packet鿡 ؼ profilingѴ. by sigi. 2002.5.6 +// ¸ðµç packetµé¿¡ ´ëÇØ¼­ profilingÇÑ´Ù. by sigi. 2002.5.6 // -// , ̰ ϱ ؼ -// Profile.h MAX_PROFILE_SAMPLES += 300 Ѵ. +// ´Ü, ÀÌ°É »ç¿ëÇϱâ À§Çؼ­´Â +// Profile.h¿¡ MAX_PROFILE_SAMPLES += 300À» ÇØÁà¾ß ÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// // #define __PROFILE_PACKETS__ @@ -62,15 +62,15 @@ const int defaultGamePlayerInputStreamSize = 1024; const int defaultGamePlayerOutputStreamSize = 20480; -static int maxIdleSec = 60 * 5; // ޶ʱ󱣳ʱ 60 * 5 = 300(5) -// static int maxSpeedVerifyTime = 2; // 0.3 -static int maxVerifyCount = 3; // У 3 -static int maxTimeGap = 5; // ʱУƫ Ϊ5 ޸Ϊ8 -static int SpeedCheckDelay = 60; // ʱУ60һ +static int maxIdleSec = 60 * 5; // ÎÞ¶¯×÷ʱ¼ä×î´ó±£³ÖÁ¬½Óʱ¼ä 60 * 5 = 300Ãë(5·Ö) +// static int maxSpeedVerifyTime = 2; // 0.3 ÃÊ +static int maxVerifyCount = 3; // ×î´ó´íÎóУÑé´ÎÊý 3´Î +static int maxTimeGap = 5; // ʱ¼äУÑ鯫²îÃëÊý º«·þΪ5´Î ÐÞ¸ÄΪ8´Î +static int SpeedCheckDelay = 60; // ʱ¼äУÑé¼ä¸ô60ÃëÒ»´Î -const int PCRoomLottoSec = 3600; // 3600 . 1ð -const int PCRoomLottoMaxAmount = 3; // ѹ ִ ִ Ǽ -// CLLoginHandler.cpp ִ Լ. +const int PCRoomLottoSec = 3600; // 3600 ÃÊ. 1½Ã°£ +const int PCRoomLottoMaxAmount = 3; // Çѹø¿¡ ½×ÀÏ ¼ö ÀÖ´Â ÃÖ´ë º¹±Ç¼ö +// CLLoginHandler.cpp¿¡ ÀÖ´Â ÇÔ¼ö´Ù. void addLogoutPlayerData(Player* pPlayer); @@ -109,7 +109,7 @@ GamePlayer::GamePlayer(Socket* pSocket) getCurrentTime(m_ExpireTime); m_ExpireTime.tv_sec += maxIdleSec; - // ð ޾ƿ´ + // ÇöÀç ½Ã°£À» ¹Þ¾Æ¿Â´Ù // getCurrentTime(m_SpeedVerify); m_SpeedVerify.tv_sec = 0; ; @@ -139,7 +139,7 @@ GamePlayer::GamePlayer(Socket* pSocket) m_bPacketLog = false; - // ü α ð . + // °´Ã¼°¡ »ý¼ºµÈ ½ÃÁ¡À» ·Î±×ÀÎÇÑ ½Ã°£À¸·Î º»´Ù. m_LoginDateTime = VSDateTime::currentDateTime(); #ifdef __THAILAND_SERVER__ @@ -161,14 +161,14 @@ GamePlayer::~GamePlayer() { //__ENTER_CRITICAL_SECTION(m_Mutex) - //  ÷̾ ü , ´ α׾ƿ̾ Ѵ. - //  ÷̾ Ű, ¸ α׾ƿ Ѵ. + // ±× ¾î¶² Ç÷¹ÀÌ¾î °´Ã¼°¡ »èÁ¦µÉ ¶§¿¡µµ, ±× »óÅ´ ·Î±×¾Æ¿ôÀ̾î¾ß ÇÑ´Ù. + // Áï ¾î¶² Ç÷¹À̾ Á¢¼Ó Á¾·á ½ÃŰ·Á¸é, ±× »óŸ¦ ·Î±×¾Æ¿ôÀ¸·Î ¸¸µé¾î¾ß ÇÑ´Ù. Assert(m_PlayerStatus == GPS_END_SESSION); try { // Delete creature if (m_pCreature != NULL) { - // ߸ + // ¼º¼­ ¶³¾î¶ß¸®±â if (m_pCreature->hasRelicItem()) { dropRelicToZone(m_pCreature, false); } @@ -178,7 +178,7 @@ GamePlayer::~GamePlayer() { // try //{ - // NoSuch. by sigi. 2002.5.2 + // NoSuchÁ¦°Å. by sigi. 2002.5.2 g_pPCFinder->deleteCreature(m_pCreature->getName()); //} // catch (NoSuchElementException & t) @@ -186,19 +186,19 @@ GamePlayer::~GamePlayer() { //} #ifdef __CONNECT_BILLING_SYSTEM__ - // Pay Ѵٰ ˷ش. by sigi. 2002.11.18 + // Pay Á¾·áÇÑ´Ù°í ¾Ë·ÁÁØ´Ù. by sigi. 2002.11.18 if (isBillingPlayAvaiable() && !m_bMetroFreePlayer) // by sigi. 2002.11.23 { g_pBillingPlayerManager->sendPayLogout(this); } #elif defined(__CONNECT_CBILLING_SYSTEM__) - // ߱ logout Ŷ . + // Áß±¹ ºô¸µ ¼­¹ö¿¡ logout ÆÐŶÀ» º¸³½´Ù. g_pCBillingPlayerManager->sendLogout(this); #endif Statement* pStmt = NULL; - // Ʈ Ѵ. + // ±æµå ÇöÀç Á¢¼Ó ¸â¹ö ¸®½ºÆ®¿¡¼­ »èÁ¦ÇÑ´Ù. if (m_pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(m_pCreature); if (pSlayer->getGuildID() != 99) { @@ -213,7 +213,7 @@ GamePlayer::~GamePlayer() { g_pSharedServerManager->sendPacket(&gsGuildMemberLogOn); - // Ʈ Ѵ. + // µðºñ¿¡ ¾÷µ¥ÀÌÆ® ÇÑ´Ù. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery("UPDATE GuildMember SET LogOn = 0 WHERE Name = '%s'", @@ -238,7 +238,7 @@ GamePlayer::~GamePlayer() { g_pSharedServerManager->sendPacket(&gsGuildMemberLogOn); - // Ʈ Ѵ. + // µðºñ¿¡ ¾÷µ¥ÀÌÆ® ÇÑ´Ù. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery("UPDATE GuildMember SET LogOn = 0 WHERE Name = '%s'", @@ -263,7 +263,7 @@ GamePlayer::~GamePlayer() { g_pSharedServerManager->sendPacket(&gsGuildMemberLogOn); - // Ʈ Ѵ. + // µðºñ¿¡ ¾÷µ¥ÀÌÆ® ÇÑ´Ù. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery("UPDATE GuildMember SET LogOn = 0 WHERE Name = '%s'", @@ -297,7 +297,7 @@ GamePlayer::~GamePlayer() { throw; } - // Ŷ Ѵ. + // ÆÐŶÀ» »èÁ¦ÇÑ´Ù. while (!m_PacketHistory.empty()) { Packet* pPacket = m_PacketHistory.front(); SAFE_DELETE(pPacket); @@ -312,7 +312,7 @@ GamePlayer::~GamePlayer() { } ////////////////////////////////////////////////////////////////////////// // -// timevalṹ +// Á½¸ötimeval½á¹¹Ïà¼õ // ////////////////////////////////////////////////////////////////////////// void GamePlayer::tv_sub(struct timeval* out, struct timeval* in) { @@ -331,19 +331,19 @@ void GamePlayer::tv_sub(struct timeval* out, struct timeval* in) { void GamePlayer::processCommand(bool Option) { __BEGIN_TRY - // ӽ + // Çì´õ¸¦ ÀÓ½ÃÀúÀåÇÒ ¹öÆÛ »ý¼º char header[szPacketHeader]; PacketID_t packetID; PacketSize_t packetSize; - // add by Coffee ӷ + // add by Coffee Ôö¼Ó·â°üÐòÁÐ SequenceSize_t packetSequence; Packet* pPacket = NULL; try { - // гƼ ް ִ κп ó ش. - // гƼ ޴  Ȳ ߻ 𸣹Ƿ, - // ǷҪϿǰID + // ÆÐ³ÎƼ¸¦ ¹Þ°í ÀÖ´Â »ç¿ëÀÚ ÀÏ °æ¿ì ÀÌ ºÎºÐ¿¡¼­ ó¸® ÇØÁØ´Ù. + // ÆÐ³ÎƼ¸¦ ¹Þ´Â °æ¿ì ¾î¶² ¿¹¿Ü »óȲÀÌ ¹ß»ýÇÒÁö ¸ð¸£¹Ç·Î, + // ¾ö¶ÏÊÇ·ñÐèÒª¶Ï¿ªµ±Ç°IDÁ¬½Ó if (isPenaltyFlag(PENALTY_TYPE_KICKED)) { filelog("GamePlayer.txt", "Penalty Kicked. Name[%s],Host[%s],Type[%d]", ((getCreature() == NULL) ? "NULL" : getCreature()->getName().c_str()), @@ -356,12 +356,12 @@ void GamePlayer::processCommand(bool Option) { m_EventManager.heartbeat(); } - // Է¹ۿ ִ Ŷ óѴ. + // ÀԷ¹öÆÛ¿¡ µé¾îÀÖ´Â ¿ÏÀüÇÑ ÆÐŶµéÀ» ¸ðÁ¶¸® ó¸®ÇÑ´Ù. while (true) { - // Է½Ʈ Ŷũ⸸ŭ о. - // ũ⸸ŭ Ʈ ٸ, - // Insufficient ܰ ߻ϰ, . - // NoSuch. by sigi. 2002.5.4 + // ÀԷ½ºÆ®¸²¿¡¼­ ÆÐŶÇì´õÅ©±â¸¸Å­ Àо´Ù. + // ¸¸¾à ÁöÁ¤ÇÑ Å©±â¸¸Å­ ½ºÆ®¸²¿¡¼­ ÀÐÀ» ¼ö ¾ø´Ù¸é, + // Insufficient ¿¹¿Ü°¡ ¹ß»ýÇϰí, ·çÇÁ¸¦ ºüÁ®³ª°£´Ù. + // NoSuchÁ¦°Å. by sigi. 2002.5.4 if (!m_pInputStream->peek(&header[0], szPacketHeader)) { Timeval currentTime; getCurrentTime(currentTime); @@ -370,29 +370,29 @@ void GamePlayer::processCommand(bool Option) { ((getCreature() == NULL) ? "NULL" : getCreature()->getName().c_str()), ((getSocket() == NULL) ? "NULL" : getSocket()->getHost().c_str())); - throw DisconnectException(" ð Է , մϴ."); + throw DisconnectException("ÀÏÁ¤ ½Ã°£µ¿¾È ÀÔ·ÂÇÏÁö ¾ÊÀ» °æ¿ì, ¿¬°áÀ» Á¾·áÇÕ´Ï´Ù."); } break; } - // Ŷ̵ Ŷũ⸦ ˾Ƴ. - // ̶ Ŷũ Ѵ. + // ÆÐŶ¾ÆÀ̵ð ¹× ÆÐŶũ±â¸¦ ¾Ë¾Æ³½´Ù. + // À̶§ ÆÐŶũ±â´Â Çì´õ¸¦ Æ÷ÇÔÇÑ´Ù. memcpy(&packetID, &header[0], szPacketID); memcpy(&packetSize, &header[szPacketID], szPacketSize); - // ȡ + // ¶ÁÈ¡·â°üÐòÁÐ memcpy(&packetSequence, &header[szPacketID + szPacketSize], szSequenceSize); - // жϷǷϷ + // ÅжϷâ°üÐòÁÐÊÇ·ñºÏ·¨ if (packetSequence != m_Sequence) { filelog("SequenceError.txt", "Timeout Disconnect1. Name[%s],Host[%s]", ((getCreature() == NULL) ? "NULL" : getCreature()->getName().c_str()), ((getSocket() == NULL) ? "NULL" : getSocket()->getHost().c_str())); - throw DisconnectException("д"); + throw DisconnectException("·â°üÐòÁдíÎó"); } m_Sequence++; - // жϷIDǷϷ + // ÅжϷâ°üIDÊÇ·ñºÏ·¨ if (packetID >= (int)Packet::PACKET_MAX) { filelog("GamePlayer.txt", "Packet ID exceed MAX, RECV [%d/%d],ID[%s],Host[%s]", packetID, Packet::PACKET_MAX, m_ID.c_str(), @@ -403,7 +403,7 @@ void GamePlayer::processCommand(bool Option) { } try { - // Ŷ ùٸ Ѵ. + // ÆÐŶ ¼ø¼­°¡ ¿Ã¹Ù¸¥Áö °ËÁõÇÑ´Ù. if (!g_pPacketValidator->isValidPacketID(getPlayerStatus(), packetID)) { filelog("GamePlayer.txt", "Not Valid Packet, RECV [%d],ID[%s],Host[%s]", packetID, m_ID.c_str(), // getCreature()->getName().c_str(), @@ -411,7 +411,7 @@ void GamePlayer::processCommand(bool Option) { throw InvalidProtocolException("invalid packet order"); } - // µķǷ + // Ìø¹ýµ¼Öµ±»úµÄ·Ç·¨±¨ÎÄ if (packetID == Packet::PACKET_GC_OTHER_STORE_INFO || packetID == Packet::PACKET_GC_MY_STORE_INFO) { filelog("GamePlayer.txt", "Not Valid Packet, RECV [%d],ID[%s],Host[%s]", packetID, m_ID.c_str(), // getCreature()->getName().c_str(), @@ -419,7 +419,7 @@ void GamePlayer::processCommand(bool Option) { throw InvalidProtocolException("invalid packet order"); } - // Ŷ ũⰡ ʹ ũ Ѵ. + // ÆÐŶ Å©±â°¡ ³Ê¹« Å©¸é ÇÁ·ÎÅäÄÝ ¿¡·¯·Î °£ÁÖÇÑ´Ù. if (packetSize > g_pPacketFactoryManager->getPacketMaxSize(packetID)) { filelog("GamePlayer.txt", "Too Larget Packet Size, RECV [%d],PacketSize[%d/%d],ID[%s],Host[%s]", packetID, packetSize, g_pPacketFactoryManager->getPacketMaxSize(packetID), m_ID.c_str(), @@ -428,29 +428,29 @@ void GamePlayer::processCommand(bool Option) { throw InvalidProtocolException("too large packet size"); } - // жϷǷ + // ÅжϷâ°üÊý¾ÝÊÇ·ñ½ÓÊÕÍê±Ï if (m_pInputStream->length() < szPacketHeader + packetSize) // throw InsufficientDataException(); break; - // ǰʱ + // µ±Ç°Ê±¼ä getCurrentTime(m_ExpireTime); m_ExpireTime.tv_sec += maxIdleSec; - // Դٸ Է¹ۿ Ŷ ϳ ̻ ִٴ ̴. - // Ŷ丮Ŵκ Ŷ̵ ؼ Ŷ Ʈó ϸ ȴ. - // Ŷ̵ ߸ Ŷ丮Ŵ óѴ. + // ¿©±â±îÁö ¿Ô´Ù¸é ÀԷ¹öÆÛ¿¡´Â ¿ÏÀüÇÑ ÆÐŶ Çϳª ÀÌ»óÀÌ µé¾îÀÖ´Ù´Â ¶æÀÌ´Ù. + // ÆÐŶÆÑÅ丮¸Å´ÏÀú·ÎºÎÅÍ ÆÐŶ¾ÆÀ̵𸦠»ç¿ëÇØ¼­ ÆÐŶ ½ºÆ®·°Ã³¸¦ »ý¼ºÇÏ¸é µÈ´Ù. + // ÆÐŶ¾ÆÀ̵𰡠À߸øµÉ °æ¿ì´Â ÆÐŶÆÑÅ丮¸Å´ÏÀú¿¡¼­ ó¸®ÇÑ´Ù. pPacket = g_pPacketFactoryManager->createPacket(packetID); - // ŶƮó ʱȭѴ. - // ŶŬ ǵ read() virtual Ŀ ؼ ȣǾ - // ڵ ʱȭȴ. + // ÀÌÁ¦ ÀÌ ÆÐŶ½ºÆ®·°Ã³¸¦ ÃʱâÈ­ÇÑ´Ù. + // ÆÐŶÇÏÀ§Å¬·¡½º¿¡ Á¤ÀÇµÈ read()°¡ virtual ¸ÞÄ¿´ÏÁò¿¡ ÀÇÇØ¼­ È£ÃâµÇ¾î + // ÀÚµ¿ÀûÀ¸·Î ÃʱâÈ­µÈ´Ù. m_pInputStream->readPacket(pPacket); - // Ŷ Ŷ 丮 ڿ ִ´. + // ÇöÀç ÆÐŶÀ» ÆÐŶ È÷½ºÅ丮ÀÇ ¸Ç µÚ¿¡ ³Ö´Â´Ù. m_PacketHistory.push_back(pPacket); - // packet file log . + // packet file log¸¦ ³²±ä´Ù. if (m_bPacketLog) { Timeval currentTime; getCurrentTime(currentTime); @@ -465,8 +465,8 @@ void GamePlayer::processCommand(bool Option) { // cout << "[" << (int)Thread::self() << "] execute before : " << pPacket->getPacketName().c_str() << // endl; - // ŶƮó Ŷڵ鷯 ϸ ȴ. - // Ŷ̵ ߸ Ŷڵ鷯Ŵ óѴ. + // ÀÌÁ¦ ÀÌ ÆÐŶ½ºÆ®·°Ã³¸¦ °¡Áö°í ÆÐŶÇڵ鷯¸¦ ¼öÇàÇÏ¸é µÈ´Ù. + // ÆÐŶ¾ÆÀ̵𰡠À߸øµÉ °æ¿ì´Â ÆÐŶÇڵ鷯¸Å´ÏÀú¿¡¼­ ó¸®ÇÑ´Ù. try { #ifdef __PROFILE_PACKETS__ @@ -493,17 +493,17 @@ void GamePlayer::processCommand(bool Option) { // cout << "[" << (int)Thread::self() << "] execute after : " << pPacket->getPacketName().c_str() << // endl; - // Ŷ nPacketHistorySize ŭ Ѵ. + // ÆÐŶÀ» nPacketHistorySize °³¸¸Å­¸¸ ÀúÀåÇÑ´Ù. while (m_PacketHistory.size() > nPacketHistorySize) { Packet* oldPacket = m_PacketHistory.front(); SAFE_DELETE(oldPacket); m_PacketHistory.pop_front(); } } catch (IgnorePacketException& igpe) { - // PacketValidator Ŷ ϶ , - // Է½Ʈ ʵ Ѵ. + // PacketValidator ¿¡¼­ ÆÐŶÀ» ¹«½ÃÇ϶ó°í ÇßÀ¸´Ï, + // ÀԷ½ºÆ®¸²¿¡¼­ ¸ðµÎ Áö¿ö¹ö¸®°í ½ÇÇàÇÏÁö ¾Êµµ·Ï ÇÑ´Ù. - // Ŷ ũⰡ ʹ ũ Ѵ. + // ÆÐŶ Å©±â°¡ ³Ê¹« Å©¸é ÇÁ·ÎÅäÄÝ ¿¡·¯·Î °£ÁÖÇÑ´Ù. if (packetSize > g_pPacketFactoryManager->getPacketMaxSize(packetID)) { filelog("GamePlayer.txt", "Too Larget Packet Size[Ignore], RECV [%d],PacketSize[%d],Name[%s],Host[%s]", packetID, @@ -512,22 +512,22 @@ void GamePlayer::processCommand(bool Option) { throw InvalidProtocolException("too large packet sizeIgnore"); } - // Է¹۳ Ŷũ⸸ŭ Ÿ ִ ȮѴ. - // ȭ break ϸ ȴ. (⼭ ϴ exception ̴.) + // ÀԷ¹öÆÛ³»¿¡ ÆÐŶũ±â¸¸Å­ÀÇ µ¥ÀÌŸ°¡ µé¾îÀÖ´ÂÁö È®ÀÎÇÑ´Ù. + // ÃÖÀûÈ­½Ã break ¸¦ »ç¿ëÇÏ¸é µÈ´Ù. (¿©±â¼­´Â ÀÏ´Ü exceptionÀ» ¾µ °ÍÀÌ´Ù.) if (m_pInputStream->length() < szPacketHeader + packetSize) throw InsufficientDataException(); - // Ÿ , ũ⸸ŭ ϰ, - // ٸ Ŷ óϵ Ѵ.... + // µ¥ÀÌŸ°¡ ¸ðµÎ µµÂøÇßÀ¸¸é, ±× Å©±â¸¸Å­ ¹«½ÃÇϰí, + // ´Ù¸¥ ÆÐŶÀ» ó¸®Çϵµ·Ï ÇÑ´Ù.... m_pInputStream->skip(szPacketHeader + packetSize); - // õ Ŷ, expire ʰ ȴ. - // ȿ Ŷ © ʰ ش. - // 丮  ʴ´. + // ¹«½ÃµÈ ÆÐŶÀº, expire ¿¡ ¿µÇâÀ» ÁÖÁö ¾Ê°Ô µÈ´Ù. + // Áï À¯È¿ÇÑ ÆÐŶ¸¸ÀÌ Â©¸®Áö ¾Ê°Ô ÇØÁØ´Ù. + // ¶ÇÇÑ È÷½ºÅ丮¿¡µµ µé¾î°¡Áö ¾Ê´Â´Ù. } } } catch (InsufficientDataException& ide) { - // expire time ʰ Ѵ. + // expire time À» ÃʰúÇßÀ» °æ¿ì ¿¬°áÀ» Á¾·áÇÑ´Ù. Timeval currentTime; getCurrentTime(currentTime); if (currentTime >= m_ExpireTime) { @@ -535,14 +535,14 @@ void GamePlayer::processCommand(bool Option) { ((getCreature() == NULL) ? "NULL" : getCreature()->getName().c_str()), ((getSocket() == NULL) ? "NULL" : getSocket()->getHost().c_str())); - throw DisconnectException(" ð Է , մϴ."); + throw DisconnectException("ÀÏÁ¤ ½Ã°£µ¿¾È ÀÔ·ÂÇÏÁö ¾ÊÀ» °æ¿ì, ¿¬°áÀ» Á¾·áÇÕ´Ï´Ù."); } } - // ּó by sigi. 2002.5.14 + // ÁÖ¼®Ã³¸® by sigi. 2002.5.14 /* catch (InvalidProtocolException & ipe) { - // Ѿ Ѵ. ?? + // Á¢¼ÓÀ» °­Á¦Á¾·á½ÃÄÑ¾ß ÇÑ´Ù. ¹«½¼ ¹æ¹ýÀ¸·Î?? throw; } catch (Throwable & t) @@ -561,8 +561,8 @@ void GamePlayer::processCommand(bool Option) { // // flush output buffer to socket's send buffer // -// flush ٸ 忡 ۿ sendPacket ȣؼ ȵȴ. -// (̷ say ƿ ͹ۿ .) +// flushÇÒ µ¿¾È ´Ù¸¥ ¾²·¹µå¿¡¼­ Ãâ·Â ¹öÆÛ¿¡ sendPacketÀ» È£ÃâÇØ¼­´Â ¾ÈµÈ´Ù. +// (ÀÌ·² °æ¿ì´Â ¼­¹ö°£ Åë½ÅÀ¸·Î say°¡ ³¯¾Æ¿À´Â °Í¹Û¿¡ ¾ø´Ù.) // ////////////////////////////////////////////////////////////////////// void GamePlayer::processOutput() { @@ -579,8 +579,8 @@ void GamePlayer::processOutput() { } catch (InvalidProtocolException& It) { // cerr << "GamePlayer::processOutput Exception Check!!" << endl; // cerr << It.toString() << endl; - // cerr << "ͼ µ...... ̴ ΰ?" << (int)i << endl; - throw DisconnectException("Pipe ı ¥"); + // cerr << "ÀͼÁ¼Ç ³µ´Âµ¥...... ¾ÆÀÌ´Â ¸îÀΰí?" << (int)i << endl; + throw DisconnectException("Pipe ¿¬°áÀÇ ÆÄ±«·Î Á¢¼ÓÀ» Â¥¸¥´Ù"); } __LEAVE_CRITICAL_SECTION(m_Mutex) @@ -600,7 +600,7 @@ void GamePlayer::sendPacket(Packet* pPacket) { __ENTER_CRITICAL_SECTION(m_Mutex) try { - // packet file log . + // packet file log¸¦ ³²±ä´Ù. if (m_bPacketLog) { Timeval currentTime; getCurrentTime(currentTime); @@ -655,7 +655,7 @@ void GamePlayer::sendPacket(Packet* pPacket) { } catch (InvalidProtocolException& It) { // cout << "GamePlayer::sendPacket Exception Check!!" << endl; // cout << It.toString() << endl; - // throw DisconnectException("Pipe ı ¥"); + // throw DisconnectException("Pipe ¿¬°áÀÇ ÆÄ±«·Î Á¢¼ÓÀ» Â¥¸¥´Ù"); } __LEAVE_CRITICAL_SECTION(m_Mutex) @@ -668,8 +668,8 @@ void GamePlayer::sendPacket(Packet* pPacket) { // // disconnect player // -// (1) ũó , ϰ εijƮѴ. -// (2) ũó Ѵ. +// (1) Å©¸®Ã³°¡ Á¸ÀçÇÒ °æ¿ì, Á¸¿¡¼­ »èÁ¦ÇÏ°í ºê·Îµåij½ºÆ®ÇÑ´Ù. +// (2) Å©¸®Ã³¸¦ ÀúÀåÇÑ´Ù. // //-------------------------------------------------------------------------------- void GamePlayer::disconnect(bool bDisconnected) { @@ -678,30 +678,30 @@ void GamePlayer::disconnect(bool bDisconnected) { __ENTER_CRITICAL_SECTION(m_Mutex) //-------------------------------------------------------------------------------- - // ũó , ֺ PC鿡 εijƮش. - // ״ ũó DB Ѵ. + // Å©¸®Ã³¸¦ Á¸¿¡¼­ »èÁ¦ÇÑ ÈÄ, ÁÖº¯ÀÇ PCµé¿¡°Ô ºê·Îµåij½ºÆ®ÇØÁØ´Ù. + // ±×´ÙÀ½ Å©¸®Ã³¸¦ DB¿¡ ÀúÀåÇÑ´Ù. //-------------------------------------------------------------------------------- string CreatureName = ""; if (m_pCreature != NULL) { CreatureName = m_pCreature->getName(); try { - // GPS_NORMAL 쿡, ũó  ְ ȴ. + // GPS_NORMAL ÀÎ °æ¿ì¿¡¸¸, Á¸¿¡ Å©¸®Ã³°¡ µé¾î°¡ ÀÖ°Ô µÈ´Ù. // *CAUTION* - // Ȥ pushPC() ȣ Ŀ Ǹ  ϳ.. ɼ ִ. - // ׷, ó ƾ 캸 ׷ ʿ䰡 . - // , ó ũó ŸϷ ö , - // ٽ ÷̾ ó ƿ ̴. + // Ȥ½Ã pushPC()°¡ È£ÃâµÈ ÈÄ¿¡ ¿¬°áÀÌ Á¾·áµÇ¸é ¾î¶»°Ô Çϳª.. ¶ó°í °ÆÁ¤ÇÒ °¡´É¼ºµµ ÀÖ´Ù. + // ±×·¯³ª, ó¸® ·çƾÀÇ ¼ø¼­¸¦ Àß »ìÆìº¸¸é ±×·± °ÆÁ¤À» ÇÒ Çʿ䰡 ¾ø´Ù. + // ¾îÂ÷ÇÇ ¿¬°áÀÌ ²÷±â´õ¶óµµ, Á¸ÀÌ Ã³¸®µÈ ÈÄ Å©¸®Ã³°¡ ½ÇÁ¦ ŸÀÏ·Î ¿Ã¶ó°£ ´ÙÀ½, + // ´Ù½Ã Ç÷¹À̾îÀÇ Ã³¸®·çÇÁ°¡ µ¹¾Æ¿À±â ¶§¹®ÀÌ´Ù. if (getPlayerStatus() == GPS_NORMAL) { //---------------------------------- - // ϰ εijƮѴ. + // Á¸¿¡¼­ »èÁ¦ÇÏ°í ºê·Îµåij½ºÆ®ÇÑ´Ù. //---------------------------------- Zone* pZone = m_pCreature->getZone(); Assert(pZone != NULL); pZone->deleteQueuePC(m_pCreature); pZone->deleteCreature(m_pCreature, m_pCreature->getX(), m_pCreature->getY()); //-------------------------------------------------------------------------------- - // ũó Ѵ. + // Å©¸®Ã³¸¦ ÀúÀåÇÑ´Ù. //-------------------------------------------------------------------------------- m_pCreature->save(); } @@ -712,7 +712,7 @@ void GamePlayer::disconnect(bool bDisconnected) { setPlayerStatus(GPS_END_SESSION); //-------------------------------------------------------------------------------- - // ̵ Ǿٴ , α ̷ٴ ̴. + // ¾ÆÀ̵𰡠¼³Á¤µÇ¾ú´Ù´Â ¶æÀº, ·Î±×ÀÎÀÌ ÀÌ·ç¾îÁ³´Ù´Â ¶æÀÌ´Ù. //-------------------------------------------------------------------------------- if (m_ID != "") { Statement* pStmt1 = NULL; @@ -720,25 +720,25 @@ void GamePlayer::disconnect(bool bDisconnected) { BEGIN_DB { // pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); - // α׿ Ѵ. + // ·Î±×¿ÀÇÁ·Î º¯°æÇÑ´Ù. // pStmt1 = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt1 = g_pDatabaseManager->getDistConnection("PLAYER_DB")->createStatement(); - // LogOn GAME 츸 LOGOFF ٲ۴. by sigi. 2002.5.15 + // LogOnÀÌ GAME»óÅÂÀÎ °æ¿ì¸¸ LOGOFF·Î ¹Ù²Û´Ù. by sigi. 2002.5.15 pStmt1->executeQuery( "UPDATE Player SET LogOn='LOGOFF', LastLogoutDate=now() WHERE PlayerID = '%s' AND LogOn='GAME'", m_ID.c_str()); - // LogoutPlayerData ߰Ѵ. + // LogoutPlayerData ¿¡ Ãß°¡ÇÑ´Ù. // addLogoutPlayerData(this); if (pStmt1->getAffectedRowCount() == 0) { - // ̹ LOGOFFų - // LOGONΰ? - // ̷ ? -_-; + // ÀÌ¹Ì LOGOFF°Å³ª + // LOGON»óÅÂÀΰ¡? + // ÀÌ·² ¼ö ÀÖÀ»±î? -_-; } - // by sigi. 2002.5.31 + // ºô¸µ by sigi. 2002.5.31 #if defined(__PAY_SYSTEM_LOGIN__) || defined(__PAY_SYSTEM_ZONE__) || defined(__PAY_SYSTEM_FREE_LIMIT__) if (isPayPlaying() || isPremiumPlay()) { logoutPayPlay(m_ID); @@ -750,7 +750,7 @@ void GamePlayer::disconnect(bool bDisconnected) { } END_DB(pStmt1) BEGIN_DB { - // IP ش. + // IP Á¤º¸¸¦ »èÁ¦ÇØ ÁØ´Ù. pStmt2 = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt2->executeQuery("DELETE FROM UserIPInfo WHERE Name = '%s'", CreatureName.c_str()); @@ -759,33 +759,33 @@ void GamePlayer::disconnect(bool bDisconnected) { END_DB(pStmt2) } - // login client . - // LGIncomingConnectionOKHandler óߴ. by sigi. 2002.6.19 + // login¼­¹ö·Î °¡¶ó°í client¿¡°Ô º¸³½´Ù. + // ¿ø·¡´Â LGIncomingConnectionOKHandler¿¡¼­ ó¸®Çß´Ù. by sigi. 2002.6.19 if (m_pReconnectPacket != NULL) { // cout << "[SendReconnect] " << m_pReconnectPacket->toString().c_str() << endl; try { // sendPacket( m_pReconnectPacket ); Player::sendPacket(m_pReconnectPacket); - // ۿ ִ Ÿ Ѵ. + // Ãâ·Â ¹öÆÛ¿¡ ³²¾ÆÀÖ´Â µ¥ÀÌŸ¸¦ Àü¼ÛÇÑ´Ù. m_pOutputStream->flush(); } catch (Throwable& t) { - // + // ¹«½Ã } SAFE_DELETE(m_pReconnectPacket); } - // Լ κп óߴµ.. Ÿ̹ (LogOn̳ UserIPInfo ) - // ⼭ ְ.. Ŷ~ Ѵ. + // ÇÔ¼ö À­ºÎºÐ¿¡¼­ ó¸®Çߴµ¥.. ŸÀÌ¹Ö ¹®Á¦(LogOnÀ̳ª UserIPInfo µî)·Î + // ¿©±â¼­ ²÷¾îÁÖ°í.. ÀçÁ¢ÆÐŶ~À» º¸³»µµ·Ï ÇÑ´Ù. if (bDisconnected == UNDISCONNECTED) { try { - // Ŭ̾Ʈ GCDisconnect Ŷ Ѵ. + // Ŭ¶óÀÌ¾ðÆ®¿¡°Ô GCDisconnect ÆÐŶÀ» Àü¼ÛÇÑ´Ù. // GCDisconnect gcDisconnect; // sendPacket(gcDisconnect); - // ۿ ִ Ÿ Ѵ. + // Ãâ·Â ¹öÆÛ¿¡ ³²¾ÆÀÖ´Â µ¥ÀÌŸ¸¦ Àü¼ÛÇÑ´Ù. m_pOutputStream->flush(); } catch (Throwable& t) { // cerr << "GamePlayer::disconnect() : GamePlayer::disconnect Exception Check!!" << endl; @@ -793,7 +793,7 @@ void GamePlayer::disconnect(bool bDisconnected) { } } - // ݴ´. + // ¼ÒÄÏ ¿¬°áÀ» ´Ý´Â´Ù. m_pSocket->close(); __LEAVE_CRITICAL_SECTION(m_Mutex) @@ -804,11 +804,11 @@ void GamePlayer::disconnect(bool bDisconnected) { ////////////////////////////////////////////////////////////////////// // -// ֱ N ° Ŷ Ѵ. +// ÃÖ±Ù N ¹øÂ°ÀÇ ÆÐŶÀ» ¸®ÅÏÇÑ´Ù. // -// N == 0 , ֱ Ŷ ϰ ȴ. +// N == 0 ÀÏ °æ¿ì, °¡Àå ÃÖ±ÙÀÇ ÆÐŶÀ» ¸®ÅÏÇÏ°Ô µÈ´Ù. // -// ִ nPacketHistorySize - 1 ִ. +// ÃÖ´ë nPacketHistorySize - 1 ±îÁö ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. // ////////////////////////////////////////////////////////////////////// Packet* GamePlayer::getOldPacket(uint prev) { @@ -832,7 +832,7 @@ Packet* GamePlayer::getOldPacket(uint prev) { ////////////////////////////////////////////////////////////////////// // -// Ư Ŷ̵ ֱ Ŷ Ѵ. +// ƯÁ¤ ÆÐŶ¾ÆÀ̵𸦠°¡Áø °¡Àå ÃÖ±ÙÀÇ ÆÐŶÀ» ¸®ÅÏÇÑ´Ù. // ////////////////////////////////////////////////////////////////////// Packet* GamePlayer::getOldPacket(PacketID_t packetID) { @@ -931,28 +931,28 @@ bool GamePlayer::verifySpeed(Packet* pPacket) { getCurrentTime(CurrentTime); ////////////////////////////////////////////////////////////////////////// - // - // 2007-6-25 kf_168@hotmail.com + // ·â°üÐÄÌø¼ì²â + // ¿§·È 2007-6-25 kf_168@hotmail.com // if (PacketID == Packet::PACKET_CG_VERIFY_TIME) { if (m_SpeedVerify.tv_sec == 0) { - // δȡʼֵ,ȡǰʱ+SpeedCheckDelyaΪʼֵ - // üͨ SpeedCheck = true; + // Èç¹ûδ»ñÈ¡ÐÄÌø¼ì²â³õʼ»¯Öµ,ÔòÈ¡µ±Ç°Ê±¼ä+SpeedCheckDelya×÷Ϊ³õʼֵ + // ÉèÖüì²âͨ¹ý SpeedCheck = true; m_SpeedVerify.tv_sec = CurrentTime.tv_sec + SpeedCheckDelay; SpeedCheck = true; } else { - // ¿ʼ - // ǰʱϴμʱ+ƫֵ,ͨ + // ÒÔÏ¿ªÊ¼¼ì²â + // Èç¹ûµ±Ç°Ê±¼ä´óÓÚÉϴμì²âʱ¼ä+ÉÏÆ«ÒÆÖµ,Ôò¼ì²âͨ¹ý if (CurrentTime.tv_sec > m_SpeedVerify.tv_sec - maxTimeGap) { m_SpeedVerify.tv_sec = CurrentTime.tv_sec + SpeedCheckDelay; SpeedCheck = true; - // У-1,ǰУ鳬Ԥֵ,򷵻ؼ + // ×î´ó´íÎóУÑé-1,Èç¹ûµ±Ç°´íÎóУÑ鳬¹ýÔ¤ÉèÖµ,Ôò·µ»Ø¼Ù m_VerifyCount = max(0, m_VerifyCount - 1); } else { - // ´Уʱ,עȡǰʱ+´Уʱ. + // ¸üÐÂÏ´ÎУÑéʱ¼ä,×¢ÒâÕâÀïÊÇȡǰʱ¼ä+Ï´ÎУÑéʱ¼ä. m_SpeedVerify.tv_sec = CurrentTime.tv_sec + SpeedCheckDelay; if (m_VerifyCount > maxVerifyCount) { @@ -965,22 +965,22 @@ bool GamePlayer::verifySpeed(Packet* pPacket) { } } // - // ͿԽ + // ¼ì²â·â°ü·¢ËÍ¿ÉÄÜÐÔ½áÊø // Add by Coffee 2007-6-25 kf_168@hotmail.com ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// - // ƶ + // Ôö¼ÓÒÆ¶¯¼ì²â·â°ü¼ì²â // Add by Coffee 2007-6-25 E-mail: kf_168@hotmail.com if (PacketID == Packet::PACKET_CG_MOVE) { if (CurrentTime <= m_MoveSpeedVerify) { - // ʹü + // ʹÓüÓËÙ } // Timeval UseTimer=CurrentTime-m_MoveSpeedVerify; tv_sub(&CurrentTime, &m_MoveSpeedVerify); double rtt; - // ԺΪλrtt + // ÒÔºÁÃëΪµ¥Î»¼ÆËãrtt rtt = CurrentTime.tv_sec * 1000 + CurrentTime.tv_usec / 1000; getCurrentTime(m_MoveSpeedVerify); @@ -993,12 +993,12 @@ bool GamePlayer::verifySpeed(Packet* pPacket) { ////////////////////////////////////////////////////////////////////////// /* - // ũó ǵ带 ޾ƿ´. + // Å©¸®Ã³ÀÇ ½ºÇǵ带 ¹Þ¾Æ¿Â´Ù. if (m_pCreature == NULL || pPacket == NULL) { return true; } - // ð Ŷ ʹ ƿ ¥. + // ±ÔÁ¤ ½Ã°£ ÀÌÀü¿¡ ¶È °°Àº ÆÐŶÀÌ ¼ö½Ê¹ø ³¯¾Æ¿À¸é Á¢¼ÓÀ» Â¥¸¥´Ù. Timeval VerifyTime; getCurrentTime(VerifyTime); @@ -1020,7 +1020,7 @@ bool GamePlayer::verifySpeed(Packet* pPacket) { } if (PacketID == Packet::PACKET_CG_MOVE) { - // ð̶ ð̶ üũؼ ð Ŷ ƿ ̰ ġʹ. + // ÀÌÀü ½Ã°£À̶û ÇöÀç ½Ã°£À̶û Ã¼Å©ÇØ¼­ ´õ ºü¸¥ ½Ã°£¿¡ ÆÐŶÀÌ ³¯¾Æ¿ÔÀ¸¸é ÀÌ°Ç Ä¡ÅÍ´Ù. if (VerifyTime <= m_MoveSpeedVerify) { SpeedCheck = false; } @@ -1028,8 +1028,8 @@ bool GamePlayer::verifySpeed(Packet* pPacket) { getCurrentTime(m_MoveSpeedVerify); getCurrentTime(m_AttackSpeedVerify); - // 갡 ƿ ִ ð д. - // Ŭ Ÿ ִٸ ̵ӵ پ. + // ´ÙÀ½¿¡ ¹«ºê°¡ °¡Àå »¡¸® ³¯¾Æ¿Ã ¼ö ÀÖ´Â °¡´ÉÇÑ ½Ã°£À» ÀúÀåÇØ µÐ´Ù. + // ¸ðÅä »çÀÌŬÀ» Ÿ°í ÀÖ´Ù¸é À̵¿¼Óµµ°¡ ÁÙ¾îµç´Ù. BYTE RealSpeed = 0; if (pSlayer->hasRideMotorcycle()) @@ -1037,13 +1037,13 @@ bool GamePlayer::verifySpeed(Packet* pPacket) { //RealSpeed = 2; RealSpeed = 1; } - else // Ŭ ƴϴ. + else // ¸ðÅä»çÀÌŬÀÌ ¾Æ´Ï´Ù. { //RealSpeed = 4; RealSpeed = 2; } - // ִ ð Ѵ. + // ´ÙÀ½ ¾µ ¼ö ÀÖ´Â ½Ã°£À» ¼ÂÆÃÇÑ´Ù. m_MoveSpeedVerify.tv_sec += RealSpeed / 10; m_MoveSpeedVerify.tv_usec += RealSpeed* 100000; @@ -1056,7 +1056,7 @@ bool GamePlayer::verifySpeed(Packet* pPacket) { { SpeedCheck = false; } - // ⸦ ִ üũѴ. + // ¹«±â¸¦ ¹«¾ùÀ» µé°í ÀÖ´ÂÁö üũÇÑ´Ù. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); Item::ItemClass IClass = Item::ITEM_CLASS_SKULL; if (pItem != NULL) { @@ -1067,7 +1067,7 @@ bool GamePlayer::verifySpeed(Packet* pPacket) { getCurrentTime(m_MoveSpeedVerify); BYTE RealSpeed = 0; - // ο ǵ + // ½½·Î¿ì ½ºÇǵå if (Speed == 0) { switch (IClass) @@ -1098,13 +1098,13 @@ bool GamePlayer::verifySpeed(Packet* pPacket) { case Item::ITEM_CLASS_SMG : RealSpeed = 10; break; - // ⺻ 875 + // ±âº» °ø°Ý 875 default : RealSpeed = 8; break; } } - else if (Speed == 1) // ǵ + else if (Speed == 1) // ³ë¸Ö ½ºÇǵå { switch (IClass) { @@ -1134,14 +1134,14 @@ bool GamePlayer::verifySpeed(Packet* pPacket) { case Item::ITEM_CLASS_SMG : RealSpeed = 8; break; - // ⺻ 875 + // ±âº» °ø°Ý 875 default : RealSpeed = 8; break; } } - else // нƮ ǵ + else // ÆÐ½ºÆ® ½ºÇǵå { switch (IClass) { @@ -1178,7 +1178,7 @@ bool GamePlayer::verifySpeed(Packet* pPacket) { } } - // ǵ ȭ å + // ½ºÇÇµå ¿ÏÈ­ Á¤Ã¥ RealSpeed -= 2; m_AttackSpeedVerify.tv_sec += RealSpeed / 10; @@ -1215,7 +1215,7 @@ bool GamePlayer::verifySpeed(Packet* pPacket) { if (PacketID == Packet::PACKET_CG_MOVE) { - // ð̶ ð̶ üũؼ ð Ŷ ƿ ̰ ġʹ. + // ÀÌÀü ½Ã°£À̶û ÇöÀç ½Ã°£À̶û Ã¼Å©ÇØ¼­ ´õ ºü¸¥ ½Ã°£¿¡ ÆÐŶÀÌ ³¯¾Æ¿ÔÀ¸¸é ÀÌ°Ç Ä¡ÅÍ´Ù. if (VerifyTime <= m_MoveSpeedVerify) { SpeedCheck = false; @@ -1225,14 +1225,14 @@ bool GamePlayer::verifySpeed(Packet* pPacket) { getCurrentTime(m_AttackSpeedVerify); BYTE RealSpeed = 0; - // 갡 ƿ ִ ð д. - // ϰ ִٸ ӵ . ʴ Ÿ ̵ Ѵ. + // ´ÙÀ½¿¡ ¹«ºê°¡ °¡Àå »¡¸® ³¯¾Æ¿Ã ¼ö ÀÖ´Â °¡´ÉÇÑ ½Ã°£À» ÀúÀåÇØ µÐ´Ù. + // ¹ÚÁã º¯½ÅÀ» Çϰí ÀÖ´Ù¸é ¼Óµµ°¡ »¡¶óÁø´Ù. ÃÊ´ç ³× Å¸ÀÏÀ» À̵¿ ÇÑ´Ù. if (pVampire->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT)) { //RealSpeed = 2; RealSpeed = 1; } - else // ¿ ʴ Ÿ ̵Ѵ. + else // ³ë¸Ö »óÅ¿¡¼± ÃÊ´ç µÎŸÀÏÀ» À̵¿ÇÑ´Ù. { //RealSpeed = 4; RealSpeed = 2; @@ -1255,20 +1255,20 @@ bool GamePlayer::verifySpeed(Packet* pPacket) { getCurrentTime(m_MoveSpeedVerify); BYTE RealSpeed = 0; - if (Speed == 0) // ο ǵ 875 + if (Speed == 0) // ½½·Î¿ì ½ºÇǵå 875 { RealSpeed = 8; } - else if (Speed == 1) // ǵ 875 + else if (Speed == 1) // ³ë¸Ö ½ºÇǵå 875 { RealSpeed = 8; } - else // нƮ ǵ 812 + else // ÆÐ½ºÆ® ½ºÇǵå 812 { RealSpeed = 8; } - // ǵ ȭ å + // ½ºÇÇµå ¿ÏÈ­ Á¤Ã¥ RealSpeed -= 2; m_AttackSpeedVerify.tv_sec += RealSpeed / 10; @@ -1356,16 +1356,16 @@ bool GamePlayer::sendBillingLogin() { Timeval afterTime; getCurrentTime(afterTime); - // 1 ̻ ɸ α . + // 1ÃÊ ÀÌ»ó °É¸®¸é ·Î±× ³²±ä´Ù. if (afterTime.tv_sec > currentTime.tv_sec + 1) { filelog("billingLoginTime.txt", "PlayerID : %s, CallTime : %d sec, Try : %d", m_ID.c_str(), (int)(afterTime.tv_sec - currentTime.tv_sec), m_BillingLoginRequestCount); } - // PayLogin û ȸ + // PayLogin ¿äûÇÑ È¸¼ö ±â¾ï m_BillingLoginRequestCount++; - // 60 ٽ üũѴ. + // 60ÃÊ ÈÄ ´Ù½Ã üũÇÑ´Ù. m_BillingNextLoginRequestTime.tv_sec = currentTime.tv_sec + 60; } @@ -1405,17 +1405,17 @@ void GamePlayer::sendCBillingPayInfo() { __END_CATCH } -// ȣȭ ڵ带 Ѵ. +// ¾Ïȣȭ Äڵ带 ¼³Á¤ÇÑ´Ù. void GamePlayer::setEncryptCode() { __BEGIN_TRY #ifdef __USE_ENCRYPTER__ Assert(m_pCreature != NULL); - // ϴ ObjectID ̿Ѵ. + // ÀÏ´ÜÀº ObjectID¸¦ ÀÌ¿ëÇÑ´Ù. // ObjectID_t objectID = m_pCreature->getObjectID(); - // ϵ Ѵ. + // Á¸º°·Î °ü¸®¸¦ Çϵµ·Ï ¼öÁ¤ÇÑ´Ù. // ZoneID_t zoneID = m_pCreature->getZone()->getZoneID(); // static int serverID = g_pConfig->getPropertyInt("ServerID"); @@ -1426,9 +1426,9 @@ void GamePlayer::setEncryptCode() { uchar code = m_pCreature->getZone()->getEncryptCode(); #ifdef __ACTIVE_SERVICE_DEADLINE__ - // ٺ ڵ + // ¼­¹ö ¹Ùº¸ ¸¸µé±â ÄÚµå VSDate date = VSDate::currentDate(); - // 2003 1 ̻ : 2003, 0 + // 2003³â 1¿ù ÀÌ»óÀÎ °æ¿ì: 2003, 0 if (date.year() >= DEADLINE_YEAR && date.month() > DEADLINE_MONTH) code += (date.year() + date.month()) / 11; #endif @@ -1450,7 +1450,7 @@ void GamePlayer::setEncryptCode() { void GamePlayer::kickPlayer(uint nSeconds, uint KickMessageType) { __BEGIN_TRY - // ̹ EventKick ִٸ Ѵ. + // ÀÌ¹Ì EventKick ÀÌ ÀÖ´Ù¸é ¹«½ÃÇÑ´Ù. if (m_EventManager.getEvent(Event::EVENT_CLASS_KICK) != NULL) return; @@ -1458,7 +1458,7 @@ void GamePlayer::kickPlayer(uint nSeconds, uint KickMessageType) { pEventKick->setDeadline(nSeconds * 10); addEvent(pEventKick); - // Ŀ ©.. ش. + // ¸î ÃÊÈÄ¿¡ ©¸°´Ù..°í º¸³»ÁØ´Ù. GCKickMessage gcKickMessage; gcKickMessage.setType(KickMessageType); gcKickMessage.setSeconds(nSeconds); @@ -1468,7 +1468,7 @@ void GamePlayer::kickPlayer(uint nSeconds, uint KickMessageType) { } ////////////////////////////////////////////////////////////////// -// PaySystem +// PaySystem °ü·Ã ////////////////////////////////////////////////////////////////// bool GamePlayer::loginPayPlay(PayType payType, const string& PayPlayDate, int PayPlayHours, uint payPlayFlag, const string& ip, const string& playerID) { @@ -1539,8 +1539,8 @@ bool GamePlayer::isPayPlaying() const { // // add LogoutPlayerdata // -// 踦 ؼ -// UserInfo DB LogoutPlayerData Logout ڸ ߰Ѵ. +// Á¢¼ÓÀÚ Åë°è¸¦ À§Çؼ­ +// UserInfo DBÀÇ LogoutPlayerData¿¡ LogoutÇÑ »ç¿ëÀÚ¸¦ Ãß°¡ÇÑ´Ù. // ////////////////////////////////////////////////////////////////////////////// void addLogoutPlayerData(Player* pPlayer) { @@ -1548,12 +1548,12 @@ void addLogoutPlayerData(Player* pPlayer) { pStmt = g_pDatabaseManager->getUserInfoConnection()->createStatement(); - // ԷѴ. + // À¯Àú Åë°è °ü·Ã Á¤º¸¸¦ ÀÔ·ÂÇÑ´Ù. BEGIN_DB { string ID = pPlayer->getID(); string ip = pPlayer->getSocket()->getHost(); - // ð . + // ¸ÕÀú ÇöÀç ½Ã°£À» ¾ò¾î³½´Ù. int year, month, day, hour, minute, second; getCurrentTimeEx(year, month, day, hour, minute, second); string currentDT = VSDateTime::currentDateTime().toDateTime(); @@ -1609,7 +1609,7 @@ void GamePlayer::checkPCRoomLotto(const Timeval& currentTime) { if (time >= PCRoomLottoSec) { giveLotto(); - // ٽ ð ʱȭѴ. + // ´Ù½Ã ½Ã°£À» ÃʱâÈ­ÇÑ´Ù. m_PCRoomLottoStartTime.tv_sec = currentTime.tv_sec; m_PCRoomLottoSumTime = 0; } @@ -1643,7 +1643,7 @@ void GamePlayer::giveLotto() { Amount + 1, PlayerID.c_str(), Name.c_str(), DimensionID, WorldID); } } else { - // . ־ش. + // º¹±ÇÀÌ ¾ø¾ú´Ù. »õ·Î ³Ö¾îÁØ´Ù. pStmt->executeQuery("INSERT INTO PCRoomLottoObject VALUES ( 0, %u, '%s', %u, %u, '%s', %u, 1 )", m_PCRoomID, PlayerID.c_str(), DimensionID, WorldID, Name.c_str(), Race); } @@ -1684,17 +1684,17 @@ void GamePlayer::logLoginoutDateTime() { if (m_pCreature == NULL) return; - // DimensionID ϱ + // DimensionID ±¸Çϱâ uint dimensionID = g_pConfig->getPropertyInt("Dimension"); if (g_pConfig->getPropertyInt("IsNetMarble") == 0) { - // ݸ 쿣 2 + // ³Ý¸¶ºí ÀÏ °æ¿ì¿£ 2 dimensionID = 2; } // WorldID uint worldID = g_pConfig->getPropertyInt("WorldID"); - // ڵ + // Á¾Á· ÄÚµå uint racecode; uint str, dex, inte; if (m_pCreature->isSlayer()) { @@ -1707,7 +1707,7 @@ void GamePlayer::logLoginoutDateTime() { dex = pSlayer->getDEX(); inte = pSlayer->getINT(); } else if (m_pCreature->isVampire()) { - // ̾ 10 + // ¹ìÆÄÀ̾î´Â 10 racecode = 10; Vampire* pVampire = dynamic_cast(m_pCreature); @@ -1717,7 +1717,7 @@ void GamePlayer::logLoginoutDateTime() { dex = pVampire->getDEX(); inte = pVampire->getINT(); } else if (m_pCreature->isOusters()) { - // ƿ콺 20 + // ¾Æ¿ì½ºÅÍÁî´Â 20 racecode = 20; Ousters* pOusters = dynamic_cast(m_pCreature); @@ -1730,10 +1730,10 @@ void GamePlayer::logLoginoutDateTime() { return; } - // + // ·¹º§ uint level = (uint)m_pCreature->getLevel(); - // α׾ƿ ð. ð + // ·Î±×¾Æ¿ô ½Ã°£. ÇöÀç ½Ã°£ VSDateTime logoutDateTime = VSDateTime::currentDateTime(); // filename diff --git a/src/server/gameserver/GamePlayer.h b/src/server/gameserver/GamePlayer.h index 37d4967f..1999c5d9 100644 --- a/src/server/gameserver/GamePlayer.h +++ b/src/server/gameserver/GamePlayer.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GamePlayer.h // Written by : reiot@ewestsoft.com -// Description : ÷̾ Ŭ +// Description : 게임 서버용 플레이어 클래스 ////////////////////////////////////////////////////////////////////////////// #ifndef __GAME_PLAYER_H__ @@ -31,23 +31,23 @@ ////////////////////////////////////////////////////////////////////////////// // class GamePlayer // -// ÷̾ Ŭ +// 게임 서버용 플레이어 클래스 // -// Player Ŭ ӹ޾Ƽ, Ǵ Mutex -// Creature ޽, PreviousPacket -// ޼ҵ ߰ߴ. +// Player 클래스를 상속받아서, 게임 서버에서만 사용되는 Mutex 및 +// Creature 관련 데이터 및 메쏘드, PreviousPacket 관련 데이터 및 +// 메소드들을 추가했다. // -// Ư processOutput() sendPacket() Race Condition ߻ -// Ƿ, Mutex ȣǾ Ѵ.(MODE-IV ̸, MODE-I, II -// 쿡 processInput(), processCommand() Mutex ȣؾ -// Ѵ.) +// 특히 processOutput() 및 sendPacket()은 Race Condition 이 발생될 수 +// 있으므로, Mutex 로 보호되어야 한다.(MODE-IV의 경우이며, MODE-I, II +// 의 경우에는 processInput(), processCommand() 모두 Mutex 로 보호해야 +// 한다.) ////////////////////////////////////////////////////////////////////////////// class Creature; class GamePlayer : public Player, public PaySystem, public BillingPlayerInfo, public CBillingPlayerInfo { public: - // Ŷ + // 저장해 놓을 이전 패킷의 개수 const static BYTE nPacketHistorySize = 10; public: @@ -68,13 +68,13 @@ class GamePlayer : public Player, public PaySystem, public BillingPlayerInfo, pu virtual void sendPacket(Packet* packet); // disconnect - // α׾ƿ disconnect(LOGOUT) + // 정식 로그아웃의 경우 disconnect(LOGOUT) virtual void disconnect(bool bDisconnected = DISCONNECTED); // get debug string virtual string toString() const; - // ǵ üũ + // 스피드 체크 virtual bool verifySpeed(Packet* pPacket); // get creature pointer @@ -91,11 +91,11 @@ class GamePlayer : public Player, public PaySystem, public BillingPlayerInfo, pu } // return recent N-th packet - // ֱ ۵ N ° Ŷ Ѵ. + // 최근 전송된 N 번째 패킷을 리턴한다. Packet* getOldPacket(uint prev = 0); // return recent packet which has packetID - // Ư ID Ŷ ֱ Ŷ Ѵ. + // 특정 ID를 가진 패킷 중 가장 최근의 패킷을 리턴한다. Packet* getOldPacket(PacketID_t packetID); // get player's status @@ -113,7 +113,7 @@ class GamePlayer : public Player, public PaySystem, public BillingPlayerInfo, pu Event* getEvent(Event::EventClass EClass); void deleteEvent(Event::EventClass EClass); - // гƼ Status Լ + // 패널티 Status 관련 함수 // Set Flag void setPenaltyFlag(PenaltyType PenaltyFlag) { m_PenaltyFlag.set(PenaltyFlag); @@ -139,7 +139,7 @@ class GamePlayer : public Player, public PaySystem, public BillingPlayerInfo, pu void loadSpecialEventCount(void); void saveSpecialEventCount(void); -public: // '̹ ' . Ḧ ؼ. by sigi. +public: // '이미 접속 중'인 경우. 강제 종료를 위해서. by sigi. bool isKickForLogin() const { return m_bKickForLogin; } @@ -162,7 +162,7 @@ class GamePlayer : public Player, public PaySystem, public BillingPlayerInfo, pu } public: - // . + // 쩝. void setReconnectPacket(GCReconnectLogin* pPacket) { SAFE_DELETE(m_pReconnectPacket); m_pReconnectPacket = pPacket; @@ -195,7 +195,7 @@ class GamePlayer : public Player, public PaySystem, public BillingPlayerInfo, pu void sendCBillingPayInfo(); - // Ŷ ȣȭ + // 패킷 암호화 관련 // by sigi. 2002.11.27 void setEncryptCode(); @@ -203,7 +203,7 @@ class GamePlayer : public Player, public PaySystem, public BillingPlayerInfo, pu void kickPlayer(uint nSeconds, uint KickMessageType); ////////////////////////////////////////////////// - // PaySystem + // PaySystem 관련 ////////////////////////////////////////////////// public: bool loginPayPlay(PayType payType, const string& PayPlayDate, int PayPlayHours, uint payPlayFlag, const string& ip, @@ -272,7 +272,7 @@ class GamePlayer : public Player, public PaySystem, public BillingPlayerInfo, pu BYTE m_VerifyCount; - // ð Ÿ. + // 시간 검증 타임. Timeval m_SpeedVerify; Timeval m_MoveSpeedVerify; Timeval m_AttackSpeedVerify; @@ -283,28 +283,28 @@ class GamePlayer : public Player, public PaySystem, public BillingPlayerInfo, pu EventManager m_EventManager; - // ̺Ʈ ī - // ذ ݱ⳪, ׷ ̺Ʈ ִ ī + // 스페셜 이벤트 관련 카운터 + // 해골 많이 줍기나, 뭐 그런 종류의 이벤트에 사용될 수 있는 카운터 uint m_SpecialEventCount; - // '̹ ' Ű + // '이미 접속 중'에서 강제 종료 시키는 경우 bool m_bKickForLogin; string m_KickRequestHost; uint m_KickRequestPort; - // GameServer --> LoginServer Ѵ. . by sigi. 2002.6.19 + // GameServer --> LoginServer로 갈때 사용한다. 으헤헤. by sigi. 2002.6.19 GCReconnectLogin* m_pReconnectPacket; bool m_bFreePass; - // ýۿ ʰ ÷ ϱ + // 빌링 시스템에 연결하지 않고 유료 플레이 하기 bool m_bMetroFreePlayer; - // ں ȹ ʽ Ȯ + // 각 사용자별 아이템 획득 보너스 확률 int m_ItemRatioBonusPoint; - Timeval m_PCRoomLottoStartTime; // PC . ð - uint m_PCRoomLottoSumTime; // PC . ð. logoutPayPlay + Timeval m_PCRoomLottoStartTime; // PC 방 복권 계산용. 적용시작 시간 + uint m_PCRoomLottoSumTime; // PC 방 복권 계산용. 누적시간. logoutPayPlay시 저장용 string m_PacketLogFileName; bool m_bPacketLog; @@ -318,7 +318,7 @@ class GamePlayer : public Player, public PaySystem, public BillingPlayerInfo, pu #ifdef __THAILAND_SERVER__ bool m_bPermission; #endif - // add by Coffee 2007-7-15 ӷм + // add by Coffee 2007-7-15 藤속룐관념죗쇱꿎 private: BYTE m_Sequence; }; diff --git a/src/server/gameserver/GameServerGroupInfo.h b/src/server/gameserver/GameServerGroupInfo.h index 27c829da..90955fc4 100644 --- a/src/server/gameserver/GameServerGroupInfo.h +++ b/src/server/gameserver/GameServerGroupInfo.h @@ -2,7 +2,7 @@ // // Filename : GameServerGroupInfo.h // Written By : Reiot -// Description : α ִ +// Description : 로그인 서버에서 갖고 있는 각 게임 서버에 대한 정보 // //---------------------------------------------------------------------- @@ -19,8 +19,8 @@ // // class GameServerGroupInfo; // -// GAME DB GameServerGroupInfo ̺ о -// Ŭ̴. +// GAME DB의 GameServerGroupInfo 테이블에서 읽어들인 각 게임 서버의 정보를 +// 담은 클래스이다. // //---------------------------------------------------------------------- diff --git a/src/server/gameserver/GameServerGroupInfoManager.cpp b/src/server/gameserver/GameServerGroupInfoManager.cpp index eda05ffc..dd653435 100644 --- a/src/server/gameserver/GameServerGroupInfoManager.cpp +++ b/src/server/gameserver/GameServerGroupInfoManager.cpp @@ -41,17 +41,17 @@ void GameServerGroupInfoManager::clear() { __BEGIN_TRY - // hashmap pair second, GameServerGroupInfo ü ϰ - // pair ü ״ д. (GameServerGroupInfo Ǿ ִٴ Ϳ - // ϶. ʻ ؾ Ѵ. ϱ, GSIM destruct ȴٴ - // α ˴ٿȴٴ ǹϴϱ.. - -; ) + // hashmap 안의 각 pair 의 second, 즉 GameServerGroupInfo 객체만을 삭제하고 + // pair 자체는 그대로 둔다. (GameServerGroupInfo가 힙에 생성되어 있다는 것에 + // 유의하라. 즉 필살삭제를 해야 한다. 하긴, GSIM이 destruct 된다는 것은 + // 로그인 서버가 셧다운된다는 것을 의미하니깐.. - -; ) for (int i = 1; i < m_MaxWorldID; i++) { for (HashMapGameServerGroupInfo::iterator itr = m_GameServerGroupInfos[i].begin(); itr != m_GameServerGroupInfos[i].end(); itr++) { SAFE_DELETE(itr->second); } - // ؽʾȿ ִ pair Ѵ. + // 이제 해쉬맵안에 있는 모든 pair 들을 삭제한다. m_GameServerGroupInfos[i].clear(); } @@ -121,11 +121,11 @@ void GameServerGroupInfoManager::load() addGameServerGroupInfo(pGameServerGroupInfo, WorldID); } - // ʻ ! + // 필살 삭제! SAFE_DELETE(pStmt); } catch (SQLQueryException& sqe) { - // ʻ ! + // 필살 삭제! SAFE_DELETE(pStmt); throw Error(sqe.toString()); @@ -167,14 +167,14 @@ void GameServerGroupInfoManager::deleteGameServerGroupInfo(const ServerGroupID_t HashMapGameServerGroupInfo::iterator itr = m_GameServerGroupInfos[WorldID].find(GroupID); if (itr != m_GameServerGroupInfos[WorldID].end()) { - // GameServerGroupInfo Ѵ. + // GameServerGroupInfo 를 삭제한다. delete itr->second; - // pair Ѵ. + // pair를 삭제한다. m_GameServerGroupInfos[WorldID].erase(itr); } else { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없을 때 throw NoSuchElementException(); } @@ -189,7 +189,7 @@ GameServerGroupInfo* GameServerGroupInfoManager::getGameServerGroupInfo(const Se __BEGIN_TRY if (WorldID >= m_MaxWorldID) { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없었을 때 throw NoSuchElementException(); } @@ -200,7 +200,7 @@ GameServerGroupInfo* GameServerGroupInfoManager::getGameServerGroupInfo(const Se if (itr != m_GameServerGroupInfos[WorldID].end()) { pGameServerGroupInfo = itr->second; } else { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없었을 때 throw NoSuchElementException(); } @@ -229,7 +229,7 @@ string GameServerGroupInfoManager::toString() const //-------------------------------------------------- // *OPTIMIZATION* // - // for_each() + // for_each()를 사용할 것 //-------------------------------------------------- for (HashMapGameServerGroupInfo::const_iterator itr = m_GameServerGroupInfos[i].begin(); itr != m_GameServerGroupInfos[i].end(); itr++) diff --git a/src/server/gameserver/GameServerGroupInfoManager.h b/src/server/gameserver/GameServerGroupInfoManager.h index 3a60c5bb..be92b079 100644 --- a/src/server/gameserver/GameServerGroupInfoManager.h +++ b/src/server/gameserver/GameServerGroupInfoManager.h @@ -22,8 +22,8 @@ typedef unordered_map HashMapGameServerGr // // class GameServerGroupInfoManager; // -// ID Ű ϴ GameServerGroupInfo unordered_map -// ο ִ. +// 게임 서버의 ID 를 키값으로 하는 GameServerGroupInfo의 unordered_map 을 +// 내부에 가지고 있다. // //---------------------------------------------------------------------- diff --git a/src/server/gameserver/GameServerInfoManager.cpp b/src/server/gameserver/GameServerInfoManager.cpp index 2b11cff5..c8ab4d2a 100644 --- a/src/server/gameserver/GameServerInfoManager.cpp +++ b/src/server/gameserver/GameServerInfoManager.cpp @@ -30,10 +30,10 @@ GameServerInfoManager::~GameServerInfoManager() void GameServerInfoManager::clear() { - // hashmap pair second, GameServerInfo ü ϰ - // pair ü ״ д. (GameServerInfo Ǿ ִٴ Ϳ - // ϶. ʻ ؾ Ѵ. ϱ, GSIM destruct ȴٴ - // α ˴ٿȴٴ ǹϴϱ.. - -;) + // hashmap 안의 각 pair 의 second, 즉 GameServerInfo 객체만을 삭제하고 + // pair 자체는 그대로 둔다. (GameServerInfo가 힙에 생성되어 있다는 것에 + // 유의하라. 즉 필살삭제를 해야 한다. 하긴, GSIM이 destruct 된다는 것은 + // 로그인 서버가 셧다운된다는 것을 의미하니깐.. - -;) for (int j = 1; j < m_MaxWorldID; j++) { for (int i = 0; i < m_MaxServerGroupID; i++) { HashMapGameServerInfo::iterator itr = m_pGameServerInfos[j][i].begin(); @@ -41,7 +41,7 @@ void GameServerInfoManager::clear() SAFE_DELETE(itr->second); } - // ؽʾȿ ִ pair Ѵ. + // 이제 해쉬맵안에 있는 모든 pair 들을 삭제한다. m_pGameServerInfos[j][i].clear(); } } @@ -78,7 +78,7 @@ void GameServerInfoManager::load() Statement* pStmt = NULL; - // MAX SERVER GROUP ID о鿩 Ѵ. + // 먼저 MAX SERVER GROUP ID를 읽어들여야 한다. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); Result* pResult = pStmt->executeQuery("SELECT MAX(GroupID) FROM GameServerInfo"); @@ -152,12 +152,12 @@ for (uint i = 0 ; i < m_Width ; i++) m_pTiles[i] = new Tile [m_Height]; END_DB(pStmt) /////////////////////////////////////////////////////////////////////////////// - // PK Server ϱ - // DB PKServerList ̺ о Ѵ. - // PKServerList ÷̾(login) DB ִ. + // PK Server 세팅하기 + // DB의 PKServerList 테이블에서 읽어서 세팅한다. + // PKServerList 는 플레이어(login) DB 에 있다. /////////////////////////////////////////////////////////////////////////////// BEGIN_DB { - // PKServerList ÷̾(login) DB ִ. + // PKServerList 는 플레이어(login) DB 에 있다. pStmt = g_pDatabaseManager->getDistConnection("DARKEDEN")->createStatement(); Result* pResult = pStmt->executeQuery("SELECT WorldID, ServerGroupID FROM NonPKServerList"); @@ -177,11 +177,11 @@ for (uint i = 0 ; i < m_Width ; i++) m_pTiles[i] = new Tile [m_Height]; END_DB(pStmt) /////////////////////////////////////////////////////////////////////////////// - // Castle Stat ε - //  ٲ + // Castle Stat 로딩 + // 이 서버에서 어떤 서버의 전쟁 결과에 따라 바뀌는지 /////////////////////////////////////////////////////////////////////////////// BEGIN_DB { - // ÷̾(login) DB ִ. + // 플레이어(login) DB 에 있다. pStmt = g_pDatabaseManager->getDistConnection("DARKEDEN")->createStatement(); Result* pResult = pStmt->executeQuery("SELECT WorldID, ServerGroupID, FollowServerID FROM CastleStatInfo"); @@ -243,13 +243,13 @@ void GameServerInfoManager::deleteGameServerInfo(const ServerID_t ServerID, cons HashMapGameServerInfo::iterator itr = m_pGameServerInfos[WorldID][ServerGroupID].find(ServerID); if (itr != m_pGameServerInfos[WorldID][ServerGroupID].end()) { - // GameServerInfo Ѵ. + // GameServerInfo 를 삭제한다. delete itr->second; - // pair Ѵ. + // pair를 삭제한다. m_pGameServerInfos[WorldID][ServerGroupID].erase(itr); } else { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없을 때 throw NoSuchElementException(); } @@ -274,7 +274,7 @@ GameServerInfo * GameServerInfoManager::getGameServerInfo (const string & nickna } else { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없었을 때 throw NoSuchElementException(nickname); } @@ -292,7 +292,7 @@ GameServerInfo* GameServerInfoManager::getGameServerInfo(const ServerID_t Server GameServerInfo* pGameServerInfo = NULL; if (WorldID >= m_MaxWorldID || ServerGroupID >= m_MaxServerGroupID) { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없었을 때 throw NoSuchElementException(); } @@ -301,7 +301,7 @@ GameServerInfo* GameServerInfoManager::getGameServerInfo(const ServerID_t Server if (itr != m_pGameServerInfos[WorldID][ServerGroupID].end()) { pGameServerInfo = itr->second; } else { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없었을 때 throw NoSuchElementException(); } diff --git a/src/server/gameserver/GameWorldInfoManager.cpp b/src/server/gameserver/GameWorldInfoManager.cpp index c34b24c3..ab83a63d 100644 --- a/src/server/gameserver/GameWorldInfoManager.cpp +++ b/src/server/gameserver/GameWorldInfoManager.cpp @@ -27,16 +27,16 @@ GameWorldInfoManager::GameWorldInfoManager() GameWorldInfoManager::~GameWorldInfoManager() { - // hashmap pair second, GameWorldInfo ü ϰ - // pair ü ״ д. (GameWorldInfo Ǿ ִٴ Ϳ - // ϶. ʻ ؾ Ѵ. ϱ, GSIM destruct ȴٴ - // α ˴ٿȴٴ ǹϴϱ.. - -; ) + // hashmap 안의 각 pair 의 second, 즉 GameWorldInfo 객체만을 삭제하고 + // pair 자체는 그대로 둔다. (GameWorldInfo가 힙에 생성되어 있다는 것에 + // 유의하라. 즉 필살삭제를 해야 한다. 하긴, GSIM이 destruct 된다는 것은 + // 로그인 서버가 셧다운된다는 것을 의미하니깐.. - -; ) for (HashMapGameWorldInfo::iterator itr = m_GameWorldInfos.begin(); itr != m_GameWorldInfos.end(); itr++) { delete itr->second; itr->second = NULL; } - // ؽʾȿ ִ pair Ѵ. + // 이제 해쉬맵안에 있는 모든 pair 들을 삭제한다. m_GameWorldInfos.clear(); } @@ -87,11 +87,11 @@ void GameWorldInfoManager::load() } cout << "End GameWorldInfoManager Load" << endl; - // ʻ ! + // 필살 삭제! SAFE_DELETE(pStmt); } catch (SQLQueryException& sqe) { - // ʻ ! + // 필살 삭제! SAFE_DELETE(pStmt); throw Error(sqe.toString()); @@ -150,14 +150,14 @@ void GameWorldInfoManager::deleteGameWorldInfo(const WorldID_t ID) { HashMapGameWorldInfo::iterator itr = m_GameWorldInfos.find(ID); if (itr != m_GameWorldInfos.end()) { - // GameWorldInfo Ѵ. + // GameWorldInfo 를 삭제한다. delete itr->second; - // pair Ѵ. + // pair를 삭제한다. m_GameWorldInfos.erase(itr); } else { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없을 때 throw NoSuchElementException(); } @@ -177,7 +177,7 @@ GameWorldInfo* GameWorldInfoManager::getGameWorldInfo(const WorldID_t ID) const if (itr != m_GameWorldInfos.end()) { pGameWorldInfo = itr->second; } else { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없었을 때 throw NoSuchElementException(); } @@ -205,7 +205,7 @@ string GameWorldInfoManager::toString() const //-------------------------------------------------- // *OPTIMIZATION* // - // for_each() + // for_each()를 사용할 것 //-------------------------------------------------- for (HashMapGameWorldInfo::const_iterator itr = m_GameWorldInfos.begin(); itr != m_GameWorldInfos.end(); itr++) msg << itr->second->toString() << '\n'; diff --git a/src/server/gameserver/Garbage.cpp b/src/server/gameserver/Garbage.cpp index 142cc610..97a5f468 100644 --- a/src/server/gameserver/Garbage.cpp +++ b/src/server/gameserver/Garbage.cpp @@ -2,8 +2,8 @@ // Filename : Garbage.cpp // Written by : excel96 // Description : -// DB , ⿡ ó -// 쿡  Ǵ storage ϳ. +// 서버 DB 오류 같은 것으로 인해, 유저의 아이템이 사라질 위기에 처했을 +// 경우에 들어가게 되는 storage의 하나다. ////////////////////////////////////////////////////////////////////////////// #include "Garbage.h" diff --git a/src/server/gameserver/Garbage.h b/src/server/gameserver/Garbage.h index b77265d9..5b08fb68 100644 --- a/src/server/gameserver/Garbage.h +++ b/src/server/gameserver/Garbage.h @@ -2,8 +2,8 @@ // Filename : Garbage.h // Written by : excel96 // Description : -// DB , ⿡ ó -// 쿡  Ǵ storage ϳ. +// 서버 DB 오류 같은 것으로 인해, 유저의 아이템이 사라질 위기에 처했을 +// 경우에 들어가게 되는 storage의 하나다. ////////////////////////////////////////////////////////////////////////////// #ifndef __GARBAGE_H__ diff --git a/src/server/gameserver/GoodsInfoManager.h b/src/server/gameserver/GoodsInfoManager.h index 302d8d67..4eed8591 100644 --- a/src/server/gameserver/GoodsInfoManager.h +++ b/src/server/gameserver/GoodsInfoManager.h @@ -99,8 +99,8 @@ class GoodsInfo { Grade_t m_Grade; // Grade list m_OptionTypes; // OptionType list int m_Num; - bool m_bTimeLimit; // ð ΰ? - int m_Hour; // ð + bool m_bTimeLimit; // 시간제한 아이템인가? + int m_Hour; // 사용 제한 시간 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/GoodsInventory.cpp b/src/server/gameserver/GoodsInventory.cpp index d6280dac..ca7ae666 100644 --- a/src/server/gameserver/GoodsInventory.cpp +++ b/src/server/gameserver/GoodsInventory.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////// // Filename : GoodsInventory.cpp // Written By : bezz -// Description : Ȩ ִ Inventory +// Description : 홈페이지에서 구매한 아이템이 담겨 있는 Inventory ////////////////////////////////////////////////////////////////////////// #include "GoodsInventory.h" @@ -84,7 +84,7 @@ Item* GoodsInventory::popItem(ObjectID_t oid) if ((*itr).m_pItem->getObjectID() == oid) { pItem = (*itr).m_pItem; - filelog("Goods.log", " ãưϴ. : [%s:%s]", (*itr).m_ID.c_str(), + filelog("Goods.log", "아이템을 찾아갔습니다. : [%s:%s]", (*itr).m_ID.c_str(), (*itr).m_pItem->toString().c_str()); Statement* pStmt = NULL; @@ -95,10 +95,10 @@ Item* GoodsInventory::popItem(ObjectID_t oid) "UPDATE GoodsListObject SET Num = Num - 1, Status = IF( NUM < 1, 'GET', 'NOT' ) WHERE ID=%s", (*itr).m_ID.c_str()); - // UPDATE Result* ſ.. pStmt->getAffectedRowCount() + // UPDATE인 경우는 Result* 대신에.. pStmt->getAffectedRowCount() if (pStmt->getAffectedRowCount() == 0) { - filelog("Goods.log", "ٵ DB Ʈ ȵƽϴ. : %s", (*itr).m_ID.c_str()); + filelog("Goods.log", "근데 DB에 업데이트가 안됐습니다. : %s", (*itr).m_ID.c_str()); } SAFE_DELETE(pStmt); diff --git a/src/server/gameserver/GoodsInventory.h b/src/server/gameserver/GoodsInventory.h index 538364b7..fa1a81df 100644 --- a/src/server/gameserver/GoodsInventory.h +++ b/src/server/gameserver/GoodsInventory.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////// // Filename : GoodsInventory.h // Written By : bezz -// Description : Ȩ ִ Inventory +// Description : 홈페이지에서 구매한 아이템이 담겨 있는 Inventory ////////////////////////////////////////////////////////////////////////// #ifndef __GOODS_INVENTORY_H__ @@ -36,23 +36,23 @@ class GoodsInventory { return m_Goods; } - // ߰ + // 아이템 추가 void addItem(string ID, Item* pItem); - // + // 아이템 가져오기 Item* popItem(ObjectID_t oid); - // + // 아이템 걍가져오기 Item* getItem(ObjectID_t oid); - // κ丮 ? + // 인벤토리가 비었나? bool empty() { return m_Goods.empty(); } void clear(); - // κ丮 ִ + // 인벤토리에 있는 아이템 개수 int getNum() const { return m_Goods.size(); } diff --git a/src/server/gameserver/Guild.h b/src/server/gameserver/Guild.h index a8eb74b7..7081abef 100644 --- a/src/server/gameserver/Guild.h +++ b/src/server/gameserver/Guild.h @@ -26,7 +26,7 @@ class GCGuildMemberList; ////////////////////////////////////////////////////////////////////////////// // class GuildMember -// . +// 길드멤버에 관한 정보를 가진다. // ////////////////////////////////////////////////////////////////////////////// @@ -152,12 +152,12 @@ class GuildMember { public: enum GuildRank { - GUILDMEMBER_RANK_NORMAL = 0, // Ϲ - GUILDMEMBER_RANK_MASTER, // - GUILDMEMBER_RANK_SUBMASTER, // - GUILDMEMBER_RANK_WAIT, // - GUILDMEMBER_RANK_DENY, // ߹/ź - GUILDMEMBER_RANK_LEAVE, // Ż() + GUILDMEMBER_RANK_NORMAL = 0, // 일반 멤버 + GUILDMEMBER_RANK_MASTER, // 길드 마스터 + GUILDMEMBER_RANK_SUBMASTER, // 길드 서브 마스터 + GUILDMEMBER_RANK_WAIT, // 길드 가입 대기 + GUILDMEMBER_RANK_DENY, // 추방/거부 당함 + GUILDMEMBER_RANK_LEAVE, // 길드 탈퇴(스스로) GUILDMEMBER_RANK_MAX }; @@ -193,7 +193,7 @@ class GuildMember { GuildMemberRank_t getRank() const { return m_Rank; } - void setRank(GuildMemberRank_t rank); // Guild class óѴ. + void setRank(GuildMemberRank_t rank); // Guild class 에서 처리한다. bool getLogOn() const { return m_bLogOn; @@ -229,20 +229,20 @@ class GuildMember { ///// Member data ///// protected: - GuildID_t m_GuildID; // ID - string m_Name; // ̸ - GuildMemberRank_t m_Rank; // - VSDateTime m_RequestDateTime; // û ð - bool m_bLogOn; // - ServerID_t m_ServerID; // ġ + GuildID_t m_GuildID; // 길드 ID + string m_Name; // 멤버 이름 + GuildMemberRank_t m_Rank; // 멤버의 계급 + VSDateTime m_RequestDateTime; // 가입 신청 시간 + bool m_bLogOn; // 접속 여부 + ServerID_t m_ServerID; // 서버 위치 }; ////////////////////////////////////////////////////////////////////////////// // class Guild -// 忡 . +// 길드에 관한 정보를 가진다. // -// GuildInfo ̺ +// GuildInfo 테이블의 구조 // ---------------------------------------- // GuildID INT // GuildName VARCHAR(20) @@ -269,26 +269,26 @@ class Guild { public: enum GuildTypes { - GUILD_TYPE_NORMAL = 0, // Ϲ - GUILD_TYPE_JUDGE, // ǰ - GUILD_TYPE_ASSASSIN, // ϻ + GUILD_TYPE_NORMAL = 0, // 일반 길드 + GUILD_TYPE_JUDGE, // 판관 길드 + GUILD_TYPE_ASSASSIN, // 암살자 길드 GUILD_TYPE_MAX }; enum GuildState { - GUILD_STATE_ACTIVE = 0, // Ȱ - GUILD_STATE_WAIT, // - GUILD_STATE_CANCEL, // ҵ - GUILD_STATE_BROKEN, // ü + GUILD_STATE_ACTIVE = 0, // 활동 중인 길드 + GUILD_STATE_WAIT, // 등록 대기 중인 길드 + GUILD_STATE_CANCEL, // 취소된 길드 + GUILD_STATE_BROKEN, // 해체된 길드 GUILD_STATE_MAX }; enum GuildRace { - GUILD_RACE_SLAYER = 0, // ̾ - GUILD_RACE_VAMPIRE, // ̾ - GUILD_RACE_OUSTERS, // ƿ콺 + GUILD_RACE_SLAYER = 0, // 슬레이어 길드 + GUILD_RACE_VAMPIRE, // 뱀파이어 길드 + GUILD_RACE_OUSTERS, // 아우스터즈 길드 GUILD_RACE_MAX }; @@ -458,30 +458,30 @@ class Guild { ///// Member data ///// protected: - GuildID_t m_ID; // ID - string m_Name; // ̸ - GuildType_t m_Type; // Ÿ - GuildRace_t m_Race; // - GuildState_t m_State; // - ServerGroupID_t m_ServerGroupID; // ִ ׷ ID - ZoneID_t m_ZoneID; // ZoneID - string m_Master; // - string m_Date; // Expire, Regist Date - string m_Intro; // Ұ - - HashMapGuildMember m_Members; // + GuildID_t m_ID; // 길드 ID + string m_Name; // 길드 이름 + GuildType_t m_Type; // 길드 타입 + GuildRace_t m_Race; // 길드 종족 + GuildState_t m_State; // 길드 상태 + ServerGroupID_t m_ServerGroupID; // 길드 존이 있는 서버 그룹 ID + ZoneID_t m_ZoneID; // 길드 ZoneID + string m_Master; // 길드 마스터 + string m_Date; // 길드 Expire, Regist Date + string m_Intro; // 길드 소개 + + HashMapGuildMember m_Members; // 길드 멤버 포인터 맵 int m_ActiveMemberCount; // Active Member Count int m_WaitMemberCount; // Wait Member Count - static GuildID_t m_MaxGuildID; // ̵ ִ밪 - static ZoneID_t m_MaxSlayerZoneID; // ̾ ID ִ밪 - static ZoneID_t m_MaxVampireZoneID; // ̾ ID ִ밪 - static ZoneID_t m_MaxOustersZoneID; // ƿ콺 ID ִ밪 + static GuildID_t m_MaxGuildID; // 길드 아이디 최대값 + static ZoneID_t m_MaxSlayerZoneID; // 슬레이어 길드 존 ID 최대값 + static ZoneID_t m_MaxVampireZoneID; // 뱀파이어 길드 존 ID 최대값 + static ZoneID_t m_MaxOustersZoneID; // 아우스터즈 길드 존 ID 최대값 mutable Mutex m_Mutex; // Mutex for Guild #ifdef __GAME_SERVER__ - list m_CurrentMembers; // + list m_CurrentMembers; // 현재 접속 중인 멤버 #endif }; diff --git a/src/server/gameserver/GuildManager.h b/src/server/gameserver/GuildManager.h index 44310983..63baacd0 100644 --- a/src/server/gameserver/GuildManager.h +++ b/src/server/gameserver/GuildManager.h @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : GuildManager.h -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -17,8 +17,8 @@ ////////////////////////////////////////////////////////////////////////////// // class GuildManager -// Ȱ 带 ޸𸮿 map · ְ, -// ο / Ѵ. +// 현재 활동중인 길드와 등록 대기중인 길드를 메모리에 map 형태로 가지고 있고, +// 새로운 길드의 등록/삭제를 담당한다. // ////////////////////////////////////////////////////////////////////////////// @@ -96,14 +96,14 @@ class GuildManager { string getGuildName(GuildID_t guildID); - // 尡 ? + // 길드가 성을 가졌나? bool hasCastle(GuildID_t guildID); bool hasCastle(GuildID_t guildID, ServerID_t& serverID, ZoneID_t& zoneID); - // 尡 û ߳? + // 길드가 전쟁신청을 했나? bool hasWarSchedule(GuildID_t guildID); - // ִ°? + // 현재 진행중인 전쟁이 있는가? bool hasActiveWar(GuildID_t guidlID); public: // debug @@ -113,9 +113,9 @@ class GuildManager { ///// Member data ///// protected: - unordered_map m_Guilds; // + unordered_map m_Guilds; // 길드 포인터 맵 - Timeval m_WaitMemberClearTime; // heartbeat Wait ð + Timeval m_WaitMemberClearTime; // heartbeat 에서 Wait 중인 길드멤버 정리 시간 // mutex mutable Mutex m_Mutex; diff --git a/src/server/gameserver/GuildUnion.cpp b/src/server/gameserver/GuildUnion.cpp index bfd3d9f1..2593b7d3 100644 --- a/src/server/gameserver/GuildUnion.cpp +++ b/src/server/gameserver/GuildUnion.cpp @@ -62,7 +62,7 @@ bool GuildUnion::removeGuild(GuildID_t gID) { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery("DELETE FROM GuildUnionMember WHERE UnionID = %u and OwnerGuildID = %u", m_UnionID, gID); if (pStmt->getAffectedRowCount() < 1) { - filelog("GuildUnion.log", "[%u:%u] ŻϷµ ش ڵ尡 ϴ.", m_UnionID, gID); + filelog("GuildUnion.log", "[%u:%u] 탈퇴하려는데 해당 레코드가 없습니다.", m_UnionID, gID); } SAFE_DELETE(pStmt); @@ -145,7 +145,7 @@ void GuildUnionManager::sendModifyUnionInfo(uint gID) { ggCommand.setCommand(Msg); - // server . + // 각 server로 보낸다. HashMapGameServerInfo** pGameServerInfos = g_pGameServerInfoManager->getGameServerInfos(); @@ -166,7 +166,7 @@ void GuildUnionManager::sendModifyUnionInfo(uint gID) { GameServerInfo* pGameServerInfo = itr->second; if (pGameServerInfo->getWorldID() == myWorldID) { - // ƴ 쿡..( óǷ) + // 현재 서버가 아닌 경우에만..(위에서 처리했으므로) if (pGameServerInfo->getGroupID() == myServerID) { } else { g_pLoginServerManager->sendPacket(pGameServerInfo->getIP(), pGameServerInfo->getUDPPort(), @@ -184,7 +184,7 @@ void GuildUnionManager::sendRefreshCommand() { ggCommand.setCommand("*refreshguildunion"); - // server . + // 각 server로 보낸다. HashMapGameServerInfo** pGameServerInfos = g_pGameServerInfoManager->getGameServerInfos(); @@ -205,7 +205,7 @@ void GuildUnionManager::sendRefreshCommand() { GameServerInfo* pGameServerInfo = itr->second; if (pGameServerInfo->getWorldID() == myWorldID) { - // ƴ 쿡..( óǷ) + // 현재 서버가 아닌 경우에만..(위에서 처리했으므로) if (pGameServerInfo->getGroupID() == myServerID) { } else { g_pLoginServerManager->sendPacket(pGameServerInfo->getIP(), pGameServerInfo->getUDPPort(), @@ -241,13 +241,13 @@ bool GuildUnionManager::addGuild(uint uID, GuildID_t gID) { bool GuildUnionManager::removeMasterGuild(GuildID_t gID) { __BEGIN_TRY - // 忬ε.. ŻѴٸ.. - // 忬 .. + // 내가 길드연합장인데..내가 탈퇴한다면.. + // 내가 속한 길드연합을 깨보자.. GuildUnion* pUnion = m_GuildUnionMap[gID]; - // ִٸ -> տ Ҽӵ 带 outŰ . + // 내가 마스터인 연합이 있다면 -> 내 연합에 소속된 모든 길드를 out시키고 내 연합을 깨버린다. if (pUnion != NULL) { - uint uID = pUnion->getUnionID(); // ID + uint uID = pUnion->getUnionID(); // 연합ID Statement* pStmt = NULL; BEGIN_DB { @@ -255,14 +255,14 @@ bool GuildUnionManager::removeMasterGuild(GuildID_t gID) { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pResult = pStmt->executeQuery("SELECT OwnerGuildID FROM GuildUnionMember WHERE UnionID = %u", uID); - // ƹ͵ ٸ ̻ѰŴ.. + // 아무것도 없다면 이상한거다.. if (pResult->getRowCount() == 0) { SAFE_DELETE(pStmt); return false; } string unionMasterID = g_pGuildManager->getGuild(gID)->getMaster(); - // տ ŻŲ. // յ ˾Ƽ . + // 각각의 모든 길드들을 연합에서 탈퇴시킨다. // 모두 지워지면 연합도 알아서 깨진다. while (pResult->next()) { if (pUnion->removeGuild(pResult->getInt(1))) { m_GuildUnionMap[gID] = NULL; @@ -281,7 +281,7 @@ bool GuildUnionManager::removeMasterGuild(GuildID_t gID) { sendGCOtherModifyInfoGuildUnionByGuildID(pResult->getInt(1)); } // if } // while - // 带 Ѵ. ûϰ + // 모든 길드를 다 제거한다. 마지막에 남은 길드까지 깨끗히 청소하고 나면 Creature* pTargetCreature = NULL; __ENTER_CRITICAL_SECTION((*g_pPCFinder)) @@ -294,13 +294,13 @@ bool GuildUnionManager::removeMasterGuild(GuildID_t gID) { } __LEAVE_CRITICAL_SECTION((*g_pPCFinder)) - // ո ٲ ຸ.. + // 연합마스터 바뀐정보를 보내줘보자.. sendGCOtherModifyInfoGuildUnionByGuildID(gID); sendRefreshCommand(); } END_DB(pStmt); - } else // ٸ, ã´. ãƼ տ + } else // 내가 마스터인 연합이 없다면, 내가 어느연합의 멤버인지를 찾는다. 어느연합의 멤버인지 찾아서 연합에서 제외 { Statement* pStmt = NULL; Statement* pStmt2 = NULL; @@ -315,13 +315,13 @@ bool GuildUnionManager::removeMasterGuild(GuildID_t gID) { pResult = pStmt->executeQuery("SELECT UnionID, OwnerGuildID FROM GuildUnionMember WHERE OwnerGuildID = %u", gID); - // 𿡵 Ҽӵ ʾҴٸ ׳ . + // 어디에도 소속되지 않았다면 그냥 나간다. if (pResult->getRowCount() == 0) { SAFE_DELETE(pStmt); return false; } - // 򰡿 ִٸ.. + // 어딘가에 속해있다면.. pResult->next(); BEGIN_DB { @@ -330,7 +330,7 @@ bool GuildUnionManager::removeMasterGuild(GuildID_t gID) { pResult2 = pStmt->executeQuery("SELECT MasterGuildID FROM GuildUnionInfo WHERE UnionID = %u", pResult->getInt(1)); - // ͱ ID ã.. + // 마스터길드의 ID를 찾으면.. if (pResult2->getRowCount() != 0) { pResult->next(); @@ -343,8 +343,8 @@ bool GuildUnionManager::removeMasterGuild(GuildID_t gID) { guildMasterID = g_pGuildManager->getGuild(gID)->getMaster(); if (removeGuild(pResult->getInt(1), pResult->getInt(2))) { - Creature* pTargetCreature = NULL; // ش - Creature* pTargetCreature2 = NULL; // ձ + Creature* pTargetCreature = NULL; // 해당길드의 장 + Creature* pTargetCreature2 = NULL; // 연합길드의 장 __ENTER_CRITICAL_SECTION((*g_pPCFinder)) @@ -364,12 +364,12 @@ bool GuildUnionManager::removeMasterGuild(GuildID_t gID) { __LEAVE_CRITICAL_SECTION((*g_pPCFinder)) - // 帶 ٲ ຸ.. + // 길드마스터 바뀐정보를 보내줘보자.. sendGCOtherModifyInfoGuildUnionByGuildID(gID); - // Ư尡 տ removeǾٸ ոͿԵ ˷ ϰڴ. + // 특정길드가 깨져서 연합에서 remove되었다면 연합마스터에게도 알려야 하겠다. sendGCOtherModifyInfoGuildUnionByGuildID(unionMasterGuildID); - // 带 Ͽ..ٸ ˷ ϰڴ. + // 길드를 제거 하였으니..다른 서버에도 알려줘야 하겠다. sendRefreshCommand(); } } @@ -512,14 +512,14 @@ uint GuildUnionOfferManager::offerJoin(GuildID_t gID, GuildID_t masterGID) { BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); - // 10 ̳ Ż ̷ ִ + // 과거 10일 이내에서 강제 탈퇴한 이력이 있는지 본다 Result* pResult = pStmt->executeQuery("SELECT COUNT(*) FROM GuildUnionOffer WHERE OfferType='ESCAPE' and " "OwnerGuildID='%u' and OfferTime >= now() - interval 10 day", gID); pResult->next(); - // ̷ л. + // 이력이 있으면 패뻐린다. if (pResult->getInt(1) > 0) { SAFE_DELETE(pStmt); return YOU_HAVE_PENALTY; @@ -534,7 +534,7 @@ uint GuildUnionOfferManager::offerJoin(GuildID_t gID, GuildID_t masterGID) { return NOT_ENOUGH_SLOT; } - // 10 Ÿ . + // 10일이 넘은 데이타는 지워버린다. pStmt->executeQuery( "DELETE FROM GuildUnionOffer WHERE OwnerGuildID='%u' and OfferTime < now() - interval 10 day", gID); pStmt->executeQuery( @@ -593,7 +593,7 @@ bool GuildUnionOfferManager::makeOfferList(uint uID, GCUnionOfferList& offerList uID); - // cout << "ձ : " << uID << ", GuildUnionOffer return row : " << pResult->getRowCount() << endl; + // cout << "연합길드 : " << uID << ", GuildUnionOffer return row : " << pResult->getRowCount() << endl; if (pResult->getRowCount() == 0) { return false; diff --git a/src/server/gameserver/GuildUnion.h b/src/server/gameserver/GuildUnion.h index 31078038..bdce7918 100644 --- a/src/server/gameserver/GuildUnion.h +++ b/src/server/gameserver/GuildUnion.h @@ -120,31 +120,31 @@ class GuildUnionOfferManager { OK = 0, ALREADY_IN_UNION, ALREADY_OFFER_SOMETHING, - TARGET_IS_NOT_MASTER, // Ͱ ƴ϶;; + TARGET_IS_NOT_MASTER, // 상대방이 마스터가 아니라네;; NOT_IN_UNION, - MASTER_CANNOT_QUIT, // ŻҰ(尡 -ڵ̷) + MASTER_CANNOT_QUIT, // 연합의 마스터 길드는 스스로 탈퇴불가(하위길드가 없을때만 가능-자동이래) NO_TARGET_UNION, NOT_YOUR_UNION, - SOURCE_IS_NOT_MASTER, // û Ͱ ƴϴ - YOU_HAVE_PENALTY, // Ż ִ. û - NOT_ENOUGH_SLOT, // OfferJoin... ִ Slot ִ. - TOO_MANY_MEMBER // 50 ̶̻ . + SOURCE_IS_NOT_MASTER, // 신청한 사람이 마스터가 아니다 + YOU_HAVE_PENALTY, // 강제로 탈퇴한 기록이 있다. 신청할 수 없다 + NOT_ENOUGH_SLOT, // OfferJoin시...가입할 수 있는 Slot이 꽉차 있다. + TOO_MANY_MEMBER // 멤버가 50명 이상이라 가입할 수 없다. }; - uint offerJoin(GuildID_t gID, GuildID_t MasterGID); // հ û - uint offerQuit(GuildID_t gID); // Ż û + uint offerJoin(GuildID_t gID, GuildID_t MasterGID); // 연합가입 신청 + uint offerQuit(GuildID_t gID); // 연합탈퇴 신청 - uint acceptJoin(GuildID_t gID); // հ - uint acceptQuit(GuildID_t gID); // Ż + uint acceptJoin(GuildID_t gID); // 연합가입 수락 + uint acceptQuit(GuildID_t gID); // 연합탈퇴 수락 - uint denyJoin(GuildID_t gID); // հ ź - uint denyQuit(GuildID_t gID); // Ż ź + uint denyJoin(GuildID_t gID); // 연합가입 거부 + uint denyQuit(GuildID_t gID); // 엽합탈퇴 거부 void clearOffer(GuildID_t gID); bool hasOffer(GuildID_t gID); - bool makeOfferList(uint uID, GCUnionOfferList& offerList); // Ͽû + bool makeOfferList(uint uID, GCUnionOfferList& offerList); // 목록요청 static GuildUnionOfferManager& Instance() { static GuildUnionOfferManager theInstance; diff --git a/src/server/gameserver/HolyLandManager.h b/src/server/gameserver/HolyLandManager.h index 18248888..e6450f11 100644 --- a/src/server/gameserver/HolyLandManager.h +++ b/src/server/gameserver/HolyLandManager.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : HolyLandManager.h // Written By : Bezz -// Description : Holy Land ( Zone * ) ִ. +// Description : Holy Land ( Zone * ) 를 가지고 있다. ////////////////////////////////////////////////////////////////////////////// #ifndef __HOLY_LAND_MANAGER_H__ diff --git a/src/server/gameserver/HolyLandRaceBonus.cpp b/src/server/gameserver/HolyLandRaceBonus.cpp index 407d1cd2..a80384b8 100644 --- a/src/server/gameserver/HolyLandRaceBonus.cpp +++ b/src/server/gameserver/HolyLandRaceBonus.cpp @@ -15,14 +15,14 @@ void HolyLandRaceBonus::refresh() { __BEGIN_TRY - // .. + // 기존꺼는 지우고.. clear(); const unordered_map& castleInfos = g_pCastleInfoManager->getCastleInfos(); unordered_map::const_iterator itr = castleInfos.begin(); - // ʽ Ѵ. + // 현재 성의 소유종족에 따라서 보너스를 설정한다. for (; itr != castleInfos.end(); itr++) { CastleInfo* pCastleInfo = itr->second; @@ -33,7 +33,7 @@ void HolyLandRaceBonus::refresh() const list& optionTypes = pCastleInfo->getOptionTypeList(); m_VampireOptionTypes.insert(m_VampireOptionTypes.begin(), optionTypes.begin(), optionTypes.end()); } else { - // + // 무시 } } diff --git a/src/server/gameserver/HolyLandRaceBonus.h b/src/server/gameserver/HolyLandRaceBonus.h index 22a7be95..8a8990f1 100644 --- a/src/server/gameserver/HolyLandRaceBonus.h +++ b/src/server/gameserver/HolyLandRaceBonus.h @@ -14,7 +14,7 @@ class HolyLandRaceBonus { m_VampireOptionTypes.clear(); } - // ƴ ʽ ٽ Ѵ. + // 아담의 성지에서의 종족보너스를 다시 설정한다. void refresh(); const list& getSlayerOptionTypeList() const { diff --git a/src/server/gameserver/IncomingPlayerManager.h b/src/server/gameserver/IncomingPlayerManager.h index fe79ea6b..3e207f66 100644 --- a/src/server/gameserver/IncomingPlayerManager.h +++ b/src/server/gameserver/IncomingPlayerManager.h @@ -19,13 +19,13 @@ ////////////////////////////////////////////////////////////////////////////// // class IncomingPlayerManager; // -// PlayerManager ü ÷̾ ϸ, -// ZonePlayerManager ׷쿡 ӵ ÷̾ ϴ ݸ, -// IncomingPlayerManager ̷ ũó -// ε ӽ ÷̾ Ѵ. +// PlayerManager는 게임 서버에 접속한 전체 플레이어를 담당하며, +// ZonePlayerManager는 각 존그룹에 종속된 플레이어들을 담당하는 반면, +// IncomingPlayerManager는 게임 서버와 연결은 이루어졌으나 아직 크리처를 +// 로딩하지 않은 임시적인 상태의 플레이어들을 관리한다. // -// ο , ũó εؼ ÷̾ Ų. -// ũó εǸ ÷̾ ũó ٸ ׷ Ѱش. +// 새로운 접속을 인증한 후, 크리처를 로딩해서 플레이어와 연관시킨다. +// 크리처가 로딩되면 플레이어 및 크리처를 다른 존그룹으로 넘겨준다. ////////////////////////////////////////////////////////////////////////////// class IncomingPlayerManager : public PlayerManager { @@ -40,7 +40,7 @@ class IncomingPlayerManager : public PlayerManager { // broadcast packet to all players void broadcast(Packet* pPacket); - // ޽ ZoneThread ؼ ȣȴ. + // 다음의 메쏘드들은 ZoneThread에 의해서 호출된다. // select void select(); @@ -91,27 +91,27 @@ class IncomingPlayerManager : public PlayerManager { void deleteQueuePlayer(GamePlayer* pGamePlayer); - // ÷̾ Ѵ. + // 모든 플레이어를 정리한다. void clearPlayers(); private: - // TCP ϰ ũ + // TCP 서버 소켓과 소켓 디스크립터 ServerSocket* m_pServerSocket; SOCKET m_SocketID; - // Ҽӵ ÷̾ ũ ̴. - // m_XXXXFDs[0] ̸, m_XXXFDs[1] select() Ķͷ ȴ. - // select()ϱ [0] -> [1] 簡 ̷ Ѵ. + // 소속된 플레이어들의 소켓 디스크립터의 집합이다. + // m_XXXXFDs[0]은 저장용이며, m_XXXFDs[1]이 실제로 select()의 파라미터로 사용된다. + // 즉 select()하기 전에 [0] -> [1] 로 복사가 이루어져야 한다. fd_set m_ReadFDs[2]; fd_set m_WriteFDs[2]; fd_set m_ExceptFDs[2]; - // select Ǵ ð + // select에 사용되는 시간 Timeval m_Timeout[2]; // min_fd, max_fd - // select() iterating ӵ ؼ Ѵ. - // select() ù° Ķ͸ ϱ ؼ Ѵ. + // select()후 iterating 할 때 속도 증가를 위해서 사용한다. + // 또한 select()의 첫번째 파라미터를 계산하기 위해서 사용한다. SOCKET m_MinFD; SOCKET m_MaxFD; diff --git a/src/server/gameserver/InfoClassManager.cpp b/src/server/gameserver/InfoClassManager.cpp index 5e59fcc5..db8fda7c 100644 --- a/src/server/gameserver/InfoClassManager.cpp +++ b/src/server/gameserver/InfoClassManager.cpp @@ -54,24 +54,24 @@ void InfoClassManager::init() Ratio_t itemRatio = m_pItemInfos[i]->getRatio(); if (itemRatio > 0) { - // item type total ratio Ѵ. + // item type들의 total ratio를 구한다. m_TotalRatio += itemRatio; - // + // 가격 총합 m_AveragePrice += m_pItemInfos[i]->getPrice(); count++; } } - // + // 가격 평균 if (count > 1) { m_AveragePrice /= count; } Assert(m_pItemInfos[0] != NULL); - // ġ + // 가격 증가치 m_AveragePrice /= 1000; m_AveragePrice *= 100; @@ -149,14 +149,14 @@ ItemType_t InfoClassManager::getRandomItemType() const { __BEGIN_TRY - // DB ߸  Ƿ ȮغѴ. + // DB에 잘못 들어가있을수도 있으므로 확인해봐야한다. if (m_TotalRatio == 0 || m_InfoCount == 0) return 0; int gambleRatio = g_pVariableManager->getGambleItemTypeRatio(); // 200% - int failRatio = m_pItemInfos[0]->getRatio(); // 0 Ȯ Ȯ̴. - int succeedRatio = m_TotalRatio - failRatio; // 0 Ѱ Ȯ̴. - int newTotalRatio = failRatio + getPercentValue(succeedRatio, gambleRatio); // + *gambleRatio + int failRatio = m_pItemInfos[0]->getRatio(); // 0번 아이템의 확률이 실패할 확률이다. + int succeedRatio = m_TotalRatio - failRatio; // 0번 아이템을 제외한게 성공할 확률이다. + int newTotalRatio = failRatio + getPercentValue(succeedRatio, gambleRatio); // 실패 + 성공*gambleRatio int itemTypeRatio = rand() % newTotalRatio; int ratio; int ratioSum = 0; @@ -168,13 +168,13 @@ ItemType_t InfoClassManager::getRandomItemType() const << ", select = " << itemTypeRatio << endl; */ - // 0 з .. + // 0번은 실패로 보고.. for (uint i = 0; i <= m_InfoCount; i++) { ItemInfo* pInfo = m_pItemInfos[i]; ratio = pInfo->getRatio(); - // 0 ƴ 쿡 gambleRatio Ѵ. - // 0 о .. Ȯ Ų. + // 0이 아닌 경우에만 gambleRatio를 적용한다. + // 0은 실패아이템으로 보고.. 나머지만 확률을 증가시킨다. if (i != 0) { // cout << "[" << i << "] " << ratio; ratio = getPercentValue(ratio, gambleRatio); @@ -189,13 +189,13 @@ ItemType_t InfoClassManager::getRandomItemType() const // cout << " , ratioSum/Select = " << ratioSum << "/" << itemTypeRatio << endl; if (itemTypeRatio < ratioSum) { - // i° type Ѵ. Ƹ pInfo->getItemType()==i ̰.. + // i번째 type을 선택한다. 아마 pInfo->getItemType()==i 이겠지만.. return pInfo->getItemType(); } } - // ̷ ? -_-; - // getPercentValue ... ü Ҷ Ƿ ϴ. + // 이럴 수 있을까? -_-; + // getPercentValue에 따라서... 전체와 각각할때 오차가 있을 수 있으므로 가능하다. return 0; __END_CATCH diff --git a/src/server/gameserver/InfoClassManager.h b/src/server/gameserver/InfoClassManager.h index 1eca2f09..b2993e8a 100644 --- a/src/server/gameserver/InfoClassManager.h +++ b/src/server/gameserver/InfoClassManager.h @@ -54,11 +54,11 @@ class InfoClassManager { string toString() const; protected: - uint m_InfoCount; // # + uint m_InfoCount; // #아이템정보 ItemInfo** m_pItemInfos; // array of item info - int m_TotalRatio; // item type total Ratio - Price_t m_AveragePrice; // item class item + int m_TotalRatio; // item type들의 total Ratio + Price_t m_AveragePrice; // 이 item class의 모든 item 가격의 평균 }; #endif diff --git a/src/server/gameserver/InitAllStat.cpp b/src/server/gameserver/InitAllStat.cpp index 3018e38a..b4e39b5f 100644 --- a/src/server/gameserver/InitAllStat.cpp +++ b/src/server/gameserver/InitAllStat.cpp @@ -85,7 +85,7 @@ ////////////////////////////////////////////////////////////////////////////// // -// +// 공통 // ////////////////////////////////////////////////////////////////////////////// void PlayerCreature::applyBloodBibleSign() { @@ -102,7 +102,7 @@ void PlayerCreature::applyBloodBibleSign() { if (pBonus != NULL) { OptionTypeList optionTypes = pBonus->getOptionTypeList(); OptionTypeListConstItor optionItr; - // cout << getName() << " " << pBonus->getName() << " մϴ." << endl; + // cout << getName() << "에게 " << pBonus->getName() << " 을 적용합니다." << endl; ++applyCount; for (optionItr = optionTypes.begin(); optionItr != optionTypes.end(); optionItr++) { @@ -114,7 +114,7 @@ void PlayerCreature::applyBloodBibleSign() { ////////////////////////////////////////////////////////////////////////////// // -// ̾ +// 슬레이어 // ////////////////////////////////////////////////////////////////////////////// @@ -169,7 +169,7 @@ void Slayer::initAllStat(int numPartyMember) { m_Resist[MAGIC_DOMAIN_CURSE] = 0; m_Resist[MAGIC_DOMAIN_BLOOD] = 0; - // BloodBible ʽ ġ ʱȭ + // BloodBible 관련 보너스 수치들 초기화 m_ConsumeMPRatio = 0; m_GamblePriceRatio = 0; m_PotionPriceRatio = 0; @@ -179,8 +179,8 @@ void Slayer::initAllStat(int numPartyMember) { m_PhysicDamageReduce = 0; ////////////////////////////////////////////////////////////////////////////// - // ⺻ ɷġ ʱȭŰ, - // ⺻ ɷġ ִ Ʈ ˻Ѵ. + // 제일 먼저 기본 능력치를 초기화시키고, + // 기본 능력치에 영향을 주는 이펙트를 검사한다. ////////////////////////////////////////////////////////////////////////////// m_STR[ATTR_CURRENT] = m_STR[ATTR_MAX] = m_STR[ATTR_BASIC] = m_pAttrs[ATTR_KIND_STR]->getLevel(); m_DEX[ATTR_CURRENT] = m_DEX[ATTR_MAX] = m_DEX[ATTR_BASIC] = m_pAttrs[ATTR_KIND_DEX]->getLevel(); @@ -193,7 +193,7 @@ void Slayer::initAllStat(int numPartyMember) { if (isFlag(Effect::EFFECT_CLASS_BLESS)) { EffectBless* pBless = dynamic_cast(findEffect(Effect::EFFECT_CLASS_BLESS)); if (pBless != NULL) { - // STR, DEX ø. + // STR, DEX를 올린다. // m_STR[ATTR_CURRENT] += pBless->getSTRBonus(); // m_DEX[ATTR_CURRENT] += pBless->getDEXBonus(); m_STR[ATTR_CURRENT] += getPercentValue(m_STR[ATTR_CURRENT], pBless->getSTRBonus()); @@ -204,7 +204,7 @@ void Slayer::initAllStat(int numPartyMember) { EffectPotentialExplosion* pPotentialExplosion = dynamic_cast(findEffect(Effect::EFFECT_CLASS_POTENTIAL_EXPLOSION)); if (pPotentialExplosion != NULL) { - // STR, DEX ø. + // STR, DEX를 올린다. m_STR[ATTR_CURRENT] += pPotentialExplosion->getDiffSTR(); m_DEX[ATTR_CURRENT] += pPotentialExplosion->getDiffDEX(); } @@ -223,7 +223,7 @@ void Slayer::initAllStat(int numPartyMember) { } ////////////////////////////////////////////////////////////////////////////// - // ɷġ Ķ͵ ʱȭѴ. + // 능력치 계산을 위한 파라미터들을 초기화한다. ////////////////////////////////////////////////////////////////////////////// attr.nSTR = m_STR[ATTR_CURRENT]; attr.nDEX = m_DEX[ATTR_CURRENT]; @@ -237,13 +237,13 @@ void Slayer::initAllStat(int numPartyMember) { m_HPRegen = 0; m_MPRegen = 0; m_Luck = m_BaseLuck; - // cout << getName() << " ⺻ : " << m_Luck << endl; + // cout << getName() << "의 기본 행운 : " << m_Luck << endl; for (int i = 0; i < SKILL_DOMAIN_MAX; i++) attr.pDomainLevel[i] = m_SkillDomainLevels[i]; ////////////////////////////////////////////////////////////////////////////// - // ΰ ɷġ Ѵ. + // 부가적인 능력치들을 계산한다. ////////////////////////////////////////////////////////////////////////////// m_HP[ATTR_MAX] = computeHP(CClass, &attr); m_HP[ATTR_BASIC] = 0; @@ -264,7 +264,7 @@ void Slayer::initAllStat(int numPartyMember) { m_CriticalRatio[ATTR_MAX] = 0; ////////////////////////////////////////////////////////////////////////////// - // ɷġ Damage д. BERSER ʽ ؼ. + // 능력치에 의한 Damage 를 저장해 둔다. BERSER 기술의 보너스 계산을 위해서. ////////////////////////////////////////////////////////////////////////////// Damage_t AttrMinDamage = m_Damage[ATTR_CURRENT]; Damage_t AttrMaxDamage = m_Damage[ATTR_MAX]; @@ -292,11 +292,11 @@ void Slayer::initAllStat(int numPartyMember) { int DragonEyeHPBonus = 0; if (isFlag(Effect::EFFECT_CLASS_DRAGON_EYE)) { - // HP ʽ ι + // HP 보너스는 두배 DragonEyeHPBonus = m_HP[ATTR_MAX]; } - // Passive Skill : Will of Iron ( HP * 1.15) + // Passive Skill : Will of Iron (순수 HP * 1.15) SkillSlot* pFabulousSoul = getSkill(SKILL_FABULOUS_SOUL); SkillSlot* pWillOfIron = getSkill(SKILL_WILL_OF_IRON); @@ -374,8 +374,8 @@ void Slayer::initAllStat(int numPartyMember) { } - //// // ʽ - // п ̵ ʽ ִ. by sigi + //// // 전쟁 보너스 + // 지금은 전쟁 승패에 관계없이 어느쪽이든 보너스가 적용될 수 있다. by sigi // if ( g_pCombatInfoManager->isSlayerBonus() ) int HPBonus = 0; { @@ -388,7 +388,7 @@ void Slayer::initAllStat(int numPartyMember) { } ////////////////////////////////////////////////////////////////////////// - // ϴ üũ ʱȭؼ  ϰ Ѵ. + // 일단 기어 체크 변수를 초기화해서 모든 기어를 안 입은 것으로 간주하고 시작한다. ////////////////////////////////////////////////////////////////////////////// bool pOldRealWearingCheck[WEAR_MAX]; // by sigi. 2002.10.31 for (int i = 0; i < WEAR_MAX; i++) { @@ -397,9 +397,9 @@ void Slayer::initAllStat(int numPartyMember) { } ////////////////////////////////////////////////////////////////////////////// - // ʽ ɼ ް ȴ + // 성을 소유한 종족은 보너스 옵션을 받게 된다 ////////////////////////////////////////////////////////////////////////////// - // Blood Bible ʽ ɼ ޴ ɷ ƴ. + // Blood Bible 각각의 보너스 옵션을 받는 걸로 고쳤다. /* if (m_pZone->isHolyLand() ) { const list& optionType = g_pHolyLandRaceBonus->getSlayerOptionTypeList(); @@ -411,7 +411,7 @@ void Slayer::initAllStat(int numPartyMember) { }*/ ////////////////////////////////////////////////////////////////////////////// - // Blood Bible ʽ ɼ ޴´. + // Blood Bible 각각의 보너스 옵션을 받는다. ////////////////////////////////////////////////////////////////////////////// /* if ( m_pZone->isHolyLand() && !g_pWarSystem->hasActiveRaceWar() ) { @@ -453,7 +453,7 @@ void Slayer::initAllStat(int numPartyMember) { } ////////////////////////////////////////////////////////////////////////////// - // ⺻ ִ ɼǵ Ѵ. + // 기본적으로 가지고 있는 옵션들을 계산한다. ////////////////////////////////////////////////////////////////////////////// forward_list::iterator itr = m_DefaultOptionSet.begin(); for (; itr != m_DefaultOptionSet.end(); itr++) { @@ -468,7 +468,7 @@ void Slayer::initAllStat(int numPartyMember) { } ////////////////////////////////////////////////////////////////////////////// - // ִ ʽ Ѵ. + // 펫이 주는 보너스를 계산한다. ////////////////////////////////////////////////////////////////////////////// if (m_pPetInfo != NULL) { if (m_pPetInfo->getPetAttr() != 0xff) @@ -506,9 +506,9 @@ void Slayer::initAllStat(int numPartyMember) { } ////////////////////////////////////////////////////////////////////////////// - // ԰ ִ üũѴ. - // for ι ö ɷġ ؼ - // ְ Ǵ üũϱ ؼ̴. + // 입고 있는 아이템을 체크한다. + // for 가 두번인 이유는 아이템으로 올라간 능력치에 의해서 + // 입을 수 있게 되는 아이템을 체크하기 위해서이다. ////////////////////////////////////////////////////////////////////////////// for (int j = 0; j < WEAR_MAX; j++) { int wearCount = 0; @@ -516,15 +516,15 @@ void Slayer::initAllStat(int numPartyMember) { for (int i = 0; i < WEAR_MAX; i++) { Item* pItem = m_pWearItem[i]; - // Ʈ ְ - // װͿ üũ ʾҴٸ... + // 현재 포인트에 아이템이 있고 + // 그것에 대한 체크를 아직 하지 않았다면... if (pItem != NULL && m_pRealWearingCheck[i] == false) { - // ¥ ִ ̶ ɷġ ÷ش. + // 만일 진짜루 입을 수 있는 아이템이라면 능력치를 올려준다. if (isRealWearing(pItem)) { computeItemStat(pItem); - // , üũ ι ʵ - // , üũ + // 양손 무기라면, 체크를 두번 하지 않도록 + // 왼쪽, 오른쪽 모두 체크 변수를 세팅 if (isTwohandWeapon(pItem)) { m_pRealWearingCheck[WEAR_LEFTHAND] = true; m_pRealWearingCheck[WEAR_RIGHTHAND] = true; @@ -549,8 +549,8 @@ void Slayer::initAllStat(int numPartyMember) { } } if (zaps[0] && zaps[1] && zaps[2] && zaps[3]) { - computeOptionStat(182); // 9 - computeOptionStat(185); // 3 + computeOptionStat(182); // 모저 9 + computeOptionStat(185); // 모능 3 } applyBloodBibleSign(); @@ -562,9 +562,9 @@ void Slayer::initAllStat(int numPartyMember) { bSendPacket = (dynamic_cast(m_pPlayer)->getPlayerStatus() == GPS_NORMAL); } - // ϴ Ծµ.. - // ɷġ ȵǴ ش. - // Ծµ ִٸ Ŷ . + // 일단 위에서 다 입었는데.. + // 능력치에 따라서 복장이 적용이 안되는 아이템은 복장 정보를 없앤다. + // 이전에는 못 입었는데 이제는 입을 수 있다면 입히는 패킷을 보낸다. // by sigi. 2002.10.30 for (int i = 0; i < WEAR_MAX; i++) { if (m_pRealWearingCheck[i]) { @@ -598,9 +598,9 @@ void Slayer::initAllStat(int numPartyMember) { } /////////////////////////////////////////////////////////////////////////////// - // ʽ Ѵ. + // 계급 보너스를 계산한다. /////////////////////////////////////////////////////////////////////////////// - // ƿ Ȯ ϱ ̸ Ѵ. + // 스틸 확률을 계산하기 전에 미리 계산한다. /////////////////////////////////////////////////////////////////////////////// if (hasRankBonus(RankBonus::RANK_BONUS_WIGHT_HAND)) { RankBonus* pRankBonus = getRankBonus(RankBonus::RANK_BONUS_WIGHT_HAND); @@ -620,7 +620,7 @@ void Slayer::initAllStat(int numPartyMember) { } ////////////////////////////////////////////////////////////////////////////// - // HP, MP ƿ Ȯ д. + // HP, MP 스틸 확률을 계산해 둔다. ////////////////////////////////////////////////////////////////////////////// m_HPStealRatio = computeStealRatio(CClass, m_HPStealAmount, &attr); m_MPStealRatio = computeStealRatio(CClass, m_MPStealAmount, &attr); @@ -629,7 +629,7 @@ void Slayer::initAllStat(int numPartyMember) { Item* pShield = m_pWearItem[Slayer::WEAR_LEFTHAND]; ////////////////////////////////////////////////////////////////////////////// - // ΰ ɷġ ϴ Ʈ ˻Ѵ. + // 부가적인 능력치를 직접 수정하는 이펙트를 검사한다. ////////////////////////////////////////////////////////////////////////////// if (isFlag(Effect::EFFECT_CLASS_STRIKING)) { EffectStriking* pStriking = dynamic_cast(findEffect(Effect::EFFECT_CLASS_STRIKING)); @@ -640,18 +640,18 @@ void Slayer::initAllStat(int numPartyMember) { m_Damage[ATTR_CURRENT] = min(SLAYER_MAX_DAMAGE, m_Damage[ATTR_CURRENT] + DamageBonus); m_Damage[ATTR_MAX] = min(SLAYER_MAX_DAMAGE, m_Damage[ATTR_MAX] + DamageBonus); - // ItemOID ġѴٴ Ʈŷ ɷȰų, - // ٸ ⸦ ٰ, ٽ Ʈŷ ɸ ⸦ - // ٴ ̴. ׷Ƿ Ʈ ̶ Ѵ. + // ItemOID가 일치한다는 말은 방금 스트라이킹이 걸렸거나, + // 다른 무기를 들었다가, 다시 스트라이킹이 걸린 무기를 + // 들었다는 말이다. 그러므로 이펙트를 붙이라고 날려줘야 한다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(m_ObjectID); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_STRIKING); gcAddEffect.setDuration(pStriking->getRemainDuration()); m_pZone->broadcastPacket(m_X, m_Y, &gcAddEffect); } else { - // ItemOID ġ ʴ´ٴ Ʈŷ ɸ ¿ - // ٸ ⸦ ٴ ̴. ׷Ƿ ̾Դ - // Ʈŷ ɷִ. Ʈ ϹǷ... + // ItemOID가 일치하지 않는다는 말은 스트라이킹이 걸린 상태에서 + // 다른 무기를 들었다는 말이다. 그러므로 현재의 슬레이어에게는 + // 스트라이킹이 걸려있다. 이 이펙트를 제거해줘야 하므로... GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(m_ObjectID); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_STRIKING); @@ -775,7 +775,7 @@ void Slayer::initAllStat(int numPartyMember) { EffectExpansion* pExpansion = dynamic_cast(findEffect(Effect::EFFECT_CLASS_EXPANSION)); if (pExpansion != NULL) { int Bonus = pExpansion->getHPBonus(); - // ü Ƣ ش... + // 체력을 뻥튀기 해준다... m_HP[ATTR_MAX] = m_HP[ATTR_MAX] + Bonus; } } @@ -790,9 +790,9 @@ void Slayer::initAllStat(int numPartyMember) { BladeMaxDamage = attr.pWeapon->getMaxDamage(); } - // ʽ, 潺 ؼ Ƽ ۼƮ ̴. - // ɷġ () տ ̴. - // ٸ Ʈ ߰ 꿡 Ѵ. + // 데미지 및 투힛 보너스, 디펜스 및 프로텍션 페널티는 퍼센트 값이다. + // 데미지는 능력치에 의한 데미지와 무기(도) 데미지의 합에 대한 비율이다. + // 다른 이펙트에 의한 추가 데미지는 이 계산에서 제외한다. int ToHitBonus = getPercentValue(m_ToHit[ATTR_CURRENT], pBerserker->getToHitBonus()); int MinDamageBonus = getPercentValue(AttrMinDamage + BladeMinDamage, pBerserker->getDamageBonus()); int MaxDamageBonus = getPercentValue(AttrMaxDamage + BladeMaxDamage, pBerserker->getDamageBonus()); @@ -856,7 +856,7 @@ void Slayer::initAllStat(int numPartyMember) { dynamic_cast(findEffect(Effect::EFFECT_CLASS_INTIMATE_GRAIL)); if (pIntimateGrail != NULL) { - // ̾ ູ + // 슬레이어는 축복 int hpratio = 15 + (int)(pIntimateGrail->getSkillLevel() / 6.6); m_HP[ATTR_MAX] += getPercentValue(m_HP[ATTR_MAX], hpratio); m_MP[ATTR_MAX] += getPercentValue(m_MP[ATTR_MAX], hpratio); @@ -867,14 +867,14 @@ void Slayer::initAllStat(int numPartyMember) { } } - // нú ö󰡴 ɷġ Ѵ. + // 패시브 기술에 의해 올라가는 능력치를 계산한다. if (pWeapon != NULL) { Item::ItemClass IClass = pWeapon->getItemClass(); int DamageBonus = 0; int ToHitBonus = 0; int CriticalRatioBonus = 0; - // .. ObservingEyeüũ. by sigi. 2002.6.19 + // 총인 경우.. ObservingEye체크. by sigi. 2002.6.19 if (pWeapon->isGun() && isFlag(Effect::EFFECT_CLASS_OBSERVING_EYE)) { EffectObservingEye* pObservingEye = dynamic_cast(findEffect(Effect::EFFECT_CLASS_OBSERVING_EYE)); @@ -890,17 +890,17 @@ void Slayer::initAllStat(int numPartyMember) { // m_CriticalRatio[ATTR_MAX] = m_CriticalRatio[ATTR_MAX] + CriticalRatioBonus; // int VisionBonus = pObservingEye->getVisionBonus(); - // ̰Ŵ client óϵ Ѵ. + // 이거는 client에서 처리하도록 한다. } } - // Liveness ʽ ֱ + // Liveness 보너스 더해주기 if (pLiveness != NULL && pWeapon->isGun()) { m_HP[ATTR_MAX] = m_HP[ATTR_MAX] + LivenessHPBonus; m_Defense[ATTR_CURRENT] = min(SLAYER_MAX_DEFENSE, m_Defense[ATTR_CURRENT] + LivenessDefenseBonus); } - // Passive Skill : Will of Iron ֱ : SWORD or BLADE ϶ + // Passive Skill : Will of Iron 더해주기 : SWORD or BLADE 일때 if ((pFabulousSoul != NULL && pWeapon->getItemClass() == Item::ITEM_CLASS_SWORD) || (pWillOfIron != NULL && pWeapon->getItemClass() == Item::ITEM_CLASS_BLADE)) { m_HP[ATTR_MAX] += HPBonus_WillOfIron; @@ -1066,7 +1066,7 @@ void Slayer::initAllStat(int numPartyMember) { } */ - // ϴ Evasion defense ٲٹǷ ⼭ .. by sigi + // 일단 Evasion만 defense를 바꾸므로 여기서만 계산.. by sigi m_Defense[ATTR_CURRENT] = min(SLAYER_MAX_DEFENSE, m_Defense[ATTR_CURRENT] + DefenseBonus); m_Defense[ATTR_MAX] = min(SLAYER_MAX_DEFENSE, m_Defense[ATTR_MAX] + DefenseBonus); } @@ -1075,7 +1075,7 @@ void Slayer::initAllStat(int numPartyMember) { // cout << "ToHitBonus = " << ToHitBonus << endl; if (pWeapon->isGun()) { - // Concealment ʽ ֱ + // Concealment 보너스 더해주기 m_Defense[ATTR_CURRENT] += DefBonus; m_Protection[ATTR_CURRENT] += ProBonus; m_Defense[ATTR_MAX] += DefBonus; @@ -1090,7 +1090,7 @@ void Slayer::initAllStat(int numPartyMember) { m_CriticalRatio[ATTR_MAX] = m_CriticalRatio[ATTR_MAX] + CriticalRatioBonus; } - // üũ. by sigi. 2002.6.7 + // 방패 체크. by sigi. 2002.6.7 if (pShield != NULL && pShield->getItemClass() == Item::ITEM_CLASS_SHIELD) { int ProtectionBonus = 0; SkillSlot* pMastery = getSkill(SKILL_SHIELD_MASTERY); @@ -1117,7 +1117,7 @@ void Slayer::initAllStat(int numPartyMember) { } /////////////////////////////////////////////////////////////////////////////// - // ʽ Ѵ. + // 계급 보너스를 계산한다. /////////////////////////////////////////////////////////////////////////////// if (hasRankBonus(RankBonus::RANK_BONUS_DEADLY_SPEAR)) { RankBonus* pRankBonus = getRankBonus(RankBonus::RANK_BONUS_DEADLY_SPEAR); @@ -1266,7 +1266,7 @@ void Slayer::initAllStat(int numPartyMember) { } - // ʽ + // 전쟁 보너스 적용 if (HPBonus > 0) { m_HP[ATTR_MAX] = min(SLAYER_MAX_HP, m_HP[ATTR_MAX] + HPBonus); } @@ -1279,11 +1279,11 @@ void Slayer::initAllStat(int numPartyMember) { m_HP[ATTR_MAX] = min(SLAYER_MAX_HP, m_HP[ATTR_MAX] + DragonEyeHPBonus); } - // ų ʱȭ + // 성지스킬 초기화 initCastleSkill(); - // cout << getName() << " Luck : " << m_Luck << endl; + // cout << getName() << "의 Luck : " << m_Luck << endl; - // HP MAX HP + // 현재 HP가 MAX HP보다 많으면 /* if ( m_HP[ATTR_CURRENT] > m_HP[ATTR_MAX] ) { @@ -1291,10 +1291,10 @@ void Slayer::initAllStat(int numPartyMember) { } */ - // Ƽ ũ⿡ ɷġ ִ. + // 파티의 크기에 따라서 능력치가 변할 수 있다. /* - // Ƽ ο Ѿ ٽ Ѵ. + // 파티 인원수가 넘어오지 않은 경우는 다시 계산한다. if (numPartyMember == -1) { if (m_PartyID != 0) @@ -1345,13 +1345,13 @@ void Slayer::initAllStat(int numPartyMember) { /* cout << getName() << ":" << endl; for ( int i=0; igetItemClass())) { - // Ⱑ ӵ Ķ͸ Ѵ. + // 무기라면 무기가 가지는 속도 파라미터를 더한다. ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo(pItem->getItemClass(), pItem->getItemType()); m_AttackSpeed[ATTR_CURRENT] += pItemInfo->getSpeed(); m_AttackSpeed[ATTR_MAX] += pItemInfo->getSpeed(); @@ -1511,14 +1511,14 @@ void Slayer::computeItemStat(Item* pItem) { m_Luck += pItem->getLuck(); - // ΰ ɼǵ + // 부가적인 옵션들 const list& optionType = pItem->getOptionTypeList(); list::const_iterator itr; for (itr = optionType.begin(); itr != optionType.end(); itr++) { computeOptionStat(*itr); } - // Item ü defaultOption Ų. + // Item 자체의 defaultOption을 적용시킨다. const list& defaultOptions = pItem->getDefaultOptions(); list::const_iterator iOptions; @@ -1533,18 +1533,18 @@ void Slayer::computeItemStat(Item* pItem) { void Slayer::computeOptionStat(Item* pItem) { __BEGIN_TRY - // Option Type ޾ƿ´. + // Option Type을 받아온다. // OptionType_t OptionType = pItem->getOptionType(); // computeOptionStat( OptionType ); - // ΰ ɼǵ + // 부가적인 옵션들 const list& optionType = pItem->getOptionTypeList(); list::const_iterator itr; for (itr = optionType.begin(); itr != optionType.end(); itr++) { computeOptionStat(*itr); } - // Item ü defaultOption Ų. + // Item 자체의 defaultOption을 적용시킨다. const list& defaultOptions = pItem->getDefaultOptions(); list::const_iterator iOptions; @@ -2054,7 +2054,7 @@ void Slayer::initAllStatAndSend() { ////////////////////////////////////////////////////////////////////////////// // -// ̾ +// 뱀파이어 // ////////////////////////////////////////////////////////////////////////////// @@ -2115,7 +2115,7 @@ void Vampire::initAllStat(int numPartyMember) m_Mastery[MAGIC_DOMAIN_CURSE] = 0; m_Mastery[MAGIC_DOMAIN_BLOOD] = 0; - // BloodBible ʽ ġ ʱȭ + // BloodBible 관련 보너스 수치들 초기화 m_ConsumeMPRatio = 0; m_GamblePriceRatio = 0; m_PotionPriceRatio = 0; @@ -2125,15 +2125,15 @@ void Vampire::initAllStat(int numPartyMember) m_PhysicDamageReduce = 0; ////////////////////////////////////////////////////////////////////////////// - // ⺻ ɷġ ʱȭŰ, - // ⺻ ɷġ ִ Ʈ ˻Ѵ. + // 제일 먼저 기본 능력치를 초기화시키고, + // 기본 능력치에 영향을 주는 이펙트를 검사한다. ////////////////////////////////////////////////////////////////////////////// m_STR[ATTR_CURRENT] = m_STR[ATTR_MAX] = m_STR[ATTR_BASIC]; m_DEX[ATTR_CURRENT] = m_DEX[ATTR_MAX] = m_DEX[ATTR_BASIC]; m_INT[ATTR_CURRENT] = m_INT[ATTR_MAX] = m_INT[ATTR_BASIC]; ////////////////////////////////////////////////////////////////////////////// - // ɷġ Ķ͵ ʱȭѴ. + // 능력치 계산을 위한 파라미터들을 초기화한다. ////////////////////////////////////////////////////////////////////////////// attr.nSTR = m_STR[ATTR_CURRENT]; attr.nDEX = m_DEX[ATTR_CURRENT]; @@ -2145,11 +2145,11 @@ void Vampire::initAllStat(int numPartyMember) m_HPStealAmount = 0; m_HPRegen = 0; m_Luck = m_BaseLuck; - // cout << getName() << " ⺻ : " << m_Luck << endl; + // cout << getName() << "의 기본 행운 : " << m_Luck << endl; m_HPRegenBonus = 0; //////////////////////////////////////////////////////////// - // ΰ ɷġ ٽ Ѵ. + // 부가적인 능력치들을 다시 계산한다. //////////////////////////////////////////////////////////// m_HP[ATTR_MAX] = computeHP(CClass, &attr); m_HP[ATTR_BASIC] = 0; @@ -2175,12 +2175,12 @@ void Vampire::initAllStat(int numPartyMember) int DragonEyeHPBonus = 0; if (isFlag(Effect::EFFECT_CLASS_DRAGON_EYE)) { - // HP ʽ ι + // HP 보너스는 두배 DragonEyeHPBonus = m_HP[ATTR_MAX]; } - // ʽ - // п ̵ ʽ ִ. by sigi + // 전쟁 보너스 + // 지금은 전쟁 승패에 관계없이 어느쪽이든 보너스가 적용될 수 있다. by sigi // if ( g_pCombatInfoManager->isVampireBonus() ) int HPBonus = 0; { @@ -2193,7 +2193,7 @@ void Vampire::initAllStat(int numPartyMember) } ////////////////////////////////////////////////////////////////////////////// - // ϴ üũ ʱȭؼ  ϰ Ѵ. + // 일단 기어 체크 변수를 초기화해서 모든 기어를 안 입은 것으로 간주하고 시작한다. ////////////////////////////////////////////////////////////////////////////// bool pOldRealWearingCheck[VAMPIRE_WEAR_MAX]; // by sigi. 2002.10.31 for (int i = 0; i < VAMPIRE_WEAR_MAX; i++) { @@ -2202,9 +2202,9 @@ void Vampire::initAllStat(int numPartyMember) } ////////////////////////////////////////////////////////////////////////////// - // ʽ ɼ ް ȴ + // 성을 소유한 종족은 보너스 옵션을 받게 된다 ////////////////////////////////////////////////////////////////////////////// - // Blood Bible ʽ ɼ ޴ ɷ ƴ. + // Blood Bible 각각의 보너스 옵션을 받는 걸로 고쳤다. /* if (m_pZone->isHolyLand() ) { const list& optionType = g_pHolyLandRaceBonus->getVampireOptionTypeList(); @@ -2216,7 +2216,7 @@ void Vampire::initAllStat(int numPartyMember) } */ ////////////////////////////////////////////////////////////////////////////// - // Blood Bilbe ʽ ɼ ޴´. + // Blood Bilbe 각각의 보너스 옵션을 받는다. ////////////////////////////////////////////////////////////////////////////// /* if ( m_pZone->isHolyLand() && !g_pWarSystem->hasActiveRaceWar() ) { @@ -2258,7 +2258,7 @@ void Vampire::initAllStat(int numPartyMember) } ////////////////////////////////////////////////////////////////////////////// - // ⺻ ִ ɼǵ Ѵ. + // 기본적으로 가지고 있는 옵션들을 계산한다. ////////////////////////////////////////////////////////////////////////////// forward_list::iterator itr = m_DefaultOptionSet.begin(); for (; itr != m_DefaultOptionSet.end(); itr++) { @@ -2273,7 +2273,7 @@ void Vampire::initAllStat(int numPartyMember) } ////////////////////////////////////////////////////////////////////////////// - // ִ ʽ Ѵ. + // 펫이 주는 보너스를 계산한다. ////////////////////////////////////////////////////////////////////////////// if (m_pPetInfo != NULL) { if (m_pPetInfo->getPetAttr() != 0xff) @@ -2283,22 +2283,22 @@ void Vampire::initAllStat(int numPartyMember) } ////////////////////////////////////////////////////////////////////////////// - // for ι ö ɷġ ؼ - // ְ Ǵ üũϱ ؼ̴. + // for 가 두번인 이유는 아이템으로 올라간 능력치에 의해서 + // 입을 수 있게 되는 아이템을 체크하기 위해서이다. ////////////////////////////////////////////////////////////////////////////// for (int j = 0; j < VAMPIRE_WEAR_MAX; j++) { int wearCount = 0; for (int i = 0; i < VAMPIRE_WEAR_MAX; i++) { Item* pItem = m_pWearItem[i]; - // Ʈ ְ - // װͿ üũ ʾҴٸ... + // 현재 포인트에 아이템이 있고 + // 그것에 대한 체크를 아직 하지 않았다면... if (pItem != NULL && m_pRealWearingCheck[i] == false) { - // ¥ ִ ̶ ɷġ ÷ش. + // 만일 진짜루 입을 수 있는 아이템이라면 능력치를 올려준다. if (isRealWearing(pItem)) { computeItemStat(pItem); - // , üũ ι ʵ - // , üũ + // 양손 무기라면, 체크를 두번 하지 않도록 + // 왼쪽, 오른쪽 모두 체크 변수를 세팅 if (isTwohandWeapon(pItem)) { m_pRealWearingCheck[WEAR_LEFTHAND] = true; m_pRealWearingCheck[WEAR_RIGHTHAND] = true; @@ -2323,8 +2323,8 @@ void Vampire::initAllStat(int numPartyMember) } } if (zaps[0] && zaps[1] && zaps[2] && zaps[3]) { - computeOptionStat(182); // 9 - computeOptionStat(185); // 3 + computeOptionStat(182); // 모저 9 + computeOptionStat(185); // 모능 3 } applyBloodBibleSign(); @@ -2336,8 +2336,8 @@ void Vampire::initAllStat(int numPartyMember) bSendPacket = (dynamic_cast(m_pPlayer)->getPlayerStatus() == GPS_NORMAL); } - // ϴ Ծµ.. - // ɷġ ȵǴ ش. + // 일단 위에서 다 입었는데.. + // 능력치에 따라서 복장이 적용이 안되는 아이템은 복장 정보를 없앤다. // by sigi. 2002.10.30 // for (int i=0; i(findEffect(Effect::EFFECT_CLASS_DOOM)); @@ -2504,11 +2504,11 @@ void Vampire::initAllStat(int numPartyMember) } // by sigi. 2002.6.19 - // isEffect isFlag ٲ. 2003.3.27 by Sequoia + // isEffect를 isFlag로 바꿈. 2003.3.27 by Sequoia if (isFlag(Effect::EFFECT_CLASS_CASKET)) { EffectSummonCasket* pCasket = dynamic_cast(findEffect(Effect::EFFECT_CLASS_CASKET)); if (pCasket != NULL) { - // pCasket->getType() ٸ .. + // pCasket->getType()에 따라서 다를 수도 있지.. // by sigi. 2002.12.3. 20 --> 30 int DefenseBonus = getPercentValue(m_Defense[ATTR_CURRENT], 30); int ProtectionBonus = getPercentValue(m_Protection[ATTR_CURRENT], 30); @@ -2538,7 +2538,7 @@ void Vampire::initAllStat(int numPartyMember) /////////////////////////////////////////////////////////////////////////////// - // ʽ Ѵ. + // 계급 보너스를 계산한다. /////////////////////////////////////////////////////////////////////////////// if (hasRankBonus(RankBonus::RANK_BONUS_IMMORTAL_BLOOD)) { RankBonus* pRankBonus = getRankBonus(RankBonus::RANK_BONUS_IMMORTAL_BLOOD); @@ -2653,7 +2653,7 @@ void Vampire::initAllStat(int numPartyMember) } } - // DEX HPRegenBonus Ʈ + // DEX 에 따른 HPRegenBonus 포인트 if (m_DEX[ATTR_BASIC] > 450) { m_HPRegenBonus += 7; } else if (m_DEX[ATTR_BASIC] > 390) { @@ -2670,9 +2670,9 @@ void Vampire::initAllStat(int numPartyMember) m_HPRegenBonus += 1; } - // Ƽ ũ⿡ ɷġ ִ. + // 파티의 크기에 따라서 능력치가 변할 수 있다. - // ʽ + // 전쟁 보너스 적용 if (HPBonus > 0) { m_HP[ATTR_MAX] = min(VAMPIRE_MAX_HP, m_HP[ATTR_MAX] + HPBonus); } @@ -2685,8 +2685,8 @@ void Vampire::initAllStat(int numPartyMember) m_HP[ATTR_MAX] = min(VAMPIRE_MAX_HP, m_HP[ATTR_MAX] + DragonEyeHPBonus); } - // HP ġ HP ְġ Ѵ - // ġ ְġ set + // HP의 현재치를 HP의 최고치를 넘는 경우 + // 현재치를 최고치값으로 set if (m_HP[ATTR_CURRENT] > m_HP[ATTR_MAX]) { m_HP[ATTR_CURRENT] = m_HP[ATTR_MAX]; /* @@ -2701,7 +2701,7 @@ void Vampire::initAllStat(int numPartyMember) } ////////////////////////////////////////////////////////////////////////////// - // нú Ѵ. + // 패시브 기술을 계산한다. ////////////////////////////////////////////////////////////////////////////// VampireSkillSlot* pNailMastery = getSkill(SKILL_NAIL_MASTERY); if (pNailMastery != NULL) { @@ -2722,10 +2722,10 @@ void Vampire::initAllStat(int numPartyMember) m_Resist[MAGIC_DOMAIN_BLOOD] = 0; } - // cout << getName() << " Luck : " << m_Luck << endl; + // cout << getName() << "의 Luck : " << m_Luck << endl; /* - // Ƽ ο Ѿ ٽ Ѵ. + // 파티 인원수가 넘어오지 않은 경우는 다시 계산한다. if (numPartyMember == -1) { if (m_PartyID != 0) @@ -2765,13 +2765,13 @@ void Vampire::initAllStat(int numPartyMember) /* cout << getName() << ":" << endl; for ( int i=0; igetItemClass())) { - // Ⱑ ӵ Ķ͸ Ѵ. + // 무기라면 무기가 가지는 속도 파라미터를 더한다. ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo(pItem->getItemClass(), pItem->getItemType()); m_AttackSpeed[ATTR_CURRENT] += pItemInfo->getSpeed(); m_AttackSpeed[ATTR_MAX] += pItemInfo->getSpeed(); @@ -2907,14 +2907,14 @@ void Vampire::computeItemStat(Item* pItem) m_Luck += pItem->getLuck(); // if (pItem->getOptionType()) computeOptionStat(pItem); - // ΰ ɼǵ + // 부가적인 옵션들 const list& optionType = pItem->getOptionTypeList(); list::const_iterator itr; for (itr = optionType.begin(); itr != optionType.end(); itr++) { computeOptionStat(*itr); } - // Item ü defaultOption Ų. + // Item 자체의 defaultOption을 적용시킨다. const list& defaultOptions = pItem->getDefaultOptions(); list::const_iterator iOptions; @@ -2930,18 +2930,18 @@ void Vampire::computeOptionStat(Item* pItem) { __BEGIN_TRY - // Option Type ޾ƿ´. + // Option Type을 받아온다. // OptionType_t OptionType = pItem->getOptionType(); // computeOptionStat( OptionType ); - // ΰ ɼǵ + // 부가적인 옵션들 const list& optionType = pItem->getOptionTypeList(); list::const_iterator itr; for (itr = optionType.begin(); itr != optionType.end(); itr++) { computeOptionStat(*itr); } - // Item ü defaultOption Ų. + // Item 자체의 defaultOption을 적용시킨다. const list& defaultOptions = pItem->getDefaultOptions(); list::const_iterator iOptions; @@ -2977,7 +2977,7 @@ void Vampire::computeOptionClassStat(OptionClass OClass, int PlusPoint) { m_HP[ATTR_MAX] += PlusPoint; m_HP[ATTR_BASIC] += PlusPoint; break; - // ̾ MPɼ ۵ HP óش. + // 뱀파이어는 MP흡수옵션이 붙은 아이템도 HP흡수로 처리해준다. // 2003. 1. 17. Sequoia case OPTION_HP_STEAL: case OPTION_MP_STEAL: @@ -3117,7 +3117,7 @@ void Vampire::computeOptionStat(OptionType_t OptionType) m_HP[ATTR_MAX] += pOptionInfo->getPlusPoint(); m_HP[ATTR_BASIC] += pOptionInfo->getPlusPoint(); break; - // ̾ MPɼ ۵ HP óش. + // 뱀파이어는 MP흡수옵션이 붙은 아이템도 HP흡수로 처리해준다. // 2003. 1. 17. Sequoia case OPTION_HP_STEAL: case OPTION_MP_STEAL: @@ -3299,7 +3299,7 @@ void Vampire::initAllStatAndSend() { ////////////////////////////////////////////////////////////////////////////// // -// +// 몬스터 // ////////////////////////////////////////////////////////////////////////////// void Monster::initAllStat(void) @@ -3319,14 +3319,14 @@ void Monster::initAllStat(void) m_Resist[MAGIC_DOMAIN_BLOOD] = 0; //////////////////////////////////////////////////////////// - // ⺻ ɷġ ʱȭŰ... + // 제일 먼저 기본 능력치를 초기화시키고... //////////////////////////////////////////////////////////// m_STR = pMonsterInfo->getSTR(); m_DEX = pMonsterInfo->getDEX(); m_INT = pMonsterInfo->getINT(); //////////////////////////////////////////////////////////// - // ⺻ ɷ¿ ִ Ʈ ˻Ѵ. + // 기본 능력에 영향을 주는 이펙트를 검사한다. //////////////////////////////////////////////////////////// attr.nSTR = m_STR; attr.nDEX = m_DEX; @@ -3334,7 +3334,7 @@ void Monster::initAllStat(void) attr.nLevel = pMonsterInfo->getLevel(); //////////////////////////////////////////////////////////// - // ΰ ɷġ ٽ Ѵ. + // 부가적인 능력치들을 다시 계산한다. //////////////////////////////////////////////////////////// m_HP[ATTR_MAX] = computeHP(CClass, &attr, pMonsterInfo->getEnhanceHP()); m_ToHit = computeToHit(CClass, &attr, pMonsterInfo->getEnhanceToHit()); @@ -3345,14 +3345,14 @@ void Monster::initAllStat(void) // #ifdef __XMAS_EVENT_CODE__ - // ũ ̺Ʈ ȹ , - // ȴ. + // 원래 크리스마스 이벤트로 기획된 것이지만, 앞으로 계속 사용될 것으로 + // 예정된다. if (m_MonsterType == 358 || m_MonsterType == 359 || m_MonsterType == 360 || m_MonsterType == 361) m_HP[ATTR_MAX] = m_HP[ATTR_MAX] * 10; // #endif //////////////////////////////////////////////////////////// - // ΰ ɷġ ϴ Ʈ ˻Ѵ. + // 부가적인 능력치들을 직접 수정하는 이펙트를 검사한다. //////////////////////////////////////////////////////////// if (isFlag(Effect::EFFECT_CLASS_DOOM)) { EffectDoom* pDoom = dynamic_cast(findEffect(Effect::EFFECT_CLASS_DOOM)); @@ -3428,7 +3428,7 @@ void Monster::initAllStat(void) ////////////////////////////////////////////////////////////////////////////// // -// ƿ콺ͽ +// 아우스터스 // ////////////////////////////////////////////////////////////////////////////// @@ -3484,7 +3484,7 @@ void Ousters::initAllStat(int numPartyMember) m_Resist[MAGIC_DOMAIN_CURSE] = 0; m_Resist[MAGIC_DOMAIN_BLOOD] = 0; - // BloodBible ʽ ġ ʱȭ + // BloodBible 관련 보너스 수치들 초기화 m_ConsumeMPRatio = 0; m_GamblePriceRatio = 0; m_PotionPriceRatio = 0; @@ -3494,15 +3494,15 @@ void Ousters::initAllStat(int numPartyMember) m_PhysicDamageReduce = 0; ////////////////////////////////////////////////////////////////////////////// - // ⺻ ɷġ ʱȭŰ, - // ⺻ ɷġ ִ Ʈ ˻Ѵ. + // 제일 먼저 기본 능력치를 초기화시키고, + // 기본 능력치에 영향을 주는 이펙트를 검사한다. ////////////////////////////////////////////////////////////////////////////// m_STR[ATTR_CURRENT] = m_STR[ATTR_MAX] = m_STR[ATTR_BASIC]; m_DEX[ATTR_CURRENT] = m_DEX[ATTR_MAX] = m_DEX[ATTR_BASIC]; m_INT[ATTR_CURRENT] = m_INT[ATTR_MAX] = m_INT[ATTR_BASIC]; ////////////////////////////////////////////////////////////////////////////// - // ɷġ Ķ͵ ʱȭѴ. + // 능력치 계산을 위한 파라미터들을 초기화한다. ////////////////////////////////////////////////////////////////////////////// attr.nSTR = m_STR[ATTR_CURRENT]; attr.nDEX = m_DEX[ATTR_CURRENT]; @@ -3519,7 +3519,7 @@ void Ousters::initAllStat(int numPartyMember) m_HPRegen = 0; m_MPRegen = 0; m_Luck = m_BaseLuck; - // cout << getName() << " ⺻ : " << m_Luck << endl; + // cout << getName() << "의 기본 행운 : " << m_Luck << endl; m_FireDamage = 0; m_WaterDamage = 0; @@ -3535,7 +3535,7 @@ void Ousters::initAllStat(int numPartyMember) m_PassiveRatio = 0; //////////////////////////////////////////////////////////// - // ΰ ɷġ ٽ Ѵ. + // 부가적인 능력치들을 다시 계산한다. //////////////////////////////////////////////////////////// m_HP[ATTR_MAX] = computeHP(CClass, &attr); m_HP[ATTR_BASIC] = 0; @@ -3563,12 +3563,12 @@ void Ousters::initAllStat(int numPartyMember) int DragonEyeHPBonus = 0; if (isFlag(Effect::EFFECT_CLASS_DRAGON_EYE)) { - // HP ʽ ι + // HP 보너스는 두배 DragonEyeHPBonus = m_HP[ATTR_MAX]; } ////////////////////////////////////////////////////////////////////////////// - // ϴ üũ ʱȭؼ  ϰ Ѵ. + // 일단 기어 체크 변수를 초기화해서 모든 기어를 안 입은 것으로 간주하고 시작한다. ////////////////////////////////////////////////////////////////////////////// bool pOldRealWearingCheck[OUSTERS_WEAR_MAX]; // by sigi. 2002.10.31 for (int i = 0; i < OUSTERS_WEAR_MAX; i++) { @@ -3577,7 +3577,7 @@ void Ousters::initAllStat(int numPartyMember) } ////////////////////////////////////////////////////////////////////////////// - // Blood Bible ʽ ɼ ޴´. + // Blood Bible 각각의 보너스 옵션을 받는다. ////////////////////////////////////////////////////////////////////////////// /* if ( m_pZone->isHolyLand() && !g_pWarSystem->hasActiveRaceWar() ) { @@ -3619,7 +3619,7 @@ void Ousters::initAllStat(int numPartyMember) } ////////////////////////////////////////////////////////////////////////////// - // ⺻ ִ ɼǵ Ѵ. + // 기본적으로 가지고 있는 옵션들을 계산한다. ////////////////////////////////////////////////////////////////////////////// forward_list::iterator itr = m_DefaultOptionSet.begin(); for (; itr != m_DefaultOptionSet.end(); itr++) { @@ -3634,7 +3634,7 @@ void Ousters::initAllStat(int numPartyMember) } ////////////////////////////////////////////////////////////////////////////// - // ִ ʽ Ѵ. + // 펫이 주는 보너스를 계산한다. ////////////////////////////////////////////////////////////////////////////// if (m_pPetInfo != NULL) { if (m_pPetInfo->getPetAttr() != 0xff) @@ -3660,22 +3660,22 @@ void Ousters::initAllStat(int numPartyMember) } ////////////////////////////////////////////////////////////////////////////// - // for ι ö ɷġ ؼ - // ְ Ǵ üũϱ ؼ̴. + // for 가 두번인 이유는 아이템으로 올라간 능력치에 의해서 + // 입을 수 있게 되는 아이템을 체크하기 위해서이다. ////////////////////////////////////////////////////////////////////////////// for (int j = 0; j < OUSTERS_WEAR_MAX; j++) { int wearCount = 0; for (int i = 0; i < OUSTERS_WEAR_MAX; i++) { Item* pItem = m_pWearItem[i]; - // Ʈ ְ - // װͿ üũ ʾҴٸ... + // 현재 포인트에 아이템이 있고 + // 그것에 대한 체크를 아직 하지 않았다면... if (pItem != NULL && m_pRealWearingCheck[i] == false) { - // ¥ ִ ̶ ɷġ ÷ش. + // 만일 진짜루 입을 수 있는 아이템이라면 능력치를 올려준다. if (isRealWearing(pItem)) { computeItemStat(pItem); - // , üũ ι ʵ - // , üũ + // 양손 무기라면, 체크를 두번 하지 않도록 + // 왼쪽, 오른쪽 모두 체크 변수를 세팅 if (isTwohandWeapon(pItem)) { m_pRealWearingCheck[WEAR_LEFTHAND] = true; m_pRealWearingCheck[WEAR_RIGHTHAND] = true; @@ -3700,8 +3700,8 @@ void Ousters::initAllStat(int numPartyMember) } } if (zaps[0] && zaps[1] && zaps[2] && zaps[3]) { - computeOptionStat(182); // 9 - computeOptionStat(185); // 3 + computeOptionStat(182); // 모저 9 + computeOptionStat(185); // 모능 3 } applyBloodBibleSign(); @@ -3713,8 +3713,8 @@ void Ousters::initAllStat(int numPartyMember) bSendPacket = (dynamic_cast(m_pPlayer)->getPlayerStatus() == GPS_NORMAL); } - // ϴ Ծµ.. - // ɷġ ȵǴ ش. + // 일단 위에서 다 입었는데.. + // 능력치에 따라서 복장이 적용이 안되는 아이템은 복장 정보를 없앤다. // by sigi. 2002.10.30 for (int i = 0; i < OUSTERS_WEAR_MAX; i++) // int i=WEAR_COAT; @@ -3751,7 +3751,7 @@ void Ousters::initAllStat(int numPartyMember) } ////////////////////////////////////////////////////////////////////////////// - // HP, MP ƿ Ȯ д. + // HP, MP 스틸 확률을 계산해 둔다. ////////////////////////////////////////////////////////////////////////////// if (hasRankBonus(RankBonus::RANK_BONUS_LIFE_ABSORB)) { RankBonus* pRankBonus = getRankBonus(RankBonus::RANK_BONUS_LIFE_ABSORB); @@ -3776,7 +3776,7 @@ void Ousters::initAllStat(int numPartyMember) // cout << getName() << " HPSteal : " << (int)m_HPStealAmount << endl; ////////////////////////////////////////////////////////////////////////////// - // ΰ ɷġ ϴ Ʈ ˻Ѵ. + // 부가적인 능력치를 직접 수정하는 이펙트를 검사한다. ////////////////////////////////////////////////////////////////////////////// if (isFlag(Effect::EFFECT_CLASS_DOOM)) { EffectDoom* pDoom = dynamic_cast(findEffect(Effect::EFFECT_CLASS_DOOM)); @@ -3844,7 +3844,7 @@ void Ousters::initAllStat(int numPartyMember) /* if ( isFlag( Effect::EFFECT_CLASS_HANDS_OF_FIRE ) ) { - //cout << getName() << " ̾ پ" << endl; + //cout << getName() << " 핸즈오브파이어 붙었당" << endl; EffectHandsOfFire* pEffect = dynamic_cast(findEffect(Effect::EFFECT_CLASS_HANDS_OF_FIRE)); @@ -3915,7 +3915,7 @@ void Ousters::initAllStat(int numPartyMember) } ////////////////////////////////////////////////////////////////////////////// - // нú Ѵ. + // 패시브 기술을 계산한다. ////////////////////////////////////////////////////////////////////////////// OustersSkillSlot* pHideSight = getSkill(SKILL_HIDE_SIGHT); if (pHideSight != NULL && attr.pWeapon != NULL && @@ -3937,7 +3937,7 @@ void Ousters::initAllStat(int numPartyMember) /////////////////////////////////////////////////////////////////////////////// - // ʽ Ѵ. + // 계급 보너스를 계산한다. /////////////////////////////////////////////////////////////////////////////// if (hasRankBonus(RankBonus::RANK_BONUS_WOOD_SKIN)) { RankBonus* pRankBonus = getRankBonus(RankBonus::RANK_BONUS_WOOD_SKIN); @@ -4132,7 +4132,7 @@ void Ousters::initAllStat(int numPartyMember) Assert(pRankBonus != NULL); int MPBonus = getPercentValue(m_MP[ATTR_CURRENT], pRankBonus->getPoint()); - // edit by Coffee 2007-5-20 ħMP BUG + // edit by Coffee 2007-5-20 錦攣침쥣轟掘MP BUG m_MPStealAmount += MPBonus; m_MPStealRatio = computeStealRatio(CClass, m_MPStealAmount, &attr); // m_MP[ATTR_CURRENT] = min(OUSTERS_MAX_MP, m_MP[ATTR_CURRENT] + MPBonus); @@ -4169,7 +4169,7 @@ void Ousters::initAllStat(int numPartyMember) m_ElementalEarth += pRankBonus->getPoint(); } - // -_- % Ǵ ų Ų. + // -_- %로 적용되는 스킬은 마지막에 적용시킨다. if (isFlag(Effect::EFFECT_CLASS_SHARP_CHAKRAM)) { EffectSharpChakram* pEffect = dynamic_cast(findEffect(Effect::EFFECT_CLASS_SHARP_CHAKRAM)); @@ -4201,8 +4201,8 @@ void Ousters::initAllStat(int numPartyMember) } } - // HP,MP ġ HP,MP ְġ Ѵ - // ġ ְġ set + // HP,MP의 현재치를 HP,MP의 최고치를 넘는 경우 + // 현재치를 최고치값으로 set /* if (m_HP[ATTR_CURRENT] > m_HP[ATTR_MAX]) { m_HP[ATTR_CURRENT] = m_HP[ATTR_MAX]; @@ -4212,7 +4212,7 @@ void Ousters::initAllStat(int numPartyMember) m_MP[ATTR_CURRENT] = m_MP[ATTR_MAX]; } */ - // нú ų ʱȭ + // 패시브 스킬 초기화 bool bCanUsePassive = false; if (hasSkill(SKILL_FIRE_OF_SOUL_STONE) != NULL) { SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SKILL_FIRE_OF_SOUL_STONE); @@ -4362,22 +4362,22 @@ void Ousters::initAllStat(int numPartyMember) initCastleSkill(); - // cout << " : " << m_ElementalFire << endl; - // cout << " : " << m_ElementalWater << endl; - // cout << " : " << m_ElementalEarth << endl; + // cout << "불 : " << m_ElementalFire << endl; + // cout << "물 : " << m_ElementalWater << endl; + // cout << "대지 : " << m_ElementalEarth << endl; - // cout << getName() << " Luck : " << m_Luck << endl; + // cout << getName() << "의 Luck : " << m_Luck << endl; /* cout << getName() << ":" << endl; for ( int i=0; igetItemClass())) if (pItem->getItemClass() == Item::ITEM_CLASS_OUSTERS_CHAKRAM) { - // Ⱑ ӵ Ķ͸ Ѵ. + // 무기라면 무기가 가지는 속도 파라미터를 더한다. ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo(pItem->getItemClass(), pItem->getItemType()); m_AttackSpeed[ATTR_CURRENT] += pItemInfo->getSpeed(); m_AttackSpeed[ATTR_MAX] += pItemInfo->getSpeed(); @@ -4553,14 +4553,14 @@ void Ousters::computeItemStat(Item* pItem) m_Luck += pItem->getLuck(); // if (pItem->getOptionType()) computeOptionStat(pItem); - // ΰ ɼǵ + // 부가적인 옵션들 const list& optionType = pItem->getOptionTypeList(); list::const_iterator itr; for (itr = optionType.begin(); itr != optionType.end(); itr++) { computeOptionStat(*itr); } - // Item ü defaultOption Ų. + // Item 자체의 defaultOption을 적용시킨다. const list& defaultOptions = pItem->getDefaultOptions(); list::const_iterator iOptions; @@ -4576,14 +4576,14 @@ void Ousters::computeOptionStat(Item* pItem) { __BEGIN_TRY - // ΰ ɼǵ + // 부가적인 옵션들 const list& optionType = pItem->getOptionTypeList(); list::const_iterator itr; for (itr = optionType.begin(); itr != optionType.end(); itr++) { computeOptionStat(*itr); } - // Item ü defaultOption Ų. + // Item 자체의 defaultOption을 적용시킨다. const list& defaultOptions = pItem->getDefaultOptions(); list::const_iterator iOptions; diff --git a/src/server/gameserver/Inventory.h b/src/server/gameserver/Inventory.h index b2642fc7..1040870b 100644 --- a/src/server/gameserver/Inventory.h +++ b/src/server/gameserver/Inventory.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : Inventory.h // Written By : elca@ewestsoft.com -// Revised By : 輺 +// Revised By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -149,9 +149,9 @@ class Inventory { // #ifdef __XMAS_EVENT_CODE__ ///////////////////////////////////////////////////////////////////////// - // 2001 ũ ̺Ʈ Լ. - // 2002 ̳ Ÿ ̺Ʈ ؼ (GiftBox ) - // ̺Ʈ ؼ XMAS_STAR STAR_EVENT ٲٴ ؾ + // 2001년 크리스마스 이벤트 관련 함수들. + // 2002년 어린이날 스타 이벤트를 위해서 재사용(GiftBox는 사용하지 않음) + // 이벤트 재사용을 위해서 XMAS_STAR를 STAR_EVENT로 바꾸는 것을 고려해야 함 public: bool hasEnoughStar(const XMAS_STAR& star); void decreaseStar(const XMAS_STAR& star); @@ -166,13 +166,13 @@ class Inventory { // member data //////////////////////////////////////// private: - string m_Owner; // κ丮 + string m_Owner; // 인벤토리 소유주 CoordInven_t m_Width; // Inventory Width CoordInven_t m_Height; // Inventory Height ItemNum_t m_TotalNum; // Total Count Weight_t m_TotalWeight; // Total Weight - InventorySlot** m_pInventorySlot; // InventorySlot 迭. - bool m_bDeleteAll; // ü ۱ Ѵ. + InventorySlot** m_pInventorySlot; // InventorySlot의 이차원 배열. + bool m_bDeleteAll; // 객체가 삭제될 때 아이템까지 삭제한다. }; #endif // __INVENTORY_H__ diff --git a/src/server/gameserver/Item.cpp b/src/server/gameserver/Item.cpp index f0d7c54f..c539474e 100644 --- a/src/server/gameserver/Item.cpp +++ b/src/server/gameserver/Item.cpp @@ -49,8 +49,8 @@ bool Item::destroy() pStmt->executeQuery("DELETE FROM %s WHERE ItemID = %lu", getObjectTableName().c_str(), m_ItemID); - // DB °ǵ.. - // DB ̹ + // DB에서 지우는건데.. + // DB에 이미 아이템이 없는 경우 if (pStmt->getAffectedRowCount() == 0) { SAFE_DELETE(pStmt); return false; @@ -65,7 +65,7 @@ bool Item::destroy() __END_CATCH } -// . ⺻ , Ư 쿣 Timeover ׿ storage.. +// 아이템을 버린다. 기본은 가비지로, 특별한 경우엔 Timeover 나 그외 안 쓰는 storage로.. void Item::waste(Storage storage) const { @@ -88,7 +88,7 @@ const list& Item::getDefaultOptions(void) const } catch (NoSuchElementException&) { StringStream msg; - msg << "׷ ϴ.(" << (int)getItemClass() << ", " << (int)getItemType() << ")"; + msg << "그런 아이템 정보가 없습니다.(" << (int)getItemClass() << ", " << (int)getItemType() << ")"; filelog("itemError.txt", "%s", msg.toString().c_str()); // throw Error(msg.toString()); @@ -109,7 +109,7 @@ bool Item::isQuestItem() const { void Item::makePCItemInfo(PCItemInfo& result) const { if (m_ObjectID == 0) { - filelog("ItemError.log", " oid 0Դϴ. : %s", toString().c_str()); + filelog("ItemError.log", "아이템 oid가 0입니다. : %s", toString().c_str()); result.setObjectID(0); } else { result.setObjectID(getObjectID()); diff --git a/src/server/gameserver/Item.h b/src/server/gameserver/Item.h index 77a34c06..a2d1a355 100644 --- a/src/server/gameserver/Item.h +++ b/src/server/gameserver/Item.h @@ -413,15 +413,15 @@ class Store; ////////////////////////////////////////////////////////////////////////////// // class Item -// ְų, ũó Ǵ ۵ Ÿ. +// 땅에 떨어져 있거나, 크리처에게 소유되는 수동적인 아이템들을 나타낸다. ////////////////////////////////////////////////////////////////////////////// class Item : public Object { public: - // Item з Ÿ. Item Ŭ - // ӹ Ŭ Ʒ Ʈ ߰ϱ - // ٶ. Ŭ getItemClass() - // Ѵ. + // Item 의 하위 분류를 나타낸다. Item 클래스를 + // 직접 상속받은 클래스를 아래 리스트에 추가하기 + // 바란다. 또한 이 클래스들은 getItemClass() 를 + // 재정의해줘야 한다. enum ItemClass { ITEM_CLASS_MOTORCYCLE, // 0 ITEM_CLASS_POTION, // 1 @@ -518,18 +518,18 @@ class Item : public Object { }; enum CreateType { - CREATE_TYPE_NORMAL, // Ϲ // 0 - CREATE_TYPE_MONSTER, // Ϳ ؼ // 1 - CREATE_TYPE_SHOP, // // 2 - CREATE_TYPE_GAMBLE, // ؼ // 3 - CREATE_TYPE_ENCHANT, // æƮ ؼ // 4 - CREATE_TYPE_GAME, // ٸ ýۿ ؼ // 5 - CREATE_TYPE_CREATE, //  ɾ // 6 - CREATE_TYPE_MALL, // // 7 - CREATE_TYPE_PRIZE, // Ÿ ̺Ʈ // 8 - CREATE_TYPE_MIXING, // Mixing Forge // 9 - CREATE_TYPE_SPECIAL, // -_-; // 10 - CREATE_TYPE_TIME_EXTENSION, // ű ̺Ʈ ѽð ÷ Ǵ // 11 + CREATE_TYPE_NORMAL, // 일반적인 아이템 생성 // 0 + CREATE_TYPE_MONSTER, // 몬스터에 의해서 생성 // 1 + CREATE_TYPE_SHOP, // 상점에서 생성 // 2 + CREATE_TYPE_GAMBLE, // 갬블을 통해서 생성 // 3 + CREATE_TYPE_ENCHANT, // 인챈트를 통해서 생성 // 4 + CREATE_TYPE_GAME, // 다른 게임 시스템에 의해서 생성 // 5 + CREATE_TYPE_CREATE, // 운영자 명령어로 생성 // 6 + CREATE_TYPE_MALL, // 웹의 샵 몰에서 구매한 아이템 // 7 + CREATE_TYPE_PRIZE, // 기타 이벤트로 준 아이템 // 8 + CREATE_TYPE_MIXING, // Mixing Forge 로 만든 아이템 // 9 + CREATE_TYPE_SPECIAL, // 사장님 아이템 -_-; // 10 + CREATE_TYPE_TIME_EXTENSION, // 신규 유저 이벤트시 제한시간 늘려줘야 되는 아이템 // 11 CREATE_TYPE_MAX }; @@ -554,7 +554,7 @@ class Item : public Object { // DB methods public: virtual void create(const string& ownerID, Storage storage, DWORD storageID, BYTE x, BYTE y, - ItemID_t itemID = 0) = 0; // itemID=0 <-- Ư ItemID . by sigi. 2002.10.28 + ItemID_t itemID = 0) = 0; // itemID=0 <-- 특정 ItemID로 생성. by sigi. 2002.10.28 virtual bool destroy(); virtual void save(const string& ownerID, Storage storage, DWORD storageID, BYTE x, BYTE y) = 0; virtual void tinysave(const string& field) const = 0; @@ -562,9 +562,9 @@ class Item : public Object { // own methods // *CAUTION* - // ItemType Item Ŭ ǵȴ. - // ޸ - // ؼ̴. + // ItemType은 Item 의 하위 클래스에서 정의된다. + // 이유는 역시 메모리 정렬 문제로 인한 낭비를 + // 막기 위해서이다. public: virtual ItemClass getItemClass() const = 0; string getItemClassName() const { @@ -787,15 +787,15 @@ class Item : public Object { EffectManager m_EffectManager; // EffectManager bitset m_Flag; // Effect flag - CreateType m_CreateType; // - bool m_bUnique; // ũ ΰ? - bool m_bQuest; // Ʈ ΰ.. - bool m_bTrace; // Trace Log ΰ? + CreateType m_CreateType; // 아이템 생성 종류 + bool m_bUnique; // 유니크 아이템인가? + bool m_bQuest; // 퀘스트 아이템인가.. + bool m_bTrace; // Trace Log 를 남길 아이템인가? - bool m_bTimeLimit; // ð ΰ? - int m_Hour; // ѽð + bool m_bTimeLimit; // 시간제한 아이템인가? + int m_Hour; // 제한시간 - bool m_bOnStore; // λ Ǿִ° + bool m_bOnStore; // 개인상점에 진열되어있는가 Store* m_pStore; }; diff --git a/src/server/gameserver/ItemFactoryManager.h b/src/server/gameserver/ItemFactoryManager.h index 809e497f..1714c021 100644 --- a/src/server/gameserver/ItemFactoryManager.h +++ b/src/server/gameserver/ItemFactoryManager.h @@ -37,8 +37,8 @@ class ItemFactoryManager { string toString() const; private: - ItemFactory** m_Factories; // 丮 迭 - ushort m_Size; // 丮迭 ũ + ItemFactory** m_Factories; // 아이템팩토리의 배열 + ushort m_Size; // 아이템팩토리배열의 크기 unordered_map m_ItemClassMap; }; diff --git a/src/server/gameserver/ItemGradeManager.cpp b/src/server/gameserver/ItemGradeManager.cpp index 17f56ab8..b7195b77 100644 --- a/src/server/gameserver/ItemGradeManager.cpp +++ b/src/server/gameserver/ItemGradeManager.cpp @@ -26,7 +26,7 @@ void ItemGradeManager::load() { m_GradeRatios[Grade - 1] = Ratio; m_GradeGambleRatios[Grade - 1] = GambleRatio; m_GradeBeadRatios[Grade - 1] = BeadRatio; - cout << Grade << " : " << Ratio << ", " << GambleRatio << ", " << BeadRatio << endl; + cout << Grade << "급 : " << Ratio << ", " << GambleRatio << ", " << BeadRatio << endl; } SAFE_DELETE(pStmt); diff --git a/src/server/gameserver/ItemInfo.cpp b/src/server/gameserver/ItemInfo.cpp index 84e515c5..6405c1f2 100644 --- a/src/server/gameserver/ItemInfo.cpp +++ b/src/server/gameserver/ItemInfo.cpp @@ -133,7 +133,7 @@ void ItemInfo::setDefaultOptions(const string& options) try { optionType = g_pOptionInfoManager->getOptionType(optionName); } catch (NoSuchElementException&) { - throw Error("׷ ɼ ܴ."); + throw Error("그런 옵션이 없단다."); } addDefaultOptions( optionType ); @@ -158,17 +158,17 @@ void ItemInfo::clearDefaultOptions() m_DefaultOptions.clear(); } -// ܰ ɼ upgrade ߳? +// 다음 단계의 옵션으로 upgrade가 성공했나? bool ItemInfo::isUpgradeSucceed() const { - // 0 ƴϰ - // Ȯŭ rand() Ư (0) 찡 ̴. + // 0이 아니고 + // 확률만큼 rand()했을때 특정한 한 값(0)이 나오는 경우가 성공이다. // return m_UpgradeRatio!=0 && (rand()%m_UpgradeRatio==0); - // ׷.. ȹ Դ. -_-; + // 그런데.. 기획이 백분율로 나왔다. -_-; return (rand() % 100 < (int)m_UpgradeRatio); } -// ܰ ɼ upgrade ϴٰ ؼ item μ? +// 다음 단계의 옵션으로 upgrade 하다가 실패해서 item이 부서졌나? bool ItemInfo::isUpgradeCrash() const { return (rand() % 100 < m_UpgradeCrashPercent); } diff --git a/src/server/gameserver/ItemInfo.h b/src/server/gameserver/ItemInfo.h index 3cd1cddf..a68a2e23 100644 --- a/src/server/gameserver/ItemInfo.h +++ b/src/server/gameserver/ItemInfo.h @@ -21,7 +21,7 @@ class ItemInfo { virtual ~ItemInfo(); - // + // 공통 정보 public: virtual Item::ItemClass getItemClass() const = 0; string getItemClassName() const { @@ -134,7 +134,7 @@ class ItemInfo { virtual string toString() const = 0; - // . ǻ ̽ Ŭ ش. + // 개별 정보. 편의상 베이스 클래스에 정의해준다. public: virtual Durability_t getDurability() const { return 1; @@ -203,7 +203,7 @@ class ItemInfo { return 0; } - // ItemType ⺻ ɼ + // ItemType에 따른 기본 옵션 virtual void setDefaultOptions(const string& options); void addDefaultOptions(OptionType_t optionType); void clearDefaultOptions(); @@ -260,31 +260,31 @@ class ItemInfo { // member data protected: - ItemType_t m_ItemType; // Ÿ - string m_Name; // ̸ - string m_EName; // ̸ - Price_t m_Price; // - VolumeType_t m_VolumeType; // - Weight_t m_Weight; // - Ratio_t m_Ratio; // Ȯ( Ȯ) - string m_Description; // - Attr_t m_ReqSTR; // ʿ STR - Attr_t m_ReqDEX; // ʿ DEX - Attr_t m_ReqINT; // ʿ INT - Attr_t m_ReqSum; // ʿ ɷġ - Level_t m_ReqLevel; // ʿ - Level_t m_ReqAdvanceLevel; // ʿ - Attr_t m_ReqGender; // ʿ - - bool m_bDefaultOptions; // ⺻ ɼ ֳ? - list m_DefaultOptions; // ⺻ ɼ - - Ratio_t m_UpgradeRatio; // enchantؼ Ȯ - int m_UpgradeCrashPercent; // upgrade ؼ μ Ȯ = m_UpgradeCrashPercent% - - bool m_bUnique; // unique item ΰ? - - Ratio_t m_NextOptionRatio; // ٸ ɼ Ȯ + ItemType_t m_ItemType; // 아이템 타입 + string m_Name; // 이름 + string m_EName; // 영문 이름 + Price_t m_Price; // 가격 + VolumeType_t m_VolumeType; // 부피 + Weight_t m_Weight; // 무게 + Ratio_t m_Ratio; // 아이템 등장 확률(갬블 확률) + string m_Description; // 아이템 설명 + Attr_t m_ReqSTR; // 필요한 STR + Attr_t m_ReqDEX; // 필요한 DEX + Attr_t m_ReqINT; // 필요한 INT + Attr_t m_ReqSum; // 필요한 능력치의 합 + Level_t m_ReqLevel; // 필요한 레벨 + Level_t m_ReqAdvanceLevel; // 필요한 전직 레벨 + Attr_t m_ReqGender; // 필요한 성 + + bool m_bDefaultOptions; // 기본 옵션이 있나? + list m_DefaultOptions; // 기본 옵션 + + Ratio_t m_UpgradeRatio; // enchant해서 성공할 확률 + int m_UpgradeCrashPercent; // upgrade가 실패해서 부서질 확률 = m_UpgradeCrashPercent% + + bool m_bUnique; // unique item 인가? + + Ratio_t m_NextOptionRatio; // 다른 옵션이 붙을 확률 ItemType_t m_NextItemType; Ratio_t m_DowngradeRatio; diff --git a/src/server/gameserver/ItemInfoManager.h b/src/server/gameserver/ItemInfoManager.h index 258d7c00..3ad92a44 100644 --- a/src/server/gameserver/ItemInfoManager.h +++ b/src/server/gameserver/ItemInfoManager.h @@ -53,8 +53,8 @@ class ItemInfoManager { private: InfoClassManager* m_InfoClassManagers[Item::ITEM_CLASS_MAX]; - uint m_ItemIDSuccessor; // ItemID ߱޹ ġ( ) - uint m_ItemIDBase; // ٸ ̽ + uint m_ItemIDSuccessor; // ItemID를 발급받을 때의 증가치(서버의 숫자) + uint m_ItemIDBase; // 각 서버마다 다른 베이스 }; extern ItemInfoManager* g_pItemInfoManager; diff --git a/src/server/gameserver/ItemMap.h b/src/server/gameserver/ItemMap.h index 59ddcbe9..80581030 100644 --- a/src/server/gameserver/ItemMap.h +++ b/src/server/gameserver/ItemMap.h @@ -1,8 +1,8 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : ItemMap.h -// Written by : 輺 +// Written by : 김성민 // Description : -// Ŭ̾Ʈ Ʈ ̴. +// 클라이언트에서 가져온 소트된 아이템의 맵이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ITEM_MAP__ @@ -33,30 +33,30 @@ class ItemMap : public std::map { ~ItemMap(); public: - // ڷ . + // 모든 자료들을 날린다. void clearAll(void) { clear(); m_Num2x2 = 0; m_Num2x2Temp = 0; } - // Ѵ. + // 아이템을 더한다. bool addItem(Item* pItem); - // 2x2 ش. + // 2x2 아이템의 갯수를 세팅해 준다. void set2x2(int n); int get2x2() const { return m_Num2x2; } protected: - // ʿ ֱ Ű Ѵ. + // 아이템을 맵에 넣기 위해 키를 구한다. ulonglong getKey(Item* pItem); // Member data protected: int m_Num2x2; - int m_Num2x2Temp; // ӽ - GetKey ʼ + int m_Num2x2Temp; // 임시 - GetKey에서 필수 }; diff --git a/src/server/gameserver/ItemNumberManager.h b/src/server/gameserver/ItemNumberManager.h index 7e20bbe0..c9063311 100644 --- a/src/server/gameserver/ItemNumberManager.h +++ b/src/server/gameserver/ItemNumberManager.h @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : ItemNumberManager.h -// Written By : +// Written By : 쉭 // Description : ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/ItemPolicies.h b/src/server/gameserver/ItemPolicies.h index b3b2ffb8..dc730a55 100644 --- a/src/server/gameserver/ItemPolicies.h +++ b/src/server/gameserver/ItemPolicies.h @@ -161,7 +161,7 @@ class NoGrade : public NoValuePolicy { // void setGrade(Grade_t Grade) { } public: - // Ӽ ġ + // 아이템의 속성에 미치는 영향 int getDurabilityOffset() const { return 0; } @@ -190,7 +190,7 @@ class HasGrade : public OneValuePolicy { // void setGrade(Grade_t Grade) { m_Grade = Grade; } public: - // Ӽ ġ + // 아이템의 속성에 미치는 영향 int getDurabilityOffset() const { return 0; } @@ -216,7 +216,7 @@ class HasGrade : public OneValuePolicy { class WeaponGrade : public HasGrade { public: - // Ӽ ġ + // 아이템의 속성에 미치는 영향 int getDurabilityOffset() const { return (getValue() - 4) * 1000; } @@ -231,7 +231,7 @@ class WeaponGrade : public HasGrade { template class ArmorGrade : public HasGrade { public: - // Ӽ ġ + // 아이템의 속성에 미치는 영향 int getDurabilityOffset() const { return (getValue() - 4) * DurabilityPitch; } @@ -248,7 +248,7 @@ typedef ArmorGrade<1, 1, 1, 2, 500> GroceryGrade; class AccessoryGrade : public HasGrade { public: - // Ӽ ġ + // 아이템의 속성에 미치는 영향 int getDurabilityOffset() const { return (getValue() - 4) * 1000; } diff --git a/src/server/gameserver/ItemRack.cpp b/src/server/gameserver/ItemRack.cpp index fc34a677..586ad4ee 100644 --- a/src/server/gameserver/ItemRack.cpp +++ b/src/server/gameserver/ItemRack.cpp @@ -21,11 +21,11 @@ ItemRack::ItemRack() { } ItemRack::ItemRack(int size) { - // 迭 Ҵ + // 포인터 배열 할당 m_ppItem = new Item*[size]; Assert(m_ppItem != NULL); - // 迭 ʱȭ + // 포인터 배열 초기화 for (int i = 0; i < size; i++) m_ppItem[i] = NULL; @@ -39,7 +39,7 @@ ItemRack::~ItemRack() { if (pItem != NULL && pItem->getItemClass() == Item::ITEM_CLASS_KEY) { Key* pKey = dynamic_cast(pItem); - // ϰ ̾ȿ ˾Ƽ ֵ . + // 걍 간단하게 이안에서 알아서 존에서 지워 주도록 하자. if (g_pParkingCenter->hasMotorcycleBox(pKey->getTarget())) { g_pParkingCenter->deleteMotorcycleBox(pKey->getTarget()); } @@ -53,7 +53,7 @@ ItemRack::~ItemRack() { } void ItemRack::init(int size) { - // մ ش. + // 먼저 잇던 내용을 지워준다. if (m_ppItem != NULL) { for (int i = 0; i < m_nSize; i++) SAFE_DELETE(m_ppItem[i]); @@ -61,11 +61,11 @@ void ItemRack::init(int size) { SAFE_DELETE_ARRAY(m_ppItem); } - // 迭 Ҵ + // 포인터 배열 할당 m_ppItem = new Item*[size]; Assert(m_ppItem != NULL); - // 迭 ʱȭ + // 포인터 배열 초기화 for (int i = 0; i < size; i++) m_ppItem[i] = NULL; @@ -73,7 +73,7 @@ void ItemRack::init(int size) { } bool ItemRack::isFull(void) const { - // ϳ ƴ. + // 아이템이 하나라도 없으면 꽉 찬 것은 아니지. for (int i = 0; i < m_nSize; i++) if (m_ppItem[i] == NULL) return false; @@ -82,7 +82,7 @@ bool ItemRack::isFull(void) const { } bool ItemRack::isEmpty(void) const { - // ϳ ƴ. + // 아이템이 하나라도 있으면 빈 것은 아니지. for (int i = 0; i < m_nSize; i++) if (m_ppItem[i] != NULL) return false; @@ -91,34 +91,34 @@ bool ItemRack::isEmpty(void) const { } bool ItemRack::isExist(BYTE index) const { - // ߸ ε + // 잘못된 인덱싱 검증 Assert(verifyIndex(index)); - // ٸ false, ִٸ true + // 아이템이 없다면 false, 있다면 true return (m_ppItem[index] == NULL ? false : true); } void ItemRack::insert(BYTE index, Item* pItem) { - // ߸ ε + // 잘못된 인덱싱 검증 Assert(verifyIndex(index)); - // ִ ˻ + // 먼저 아이템이 들어있는지 검사 Assert(m_ppItem[index] == NULL); - // ִ´. + // 집어넣는다. m_ppItem[index] = pItem; } void ItemRack::remove(BYTE index) { - // ߸ ε + // 잘못된 인덱싱 검증 Assert(verifyIndex(index)); - // . + // 포인터 지운다. m_ppItem[index] = NULL; } Item* ItemRack::get(BYTE index) { - // ߸ ε + // 잘못된 인덱싱 검증 Assert(verifyIndex(index)); return m_ppItem[index]; @@ -130,7 +130,7 @@ void ItemRack::clear(void) { } BYTE ItemRack::getFirstEmptySlot(void) const { - // ó ˻Ѵ. + // 처음부터 검색한다. for (int i = 0; i < m_nSize; i++) if (m_ppItem[i] == NULL) return i; @@ -139,7 +139,7 @@ BYTE ItemRack::getFirstEmptySlot(void) const { } BYTE ItemRack::getLastEmptySlot(void) const { - // ں ˻Ѵ. + // 뒤부터 검색한다. for (int i = m_nSize - 1; i >= 0; i--) if (m_ppItem[i] == NULL) return i; diff --git a/src/server/gameserver/ItemUtil.cpp b/src/server/gameserver/ItemUtil.cpp index ea4ea98f..33d7c6c5 100644 --- a/src/server/gameserver/ItemUtil.cpp +++ b/src/server/gameserver/ItemUtil.cpp @@ -53,7 +53,7 @@ #endif // __THAILAND_SERVER__ ////////////////////////////////////////////////////////////////////////////// -// ִ ΰ? +// ½×ÀÏ ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isStackable(Item::ItemClass IClass) { switch (IClass) { @@ -80,7 +80,7 @@ bool isStackable(Item::ItemClass IClass) { case Item::ITEM_CLASS_PET_ENCHANT_ITEM: case Item::ITEM_CLASS_LUCKY_BAG: case Item::ITEM_CLASS_PET_FOOD: - case Item::ITEM_CLASS_MONEY: // add by sonic 2006.10.30 ǮΪɵ + case Item::ITEM_CLASS_MONEY: // add by sonic 2006.10.30 ½«½ðÇ®ÉèΪ¿Éµþ¼Ó return true; default: return false; @@ -90,7 +90,7 @@ bool isStackable(Item::ItemClass IClass) { } ////////////////////////////////////////////////////////////////////////////// -// ִ ΰ? +// ½×ÀÏ ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isStackable(const Item* pItem) { // if (pItem == NULL) return false; @@ -120,14 +120,14 @@ bool isStackable(const Item* pItem) { } ////////////////////////////////////////////////////////////////////////////// -// Ŭ, Ÿ ΰ? +// °°Àº Ŭ·¡½º, ŸÀÔÀÇ ¾ÆÀÌÅÛÀΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isSameItem(Item::ItemClass IClass1, Item::ItemClass IClass2, ItemType_t type1, ItemType_t type2) { return IClass1 == IClass2 && type1 == type2; } ////////////////////////////////////////////////////////////////////////////// -// Ŭ, Ÿ ΰ? +// °°Àº Ŭ·¡½º, ŸÀÔÀÇ ¾ÆÀÌÅÛÀΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isSameItem(const Item* pItem1, const Item* pItem2) { return pItem1 != NULL && pItem2 != NULL && pItem1->getItemClass() == pItem2->getItemClass() && @@ -135,14 +135,14 @@ bool isSameItem(const Item* pItem1, const Item* pItem2) { } ////////////////////////////////////////////////////////////////////////////// -// ִ°? +// µÎ ¾ÆÀÌÅÛÀ» ½×À» ¼ö Àִ°¡? ////////////////////////////////////////////////////////////////////////////// bool canStack(const Item* pItem1, const Item* pItem2) { return isStackable(pItem1) && isSameItem(pItem1, pItem2); } ////////////////////////////////////////////////////////////////////////////// -// ΰ? +// µÎ ¼Õ ¹«±âÀΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isTwohandWeapon(const Item* pItem) { if (pItem == NULL) @@ -166,7 +166,7 @@ bool isTwohandWeapon(const Item* pItem) { } ////////////////////////////////////////////////////////////////////////////// -// ΰ? +// Á¢±ÙÀü ¹«±âÀΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isMeleeWeapon(const Item* pItem) { if (pItem == NULL) @@ -189,7 +189,7 @@ bool isMeleeWeapon(const Item* pItem) { } ////////////////////////////////////////////////////////////////////////////// -// , ΰ? +// Àü»ç, ±ºÀÎ ¼ºÁ÷ÀÚ ¹«±âÀΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isFighterWeapon(const Item* pItem) { if (pItem == NULL) @@ -241,7 +241,7 @@ bool isClericWeapon(const Item* pItem) { } ////////////////////////////////////////////////////////////////////////////// -// ѿ ´ źâΰ? +// ÃÑ¿¡ ¸Â´Â źâÀΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isSuitableMagazine(const Item* pGun, const Item* pMagazine, bool hasVivid) { if (pGun == NULL || pMagazine == NULL) @@ -297,7 +297,7 @@ bool isSuitableMagazine(const Item* pGun, const Item* pMagazine, bool hasVivid) } ////////////////////////////////////////////////////////////////////////////// -// ̾ ΰ? +// ½½·¹À̾î¿ë ¹«±âÀΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isSlayerWeapon(Item::ItemClass IClass) { switch (IClass) { @@ -318,7 +318,7 @@ bool isSlayerWeapon(Item::ItemClass IClass) { } ////////////////////////////////////////////////////////////////////////////// -// ̾ ΰ? +// ¹ìÆÄÀ̾î¿ë ¹«±âÀΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isVampireWeapon(Item::ItemClass IClass) { switch (IClass) { @@ -332,7 +332,7 @@ bool isVampireWeapon(Item::ItemClass IClass) { } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺ͽ ΰ? +// ¾Æ¿ì½ºÅͽº¿ë ¹«±âÀΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isOustersWeapon(Item::ItemClass IClass) { switch (IClass) { @@ -347,7 +347,7 @@ bool isOustersWeapon(Item::ItemClass IClass) { } ////////////////////////////////////////////////////////////////////////////// -// ̾ ΰ? +// ½½·¹À̾î¿ë ¹æ¾î±¸Àΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isSlayerArmor(Item::ItemClass IClass) { switch (IClass) { @@ -367,7 +367,7 @@ bool isSlayerArmor(Item::ItemClass IClass) { return false; } ////////////////////////////////////////////////////////////////////////////// -// ̾ ΰ? +// ¹ìÆÄÀ̾î¿ë ¹æ¾î±¸Àΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isVampireArmor(Item::ItemClass IClass) { switch (IClass) { @@ -382,7 +382,7 @@ bool isVampireArmor(Item::ItemClass IClass) { } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺ͽ ΰ? +// ¾Æ¿ì½ºÅͽº ¹æ¾î±¸Àΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isOustersArmor(Item::ItemClass IClass) { switch (IClass) { @@ -400,7 +400,7 @@ bool isOustersArmor(Item::ItemClass IClass) { } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ǽ縮ΰ? +// ½½·¹À̾î¿ë ¾Ç¼¼»ç¸®Àΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isSlayerAccessory(Item::ItemClass IClass) { switch (IClass) { @@ -416,7 +416,7 @@ bool isSlayerAccessory(Item::ItemClass IClass) { } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ǽ縮ΰ? +// ¹ìÆÄÀ̾î¿ë ¾Ç¼¼»ç¸®Àΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isVampireAccessory(Item::ItemClass IClass) { switch (IClass) { @@ -434,7 +434,7 @@ bool isVampireAccessory(Item::ItemClass IClass) { } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺ͽ Ǽ縮ΰ? +// ¾Æ¿ì½ºÅͽº¿ë ¾Ç¼¼»ç¸®Àΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isOustersAccessory(Item::ItemClass IClass) { switch (IClass) { @@ -452,10 +452,10 @@ bool isOustersAccessory(Item::ItemClass IClass) { ////////////////////////////////////////////////////////////////////////////// -// ΰ? +// ¼ö¸®°¡´ÉÇÑ ¾ÆÀÌÅÛÀΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isRepairableItem(const Item* pItem) { - // ũ ʿ䰡 . + // À¯´ÏÅ© ¾ÆÀÌÅÛÀº ¼ö¸®ÇÒ Çʿ䰡 ¾ø´Ù. if (pItem == NULL || pItem->isUnique() || pItem->isTimeLimitItem()) return false; if (pItem->isFlagItem()) @@ -506,7 +506,7 @@ bool isRepairableItem(const Item* pItem) { ////////////////////////////////////////////////////////////////////////////// -// Ѵ. +// ¾ÆÀÌÅÛÀ» ¼ö¸®ÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// void repairItem(Item* pItem) { if (pItem != NULL && !pItem->isUnique() && isRepairableItem(pItem)) { @@ -519,16 +519,16 @@ void repairItem(Item* pItem) { OustersSummonItem* pOustersSummonItem = dynamic_cast(pItem); pOustersSummonItem->setCharge(pOustersSummonItem->getMaxCharge()); } else { - // ֳ ġ  + // ÃÖ³» ³»±¸Ä¡¸¦ ¾ò¾î³»¼­ Durability_t maxDurability = computeMaxDurability(pItem); - // Ѵ. + // ¼ö¸®ÇÑ´Ù. pItem->setDurability(maxDurability); } } } ////////////////////////////////////////////////////////////////////////////// -// ִ . +// ¾ÆÀÌÅÛÀÇ ÃÖ´ë ³»±¸µµ¸¦ ¾ò¾î³½´Ù. ////////////////////////////////////////////////////////////////////////////// Durability_t computeMaxDurability(Item* pItem) { if (pItem == NULL) @@ -539,7 +539,7 @@ Durability_t computeMaxDurability(Item* pItem) { unsigned long maxDurability = pItem->getMaxDurability(); - // 100% + // 100%¿¡¼­ ½ÃÀÛ unsigned long plusPoint = 100; const list& optionTypes = pItem->getOptionTypeList(); @@ -560,20 +560,20 @@ Durability_t computeMaxDurability(Item* pItem) { } maxDurability = (maxDurability * plusPoint / 100); - // 65000 Ѿ 縮 -_-;;; + // 65000 ³Ñ¾î°¡¸é »à»ç¸®³­´Ù -_-;;; // maxDurability = min( (unsigned long)65000, maxDurability ); return (Durability_t)maxDurability; } ////////////////////////////////////////////////////////////////////////////// -// źâ Ƴش. +// źâÀ» °¥¾Æ³¢¿öÁØ´Ù. ////////////////////////////////////////////////////////////////////////////// Bullet_t reloadArmsItem(Item* pGun, Item* pMagazine) { Assert(pGun != NULL); Assert(pMagazine != NULL); - // vivid magazine üũ Ѵ. Լ reloadش. + // vivid magazine üũ´Â ¿©±â µé¾î¿À±â Àü¿¡ ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ¹«Á¶°Ç reloadÇØÁØ´Ù. if (isSuitableMagazine(pGun, pMagazine, true) == false) return false; @@ -609,7 +609,7 @@ Bullet_t reloadArmsItem(Item* pGun, Item* pMagazine) { } ////////////////////////////////////////////////////////////////////////////// -// Ѿ ش. +// ÃѾËÀ» »©ÁØ´Ù. ////////////////////////////////////////////////////////////////////////////// Bullet_t decreaseBullet(Item* pWeapon) @@ -626,7 +626,7 @@ Bullet_t decreaseBullet(Item* pWeapon) Bullet_t bullet = 0; Silver_t silver = 0; - // Gun class ߰ߴ. by sigi. 2002.5.8 + // Gun class¸¦ Ãß°¡Çß´Ù. by sigi. 2002.5.8 /* if (IClass == Item::ITEM_CLASS_AR || IClass == Item::ITEM_CLASS_SMG @@ -690,7 +690,7 @@ Bullet_t decreaseBullet(Item* pWeapon) ////////////////////////////////////////////////////////////////////////////// -// Ѿ +// ³²Àº ÃѾËÀÇ °¹¼ö¸¦ ¸®ÅÏ ////////////////////////////////////////////////////////////////////////////// Bullet_t getRemainBullet(Item* pWeapon) @@ -735,7 +735,7 @@ Bullet_t getRemainBullet(Item* pWeapon) } ////////////////////////////////////////////////////////////////////////////// -// ִ ΰ? +// ÁÖÀ» ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isPortableItem(Item* pItem) { Assert(pItem != NULL); @@ -756,15 +756,15 @@ bool isPortableItem(Item* pItem) { } ////////////////////////////////////////////////////////////////////////////// -// ִ ΰ? -// ⼭ ̶, ؼ Ҹ Ѵ. +// »ç¿ëÇÒ ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀΰ¡? +// ¿©±â¼­ÀÇ »ç¿ëÀ̶õ, »ç¿ëÇØ¼­ »ç¶óÁö´Â ¼Ò¸ð¼º ¾ÆÀÌÅÛÀ» ¸»ÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// bool isUsableItem(Item* pItem, Creature* pUser) { Assert(pItem != NULL); Assert(pUser != NULL); - // ߿ Ŭ,  ְ, - //  ? + // ³ªÁß¿¡ °°Àº Ŭ·¡½ºÁö¸¸, ¾î¶² °ÍÀº »ç¿ëÇÒ ¼ö ÀÖ°í, + // ¾î¶² °ÍÀº »ç¿ëÇÒ ¼ö ¾ø´Â °ÍÀÌ ³ª¿ÀÁö ¾ÊÀ»±î? // ItemType_t IType = pItem->getItemType(); switch (pItem->getItemClass()) { @@ -798,7 +798,7 @@ bool isUsableItem(Item* pItem, Creature* pUser) { break; case Item::ITEM_CLASS_EVENT_TREE: if (pItem->getItemType() == 12 || (pItem->getItemType() >= 26 && pItem->getItemType() <= 28)) - return true; // ϼ Ʈ + return true; // ¿Ï¼ºµÈ Æ®¸® break; case Item::ITEM_CLASS_EVENT_ETC: @@ -871,7 +871,7 @@ bool isUsableItem(Item* pItem, Creature* pUser) { } ////////////////////////////////////////////////////////////////////////////// -// ڸ δ. +// ¾ÆÀÌÅÛÀÇ ¼ýÀÚ¸¦ ÁÙÀδÙ. ////////////////////////////////////////////////////////////////////////////// ItemNum_t decreaseItemNum(Item* pItem, Inventory* pInventory, const string& OwnerID, Storage storage, StorageID_t storageID, BYTE x, BYTE y) { @@ -881,18 +881,18 @@ ItemNum_t decreaseItemNum(Item* pItem, Inventory* pInventory, const string& Owne Assert(isStackable(pItem)); if (pItem->getNum() > 1) { - pItem->setNum(pItem->getNum() - 1); // ϳ δ. - pInventory->decreaseItemNum(); // κ丮 δ. - pInventory->decreaseWeight(pItem->getWeight()); // κ丮 Ը δ. - // pItem->save(OwnerID, storage, storageID, x, y); // Ѵ. - // ȭ. 2002.7.25 by sigi + pItem->setNum(pItem->getNum() - 1); // ¾ÆÀÌÅÛÀÇ °¹¼ö¸¦ Çϳª ÁÙÀδÙ. + pInventory->decreaseItemNum(); // Àκ¥Å丮 ÃÑ °¹¼ö¸¦ ÁÙÀδÙ. + pInventory->decreaseWeight(pItem->getWeight()); // Àκ¥Å丮 ÃÑ ¹«°Ô¸¦ ÁÙÀδÙ. + // pItem->save(OwnerID, storage, storageID, x, y); // ¾ÆÀÌÅÛ Á¤º¸¸¦ ÀúÀåÇÑ´Ù. + // ¾ÆÀÌÅÛ ÀúÀå ÃÖÀûÈ­. 2002.7.25 by sigi char pField[80]; sprintf(pField, "Num=%d", pItem->getNum()); pItem->tinysave(pField); return pItem->getNum(); - } else // 1¥, Ѵ. + } else // ¾ÆÀÌÅÛÀÌ 1°³Â¥¸®¿´À¸´Ï, »èÁ¦ÇÑ´Ù. { pInventory->deleteItem(x, y); pItem->destroy(); @@ -958,7 +958,7 @@ bool hasOptionClass(const list& optionTypes, OptionType_t optionTy return true; } } catch (Throwable& t) { - // .. + // ¹«½Ã.. filelog("hasOptionClassBug.txt", "%s", t.toString().c_str()); } @@ -1025,18 +1025,18 @@ string getOptionTypeToString(const list& optionTypes) { ////////////////////////////////////////////////////////////////////////////// -// : ɼ ϱ? +// ·¹¾î ¾ÆÀÌÅÛ : ´ÙÀ½ ¿É¼ÇÀ» ºÙÀϱî? ////////////////////////////////////////////////////////////////////////////// bool isPossibleNextOption(ITEM_TEMPLATE* pTemplate) { - // ɼ 2ۿ ٴ´. + // ÇöÀç´Â ¿É¼ÇÀÌ 2°³±îÁö¹Û¿¡ ¾È ºÙ´Â´Ù. if (pTemplate->OptionType.size() >= 5) return false; - // ƹ͵ ٸ δ... ϴ° ƴ ¶ ׷ - -; + // ¾Æ¹«°Íµµ ¾ø´Ù¸é ¹«Á¶°Ç ºÙÀδÙ...°í ÇÏ´Â°Ç ¾Æ´ÏÁö¸¸ ¾î¶µç ±×·¸´Ù - -; if (pTemplate->OptionType.empty()) return true; - // ۿ Ư Ǿ ִ ɼ Ȯ Ų. + // ¾ÆÀÌÅÛ¿¡ Ưº°È÷ Àû¿ëµÇ¾î ÀÖ´Â ¿É¼Ç È®·üÀ» Àû¿ë½ÃŲ´Ù. if (pTemplate->NextOptionRatio != 0) { int dice = rand() % 100; // cout << "NextOptionRatio : " << dice << " < " << (int)pTemplate->NextOptionRatio << endl; @@ -1044,13 +1044,13 @@ bool isPossibleNextOption(ITEM_TEMPLATE* pTemplate) { } try { - // .. ɼ Ȯ Ѵ. + // ¾ÆÀÌÅÛ Á¾·ùº°·Î.. ´ÙÀ½ ¿É¼ÇÀÌ ºÙÀ» È®·üÀ» ±¸ÇÑ´Ù. ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo(pTemplate->ItemClass, pTemplate->ItemType); Ratio_t nextItemRatio = pItemInfo->getNextOptionRatio(); - // ɼǿ ؼ.. ɼ Ȯ Ѵ. + // ÇöÀç ºÙÀº ¿É¼Ç¿¡ ´ëÇØ¼­.. ´ÙÀ½ ¿É¼ÇÀÌ ºÙÀ» È®·üÀ» ±¸ÇÑ´Ù. list::const_iterator itr = pTemplate->OptionType.begin(); - Ratio_t nextOptionRatio = nextItemRatio; // Ϸ.. + Ratio_t nextOptionRatio = nextItemRatio; // °è»ê ÁÙÀÏ·Á°í.. Ratio_t baseMultiplier = 100; // 100% for (; itr != pTemplate->OptionType.end(); itr++) { OptionInfo* pOptionInfo = g_pOptionInfoManager->getOptionInfo(*itr); @@ -1060,8 +1060,8 @@ bool isPossibleNextOption(ITEM_TEMPLATE* pTemplate) { baseMultiplier *= 100; } - // [] ɼ پ ִ ۿ - // ° ɼ Ȯ̶.. + // [¿¹Á¦] ¿É¼ÇÀÌ µÎ °³ ºÙ¾î ÀÖ´Â ¾ÆÀÌÅÛ¿¡¼­ + // ¼¼¹øÂ° ¿É¼ÇÀÌ ºÙÀ» È®·üÀ̶ó¸é.. // // nextItemRatio = 10 % // nextOptionRatio1 = 20 % @@ -1070,7 +1070,7 @@ bool isPossibleNextOption(ITEM_TEMPLATE* pTemplate) { // total nextOptionRatio = nextItemRatio * nextOptionRatio1 * nextOptionRatio2 // = 10 * 20 * 30 = 6000 // - // baseMultiplier = 100(ʱⰪ) * 100(option1) * 100(option2) + // baseMultiplier = 100(ÃʱⰪ) * 100(option1) * 100(option2) // = 1000000 // // selectRatio = 0~baseMultiplier = 0~1000000 @@ -1082,14 +1082,14 @@ bool isPossibleNextOption(ITEM_TEMPLATE* pTemplate) { Ratio_t selectRatio = rand() % baseMultiplier; - // Ȯ Ų. + // ·¹¾î ¾ÆÀÌÅÛ ·çÆÃ È®·üÀ» Àû¿ë½ÃŲ´Ù. nextOptionRatio = getPercentValue(nextOptionRatio, g_pVariableManager->getRareItemRatio()); - // Ȯ üũ + // È®·ü üũ return selectRatio < nextOptionRatio; } catch (Throwable& t) { - // ϴ Ѵ. + // ÀÏ´Ü ¹«½ÃÇÑ´Ù. filelog("nextOptionBug.txt", "%s", t.toString().c_str()); } @@ -1097,7 +1097,7 @@ bool isPossibleNextOption(ITEM_TEMPLATE* pTemplate) { } ////////////////////////////////////////////////////////////////////////////// -// +// °·ºí ¾ÆÀÌÅÛ »ý¼º ////////////////////////////////////////////////////////////////////////////// Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, int maxLevel) @@ -1115,7 +1115,7 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in ItemInfo* pItemInfo = NULL; //---------------------------------------------------------------------- - // Slayer + // SlayerÀÎ °æ¿ì //---------------------------------------------------------------------- if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -1131,27 +1131,27 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in Attr_t ReqSum, ReqSum2; Attr_t ReqGender; - // gamble ִ Ѱ踦 . + // gambleÇÒ ¼ö ÀÖ´Â ÇѰ踦 Á» ´õ ³ôÇôº»´Ù. CSTR += 3; CDEX += 3; CINT += 3; CSUM += 5; - // level + // levelÁ¦ÇÑ if (maxLevel != 0) { - int maxAttr = maxLevel * 2 / 3; // attr SUM 2/3 . + int maxAttr = maxLevel * 2 / 3; // attrÀº SUMÀÇ 2/3À¸·Î º»´Ù. CSTR = min((int)maxAttr, (int)CSTR); CDEX = min((int)maxAttr, (int)CDEX); CINT = min((int)maxAttr, (int)CINT); CSUM = min((int)maxLevel, (int)CSUM); } - // 10 . + // 10¹ø¸¸ µ¹·Áº»´Ù. int i = 10; do { itemType = pInfoClass->getRandomItemType(); - // itemType ص Ǵ level ȮѴ. + // ÀÌ itemTypeÀ» »ý¼ºÇصµ µÇ´Â levelÀÎÁö È®ÀÎÇÑ´Ù. pItemInfo = g_pItemInfoManager->getItemInfo(itemClass, itemType); ReqSTR2 = ReqSTR = pItemInfo->getReqSTR(); @@ -1163,14 +1163,14 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in if (CSTR >= ReqSTR && CDEX >= ReqDEX && CINT >= ReqINT && CSUM >= ReqSum && (ReqGender == GENDER_BOTH || pSlayer->getSex() == MALE && ReqGender == GENDER_MALE || pSlayer->getSex() == FEMALE && ReqGender == GENDER_FEMALE)) { - // item type Ѵ. + // ÀÌ item typeÀ¸·Î °áÁ¤ÇÑ´Ù. break; } } while (--i); if (i == 0) { - // ⺻ item type ٸ. + // ¿©ÀÚÀÎ °æ¿ì´Â ±âº» item typeÀÌ ´Ù¸£´Ù. if ((itemClass == Item::ITEM_CLASS_COAT || itemClass == Item::ITEM_CLASS_TROUSER) && pSlayer->getSex() == FEMALE) { itemType = 1; @@ -1178,13 +1178,13 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in itemType = 0; } - // ؿ üũҶ ϱ ؼ.. + // ¹Ø¿¡¼­ üũÇÒ¶§ ¹«½ÃÇϱâ À§Çؼ­.. pItemInfo = NULL; } - // ɼ ִٸ, - // ɼ ɷġ ÷ش. + // ¾ÆÀÌÅÛÀÌ ¿É¼ÇÀ» °¡Áö°í ÀÖ´Ù¸é, + // ¿É¼ÇÀÇ Á¾·ù¿¡ µû¶ó¼­ ´É·ÂÄ¡ Á¦ÇÑÀ» ¿Ã·ÁÁØ´Ù. int maxOptionLevel = max(1, min(100, (int)(CSUM / 3))); const vector& optionVector = @@ -1202,15 +1202,15 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in cout << endl; */ - // Total OptionRatio Ѵ. + // Total OptionRatio¸¦ ±¸ÇÑ´Ù. int itemOptionRatio = g_pOptionInfoManager->getTotalGambleRatio((Item::ItemClass)itemClass, maxOptionLevel); if (optionVector.size() > 0 && itemOptionRatio > 0 && (pItemInfo == NULL || !pItemInfo->isUnique())) { - // 10 . + // 10¹ø¸¸ µ¹·Áº»´Ù. int i = 10; do { - // random option Ѵ. + // randomÀ¸·Î optionÀ» ¼±ÅÃÇÑ´Ù. int optionRatio = random() % itemOptionRatio; int ratioSum = 0; @@ -1225,13 +1225,13 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in ratioSum += pOptionInfo->getRatio(); if (optionRatio < ratioSum) { - // option Ѵ. + // ÀÌ optionÀ» ¼±ÅÃÇÑ´Ù. // cout << "select : " << (int)optionType << endl; break; } } - // option 䱸 ɷġ ؼ + // optionÀÇ ¿ä±¸ ´É·ÂÄ¡¸¦ ´õÇØ¼­ if (ReqSTR != 0) ReqSTR = ReqSTR2 + (pOptionInfo->getReqSum() * 2); if (ReqDEX != 0) @@ -1253,9 +1253,9 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in // << "CDEX=" << CDEX << ", " // << "CINT=" << CINT << endl; - // player ɷġ ´ ȮѴ. + // playerÀÇ ´É·ÂÄ¡¿¡ ¸Â´Â ¾ÆÀÌÅÛÀÎÁö È®ÀÎÇÑ´Ù. if (CSTR >= ReqSTR && CDEX >= ReqDEX && CINT >= ReqINT && CSUM >= ReqSum) { - // option type Ѵ. + // ÀÌ option typeÀ¸·Î °áÁ¤ÇÑ´Ù. // cout << "OK!" << endl; break; } @@ -1266,22 +1266,22 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in optionType = 0; //(rand()%3==0? 1: (rand()%2? 6:11)); } } - // // Ѱ STR+1, DEX+1, INT+1 ߿ ϰų.. + // ¹«¿É // ÀûÀýÇÑ°Ô ¾øÀ¸¸é STR+1, DEX+1, INT+1 Áß¿¡¼­ ¾Ï°Å³ª.. else optionType = 0; //(rand()%3==0? 1: (rand()%2? 6:11)); } //---------------------------------------------------------------------- - // Vampire + // VampireÀÎ °æ¿ì //---------------------------------------------------------------------- else if (pCreature->isVampire()) { Vampire* pVampire = dynamic_cast(pCreature); Level_t CLevel = pVampire->getLevel(); - // gamble ִ Ѱ踦 . + // gambleÇÒ ¼ö ÀÖ´Â ÇѰ踦 Á» ´õ ³ôÇôº»´Ù. CLevel += 3; - // level + // levelÁ¦ÇÑ if (maxLevel != 0) { CLevel = min((int)maxLevel, (int)CLevel); } @@ -1290,19 +1290,19 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in Attr_t ReqGender; - // 10 . + // 10¹ø¸¸ µ¹·Áº»´Ù. int i = 10; do { itemType = pInfoClass->getRandomItemType(); - // itemType ص Ǵ level ȮѴ. + // ÀÌ itemTypeÀ» »ý¼ºÇصµ µÇ´Â levelÀÎÁö È®ÀÎÇÑ´Ù. pItemInfo = g_pItemInfoManager->getItemInfo(itemClass, itemType); ReqLevel2 = ReqLevel = pItemInfo->getReqLevel(); ReqGender = pItemInfo->getReqGender(); - // ų - // ¾ƾ Ѵ. + // ·¹º§ Á¦ÇÑÀÌ ¾ø°Å³ª Á¦ÇÑ ·¹º§ÀÌ ³ô°í + // ¼ºº°ÀÌ ¸Â¾Æ¾ß ÇÑ´Ù. if ((ReqLevel <= 0 || CLevel >= ReqLevel) && (ReqGender == GENDER_BOTH || pVampire->getSex() == MALE && ReqGender == GENDER_MALE || pVampire->getSex() == FEMALE && ReqGender == GENDER_FEMALE)) { @@ -1312,7 +1312,7 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in } while (--i); if (i == 0) { - // ⺻ item type ٸ. + // ¿©ÀÚÀÎ °æ¿ì´Â ±âº» item typeÀÌ ´Ù¸£´Ù. if (Item::ITEM_CLASS_VAMPIRE_COAT && pVampire->getSex() == FEMALE) { itemType = 1; } else { @@ -1320,15 +1320,15 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in } } - // ɼ ִٸ, - // ɼ ɷġ ÷ش. + // ¾ÆÀÌÅÛÀÌ ¿É¼ÇÀ» °¡Áö°í ÀÖ´Ù¸é, + // ¿É¼ÇÀÇ Á¾·ù¿¡ µû¶ó¼­ ´É·ÂÄ¡ Á¦ÇÑÀ» ¿Ã·ÁÁØ´Ù. int maxOptionLevel = max(1, min(100, (int)CLevel)); const vector& optionVector = g_pOptionInfoManager->getPossibleGambleOptionVector((Item::ItemClass)itemClass, maxOptionLevel); vector::const_iterator iOption; - // Total OptionRatio Ѵ. + // Total OptionRatio¸¦ ±¸ÇÑ´Ù. int itemOptionRatio = g_pOptionInfoManager->getTotalGambleRatio((Item::ItemClass)itemClass, maxOptionLevel); /* @@ -1344,11 +1344,11 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in if (optionVector.size() > 0 && itemOptionRatio > 0 && (pItemInfo == NULL || !pItemInfo->isUnique())) { - // 10 . + // 10¹ø¸¸ µ¹·Áº»´Ù. int i = 10; do { - // random option Ѵ. + // randomÀ¸·Î optionÀ» ¼±ÅÃÇÑ´Ù. int optionRatio = random() % itemOptionRatio; int ratioSum = 0; @@ -1363,17 +1363,17 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in ratioSum += pOptionInfo->getRatio(); if (optionRatio < ratioSum) { - // option Ѵ. + // ÀÌ optionÀ» ¼±ÅÃÇÑ´Ù. break; } } - // option 䱸 ɷġ ؼ + // optionÀÇ ¿ä±¸ ´É·ÂÄ¡¸¦ ´õÇØ¼­ ReqLevel = ReqLevel2 + pOptionInfo->getReqLevel(); - // player ɷġ ´ ȮѴ. + // playerÀÇ ´É·ÂÄ¡¿¡ ¸Â´Â ¾ÆÀÌÅÛÀÎÁö È®ÀÎÇÑ´Ù. if (ReqLevel <= 0 || CLevel >= ReqLevel) { - // option type Ѵ. + // ÀÌ option typeÀ¸·Î °áÁ¤ÇÑ´Ù. break; } @@ -1383,40 +1383,40 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in optionType = 0; //(rand()%3==0? 1: (rand()%2? 6:11)); } } - // ! // Ѱ STR+1, DEX+1, INT+1 ߿ ϰų.. + // ¹«¿É! // ÀûÀýÇÑ°Ô ¾øÀ¸¸é STR+1, DEX+1, INT+1 Áß¿¡¼­ ¾Ï°Å³ª.. else optionType = 0; //(rand()%3==0? 1: (rand()%2? 6:11)); } //---------------------------------------------------------------------- - // Ousters + // OustersÀÎ °æ¿ì //---------------------------------------------------------------------- else if (pCreature->isOusters()) { Ousters* pOusters = dynamic_cast(pCreature); Level_t CLevel = pOusters->getLevel(); - // gamble ִ Ѱ踦 . + // gambleÇÒ ¼ö ÀÖ´Â ÇѰ踦 Á» ´õ ³ôÇôº»´Ù. CLevel += 3; - // level + // levelÁ¦ÇÑ if (maxLevel != 0) { CLevel = min((int)maxLevel, (int)CLevel); } Attr_t ReqLevel, ReqLevel2; - // 10 . + // 10¹ø¸¸ µ¹·Áº»´Ù. int i = 10; do { itemType = pInfoClass->getRandomItemType(); - // itemType ص Ǵ level ȮѴ. + // ÀÌ itemTypeÀ» »ý¼ºÇصµ µÇ´Â levelÀÎÁö È®ÀÎÇÑ´Ù. pItemInfo = g_pItemInfoManager->getItemInfo(itemClass, itemType); ReqLevel2 = ReqLevel = pItemInfo->getReqLevel(); - // ų - // ¾ƾ Ѵ. + // ·¹º§ Á¦ÇÑÀÌ ¾ø°Å³ª Á¦ÇÑ ·¹º§ÀÌ ³ô°í + // ¼ºº°ÀÌ ¸Â¾Æ¾ß ÇÑ´Ù. if ((ReqLevel <= 0 || CLevel >= ReqLevel)) { break; } @@ -1427,15 +1427,15 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in itemType = 0; } - // ɼ ִٸ, - // ɼ ɷġ ÷ش. + // ¾ÆÀÌÅÛÀÌ ¿É¼ÇÀ» °¡Áö°í ÀÖ´Ù¸é, + // ¿É¼ÇÀÇ Á¾·ù¿¡ µû¶ó¼­ ´É·ÂÄ¡ Á¦ÇÑÀ» ¿Ã·ÁÁØ´Ù. int maxOptionLevel = max(1, min(100, (int)CLevel)); const vector& optionVector = g_pOptionInfoManager->getPossibleGambleOptionVector((Item::ItemClass)itemClass, maxOptionLevel); vector::const_iterator iOption; - // Total OptionRatio Ѵ. + // Total OptionRatio¸¦ ±¸ÇÑ´Ù. int itemOptionRatio = g_pOptionInfoManager->getTotalGambleRatio((Item::ItemClass)itemClass, maxOptionLevel); /* @@ -1451,11 +1451,11 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in if (optionVector.size() > 0 && itemOptionRatio > 0 && (pItemInfo == NULL || !pItemInfo->isUnique())) { - // 10 . + // 10¹ø¸¸ µ¹·Áº»´Ù. int i = 10; do { - // random option Ѵ. + // randomÀ¸·Î optionÀ» ¼±ÅÃÇÑ´Ù. int optionRatio = random() % itemOptionRatio; int ratioSum = 0; @@ -1470,17 +1470,17 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in ratioSum += pOptionInfo->getRatio(); if (optionRatio < ratioSum) { - // option Ѵ. + // ÀÌ optionÀ» ¼±ÅÃÇÑ´Ù. break; } } - // option 䱸 ɷġ ؼ + // optionÀÇ ¿ä±¸ ´É·ÂÄ¡¸¦ ´õÇØ¼­ ReqLevel = ReqLevel2 + pOptionInfo->getReqLevel(); - // player ɷġ ´ ȮѴ. + // playerÀÇ ´É·ÂÄ¡¿¡ ¸Â´Â ¾ÆÀÌÅÛÀÎÁö È®ÀÎÇÑ´Ù. if (ReqLevel <= 0 || CLevel >= ReqLevel) { - // option type Ѵ. + // ÀÌ option typeÀ¸·Î °áÁ¤ÇÑ´Ù. break; } @@ -1490,12 +1490,12 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in optionType = 0; //(rand()%3==0? 1: (rand()%2? 6:11)); } } - // ! // Ѱ STR+1, DEX+1, INT+1 ߿ ϰų.. + // ¹«¿É! // ÀûÀýÇÑ°Ô ¾øÀ¸¸é STR+1, DEX+1, INT+1 Áß¿¡¼­ ¾Ï°Å³ª.. else optionType = 0; //(rand()%3==0? 1: (rand()%2? 6:11)); } - // item ؼ Ѱش. + // itemÀ» »ý¼ºÇؼ­ ³Ñ°ÜÁØ´Ù. list optionTypes; if (optionType != 0) optionTypes.push_back(optionType); @@ -1509,7 +1509,7 @@ Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, in } ////////////////////////////////////////////////////////////////////////////// -// ɼ ִ ΰ? +// ¿É¼ÇÀÌ ºÙÀ» ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀΰ¡? ////////////////////////////////////////////////////////////////////////////// bool isPossibleOptionItemClass(Item::ItemClass IClass) { switch (IClass) { @@ -1568,7 +1568,7 @@ bool isPossibleOptionItemClass(Item::ItemClass IClass) { } ////////////////////////////////////////////////////////////////////////////// -// ܰ ׷̵ ִ ItemTypeΰ +// ´ÙÀ½ ´Ü°è·Î ¾÷±×·¹À̵åµÉ ¼ö ÀÖ´Â ItemTypeÀΰ¡ ////////////////////////////////////////////////////////////////////////////// bool isPossibleUpgradeItemType(Item::ItemClass IClass) { switch (IClass) { @@ -1625,7 +1625,7 @@ ItemType_t getUpgradeItemType(Item::ItemClass IClass, ItemType_t itemType, ItemT InfoClassManager* pInfoClass = g_pItemInfoManager->getInfoManager(IClass); Assert(pInfoClass != NULL); - // ׷̵ DB . ⼭ ־ ȸŭ ItemType Űܰ. + // ¾ÆÀÌÅÛ ¾÷±×·¹À̵å Á¤º¸°¡ DB¿¡ µé¾î°£´Ù. ¿©±â¼­´Â ÁÖ¾îÁø ȸ¼ö¸¸Å­ ´ÙÀ½ ItemTypeÀ¸·Î ¿Å°Ü°£´Ù. ItemType_t newItemType = itemType; for (int i = 0; i < upgradeCount; i++) { @@ -1639,7 +1639,7 @@ ItemType_t getUpgradeItemType(Item::ItemClass IClass, ItemType_t itemType, ItemT /* int maxItemType = pInfoClass->getInfoCount()-1; - // ̹ ְ + // ÀÌ¹Ì ÃÖ°í ¾ÆÀÌÅÛÀÎ °æ¿ì if (itemType==maxItemType) { //cout << itemType << "(max)" << endl; @@ -1648,7 +1648,7 @@ ItemType_t getUpgradeItemType(Item::ItemClass IClass, ItemType_t itemType, ItemT int itemTypeGap = 1; - // ܰ 2ܰ辿 Ǿ ִ + // ¾ÆÀÌÅÛ ´Ü°è ¼ø¼­°¡ 2´Ü°è¾¿ µÇ¾î ÀÖ´Â ¾ÆÀÌÅÛ if (IClass==Item::ITEM_CLASS_COAT || IClass==Item::ITEM_CLASS_TROUSER || IClass==Item::ITEM_CLASS_VAMPIRE_COAT) @@ -1658,17 +1658,17 @@ ItemType_t getUpgradeItemType(Item::ItemClass IClass, ItemType_t itemType, ItemT int newItemType = min(maxItemType, itemType + upgradeCount*itemTypeGap); - // 2ܰ辿 dzʶ + // 2´Ü°è¾¿ °Ç³Ê¶ç¾î¾ßÇÒ °æ¿ì if (itemTypeGap==2 && (itemType & 0x01)!=(newItemType & 0x01)) newItemType -= 1; - // ְ ũ ִµ.. ̰ .. + // ÃÖ°í ¾ÆÀÌÅÛÀÌ À¯´ÏÅ©ÀÏ ¼öµµ Àִµ¥.. ÀÌ°Ç »©ÁÖÀÚ.. while (newItemType > itemType) { ItemInfo* pItemInfo = pInfoClass->getItemInfo( newItemType ); Assert(pItemInfo!=NULL); - // ũ.. ܰ辿 ش. + // À¯´ÏÅ©¶ó¸é.. ÇÑ ´Ü°è¾¿ ³·ÃçÁØ´Ù. if (pItemInfo->isUnique()) newItemType-=itemTypeGap; else break; } @@ -1695,9 +1695,9 @@ ItemType_t getDowngradeItemType(Item::ItemClass IClass, ItemType_t itemType) { /* ////////////////////////////////////////////////////////////////////////////// -// ũ Ʈ ̺Ʈ +// Å©¸®½º¸¶½º Æ®¸® À̺¥Æ®¿ë ////////////////////////////////////////////////////////////////////////////// -// Ʈ ˻ +// Æ®¸® Á¶°¢À» °Ë»ö TPOINT checkEventTree( PlayerCreature* pPC, CoordInven_t iX, CoordInven_t iY ) { __BEGIN_TRY @@ -1727,7 +1727,7 @@ TPOINT checkEventTree( PlayerCreature* pPC, CoordInven_t iX, CoordInven_t iY ) CoordInven_t curIX = 0, curIY = 0; ItemType_t compType = 0; - // Ʈ ִ ȮѴ. + // Æ®¸® Á¶°¢ÀÌ Á¦´ë·Î ¸ÂÃçÁ® ÀÖ´ÂÁö È®ÀÎÇÑ´Ù. for ( curIY = startY; curIY < startY + 4; curIY++ ) { for ( curIX = startX; curIX < startX + 3; curIX++ ) @@ -1752,7 +1752,7 @@ TPOINT checkEventTree( PlayerCreature* pPC, CoordInven_t iX, CoordInven_t iY ) __END_CATCH } -// 빮 +// °í´ë¹®Çå TPOINT checkEventDocument( PlayerCreature* pPC, CoordInven_t iX, CoordInven_t iY ) { __BEGIN_TRY @@ -1771,7 +1771,7 @@ TPOINT checkEventDocument( PlayerCreature* pPC, CoordInven_t iX, CoordInven_t iY ItemType_t itemType = pCurItem->getItemType(); - // 빮 13 Ѵ + // °í´ë¹®Çå Á¶°¢Àº 13ºÎÅÍ ½ÃÀÛÇÑ´Ù itemType = itemType - 13; CoordInven_t startX = iX - itemType % 3; @@ -1784,10 +1784,10 @@ TPOINT checkEventDocument( PlayerCreature* pPC, CoordInven_t iX, CoordInven_t iY CoordInven_t curIX = 0, curIY = 0; - // 빮 13 Ѵ + // °í´ë¹®Çå Á¶°¢Àº 13ºÎÅÍ ½ÃÀÛÇÑ´Ù ItemType_t compType = 13; - // ִ ȮѴ. + // °í´ë ¹«Çå Á¶°¢ÀÌ Á¦´ë·Î ¸ÂÃçÁ® ÀÖ´ÂÁö È®ÀÎÇÑ´Ù. for ( curIY = startY; curIY < startY + 4; curIY++ ) { for ( curIX = startX; curIX < startX + 3; curIX++ ) @@ -1812,8 +1812,8 @@ TPOINT checkEventDocument( PlayerCreature* pPC, CoordInven_t iX, CoordInven_t iY __END_CATCH } -// -_-;; ̰ Ϲȭ ݹ ų ;; ڸ ϳ ޵ ϸ -_-; -// 㿡 Ʈ Ϲȭ Ű . .a +// ÀÎÇü -_-;; À̰ŠÀϹÝÈ­ ±Ý¹æ ½Ãų °Í °°Àºµ¥ ;; ÀÎÀÚ¸¸ Çϳª ´õ ¹Þµµ·Ï Çϸé -_-; +// ´ã¿¡ Äù½ºÆ® ¶§´Â ÀϹÝÈ­ ½Ã۵µ·Ï ÇÏÀÚ. ¤Ñ.¤Ña TPOINT checkEventDoll( PlayerCreature* pPC, CoordInven_t iX, CoordInven_t iY ) { __BEGIN_TRY @@ -1832,7 +1832,7 @@ TPOINT checkEventDoll( PlayerCreature* pPC, CoordInven_t iX, CoordInven_t iY ) ItemType_t itemType = pCurItem->getItemType(); - // 29 Ѵ + // ÀÎÇü Á¶°¢Àº 29ºÎÅÍ ½ÃÀÛÇÑ´Ù itemType = itemType - 29; CoordInven_t startX = iX - itemType % 3; @@ -1845,10 +1845,10 @@ TPOINT checkEventDoll( PlayerCreature* pPC, CoordInven_t iX, CoordInven_t iY ) CoordInven_t curIX = 0, curIY = 0; - // 29 Ѵ + // ÀÎÇü Á¶°¢Àº 29ºÎÅÍ ½ÃÀÛÇÑ´Ù ItemType_t compType = 29; - // ִ ȮѴ. + // °í´ë ¹«Çå Á¶°¢ÀÌ Á¦´ë·Î ¸ÂÃçÁ® ÀÖ´ÂÁö È®ÀÎÇÑ´Ù. for ( curIY = startY; curIY < startY + 4; curIY++ ) { for ( curIX = startX; curIX < startX + 3; curIX++ ) @@ -1874,7 +1874,7 @@ TPOINT checkEventDoll( PlayerCreature* pPC, CoordInven_t iX, CoordInven_t iY ) } */ -// Ϲȭ Ų checkEventTree checkEventDocument checkEventDoll +// ÀϹÝÈ­ ½ÃŲ °Å checkEventTree ¶û checkEventDocument ¶û checkEventDoll Àº Áö¿ìÀÚ TPOINT checkEventPuzzle(PlayerCreature* pPC, CoordInven_t iX, CoordInven_t iY, int start) { __BEGIN_TRY @@ -1927,7 +1927,7 @@ TPOINT checkEventPuzzle(PlayerCreature* pPC, CoordInven_t iX, CoordInven_t iY, i __END_CATCH } -// κ丮 (X0, Y0) - (X1, y1) . +// Àκ¥Å丮ÀÇ (X0, Y0) - (X1, y1) ¹üÀ§ÀÇ ¾ÆÀÌÅÛÀ» Áö¿î´Ù. void deleteInventoryItem(Inventory* pInventory, CoordInven_t invenX0, CoordInven_t invenY0, CoordInven_t invenX1, CoordInven_t invenY1) { __BEGIN_TRY @@ -1935,16 +1935,16 @@ void deleteInventoryItem(Inventory* pInventory, CoordInven_t invenX0, CoordInven CoordInven_t curIX = 0, curIY = 0; Item* pCurItem = 0; - // Ʈ . + // ¸ÂÃçÁø Æ®¸® Á¶°¢À» Áö¿î´Ù. for (curIY = invenY0; curIY <= invenY1; curIY++) { for (curIX = invenX0; curIX <= invenX1; curIX++) { pCurItem = pInventory->getItem(curIX, curIY); if (pCurItem != NULL) { - // κ丮 . + // Àκ¥Å丮¿¡¼­ Áö¿î´Ù. pInventory->deleteItem(pCurItem->getObjectID()); - // DB . + // DB ¿¡¼­ ³¯¸°´Ù. pCurItem->destroy(); SAFE_DELETE(pCurItem); @@ -1972,7 +1972,7 @@ const NewbieItem NewbieItems[maxNewbieItemNum] = { {Item::ITEM_CLASS_POTION, 0, 9, 4, 9}, {Item::ITEM_CLASS_POTION, 5, 9, 5, 9}, }; -// κ丮 ʺڿ ־ش. +// Àκ¥Å丮¿¡ Ãʺ¸ÀÚ¿ë ¾ÆÀÌÅÛÀ» ³Ö¾îÁØ´Ù. bool addNewbieItemToInventory(Slayer* pSlayer, bool sendPacket) { @@ -2264,7 +2264,7 @@ void makeOptionList(const string& options, list& optionList) try { optionType = g_pOptionInfoManager->getOptionType(optionName); } catch (NoSuchElementException&) { - throw Error("׷ ɼ ܴ."); + throw Error("±×·± ¿É¼ÇÀÌ ¾ø´Ü´Ù."); } optionList.push_back(optionType); @@ -2282,11 +2282,11 @@ void saveDissectionItem(Creature* pCreature, Item* pTreasure, int x, int y) Assert(pCreature != NULL); Assert(pTreasure != NULL); - // relic ƴ 츸.. DB Ѵ. - // ̹ DB Ƿ DB Ʈش. + // relicÀÌ ¾Æ´Ñ °æ¿ì¸¸.. DB¿¡ ¾ÆÀÌÅÛÀ» »ý¼ºÇÑ´Ù. + // ÇÇÀÇ ¼º¼­ÀÏ °æ¿ì ÀÌ¹Ì DB¿¡ ÀÖÀ¸¹Ç·Î DB¸¦ ¾÷µ¥ÀÌÆ®ÇØÁØ´Ù. switch (pTreasure->getItemClass()) { case Item::ITEM_CLASS_RELIC: { - // Relic DB ʿ . + // RelicÀº DB¿¡ ÀúÀåÇÒ ÇÊ¿ä ¾ø´Ù. } break; case Item::ITEM_CLASS_BLOOD_BIBLE: @@ -2303,16 +2303,16 @@ void saveDissectionItem(Creature* pCreature, Item* pTreasure, int x, int y) ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo(pTreasure->getItemClass(), pTreasure->getItemType()); Assert(pItemInfo != NULL); - // ũ - // ü ũ ְ - // DB ũ ش. + // À¯´ÏÅ© ¾ÆÀÌÅÛÀÎ °æ¿ì´Â + // ¾ÆÀÌÅÛ ÀÚü¿¡ À¯´ÏÅ© ¼³Á¤À» ÇØÁÖ°í + // DB¿¡ À¯´ÏÅ© ¾ÆÀÌÅÛÀÇ °³¼ö¸¦ º¯°æ½ÃÄÑÁØ´Ù. // - // (*) Ͱ ׾ , - // ȿ ִ ۿ ũ ϰ - // DB Ѵ. ׷, ٶ Ѵ. - // ũ ͸ ؼ Ÿ - // CGDissectionCorpse ؼ (!)ǰ - // EffectDecayItem ؼ ŵȴ. + // (*) ¸ó½ºÅͰ¡ Á×¾úÀ» ¶§, + // ¸ó½ºÅÍ ¾È¿¡ ÀÖ´Â ¾ÆÀÌÅÛ¿¡´Â À¯´ÏÅ© ¼³Á¤µµ ¾ÈÇϰí + // DB¿¡µµ °³¼ö º¯°æÀ» ¾ÈÇÑ´Ù. ±×·¡¼­, Áö¿öÁÙ¶§µµ ¹«½ÃÇÑ´Ù. + // ÇöÀç À¯´ÏÅ© ¾ÆÀÌÅÛÀº ¸ó½ºÅ͸¦ ÅëÇØ¼­¸¸ ³ªÅ¸³ª°í + // CGDissectionCorpse¸¦ ÅëÇØ¼­ »ý¼º(!)µÇ°í + // EffectDecayItemÀ» ÅëÇØ¼­¸¸ Á¦°ÅµÈ´Ù. if (pItemInfo->isUnique()) { pTreasure->setUnique(); @@ -2321,8 +2321,8 @@ void saveDissectionItem(Creature* pCreature, Item* pTreasure, int x, int y) pTreasure->toString().c_str()); } - // ItemID ״ Ѵ. - // ItemID 0̸.. create()Ҷ ٽ ItemID ޴´. + // ±âÁ¸ÀÇ ItemID¸¦ ±×´ë·Î À¯ÁöÇÑ´Ù. + // ItemID°¡ 0À̸é.. create()ÇÒ¶§ ´Ù½Ã ItemID¸¦ ¹Þ´Â´Ù. // by sigi. 2002.10.28 pTreasure->create("", STORAGE_ZONE, pCreature->getZone()->getZoneID(), x, y, pTreasure->getItemID()); } @@ -2381,7 +2381,7 @@ bool canSell(Item* pItem) { return false; if (pItem->isFlagItem()) return false; - // Ʈ 50 ִ. + // Äù½ºÆ® ¾ÆÀÌÅÛÀº 50¿ø¿¡ ÆÈ ¼ö ÀÖ´Ù. // if ( pItem->isTimeLimitItem() ) return false; Item::ItemClass itemClass = pItem->getItemClass(); @@ -2395,7 +2395,7 @@ bool canSell(Item* pItem) { if (itemClass == Item::ITEM_CLASS_SWEEPER) return false; - // edit by coffee 2007-7-7 ޸Ʒ Ϊɳ + // edit by coffee 2007-7-7 ÐÞ¸ÄÈÎÎñÎïÆ· ÉúÃüÂÝÐýΪ¿É³öÊÛ if (itemClass == Item::ITEM_CLASS_EVENT_ITEM && pItem->getItemType() == 31) return true; @@ -2458,11 +2458,11 @@ bool canTrade(Item* pItem) { if (itemClass == Item::ITEM_CLASS_SWEEPER) return false; - // ݴ ī Ʈ̵ . + // ¹Ý´Þ Ä«µå´Â Æ®·¹À̵å ÇÒ ¼ö ¾ø´Ù. if (itemClass == Item::ITEM_CLASS_MOON_CARD && pItem->getItemType() == 0) return false; - // ̾ ü -_- + // ÇÁ¸®¹Ì¾ö üÇè±Ç Á¶°¢ -_- if (itemClass == Item::ITEM_CLASS_LUCKY_BAG && pItem->getItemType() == 3) return false; if (itemClass == Item::ITEM_CLASS_EVENT_ITEM && pItem->getItemType() == 28) @@ -2470,11 +2470,11 @@ bool canTrade(Item* pItem) { if (itemClass == Item::ITEM_CLASS_EFFECT_ITEM && pItem->getItemType() >= 4 && pItem->getItemType() <= 6) return false; - // ̺Ʈ ȯ Ұ. + // À̺¥Æ® ¶±±¹Àº ±³È¯ ºÒ°¡. if (itemClass == Item::ITEM_CLASS_EVENT_STAR && (itemType >= 17 && itemType <= 21)) return false; - // ȯ Ұ + // º¹Á¶¸® ¾ÆÀÌÅÛ ±³È¯ ºÒ°¡ if (itemClass == Item::ITEM_CLASS_MIXING_ITEM && itemType == 18) return false; @@ -2552,15 +2552,15 @@ void setItemGender(Item* pItem, GenderRestriction gender) { bool bTraceLog(Item* pItem) { Item::ItemClass iClass = pItem->getItemClass(); - // PetItem + // PetItem Àº ¹«Á¶°Ç ³²±ä´Ù if (iClass == Item::ITEM_CLASS_PET_ITEM || iClass == Item::ITEM_CLASS_CORE_ZAP) return true; - // Ķ ̶ + // Æ÷¼ÇÀÇ ÆÄ¶õ »çÅÁÀ̶û Èò»ö ¶±±¹Àº ³²±ä´Ù if (iClass == Item::ITEM_CLASS_POTION && (pItem->getItemType() == 10 || pItem->getItemType() == 11)) return true; - // Serum + // Serum ¿¡ »¡°£ »çÅÁÀº ³²±ä´Ù if (iClass == Item::ITEM_CLASS_SERUM && (pItem->getItemType() == 4 || pItem->getItemType() == 5)) return true; @@ -2593,7 +2593,7 @@ bool bTraceLog(Item* pItem) { const list& optionList = pItem->getOptionTypeList(); list::const_iterator itr; - // ɼ ִ + // ÀúÇ× ¿É¼ÇÀÌ ÀÖ´Â °Ç ±â·Ï ³²±ä´Ù for (itr = optionList.begin(); itr != optionList.end(); itr++) { OptionInfo* pOptionInfo = g_pOptionInfoManager->getOptionInfo(*itr); if (pOptionInfo == NULL) @@ -2606,13 +2606,13 @@ bool bTraceLog(Item* pItem) { return true; } - // Ʈ - // Event Star + // ºñÁê¶û Ææ´øÆ®´Â ±â·Ï ³²±ä´Ù + // Event Star ´Â ±â·Ï ³²±ä´Ù if (iClass == Item::ITEM_CLASS_QUEST_ITEM || iClass == Item::ITEM_CLASS_EVENT_STAR || iClass == Item::ITEM_CLASS_MIXING_ITEM) return true; - // 3 ϴ ʴ´ + // ±× ¿ÜÀÇ ¾ÆÀÌÅÛÀÎ °æ¿ì 3´Ü ÀÌÇÏ´Â ±â·Ï ³²±âÁö ¾Ê´Â´Ù if ((int)(pItem->getItemType()) < 3) return false; @@ -2709,11 +2709,11 @@ void remainMoneyTraceLog(const string& preOwner, const string& owner, ItemTraceL __END_CATCH } -// Web Լ +// Web ¿¡¼­ »ê ¾ÆÀÌÅÛÀ» ¸¸µå´Â ÇÔ¼ö Item* createItemByGoodsID(DWORD goodsID) { GoodsInfo* pGoodsInfo = g_pGoodsInfoManager->getGoodsInfo(goodsID); if (pGoodsInfo == NULL) { - filelog("buyItemBug.txt", "buyID(%d) شϴ ǰ ϴ.", (int)goodsID); + filelog("buyItemBug.txt", "buyID(%d) ¿¡ ÇØ´çÇÏ´Â »óǰÀÌ ¾ø½À´Ï´Ù.", (int)goodsID); return NULL; } @@ -2726,13 +2726,13 @@ Item* createItemByGoodsID(DWORD goodsID) { int Hour = pGoodsInfo->getHour(); if (!g_pItemInfoManager->isPossibleItem(ItemClass, ItemType, optionTypeList)) { - filelog("buyItemBug.txt", "buyID(%d) شϴ ϴ.", (int)goodsID); + filelog("buyItemBug.txt", "buyID(%d) ¿¡ ÇØ´çÇÏ´Â ¾ÆÀÌÅÛÀº ¸¸µé ¼ö ¾ø½À´Ï´Ù.", (int)goodsID); return NULL; } Item* pItem = g_pItemFactoryManager->createItem(ItemClass, ItemType, optionTypeList); if (pItem == NULL) { - filelog("buyItemBug.txt", "buyID(%d) شϴ ⿡ ߽ϴ.", (int)goodsID); + filelog("buyItemBug.txt", "buyID(%d) ¿¡ ÇØ´çÇÏ´Â ¾ÆÀÌÅÛ ¸¸µé±â¿¡ ½ÇÆÐÇß½À´Ï´Ù.", (int)goodsID); return NULL; } @@ -2750,7 +2750,7 @@ Item* createItemByGoodsID(DWORD goodsID) { PetTypeInfo* pPetTypeInfo = PetTypeInfoManager::getInstance()->getPetTypeInfo(petType); PetExpInfo* pPetExpInfo = PetExpInfoManager::Instance().getPetExpInfo(48); // modify by viva for PetInfo if (pPetTypeInfo == NULL || pPetExpInfo == NULL) { - filelog("buyItemBug.txt", "buyID(%d) شϴ ̻մϴ.", (int)goodsID); + filelog("buyItemBug.txt", "buyID(%d) ¿¡ ÇØ´çÇÏ´Â Æê ¾ÆÀÌÅÛ Á¤º¸°¡ ÀÌ»óÇÕ´Ï´Ù.", (int)goodsID); SAFE_DELETE(pItem); return NULL; } @@ -2771,7 +2771,7 @@ Item* createItemByGoodsID(DWORD goodsID) { pPetInfo->setPetHP(5760); pPetInfo->setFeedTime(VSDateTime::currentDateTime()); - // ũ + // ¾ç¹æÇâ ¸µÅ© pPetItem->setPetInfo(pPetInfo); pPetInfo->setPetItem(pPetItem); } @@ -2964,12 +2964,12 @@ ItemType_t getItemTypeByItemLimit(Item::ItemClass itemClass, ItemType_t itemType ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo(itemClass, rItemType); - // ܻ. н + // ¿¹¿Ü»çÇ×. ¾ÆÀÌÅÛ ·¹º§ÀÌ ¾ø´Â ¾ÆÀÌÅÛÀÏ °æ¿ì ÆÐ½º if (pItemInfo->getItemLevel() == 99 || pItemInfo->getItemLevel() == 255) { return true; } - int counter = 0; // ī. ѷ η~ + int counter = 0; // ¸¸¾àÀÇ ¸¸¾àÀ» À§ÇÑ Ä«¿îÅÍ. ¹«ÇÑ·çÇÁ°¡ µÎ·Á¿ö~ // cout << "i. ItemLevel : " << pItemInfo->getItemLevel() << endl; diff --git a/src/server/gameserver/ItemUtil.h b/src/server/gameserver/ItemUtil.h index 421252ea..9b6e2a27 100644 --- a/src/server/gameserver/ItemUtil.h +++ b/src/server/gameserver/ItemUtil.h @@ -25,54 +25,54 @@ class Corpse; struct ITEM_TEMPLATE; enum ItemTraceLogType { - ITEM_LOG_CREATE = 0, // α - ITEM_LOG_TRADE, // TRADE α - ITEM_LOG_MOVE, // ̵ α - ITEM_LOG_DELETE, // α + ITEM_LOG_CREATE = 0, // 아이템 생성에 대한 로그 + ITEM_LOG_TRADE, // 아이템 TRADE 에 대한 로그 + ITEM_LOG_MOVE, // 아이템 이동에 대한 로그 + ITEM_LOG_DELETE, // 아이템 삭제에 대한 로그 ITEM_LOG_MAX }; enum ItemTraceDetailType { - DETAIL_COMMAND = 0, // command ɾ : ITEM_LOG_CREATE - DETAIL_SHOPBUY, // : ITEM_LOG_CREATE - DETAIL_PICKUP, // ٴڿ ֿ : ITEM_LOG_MOVE - DETAIL_DROP, // ٴڿ : ITEM_LOG_MOVE - DETAIL_EVENTNPC, // ̺Ʈ : ITEM_LOG_CREATE - DETAIL_SHOPSELL, // : ITEM_LOG_DELETE - DETAIL_TIMEOUT, // ٴڿ timeout : ITEM_LOG_DELETE - DETAIL_ENCHANT, // þƮ : ITEM_LOG_DELETE - DETAIL_OPCLEAR, // commnad : ITEM_LOG_DELETE - DETAIL_TRADE, // TRADE : ITEM_LOG_TRADE - DETAIL_MALLBUY, // : ITEM_LOG_CREATE + DETAIL_COMMAND = 0, // command 명령어로 생성 : ITEM_LOG_CREATE + DETAIL_SHOPBUY, // 상점에서 산 경우 : ITEM_LOG_CREATE + DETAIL_PICKUP, // 바닥에서 물건 주웠을 경우 : ITEM_LOG_MOVE + DETAIL_DROP, // 바닥에 버린 경우 : ITEM_LOG_MOVE + DETAIL_EVENTNPC, // 이벤트로 생긴 아이템 : ITEM_LOG_CREATE + DETAIL_SHOPSELL, // 상점에 물건 판 경우 : ITEM_LOG_DELETE + DETAIL_TIMEOUT, // 바닥에 떨어진 후 timeout 으로 사라진 경우 : ITEM_LOG_DELETE + DETAIL_ENCHANT, // 인첸트로 변경된 경우 : ITEM_LOG_DELETE + DETAIL_OPCLEAR, // commnad 로 삭제 : ITEM_LOG_DELETE + DETAIL_TRADE, // 아이템 TRADE : ITEM_LOG_TRADE + DETAIL_MALLBUY, // 웹에서 산 아이템 : ITEM_LOG_CREATE DETAIL_MAX }; enum ITLType { - ITL_GET = 0, // GET - ITL_DROP, // DROP - ITL_ETC, // ETC + ITL_GET = 0, // 아이템 GET + ITL_DROP, // 아이템 DROP + ITL_ETC, // 아이템 ETC ITL_MAX }; enum ITLDType { - ITLD_PICKUP = 0, // PICKUP GET - ITLD_TRADE, // TRADE GET/DROP - ITLD_EVENTNPC, // ̺Ʈ clearϰ NPC ޴ GET + ITLD_PICKUP = 0, // 아이템 PICKUP GET + ITLD_TRADE, // 아이템 TRADE GET/DROP + ITLD_EVENTNPC, // 이벤트를 clear하고 NPC에게 받는 아이템 GET ITLD_PETITEM, // GET ITLD_ENCHANT, // GET/DROP ITLD_MIXING, // GET/DROP ITLD_OPTION, // GET/DROP/ETC - ITLD_NPCSHOP, // NPC ŷ GET/DROP - ITLD_WEBSHOP, // Ͽ ŷ GET - ITLD_PRIVATESHOP, // λ GET/DROP + ITLD_NPCSHOP, // NPC샵에서 거래 GET/DROP + ITLD_WEBSHOP, // 웹마켓에서의 거래 GET + ITLD_PRIVATESHOP, // 개인상점에서 GET/DROP - ITLD_GM, // Ӹ ACTION GET/DROP/MOVE/ETC - ITLD_TIMEOUT, // Timeƿ DROP - ITLD_DELETE, // Delete // ETC+DELETE ״. + ITLD_GM, // 게임마스터의 ACTION GET/DROP/MOVE/ETC + ITLD_TIMEOUT, // Time아웃 DROP + ITLD_DELETE, // Delete // ETC+DELETE 의 경우는 없을테다. ITLD_MOVE, // Mode GET/DROP/ETC ITLD_MAX @@ -126,26 +126,26 @@ const string ITLDType2String[] = { }; ////////////////////////////////////////////////////////////////////////////// -// ִ ΰ? +// 쌓일 수 있는 아이템인가? ////////////////////////////////////////////////////////////////////////////// bool isStackable(Item::ItemClass IClass); bool isStackable(const Item* pItem); ////////////////////////////////////////////////////////////////////////////// -// Ŭ, Ÿ ΰ? +// 같은 클래스, 타입의 아이템인가? ////////////////////////////////////////////////////////////////////////////// bool isSameItem(Item::ItemClass IClass1, Item::ItemClass IClass2, ItemType_t type1, ItemType_t type2); bool isSameItem(const Item* pItem1, const Item* pItem2); ////////////////////////////////////////////////////////////////////////////// -// ִ°? +// 두 아이템을 쌓을 수 있는가? ////////////////////////////////////////////////////////////////////////////// bool canStack(const Item* pItem1, const Item* pItem2); ////////////////////////////////////////////////////////////////////////////// -// ΰ? -// ΰ? -// ,, ΰ? +// 두 손 무기인가? +// 접근전 무기인가? +// 전사,군인, 성직자 무기인가? ////////////////////////////////////////////////////////////////////////////// bool isTwohandWeapon(const Item* pItem); bool isMeleeWeapon(const Item* pItem); @@ -154,12 +154,12 @@ bool isArmsWeapon(const Item* pItem); bool isClericWeapon(const Item* pItem); ////////////////////////////////////////////////////////////////////////////// -// ѿ ´ źâΰ? +// 총에 맞는 탄창인가? ////////////////////////////////////////////////////////////////////////////// bool isSuitableMagazine(const Item* pGun, const Item* pMagazine, bool hasVivid); ////////////////////////////////////////////////////////////////////////////// -// ̾ ΰ? +// 슬레이어용 무기인가? ////////////////////////////////////////////////////////////////////////////// bool isSlayerWeapon(Item::ItemClass IClass); bool isAdvancedSlayerWeapon(Item::ItemClass IClass); @@ -167,97 +167,97 @@ bool isVampireWeapon(Item::ItemClass IClass); bool isOustersWeapon(Item::ItemClass IClass); ////////////////////////////////////////////////////////////////////////////// -// ̾ ΰ? +// 슬레이어용 방어구인가? ////////////////////////////////////////////////////////////////////////////// bool isSlayerArmor(Item::ItemClass IClass); bool isVampireArmor(Item::ItemClass IClass); bool isOustersArmor(Item::ItemClass IClass); ////////////////////////////////////////////////////////////////////////////// -// ̾ Ǽ縮ΰ? +// 슬레이어용 악세사리인가? ////////////////////////////////////////////////////////////////////////////// bool isSlayerAccessory(Item::ItemClass IClass); bool isVampireAccessory(Item::ItemClass IClass); bool isOustersAccessory(Item::ItemClass IClass); ////////////////////////////////////////////////////////////////////////////// -// ִ ΰ? +// 수리할 수 있는 아이템인가? ////////////////////////////////////////////////////////////////////////////// bool isRepairableItem(const Item* pItem); ////////////////////////////////////////////////////////////////////////////// -// Ѵ. +// 아이템을 수리한다. ////////////////////////////////////////////////////////////////////////////// void repairItem(Item* pItem); ////////////////////////////////////////////////////////////////////////////// -// ִ . +// 아이템의 최대 내구도를 얻어낸다. ////////////////////////////////////////////////////////////////////////////// Durability_t computeMaxDurability(Item* pItem); ////////////////////////////////////////////////////////////////////////////// -// źâ Ƴش. +// 탄창을 갈아끼워준다. ////////////////////////////////////////////////////////////////////////////// Bullet_t reloadArmsItem(Item* pWeapon, Item* pMagazine); ////////////////////////////////////////////////////////////////////////////// -// Ѿ ش. +// 총알을 빼준다. ////////////////////////////////////////////////////////////////////////////// Bullet_t decreaseBullet(Item* pWeapon); ////////////////////////////////////////////////////////////////////////////// -// Ѿ +// 남은 총알의 갯수를 리턴 ////////////////////////////////////////////////////////////////////////////// Bullet_t getRemainBullet(Item* pWeapon); ////////////////////////////////////////////////////////////////////////////// -// ִ ΰ? +// 주을 수 있는 아이템인가? ////////////////////////////////////////////////////////////////////////////// bool isPortableItem(Item* pItem); ////////////////////////////////////////////////////////////////////////////// -// ִ ΰ? -// ⼭ ̶, ؼ Ҹ Ѵ. +// 사용할 수 있는 아이템인가? +// 여기서의 사용이란, 사용해서 사라지는 소모성 아이템을 말한다. ////////////////////////////////////////////////////////////////////////////// bool isUsableItem(Item* pItem, Creature* pUser); ////////////////////////////////////////////////////////////////////////////// -// ڸ δ. +// 아이템의 숫자를 줄인다. ////////////////////////////////////////////////////////////////////////////// ItemNum_t decreaseItemNum(Item* pItem, Inventory* pInventory, const string& OwnerID, Storage storage, StorageID_t storageID, BYTE x, BYTE y); ////////////////////////////////////////////////////////////////////////////// -// ġ ׸ αϴ Լ. +// 아이템이 겹치는 버그를 로그하는 함수다. ////////////////////////////////////////////////////////////////////////////// void processItemBug(Creature* pCreature, Item* pItem); void processItemBugEx(Creature* pCreature, Item* pItem); ////////////////////////////////////////////////////////////////////////////// -// Mysterious item +// Mysterious item 생성 ////////////////////////////////////////////////////////////////////////////// Item* getRandomMysteriousItem(Creature* pCreature, Item::ItemClass itemClass, int maxLevel = 0); ////////////////////////////////////////////////////////////////////////////// -// Option õ +// Option에 관련된 ㅎ마수들 ////////////////////////////////////////////////////////////////////////////// -// Ư OptionType پִ°? +// 특정한 OptionType이 붙어있는가? bool hasOptionType(const list& optionTypes, OptionType_t optionType); -// Ư OptionClass(STR, DEX...) پִ°? +// 특정한 OptionClass(STR, DEX...)가 붙어있는가? bool hasOptionClass(const list& optionTypes, OptionType_t optionType); -// DB оö +// DB에서 읽어올때 void setOptionTypeFromField(list& optionTypes, const string& optionField); -// DB +// DB에 저장할 때 void setOptionTypeToField(const list& optionTypes, string& optionField); -// cout +// cout에 사용 string getOptionTypeToString(const list& optionTypes); ////////////////////////////////////////////////////////////////////////////// -// ɼ Ȯ üũ : +// 다음 옵션이 붙을 확률 체크 : 레어 아이템 생성 여부 ////////////////////////////////////////////////////////////////////////////// bool isPossibleNextOption(ITEM_TEMPLATE* pTemplate); @@ -266,19 +266,19 @@ ItemType_t getDowngradeItemType(Item::ItemClass IClass, ItemType_t itemType); bool isPossibleUpgradeItemType(Item::ItemClass IClass); ////////////////////////////////////////////////////////////////////////////// -// ũ Ʈ ̺Ʈ +// 크리스마스 트리 이벤트용 ////////////////////////////////////////////////////////////////////////////// -// Ʈ ˻ +// 트리 조각을 검색 // TPOINT checkEventTree( PlayerCreature* pPC, CoordInven_t iX, CoordInven_t iY ); // TPOINT checkEventDocument( PlayerCreature* pPC, CoordInven_t iX, CoordInven_t iY ); // TPOINT checkEventDoll( PlayerCreature* pPC, CoordInven_t iX, CoordInven_t iY ); TPOINT checkEventPuzzle(PlayerCreature* pPC, CoordInven_t iX, CoordInven_t iY, int start); -// κ丮 (X0, Y0) - (X1, y1) . +// 인벤토리의 (X0, Y0) - (X1, y1) 범위의 아이템을 지운다. void deleteInventoryItem(Inventory* pInventory, CoordInven_t invenX0, CoordInven_t invenY0, CoordInven_t invenX1, CoordInven_t invenY1); -// κ丮 ʺڿ ־ش. +// 인벤토리에 초보자용 아이템을 넣어준다. bool addNewbieItemToInventory(Slayer* pSlayer, bool sendPacket = false); bool addNewbieGoldToInventory(Slayer* pSlayer, bool sendPacket = false); bool addNewbieItemToGear(Slayer* pSlayer, bool sendPacket = false); @@ -289,7 +289,7 @@ bool addNewbieItemToGear(Ousters* pOusters, bool sendPacket = false); Item::ItemClass getBestNewbieWeaponClass(Slayer* pSlayer); -// ɼ stringκ ɼ list . +// 옵션 string으로부터 옵션 list를 만든다. void makeOptionList(const string& options, list& optionList); void saveDissectionItem(Creature* pCreature, Item* pTreasure, int x, int y); @@ -303,27 +303,27 @@ bool isCoupleRing(Item* pItem); bool suitableItemClass(Item::ItemClass iClass, SkillDomainType_t domainType); -// ´ ٲش. Ÿ ڿ ٷ ڿ ´ٰ -// ̰ ҷ ڿ ݵ Ÿ ִ̺ pItem->save() ҷ ȴ. +// 아이템을 성별에 맞는 동급의 아이템으로 바꿔준다. 아이템 타입이 남자용 다음에 바로 같은 급의 여자용이 온다고 가정 +// 이걸 불러준 뒤엔 반드시 아이템 타입을 세이브해주던가 pItem->save() 를 불러줘야 된다. void setItemGender(Item* pItem, GenderRestriction gender); -// Item Trace Log ΰ? +// Item Trace Log 를 남길 아이템인가? bool bTraceLog(Item* pItem); -// Item Trace Log Լ +// Item Trace Log 남기는 함수 void remainTraceLog(Item* pItem, const string& preOwner, const string& owner, ItemTraceLogType logType, ItemTraceDetailType detailType); void remainTraceLogNew(Item* pItem, const string& owner, ITLType logType, ITLDType detailType, ZoneID_t zid = 0, int x = 0, int y = 0); -// Meney Trace Log Լ +// Meney Trace Log 남기는 함수 void remainMoneyTraceLog(const string& preOwner, const string& owner, ItemTraceLogType logType, ItemTraceDetailType detailType, int amount); -// Web Լ +// Web 에서 산 아이템을 만드는 함수 Item* createItemByGoodsID(DWORD goodsID); -// Ǵ÷ Լ (Ư  д --;) 2003.04.29 by DEW +// 복권당첨에 관련 된 함수 (특별히 둘 곳이 없어서 여기 둔다 --;) 2003.04.29 by DEW bool bWinPrize(DWORD rewardID, DWORD questLevel); void deleteFlagEffect(Corpse* pFlagPole, Item* pFlag); diff --git a/src/server/gameserver/LevelWar.cpp b/src/server/gameserver/LevelWar.cpp index 49698dc8..6b66dcbb 100644 --- a/src/server/gameserver/LevelWar.cpp +++ b/src/server/gameserver/LevelWar.cpp @@ -11,7 +11,7 @@ void LevelWar::execute() { executeEnd(); break; default: - Assert(/* ° ̻*/ false); + Assert(/*레벨워 상태가 이상함*/ false); } __END_CATCH @@ -35,7 +35,7 @@ void LevelWar::executeEnd() { m_State = READY; - // ̰ LevelWarManager ֵ Ѵ + // 이건 LevelWarManager 에서 해주도록 한다 // m_pManager->addSchedule( new Schedule( this, m_pManager->getNextLevelWarTime() ) ); } diff --git a/src/server/gameserver/LevelWarManager.cpp b/src/server/gameserver/LevelWarManager.cpp index 3178be82..3b2f82ac 100644 --- a/src/server/gameserver/LevelWarManager.cpp +++ b/src/server/gameserver/LevelWarManager.cpp @@ -18,12 +18,12 @@ #include "VariableManager.h" #include "ZoneGroupManager.h" -// ϴ ¥ +// 전쟁 하는 날짜 int LevelWarTime[4][3] = { - {2, 20, 0}, // ȭ 8 - {4, 20, 0}, // 8 - {2, 21, 0}, // ȭ 9 - {4, 21, 0}, // 9 + {2, 20, 0}, // 화요일 8시 + {4, 20, 0}, // 목요일 8시 + {2, 21, 0}, // 화요일 9시 + {4, 21, 0}, // 목요일 9시 }; void LevelWarManager::init() { @@ -34,7 +34,7 @@ void LevelWarManager::init() { VSDateTime warStartTime = getNextLevelWarTime(); m_pLevelWarSchedule = new Schedule(new LevelWar(this), warStartTime); - filelog("WarLog.txt", "[Level=%d, Time=%s] ߰մϴ.", m_Level, warStartTime.toString().c_str()); + filelog("WarLog.txt", "[Level=%d, Time=%s] 레벨별 전쟁을 추가합니다.", m_Level, warStartTime.toString().c_str()); addSchedule(m_pLevelWarSchedule); } @@ -50,7 +50,7 @@ Work* LevelWarManager::heartbeat() } if (m_bHasWar) { - // GCWarList ش + // 전쟁이 있으면 GCWarList 를 갱신해준다 makeGCWarList(); } @@ -60,8 +60,8 @@ Work* LevelWarManager::heartbeat() void LevelWarManager::startWar() { m_bHasWar = true; - // ð start time صд. - // startTime Level ʿϴ. + // 현재 시간을 start time 으로 기록해둔다. + // startTime 과 Level 이 기록을 남길 때 꼭 필요하다. setLevelWarStartTime(VSDateTime::currentDateTime()); int year = VSDate::currentDate().year() - 2000; @@ -93,7 +93,7 @@ void LevelWarManager::startWar() { g_pSweeperBonusManager->makeVoidSweeperBonusInfo(gcSweeperBonusInfo); g_pLevelWarZoneInfoManager->broadcast(m_pZone->getZoneID(), &gcSweeperBonusInfo); - // . + // 기록 남긴다. recordLevelWarStart(); } @@ -159,14 +159,14 @@ void LevelWarManager::endWar() { VSDateTime warStartTime = getNextLevelWarTime(); m_pLevelWarSchedule = new Schedule(new LevelWar(this), warStartTime); - filelog("WarLog.txt", "[Level=%d, Time=%s] ߰մϴ.", m_Level, warStartTime.toString().c_str()); + filelog("WarLog.txt", "[Level=%d, Time=%s] 레벨별 전쟁을 추가합니다.", m_Level, warStartTime.toString().c_str()); addSchedule(m_pLevelWarSchedule); char sLoad[100]; sprintf(sLoad, "*world *load sweeper_owner %d", m_Level); CGSayHandler::opworld(NULL, sLoad, 0, true); - // + // 기록 남긴다 recordLevelWarEnd(); } @@ -205,7 +205,7 @@ void LevelWarManager::recordLevelWarEnd() { } END_DB(pStmt) - // script ., system Լ ̾ !_! + // script 돌리기 ㅡ.,ㅡ system 함수를 쓰게 될 줄이야 !_! char cmd[100]; sprintf(cmd, "/home/darkeden/vs/bin/script/recordLevelWarHistory.py %d %s %d %d ", m_Level, getLevelWarStartTime().toStringforWeb().c_str(), g_pConfig->getPropertyInt("Dimension"), @@ -396,7 +396,7 @@ void LevelWarManager::freeUserTimeCheck() if (m_bCanEnterFreeUser && hour != LevelWarTime[m_Level - 1][1]) { m_bCanEnterFreeUser = false; - // Zone ִ ƨ. + // Zone 에 있는 사람 다 튕겨주자. m_pZone->remainPayPlayer(); } else if (!m_bCanEnterFreeUser && hour == LevelWarTime[m_Level - 1][1]) { m_bCanEnterFreeUser = true; diff --git a/src/server/gameserver/LevelWarManager.h b/src/server/gameserver/LevelWarManager.h index 58651d08..a11eb924 100644 --- a/src/server/gameserver/LevelWarManager.h +++ b/src/server/gameserver/LevelWarManager.h @@ -86,7 +86,7 @@ class LevelWarManager : public Scheduler { bool m_bCanEnterFreeUser; - VSDateTime m_StartTime; // ð + VSDateTime m_StartTime; // 전쟁 시작 시간 GCWarList m_GCWarList; mutable Mutex m_MutexWarList; diff --git a/src/server/gameserver/LevelWarZoneInfoManager.h b/src/server/gameserver/LevelWarZoneInfoManager.h index 7ddb503a..d27718e2 100644 --- a/src/server/gameserver/LevelWarZoneInfoManager.h +++ b/src/server/gameserver/LevelWarZoneInfoManager.h @@ -7,6 +7,7 @@ #include "Mutex.h" #include "Types.h" +class Creature; class Packet; class LevelWarZoneInfo { diff --git a/src/server/gameserver/LogNameManager.cpp b/src/server/gameserver/LogNameManager.cpp index 3368520b..de5bf66f 100644 --- a/src/server/gameserver/LogNameManager.cpp +++ b/src/server/gameserver/LogNameManager.cpp @@ -15,7 +15,7 @@ void LogNameManager::init() { pResult = pStmt->executeQuery("SELECT Name FROM LogUserInfo"); while (pResult->next()) { - // 0 ǹ̾. + // 0 은 의미없다. add(pResult->getString(1), 0); } diff --git a/src/server/gameserver/LoginServerManager.h b/src/server/gameserver/LoginServerManager.h index b99b034c..e9951287 100644 --- a/src/server/gameserver/LoginServerManager.h +++ b/src/server/gameserver/LoginServerManager.h @@ -16,8 +16,8 @@ ////////////////////////////////////////////////////////////////////////////// // class LoginServerManager; // -// α ϴ ̴. -// ο ͱ׷ ϳ ŷ Ѵ. +// 로그인 서버와의 통신을 전담하는 쓰레드이다. +// 내부에 데이터그램 서버소켓을 하나 가지고 블로킹 기반으로 동작한다. ////////////////////////////////////////////////////////////////////////////// class LoginServerManager : public Thread { @@ -44,7 +44,7 @@ class LoginServerManager : public Thread { } private: - DatagramSocket* m_pDatagramSocket; // UDP + DatagramSocket* m_pDatagramSocket; // UDP 서버 소켓 mutable Mutex m_Mutex; }; diff --git a/src/server/gameserver/MasterLairInfoManager.h b/src/server/gameserver/MasterLairInfoManager.h index c1090dfe..5b6cd9a6 100644 --- a/src/server/gameserver/MasterLairInfoManager.h +++ b/src/server/gameserver/MasterLairInfoManager.h @@ -14,7 +14,7 @@ #include "Exception.h" #include "Types.h" -// ׿ ޴ ġ +// 마스터 죽였을때 개인이 받는 계급 경험치 const int MASTER_KILL_RANK_EXP = 23300; // 0x00bbggrr @@ -194,47 +194,47 @@ class MasterLairInfo { string toString() const; private: - ZoneID_t m_ZoneID; // ̵ - MonsterType_t m_MasterNotReadyMonsterType; // NotReady ¿ MonsterType - MonsterType_t m_MasterMonsterType; // MonsterType - bool m_MasterRemainNotReady; // NotReady Master ü ٲٱ - ZoneCoord_t m_MasterX; // Xǥ - ZoneCoord_t m_MasterY; // Yǥ - Dir_t m_MasterDir; // - int m_MaxPassPlayer; // ִ - // int m_MaxSummonMonster; // ִ ȯ - ZoneCoord_t m_SummonX; // ȯ ǥ - ZoneCoord_t m_SummonY; // ȯ ǥ - int m_FirstRegenDelay; // ֱ() - int m_RegenDelay; // ֱ() - int m_StartDelay; // , Ȱ ð - int m_EndDelay; // ͸ ִ ð, ð Ŀ ߹ - int m_KickOutDelay; // ͸ , ߹ ð - - // ߹ų + ZoneID_t m_ZoneID; // 존 아이디 + MonsterType_t m_MasterNotReadyMonsterType; // 마스터의 NotReady 상태에서의 MonsterType + MonsterType_t m_MasterMonsterType; // 마스터의 MonsterType + bool m_MasterRemainNotReady; // NotReady상태의 Master를 시체로 바꾸기 + ZoneCoord_t m_MasterX; // 마스터의 X좌표 + ZoneCoord_t m_MasterY; // 마스터의 Y좌표 + Dir_t m_MasterDir; // 마스터의 방향 + int m_MaxPassPlayer; // 최대 사용자 수 + // int m_MaxSummonMonster; // 최대 몬스터 소환 숫자 + ZoneCoord_t m_SummonX; // 몬스터 소환 좌표 + ZoneCoord_t m_SummonY; // 몬스터 소환 좌표 + int m_FirstRegenDelay; // 최초의 마스터 레어 리젠 주기(분) + int m_RegenDelay; // 마스터 레어 리젠 주기(분) + int m_StartDelay; // 입장 금지, 마스터 부활 시간 + int m_EndDelay; // 마스터를 죽일 수 있는 시간, 이 시간 이후에는 강제 추방 + int m_KickOutDelay; // 마스터를 죽인 후, 강제추방까지의 시간 + + // 강제추방시킬 존 ZoneID_t m_KickZoneID; ZoneCoord_t m_KickZoneX; ZoneCoord_t m_KickZoneY; - // Lair ü + // Lair 전체 공격 int m_LairAttackTick; int m_LairAttackMinNumber; int m_LairAttackMaxNumber; - // ȯҶ ϴ + // 몹 소환할때 하는 말 vector m_MasterSummonSay; - // Ͱ ϴ + // 마스터가 죽을 때 하는 말 vector m_MasterDeadSlayerSay; vector m_MasterDeadVampireSay; - // Ͱ ׾ ϴ + // 마스터가 안 죽었을때 하는 말 vector m_MasterNotDeadSay; }; ////////////////////////////////////////////////////////////////////////////// // class MasterLairInfoManager; -// ZoneID Ű ؼ ˻ ִ Ѵ. +// ZoneID 를 키값으로 해서 존 정보를 검색할 수 있는 기능을 제공한다. ////////////////////////////////////////////////////////////////////////////// class MasterLairInfoManager { @@ -257,7 +257,7 @@ class MasterLairInfoManager { string toString() const; private: - unordered_map m_MasterLairInfos; // zone info ؽ + unordered_map m_MasterLairInfos; // zone info 의 해쉬맵 }; extern MasterLairInfoManager* g_pMasterLairInfoManager; diff --git a/src/server/gameserver/MasterLairManager.h b/src/server/gameserver/MasterLairManager.h index 01e362b6..3946fb0a 100644 --- a/src/server/gameserver/MasterLairManager.h +++ b/src/server/gameserver/MasterLairManager.h @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : MasterLairManager.h -// Written by : +// Written by : 쉭 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -25,11 +25,11 @@ class Zone; class MasterLairManager { public: enum MasterLairEvent { - EVENT_WAITING_PLAYER, // ٸ. - EVENT_MINION_COMBAT, // ȯ Ϳ ο. - EVENT_MASTER_COMBAT, // Ϳ ο. - EVENT_WAITING_KICK_OUT, // ߹ ( ð) - EVENT_WAITING_REGEN, // ٽ DZ ٸ. + EVENT_WAITING_PLAYER, // 사람들이 들어오길 기다린다. + EVENT_MINION_COMBAT, // 소환된 몬스터와 싸운다. + EVENT_MASTER_COMBAT, // 마스터와 싸운다. + EVENT_WAITING_KICK_OUT, // 사용자 강제추방 대기(마스터 잡은 경우의 정리 시간) + EVENT_WAITING_REGEN, // 다시 리젠되길 기다린다. EVENT_MAX }; @@ -43,8 +43,8 @@ class MasterLairManager { return m_Event; } - bool enterCreature(Creature* pCreature); // Ѱ? - bool leaveCreature(Creature* pCreature); // + bool enterCreature(Creature* pCreature); // 존에 출입이 가능한가? + bool leaveCreature(Creature* pCreature); // 존에서 나간 경우 bool heartbeat(); @@ -81,33 +81,33 @@ class MasterLairManager { void activeEventWaitingKickOut(); void activeEventWaitingRegen(); - void deleteAllMonsters(); // - void kickOutPlayers(); // ߹ - void giveKillingReward(); // ׿ ޴ - void killAllMonsters(); // ͸ δ + void deleteAllMonsters(); // 모든 몬스터 삭제 + void kickOutPlayers(); // 사용자 강제 추방 + void giveKillingReward(); // 마스터 죽였을 때 받는 보상 + void killAllMonsters(); // 모든 몬스터를 죽인다 private: Zone* m_pZone; - ObjectID_t m_MasterID; // + ObjectID_t m_MasterID; // 마스터 한 마리 ZoneCoord_t m_MasterX; ZoneCoord_t m_MasterY; - bool m_bMasterReady; // Ͱ ο غ Ǿ? + bool m_bMasterReady; // 마스터가 싸울 준비가 되었나? - // int m_nMaxSummonMonster; // Ͱ ȯ ִ - // int m_nSummonedMonster; // Ͱ ȯ + // int m_nMaxSummonMonster; // 마스터가 소환할 최대의 몬스터 수 + // int m_nSummonedMonster; // 마스터가 소환한 몬스터 수 - int m_nMaxPassPlayer; // ִ - int m_nPassPlayer; // Pass + int m_nMaxPassPlayer; // 최대 출입 사용자 수 + int m_nPassPlayer; // Pass를 받은 사람 수 - MasterLairEvent m_Event; // ̺Ʈ - Timeval m_EventTime; // ̺Ʈ ӵ ð - int m_EventValue; // ̺Ʈ õ + MasterLairEvent m_Event; // 현재의 이벤트 종류 + Timeval m_EventTime; // 현재의 이벤트가 지속될 시간 + int m_EventValue; // 이벤트와 관련된 값 - Timeval m_RegenTime; // ϰ ٽ ϴ ð + Timeval m_RegenTime; // 싹 정리하고 다시 시작하는 시간 - mutable Mutex m_Mutex; // m_nPassPlayer Ȯ üũҷ.. + mutable Mutex m_Mutex; // m_nPassPlayer를 확실히 체크할려고.. }; #endif diff --git a/src/server/gameserver/Monster.h b/src/server/gameserver/Monster.h index 5517c8c9..720bfbbe 100644 --- a/src/server/gameserver/Monster.h +++ b/src/server/gameserver/Monster.h @@ -23,12 +23,12 @@ class MonsterAI; struct SUMMON_INFO2; class Monster : public Creature { - // /Ҹ + // 생성자/소멸자 public: Monster(MonsterType_t monsterType); virtual ~Monster(); - // Ŭ Լ + // 하위 클래스 상속 함수 public: virtual CreatureClass getCreatureClass() const { return CREATURE_CLASS_MONSTER; @@ -50,7 +50,7 @@ class Monster : public Creature { // AI specific methods public: - // AI ڵ尡 Ǵ ޽̴. + // AI 코드가 수행되는 메인 메쏘드이다. void act(const Timeval& currentTime); void actDeadAction(void); @@ -62,12 +62,12 @@ class Monster : public Creature { Creature* getPrimaryEnemy() const; ObjectID_t getEnemy(EnemyPriority enemyPriority = ENEMY_PRIMARY) const; - // Enemy Ʈ α׾ƿ PC Ѵ. + // Enemy 리스트에서 로그아웃한 PC 를 삭제한다. void verifyEnemies(); bool isRealEnemy(Creature* pEnemy); - // Ϳ ϳ̻ Ǿ ִ°? + // 이 몬스터에게 적이 하나이상 지정되어 있는가? bool hasEnemy() const { return m_Enemies.size() > 0; } @@ -77,7 +77,7 @@ class Monster : public Creature { return m_Enemies; } - // EnemyǺ. by sigi. 2002.9.23 + // 선제 공격 Enemy판별. by sigi. 2002.9.23 bool isEnemyToAttack(Creature* pCreature) const; bool isEnemyToAttack(Slayer* pSlayer) const; bool isEnemyToAttack(Vampire* pVampire) const; @@ -283,7 +283,7 @@ class Monster : public Creature { m_LastHitCreatureClass = CClass; } - // ̺Ʈ ϴ κ + // 몬스터 이벤트 몬스터인지 세팅하는 부분 bool getEventMonsterFlag(void) const { return m_isEventMonster; } @@ -334,15 +334,15 @@ class Monster : public Creature { m_bMaster = bMaster; } - // ñ? by sigi. 2002.9.2 + // 몹에서 아이템 나올까? by sigi. 2002.9.2 bool hasTreasure() const { return m_bTreasure; } void setTreasure(bool bTreasure = true) { m_bTreasure = m_bTreasure && bTreasure; - } // Treasure ִ ֵ鸸 Treasure ־ ȴ. + } // 원래 Treasure가 있는 애들만 Treasure가 있어야 된다. - // Ͱ ȯϴ . by sigi. 2002.9.2 + // 몬스터가 소환하는 몬스터의 종류. by sigi. 2002.9.2 bool getMonsterSummonInfo(SUMMON_INFO2& summonInfo); bool hasNextMonsterSummonInfo(); int getMonsterSummonStep() const { @@ -418,52 +418,52 @@ class Monster : public Creature { bool m_isEventMonster; bool m_bChief; - // Exp : ͸ ׿ ޴ ġ? + // Exp : 몬스터를 죽였을 때 받는 경험치는? Exp_t m_Exp; - // - Ͱ 󸶳 ϴ°? + // 사기 - 몬스터가 전투에 얼마나 충실히 임하는가? Moral_t m_Moral; - // ó - ¿ , ó ̴ ޶ Ѵ. - // ̻ ɷȴٵ ϸ, ó ̰ Ͱ - // ̴. ̴ ü ̴. + // 처리 딜레이 - 몬스터의 상태에 따라서, 처리 딜레이는 달라져야 한다. + // 가령 이상한 마법에 걸렸다든지 하면, 처리 딜레이가 길어져서 몬스터가 + // 반응이 느려질 것이다. 이는 개체 레벨이다. Turn_t m_Delay; Turn_t m_AttackDelay; Timeval m_AccuDelay; // enemy list // *CAUTION* - // ϸ, Creture* Ʈ ְ, - // ̷ , enemy PC α׾ƿϴ , ڽ - // ͸ ãƼ Ʈ ؾ Ѵٴ - // ´. , OID ؾ ϸ, ؼ - // PC ˻ؾ Ѵ. + // 쉽게 생각하면, Creture* 의 리스트로 구현할 수도 있겠지만, + // 이럴 경우, enemy 로 지정된 PC 가 로그아웃하는 경우, 자신을 + // 적으로 지정한 몬스터를 찾아서 리스트에서 삭제해야 한다는 + // 결론이 나온다. 따라서, OID 를 저장해야 하며, 이 값을 사용해서 + // PC 등을 검색해야 한다. list m_Enemies; - // ׼ ð + // 다음 액션 실행 시간 Timeval m_NextTurn; // MonsterAI class MonsterAI* m_pBrain; - // + // 은 도금 데미지 Silver_t m_SilverDamage; - // Ŭ Ÿ + // 클랜 타입 ClanType_t m_ClanType; - // "" 켱 ̺ + // "먹자" 방지를 위한 우선권 테이블 PrecedenceTable m_PrecedenceTable; - // Ϳ ۿ 켱 ̸ Ƽ ID + // 이 몬스터에서 나오는 아이템에 대한 우선권을 가진 자의 이름과 파티 ID string m_HostName; int m_HostPartyID; - // ͸ ũ Ŭ - // Ͱ ׾ 쿡, ϴ ϱ ̴. + // 이 몬스터를 마지막으로 때린 종족의 크리쳐 클래스 + // 이 몬스터가 죽었을 경우에, 생성하는 아이템을 결정하기 위한 것이다. CreatureClass m_LastHitCreatureClass; - // Ͱ Relic ִ° ƴѰ? + // 이 몬스터가 Relic을 가지고 있는가 아닌가? int m_RelicIndex; // #ifdef __XMAS_EVENT_CODE__ @@ -473,7 +473,7 @@ class Monster : public Creature { bool m_bScanEnemy; Timeval m_NextScanTurn; - // νŸ + // 몬스터의 적 인식타임 bool m_bEnemyLimit; Timeval m_EnemyLimitTime; Creature* m_pOldEnemy; @@ -481,7 +481,7 @@ class Monster : public Creature { // 2002.9.2 bool m_bMaster; bool m_bTreasure; - int m_MonsterSummonStep; // ȯ ܰ + int m_MonsterSummonStep; // 소환 단계 #ifdef __UNDERWORLD__ bool m_bUnderWorld; @@ -490,7 +490,7 @@ class Monster : public Creature { // AttackOrder AttackOrder m_AttackOrder; - // ȯ .. Ȥ ƴϴ.. + // 소환된 몹인 경우.. 혹은 아니더라도.. 주인의 정보 ObjectID_t m_OwnerObjectID; // 2002.10.14 diff --git a/src/server/gameserver/MonsterAI.h b/src/server/gameserver/MonsterAI.h index 7f19a995..e04bec3f 100644 --- a/src/server/gameserver/MonsterAI.h +++ b/src/server/gameserver/MonsterAI.h @@ -1,8 +1,8 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : MonsterAI.h -// Written By : 輺 +// Written By : 김성민 // Description : -// ൿ ϴ ִ AI Ŭ̴. +// 몬스터의 행동을 결정하는 뇌의 역할을 해주는 AI 클래스이당. ////////////////////////////////////////////////////////////////////////////// #ifndef __MONSTERAI_H__ @@ -15,7 +15,7 @@ #include "Zone.h" ////////////////////////////////////////////////////////////////////////////// -// +// 기술 실패 관련 상수 ////////////////////////////////////////////////////////////////////////////// enum { SKILL_FAILED_RANGE = 1, @@ -26,7 +26,7 @@ enum { }; ////////////////////////////////////////////////////////////////////////////// -// +// 딜레이 관련 상수 ////////////////////////////////////////////////////////////////////////////// enum { LAST_ACTION_NONE, @@ -37,7 +37,7 @@ enum { }; ////////////////////////////////////////////////////////////////////////////// -// +// 딜레이 관련 상수 ////////////////////////////////////////////////////////////////////////////// enum MoveRule { MOVE_RULE_NORMAL, @@ -62,7 +62,7 @@ class MonsterAI { virtual ~MonsterAI(); public: - // Լ + // 데이터 함수 bool getDamaged(void) const { return m_bDamaged; } @@ -70,14 +70,14 @@ class MonsterAI { m_bDamaged = value; } - // ̷Ƽ Լ + // 다이렉티브 관련 함수 void addDirective(Directive* pDirective); - // Լ + // 조건 함수 bool checkCondition(int condition, Creature* pEnemy); bool checkDirective(Directive* pDirective, Creature* pEnemy); - // ൿ Լ + // 행동 함수 bool move(ZoneCoord_t ex, ZoneCoord_t ey); bool move(Creature* pEnemy, bool bRetreat = false); bool approach(Creature* pEnemy) { @@ -86,7 +86,7 @@ class MonsterAI { bool flee(Creature* pEnemy); int useSkill(Creature* pEnemy, SkillType_t SkillType, int ratio); - // ̵ Լ + // 이동 함수 bool moveNormal(ZoneCoord_t ex, ZoneCoord_t ey, ZoneCoord_t& nx, ZoneCoord_t& ny, Dir_t& ndir); bool moveWall(ZoneCoord_t ex, ZoneCoord_t ey, ZoneCoord_t& nx, ZoneCoord_t& ny, Dir_t& ndir, bool bLeft); void setMoveRule(MoveRule mr) { @@ -94,7 +94,7 @@ class MonsterAI { m_WallCount = 0; } - // Ÿ -- + // 벽타기 -- MoveRule getMoveRule() const { return m_MoveRule; } @@ -102,11 +102,11 @@ class MonsterAI { return m_WallCount; } - // ൿ Լ + // 행동 패턴 선택 함수 void deal(Creature* pEnemy, const Timeval& currentTime); void actDeadAction(Creature* pEnemy); - // Լ + // 딜레이 관련 함수 void setDelay(const Timeval& currentTime); void setAttackDelay(const Timeval& currentTime); @@ -118,44 +118,44 @@ class MonsterAI { } private: - // AI ϴ ü + // 이 AI가 조정하는 본체 Monster* m_pBody; - // AI Ÿ + // AI의 성향 타입 uint m_AIType; - // ǰ + // 조건과 명령 집합 DirectiveSet* m_pDirectiveSet; - // ġ Ƚ ī + // 도망치는 턴 횟수 카운터 int m_Panic; - // ġ ִ Ƚ + // 도망치는 최대 턴 횟수 int m_PanicMax; - // ġٰ 缹 , - // ġ ϴ Ƚ ī + // 도망치다가 멈춰섰을 경우, + // 안 도망치고 공격하는 횟수 카운터 int m_Courage; - // ġ ϴ ִ Ƚ + // 안 도망치고 공격하는 최대 턴 횟수 int m_CourageMax; - // Ͽ ¾Ҵ, ¾Ҵ ÷... + // 지난 턴에 맞았다, 안 맞았다 플래그... bool m_bDamaged; - // ̹ Ͽ ߴٴ ÷ + // 이번 턴에 무엇을 했다는 플래그 int m_LastAction; - // ̵ϴ + // 이동하는 방법 MoveRule m_MoveRule; - // block == ־ϴ + // 벽에 의해 block된 방향==다음에 꼭 갈 수 있어야하는 방향 Dir_t m_BlockedDir; - // Ÿ ȸ + // 벽타고 간 회수 int m_WallCount; - // Լ ͵... + // 함수 포인터들... ConditionCheckFunction m_pCondChecker[DIRECTIVE_COND_MAX]; }; diff --git a/src/server/gameserver/MonsterCorpse.h b/src/server/gameserver/MonsterCorpse.h index c4aeecf7..093cafd9 100644 --- a/src/server/gameserver/MonsterCorpse.h +++ b/src/server/gameserver/MonsterCorpse.h @@ -14,7 +14,7 @@ ////////////////////////////////////////////////////////////////////////////// // class MonsterCorpse; -// Ͱ ׾ , ü̴. +// 몬스터가 죽었을 경우, 남기는 시체이다. ////////////////////////////////////////////////////////////////////////////// class Monster; @@ -128,15 +128,15 @@ class MonsterCorpse : public Corpse { // data members protected: - MonsterType_t m_MonsterType; // Ÿ - string m_Name; // ̸ - Dir_t m_Dir; // ü - bool m_bhasHead; // Ӹ ޷ ֳ . - string m_HostName; // ü ۿ 켱 ̸ - int m_HostPartyID; // ü ۿ 켱 Ƽ ID - string m_QuestHostName; // ü Ʈ ۿ 켱 ̸ - - bool m_bShrine; // ΰ? + MonsterType_t m_MonsterType; // 몬스터 타입 + string m_Name; // 몬스터 이름 + Dir_t m_Dir; // 시체의 방향 + bool m_bhasHead; // 머리가 달려 있나 없나. + string m_HostName; // 이 시체에서 나오는 아이템에 대한 우선권을 가진 자의 이름 + int m_HostPartyID; // 이 시체에서 나오는 아이템에 대한 우선권을 가진 파티의 ID + string m_QuestHostName; // 이 시체에서 나오는 퀘스트 아이템에 대한 우선권을 가진 자의 이름 + + bool m_bShrine; // 성단인가? ObjectID_t m_LastKiller; }; diff --git a/src/server/gameserver/MonsterCounter.h b/src/server/gameserver/MonsterCounter.h index 9cd8da0d..b6689553 100644 --- a/src/server/gameserver/MonsterCounter.h +++ b/src/server/gameserver/MonsterCounter.h @@ -47,9 +47,9 @@ class MonsterCounter { string toString() const; private: - SpriteType_t m_SpriteType; // Ʈ Ÿ - WORD m_MaxMonsters; // ִ - WORD m_CurrentMonsters; // + SpriteType_t m_SpriteType; // 스프라이트 타입 + WORD m_MaxMonsters; // 몬스터의 최대 마릿수 + WORD m_CurrentMonsters; // 몬스터의 현재 마릿수 static DWORD s_MonsterCounter; }; diff --git a/src/server/gameserver/MonsterFunctionObject.h b/src/server/gameserver/MonsterFunctionObject.h index 5a4453d2..8dbac6aa 100644 --- a/src/server/gameserver/MonsterFunctionObject.h +++ b/src/server/gameserver/MonsterFunctionObject.h @@ -17,33 +17,33 @@ // // class StrongerSlayer, WeakerSlayer, StrongerVampire, WeakerVampire; // -// Ŭ, Ϳ enemy ߰ϴ Monster::addEnemy() ޽ -// ũó Ŵ enemy ġ ãƳ -// ϴ function object μ ȴ. +// 이 클래스들은, 몬스터에게 enemy 를 추가하는 Monster::addEnemy() 메쏘드 +// 에서 존의 크리처 매니저에서 새 enemy 의 적절한 삽입 위치를 찾아낼 때 +// 사용하는 function object 로서 사용된다. // -// ex> AttackOrder ATTACK_WEAKEST . -// m_Enemies ĵǾ ̴. ϴ -// 忡 ̾ ͸ ϱ , ͵ -// ̾ ̾ ް Ǹ, Ư Ȳ -// ̾ ϰ ȴ. , m_Enemies ʿ -// ̾ OID Ǿ , ʿ ̾ OID -// Ǿ ִ. +// ex> 현재 몬스터의 AttackOrder가 ATTACK_WEAKEST 라고 가정하자. 이 +// 몬스터의 m_Enemies 는 약한 순서대로 정렬되어 있을 것이다. 일단 +// 현재의 스펙에는 뱀파이어 몬스터만 존재하기 때문에, 이 몬스터들은 +// 뱀파이어와 슬레이어에게 공격을 같이 받게 되면, 특정 상황에서는 +// 슬레이어를 먼저 공격하게 된다. 따라서, 이 m_Enemies 는 앞쪽에 +// 슬레이어들의 OID가 저장되어 있으며, 뒷쪽에 뱀파이어들의 OID가 +// 저장되어 있다. // -// SkillDomainLevelSum == 5000 ̾ ͸ ؼ -// ɷ ϴ Ǿٰ ġ. ̾ -// ġ ϱ ؼ, ̾ ġ ˾Ƴ Ѵ. -// (̾ ٸ ̾ ġ ˾Ƴ Ѵ.) +// 이제 SkillDomainLevelSum == 5000 인 슬레이어가 이 몬스터를 공격해서 +// 적으로 지정될려고 하는 순간이 되었다고 치자. 이 슬레이어를 적절한 +// 위치에 삽입하기 위해서는, 가장 약한 슬레이어의 위치를 알아내야 한다. +// (슬레이어가 없다면 최초의 뱀파이어의 위치를 알아내야 한다.) // -// ̷ , STL find_if ˰ ϸ ڵ尡 µ, -// Ķͷ WeakerSlayer(5000) ָ ˾Ƽ ã ȴ. +// 이럴 경우, STL의 find_if 알고리즘을 사용하면 코드가 간단해 지는데, +// 여기의 파라미터로 WeakerSlayer(5000) 을 지정해주면 알아서 찾게 된다. // ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // class StrongerSlayer; -// enemy list ĵǾ ִ. -// , operator() ̾ ƴϰų ڽź ̾ -// true ؾ Ѵ. ׷, 忡 ߰ϸ ϰ ȴ. +// enemy list 는 현재 약한 순서로 정렬되어 있다. +// 따라서, operator()는 슬레이어가 아니거나 자신보다 강한 슬레이어일 경우 +// true을 리턴해야 한다. 그래서, 그 앞쪽 노드에 추가하면 약한 순서를 유지하게 된다. ////////////////////////////////////////////////////////////////////////////// class StrongerSlayer { @@ -84,10 +84,10 @@ class StrongerSlayer { ////////////////////////////////////////////////////////////////////////////// // class WeakerSlayer; -// enemy list ĵǾ ִ. -// , ̾ ƴϰų ڽź ̾ -// true ؾ Ѵ. ׷, 忡 ߰ϸ -// ϰ ȴ. +// enemy list 는 현재 강한 순서로 정렬되어 있다. +// 따라서, 슬레이어가 아니거나 자신보다 약한 슬레이어일 경우 +// true을 리턴해야 한다. 그래서, 그 앞쪽 노드에 추가하면 +// 강한 순서를 유지하게 된다. ////////////////////////////////////////////////////////////////////////////// class WeakerSlayer { @@ -129,9 +129,9 @@ class WeakerSlayer { ////////////////////////////////////////////////////////////////////////////// // class StrongerVampire; -// enemy list ĵǾ ִ. -// , ڽź ̾ 쿡 true ؾ Ѵ. -// ׷, 忡 ߰ϸ ϰ ȴ. +// enemy list 는 현재 약한 순서로 정렬되어 있다. +// 따라서, 자신보다 강한 뱀파이어일 경우에만 true을 리턴해야 한다. +// 그래서, 그 앞쪽 노드에 추가하면 약한 순서를 유지하게 된다. ////////////////////////////////////////////////////////////////////////////// class StrongerVampire { @@ -172,9 +172,9 @@ class StrongerVampire { ////////////////////////////////////////////////////////////////////////////// // class WeakerVampire; -// enemy list ĵǾ ִ. -// , ڽź ̾ 쿡 true ؾ Ѵ. -// ׷, 忡 ߰ϸ ϰ ȴ. +// enemy list 는 현재 강한 순서로 정렬되어 있다. +// 따라서, 자신보다 약한 뱀파이어일 경우에만 true을 리턴해야 한다. +// 그래서, 그 앞쪽 노드에 추가하면 약한 순서를 유지하게 된다. ////////////////////////////////////////////////////////////////////////////// class WeakerVampire { @@ -250,9 +250,9 @@ class StrongerOusters { ////////////////////////////////////////////////////////////////////////////// // class WeakerOusters; -// enemy list ĵǾ ִ. -// , ڽź ̾ 쿡 true ؾ Ѵ. -// ׷, 忡 ߰ϸ ϰ ȴ. +// enemy list 는 현재 강한 순서로 정렬되어 있다. +// 따라서, 자신보다 약한 뱀파이어일 경우에만 true을 리턴해야 한다. +// 그래서, 그 앞쪽 노드에 추가하면 약한 순서를 유지하게 된다. ////////////////////////////////////////////////////////////////////////////// class WeakerOusters { @@ -292,9 +292,9 @@ class WeakerOusters { ////////////////////////////////////////////////////////////////////////////// // class StrongerMonster; -// enemy list ĵǾ ִ. -// , ڽź ̾ 쿡 true ؾ Ѵ. -// ׷, 忡 ߰ϸ ϰ ȴ. +// enemy list 는 현재 약한 순서로 정렬되어 있다. +// 따라서, 자신보다 강한 뱀파이어일 경우에만 true을 리턴해야 한다. +// 그래서, 그 앞쪽 노드에 추가하면 약한 순서를 유지하게 된다. ////////////////////////////////////////////////////////////////////////////// class StrongerMonster { @@ -335,9 +335,9 @@ class StrongerMonster { ////////////////////////////////////////////////////////////////////////////// // class WeakerMonster; -// enemy list ĵǾ ִ. -// , ڽź ̾ 쿡 true ؾ Ѵ. -// ׷, 忡 ߰ϸ ϰ ȴ. +// enemy list 는 현재 강한 순서로 정렬되어 있다. +// 따라서, 자신보다 약한 뱀파이어일 경우에만 true을 리턴해야 한다. +// 그래서, 그 앞쪽 노드에 추가하면 약한 순서를 유지하게 된다. ////////////////////////////////////////////////////////////////////////////// class WeakerMonster { diff --git a/src/server/gameserver/MonsterInfo.h b/src/server/gameserver/MonsterInfo.h index 765ef2c4..350dd9c1 100644 --- a/src/server/gameserver/MonsterInfo.h +++ b/src/server/gameserver/MonsterInfo.h @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : MonsterInfo.h -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -20,12 +20,12 @@ #include "Treasure.h" #include "Types.h" -// Ʈ ִ +// 몬스터 스프라이트 종류 최대 숫자 // add by viva const int MAX_SPRITE_TYPE = 1000; ////////////////////////////////////////////////////////////////////////////// -// Ͱ ִ ִ , Ǵ Ʈ ϴ ε +// 몬스터가 기억할 수 있는 적의 최대 개수, 또는 적의 리스트에 접근하는 인덱스 ////////////////////////////////////////////////////////////////////////////// enum EnemyPriority { ENEMY_PRIMARY = 1, @@ -41,18 +41,18 @@ enum EnemyPriority { ////////////////////////////////////////////////////////////////////////////// -// , ϴ°? +// 적이 여러명일 때, 누구를 먼저 공격하는가? ////////////////////////////////////////////////////////////////////////////// enum AttackOrder { - ATTACK_FIRST, // - ATTACK_LAST, // ߿ - ATTACK_WEAKEST, // - ATTACK_STRONGEST, // - ATTACK_CLOSEST, // - ATTACK_FAREST, // - ATTACK_FIGHTER, // - ATTACK_PRIEST, // - ATTACK_GUNNER, // dz + ATTACK_FIRST, // 제일 먼저 때린 놈부터 공격 + ATTACK_LAST, // 제일 나중에 때린 놈 부터 공격 + ATTACK_WEAKEST, // 제일 약한 놈부터 공격 + ATTACK_STRONGEST, // 제일 강한 놈부터 공격 + ATTACK_CLOSEST, // 제일 가까운 놈 부터 공격 + ATTACK_FAREST, // 제일 먼 놈 부터 공격 + ATTACK_FIGHTER, // 전사 먼저 공격 + ATTACK_PRIEST, // 성직자 먼저 공격 + ATTACK_GUNNER, // 건너 먼저 공격 ATTACK_MAX }; @@ -62,7 +62,7 @@ const string AttackOrder2String[] = {"ATTACK_FIRST", "ATTACK_LAST", "ATTACK_ ////////////////////////////////////////////////////////////////////////////// -// - ʹ PC  ϴ°? +// 몬스터 성향 - 몬스터는 PC를 보고 어떻게 반응하는가? ////////////////////////////////////////////////////////////////////////////// enum MAlignment { ALIGNMENT_FRIENDLY, ALIGNMENT_NEUTRAL, ALIGNMENT_AGGRESSIVE }; @@ -70,7 +70,7 @@ const string MAlignment2String[] = {"ALIGNMENT_FRIENDLY", "ALIGNMENT_NEUTRAL", " ////////////////////////////////////////////////////////////////////////////// -// AI Level - ʹ 󸶳 ȶѰ? +// AI Level - 몬스터는 얼마나 똑똑한가? ////////////////////////////////////////////////////////////////////////////// enum AILevel { AI_VERY_LOW, // 1 - 50 @@ -81,7 +81,7 @@ enum AILevel { }; ////////////////////////////////////////////////////////////////////////////// -// Body Size - ũ +// Body Size - 몬스터의 몸통 크기 ////////////////////////////////////////////////////////////////////////////// enum BodySize { BODYSIZE_SMALL = 0, BODYSIZE_MEDIUM, BODYSIZE_LARGE }; @@ -379,50 +379,50 @@ class MonsterInfo { string toString() const; private: - MonsterType_t m_MonsterType; // Ÿ - SpriteType_t m_SpriteType; // Ʈ Ÿ - string m_HName; // ѱ ̸ - string m_EName; // ̸ - Level_t m_Level; // - Attr_t m_STR; // ⺻ STR - Attr_t m_DEX; // ⺻ DEX - Attr_t m_INT; // ⺻ INT - uint m_BodySize; // ũ - HP_t m_HP; // - Exp_t m_Exp; // ׿ PC ̾ ޴ ġ (not used) + MonsterType_t m_MonsterType; // 몬스터 타입 + SpriteType_t m_SpriteType; // 사용 스프라이트 타입 + string m_HName; // 몬스터 한글 이름 + string m_EName; // 몬스터 영문 이름 + Level_t m_Level; // 몬스터 레벨 + Attr_t m_STR; // 기본 STR + Attr_t m_DEX; // 기본 DEX + Attr_t m_INT; // 기본 INT + uint m_BodySize; // 몬스터의 크기 + HP_t m_HP; // 생명력 + Exp_t m_Exp; // 죽였을 때 PC 뱀파이어가 받는 경험치 (not used) Color_t m_MainColor; // Main Color (not used) Color_t m_SubColor; // Sub Color (not used) - MAlignment m_Alignment; // - AttackOrder m_AttackOrder; // õ - Moral_t m_Moral; // - Turn_t m_Delay; // ϱ ð. - Turn_t m_AttackDelay; // ϱ ð. - Sight_t m_Sight; // þ - int m_MeleeRange; // Ÿ - int m_MissileRange; // ̻ Ÿ - Creature::MoveMode m_MoveMode; // ̵ - uint m_AIType; // ΰ Ÿ - int m_EnhanceHP; // ü ȭ - int m_EnhanceToHit; // ToHit ȭ - int m_EnhanceDefense; // 潺 ȭ - int m_EnhanceProtection; // ؼ ȭ - int m_EnhanceMinDamage; // ȭ - int m_EnhanceMaxDamage; // ȭ - TreasureList* m_pSlayerTreasureList; // ̾ Ʈ - TreasureList* m_pVampireTreasureList; // ̾ Ʈ - TreasureList* m_pOustersTreasureList; // ƿ콺 Ʈ - int m_RegenType[REGENTYPE_MAX]; // Ȯ - int m_UnburrowChance; // Ŀ Ȯ - bool m_bMaster; // ̾ ΰ? - int m_ClanType; // clan ϴ ΰ? - MonsterSummonInfo* m_pMonsterSummonInfo; // ȯ - list m_DefaultEffects; // Ϳ ⺻ پִ Ʈ - bool m_bNormalRegen; // ÿ õǴ Ÿΰ? - bool m_bHasTreasure; // Treasure.bin ȭ ʿѰ? - bool m_bChief; // ġ ΰ? - - int m_MonsterClass; // Ŭ - ItemType_t m_SkullType; // ذ Ÿ + MAlignment m_Alignment; // 성향 + AttackOrder m_AttackOrder; // 공격 순서에 관련된 성향 + Moral_t m_Moral; // 사기 + Turn_t m_Delay; // 다음 행위를 하기 까지의 딜레이 시간. + Turn_t m_AttackDelay; // 다음 공격을 하기 까지의 딜레이 시간. + Sight_t m_Sight; // 시야 + int m_MeleeRange; // 접근전 사정거리 + int m_MissileRange; // 미사일 사정거리 + Creature::MoveMode m_MoveMode; // 이동 모드 + uint m_AIType; // 인공지능 타입 + int m_EnhanceHP; // 체력 강화 배수 + int m_EnhanceToHit; // ToHit 강화 배수 + int m_EnhanceDefense; // 디펜스 강화 배수 + int m_EnhanceProtection; // 프로텍션 강화 배수 + int m_EnhanceMinDamage; // 데미지 강화 배수 + int m_EnhanceMaxDamage; // 데미지 강화 배수 + TreasureList* m_pSlayerTreasureList; // 슬레이어를 위한 보물의 리스트 + TreasureList* m_pVampireTreasureList; // 뱀파이어를 위한 보물의 리스트 + TreasureList* m_pOustersTreasureList; // 아우스터즈를 위한 보물의 리스트 + int m_RegenType[REGENTYPE_MAX]; // 각 생성방법의 확률 + int m_UnburrowChance; // 생성된 후에 땅위로 나올 확률 + bool m_bMaster; // 뱀파이어 마스터인가? + int m_ClanType; // 어느 clan에 속하는 몬스터인가? + MonsterSummonInfo* m_pMonsterSummonInfo; // 몬스터 소환 정보 + list m_DefaultEffects; // 몬스터에게 기본적으로 붙어있는 이펙트 + bool m_bNormalRegen; // 리젠 시에 선택되는 몬스터 타잎인가? + bool m_bHasTreasure; // Treasure.bin 화일이 필요한가? + bool m_bChief; // 치프 몬스터인가? + + int m_MonsterClass; // 몬스터의 클래스 + ItemType_t m_SkullType; // 몬스터의 해골 타입 }; @@ -449,8 +449,8 @@ class MonsterInfoManager { // get monster info with monster type const MonsterInfo* getMonsterInfo(MonsterType_t monsterType) const; - // Ʈ Ÿ Ÿ Ʈ ´. - // ( Ͱ ϳ Ʈ Ÿ ֱ ) + // 임의의 스프라이트 타입을 가진 몬스터의 타입 리스트를 가져온다. + // (여러 몬스터가 하나의 스프라이트 타입을 가질 수 있기 때문에) const vector& getMonsterTypeBySprite(SpriteType_t spriteType) const; string getNameBySpriteType(SpriteType_t spriteType) const; @@ -475,13 +475,13 @@ class MonsterInfoManager { uint m_MaxMonsterType; // size of MonsterInfo* array MonsterInfo** m_MonsterInfos; // array of monster info vector m_MonsterSpriteSet[MAX_SPRITE_TYPE]; // array of MonsterType by SpriteType - unordered_map m_MonsterSpriteTypes; // ̸ SpriteType_tã - unordered_map m_ChiefMonster; // Chief ֱ - unordered_map> m_MonsterClassMap; // Ŭ Ÿ ã + unordered_map m_MonsterSpriteTypes; // 이름으로 SpriteType_t찾기 + unordered_map m_ChiefMonster; // Chief 몬스터 정보 가지고 있기 + unordered_map> m_MonsterClassMap; // 몬스터 클래스로 몬스터 타입 찾기 - TreasureLists m_SlayerTreasureLists; // ̾ Ʈ - TreasureLists m_VampireTreasureLists; // ̾ Ʈ - TreasureLists m_OustersTreasureLists; // ƿ콺 Ʈ + TreasureLists m_SlayerTreasureLists; // 슬레이어를 위한 보물의 리스트 + TreasureLists m_VampireTreasureLists; // 뱀파이어를 위한 보물의 리스트 + TreasureLists m_OustersTreasureLists; // 아우스터즈를 위한 보물의 리스트 }; // global variable declaration diff --git a/src/server/gameserver/MonsterInfoTypes.h b/src/server/gameserver/MonsterInfoTypes.h index be82b53e..782e3306 100644 --- a/src/server/gameserver/MonsterInfoTypes.h +++ b/src/server/gameserver/MonsterInfoTypes.h @@ -4,14 +4,14 @@ ////////////////////////////////////////////////////////////////////////////// // Class Monster; -// AI ؼ , ַ PC Ǵ ũó̴. +// AI 에 의해서 조종을 받으며, 주로 PC 들의 전투 대상이 되는 크리처들이다. ////////////////////////////////////////////////////////////////////////////// enum { - CLAN_NONE, // 𿡵 ʴ ִ.. 0 - CLAN_VAMPIRE_MONSTER, // -_-; 1 - CLAN_VAMPIRE_BATHORY_MONSTER, // 丮 Ҽ 2 - CLAN_VAMPIRE_TEPEZ_MONSTER, // Ҽ 3 - CLAN_SLAYER_MONSTER, // ̾ - -;; 4 + CLAN_NONE, // 어디에도 속하지 않는 애덜.. 0 + CLAN_VAMPIRE_MONSTER, // 떠돌이 뱀파 몬스터 -_-; 1 + CLAN_VAMPIRE_BATHORY_MONSTER, // 바토리 소속 몬스터 2 + CLAN_VAMPIRE_TEPEZ_MONSTER, // 테페즈 소속 몬스터 3 + CLAN_SLAYER_MONSTER, // 슬레이어 몬스터 - -;; 4 CLAN_MAX }; @@ -19,16 +19,16 @@ enum { extern int DefaultClanID[CLAN_MAX]; ////////////////////////////////////////////////////////////////////////////// -// RegenType - Ͱ Ÿ +// RegenType - 몬스터가 나타나는 방법 // -// üũϴ ǹ̵ ִµ, -// Hide default ū ̹Ƿ ߿ üũؾѴ. +// 체크하는 순서의 의미도 있는데, +// Hide가 default라서 가장 큰 값이므로 가장 나중에 체크해야한다. ////////////////////////////////////////////////////////////////////////////// enum RegenType { - REGENTYPE_PORTAL, // Ż Ÿ Ÿ - REGENTYPE_INVISIBLE, // invisible· Ÿ - REGENTYPE_BAT, // · Ÿ - REGENTYPE_HIDE, // ӿ ִ · + REGENTYPE_PORTAL, // 포탈을 타고 나타나는 모습 + REGENTYPE_INVISIBLE, // invisible상태로 나타나는 모습 + REGENTYPE_BAT, // 박쥐 상태로 나타나는 모습 + REGENTYPE_HIDE, // 땅 속에 숨어 있는 상태로 REGENTYPE_MAX }; diff --git a/src/server/gameserver/MonsterManager.cpp b/src/server/gameserver/MonsterManager.cpp index cfc7d006..a9ecebc6 100644 --- a/src/server/gameserver/MonsterManager.cpp +++ b/src/server/gameserver/MonsterManager.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : MonsterManager.h // Written By : Reiot -// Revised by : 輺 +// Revised by : ±è¼º¹Î // Description : //////////////////////////////////////////////////////////////////////////////// @@ -71,7 +71,7 @@ extern void countResurrectItem(); #endif //////////////////////////////////////////////////////////////////////////////// -// ȭ Ȯ ʽ ۼƮ +// À¯·áÈ­Á¸ ¾ÆÀÌÅÛ ·çÆÃÈ®·ü º¸³Ê½º ÆÛ¼¾Æ® //////////////////////////////////////////////////////////////////////////////// // const uint g_pVariableManager->getPremiumItemProbePercent() = 220; @@ -139,7 +139,7 @@ void MonsterManager::load() for (int i = 0; i < 5; i++) m_SumOfCakeRatio += m_RICE_CAKE_PROB_RATIO[i]; - // ̹ ִٸ MonsterCounter . + // ÀÌ¹Ì ÀÖ´Ù¸é ±âÁ¸ÀÇ MonsterCounterµéÀ» ¸ðµÎ Áö¿î´Ù. bool bReload = false; unordered_map::iterator iMC = m_Monsters.begin(); while (iMC != m_Monsters.end()) { @@ -148,12 +148,12 @@ void MonsterManager::load() iMC++; - // m_Monsters ̹ ־ٸ reload ̴.. . by sigi. 2002.9.19 + // m_Monsters°¡ ÀÌ¹Ì ÀÖ¾ú´Ù¸é reloadÇÑ °ÍÀÌ´Ù..¶ó°í º»´Ù. by sigi. 2002.9.19 bReload = true; } BEGIN_DB { - // DynamicZone ó + // DynamicZone À» À§ÇÑ Ã³¸® ZoneID_t zoneID = m_pZone->getZoneID(); if (m_pZone->isDynamicZone()) { DynamicZone* pDynamicZone = m_pZone->getDynamicZone(); @@ -167,7 +167,7 @@ void MonsterManager::load() if (pResult->getRowCount() <= 0) { SAFE_DELETE(pStmt); - // throw Error("MonsterManager::load() : ʽϴ."); + // throw Error("MonsterManager::load() : Á¸ÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù."); return; } @@ -194,8 +194,8 @@ void MonsterManager::parseMonsterList(const string& text, bool bReload) //-------------------------------------------------------------------------------- // - // text Ķʹ ZoneInfo ̺ Monsters (TEXT) ÷ Ÿ. - // . + // text ÆÄ¶ó¹ÌÅÍ´Â ZoneInfo Å×À̺íÀÇ Monsters (TEXT) Ä÷³°ªÀ» ³ªÅ¸³½´Ù. + // Æ÷¸ËÀº ´ÙÀ½°ú °°´Ù. // // (MonsterType1,#Monster1) (MonsterType2,#Monter2)(..,..) // i j k i j k @@ -213,17 +213,17 @@ void MonsterManager::parseMonsterList(const string& text, bool bReload) if (i == string::npos || j == string::npos || k == string::npos || i > j || j > k) break; - // Ÿ԰ ִ Ѵ. Ÿ԰ ִ Ѵ. + // ¸ó½ºÅÍ Å¸ÀÔ°ú ÃÖ´ë °³¼ö¸¦ ±¸ÇÑ´Ù. ¸ó½ºÅÍ Å¸ÀÔ°ú ÃÖ´ë °³¼ö¸¦ ±¸ÇÑ´Ù. uint monsterType = atoi(text.substr(i + 1, j - i - 1).c_str()); uint maxMonsters = atoi(text.substr(j + 1, k - j - 1).c_str()); Assert(maxMonsters > 0); - // Monster Sprite Type ޾ƿ´. + // ¸ó½ºÅÍ ÀÎÆ÷·Î ºÎÅÍ Monster Sprite TypeÀ» ¹Þ¾Æ¿Â´Ù. const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo(monsterType); SpriteType_t spriteType = pMonsterInfo->getSpriteType(); - // ̹ ϴ θ üũѴ. + // ÀÌ¹Ì Á¸ÀçÇÏ´ÂÁöÀÇ ¿©ºÎ¸¦ üũÇÑ´Ù. unordered_map::iterator itr = m_Monsters.find(spriteType); if (itr != m_Monsters.end()) { @@ -231,31 +231,31 @@ void MonsterManager::parseMonsterList(const string& text, bool bReload) WORD NewMaxCount = CurrentMaxCount + maxMonsters; itr->second->setMaxMonsters(NewMaxCount); } else { - // ī ü , unordered_map Ѵ. + // ¸ó½ºÅÍÄ«¿îÅÍ °´Ã¼¸¦ »ý¼º, unordered_map ¿¡ µî·ÏÇÑ´Ù. MonsterCounter* pMonsterCounter = new MonsterCounter(monsterType, maxMonsters, 0); - // ʴ , ߰Ѵ. + // Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì, Ãß°¡ÇÑ´Ù. m_Monsters[spriteType] = pMonsterCounter; } //-------------------------------------------------------------------------------- - // شϴ Ÿ ͸ ߰Ѵ. + // ÇØ´çÇϴ ŸÀÔÀÇ ¸ó½ºÅ͸¦ Á¸¿¡ Ãß°¡ÇÑ´Ù. //-------------------------------------------------------------------------------- - if (!bReload) // reload ƴϸ.. + if (!bReload) // reload°¡ ¾Æ´Ï¸é.. { for (uint m = 0; m < maxMonsters; m++) { - // ǥ ãƳ. + // Á¸ÀÇ ºó ÁÂÇ¥¸¦ ã¾Æ³½´Ù. ZoneCoord_t x, y; if (!findPosition(monsterType, x, y)) { Assert(false); return; } - // ü ϰ ɷġ ʱȭѴ. + // ¸ó½ºÅÍ °´Ã¼¸¦ »ý¼ºÇÏ°í ´É·ÂÄ¡ µîÀ» ÃʱâÈ­ÇÑ´Ù. Monster* pMonster = new Monster(monsterType); //////////////////////////////////////////////////////////////////////////////// - // ̺Ʈ (7 1Ϻʹ ) + // ¿ùµåÄÅ À̺¥Æ® °ü·Ã(7¿ù 1ÀϺÎÅÍ´Â ¾ø¾îÁü) /* if(rand()%g_pVariableManager->getEventRatio() == 0 && g_pVariableManager->getEventActivate() == 1) @@ -263,7 +263,7 @@ void MonsterManager::parseMonsterList(const string& text, bool bReload) pMonster->setEventMonsterFlag(true); string MonsterName = g_pMonsterNameManager->getRandomName(pMonster, true); pMonster->setName(MonsterName); - //cout << "̺Ʈ ̸: " << pMonster->getName(); + //cout << "À̺¥Æ® ¸ó½ºÅÍ À̸§: " << pMonster->getName(); } */ /////////////////////////////////////////////////////////////////////////// @@ -272,7 +272,7 @@ void MonsterManager::parseMonsterList(const string& text, bool bReload) try { m_pZone->addCreature(pMonster, x, y, Directions(rand() & 0x07)); } catch (EmptyTileNotExistException&) { - // cerr << "MonsterManager::load() : ڸ ?" << endl; + // cerr << "MonsterManager::load() : ÀÚ¸®°¡ ¾ø³×?" << endl; SAFE_DELETE(pMonster); } } @@ -288,8 +288,8 @@ void MonsterManager::parseEventMonsterList(const string& text, bool bReload) //-------------------------------------------------------------------------------- // - // text Ķʹ ZoneInfo ̺ Monsters (TEXT) ÷ Ÿ. - // . + // text ÆÄ¶ó¹ÌÅÍ´Â ZoneInfo Å×À̺íÀÇ Monsters (TEXT) Ä÷³°ªÀ» ³ªÅ¸³½´Ù. + // Æ÷¸ËÀº ´ÙÀ½°ú °°´Ù. // // (MonsterType1,#Monster1,RegenDelay) (MonsterType2,#Monter2,RegenDelay)(..,..) // i j k l i j k l @@ -320,7 +320,7 @@ void MonsterManager::parseEventMonsterList(const string& text, bool bReload) l = m; } - // Ÿ԰ ִ Ѵ. Ÿ԰ ִ Ѵ. + // ¸ó½ºÅÍ Å¸ÀÔ°ú ÃÖ´ë °³¼ö¸¦ ±¸ÇÑ´Ù. ¸ó½ºÅÍ Å¸ÀÔ°ú ÃÖ´ë °³¼ö¸¦ ±¸ÇÑ´Ù. uint monsterType = atoi(text.substr(i + 1, j - i - 1).c_str()); uint maxMonsters = atoi(text.substr(j + 1, k - j - 1).c_str()); uint regenDelay = atoi(text.substr(k + 1, l - k - 1).c_str()); @@ -328,9 +328,9 @@ void MonsterManager::parseEventMonsterList(const string& text, bool bReload) Assert(maxMonsters > 0); //-------------------------------------------------------------------------------- - // شϴ Ÿ ͸ ߰Ѵ. + // ÇØ´çÇϴ ŸÀÔÀÇ ¸ó½ºÅ͸¦ Á¸¿¡ Ãß°¡ÇÑ´Ù. //-------------------------------------------------------------------------------- - if (!bReload) // reload ƴϸ.. + if (!bReload) // reload°¡ ¾Æ´Ï¸é.. { // cout << "[MM] load EventMonsterList: [" << m_pZone->getZoneID() << "] mtype=" << monsterType // << ", maxMonsters=" << maxMonsters @@ -349,7 +349,7 @@ void MonsterManager::parseEventMonsterList(const string& text, bool bReload) for (uint m = 0; m < maxMonsters; m++) { if (g_pVariableManager->isActiveChiefMonster()) { - // ǥ ãƳ. + // Á¸ÀÇ ºó ÁÂÇ¥¸¦ ã¾Æ³½´Ù. ZoneCoord_t x, y; if (tx != -1) { x = tx; @@ -359,7 +359,7 @@ void MonsterManager::parseEventMonsterList(const string& text, bool bReload) return; } - // ü ϰ ɷġ ʱȭѴ. + // ¸ó½ºÅÍ °´Ã¼¸¦ »ý¼ºÇÏ°í ´É·ÂÄ¡ µîÀ» ÃʱâÈ­ÇÑ´Ù. Monster* pMonster = new Monster(monsterType); Assert(pMonster != NULL); @@ -377,14 +377,14 @@ void MonsterManager::parseEventMonsterList(const string& text, bool bReload) try { m_pZone->addCreature(pMonster, x, y, Directions(rand() & 0x07)); - // ׷Ʈ Ǿ + // ±×·¹ÀÌÆ® ·¯ÇǾð /* if ( monsterType == 764 ) { static TPOINT pos[] = { { 41, 52 }, { 72, 114 }, { 104, 35 } }; - // ġ 20 + // ¸®Ä¡Á© 20¸¶¸® for ( int j=0; j<3; ++j ) for ( int i=0; i<20; ++i ) { @@ -394,7 +394,7 @@ void MonsterManager::parseEventMonsterList(const string& text, bool bReload) } }*/ } catch (EmptyTileNotExistException&) { - // cerr << "MonsterManager::load() : ڸ ?" << endl; + // cerr << "MonsterManager::load() : ÀÚ¸®°¡ ¾ø³×?" << endl; SAFE_DELETE(pMonster); } } else { @@ -421,10 +421,10 @@ void MonsterManager::addCreature(Creature* pCreature) Monster* pMonster = dynamic_cast(pCreature); - // ũó ؽʿ ߰Ѵ. + // Å©¸®Ã³ ÇØ½¬¸Ê¿¡ Ãß°¡ÇÑ´Ù. CreatureManager::addCreature(pMonster); - // event monster MonsterCounter  ʰ Ѵ. by sigi. 2002.10.14 + // event monster´Â MonsterCounter¿¡ µé¾î°¡Áö ¾Ê°Ô ÇÑ´Ù. by sigi. 2002.10.14 if (m_pEventMonsterInfo != NULL && pMonster->isEventMonster()) { uint index = pMonster->getEventMonsterIndex(); @@ -442,17 +442,17 @@ void MonsterManager::addCreature(Creature* pCreature) return; } - // ׷ Ÿ ִ üũѴ. + // ±×·± ¸ó½ºÅÍ Å¸ÀÔÀÌ Á¸¿¡ Á¸ÀçÇÒ ¼ö ÀÖ´ÂÁö üũÇÑ´Ù. unordered_map::iterator itr = m_Monsters.find(pMonster->getSpriteType()); if (itr == m_Monsters.end()) { StringStream msg; - msg << " Ÿ Ͱ ߰Ǿϴ.\n" - << " [" << m_pZone->getZoneID() << "]Դϴ.\n" - << "߰Ϸ Ÿ [" << pMonster->getMonsterType() << "]Դϴ.\n"; + msg << "ÇöÀç Á¸¿¡ Á¸ÀçÇÒ ¼ö ¾ø´Â ŸÀÔÀÇ ¸ó½ºÅͰ¡ Ãß°¡µÇ¾ú½À´Ï´Ù.\n" + << "ÇöÀç Á¸Àº [" << m_pZone->getZoneID() << "]ÀÔ´Ï´Ù.\n" + << "Ãß°¡ÇÏ·Á°í ÇÑ ¸ó½ºÅÍÀÇ Å¸ÀÔÀº [" << pMonster->getMonsterType() << "]ÀÔ´Ï´Ù.\n"; // throw Error(msg.toString()); } else { - // ī͸ Ų. + // ¸ó½ºÅÍ Ä«¿îÅ͸¦ Áõ°¡½ÃŲ´Ù. itr->second->addMonster(); } @@ -467,28 +467,28 @@ void MonsterManager::deleteCreature(ObjectID_t creatureID) { __BEGIN_TRY - // ũó ؽʿ ׷ OID Ͱ ϴ üũѴ. + // Å©¸®Ã³ ÇØ½¬¸Ê¿¡ ±×·± OID ¸¦ °¡Áø ¸ó½ºÅͰ¡ Á¸ÀçÇÏ´ÂÁö üũÇÑ´Ù. unordered_map::iterator itr = m_Creatures.find(creatureID); if (itr == m_Creatures.end()) { cerr << "MonsterManager::deleteCreature() : NoSuchElementException" << endl; - // ̰͵ ܺο ó ȵǰ ִ° . + // À̰͵µ ¿ÜºÎ¿¡¼­ Á¦´ë·Î ó¸® ¾ÈµÇ°í Àִ°Š°°´Ù. // by sigi. 2002.5.9 - // throw NoSuchElementException("׷ ObjectID ʹ ʽϴ."); + // throw NoSuchElementException("±×·± ObjectID¸¦ °¡Áø ¸ó½ºÅÍ´Â Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù."); return; } Monster* pMonster = dynamic_cast(itr->second); - // ũó ؽ ش 带 Ѵ. - // Լ ִ ÷ȴ. by sigi - // ٺ~ itr 带 ¡~. 2002.10.12 by bezz + // Å©¸®Ã³ ÇØ½¬¸ÊÀÇ ÇØ´ç ³ëµå¸¦ »èÁ¦ÇÑ´Ù. + // ÇÔ¼ö ³¡¿¡ ÀÖ´ø°É ¿©±â·Î ¿Ã·È´Ù. by sigi + // ¹Ùº¸¾ß~ itr ÂüÁ¶´Â ³¡³»°í ³ëµå¸¦ Áö¿ö¾ß¡~. 2002.10.12 by bezz m_Creatures.erase(itr); - // event monster MonsterCounter . by sigi .2002.10.14 + // event monster´Â MonsterCounter¶û °ü°è¾ø´Ù. by sigi .2002.10.14 if (m_pEventMonsterInfo != NULL && pMonster->isEventMonster() && pMonster->getMonsterType() != 764) { uint index = pMonster->getEventMonsterIndex(); @@ -502,14 +502,14 @@ void MonsterManager::deleteCreature(ObjectID_t creatureID) return; } - // īͿ ׷ Ÿ ϴ üũѴ. + // ¸ó½ºÅÍ Ä«¿îÅÍ¿¡ ±×·± ¸ó½ºÅÍ Å¸ÀÔÀÌ Á¸ÀçÇÏ´ÂÁö üũÇÑ´Ù. unordered_map::iterator itr2 = m_Monsters.find(pMonster->getSpriteType()); if (itr2 == m_Monsters.end()) { cerr << "MonsterManager::deleteCreature() : NoSuchElementException" << endl; - // throw NoSuchElementException("׷ SpriteType ʹ ʽϴ."); + // throw NoSuchElementException("±×·± SpriteTypeÀ» °¡Áø ¸ó½ºÅÍ´Â Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù."); } else { - // ڸ δ. + // ¸ó½ºÅÍÀÇ ¼ýÀÚ¸¦ ÁÙÀδÙ. itr2->second->deleteMonster(); } @@ -518,8 +518,8 @@ void MonsterManager::deleteCreature(ObjectID_t creatureID) } //////////////////////////////////////////////////////////////////////////////// -// ü νѴ. 2002.7.22 by sigi -// pAttackedMonster pCreature 쿡 +// ÀüüÀÇ ÀáÀçÀûÀÎ ÀûÀ¸·Î ÀνÄÇÑ´Ù. 2002.7.22 by sigi +// pAttackedMonster¸¦ pCreature°¡ °ø°ÝÇÑ °æ¿ì¿¡ //////////////////////////////////////////////////////////////////////////////// void MonsterManager::addPotentialEnemy(Monster* pAttackedMonster, Creature* pCreature) @@ -533,11 +533,11 @@ void MonsterManager::addPotentialEnemy(Monster* pAttackedMonster, Creature* pCre for (; itr != m_Creatures.end(); itr++) { Creature* pMonsterCreature = itr->second; - // ִ Ÿ Ѵ. + // ¶§¸° ³ðÀ» º¼¼ö ÀÖ´Â °Å¸®¿©¾ß ÇÑ´Ù. Distance_t dist = pMonsterCreature->getDistance(pCreature->getX(), pCreature->getY()); if (dist <= pMonsterCreature->getSight() - // ڽ ٸ ڵ忡 üũѴ. + // ÀÚ½ÅÀº ´Ù¸¥ Äڵ忡¼­ üũÇÑ´Ù. && pMonsterCreature != pAttackedMonster) { Monster* pMonster = dynamic_cast(pMonsterCreature); // cout << "addPotentialEnemy: " << pMonster->getName().c_str() << endl; @@ -550,8 +550,8 @@ void MonsterManager::addPotentialEnemy(Monster* pAttackedMonster, Creature* pCre } //////////////////////////////////////////////////////////////////////////////// -// ü νѴ. 2002.7.22 by sigi -// pAttackedMonster pCreature 쿡 +// ÀüüÀÇ ÀûÀ¸·Î ÀνÄÇÑ´Ù. 2002.7.22 by sigi +// pAttackedMonster¸¦ pCreature°¡ °ø°ÝÇÑ °æ¿ì¿¡ //////////////////////////////////////////////////////////////////////////////// void MonsterManager::addEnemy(Monster* pAttackedMonster, Creature* pCreature) @@ -565,11 +565,11 @@ void MonsterManager::addEnemy(Monster* pAttackedMonster, Creature* pCreature) for (; itr != m_Creatures.end(); itr++) { Creature* pMonsterCreature = itr->second; - // ִ Ÿ Ѵ. + // ¶§¸° ³ðÀ» º¼¼ö ÀÖ´Â °Å¸®¿©¾ß ÇÑ´Ù. Distance_t dist = pMonsterCreature->getDistance(pCreature->getX(), pCreature->getY()); if (dist <= pMonsterCreature->getSight() - // ڽ ٸ ڵ忡 üũѴ. + // ÀÚ½ÅÀº ´Ù¸¥ Äڵ忡¼­ üũÇÑ´Ù. && pMonsterCreature != pAttackedMonster) { Monster* pMonster = dynamic_cast(pMonsterCreature); // cout << "addEnemy: " << pMonster->getName().c_str() << endl; @@ -582,7 +582,7 @@ void MonsterManager::addEnemy(Monster* pAttackedMonster, Creature* pCreature) } //////////////////////////////////////////////////////////////////////////////// -// ũó Ŵ ӵ ͵ AI ׼ Ѵ. +// Å©¸®Ã³ ¸Å´ÏÀú¿¡ Á¾¼ÓµÈ ¸ó½ºÅ͵éÀÇ AI¿¡ ÀÇÇÑ ¾×¼ÇÀ» ½ÇÇàÇÑ´Ù. //////////////////////////////////////////////////////////////////////////////// void MonsterManager::processCreatures() @@ -626,16 +626,16 @@ void MonsterManager::processCreatures() if (itr == m_Monsters.end()) { //cerr << "MonsterManager::processCreatures() : NoSuchElementException" << endl; - //throw NoSuchElementException("׷ SpriteType ʹ ʽϴ."); + //throw NoSuchElementException("±×·± SpriteTypeÀ» °¡Áø ¸ó½ºÅÍ´Â Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù."); } else { - // ڸ δ. + // ¸ó½ºÅÍÀÇ ¼ýÀÚ¸¦ ÁÙÀδÙ. itr->second->deleteMonster(); } - // Ÿϰ Ŵ ũó Ѵ. + // ŸÀϰú ¸ó½ºÅÍ ¸Å´ÏÀú¿¡¼­ Å©¸®Ã³¸¦ »èÁ¦ÇÑ´Ù. Tile & tile = pZone->getTile(cx , cy); tile.deleteCreature(monsterID); @@ -691,31 +691,31 @@ void MonsterManager::processCreatures() } } } else { - // ī͸ ϳ δ. + // ¸ó½ºÅÍ Ä«¿îÅ͸¦ Çϳª ÁÙÀδÙ. unordered_map::iterator itr = m_Monsters.find(pMonster->getSpriteType()); if (itr == m_Monsters.end()) { // cerr << "MonsterManager::processCreatures() : NoSuchElementException" << endl; - // throw NoSuchElementException("׷ SpriteType ʹ ʽϴ."); + // throw NoSuchElementException("±×·± SpriteTypeÀ» °¡Áø ¸ó½ºÅÍ´Â Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù."); } else { - // ڸ δ. + // ¸ó½ºÅÍÀÇ ¼ýÀÚ¸¦ ÁÙÀδÙ. itr->second->deleteMonster(); } } __BEGIN_PROFILE_MONSTER("MM_CREATURE_DEADACTION"); - // ͸ ̱ ׼ ϰ Ѵ. + // ¸ÕÀú ¸ó½ºÅ͸¦ Á×À̱â Àü¿¡ ¸¶Áö¸· ¾×¼ÇÀ» ÃëÇÏ°Ô ÇÑ´Ù. pMonster->actDeadAction(); __END_PROFILE_MONSTER("MM_CREATURE_DEADACTION"); __BEGIN_PROFILE_MONSTER("MM_KILL_CREATURE"); - // ͸ ϰ, εijƮѴ. + // ¸ó½ºÅ͸¦ Á¸¿¡¼­ Á¦°ÅÇϰí, ºê·Îµåij½ºÆ®ÇÑ´Ù. killCreature(pMonster); __END_PROFILE_MONSTER("MM_KILL_CREATURE"); - // Ϳ ũó ؽ 带 Ѵ. - // ߸ , . + // ¸ó½ºÅÍ¿¡ ´ëÇÑ Å©¸®Ã³ÀÇ ÇØ½¬¸ÊÀÇ ³ëµå¸¦ »èÁ¦ÇÑ´Ù. + // À߸ø »èÁ¦ÇÒ °æ¿ì, ¿¬°áÀÌ ±úÁú ¿ì·Á°¡ ÀÖÀ¸´Ï ÁÖÀÇÇÒ °Í. if (before == m_Creatures.end()) { m_Creatures.erase(current); current = m_Creatures.begin(); @@ -728,24 +728,24 @@ void MonsterManager::processCreatures() } } - // ڵ忡 findPosition̶ Լ ϳ ִ. - // 30 Ͱ ׾ , ͵ ڸ ãµ - // ɸ ð ִ. ׸ ð - // ߻Ѵ. δ , ̱ ؼ - // ˻縦 ϵ Ѵ. -- 輺 - // ֱ⸶ ڸ Ȯؼ ش. + // ¸ó½ºÅÍ Àç»ý Äڵ忡 findPositionÀ̶ó´Â ¹«ÇÑ ·çÇÁ ÇÔ¼ö°¡ Çϳª ÀÖ´Ù. + // 30ÃÊ µ¿¾È ¿©·¯ ¸¶¸®ÀÇ ¸ó½ºÅͰ¡ Á×¾úÀ» ¶§, ÀÌ ¸ó½ºÅ͵éÀ» ¸®Á¨ÇÒ ÀÚ¸®¸¦ ã´Âµ¥ + // °É¸®´Â ½Ã°£ÀÌ ±æ¾îÁú ¼ö°¡ ÀÖ´Ù. ±×¸®°í ÀÌ ½Ã°£ÀÌ ±æ¾îÁö¸é ·¢ÀÌ + // ¹ß»ýÇÑ´Ù. Æò±ÕÀûÀ¸·Î´Â Á» ´À·ÁÁö´õ¶óµµ, ·ºÀ» ÁÙÀ̱â À§Çؼ­ + // ¸®Á¨¿¡ ´ëÇÑ °Ë»ç¸¦ ¸ÅÅÏ Çϵµ·Ï º¯°æÇÑ´Ù. -- ±è¼º¹Î + // ÀÏÁ¤ Áֱ⸶´Ù ¸ó½ºÅÍ ¼ýÀÚ¸¦ È®ÀÎÇØ¼­ ¸®Á¨½ÃÄÑÁØ´Ù. if (m_RegenTime < currentTime) { __BEGIN_PROFILE_MONSTER("MM_REGENERATE_CREATURES"); regenerateCreatures(); - m_RegenTime.tv_sec = currentTime.tv_sec + 5; // 5 + m_RegenTime.tv_sec = currentTime.tv_sec + 5; // 5ÃÊ ÈÄ ¸®Á¨ m_RegenTime.tv_usec = currentTime.tv_usec; __END_PROFILE_MONSTER("MM_REGENERATE_CREATURES"); } - // ̰ ּó ȵǾ־.. by sigi. 2002.5.3 + // À̰Š¿Ö ÁÖ¼®Ã³¸® ¾ÈµÇ¾îÀÖ¾úÁö.. by sigi. 2002.5.3 // regenerateCreatures(); } catch (Throwable& t) { filelog("MonsterManagerBug.log", "ProcessCreatureBug : %s", t.toString().c_str()); @@ -758,7 +758,7 @@ void MonsterManager::processCreatures() } //////////////////////////////////////////////////////////////////////////////// -// ڰ پ ͸ Ѵ. +// ¸ó½ºÅÍÀÇ ¼ýÀÚ°¡ ÁÙ¾îµé¸é ¸ó½ºÅ͸¦ Àç»ý¼ºÇÑ´Ù. //////////////////////////////////////////////////////////////////////////////// void MonsterManager::regenerateCreatures() @@ -766,19 +766,19 @@ void MonsterManager::regenerateCreatures() __BEGIN_TRY __BEGIN_DEBUG - // ߿ ȵǰ.. + // ÀüÀï Áß¿¡ ¸ó½ºÅÍ ¸®Á¨ ¾ÈµÇ°Ô.. if (m_pZone->isHolyLand()) { - // + // Á¾Á· ÀüÀï Áß if (g_pWarSystem->hasActiveRaceWar()) return; - // .. + // ±æµå ÀüÀï Áß.. if (m_CastleZoneID != 0 && g_pWarSystem->hasCastleActiveWar(m_CastleZoneID)) { CastleInfo* pCastleInfo = g_pCastleInfoManager->getCastleInfo(m_CastleZoneID); if (pCastleInfo != NULL) { GuildID_t OwnerGuildID = pCastleInfo->getGuildID(); - // 뼺 ƴ Ѵ.==뼺 Ѵ. + // °ø¿ë¼ºÀÌ ¾Æ´Ñ °æ¿ì´Â ¸®Á¨ ¾ÈÇÑ´Ù.==°ø¿ë¼ºÀº ¸®Á¨ ÇÑ´Ù. if (OwnerGuildID != SlayerCommon && OwnerGuildID != VampireCommon && OwnerGuildID != OustersCommon) { return; } @@ -786,7 +786,7 @@ void MonsterManager::regenerateCreatures() } } - // ϴ ̶ -_-;; + // ·¹º§º° ÀüÀïÀ» ÇÏ´Â ÁßÀ̶ó¸é -_-;; ZoneID_t zoneID = m_pZone->getZoneID(); if (zoneID == 1131 || zoneID == 1132 || zoneID == 1133 || zoneID == 1134) { if (!g_pSweeperBonusManager->isAble(zoneID)) @@ -797,7 +797,7 @@ void MonsterManager::regenerateCreatures() for (; itr != m_Monsters.end(); itr++) { MonsterCounter* pCounter = itr->second; - // Ͱ پ ... + // ¸ó½ºÅͰ¡ ÁÙ¾îµé¾úÀ» °æ¿ì... while (pCounter->getCurrentMonsters() < pCounter->getMaxMonsters()) { SpriteType_t SpriteType = itr->first; MonsterType_t monsterType = 0; @@ -807,20 +807,20 @@ void MonsterManager::regenerateCreatures() monsterType = RegenVector[rand() % RegenVector.size()]; - // ǥ ãƳ. + // Á¸ÀÇ ºó ÁÂÇ¥¸¦ ã¾Æ³½´Ù. ZoneCoord_t x, y; if (!findPosition(monsterType, x, y)) { Assert(false); return; } - // ü ϰ ɷġ ʱȭѴ. + // ¸ó½ºÅÍ °´Ã¼¸¦ »ý¼ºÇÏ°í ´É·ÂÄ¡ µîÀ» ÃʱâÈ­ÇÑ´Ù. Monster* pMonster = new Monster(monsterType); Assert(pMonster != NULL); ///////////////////////////////////////////////////////////////////// - // ͸ ߰ϴ ̺Ʈ ˻縦 Ѵ. - /// 7 1ڷ ( ̺Ʈ ) + // ¸ó½ºÅ͸¦ Ãß°¡ÇÏ´Â ½ÃÁ¡¿¡¼­ À̺¥Æ® ¸ó½ºÅÍÀÎÁö °Ë»ç¸¦ ÇÑ´Ù. + /// 7¿ù 1ÀÏÀÚ·Î »èÁ¦ (¿ùµåÄÅ À̺¥Æ® ³¡) /* if(rand()%g_pVariableManager->getEventRatio()==0 && g_pVariableManager->getEventActivate() == 1 ) @@ -829,7 +829,7 @@ void MonsterManager::regenerateCreatures() string MonsterName = g_pMonsterNameManager->getRandomName(pMonster, true); pMonster->setName(MonsterName); - //cout << "̺Ʈ ̸: " << MonsterName; + //cout << "À̺¥Æ® ¸ó½ºÅÍ À̸§: " << MonsterName; } */ ///////////////////////////////////////////////////////////////////// @@ -837,7 +837,7 @@ void MonsterManager::regenerateCreatures() try { m_pZone->addCreature(pMonster, x, y, Directions(rand() % 8)); } catch (EmptyTileNotExistException&) { - // cerr << "MonsterManager::processCreatures() : ڸ ?" << endl; + // cerr << "MonsterManager::processCreatures() : ÀÚ¸®°¡ ¾ø³×?" << endl; SAFE_DELETE(pMonster); } } @@ -857,7 +857,7 @@ void MonsterManager::regenerateCreatures() // cout << i << " "; MonsterType_t monsterType = info.monsterType; - // ǥ ãƳ. + // Á¸ÀÇ ºó ÁÂÇ¥¸¦ ã¾Æ³½´Ù. ZoneCoord_t x, y; if (info.x != -1) { x = info.x; @@ -867,7 +867,7 @@ void MonsterManager::regenerateCreatures() return; } - // ü ϰ ɷġ ʱȭѴ. + // ¸ó½ºÅÍ °´Ã¼¸¦ »ý¼ºÇÏ°í ´É·ÂÄ¡ µîÀ» ÃʱâÈ­ÇÑ´Ù. Monster* pMonster = new Monster(monsterType); Assert(pMonster != NULL); @@ -876,14 +876,14 @@ void MonsterManager::regenerateCreatures() try { m_pZone->addCreature(pMonster, x, y, Directions(rand() % 8)); - // ׷Ʈ Ǿ + // ±×·¹ÀÌÆ® ·¯ÇǾð /* if ( monsterType == 764 ) { static TPOINT pos[] = { { 41, 52 }, { 72, 114 }, { 104, 35 } }; - // ġ 20 + // ¸®Ä¡Á© 20¸¶¸® for ( int j=0; j<3; ++j ) for ( int i=0; i<20; ++i ) { @@ -893,7 +893,7 @@ void MonsterManager::regenerateCreatures() } }*/ } catch (EmptyTileNotExistException&) { - // cerr << "MonsterManager::processCreatures() : ڸ ?" << endl; + // cerr << "MonsterManager::processCreatures() : ÀÚ¸®°¡ ¾ø³×?" << endl; SAFE_DELETE(pMonster); } } @@ -929,21 +929,21 @@ bool MonsterManager::findPosition(MonsterType_t monsterType, ZoneCoord_t& RX, Zo /* if ( monsterType == 722 ) { - // 巹 -_-;; + // Áúµå·¹ ¼®»ó -_-;; RX = 94; RY = 172; return true; }*/ - // ε... Ȥö ? + // ¹«ÇÑ ·çÇÁÀε¥... Ȥ½Ã¶óµµ ¹®Á¦°¡ ÀÖÀ»±î? while (true) { const BPOINT& pt = m_pZone->getRandomMonsterRegenPosition(); Tile& rTile = m_pZone->getTile(pt.x, pt.y); - // 1. Ÿ ϵǾ ʰ - // 2. ŸϿ Ż , - // 3. 밡 ƴ϶ + // 1. ŸÀÏÀÌ ºí·ÏµÇ¾î ÀÖÁö ¾Ê°í + // 2. ŸÀÏ¿¡ Æ÷Å»ÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸ç, + // 3. ¾ÈÀüÁö´ë°¡ ¾Æ´Ï¶ó¸é if (!rTile.isBlocked(pMonsterInfo->getMoveMode()) && !rTile.hasPortal() && !(m_pZone->getZoneLevel(pt.x, pt.y) & SAFE_ZONE)) { RX = pt.x; @@ -957,14 +957,14 @@ bool MonsterManager::findPosition(MonsterType_t monsterType, ZoneCoord_t& RX, Zo } } - // ϱ, ? + // À§¿¡¼­ ¹«ÇÑ ·çÇÁ´Ï±î, ¿©±â±îÁö ¸ø ¿À°ÚÁö? return false; __END_CATCH } //////////////////////////////////////////////////////////////////////////////// -// ũó óѴ. +// Á×Àº Å©¸®Ã³¸¦ ó¸®ÇÑ´Ù. //////////////////////////////////////////////////////////////////////////////// void MonsterManager::killCreature(Creature* pDeadCreature) @@ -981,37 +981,37 @@ void MonsterManager::killCreature(Creature* pDeadCreature) ZoneCoord_t cx = pDeadMonster->getX(); ZoneCoord_t cy = pDeadMonster->getY(); - // ׾ϱ 켱 ش. + // Á×¾úÀ¸´Ï±î ¿ì¼±±ÇÀ» °è»êÇØÁØ´Ù. PrecedenceTable* pTable = pDeadMonster->getPrecedenceTable(); pTable->compute(); if (pTable->getHostName() == "") { - // ƹ ٸ ִ´. + // ¾Æ¹«µµ ¶§¸° ³ÑÀÌ ¾ø´Ù¸é ¾ÆÀÌÅÛÀ» ¾È ³Ö´Â´Ù. pDeadMonster->setTreasure(false); } else { pDeadMonster->setHostName(pTable->getHostName()); pDeadMonster->setHostPartyID(pTable->getHostPartyID()); } - // ٴڿ ߸, Ʈ Ѹ. + // ¸ÕÀú ¹Ù´Ú¿¡ ¾²·¯¶ß¸®¶ó°í, ÀÌÆåÆ®¸¦ »Ñ¸°´Ù. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pDeadCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_COMA); gcAddEffect.setDuration(0); pZone->broadcastPacket(cx, cy, &gcAddEffect); - // + // ¸ó½ºÅÍ Á¦°Å Tile& tile = m_pZone->getTile(cx, cy); tile.deleteCreature(pDeadMonster->getObjectID()); - // DynamicZone ϰ ó + // DynamicZone Àϰæ¿ìÀÇ Ã³¸® if (m_pZone->isDynamicZone()) { DynamicZone* pDynamicZone = m_pZone->getDynamicZone(); Assert(pDynamicZone != NULL); if (pDynamicZone->getTemplateZoneID() == 4001) { - // Ա ó + // Á¦´ÜÀÇ ÀÔ±¸ÀÇ °æ¿ì ó¸® DynamicZoneGateOfAlter* pGateOfAlter = dynamic_cast(pDynamicZone); Assert(pGateOfAlter != NULL); @@ -1019,7 +1019,7 @@ void MonsterManager::killCreature(Creature* pDeadCreature) } } - // ׶ Ż ü + // ±×¶ó¿îµå ¿¤¸®¸àÅ»Àº ½Ãüµµ ¾øÁö·Õ if (pDeadMonster->getMonsterType() == GROUND_ELEMENTAL_TYPE) { GCDeleteObject* pGCDO = new GCDeleteObject; pGCDO->setObjectID(pDeadMonster->getObjectID()); @@ -1027,7 +1027,7 @@ void MonsterManager::killCreature(Creature* pDeadCreature) EffectPacketSend* pEffectPacketSend = new EffectPacketSend(pDeadMonster->getZone(), pDeadMonster->getX(), pDeadMonster->getY()); pEffectPacketSend->setPacket(pGCDO); - // 1 ڿ Ŷ ~ + // 1ÃÊ µÚ¿¡ ÆÐŶ º¸³»¾ßÁã~ pEffectPacketSend->setDeadline(10); pDeadMonster->getZone()->registerObject(pEffectPacketSend); pDeadMonster->getZone()->addEffect(pEffectPacketSend); @@ -1035,14 +1035,14 @@ void MonsterManager::killCreature(Creature* pDeadCreature) SAFE_DELETE(pDeadMonster); return; } else if (pDeadMonster->getMonsterType() == 764) { - // ׷Ʈ Ǿ + // ±×·¹ÀÌÆ® ·¯ÇǾð GCDeleteObject* pGCDO = new GCDeleteObject; pGCDO->setObjectID(pDeadMonster->getObjectID()); EffectPacketSend* pEffectPacketSend = new EffectPacketSend(pDeadMonster->getZone(), pDeadMonster->getX(), pDeadMonster->getY()); pEffectPacketSend->setPacket(pGCDO); - // 1 ڿ Ŷ ~ + // 1ÃÊ µÚ¿¡ ÆÐŶ º¸³»¾ßÁã~ pEffectPacketSend->setDeadline(10); pDeadMonster->getZone()->registerObject(pEffectPacketSend); pDeadMonster->getZone()->addEffect(pEffectPacketSend); @@ -1058,8 +1058,8 @@ void MonsterManager::killCreature(Creature* pDeadCreature) return; } else if (pDeadMonster->getMonsterType() == 793 || pDeadMonster->getMonsterType() == 794 || pDeadMonster->getMonsterType() == 795) { - // ̾, ̾, ƿ콺 ü - // ٷ . + // ½½·¹À̾î, ¹ìÆÄÀ̾î, ¾Æ¿ì½ºÅÍÁî Á¦¹°µµ ½Ãü ¾ö²¿ + // ¹Ù·Î ¾ø¾Ö ¹ö¸°´Ù. GCDeleteObject gcDO; gcDO.setObjectID(pDeadMonster->getObjectID()); pDeadMonster->getZone()->broadcastPacket(pDeadMonster->getX(), pDeadMonster->getY(), &gcDO); @@ -1068,7 +1068,7 @@ void MonsterManager::killCreature(Creature* pDeadCreature) return; } - // ü ü ϰ, OID Ҵ޴´. + // ½Ãü °´Ã¼¸¦ »ý¼ºÇϰí, OID ¸¦ ÇÒ´ç¹Þ´Â´Ù. MonsterCorpse* pMonsterCorpse = new MonsterCorpse(pDeadMonster); pMonsterCorpse->setHostName(pDeadMonster->getHostName()); pMonsterCorpse->setHostPartyID(pDeadMonster->getHostPartyID()); @@ -1077,7 +1077,7 @@ void MonsterManager::killCreature(Creature* pDeadCreature) pMonsterCorpse->setExp((Exp_t)computeCreatureExp(pDeadMonster, 100)); pMonsterCorpse->setLastKiller(pDeadMonster->getLastKiller()); - // ü ߰صд. + // Á×Àº ¸ó½ºÅÍ Á¾·ù¿¡ µû¶ó¼­ ½Ãü¿¡ ¾ÆÀÌÅÛÀ» Ãß°¡ÇصдÙ. addItem(pDeadMonster, pMonsterCorpse); // by sigi. 2002.12.12 @@ -1101,12 +1101,12 @@ void MonsterManager::killCreature(Creature* pDeadCreature) } } - // ũó ׾ٰ ֺ ˷ش. + // Å©¸®Ã³°¡ Á×¾ú´Ù°í ÁÖº¯¿¡ ¾Ë·ÁÁØ´Ù. GCCreatureDied gcCreatureDied; gcCreatureDied.setObjectID(pDeadMonster->getObjectID()); m_pZone->broadcastPacket(cx, cy, &gcCreatureDied); - // 쿡 鼭 ϴ°.. by sigi. 2002.9.13 + // ¸¶½ºÅÍÀÎ °æ¿ì¿¡ Á×À¸¸é¼­ ÇÑ ¸¶µð Çϴ°Å.. by sigi. 2002.9.13 if (pDeadMonster->isMaster()) { // MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo( pDeadMonster->getMonsterType() ); MasterLairInfo* pMasterLairInfo = g_pMasterLairInfoManager->getMasterLairInfo(pZone->getZoneID()); @@ -1145,7 +1145,7 @@ void MonsterManager::killCreature(Creature* pDeadCreature) pZone->broadcastPacket(cx, cy, &gcSay); } - // ũĸ Ѵ. + // Å©¸®Ãĸ¦ »èÁ¦ÇÑ´Ù. SAFE_DELETE(pDeadMonster); __END_DEBUG @@ -1155,8 +1155,8 @@ void MonsterManager::killCreature(Creature* pDeadCreature) //////////////////////////////////////////////////////////////////////////////// // addCreature // -// (x, y) ó -// monsterType Monster num ߰Ѵ. +// (x, y) ±Ùó¿¡ +// monsterTypeÀÇ Monster¸¦ num¸¶¸® Ãß°¡ÇÑ´Ù. //////////////////////////////////////////////////////////////////////////////// void MonsterManager::addMonsters(ZoneCoord_t x, ZoneCoord_t y, MonsterType_t monsterType, int num, const SUMMON_INFO& summonInfo, list* pSummonedMonsters) { @@ -1164,34 +1164,34 @@ void MonsterManager::addMonsters(ZoneCoord_t x, ZoneCoord_t y, MonsterType_t mon ClanType_t clanType = CLAN_VAMPIRE_MONSTER; // default - // group ü clan + // group Àüü°¡ °°Àº clan if (summonInfo.clanType == SUMMON_INFO::CLAN_TYPE_RANDOM_GROUP || summonInfo.clanType == SUMMON_INFO::CLAN_TYPE_GROUP) { clanType = summonInfo.clanID; // rand()%90+2; } - // ǥ ãƳ. + // Á¸ÀÇ ºó ÁÂÇ¥¸¦ ã¾Æ³½´Ù. for (int i = 0; i < num; i++) { pt = findSuitablePosition(m_pZone, x, y, Creature::MOVE_MODE_WALKING); - // ġ ã ߰ų, ߰ . + // À§Ä¡¸¦ ãÁö ¸øÇ߰ųª, ¾ÈÀüÁö´ë¶ó¸é Ãß°¡ÇÒ ¼ö ¾ø´Ù. if (pt.x == -1 || (m_pZone->getZoneLevel(pt.x, pt.y) & SAFE_ZONE)) { return; } Monster* pMonster = NULL; - // ü ϰ ɷġ ʱȭѴ. + // ¸ó½ºÅÍ °´Ã¼¸¦ »ý¼ºÇÏ°í ´É·ÂÄ¡ µîÀ» ÃʱâÈ­ÇÑ´Ù. try { pMonster = new Monster(monsterType); - // cout << " ߰" << endl; + // cout << "¸ó½ºÅÍ Ãß°¡" << endl; - // ȯ Ͱ °? + // ¼ÒȯµÈ ¸ó½ºÅͰ¡ ¾ÆÀÌÅÛÀ» °¡Áö´Â°¡? pMonster->setTreasure(summonInfo.hasItem); //////////////////////////////////////////////////////////////////////////////// - // ͸ ߰ϴ ̺Ʈ ˻縦 Ѵ. - // 7 1 ̺Ʈ ౸ + // ¸ó½ºÅ͸¦ Ãß°¡ÇÏ´Â ½ÃÁ¡¿¡¼­ À̺¥Æ® ¸ó½ºÅÍÀÎÁö °Ë»ç¸¦ ÇÑ´Ù. + // 7¿ù 1ÀÏ À̺¥Æ® ³¡À¸·Î Ã౸°ø ³ª¿ÀÁö ¾ÊÀ½ /* if(rand()%g_pVariableManager->getEventRatio()==0 && g_pVariableManager->getEventActivate() == 1 ) @@ -1200,7 +1200,7 @@ void MonsterManager::addMonsters(ZoneCoord_t x, ZoneCoord_t y, MonsterType_t mon string MonsterName = g_pMonsterNameManager->getRandomName(pMonster, true); pMonster->setName(MonsterName); - //cout << "̺Ʈ ̸: " << MonsterName; + //cout << "À̺¥Æ® ¸ó½ºÅÍ À̸§: " << MonsterName; } */ /////////////////////////////////////////////////////////////////////////// @@ -1208,7 +1208,7 @@ void MonsterManager::addMonsters(ZoneCoord_t x, ZoneCoord_t y, MonsterType_t mon Assert(pMonster != NULL); if (summonInfo.regenType == REGENTYPE_PORTAL) { - // Ȥ ̹ 𸣴 ͵ ش. + // Ȥ½Ã ÀÌ¹Ì ¼³Á¤µÅÀÖÀ»Áöµµ ¸ð¸£´Â °ÍµéÀ» Á¦°ÅÇØÁØ´Ù. pMonster->removeFlag(Effect::EFFECT_CLASS_HIDE); pMonster->removeFlag(Effect::EFFECT_CLASS_INVISIBILITY); pMonster->removeFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT); @@ -1261,13 +1261,13 @@ void MonsterManager::addMonsters(ZoneCoord_t x, ZoneCoord_t y, MonsterType_t mon } } catch (EmptyTileNotExistException&) { - // cerr << "MonsterManager::processCreatures() : ڸ ?" << endl; + // cerr << "MonsterManager::processCreatures() : ÀÚ¸®°¡ ¾ø³×?" << endl; SAFE_DELETE(pMonster); } } } //////////////////////////////////////////////////////////////////////////////// -// ͿԼ Ѵ. +// Á×Àº ¸ó½ºÅÍ¿¡°Ô¼­ ¾ÆÀÌÅÛÀ» »ý¼ºÇÑ´Ù. //////////////////////////////////////////////////////////////////////////////// void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorpse) @@ -1284,7 +1284,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps } } - // Ʈ ߰ + // Äù½ºÆ® ¾ÆÀÌÅÛ Ãß°¡ if (pDeadMonster->getQuestItem() != NULL) { pMonsterCorpse->addTreasure(pDeadMonster->getQuestItem()); pDeadMonster->setQuestItem(NULL); @@ -1300,7 +1300,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps } } - // üũ(== ȯ ) + // ¾ÆÀÌÅÛÀÌ ¾È ³ª¿À´Â ¸ó½ºÅÍ Ã¼Å©(==¸¶½ºÅÍ ¼Òȯ ¸ó½ºÅÍ) // by sigi. 2002.9.2 if (!pDeadMonster->hasTreasure()) return; @@ -1310,8 +1310,8 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps TreasureList* pTreasureList = NULL; //---------------------------------------------------------------------- - // 2002 ߼ ̺Ʈ - // Ȯ ڿ ٸ ʾƾ Ѵ. + // 2002³â Ãß¼® À̺¥Æ® ¾ÆÀÌÅÛ + // ¼ÛÆíÀÌ ÀÏÁ¤ È®·ü·Î ³ª¿Â µÚ¿¡´Â ´Ù¸¥ ¾ÆÀÌÅÛÀº ³ª¿ÀÁö ¾Ê¾Æ¾ß ÇÑ´Ù. //---------------------------------------------------------------------- bool isHarvestFestivalItemAppeared = false; int PartialSumOfCakeRatio = 0; @@ -1319,7 +1319,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps if (g_pVariableManager->getHarvestFestivalItemRatio() > 0 && rand() % g_pVariableManager->getHarvestFestivalItemRatio() == 0) { - // 5 ߿ ִ. + // ¾ÆÀÌÅÛÀº 5°¡Áö Áß¿¡¼­ ³ª¿Ã ¼ö ÀÖ´Ù. ITEM_TEMPLATE ricecake_template; ricecake_template.NextOptionRatio = 0; @@ -1329,7 +1329,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps for (int i = 0; i < 5; i++) { PartialSumOfCakeRatio += m_RICE_CAKE_PROB_RATIO[i]; - // Dice ȴٸ + // ¸¸¾à Dice ¹æ½ÄÀ¸·Î Àû¿ëµÈ´Ù¸é if (EventSelector < PartialSumOfCakeRatio) { if (i == 0) { if (pDeadMonster->getLastHitCreatureClass() == Creature::CREATURE_CLASS_SLAYER) { @@ -1340,7 +1340,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps ricecake_template.ItemType = 5; } } else { - // + // º° ricecake_template.ItemClass = Item::ITEM_CLASS_EVENT_STAR; ricecake_template.ItemType = i + 7; } @@ -1349,7 +1349,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps } } - // cout << "̺Ʈ " << "[" << i >> "," << EventSelector << "]" << m_SumOfCakeRatio << endl + // cout << "À̺¥Æ® ¾ÆÀÌÅÛ »ý¼º" << "[" << i >> "," << EventSelector << "]" << m_SumOfCakeRatio << endl //<< "(" << ricecake_template.ItemClass << " " << ricecake_template.ItemType << ")" << endl; if (bOK) { @@ -1365,39 +1365,39 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps } //---------------------------------------------------------------------- - // ũ ߰ + // Å©¸®½º¸¶½º ÆøÁ× Ãß°¡ //---------------------------------------------------------------------- int fireCrackerRatio = g_pVariableManager->getVariable(CHRISTMAS_FIRE_CRACKER_RATIO); if (fireCrackerRatio > 0) { int value = rand() % 10000; if (value < fireCrackerRatio) { - // ´. + // ¼¼ °¡Áö Á¾·ùÀÇ ÆøÁ×ÀÌ ³ª¿Â´Ù. ItemType_t fireCrackerType = value % 3; - // Ѵ. + // ¾ÆÀÌÅÛÀ» »ý¼ºÇÑ´Ù. list optionType; Item* pItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_EVENT_ETC, fireCrackerType, optionType); - // ü ִ´. + // ¸ó½ºÅÍ ½Ãü¿¡ ³Ö´Â´Ù. pMonsterCorpse->addTreasure(pItem); } } //---------------------------------------------------------------------- - // ũ Ʈ ߰ + // Å©¸®½º¸¶½º Æ®¸® Á¶°¢ Ãß°¡ //---------------------------------------------------------------------- int treePartRatio = g_pVariableManager->getVariable(CHRISTMAS_TREE_PART_RATIO); if (treePartRatio > 0) { int value = rand() % 10000; if (value < treePartRatio) { - // 12 Ʈ ִ. + // 12°³ÀÇ Æ®¸® Á¶°¢ÀÌ ÀÖ´Ù. ItemType_t treeItemType = rand() % 12; - // Ѵ. + // ¾ÆÀÌÅÛÀ» »ý¼ºÇÑ´Ù. list optionType; Item* pItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_EVENT_TREE, treeItemType, optionType); - // ü ִ´. + // ¸ó½ºÅÍ ½Ãü¿¡ ³Ö´Â´Ù. pMonsterCorpse->addTreasure(pItem); } } @@ -1429,27 +1429,27 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps // end //---------------------------------------------------------------------- - // ߰ + // ³ì»ö ¼±¹° »óÀÚ Ãß°¡ //---------------------------------------------------------------------- int giftBoxRatio = g_pVariableManager->getVariable(CHRISTMAS_GIFT_BOX_RATIO); if (giftBoxRatio > 0) { int value = rand() % 10000; if (value < giftBoxRatio) { - // ڸ Ѵ. + // ³ì»ö ¼±¹° »óÀÚ¸¦ »ý¼ºÇÑ´Ù. list optionType; Item* pItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_EVENT_GIFT_BOX, 0, optionType); - // ü ִ´. + // ¸ó½ºÅÍ ½Ãü¿¡ ³Ö´Â´Ù. pMonsterCorpse->addTreasure(pItem); } } //---------------------------------------------------------------------- - // ߰ + // ¼±¹° »óÀÚ Ãß°¡ //---------------------------------------------------------------------- - // ָӴϴ affectKillCount ⼭ ó - // ڴ Monster m_pQuestItem ƴϹǷ ⼭ óѴ - // ( ָӴϵ m_pQuestItem ʿ䰡 ϴٸ ;;) + // º¹ÁÖ¸Ó´Ï´Â affectKillCount ¿©±â¼­ ó¸®ÇÏÁö¸¸ + // ¼±¹° »óÀÚ´Â Monster ÀÇ m_pQuestItem ¿¡ ³ÖÀ» °ÍÀÌ ¾Æ´Ï¹Ç·Î ¿©±â¼­ ó¸®ÇÑ´Ù + // (»ç½Ç º¹ÁָӴϵµ m_pQuestItem ¿¡ ³ÖÀ» Çʿ䰡 ¾ø±äÇÏ´Ù¸¸ ;;) //---------------------------------------------------------------------- if (g_pVariableManager->isEventGiftBox()) { if (m_pZone != NULL) { @@ -1461,7 +1461,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps if (pPC != NULL) { Item* pItem = getGiftBoxItem(getGiftBoxKind(pPC, pDeadMonster)); - // GiftBox ߰ؾ ȴٸ ߰Ѵ. + // GiftBox ¾ÆÀÌÅÛÀ» Ãß°¡ÇØ¾ß µÈ´Ù¸é Ãß°¡ÇÑ´Ù. if (pItem != NULL) pMonsterCorpse->addTreasure(pItem); } @@ -1470,13 +1470,13 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps } - // Ծ ij . - // ijͰ ٸ, - // ij party .. Ƽ ٸ - // LastHit . + // ¾ÆÀÌÅÛ ¸Ô¾î¾ßÇÒ Ä³¸¯ÅÍÀÇ Á¾Á·À» µû¸¥´Ù. + // ÇöÀç Á¸¿¡ ±× ij¸¯ÅͰ¡ ¾ø´Ù¸é, + // ±× ij¸¯ÅÍÀÇ party¿¡ µû¸£°í.. ÆÄƼµµ ¾ø´Ù¸é + // LastHit¸¦ µû¸¥´Ù. // by sigi. 2002.10.14 - // ͸ ũİ ̾ ̾ ϰ, - // ƴ϶ Ʈ ̾ Ѵ. + // ¸¶Áö¸·À¸·Î ÀÌ ¸ó½ºÅ͸¦ ¶§¸° Å©¸®Ãİ¡ ½½·¹À̾î¶ó¸é ½½·¹ÀÌ¾î ¾ÆÀÌÅÛÀ» »ý¼ºÇϰí, + // ¾Æ´Ï¶ó¸é µðÆúÆ®·Î ¹ìÆÄÀÌ¾î ¾ÆÀÌÅÛÀ» »ý¼ºÇÑ´Ù. Creature* pItemOwnerCreature = m_pZone->getPCManager()->getCreature(pDeadMonster->getHostName()); Creature::CreatureClass ownerCreatureClass; @@ -1502,7 +1502,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps ownerCreatureClass = pDeadMonster->getLastHitCreatureClass(); } - // + // ¾ÆÀÌÅÛ ¼ÒÀ¯ÀÚÀÇ Á¾Á·¿¡ µû¶ó¼­ ¾ÆÀÌÅÛÀÇ Á¾Á· °áÁ¤ if (ownerCreatureClass == Creature::CREATURE_CLASS_SLAYER) { pTreasureList = pMonsterInfo->getSlayerTreasureList(); } else if (ownerCreatureClass == Creature::CREATURE_CLASS_VAMPIRE) { @@ -1511,7 +1511,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps pTreasureList = pMonsterInfo->getOustersTreasureList(); } - // Ͱ chief monsterΰ? by sigi. 2002.10.23 + // ÀÌ ¸ó½ºÅͰ¡ chief monsterÀΰ¡? by sigi. 2002.10.23 bool bChiefMonsterBonus = pDeadMonster->isChief() && g_pVariableManager->isActiveChiefMonster(); @@ -1538,22 +1538,22 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps Item* pItem = NULL; - // ȭ Ȯ . + // À¯·áÈ­ Á¸¿¡¼­´Â ¾ÆÀÌÅÛ È®·üÀÌ µÎ ¹è´Ù. Zone* pZone = pDeadMonster->getZone(); - // ̺Ʈ Ǵ . by sigi. 2003.1.17 + // ´ë¹ÚÀ̺¥Æ®°¡ Àû¿ëµÇ´Â Á¸. by sigi. 2003.1.17 static bool isNetMarble = g_pConfig->getPropertyInt("IsNetMarble") != 0; bool isLottoZone = pZone->isPayPlay() || isNetMarble; if (pZone->isPayPlay() || pZone->isPremiumZone()) { - // cout << "Ȯ!!!! : " << g_pVariableManager->getPremiumItemProbePercent() << endl; - // add by sonic Եͼ 2006.10.27 - if (pDeadMonster->getZoneID() == 1013) // ǰͼΪ趨ĵͼ + // cout << "»ý¼ºÈ®·ü!!!! : " << g_pVariableManager->getPremiumItemProbePercent() << endl; + // add by sonic Ôö¼ÓÈýÊôÐÔµô±¦µØÍ¼ 2006.10.27 + if (pDeadMonster->getZoneID() == 1013) // Èç¹ûµ±Ç°µØÍ¼ÎªÉ趨µÄµô±¦µØÍ¼ { pTreasure->setRndItemOptionMax(3); } else pTreasure->setRndItemOptionMax(2); - // end by Sonic ޸ 2006.10.27 + // end by Sonic ÐÞ¸ÄÍê±Ï 2006.10.27 if (pTreasure->getRandomItem(&it, itemRatioBonus + g_pVariableManager->getPremiumItemProbePercent() + itemBonusPercent)) { // by sigi. 2002.10.21 @@ -1581,7 +1581,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps } } - // cout << "εij : " << pDeadMonster->getX() << ", " << + // cout << "ºê·Îµåij½ºÆÃ : " << pDeadMonster->getX() << ", " << // pDeadMonster->getY() << endl; pZone->broadcastPacket(pDeadMonster->getX(), pDeadMonster->getY(), &gcAE); @@ -1591,14 +1591,14 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps upgradeOptionByLuck(luckLevel, ownerCreatureClass, it); } - // ġ ʹ 1ܰ + + // Ä¡ÇÁ ¸ó½ºÅÍ´Â ¾ÆÀÌÅÛ 1´Ü°è + // by sigi. 2002.10.23 if (bChiefMonsterBonus - // ϴ rare Ȯ µ.. - // ߿ ̰͵ ٸ variable иؾߵ ̴. by sigi. 2002.10.23 + // ÀÏ´Ü rare È®·ü°ú °°°Ô °¡´Âµ¥.. + // ³ªÁß¿¡ À̰͵µ ´Ù¸¥ variable·Î ºÐ¸®ÇØ¾ßµÉ °ÍÀÌ´Ù. by sigi. 2002.10.23 && rand() % 100 < g_pVariableManager->getChiefMonsterRareItemPercent() && isPossibleUpgradeItemType(it.ItemClass)) { - // ItemType 1ܰ upgrade + // ItemType 1´Ü°è upgrade int upgradeCount = 1; it.ItemType = getUpgradeItemType(it.ItemClass, it.ItemType, upgradeCount); @@ -1617,7 +1617,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps pItem->setGrade(6); else pItem->setGrade(ItemGradeManager::Instance().getRandomGrade()); - // cout << " : " << pItem->getGrade() << endl; + // cout << "·çÆÃ ¾ÆÀÌÅÛ µî±Þ : " << pItem->getGrade() << endl; pItem->setDurability(computeMaxDurability(pItem)); @@ -1625,13 +1625,13 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps (isHarvestFestivalItemAppeared && pItem->getItemClass() == Item::ITEM_CLASS_SKULL)) pMonsterCorpse->addTreasure(pItem); - // ̺Ʈ: ذ 8 ߰ + // ´ë¹ÚÀ̺¥Æ®: ÇØ°ñ 8°³ ´õ Ãß°¡ if (isLottoZone && pItem->getItemClass() == Item::ITEM_CLASS_SKULL) { int lottoSkullRatio = g_pVariableManager->getVariable(LOTTO_SKULL_RATIO); if (lottoSkullRatio > 0) { int value = rand() % 10000; if (value < lottoSkullRatio) { - // ذ 8 ִ´. + // ÇØ°É 8°³ ´õ ¸¸µé¾î ³Ö´Â´Ù. for (int i = 0; i < 8; i++) { pItem = g_pItemFactoryManager->createItem(it.ItemClass, it.ItemType, it.OptionType); pMonsterCorpse->addTreasure(pItem); @@ -1643,7 +1643,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps } } } else { - // cout << "Ȯ!!!! : " << g_pVariableManager->getPremiumItemProbePercent() << endl; + // cout << "»ý¼ºÈ®·ü!!!! : " << g_pVariableManager->getPremiumItemProbePercent() << endl; if (pTreasure->getRandomItem(&it, g_pVariableManager->getItemProbRatio() + itemBonusPercent)) { // by sigi. 2002.10.21 // upgradeItemTypeByLuck(luckLevel, it); @@ -1661,7 +1661,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps else pItem->setGrade(ItemGradeManager::Instance().getRandomGrade()); // pItem->setGrade( ItemGradeManager::Instance().getRandomGrade() ); - // cout << " : " << pItem->getGrade() << endl; + // cout << "·çÆÃ ¾ÆÀÌÅÛ µî±Þ : " << pItem->getGrade() << endl; pItem->setDurability(computeMaxDurability(pItem)); @@ -1673,8 +1673,8 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps ///////////////////////////////////////////////////////////////////////// - // (ذ񻩰) Ȯ ٸ  ִ´. . - // ġ Ϳ ߰ Ǿ ִٸ ġŭ ִ´. + // ¾ÆÀÌÅÛ(ÇØ°ñ»©°í) ³ª¿À°í ´ë¹Ú È®·üÀÌ ÅÍÁ³´Ù¸é ¾ÆÀÌÅÛÀ» ¸î°³ ´õ ³Ö´Â´Ù. À¯·áÁ¸¸¸. + // Ä¡ÇÁ ¸ó½ºÅÍ¿¡ Ãß°¡ ¾ÆÀÌÅÛÀÌ ¼³Á¤µÇ¾î ÀÖ´Ù¸é ±× ¼öÄ¡¸¸Å­ ¾ÆÀÌÅÛÀ» ´õ ³Ö´Â´Ù. int nBonusItem = 0; if (pItem != NULL && pItem->getItemClass() != Item::ITEM_CLASS_SKULL) { @@ -1717,10 +1717,10 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps Item* pItem = NULL; - // ȭ Ȯ . + // À¯·áÈ­ Á¸¿¡¼­´Â ¾ÆÀÌÅÛ È®·üÀÌ µÎ ¹è´Ù. Zone* pZone = pDeadMonster->getZone(); if (pZone->isPayPlay() || pZone->isPremiumZone()) { - // cout << "Ȯ!!!! : " << g_pVariableManager->getPremiumItemProbePercent() << endl; + // cout << "»ý¼ºÈ®·ü!!!! : " << g_pVariableManager->getPremiumItemProbePercent() << endl; if (pTreasure->getRandomItem(&it, itemRatioBonus + g_pVariableManager->getPremiumItemProbePercent() + itemBonusPercent)) { @@ -1750,20 +1750,20 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps } } - // cout << "εij : " << pDeadMonster->getX() << ", " << + // cout << "ºê·Îµåij½ºÆÃ : " << pDeadMonster->getX() << ", " << // pDeadMonster->getY() << endl; pZone->broadcastPacket(pDeadMonster->getX(), pDeadMonster->getY(), &gcAE); } - // ġ ʹ 1ܰ + + // Ä¡ÇÁ ¸ó½ºÅÍ´Â ¾ÆÀÌÅÛ 1´Ü°è + // by sigi. 2002.10.23 if (bChiefMonsterBonus - // ϴ rare Ȯ µ.. - // ߿ ̰͵ ٸ variable иؾߵ ̴. by sigi. 2002.10.23 + // ÀÏ´Ü rare È®·ü°ú °°°Ô °¡´Âµ¥.. + // ³ªÁß¿¡ À̰͵µ ´Ù¸¥ variable·Î ºÐ¸®ÇØ¾ßµÉ °ÍÀÌ´Ù. by sigi. 2002.10.23 && rand() % 100 < g_pVariableManager->getChiefMonsterRareItemPercent() && isPossibleUpgradeItemType(it.ItemClass)) { - // ItemType 1ܰ upgrade + // ItemType 1´Ü°è upgrade int upgradeCount = 1; it.ItemType = getUpgradeItemType(it.ItemClass, it.ItemType, upgradeCount); @@ -1793,7 +1793,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps else pItem->setGrade(ItemGradeManager::Instance().getRandomGrade()); // pItem->setGrade( ItemGradeManager::Instance().getRandomGrade() ); - // cout << " : " << pItem->getGrade() << endl; + // cout << "·çÆÃ ¾ÆÀÌÅÛ µî±Þ : " << pItem->getGrade() << endl; pItem->setDurability(computeMaxDurability(pItem)); @@ -1802,7 +1802,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps pMonsterCorpse->addTreasure(pItem); } } else { - // cout << "Ȯ!!!! : " << g_pVariableManager->getPremiumItemProbePercent() << endl; + // cout << "»ý¼ºÈ®·ü!!!! : " << g_pVariableManager->getPremiumItemProbePercent() << endl; if (pTreasure->getRandomItem(&it, g_pVariableManager->getItemProbRatio() + itemBonusPercent)) { // by sigi. 2002.10.21 // upgradeItemTypeByLuck(luckLevel, it); @@ -1819,7 +1819,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps else pItem->setGrade(ItemGradeManager::Instance().getRandomGrade()); // pItem->setGrade( ItemGradeManager::Instance().getRandomGrade() ); - // cout << " : " << pItem->getGrade() << endl; + // cout << "·çÆÃ ¾ÆÀÌÅÛ µî±Þ : " << pItem->getGrade() << endl; pItem->setDurability(computeMaxDurability(pItem)); @@ -1840,7 +1840,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps } } - // ذ ־ Ǵ Ÿ + // ÇØ°ñ ³Ö¾îÁà¾ß µÇ´Â ¸ó½ºÅ¸ if (pMonsterInfo->getSkullType() != 0) { Item* pSkull = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_SKULL, pMonsterInfo->getSkullType(), list()); @@ -1850,12 +1850,12 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps } ////////////////////////////////////////////////////////////////////// - // 2002 6 ̺Ʈ - // ̺Ʈ ͷ ͿԼ ౸ ´. - // ౸ ITEM_TYPE ʰ - // EVENT_STAR Type7 ۵Ѵ. - // EventStarInfo, EventStarObject EventItemInfo, EventItemObject - // Ǿ ̴. + // 2002³â 6¿ù ¿ùµåÄÅ À̺¥Æ® + // À̺¥Æ® ¸ó½ºÅÍ·Î ¼¼ÆÃÀÌ µÈ ¸ó½ºÅÍ¿¡°Ô¼­´Â Ã౸°ø ¾ÆÀÌÅÛÀÌ ³ª¿Â´Ù. + // Ã౸°øÀº º°µµÀÇ ITEM_TYPEÀ» °¡ÁöÁö ¾Ê°í + // EVENT_STARÀÇ Type7¹øÀ¸·Î ÀÛµ¿ÇÑ´Ù. + // Â÷ÈÄ EventStarInfo, EventStarObject´Â EventItemInfo, EventItemObject + // ·Î º¯°æµÇ¾î¾ß ÇÒ °ÍÀÌ´Ù. ///////////////////////////////////////////////////////////////////// /* if(pDeadMonster->getEventMonsterFlag() == true) @@ -1866,7 +1866,7 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps ball_template.OptionType=0; //if(g_pVariable->getDebugMode() == "COUT") - //cout << "౸ " << endl; + //cout << "Ã౸°ø ¾ÆÀÌÅÛ »ý¼º" << endl; Item *pItem = g_pItemFactoryManager->createItem(ball_template.ItemClass, ball_template.ItemType, ball_template.OptionType); Assert(pItem != NULL); pMonsterCorpse->addTreasure(pItem); @@ -1875,9 +1875,9 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps ////////////////////////////////////////////////////////////////////// - // 2002 5 ̺Ʈ/ - // ͿԼ Ƿ, ⿡ ϵڵϿ. - // 1/1500 Ȯ ߰ Ѵ.(ɸ ) + // 2002³â 5¿ù °¡Á¤ÀÇ ´Þ À̺¥Æ®/ + // ¸ðµç ¸ó½ºÅÍ¿¡°Ô¼­ º°ÀÌ ³ª¿Ã ¼ö ÀÖÀ¸¹Ç·Î, ¿©±â¿¡ ÇϵåÄÚµùÇÏ¿´´Ù. + // 1/1500 ÀÇ È®·ü·Î º° ¾ÆÀÌÅÛÀ» Ãß°¡·Î »ý¼ºÇÑ´Ù.(°É¸®´Â ³ðÀº Àç¼ö´Ù) ////////////////////////////////////////////////////////////////////// // cout << "Monster Manager: star -> " << g_pVariable->getStar() << endl; // int star_percentage = g_pVariable->getStar(); @@ -1886,15 +1886,15 @@ void MonsterManager::addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorps ITEM_TEMPLATE star_template; star_template.ItemClass = Item::ITEM_CLASS_EVENT_STAR; - // 1/10 Ȯ 캻 , ɸ 1/6 Ȯ Ѵ. - // 9/10 Ȯδ Ѵ. + // ¸ÕÀú 1/10ÀÇ È®·ü·Î »ìÆìº» ´ÙÀ½, °É¸®¸é 1/6ÀÇ È®·ü·Î °¢ º°À» ³ª¿À°Ô ÇÑ´Ù. + // 9/10ÀÇ È®·ü·Î´Â °ËÀºº°À» Á¦¿ÜÇÑ º°¸¸ ³ª¿À°Ô ÇÑ´Ù. if(rand() % 1500 == 0) star_template.ItemType = rand() % 6; else star_template.ItemType = (rand() % 5) + 1; star_template.OptionType = 0; - cout << "̺Ʈ " << star_template.ItemType << endl; + cout << "À̺¥Æ® ¾ÆÀÌÅÛ »ý¼º" << star_template.ItemType << endl; Item* pItem = g_pItemFactoryManager->createItem(star_template.ItemClass,star_template.ItemType, star_template.OptionType); Assert(pItem != NULL); pMonsterCorpse->addTreasure(pItem); } @@ -2045,7 +2045,7 @@ int MonsterManager::upgradeOptionByLuck(int luckLevel, Creature::CreatureClass o } //////////////////////////////////////////////////////////////////////////////// -// ũó Ѵ. +// ¸ðµç Å©¸®Ã³¸¦ Á¦°ÅÇÑ´Ù. //////////////////////////////////////////////////////////////////////////////// void MonsterManager::deleteAllMonsters(bool bDeleteFromZone) @@ -2070,11 +2070,11 @@ void MonsterManager::deleteAllMonsters(bool bDeleteFromZone) ZoneCoord_t cx = pCreature->getX(); ZoneCoord_t cy = pCreature->getY(); - // ŸϿ + // ŸÀÏ¿¡¼­ Á¦°Å Tile& tile = m_pZone->getTile(cx, cy); tile.deleteCreature(pCreature->getObjectID()); - // ֺ PC鿡 ũó ٴ εijƮѴ. + // ÁÖº¯ÀÇ PCµé¿¡°Ô Å©¸®Ã³°¡ »ç¶óÁ³´Ù´Â »ç½ÇÀ» ºê·Îµåij½ºÆ®ÇÑ´Ù. GCDeleteObject gcDeleteObject(pCreature->getObjectID()); pZone->broadcastPacket(cx, cy, &gcDeleteObject, pCreature); @@ -2083,13 +2083,13 @@ void MonsterManager::deleteAllMonsters(bool bDeleteFromZone) } } - // ũĸ Ѵ. + // Å©¸®Ãĸ¦ »èÁ¦ÇÑ´Ù. SAFE_DELETE(pCreature); current++; } - // Ѵ. + // ´Ù Á¦°ÅÇÑ´Ù. m_Creatures.clear(); m_Monsters.clear(); @@ -2099,7 +2099,7 @@ void MonsterManager::deleteAllMonsters(bool bDeleteFromZone) } //////////////////////////////////////////////////////////////////////////////// -// ũó δ. +// ¸ðµç Å©¸®Ã³¸¦ Á×ÀδÙ. //////////////////////////////////////////////////////////////////////////////// void MonsterManager::killAllMonsters(const unordered_map& exceptCreatures) @@ -2155,14 +2155,14 @@ string MonsterManager::toString() const ////////////////////////////////////////////////////////////////////////////// -// Ȳ ذ ݱ ̺Ʈ ڵ Ϻκ̴. -// ϴ Ⱦ µ, ߿ Ȥ ٽ ؼ -// Űܳ´. +// Ȳ±Ý ÇØ°ñ Áݱâ À̺¥Æ®¿¡ ¾²¿´´ø ÄÚµåÀÇ ÀϺκÐÀÌ´Ù. +// ÀÏ´ÜÀº º¸±â ½È¾î¼­ »©³õ´Âµ¥, ³ªÁß¿¡¶óµµ Ȥ½Ã ´Ù½Ã ¾²¿©Áú±î ÇØ¼­ +// ÆÄÀÏ ¸Ç ³¡À¸·Î ¿Å°Ü³õ´Â´Ù. ////////////////////////////////////////////////////////////////////////////// /* //////////////////////////////////////////////////////////// -// ̺Ʈ ڵ +// À̺¥Æ® °ü·Ã ÄÚµå ½ÃÀÛ //////////////////////////////////////////////////////////// SpriteType_t SpriteType = pMonsterInfo->getSpriteType(); uint event_ratio = rand()%100; @@ -2170,41 +2170,41 @@ uint skull_ratio = rand()%100; switch (SpriteType) { - case 5: // ٵ + case 5: // µ¥µå¹Ùµð if (event_ratio < 3) ItemType = 12; break; - case 8: // ʹ׵ + case 8: // ÅÍ´×µ¥µå if (event_ratio < 3) ItemType = 12; break; - case 7: // ʹ׼ҿ + case 7: // ÅÍ´×¼Ò¿ï if (event_ratio < 3) { if (skull_ratio < 98) ItemType = 12; else ItemType = 15; } break; - case 6: // Ű + case 6: // ۵å if (event_ratio < 3) { if (skull_ratio < 97) ItemType = 12; else ItemType = 15; } break; - case 4: // + case 4: // ¼ÖÁ® if (event_ratio < 3) { if (skull_ratio < 96) ItemType = 12; else ItemType = 15; } break; - case 9: // ĸƾ + case 9: // ĸƾ if (event_ratio < 3) { if (skull_ratio < 94) ItemType = 12; else ItemType = 15; } break; - case 42: // ĭ + case 42: // ¾ËÄ­ if (event_ratio < 4) { if (skull_ratio < 93) ItemType = 12; @@ -2212,7 +2212,7 @@ switch (SpriteType) else ItemType = 14; } break; - case 43: // + case 43: // ·¹µå¾ÆÀÌ if (event_ratio < 4) { if (skull_ratio < 93) ItemType = 12; @@ -2220,7 +2220,7 @@ switch (SpriteType) else ItemType = 14; } break; - case 60: // Ʈ + case 60: // ¹ÂÅÏÆ® if (event_ratio < 4) { if (skull_ratio < 93) ItemType = 12; @@ -2228,7 +2228,7 @@ switch (SpriteType) else ItemType = 14; } break; - case 64: // 𵥶 + case 64: // ¸ðµ¥¶ó½º if (event_ratio < 4) { if (skull_ratio < 93) ItemType = 12; @@ -2236,7 +2236,7 @@ switch (SpriteType) else ItemType = 14; } break; - case 41: // ƼƮ̴ + case 41: // ´õƼ½ºÆ®¶óÀÌ´õ if (event_ratio < 4) { if (skull_ratio < 93) ItemType = 12; @@ -2244,7 +2244,7 @@ switch (SpriteType) else ItemType = 14; } break; - case 62: // Ʈ̴ + case 62: // ¿¡½ºÆ®·ÎÀÌ´õ if (event_ratio < 4) { if (skull_ratio < 93) ItemType = 12; @@ -2252,7 +2252,7 @@ switch (SpriteType) else ItemType = 14; } break; - case 61: // + case 61: // À§µµ¿ìÁî if (event_ratio < 4) { if (skull_ratio < 91) ItemType = 12; @@ -2260,7 +2260,7 @@ switch (SpriteType) else ItemType = 14; } break; - case 48: // ȣ + case 48: // È£ºí if (event_ratio < 5) { if (skull_ratio < 91) ItemType = 12; @@ -2268,7 +2268,7 @@ switch (SpriteType) else ItemType = 14; } break; - case 27: // + case 27: // ºí·¯µå¿ö·Ï if (event_ratio < 5) { if (skull_ratio < 91) ItemType = 12; @@ -2276,7 +2276,7 @@ switch (SpriteType) else ItemType = 14; } break; - case 40: // 񷹸 + case 40: // °ñ·¹¸Ó if (event_ratio < 5) { if (skull_ratio < 91) ItemType = 12; @@ -2284,7 +2284,7 @@ switch (SpriteType) else ItemType = 14; } break; - case 57: // + case 57: // ½¦µµ¿ìÀ® if (event_ratio < 5) { if (skull_ratio < 91) ItemType = 12; @@ -2292,7 +2292,7 @@ switch (SpriteType) else ItemType = 14; } break; - case 47: // ī + case 47: // Ä«¿À½º°¡µð¾ð if (event_ratio < 6) { if (skull_ratio < 89) ItemType = 12; @@ -2304,7 +2304,7 @@ switch (SpriteType) break; } //////////////////////////////////////////////////////////// -// ̺Ʈ ڵ +// À̺¥Æ® °ü·Ã ÄÚµå ³¡ //////////////////////////////////////////////////////////// */ diff --git a/src/server/gameserver/MonsterManager.h b/src/server/gameserver/MonsterManager.h index 299072cd..20971851 100644 --- a/src/server/gameserver/MonsterManager.h +++ b/src/server/gameserver/MonsterManager.h @@ -47,37 +47,37 @@ class MonsterManager : public CreatureManager { // add monster void addCreature(Creature* pCreature); - // ͵ ߰Ѵ. + // 몬스터들을 추가한다. void addMonsters(ZoneCoord_t x, ZoneCoord_t y, MonsterType_t monsterType, int num, const SUMMON_INFO& summonInfo, list* pSummonedMonsters = NULL); // delete monster void deleteCreature(ObjectID_t objectID); // NoSuchElementException, Error); - // Ŵ Ҽӵ ũó(NPC,Monster) óѴ. + // 매니저에 소속된 크리처들(NPC,Monster)을 처리한다. void processCreatures(); - // ڰ پ 쿡, ͸ ߰Ѵ. + // 몬스터의 숫자가 줄어들었을 경우에, 몬스터를 추가한다. void regenerateCreatures(); - // ͸ ߰ ġ ˻Ѵ. + // 몬스터를 추가할 적절한 위치를 검색한다. bool findPosition(MonsterType_t monsterType, ZoneCoord_t& x, ZoneCoord_t& y) const; - // ũó óѴ. + // 죽은 크리처를 처리한다. void killCreature(Creature* pDeadMonster); - // ͿԼ Ѵ. + // 죽은 몬스터에게서 아이템을 생성한다. void addItem(Monster* pDeadMonster, MonsterCorpse* pMonsterCorpse); - // ؽ ׼ + // 해쉬맵을 직접 액세스할 때 const unordered_map& getMonsters(void) { return m_Monsters; } - // ü νѴ. pMonster pCreature 쿡.. + // 전체의 잠재적인 적으로 인식한다. pMonster를 pCreature가 공격한 경우에.. void addPotentialEnemy(Monster* pMonster, Creature* pCreature); - // ü νѴ. pMonster pCreature 쿡.. + // 전체의 적으로 인식한다. pMonster를 pCreature가 공격한 경우에.. void addEnemy(Monster* pMonster, Creature* pCreature); // get debug string @@ -98,9 +98,9 @@ class MonsterManager : public CreatureManager { void parseEventMonsterList(const string& text, bool bReload = false); private: - Zone* m_pZone; // Ŵ Ҽӵ - unordered_map m_Monsters; // ϴ Ȳ - Timeval m_RegenTime; // ð + Zone* m_pZone; // 몬스터 매니저가 소속된 존에 대한 포인터 + unordered_map m_Monsters; // 현재 존에 존재하는 몬스터의 숫자 현황 + Timeval m_RegenTime; // 다음 몬스터 재생 시간 int m_RICE_CAKE_PROB_RATIO[5]; int m_SumOfCakeRatio; diff --git a/src/server/gameserver/MonsterSummonInfo.cpp b/src/server/gameserver/MonsterSummonInfo.cpp index 96df9bde..9442649d 100644 --- a/src/server/gameserver/MonsterSummonInfo.cpp +++ b/src/server/gameserver/MonsterSummonInfo.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : MonsterSummonInfo.cpp -// Written By : +// Written By : 쉭 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -21,13 +21,13 @@ // int Num; // // a b c -// ex1> "(ٵ, 20)" // ٵ 20 +// ex1> "(데드바디, 20)" // 데드바디 20마리 // // 0 2 6 // a b c -// ex2> "(5, 10)" // SpriteType 5(ٵ) 10 +// ex2> "(5, 10)" // SpriteType 5번(데드바디) 10마리 // -// ex3> "({34}, 20)" // {} MonsterType Ѵ. +// ex3> "({34}, 20)" // 이 경우{}는 MonsterType을 사용한다. ////////////////////////////////////////////////////////////////////////////// void MonsterCollectionInfo::parseString(const string& text) { SpriteType = 0; @@ -76,7 +76,7 @@ void MonsterCollectionInfo::parseString(const string& text) { } if (SpriteType == 0 && MonsterType == 0) { - cout << "[Error] MonsterSummonInfo : " << name.c_str() << endl; + cout << "[Error] MonsterSummonInfo에 알 수 없는 몬스터 : " << name.c_str() << endl; Assert(false); } } @@ -102,7 +102,7 @@ string MonsterCollectionInfo::toString() const { // list Infos; // // a bc a b -// ex> "(ٵ,5), (ʹ׵,3)" // ٵ 5 + ʹ׵ 3 +// ex> "(데드바디,5), (터닝데드,3)" // 데드바디 5마리 + 터닝데드 3마리 ////////////////////////////////////////////////////////////////////////////// void MonsterCollection::parseString(const string& text) { Infos.clear(); @@ -128,7 +128,7 @@ void MonsterCollection::parseString(const string& text) { if (c == string::npos) break; - c++; // ū .. + c++; // 큰 상관은 없지만.. } } @@ -173,16 +173,16 @@ const MonsterCollection* MonsterSummonStep::getRandomMonsterCollection() const { ////////////////////////////////////////////////////////////////////////////// // vector Collections; // -// ex> // ٵ5+ʹ׵3 or ٵ10+ʹ׵1 +// ex> // 데드바디5+터닝데드3 or 데드바디10+터닝데드1 // // a b c a b -// "[(ٵ,5), (ʹ׵,3) / (ٵ,10), (ʹ׵,1)]" +// "[(데드바디,5), (터닝데드,3) / (데드바디,10), (터닝데드,1)]" // ////////////////////////////////////////////////////////////////////////////// void MonsterSummonStep::parseString(const string& text) { Collections.clear(); - // ˾Ƴ + // 개수 알아내기 size_t l = text.find_first_of('['); size_t r = text.find_first_of(']'); @@ -259,17 +259,17 @@ bool MonsterSummonInfo::hasNextMonsterCollection(int step) const { ////////////////////////////////////////////////////////////////////////////// // vector Steps; // -// ex> // 1ܰ: ٵ5+ʹ׵3 or ٵ10+ʹ׵1 -// // 2ܰ: ʹ׵8+Ű2 or ʹ׵3+3 +// ex> // 1단계: 데드바디5+터닝데드3 or 데드바디10+터닝데드1 +// // 2단계: 터닝데드8+키드2 or 터닝데드3+솔져3 // a b -// "[(ٵ,5), (ʹ׵,3) / (ٵ,10), (ʹ׵,1)] +// "[(데드바디,5), (터닝데드,3) / (데드바디,10), (터닝데드,1)] // a b -// [(ʹ׵,8), (Ű,2) / (ʹ׵,3), (,3)]" +// [(터닝데드,8), (키드,2) / (터닝데드,3), (솔져,3)]" // ////////////////////////////////////////////////////////////////////////////// void MonsterSummonInfo::parseString(const string& text) { - // ˾Ƴ + // 개수 알아내기 size_t a, b = 0; while (1) { a = text.find_first_of('[', b); diff --git a/src/server/gameserver/MonsterSummonInfo.h b/src/server/gameserver/MonsterSummonInfo.h index de3de556..3c1f8004 100644 --- a/src/server/gameserver/MonsterSummonInfo.h +++ b/src/server/gameserver/MonsterSummonInfo.h @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : MonsterSummonInfo.h -// Written By : +// Written By : 쉭 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -15,13 +15,13 @@ struct MonsterCollection; -// ȯɶ +// 소환될때의 정보 struct SUMMON_INFO { enum ClanType { CLAN_TYPE_DEFAULT, // default = 1 - CLAN_TYPE_RANDOM_EACH, // ̹ Ǵ ֵ ٸ - CLAN_TYPE_RANDOM_GROUP, // ̹ Ǵ ֵ - CLAN_TYPE_GROUP, // ̹ Ǵ ֵ . clanID + CLAN_TYPE_RANDOM_EACH, // 이번에 생성되는 애들 각각 다르게 + CLAN_TYPE_RANDOM_GROUP, // 이번에 생성되는 애들 전부 같게 + CLAN_TYPE_GROUP, // 이번에 생성되는 애들 전부 같게. clanID지정 }; SUMMON_INFO() { @@ -34,23 +34,23 @@ struct SUMMON_INFO { initHPPercent = 0; } - bool canScanEnemy; // (? -_-;) scanϴ°? + bool canScanEnemy; // 적(몬스터? -_-;)을 스스로 scan하는가? ClanType clanType; int clanID; - bool hasItem; // ȯ Ͱ °? + bool hasItem; // 소환된 몬스터가 아이템을 가지는가? RegenType regenType; - bool scanEnemy; // ɶ (? -_-;) scanϴ°? + bool scanEnemy; // 생성될때 적(몬스터? -_-;)을 scan하는가? int initHPPercent; }; -// ȯɶ : Ѳ ȯ +// 소환될때의 정보: 여러가지를 한꺼번에 소환 struct SUMMON_INFO2 : public SUMMON_INFO { ZoneCoord_t X; ZoneCoord_t Y; MonsterCollection* pMonsters; }; -// +// 몬스터 몇 마리 struct MonsterCollectionInfo { SpriteType_t SpriteType; MonsterType_t MonsterType; @@ -61,7 +61,7 @@ struct MonsterCollectionInfo { string toString() const; }; -// +// 몬스터 여러 종류 struct MonsterCollection { list Infos; @@ -70,7 +70,7 @@ struct MonsterCollection { string toString() const; }; -// ȯ ܰ +// 소환 단계 struct MonsterSummonStep { vector Collections; @@ -81,7 +81,7 @@ struct MonsterSummonStep { string toString() const; }; -// ȯ +// 소환 정보 struct MonsterSummonInfo { vector Steps; diff --git a/src/server/gameserver/MoonCardUtil.cpp b/src/server/gameserver/MoonCardUtil.cpp index 0237ed21..6dce087b 100644 --- a/src/server/gameserver/MoonCardUtil.cpp +++ b/src/server/gameserver/MoonCardUtil.cpp @@ -79,7 +79,7 @@ Item* getCardItem(MoonCard card) { } if (putInDB) { - filelog("MoonCard.log", " Խϴ. : %d", (int)card); + filelog("MoonCard.log", "아이템이 나왔습니다. : %d", (int)card); Statement* pStmt = NULL; BEGIN_DB { diff --git a/src/server/gameserver/NPC.h b/src/server/gameserver/NPC.h index d51b09f0..303582cb 100644 --- a/src/server/gameserver/NPC.h +++ b/src/server/gameserver/NPC.h @@ -1,9 +1,9 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : NPC.h -// Written By : 輺 +// Written By : 김성민 // Description : -// ó κ , Ŭ ӹ޾ NPC -// ⵵ ׷, ׳ NPC ȿ ̽ ־. +// 원래는 상점 처리 부분이 없었으나, 이 클래스를 상속받아 상점 NPC를 +// 만들기도 좀 그래서, 그냥 NPC 안에다 상점 인터페이스를 집어넣었다. ////////////////////////////////////////////////////////////////////////////// #ifndef __NPC_H__ @@ -22,19 +22,19 @@ class RewardClassInfoManager; class Script; ////////////////////////////////////////////////////////////////////////////// -// (ũ ̺Ʈ) +// 상점의 종류 (크리스마스 이벤트용) ////////////////////////////////////////////////////////////////////////////// enum ShopType { - SHOPTYPE_NORMAL = 0, // Ϲ - SHOPTYPE_EVENT, // ̺Ʈ + SHOPTYPE_NORMAL = 0, // 일반 상점 + SHOPTYPE_EVENT, // 이벤트 상점 SHOPTYPE_MAX }; ////////////////////////////////////////////////////////////////////////////// -// NPC -// ̿ ̾ ̾ NPC ɰų -// ̿ϴ ͵ ´. +// NPC의 종족 상수 +// 이 상수를 이용해 슬레이어가 뱀파이어 NPC에게 말을 걸거나 +// 상점을 이용하는 것들을 막는다. ////////////////////////////////////////////////////////////////////////////// enum { NPC_RACE_SLAYER = 0, NPC_RACE_VAMPIRE, NPC_RACE_OUSTERS, NPC_RACE_MONSTER, NPC_RACE_UNKNOWN, NPC_RACE_MAX }; @@ -158,11 +158,11 @@ class NPC : public Creature { } //////////////////////////////////////////////////////////// - // ̽ - // ̽ õ Լ NPC - // NPC ƴ 쿡 ΰ exception - // Ƿ, NPC Ȯ NPC üũϰ, - // Լ ȣؾ Ѵ. + // 상점 관련 인터페이스 + // 상점 인터페이스에 관련된 함수는 NPC가 실제로 + // 상점 NPC가 아닌 경우에는 거의 모두가 exception을 + // 던지므로, 이 NPC가 확실히 상점 NPC인지 체크하고, + // 함수를 호출해야 한다. //////////////////////////////////////////////////////////// public: int getShopType(void) const { @@ -259,24 +259,24 @@ class NPC : public Creature { SpriteType_t m_SpriteType; Color_t m_MainColor; Color_t m_SubColor; - Timeval m_NextTurn; // ׼ ð - Inventory* m_pInventory; // NPC κ丮 - TriggerManager m_TriggerManager; // Ʈ Ŵ + Timeval m_NextTurn; // 다음 액션 실행 시간 + Inventory* m_pInventory; // NPC의 인벤토리 + TriggerManager m_TriggerManager; // 트리거 매니저 bool m_bShowInMinimap; ClanType_t m_ClanType; - // ̽ + // 상점 인터페이스 int m_ShopType; ShopRack* m_pRack; MarketCond_t m_MarketCondBuy; MarketCond_t m_MarketCondSell; // QuestBoard* m_pQuestBoard; - // Ŀ Ŵ + // 커플 등록 매니저 PartnerWaitingManager* m_pCoupleRegisterManager; PartnerWaitingManager* m_pCoupleUnregisterManager; - // Ʈ + // 퀘스트 관련 정보들 QuestInfoManager* m_pQuestInfoManager; RewardClassInfoManager* m_pRewardClassInfoManager; diff --git a/src/server/gameserver/NPCManager.h b/src/server/gameserver/NPCManager.h index 75887741..20a6d0cd 100644 --- a/src/server/gameserver/NPCManager.h +++ b/src/server/gameserver/NPCManager.h @@ -23,7 +23,7 @@ class NPCManager : public CreatureManager { ~NPCManager(); public: - void load(ZoneID_t zoneID, int race = 0xFF); // 0xFF̸ ALL.. -_-; + void load(ZoneID_t zoneID, int race = 0xFF); // 0xFF이면 ALL.. -_-; void processCreatures(); string toString() const; }; diff --git a/src/server/gameserver/NicknameBook.cpp b/src/server/gameserver/NicknameBook.cpp index 3d5ac62f..24236c8b 100644 --- a/src/server/gameserver/NicknameBook.cpp +++ b/src/server/gameserver/NicknameBook.cpp @@ -74,7 +74,7 @@ void NicknameBook::load() { pLevelNickname->setNicknameIndex( level/10 ); setNicknameInfo( 1, pLevelNickname ); - cout << "г ȣ : " << level/10 << endl; + cout << "닉네임 번호 : " << level/10 << endl; }*/ if (m_pOwner->getLevel() >= 10) { @@ -97,10 +97,10 @@ void NicknameBook::load() { } if (m_pOwner->getGuildID() != m_pOwner->getCommonGuildID()) { - // 带 ´. + // 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(m_pOwner->getGuildID()); - // ÷̾ ȮѴ. + // 플레이어가 길드의 마스터인지를 확인한다. if (pGuild != NULL && pGuild->getMaster() == m_pOwner->getName()) { NicknameInfo* pLevelNickname = new NicknameInfo; pLevelNickname->setNicknameID(GUILD_MASTER_NICKNAME_ID); diff --git a/src/server/gameserver/Object.h b/src/server/gameserver/Object.h index 30ec560d..d9eedd47 100644 --- a/src/server/gameserver/Object.h +++ b/src/server/gameserver/Object.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : Object.h // Written By : Elca -// Description : Ŭ ֻ Ŭ̴. +// Description : 모든 클래스의 최상위 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __OBJECT_H__ @@ -14,13 +14,13 @@ ////////////////////////////////////////////////////////////////////////////// // Object Priority // -// Ÿ Object List Object Ŭ ü鰣 켱 -// Ÿ. 켱 , Ÿ Object List -// ʿ ġǾ Ѵ. +// 타일의 Object List 에서 각 Object 하위 클래스 객체들간의 우선순위를 +// 나타낸다. 값이 작을 수록 우선순위가 높으며, 타일의 Object List 에서 +// 보다 앞쪽에 배치되어야 한다. // -// 켱 Ȱ, ̵ ü 켱 -// Ǿ Ѵ. ̴ Ÿ Object List slist Ǹ, -// slist ʿ insert/delete ð ª ̴. +// 우선순위는 가장 활동적인, 즉 가장 이동성이 높은 객체들이 우선 순위가 +// 높게 지정되어야 한다. 이는 타일의 Object List 가 slist 로 구현되며, +// slist 는 앞쪽에서 insert/delete 의 시간이 짧기 때문이다. ////////////////////////////////////////////////////////////////////////////// enum ObjectPriority { OBJECT_PRIORITY_WALKING_CREATURE, @@ -30,21 +30,21 @@ enum ObjectPriority { OBJECT_PRIORITY_ITEM, OBJECT_PRIORITY_PORTAL, OBJECT_PRIORITY_OBSTACLE, - OBJECT_PRIORITY_NONE // ŸϿ Ʈ ƴ + OBJECT_PRIORITY_NONE // 타일용 오브젝트가 아닐 경우 }; class Packet; ////////////////////////////////////////////////////////////////////////////// // class Object -// Ŭ ֻ Ŭ̴. +// 모든 게임 클래스의 최상위 클래스이다. ////////////////////////////////////////////////////////////////////////////// class Object { public: // Object Class - // Object Ŭ з Ÿ. Object ӹ - // Ŭ鿡 ؼ ObjectClass ߰ϸ ǰڴ. + // Object 하위 클래스들의 분류를 나타낸다. Object 를 직접 상속받은 + // 클래스들에 한해서 ObjectClass 에 추가하면 되겠다. enum ObjectClass { OBJECT_CLASS_CREATURE, OBJECT_CLASS_ITEM, @@ -60,12 +60,12 @@ class Object { public: // get/set object id // - // unique ü (identifier) ȴ. - // unique ص DZ , ð - // reboot  ƹ 4G ü - // id ߺ ־ ߴ. - // ̷ ϸ ʴ 1000 ü ٰ 4M , - // 40-50ϵ ϴٴ ̴. + // 존 레벨에서 unique 한 객체의 구분자(identifier)로 사용된다. + // 물론 게임 서버 레벨에서 unique 해도 되긴 하지만, 오랜 시간동안 + // 게임 서버가 reboot 없이 운영될 경우 아무리 4G 라 할지라도 객체의 + // id 가 중복될 우려가 있어서 범위를 존 레벨로 축소했다. + // 이렇게 하면 초당 1000 개의 객체가 새로 생긴다고 할지라도 4M 초, + // 즉 40-50일동안 안전하다는 뜻이다. ObjectID_t getObjectID() const { Assert(m_ObjectID != 0); return m_ObjectID; @@ -76,13 +76,13 @@ class Object { } // get object class(virtual) - // Object* pObject ؼ ü ũó, , ƴϸ - // ֹ 캼 Ѵ. Ŭ ޽带 ؾѴ. + // Object* pObject 에 대해서 이 객체가 크리처인지, 아이템인지, 아니면 + // 장애물인지를 살펴볼 때 사용한다. 하위 클래스는 이 메쏘드를 재정의해야한다. // // *CAUTION* - // Object m_ObjectClass Ÿ ֵ , ̷ ϸ - // Ϸ Object Ŭ ü ߰ - // Ʈ Ҹϰ ǹǷ, virtual method ذߴ. + // 물론 Object에 m_ObjectClass 데이타 멤버를 둬도 되지만, 이렇게 하면 + // 컴파일러의 정렬 문제로 인해 모든 Object 하위 클래스의 객체들이 추가적인 + // 바이트를 소모하게 되므로, virtual method 로 해결했다. virtual ObjectClass getObjectClass() const = 0; // get object priority(virtual) diff --git a/src/server/gameserver/ObjectManager.h b/src/server/gameserver/ObjectManager.h index 04ef00e5..509967b9 100644 --- a/src/server/gameserver/ObjectManager.h +++ b/src/server/gameserver/ObjectManager.h @@ -12,7 +12,7 @@ ////////////////////////////////////////////////////////////////////////////// // class ObjectManager; -// ü Ŵ ϴ Ŭ̴. +// 하위 게임 객체들의 매니저를 관리하는 상위 관리 클래스이다. ////////////////////////////////////////////////////////////////////////////// class ObjectManager { diff --git a/src/server/gameserver/ObjectRegistry.h b/src/server/gameserver/ObjectRegistry.h index d48af82f..48e5b849 100644 --- a/src/server/gameserver/ObjectRegistry.h +++ b/src/server/gameserver/ObjectRegistry.h @@ -14,7 +14,7 @@ ////////////////////////////////////////////////////////////////////////////// // class ObjectRegistry; -// ü ObjectID ҴѴ. +// 객체에게 ObjectID를 할당한다. ////////////////////////////////////////////////////////////////////////////// class ObjectRegistry { @@ -28,7 +28,7 @@ class ObjectRegistry { void unlock(); private: - ObjectID_t m_ObjectIDKey; // Object ID Ű + ObjectID_t m_ObjectIDKey; // Object ID 생성을 위한 키값 mutable Mutex m_Mutex; // mutex }; diff --git a/src/server/gameserver/Obstacle.h b/src/server/gameserver/Obstacle.h index 789744d6..3ee52689 100644 --- a/src/server/gameserver/Obstacle.h +++ b/src/server/gameserver/Obstacle.h @@ -12,8 +12,8 @@ ////////////////////////////////////////////////////////////////////////////// // Obstacle Type // -// ֹ ִ 256 Ѵ. -//(̳ ġ, 256 Ѿ ?) +// 각 하위 장애물 종류마다 최대 256 가지가 존재한다. +//(문이나 스위치, 함정이 256개를 넘어갈 수 있을까?) ////////////////////////////////////////////////////////////////////////////// typedef BYTE ObstacleType_t; const uint szObstacleType = sizeof(ObstacleType_t); @@ -21,9 +21,9 @@ const uint szObstacleType = sizeof(ObstacleType_t); ////////////////////////////////////////////////////////////////////////////// // class Obstacle; // -// ŸϿ ӵǴ üμ, ũó ̵ ϸ鼭 ¸ -// ִ Object Ŭ ü̴. ̳ , ġ ͵ -// ⿡ Ѵ. +// 타일에 종속되는 객체로서, 크리처의 이동을 방해하면서 상태를 갖고 +// 있는 Object의 하위 클래스 객체이다. 문이나 함정, 스위치 같은 것들이 +// 여기에 속한다. ////////////////////////////////////////////////////////////////////////////// class Obstacle : public Object { diff --git a/src/server/gameserver/OptionInfo.h b/src/server/gameserver/OptionInfo.h index 670e89a6..db49ebd1 100644 --- a/src/server/gameserver/OptionInfo.h +++ b/src/server/gameserver/OptionInfo.h @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : OptionInfo.h -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -17,7 +17,7 @@ #include "Types.h" ////////////////////////////////////////////////////////////////////////////// -// ɼ ƽ +// 옵션 레벨의 맥스 ////////////////////////////////////////////////////////////////////////////// const uint OPTION_LEVEL_MAX = 100; const uint GAMBLE_OPTION_LEVEL_MAX = 100; @@ -28,7 +28,7 @@ class Vampire; class Ousters; ////////////////////////////////////////////////////////////////////////////// -// ɼ +// 옵션의 적용 부위 종류 ////////////////////////////////////////////////////////////////////////////// enum OptionClass { OPTION_STR = 0, // increase STR @@ -88,12 +88,12 @@ const string OptionClass2String[] = { "OPTION_MAX"}; enum OptionGroup { - OPTION_GROUP_ATTR = 0, // ɷġ ɼ - OPTION_GROUP_STAT, // ɷġ ɼ - OPTION_GROUP_SPECIAL, // Ư ɼ (...?) - OPTION_GROUP_RESIST, // ɼ - OPTION_GROUP_ETC, // Ÿ ɼ - OPTION_GROUP_NOT // ׷ + OPTION_GROUP_ATTR = 0, // 능력치 관련 옵션 + OPTION_GROUP_STAT, // 보조능력치 관련 옵션 + OPTION_GROUP_SPECIAL, // 특수 옵션 (...?) + OPTION_GROUP_RESIST, // 저항 옵션 + OPTION_GROUP_ETC, // 기타 옵션 + OPTION_GROUP_NOT // 그룹 없음 }; class RareOptionUpgradeInfo { @@ -183,8 +183,8 @@ class OptionClassInfo { OptionClass m_OptionClass; string m_Name; string m_HName; - int m_Level; // ߿䵵 - int m_TotalGrade; // ɼ ܰ + int m_Level; // 중요도 + int m_TotalGrade; // 옵션의 총 단계 수 OptionGroup m_OptionGroup; }; @@ -314,7 +314,7 @@ class OptionInfo { m_GambleLevel = level; } - // ܰ ɼ downgradeҶ ʿ + // 이전 단계의 옵션으로 downgrade할때 필요한 정보 OptionType_t getPreviousType(void) const { return m_PreviousOptionType; } @@ -322,7 +322,7 @@ class OptionInfo { m_PreviousOptionType = type; } - // ܰ ɼ upgradeҶ ʿ + // 다음 단계의 옵션으로 upgrade할때 필요한 정보 OptionType_t getUpgradeType(void) const { return m_UpgradeOptionType; } @@ -351,18 +351,18 @@ class OptionInfo { m_UpgradeCrashPercent = per; } - // ܰ ɼ upgrade Ѱ? + // 다음 단계의 옵션으로 upgrade가 가능한가? bool isUpgradePossible() const { return m_UpgradeOptionType != 0 && m_UpgradeRatio != 0; } - // ܰ ɼ upgrade ߳? + // 다음 단계의 옵션으로 upgrade가 성공했나? bool isUpgradeSucceed() const; - // ܰ ɼ upgrade ߳? + // 다음 단계의 옵션으로 upgrade가 성공했나? bool isUpgradeSecondSucceed() const; - // ܰ ɼ upgrade ϴٰ ؼ item μ? + // 다음 단계의 옵션으로 upgrade 하다가 실패해서 item이 부서졌나? bool isUpgradeCrash() const; Ratio_t getNextOptionRatio(void) const { @@ -385,38 +385,38 @@ class OptionInfo { ///// Member data ///// private: - OptionType_t m_OptionType; // ɼ Ÿ - string m_Name; // ̸ - string m_HName; // ѱ ̸ + OptionType_t m_OptionType; // 옵션 타입 + string m_Name; // 영문 이름 + string m_HName; // 한글 이름 string m_Nickname; // Nickname - OptionClass m_OptionClass; // ɼ - int m_PlusPoint; // ġ - int m_PriceMultiplier; // - int m_ReqSTR; // ʿ STR - int m_ReqDEX; // ʿ DEX - int m_ReqINT; // ʿ INT - int m_ReqSum; // ʿ ɷġ - int m_ReqLevel; // ʿ - int m_Level; // ɼ - Color_t m_Color; // ɼ - Ratio_t m_Ratio; // ɼ Ȯ - - int m_GambleLevel; // ɼ - - // ܰ ɼ upgradeҶ ʿ - OptionType_t m_PreviousOptionType; // ܰ ɼ Ÿ - OptionType_t m_UpgradeOptionType; // ܰ ɼ Ÿ - Ratio_t m_UpgradeRatio; // upgrade Ȯ = 1/m_UpgradeRatio - Ratio_t m_UpgradeSecondRatio; // 2 ׷̵尡 Ȯ - int m_UpgradeCrashPercent; // upgrade ؼ μ Ȯ = m_UpgradeCrashPercent% - Ratio_t m_NextOptionRatio; // ɼ Ȯ - - int m_Grade; // Ŭ ɼ ܼ + OptionClass m_OptionClass; // 옵션의 종류 + int m_PlusPoint; // 상승 수치 + int m_PriceMultiplier; // 값 상승 폭 + int m_ReqSTR; // 필요한 STR의 상승 폭 + int m_ReqDEX; // 필요한 DEX의 상승 폭 + int m_ReqINT; // 필요한 INT의 상승 폭 + int m_ReqSum; // 필요한 능력치 총합의 상승 폭 + int m_ReqLevel; // 필요한 레벨의 상승 폭 + int m_Level; // 옵션의 레벨 + Color_t m_Color; // 옵션 색깔 + Ratio_t m_Ratio; // 옵션 나오는 확률 + + int m_GambleLevel; // 옵션의 갬블 레벨 + + // 다음 단계의 옵션으로 upgrade할때 필요한 정보 + OptionType_t m_PreviousOptionType; // 이전 단계의 옵션 타입 + OptionType_t m_UpgradeOptionType; // 다음 단계의 옵션 타입 + Ratio_t m_UpgradeRatio; // upgrade가 성공할 확률 = 1/m_UpgradeRatio + Ratio_t m_UpgradeSecondRatio; // 블루 드롭 2로 업그레이드가 성공할 확률 + int m_UpgradeCrashPercent; // upgrade가 실패해서 부서질 확률 = m_UpgradeCrashPercent% + Ratio_t m_NextOptionRatio; // 다음 옵션이 붙을 확률 + + int m_Grade; // 같은 클래스 내에서 옵션의 단수 }; ////////////////////////////////////////////////////////////////////////////// // class OptionInfoSet -// ɼ Ŭ ɼ Ÿ ϰ ִ Ŭ. +// 각각의 옵션 클래스마다 레벨 별로 그 옵션 타입을 저장하고 있는 클래스. ////////////////////////////////////////////////////////////////////////////// class OptionInfoSet { @@ -496,7 +496,7 @@ class OptionInfoManager { void addOptionInfo(OptionInfo* pOptionInfo); - // gamble + // gamble 관련 void addGambleOption(Item::ItemClass itemClass, uint level, OptionType_t optionType); const vector& getPossibleGambleOptionVector(Item::ItemClass itemClass, uint level) { return m_GambleOptions[itemClass][level]; @@ -505,7 +505,7 @@ class OptionInfoManager { return m_TotalGambleRatio[itemClass][level]; } - // rare enchant + // rare enchant 관련 int getRareUpgradeRatio(OptionType_t optionType, bool success); const OptionClassInfo* getOptionClassInfo(OptionClass oc) { return m_OptionClassInfos[oc]; diff --git a/src/server/gameserver/Ousters.h b/src/server/gameserver/Ousters.h index 1998e2cd..5a463a1a 100644 --- a/src/server/gameserver/Ousters.h +++ b/src/server/gameserver/Ousters.h @@ -29,16 +29,16 @@ class SkillInfo; #define OUSTERS_MAX_LEVEL 150 // abcd -#define OUSTERS_MAX_RANK 50 // max +#define OUSTERS_MAX_RANK 50 // 계급 max #define OUSTERS_MAX_SUM 492 #define OUSTERS_MAX_ATTR 472 -#define BONUS_POINTS_PER_LEVEL1 3 // ־ ɷġ point -#define BONUS_POINTS_PER_LEVEL2 2 // ־ ɷġ point -#define BONUS_POINTS_PER_LEVEL3 1 // ־ ɷġ point +#define BONUS_POINTS_PER_LEVEL1 3 // 레벨업시 주어지는 능력치 point +#define BONUS_POINTS_PER_LEVEL2 2 // 레벨업시 주어지는 능력치 point +#define BONUS_POINTS_PER_LEVEL3 1 // 레벨업시 주어지는 능력치 point //////////////////////////////////////////////////////////////////////////////// -// ԰ ԰ ɷġ -// α (?) Ŭ +// 장비를 입고 벗을 때 장비 입고 벗기 전의 능력치를 +// 저장해 두기 위한 버퍼(?) 클래스 //////////////////////////////////////////////////////////////////////////////// class OUSTERS_RECORD { @@ -65,10 +65,10 @@ class OUSTERS_RECORD { class Ousters : public PlayerCreature { //////////////////////////////////////////////////// - // Ŭ + // 클래스 내부 상수 선언 //////////////////////////////////////////////////// public: - // + // 장착 부위 enum WearPart { WEAR_CIRCLET, WEAR_COAT, @@ -96,14 +96,14 @@ class Ousters : public PlayerCreature { }; //////////////////////////////////////////////////// - // /Ҹ + // 생성자/소멸자 //////////////////////////////////////////////////// public: Ousters(); virtual ~Ousters(); //////////////////////////////////////////////////// - // Ŭ(Creature) Լ + // 하위 클래스(Creature) 상속 함수 //////////////////////////////////////////////////// public: virtual CreatureClass getCreatureClass() const { @@ -138,14 +138,14 @@ class Ousters : public PlayerCreature { } ////////////////////////////////////////////////////////////// - // ð Լ + // 시간제한 아이템 관련 함수 ////////////////////////////////////////////////////////////// public: void checkItemTimeLimit(); void updateEventItemTime(DWORD time); //////////////////////////////////////////////////// - // Լ(Dead or Alive!) + // 상태 관련 함수(Dead or Alive!) //////////////////////////////////////////////////// public: bool isAlive() const { @@ -157,7 +157,7 @@ class Ousters : public PlayerCreature { //////////////////////////////////////////////////// - // Ѹ Լ(̸, , , Ӹ, Ǻ) + // 겉모습 관련 함수(이름, 권한, 성별, 머리, 피부) //////////////////////////////////////////////////// public: const string& getName() const { @@ -205,7 +205,7 @@ class Ousters : public PlayerCreature { } //////////////////////////////////////////////////// - // ɷġ Լ(STR, DEX, INT) + // 능력치 관련 함수(STR, DEX, INT) //////////////////////////////////////////////////// public: Alignment_t getAlignment() const { @@ -238,7 +238,7 @@ class Ousters : public PlayerCreature { } //////////////////////////////////////////////////// - // ɷġ Լ(HP) + // 능력치 관련 함수(HP) //////////////////////////////////////////////////// public: HP_t getHP(AttrType attrType = ATTR_CURRENT) const { @@ -264,7 +264,7 @@ class Ousters : public PlayerCreature { } //////////////////////////////////////////////////// - // ɷġ Լ(Damage, Protect, Defense, ToHit) + // 능력치 관련 함수(Damage, Protect, Defense, ToHit) //////////////////////////////////////////////////// public: Damage_t getDamage(AttrType attrType = ATTR_CURRENT) const { @@ -284,7 +284,7 @@ class Ousters : public PlayerCreature { } //////////////////////////////////////////////////// - // ġ Լ + // 경험치 관련 함수 //////////////////////////////////////////////////// public: // Exp_t getExp() const { return m_Exp; } @@ -313,7 +313,7 @@ class Ousters : public PlayerCreature { return getLevel(); } - // . by sigi. 2002.8.30 + // 계급. by sigi. 2002.8.30 /* Rank_t getRank() const { return m_Rank; } void setRank(Rank_t rank) { m_Rank = rank; } RankExp_t getRankExp() const { return m_RankExp; } @@ -339,7 +339,7 @@ class Ousters : public PlayerCreature { SkillBonus_t getSumOfUsedSkillBonus() const; //////////////////////////////////////////////////// - // ų Լ + // 스킬 관련 함수 //////////////////////////////////////////////////// public: void addSkill(SkillType_t SkillType); @@ -354,7 +354,7 @@ class Ousters : public PlayerCreature { //////////////////////////////////////////////////// - // /Ż Լ + // 아이템 착/탈 관련 함수 //////////////////////////////////////////////////// public: bool isWear(WearPart Part) { @@ -389,7 +389,7 @@ class Ousters : public PlayerCreature { void getShapeInfo(DWORD& flag, Color_t color[PCOustersInfo::OUSTERS_COLOR_MAX]) const; //////////////////////////////////////////////////// - // /Ż ɷġ Լ + // 아이템 착/탈시 능력치 수정 관련 함수 //////////////////////////////////////////////////// public: void initAllStat(int numPartyMember = -1); @@ -407,7 +407,7 @@ class Ousters : public PlayerCreature { ////////////////////////////////////////////////////////////// - // ˻ Լ + // 아이템 검색 함수 ////////////////////////////////////////////////////////////// public: virtual Item* findItemOID(ObjectID_t id) { @@ -439,7 +439,7 @@ class Ousters : public PlayerCreature { } //////////////////////////////////////////////////// - // Լ + // 인포 관련 함수 //////////////////////////////////////////////////// public: PCOustersInfo2* getOustersInfo2(); @@ -451,7 +451,7 @@ class Ousters : public PlayerCreature { //////////////////////////////////////////////////// - // Ÿ Լ + // 기타 함수 //////////////////////////////////////////////////// public: virtual Gold_t getGold() const { @@ -582,7 +582,7 @@ class Ousters : public PlayerCreature { void saveInitialRank(void); ////////////////////////////// - // Ӽ Լ + // 정령 속성 관련 함수 ////////////////////////////// Elemental_t getElementalFire() const { return m_ElementalFire; @@ -601,7 +601,7 @@ class Ousters : public PlayerCreature { } ////////////////////////////// - // ʽ + // 정령 공격 보너스 ////////////////////////////// Damage_t getFireDamage() const { return m_FireDamage; @@ -620,7 +620,7 @@ class Ousters : public PlayerCreature { bool satisfySkillRequire(SkillInfo* pSkillInfo); ////////////////////////////// - // Ӽ Լ + // 정령 속성 관련 함수 ////////////////////////////// bool isPassiveAvailable(SkillType_t type) { return m_PassiveSkillMap.find(type) != m_PassiveSkillMap.end() && m_PassiveSkillMap[type].first; @@ -650,7 +650,7 @@ class Ousters : public PlayerCreature { // PC Name string m_Name; - // + // 권한 BYTE m_Competence; BYTE m_CompetenceShape; @@ -689,7 +689,7 @@ class Ousters : public PlayerCreature { // level Level_t m_Level; - // . by sigi. 2002.8.30 + // 계급. by sigi. 2002.8.30 // Rank_t m_Rank; // RankExp_t m_RankExp; // RankExp_t m_RankGoalExp; @@ -722,44 +722,44 @@ class Ousters : public PlayerCreature { // mutable Thread Mutex mutable Mutex m_Mutex; - // Ȱ + // 부활존 관련 ZoneID_t m_ResurrectZoneID; - // + // 은 도금 데미지 관련 Silver_t m_SilverDamage; - // HP ƿ + // HP 스틸 Steal_t m_HPStealAmount; Steal_t m_HPStealRatio; - // MP ƿ + // MP 스틸 Steal_t m_MPStealAmount; Steal_t m_MPStealRatio; - // HP, MP + // HP, MP 재생 Regen_t m_HPRegen; Regen_t m_MPRegen; Luck_t m_Luck; - // Ӽ + // 정령 속성 Elemental_t m_ElementalFire; Elemental_t m_ElementalWater; Elemental_t m_ElementalEarth; Elemental_t m_ElementalWind; - // ʽ Ʈ + // 정력 공격 보너스 포인트 Damage_t m_FireDamage; Damage_t m_WaterDamage; Damage_t m_EarthDamage; - // + // 은 저항 Resist_t m_SilverResist; unordered_map> m_PassiveSkillMap; int m_PassiveRatio; - // ġ ̺ īƮ + // 각종 경험치 세이브 카운트 // WORD m_RankExpSaveCount; WORD m_ExpSaveCount; WORD m_FameSaveCount; diff --git a/src/server/gameserver/OustersCorpse.h b/src/server/gameserver/OustersCorpse.h index ec2b1faf..c3bc1758 100644 --- a/src/server/gameserver/OustersCorpse.h +++ b/src/server/gameserver/OustersCorpse.h @@ -16,7 +16,7 @@ class Ousters; ////////////////////////////////////////////////////////////////////////////// // class OustersCorpse; -// ̾ ׾ , ü̴. +// 뱀파이어가 죽었을 경우, 남기는 시체이다. ////////////////////////////////////////////////////////////////////////////// class OustersCorpse : public Corpse { @@ -67,7 +67,7 @@ class OustersCorpse : public Corpse { } protected: - PCOustersInfo3 m_OustersInfo; // ü ܸ + PCOustersInfo3 m_OustersInfo; // 시체의 외모에 대한 정보 }; #endif diff --git a/src/server/gameserver/OustersEXPInfo.h b/src/server/gameserver/OustersEXPInfo.h index 81dba91c..01d459af 100644 --- a/src/server/gameserver/OustersEXPInfo.h +++ b/src/server/gameserver/OustersEXPInfo.h @@ -51,10 +51,10 @@ class OustersEXPInfo { string toString() const; private: - Level_t m_Level; // - Exp_t m_GoalExp; // ǥ ġ - Exp_t m_AccumExp; // ġ - SkillBonus_t m_SkillPointBonus; // ų ʽ Ʈ + Level_t m_Level; // 레벨 + Exp_t m_GoalExp; // 목표 경험치 + Exp_t m_AccumExp; // 누적 경험치 + SkillBonus_t m_SkillPointBonus; // 레벨업시 스킬 보너스 포인트 }; diff --git a/src/server/gameserver/PCCorpse.cpp b/src/server/gameserver/PCCorpse.cpp index 7a611484..e1e53620 100644 --- a/src/server/gameserver/PCCorpse.cpp +++ b/src/server/gameserver/PCCorpse.cpp @@ -12,7 +12,7 @@ #include "Corpse.h" //---------------------------------------------------------------------- -// ũó κ丮 , ü ִ´. +// 크리처의 인벤토리에서 아이템을 꺼내서, 시체에 집어넣는다. //---------------------------------------------------------------------- void PCCorpse::transportItems(Creature* pCreature) diff --git a/src/server/gameserver/PCCorpse.h b/src/server/gameserver/PCCorpse.h index 264dec4a..f8ebb44c 100644 --- a/src/server/gameserver/PCCorpse.h +++ b/src/server/gameserver/PCCorpse.h @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////////////// // class PCCorpse; -// PC , ü. +// PC 가 죽은 경우, 남기는 시체다. ////////////////////////////////////////////////////////////////////////////// class PCCorpse : public Corpse { @@ -21,13 +21,13 @@ class PCCorpse : public Corpse { // methods from Item public: - // ũó κ丮 , ü ִ´. + // 크리처의 인벤토리에서 아이템을 꺼내서, 시체에 집어넣는다. void transportItems(Creature* pCreature); // data members private: - // PC ü ͵ ? - // Ÿ - Ӹ - Ǻλ - Ӹ - - - 1 - 2 + // PC 시체에서 구별가능한 것들은 무엇이 있을까? + // 헤어스타일 - 머리색 - 피부색 - 머리 - 상의 - 하의 - 무기1 - 무기2 HairStyle m_HairStyle; Color_t m_HairColor; Color_t m_SkinColor; diff --git a/src/server/gameserver/PCFinder.h b/src/server/gameserver/PCFinder.h index 028e0a3e..51e0e711 100644 --- a/src/server/gameserver/PCFinder.h +++ b/src/server/gameserver/PCFinder.h @@ -19,8 +19,8 @@ ////////////////////////////////////////////////////////////////////////////// // class PCFinder; -// ۷ι Ŵ ü, PC ̸ ؼ PCü ֵ -// ش. unordered_map ؼ, ˻ ӵ Ų. +// 게임 서버의 글로벌 매니저 객체로, PC 이름을 사용해서 PC객체에 접근할 수 있도록 +// 해준다. 내부적으로 unordered_map 을 사용해서, 검색 속도를 향상시킨다. ////////////////////////////////////////////////////////////////////////////// class PCFinder { diff --git a/src/server/gameserver/PCLimiter.h b/src/server/gameserver/PCLimiter.h index f2bae125..9499efcc 100644 --- a/src/server/gameserver/PCLimiter.h +++ b/src/server/gameserver/PCLimiter.h @@ -14,7 +14,7 @@ class PlayerCreature; // LimitInfo // //-------------------------------------------------------------------------------- -// : 0 <= Current <= Limit +// 숫자 제한 : 0 <= Current <= Limit //-------------------------------------------------------------------------------- class LimitInfo { public: @@ -62,7 +62,7 @@ class LimitInfo { // LevelLimitInfo // //-------------------------------------------------------------------------------- -// : Ư (MinLevel ~ MaxLevel) +// 숫자 제한 : 특정 레벨(MinLevel ~ MaxLevel)의 사용자 제한 // 0 <= Current <= Limit //-------------------------------------------------------------------------------- class LevelLimitInfo : public LimitInfo { @@ -96,7 +96,7 @@ class LevelLimitInfo : public LimitInfo { } private: - int m_ID; // п ID + int m_ID; // 구분용 ID int m_MinLevel; int m_MaxLevel; }; @@ -107,7 +107,7 @@ class LevelLimitInfo : public LimitInfo { // PCLimiter // //-------------------------------------------------------------------------------- -// PlayerCreature üũ +// PlayerCreature에 대한 출입 체크 //-------------------------------------------------------------------------------- template class PCLimiter { public: diff --git a/src/server/gameserver/PCManager.h b/src/server/gameserver/PCManager.h index 046fb431..0173005c 100644 --- a/src/server/gameserver/PCManager.h +++ b/src/server/gameserver/PCManager.h @@ -22,32 +22,32 @@ class PCManager : public CreatureManager { virtual ~PCManager(); public: - // ũó Ŵ ũó ü Ѵ. + // 크리처 매니저에 새 크리처 객체를 등록한다. // virtual void addCreature(Creature* pCreature) ; - // ũó Ŵ ִ Ư ũó ü Ѵ. + // 크리처 매니저에 들어있는 특정 크리처 객체를 삭제한다. // virtual void deleteCreature(ObjectID_t objectID) ; - // ũó Ŵ ִ Ư ũó ü Ѵ. + // 크리처 매니저에 들어있는 특정 크리처 객체를 리턴한다. // Creature* getCreature(ObjectID_t objectID) const ; - // Ŵ Ҽӵ ũó(NPC,Monster) óѴ. + // 매니저에 소속된 크리처들(NPC,Monster)을 처리한다. virtual void processCreatures(); - // ũó óѴ. + // 죽은 크리처를 처리한다. virtual void killCreature(Creature* pDeadCreature); - // PC Ŵ , εijƮѴ. + // PC 매니저일 경우, 브로드캐스트한다. // void broadcastPacket(Packet* pPacket, Creature* owner) ; - // ڵ ٸ ̵Ų. + // 모든 사용자들 다른 곳으로 이동시킨다. void transportAllCreatures(ZoneID_t ZoneID, ZoneCoord_t ZoneX = 0xffff, ZoneCoord_t ZoneY = 0xffff, Race_t race = defaultRaceValue, Turn_t delay = 10) const; // get debug string string toString() const; - // Holy Land Race Bonus ȭ ÷̾ refresh + // Holy Land Race Bonus 변화에 따른 플레이어 refresh void setRefreshHolyLandPlayer(bool bRefresh) { m_bRefreshHolyLandPlayer = bRefresh; } diff --git a/src/server/gameserver/PKZoneInfoManager.cpp b/src/server/gameserver/PKZoneInfoManager.cpp index 32b01d82..3efa407b 100644 --- a/src/server/gameserver/PKZoneInfoManager.cpp +++ b/src/server/gameserver/PKZoneInfoManager.cpp @@ -36,7 +36,7 @@ void PKZoneInfoManager::load() Result* pResult = pStmt->executeQuery("SELECT ZoneID, Race, EnterX, EnterY, ResurrectX, ResurrectY, PCLimit FROM PKZoneInfo"); - // UPDATE Result* ſ.. pStmt->getAffectedRowCount() + // UPDATE인 경우는 Result* 대신에.. pStmt->getAffectedRowCount() while (pResult->next()) { int count = 0; diff --git a/src/server/gameserver/PacketUtil.cpp b/src/server/gameserver/PacketUtil.cpp index fd02faf2..6443a2aa 100644 --- a/src/server/gameserver/PacketUtil.cpp +++ b/src/server/gameserver/PacketUtil.cpp @@ -2,8 +2,8 @@ // Filename : PacketUtil.cpp // Written by : excel96 // Description : -// , Ⱑ Ŷ ϳ ν -// . +// 자주 보내고, 만들기가 복잡한 패킷은 만드는 곳을 여기 하나로 통일함으로써 +// 유지보수가 쉬워진다. ////////////////////////////////////////////////////////////////////////////// #include "PacketUtil.h" @@ -94,7 +94,7 @@ void sendGCOtherModifyInfoGuildUnionByGuildID(uint gID) { __BEGIN_TRY - // ѳ𿡰Կ . + // 가입한놈에게에 보낸다. list cList = g_pPCFinder->getGuildCreatures(gID, 300); for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pOtherCreature = *itr; @@ -119,7 +119,7 @@ void sendGCOtherModifyInfoGuildUnionByGuildID(uint gID) __END_CATCH } -// شũİ Ҽӵ 𿡰 GCOtherModifyInfo . +// 해당크리쳐가 소속된 길드의 모든 놈에게 GCOtherModifyInfo 를 날린다. void sendGCOtherModifyInfoGuildUnion(Creature* pTargetCreature) { @@ -131,7 +131,7 @@ void sendGCOtherModifyInfoGuildUnion(Creature* pTargetCreature) PlayerCreature* pTargetPlayerCreature = dynamic_cast(pTargetGamePlayer->getCreature()); Assert(pTargetPlayerCreature != NULL); - // ѳ𿡰Կ . + // 가입한놈에게에 보낸다. list cList = g_pPCFinder->getGuildCreatures(pTargetPlayerCreature->getGuildID(), 300); for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pOtherCreature = *itr; @@ -179,14 +179,14 @@ void makeGCOtherModifyInfoGuildUnion(GCOtherModifyInfo* pModifyInformation, Crea GuildUnion* pUnion = NULL; pUnion = GuildUnionManager::Instance().getGuildUnion(pPlayerCreature->getGuildID()); - // Ҽӵ + // 소속된 연합이 없으면 if (pUnion == NULL) { pModifyInformation->addShortData(MODIFY_UNIONID, 0); pModifyInformation->addShortData(MODIFY_UNIONGRADE, GCUpdateInfo::UNION_NOTHING); // cout << "GCModifyInfo->GuildInformation - NOT FOUND UNION / UNION_NOTHING" << endl; } else { - // Ҽӵ ִ. + // 소속된 연합이 있다. bool isGuildMaster = false; bool isGuildUnionMaster = false; @@ -221,7 +221,7 @@ void makeGCOtherModifyInfoGuildUnion(GCOtherModifyInfo* pModifyInformation, Crea ////////////////////////////////////////////////////////////////////////////// // void makeGCModifyInformation for GuildUnion Info() // -// Union GCModifyInformation ɴ´. +// 길드 Union 정보를 GCModifyInformation 에 심는다. ////////////////////////////////////////////////////////////////////////////// @@ -239,14 +239,14 @@ void makeGCModifyInfoGuildUnion(GCModifyInformation* pModifyInformation, Creatur GuildUnion* pUnion = NULL; pUnion = GuildUnionManager::Instance().getGuildUnion(pPlayerCreature->getGuildID()); - // Ҽӵ + // 소속된 연합이 없으면 if (pUnion == NULL) { pModifyInformation->addShortData(MODIFY_UNIONID, 0); pModifyInformation->addShortData(MODIFY_UNIONGRADE, GCUpdateInfo::UNION_NOTHING); // cout << "GCModifyInfo->GuildInformation - NOT FOUND UNION / UNION_NOTHING" << endl; } else { - // Ҽӵ ִ. + // 소속된 연합이 있다. bool isGuildMaster = false; bool isGuildUnionMaster = false; @@ -283,7 +283,7 @@ void makeGCModifyInfoGuildUnion(GCModifyInformation* pModifyInformation, Creatur ////////////////////////////////////////////////////////////////////////////// // void makeGCUpdateInfo() // -// Ż̳, ׾ ̸ ̵ , GCUpdateInfo Ѵ. +// 포탈이나, 죽어서 맵 사이를 이동할 때 쓰는, GCUpdateInfo 정보를 구성한다. ////////////////////////////////////////////////////////////////////////////// void makeGCUpdateInfo(GCUpdateInfo* pUpdateInfo, Creature* pCreature) @@ -291,7 +291,7 @@ void makeGCUpdateInfo(GCUpdateInfo* pUpdateInfo, Creature* pCreature) __BEGIN_TRY //////////////////////////////////////////////////////////// - // ġ + // 존 위치 정보 구성 //////////////////////////////////////////////////////////// Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); @@ -308,7 +308,7 @@ void makeGCUpdateInfo(GCUpdateInfo* pUpdateInfo, Creature* pCreature) pUpdateInfo->setZoneX(x); pUpdateInfo->setZoneY(y); - // DynamicZone ó + // DynamicZone 처리 if (pZone->isDynamicZone()) { DynamicZone* pDynamicZone = pZone->getDynamicZone(); Assert(pDynamicZone != NULL); @@ -317,7 +317,7 @@ void makeGCUpdateInfo(GCUpdateInfo* pUpdateInfo, Creature* pCreature) } //////////////////////////////////////////////////////////// - // κ丮 + // 인벤토리 및 기어 정보 구성 //////////////////////////////////////////////////////////// if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -325,7 +325,7 @@ void makeGCUpdateInfo(GCUpdateInfo* pUpdateInfo, Creature* pCreature) pUpdateInfo->setPCInfo(pSlayer->getSlayerInfo2()); - // Inventory, Gear + // Inventory, Gear 정보 구성 pUpdateInfo->setInventoryInfo(pSlayer->getInventoryInfo()); pUpdateInfo->setGearInfo(pSlayer->getGearInfo()); pUpdateInfo->setExtraInfo(pSlayer->getExtraInfo()); @@ -341,7 +341,7 @@ void makeGCUpdateInfo(GCUpdateInfo* pUpdateInfo, Creature* pCreature) pUpdateInfo->setPCInfo(pVampire->getVampireInfo2()); - // Inventory, Gear + // Inventory, Gear 정보 구성 pUpdateInfo->setInventoryInfo(pVampire->getInventoryInfo()); pUpdateInfo->setGearInfo(pVampire->getGearInfo()); pUpdateInfo->setExtraInfo(pVampire->getExtraInfo()); @@ -354,7 +354,7 @@ void makeGCUpdateInfo(GCUpdateInfo* pUpdateInfo, Creature* pCreature) pUpdateInfo->setPCInfo(pOusters->getOustersInfo2()); - // Inventory, Gear + // Inventory, Gear 정보 구성 pUpdateInfo->setInventoryInfo(pOusters->getInventoryInfo()); pUpdateInfo->setGearInfo(pOusters->getGearInfo()); pUpdateInfo->setExtraInfo(pOusters->getExtraInfo()); @@ -364,12 +364,12 @@ void makeGCUpdateInfo(GCUpdateInfo* pUpdateInfo, Creature* pCreature) } //////////////////////////////////////////////////////////// - // Ʈ + // 이펙트 인포 구성 //////////////////////////////////////////////////////////// pUpdateInfo->setEffectInfo(pCreature->getEffectInfo()); //////////////////////////////////////////////////////////// - // þ + // 시야 정보 구성 //////////////////////////////////////////////////////////// if (pZone->getZoneType() == ZONE_CASTLE) { pUpdateInfo->setDarkLevel(pZone->getDarkLevel()); @@ -408,51 +408,51 @@ void makeGCUpdateInfo(GCUpdateInfo* pUpdateInfo, Creature* pCreature) } //////////////////////////////////////////////////////////// - // + // 날씨 정보 구성 //////////////////////////////////////////////////////////// pUpdateInfo->setWeather(pZone->getWeatherManager()->getCurrentWeather()); pUpdateInfo->setWeatherLevel(pZone->getWeatherManager()->getWeatherLevel()); //////////////////////////////////////////////////////////// - // NPC Ʈ + // NPC 스프라이트 정보 구성 //////////////////////////////////////////////////////////// pUpdateInfo->setNPCCount(pZone->getNPCCount()); for (uint i = 0; i < pZone->getNPCCount(); i++) pUpdateInfo->setNPCType(i, pZone->getNPCType(i)); //////////////////////////////////////////////////////////// - // Ʈ + // 몬스터 스프라이트 정보 구성 //////////////////////////////////////////////////////////// - //  ȯǴ ͸ ̸ εѴ. + // 마스터 레어에서 소환되는 몬스터를 미리 로딩한다. if (pZone->isMasterLair()) { - // SpriteType̴. -_-; by sigi. 2002.10.8 + // 사실은 SpriteType이다. -_-; by sigi. 2002.10.8 const int num = 25; const MonsterType_t mtypes[num] = { - 27, // - 40, // 񷹸 - 41, // ƼƮ̴ - 47, // ī - 48, // ȣ - 57, // - 61, // - 62, // Ʈ̴ - 64, // 𵥶 - 68, // - 70, // ũũ - 71, // īƮ - 72, // ũ - 73, // εũϽ - 74, // - 75, // ﰡ - 76, // ڵ - 88, // ũ - 89, // εī - 90, // ī׸ - 91, // ɵ - 92, // ũ - 101, // ũ - 102, // ظ - 103 // տ + 27, // 블러드워록 + 40, // 골레머 + 41, // 더티스트라이더 + 47, // 카오스가디언 + 48, // 호블 + 57, // 쉐도우윙 + 61, // 위도우즈 + 62, // 에스트로이더 + 64, // 모데라스 + 68, // 빅팽 + 70, // 다크스크리머 + 71, // 카오스나이트 + 72, // 크림슨슬로터 + 73, // 로드다크니스 + 74, // 리퍼 + 75, // 헬가디언 + 76, // 헬위자드 + 88, // 다크가디언 + 89, // 로드카오스 + 90, // 카오스그리드 + 91, // 헬핀드 + 92, // 다크헤이즈 + 101, // 던울프아크 + 102, // 멈린몬 + 103 // 샤먼오프 // 27, 48, 40, 41, 57, // 61, 62, 64, 68, 71, @@ -470,7 +470,7 @@ void makeGCUpdateInfo(GCUpdateInfo* pUpdateInfo, Creature* pCreature) } //////////////////////////////////////////////////////////// - // NPC ǥ + // NPC 좌표 정보 구성 //////////////////////////////////////////////////////////// list* pNPCInfos = pZone->getNPCInfos(); list::const_iterator itr = pNPCInfos->begin(); @@ -479,7 +479,7 @@ void makeGCUpdateInfo(GCUpdateInfo* pUpdateInfo, Creature* pCreature) pUpdateInfo->addNPCInfo(pInfo); } //////////////////////////////////////////////////////////// - // + // 서버의 상태 정보 //////////////////////////////////////////////////////////// ServerGroupID_t ZoneGroupCount = g_pZoneGroupManager->size(); UserNum_t ZoneUserNum = 0; @@ -490,7 +490,7 @@ void makeGCUpdateInfo(GCUpdateInfo* pUpdateInfo, Creature* pCreature) try { pZoneGroup = g_pZoneGroupManager->getZoneGroup(i); } catch (NoSuchElementException&) { - throw Error("Critical Error : ZoneInfoManager ش ׷ ʽϴ."); + throw Error("Critical Error : ZoneInfoManager에 해당 존그룹이 존재하지 않습니다."); } ZonePlayerManager* pZonePlayerManager = pZoneGroup->getZonePlayerManager(); @@ -525,7 +525,7 @@ void makeGCUpdateInfo(GCUpdateInfo* pUpdateInfo, Creature* pCreature) pUpdateInfo->setServerStat(SERVER_DOWN); } - // ̾ + // 프리미엄 정보 설정 if (pZone->isPremiumZone()) pUpdateInfo->setPremiumZone(); @@ -542,10 +542,10 @@ void makeGCUpdateInfo(GCUpdateInfo* pUpdateInfo, Creature* pCreature) if (bNonPK) { pUpdateInfo->setNonPK(1); - // cout << "PKҰ" << endl; + // cout << "PK불가능" << endl; } else { pUpdateInfo->setNonPK(0); - // cout << "PK" << endl; + // cout << "PK가능" << endl; } // GuildUnion Information @@ -555,13 +555,13 @@ void makeGCUpdateInfo(GCUpdateInfo* pUpdateInfo, Creature* pCreature) GuildUnion* pUnion = NULL; pUnion = GuildUnionManager::Instance().getGuildUnion(pPlayerCreature->getGuildID()); - // Ҽӵ + // 소속된 연합이 없으면 if (pUnion == NULL) { pUpdateInfo->setGuildUnionID(0); pUpdateInfo->setGuildUnionUserType(GCUpdateInfo::UNION_NOTHING); // cout << "GCUpdateInfo->getGuildUnionUserType() : UNION_NOTHING (NOT UNION)" << endl; } else { - // Ҽӵ ִ. + // 소속된 연합이 있다. bool isGuildMaster = false; bool isGuildUnionMaster = false; @@ -589,14 +589,14 @@ void makeGCUpdateInfo(GCUpdateInfo* pUpdateInfo, Creature* pCreature) pUpdateInfo->setBloodBibleSignInfo(pPlayerCreature->getBloodBibleSign()); - // Ŀ Ʈ + // 파워 포인트 pUpdateInfo->setPowerPoint(pPlayerCreature->getPowerPoint()); __END_CATCH } ////////////////////////////////////////////////////////////////////////////// -// ̾ ߰ Ŷ Ѵ. +// 슬레이어 추가 패킷을 구성한다. ////////////////////////////////////////////////////////////////////////////// void makeGCAddSlayer(GCAddSlayer* pAddSlayer, Slayer* pSlayer) @@ -613,7 +613,7 @@ void makeGCAddSlayer(GCAddSlayer* pAddSlayer, Slayer* pSlayer) } ////////////////////////////////////////////////////////////////////////////// -// ̾ ߰ Ŷ Ѵ. +// 뱀파이어 추가 패킷을 구성한다. ////////////////////////////////////////////////////////////////////////////// void makeGCAddVampire(GCAddVampire* pAddVampire, Vampire* pVampire) @@ -628,7 +628,7 @@ void makeGCAddVampire(GCAddVampire* pAddVampire, Vampire* pVampire) // cout << "makeGCAddVampire: CoatType=" << (int)(pAddVampire->getVampireInfo().getCoatType()) << endl; - // ο Ż ̿ؼ ̵ ̶... + // 개인용 포탈을 이용해서 이동한 것이라면... if (pVampire->isFlag(Effect::EFFECT_CLASS_VAMPIRE_PORTAL)) pAddVampire->setFromFlag(1); @@ -636,7 +636,7 @@ void makeGCAddVampire(GCAddVampire* pAddVampire, Vampire* pVampire) } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺ͽ ߰ Ŷ Ѵ. +// 아우스터스 추가 패킷을 구성한다. ////////////////////////////////////////////////////////////////////////////// void makeGCAddOusters(GCAddOusters* pAddOusters, Ousters* pOusters) @@ -653,7 +653,7 @@ void makeGCAddOusters(GCAddOusters* pAddOusters, Ousters* pOusters) } ////////////////////////////////////////////////////////////////////////////// -// ߰ Ŷ Ѵ. +// 몬스터 추가 패킷을 구성한다. ////////////////////////////////////////////////////////////////////////////// void makeGCAddMonster(GCAddMonster* pAddMonster, Monster* pMonster) @@ -670,7 +670,7 @@ void makeGCAddMonster(GCAddMonster* pAddMonster, Monster* pMonster) pAddMonster->setCurrentHP(pMonster->getHP()); pAddMonster->setMaxHP(pMonster->getHP(ATTR_MAX)); - // ο Ż ̿ؼ ̵ ̶... + // 개인용 포탈을 이용해서 이동한 것이라면... if (pMonster->isFlag(Effect::EFFECT_CLASS_VAMPIRE_PORTAL)) pAddMonster->setFromFlag(1); @@ -678,7 +678,7 @@ void makeGCAddMonster(GCAddMonster* pAddMonster, Monster* pMonster) } ////////////////////////////////////////////////////////////////////////////// -// NPC ߰ Ŷ Ѵ. +// NPC 추가 패킷을 구성한다. ////////////////////////////////////////////////////////////////////////////// void makeGCAddNPC(GCAddNPC* pAddNPC, NPC* pNPC) @@ -699,7 +699,7 @@ void makeGCAddNPC(GCAddNPC* pAddNPC, NPC* pNPC) } ////////////////////////////////////////////////////////////////////////////// -// ο ߰ GCAddNewItemToZone Ѵ. +// 새로운 아이템을 존에다 추가할 때 보내는 GCAddNewItemToZone을 구성한다. ////////////////////////////////////////////////////////////////////////////// void makeGCAddNewItemToZone(GCAddNewItemToZone* pAddNewItemToZone, Item* pItem, int X, int Y) @@ -720,7 +720,7 @@ void makeGCAddNewItemToZone(GCAddNewItemToZone* pAddNewItemToZone, Item* pItem, pAddNewItemToZone->setEnchantLevel(pItem->getEnchantLevel()); pAddNewItemToZone->setItemNum(pItem->getNum()); - // 迭 Ѿ ڸ ڿ Ǿ . + // 총 계열의 무기는 총알 숫자를 아이템 숫자에 실어서 보낸다. if (IClass == Item::ITEM_CLASS_AR) { AR* pAR = dynamic_cast(pItem); pAddNewItemToZone->setItemNum(pAR->getBulletCount()); @@ -734,13 +734,13 @@ void makeGCAddNewItemToZone(GCAddNewItemToZone* pAddNewItemToZone, Item* pItem, SR* pSR = dynamic_cast(pItem); pAddNewItemToZone->setItemNum(pSR->getBulletCount()); } - // Ʈ ȿ ִ ̳ źâ Ѵ. + // 벨트라면 안에 들어있는 포션이나 탄창에 대한 정보도 날려줘야 한다. else if (IClass == Item::ITEM_CLASS_BELT) { Belt* pBelt = dynamic_cast(pItem); Inventory* pBeltInventory = pBelt->getInventory(); BYTE SubItemCount = 0; - // ڸŭ о δ. + // 포켓의 숫자만큼 아이템의 정보를 읽어 들인다. for (int i = 0; i < pBelt->getPocketCount(); i++) { Item* pBeltItem = pBeltInventory->getItem(i, 0); if (pBeltItem != NULL) { @@ -759,13 +759,13 @@ void makeGCAddNewItemToZone(GCAddNewItemToZone* pAddNewItemToZone, Item* pItem, pAddNewItemToZone->setListNum(SubItemCount); } - // Ͻ ȿ ִ ̳ źâ Ѵ. + // 암스밴드라면 안에 들어있는 포션이나 탄창에 대한 정보도 날려줘야 한다. else if (IClass == Item::ITEM_CLASS_OUSTERS_ARMSBAND) { OustersArmsband* pOustersArmsband = dynamic_cast(pItem); Inventory* pOustersArmsbandInventory = pOustersArmsband->getInventory(); BYTE SubItemCount = 0; - // ڸŭ о δ. + // 포켓의 숫자만큼 아이템의 정보를 읽어 들인다. for (int i = 0; i < pOustersArmsband->getPocketCount(); i++) { Item* pOustersArmsbandItem = pOustersArmsbandInventory->getItem(i, 0); if (pOustersArmsbandItem != NULL) { @@ -789,7 +789,7 @@ void makeGCAddNewItemToZone(GCAddNewItemToZone* pAddNewItemToZone, Item* pItem, } ////////////////////////////////////////////////////////////////////////////// -// ο ߰ GCDropItemToZone Ѵ. +// 새로운 아이템을 존에다 추가할 때 보내는 GCDropItemToZone을 구성한다. ////////////////////////////////////////////////////////////////////////////// void makeGCDropItemToZone(GCDropItemToZone* pDropItemToZone, Item* pItem, int X, int Y) @@ -810,7 +810,7 @@ void makeGCDropItemToZone(GCDropItemToZone* pDropItemToZone, Item* pItem, int X, pDropItemToZone->setEnchantLevel(pItem->getEnchantLevel()); pDropItemToZone->setItemNum(pItem->getNum()); - // 迭 Ѿ ڸ ڿ Ǿ . + // 총 계열의 무기는 총알 숫자를 아이템 숫자에 실어서 보낸다. if (IClass == Item::ITEM_CLASS_AR) { AR* pAR = dynamic_cast(pItem); pDropItemToZone->setItemNum(pAR->getBulletCount()); @@ -824,13 +824,13 @@ void makeGCDropItemToZone(GCDropItemToZone* pDropItemToZone, Item* pItem, int X, SR* pSR = dynamic_cast(pItem); pDropItemToZone->setItemNum(pSR->getBulletCount()); } - // Ʈ ȿ ִ ̳ źâ Ѵ. + // 벨트라면 안에 들어있는 포션이나 탄창에 대한 정보도 날려줘야 한다. else if (IClass == Item::ITEM_CLASS_BELT) { Belt* pBelt = dynamic_cast(pItem); Inventory* pBeltInventory = pBelt->getInventory(); BYTE SubItemCount = 0; - // ڸŭ о δ. + // 포켓의 숫자만큼 아이템의 정보를 읽어 들인다. for (int i = 0; i < pBelt->getPocketCount(); i++) { Item* pBeltItem = pBeltInventory->getItem(i, 0); if (pBeltItem != NULL) { @@ -849,13 +849,13 @@ void makeGCDropItemToZone(GCDropItemToZone* pDropItemToZone, Item* pItem, int X, pDropItemToZone->setListNum(SubItemCount); } - // Ͻ ȿ ִ ̳ źâ Ѵ. + // 암스밴드라면 안에 들어있는 포션이나 탄창에 대한 정보도 날려줘야 한다. else if (IClass == Item::ITEM_CLASS_OUSTERS_ARMSBAND) { OustersArmsband* pOustersArmsband = dynamic_cast(pItem); Inventory* pOustersArmsbandInventory = pOustersArmsband->getInventory(); BYTE SubItemCount = 0; - // ڸŭ о δ. + // 포켓의 숫자만큼 아이템의 정보를 읽어 들인다. for (int i = 0; i < pOustersArmsband->getPocketCount(); i++) { Item* pOustersArmsbandItem = pOustersArmsbandInventory->getItem(i, 0); if (pOustersArmsbandItem != NULL) { @@ -879,7 +879,7 @@ void makeGCDropItemToZone(GCDropItemToZone* pDropItemToZone, Item* pItem, int X, } ////////////////////////////////////////////////////////////////////////////// -// ̾ ü ߰ Ŷ Ѵ. +// 존에다 슬레이어 시체를 추가할 때 보내는 패킷을 구성한다. ////////////////////////////////////////////////////////////////////////////// void makeGCAddSlayerCorpse(GCAddSlayerCorpse* pAddSlayerCorpse, SlayerCorpse* pSlayerCorpse) @@ -893,7 +893,7 @@ void makeGCAddSlayerCorpse(GCAddSlayerCorpse* pAddSlayerCorpse, SlayerCorpse* pS } ////////////////////////////////////////////////////////////////////////////// -// ̾ ü ߰ Ŷ Ѵ. +// 존에다 뱀파이어 시체를 추가할 때 보내는 패킷을 구성한다. ////////////////////////////////////////////////////////////////////////////// void makeGCAddVampireCorpse(GCAddVampireCorpse* pAddVampireCorpse, VampireCorpse* pVampireCorpse) @@ -907,7 +907,7 @@ void makeGCAddVampireCorpse(GCAddVampireCorpse* pAddVampireCorpse, VampireCorpse } ////////////////////////////////////////////////////////////////////////////// -// ü ߰ Ŷ Ѵ. +// 존에다 몬스터 시체를 추가할 때 보내는 패킷을 구성한다. ////////////////////////////////////////////////////////////////////////////// void makeGCAddMonsterCorpse(GCAddMonsterCorpse* pAddMonsterCorpse, MonsterCorpse* pMonsterCorpse, int X, int Y) @@ -928,7 +928,7 @@ void makeGCAddMonsterCorpse(GCAddMonsterCorpse* pAddMonsterCorpse, MonsterCorpse } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 ü ߰ Ŷ Ѵ. +// 존에다 아우스터즈 시체를 추가할 때 보내는 패킷을 구성한다. ////////////////////////////////////////////////////////////////////////////// void makeGCAddOustersCorpse(GCAddOustersCorpse* pAddOustersCorpse, OustersCorpse* pOustersCorpse) @@ -941,8 +941,8 @@ void makeGCAddOustersCorpse(GCAddOustersCorpse* pAddOustersCorpse, OustersCorpse __END_CATCH } ////////////////////////////////////////////////////////////////////////////// -// ٸ ִ ü Ǿ 쿡 ư -// GCOtherModifyInfo Ѵ. +// 다른 사람의 최대 체력 같은 것이 변경되었을 경우에 날아가는 +// GCOtherModifyInfo를 구성한다. ////////////////////////////////////////////////////////////////////////////// void makeGCOtherModifyInfo(GCOtherModifyInfo* pInfo, Slayer* pSlayer, const SLAYER_RECORD* prev) { SLAYER_RECORD cur; @@ -1028,30 +1028,30 @@ void sendPayInfo(GamePlayer* pGamePlayer) if (pGamePlayer->getPayPlayType()==PAY_PLAY_TYPE_PERSON) { - strcpy(str, "[] "); + strcpy(str, "[개인] "); } else { - strcpy(str, "[PC] "); + strcpy(str, "[PC방] "); } if (pGamePlayer->getPayType()==PAY_TYPE_FREE) { - strcat(str, "Ἥ Դϴ."); + strcat(str, "유료서비스지만 무료 계정입니다."); } else if (pGamePlayer->getPayType()==PAY_TYPE_PERIOD) { - sprintf(str, "%s%s 밡մϴ.", str, + sprintf(str, "%s%s 까지 사용가능합니다.", str, pGamePlayer->getPayPlayAvailableDateTime().toString().c_str()); } else { - sprintf(str, "%sð : %d / %d ", str, (payTime.tv_sec/60), pGamePlayer->getPayPlayAvailableHours()); + sprintf(str, "%s사용시간 : %d / %d 분", str, (payTime.tv_sec/60), pGamePlayer->getPayPlayAvailableHours()); } } else { - strcpy(str, " Դϴ."); + strcpy(str, "무료 게임 중입니다."); } GCSystemMessage gcSystemMessage; @@ -1062,7 +1062,7 @@ void sendPayInfo(GamePlayer* pGamePlayer) __END_CATCH } -// LevelUp effect ѷش. +// 주위에 LevelUp effect를 뿌려준다. void sendEffectLevelUp(Creature* pCreature) { @@ -1071,10 +1071,10 @@ void sendEffectLevelUp(Creature* pCreature) Assert(pCreature != NULL); // Assert(pCreature->isPC()); - // ѷش. + // 주위에 뿌려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pCreature->getObjectID()); - gcAddEffect.setDuration(10); // ǹ̾ 1ʷ + gcAddEffect.setDuration(10); // 별로 의미없지만 1초로 설정 if (pCreature->isSlayer()) { gcAddEffect.setEffectID(Effect::EFFECT_CLASS_LEVELUP_SLAYER); @@ -1098,7 +1098,7 @@ void sendSystemMessage(GamePlayer* pGamePlayer, const string& msg) Assert(pGamePlayer != NULL); - // ִٸ ٷ ش. + // 존에 있다면 바로 보내준다. if (pGamePlayer->getPlayerStatus() == GPS_NORMAL) { GCSystemMessage gcSystemMessage; @@ -1106,14 +1106,14 @@ void sendSystemMessage(GamePlayer* pGamePlayer, const string& msg) pGamePlayer->sendPacket(&gcSystemMessage); } - // ٸ.. GamePlayer ߰صΰ ߿ ش. + // 존에 없다면.. GamePlayer에 추가해두고 나중에 보내준다. else { Event* pEvent = pGamePlayer->getEvent(Event::EVENT_CLASS_SYSTEM_MESSAGE); EventSystemMessage* pEventSystemMessage = NULL; if (pEvent == NULL) { pEvent = pEventSystemMessage = new EventSystemMessage(pGamePlayer); - //  óȴ. + // 존에 들어가자 마자 처리된다. pEvent->setDeadline(0); pGamePlayer->addEvent(pEvent); } else { @@ -1176,7 +1176,7 @@ void sendGCMiniGameScores(PlayerCreature* pPC, BYTE gameType, BYTE Level) { Result* pResult = pStmt->executeQuery( "SELECT Name, Score FROM MiniGameScores WHERE Type=%u AND Level=%u LIMIT 1", gameType, Level); - // UPDATE Result* ſ.. pStmt->getAffectedRowCount() + // UPDATE인 경우는 Result* 대신에.. pStmt->getAffectedRowCount() if (pResult->next()) { gcMGS.addScore(pResult->getString(1), pResult->getInt(2)); } diff --git a/src/server/gameserver/PacketUtil.h b/src/server/gameserver/PacketUtil.h index ba8b6946..8de8b44b 100644 --- a/src/server/gameserver/PacketUtil.h +++ b/src/server/gameserver/PacketUtil.h @@ -2,8 +2,8 @@ // Filename : PacketUtil.h // Written by : excel96 // Description : -// , Ⱑ Ŷ ϳ ν, -// . +// 자주 보내고, 만들기가 복잡한 패킷은 만드는 곳을 여기 하나로 통일함으로써, +// 유지보수가 쉬워진다. ////////////////////////////////////////////////////////////////////////////// #ifndef __PACKETUTIL_H__ @@ -58,69 +58,69 @@ class GCModifyInformation; // function headers ////////////////////////////////////////////////////////////////////////////// -// MOdifyInformation 忬 ִ´. +// MOdifyInformation 에 길드연합정보를 만들어 넣는다. void makeGCModifyInfoGuildUnion(GCModifyInformation* pModifyInformation, Creature* pCreature); void makeGCOtherModifyInfoGuildUnion(GCOtherModifyInfo* pModifyInformation, Creature* pCreature); void sendGCOtherModifyInfoGuildUnion(Creature* pTargetCreature); void sendGCOtherModifyInfoGuildUnionByGuildID(uint gID); -// Ż̳, ׾ ̸ ̵ , GCUpdateInfo Ѵ. +// 포탈이나, 죽어서 맵 사이를 이동할 때 쓰는, GCUpdateInfo 정보를 구성한다. void makeGCUpdateInfo(GCUpdateInfo* pUpdateInfo, Creature* pCreature); -// ̾ ߰ Ŷ Ѵ. +// 슬레이어 추가 패킷을 구성한다. void makeGCAddSlayer(GCAddSlayer* pAddSlayer, Slayer* pSlayer); -// ̾ ߰ Ŷ Ѵ. +// 뱀파이어 추가 패킷을 구성한다. void makeGCAddVampire(GCAddVampire* pAddVampire, Vampire* pVampire); -// ƿ콺ͽ ߰ Ŷ Ѵ. +// 아우스터스 추가 패킷을 구성한다. void makeGCAddOusters(GCAddOusters* pAddOusters, Ousters* pOusters); -// ߰ Ŷ Ѵ. +// 몬스터 추가 패킷을 구성한다. void makeGCAddMonster(GCAddMonster* pAddMonster, Monster* pMonster); -// NPc ߰ Ŷ Ѵ. +// NPc 추가 패킷을 구성한다. void makeGCAddNPC(GCAddNPC* pAddNPC, NPC* pNPC); -// ο ߰ GCAddNewItemToZone Ѵ. +// 새로운 아이템을 존에다 추가할 때 보내는 GCAddNewItemToZone을 구성한다. void makeGCAddNewItemToZone(GCAddNewItemToZone* pAddItem, Item* pItem, int X, int Y); -// ο ߰ GCAddNewItemToZone Ѵ. +// 새로운 아이템을 존에다 추가할 때 보내는 GCAddNewItemToZone을 구성한다. void makeGCDropItemToZone(GCDropItemToZone* pAddItem, Item* pItem, int X, int Y); -// ̾ ü ߰ Ŷ Ѵ. +// 존에다 슬레이어 시체를 추가할 때 보내는 패킷을 구성한다. void makeGCAddSlayerCorpse(GCAddSlayerCorpse* pAddSlayerCorpse, SlayerCorpse* pSlayerCorpse); -// ̾ ü ߰ Ŷ Ѵ. +// 존에다 뱀파이어 시체를 추가할 때 보내는 패킷을 구성한다. void makeGCAddVampireCorpse(GCAddVampireCorpse* pAddVampireCorpse, VampireCorpse* pVampireCorpse); -// ü ߰ Ŷ Ѵ. +// 존에다 몬스터 시체를 추가할 때 보내는 패킷을 구성한다. void makeGCAddMonsterCorpse(GCAddMonsterCorpse* pAddMonsterCorpse, MonsterCorpse* pMonsterCorpse, int X, int Y); -// ƿ콺 ü ߰ Ŷ Ѵ. +// 존에다 아우스터즈 시체를 추가할 때 보내는 패킷을 구성한다. void makeGCAddOustersCorpse(GCAddOustersCorpse* pAddOustersCorpse, OustersCorpse* pOustersCorpse); -// ٸ ִ ü Ǿ 쿡 ư GCOtherModifyInfo Ѵ. +// 다른 사람의 최대 체력 같은 것이 변경되었을 경우에 날아가는 GCOtherModifyInfo를 구성한다. void makeGCOtherModifyInfo(GCOtherModifyInfo* pInfo, Slayer* pSlayer, const SLAYER_RECORD* prev); void makeGCOtherModifyInfo(GCOtherModifyInfo* pInfo, Vampire* pVampire, const VAMPIRE_RECORD* prev); void makeGCOtherModifyInfo(GCOtherModifyInfo* pInfo, Ousters* pOusters, const OUSTERS_RECORD* prev); -// ش. +// 요금 지불 관련 정보를 보여준다. void sendPayInfo(GamePlayer* pGamePlayer); -// +// 아이템 생성 void makeGCCreateItem(GCCreateItem* pGCCreateItem, Item* pItem, CoordInven_t x, CoordInven_t y); -// Ʈ ش. +// 레벨 업 이펙트를 보여준다. void sendEffectLevelUp(Creature* pCreature); -// GamePlayer GCSystemMessage(msg) . incoming ִ zone ѷش. +// GamePlayer에게 GCSystemMessage(msg)를 보낸다. incoming에 있는 경우는 zone에 가면 뿌려준다. void sendSystemMessage(GamePlayer* pGamePlayer, const string& msg); bool makeGCWarScheduleList(GCWarScheduleList* pGCWarScheduleList, ZoneID_t zoneID); -// ̸ ٴ ִ Ŷ +// 이름이 붙는 아이템 정보를 보내주는 패킷 // void makeGCItemNameInfoList(GCItemNameInfoList* pInfo, PlayerCreature* pPC) ; void sendGCMiniGameScores(PlayerCreature* pPC, BYTE gameType, BYTE Level); diff --git a/src/server/gameserver/ParkingCenter.h b/src/server/gameserver/ParkingCenter.h index 89b5b53c..70515929 100644 --- a/src/server/gameserver/ParkingCenter.h +++ b/src/server/gameserver/ParkingCenter.h @@ -59,7 +59,7 @@ class MotorcycleBox { return m_pMotorcycle->getItemID(); } - // ٸ zone ̵ + // 다른 zone으로 이동중인 오토바이 bool isTransport() const { return m_bTransport; } @@ -68,15 +68,15 @@ class MotorcycleBox { } private: - // Ŭ ü + // 모토사이클 본체 Motorcycle* m_pMotorcycle; - // Ŭ ִ ġ + // 현재 모토사이클이 있는 위치 Zone* m_pZone; ZoneCoord_t m_X; ZoneCoord_t m_Y; - // ٸ zone ̵ . by sigi. 2002.5.23 + // 다른 zone으로 이동 중. by sigi. 2002.5.23 bool m_bTransport; }; @@ -92,20 +92,20 @@ class ParkingCenter { public: void addMotorcycleBox(MotorcycleBox* pMotorcycleBox); - // ⼭ keyID TargetID Ѵ. Motorcycle ItemIḎ⵵ ϴ. + // 여기서 keyID는 열쇠의 TargetID를 뜻한다. 또한 Motorcycle의 ItemID이기도 하다. void deleteMotorcycleBox(ItemID_t keyTargetID); - // ⼭ keyID TargetID Ѵ. Motorcycle ItemIḎ⵵ ϴ. + // 여기서 keyID는 열쇠의 TargetID를 뜻한다. 또한 Motorcycle의 ItemID이기도 하다. bool hasMotorcycleBox(ItemID_t keyTargetID); - // ⼭ keyID TargetID Ѵ. Motorcycle ItemIḎ⵵ ϴ. + // 여기서 keyID는 열쇠의 TargetID를 뜻한다. 또한 Motorcycle의 ItemID이기도 하다. MotorcycleBox* getMotorcycleBox(ItemID_t keyTargetID) const; - // ַ RemoveMotorcycles óش. by sigi. 2003.2.26 + // 주로 RemoveMotorcycles를 처리해준다. by sigi. 2003.2.26 void heartbeat(); private: - // ⼭ ItemID_t ItemID Ѵ. + // 여기서 ItemID_t는 오토바이의 ItemID를 말한다. unordered_map m_Motorcycles; list m_RemoveMotorcycles; diff --git a/src/server/gameserver/Party.h b/src/server/gameserver/Party.h index 3ecec57a..6c0762e7 100644 --- a/src/server/gameserver/Party.h +++ b/src/server/gameserver/Party.h @@ -15,7 +15,7 @@ #include "ModifyInfo.h" #include "Mutex.h" -// Ƽ ִ ũ +// 파티의 최대 크기 const int PARTY_MAX_SIZE = 6; ////////////////////////////////////////////////////////////////////////////// @@ -117,28 +117,28 @@ class Party { void deleteMember(const string& name); bool hasMember(const string& name) const; - // ۷ι Ƽ Ŵ Ѵ. - // Ƽ üϱ Ƽ Ƽ ID 0 , - // Ƽ Ŵ ش ID Ƽ Ѵ. + // 글로벌 파티 매니저에서만 사용한다. + // 파티를 해체하기 전에 파티 멤버들의 파티 ID를 0으로 만들고, + // 로컬 파티 매니저에서 해당 ID를 가진 파티를 삭제한다. void destroyParty(void); public: - // Ƽ 鿡 Ŷ . + // 파티 멤버들에게 패킷을 날린다. void broadcastPacket(Packet* pPacket, Creature* pOwner = NULL); - // ο Ƽ ߰Ǿ Ƽ鿡 ư - // GCPartyJoined Ŷ Ѵ. + // 새로운 파티원이 추가되었을 때 파티원들에게 날아가는 + // GCPartyJoined 패킷을 구성한다. void makeGCPartyJoined(GCPartyJoined* pGCPartyJoined) const; public: int getSize(void) const; unordered_map getMemberMap(void); - // Ÿ(8Ÿ) ִ ڸ Ѵ. + // 근접한 거리(8타일) 내에 있는 멤버들의 숫자를 리턴한다. int getAdjacentMemberSize(Creature* pLeader) const; int getAdjacentMemberSize_LOCKED(Creature* pLeader) const; - // ġ Ǯ . + // 경험치를 부풀려서 나눈다. int shareAttrExp(Creature* pLeader, int amount, int STRMultiplier, int DEXMultiplier, int INTMultiplier, ModifyInfo& LeaderModifyInfo) const; int shareVampireExp(Creature* pLeader, int amount, ModifyInfo& LeaderModifyInfo) const; @@ -171,11 +171,11 @@ class Party { string toString(void) const; protected: - int m_ID; // Ƽ ID - Creature::CreatureClass m_CreatureClass; // Ƽ - unordered_map m_MemberMap; // Ƽ - mutable Mutex m_Mutex; // ο - bool m_bFamilyPay; // йи Ƽΰ? + int m_ID; // 파티 ID + Creature::CreatureClass m_CreatureClass; // 파티의 종류 + unordered_map m_MemberMap; // 파티 멤버 + mutable Mutex m_Mutex; // 내부에서 쓰는 락 + bool m_bFamilyPay; // 패밀리 요금제 적용 파티인가? }; @@ -198,7 +198,7 @@ class PartyManager { virtual string toString(void) const = 0; protected: - unordered_map m_PartyMap; // Ƽ + unordered_map m_PartyMap; // 파티 집합 mutable Mutex m_Mutex; }; @@ -260,14 +260,14 @@ class GlobalPartyManager : public PartyManager { virtual string toString(void) const; protected: - int m_PartyIDRegistry; // Ƽ ID + int m_PartyIDRegistry; // 파티 ID 생성자 }; extern GlobalPartyManager* g_pGlobalPartyManager; ////////////////////////////////////////////////////////////////////////////// -// Ǹ Լ... +// 편의를 위한 전역 함수들... ////////////////////////////////////////////////////////////////////////////// void deleteAllPartyInfo(Creature* pCreature); diff --git a/src/server/gameserver/Pet.cpp b/src/server/gameserver/Pet.cpp index 385f7b7d..56d735d5 100644 --- a/src/server/gameserver/Pet.cpp +++ b/src/server/gameserver/Pet.cpp @@ -32,7 +32,7 @@ Pet* Pet::makePet(PlayerCreature* pOwner, PetInfo* pPetInfo) { Assert(pPet != NULL); getCurrentTime(pPet->m_SkillDelay); - // 1/10 + // 1/10초 단위 딜레이 int delay = pPet->getDelay(); pPet->m_SkillDelay.tv_sec += delay / 10; @@ -47,7 +47,7 @@ void Pet::heartbeat(const Timeval& currentTime) { if (m_SkillDelay < currentTime) { if (useSkill()) { - // 1/10 + // 1/10초 단위 딜레이 int delay = getDelay(); m_SkillDelay = currentTime; @@ -182,13 +182,13 @@ bool Pixie::useSkill() { return false; } - // cout << "Ÿ Ȯ" << endl; + // cout << "타겟 확인" << endl; Range_t range = getRange(); if (!verifyDistance(pOwner, X, Y, range)) return false; - // cout << "Ÿ Ȯ" << endl; + // cout << "거리 확인" << endl; int HealPoint; @@ -200,7 +200,7 @@ bool Pixie::useSkill() { HealPoint = HealPoint * getPetInfo()->getPetLevel() * 3 / 500; - // cout << " Ʈ : " << HealPoint << endl; + // cout << "힐 포인트 : " << HealPoint << endl; GCPetUseSkill gcPetUseSkill; gcPetUseSkill.setAttacker(pOwner->getObjectID()); diff --git a/src/server/gameserver/PetAttrInfo.cpp b/src/server/gameserver/PetAttrInfo.cpp index 5b213505..282dcd1d 100644 --- a/src/server/gameserver/PetAttrInfo.cpp +++ b/src/server/gameserver/PetAttrInfo.cpp @@ -38,7 +38,7 @@ void PetAttrInfoManager::load() { if (m_PetAttrInfoMap[PetAttr] != NULL) m_PetAttrInfoMap[PetAttr]->setEnchantRatio(pResult->getInt(2)); else - cout << "PetAttrInfo ִ PetAttr ʴ ӼԴϴ." << endl; + cout << "PetAttrInfo에 있는 PetAttr이 존재하지 않는 속성입니다." << endl; } SAFE_DELETE(pStmt); @@ -62,7 +62,7 @@ bool PetAttrInfoManager::enchantRandomAttr(PetInfo* pPetInfo, int ratio) { value = rand() % 100; - cout << "ɼǼ : " << value << endl; + cout << "옵션선택 : " << value << endl; for (; itr != endItr; ++itr) { PetAttrInfo* pPetAttrInfo = itr->second; @@ -93,7 +93,7 @@ bool PetAttrInfoManager::enchantSpecAttr(PetInfo* pPetInfo, PetAttr_t PetAttr) { PetAttrInfo* pPetAttrInfo = m_PetAttrInfoMap[PetAttr]; if (pPetAttrInfo == NULL) { - filelog("PetBug.log", "Ӽ æƮ ̻ ִ. : %u", PetAttr); + filelog("PetBug.log", "속성 지정 펫 인챈트에서 이상한 값이 들어있다. : %u", PetAttr); return false; } diff --git a/src/server/gameserver/PetTypeInfo.cpp b/src/server/gameserver/PetTypeInfo.cpp index bed23b78..846e26b7 100644 --- a/src/server/gameserver/PetTypeInfo.cpp +++ b/src/server/gameserver/PetTypeInfo.cpp @@ -30,7 +30,7 @@ void PetTypeInfoManager::load() { Result* pResult = pStmt->executeQuery("SELECT MAX(PetType) FROM PetTypeInfo"); if (!pResult->next()) - throw Error("PetTypeInfo ϴ."); + throw Error("PetTypeInfo 가 없습니다."); PetType_t MaxPetType = pResult->getInt(1); @@ -58,7 +58,7 @@ void PetTypeInfoManager::load() { void PetTypeInfoManager::addPetTypeInfo(PetTypeInfo* pPetTypeInfo) { if (pPetTypeInfo->m_PetType >= m_PetTypeInfos.capacity()) - throw Error("Pet Type ִ밪 ʰ߳׿"); + throw Error("Pet Type이 최대값을 초과했네용"); m_PetTypeInfos[pPetTypeInfo->m_PetType] = pPetTypeInfo; } diff --git a/src/server/gameserver/PetUtil.cpp b/src/server/gameserver/PetUtil.cpp index 45dd8b95..b63c2510 100644 --- a/src/server/gameserver/PetUtil.cpp +++ b/src/server/gameserver/PetUtil.cpp @@ -20,7 +20,7 @@ bool increasePetExp(PetInfo* pPetInfo, PetExp_t exp, ModifyInfo* pMI) { lastLevel = pPetInfo->getPetLevel(); nextLevel = lastLevel + 1; - // cout << pPetInfo->getPetType() << " 꿡 ġ ݴϴ. : " << exp << endl; + // cout << pPetInfo->getPetType() << " 펫에 경험치를 줍니다. : " << exp << endl; if (pMI != NULL) pMI->addLongData(MODIFY_PET_EXP, petExp); @@ -39,7 +39,7 @@ bool increasePetExp(PetInfo* pPetInfo, PetExp_t exp, ModifyInfo* pMI) { ->getPetTypeInfo(pPetInfo->getPetType()) ->getPetCreatureType(pPetInfo->getPetLevel())); - // cout << (int)pPetInfo->getPetLevel() << " ũ Ÿ " << + // cout << (int)pPetInfo->getPetLevel() << "레벨업한 펫의 크리쳐 타입 " << //(int)pPetInfo->getPetCreatureType() << endl; if (pPetInfo->getPetAttr() != 0xff) { @@ -98,32 +98,32 @@ PetExp_t computePetExp(Level_t myLevel, Level_t monsterLevel, PetInfo* pPetInfo, } void refreshHP(PetInfo* pPetInfo, uint Ratio) { - // cout << " : " << Ratio << endl; + // cout << "펫 먹이 비율 : " << Ratio << endl; VSDateTime current = VSDateTime::currentDateTime(); int lastSec = pPetInfo->getLastFeedTime().secsTo(current); - // cout << " " << lastSec << " ϴ." << endl; + // cout << "밥먹은지 " << lastSec << "초 지났습니다." << endl; if (lastSec <= 0) return; int lastMin = (lastSec / 60) + 1; - // cout << " " << lastMin << " ϴ." << endl; + // cout << "밥먹은지 " << lastMin << "분 지났습니다." << endl; int spendFood = getPercentValue(lastMin, Ratio); // if ( pPetInfo->getPetLevel() == 50 ) spendFood = max(1, spendFood/10); if (pPetInfo->getPetHP() < spendFood) spendFood = pPetInfo->getPetHP(); if (spendFood == 0) { - // cout << "׾ Խϴ. -_-" << endl; + // cout << "죽어서 밥 못먹습니다. -_-" << endl; return; } - // cout << spendFood << "ŭ Խϴ." << endl; + // cout << spendFood << "만큼 밥먹습니다." << endl; pPetInfo->setPetHP(pPetInfo->getPetHP() - spendFood); if (pPetInfo->getPetHP() == 0) { spendFood /= (Ratio / 100.0); - // cout << " ð : " << spendFood << endl; + // cout << "먹은 시간 : " << spendFood << endl; pPetInfo->setFeedTime(pPetInfo->getLastFeedTime().addDays(spendFood / 1440).addSecs((spendFood % 1440) * 60)); } else pPetInfo->setFeedTime(current); diff --git a/src/server/gameserver/PlayerCreature.h b/src/server/gameserver/PlayerCreature.h index b7ee76d6..8142cf2a 100644 --- a/src/server/gameserver/PlayerCreature.h +++ b/src/server/gameserver/PlayerCreature.h @@ -2,8 +2,8 @@ // Filename : PlayerCreature.h // Written by : excel96 // Description : -// Slayer Vampire Ŭ ̽ Ǵ κ Ƴ -// Ŭ. abstract Ŭ̹Ƿ, ٷ ϸ ̴. +// Slayer 및 Vampire 클래스의 인터페이스 중 공통되는 부분을 모아놓은 +// 클래스다. abstract 클래스이므로, 바로 선언하면 안 될 것이당. ////////////////////////////////////////////////////////////////////////////// #ifndef __PLAYER_CREATURE_H__ @@ -63,7 +63,7 @@ typedef HashMapRankBonus::const_iterator HashMapRankBonusConstItor; class PlayerCreature : public Creature { //////////////////////////////////////////////////////////// - // Ҹ + // 생성자 및 소멸자 //////////////////////////////////////////////////////////// public: PlayerCreature(ObjectID_t objectID = 0, Player* pPlayer = NULL); @@ -74,7 +74,7 @@ class PlayerCreature : public Creature { // virtual void tinysave(const char* field) const = 0; //////////////////////////////////////////////////////////// - // OID ޽ + // OID 등록 관련 메쏘드 //////////////////////////////////////////////////////////// protected: virtual void registerItem(Item* pItem, ObjectRegistry& OR); @@ -87,7 +87,7 @@ class PlayerCreature : public Creature { virtual void registerGoodsInventory(ObjectRegistry& OR); ////////////////////////////////////////////////////////////// - // ð Լ + // 시간제한 아이템 관련 함수 ////////////////////////////////////////////////////////////// public: bool wasteIfTimeLimitExpired(Item* pItem); @@ -101,13 +101,13 @@ class PlayerCreature : public Creature { void loadTimeLimitItem(); ////////////////////////////////////////////////////////////// - // ǰ Լ + // 구매 상품 아이템 관련 함수 ////////////////////////////////////////////////////////////// public: void loadGoods(); ////////////////////////////////////////////////////////////// - // Ʈ Ŵ Լ + // 퀘스트 매니저 관련 함수 ////////////////////////////////////////////////////////////// public: QuestManager* getQuestManager() const { @@ -119,7 +119,7 @@ class PlayerCreature : public Creature { virtual void whenQuestLevelUpgrade(); //////////////////////////////////////////////////////////// - // κ丮 ޽ + // 인벤토리 관련 메쏘드 //////////////////////////////////////////////////////////// public: virtual Inventory* getInventory() const { @@ -150,7 +150,7 @@ class PlayerCreature : public Creature { } //////////////////////////////////////////////////////////// - // ޽ + // 보관함 관련 메쏘드 //////////////////////////////////////////////////////////// public: virtual Stash* getStash(void) const { @@ -190,7 +190,7 @@ class PlayerCreature : public Creature { //////////////////////////////////////////////////////////// - // ޽ + // 가비지 관련 메쏘드 //////////////////////////////////////////////////////////// public: void addItemToGarbage(Item* pItem) { @@ -210,7 +210,7 @@ class PlayerCreature : public Creature { } //////////////////////////////////////////////////////////// - // ˻ Լ + // 아이템 검색 함수 //////////////////////////////////////////////////////////// public: virtual Item* findItemOID(ObjectID_t id) = 0; @@ -227,7 +227,7 @@ class PlayerCreature : public Creature { //////////////////////////////////////////////////////////// - // ÷ Լ + // 플래그 셋 관련 함수 //////////////////////////////////////////////////////////// public: FlagSet* getFlagSet(void) const { @@ -240,7 +240,7 @@ class PlayerCreature : public Creature { //////////////////////////////////////////////////////////// - // Ÿ Լ + // 기타 함수 //////////////////////////////////////////////////////////// public: virtual Fame_t getFame() const = 0; @@ -267,20 +267,20 @@ class PlayerCreature : public Creature { virtual void setResurrectZoneID(ZoneID_t id) = 0; virtual void setResurrectZoneIDEx(ZoneID_t id) = 0; - // virtual Race_t getRace() const = 0; - Creature ÷ȴ. + // virtual Race_t getRace() const = 0; - Creature로 올렸다. virtual GuildID_t getCommonGuildID() const = 0; virtual IP_t getIP(void) const = 0; //////////////////////////////////////////////////////////// - // ý + // 성향 시스템 관련 //////////////////////////////////////////////////////////// // enemy specific methods void addEnemy(const string& Name); void deleteEnemy(const string& Name); - // Ư ڰ ̹ Ͽ°? + // 이 특정 사용자가 이미 선공을 하였는가? bool hasEnemy(const string& Name) const; uint getMaxEnemies() const; @@ -324,7 +324,7 @@ class PlayerCreature : public Creature { virtual void setAlignment(Alignment_t Alignment) = 0; //////////////////////////////////////////////////////////// - // Rank Bonus + // Rank Bonus 관련 //////////////////////////////////////////////////////////// void loadRankBonus(); bool hasRankBonus(RankBonus::RankBonusType type) { @@ -381,28 +381,28 @@ class PlayerCreature : public Creature { virtual bool canSee(Object* pObject) const; //////////////////////////////////////////////////////////// - // + // 멤버 데이터 //////////////////////////////////////////////////////////// protected: - Inventory* m_pInventory; // κ丮 - InventorySlot* m_pExtraInventorySlot; // 콺 + Inventory* m_pInventory; // 인벤토리 포인터 + InventorySlot* m_pExtraInventorySlot; // 마우스 포인터 - GoodsInventory* m_pGoodsInventory; // κ丮 + GoodsInventory* m_pGoodsInventory; // 구매 아이템 인벤토리 - Stash* m_pStash; // - BYTE m_StashNum; // - Gold_t m_StashGold; // ׼ - bool m_bStashStatus; // OID + Stash* m_pStash; // 보관함 포인터 + BYTE m_StashNum; // 보관함의 숫자 + Gold_t m_StashGold; // 보관함 안의 돈 액수 + bool m_bStashStatus; // 보관함 아이템 OID 등록 여부 - Garbage m_Garbage; // ... + Garbage m_Garbage; // 가비지... - FlagSet* m_pFlagSet; // ÷ + FlagSet* m_pFlagSet; // 플래그 집합 - // ̸ Ѵ. - // ObjectID , ׾ ٽ ʱ ̸ ش. + // 먼저 선공한 사람들의 이름을 저장한다. + // ObjectID를 저장할 수도 있으나, 죽어서 다시 오면 정당방위가 인정되지 않기 때문에 이름으로 저장해준다. list m_Enemies; - // PK ߴ ƴϳĸ Ѵ. + // PK를 당했느냐 아니냐를 구분한다. bool m_isPK; // GuildID @@ -420,17 +420,17 @@ class PlayerCreature : public Creature { TimeLimitItemManager* m_pTimeLimitItemManager; Item* m_pQuestItem; - vector m_PetStash; // pet + vector m_PetStash; // pet 보관함 public: ///////////////////////////////////////////////////////// - // pet Ͽ õ method + // pet 보관하에 관련된 method ///////////////////////////////////////////////////////// Item* getPetStashItem(int idx); void addPetStashItem(int idx, Item* pPetItem); ///////////////////////////////////////////////////////// - // BloodBible ʽ ġ + // BloodBible 관련 보너스 수치들 ///////////////////////////////////////////////////////// public: int getConsumeMPRatio() const { @@ -501,7 +501,7 @@ class PlayerCreature : public Creature { // list m_ItemNameInfoList; - // ÷ θ ϱ ¿ ߰ؾ ɵ + // 사용자의 당첨 여부를 기록하기 위해 어쩔 수 없이 여기 추가해야 될듯 public: DWORD getLottoRewardID() const { @@ -560,7 +560,7 @@ class PlayerCreature : public Creature { list m_PetItems; Pet* m_pPet; - // 2 Ʈ + // 2차 펫 퀘스트 관련 public: SpriteType_t getTargetMonsterSType() const { return m_TargetMonster; @@ -573,7 +573,7 @@ class PlayerCreature : public Creature { DWORD m_TargetNum; DWORD m_TimeLimit; - // SMS + // SMS 관련 public: SMSAddressBook* getAddressBook() const { return m_pSMSAddressBook; @@ -646,7 +646,7 @@ class PlayerCreature : public Creature { } protected: - // Ŀ¯ Ʈ + // 파워짱 포인트 int m_PowerPoint; public: diff --git a/src/server/gameserver/PlayerManager.cpp b/src/server/gameserver/PlayerManager.cpp index 6c580176..a5e50035 100644 --- a/src/server/gameserver/PlayerManager.cpp +++ b/src/server/gameserver/PlayerManager.cpp @@ -27,11 +27,11 @@ PlayerManager::PlayerManager() : m_nPlayers(0) { __BEGIN_TRY - // ÷̾ 迭 NULL ʱȭѴ. + // 플레이어 포인터 배열을 NULL 로 초기화한다. for (uint i = 0; i < nMaxPlayers; i++) m_pPlayers[i] = NULL; - // ÷̾ 迭 NULL ʱȭѴ. + // 플레이어 포인터 배열을 NULL 로 초기화한다. for (uint i = 0; i < nMaxPlayers; i++) m_pCopyPlayers[i] = NULL; @@ -49,7 +49,7 @@ PlayerManager::~PlayerManager() for (uint i = 0; i < nMaxPlayers; i++) { if (m_pPlayers[i] != NULL) { - // ÷̾ ü ϸ, destructor Ѵ. + // 플레이어 객체를 삭제하면, destructor에서 연결을 종료한다. delete m_pPlayers[i]; m_pPlayers[i] = NULL; } @@ -81,7 +81,7 @@ void PlayerManager::broadcastPacket(Packet* pPacket) ////////////////////////////////////////////////////////////////////// -// Ư ÷̾ Ŵ ߰Ѵ. +// 특정 플레이어를 매니저에 추가한다. ////////////////////////////////////////////////////////////////////// void PlayerManager::addPlayer(Player* pPlayer) { __BEGIN_TRY @@ -101,10 +101,10 @@ void PlayerManager::addPlayer(Player* pPlayer) { throw DuplicatedException("socket descriptor duplicated"); } - // ͸ Ѵ. + // 괜찮으면 포인터를 대입한다. m_pPlayers[fd] = pPlayer; - // ÷̾ ڸ Ų. + // 플레이어 숫자를 증가시킨다. m_nPlayers++; __END_CATCH @@ -112,8 +112,8 @@ void PlayerManager::addPlayer(Player* pPlayer) { ////////////////////////////////////////////////////////////////////// -// Ư ÷̾ Ŵ Ѵ. -// ü , NULL . +// 특정 플레이어를 매니저에서 삭제한다. +// 객체는 삭제하지 않으며, 슬랏만을 NULL로 만든다. ////////////////////////////////////////////////////////////////////// void PlayerManager::deletePlayer(SOCKET fd) { __BEGIN_TRY @@ -126,10 +126,10 @@ void PlayerManager::deletePlayer(SOCKET fd) { if (m_pPlayers[fd] == NULL) throw NoSuchElementException(); - // 迭 fd° ŬѴ. + // 배열의 fd번째를 클리어한다. m_pPlayers[fd] = NULL; - // ÷̾ ڸ ҽŲ. + // 플레이어 숫자를 감소시킨다. m_nPlayers--; __END_CATCH @@ -137,7 +137,7 @@ void PlayerManager::deletePlayer(SOCKET fd) { ////////////////////////////////////////////////////////////////////// -// Ư ÷̾ ü ´. +// 특정 플레이어 객체를 가져온다. ////////////////////////////////////////////////////////////////////// Player* PlayerManager::getPlayer(SOCKET fd) { __BEGIN_TRY @@ -156,7 +156,7 @@ Player* PlayerManager::getPlayer(SOCKET fd) { } ////////////////////////////////////////////////////////////////////// -// ÷̾ Ѵ. +// 플레이어를 복사한다. ////////////////////////////////////////////////////////////////////// void PlayerManager::copyPlayers() diff --git a/src/server/gameserver/Portal.h b/src/server/gameserver/Portal.h index d12fbe29..a4f0ca45 100644 --- a/src/server/gameserver/Portal.h +++ b/src/server/gameserver/Portal.h @@ -199,7 +199,7 @@ class NormalPortal : public Portal { m_pTarget->setY(y); } - // PC Ư ġ ̵Ų. + // PC를 특정 위치로 이동시킨다. bool activate(Creature* pCreature); // get debug string @@ -252,7 +252,7 @@ class GuildPortal : public Portal { m_pTarget->setY(y); } - // PC Ư ġ ̵Ų. + // PC를 특정 위치로 이동시킨다. bool activate(Creature* pCreature); // get debug string @@ -288,14 +288,14 @@ class MultiPortal : public Portal { } void getPortalTargetInfo(ZoneID_t ZoneID); - // PC Ư ġ ̵Ų. + // PC를 특정 위치로 이동시킨다. bool activate(Creature* pCreature, ZoneID_t ZoneID); // get debug string virtual string toString() const; private: - // ǥ ǥ Info + // 목표 좌표 Info list m_Targets; }; diff --git a/src/server/gameserver/PrecedenceTable.cpp b/src/server/gameserver/PrecedenceTable.cpp index 225ac826..e2da5ffc 100644 --- a/src/server/gameserver/PrecedenceTable.cpp +++ b/src/server/gameserver/PrecedenceTable.cpp @@ -2,10 +2,10 @@ // Filename : PrecedenceTable.cpp // Written by : excel96 // Description : -// "" 켱 Ŭ̴. -// ü ȿ ϴٰ, Ͱ װų -// Ǹ ÷̾ ԰ų, ִ Ǹ -// ִ ˻Ѵ. +// "먹자" 방지를 위한 우선권 계산을 위한 클래스이다. +// 개별적인 몬스터 객체 안에 존재하다가, 몬스터가 죽거나 흡혈 당할 때가 +// 되면 플레이어가 아이템을 먹거나, 흡혈을 할 수 있는 정당한 권리를 가지고 +// 있는지를 검사한다. ////////////////////////////////////////////////////////////////////////////// #include "PrecedenceTable.h" @@ -51,14 +51,14 @@ PrecedenceTable::PrecedenceTable() { } PrecedenceTable::~PrecedenceTable() { - // ũ . + // 크리쳐 맵을 비운다. unordered_map::iterator itr = m_CreatureMap.begin(); for (; itr != m_CreatureMap.end(); itr++) { SAFE_DELETE(itr->second); } m_CreatureMap.clear(); - // Ƽ . + // 파티 맵을 비운다. unordered_map::iterator itr2 = m_PartyMap.begin(); for (; itr2 != m_PartyMap.end(); itr2++) { SAFE_DELETE(itr2->second); @@ -70,13 +70,13 @@ void PrecedenceTable::addPrecedence(Creature* pCreature, int damage) { Assert(pCreature != NULL); - // ũ ִٴ , ڶ ̴. + // 크리쳐 맵이 비어있다는 말은, 최초의 공격자라는 말이다. if (m_CreatureMap.empty()) { - // ̸ ְ... + // 선공자의 이름을 세팅해 주고... m_FirstAttackerName = pCreature->getName(); - // ũ ʿ ͸ ߰Ѵ. + // 크리쳐 맵에다 데이터를 추가한다. PrecedenceElement* pElement = new PrecedenceElement; pElement->setName(pCreature->getName()); pElement->setPartyID(-1); @@ -89,7 +89,7 @@ void PrecedenceTable::addPrecedence(Creature* pCreature, int damage) unordered_map::iterator itr = m_CreatureMap.find(pCreature->getName()); if (itr == m_CreatureMap.end()) { - // ʾҴٸ ͸ ش. + // 이전에 공격을 하지 않았다면 데이터를 새로 생성해 준다. PrecedenceElement* pElement = new PrecedenceElement; pElement->setName(pCreature->getName()); pElement->setPartyID(-1); @@ -99,16 +99,16 @@ void PrecedenceTable::addPrecedence(Creature* pCreature, int damage) } else { - // ߴٸ ͸ ش. + // 이전에 공격을 했다면 데이터를 갱신해 준다. PrecedenceElement* pElement = itr->second; pElement->setDamage(pElement->getDamage() + damage); pElement->setNextTime(); } } - // Ƽ 굵 ش. - // Ƽ ԵǾ ʴٸ Ƽ ID 0̴. - // ᱹ 0 Ƽ ԵǾ ڵ ̴. + // 파티에 관한 계산도 해준다. + // 파티에 가입되어 있지 않다면 파티 ID가 0이다. + // 결국 0의 값은 파티에 가입되어 있지 않은 자들이 가한 데미지의 값이다. int PartyID = pCreature->getPartyID(); if (m_PartyMap.empty()) { @@ -140,12 +140,12 @@ void PrecedenceTable::addPrecedence(Creature* pCreature, int damage) */ void PrecedenceTable::addPrecedence(const string& Name, int PartyID, int damage) { - // ũ ִٴ , ڶ ̴. + // 크리쳐 맵이 비어있다는 말은, 최초의 공격자라는 말이다. if (m_CreatureMap.empty()) { - // ̸ ְ... + // 선공자의 이름을 세팅해 주고... m_FirstAttackerName = Name; - // ũ ʿ ͸ ߰Ѵ. + // 크리쳐 맵에다 데이터를 추가한다. PrecedenceElement* pElement = new PrecedenceElement; pElement->setName(Name); pElement->setPartyID(-1); @@ -155,7 +155,7 @@ void PrecedenceTable::addPrecedence(const string& Name, int PartyID, int damage) } else { unordered_map::iterator itr = m_CreatureMap.find(Name); if (itr == m_CreatureMap.end()) { - // ʾҴٸ ͸ ش. + // 이전에 공격을 하지 않았다면 데이터를 새로 생성해 준다. PrecedenceElement* pElement = new PrecedenceElement; pElement->setName(Name); pElement->setPartyID(-1); @@ -163,16 +163,16 @@ void PrecedenceTable::addPrecedence(const string& Name, int PartyID, int damage) pElement->setNextTime(); m_CreatureMap[Name] = pElement; } else { - // ߴٸ ͸ ش. + // 이전에 공격을 했다면 데이터를 갱신해 준다. PrecedenceElement* pElement = itr->second; pElement->setDamage(pElement->getDamage() + damage); pElement->setNextTime(); } } - // Ƽ 굵 ش. - // Ƽ ԵǾ ʴٸ Ƽ ID 0̴. - // ᱹ 0 Ƽ ԵǾ ڵ ̴. + // 파티에 관한 계산도 해준다. + // 파티에 가입되어 있지 않다면 파티 ID가 0이다. + // 결국 0의 값은 파티에 가입되어 있지 않은 자들이 가한 데미지의 값이다. // int PartyID = PartyID; if (m_PartyMap.empty()) { PrecedenceElement* pElement = new PrecedenceElement; @@ -195,7 +195,7 @@ void PrecedenceTable::addPrecedence(const string& Name, int PartyID, int damage) } } - // ٽ ϵ ϱ ؼ.. by sigi. 2002.10.14 + // 다시 계산하도록 하기 위해서.. by sigi. 2002.10.14 m_bComputeFlag = false; } @@ -244,7 +244,7 @@ void PrecedenceTable::heartbeat(const Timeval& currentTime) { } void PrecedenceTable::compute(void) { - // ̹ Ѵ. by sigi. 2002.10.14 + // 이미 계산했으면 안한다. by sigi. 2002.10.14 if (m_bComputeFlag) return; @@ -256,7 +256,7 @@ void PrecedenceTable::compute(void) { Damage_t TotalDamage = 0; - // ũ ˻Ѵ. + // 먼저 크리쳐 맵을 검색한다. unordered_map::const_iterator itr = m_CreatureMap.begin(); for (; itr != m_CreatureMap.end(); itr++) { PrecedenceElement* pElement = itr->second; @@ -279,15 +279,15 @@ void PrecedenceTable::compute(void) { m_TotalDamage = TotalDamage; if (MaxDamageName != "") { - // ְ ڰ ڶ, - // 40+20 = 60 Ǿ ȴ. + // 최고의 데미지를 준 자가 선공자라면, + // 40+20 = 60 이 되어 주인이 된다. if (MaxDamageName == m_FirstAttackerName) { m_HostName = MaxDamageName; } - // ִ ڰ ڰ ƴ϶, - // ι° ڰ, 30+20 Ǿ ȴ. - // ι° ڰ ڰ ƴ϶, - // ִ ڰ ȴ. + // 최대 데미지를 준 자가 선공자가 아니라면, + // 두번째로 데미지를 많이 준 자가, 선공자일 경우 30+20이 되어 주인이 된다. + // 두번째로 데미지를 많이 준 자가 선공자가 아니라면, + // 최대 데미지를 준 자가 주인이 된다. else { if (SecondDamageName != "" && SecondDamageName == m_FirstAttackerName) { m_HostName = SecondDamageName; @@ -296,18 +296,18 @@ void PrecedenceTable::compute(void) { } } } else { - // ִ ڰ , - // Ȥö ׷ 찡 ִٸ ڸ Ѵ. + // 최대 데미지를 준 자가 없을 리는 없겠지만, + // 혹시라도 그런 경우가 있다면 선공자를 주인으로 한다. m_HostName = m_FirstAttackerName; } - // Ƽ ־ Ѵ. - // Ƽ 꿡 ־ Ƽ ID 0 , - // Ƽ ԵǾ ڵ Ѵٴ ̴. - // ִ ƼID 0̶, Ƽ ԵǾ - // ִ ٸ, HostPartyID 0 ȴ. - // 쿡 Ƽ ԵǾ Ǹ ϴ. - // ׷Ƿ canLoot canDrainBlood Ƽ ID 0 ƴ ˻ؾ ̴. + // 파티에 관한 정보도 계산해 주어야 한다. + // 파티 정보 계산에 있어서 유의할 점은 파티 ID가 0인 상태, + // 즉 파티에 가입되어 있지 않은 자들의 데미지도 같이 계산한다는 점이다. + // 만일 최대 데미지를 입힌 파티ID가 0이라면, 즉 파티에 가입되어 있지 않은 + // 사람들이 최대 데미지를 입혔다면, HostPartyID가 0이 된다. + // 이 경우에는 파티에 가입되어 있지 않은 사람들이 모두 권리를 가져서는 곤란하다. + // 그러므로 canLoot나 canDrainBlood에서 파티 ID가 0이 아닌지를 검사해야 할 것이다. MaxDamage = 0; MaxDamagePartyID = -1; SecondDamagePartyID = -1; @@ -330,15 +330,15 @@ void PrecedenceTable::compute(void) { } if (MaxDamagePartyID != -1) { - // ְ Ƽ Ƽ, - // 40+20 = 60 Ǿ ȴ. + // 최고의 데미지를 준 파티가 선공 파티라면, + // 40+20 = 60 이 되어 주인이 된다. if (MaxDamagePartyID == m_FirstAttackerPartyID) { m_HostPartyID = MaxDamagePartyID; } - // ִ Ƽ ڰ ƴ϶, - // ι° Ƽ, Ƽ 30+20 Ǿ ȴ. - // ι° Ƽ Ƽ ƴ϶, - // ִ Ƽ ȴ. + // 최대 데미지를 준 파티가 선공자가 아니라면, + // 두번째로 데미지를 많이 준 파티가, 선공파티일 경우 30+20이 되어 주인이 된다. + // 두번째로 데미지를 많이 준 파티가 선공파티가 아니라면, + // 최대 데미지를 준 파티가 주인이 된다. else { if (SecondDamagePartyID != -1 && SecondDamagePartyID == m_FirstAttackerPartyID) { m_HostPartyID = SecondDamagePartyID; @@ -347,8 +347,8 @@ void PrecedenceTable::compute(void) { } } } else { - // ִ ڰ , - // Ȥö ׷ 찡 ִٸ ڸ Ѵ. + // 최대 데미지를 준 자가 없을 리는 없겠지만, + // 혹시라도 그런 경우가 있다면 선공자를 주인으로 한다. m_HostPartyID = m_FirstAttackerPartyID; } @@ -356,11 +356,11 @@ void PrecedenceTable::compute(void) { } bool PrecedenceTable::canLoot(Creature* pCreature) const { - // 켱 ڶ Ʈ ִ. + // 우선권을 가진 자라면 루트할 수 있다. if (m_HostName == pCreature->getName()) return true; - // 켱 Ƽ ԵǾ ִٸ Ʈ ִ. + // 우선권을 가진 파티에 가입되어 있다면 루트할 수 있다. int PartyID = pCreature->getPartyID(); if (PartyID != 0 && m_HostPartyID == PartyID) return true; @@ -369,11 +369,11 @@ bool PrecedenceTable::canLoot(Creature* pCreature) const { } bool PrecedenceTable::canDrainBlood(Creature* pCreature) const { - // 켱 ڶ Ʈ ִ. + // 우선권을 가진 자라면 루트할 수 있다. if (m_HostName == pCreature->getName()) return true; - // 켱 Ƽ ԵǾ ִٸ Ʈ ִ. + // 우선권을 가진 파티에 가입되어 있다면 루트할 수 있다. int PartyID = pCreature->getPartyID(); if (PartyID != 0 && m_HostPartyID == PartyID) return true; @@ -382,7 +382,7 @@ bool PrecedenceTable::canDrainBlood(Creature* pCreature) const { } bool PrecedenceTable::canGainRankExp(Creature* pCreature) const { - // Ͱ տ 1/4 ʰ ŭ ٸ ġ ִ. + // 몬스터가 받은 데미지의 총합에서 1/4을 초과한 만큼 데미지를 줬다면 계급 경험치를 얻을 수 있다. unordered_map::const_iterator itr = m_CreatureMap.find(pCreature->getName()); if (itr == m_CreatureMap.end()) return false; diff --git a/src/server/gameserver/PrecedenceTable.h b/src/server/gameserver/PrecedenceTable.h index 65b0902c..b1235941 100644 --- a/src/server/gameserver/PrecedenceTable.h +++ b/src/server/gameserver/PrecedenceTable.h @@ -2,10 +2,10 @@ // Filename : PrecedenceTable.h // Written by : excel96 // Description : -// "" 켱 Ŭ̴. -// ü ȿ ϴٰ, Ͱ װų -// Ǹ ÷̾ ԰ų, ִ Ǹ -// ִ ˻Ѵ. +// "먹자" 방지를 위한 우선권 계산을 위한 클래스이다. +// 개별적인 몬스터 객체 안에 존재하다가, 몬스터가 죽거나 흡혈 당할 때가 +// 되면 플레이어가 아이템을 먹거나, 흡혈을 할 수 있는 정당한 권리를 가지고 +// 있는지를 검사한다. ////////////////////////////////////////////////////////////////////////////// #ifndef __PRECEDENCETABLE_H__ @@ -23,9 +23,9 @@ class Creature; ////////////////////////////////////////////////////////////////////////////// // class PrecedenceElement; -// PrecedenceTable ȿ  üμ ÷̾ Ϳ -// ð, ׸ ÷̾ -// δ δ. +// PrecedenceTable 안에 들어가는 객체로서 각각의 플레이어가 몬스터에게 가한 +// 데미지 양과 마지막으로 데미지를 가한 시간, 그리고 그 플레이어어에 대한 +// 정보를 기록해 두는 데 쓰인다. ////////////////////////////////////////////////////////////////////////////// class PrecedenceElement { @@ -73,10 +73,10 @@ class PrecedenceElement { ////////////////////////////////////////////////////////////////////////////// // class PrecedenceTable; -// PrecedenceElement üμ ü ȿ composition -// Եȴ. addPrecedence Լ ̿ ÷̾ -// ϰ ִٰ, compute Լ ̿ Ϳ -// Ǵ ؼ 켱 ִ Ǵ ϰ ִ´. +// PrecedenceElement의 집합체로서 몬스터 객체 안에 composition 형식으로 +// 포함된다. addPrecedence 함수를 이용해 각각의 플레이어가 준 데미지를 +// 기억하고 있다가, compute 함수를 이용해 누가 이 몬스터에서 나오는 아이템 +// 또는 흡혈에 대해서 우선권을 가지고 있는 가를 판단해 저장하고 있는다. ////////////////////////////////////////////////////////////////////////////// class PrecedenceTable { @@ -124,17 +124,17 @@ class PrecedenceTable { unordered_map m_CreatureMap; unordered_map m_PartyMap; - string m_FirstAttackerName; // ̸ - int m_FirstAttackerPartyID; // Ƽ ID + string m_FirstAttackerName; // 제일 먼저 선공을 가한 자의 이름 + int m_FirstAttackerPartyID; // 제일 먼저 선공을 가한 자의 파티 ID - string m_HostName; // ̸ - int m_HostPartyID; // Ƽ ID + string m_HostName; // 주인의 이름 + int m_HostPartyID; // 주인의 파티 ID - string m_QuestHostName; // Ʈ ̸ + string m_QuestHostName; // 퀘스트 아이템의 주인 이름 - bool m_bComputeFlag; // ģ ΰ...? + bool m_bComputeFlag; // 계산을 마친 상태인가...? - Damage_t m_TotalDamage; // + Damage_t m_TotalDamage; // 데미지 총합 }; #endif diff --git a/src/server/gameserver/PriceManager.cpp b/src/server/gameserver/PriceManager.cpp index 85c17d7c..e32ab29a 100644 --- a/src/server/gameserver/PriceManager.cpp +++ b/src/server/gameserver/PriceManager.cpp @@ -1,9 +1,9 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : PriceManager.cpp -// Written By : 輺 +// Written By : 김성민 // Description : -// , ŸŰ ϴ Ŭ̴. -// δ ItemInfoManager ̿ Ѵ. +// 아이템을 상점에서 사고 팔 때, 그 매매가격을 결정하는 클래스이다. +// 내부적으로는 ItemInfoManager의 원래 가격을 이용해 계산을 한다. ////////////////////////////////////////////////////////////////////////////// #include "PriceManager.h" @@ -32,22 +32,22 @@ const uint SUMMON_ITEM_CHARGE_PRICE = 1000; ////////////////////////////////////////////////////////////////////////////// // getPrice() -// ǰ Ѵ. -// nDiscount () ̿ ǰ Ʈ ִ. +// 아이템 정보를 참조해 실제 물건값을 정한다. +// nDiscount 변수(백분율)를 이용해 물건값을 컨트롤할 수 있다. ////////////////////////////////////////////////////////////////////////////// Price_t PriceManager::getPrice(Item* pItem, MarketCond_t nDiscount, ShopRackType_t shopType, Creature* pCreature) const { - // ÷ ¥ ȾƵ 1ۿ ´. 2003. 1. 15. Sequoia + // 첨에 공짜로 준 아이템은 팔아도 1원밖에 못 얻는다. 2003. 1. 15. Sequoia if (pItem->getCreateType() == Item::CREATE_TYPE_GAME) return (Price_t)1; - // Ʈ ~~~ 2003. 4. 14. Sequoia + // 퀘스트 아이템은 오디번~~~ 2003. 4. 14. Sequoia if (pItem->isTimeLimitItem()) return (Price_t)50; if (pItem->getItemClass() == Item::ITEM_CLASS_MOON_CARD && pItem->getItemType() == 4) { return (Price_t)g_pVariableManager->getVariable(CROWN_PRICE); } - // . + // 아이템의 원래 가격을 얻어낸다. ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo(pItem->getItemClass(), pItem->getItemType()); double originalPrice = pItemInfo->getPrice(); double finalPrice = 0; @@ -58,7 +58,7 @@ Price_t PriceManager::getPrice(Item* pItem, MarketCond_t nDiscount, ShopRackType originalPrice *= (gradePercent / 100.0); } - // ̾ Ż 쿡 ݿ ŭ ؾ Ѵ. + // 슬레이어 포탈 같은 경우에는 원래 가격에다 현재 차지 수만큼의 가격을 더해야 한다. if (pItem->getItemClass() == Item::ITEM_CLASS_SLAYER_PORTAL_ITEM) { SlayerPortalItem* pSlayerPortalItem = dynamic_cast(pItem); originalPrice += (pSlayerPortalItem->getCharge() * PORTAL_ITEM_CHARGE_PRICE); @@ -70,12 +70,12 @@ Price_t PriceManager::getPrice(Item* pItem, MarketCond_t nDiscount, ShopRackType originalPrice += (pOustersSummonItem->getCharge() * SUMMON_ITEM_CHARGE_PRICE); } - // ɼ ִٸ ɼǸŭ ؾ Ѵ. + // 옵션이 있다면 옵션만큼의 가격을 곱해야 한다. const list& optionTypes = pItem->getOptionTypeList(); if (!optionTypes.empty()) { finalPrice = 0; - // = ( * ɼ PriceMultiplier / 100) + .. + // 가격 = (원래 가격 * 옵션의 PriceMultiplier / 100) + .. double priceMultiplier = 0; list::const_iterator itr; for (itr = optionTypes.begin(); itr != optionTypes.end(); itr++) { @@ -88,25 +88,25 @@ Price_t PriceManager::getPrice(Item* pItem, MarketCond_t nDiscount, ShopRackType originalPrice = finalPrice; } - // ջǾٸ ջ ŭ ƾ Ѵ. + // 아이템이 손상되었다면 손상된 만큼의 가격을 깍아야 한다. double maxDurability = (double)computeMaxDurability(pItem); double curDurability = (double)(pItem->getDurability()); - // ߿ ͵ ϱ óش. + // 아이템 중에 내구도가 없는 것들이 존재하기 때문에 처리해준다. if (maxDurability > 1) finalPrice = originalPrice * curDurability / maxDurability; else finalPrice = originalPrice; - // ü ٽ ش. + // 상점 시세에 따라 가격을 다시 조정해준다. finalPrice = finalPrice * nDiscount / 100; - // ٽ ش. + // 상점의 종류에 따라 가격을 다시 조정해준다. if (shopType == SHOP_RACK_MYSTERIOUS) { finalPrice *= 10; } - // ũ ȭ ҿ ٽ ش. + // 크리쳐의 변화 요소에 따라 가격을 다시 조정해준다. if (pCreature != NULL) { if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -119,19 +119,19 @@ Price_t PriceManager::getPrice(Item* pItem, MarketCond_t nDiscount, ShopRackType finalPrice = getPercentValue((int)finalPrice, 70); } } else if (pCreature->isVampire()) { - // ̾ ذ 쿡 ذ ٿش. + // 뱀파이어가 해골을 팔 경우에는 해골의 가격을 반으로 줄여준다. if (pItem->getItemClass() == Item::ITEM_CLASS_SKULL) { finalPrice = finalPrice / 2.0; } } else if (pCreature->isOusters()) { - // ƿ콺 ذ 쿡 ذ 75%. + // 아우스터즈가 해골을 팔 경우에는 해골의 가격의 75%. if (pItem->getItemClass() == Item::ITEM_CLASS_SKULL) { finalPrice *= 0.75; } } } - // ̰ ̸ + // 유료 사용자이고 유료존 이면 if (g_pVariableManager->getVariable(PREMIUM_HALF_EVENT)) { if (pItem->getItemClass() == Item::ITEM_CLASS_POTION || pItem->getItemClass() == Item::ITEM_CLASS_SERUM || pItem->getItemClass() == Item::ITEM_CLASS_LARVA || pItem->getItemClass() == Item::ITEM_CLASS_PUPA || @@ -140,20 +140,20 @@ Price_t PriceManager::getPrice(Item* pItem, MarketCond_t nDiscount, ShopRackType PlayerCreature* pPC = dynamic_cast(pCreature); GamePlayer* pGamePlayer = dynamic_cast(pPC->getPlayer()); if (pGamePlayer->isPayPlaying()) { - // . + // 반 값. finalPrice = finalPrice / 2; } } } } - // Blood Bible ʽ + // Blood Bible 보너스 적용 if (pItem->getItemClass() == Item::ITEM_CLASS_POTION || pItem->getItemClass() == Item::ITEM_CLASS_SERUM) { if (pCreature->isPC()) { PlayerCreature* pPC = dynamic_cast(pCreature); int ratio = pPC->getPotionPriceRatio(); if (ratio != 0) { - // ratio ̳ʽ ̴. + // ratio 값이 마이너스 값이다. finalPrice += getPercentValue((int)finalPrice, ratio); } } @@ -164,12 +164,12 @@ Price_t PriceManager::getPrice(Item* pItem, MarketCond_t nDiscount, ShopRackType ////////////////////////////////////////////////////////////////////////////// // getRepairPrice() -// Ѵ. -// ڻ쳭 -// 10 1̴. +// 아이템을 수리할 때 드는 비용을 리턴한다. +// 아이템 수리비는 완전히 박살난 아이템일 경우 +// 원래 아이템 가격의 10분의 1이다. ////////////////////////////////////////////////////////////////////////////// Price_t PriceManager::getRepairPrice(Item* pItem, Creature* pCreature) const { - // . + // 아이템의 원래 가격을 얻어낸다. ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo(pItem->getItemClass(), pItem->getItemType()); double originalPrice = pItemInfo->getPrice(); double finalPrice = 0; @@ -180,7 +180,7 @@ Price_t PriceManager::getRepairPrice(Item* pItem, Creature* pCreature) const { originalPrice *= (gradePercent / 100.0); } - // ̾ Ż 쿡 , ø ִ. + // 슬레이어 포탈 같은 경우에는 수리를 할 수는 없지만, 차지를 늘릴 수가 있다. if (pItem->getItemClass() == Item::ITEM_CLASS_SLAYER_PORTAL_ITEM) { SlayerPortalItem* pSlayerPortalItem = dynamic_cast(pItem); int MaxCharge = pSlayerPortalItem->getMaxCharge(); @@ -197,11 +197,11 @@ Price_t PriceManager::getRepairPrice(Item* pItem, Creature* pCreature) const { return (MaxCharge - CurCharge) * SUMMON_ITEM_CHARGE_PRICE; } - // ɼ ִٸ ɼǸŭ ؾ Ѵ. + // 옵션이 있다면 옵션만큼의 가격을 곱해야 한다. const list& optionTypes = pItem->getOptionTypeList(); if (!optionTypes.empty()) { finalPrice = 0; - // = ( * ɼ PriceMultiplier / 100) * ɼ + // 가격 = (원래 가격 * 옵션의 PriceMultiplier의 총합 / 100) * 옵션의 개수 double priceMultiplier = 0; list::const_iterator itr; for (itr = optionTypes.begin(); itr != optionTypes.end(); itr++) { @@ -223,27 +223,27 @@ Price_t PriceManager::getRepairPrice(Item* pItem, Creature* pCreature) const { } */ - // ջǾٸ ջ ŭ ƾ Ѵ. + // 아이템이 손상되었다면 손상된 만큼의 가격을 깍아야 한다. double maxDurability = (double)computeMaxDurability(pItem); double curDurability = (double)(pItem->getDurability()); - // ߿ ͵ ϱ óش. + // 아이템 중에 내구도가 없는 것들이 존재하기 때문에 처리해준다. if (maxDurability != 0) { - // ƽ Ѵ. + // 아이템의 현재 내구도가 맥스라면 리턴한다. if (curDurability == maxDurability) { return 0; } - // ֳ ջ ´. - // ̸ ݿ ϸ, ŭ ȴ. + // 현재 내구도를 최내 내구도로 나누면 그 아이템의 손상된 정도가 나온다. + // 이를 원래 가격에다 곱하면, 내구도가 깍인 만큼 아이템의 값이 떨어지게 된다. finalPrice = originalPrice * curDurability / maxDurability; } else { - // ջ Ƿ, - // Ȱ. + // 내구도가 없는 아이템은 손상되지가 않으므로, + // 내구도를 고려한 가격은 원래의 값과 똑같다. finalPrice = originalPrice; } - // 10 1̴. + // 수리 비용은 원래 값의 10분의 1이다. finalPrice = (originalPrice - finalPrice) / 10.0; if (finalPrice < 1.0) { @@ -255,7 +255,7 @@ Price_t PriceManager::getRepairPrice(Item* pItem, Creature* pCreature) const { ////////////////////////////////////////////////////////////////////////////// // getSilverCoatingPrice() -// ̴. +// 아이템을 은 도금할 때의 가격이다. ////////////////////////////////////////////////////////////////////////////// Price_t PriceManager::getSilverCoatingPrice(Item* pItem, Creature* pCreature) const { if (pItem == NULL) @@ -275,7 +275,7 @@ Price_t PriceManager::getSilverCoatingPrice(Item* pItem, Creature* pCreature) co double maxSilver = pItemInfo->getMaxSilver(); double finalPrice = 0; - // ̴. + // 땜빵으로 집어넣은 은의 가격이다. finalPrice = maxSilver; return max(0, (int)finalPrice); @@ -283,8 +283,8 @@ Price_t PriceManager::getSilverCoatingPrice(Item* pItem, Creature* pCreature) co ////////////////////////////////////////////////////////////////////////////// // getStashPrice() -// Ѵ. -// ׷ ƴϱ ڵ忡 ־ Ҵ. +// 보관함 가격을 리턴한다. +// 그렇게 자주 변동될 가격이 아니기 때문에 코드에다 집어넣어 놓았다. ////////////////////////////////////////////////////////////////////////////// Price_t PriceManager::getStashPrice(BYTE index, Creature* pCreature) const { Price_t price = 0; @@ -316,12 +316,12 @@ Price_t PriceManager::getStashPrice(BYTE index, Creature* pCreature) const { ////////////////////////////////////////////////////////////////////////////// -// ̺Ʈ Լ -// 2001 ũ ̺Ʈ Ͽ ۿ ̴. -// 2002 ̳ ̺Ʈ ϱ Ͽ ּ +// 이벤트용 가격 함수 +// 2001년 크리스마스 이벤트때 사용하였던 별 아이템에 대한 정보이다. +// 2002년 어린이날에도 같은 이벤트를 사용하기로 하였기 때문에 주석을 해지 // -// ̺Ʈ Ͼ ִ , -// ̸ STAR_EVENT_CODE ϴ ؾ ϰڴ. +// 별 이벤트가 앞으로 일어날 수 있는 관계로, +// 이름을 STAR_EVENT_CODE로 변경하는 것을 고려해야 하겠다. ////////////////////////////////////////////////////////////////////////////// int PriceManager::getStarPrice(Item* pItem, XMAS_STAR& star) const { Assert(pItem != NULL); @@ -368,8 +368,8 @@ int PriceManager::getBallPrice(int price, XMAS_STAR& star) const { return 0; } -// Mysterious Item -// itemClass pCreature ɷġ ޶. +// Mysterious Item 가격 +// itemClass와 pCreature의 능력치에 따라서 가격이 달라진다. Price_t PriceManager::getMysteriousPrice(Item::ItemClass itemClass, Creature* pCreature) const { int multiplier = 1; @@ -381,40 +381,40 @@ Price_t PriceManager::getMysteriousPrice(Item::ItemClass itemClass, Creature* pC Attr_t CINT = pSlayer->getINT(ATTR_BASIC); Attr_t CSUM = CSTR + CDEX + CINT; - // 0~20 + // 0~20 사이 multiplier = CSUM / 15; } else if (pCreature->isVampire()) { Vampire* pVampire = dynamic_cast(pCreature); Level_t CLevel = pVampire->getLevel(); - // 0~20 + // 0~20 사이 multiplier = CLevel / 5; } else if (pCreature->isOusters()) { Ousters* pOusters = dynamic_cast(pCreature); Level_t CLevel = pOusters->getLevel(); - // 0~20 + // 0~20 사이 multiplier = CLevel / 5; } - // 1~20 + // 1~20사이 multiplier = max(1, multiplier); - // ˾ƿ´. + // 가격 평균을 알아온다. InfoClassManager* pInfoClass = g_pItemInfoManager->getInfoManager(itemClass); Assert(pInfoClass != NULL); - // * ɷġ ? + // 가격 평균 * 능력치 비율? int finalPrice = (int)pInfoClass->getAveragePrice() * multiplier; - // Blood Bible ʽ + // Blood Bible 보너스 적용 if (pCreature->isPC()) { PlayerCreature* pPC = dynamic_cast(pCreature); int ratio = pPC->getGamblePriceRatio(); if (ratio != 0) { - // ratio ̳ʽ ̴. + // ratio 값은 마이너스 값이다. finalPrice += getPercentValue(finalPrice, ratio); } } diff --git a/src/server/gameserver/PriceManager.h b/src/server/gameserver/PriceManager.h index 44d9988b..ae50e45f 100644 --- a/src/server/gameserver/PriceManager.h +++ b/src/server/gameserver/PriceManager.h @@ -1,9 +1,9 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : PriceManager.h -// Written By : 輺 +// Written By : 김성민 // Description : -// , ŸŰ ϴ Ŭ̴. -// δ ItemInfoManager ̿ Ѵ. +// 아이템을 상점에서 사고 팔 때, 그 매매가격을 결정하는 클래스이다. +// 내부적으로는 ItemInfoManager의 원래 가격을 이용해 계산을 한다. ////////////////////////////////////////////////////////////////////////////// #ifndef __PRICEMANAGER_H__ @@ -22,22 +22,22 @@ class Creature; class PriceManager { public: - // ǰ Ѵ. + // 아이템 정보를 참조해 실제 물건값을 정한다. Price_t getPrice(Item* pItem, MarketCond_t nDiscount, ShopRackType_t shopType, Creature* pCreature) const; - // Mysterious Item + // Mysterious Item 가격 Price_t getMysteriousPrice(Item::ItemClass itemClass, Creature* pCreature) const; - // + // 아이템을 수리할 때의 비용 Price_t getRepairPrice(Item* pItem, Creature* pCreature = NULL) const; - // ۿ + // 아이템에 은 도금할 때의 비용 Price_t getSilverCoatingPrice(Item* pItem, Creature* pCreature = NULL) const; - // + // 보관함의 가격 Price_t getStashPrice(BYTE index, Creature* pCreature = NULL) const; - // ̺Ʈ Լ + // 이벤트용 가격 함수 int getStarPrice(Item* pItem, XMAS_STAR& star) const; int getBallPrice(int price, XMAS_STAR& star) const; }; diff --git a/src/server/gameserver/RankEXPInfo.cpp b/src/server/gameserver/RankEXPInfo.cpp index 05673f0f..4195699a 100644 --- a/src/server/gameserver/RankEXPInfo.cpp +++ b/src/server/gameserver/RankEXPInfo.cpp @@ -104,7 +104,7 @@ void RankEXPInfoManager::load(RankType rankType) throw Error("There is no data in RankEXPInfo Table"); } - // ü Ѵ. + // 전체 갯수를 세팅한다. pResult->next(); m_RankEXPCount = pResult->getInt(1) + 1; @@ -113,11 +113,11 @@ void RankEXPInfoManager::load(RankType rankType) m_RankEXPInfoList = new RankEXPInfo*[m_RankEXPCount]; Assert(m_RankEXPInfoList != NULL); - // 迭 ʱȭ + // 배열을 초기화 for (uint i = 0; i < m_RankEXPCount; i++) m_RankEXPInfoList[i] = NULL; - // ͸ ִ´. + // 데이터를 집어넣는다. pResult = pStmt->executeQuery("Select Level, GoalExp, AccumExp from RankEXPInfo WHERE RankType=%d", (int)rankType); while (pResult->next()) { @@ -159,7 +159,7 @@ RankEXPInfo* RankEXPInfoManager::getRankEXPInfo(uint value) const __BEGIN_TRY if (value >= m_RankEXPCount || m_RankEXPInfoList[value] == NULL) { - filelog("RankEXPError.log", "RankEXP ɷġ ʰ Ǵ ̸"); + filelog("RankEXPError.log", "RankEXP 능력치 초과 또는 미만"); throw InvalidProtocolException(); } diff --git a/src/server/gameserver/RegenZoneManager.cpp b/src/server/gameserver/RegenZoneManager.cpp index 883c1a66..9c79bcd7 100644 --- a/src/server/gameserver/RegenZoneManager.cpp +++ b/src/server/gameserver/RegenZoneManager.cpp @@ -107,7 +107,7 @@ void RegenZoneManager::reload() { Item* pTowerItem = pZone->getTile(ZoneX, ZoneY).getItem(); if (pTowerItem == NULL || pTowerItem->getItemClass() != Item::ITEM_CLASS_CORPSE || pTowerItem->getItemType() != MONSTER_CORPSE) { - filelog("RaceWar.log", " Ÿ ãҽϴ. [%d:(%d,%d)]", ZoneID, ZoneX, ZoneY); + filelog("RaceWar.log", "리젠존 타워를 못 찾았습니다. [%d:(%d,%d)]", ZoneID, ZoneX, ZoneY); pZone->unlock(); continue; } @@ -117,7 +117,7 @@ void RegenZoneManager::reload() { RegenZoneInfo* pInfo = m_RegenZoneInfos[ID]; if (pInfo == NULL) { - filelog("RaceWar.log", "Reload : شǴ ϴ. [%d]", ID); + filelog("RaceWar.log", "Reload : 해당되는 리젠존이 없습니다. [%d]", ID); m_RegenZoneInfos.erase(ID); pZone->unlock(); continue; @@ -128,7 +128,7 @@ void RegenZoneManager::reload() { EffectRegenZone* pEffect = dynamic_cast( pTower->getEffectManager().findEffect(Effect::EFFECT_CLASS_SLAYER_REGEN_ZONE)); if (pEffect == NULL) { - filelog("RaceWar.log", "Reload : Ʈ 󰬽ϴ. [%d]", ID); + filelog("RaceWar.log", "Reload : 리젠존 이펙트가 날라갔습니다. [%d]", ID); pZone->unlock(); continue; } @@ -287,11 +287,11 @@ bool RegenZoneManager::canRegen(PlayerCreature* pPC, uint ID) { if (itr == m_RegenZoneInfos.end()) { switch (ID) { - case 8: // Ÿν - case 10: // Ƽ + case 8: // 옥타부스 + case 10: // 셉티무스 return pPC->isSlayer(); - case 9: // ׸Ƽ콺 - case 11: // Ƹ + case 9: // 테르티우스 + case 11: // 쿠아르투스 return pPC->isVampire(); case 12: case 13: @@ -305,7 +305,7 @@ bool RegenZoneManager::canRegen(PlayerCreature* pPC, uint ID) { unordered_map& cmap = pMM->getCreatures(); unordered_map::iterator itr = cmap.begin(); - // ȵȴ. + // 성문이 있으면 안된다. for (; itr != cmap.end(); ++itr) { Monster* pMonster = dynamic_cast((itr->second)); if (pMonster != NULL && pMonster->getMonsterType() == 726) @@ -335,28 +335,28 @@ void RegenZoneManager::regeneratePC(PlayerCreature* pPC, uint ID) { if (itr == m_RegenZoneInfos.end()) { switch (ID) { - case 8: // Ÿν + case 8: // 옥타부스 { targetPos.id = 1201; targetPos.x = 120; targetPos.y = 120; break; } - case 9: // ׸Ƽ콺 + case 9: // 테르티우스 { targetPos.id = 1202; targetPos.x = 30; targetPos.y = 120; break; } - case 10: // Ƽ + case 10: // 셉티무스 { targetPos.id = 1203; targetPos.x = 120; targetPos.y = 30; break; } - case 11: // Ƹ + case 11: // 쿠아르투스 { targetPos.id = 1204; targetPos.x = 30; diff --git a/src/server/gameserver/RelicUtil.cpp b/src/server/gameserver/RelicUtil.cpp index 094c4765..02ce7c1e 100644 --- a/src/server/gameserver/RelicUtil.cpp +++ b/src/server/gameserver/RelicUtil.cpp @@ -73,12 +73,12 @@ void sendBloodBibleEffect(Object* pObject, Effect::EffectClass EClass) } -// Ƽ𸣳 -// ̾ ( 37, 163 ) -// ̾ ( 193, 46 ) +// 티모르남동 +// 슬레이어 ( 37, 163 ) +// 뱀파이어 ( 193, 46 ) // -// ƴ <̾> ( 239, 134) -// ƴ <̾> ( 27, 133 ) +// 아담의 성지 동<뱀파이어> ( 239, 134) +// 아담의 성지 서<슬레이어> ( 27, 133 ) void sendHolyLandWarpEffect(Creature* pCreature) { @@ -97,8 +97,8 @@ void sendHolyLandWarpEffect(Creature* pCreature) if (pCreature->isSlayer()) { const int maxHolyLandWarpSlayer = 1; static ZONE_COORD HolyLandWarpSlayer[maxHolyLandWarpSlayer] = { - ZONE_COORD(53, 37, 163), // Ƽ - // ZONE_COORD( 73, 27, 133 ) // ƴ + ZONE_COORD(53, 37, 163), // 티모르 남동 + // ZONE_COORD( 73, 27, 133 ) // 아담의 성지 서쪽 }; for (int i = 0; i < maxHolyLandWarpSlayer; i++) { @@ -116,8 +116,8 @@ void sendHolyLandWarpEffect(Creature* pCreature) } else if (pCreature->isVampire()) { const int maxHolyLandWarpVampire = 1; static ZONE_COORD HolyLandWarpVampire[maxHolyLandWarpVampire] = { - ZONE_COORD(53, 193, 46), // Ƽ - // ZONE_COORD( 71, 239, 134 ) // ƴ + ZONE_COORD(53, 193, 46), // 티모르 남동 + // ZONE_COORD( 71, 239, 134 ) // 아담의 성지 동쪽 }; for (int i = 0; i < maxHolyLandWarpVampire; i++) { @@ -133,12 +133,12 @@ void sendHolyLandWarpEffect(Creature* pCreature) EClass = Effect::EFFECT_CLASS_WARP_HOLY_LAND_VAMPIRE; } else if (pCreature->isOusters()) { - // ~_~ - // ƿ콺 ƴ ., + // 음냐 언젠가 해줘야 함 ~_~ + // 아우스터즈는 아담의 성지 어디에 떨구지 ㅡ.,ㅡ const int maxHolyLandWarpOusters = 1; static ZONE_COORD HolyLandWarpOusters[maxHolyLandWarpOusters] = { - ZONE_COORD(53, 160, 170), // Ƽ - // ZONE_COORD( 72, 129, 112 ) // ƴ ߾ + ZONE_COORD(53, 160, 170), // 티모르 남동 + // ZONE_COORD( 72, 129, 112 ) // 아담의 성지 중앙 }; for (int i = 0; i < maxHolyLandWarpOusters; i++) { @@ -175,8 +175,8 @@ bool addEffectRelicPosition(Item* pItem, ZoneID_t zoneID, TPOINT pt) if (!pItem->isFlag(Effect::EFFECT_CLASS_RELIC_POSITION)) { EffectRelicPosition* pPosition = new EffectRelicPosition(pItem); - // pPosition->setNextTime(10); // 1 ޼ Ѹ. - pPosition->setTick(1 * 60 * 10); // 1и ѹ ˸. + // pPosition->setNextTime(10); // 1초 후 메세지 뿌린다. + pPosition->setTick(1 * 60 * 10); // 1분마다 한번씩 알린다. pPosition->setZoneID(zoneID); pPosition->setX(pt.x); pPosition->setY(pt.y); @@ -200,8 +200,8 @@ bool deleteEffectRelicPosition(Item* pItem) Assert(pItem != NULL); - // EffectRelicPosition Ѵ. - // 뿡 پִ Effect Ѵ. + // EffectRelicPosition 제거한다. + // 성물 보관대에 붙어있던 Effect를 제거한다. if (pItem->isFlag(Effect::EFFECT_CLASS_RELIC_POSITION)) { Effect* pPositionEffect = pItem->getEffectManager().findEffect(Effect::EFFECT_CLASS_RELIC_POSITION); Assert(pPositionEffect != NULL); @@ -218,7 +218,7 @@ bool deleteEffectRelicPosition(Item* pItem) __END_CATCH } -// Corpse pItem õ Effect ش. +// Corpse붙은 pItem과 관련된 Effect를 없애준다. bool deleteRelicEffect(Corpse* pCorpse, Item* pItem) { @@ -239,7 +239,7 @@ bool deleteRelicEffect(Corpse* pCorpse, Item* pItem) else if (pRelicInfo->relicType == RELIC_TYPE_VAMPIRE) EClass = Effect::EFFECT_CLASS_HAS_VAMPIRE_RELIC; else - throw Error("߸ Relic Item Type Դϴ."); + throw Error("잘못된 Relic Item Type 입니다."); } break; case Item::ITEM_CLASS_BLOOD_BIBLE: @@ -317,7 +317,7 @@ bool isRelicItem(Item::ItemClass IClass) { return false; } -// Zone ִ pCorpse pItem ִ. +// Zone에 있는 pCorpse가 pItem을 가지고 있다. bool addHasRelicEffect(Zone* pZone, Corpse* pCorpse, Item* pItem) { @@ -331,7 +331,7 @@ bool addHasRelicEffect(Zone* pZone, Corpse* pCorpse, Item* pItem) EffectHasRelic* pRelicEffect = NULL; - // ִٴ ǥ + // 성단이 성서를 가지고 있다는 표시 switch (pItem->getItemClass()) { case Item::ITEM_CLASS_BLOOD_BIBLE: { pRelicEffect = new EffectHasBloodBible(pCorpse); @@ -347,8 +347,8 @@ bool addHasRelicEffect(Zone* pZone, Corpse* pCorpse, Item* pItem) pRelicEffect->setZone(pZone); pRelicEffect->setXY(pCorpse->getX(), pCorpse->getY()); - // pRelicEffect->setNextTime( 1*10 ); // 1 - pRelicEffect->setTick(1 * 60 * 10); // 1и ޼ + // pRelicEffect->setNextTime( 1*10 ); // 1초 후 + pRelicEffect->setTick(1 * 60 * 10); // 1분마다 메세지 출력 pRelicEffect->setPart(pItem->getItemType()); pRelicEffect->affect(); @@ -357,7 +357,7 @@ bool addHasRelicEffect(Zone* pZone, Corpse* pCorpse, Item* pItem) pCorpse->setFlag(pRelicEffect->getEffectClass()); effectManager.addEffect(pRelicEffect); - // Ʈ ٿֶ Ѵ. + // 이펙트를 붙여주라고 한다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pCorpse->getObjectID()); gcAddEffect.setEffectID(pRelicEffect->getSendEffectClass()); @@ -389,7 +389,7 @@ bool deleteRelicEffect(Creature* pCreature, Item* pItem) else if (pRelicInfo->relicType == RELIC_TYPE_VAMPIRE) effectClass = Effect::EFFECT_CLASS_HAS_VAMPIRE_RELIC; else - throw Error("߸ Relic Item Type Դϴ."); + throw Error("잘못된 Relic Item Type 입니다."); } else if (pItem->getItemClass() == Item::ITEM_CLASS_BLOOD_BIBLE) { effectClass = Effect::EFFECT_CLASS_HAS_BLOOD_BIBLE; } else if (pItem->getItemClass() == Item::ITEM_CLASS_CASTLE_SYMBOL) { @@ -400,7 +400,7 @@ bool deleteRelicEffect(Creature* pCreature, Item* pItem) return false; } - // has relic Ʈ ãƼ Ʈ ش. + // has relic 이펙트를 찾아서 이펙트를 지워준다. Effect* pEffect = pCreature->findEffect(effectClass); if (pEffect != NULL) { pCreature->removeFlag(effectClass); @@ -423,7 +423,7 @@ bool addRelicEffect(Creature* pCreature, Item* pItem) Assert(pCreature != NULL); Assert(pItem != NULL); - // ٴ Ʈ δ. + // 성물을 가졌다는 이펙트를 붙인다. Effect::EffectClass effectClass; Effect::EffectClass effectClassSend; @@ -436,15 +436,15 @@ bool addRelicEffect(Creature* pCreature, Item* pItem) if (pRelicInfo->relicType == RELIC_TYPE_SLAYER) { effectClassSend = effectClass = Effect::EFFECT_CLASS_HAS_SLAYER_RELIC; EffectHasRelic* pEffect = new EffectHasSlayerRelic(pCreature); - // pEffect->setNextTime( 1*10 ); // 10 - pEffect->setTick(1 * 60 * 10); // 1и ޼ + // pEffect->setNextTime( 1*10 ); // 10초 후 + pEffect->setTick(1 * 60 * 10); // 1분마다 메세지 출력 pCreature->addEffect(pEffect); pEffect->affect(); } else { effectClassSend = effectClass = Effect::EFFECT_CLASS_HAS_VAMPIRE_RELIC; EffectHasRelic* pEffect = new EffectHasVampireRelic(pCreature); - // pEffect->setNextTime( 1*10 ); // 10 - pEffect->setTick(1 * 60 * 10); // 1и ޼ + // pEffect->setNextTime( 1*10 ); // 10초 후 + pEffect->setTick(1 * 60 * 10); // 1분마다 메세지 출력 pCreature->addEffect(pEffect); pEffect->affect(); } @@ -452,8 +452,8 @@ bool addRelicEffect(Creature* pCreature, Item* pItem) effectClass = Effect::EFFECT_CLASS_HAS_BLOOD_BIBLE; effectClassSend = (Effect::EffectClass)((int)Effect::EFFECT_CLASS_HAS_BLOOD_BIBLE + itemtype); EffectHasRelic* pEffect = new EffectHasBloodBible(pCreature); - // pEffect->setNextTime( 1*10 ); // 10 - pEffect->setTick(1 * 60 * 10); // 1и ޼ + // pEffect->setNextTime( 1*10 ); // 10초 후 + pEffect->setTick(1 * 60 * 10); // 1분마다 메세지 출력 pEffect->setPart(itemtype); pCreature->addEffect(pEffect); pEffect->affect(); @@ -461,8 +461,8 @@ bool addRelicEffect(Creature* pCreature, Item* pItem) effectClass = Effect::EFFECT_CLASS_HAS_CASTLE_SYMBOL; effectClassSend = (Effect::EffectClass)((int)Effect::EFFECT_CLASS_HAS_CASTLE_SYMBOL + itemtype); EffectHasRelic* pEffect = new EffectHasCastleSymbol(pCreature); - // pEffect->setNextTime( 1*10 ); // 10 - pEffect->setTick(1 * 60 * 10); // 1и ޼ + // pEffect->setNextTime( 1*10 ); // 10초 후 + pEffect->setTick(1 * 60 * 10); // 1분마다 메세지 출력 pEffect->setPart(itemtype); pCreature->addEffect(pEffect); pEffect->affect(); @@ -483,7 +483,7 @@ bool addRelicEffect(Creature* pCreature, Item* pItem) pCreature->setFlag(effectClass); - // Effectٿٰ ˷ش. + // Effect붙였다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pCreature->getObjectID()); gcAddEffect.setEffectID(effectClassSend); @@ -502,27 +502,27 @@ bool dropRelicToZone(PlayerCreature* pPC, Item* pItem) Zone* pZone = pPC->getZone(); Assert(pZone != NULL); - // ϴ ٴڿ ߸. - // ü ĥ Ƿ.. ijͰ ߸. + // 일단 아이템을 바닥에 떨어뜨린다. + // 시체와 겹칠 수도 있으므로.. 캐릭터가 없는 곳에 떨어뜨린다. TPOINT pt = pZone->addItem(pItem, pPC->getX(), pPC->getY(), false); - if (pt.x != -1) // ߸µ ߴٸ + if (pt.x != -1) // 떨어뜨리는데 성공했다면 { char pField[80]; sprintf(pField, "OwnerID='', Storage=%d, StorageID=%u, X=%d, Y=%d", STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y); pItem->tinysave(pField); - // κ丮 . + // 인벤토리에서 뺀다. // pInventory->deleteItem( pItem->getObjectID() ); deleteRelicEffect(pPC, pItem); - // Relic ƴƴ ˷ֵ Ѵ. + // Relic이 떨어진 곳의 정보를 틈틈히 알려주도록 한다. /* if (!pItem->isFlag( Effect::EFFECT_CLASS_RELIC_POSITION)) { EffectRelicPosition* pPosition = new EffectRelicPosition(pItem); - //pPosition->setNextTime(10); // 1 ޼ Ѹ. - pPosition->setTick( 1*60*10 ); // 1и ѹ ˸. + //pPosition->setNextTime(10); // 1초 후 메세지 뿌린다. + pPosition->setTick( 1*60*10 ); // 1분마다 한번씩 알린다. pPosition->setZoneID( pZone->getZoneID() ); pPosition->setX( pt.x ); pPosition->setY( pt.y ); @@ -533,14 +533,14 @@ bool dropRelicToZone(PlayerCreature* pPC, Item* pItem) }*/ - // ü ڿ Relic ٴ ޽ . + // 전체 사용자에게 Relic 이 떨어졌다는 메시지를 보낸다. /* ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo( pZone->getZoneID() ); Assert( pZoneInfo != NULL ); StringStream msg; - msg << pRelicInfo->getName() << " " << pZoneInfo->getFullName() << " ( " << pt.x << " , " << pt.y << " ) - ϴ."; + msg << pRelicInfo->getName() << " 성물이 " << pZoneInfo->getFullName() << " ( " << pt.x << " , " << pt.y << " ) + 에 떨어졌습니다."; GCSystemMessage message; message.setMessage( msg.toString() ); @@ -548,12 +548,12 @@ bool dropRelicToZone(PlayerCreature* pPC, Item* pItem) */ if (!pItem->isFlag(Effect::EFFECT_CLASS_RELIC_LOCK)) { EffectRelicLock* pLock = new EffectRelicLock(pItem); - pLock->setDeadline(10 * 10); // 10 + pLock->setDeadline(10 * 10); // 10초 pItem->setFlag(Effect::EFFECT_CLASS_RELIC_LOCK); pItem->getEffectManager().addEffect(pLock); } } else { - throw Error("Logoutϴµ ߸ ڸ "); + throw Error("Logout하는데 성물 떨어뜨릴 자리가 없다"); // return false; } @@ -569,7 +569,7 @@ bool dropRelicToZone(Creature* pCreature, bool bSendPacket) bool bDrop = false; /////////////////////////////////////////////////////////////////// - // DragonEye ִٸ ġ ~ + // 죽을 때 DragonEye 를 가지고 있다면 원래 위치로 빽~ /////////////////////////////////////////////////////////////////// if (pCreature->isFlag(Effect::EFFECT_CLASS_DRAGON_EYE)) { g_pDragonEyeManager->warpToDefaultPosition(pCreature); @@ -584,22 +584,22 @@ bool dropRelicToZone(Creature* pCreature, bool bSendPacket) } /////////////////////////////////////////////////////////////////// - // Relic Item ִٸ ٴڿ ߸. + // 죽을 때 Relic Item을 가지고 있다면 바닥에 떨어뜨린다. /////////////////////////////////////////////////////////////////// if (pCreature->hasRelicItem()) { PlayerCreature* pPC = dynamic_cast(pCreature); Assert(pPC != NULL); - // mouse relic ִ üũ + // mouse에 relic이 있는지 체크 Item* pSlotItem = pPC->getExtraInventorySlotItem(); if (pSlotItem != NULL && isRelicItem(pSlotItem)) { if (dropRelicToZone(pPC, pSlotItem)) { pPC->deleteItemFromExtraInventorySlot(); - // player mouse Ѵ. - // client Ŷ - // mouse üũְ ߴ. + // player의 mouse에서 제거한다. + // client에서 이 패킷을 받으면 + // mouse에서도 함 체크해주게 했다. if (bSendPacket) { GCDeleteInventoryItem gcDeleteInventoryItem; @@ -621,17 +621,17 @@ bool dropRelicToZone(Creature* pCreature, bool bSendPacket) ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(pZone->getZoneID()); Assert(pZoneInfo != NULL); - // κ丮 Relic Item ãƺ. + // 인벤토리에서 Relic Item을 찾아본다. for (CoordInven_t y = 0; y < pInventory->getHeight(); y++) { for (CoordInven_t x = 0; x < pInventory->getWidth(); x++) { Item* pItem = pInventory->getItem(x, y); if (pItem != NULL && isRelicItem(pItem)) { - // ϴ ٴڿ ߸. + // 일단 아이템을 바닥에 떨어뜨린다. if (dropRelicToZone(pPC, pItem)) { - // κ丮 . + // 인벤토리에서 뺀다. pInventory->deleteItem(pItem->getObjectID()); - // player inventory Ѵ. + // player의 inventory에서 제거한다. if (bSendPacket) { GCDeleteInventoryItem gcDeleteInventoryItem; gcDeleteInventoryItem.setObjectID(pItem->getObjectID()); @@ -652,7 +652,7 @@ bool dropRelicToZone(Creature* pCreature, bool bSendPacket) } -// ü RelicItem ° ó +// 시체에서 RelicItem이 나오는것 처리 bool dissectionRelicItem(Corpse* pCorpse, Item* pItem, const TPOINT& pt) { @@ -668,7 +668,7 @@ bool dissectionRelicItem(Corpse* pCorpse, Item* pItem, const TPOINT& pt) // //---------------------------------------------------------------------- case Item::ITEM_CLASS_RELIC: { - // ϳ ʾҴٸ( ̾ٸ, EffectRelic ش) + // 만약 아이템이 하나도 남지 않았다면(마지막 아이템이었다면, EffectRelic을 삭제해 준다) try { int relicIndex = pItem->getItemType(); const RelicInfo* pRelicInfo = @@ -682,16 +682,16 @@ bool dissectionRelicItem(Corpse* pCorpse, Item* pItem, const TPOINT& pt) sprintf(msg, g_pStringPool->c_str(STRID_RELIC_FROM_RELIC_TABLE), pRelicInfo->getName().c_str()); // StringStream msg; - // msg << " 뿡 " - // << "(" << pRelicInfo->getName() << ") Խϴ."; + // msg << "성물 보관대에서 " + // << "성물(" << pRelicInfo->getName() << ")이 나왔습니다."; GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(msg); g_pZoneGroupManager->broadcast(&gcSystemMessage); - // relic 뿡 Ա - // ʽ/гƼ ٽ ش. + // relic이 성물보관대에서 빠져나왔기 때문에 + // 보너스/패널티를 다시 조정해준다. g_pCombatInfoManager->computeModify(); } catch (Throwable& t) { cout << t.toString().c_str() << endl; @@ -712,7 +712,7 @@ bool dissectionRelicItem(Corpse* pCorpse, Item* pItem, const TPOINT& pt) dynamic_cast(g_pBloodBibleInfoManager->getItemInfo(pItem->getItemType())); // StringStream msg; - // msg << " (" << pBloodBibleInfo->getName() << ") Խϴ."; + // msg << "피의 성서 조각(" << pBloodBibleInfo->getName() << ")이 나왔습니다."; char msg[200]; sprintf(msg, g_pStringPool->c_str(STRID_BLOOD_BIBLE_FROM_SHRINE), pBloodBibleInfo->getName().c_str()); @@ -722,11 +722,11 @@ bool dissectionRelicItem(Corpse* pCorpse, Item* pItem, const TPOINT& pt) // g_pZoneGroupManager->broadcast( &gcSystemMessage ); g_pHolyLandManager->broadcast(&gcSystemMessage); - // ġ + // 성서 조각 아이템 위치 변경 if (!pItem->isFlag(Effect::EFFECT_CLASS_RELIC_POSITION)) { EffectRelicPosition* pPosition = new EffectRelicPosition(pItem); - // pPosition->setNextTime(10); // 1 ޼ Ѹ. - pPosition->setTick(1 * 60 * 10); // 1и ѹ ˸. + // pPosition->setNextTime(10); // 1초 후 메세지 뿌린다. + pPosition->setTick(1 * 60 * 10); // 1분마다 한번씩 알린다. pPosition->setZoneID(pCorpse->getZone()->getZoneID()); pPosition->setX(pt.x); pPosition->setY(pt.y); @@ -751,7 +751,7 @@ bool dissectionRelicItem(Corpse* pCorpse, Item* pItem, const TPOINT& pt) if (pCastleSymbolInfo != NULL) { // StringStream msg; - // msg << " ¡(" << pCastleSymbolInfo->getName() << ") Խϴ."; + // msg << "성 상징물(" << pCastleSymbolInfo->getName() << ")이 나왔습니다."; char msg[200]; sprintf(msg, g_pStringPool->c_str(STRID_CASTLE_SYMBOL_FROM_SHRINE), pCastleSymbolInfo->getName().c_str()); @@ -761,11 +761,11 @@ bool dissectionRelicItem(Corpse* pCorpse, Item* pItem, const TPOINT& pt) g_pCastleInfoManager->broadcastShrinePacket(pItem->getItemType(), &gcSystemMessage); - // ġ + // 성서 조각 아이템 위치 변경 if (!pItem->isFlag(Effect::EFFECT_CLASS_RELIC_POSITION)) { EffectRelicPosition* pPosition = new EffectRelicPosition(pItem); - // pPosition->setNextTime(10); // 1 ޼ Ѹ. - pPosition->setTick(1 * 60 * 10); // 1и ѹ ˸. + // pPosition->setNextTime(10); // 1초 후 메세지 뿌린다. + pPosition->setTick(1 * 60 * 10); // 1분마다 한번씩 알린다. pPosition->setZoneID(pCorpse->getZone()->getZoneID()); pPosition->setX(pt.x); pPosition->setY(pt.y); @@ -788,8 +788,8 @@ bool dissectionRelicItem(Corpse* pCorpse, Item* pItem, const TPOINT& pt) __END_CATCH } -// Relic pCorpse 򰡷 warpǾٰ Ҷ -// pCorpse Effect ٿش. +// Relic이 pCorpse에서 어딘가로 warp되었다고 할때 +// pCorpse에 Effect를 붙여준다. void sendRelicWarpEffect(Corpse* pCorpse) { diff --git a/src/server/gameserver/RelicUtil.h b/src/server/gameserver/RelicUtil.h index 761f7a36..560e0c8b 100644 --- a/src/server/gameserver/RelicUtil.h +++ b/src/server/gameserver/RelicUtil.h @@ -25,7 +25,7 @@ bool deleteRelicEffect(Corpse* pCorpse, Item* pItem); bool deleteRelicEffect(Creature* pCreature, Item* pItem); ////////////////////////////////////////////////////////////////////////////// -// relic zone ߸ +// relic을 zone에 떨어뜨리는 경우 ////////////////////////////////////////////////////////////////////////////// bool dropRelicToZone(PlayerCreature* pPC, Item* pItem); bool dropRelicToZone(Creature* pCreature, bool bSendPacket = true); diff --git a/src/server/gameserver/ResurrectLocationManager.h b/src/server/gameserver/ResurrectLocationManager.h index 30ba8922..d5ce50fa 100644 --- a/src/server/gameserver/ResurrectLocationManager.h +++ b/src/server/gameserver/ResurrectLocationManager.h @@ -2,8 +2,8 @@ // Filename : ResurrectLocationManager.h // Written by : excel96 // Description : -// ÷̾ ׾ ٽ ¾ Ȱ ġ ϰ -// ִ ̴. +// 플레이어가 죽었을 때 다시 태어나는 부활 위치를 존 별로 저장하고 +// 있는 맵이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __RESURRECTMANAGER_H__ @@ -17,11 +17,11 @@ ////////////////////////////////////////////////////////////////////////////// // class ResurrectLocationManager // -// ÷̾ ׾ ٽ ¾ Ȱ ġ ϰ -// ִ ̴. +// 플레이어가 죽었을 때 다시 태어나는 부활 위치를 존 별로 저장하고 +// 있는 맵이다. // -// ̾ ̾ ⺻ Ȱ ġ ִ -// Լ ־ Ѵ. Resurrect.cpp ҽ  ִ. +// 슬레이어 및 뱀파이어 각각 기본 부활 위치를 지정할 수 있는 +// 함수가 있어야 한다. 현재는 Resurrect.cpp에 소스 레벨로 들어가 있다. ////////////////////////////////////////////////////////////////////////////// class PlayerCreature; diff --git a/src/server/gameserver/SMSServiceThread.cpp b/src/server/gameserver/SMSServiceThread.cpp index 19dc0e53..e723a543 100644 --- a/src/server/gameserver/SMSServiceThread.cpp +++ b/src/server/gameserver/SMSServiceThread.cpp @@ -155,12 +155,12 @@ void SMSServiceThread::run() { if (dummyQueryTime < currentTime) { g_pDatabaseManager->executeDummyQuery(m_pConnection); - // 1ð ~ 1ð 30 ̿ dummy query ð Ѵ. - // timeout ʰ ϱ ؼ̴. + // 1시간 ~ 1시간 30분 사이에서 dummy query 시간을 설정한다. + // timeout이 되지 않게 하기 위해서이다. dummyQueryTime.tv_sec += (60 + rand() % 30) * 60; } - sleep(1); // 1ʿ ѹ ť üũѴ. + sleep(1); // 1초에 한번씩 큐를 체크한다. } __END_CATCH diff --git a/src/server/gameserver/ScriptManager.cpp b/src/server/gameserver/ScriptManager.cpp index b871adca..2697dce1 100644 --- a/src/server/gameserver/ScriptManager.cpp +++ b/src/server/gameserver/ScriptManager.cpp @@ -50,7 +50,7 @@ void ScriptManager::load(const string& ownerID) string msg; //////////////////////////////////////////////////////////// - // subject ĽѴ. + // subject를 파싱한다. //////////////////////////////////////////////////////////// start = 0; end = 0; @@ -75,7 +75,7 @@ void ScriptManager::load(const string& ownerID) } //////////////////////////////////////////////////////////// - // content ĽѴ. + // content를 파싱한다. //////////////////////////////////////////////////////////// start = 0; end = 0; diff --git a/src/server/gameserver/ScriptManager.h b/src/server/gameserver/ScriptManager.h index 4f08c979..3e66aaca 100644 --- a/src/server/gameserver/ScriptManager.h +++ b/src/server/gameserver/ScriptManager.h @@ -16,8 +16,8 @@ ////////////////////////////////////////////////////////////////////////////// // class ScriptManager // -// NPC ϴ public script Ǵ Ư NPC ϴ private script db -// Ÿ script manager ̴. +// 모든 NPC들이 공유하는 public script 또는 특정 NPC 만이 사용하는 private script db +// 를 나타내는 script manager 이다. ////////////////////////////////////////////////////////////////////////////// class XMLTree; @@ -35,7 +35,7 @@ class ScriptManager { string toString() const; - // . + // 갖다 쓰지 마세요. XMLTree* getXML(const string& owner) { return m_XMLS[owner]; } diff --git a/src/server/gameserver/ServiceDeadline.h b/src/server/gameserver/ServiceDeadline.h index 48b4c182..0e57d1fa 100644 --- a/src/server/gameserver/ServiceDeadline.h +++ b/src/server/gameserver/ServiceDeadline.h @@ -6,7 +6,7 @@ #ifdef __ACTIVE_SERVICE_DEADLINE__ const int DEADLINE_YEAR = 2003; -const int DEADLINE_MONTH = 4 - 1; // 1 Ѵ. +const int DEADLINE_MONTH = 4 - 1; // 1 빼줘야한다. #endif diff --git a/src/server/gameserver/SharedServerClient.h b/src/server/gameserver/SharedServerClient.h index 6c05801f..b181486f 100644 --- a/src/server/gameserver/SharedServerClient.h +++ b/src/server/gameserver/SharedServerClient.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : SharedServerClient.h // Written by : reiot@ewestsoft.com -// Description : ÷̾ Ŭ +// Description : 게임 서버용 플레이어 클래스 ////////////////////////////////////////////////////////////////////////////// #ifndef __SHARED_SERVER_CLIENT_H @@ -16,13 +16,13 @@ ////////////////////////////////////////////////////////////////////////////// // class SharedServerClient // -// Ŭ̾Ʈ ÷̾ +// 게임 서버용 쉐어드 서버 클라이언트 플레이어 // ////////////////////////////////////////////////////////////////////////////// class SharedServerClient : public Player { public: - // Ŷ + // 저장해 놓을 이전 패킷의 개수 const static BYTE nPacketHistorySize = 10; public: diff --git a/src/server/gameserver/SharedServerManager.h b/src/server/gameserver/SharedServerManager.h index ca0ba82a..dcae361b 100644 --- a/src/server/gameserver/SharedServerManager.h +++ b/src/server/gameserver/SharedServerManager.h @@ -19,8 +19,8 @@ class SharedServerClient; ////////////////////////////////////////////////////////////////////////////// // class SharedServerManager; // -// ϴ ̴. -// ٽ ؾ ȴ. ~~ +// 쉐어드 서버와의 통신을 전담하는 쓰레드이다. +// 연결 끊기면 다시 연결해야 된다. 될 때까지~~ ////////////////////////////////////////////////////////////////////////////// class SharedServerManager : public Thread { diff --git a/src/server/gameserver/ShopRack.cpp b/src/server/gameserver/ShopRack.cpp index 44fa0a06..ef399c5a 100644 --- a/src/server/gameserver/ShopRack.cpp +++ b/src/server/gameserver/ShopRack.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////// // Filename : ShopRack.cpp -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////// @@ -13,11 +13,11 @@ ////////////////////////////////////////////////////////////////////// ShopRack::ShopRack() : ItemRack(SHOP_RACK_INDEX_MAX) { - // ʱȭ - // 0 ʱȭϸ Ŭ̾Ʈ 0 ʱȭ , - // Ŭ̾Ʈ ǰ 쿡, - // Ƽ ǰ 䱸 ִ. - // ׷Ƿ ̸ ϱ ؼ 100 ʱȭش. + // 버전 초기화 + // 버전을 0으로 초기화하면 클라이언트도 0으로 초기화할 경우, + // 클라이언트가 실제로 상점의 상품 목록을 가지고 있지 않은 경우에도, + // 상점 버전이 같아서 상품 목록을 요구하지 않을 수가 있다. + // 그러므로 이를 방지하기 위해서 걍 100으로 초기화해준다. m_Version = 100; } diff --git a/src/server/gameserver/ShopTemplate.h b/src/server/gameserver/ShopTemplate.h index c6a632c2..476a36b8 100644 --- a/src/server/gameserver/ShopTemplate.h +++ b/src/server/gameserver/ShopTemplate.h @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : ShopTemplate.h -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -14,10 +14,10 @@ ////////////////////////////////////////////////////////////////////////////// // class ShopTemplate -// ڵ ϱ ؼ DB -// Ʋ оµ, Ʋ ĸȭ Ŭ̴. -// ü Ŭ̸ ü Ư ϴ -// , ׳ ͸ ӽ ϴ Ҹ Ѵ. +// 상점에서 아이템을 자동으로 생성하기 위해서 DB에서 일정한 +// 형식의 틀을 읽어오는데, 그 틀을 캡슐화한 클래스이다. +// 거의 구조체와 비슷한 클래스이며 자체적으로 특별히 하는 일은 +// 없고, 그냥 데이터를 임시적으로 저장하는 역할만을 한다. ////////////////////////////////////////////////////////////////////////////// class ShopTemplate { @@ -94,8 +94,8 @@ class ShopTemplate { ////////////////////////////////////////////////////////////////////////////// // class ShopTemplateManager -// ShopTemplate Ŭ ؽ ִ Ŭ̴. -// id ָ ׿ شϴ ShopTemplate ǵִ Ѵ. +// ShopTemplate 클래스의 해쉬맵을 가지고 있는 클래스이다. +// id를 주면 그에 해당하는 ShopTemplate을 되돌려주는 역할을 한다. ////////////////////////////////////////////////////////////////////////////// class ShopTemplateManager { diff --git a/src/server/gameserver/ShrineInfoManager.cpp b/src/server/gameserver/ShrineInfoManager.cpp index ffdc91b8..fb1b0765 100644 --- a/src/server/gameserver/ShrineInfoManager.cpp +++ b/src/server/gameserver/ShrineInfoManager.cpp @@ -280,9 +280,9 @@ void ShrineInfoManager::load() OustersGuardShrine.setShrineType(ShrineInfo::SHRINE_GUARD); HolyShrine.setShrineType(ShrineInfo::SHRINE_HOLY); - // ItemType Shrine ID ƾ Ѵ. DB ε ´. + // ItemType과 Shrine ID는 같아야 한다. 같지 않을 경우 DB설정 오류로 로딩과정에서 막는다. if (pShrineSet->getBloodBibleItemType() != pShrineSet->getShrineID()) { - cout << "ShrineID ItemType ʽϴ. DB ϼ." << endl; + cout << "ShrineID 와 ItemType이 맞지 않습니다. DB설정을 점검하세요." << endl; Assert(false); } @@ -296,7 +296,7 @@ void ShrineInfoManager::load() __END_CATCH } -// ̰Ŵ ClientManager thread Ҹ. θ ȵȴ~~ +// 이거는 ClientManager thread에서 불린다. 딴데서 부르면 안된다~~ void ShrineInfoManager::reloadOwner() { @@ -373,11 +373,11 @@ void ShrineInfoManager::addShrineToZone(ShrineInfo& shrineInfo, ItemType_t itemT { __BEGIN_TRY - // Holy Shrine ߰ ʴ´. + // Holy Shrine 은 존에 추가하지 않는다. if (shrineInfo.getShrineType() == ShrineInfo::SHRINE_HOLY) return; - // ´. + // 성단을 넣을 존을 가져온다. Zone* pZone = getZoneByZoneID(shrineInfo.getZoneID()); Assert(pZone != NULL); @@ -420,7 +420,7 @@ void ShrineInfoManager::addShrineToZone(ShrineInfo& shrineInfo, ItemType_t itemT Assert(tp.x != -1); if (shrineInfo.getShrineType() == ShrineInfo::SHRINE_GUARD) { - // ȣܿ Shield Effect δ + // 모든 수호성단에 Shield Effect 붙인다 pShrine->setFlag(Effect::EFFECT_CLASS_SHRINE_SHIELD); EffectShrineShield* pEffect = new EffectShrineShield(pShrine); @@ -432,7 +432,7 @@ void ShrineInfoManager::addShrineToZone(ShrineInfo& shrineInfo, ItemType_t itemT forbidDarkness(pZone, tp.x, tp.y, 2); - // ǥ Ѵ. + // 성단 좌표를 새로 세팅한다. shrineInfo.setX(tp.x); shrineInfo.setY(tp.y); @@ -506,12 +506,12 @@ bool ShrineInfoManager::isMatchGuardShrine(Item* pItem, MonsterCorpse* pMonsterC ShrineSet* pShrineSet = getShrineSet(shrineID); if (pShrineSet == NULL) { - // شϴ Shrine Set . + // 이 피의 성서에 해당하는 Shrine Set이 없다. return false; } - // شϴ Shrine set MonsterType - // Ѿ MonsterCorpse MonsterType true + // 이 피의 성서에 해당하는 Shrine set의 성지성단의 MonsterType이 + // 넘어온 MonsterCorpse의 MonsterType과 같으면 true if (pPC->isSlayer()) { return pShrineSet->getSlayerGuardShrine().getMonsterType() == pMonsterCorpse->getMonsterType(); } else if (pPC->isVampire()) { @@ -540,12 +540,12 @@ bool ShrineInfoManager::isMatchHolyShrine(Item* pItem, MonsterCorpse* pMonsterCo ShrineSet* pShrineSet = getShrineSet(shrineID); if (pShrineSet == NULL) { - // شϴ Shrine Set . + // 이 피의 성서에 해당하는 Shrine Set이 없다. return false; } - // شϴ Shrine set MonsterType - // Ѿ MonsterCorpse MonsterType true + // 이 피의 성서에 해당하는 Shrine set의 성지성단의 MonsterType이 + // 넘어온 MonsterCorpse의 MonsterType과 같으면 true return pShrineSet->getHolyShrine().getMonsterType() == pMonsterCorpse->getMonsterType(); __END_CATCH @@ -559,7 +559,7 @@ bool ShrineInfoManager::isDefenderOfGuardShrine(PlayerCreature* pPC, MonsterCorp Zone* pZone = pShrine->getZone(); Assert(pZone != NULL); - // ƴϸ ~ + // 성이 아니면 삑~ if (!pZone->isCastle()) { return false; } @@ -570,7 +570,7 @@ bool ShrineInfoManager::isDefenderOfGuardShrine(PlayerCreature* pPC, MonsterCorp if (pCastleInfo == NULL) return false; - // ߿ ̸ defender ̴. + // 종족 전쟁 중에는 성의 소유 종족과 같은 종족이면 defender 이다. if (pPC->getRace() == pCastleInfo->getRace()) return true; @@ -579,16 +579,16 @@ bool ShrineInfoManager::isDefenderOfGuardShrine(PlayerCreature* pPC, MonsterCorp __END_CATCH } -// ִ°? +// 이 종족이 성서 조각을 들 수 있는가? bool ShrineInfoManager::canPickupBloodBible(Race_t race, BloodBible* pBloodBible) const { __BEGIN_TRY - // £ ȴ. + // 피의 성서는 종족간 전쟁에만 사용된다. return true; - /* // ϴ £ ҼӵǾ ִ ˾ƿ´. + /* // 일단 이 성서 조각이 어느 전쟁에 소속되어 있는지 알아온다. ShrineSet* pShrineSet = getShrineSet( pBloodBible->getItemType() ); if ( pShrineSet == NULL ) @@ -602,14 +602,14 @@ bool ShrineInfoManager::canPickupBloodBible(Race_t race, BloodBible* pBloodBible if ( pWar == NULL ) { - // ƽ 縮~ - filelog( "WarError.log", "ﵵ ϴµ ֿ Ѵ. ItemType: %u", + // 아싸 삑사리다~ + filelog( "WarError.log", "전쟁도 안하는데 성서조각을 주울려고 한다. ItemType: %u", (int)pBloodBible->getItemType() ); return false; } if ( pWar->getWarType() == WAR_RACE ) { - // ̸ ޴´. + // 종족 전쟁이면 지나개나 다 줏는다. return true; } else if ( pWar->getWarType() == WAR_GUILD ) @@ -618,16 +618,16 @@ bool ShrineInfoManager::canPickupBloodBible(Race_t race, BloodBible* pBloodBible if ( pCastleInfo == NULL ) { - // ƽ 縮~ - filelog( "WarError.log", " ƴϴ. ItemType: %u, ZoneID : %u", (int)pBloodBible->getItemType(), + // 아싸 삑사리다~ + filelog( "WarError.log", "성이 아니다. ItemType: %u, ZoneID : %u", (int)pBloodBible->getItemType(), (int)castleZoneID ); return false; } return ( race == pCastleInfo->getRace() ); } - // ƽ 縮~ - filelog( "WarError.log", "̻ ̴. WarType : %u", (int)pWar->getWarType() ); + // 아싸 삑사리다~ + filelog( "WarError.log", "이상한 전쟁이다. WarType : %u", (int)pWar->getWarType() ); return false; */ @@ -648,7 +648,7 @@ bool ShrineInfoManager::getMatchGuardShrinePosition(Item* pItem, ZoneItemPositio ShrineSet* pShrineSet = getShrineSet(shrineID); if (pShrineSet == NULL) { - // شϴ Shrine Set . + // 이 피의 성서에 해당하는 Shrine Set이 없다. return false; } @@ -663,17 +663,17 @@ bool ShrineInfoManager::getMatchGuardShrinePosition(Item* pItem, ZoneItemPositio __END_CATCH } -// putBloodBible ( ܿ ) ҷ bLock = false -// returnAllBloodBible ( ð Ǿ ) ҷ bLock = true -// true ٸ (WarSystem ư ) ҷǷ ο ɾ ϰ -// false ִ ׷콺忡 ưǷ ο ɾ ʾƾ Ѵ. +// putBloodBible ( 누군가 성지성단에 성서를 놓았을때 ) 이 불려지면 bLock = false +// returnAllBloodBible ( 시간이 다 되었을 때 ) 이 불려지면 bLock = true +// true일 경우 다른 스레드 (WarSystem이 돌아가는 스레드)에서 불려지므로 내부에서 락을 걸어줘야 하고 +// false일 경우 성지성단이 있는 존과 같은 존그룹스레드에서 돌아가므로 내부에서 락을 걸어주지 않아야 한다. // 2003. 2. 5. by Sequoia bool ShrineInfoManager::returnBloodBible(ShrineID_t shrineID, bool bLock) const { __BEGIN_TRY - // shrineID õ BloodBible DB ̿ؼ ã´. + // shrineID와 관련된 BloodBible을 DB정보를 이용해서 찾는다. ShrineSet* pShrineSet = getShrineSet(shrineID); if (pShrineSet == NULL) @@ -707,7 +707,7 @@ bool ShrineInfoManager::returnBloodBible(ShrineID_t shrineID, bool bLock) const __END_CATCH } -// WarSystem θ. +// WarSystem에서만 부른다. /*bool ShrineInfoManager::returnCastleBloodBible( ZoneID_t castleZoneID ) const { @@ -722,7 +722,7 @@ bool ShrineInfoManager::returnBloodBible(ShrineID_t shrineID, bool bLock) const HashMapShrineSetConstItor itr = m_ShrineSets.begin(); - // castleZoneID shrineID ˻Ҽ  ϳϳ Ѵ. -_-; + // castleZoneID의 shrineID를 검색할수가 없어서 하나하나 비교한다. -_-; for (; itr!=m_ShrineSets.end(); itr++) { ShrineSet* pShrineSet = itr->second; @@ -740,7 +740,7 @@ bool ShrineInfoManager::returnBloodBible(ShrineID_t shrineID, bool bLock) const __END_CATCH } */ -// WarSystem θ. +// WarSystem에서만 부른다. bool ShrineInfoManager::returnAllBloodBible() const { @@ -750,7 +750,7 @@ bool ShrineInfoManager::returnAllBloodBible() const HashMapShrineSetConstItor itr = m_ShrineSets.begin(); - // castleZoneID shrineID ˻Ҽ  ϳϳ Ѵ. -_-; + // castleZoneID의 shrineID를 검색할수가 없어서 하나하나 비교한다. -_-; for (; itr != m_ShrineSets.end(); itr++) { ShrineSet* pShrineSet = itr->second; @@ -771,7 +771,7 @@ bool ShrineInfoManager::returnBloodBible(Zone* pZone, BloodBible* pBloodBible) c Assert(pZone != NULL); Assert(pBloodBible != NULL); - // TargetZone, Shrine ã´. + // TargetZone, Shrine을 찾는다. ShrineID_t shrineID = pBloodBible->getItemType(); ShrineSet* pShrineSet = getShrineSet(shrineID); @@ -789,10 +789,10 @@ bool ShrineInfoManager::returnBloodBible(Zone* pZone, BloodBible* pBloodBible) c /* StringStream msg; - msg << " (" << GuardShrine.getName() - << ") " << (pShrineSet->getOwnerRace()==RACE_SLAYER? "̾":"̾") - << " ȣ(" << GuardShrine.getName() - << ") ưϴ."; + msg << "피의 성서 조각(" << GuardShrine.getName() + << ")이 " << (pShrineSet->getOwnerRace()==RACE_SLAYER? "슬레이어":"뱀파이어") + << "의 수호성단(" << GuardShrine.getName() + << ")으로 돌아갔습니다."; */ char msg[300]; @@ -831,13 +831,13 @@ bool ShrineInfoManager::putBloodBible(PlayerCreature* pPC, Item* pItem, MonsterC ShrineID_t shrineID = pItem->getItemType(); - filelog("WarLog.txt", "%s [%u] [%s] ־ϴ.", pPC->getName().c_str(), (uint)shrineID, + filelog("WarLog.txt", "%s 님이 피의 성서[%u]를 성지 성단[%s]에 넣었습니다.", pPC->getName().c_str(), (uint)shrineID, pCorpse->getName().c_str()); - //  κ Ƽ ư Ÿ Ʈ ٿش. + // 성서가 들어간 성단으로부터 피의 성서가 날아서 돌아감을 나타내는 이펙트를 붙여준다. // sendBloodBibleEffect( pCorpse, Effect::EFFECT_CLASS_SHRINE_HOLY_WARP ); - // PCԼ Ѿ ȿ ִ´. + // PC에게서 성서를 빼앗아 성단 안에 넣는다. Assert(pItem->getObjectID() == pPC->getExtraInventorySlotItem()->getObjectID()); pPC->deleteItemFromExtraInventorySlot(); @@ -856,20 +856,20 @@ bool ShrineInfoManager::putBloodBible(PlayerCreature* pPC, Item* pItem, MonsterC // ZoneID_t castleZoneID = pShrineSet->getReturnGuardShrine().getZoneID(); - // ˸ ܿ ٲ ȣ ư + // 알맞은 성단에 넣으면 주인이 바뀐 뒤 수호성단으로 돌아가고 if (isMatchHolyShrine(pItem, pCorpse) // && g_pWarSystem->isModifyCastleOwner( castleZoneID, pPC )) - // ִ GuardShrine ־ ȴ. + // 성의 종족과 넣는 사람의 종족이 같은 경우라면 GuardShrine에 넣어도 된다. || isDefenderOfGuardShrine(pPC, pCorpse) && isMatchGuardShrine(pItem, pCorpse, pPC)) { pShrineSet->setOwnerRace(pPC->getRace()); // g_pWarSystem->endWar(pPC, castleZoneID); - // War::executeEnd ˾Ƽ ǵش. + // 전쟁 끝나는 War::executeEnd에서 알아서 되돌려준다. // returnBloodBible( shrineID, false ); // return true; } - // ٸ ܿ ְų Ȳ ƴϸ ȣ ׳ ư + // 다른 성단에 넣거나 전쟁이 끝날 상황이 아니면 수호성단으로 그냥 돌아간다 returnBloodBible(shrineID, false); return false; @@ -892,7 +892,7 @@ bool ShrineInfoManager::putBloodBible(PlayerCreature* pPC, Item* pItem, MonsterC ZoneID_t castleZoneID = pZone->getZoneID(); - // castleZoneID shrineID ˻Ҽ  ϳϳ Ѵ. -_-; + // castleZoneID의 shrineID를 검색할수가 없어서 하나하나 비교한다. -_-; for (; itr!=m_ShrineSets.end(); itr++) { ShrineSet* pShrineSet = itr->second; @@ -937,7 +937,7 @@ bool ShrineInfoManager::removeAllShrineShield() HashMapShrineSetConstItor itr = m_ShrineSets.begin(); - // castleZoneID shrineID ˻Ҽ  ϳϳ Ѵ. -_-; + // castleZoneID의 shrineID를 검색할수가 없어서 하나하나 비교한다. -_-; for (; itr != m_ShrineSets.end(); itr++) { ShrineSet* pShrineSet = itr->second; @@ -979,7 +979,7 @@ bool ShrineInfoManager::removeShrineShield(ShrineInfo* pShrineInfo) gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_SHRINE_SHIELD); pZone->broadcastPacket(pCorpse->getX(), pCorpse->getY(), &gcRemoveEffect); - // ܿ ִ ġ ˷ش. + // 성단에 있는 피의 성서 위치를 알려준다. if (pItem->isFlag(Effect::EFFECT_CLASS_HAS_BLOOD_BIBLE)) { Effect* pEffect = EM.findEffect(Effect::EFFECT_CLASS_HAS_BLOOD_BIBLE); Assert(pEffect != NULL); @@ -1037,7 +1037,7 @@ bool ShrineInfoManager::removeShrineShield(ShrineInfo* pShrineInfo) ZoneID_t castleZoneID = pZone->getZoneID(); - // castleZoneID shrineID ˻Ҽ  ϳϳ Ѵ. -_-; + // castleZoneID의 shrineID를 검색할수가 없어서 하나하나 비교한다. -_-; for (; itr!=m_ShrineSets.end(); itr++) { ShrineSet* pShrineSet = itr->second; diff --git a/src/server/gameserver/ShrineInfoManager.h b/src/server/gameserver/ShrineInfoManager.h index 7bd953bc..223a26ba 100644 --- a/src/server/gameserver/ShrineInfoManager.h +++ b/src/server/gameserver/ShrineInfoManager.h @@ -18,8 +18,8 @@ class GCBloodBibleStatus; class ShrineInfo { public: enum ShrineType { - SHRINE_GUARD, // ִ ȣ - SHRINE_HOLY // ۿ ִ + SHRINE_GUARD, // 성에 있는 수호성단 + SHRINE_HOLY // 성 밖에 있는 성지성단 }; public: @@ -80,11 +80,11 @@ class ShrineInfo { private: MonsterType_t m_MonsterType; ShrineType m_ShrineType; - ZoneID_t m_ZoneID; // ID + ZoneID_t m_ZoneID; // 존ID ZoneCoord_t m_X; ZoneCoord_t m_Y; ObjectID_t m_ObjectID; - string m_Name; // ̸ + string m_Name; // 성단 이름 }; class ShrineSet { @@ -154,15 +154,15 @@ class ShrineSet { bool saveBloodBibleOwner(); private: - ShrineID_t m_ShrineID; // Shrine ID. ItemType ƾ Ѵ. - ShrineInfo m_SlayerGuardShrine; // ̾ ȿ ִ Shrine - ShrineInfo m_VampireGuardShrine; // ̾ ȿ ִ Shrine - ShrineInfo m_OustersGuardShrine; // ƿ콺 ȿ ִ Shrine - ShrineInfo m_HolyShrine; // ƴ ִ Shrine - ItemType_t m_ItemType; // ItemType - ItemID_t m_ItemID; // ItemID - Race_t m_OwnerRace; // ߴ - GCBloodBibleStatus* m_pGCBBS; // ġ + ShrineID_t m_ShrineID; // Shrine ID. ItemType과 같아야 한다. + ShrineInfo m_SlayerGuardShrine; // 슬레이어 성 안에 있는 Shrine + ShrineInfo m_VampireGuardShrine; // 뱀파이어 성 안에 있는 Shrine + ShrineInfo m_OustersGuardShrine; // 아우스터즈 성 안에 있는 Shrine + ShrineInfo m_HolyShrine; // 아담의 성지에 있는 Shrine + ItemType_t m_ItemType; // 성서 조각 ItemType + ItemID_t m_ItemID; // 성서 조각 ItemID + Race_t m_OwnerRace; // 최종적으로 차지했던 종족 + GCBloodBibleStatus* m_pGCBBS; // 피의 성서 위치 정보 mutable Mutex m_Mutex; }; @@ -220,10 +220,10 @@ class ShrineInfoManager { void addAllShrineShield(); bool removeAllShrineShield(); - // DB Owner Ѵ. + // DB에 현재 Owner정보를 저장한다. bool saveBloodBibleOwner(); - // ġ Ѵ. + // 피의 성서 위치 정보를 등록한다. void registerBloodBibleStatus(ItemType_t m_Part, GCBloodBibleStatus* pGCBBS); void sendBloodBibleStatus(PlayerCreature* pPC); diff --git a/src/server/gameserver/SiegeManager.cpp b/src/server/gameserver/SiegeManager.cpp index 3807de53..c5fed8d1 100644 --- a/src/server/gameserver/SiegeManager.cpp +++ b/src/server/gameserver/SiegeManager.cpp @@ -36,7 +36,7 @@ void SiegeManager::init(ZoneID_t zoneID) { if (pSiegeZone == NULL) return; - MonsterCorpse* pShrine = new MonsterCorpse(560, "ʥﱣ̨", 2); + MonsterCorpse* pShrine = new MonsterCorpse(560, "加膠괏밗憩", 2); Assert(pShrine != NULL); pShrine->setShrine(true); @@ -127,7 +127,7 @@ void SiegeManager::start(ZoneID_t zoneID) { Monster* pMonster = new Monster(mType); pMonster->setTreasure(false); pMonster->setScanEnemy(true); - pMonster->setName(""); + pMonster->setName("括깡"); try { pSiegeZone->addCreature(pMonster, guardPosition[i].x, guardPosition[i].y, 0); @@ -221,7 +221,7 @@ void SiegeManager::putItem(PlayerCreature* pPC, MonsterCorpse* pCorpse, Item* pI GCSystemMessage gcSM; char buffer[256]; - sprintf(buffer, "%dŹʤ.10ƶص.", side); + sprintf(buffer, "%d뵀묑샌렘삿돤價적.10취빈盧땡돕릿삶뒈듐.", side); gcSM.setMessage(buffer); pPC->getZone()->broadcastPacket(&gcSM); @@ -244,7 +244,7 @@ void SiegeManager::recallGuild(ZoneID_t currentZoneID, ZoneID_t siegeZoneID, Gui if (pTargetCreature == NULL) continue; - // ȯ ǥ. + // 소환자의 존과 좌표. ZoneID_t ZoneNum = siegeZoneID; Coord_t ZoneX = targetPos[side - 1].x; Coord_t ZoneY = targetPos[side - 1].y; diff --git a/src/server/gameserver/SimpleCreatureEffect.cpp b/src/server/gameserver/SimpleCreatureEffect.cpp index b51e33e9..27b4eb37 100644 --- a/src/server/gameserver/SimpleCreatureEffect.cpp +++ b/src/server/gameserver/SimpleCreatureEffect.cpp @@ -31,13 +31,13 @@ void SimpleCreatureEffect::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(getEffectClass()); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(getSendEffectClass()); diff --git a/src/server/gameserver/SkillDomainInfoManager.h b/src/server/gameserver/SkillDomainInfoManager.h index d309263d..edbfdd0b 100644 --- a/src/server/gameserver/SkillDomainInfoManager.h +++ b/src/server/gameserver/SkillDomainInfoManager.h @@ -58,19 +58,19 @@ class DomainInfo { string toString() const; private: - // ų Ÿ + // 스킬 도메인의 타입 SkillDomainType_t m_Type; - // ܰ(ų Ʈ depth) + // 단계(스킬 트리에서 이 기술의 depth) Level_t m_Level; - // ǥ ġ + // 목표 경험치 Exp_t m_GoalExp; - // ġ + // 누적 경험치 Exp_t m_AccumExp; - // ܰ + // 적절한 무기 단계 ItemType_t m_BestItemType; }; diff --git a/src/server/gameserver/SkillInfo.h b/src/server/gameserver/SkillInfo.h index 8c053029..e485556c 100644 --- a/src/server/gameserver/SkillInfo.h +++ b/src/server/gameserver/SkillInfo.h @@ -144,7 +144,7 @@ class SkillInfo { m_Target = target; } - // ο .( ...) + // 새로운 버젼을 위해.(합쳐진 버전...) uint getSubSkill() const { return m_SubSkill; } @@ -201,7 +201,7 @@ class SkillInfo { (bPhysic ? m_PropertyType.set(SKILL_PROPERTY_TYPE_PHYSIC) : m_PropertyType.reset(SKILL_PROPERTY_TYPE_PHYSIC)); } - // ʿ ų Ʈ + // 배우기 위해 필요한 스킬 포인트 int getSkillPoint() const { return m_SkillPoint; } @@ -209,7 +209,7 @@ class SkillInfo { m_SkillPoint = skillPoint; } - // ų Ʈ + // 스킬 레벨 업 포인트 int getLevelUpPoint() const { return m_LevelUpPoint; } @@ -217,7 +217,7 @@ class SkillInfo { m_LevelUpPoint = levelUpPoint; } - // ų + // 이전에 배워야 할 스킬들 void addRequireSkill(SkillType_t skillType) { m_RequireSkills.push_back(skillType); } @@ -225,7 +225,7 @@ class SkillInfo { return m_RequireSkills; } - // ų + // 이전에 배워야 할 스킬들 void addRequiredSkill(SkillType_t skillType) { m_RequiredSkills.push_back(skillType); } @@ -241,7 +241,7 @@ class SkillInfo { } //////////////////////////////////////////////////////////////////////////// - // ϱ ʿ ǵ. ƿ콺ͽ + // 시전하기 위해 필요한 조건들. 아우스터스용 //////////////////////////////////////////////////////////////////////////// Elemental_t getRequireFire() const { return m_RequireFire; @@ -317,60 +317,60 @@ class SkillInfo { uint m_Type; // Type string m_Name; // Name uint m_Level; // m_Level - uint m_MinDamage; // ּ - uint m_MaxDamage; // ִ - uint m_MinDelay; // ּ - uint m_MaxDelay; // ִ - uint m_MinCastTime; // ij Ÿ.. ʴ - uint m_MaxCastTime; // ִ ij Ÿ - - // ּ ӽð - // ִ ּҰ ׳ ӽð ִ ּ ӽð о ȴ. - // ӽð 0 Instant, -1 Long ǹѴ. + uint m_MinDamage; // 최소 데미지 + uint m_MaxDamage; // 최대 데미지 + uint m_MinDelay; // 최소 딜레이 + uint m_MaxDelay; // 최대 딜레이 + uint m_MinCastTime; // 캐스팅 타임.. 초단위 + uint m_MaxCastTime; // 최대 캐스팅 타임 + + // 최소 지속시간 + // 최대 최소가 구별없이 그냥 지속시간만 있는 것은 최소 지속시간에서 읽어오면 된다. + // 지속시간이 0인 것은 Instant, -1 은 Long을 의미한다. int m_MinDuration; - // ִ ӽð + // 최대 지속시간 int m_MaxDuration; - // MP Һ + // MP 소비량 uint m_ConsumeMP; - // ִ ּ Ÿ, þ??? + // 최대 최소 사정거리, 시야??? uint m_MaxRange; uint m_MinRange; - // ߽ų ִ Ÿ MoveType + // 명중시킬 수 있는 타겟의 MoveType // 0x01 : burrowing // 0x02 : walking // 0x04 : flying uint m_Target; - // .. + // 합쳐진 버젼을 위해.. uint m_SubSkill; uint m_Point; BYTE m_Domain; - // 迭. , , + // 마법의 계열. 독, 산, 저주 등등 int m_MagicDomain; - // 迭 + // 정령 계열 int m_ElementalDomain; - // ʿ ų Ʈ + // 필요한 스킬 포인트 int m_SkillPoint; int m_LevelUpPoint; - // ų + // 이전에 배워야할 스킬들 list m_RequireSkills; - // ̰ ִ ų + // 이거 다음에 배울 수 있는 스킬들 list m_RequiredSkills; BYTE m_CanDelete; - // ϱ ʿ ǵ - // ƿ콺ͽ + // 시전하기 위해 필요한 조건들 + // 아우스터스 용 Elemental_t m_RequireFire; Elemental_t m_RequireWater; Elemental_t m_RequireEarth; @@ -412,17 +412,17 @@ class SkillInfoManager { void addSkillInfo(SkillInfo* pSkillInfo); // get SkillType by LearnLevel - // ִ Ÿ  ã´. - // . + // 현재의 도메인 레벨에서 배울 수 있는 기술의 타입은 어떤 것인지 찾는다. + // 도메인의 레벨로 알 수 있지렁. SkillType_t getSkillTypeByLevel(SkillDomainType_t SkillDomain, Level_t Level); - //  ޿ شϴ ƴ Լ. + // 도메인의 레벨로 그 레벨은 어떤 등급에 해당하는지 아는 함수. SkillGrade getGradeByDomainLevel(Level_t Level); - // ޿ ö ִ ˾ . + // 현재 등급에서 기술이 어느정도 레벨까지 올라갈 수 있는지 알아 본다. Level_t getLimitLevelByDomainGrade(SkillGrade Grade); - // INT MP ҷ ̾Ƴ Լ. + // 현재 INT에서 MP 감소량을 뽑아내기 위한 함수. MP_t getdecreaseConsumeMP(Attr_t INT) { return m_decreaseConsumeMP[INT]; } diff --git a/src/server/gameserver/SkillParentInfo.h b/src/server/gameserver/SkillParentInfo.h index 467bdad8..ea1bdca5 100644 --- a/src/server/gameserver/SkillParentInfo.h +++ b/src/server/gameserver/SkillParentInfo.h @@ -16,7 +16,7 @@ // // Class SkillParentInfo; // -// ų θ ִ ޼ҵ ִ Ŭ̴ +// 이 스킬의 부모가 누구인지 알 수 있는 메소드들을 가지고 있는 클래스이다 // //---------------------------------------------------------------------- @@ -38,7 +38,7 @@ class SkillParentInfo { // AI specific methods //-------------------------------------------------- public: - // SkillParentInfoType ؼ, SkillParentInfoInfo κ ʱȭϱ + // SkillParentInfoType 을 사용해서, SkillParentInfoInfo 로부터 초기화하기 void init(); // enemy specific methods diff --git a/src/server/gameserver/Slayer.h b/src/server/gameserver/Slayer.h index 8623d10c..4bf53a05 100644 --- a/src/server/gameserver/Slayer.h +++ b/src/server/gameserver/Slayer.h @@ -47,9 +47,9 @@ #define SLAYER_MAX_RANK 50 #else -// ̾ BOUND_LEVEL ϱ -// ɷġ BOUND_ATTR Ϸ, ɷġ BOUND_ATTR_SUM Ϸ ѵȴ. -// BOUND_LEVEL ڿ MAX_ATTR MAX_ATTR_SUM ѵȴ. +// 슬레이어는 도메인 레벨이 BOUND_LEVEL에 도달하기 전까지는 +// 능력치가 BOUND_ATTR 이하로, 능력치 총합이 BOUND_ATTR_SUM 이하로 제한된다. +// BOUND_LEVEL이 넘은 뒤에는 MAX_ATTR과 MAX_ATTR_SUM으로 제한된다. #define SLAYER_BOUND_LEVEL 100 #define SLAYER_BOUND_ATTR 210 #define SLAYER_BOUND_ATTR_SUM 330 @@ -68,8 +68,8 @@ #endif //////////////////////////////////////////////////////////////////////////////// -// ԰ ԰ ɷġ -// α (?) Ŭ. +// 장비를 입고 벗을 때 장비 입고 벗기 전의 능력치를 +// 저장해 두기 위한 버퍼(?) 클래스. //////////////////////////////////////////////////////////////////////////////// class SLAYER_RECORD { @@ -92,7 +92,7 @@ class SLAYER_RECORD { // // Class Slayer; // -// Creature Ŭ ÷̾ ϴ PC ̴. +// Creature 의 하위 클래스로 플레이어가 조종하는 PC 이당. // //////////////////////////////////////////////////////////////////////////////// @@ -100,7 +100,7 @@ class Motorcycle; class Slayer : public PlayerCreature { ////////////////////////////////////////////////////////////// - // Ŭ + // 클래스 내부 상수 선언 ////////////////////////////////////////////////////////////// public: enum WearPart { @@ -129,14 +129,14 @@ class Slayer : public PlayerCreature { }; ////////////////////////////////////////////////////////////// - // /Ҹ + // 생성자/소멸자 ////////////////////////////////////////////////////////////// public: Slayer(); virtual ~Slayer(); ////////////////////////////////////////////////////////////// - // Ŭ Լ + // 하위 클래스 상속 함수 ////////////////////////////////////////////////////////////// public: virtual CreatureClass getCreatureClass() const { @@ -171,14 +171,14 @@ class Slayer : public PlayerCreature { } ////////////////////////////////////////////////////////////// - // ð Լ + // 시간제한 아이템 관련 함수 ////////////////////////////////////////////////////////////// public: void checkItemTimeLimit(); void updateEventItemTime(DWORD time); ////////////////////////////////////////////////////////////// - // Լ(dead or alive) + // 상태 관련 함수(dead or alive) ////////////////////////////////////////////////////////////// public: virtual bool isDead() const { @@ -189,7 +189,7 @@ class Slayer : public PlayerCreature { } ////////////////////////////////////////////////////////////// - // Ѹ Լ(̸, , , Ӹ, Ǻ, ȭȣ) + // 겉모습 관련 함수(이름, 권한, 성별, 머리, 피부, 전화번호) ////////////////////////////////////////////////////////////// public: const string& getName() const { @@ -262,7 +262,7 @@ class Slayer : public PlayerCreature { } ////////////////////////////////////////////////////////////// - // ȭ Լ + // 전화 관련 함수 ////////////////////////////////////////////////////////////// public: PhoneNumber_t getPhoneNumber() const { @@ -280,7 +280,7 @@ class Slayer : public PlayerCreature { bool isSlotByPhoneNumber(PhoneNumber_t PhoneNumber); ////////////////////////////////////////////////////////////// - // ɷġ Լ(STR, DEX, INT) + // 능력치 관련 함수(STR, DEX, INT) ////////////////////////////////////////////////////////////// public: Bonus_t getBonus() const { @@ -290,7 +290,7 @@ class Slayer : public PlayerCreature { m_AdvancedAttrBonus = bonus; } - // + // 성향 Alignment_t getAlignment() const { return m_Alignment; } @@ -336,14 +336,14 @@ class Slayer : public PlayerCreature { void divideAttrExp(AttrKind kind, Damage_t damage, ModifyInfo& ModifyInfo); - // ߰. by sigi. 2002.8.30 - // PlayerCreature ű. 2004.1 by Sequoia + // 계급 추가. by sigi. 2002.8.30 + // PlayerCreature로 옮김. 2004.1 by Sequoia - // ʺΰ? ɷġ 40 + // 초보자인가? 순수 능력치 합이 40 이하 bool isNovice() const; ////////////////////////////////////////////////////////////// - // ɷġ Լ(HP, MP) + // 능력치 관련 함수(HP, MP) ////////////////////////////////////////////////////////////// public: HP_t getHP(AttrType attrType = ATTR_CURRENT) const { @@ -370,7 +370,7 @@ class Slayer : public PlayerCreature { ////////////////////////////////////////////////////////////// - // ɷġ Լ(Damage, CC, Defense, ToHit) + // 능력치 관련 함수(Damage, CC, Defense, ToHit) ////////////////////////////////////////////////////////////// public: Damage_t getDamage(AttrType attrType = ATTR_CURRENT) const { @@ -391,7 +391,7 @@ class Slayer : public PlayerCreature { ////////////////////////////////////////////////////////////// - // ų Լ + // 스킬 관련 함수 ////////////////////////////////////////////////////////////// public: Exp_t getGoalExp(SkillDomainType_t Domain) const { @@ -449,14 +449,14 @@ class Slayer : public PlayerCreature { m_RifleBonusExp = RifleBonusExp; } - // domain level Ÿ ǵ. + // 지정된 domain에서 가장 높은 level의 기술의 타입을 되돌린다. // SkillType_t getMaxLevelSkillType(SkillDomainType_t domain) ; // void setHotKey(BYTE pos, SkillType_t SkillType) { m_HotKey[pos] = SkillType; } // SkillType_t getHotKey(BYTE pos) const { return m_HotKey[pos]; } ////////////////////////////////////////////////////////////// - // /Ż Լ + // 아이템 착/탈 관련 함수 ////////////////////////////////////////////////////////////// public: bool isWear(WearPart Part) { @@ -492,7 +492,7 @@ class Slayer : public PlayerCreature { void getShapeInfo(DWORD& flag, Color_t color[PCSlayerInfo::SLAYER_COLOR_MAX]) const; ////////////////////////////////////////////////////////////// - // /Ż ɷġ Լ + // 아이템 착/탈 시 능력치 수정 관련 함수 ////////////////////////////////////////////////////////////// public: void initAllStat(int numPartyMember = -1); @@ -509,7 +509,7 @@ class Slayer : public PlayerCreature { void computeOptionClassStat(OptionClass OClass, int PlusPoint); ////////////////////////////////////////////////////////////// - // ˻ Լ + // 아이템 검색 함수 ////////////////////////////////////////////////////////////// public: virtual Item* findItemOID(ObjectID_t id) { @@ -541,7 +541,7 @@ class Slayer : public PlayerCreature { } ////////////////////////////////////////////////////////////// - // Ŭ Լ + // 모터 사이클 관련 함수 ////////////////////////////////////////////////////////////// public: Motorcycle* getMotorcycle() const { @@ -557,7 +557,7 @@ class Slayer : public PlayerCreature { ////////////////////////////////////////////////////////////// - // Լ + // 인포 관련 함수 ////////////////////////////////////////////////////////////// public: PCSlayerInfo2* getSlayerInfo2() const; @@ -571,7 +571,7 @@ class Slayer : public PlayerCreature { EffectInfo* getEffectInfo() const; ////////////////////////////////////////////////////////////// - // Ÿ Լ + // 기타 함수 ////////////////////////////////////////////////////////////// public: virtual Fame_t getFame() const { @@ -727,12 +727,12 @@ class Slayer : public PlayerCreature { // PC name string m_Name; - // + // 권한 BYTE m_Competence; BYTE m_CompetenceShape; // Sex(1bit), HairStyle(2bit) - // ߿ bit ؼ ޸𸮸 ̵ . + // 나중에는 bit 연산을 해서 메모리를 줄이도록 하자. Sex m_Sex; HairStyle m_HairStyle; @@ -820,29 +820,29 @@ class Slayer : public PlayerCreature { mutable Mutex m_Mutex; - // ̾ ɷġ δ ü + // 슬레이어의 이전 능력치를 저장해 두는 버퍼 구조체 SLAYER_RECORD m_Record; - // Ȱ + // 부활존 관련 ZoneID_t m_ResurrectZoneID; - // HP, MP ƿ + // HP, MP 스틸 Steal_t m_HPStealAmount; Steal_t m_MPStealAmount; Steal_t m_HPStealRatio; Steal_t m_MPStealRatio; - // HP, MP + // HP, MP 재생 Regen_t m_HPRegen; Regen_t m_MPRegen; // luck Luck_t m_Luck; - // Prayer Meditation õ timer + // Prayer와 Meditation과 관련된 timer Timeval m_MPRegenTime; - // ġ ̺ īƮ + // 각종 경험치 세이브 카운트 WORD m_DomainExpSaveCount; WORD m_AttrExpSaveCount; WORD m_SkillExpSaveCount; diff --git a/src/server/gameserver/SlayerCorpse.h b/src/server/gameserver/SlayerCorpse.h index 58911320..04afd699 100644 --- a/src/server/gameserver/SlayerCorpse.h +++ b/src/server/gameserver/SlayerCorpse.h @@ -16,7 +16,7 @@ class Slayer; ////////////////////////////////////////////////////////////////////////////// // class SlayerCorpse; -// ̾ ׾ , ü̴. +// 슬레이어가 죽었을 경우, 남기는 시체이다. ////////////////////////////////////////////////////////////////////////////// class SlayerCorpse : public Corpse { @@ -67,7 +67,7 @@ class SlayerCorpse : public Corpse { } protected: - PCSlayerInfo3 m_SlayerInfo; // ü ܸ + PCSlayerInfo3 m_SlayerInfo; // 시체의 외모에 대한 정보 }; #endif diff --git a/src/server/gameserver/SocketImpl.cpp b/src/server/gameserver/SocketImpl.cpp index f9b1da5a..24245a15 100644 --- a/src/server/gameserver/SocketImpl.cpp +++ b/src/server/gameserver/SocketImpl.cpp @@ -263,7 +263,7 @@ uint SocketImpl::send(const void* buf, uint len, uint flags) { } catch (Throwable& t) { cout << "SocketImpl::send Exception Check!" << endl; cout << t.toString() << endl; - throw InvalidProtocolException(" öԱ"); + throw InvalidProtocolException("음 여까지 올라왔군"); } return result; diff --git a/src/server/gameserver/SomethingGrowingUp.h b/src/server/gameserver/SomethingGrowingUp.h index ed827a86..fdee0085 100644 --- a/src/server/gameserver/SomethingGrowingUp.h +++ b/src/server/gameserver/SomethingGrowingUp.h @@ -22,7 +22,7 @@ class ExpTable { ExpTable() : m_Records(MaxLevel) {} virtual ~ExpTable() {} - // DB Լ + // DB 관련 함수들 virtual void load(); virtual const string getDBTableName() const = 0; virtual const string getDBGoalExpFieldName() const { @@ -38,7 +38,7 @@ class ExpTable { return ""; } - // ϱ + // 쿼리하기 GoalExpType getGoalExp(LevelType level) const { Assert(level <= MaxLevel && level >= MinLevel); return m_Records[level].m_GoalExp; @@ -65,7 +65,7 @@ void ExpTable::load() const string QueryTemplate = "SELECT %s, %s, %s FROM %s %s"; - // 10Ʈ ٴ + // 10바이트 정도 오바는 봐주자 int size = QueryTemplate.size() + getDBTableName().size() + getDBGoalExpFieldName().size() + getDBAccumExpFieldName().size() + getDBLevelFieldName().size() + getDBQueryCondition().size(); char* query = new char[size]; @@ -122,7 +122,7 @@ template class SomethingGrowingUp { bool levelUp(); bool levelDown(); - // ʿҶ ô. + // 꼭 필요할때만 씁시다. bool SET_LEVEL(LevelType level); private: diff --git a/src/server/gameserver/SpecialEventFlag.h b/src/server/gameserver/SpecialEventFlag.h index ad0c947d..9d304e59 100644 --- a/src/server/gameserver/SpecialEventFlag.h +++ b/src/server/gameserver/SpecialEventFlag.h @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////// // SpecialEventFlag.h -// . +// 아 귀차나. /////////////////////////////////////////////////////////////////// #ifndef __SPECIAL_EVENT_FLAG_H__ diff --git a/src/server/gameserver/Stash.h b/src/server/gameserver/Stash.h index aa9acf56..01fe87ac 100644 --- a/src/server/gameserver/Stash.h +++ b/src/server/gameserver/Stash.h @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////// // Filename : Stash.h -// Written By : 輺 +// Written By : 김성민 // Description : ////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/StringPool.h b/src/server/gameserver/StringPool.h index 6c048c5e..92c67444 100644 --- a/src/server/gameserver/StringPool.h +++ b/src/server/gameserver/StringPool.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////// // Filename : StringPool.h -// Desc : Ǵ string pool +// Desc : 서버내에서 사용되는 string 들의 pool //////////////////////////////////////////////////////////////////// #ifndef __STRING_POOL_H__ @@ -141,7 +141,7 @@ enum StringID { STRID_QUIT_TEAM_2, // 125 STRID_QUIT_CLAN_2, // 126 - // Action ִ String ó ȵǾ ־ + // Action 에 있는 String 처리 안되어 있었음 STRID_NOT_ENOUGH_MONEY, // 127 STRID_NOT_ENOUGH_INVENTORY_SPACE, // 128 STRID_ITEM_NOT_EXIST, // 129 diff --git a/src/server/gameserver/SweeperSet.cpp b/src/server/gameserver/SweeperSet.cpp index 9e84ce86..eddf62a8 100644 --- a/src/server/gameserver/SweeperSet.cpp +++ b/src/server/gameserver/SweeperSet.cpp @@ -105,7 +105,7 @@ void SweeperSetManager::load(int level, Zone* pZone) { // SweeperSet::SweeperIndex Owner = (SweeperSet::SweeperIndex)OwnerID; // StringStream name; - // name << "" << (int)ItemType; + // name << "보관대" << (int)ItemType; string name = pResult->getString(14); @@ -215,7 +215,7 @@ bool SweeperSetManager::putSweeper(Item* pSweeper, MonsterCorpse* pSafe) { Assert(pSweeper != NULL); Assert(pSafe != NULL); - // Sweepr ִ ڿ pSafe Ȯߴٰ Ѵ + // Sweepr 를 넣는 사용자와 pSafe 의 종족이 같음은 위에서 확인했다고 가정한다 if (pSweeper->getItemClass() != Item::ITEM_CLASS_SWEEPER) return false; if (pSafe->getItemClass() != Item::ITEM_CLASS_CORPSE) @@ -326,7 +326,7 @@ bool SweeperSetManager::returnSweeper( Zone* pZone, Sweeper* pSweeper ) const ObjectID_t CorpseObjectID = pDefaultSafe->getObjectID(); - // Default Safe ű ͵ ؾ Ѵ + // Default Safe 로 옮기고 소유한 종족에 대한 것도 저장해야 한다 // pZone->transportItemToCorpse( pSweeper, pTargetZone, CorpseObjectID ); SweeperSet* pSweeperSet = getSweeperSet( 3 ); diff --git a/src/server/gameserver/SystemAvailabilitiesManager.h b/src/server/gameserver/SystemAvailabilitiesManager.h index 51ee8849..65ede0d0 100644 --- a/src/server/gameserver/SystemAvailabilitiesManager.h +++ b/src/server/gameserver/SystemAvailabilitiesManager.h @@ -12,12 +12,12 @@ SystemAvailabilitiesManager::AssertAvailable( \ SystemAvailabilitiesManager::KIND, \ string() + __PRETTY_FUNCTION__ + \ - " : ߸ Ŭ̾Ʈ ߰ų Ŭ̾Ʈ ʽϴ.") + " : 잘못된 클라이언트를 사용했거나 클라이언트와 서버의 정보가 맞지 않습니다.") #define SYSTEM_RETURN_IF_NOT(KIND) \ if (!SystemAvailabilitiesManager::getInstance()->isAvailable(SystemAvailabilitiesManager::KIND)) { \ filelog("SystemAvailabilities.log", \ (string() + __PRETTY_FUNCTION__ + \ - " : ߸ Ŭ̾Ʈ ߰ų Ŭ̾Ʈ ʽϴ.") \ + " : 잘못된 클라이언트를 사용했거나 클라이언트와 서버의 정보가 맞지 않습니다.") \ .c_str()); \ return; \ } @@ -79,7 +79,7 @@ class SystemAvailabilitiesManager { return m_pAvailabilitiesPacket; } - // ̴̱ + // 싱글톤이당 static SystemAvailabilitiesManager* getInstance() { static SystemAvailabilitiesManager theInstance; return &theInstance; diff --git a/src/server/gameserver/TelephoneCenter.h b/src/server/gameserver/TelephoneCenter.h index aceb7cb9..f9fd609c 100644 --- a/src/server/gameserver/TelephoneCenter.h +++ b/src/server/gameserver/TelephoneCenter.h @@ -19,8 +19,8 @@ //-------------------------------------------------------------------------------- // class TelephoneCenter; // -// ۷ι Ŵ ü, PC ȣ ؼ PCü ֵ -// ش. unordered_map ؼ, ˻ ӵ Ų. +// 게임 서버의 글로벌 매니저 객체로, PC의 폰번호를 사용해서 PC객체에 접근할 수 있도록 +// 해준다. 내부적으로 unordered_map 을 사용해서, 검색 속도를 향상시킨다. // //-------------------------------------------------------------------------------- class TelephoneCenter { diff --git a/src/server/gameserver/ThreadManager.h b/src/server/gameserver/ThreadManager.h index b3f14d41..d94acd4c 100644 --- a/src/server/gameserver/ThreadManager.h +++ b/src/server/gameserver/ThreadManager.h @@ -21,12 +21,12 @@ class ThreadPool; // // class ThreadManager // -// (!) Ǯ Ѵ. Ӽκ init, start, -// stop Ǯ ޽带 ȣѴ. +// 게임 서버상의 모든(!) 쓰레드풀을 관리한다. 게임서버로부터 init, start, +// stop 명령이 떨어지면 하위 쓰레드풀의 같은 메쏘드를 호출한다. // -// init : Ǯ ɼǿ 带 , Ѵ. -// start : Ǯ ϵ Ȱȭ(start)Ų. -// stop : Ǯ ϵ Ȱȭ(stop)Ų. +// init : 각 쓰레드풀에 옵션에서 지정한 개수의 쓰레드를 생성, 등록한다. +// start : 각 쓰레드풀에 등록된 쓰레드들을 활성화(start)시킨다. +// stop : 각 쓰레드풀에 등록된 쓰레드들을 비활성화(stop)시킨다. // ////////////////////////////////////////////////////////////////////// @@ -40,25 +40,25 @@ class ThreadManager { public: - // Ŵ ʱȭѴ. + // 쓰레드 매니저를 초기화한다. void init(); // activate sub thread pools - // Ǯ ȰȭŲ. + // 하위 쓰레드 풀을 활성화시킨다. void start(); // deactivate sub thread pools - // Ǯ Ų. + // 하위 쓰레드 풀을 종료시킨다. void stop(); // #ifdef __NO_COMBAT__ ThreadPool* getThreadPool() { return m_pZoneGroupThreadPool; - } // 漮 + } // 김경석 // #endif private: - // Ǯ + // 쓰레드풀 ThreadPool* m_pZoneGroupThreadPool; }; diff --git a/src/server/gameserver/ThreadPool.h b/src/server/gameserver/ThreadPool.h index c6a31398..327b7a27 100644 --- a/src/server/gameserver/ThreadPool.h +++ b/src/server/gameserver/ThreadPool.h @@ -29,10 +29,10 @@ // // class ThreadPool // -// ü ÷ Ŭ̴. Ȱ -// ߴܽų , Ǯ ü Stop޽带 ϸ ȴ. -// ñ׳̳ ĵ̼ ̴. ׷, ڷᰡ  -// ϰ ִ. ^^; +// 쓰레드 객체들의 컬렉션 클래스이다. 서버 종료시 활동중인 모든 쓰레드들을 +// 중단시킬 때, 쓰레드풀 객체의 Stop메쏘드를 사용하면 된다. 내부적으로 +// 시그널이나 캔슬레이션이 사용될 전망이다. 그런데, 아직은 자료가 없어서 +// 구현을 못하고 있다. ^^; // ////////////////////////////////////////////////////////////////////// @@ -45,7 +45,7 @@ class ThreadPool { ThreadPool(); // destructor - // ϰ ִ ü ؾ Ѵ. + // 포함하고 있는 모든 쓰레드 객체를 삭제해야 한다. virtual ~ThreadPool(); @@ -53,26 +53,26 @@ class ThreadPool { // methods ////////////////////////////////////////////////// public: - // Ǯȿ ϵ RUNNING · . + // 쓰레드풀안에 등록된 쓰레드들을 RUNNING 상태로 만든다. void start(); - // Ǯȿ ϵ ߴܽŲ. - //(̴ singal Ȥ cancellation ؾ ϰڴ.) + // 쓰레드풀안에 등록된 모든 쓰레드의 실행을 중단시킨다. + //(이는 singal 혹은 cancellation 으로 구현해야 하겠다.) void stop(); - // Ǯ ü Ѵ. + // 쓰레드풀에 쓰레드 객체를 등록한다. void addThread(Thread* thread); - // Ǯ Ư ü Ѵ. + // 쓰레드풀에서 특정 쓰레드 객체를 삭제한다. void deleteThread(TID tid); - // Ǯ Ư ü ãƼ Ѵ. + // 쓰레드풀에서 특정 쓰레드 객체를 찾아서 리턴한다. Thread* getThread(TID tid); // #ifdef __NO_COMBAT__ list getThreads() { return m_Threads; - } // 漮 + } // 김경석 // #endif ////////////////////////////////////////////////// @@ -80,9 +80,9 @@ class ThreadPool { ////////////////////////////////////////////////// private: // - // ü Ϳ Ʈ - // δ Ŭ Ŭ  ȴ. - // Ϲ ϵȴ. + // 쓰레드 객체의 포인터에 대한 리스트 + // 실제로는 쓰레드 클래스의 하위 클래스가 들어가게 된다. + // 일반적으로 같은 종류의 쓰레드들이 등록된다. // // ex> PlayerThreadPool - PlayerThread // NPCThreadPool - NPCThread diff --git a/src/server/gameserver/Tile.h b/src/server/gameserver/Tile.h index 0f2431fd..b741c102 100644 --- a/src/server/gameserver/Tile.h +++ b/src/server/gameserver/Tile.h @@ -38,18 +38,18 @@ class Packet; class Tile { public: enum TileFlags { - TILE_GROUND_BLOCKED = 0, // Ÿ - TILE_AIR_BLOCKED, // Ÿ - TILE_UNDERGROUND_BLOCKED, // Ÿ ϰ - TILE_WALKING_CREATURE, // Ÿ ũó - TILE_FLYING_CREATURE, // Ÿ ߿ ũó - TILE_BURROWING_CREATURE, // Ÿ Ͽ ũó - TILE_ITEM, // Ÿ - TILE_OBSTACLE, // Ÿ ¸ ֹ - TILE_EFFECT, // Ÿ ü - TILE_BUILDING, // Ÿ ǹ - TILE_PORTAL, // Ÿ Ż - TILE_TERRAIN // ȿ ִ Ÿ + TILE_GROUND_BLOCKED = 0, // 타일의 지상이 막혔을 경우 + TILE_AIR_BLOCKED, // 타일의 공중이 막혔을 경우 + TILE_UNDERGROUND_BLOCKED, // 타일의 지하가 막혔을 경우 + TILE_WALKING_CREATURE, // 타일의 지상에 크리처가 있을 경우 + TILE_FLYING_CREATURE, // 타일의 공중에 크리처가 있을 경우 + TILE_BURROWING_CREATURE, // 타일의 지하에 크리처가 있을 경우 + TILE_ITEM, // 타일 위에 아이템이 놓여 있을 경우 + TILE_OBSTACLE, // 타일 위에 상태를 가진 장애물이 놓여 있을 경우 + TILE_EFFECT, // 타일 위에 마법 객체가 있을 경우 + TILE_BUILDING, // 타일 위에 건물이 있을 경우 + TILE_PORTAL, // 타일 위에 포탈이 놓여 있을 경우 + TILE_TERRAIN // 효과를 주는 배경 타일일 경우 }; public: @@ -188,10 +188,10 @@ class Tile { string toString() const; private: - WORD m_wFlags; // Ÿ Ӽ ÷ - WORD m_wOption; // ɼ ÷, Ÿ Ӽ ÷׿ ٸ ȴ. - forward_list m_Objects; // Ʈ Ʈ - Sector* m_pSector; // Ÿ Ϳ + WORD m_wFlags; // 타일 속성 플래그 + WORD m_wOption; // 옵션 플래그, 타일 속성 플래그에 따라서 다르게 사용된다. + forward_list m_Objects; // 오브젝트 포인터의 리스트 + Sector* m_pSector; // 이 타일이 속한 섹터에 대한 포인터 }; #endif diff --git a/src/server/gameserver/TimeLimitItemManager.cpp b/src/server/gameserver/TimeLimitItemManager.cpp index 2ddbeb79..b6fbe16a 100644 --- a/src/server/gameserver/TimeLimitItemManager.cpp +++ b/src/server/gameserver/TimeLimitItemManager.cpp @@ -51,10 +51,10 @@ void TimeLimitItemManager::load() __END_CATCH } -// ̺ ؼ Ʈ ̵ ش. -// true ϵ Ʈ ̵ ϵȴ. -// false ϵ Ʈ ̵ ϵ Ƿ m_ItemTimeLimits[pItem->ObjectID()] -// ܰ ߻Ѵ. +// 아이템을 테이블과 비교해서 오브젝트 아이디를 등록해준다. +// true 가 리턴될 경우 오브젝트 아이디가 등록된다. +// false 가 리턴될 경우 오브젝트가 아이디가 등록되지 않으므로 m_ItemTimeLimits[pItem->ObjectID()] 는 +// 예외가 발생한다. bool TimeLimitItemManager::registerItem(Item* pItem) { @@ -95,17 +95,17 @@ bool TimeLimitItemManager::checkTimeLimit(Item* pItem) if (itr == m_ItemTimeLimits.end()) { if (!registerItem(pItem)) { - // ð ƴϴ. - // ð ̴. + // 시간제한 아이템이 아니다. + // 즉 시간제한 무제한이다. ㅎㅎ return true; } } VSDateTime currentTime = VSDateTime::currentDateTime(); if (currentTime > m_ItemTimeLimits[objectID]) { - cout << pItem->toString() << " ð ʰ : " << currentTime.toString() << " > " + cout << pItem->toString() << " 시간제한 초과 : " << currentTime.toString() << " > " << m_ItemTimeLimits[objectID].toString() << endl; - // ð . + // 시간 제한이 지났다. return false; } @@ -187,7 +187,7 @@ bool TimeLimitItemManager::updateItemTimeLimit(Item* pItem, DWORD time) { __END_CATCH } -// ݵ Ŀ ȣؾ Ѵ. +// 반드시 존에 아이템을 등록한 후에 호출해야 한다. void TimeLimitItemManager::addTimeLimitItem(Item* pItem, DWORD time) { @@ -224,7 +224,7 @@ void TimeLimitItemManager::addTimeLimitItem(Item* pItem, DWORD time) __END_CATCH } -// ޸𸮿 ִ ִ ϴ ð ̴. +// 메모리에 있는 애는 일단 아직 시간이 남은 넘이다. bool TimeLimitItemManager::changeStatus(Item* pItem, TimeLimitStatus status) { __BEGIN_TRY @@ -261,16 +261,16 @@ bool TimeLimitItemManager::changeStatus(Item* pItem, TimeLimitStatus status) { } if (!erased) - filelog("QuestItem.log", "[%u,%u] : ð ̺ µ ޸𸮿 ϴ.", + filelog("QuestItem.log", "[%u,%u] : 시간제한 아이템을 테이블에서 지웠는데 메모리에 없습니다.", (uint)pItem->getItemClass(), (uint)pItem->getItemID()); - // -_- ObjectID..... 0̸ . ȿ θϱ ϴ 0 . + // 위험 -_- ObjectID..... 0이면 뻑난다. 아이템 팔 때는 존 안에 있을때만 부르니까 일단 0일 리가 없다. ItemTimeLimitMap::iterator itr2 = m_ItemTimeLimits.find(pItem->getObjectID()); if (itr2 != m_ItemTimeLimits.end()) { m_ItemTimeLimits.erase(itr2); } else { - filelog("QuestItem.log", "[%u,%u] : Item Time Limit Map ϴ.", (uint)pItem->getItemClass(), + filelog("QuestItem.log", "[%u,%u] : Item Time Limit Map 에도 없습니다.", (uint)pItem->getItemClass(), (uint)pItem->getItemID()); } diff --git a/src/server/gameserver/TimeManager.h b/src/server/gameserver/TimeManager.h index 1de26385..d546d9eb 100644 --- a/src/server/gameserver/TimeManager.h +++ b/src/server/gameserver/TimeManager.h @@ -23,10 +23,10 @@ #define NIGHT_END_HOUR 4 enum Timeband { - TIME_DAWN = 0, // - TIME_DAY, // - TIME_DUSK, // - TIME_NIGHT, // + TIME_DAWN = 0, // 새벽 + TIME_DAY, // 낮 + TIME_DUSK, // 저녁 + TIME_NIGHT, // 밤 TIME_MAX }; @@ -34,8 +34,8 @@ enum Timeband { ////////////////////////////////////////////////////////////////////////////// // class TimeManager; // -// ð ִ Ŵ Ŭ̴.( Ŵ ͵ . -// ܿ ٸ ͵ ... +// 현재 게임 시간을 계산해주는 매니저 클래스이다.(사실 매니저라고 할 것도 없다. +// 이 외에도 뭔가 다른 역할을 할 것도 같다... ////////////////////////////////////////////////////////////////////////////// class TimeManager { diff --git a/src/server/gameserver/TradeManager.h b/src/server/gameserver/TradeManager.h index ff3708ae..8e27b4e5 100644 --- a/src/server/gameserver/TradeManager.h +++ b/src/server/gameserver/TradeManager.h @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : TradeManager.h -// Written by : 輺 +// Written by : 김성민 // Description : //////////////////////////////////////////////////////////////////////////////// @@ -16,14 +16,14 @@ #include "Types.h" //////////////////////////////////////////////////////////////////////////////// -// ȯ ÷ +// 교환 상태 플래그 //////////////////////////////////////////////////////////////////////////////// enum { - // ű ִ + // 아이템을 옮기고 있는 상태 TRADE_TRADING, - // ű, ȯ ٸ ִ + // 아이템을 다 옮기고, 교환을 기다리고 있는 상태 TRADE_FINISH, TRADE_MAX @@ -127,7 +127,7 @@ class TradeManager { public: void initTrade(Creature* pCreature1, Creature* pCreature2); - // Ʈ̵ 0, ϸ 2, 1 + // 트레이드 할 수 없으면 0, 선물 상자 조건 때문에 못하면 2, 할 수 있으면 1 int canTrade(Creature* pCreature1, Creature* pCreature2); void processTrade(Creature* pCreature1, Creature* pCreature2); void cancelTrade(Creature* pCreature1, Creature* pCreature2); diff --git a/src/server/gameserver/Treasure.h b/src/server/gameserver/Treasure.h index 3b26c86e..d06814bc 100644 --- a/src/server/gameserver/Treasure.h +++ b/src/server/gameserver/Treasure.h @@ -144,7 +144,7 @@ class TreasureItemClass { int m_ItemTypeTotalRatio; vector m_TreasureItemTypes; - // Add By Sonic 2006.10.21 һֵ + // Add By Sonic 2006.10.21 藤속寧몸딜괜橄昑離댕令긴좆 void setRndItemOptionMax(int Value = 2) { m_OptionRatioMax = Value; } @@ -173,11 +173,11 @@ class Treasure { // XMLTree* makeXMLTree() const; public: - int m_ItemRatio; // ü Ȯ - int m_OptionRatio; // ۿ ɼ Ȯ - int m_ItemClassTotalRatio; // Ŭ Ȯ + int m_ItemRatio; // 아이템 자체가 나올 확률 + int m_OptionRatio; // 나온 아이템에 옵션이 붙을 확률 + int m_ItemClassTotalRatio; // 모든 아이템 클래스의 확률의 합 vector m_TreasureItemClasses; - // Add By Sonic 2006.10.21 һֵ + // Add By Sonic 2006.10.21 藤속寧몸딜괜橄昑離댕令긴좆 void setRndItemOptionMax(int Value = 2) { m_OptionRatioMax = Value; } diff --git a/src/server/gameserver/UniqueItemManager.cpp b/src/server/gameserver/UniqueItemManager.cpp index f6a59638..4331e97d 100644 --- a/src/server/gameserver/UniqueItemManager.cpp +++ b/src/server/gameserver/UniqueItemManager.cpp @@ -27,10 +27,10 @@ void UniqueItemManager::init() BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); - // DB о´. + // DB에서 현재의 값을 읽어온다. Result* pResult = pStmt->executeQuery("SELECT ItemClass, ItemType FROM UniqueItemInfo"); - // itemClas, itemType Unique Item Ѵ. + // 지정된 itemClas, itemType을 Unique Item으로 설정한다. while (pResult->next()) { Item::ItemClass itemClass = (Item::ItemClass)pResult->getInt(1); int itemType = pResult->getInt(2); @@ -63,7 +63,7 @@ bool UniqueItemManager::isPossibleCreate(Item::ItemClass itemClass, ItemType_t i BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); - // DB о´. + // DB에서 현재의 값을 읽어온다. Result* pResult = pStmt->executeQuery( "SELECT LimitNumber, CurrentNumber FROM UniqueItemInfo WHERE ItemClass=%d AND ItemType=%d", (int)itemClass, (int)itemType); @@ -88,7 +88,7 @@ bool UniqueItemManager::isPossibleCreate(Item::ItemClass itemClass, ItemType_t i //---------------------------------------------------------------------- // createItem //---------------------------------------------------------------------- -// DB +// DB에서 개수 증가 //---------------------------------------------------------------------- void UniqueItemManager::createItem(Item::ItemClass itemClass, ItemType_t itemType) @@ -101,7 +101,7 @@ void UniqueItemManager::createItem(Item::ItemClass itemClass, ItemType_t itemTyp BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); - // DB о´. + // DB에서 현재의 값을 읽어온다. pStmt->executeQuery( "UPDATE UniqueItemInfo SET CurrentNumber=CurrentNumber+1 WHERE ItemClass=%d AND ItemType=%d", (int)itemClass, (int)itemType); @@ -117,7 +117,7 @@ void UniqueItemManager::createItem(Item::ItemClass itemClass, ItemType_t itemTyp //---------------------------------------------------------------------- // deleteItem //---------------------------------------------------------------------- -// DB +// DB에서 개수 증가 //---------------------------------------------------------------------- void UniqueItemManager::deleteItem(Item::ItemClass itemClass, ItemType_t itemType) @@ -130,7 +130,7 @@ void UniqueItemManager::deleteItem(Item::ItemClass itemClass, ItemType_t itemTyp BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); - // DB о´. + // DB에서 현재의 값을 읽어온다. pStmt->executeQuery( "UPDATE UniqueItemInfo SET CurrentNumber=CurrentNumber-1 WHERE ItemClass=%d AND ItemType=%d", (int)itemClass, (int)itemType); diff --git a/src/server/gameserver/UniqueItemManager.h b/src/server/gameserver/UniqueItemManager.h index e88ab086..e75704cb 100644 --- a/src/server/gameserver/UniqueItemManager.h +++ b/src/server/gameserver/UniqueItemManager.h @@ -18,16 +18,16 @@ class UniqueItemManager { public: void init(); - // unique item ϳ Ѵ. + // unique item을 하나 생성한다. // Item* getRandomUniqueitem() ; - // Ѱ? ( ) + // 아이템 생성 가능한가? (아이템 개수 제한) static bool isPossibleCreate(Item::ItemClass itemClass, ItemType_t itemType); - // ߴ. ( ) + // 아이템 생성했다. (개수 변경) static void createItem(Item::ItemClass itemClass, ItemType_t itemType); - // ߴ. ( ) + // 아이템 생성했다. (개수 변경) static void deleteItem(Item::ItemClass itemClass, ItemType_t itemType); private: diff --git a/src/server/gameserver/VampEXPInfo.h b/src/server/gameserver/VampEXPInfo.h index 530ba055..54c1d214 100644 --- a/src/server/gameserver/VampEXPInfo.h +++ b/src/server/gameserver/VampEXPInfo.h @@ -44,9 +44,9 @@ class VampEXPInfo { string toString() const; private: - Level_t m_Level; // - Exp_t m_GoalExp; // ǥ ġ - Exp_t m_AccumExp; // ġ + Level_t m_Level; // 레벨 + Exp_t m_GoalExp; // 목표 경험치 + Exp_t m_AccumExp; // 누적 경험치 }; diff --git a/src/server/gameserver/Vampire.h b/src/server/gameserver/Vampire.h index 0a5c8929..c2d290cb 100644 --- a/src/server/gameserver/Vampire.h +++ b/src/server/gameserver/Vampire.h @@ -28,14 +28,14 @@ #include "skill/VampireSkillSlot.h" #define VAMPIRE_MAX_LEVEL 150 // abcd -#define VAMPIRE_MAX_RANK 50 // max -#define BONUS_POINTS_PER_LEVEL1 3 // ־ ɷġ point -#define BONUS_POINTS_PER_LEVEL2 2 // ־ ɷġ point -#define BONUS_POINTS_PER_LEVEL3 1 // ־ ɷġ point +#define VAMPIRE_MAX_RANK 50 // 계급 max +#define BONUS_POINTS_PER_LEVEL1 3 // 레벨업시 주어지는 능력치 point +#define BONUS_POINTS_PER_LEVEL2 2 // 레벨업시 주어지는 능력치 point +#define BONUS_POINTS_PER_LEVEL3 1 // 레벨업시 주어지는 능력치 point //////////////////////////////////////////////////////////////////////////////// -// ԰ ԰ ɷġ -// α (?) Ŭ +// 장비를 입고 벗을 때 장비 입고 벗기 전의 능력치를 +// 저장해 두기 위한 버퍼(?) 클래스 //////////////////////////////////////////////////////////////////////////////// class VAMPIRE_RECORD { @@ -60,11 +60,11 @@ class VAMPIRE_RECORD { class Vampire : public PlayerCreature { //////////////////////////////////////////////////// - // Ŭ + // 클래스 내부 상수 선언 //////////////////////////////////////////////////// public: public: - // + // 장착 부위 enum WearPart { WEAR_NECK, WEAR_BODY, @@ -92,14 +92,14 @@ class Vampire : public PlayerCreature { }; //////////////////////////////////////////////////// - // /Ҹ + // 생성자/소멸자 //////////////////////////////////////////////////// public: Vampire(); virtual ~Vampire(); //////////////////////////////////////////////////// - // Ŭ(Creature) Լ + // 하위 클래스(Creature) 상속 함수 //////////////////////////////////////////////////// public: virtual CreatureClass getCreatureClass() const { @@ -135,14 +135,14 @@ class Vampire : public PlayerCreature { ////////////////////////////////////////////////////////////// - // ð Լ + // 시간제한 아이템 관련 함수 ////////////////////////////////////////////////////////////// public: void checkItemTimeLimit(); void updateEventItemTime(DWORD time); //////////////////////////////////////////////////// - // Լ(Dead or Alive!) + // 상태 관련 함수(Dead or Alive!) //////////////////////////////////////////////////// public: bool isAlive() const { @@ -154,7 +154,7 @@ class Vampire : public PlayerCreature { //////////////////////////////////////////////////// - // Ѹ Լ(̸, , , Ӹ, Ǻ) + // 겉모습 관련 함수(이름, 권한, 성별, 머리, 피부) //////////////////////////////////////////////////// public: const string& getName() const { @@ -210,7 +210,7 @@ class Vampire : public PlayerCreature { } //////////////////////////////////////////////////// - // ɷġ Լ(STR, DEX, INT) + // 능력치 관련 함수(STR, DEX, INT) //////////////////////////////////////////////////// public: Alignment_t getAlignment() const { @@ -243,7 +243,7 @@ class Vampire : public PlayerCreature { } //////////////////////////////////////////////////// - // ɷġ Լ(HP) + // 능력치 관련 함수(HP) //////////////////////////////////////////////////// public: HP_t getHP(AttrType attrType = ATTR_CURRENT) const { @@ -258,7 +258,7 @@ class Vampire : public PlayerCreature { } //////////////////////////////////////////////////// - // ɷġ Լ(Damage, Protect, Defense, ToHit) + // 능력치 관련 함수(Damage, Protect, Defense, ToHit) //////////////////////////////////////////////////// public: Damage_t getDamage(AttrType attrType = ATTR_CURRENT) const { @@ -278,7 +278,7 @@ class Vampire : public PlayerCreature { } //////////////////////////////////////////////////// - // ġ Լ + // 경험치 관련 함수 //////////////////////////////////////////////////// public: // Exp_t getExp() const { return m_Exp; } @@ -307,7 +307,7 @@ class Vampire : public PlayerCreature { return getLevel(); } - // . by sigi. 2002.8.30 + // 계급. by sigi. 2002.8.30 /* Rank_t getRank() const { return m_Rank; } // void setRank(Rank_t rank) { m_Rank = rank; } RankExp_t getRankExp() const { return m_RankExp; } @@ -324,7 +324,7 @@ class Vampire : public PlayerCreature { } //////////////////////////////////////////////////// - // ų Լ + // 스킬 관련 함수 //////////////////////////////////////////////////// public: void addSkill(SkillType_t SkillType); @@ -341,7 +341,7 @@ class Vampire : public PlayerCreature { //////////////////////////////////////////////////// - // /Ż Լ + // 아이템 착/탈 관련 함수 //////////////////////////////////////////////////// public: bool isWear(WearPart Part) { @@ -378,7 +378,7 @@ class Vampire : public PlayerCreature { void getShapeInfo(DWORD& flag, Color_t color[PCVampireInfo::VAMPIRE_COLOR_MAX]) const; //////////////////////////////////////////////////// - // /Ż ɷġ Լ + // 아이템 착/탈시 능력치 수정 관련 함수 //////////////////////////////////////////////////// public: void initAllStat(int numPartyMember = -1); @@ -396,7 +396,7 @@ class Vampire : public PlayerCreature { ////////////////////////////////////////////////////////////// - // ˻ Լ + // 아이템 검색 함수 ////////////////////////////////////////////////////////////// public: virtual Item* findItemOID(ObjectID_t id) { @@ -428,7 +428,7 @@ class Vampire : public PlayerCreature { } //////////////////////////////////////////////////// - // Լ + // 인포 관련 함수 //////////////////////////////////////////////////// public: PCVampireInfo2* getVampireInfo2(); @@ -440,7 +440,7 @@ class Vampire : public PlayerCreature { //////////////////////////////////////////////////// - // Ÿ Լ + // 기타 함수 //////////////////////////////////////////////////// public: virtual Gold_t getGold() const { @@ -578,7 +578,7 @@ class Vampire : public PlayerCreature { // PC Name string m_Name; - // + // 권한 BYTE m_Competence; BYTE m_CompetenceShape; @@ -615,7 +615,7 @@ class Vampire : public PlayerCreature { // level Level_t m_Level; - // . by sigi. 2002.8.30 + // 계급. by sigi. 2002.8.30 // Rank_t m_Rank; // RankExp_t m_RankExp; // RankExp_t m_RankGoalExp; @@ -650,20 +650,20 @@ class Vampire : public PlayerCreature { // mutable Thread Mutex mutable Mutex m_Mutex; - // Ȱ + // 부활존 관련 ZoneID_t m_ResurrectZoneID; - // + // 은 도금 데미지 관련 Silver_t m_SilverDamage; - // HP ƿ + // HP 스틸 Steal_t m_HPStealAmount; Steal_t m_HPStealRatio; - // HP + // HP 재생 Regen_t m_HPRegen; - // HP ʽ Ʈ. ʴ ö󰡴 ʽ Ʈ + // HP 재생 보너스 포인트. 초당 올라가는 보너스 포인트 Regen_t m_HPRegenBonus; Luck_t m_Luck; @@ -672,7 +672,7 @@ class Vampire : public PlayerCreature { ClanType_t m_ClanType; - // ġ ̺ īƮ + // 각종 경험치 세이브 카운트 // WORD m_RankExpSaveCount; WORD m_ExpSaveCount; WORD m_FameSaveCount; diff --git a/src/server/gameserver/VampireCorpse.h b/src/server/gameserver/VampireCorpse.h index fcf6b59c..76279479 100644 --- a/src/server/gameserver/VampireCorpse.h +++ b/src/server/gameserver/VampireCorpse.h @@ -16,7 +16,7 @@ class Vampire; ////////////////////////////////////////////////////////////////////////////// // class VampireCorpse; -// ̾ ׾ , ü̴. +// 뱀파이어가 죽었을 경우, 남기는 시체이다. ////////////////////////////////////////////////////////////////////////////// class VampireCorpse : public Corpse { @@ -67,7 +67,7 @@ class VampireCorpse : public Corpse { } protected: - PCVampireInfo3 m_VampireInfo; // ü ܸ + PCVampireInfo3 m_VampireInfo; // 시체의 외모에 대한 정보 }; #endif diff --git a/src/server/gameserver/Vampire_backup.cpp b/src/server/gameserver/Vampire_backup.cpp index a8d22eed..5e793f63 100644 --- a/src/server/gameserver/Vampire_backup.cpp +++ b/src/server/gameserver/Vampire_backup.cpp @@ -62,7 +62,7 @@ void increaseVampExpEx(Vampire* pVampire, Exp_t Point) { Exp_t OldGoalExp = pVampire->getGoalExp(); Exp_t NewGoalExp = max(0, (int)(OldGoalExp - Point)); - // ġ ǥ ġ پ ŭ ÷ Ͽ Ѵ. + // 누적 경험치에는 목표 경험치가 줄어든 만큼 플러스 하여야 한다. Exp_t DiffGoalExp = max(0, (int)(OldGoalExp - NewGoalExp)); Exp_t NewExp = OldExp + DiffGoalExp; @@ -82,7 +82,7 @@ void increaseVampExpEx(Vampire* pVampire, Exp_t Point) { pVampire->setExp(NewExp); pVampire->setGoalExp(NewGoalExp); - // ǥ ġ 0 ̶ ̴. + // 목표 경험치가 0 이라면 레벨 업이다. if (NewGoalExp == 0 && curLevel < 115) { VAMPIRE_RECORD prev; pVampire->getVampireRecord(prev); @@ -96,8 +96,8 @@ void increaseVampExpEx(Vampire* pVampire, Exp_t Point) { if ((pVampire->getSTR(ATTR_BASIC) + pVampire->getDEX(ATTR_BASIC) + pVampire->getINT(ATTR_BASIC) + pVampire->getBonus() - 60) < ((pVampire->getLevel() - 1) * 3)) { - // ġ ʰ, 3 Ǿ. - // 2001.12.12 輺 + // 레벨에 상관치 않고, 무조건 3으로 변경되었다. + // 2001.12.12 김성민 bonus += 3; } @@ -132,7 +132,7 @@ Vampire::Vampire() m_Mutex.setName("Vampire"); - // AttackMelee ⺻ ־ش. + // AttackMelee 같은 기본 공격을 집어넣어준다. for (int i = 0; i < SKILL_DOUBLE_IMPACT; i++) { VampireSkillSlot* pVampireSkillSlot = new VampireSkillSlot; // pVampireSkillSlot = new VampireSkillSlot; // 2002.1.16 by sigi @@ -147,7 +147,7 @@ Vampire::Vampire() for (int i = 0; i < VAMPIRE_WEAR_MAX; i++) m_pWearItem[i] = NULL; - // Ű ʱȭ Ѵ. + // 핫 키를 초기화 한다. for (int i = 0; i < 8; i++) { m_HotKey[i] = 0; } @@ -155,10 +155,10 @@ Vampire::Vampire() m_SilverDamage = 0; m_ClanType = 0; - // HP ð ʱȭ + // HP 리젠 시간 초기화 getCurrentTime(m_HPRegenTime); - // ġ ̺ īƮ ʱȭ + // 경험치 세이브 카운트 초기화 m_ExpSaveCount = 0; m_FameSaveCount = 0; m_AlignmentSaveCount = 0; @@ -171,7 +171,7 @@ Vampire::~Vampire() { __BEGIN_TRY - // صд. by sigi. 2002.6.18 + // 복장 정보를 생성해둔다. by sigi. 2002.6.18 DWORD flag; Color_t color[PCVampireInfo::VAMPIRE_COLOR_MAX]; getShapeInfo(flag, color); @@ -184,32 +184,32 @@ Vampire::~Vampire() tinysave(pField); - // ġ, Ѵ. + // 떨어진 아이템의 내구성과 경험치, 성향 등을 저장한다. saveGears(); saveExps(); saveSkills(); - // ԰ ִ ޸𸮿 Ѵ. + // 입고 있는 아이템을 메모리에서 삭제한다. destroyGears(); - // Ŭ , شϴ ȯ ؾ , - // ȯ 뿡Ե ˷ Ѵ. + // 클래스가 삭제될 경우, 해당하는 교환 정보를 삭제해야 함은 물론, + // 교환 상대에게도 이 사실을 알려줘야 한다. TradeManager* pTradeManager = m_pZone->getTradeManager(); TradeInfo* pInfo = pTradeManager->getTradeInfo(getName()); if (pInfo != NULL) { - // ȯ + // 교환 정보를 삭제 pTradeManager->cancelTrade(this); } - // ۷ι Ƽ Ѵ. - // Ϲ α׾ƿ 쿡 - // CGLogoutHandler Zone::deleteCreature() Լ θ ǰ, - // ص, - // GamePlayer::disconnect() Zone::deleteCreature() Լ θ ǹǷ, - // Ƽ Ƽ ʴ, Ʈ̵ ʿ . + // 글로벌 파티 정보를 삭제한다. + // 일반적인 로그아웃의 경우에는 + // CGLogoutHandler에서 Zone::deleteCreature() 함수를 부르게 되고, + // 비정상적인 경우라고 해도, + // GamePlayer::disconnect()에서 Zone::deleteCreature() 함수를 부르게 되므로, + // 로컬 파티 및 파티 초대, 트레이드 정보를 걱정할 필요는 없다. deleteAllPartyInfo(this); - // + // 기술들을 삭제 unordered_map::iterator itr = m_SkillSlot.begin(); for (; itr != m_SkillSlot.end(); itr++) { VampireSkillSlot* pVampireSkillSlot = itr->second; @@ -220,8 +220,8 @@ Vampire::~Vampire() } // registerObject -// Zone ӵ ObjectRegistry ؼ, Vampire ۵ -// ObjectID Ҵ޴´. +// Zone에 종속된 ObjectRegistry를 사용해서, Vampire 와 소유아이템들의 +// ObjectID를 할당받는다. void Vampire::registerObject() { @@ -229,25 +229,25 @@ void Vampire::registerObject() Assert(getZone() != NULL); - // zone object registery Ѵ. + // zone 의 object registery 에 접근한다. ObjectRegistry& OR = getZone()->getObjectRegistry(); __ENTER_CRITICAL_SECTION(OR) - // 켱 ̾ OID Ϲ޴´. + // 우선 뱀파이어의 OID를 등록받는다. OR.registerObject_NOLOCKED(this); - // κ丮 ۵ OID Ϲ޴´. + // 인벤토리의 아이템들의 OID를 등록받는다. registerInventory(OR); - // ϰ ִ ۵ OID Ϲ޴´. + // 장착하고 있는 아이템들의 OID를 등록받는다. for (int i = 0; i < VAMPIRE_WEAR_MAX; i++) { Item* pItem = m_pWearItem[i]; if (pItem != NULL) registerItem(pItem, OR); } - // 콺 ִ OID ޴´. + // 마우스에 들고 있는 아이템의 OID를 등록 받는다. Item* pSlotItem = m_pExtraInventorySlot->getItem(); if (pSlotItem != NULL) registerItem(pSlotItem, OR); @@ -262,26 +262,26 @@ void Vampire::registerObject() } /////////////////////////////////////////// -// Vampire Slayer ؼ -// ε óѴ. +// Vampire와 Slayer사이의 변신을 위해서 +// 아템 로딩은 따로 처리한다. // void Vampire::loadItem() { __BEGIN_TRY - // κ丮 Ѵ. + // 인벤토리를 생성한다. SAFE_DELETE(m_pInventory); m_pInventory = new Inventory(10, 6); m_pInventory->setOwner(getName()); - // εѴ. + // 아이템을 로드한다. g_pItemLoaderManager->load(this); - // ε ۵ ϽŰ + // 로드한 아이템들을 등록시키고 registerObject(); - // ԰ ִ ʿ ɷġ ش. + // 입고 있는 옷에 따라 능력치를 계산해준다. initAllStat(); __END_CATCH @@ -312,8 +312,8 @@ bool Vampire::load() m_Name.c_str()); if (pResult->getRowCount() == 0) { - // throw Error("Critical Error : data intergrity broken. (α Ѿ ȿ - // ijͰ Ǿϴ.)"); + // throw Error("Critical Error : data intergrity broken. (로그인 서버에서 게임 서버로 넘어오는 동안에 + // 캐릭터가 삭제되었습니다.)"); SAFE_DELETE(pStmt); return false; } @@ -380,9 +380,9 @@ bool Vampire::load() reward = pResult->getInt(++i); - // maxHP ٽ ؼ ش. + // maxHP를 다시 계산해서 설정해준다. // 2002.7.15 by sigi - // ٲ AbilityBalance.cpp computeHP ؾѴ. + // 공식 바뀌면 AbilityBalance.cpp의 computeHP도 수정해야한다. int maxHP = m_STR[ATTR_CURRENT] * 2 + m_INT[ATTR_CURRENT] + m_DEX[ATTR_CURRENT] / 2 + m_Level; maxHP = min((int)maxHP, VAMPIRE_MAX_HP); setHP(maxHP, ATTR_MAX); @@ -390,9 +390,9 @@ bool Vampire::load() try { setZoneID(zoneID); } catch (Error& e) { - // Ʈ . - // Ʈ ϹǷ ٸ Ӽ Ʈ  Ѵ. - // Ʈ Ա ű. + // 길드 아지트 문제로 본다. + // 길드 아지트가 한 게임 서버에만 존재하므로 다른 게임서버로 접속할 때 그 아지트로 들어가지 못한다. + // 길드 아지트 입구로 옮긴다. setZoneID(1003); setX(30); setY(30); @@ -432,9 +432,9 @@ bool Vampire::load() } //---------------------------------------------------------------------- - // Vampire Outlook Information Ѵ. + // Vampire Outlook Information 을 구성한다. //---------------------------------------------------------------------- - // ̾ εҶ ObjectID ϵ Ѵ. ٵ Ҷ? -_- + // 뱀파이어는 로딩할때 ObjectID를 세팅 하도록 한다. 근데 접속 할땐? -_- m_VampireInfo.setObjectID(m_ObjectID); m_VampireInfo.setName(m_Name); m_VampireInfo.setSex(m_Sex); @@ -444,7 +444,7 @@ bool Vampire::load() m_VampireInfo.setCompetence(m_CompetenceShape); //---------------------------------------------------------------------- - // ų εѴ. + // 스킬을 로딩한다. //---------------------------------------------------------------------- BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); @@ -475,17 +475,17 @@ bool Vampire::load() END_DB(pStmt) //---------------------------------------------------------------------- - // Ʈ εѴ. + // 이펙트를 로딩한다. //---------------------------------------------------------------------- g_pEffectLoaderManager->load(this); //---------------------------------------------------------------------- - // ÷ εѴ. + // 플래그 셋을 로드한다. //---------------------------------------------------------------------- m_pFlagSet->load(getName()); //---------------------------------------------------------------------- - // Vampire Outlook Information ʱȭѴ. + // Vampire Outlook Information 을 초기화한다. //---------------------------------------------------------------------- /* ItemType_t coatType = 0; @@ -501,24 +501,24 @@ bool Vampire::load() m_VampireInfo.setCoatColor(377); // m_VampireInfo.setCoatColor(2 , SUB_COLOR); - // ߸ ġ ش. + // 잘못된 경험치를 재조정 해준다. VampEXPInfo* pVampEXPInfo = g_pVampEXPInfoManager->getVampEXPInfo(m_Level); if ((pVampEXPInfo->getAccumExp() != m_Exp + m_GoalExp) && m_Level > 1) { - // ofstream file("ɷġ.txt", ios::out | ios::app); + // ofstream file("뱀프능력치조정.txt", ios::out | ios::app); // file << "NAME:" << m_Name << endl; // file << "==VampEXP==" << endl; - // file << "緹Ѱġ : " << (int)pVampEXPInfo->getAccumExp() << endl; - // file << " ġ : " << (int)m_Exp << endl; - // file << " ǥ ġ : " << (int)m_GoalExp << endl; + // file << "현재레벨의총경험치 : " << (int)pVampEXPInfo->getAccumExp() << endl; + // file << "현재 누적 경험치 : " << (int)m_Exp << endl; + // file << "현재 목표 경험치 : " << (int)m_GoalExp << endl; - // ޾ƿ´. + // 이전 레벨의 인포를 받아온다. VampEXPInfo* pBeforeVampEXPInfo = g_pVampEXPInfoManager->getVampEXPInfo(m_Level - 1); - // ġ + ǥ ġ ȭ = ġ + // 이전 레벨의 총 경험치 + 목표 경험치 변화량 = 현재 누적 경험치 m_Exp = pBeforeVampEXPInfo->getAccumExp() + (pVampEXPInfo->getGoalExp() - m_GoalExp); - // file << " ġ : " << (int)m_Exp << endl; - // file << " ǥ ġ : " << (int)m_GoalExp << endl; + // file << "수정된 누적 경험치 : " << (int)m_Exp << endl; + // file << "수정된 목표 경험치 : " << (int)m_GoalExp << endl; // file << endl; // file.close(); @@ -553,7 +553,7 @@ void Vampire::save() const Statement* pStmt; //-------------------------------------------------------------------------------- - // ̾ Ѵ. + // 뱀파이어 정보를 저장한다. //-------------------------------------------------------------------------------- BEGIN_DB { StringStream sql; @@ -591,17 +591,17 @@ void Vampire::save() const /* //---------------------------------------------------------------------- - // ̺Ѵ. + // 아이템을 세이브한다. //---------------------------------------------------------------------- //-------------------------------------------------- - // κ丮 ۵ ̺ Ѵ. + // 인벤토리의 아이템들을 세이브 한다. //-------------------------------------------------- m_pInventory->save(m_Name); */ //-------------------------------------------------- - // Ʈ ̺ Ѵ. + // 이펙트를 세이브 한다. //-------------------------------------------------- m_pEffectManager->save(m_Name); @@ -632,12 +632,12 @@ void Vampire::tinysave(const char* field) // by sigi. 2002.5.15 //////////////////////////////////////////////////////////////////////////////// // // -// ų Լ +// 스킬 관련 함수 // // //////////////////////////////////////////////////////////////////////////////// -// Ư Skill Ѵ. +// 특정 Skill을 리턴한다. VampireSkillSlot* Vampire::getSkill(SkillType_t SkillType) const { @@ -653,7 +653,7 @@ VampireSkillSlot* Vampire::getSkill(SkillType_t SkillType) const __END_CATCH } -// Ư Skill add Ѵ +// 특정 Skill을 add 한다 void Vampire::addSkill(SkillType_t SkillType) { @@ -693,7 +693,7 @@ void Vampire::addSkill(SkillType_t SkillType) __END_CATCH } -// Ư SkillSlot ڵ ã ִ´. +// 특정 SkillSlot을 자동으로 빈 슬랏을 찾아 넣는다. void Vampire::addSkill(VampireSkillSlot* pVampireSkillSlot) { @@ -731,7 +731,7 @@ void Vampire::addSkill(VampireSkillSlot* pVampireSkillSlot) //////////////////////////////////////////////////////////////////////////////// // // -// /Ż Լ +// 아이템 착/탈 관련 함수 // // //////////////////////////////////////////////////////////////////////////////// @@ -740,7 +740,7 @@ void Vampire::addSkill(VampireSkillSlot* pVampireSkillSlot) // // Vampire::WearItem() // -// Item â Ű ɷġ Ѵ. +// Item을 장착창에 장착시키고 능력치를 계산한다. // //---------------------------------------------------------------------- void Vampire::wearItem(WearPart Part, Item* pItem) @@ -752,9 +752,9 @@ void Vampire::wearItem(WearPart Part, Item* pItem) Item* pPrevItem = NULL; - // ȹ...ɷġ ڶ - // ִ. ۿ ɷġ ʴ´. - // ׷Ƿ ϴ شϴ â ִ´. + // 현재 기획에서는...능력치가 모자라더라도 아이템을 무조건 사용할 수는 + // 있다. 하지만 아이템에 의한 능력치가 적용이 되지 않는다. + // 그러므로 일단 아이템을 해당하는 장착창에다 집어넣는다. if (isWear(Part)) { pPrevItem = getWearItem(Part); m_pWearItem[Part] = pItem; @@ -770,7 +770,7 @@ void Vampire::wearItem(WearPart Part, Item* pItem) sprintf(pField, "Storage=%d", STORAGE_EXTRASLOT); pPrevItem->tinysave(pField); } else { - // 䱸 Ʈ ִ´. + // 요구한 아이템을 장착 포인트에 넣는다. m_pWearItem[Part] = pItem; // by sigi. 2002.5.15 @@ -780,23 +780,23 @@ void Vampire::wearItem(WearPart Part, Item* pItem) pItem->tinysave(pField); } - // ̶ ʿ ش. - // ߿ Ÿ ϴµ, - // μ Ÿ ϳ̹Ƿ, ش. + // 옷이라면 옷에 따른 색깔을 정해준다. + // 나중에라도 옷 타입이 여러 가지가 될 수 있으리라 생각하는데, + // 현재로서는 옷 타입이 하나이므로, 색깔만 세팅해준다. if (pItem->getItemClass() == Item::ITEM_CLASS_VAMPIRE_COAT) { OptionInfo* pOptionInfo = NULL; - // ɼ ִ ̶ ɼ ... + // 옵션이 있는 옷이라면 옵션 색깔을... if (pItem->getOptionType() != 0) { pOptionInfo = g_pOptionInfoManager->getOptionInfo(pItem->getOptionType()); m_VampireInfo.setCoatColor(pOptionInfo->getColor()); } - // ɼ ̶ ɼ ... + // 옵션이 없는 옷이라면 옵션이 없는 색깔을... else { m_VampireInfo.setCoatColor(377); } - // item type ش. + // item type을 설정해준다. ItemType_t IType = pItem->getItemType(); m_VampireInfo.setCoatType(IType); } @@ -807,27 +807,27 @@ void Vampire::wearItem(WearPart Part, Item* pItem) //---------------------------------------------------------------------- // Vampire::WearItem() -// Item â Ű ɷġ Ѵ. +// Item을 장착창에 장착시키고 능력치를 계산한다. //---------------------------------------------------------------------- void Vampire::wearItem(WearPart Part) { __BEGIN_TRY - // غ ޾ƿ´. + // 장착 준비중인 아이템을 받아온다. Item* pItem = getExtraInventorySlotItem(); Assert(pItem != NULL); Item* pPrevItem = NULL; - // ų, ɷġ ۿ д. - // ̴ ߿ ɷġ ϱ ̴. + // 먼저 옷을 입히거나, 벗기기 전에 현재의 능력치를 버퍼에다 저장해 둔다. + // 이는 나중에 변한 능력치만을 전송하기 위한 것이다. VAMPIRE_RECORD prev; getVampireRecord(prev); - // ȹ...ɷġ ڶ - // ִ. ۿ ɷġ ʴ´. - // ׷Ƿ ϴ شϴ â ִ´. + // 현재 기획에서는...능력치가 모자라더라도 아이템을 무조건 사용할 수는 + // 있다. 하지만 아이템에 의한 능력치가 적용이 되지 않는다. + // 그러므로 일단 아이템을 해당하는 장착창에다 집어넣는다. char pField[80]; if (isWear(Part)) { @@ -860,25 +860,25 @@ void Vampire::wearItem(WearPart Part) sendRealWearingInfo(); sendModifyInfo(prev); - // ̶ ʿ ش. - // ߿ Ÿ ϴµ, - // μ Ÿ ϳ̹Ƿ, ش. + // 옷이라면 옷에 따른 색깔을 정해준다. + // 나중에라도 옷 타입이 여러 가지가 될 수 있으리라 생각하는데, + // 현재로서는 옷 타입이 하나이므로, 색깔만 세팅해준다. if (pItem->getItemClass() == Item::ITEM_CLASS_VAMPIRE_COAT) { OptionInfo* pOptionInfo = NULL; - // ɼ ִ ̶ ɼ ... + // 옵션이 있는 옷이라면 옵션 색깔을... if (pItem->getOptionType() != 0) { pOptionInfo = g_pOptionInfoManager->getOptionInfo(pItem->getOptionType()); m_VampireInfo.setCoatColor(pOptionInfo->getColor()); } - // ɼ ̶ ɼ ... + // 옵션이 없는 옷이라면 옵션이 없는 색깔을... else { m_VampireInfo.setCoatColor(377); } m_VampireInfo.setCoatType(pItem->getItemType()); - // Ծ, ٰ Ծٰ . + // 옷을 갈아입었으니, 주위에다가 옷 갈아입었다고 정보를 날린다. GCChangeShape pkt; pkt.setObjectID(getObjectID()); pkt.setItemClass(Item::ITEM_CLASS_VAMPIRE_COAT); @@ -915,16 +915,16 @@ void Vampire::takeOffItem(WearPart Part, bool bAddOnMouse, bool bSendModifyInfo) VAMPIRE_RECORD prev; - // â ִ ޾ƿ´. + // 장착창에 있는 아이템을 받아온다. Item* pItem = m_pWearItem[Part]; Assert(pItem != NULL); m_pWearItem[Part] = NULL; - // wearItem ̹ ԰ ִ 쿡, װ - // ٽ µ, ׷ Ŷ ѹ, Ծ ٽ Ŷ - // ѹ, Ŷ ȴ. װ ϱ ؼ - // bool ϳ ־. -- 2002.01.24 輺 + // wearItem에서 지정된 슬랏에 옷을 이미 입고 있는 경우에, 그것을 벗기고 + // 다시 옷을 입히는데, 그러면 벗길 때 패킷을 한번, 입었을 때 다시 패킷을 + // 한번, 총 두 번의 패킷을 보내게 된다. 그것을 방지하기 위해서 + // bool 변수를 하나 집어넣었다. -- 2002.01.24 김성민 if (bSendModifyInfo) { getVampireRecord(prev); initAllStat(); @@ -935,13 +935,13 @@ void Vampire::takeOffItem(WearPart Part, bool bAddOnMouse, bool bSendModifyInfo) } //--------------------------------------------- - // ־ ȵ üũ -_-; ӽ - // 콺 Ŀ ޾ش. + // 있어선 안될 체크 -_-; 임시 땜빵 + // 아이템을 마우스 커서에다 달아준당. //--------------------------------------------- if (bAddOnMouse) { addItemToExtraInventorySlot(pItem); // pItem->save(m_Name, STORAGE_EXTRASLOT, 0, 0, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 char pField[80]; sprintf(pField, "Storage=%d, Durability=%d", STORAGE_EXTRASLOT, pItem->getDurability()); pItem->tinysave(pField); @@ -972,7 +972,7 @@ void Vampire::takeOffItem(WearPart Part, bool bAddOnMouse, bool bSendModifyInfo) //---------------------------------------------------------------------- // destroyGears -// Delete Ѵ. +// 장착 아이템을 Delete 한다. //---------------------------------------------------------------------- void Vampire::destroyGears() @@ -986,7 +986,7 @@ void Vampire::destroyGears() Item::ItemClass IClass = pItem->getItemClass(); //------------------------------------------------------------- - // ̾ ԰ ִ ̻ ڽ Ʈ + // 슬레이어용 아이템을 입고 있는 이상한 자식이 있으면 다 어서트 //------------------------------------------------------------- Assert(IClass != Item::ITEM_CLASS_AR); Assert(IClass != Item::ITEM_CLASS_SR); @@ -1044,15 +1044,15 @@ bool Vampire::isRealWearing(Item* pItem) const Level_t ReqLevel = pItemInfo->getReqLevel(); Attr_t ReqGender = pItemInfo->getReqGender(); - // ɼ ִٸ, - // ɼ ɷġ ÷ش. + // 아이템이 옵션을 가지고 있다면, + // 옵션의 종류에 따라서 능력치 제한을 올려준다. if (pItem->getOptionType() != 0) { OptionInfo* pOptionInfo = g_pOptionInfoManager->getOptionInfo(pItem->getOptionType()); ReqLevel += pOptionInfo->getReqLevel(); } - // ɷġ ϳ ִٸ, - // ɷ Ű ˻ؾ Ѵ. + // 능력치 제한이 하나라도 있다면, + // 그 능력을 만족시키는지 검사해야 한다. if (ReqLevel > 0 || ReqGender != GENDER_BOTH) { if (ReqLevel > 0 && m_Level < ReqLevel) return false; @@ -1101,7 +1101,7 @@ DWORD Vampire::sendRealWearingInfo(void) const //////////////////////////////////////////////////////////////////////////////// // // -// Լ +// 인포 관련 함수 // // //////////////////////////////////////////////////////////////////////////////// @@ -1121,10 +1121,10 @@ PCVampireInfo2* Vampire::getVampireInfo2() pInfo->setHairColor(m_HairColor); pInfo->setSkinColor(m_SkinColor); - // + // 성향 pInfo->setAlignment(m_Alignment); - // ɷġ + // 능력치 pInfo->setSTR(m_STR[ATTR_CURRENT], ATTR_CURRENT); pInfo->setSTR(m_STR[ATTR_MAX], ATTR_MAX); pInfo->setSTR(m_STR[ATTR_BASIC], ATTR_BASIC); @@ -1249,13 +1249,13 @@ ExtraInfo* Vampire::getExtraInfo() const pExtraSlotInfo->setItemNum(pItem->getNum()); } - // Ʈ Sub ߰ ʿϴ. + // 벨트라면 Sub 아이템의 추가 정보가 필요하다. if (IClass == Item::ITEM_CLASS_BELT) { Belt* pBelt = dynamic_cast(pItem); Inventory* pBeltInventory = ((Belt*)pItem)->getInventory(); BYTE SubItemCount = 0; - // ڸŭ о δ. + // 포켓의 숫자만큼 아이템의 정보를 읽어 들인다. for (int i = 0; i < pBelt->getPocketCount(); i++) { Item* pBeltItem = pBeltInventory->getItem(i, 0); @@ -1276,7 +1276,7 @@ ExtraInfo* Vampire::getExtraInfo() const pExtraSlotInfo->setListNum(SubItemCount); } - // Main Color ׳ 0 صд. + // 상의 하의 Main Color 지금은 그냥 0 으로 셋팅 해둔다. pExtraSlotInfo->setMainColor(0); pExtraInfo->addListElement(pExtraSlotInfo); @@ -1323,21 +1323,21 @@ GearInfo* Vampire::getGearInfo() const pGearSlotInfo->setEnchantLevel(pItem->getEnchantLevel()); /* - // Ʈ Sub ߰ ʿϴ. + // 벨트라면 Sub 아이템의 추가 정보가 필요하다. if (IClass == Item::ITEM_CLASS_BELT) { - // ޾ƿ´. + // 아이템 인포를 받아온다. ItemInfo* pItemInfo = g_pItemInfoManager->getItemInfo(pItem->getItemClass(), pItem->getItemType()); - // ڸ ޾ƿ´. + // 포켓의 숫자를 받아온다. BYTE PocketNum = ((BeltInfo*)pItemInfo)->getPocketCount(); - // Ʈ κ丮 ޾ƿ´. + // 벨트의 인벤토리를 받아온다. Inventory* pBeltInventory = ((Belt*)pItem)->getInventory(); BYTE SubItemCount = 0; - // ڸŭ о δ. + // 포켓의 숫자만큼 아이템의 정보를 읽어 들인다. for (int i = 0; i < PocketNum ; i++) { Item* pBeltItem = pBeltInventory->getItem(i, 0); @@ -1363,7 +1363,7 @@ GearInfo* Vampire::getGearInfo() const pGearSlotInfo->setSlotID(i); - // Main Color ׳ 0 صд. + // 상의 하의 Main Color 지금은 그냥 0 으로 셋팅 해둔다. pGearSlotInfo->setMainColor(0); pGearInfo->addListElement(pGearSlotInfo); @@ -1407,7 +1407,7 @@ InventoryInfo* Vampire::getInventoryInfo() const if (itr == ItemList.end()) { ItemList.push_back(pItem); - // InventorySlotInfo + // InventorySlotInfo를 구성 InventorySlotInfo* pInventorySlotInfo = new InventorySlotInfo(); pInventorySlotInfo->setObjectID(pItem->getObjectID()); pInventorySlotInfo->setItemClass(pItem->getItemClass()); @@ -1434,14 +1434,14 @@ InventoryInfo* Vampire::getInventoryInfo() const pInventorySlotInfo->setItemNum(pSR->getBulletCount()); } - // Ʈ Sub ߰ ʿϴ. + // 벨트라면 Sub 아이템의 추가 정보가 필요하다. if (IClass == Item::ITEM_CLASS_BELT) { Belt* pBelt = dynamic_cast(pItem); Inventory* pBeltInventory = ((Belt*)pItem)->getInventory(); BYTE SubItemCount = 0; - // ڸŭ о δ. + // 포켓의 숫자만큼 아이템의 정보를 읽어 들인다. for (int i = 0; i < pBelt->getPocketCount(); i++) { Item* pBeltItem = pBeltInventory->getItem(i, 0); if (pBeltItem != NULL) { @@ -1497,7 +1497,7 @@ void Vampire::sendVampireSkillInfo() VampireSkillSlot* pVampireSkillSlot = itr->second; Assert(pVampireSkillSlot != NULL); - // AttackMelee ⺻ ʾƾ Ѵ. + // AttackMelee 등의 기본 공격 기술 정보는 보내주지 않아야 한다. if (pVampireSkillSlot->getSkillType() >= SKILL_DOUBLE_IMPACT) { SubVampireSkillInfo* pSubVampireSkillInfo = new SubVampireSkillInfo(); pSubVampireSkillInfo->setSkillType(pVampireSkillSlot->getSkillType()); @@ -1514,9 +1514,9 @@ void Vampire::sendVampireSkillInfo() gcSkillInfo.setPCType(PC_VAMPIRE); SkillType_t LearnSkillType = g_pSkillInfoManager->getSkillTypeByLevel(SKILL_DOMAIN_VAMPIRE, m_Level); - // ִ ִ . + // 현재 레벨에서 배울 수 있는 기술이 있는지 본다. if (LearnSkillType != 0) { - // ִ ְ ¶ ˷ش. + // 배울 수 있는 기술이 있고 배우지 않은 상태라면 배우라고 알려준다. if (hasSkill(LearnSkillType) == NULL) { pVampireSkillInfo->setLearnNewSkill(true); } @@ -1536,7 +1536,7 @@ void Vampire::sendVampireSkillInfo() //////////////////////////////////////////////////////////////////////////////// // // -// Ÿ Լ +// 기타 함수 // // //////////////////////////////////////////////////////////////////////////////// @@ -1585,7 +1585,7 @@ void Vampire::saveSilverDamage(Silver_t damage) } ////////////////////////////////////////////////////////////////////////////// -// hearbeat +// 소유 아이템 hearbeat ////////////////////////////////////////////////////////////////////////////// void Vampire::heartbeat(const Timeval& currentTime) @@ -1593,14 +1593,14 @@ void Vampire::heartbeat(const Timeval& currentTime) __BEGIN_TRY __BEGIN_DEBUG - // ֱ HP ȸش. + // 주기적으로 HP를 회복시켜준다. if (m_HPRegenTime < currentTime) { Timeval diffTime = timediff(currentTime, m_HPRegenTime); if (diffTime.tv_sec > 0) { - // 1. ִ ̰ ( HP 0 ʰ) - // 2. ڸ Ʈ پ ʴٸ. - // 3. Mephisto Ʈ پ ʴٸ. + // 1. 살아있는 상태이고 (현재 HP가 0 초과) + // 2. 코마 이펙트가 붙어있지 않다면. + // 3. Mephisto 이펙트가 붙어있지 않다면. if (isAlive() && !isFlag(Effect::EFFECT_CLASS_COMA) && !isFlag(Effect::EFFECT_CLASS_MEPHISTO)) { // by sigi. 2002.6.19 bool bInCasket = isFlag(Effect::EFFECT_CLASS_CASKET); @@ -1608,14 +1608,14 @@ void Vampire::heartbeat(const Timeval& currentTime) HP_t CurHP = m_HP[ATTR_CURRENT]; HP_t NewHP = 0; - // ӿ ִ - // SilverDamage ġѴ. + // 관 속에 있는 경우는 + // SilverDamage를 먼저 치료한다. if (bInCasket && m_SilverDamage > 0) { NewHP = 4 * diffTime.tv_sec; int remainSilver = (int)m_SilverDamage - (int)NewHP; - // SilverDamage ġϰ HP ġϴ + // SilverDamage를 다 치료하고 HP도 치료하는 경우 if (remainSilver < 0) { m_SilverDamage = 0; NewHP = -remainSilver; @@ -1623,7 +1623,7 @@ void Vampire::heartbeat(const Timeval& currentTime) HP_t MaxHP = m_HP[ATTR_MAX]; m_HP[ATTR_CURRENT] = min((int)MaxHP, (int)(CurHP + NewHP)); } - // SilverDamage ҽŰ + // SilverDamage만 감소시키는 경우 else { m_SilverDamage = remainSilver; } @@ -1633,7 +1633,7 @@ void Vampire::heartbeat(const Timeval& currentTime) // Normal : 2 // Burrow(Hide) : 4 // Casket : 6 - // Wolf : 2 (Ϲ · ) + // Wolf : 2 (일반 상태로 간주) // Bat : 0 if (isFlag(Effect::EFFECT_CLASS_HIDE)) { NewHP = 4 * diffTime.tv_sec; @@ -1676,7 +1676,7 @@ void Vampire::heartbeat(const Timeval& currentTime) if (itr == ItemList.end()) { ItemList.push_back(pItem); - // ũ ġ ˻ϱ . + //아이템 크기의 다음 위치 부터 검색하기 위함. i = i + ItemWidth - 1; } } @@ -1820,7 +1820,7 @@ void Vampire::saveSkills(void) const VampireSkillSlot* pVampireSkillSlot = itr->second; Assert(pVampireSkillSlot != NULL); - // ⺻ ų ƴ϶... + // 기본 공격 스킬이 아니라면... if (pVampireSkillSlot->getSkillType() >= SKILL_DOUBLE_IMPACT) { pVampireSkillSlot->save(m_Name); } @@ -1841,7 +1841,7 @@ void Vampire::saveGears(void) const { __BEGIN_TRY - // ϰ ִ ۵ Ѵ. + // 장착하고 있는 아이템들을 저장한다. char pField[80]; for (int i = 0; i < Vampire::VAMPIRE_WEAR_MAX; i++) { @@ -1850,7 +1850,7 @@ void Vampire::saveGears(void) const Durability_t maxDurability = computeMaxDurability(pItem); if (pItem->getDurability() < maxDurability) { // pItem->save(m_Name, STORAGE_GEAR, 0, i, 0); - // item ȭ. by sigi. 2002.5.13 + // item저장 최적화. by sigi. 2002.5.13 sprintf(pField, "Durability=%d", pItem->getDurability()); pItem->tinysave(pField); } @@ -1866,10 +1866,10 @@ void Vampire::saveExps(void) const { __BEGIN_TRY - // ų ڵ鷯 ڸ ̱ ؼ 10 κе, - // ٿ ʰ, α׾ƿϴ 쿡 - // ̺긦 10 ö κ ư ȴ. - // ׷Ƿ ⼭ ̺긦 ش. + // 스킬 핸들러에서 쿼리 숫자를 줄이기 위해서 10으로 나누는 부분들은, + // 서버 다운이 되지 않고, 정상적으로 로그아웃하는 경우에 + // 세이브를 명시적으로 해주지 않으면 10 이하 올라간 부분은 날아가 버리게 된다. + // 그러므로 여기서 세이브를 해 준다. StringStream sql; sql << "UPDATE Vampire SET " << "Alignment = " << m_Alignment << ",Fame = " << m_Fame << ",Exp = " << m_Exp << ",GoalExp = " << m_GoalExp; @@ -1896,15 +1896,15 @@ void Vampire::saveExps(void) const //---------------------------------------------------------------------- // getShapeInfo //---------------------------------------------------------------------- -// loginҶ ó ϱ ؼ. +// login할때 처리를 빨리하기 위해서다. //---------------------------------------------------------------------- -// ϴ 32bit 32 ǥϴ°ɷε ϴٰ . -// ? overǸ bitset ߰.. +// 일단 32bit로 32가지를 표현하는걸로도 충분하다고 본다. +// 언젠가? over되면 bitset을 써야겠지.. // -// (!) index ƴϰ optionType ־ Ѵ. -// Ŭ̾Ʈ ɼ ãƼ . +// (!) 색깔은 index색값이 아니고 optionType을 넣어서 사용한다. +// 클라이언트에서 옵션으로 색값을 찾아서 쓴다. // -// colors[1] coatColor ֱ ̴. +// colors[1]은 coatColor만 있기 때문이다. //---------------------------------------------------------------------- void Vampire::getShapeInfo(DWORD& flag, Color_t colors[PCVampireInfo::VAMPIRE_COLOR_MAX]) const // @@ -1916,11 +1916,11 @@ void Vampire::getShapeInfo(DWORD& flag, Color_t colors[PCVampireInfo::VAMPIRE_CO int vampireBit; int vampireColor; - // ʱȭ + // 초기화 flag = 0; //----------------------------------------------------------------- - // + // 복장 //----------------------------------------------------------------- pItem = m_pWearItem[WEAR_BODY]; vampireBit = 0; @@ -1937,12 +1937,12 @@ void Vampire::getShapeInfo(DWORD& flag, Color_t colors[PCVampireInfo::VAMPIRE_CO // colors[vampireColor] = pItem->getOptionType(); // flag |= (getVampireCoatType(IType) << vampireBit); - // itemType ־ش. + // itemType을 넣어준다. flag = IType; } else { colors[vampireColor] = 377; // flag |= (VAMPIRE_COAT_BASIC << vampireBit); - // ⺻ : ڴ 0, ڴ 1 + // 기본 옷 : 남자는 0, 여자는 1 flag = (m_Sex ? 0 : 1); } diff --git a/src/server/gameserver/VariableManager.h b/src/server/gameserver/VariableManager.h index 30b1ae29..03a599fe 100644 --- a/src/server/gameserver/VariableManager.h +++ b/src/server/gameserver/VariableManager.h @@ -48,7 +48,7 @@ enum VariableType { RANK_EXP_GAIN_PERCENT, // 37 ITEM_LUCK_PERCENT, // 38 - // ̺Ʈ ( code name : lotto event ) + // 대박 이벤트 용 ( code name : lotto event ) // 2003. 1. 12 by bezz. Sequoia. dew LOTTO_ITEM_RATIO, // 39 LOTTO_ITEM_BONUS_NUM, // 40 @@ -102,7 +102,7 @@ enum VariableType { MONEY_TRACE_LOG_LIMIT, // 67 - // ǽù ̺Ʈ + // 피시방 복권 이벤트 PC_ROOM_LOTTO_EVENT, // 68 ACTIVE_FLAG_WAR, // 69 @@ -132,7 +132,7 @@ enum VariableType { GOLD_LUCKY_BAG_RATIO, // 85 RED_LUCKY_BAG_RATIO, // 86 - // CHRISTMAS_GIFT_BOX + // 위의 CHRISTMAS_GIFT_BOX 랑은 관련이 없다 EVENT_GIFT_BOX, // 87 RED_GIFT_BOX_RATIO, // 88 BLUE_GIFT_BOX_RATIO, // 89 @@ -249,7 +249,7 @@ const string VariableType2String[VARIABLE_MAX] = { "RANK_EXP_GAIN_PERCENT", // 37 "ITEM_LUCK_PERCENT", // 38 - // ̺Ʈ ( code name : lotto event ) + // 대박 이벤트 용 ( code name : lotto event ) // 2003. 1. 12 by bezz. Sequoia. dew "LOTTO_ITEM_RATIO", // 39 "LOTTO_ITEM_BONUS_NUM", // 40 @@ -326,7 +326,7 @@ const string VariableType2String[VARIABLE_MAX] = { "GOLD_LUCKY_BAG_RATIO", // 85 "RED_LUCKY_BAG_RATIO", // 86 - // CHRISTMAS_GIFT_BOX + // 위의 CHRISTMAS_GIFT_BOX 랑은 관련이 없다 "EVENT_GIFT_BOX", // 87 "RED_GIFT_BOX_RATIO", // 88 "BLUE_GIFT_BOX_RATIO", // 89 @@ -433,7 +433,7 @@ class VariableManager { return m_Variables[STAR_RATIO]; } - // ̺Ʈ Ȱȭǰ Լ + // 이벤트가 활성화되고 끊는 함수 void setEventActivate(int value) { setVariable(EVENT_ACTIVE, value); } diff --git a/src/server/gameserver/VisionInfo.h b/src/server/gameserver/VisionInfo.h index 621fc69e..78879cc2 100644 --- a/src/server/gameserver/VisionInfo.h +++ b/src/server/gameserver/VisionInfo.h @@ -18,10 +18,10 @@ const Coord_t maxVisionHeight = maxViewportUpperHeight + maxViewportLowerHeight //////////////////////////////////////////////////////////////////////////////// // class VisionInfo; -// P(x,y) þ Sight ̸, Ư (dir) ٶ󺸴 O(cx,cy) ġ -// ũó ִ θ Ÿӿ ʰ, ̹ þ -// ⺰ þ 簢 صθ þ üũ ְ ȴ. -// Ŭ, Ǵ þ 簢 Ÿ. +// P(x,y) 가 시야 레벨이 Sight 이며, 특정 방향(dir)을 바라보는 O(cx,cy) 위치의 +// 크리처가 볼 수 있는지의 여부를 런타임에 계산하지 않고, 이미 계산된 값을 시야 +// 레벨과 방향별 시야 사각형에 저장해두면 시야 체크를 보다 빨리 할 수 있게 된다. +// 이 클래스는, 이 때 사용되는 시야 사각형을 나타낸다. //////////////////////////////////////////////////////////////////////////////// /*class VisionInfo @@ -35,7 +35,7 @@ const Coord_t maxVisionHeight = maxViewportUpperHeight + maxViewportLowerHeight int px = x + (maxViewportWidth) - cx; int py = y + (maxViewportUpperHeight) - cy; - // ̵ ǥ üũѴ. + // 평행이동한 좌표의 범위를 체크한다. if (px >= 0 && px < maxVisionWidth && py >= 0 && py < maxVisionHeight) return m_Rect[px][py]; @@ -44,15 +44,15 @@ const Coord_t maxVisionHeight = maxViewportUpperHeight + maxViewportLowerHeight string toString() const ; private: - // þ (0 - 13) + // 시야 레벨(0 - 13) Sight_t m_Sight; - // ٶ󺸴 + // 바라보는 방향 Dir_t m_Dir; // viewport rectangle VisionState m_Rect[maxVisionWidth][maxVisionHeight]; - // deprecated. Ŭ ̻ . + // deprecated. 이 클래스는 더이상 안 쓴다. VisionInfo(Sight_t sight, Dir_t dir) ; ~VisionInfo(); }; @@ -60,7 +60,7 @@ const Coord_t maxVisionHeight = maxViewportUpperHeight + maxViewportLowerHeight //////////////////////////////////////////////////////////////////////////////// // class VisionInfoManager; -// þ ϸ, þ ָ ׿ شϴ þ Ѵ. +// 시야 정보를 관리하며, 시야 레벨과 방향을 주면 그에 해당하는 시야 정보를 리턴한다. //////////////////////////////////////////////////////////////////////////////// class VisionInfoManager { @@ -100,7 +100,7 @@ class VisionInfoManager { string toString() const; private: - // VisionInfo 迭 + // VisionInfo의 이차원 배열 // VisionInfo *** m_pVisionInfos; }; diff --git a/src/server/gameserver/WayPoint.cpp b/src/server/gameserver/WayPoint.cpp index ece5d74f..0562fb69 100644 --- a/src/server/gameserver/WayPoint.cpp +++ b/src/server/gameserver/WayPoint.cpp @@ -2,7 +2,7 @@ // Filename : WayPoint.cpp // Written by : excel96 // Description : -// ̾ Ż Ʈ ϴ Ŭ +// 슬레이어용 개인 포탈을 위한 웨이포인트의 집합을 관리하는 클래스 모듈 ////////////////////////////////////////////////////////////////////////////// #include "WayPoint.h" @@ -88,7 +88,7 @@ void WayPointManager::load(void) addWayPoint(pWayPoint); - // ƿ콺 Ʈ ȴ. + // 아우스터즈 웨이포인트는 블럭해줘야 된다. if (Race == RACE_OUSTERS) { Zone* pZone = getZoneByZoneID(ZID); Tile& rTile = pZone->getTile(ZX, ZY); @@ -136,7 +136,7 @@ void WayPointManager::addWayPoint(WayPoint* pWayPoint) if (itr != end()) { cerr << "WayPointManager::addWayPoint() : Duplicated WayPoint" << endl; - cerr << "Ƹ ɻ̶ ǥ ....~" << endl; + cerr << "아마 헬기랑 대지정령뿔이랑 좌표가 겹쳤을지도...ㅋㅋㅋ.즐~" << endl; throw("WayPointManager::addWayPoint() : Duplicated WayPoint"); } diff --git a/src/server/gameserver/WayPoint.h b/src/server/gameserver/WayPoint.h index a48e51d0..38eaab06 100644 --- a/src/server/gameserver/WayPoint.h +++ b/src/server/gameserver/WayPoint.h @@ -2,7 +2,7 @@ // Filename : WayPoint.h // Written by : excel96 // Description : -// ̾ Ż Ʈ ϴ Ŭ +// 슬레이어용 개인 포탈을 위한 웨이포인트의 집합을 관리하는 클래스 모듈 ////////////////////////////////////////////////////////////////////////////// #ifndef __WAYPOINT_H__ diff --git a/src/server/gameserver/WeatherInfo.cpp b/src/server/gameserver/WeatherInfo.cpp index 4cc325b7..88dce33e 100644 --- a/src/server/gameserver/WeatherInfo.cpp +++ b/src/server/gameserver/WeatherInfo.cpp @@ -94,7 +94,7 @@ string WeatherInfoManager::toString() const msg << "WeatherInfoManager("; for (int i = 0; i < 12; i++) { - msg << (int)(i + 1) << " : " << m_WeatherInfos[i].toString(); + msg << (int)(i + 1) << " 월 : " << m_WeatherInfos[i].toString(); } msg << ")"; diff --git a/src/server/gameserver/WeatherInfo.h b/src/server/gameserver/WeatherInfo.h index 976adde2..b86dd47b 100644 --- a/src/server/gameserver/WeatherInfo.h +++ b/src/server/gameserver/WeatherInfo.h @@ -16,15 +16,15 @@ class WeatherInfo { public: - // Ȯ Ķͷ Ѱָ, Ѵ. + // 확률값을 파라미터로 넘겨주면, 오늘의 날씨를 리턴한다. Weather getWeather(uint probability) const; - // Ư Ȯ Ѵ. + // 특정 날씨의 확률을 리턴한다. uint getProbability(Weather weather) const { return m_Probabilities[weather]; } - // Ư Ȯ Ѵ. + // 특정 날씨의 확률을 지정한다. void setProbability(Weather weather, uint prob) { m_Probabilities[weather] = prob; } @@ -40,7 +40,7 @@ class WeatherInfo { //////////////////////////////////////////////////////////////////////////////// // class WeatherInfoManager; // -// ϴ Ŵ Ŭ̴. +// 월별 날씨 정보를 관리하는 매니저 클래스이다. //////////////////////////////////////////////////////////////////////////////// class WeatherInfoManager { @@ -69,7 +69,7 @@ class WeatherInfoManager { string toString() const; private: - // WeatherInfo 迭 + // WeatherInfo의 이차원 배열 WeatherInfo m_WeatherInfos[12]; }; diff --git a/src/server/gameserver/WeatherManager.h b/src/server/gameserver/WeatherManager.h index 4bc2bc0f..159b0569 100644 --- a/src/server/gameserver/WeatherManager.h +++ b/src/server/gameserver/WeatherManager.h @@ -21,21 +21,21 @@ class Zone; // // class WeatherManager; // -// ϴ üμ, ϳ WeatherManager ־ Ѵ. +// Á¸ÀÇ ³¯¾¾¸¦ °ü¸®ÇÏ´Â °´Ã¼·Î¼­, °¢ Á¸Àº ÇϳªÀÇ WeatherManager¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. // -// Ϸ翡 ѹ ȴ. 켱, GameTime -// ˾Ƴ , WeatherInfoManager شǴ WeatherInfo ´. -// dice , ´. CLEAR-RAIN-SNOW ϳ -// , Ϸ ´. +// Á¸ÀÇ ³¯¾¾´Â ÇÏ·ç¿¡ Çѹø °áÁ¤ÀÌ µÈ´Ù. ¿ì¼±, GameTime ¿¡¼­ ¿À´ÃÀÌ ¸î¿ùÀÎÁö¸¦ +// ¾Ë¾Æ³½ ´ÙÀ½, WeatherInfoManager ¿¡¼­ ÇØ´çµÇ´Â WeatherInfo ¸¦ °¡Á®¿Â´Ù. +// ÀÌÁ¦ dice ¸¦ ±¼·Á¼­, ¿À´ÃÀÇ ³¯¾¾¸¦ °áÁ¤Áþ´Â´Ù. CLEAR-RAIN-SNOW Áß Çϳª¸¦ °áÁ¤ +// Áö¾úÀ¸¸é, ÀÌÁ¦ ÇÏ·çÀÇ ¼¼ºÎÀûÀÎ ³¯¾¾¸¦ °áÁ¤Áþ´Â´Ù. // -// ⺻ ð 1 ð̴. +// ³¯¾¾ÀÇ ±âº» ´ÜÀ§´Â °ÔÀÓ ½Ã°£ 1 ½Ã°£ÀÌ´Ù. // -// WEATHER_CLEAR : , ʴ´. -// WEATHER_RAINY, WEATHER_SNOWY : Ϸ翡 Ȯ ð -// ̽ Ѵ. ̶, ĥ ð ̽ ش. -//( ð ú ð ѽð Ѵ.) +// WEATHER_CLEAR : ÀÌ °æ¿ì, ºñ³ª ´«ÀÌ ³»¸®Áö ¾Ê´Â´Ù. +// WEATHER_RAINY, WEATHER_SNOWY : ÇÏ·ç¿¡ ºñ°¡ ³»¸± È®·üÀ» ¹ÙÅÁÀ¸·Î ¸Å ½Ã°£¸¶´Ù +// ´ÙÀ̽º¸¦ ±¼·Á¼­ ºñ¸¦ ³»¸®°Ô ÇÑ´Ù. À̶§, ºñ°¡ ±×Ä¥ ½Ã°£µµ ´ÙÀ̽º·Î °è»êÇØÁØ´Ù. +//(ºñ°¡ ³»¸®´Â ½Ã°£ ¿ª½Ãº °ÔÀÓ ½Ã°£ Çѽð£À» ´ÜÀ§·Î ÇÑ´Ù.) // -// ġ ⺻ ǽð 1̸, Ȯ( * 5 - 30) %̴. +// ¹ø°³°¡ Ä¡´Â ±âº» ´ÜÀ§´Â ½Ç½Ã°£ 1ºÐÀ̸ç, È®·üÀº(ºñÀÇ ·¹º§* 5 - 30) %ÀÌ´Ù. // //-------------------------------------------------------------------------------- class WeatherManager { @@ -51,25 +51,25 @@ class WeatherManager { // initialize void init(); - // ð Ǹ ˾Ƽ ٲش. heartbeat ȣǾ Ѵ. + // ÁöÁ¤ ½Ã°£ÀÌ µÇ¸é ³¯¾¾¸¦ ¾Ë¾Æ¼­ ¹Ù²ãÁØ´Ù. Á¸ÀÇ heartbeat ¿¡¼­ È£ÃâµÇ¾î¾ß ÇÑ´Ù. void heartbeat(); - // Ѵ. + // ¿À´ÃÀÇ ³¯¾¾¸¦ ¸®ÅÏÇÑ´Ù. Weather getTodayWeather() const { return m_TodayWeather; } - // Ȯ Ѵ. + // ¿À´Ã ºñ³ª ´«ÀÌ ¿Ã È®·üÀ» ¸®ÅÏÇÑ´Ù. uint getProbability() const { return m_Probability; } - // Ѵ. + // ÇöÀçÀÇ ³¯¾¾¸¦ ¸®ÅÏÇÑ´Ù. Weather getCurrentWeather() const { return m_CurrentWeather; } - // Ѵ. + // ÇöÀçÀÇ ³¯¾¾ ·¹º§À» ¸®ÅÏÇÑ´Ù. WeatherLevel_t getWeatherLevel() const { return m_WeatherLevel; } @@ -82,36 +82,36 @@ class WeatherManager { string toString() const; private: - // Ǿ ִ + // ÇöÀç ¿¬°üµÇ¾î ÀÖ´Â Á¸ Zone* m_pZone; - // (CLEAR/RAINY/SNOWY) + // ¿À´ÃÀÇ ³¯¾¾(CLEAR/RAINY/SNOWY) Weather m_TodayWeather; - // Ȯ(0 - 100) + // ºñ³ª ´«ÀÌ ¿Ã È®·ü(0 - 100) uint m_Probability; - // + // ÇöÀçÀÇ ³¯¾¾ Weather m_CurrentWeather; - // (1 - 20) + // ³¯¾¾ ·¹º§(1 - 20) WeatherLevel_t m_WeatherLevel; //-------------------------------------------------- - // XXX ð(ʴ ϴ) + // ´ÙÀ½ XXX ÇÒ ½Ã°£(ÃÊ´ÜÀ§µµ ÃæºÐÇÏ´Ù) //-------------------------------------------------- private: - // + // ³»ÀÏ time_t m_Tomorrow; - // ð + // ´ÙÀ½ ³¯¾¾ º¯°æ ½Ã°£ time_t m_NextWeatherChangingTime; - // ð + // ´ÙÀ½ ¹ø°³ ½Ã°£ time_t m_NextLightning; - // 10д + // ´ÙÀ½ 10ºÐ´ë time_t m_Next10Min; }; diff --git a/src/server/gameserver/Zone.h b/src/server/gameserver/Zone.h index dae2ecc8..2b277dae 100644 --- a/src/server/gameserver/Zone.h +++ b/src/server/gameserver/Zone.h @@ -53,27 +53,27 @@ class LevelWarManager; class DynamicZone; ////////////////////////////////////////////////////////////////////////////// -// Ÿ +// Á¸ÀÇ Å¸ÀÔ ////////////////////////////////////////////////////////////////////////////// enum ZoneType { - ZONE_NORMAL_FIELD, // Ϲ ʵ - ZONE_NORMAL_DUNGEON, // Ϲ - ZONE_SLAYER_GUILD, // ̾ + ZONE_NORMAL_FIELD, // ÀÏ¹Ý Çʵå + ZONE_NORMAL_DUNGEON, // ÀÏ¹Ý ´øÀü + ZONE_SLAYER_GUILD, // ½½·¹ÀÌ¾î ±æµå ZONE_RESERVED_SLAYER_GUILD, // ... - ZONE_PC_VAMPIRE_LAIR, // PC ̾ - ZONE_NPC_VAMPIRE_LAIR, // NPC ̾ + ZONE_PC_VAMPIRE_LAIR, // PC ¹ìÆÄÀÌ¾î ·¹¾î + ZONE_NPC_VAMPIRE_LAIR, // NPC ¹ìÆÄÀÌ¾î ·¹¾î ZONE_NPC_HOME, // ... ZONE_NPC_SHOP, // ... ZONE_RANDOM_MAP, // -_-; - ZONE_CASTLE, // + ZONE_CASTLE, // ¼º }; ////////////////////////////////////////////////////////////////////////////// -// ٸ +// Á¸ÀÇ Á¢±Ù¸ðµå ////////////////////////////////////////////////////////////////////////////// enum ZoneAccessMode { - PUBLIC = 0, // ƹ ִ ̴. - PRIVATE // ִ ̴.(, ) + PUBLIC = 0, // ¾Æ¹«³ª µé¾î¿Ã ¼ö ÀÖ´Â Á¸ÀÌ´Ù. + PRIVATE // ÁöÁ¤µÈ »ç¶÷¸¸ÀÌ µé¾î¿Ã ¼ö ÀÖ´Â Á¸ÀÌ´Ù.(±æµåÁ¸,·¹¾î µî) }; ////////////////////////////////////////////////////////////////////////////// @@ -140,7 +140,7 @@ class Zone { void movePC(Creature* pCreature, ZoneCoord_t nx, ZoneCoord_t ny, Dir_t dir); void moveCreature(Creature* pCreature, ZoneCoord_t nx, ZoneCoord_t ny, Dir_t dir); - // Ͱ ֺ ĵѴ. + // ¸ó½ºÅͰ¡ ÁÖº¯À» ½ºÄµÇÑ´Ù. void monsterScan(Monster* pMonster, ZoneCoord_t x, ZoneCoord_t y, Dir_t dir); void broadcastPacket(Packet* pPacket, Creature* owner = NULL); @@ -155,50 +155,50 @@ class Zone { list broadcastSkillPacket(ZoneCoord_t x1, ZoneCoord_t y1, ZoneCoord_t x2, ZoneCoord_t y2, Packet* pPacket, list creatureList, bool bConcernDarkness = true); - //(x,y) Ÿ ִ PC ֺ о Ѵ. pPacket NULL ƴ϶, ÿ εijƮ - // Ѵ. + //(x,y) ŸÀÏ À§¿¡ ÀÖ´Â PC ¿¡°Ô ÁÖº¯ Á¤º¸¸¦ Àо Àü¼ÛÇÑ´Ù. pPacket ÀÌ NULL ÀÌ ¾Æ´Ï¶ó¸é, µ¿½Ã¿¡ ºê·Îµåij½ºÆ®µµ + // ´ã´çÇÑ´Ù. void scan(Creature* pPC, ZoneCoord_t x, ZoneCoord_t y, Packet* pPacket); - // ڸ þ߰ ֺ ٽ ش. + // Á¦ÀÚ¸®¿¡¼­ ½Ã¾ß°¡ º¯°æµÈ °æ¿ì ÁÖº¯ Á¤º¸¸¦ ´Ù½Ã º¸³»ÁØ´Ù. void updateScan(Creature* pPC, Sight_t oldSight, Sight_t newSight); - // װ ִ ѵ(Player) list ش. + // ±×°÷À» º¼ ¼ö ÀÖ´Â ³Ñµé(Player)ÀÇ list¸¦ µ¹·ÁÁØ´Ù.ª list getWatcherList(ZoneCoord_t, ZoneCoord_t, Creature* pTargetCreature = NULL); - // Ͱ ֺ PC 鿡 GCAddXXX Ŷ εijƮϸ鼭ÿ ׵ νϵ Ѵ. + // ¸®Á¨µÈ ¸ó½ºÅͰ¡ ÁÖº¯ÀÇ PC µé¿¡°Ô GCAddXXX ÆÐŶÀ» ºê·Îµåij½ºÆ®Çϸ鼭µ¿½Ã¿¡ ±×µéÀ» ÀáÀçÀûÀÎ ÀûÀ¸·Î ÀνÄÇϵµ·Ï ÇÑ´Ù. void scanPC(Creature* pCreature); - // ڸ hidden creature update ʿ . + // Á¦ÀÚ¸®¿¡¼­ hidden creature¿¡ ´ëÇÑ update°¡ ÇÊ¿äÇÑ °æ¿ì. void updateHiddenScan(Creature* pCreature); - // ڸ install mine update ʿ . + // Á¦ÀÚ¸®¿¡¼­ install mine¿¡ ´ëÇÑ update°¡ ÇÊ¿äÇÑ °æ¿ì. void updateMineScan(Creature* pCreature); - // ڸ invisible creature update ʿ . + // Á¦ÀÚ¸®¿¡¼­ invisible creature¿¡ ´ëÇÑ update°¡ ÇÊ¿äÇÑ °æ¿ì. void updateInvisibleScan(Creature* pCreature); - // ڸ hide,invisible creature update ʿ . + // Á¦ÀÚ¸®¿¡¼­ hide,invisible creature¿¡ ´ëÇÑ update°¡ ÇÊ¿äÇÑ °æ¿ì. void updateDetectScan(Creature* pCreature); - // PC P(x1,y1) Q(x2,y2) ̵ ֺ εijƮѴ. + // PC °¡ P(x1,y1)¿¡¼­ Q(x2,y2)·Î À̵¿ÇßÀ½À» ÁÖº¯¿¡ ºê·Îµåij½ºÆ®ÇÑ´Ù. void movePCBroadcast(Creature* pPC, ZoneCoord_t x1, ZoneCoord_t y1, ZoneCoord_t x2, ZoneCoord_t y2, bool bSendMove = true, bool bKnockback = false); - // !PC P(x1,y1) Q(x2,y2) ̵ ֺ εijƮѴ. + // !PC °¡ P(x1,y1)¿¡¼­ Q(x2,y2)·Î À̵¿ÇßÀ½À» ÁÖº¯¿¡ ºê·Îµåij½ºÆ®ÇÑ´Ù. void moveCreatureBroadcast(Creature* pCreature, ZoneCoord_t x1, ZoneCoord_t y1, ZoneCoord_t x2, ZoneCoord_t y2, bool bSendMove = true, bool bKnockback = false); - // PC P(x1,y1) Q(x2,y2) ̵ ֺ εijƮѴ. + // PC °¡ P(x1,y1)¿¡¼­ Q(x2,y2)·Î À̵¿ÇßÀ½À» ÁÖº¯¿¡ ºê·Îµåij½ºÆ®ÇÑ´Ù. bool moveFastPC(Creature* pPC, ZoneCoord_t x1, ZoneCoord_t y1, ZoneCoord_t x2, ZoneCoord_t y2, SkillType_t skillType); bool moveFastMonster(Monster* pMonster, ZoneCoord_t x1, ZoneCoord_t y1, ZoneCoord_t x2, ZoneCoord_t y2, SkillType_t skillType); - // 밡 Ǿٰ Ҵٰ Ѵ. ƴϰ ų 󺹱Ů. + // ÀüÀï½Ã ¼º ¾ÈÀº ¾ÈÀüÁö´ë°¡ µÇ¾ú´Ù°¡ ¸»¾Ò´Ù°¡ ÇÑ´Ù. Á¸À» ¼¼ÀÌÇÁÁ¸ÀÌ ¾Æ´Ï°Ô ¸¸µé°Å³ª ¿ø»óº¹±¸½ÃÅ®´Ù. void releaseSafeZone(); void resetSafeZone(); - // Ʈ + // ¿ÀºêÁ§Æ® µî·Ï void registerObject(Object* pObject) { getObjectRegistry().registerObject(pObject); } @@ -206,7 +206,7 @@ class Zone { public: void heartbeat(); - // ̸, ũó Ŭ, OID ̿ؼ ϴ ũ ü + // À̸§, Å©¸®Ã³ Ŭ·¡½º, OID µîÀ» ÀÌ¿ëÇØ¼­ Á¸¿¡ Á¸ÀçÇÏ´Â Å©¸®ÃÄ °´Ã¼¿¡ Á¢±Ù Creature* getCreature(const string& Name) const; // NoSuchElementException, Error); Creature* getCreature(ObjectID_t objectID) const; // NoSuchElementException, Error); Creature* getCreature(Creature::CreatureClass creatureClass, ObjectID_t objectID) const; @@ -385,7 +385,7 @@ class Zone { void addNPCInfo(NPCInfo* pInfo); bool removeNPCInfo(NPC* pNPC); - // ü NPC MarketCondition Ѵ. default(100, 25) + // Á¸ ÀüüÀÇ NPC¿¡°Ô MarketConditionÀ» ¼³Á¤ÇÑ´Ù. default(100, 25) // void setNPCMarketCondition(MarketCond_t NPCSell, MarketCond_t NPCBuy) ; void addVampirePortal(ZoneCoord_t cx, ZoneCoord_t cy, Vampire* pVampire, const ZONE_COORD& ZoneCoord); @@ -409,11 +409,11 @@ class Zone { } - // pPC pMonster Monster  packet addǴ°? - // pPC NULL ̴ ¶ Ѵ. + // pPC°¡ pMonster¸¦ º¼¶§ Monster´Â ¾î¶® packetÀ¸·Î addµÇ´Â°¡? + // pPC°¡ NULLÀÎ °æ¿ì ´Ù º¸ÀÌ´Â »óŶó°í °¡Á¤ÇÑ´Ù. Packet* createMonsterAddPacket(Monster* pMonster, Creature* pPC) const; - // ǥ + // ¸÷ »ý¼º ÁÂÇ¥ const BPOINT& getRandomMonsterRegenPosition() const; const BPOINT& getRandomEmptyTilePosition() const; @@ -450,7 +450,7 @@ class Zone { #endif public: - // ȭ + // À¯·áÈ­ bool isPayPlay() const { return m_bPayPlay; } @@ -507,7 +507,7 @@ class Zone { m_bCastleZone = bCastleZone; } - // Relic븦 ֳ? + // Relicº¸°ü´ë¸¦ °®°í ÀÖ³ª? bool hasRelicTable() const { return m_bHasRelicTable; } @@ -518,7 +518,7 @@ class Zone { bool addRelicItem(int relicIndex); bool deleteRelicItem(); - // Holy Land Race Bonus ȭ ÷̾ refresh + // Holy Land Race Bonus º¯È­¿¡ µû¸¥ Ç÷¹À̾î refresh void setRefreshHolyLandPlayer(bool bRefresh) { m_pPCManager->setRefreshHolyLandPlayer(bRefresh); } @@ -550,24 +550,24 @@ class Zone { // member data //////////////////////////////////////////////////////////// private: - // ⺻ + // Á¸ÀÇ ±âº» ÀûÀÎ Á¤º¸ ZoneID_t m_ZoneID; // zone id ZoneGroup* m_pZoneGroup; // parent zone group - ZoneType m_ZoneType; // Ÿ( Ÿ ٮ DB Ǿ Ѵ.) - ZoneLevel_t m_ZoneLevel; // . - ZoneAccessMode m_ZoneAccessMode; // { PUBLIC | PRIVATE } - string m_OwnerID; // ̵(̾ ̵ Ȥ ̾ ̵) - DarkLevel_t m_DarkLevel; // ӱ - LightLevel_t m_LightLevel; // ũ - ZoneCoord_t m_Width; // ũ - ZoneCoord_t m_Height; // ũ - Tile** m_pTiles; // Ÿ 迭 - ZoneLevel_t** m_ppLevel; // 迭 - Sector** m_pSectors; // 迭 - int m_SectorWidth; // ũ - int m_SectorHeight; // ũ - - // Ŵ + ZoneType m_ZoneType; // Á¸ ŸÀÔ(Á¸ ŸÀÔÀÌ ¹Ù®î¸é DB¿¡ ÀúÀåµÇ¾î¾ß ÇÑ´Ù.) + ZoneLevel_t m_ZoneLevel; // Á¸ÀÇ ·¹º§. + ZoneAccessMode m_ZoneAccessMode; // Á¸¿¡ ´ëÇÑ Á¢±Ù ¸ðµå { PUBLIC | PRIVATE } + string m_OwnerID; // Á¸ ¼ÒÀ¯ÀÚ ¾ÆÀ̵ð(½½·¹ÀÌ¾î ±æµå ¾ÆÀ̵ð ȤÀº ¹ìÆÄÀÌ¾î ¸¶½ºÅÍ ¾ÆÀ̵ð) + DarkLevel_t m_DarkLevel; // Á¸ÀÇ ¾îµÓ±â + LightLevel_t m_LightLevel; // Á¸ÀÇ ºûÀÇ Å©±â + ZoneCoord_t m_Width; // Á¸ÀÇ °¡·Î Å©±â + ZoneCoord_t m_Height; // Á¸ÀÇ ¼¼·Î Å©±â + Tile** m_pTiles; // ŸÀÏÀÇ ÀÌÂ÷¿ø ¹è¿­ + ZoneLevel_t** m_ppLevel; // Á¸ ·¹º§ÀÇ ÀÌÂ÷¿ø ¹è¿­ + Sector** m_pSectors; // ¼½ÅÍÀÇ ÀÌÂ÷¿ø ¹è¿­ + int m_SectorWidth; // ¼½ÅÍÀÇ Å©±â + int m_SectorHeight; // ¼½ÅÍÀÇ Å©±â + + // °¢Á¾ ¸Å´ÏÀúµé PCManager* m_pPCManager; // PC Manager NPCManager* m_pNPCManager; // NPC Manager MonsterManager* m_pMonsterManager; // Monster Manager @@ -579,27 +579,27 @@ class Zone { EffectManager* m_pLockedEffectManager; // effect manager EffectScheduleManager* m_pEffectScheduleManager; list m_NPCInfos; // npc infos - WeatherManager* m_pWeatherManager; // + WeatherManager* m_pWeatherManager; // Á¸ÀÇ ³¯¾¾ - // ϴ NPC Ʈ Ÿ Ʈ + // Á¸¿¡ ÃâÇöÇÏ´Â NPC ½ºÇÁ¶óÀÌÆ® ŸÀÔÀÇ ¸®½ºÆ® BYTE m_NPCCount; NPCType_t m_NPCTypes[maxNPCPerZone]; - // ϴ Ʈ Ÿ Ʈ + // Á¸¿¡ ÃâÇöÇÏ´Â ¸ó½ºÅÍ ½ºÇÁ¶óÀÌÆ® ŸÀÔÀÇ ¸®½ºÆ® BYTE m_MonsterCount; MonsterType_t m_MonsterTypes[maxMonsterPerZone]; // object registery ObjectRegistry m_ObjectRegistry; - //  PC ť + // Á¸¿¡ »õ·Î µé¾î°¥ PCµéÀÇ Å¥ queue m_PCQueue; list m_PCListQueue; - // zoneٴڿ item hashmap + // zone¹Ù´Ú¿¡ ¶³¾îÁø item hashmap unordered_map m_Items; - // Monster AI 簢... + // Monster AI¸¦ À§ÇØ Á¸ÀÇ ¿µ¿ªÀ» ±¸ºÐÁö¾î ³õÀº »ç°¢Çüµé... VSRect m_OuterRect; VSRect m_InnerRect; VSRect m_CoreRect; @@ -608,7 +608,7 @@ class Zone { PartyInviteInfoManager* m_pPartyInviteInfoManager; TradeManager* m_pTradeManager; - // ǥ . + // ¸÷ »ý¼º ÁÂÇ¥¸¦ À§ÇÑ Á¤º¸. vector m_MonsterRegenPositions; vector m_EmptyTilePositions; @@ -616,11 +616,11 @@ class Zone { mutable Mutex m_Mutex; mutable Mutex m_MutexEffect; - // ȭ + // À¯·áÈ­ °ü·Ã bool m_bPayPlay; bool m_bPremiumZone; - // Ÿ + // ±âŸ Á¤º¸ bool m_bPKZone; bool m_bNoPortalZone; bool m_bMasterLair; @@ -628,10 +628,10 @@ class Zone { bool m_bHolyLand; bool m_bCastleZone; - // ? + // ÀüÀï Áß? bool m_bHasRelicTable; - // Relic Table + // Relic Table °ü·Ã Á¤º¸ ObjectID_t m_RelicTableOID; ZoneCoord_t m_RelicTableX; ZoneCoord_t m_RelicTableY; @@ -639,10 +639,10 @@ class Zone { Timeval m_LoadValueStartTime; DWORD m_LoadValue; - // . by sigi.2002.9.2 + // ¸¶½ºÅÍ ·¹¾î. by sigi.2002.9.2 MasterLairManager* m_pMasterLairManager; - // by sigi. 2003.1.24 + // ÀüÀï °ü¸® by sigi. 2003.1.24 WarScheduler* m_pWarScheduler; LevelWarManager* m_pLevelWarManager; @@ -662,7 +662,7 @@ class Zone { uchar m_EncryptCode; #endif - DynamicZone* m_pDynamicZone; // δ + DynamicZone* m_pDynamicZone; // Àδø Á¤º¸ }; #endif diff --git a/src/server/gameserver/ZoneGroup.h b/src/server/gameserver/ZoneGroup.h index d854c9a3..b7d17d3c 100644 --- a/src/server/gameserver/ZoneGroup.h +++ b/src/server/gameserver/ZoneGroup.h @@ -68,7 +68,7 @@ class ZoneGroup { Zone* getZone(ZoneID_t zoneID) const; // #ifdef __NO_COMBAT__ - Zone* getCombatZone(ZoneID_t zoneID) const; // getZone ϳ NULL ϴ , 漮 + Zone* getCombatZone(ZoneID_t zoneID) const; // getZone과 같은 일을 수행하나 NULL을 리턴하는 것이 가능, 김경석 // #endif //-------------------------------------------------- @@ -127,7 +127,7 @@ class ZoneGroup { // zone group id ZoneGroupID_t m_ZoneGroupID; - // zone ؽ + // zone 의 해쉬맵 unordered_map m_Zones; // zone player manager diff --git a/src/server/gameserver/ZoneGroupManager.h b/src/server/gameserver/ZoneGroupManager.h index c71868a6..60091e65 100644 --- a/src/server/gameserver/ZoneGroupManager.h +++ b/src/server/gameserver/ZoneGroupManager.h @@ -121,7 +121,7 @@ class ZoneGroupManager { void removeFlag(Effect::EffectClass EC); private: - // zone ؽ + // zone 의 해쉬맵 unordered_map m_ZoneGroups; mutable Mutex m_Mutex; diff --git a/src/server/gameserver/ZoneGroupThread.h b/src/server/gameserver/ZoneGroupThread.h index ecd20054..280dded8 100644 --- a/src/server/gameserver/ZoneGroupThread.h +++ b/src/server/gameserver/ZoneGroupThread.h @@ -19,9 +19,9 @@ // // class ZoneGroupThread; // -// ϳ ׷(ZoneGroup) þƼ ϴ μ, ׷쿡 -// ӵ PC, Ҽӵ NPC MOB, ó.. Ѵ. -// ׷쿡 ó ̷ ȴ. +// 하나의 존그룹(ZoneGroup)을 맡아서 관리하는 쓰레드로서, 존그룹에 +// 종속된 PC, 존에 소속된 NPC와 MOB, 존의 각종 처리.. 등을 전담한다. +// 즉 존그룹에서는 순차 처리가 이루어지게 된다. // ////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/ZoneInfo.cpp b/src/server/gameserver/ZoneInfo.cpp index 1fcd983c..3123ef2f 100644 --- a/src/server/gameserver/ZoneInfo.cpp +++ b/src/server/gameserver/ZoneInfo.cpp @@ -10,8 +10,8 @@ #include "StringStream.h" ZoneInfo::ZoneInfo() { - m_bMasterLair = false; // ̰ MasterLairInfoManager Ѵ. - m_bCastle = false; // ̰ CastleInfoManager Ѵ. + m_bMasterLair = false; // 이건 MasterLairInfoManager에서 설정한다. + m_bCastle = false; // 이건 CastleInfoManager에서 설정한다. } ZoneInfo::~ZoneInfo() {} @@ -29,7 +29,7 @@ void ZoneInfo::load(ZoneID_t zoneID) // create statement pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); - // OwnerID, NULL̶ ϴ ȴ. + // OwnerID, 가 다 NULL이라서 일단 빼버렸다. Result* pResult = pStmt->executeQuery( "SELECT ZoneGroupID, Type, Level, AccessMode, PayPlayZone, PremiumZone, PKZone, NoPortalZone, SMPFilename, SSIFilename, FullName, ShortName FROM ZoneInfo WHERE ZoneID = %d", zoneID ); if ( pResult->next() ) diff --git a/src/server/gameserver/ZoneInfo.h b/src/server/gameserver/ZoneInfo.h index e9846326..d656fd7f 100644 --- a/src/server/gameserver/ZoneInfo.h +++ b/src/server/gameserver/ZoneInfo.h @@ -175,27 +175,27 @@ class ZoneInfo { string toString() const; private: - ZoneID_t m_ZoneID; // ̵ - ZoneGroupID_t m_ZoneGroupID; // ׷ ̵ - ZoneType m_ZoneType; // Ÿ - ZoneLevel_t m_ZoneLevel; // (0 - 10) - ZoneAccessMode m_ZoneAccessMode; // - bool m_bPayPlay; // ȭ ? =  ִ - bool m_bPremiumZone; // ̾ 񽺰 Ǵ - string m_OwnerID; // ̵ - string m_SMPFilename; // SMP ̸ - string m_SSIFilename; // SSI ̸ - string m_FullName; // ̸ - string m_ShortName; // ª ̸ - - bool m_bPKZone; // - bool m_bNoPortalZone; // portal ̵ Ұ - bool m_bMasterLair; // ΰ? - bool m_bCastle; // Castleΰ? - bool m_bHolyLand; // ƴ ΰ? - bool m_bAvailable; // ; Ǵ ΰ? - - int m_OpenLevel; // . OpenDegree ƾ ´. + ZoneID_t m_ZoneID; // 존 아이디 + ZoneGroupID_t m_ZoneGroupID; // 존 그룹 아이디 + ZoneType m_ZoneType; // 존 타입 + ZoneLevel_t m_ZoneLevel; // 존 레벨(0 - 10) + ZoneAccessMode m_ZoneAccessMode; // 존 접근 모드 + bool m_bPayPlay; // 유료화 존? = 돈 내야 들어갈 수 있는 곳 + bool m_bPremiumZone; // 프리미엄 서비스가 되는 존 + string m_OwnerID; // 존 소유자 아이디 + string m_SMPFilename; // SMP 파일 이름 + string m_SSIFilename; // SSI 파일 이름 + string m_FullName; // 존 이름 + string m_ShortName; // 짧은 이름 + + bool m_bPKZone; // 성향 안 떨어지는 존 + bool m_bNoPortalZone; // portal로 이동이 불가능한 존 + bool m_bMasterLair; // 마스터 레어인가? + bool m_bCastle; // Castle인가? + bool m_bHolyLand; // 아담의 성지인가? + bool m_bAvailable; // 나와야 되는 존인가? + + int m_OpenLevel; // 존의 공개 레벨. OpenDegree가 존의 공개 레벨보다 높아야 나온다. }; #endif diff --git a/src/server/gameserver/ZoneInfoManager.h b/src/server/gameserver/ZoneInfoManager.h index 792415df..08341902 100644 --- a/src/server/gameserver/ZoneInfoManager.h +++ b/src/server/gameserver/ZoneInfoManager.h @@ -16,7 +16,7 @@ ////////////////////////////////////////////////////////////////////////////// // class ZoneInfoManager; -// ZoneID Ű ؼ ˻ ִ Ѵ. +// ZoneID 를 키값으로 해서 존 정보를 검색할 수 있는 기능을 제공한다. ////////////////////////////////////////////////////////////////////////////// class ZoneInfoManager { @@ -41,7 +41,7 @@ class ZoneInfoManager { string toString() const; private: - unordered_map m_ZoneInfos; // zone info ؽ + unordered_map m_ZoneInfos; // zone info 의 해쉬맵 unordered_map m_FullNameMap; unordered_map m_ShortNameMap; }; diff --git a/src/server/gameserver/ZonePlayerManager.h b/src/server/gameserver/ZonePlayerManager.h index bea2a314..a36aad95 100644 --- a/src/server/gameserver/ZonePlayerManager.h +++ b/src/server/gameserver/ZonePlayerManager.h @@ -25,7 +25,7 @@ class BroadcastFilter; // // class ZonePlayerManager; // -// ZoneGroup Ҽӵ ÷̾ ϴ Ŵ ü̴. +// 현재 ZoneGroup에 소속된 플레이어를 관리하는 매니저 객체이다. // ////////////////////////////////////////////////////////////////////// @@ -103,7 +103,7 @@ class ZonePlayerManager : public PlayerManager { m_Mutex.unlock(); } - // ÷̾ Ѵ. + // 모든 플레이어를 정리한다. void clearPlayers(); void setZGID(ZoneGroupID_t id) { @@ -119,19 +119,19 @@ class ZonePlayerManager : public PlayerManager { #endif private: - // Ҽӵ ÷̾ ũ ̴. - // m_XXXXFDs[0] ̸, m_XXXFDs[1] select() Ķͷ ȴ. - // select()ϱ [0] -> [1] 簡 ̷ Ѵ. + // 소속된 플레이어들의 소켓 디스크립터의 집합이다. + // m_XXXXFDs[0]은 저장용이며, m_XXXFDs[1]이 실제로 select()의 파라미터로 사용된다. + // 즉 select()하기 전에 [0] -> [1] 로 복사가 이루어져야 한다. fd_set m_ReadFDs[2]; fd_set m_WriteFDs[2]; fd_set m_ExceptFDs[2]; - // select Ǵ ð + // select에 사용되는 시간 Timeval m_Timeout[2]; // min_fd, max_fd - // select() iterating ӵ ؼ Ѵ. - // select() ù° Ķ͸ ϱ ؼ Ѵ. + // select()후 iterating 할 때 속도 증가를 위해서 사용한다. + // 또한 select()의 첫번째 파라미터를 계산하기 위해서 사용한다. SOCKET m_MinFD; SOCKET m_MaxFD; diff --git a/src/server/gameserver/ZoneUtil.cpp b/src/server/gameserver/ZoneUtil.cpp index 97aec7c3..3a3dc4d1 100644 --- a/src/server/gameserver/ZoneUtil.cpp +++ b/src/server/gameserver/ZoneUtil.cpp @@ -2,8 +2,8 @@ // Filename : ZoneUtil.cpp // Written by : excel96 // Description : -// õ Ư ۾ ϴ Լ ȿ ϱ, -// ʹ Ŀ ־, ܺη Լ̴. +// 존과 관련된 특정한 작업들을 수행하는 함수들을 존 안에 넣으니까, +// 존 파일이 너무 커지는 경향이 있어서, 존 파일 외부로 꺼낸 함수들이다. ////////////////////////////////////////////////////////////////////////////// #include "ZoneUtil.h" @@ -116,12 +116,12 @@ string correctString(const string& str) { ////////////////////////////////////////////////////////////////////////////// -// Ư ũĸ ִ ġ ã´. +// 특정 크리쳐를 더할 수 있는 위치를 찾는다. // -// Zone* pZone : -// ZoneCoord_t cx : ϰ ϴ ʱ ġ x -// ZoneCoord_t cy : ϰ ϴ ʱ ġ y -// Creature::MoveMode MMode : ũ +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t cx : 더하고자 하는 초기 위치 x +// ZoneCoord_t cy : 더하고자 하는 초기 위치 y +// Creature::MoveMode MMode : 크리쳐의 무브 모드 ////////////////////////////////////////////////////////////////////////////// TPOINT findSuitablePosition(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy, Creature::MoveMode MMode) @@ -194,13 +194,13 @@ TPOINT findSuitablePosition(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy, Creatur ////////////////////////////////////////////////////////////////////////////// -// Ư ִ ġ ã´. +// 특정 아이템을 더할 수 있는 위치를 찾는다. // -// Zone* pZone : -// ZoneCoord_t cx : ϰ ϴ ʱ ġ x -// ZoneCoord_t cy : ϰ ϴ ʱ ġ y -// bool bAllowCreature : ũİ ϴ ? -// bool bAllowSafeZone : Safe Zone ? +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t cx : 더하고자 하는 초기 위치 x +// ZoneCoord_t cy : 더하고자 하는 초기 위치 y +// bool bAllowCreature : 크리쳐가 존재하는 곳도 괜찮은가? +// bool bAllowSafeZone : Safe Zone 도 괜찮은가? ////////////////////////////////////////////////////////////////////////////// TPOINT findSuitablePositionForItem(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy, bool bAllowCreature, bool bAllowSafeZone, bool bForce) @@ -220,24 +220,24 @@ TPOINT findSuitablePositionForItem(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy, TPOINT pt; do { - // ȭ 輱  ϱ Ͽ - // ɼ ְ ߸ ִ üũ Ѵ. + // 화면의 경계선에 아이템이 들어가는 것을 방지하기 위하여 + // 일정 옵셋을 주고 떨어뜨릴 수 있는지 체크를 한다. if (x > 2 && y > 2 && x < pZone->getWidth() - 2 && y < pZone->getHeight() - 2) { Tile& rTile = pZone->getTile(x, y); - // GroundBlock ƴϰų (Block̴) ijͰ ִ by sigi + // GroundBlock이 아니거나 (Block이더라도)지상 캐릭터가 있는 경우 by sigi if ((!rTile.isGroundBlocked() || rTile.hasWalkingCreature()) && rTile.hasItem() == false && rTile.hasPortal() == false) { - // Safe ߸ ȵǴ üũ + // Safe 존에 떨어뜨리면 안되는 아이템인 경우 체크 if (bAllowSafeZone || !(pZone->getZoneLevel(x, y) & SAFE_ZONE)) { pt.x = x; pt.y = y; return pt; } - // ͻŬ , NPC ؿ ͻŬ Ǿ - // ÷̾ ͻŬ Ŭ ϴ 찡 ִ. - // ذϱ , ŸϿ ũİ ϴ üũ - // ̰ŵ ŵ ...̻ ڵ.. 2003.03.12 by bezz + // 모터사이클을 생성할 때, NPC 밑에 모터사이클이 생성되어서 + // 플레이어가 모터사이클을 클릭하지 못하는 경우가 있다. + // 이 문제를 해결하기 위해, 타일에 크리쳐가 존재하는지 체크 + // 이거든 저거든 무조건 통과네...이상한 코드네.. 2003.03.12 by bezz // if (bAllowCreature == false && rTile.hasCreature() == false) // { // pt.x = x; @@ -293,12 +293,12 @@ TPOINT findSuitablePositionForItem(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy, } ////////////////////////////////////////////////////////////////////////////// -// Ư Ʈ ִ ġ ã´. +// 특정 이펙트를 더할 수 있는 위치를 찾는다. // -// Zone* pZone : -// ZoneCoord_t cx : ϰ ϴ ʱ ġ x -// ZoneCoord_t cy : ϰ ϴ ʱ ġ y -// Effect::EffectClass EClass : ϰ ϴ Ʈ Ŭ +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t cx : 더하고자 하는 초기 위치 x +// ZoneCoord_t cy : 더하고자 하는 초기 위치 y +// Effect::EffectClass EClass : 더하고자 하는 이펙트 클래스 ////////////////////////////////////////////////////////////////////////////// TPOINT findSuitablePositionForEffect(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy, Effect::EffectClass EClass) @@ -319,11 +319,11 @@ TPOINT findSuitablePositionForEffect(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy do { if (x > 0 && y > 0 && x < pZone->getWidth() && y < pZone->getHeight()) { Tile& rTile = pZone->getTile(x, y); - // Ʈ ִ Ÿ̾ ϰ, Ʈ Ѵ. + // 이펙트를 더할 수 있는 타일이어야 하고, 같은 종류의 이펙트 또한 없어야 한다. if (rTile.canAddEffect() && rTile.getEffect(EClass) == NULL) { bool bNearTileCheck = true; - // 8ŸϿ Ʈ Ѵ. + // 주위 8타일에 같은 이펙트가 없어야 한다. for (int i = 0; i < 8; i++) { int tileX = x + dirMoveMask[i].x; int tileY = y + dirMoveMask[i].y; @@ -370,12 +370,12 @@ TPOINT findSuitablePositionForEffect(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy } ////////////////////////////////////////////////////////////////////////////// -// Ư ġ ũĸ ߰ ִ ˻Ѵ. +// 특정 위치에서 지정된 무브모드의 크리쳐를 추가할 수 있는지 검사한다. // -// Zone* pZone : -// ZoneCoord_t x : ϰ ϴ ǥ x -// ZoneCoord_t y : ϰ ϴ ǥ y -// Creature::MoveMode MMode : ũ +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t x : 변신하고자 하는 좌표 x +// ZoneCoord_t y : 변신하고자 하는 좌표 y +// Creature::MoveMode MMode : 크리쳐의 무브 모드 ////////////////////////////////////////////////////////////////////////////// bool canAddCreature(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, Creature::MoveMode MMode) @@ -397,11 +397,11 @@ bool canAddCreature(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, Creature::MoveMod ////////////////////////////////////////////////////////////////////////////// -// Ư ġ ο찡 üũ Ѵ. +// 특정 위치에 버로우가 가능한지 체크를 한다. // -// Zone* pZone : -// ZoneCoord_t x : οϰ ϴ ǥ x -// ZoneCoord_t y : οϰ ϴ ǥ y +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t x : 버로우하고자 하는 좌표 x +// ZoneCoord_t y : 버로우하고자 하는 좌표 y ////////////////////////////////////////////////////////////////////////////// bool canBurrow(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y) @@ -417,11 +417,11 @@ bool canBurrow(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y) ////////////////////////////////////////////////////////////////////////////// -// Ư ġ ο찡 üũ Ѵ. +// 특정 위치에 언버로우가 가능한지 체크를 한다. // -// Zone* pZone : -// ZoneCoord_t x : οϰ ϴ ǥ x -// ZoneCoord_t y : οϰ ϴ ǥ y +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t x : 버로우하고자 하는 좌표 x +// ZoneCoord_t y : 버로우하고자 하는 좌표 y ////////////////////////////////////////////////////////////////////////////// bool canUnburrow(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y) @@ -437,12 +437,12 @@ bool canUnburrow(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y) ////////////////////////////////////////////////////////////////////////////// -// ũĸ ڷ Ѵ. +// 크리쳐를 뒤로 물러나게 한다. // -// Zone* pZone : -// Creature* pCreature : ũ -// ZoneCoord_t originX : pCreature ǥ x -// ZoneCoord_t originY : pCreature ǥ y +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 물러나게 할 크리쳐 +// ZoneCoord_t originX : pCreature를 물러나게 한 상대방의 좌표 x +// ZoneCoord_t originY : pCreature를 물러나게 한 상대방의 좌표 y ////////////////////////////////////////////////////////////////////////////// Dir_t knockbackCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t originX, ZoneCoord_t originY) { __BEGIN_TRY @@ -485,7 +485,7 @@ Dir_t knockbackCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t originX, Z // if ( pMonster->hasRelic() || pMonster->getBrain() == NULL ) return UP; } - // ũİ ǥ Ѵ. + // 크리쳐가 물러날 좌표 및 방향을 계산한다. ZoneCoord_t nx = pCreature->getX(); ZoneCoord_t ny = pCreature->getY(); ZoneCoord_t cx = nx; @@ -498,7 +498,7 @@ Dir_t knockbackCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t originX, Z if (rOriginTile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION) != NULL) return UP; - // ǥ Ѵ. + // 물러날 좌표를 꼐산한다. switch (dir) { case UP: if (ny > 0) { @@ -546,8 +546,8 @@ Dir_t knockbackCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t originX, Z break; } - // ӿ ִ ° ƴϾ ϰ - // ־ϰ, ũ ִ ¿ Ѵ. + // 관 속에 있는 상태가 아니어야 하고 + // 도착지점은 비어 있어야하고, 크리쳐 역시 움직일 수 있는 상태여야 한다. Tile& rTargetTile = pZone->getTile(nx, ny); if (!pCreature->isFlag(Effect::EFFECT_CLASS_CASKET) && !rTargetTile.isBlocked(pCreature->getMoveMode()) && !pCreature->isFlag(Effect::EFFECT_CLASS_HIDE) && !rTargetTile.hasPortal()) { @@ -555,16 +555,16 @@ Dir_t knockbackCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t originX, Z pCreature->setY(ny); try { - // ŸϿ ũĸ Ѵ. + // 이전 타일에서 크리쳐를 삭제한다. rOriginTile.deleteCreature(pCreature->getObjectID()); - // ŸϿ ũĸ ߰Ѵ. + // 새 타일에 크리쳐를 추가한다. if (!rTargetTile.addCreature(pCreature)) { - // Portal activateŲ ̴. by sigi. 2002.5.6 + // Portal을 activate시킨 경우이다. by sigi. 2002.5.6 return dir; } - // ڸ üũѴ. + // 지뢰를 체크한다. try { checkMine(pZone, pCreature, nx, ny); checkTrap(pZone, pCreature); @@ -572,7 +572,7 @@ Dir_t knockbackCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t originX, Z filelog("CheckMineBug.txt", "%s : %s", "KnockBackCreature", t.toString().c_str()); } - // GCMove/GCAddSlayer/GCAddVampire εijƮ. + // GCMove/GCAddSlayer/GCAddVampire를 브로드캐스트. if (pCreature->isPC()) { pZone->movePCBroadcast(pCreature, cx, cy, nx, ny, false, true); } else { @@ -583,7 +583,7 @@ Dir_t knockbackCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t originX, Z } catch (DuplicatedException& de) { throw Error("Thers's a creature on new tile"); } catch (PortalException&) { - // .. goto . + // 흐흐.. goto 다. } catch (Error& e) { filelog("assertTile.txt", "knockbackCreature : %s", e.toString().c_str()); throw; @@ -597,12 +597,12 @@ Dir_t knockbackCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t originX, Z ////////////////////////////////////////////////////////////////////////////// -// ̵带 ũĸ ߰Ѵ. +// 하이드를 쓴 크리쳐를 존에다 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̵带 ũ -// ZoneCoord_t cx : ũ ǥ x -// ZoneCoord_t cy : ũ ǥ y +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 하이드를 쓴 크리쳐 +// ZoneCoord_t cx : 크리쳐의 원래 좌표 x +// ZoneCoord_t cy : 크리쳐의 원래 좌표 y ////////////////////////////////////////////////////////////////////////////// void addBurrowingCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneCoord_t cy) { __BEGIN_TRY @@ -632,14 +632,14 @@ void addBurrowingCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone Assert(pCreature == newTile.getCreature(pCreature->getMoveMode())); - // ũ ǥ Ѵ. + // 크리쳐의 좌표를 변경한다. pCreature->setXYDir(pt.x, pt.y, pCreature->getDir()); // scanPC(pCreature); - // GCDeleteObject gcDO; // ־.. ٽ ݴ. by sigi + // GCDeleteObject gcDO; // 잠시 넣었던거.. 다시 없앴다. by sigi // gcDO.setObjectID(pCreature->getObjectID()); - // ֺ PC鿡 ˸ GCAddBurrowingCreature + // 주변의 PC들에게 알릴 GCAddBurrowingCreature GCAddBurrowingCreature gcABC; gcABC.setObjectID(pCreature->getObjectID()); gcABC.setName(pCreature->getName()); @@ -648,11 +648,11 @@ void addBurrowingCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone //-------------------------------------------------------------------------------- // - // þ ¿ + 1 Ų. - // ⿡ ON_SIGHT DZ ̴. + // 시야 영역의 상하좌우 모두 + 1 씩 증가시킨다. + // 이유는 방향에 따른 ON_SIGHT 영역이 증가되기 때문이다. // //-------------------------------------------------------------------------------- - // ־ ٽ ݴ. by sigi + // 잠시 넣었던거 다시 없앴다. by sigi /* for (ZoneCoord_t ix = max(0, cx - maxViewportWidth - 1), endx = min(pZone->getWidth() - 1, cx + maxViewportWidth + 1) ; ix <= endx ; ix ++) @@ -675,12 +675,12 @@ void addBurrowingCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone { if (pViewer->isSlayer() && !pViewer->isFlag(Effect::EFFECT_CLASS_DETECT_HIDDEN)) { - // slayer̰ detect_hidden GCDeleteObject + // slayer이고 detect_hidden도 없으면 GCDeleteObject pViewer->getPlayer()->sendPacket(&gcDO); } else { - // vampirḛų.. detect_hidden ִٸ GCAddBurrowingCreature + // vampire이거나.. detect_hidden이 있다면 GCAddBurrowingCreature pViewer->getPlayer()->sendPacket(&gcABC); } }//if @@ -690,7 +690,7 @@ void addBurrowingCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone */ - // broadcastPacketο ִ óϴ.. + // broadcastPacket내부에서 볼수 있는지를 처리하더라.. pZone->broadcastPacket(pt.x, pt.y, &gcABC, pCreature); } else throw EmptyTileNotExistException("addBurrowingCreature() : Tile is not empty."); @@ -700,13 +700,13 @@ void addBurrowingCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone ////////////////////////////////////////////////////////////////////////////// -// ̵带 Ǭ ũĸ ߰Ѵ. +// 하이드를 푼 크리쳐를 존에다 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̵带 Ǭ ũ -// ZoneCoord_t cx : ũ ǥ x -// ZoneCoord_t cy : ũ ǥ y -// Dir_t dir : ũİ +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 하이드를 푼 크리쳐 +// ZoneCoord_t cx : 크리쳐의 원래 좌표 x +// ZoneCoord_t cy : 크리쳐의 원래 좌표 y +// Dir_t dir : 나온 크리쳐가 향할 방향 ////////////////////////////////////////////////////////////////////////////// void addUnburrowCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneCoord_t cy, Dir_t dir) { __BEGIN_TRY @@ -723,16 +723,16 @@ void addUnburrowCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneC Tile& oldTile = pZone->getTile(oldX, oldY); Tile& newTile = pZone->getTile(pt.x, pt.y); - // ġ µ ִ Delete object . + // 이전 위치에서 숨었는데도 볼 수 있는 놈은 Delete object를 보낸다. GCDeleteObject gcDO; gcDO.setObjectID(pCreature->getObjectID()); pZone->broadcastPacket(oldX, oldY, &gcDO, pCreature); - // DeleteObject packet set. + // DeleteObject packet을 보낸후 set. pCreature->removeFlag(Effect::EFFECT_CLASS_HIDE); - // ŸϿ ũĸ , - // ŸϿ 带 ٲ㼭 ߰Ѵ. + // 옛날 타일에서 크리쳐를 지우고, + // 새 타일에 무브모드를 바꿔서 추가한다. try { oldTile.deleteCreature(pCreature->getObjectID()); } catch (Error& e) { @@ -744,20 +744,20 @@ void addUnburrowCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneC Assert(pCreature == newTile.getCreature(pCreature->getMoveMode())); - // ũó ǥ Ѵ. + // 크리처의 좌표를 지정한다. pCreature->setXYDir(pt.x, pt.y, dir); // scanPC(pCreature); Creature::CreatureClass CClass = pCreature->getCreatureClass(); if (CClass == Creature::CREATURE_CLASS_VAMPIRE) { - // ֺ PC鿡 ̾ ߰ϵ Ѵ. + // 주변의 PC들에게 뱀파이어를 추가하도록 한다. Vampire* pVampire = dynamic_cast(pCreature); GCAddVampireFromBurrowing gcAVFB(pVampire->getVampireInfo3()); gcAVFB.setEffectInfo(pVampire->getEffectInfo()); pZone->broadcastPacket(pt.x, pt.y, &gcAVFB, pCreature); - // Դٰ, ο ش. + // 땅에서 잘 나왔다고, 본인에게 보내준다. GCUnburrowOK gcUnburrowOK(pt.x, pt.y, dir); Player* pPlayer = pCreature->getPlayer(); GamePlayer* pGamePlayer = dynamic_cast(pPlayer); @@ -781,8 +781,8 @@ void addUnburrowCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneC throw Error("invalid creature type"); } } else { - // ڸ ã , - // ߴٰ ο ش. + // 적당한 자리를 찾지 못해, + // 땅에서 나오지 못했다고 본인에게 보내준다. if (pCreature->isPC()) { GCUnburrowFail gcUnburrowFail; pCreature->getPlayer()->sendPacket(&gcUnburrowFail); @@ -797,12 +797,12 @@ void addUnburrowCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneC ////////////////////////////////////////////////////////////////////////////// -// Ǭ ũĸ ߰Ѵ. +// 변신을 푼 크리쳐를 존에다 추가한다. // -// Zone* pZone : -// Creature* pCreature : Ǭ ũ -// bool bForce : Ʈ duration Ⱑ ʾҴµ, -// Ǫ ΰ? +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 변신을 푼 크리쳐 +// bool bForce : 이펙트의 duration이 만기가 되지 않았는데, +// 강제로 푸는 것인가? ////////////////////////////////////////////////////////////////////////////// void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) { __BEGIN_TRY @@ -811,7 +811,7 @@ void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) { Assert(pZone != NULL); Assert(pCreature != NULL); - // ° ´ üũ Ѵ. + // 현재 변신 상태가 맞는지 체크를 한다. Assert(pCreature->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF) || pCreature->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT) || pCreature->isFlag(Effect::EFFECT_CLASS_SUMMON_SYLPH) || @@ -836,17 +836,17 @@ void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) { gcDO.setObjectID(pCreature->getObjectID()); pZone->broadcastPacket(oldX, oldY, &gcDO, pCreature); - // Ʈ ش. + // 이펙트를 삭제해 준다. EffectManager* pEffectManager = pCreature->getEffectManager(); Assert(pEffectManager != NULL); if (pCreature->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF)) { - pCreature->removeFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF); // DeleteObject packet set. + pCreature->removeFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF); // DeleteObject packet을 보낸후 set. - // Ʈ duraration Ⱑ ʾҴµ, Ʈ Ϸ - // deleteEffect Լ ҷ Ѵ. + // 이펙트의 duraration이 만기가 되지 않았는데, 이펙트를 삭제하려면 + // 강제로 deleteEffect 함수를 불러줘야 한다. if (bForce) { - // by sigi. 2002.7.2. RemoveEffect ش. + // by sigi. 2002.7.2. RemoveEffect 날려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList((EffectID_t)Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF); @@ -872,12 +872,12 @@ void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) { } } if (pCreature->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WERWOLF)) { - pCreature->removeFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WERWOLF); // DeleteObject packet set. + pCreature->removeFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WERWOLF); // DeleteObject packet을 보낸후 set. - // Ʈ duraration Ⱑ ʾҴµ, Ʈ Ϸ - // deleteEffect Լ ҷ Ѵ. + // 이펙트의 duraration이 만기가 되지 않았는데, 이펙트를 삭제하려면 + // 강제로 deleteEffect 함수를 불러줘야 한다. if (bForce) { - // by sigi. 2002.7.2. RemoveEffect ش. + // by sigi. 2002.7.2. RemoveEffect 날려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList((EffectID_t)Effect::EFFECT_CLASS_TRANSFORM_TO_WERWOLF); @@ -902,12 +902,12 @@ void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) { pMonster->initAllStat(); } } else if (pCreature->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT)) { - pCreature->removeFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT); // DeleteObject packet set. + pCreature->removeFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT); // DeleteObject packet을 보낸후 set. - // Ʈ duraration Ⱑ ʾҴµ, Ʈ Ϸ - // deleteEffect Լ ҷ Ѵ. + // 이펙트의 duraration이 만기가 되지 않았는데, 이펙트를 삭제하려면 + // 강제로 deleteEffect 함수를 불러줘야 한다. if (bForce) { - // by sigi. 2002.7.2. RemoveEffect ش. + // by sigi. 2002.7.2. RemoveEffect 날려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList((EffectID_t)Effect::EFFECT_CLASS_TRANSFORM_TO_BAT); @@ -933,8 +933,8 @@ void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) { } } - // ŸϿ ũĸ ϰ, 带 ٲ - // ŸϿ ߰Ѵ. + // 기존 타일에서 크리쳐를 제거하고, 무브 모드를 바꿔준 다음에 + // 새 타일에 추가한다. Tile& oldTile = pZone->getTile(oldX, oldY); Tile& newTile = pZone->getTile(pt.x, pt.y); @@ -949,10 +949,10 @@ void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) { Assert(pCreature == newTile.getCreature(pCreature->getMoveMode())); - // ũ ǥ ش. + // 크리쳐의 좌표를 지정해 준다. pCreature->setXYDir(pt.x, pt.y, pCreature->getDir()); - // ũ Ŭ , εijѴ. + // 크리쳐 클래스에 따라, 존에다 브로드캐스팅한다. Creature::CreatureClass CClass = pCreature->getCreatureClass(); if (CClass == Creature::CREATURE_CLASS_VAMPIRE) { @@ -992,9 +992,9 @@ void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) { } } - // Ǭ ̾, ÷̾ ӵ ش. - // ̴ Ŭ̾Ʈ ӵ - // ̴. -- 輺 + // 변신을 푼 놈이 뱀파이어, 즉 플레이어라면 공격 속도를 보내준다. + // 이는 클라이언트에서 박쥐로 변신을 했을 때 이전의 공격 속도를 + // 저장할 수 없는 버그 때문이다. -- 김성민 if (pCreature->isVampire()) { Vampire* pVampire = dynamic_cast(pCreature); GCModifyInformation gcMI; @@ -1008,12 +1008,12 @@ void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce) { ////////////////////////////////////////////////////////////////////////////// -// ̴ ũĸ ߰Ѵ. +// 안 보이는 크리쳐를 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̴ ũ -// ZoneCoord_t cx : ũ ǥ x -// ZoneCoord_t cy : ũ ǥ y +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 안 보이는 크리쳐 +// ZoneCoord_t cx : 크리쳐의 원래 좌표 x +// ZoneCoord_t cy : 크리쳐의 원래 좌표 y ////////////////////////////////////////////////////////////////////////////// void addInvisibleCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneCoord_t cy) @@ -1023,7 +1023,7 @@ void addInvisibleCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone Assert(pZone != NULL); Assert(pCreature != NULL); - // ̾ ͸ ȭ ϴ. + // 뱀파이어나 몬스터만이 투명화가 가능하다. Assert(pCreature->isVampire() || pCreature->isMonster()); ObjectID_t creatureID = pCreature->getObjectID(); @@ -1042,8 +1042,8 @@ void addInvisibleCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone //-------------------------------------------------------------------------------- // - // þ ¿ + 1 Ų. - // ⿡ ON_SIGHT DZ ̴. + // 시야 영역의 상하좌우 모두 + 1 씩 증가시킨다. + // 이유는 방향에 따른 ON_SIGHT 영역이 증가되기 때문이다. // //-------------------------------------------------------------------------------- for (ZoneCoord_t ix = max(0, cx - maxViewportWidth - 1), @@ -1062,7 +1062,7 @@ void addInvisibleCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone Creature* pViewer = dynamic_cast(*itr); if (pViewer != pCreature && pViewer->isPC() && (pViewer->getVisionState(cx, cy) >= IN_SIGHT)) { - // Viewer ObservingEye Ʈ ´. + // Viewer 의 ObservingEye 이펙트를 가져온다. EffectObservingEye* pEffectObservingEye = NULL; if (pViewer->isFlag(Effect::EFFECT_CLASS_OBSERVING_EYE)) { pEffectObservingEye = @@ -1070,7 +1070,7 @@ void addInvisibleCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone // Assert( pEffectObservingEye != NULL ); } - // Viewer Gnome's Whisper Ʈ ´. + // Viewer 의 Gnome's Whisper 이펙트를 가져온다. EffectGnomesWhisper* pEffectGnomesWhisper = NULL; if (pViewer->isFlag(Effect::EFFECT_CLASS_GNOMES_WHISPER)) { pEffectGnomesWhisper = dynamic_cast( @@ -1094,7 +1094,7 @@ void addInvisibleCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone pViewer->getPlayer()->sendPacket(&gcDO); // cout << "send delete object" << endl; } - // invisbility ؼ, .. + // invisbility와 관련해서만, 볼 수 없는자.. /* if (!pViewer->isFlag(Effect::EFFECT_CLASS_DETECT_INVISIBILITY) && pViewer->isSlayer()) { @@ -1105,7 +1105,7 @@ void addInvisibleCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone pViewer->getPlayer()->sendPacket(&gcAddEffect); }*/ } else { - // Ƿ, ϰ͵ . + // 원래 볼 수 없었으므로, 암것도 할 일이 없다. } } // if } // for @@ -1116,11 +1116,11 @@ void addInvisibleCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zone } ////////////////////////////////////////////////////////////////////////////// -// ̴ ũİ , ũĸ ߰Ѵ. +// 안 보이던 크리쳐가 보일 경우, 이 크리쳐를 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̴ ũ -// bool bForce : visible ° Ǿ? +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 안 보이던 크리쳐 +// bool bForce : 강제로 visible 상태가 되었나? ////////////////////////////////////////////////////////////////////////////// void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) @@ -1130,10 +1130,10 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) Assert(pZone != NULL); Assert(pCreature != NULL); - // ̾ ͸ ȭ ϴ. + // 뱀파이어나 몬스터만이 투명화가 가능하다. Assert(pCreature->isVampire() || pCreature->isMonster()); - // ÷װ ־ Ѵ. + // 플래그가 켜져있어야 한다. Assert(pCreature->isFlag(Effect::EFFECT_CLASS_INVISIBILITY)); ZoneCoord_t cx = pCreature->getX(); @@ -1150,7 +1150,7 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) if (CClass == Creature::CREATURE_CLASS_MONSTER) { Monster* pMonster = dynamic_cast(pCreature); - if (pCreature->isFlag(Effect::EFFECT_CLASS_HIDE)) // Ұ + if (pCreature->isFlag(Effect::EFFECT_CLASS_HIDE)) // 사실 불가능 { gcABC.setObjectID(pMonster->getObjectID()); gcABC.setName(pMonster->getName()); @@ -1159,9 +1159,9 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) pGCAddXXX = &gcABC; } else { - // EffectManager ִ° ƴϱ ... - // ӽ÷ ؼ ش. - // ѽð Invisible - -; by sigi + // 몹의 EffectManager에 들어가있는게 아니기 때문에... + // 임시로 생성해서 보내준다. + // 몹은 무한시간 Invisible - -; by sigi EffectInfo* pEffectInfo = new EffectInfo; pEffectInfo->addListElement(Effect::EFFECT_CLASS_INVISIBILITY, 0xFFFF); @@ -1180,7 +1180,7 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) } } else if (CClass == Creature::CREATURE_CLASS_VAMPIRE) { Vampire* pVampire = dynamic_cast(pCreature); - if (pCreature->isFlag(Effect::EFFECT_CLASS_HIDE)) // Ұ + if (pCreature->isFlag(Effect::EFFECT_CLASS_HIDE)) // 사실 불가능 { gcABC.setObjectID(pVampire->getObjectID()); gcABC.setName(pVampire->getName()); @@ -1209,8 +1209,8 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) //-------------------------------------------------------------------------------- // - // þ ¿ + 1 Ų. - // ⿡ ON_SIGHT DZ ̴. + // 시야 영역의 상하좌우 모두 + 1 씩 증가시킨다. + // 이유는 방향에 따른 ON_SIGHT 영역이 증가되기 때문이다. // //-------------------------------------------------------------------------------- for (ZoneCoord_t ix = max(0, cx - maxViewportWidth - 1), @@ -1229,7 +1229,7 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) Creature* pViewer = dynamic_cast(*itr); - // Viewer Revealer Ʈ ´. + // Viewer 의 Revealer 이펙트를 가져온다. // EffectRevealer* pEffectRevealer = NULL; // if ( pViewer->isFlag( Effect::EFFECT_CLASS_REVEALER ) ) // { @@ -1237,7 +1237,7 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) // Effect::EFFECT_CLASS_REVEALER ) ); Assert( pEffectRevealer ); // } - // Viewer Observing Eye Ʈ ´. + // Viewer 의 Observing Eye 이펙트를 가져온다. EffectObservingEye* pEffectObservingEye = NULL; if (pViewer->isFlag(Effect::EFFECT_CLASS_OBSERVING_EYE)) { pEffectObservingEye = @@ -1245,7 +1245,7 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) // Assert( pEffectObservingEye != NULL ); } - // Viewer Gnome's Whisper Ʈ ´. + // Viewer 의 Gnome's Whisper 이펙트를 가져온다. EffectGnomesWhisper* pEffectGnomesWhisper = NULL; if (pViewer->isFlag(Effect::EFFECT_CLASS_GNOMES_WHISPER)) { pEffectGnomesWhisper = @@ -1254,13 +1254,13 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) } if (pViewer != pCreature && pViewer->isPC() && (pViewer->getVisionState(cx, cy) >= IN_SIGHT)) { - // ּó by sigi + // 주석처리 by sigi // if ((!pCreature->isFlag(Effect::EFFECT_CLASS_HIDE) // || pViewer->isFlag(Effect::EFFECT_CLASS_DETECT_HIDDEN))) { - // ij ֵ鿡 ؼ - // ij Addش. - // invisbility ؼ, .. + // 이전에 이 캐릭을 못 보던 애들에 한해서 + // 이 캐릭을 Add시켜준다. + // invisbility와 관련해서만, 볼 수 없는자.. if (!pViewer->isFlag(Effect::EFFECT_CLASS_DETECT_INVISIBILITY) && (pViewer->isSlayer() || pViewer->isOusters()) && !(pEffectObservingEye != NULL && pEffectObservingEye->canSeeInvisibility(pCreature)) && @@ -1270,10 +1270,10 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) } // else { - // Ƿ, ϰ͵ . + // 원래 볼 수 없었으므로, 암것도 할 일이 없다. } - // ¶ų invisibleǮٴ° Ѵ. by sigi + // 어쨋거나 invisible풀린다는건 보내줘야한다. by sigi pViewer->getPlayer()->sendPacket(&gcRemoveEffect); } // if @@ -1286,7 +1286,7 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) //-------------------------------------------- - // effect manager Effect Ѵ. + // effect manager에서 Effect를 강제 삭제한다. //-------------------------------------------- if (bForced == true) { EffectManager* pEffectManager = pCreature->getEffectManager(); @@ -1307,12 +1307,12 @@ void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced) } ////////////////////////////////////////////////////////////////////////////// -// ̴ ũĸ ߰Ѵ. +// 안 보이는 크리쳐를 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̴ ũ -// ZoneCoord_t cx : ũ ǥ x -// ZoneCoord_t cy : ũ ǥ y +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 안 보이는 크리쳐 +// ZoneCoord_t cx : 크리쳐의 원래 좌표 x +// ZoneCoord_t cy : 크리쳐의 원래 좌표 y ////////////////////////////////////////////////////////////////////////////// void addSnipingModeCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneCoord_t cy) @@ -1322,7 +1322,7 @@ void addSnipingModeCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zo Assert(pZone != NULL); Assert(pCreature != NULL); - // ̾ ִ. + // 슬레이어만 이 기술을 쓸 수 있다. Assert(pCreature->isSlayer()); ObjectID_t creatureID = pCreature->getObjectID(); @@ -1341,8 +1341,8 @@ void addSnipingModeCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zo //-------------------------------------------------------------------------------- // - // þ ¿ + 1 Ų. - // ⿡ ON_SIGHT DZ ̴. + // 시야 영역의 상하좌우 모두 + 1 씩 증가시킨다. + // 이유는 방향에 따른 ON_SIGHT 영역이 증가되기 때문이다. // //-------------------------------------------------------------------------------- for (ZoneCoord_t ix = max(0, cx - maxViewportWidth - 1), @@ -1361,14 +1361,14 @@ void addSnipingModeCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zo Creature* pViewer = dynamic_cast(*itr); if (pViewer != pCreature && pViewer->isPC() && (pViewer->getVisionState(cx, cy) >= IN_SIGHT)) { - // Viewer Revealer Ʈ ´. + // Viewer 의 Revealer 이펙트를 가져온다. // EffectRevealer* pEffectRevealer = NULL; // if ( pViewer->isFlag( Effect::EFFECT_CLASS_REVEALER ) ) // { // pEffectRevealer = dynamic_cast(pViewer->findEffect( // Effect::EFFECT_CLASS_REVEALER ) ); Assert( pEffectRevealer ); // } - // Viewer Gnome's Whisper Ʈ ´. + // Viewer 의 Gnome's Whisper 이펙트를 가져온다. EffectGnomesWhisper* pEffectGnomesWhisper = NULL; if (pViewer->isFlag(Effect::EFFECT_CLASS_GNOMES_WHISPER)) { pEffectGnomesWhisper = dynamic_cast( @@ -1392,7 +1392,7 @@ void addSnipingModeCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zo pViewer->getPlayer()->sendPacket(&gcDO); } - // invisbility ؼ, .. + // invisbility와 관련해서만, 볼 수 없는자.. /* if (!pViewer->isFlag(Effect::EFFECT_CLASS_DETECT_INVISIBILITY) || pViewer->isVampire()) { @@ -1403,7 +1403,7 @@ void addSnipingModeCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zo pViewer->getPlayer()->sendPacket(&gcAddEffect); }*/ } else { - // Ƿ, ϰ͵ . + // 원래 볼 수 없었으므로, 암것도 할 일이 없다. } } // if } // for @@ -1414,11 +1414,11 @@ void addSnipingModeCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, Zo } ////////////////////////////////////////////////////////////////////////////// -// ̴ ũİ , ũĸ ߰Ѵ. +// 안 보이던 크리쳐가 보일 경우, 이 크리쳐를 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̴ ũ -// bool bForce : visible ° Ǿ? +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 안 보이던 크리쳐 +// bool bForce : 강제로 visible 상태가 되었나? ////////////////////////////////////////////////////////////////////////////// void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) @@ -1428,10 +1428,10 @@ void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) Assert(pZone != NULL); Assert(pCreature != NULL); - // ̾ ϴ. + // 슬레이어만이 스나이핑이 가능하다. Assert(pCreature->isSlayer()); - // ÷װ ־ Ѵ. + // 플래그가 켜져있어야 한다. Assert(pCreature->isFlag(Effect::EFFECT_CLASS_SNIPING_MODE)); ZoneCoord_t cx = pCreature->getX(); @@ -1459,8 +1459,8 @@ void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) //-------------------------------------------------------------------------------- // - // þ ¿ + 1 Ų. - // ⿡ ON_SIGHT DZ ̴. + // 시야 영역의 상하좌우 모두 + 1 씩 증가시킨다. + // 이유는 방향에 따른 ON_SIGHT 영역이 증가되기 때문이다. // //-------------------------------------------------------------------------------- for (ZoneCoord_t ix = max(0, cx - maxViewportWidth - 1), @@ -1479,7 +1479,7 @@ void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) Creature* pViewer = dynamic_cast(*itr); - // Viewer Revealer Ʈ ´. + // Viewer 의 Revealer 이펙트를 가져온다. // EffectRevealer* pEffectRevealer = NULL; // if ( pViewer->isFlag( Effect::EFFECT_CLASS_REVEALER ) ) // { @@ -1487,7 +1487,7 @@ void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) // dynamic_cast(pViewer->findEffect(Effect::EFFECT_CLASS_REVEALER)); // Assert( pEffectRevealer ); // } - // Viewer Gnome's Whisper Ʈ ´. + // Viewer 의 Gnome's Whisper 이펙트를 가져온다. EffectGnomesWhisper* pEffectGnomesWhisper = NULL; if (pViewer->isFlag(Effect::EFFECT_CLASS_GNOMES_WHISPER)) { pEffectGnomesWhisper = @@ -1502,7 +1502,7 @@ void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) // || ( pEffectRevealer != NULL && pEffectRevealer->canSeeHide( pCreature ) ) //)) { - // invisbility ؼ, .. + // invisbility와 관련해서만, 볼 수 없는자.. if (!pViewer->isFlag(Effect::EFFECT_CLASS_DETECT_INVISIBILITY) || (pEffectGnomesWhisper != NULL && pEffectGnomesWhisper->canSeeSniping())) // && !( pEffectRevealer != NULL && pEffectRevealer->canSeeSniping( @@ -1511,10 +1511,10 @@ void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) pViewer->getPlayer()->sendPacket(pGCAddXXX); } } else { - // Ƿ, ϰ͵ . + // 원래 볼 수 없었으므로, 암것도 할 일이 없다. } - // sniping mode Ǯٴ ش. + // sniping mode 가 풀린다는 걸 보내준다. pViewer->getPlayer()->sendPacket(&gcRemoveEffect); } // if @@ -1527,7 +1527,7 @@ void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) //-------------------------------------------- - // effect manager Effect Ѵ. + // effect manager에서 Effect를 강제 삭제한다. //-------------------------------------------- if (bForced == true) { EffectManager* pEffectManager = pCreature->getEffectManager(); @@ -1546,12 +1546,12 @@ void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced) } ////////////////////////////////////////////////////////////////////////////// -// ڸ Ѵ. +// 존에다 지뢰를 더한다. // -// Zone* pZone : -// Mine* pMine : ü -// ZoneCoord_t cx : ڸ ǥ x -// ZoneCoord_t cy : ڸ ǥ y +// Zone* pZone : 존에 대한 포인터 +// Mine* pMine : 지뢰 객체에 대한 포인터 +// ZoneCoord_t cx : 지뢰를 더할 좌표 x +// ZoneCoord_t cy : 지뢰를 더할 좌표 y ////////////////////////////////////////////////////////////////////////////// void addInstalledMine(Zone* pZone, Mine* pMine, ZoneCoord_t cx, ZoneCoord_t cy) @@ -1578,8 +1578,8 @@ void addInstalledMine(Zone* pZone, Mine* pMine, ZoneCoord_t cx, ZoneCoord_t cy) //-------------------------------------------------------------------------------- // - // þ ¿ + 1 Ų. - // ⿡ ON_SIGHT DZ ̴. + // 시야 영역의 상하좌우 모두 + 1 씩 증가시킨다. + // 이유는 방향에 따른 ON_SIGHT 영역이 증가되기 때문이다. // //-------------------------------------------------------------------------------- for (ZoneCoord_t ix = max(0, cx - maxViewportWidth - 1), @@ -1617,12 +1617,12 @@ void addInstalledMine(Zone* pZone, Mine* pMine, ZoneCoord_t cx, ZoneCoord_t cy) ////////////////////////////////////////////////////////////////////////////// -// Ư ũİ ڸ ʾҴ üũѴ. +// 특정 크리쳐가 지뢰를 밟지 않았는지 체크한다. // -// Zone* pZone : -// Creature* pCreature : ˻ ũ -// ZoneCoord_t X : ˻ ǥ x -// ZoneCoord_t Y : ˻ ǥ y +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 검사할 크리쳐 +// ZoneCoord_t X : 검사할 좌표 x +// ZoneCoord_t Y : 검사할 좌표 y ////////////////////////////////////////////////////////////////////////////// bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y) @@ -1638,20 +1638,20 @@ bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y) if (bNonPK && pCreature->isPC()) return false; - // ̾ . + // 슬레이어가 밟을 순 없다. if (pCreature->isSlayer()) return false; Assert(pZone != NULL); - // ִ by sigi. 2002.11.7 - // ĽŰ ʴ´. + // 위에 있던걸 여기로 내림 by sigi. 2002.11.7 + // 만일 안전지대라면 폭파시키지 않는다. if (pZone->getZoneLevel(X, Y) & SAFE_ZONE) return false; Tile& rTile = pZone->getTile(X, Y); - // ŸϿ  ĽŰ ʴ´. + // 타일에 아이템이 없어도 폭파시키지 않는다. if (!rTile.hasItem()) return false; @@ -1659,8 +1659,8 @@ bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y) Item* pItem = rTile.getItem(); - // ٴڿ ִ ν ڰ ƴϰų, - // ũİ ɾٴϴ ũİ ƴ϶ ڸ ĽŰ ʴ´. + // 바닥에 있는 아이템이 인스톨된 지뢰가 아니거나, + // 크리쳐가 걸어다니는 크리쳐가 아니라면 지뢰를 폭파시키지 않는다. if (pItem->getItemClass() != Item::ITEM_CLASS_MINE) return false; if (pItem->isFlag(Effect::EFFECT_CLASS_INSTALL) == false) @@ -1682,9 +1682,9 @@ bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y) string InstallerName = pMine->getInstallerName(); int PartyID = pMine->getInstallerPartyID(); - BYTE explodeType = Type; // + BYTE explodeType = Type; // 폭발 형태 - // ڰ , ϴ ش. + // 지뢰가 폭발했으니, 일단 무조건 삭제해 준다. pZone->deleteItem(pMine, X, Y); GCDeleteObject gcDO; @@ -1719,7 +1719,7 @@ bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y) const int* yOffsetByEType = NULL; int tiles = 0; - // ŸԿ offset ũ ´. + // 지뢰 타입에 따른 폭발 offset 마스크를 가져온다. getExplosionTypeXYOffset(explodeType, Dir, xOffsetByEType, yOffsetByEType, tiles); VSRect rect(0, 0, pZone->getWidth() - 1, pZone->getHeight() - 1); @@ -1729,18 +1729,18 @@ bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y) tileY = Y + yOffsetByEType[tileI]; // cout << "Check1 Tile X : " << (int)tileX << "," << " Tile Y : " << (int)tileY << endl; - // ǥ ̰, 밡 ƴ϶... + // 현재 좌표가 존 내부이고, 안전 지대가 아니라면... if (rect.ptInRect(tileX, tileY) && !(pZone->getZoneLevel(tileX, tileY) & SAFE_ZONE)) { // if( tileX != X || tileY != Y ) checkMine( pZone, tileX, tileY ); const Tile& tile = pZone->getTile(tileX, tileY); const forward_list& oList = tile.getObjectList(); - // Ÿ Ʈ ؼ 縦 Ѵ. + // 타일 위의 모든 오브젝트에 대해서 조사를 한다. for (forward_list::const_iterator itr = oList.begin(); itr != oList.end(); itr++) { - // Ȯ + // 조건을 확인 Object* pObject = *itr; if (pObject->getObjectClass() == Object::OBJECT_CLASS_CREATURE) { - // Damage Դ ͵鸸 cList ߰Ų. + // Damage를 입는 것들만 cList에 추가시킨다. Creature* pTargetCreature = dynamic_cast(pObject); if (pTargetCreature->isSlayer()) { // Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); @@ -1784,9 +1784,9 @@ bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y) } else if (pTargetCreature->isMonster()) { Monster* pMonster = dynamic_cast(pTargetCreature); - // ġ ߰ ش. - // ´ ̰, ڰ ̶, - // ϴ 켱 ̺ ־ Ѵ. + // 지뢰 설치자의 데미지를 추가해 준다. + // 맞는 놈이 몬스터이고, 공격자가 사람이라면, + // 데미지에 따라서 변하는 우선권 테이블을 갱신해 주어야 한다. pMonster->addPrecedence(InstallerName, PartyID, Damage); pMonster->setLastHitCreatureClass(Creature::CREATURE_CLASS_SLAYER); } @@ -1801,12 +1801,12 @@ bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y) } ////////////////////////////////////////////////////////////////////////////// -// ڰ ƴ üũ Ѵ. +// 지뢰가 연쇄로 터지는지 아닌지 체크 한다. // -// Zone* pZone : -// Creature* pCreature : ˻ ũ -// ZoneCoord_t X : ˻ ǥ x -// ZoneCoord_t Y : ˻ ǥ y +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 검사할 크리쳐 +// ZoneCoord_t X : 검사할 좌표 x +// ZoneCoord_t Y : 검사할 좌표 y ////////////////////////////////////////////////////////////////////////////// bool checkMine(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y) @@ -1815,13 +1815,13 @@ bool checkMine(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y) Assert(pZone != NULL); - // ĽŰ ʴ´. + // 만일 안전지대라면 폭파시키지 않는다. if (pZone->getZoneLevel(X, Y) & SAFE_ZONE) return false; Tile& rTile = pZone->getTile(X, Y); - // ŸϿ  ĽŰ ʴ´. + // 타일에 아이템이 없어도 폭파시키지 않는다. if (rTile.hasItem() == false) return false; @@ -1829,8 +1829,8 @@ bool checkMine(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y) Item* pItem = rTile.getItem(); - // ٴڿ ִ ν ڰ ƴϰų, - // ũİ ɾٴϴ ũİ ƴ϶ ڸ ĽŰ ʴ´. + // 바닥에 있는 아이템이 인스톨된 지뢰가 아니거나, + // 크리쳐가 걸어다니는 크리쳐가 아니라면 지뢰를 폭파시키지 않는다. if (pItem->getItemClass() != Item::ITEM_CLASS_MINE) return false; if (pItem->isFlag(Effect::EFFECT_CLASS_INSTALL) == false) @@ -1850,7 +1850,7 @@ bool checkMine(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y) string InstallerName = pMine->getInstallerName(); int PartyID = pMine->getInstallerPartyID(); - BYTE explodeType = Type; // + BYTE explodeType = Type; // 폭발 형태 /* switch(Type) { @@ -1871,7 +1871,7 @@ bool checkMine(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y) }; */ - // ڰ , ϴ ش. + // 지뢰가 폭발했으니, 일단 삭제해 준다. pZone->deleteItem(pMine, X, Y); GCDeleteObject gcDO; @@ -1887,7 +1887,7 @@ bool checkMine(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y) const int* yOffsetByEType = NULL; int tiles = 0; - // ŸԿ offset ũ ´. + // 지뢰 타입에 따른 폭발 offset 마스크를 가져온다. getExplosionTypeXYOffset(explodeType, Dir, xOffsetByEType, yOffsetByEType, tiles); VSRect rect(0, 0, pZone->getWidth() - 1, pZone->getHeight() - 1); @@ -1897,19 +1897,19 @@ bool checkMine(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y) tileY = Y + yOffsetByEType[tileI]; // cout << "Check2 Tile X : " << (int)tileX << "," << " Tile Y : " << (int)tileY << endl; - // ǥ ̰, 밡 ƴ϶... + // 현재 좌표가 존 내부이고, 안전 지대가 아니라면... if (rect.ptInRect(tileX, tileY) && !(pZone->getZoneLevel(tileX, tileY) & SAFE_ZONE)) { // if( tileX != X || tileY != Y ) checkMine( pZone, tileX, tileY ); const Tile& tile = pZone->getTile(tileX, tileY); const forward_list& oList = tile.getObjectList(); - // Ÿ Ʈ ؼ 縦 Ѵ. + // 타일 위의 모든 오브젝트에 대해서 조사를 한다. for (forward_list::const_iterator itr = oList.begin(); itr != oList.end(); itr++) { - // Ȯ + // 조건을 확인 Object* pObject = *itr; if (pObject->getObjectClass() == Object::OBJECT_CLASS_CREATURE) { - // Damage Դ ͵鸸 cList ߰Ų. + // Damage를 입는 것들만 cList에 추가시킨다. Creature* pTargetCreature = dynamic_cast(pObject); if (pTargetCreature->isSlayer()) { // Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); @@ -1953,9 +1953,9 @@ bool checkMine(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y) } else if (pTargetCreature->isMonster()) { Monster* pMonster = dynamic_cast(pTargetCreature); - // ġ ߰ ش. - // ´ ̰, ڰ ̶, - // ϴ 켱 ̺ ־ Ѵ. + // 지뢰 설치자의 데미지를 추가해 준다. + // 맞는 놈이 몬스터이고, 공격자가 사람이라면, + // 데미지에 따라서 변하는 우선권 테이블을 갱신해 주어야 한다. pMonster->addPrecedence(InstallerName, PartyID, Damage); pMonster->setLastHitCreatureClass(Creature::CREATURE_CLASS_SLAYER); } @@ -2002,13 +2002,13 @@ bool checkTrap(Zone* pZone, Creature* pCreature) { } ////////////////////////////////////////////////////////////////////////////// -// Ư ũĸ ٸ ̵Ų. +// 특정 크리쳐를 다른 존으로 이동시킨다. // -// Creature* pCreature : ̵ ũ -// ZoneID_t TargetZoneID : ̵ ID -// ZoneCoord_t TargetX : ̵ ǥ X -// ZoneCoord_t TargetY : ̵ ǥ Y -// bool bSendMoveOK : GCMoveOK ִ° +// Creature* pCreature : 이동할 크리쳐 +// ZoneID_t TargetZoneID : 이동할 존 ID +// ZoneCoord_t TargetX : 이동할 존 좌표 X +// ZoneCoord_t TargetY : 이동할 존 좌표 Y +// bool bSendMoveOK : GCMoveOK를 보내주는가에 대한 여부 ////////////////////////////////////////////////////////////////////////////// void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t TX, ZoneCoord_t TY, bool bSendMoveOK) @@ -2020,8 +2020,8 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T GamePlayer* pGamePlayer = dynamic_cast(pCreature->getPlayer()); Zone* pZone = pCreature->getZone(); - // GPS_NORMAL 츸 transportCreature ִ. - // ٸ Ѵ. + // GPS_NORMAL인 경우만 transportCreature를 할 수 있다. + // 다른 경우는 무시한다. // by sigi. 2002.12.10 if (pGamePlayer->getPlayerStatus() != GPS_NORMAL) { @@ -2041,21 +2041,21 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T if (bSendMoveOK) { cout << "ZoneUtil.cpp step 2" << endl; - // ϴ ٺ Ŭ̾Ʈ ؼ GCMoveOK ش. + // 일단 바보 클라이언트를 위해서 GCMoveOK 를 날려준다. GCMoveOK gcMoveOK(pCreature->getX(), pCreature->getY(), pCreature->getDir()); pGamePlayer->sendPacket(&gcMoveOK); } // #if defined(__THAILAND_SERVER__) || defined(__CHINA_SERVER__) - // ZoneInfo OpenLevel warp/zone̵ ´. + // ZoneInfo 의 OpenLevel에 따라 warp/zone이동을 막는다. // add by inthesky 2004.07.26 ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(TargetZoneID); // add by Sonic 2006.10.21 - if (TargetZoneID == 1013) // ˹ﰺ + if (TargetZoneID == 1013) // 각薑쟁갰뒈인 { cout << "ZoneUtil.cpp step New1013" << endl; if (pZoneInfo->isNoPortalZone()) { @@ -2064,11 +2064,11 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T // Item* pItem=pPC->getInventory()->findItem(Item::ITEM_CLASS_MONEY,fitItem); CoordInven_t InvenX = 0; CoordInven_t InvenY = 0; - ItemType_t fitItem = 3; // Ҷ + ItemType_t fitItem = 3; // 愷秊꿇 Item* pItem = pPC->getInventory()->findItem(Item::ITEM_CLASS_MOON_CARD, fitItem, InvenX, InvenY); GCSystemMessage gcSystemMessage1; if (pItem == NULL) { - gcSystemMessage1.setMessage("õαӵ!"); + gcSystemMessage1.setMessage("쏵흙맡뒈인극矜撻唐陵귑!"); pGamePlayer->sendPacket(&gcSystemMessage1); return; } @@ -2110,7 +2110,7 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T try { ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(TargetZoneID); - // ȭ ̰ ƴϸ.. + // 유료화 존이고 유료사용중이 아니면.. if (pZoneInfo != NULL && (pZoneInfo->isPayPlay() || pZoneInfo->isPremiumZone()) && !pGamePlayer->isPayPlaying() && !(g_pWarSystem->hasActiveRaceWar() && pZoneInfo->isHolyLand())) { cout << "ZoneUtil.cpp step 4" << endl; @@ -2120,21 +2120,21 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T // Statement* pStmt = NULL; string connectIP = pGamePlayer->getSocket()->getHost(); - // Ѱ? + // 유료 서비스 사용이 가능한가? if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { cout << "ZoneUtil.cpp step 5" << endl; sendPayInfo(pGamePlayer); - // ã´. + // 존을 찾는다. Zone* pZone = getZoneByZoneID(TargetZoneID); Assert(pZone != NULL); - //  ִ° - // PK̶  ִ°. + // 마스터 레어라면 들어갈 수 있는가 + // PK존이라면 들어갈 수 있는가. bEnterZone = enterMasterLair(pZone, pCreature); } else if (pZoneInfo->isPayPlay() && - !pGamePlayer->isFamilyFreePass()) // йи н ִ. + !pGamePlayer->isFamilyFreePass()) // 패밀리 프리 패스는 유료존으로 갈 수 있다. { cout << "ZoneUtil.cpp step 6" << endl; @@ -2144,11 +2144,11 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T if (!bEnterZone) { cout << "ZoneUtil.cpp step 7" << endl; - //  ̴. - // Ұ - // - // slayer : Ȱϴ . - // vampire : Ȱϴ . + // 현재 존에 들어갈 수 없는 경우이다. + // 유료 서비스 사용 불가인 경우 + // 마스터 레어인 경우 + // slayer : 에슬남동에서 부활하는 곳으로 간다. + // vampire : 림보남동에서 부활하는 곳으로 간다. ZONE_COORD zoneCoord; bool bFindPos = false; @@ -2166,7 +2166,7 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T bNoMoney = true; } else { - // , ̴... + // 아, 비상이닷... filelog("zoneUtilError.txt", "[ZoneUtil::transportCreature] ResurrectInfo is not esta.."); throw Error("Critical Error : ResurrectInfo is not established!1"); } @@ -2178,10 +2178,10 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T } - // 켱 PC ϰ, ÷̾ ZPM -> IPM ű. + // 우선 이전 존에서 PC 를 삭제하고, 플레이어를 ZPM -> IPM 으로 옮긴다. try { - // slayer ̸ Ÿ ִ - // ̸ ش. + // 요금 지불 안한 slayer가 오토바이를 타고 있는 경우는 + // 오토바이를 없앤다. if (bNoMoney && pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); if (pSlayer->hasRideMotorcycle()) { @@ -2194,14 +2194,14 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T } cout << "ZoneUtil.cpp step 8" << endl; - // ũó Ѵ. + // 크리처의 정보를 저장한다. pCreature->save(); ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(TargetZoneID); Assert(pZoneInfo != NULL); - // . - // ϴ . + // 피의 성서를 가지고 성지 밖으로 나갈 때는 피의 성서를 버린다. + // 성의 지하던젼으로 가지고 나갈때도 버린다. if (pCreature->isFlag(Effect::EFFECT_CLASS_HAS_BLOOD_BIBLE)) { if (pZone->isHolyLand()) { if (!pZoneInfo->isHolyLand() || (!pZoneInfo->isCastle() && g_pCastleInfoManager->isSameCastleZone( @@ -2210,11 +2210,11 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T } } - // ¡ ¡ . + // 성 상징을 가지고 성 밖으로 나갈 때는 성 상징을 버린다. if (pCreature->isFlag(Effect::EFFECT_CLASS_HAS_CASTLE_SYMBOL)) { if (pZone->isHolyLand() && !pZoneInfo->isHolyLand() || !g_pCastleInfoManager->isSameCastleZone(pCreature->getZone()->getZoneID(), TargetZoneID) - // . ¡ ʿ ֱ .. + // 성 안으로 못 들어간다. 성 상징은 성 지하 맵에 있기 때문에.. || pZoneInfo->isCastle()) { dropRelicToZone(pCreature); } @@ -2231,7 +2231,7 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T ; dropSweeperToZone(pCreature); - // ų ۿ ö initAllStat ҷش. + // 성지에서 성지 밖으로 나가거나 성지 밖에서 성지 안으로 들어올때는 initAllStat을 불러준다. if (pZone->isHolyLand() != pZoneInfo->isHolyLand()) { pCreature->setFlag(Effect::EFFECT_CLASS_INIT_ALL_STAT); } @@ -2245,24 +2245,24 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T pCreature->setFlag(Effect::EFFECT_CLASS_INIT_ALL_STAT); } - // , PC Ѵ. + // 이제, 존에서 PC를 삭제한다. // // *CAUTION* - // pCreature ǥ pCreature ϴ Ÿ ǥ ƾ Ѵ. - // , ޽带 ȣϱ ǥ ٲ Ѵ.. + // pCreature의 좌표가 실제로 pCreature가 존재하는 타일의 좌표와 같아야 한다. + // 따라서, 이 메쏘드를 호출하기 전에 좌표를 잘 바꿔놔야 한당.. pZone->deleteCreature(pCreature, pCreature->getX(), pCreature->getY()); - // ׷ ZPM ÷̾ Ѵ. + // 존그룹의 ZPM에서 플레이어를 삭제한다. // pZone->getZoneGroup()->getZonePlayerManager()->deletePlayer(pGamePlayer->getSocket()->getSOCKET()); // pZone->getZoneGroup()->getZonePlayerManager()->deletePlayer_NOBLOCKED(pGamePlayer->getSocket()->getSOCKET()); pZone->getZoneGroup()->getZonePlayerManager()->deletePlayer(pGamePlayer->getSocket()->getSOCKET()); - // ũó ο ǥ Ż ̴. + // 크리처의 새로운 좌표는 포탈의 도착 지점이다. // pCreature->setXY(TX, TY); // pCreature->setZone(NULL); cout << "ZoneUtil.cpp step 9" << endl; - // IPM ÷̾ ű. + // IPM으로 플레이어를 옮긴다. // g_pIncomingPlayerManager->addPlayer(pGamePlayer); // g_pIncomingPlayerManager->pushPlayer(pGamePlayer); pZone->getZoneGroup()->getZonePlayerManager()->pushOutPlayer(pGamePlayer); @@ -2271,29 +2271,29 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T throw Error(nsee.toString()); } - // ũóٰ ش. ̴ OID Ҵޱ ؼ̴. - // ̵ Ѵ. by sigi. 2002.5.11 + // 크리처에다가 존을 지정해준다. 이는 OID 를 할당받기 위해서이다. + // 이동할 존을 설정한다. by sigi. 2002.5.11 Zone* pNewZone = getZoneByZoneID(TargetZoneID); Assert(pNewZone != NULL); pCreature->setNewZone(pNewZone); pCreature->setNewXY(TX, TY); - // ũó ڽŰ ۵ OID Ҵ޴´. + // 크리처 자신과 소유 아이템들의 OID를 할당받는다. - // ZonePlayerManager heartbeat Ѵ. - // ּó by sigi. 2002.5.14 + // ZonePlayerManager의 heartbeat에서 한다. + // 주석처리 by sigi. 2002.5.14 // pCreature->registerObject(); /* - // GCUpdateInfo Ŷ д. + // GCUpdateInfo 패킷을 만들어둔다. GCUpdateInfo gcUpdateInfo; makeGCUpdateInfo(&gcUpdateInfo, pCreature); pGamePlayer->sendPacket(&gcUpdateInfo); */ - // ƴ ƴ ƴ ų - // ƴ + // 아담의 성지가 아닌 곳에서 아담의 성지로 가거나 + // 아담의 성지에서 딴 곳으로 가는 경우 if (!pZone->isHolyLand() && pNewZone->isHolyLand() || pZone->isHolyLand() && !pNewZone->isHolyLand()) { sendHolyLandWarpEffect(pCreature); cout << "ZoneUtil.cpp step 10" << endl; @@ -2308,8 +2308,8 @@ void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t T } ////////////////////////////////////////////////////////////////////////////// -// Ư ID ãƼ ͸ Ѵ. -// ZoneID_t ZID : ã ϴ ID +// 특정 존ID를 가진 존을 찾아서 포인터를 리턴한다. +// ZoneID_t ZID : 찾고자 하는 존 ID ////////////////////////////////////////////////////////////////////////////// Zone* getZoneByZoneID(ZoneID_t ZID) @@ -2330,16 +2330,16 @@ Zone* getZoneByZoneID(ZoneID_t ZID) try { pZoneGroup = g_pZoneGroupManager->getZoneGroup(pZoneInfo->getZoneGroupID()); } catch (NoSuchElementException&) { - // ϴ 1̹Ƿ.. ״ ... + // 일단은 서버가 1대이므로.. 그대로 나간다... // cerr << "getZoneByZoneID() : No Such ZoneGroup" << endl; throw Error("getZoneByZoneID() : No Such ZoneGroup"); /* //-------------------------------------------------------------------------------- - // ׷Ŵ ׷ ׷ ߰ ٴ Ҹ - // и ٸ Ҽӵ ׷̶ ̴. , - // GGIncomingConnection Ŷ ؾ Ѵ. IP/Port - // ˾Ƴ Ѵ. + // 현재 게임 서버의 존그룹매니저에서 그런 존그룹을 발견할 수 없다는 소리는 + // 분명히 다른 게임 서버에 소속된 존그룹이라는 뜻이다. 따라서, 그 게임 + // 서버에게 GGIncomingConnection 패킷을 전송해야 한다. 즉 그 게임 서버의 IP/Port + // 를 알아내야 한다. //-------------------------------------------------------------------------------- GGIncomingConnection ggIncomingConnection; ggIncomingConnection.setClientIP(pCreature->getPlayer->getSocket()->getHost()); @@ -2361,7 +2361,7 @@ Zone* getZoneByZoneID(ZoneID_t ZID) } ////////////////////////////////////////////////////////////////////////////// -//  ɾμ, Ư Ÿ ͸ ߰Ѵ. +// 운영자 명령어로서, 특정 타입의 몬스터를 존에다 추가한다. ////////////////////////////////////////////////////////////////////////////// void addMonstersToZone(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, SpriteType_t SType, MonsterType_t MType, int num, const SUMMON_INFO& summonInfo, list* pSummonedMonsters) @@ -2385,7 +2385,7 @@ void addMonstersToZone(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, SpriteType_t S const vector& monsterTypes = g_pMonsterInfoManager->getMonsterTypeBySprite(SType); if (!monsterTypes.empty()) { - // num + // num 마리의 몬스터 생성 for (int i = 0; i < num; i++) { MonsterType_t monsterType = monsterTypes[rand() % monsterTypes.size()]; @@ -2403,7 +2403,7 @@ void addMonstersToZone(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, SpriteType_t S } ////////////////////////////////////////////////////////////////////////////// -// Ư Ÿ ͸ ߰Ѵ. +// 특정 타입의 몬스터를 존에다 추가한다. ////////////////////////////////////////////////////////////////////////////// void addMonstersToZone(Zone* pZone, const SUMMON_INFO2& summonInfo, list* pSummonedMonsters) @@ -2436,7 +2436,7 @@ void addMonstersToZone(Zone* pZone, const SUMMON_INFO2& summonInfo, listgetMonsterTypeBySprite(monsterInfo.SpriteType); if (!monsterTypes.empty()) { - // Num + // Num 마리의 몬스터 생성 for (int i = 0; i < monsterInfo.Num; i++) { MonsterType_t monsterType = monsterTypes[rand() % monsterTypes.size()]; @@ -2458,8 +2458,8 @@ void addMonstersToZone(Zone* pZone, const SUMMON_INFO2& summonInfo, listisMasterLair()) { return true; } @@ -2514,7 +2514,7 @@ bool enterMasterLair(Zone* pZone, Creature* pCreature) Assert(pMasterLairManager != NULL); if (pMasterLairManager->enterCreature(pCreature)) { - // + // 출입 가능 return true; } @@ -2524,7 +2524,7 @@ bool enterMasterLair(Zone* pZone, Creature* pCreature) } void getNewbieTransportZoneInfo(Slayer* pSlayer, ZONE_COORD& zoneInfo) { - // ɷġ 40̰, ɺ̸ . by sigi. 2002.11.7 + // 능력치 합이 40이고, 야전사령부이면 딴데로 보낸다. by sigi. 2002.11.7 zoneInfo.x = 30; zoneInfo.y = 42; @@ -2550,7 +2550,7 @@ void getNewbieTransportZoneInfo(Slayer* pSlayer, ZONE_COORD& zoneInfo) { void checkNewbieTransportToGuild(Slayer* pSlayer) { try { if (pSlayer->isPLAYER() && g_pVariableManager->isNewbieTransportToGuild()) { - // ɷġ 40̰, ɺ̸ . by sigi. 2002.11.7 + // 능력치 합이 40이고, 야전사령부이면 딴데로 보낸다. by sigi. 2002.11.7 ZONE_COORD transportZone; getNewbieTransportZoneInfo(pSlayer, transportZone); @@ -2603,8 +2603,8 @@ void checkNewbieTransportToGuild(Slayer* pSlayer) { // transportCreature( pSlayer, ZoneID, ZoneX, ZoneY, false ); - Turn_t deadline = 600; // 1 - int timePenalty = (BasicSUM - 40) * 100; // ɷġ 1 10ʾ + Turn_t deadline = 600; // 1분 후 + int timePenalty = (BasicSUM - 40) * 100; // 능력치 1마다 10초씩 deadline -= min(500, timePenalty); /* @@ -2616,7 +2616,7 @@ void checkNewbieTransportToGuild(Slayer* pSlayer) { Zone* pZone = pSlayer->getZone(); Assert(pZone!=NULL); - // CreatureManager ó ߿ DZ Zone ٿѴ. + // CreatureManager 처리 중에 실행되기 때문에 Zone에 붙여야한다. //pSlayer->addEffect( pEffect ); ObjectRegistry & objectregister = pZone->getObjectRegistry(); @@ -2637,7 +2637,7 @@ void checkNewbieTransportToGuild(Slayer* pSlayer) { pEventTransport->setTargetZone(ZoneID, ZoneX, ZoneY); pEventTransport->setZoneName(ZoneName); - // Ŀ ̵Ѵ. ش. + // 몇 초후에 어디로 이동한다.고 보내준다. pEventTransport->sendMessage(); pGamePlayer->addEvent(pEventTransport); @@ -2653,7 +2653,7 @@ void checkNewbieTransportToGuild(Slayer* pSlayer) { } } -// Corpse +// Corpse가 bool addCorpseToZone(Corpse* pCorpse, Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy) { @@ -2662,11 +2662,11 @@ bool addCorpseToZone(Corpse* pCorpse, Zone* pZone, ZoneCoord_t cx, ZoneCoord_t c Assert(pCorpse != NULL); Assert(pZone != NULL); - // Ÿϰ Ŵ ũó Ѵ. + // 타일과 몬스터 매니저에서 크리처를 삭제한다. // Tile & tile = pZone->getTile(cx , cy); - // ü ŸϿ ߰Ѵ. - /* // ŸϿ Ѵٸ, + // 시체를 타일에 추가한다. + /* // 현재 타일에 아이템이 존재한다면, if (tile.hasItem()) { Item* pItem = tile.getItem(); @@ -2674,7 +2674,7 @@ bool addCorpseToZone(Corpse* pCorpse, Zone* pZone, ZoneCoord_t cx, ZoneCoord_t c switch (pItem->getItemClass()) { - // ü  ʴ Ŭ + // 시체에 들어가지 않는 아이템 클래스 case Item::ITEM_CLASS_CORPSE: case Item::ITEM_CLASS_MOTORCYCLE: case Item::ITEM_CLASS_MINE: @@ -2686,12 +2686,12 @@ bool addCorpseToZone(Corpse* pCorpse, Zone* pZone, ZoneCoord_t cx, ZoneCoord_t c break; default: - // ̹ ũ ü  Ƿ - // ũ ƴ϶ ü ߰Ѵ. + // 이미 생성된 유니크 아이템은 시체에 들어가지 않으므로 + // 유니크 아이템이 아니라면 시체에 추가한다. if (!pItem->isUnique() && !pItem->isQuestItem() && !pItem->isFlagItem() && !pItem->isFlag( Effect::EFFECT_CLASS_PET_DISSECT ) ) { - // ٴڿ ִٰ 󶳰ῡ  ٽ ö 켱 ٿ༱ ȵȴ. + // 바닥에 떨어져있다가 얼떨결에 들어가는 아이템은 다시 나올때도 우선권을 붙여줘선 안된다. if ( !pItem->isFlag(Effect::EFFECT_CLASS_PRECEDENCE) ) { EffectPrecedence* pEffect = new EffectPrecedence( pItem ); @@ -2704,8 +2704,8 @@ bool addCorpseToZone(Corpse* pCorpse, Zone* pZone, ZoneCoord_t cx, ZoneCoord_t c } pZone->deleteItem(pItem, cx, cy); - // ü create ϹǷ DB Ѵ. - // ߿ ȭ Ҷ ٸ .. + // 시체에서 꺼낼때 create 하므로 DB에서 지워줘야 한다. + // 나중에 최적화 할때는 다른 방법을 쓰도록.. pItem->destroy(); pCorpse->addTreasure(pItem); } @@ -2713,7 +2713,7 @@ bool addCorpseToZone(Corpse* pCorpse, Zone* pZone, ZoneCoord_t cx, ZoneCoord_t c } }*/ - // ü ߰Ѵ. + // 시체를 추가한다. TPOINT pt = pZone->addItem(pCorpse, cx, cy); if (pt.x == -1) { SAFE_DELETE(pCorpse); @@ -2729,8 +2729,8 @@ bool addCorpseToZone(Corpse* pCorpse, Zone* pZone, ZoneCoord_t cx, ZoneCoord_t c return true; } -// ȿ Ư ü ִ ȮѴ. -// true, false +// 범위 안에 특정한 몬스터 시체가 있는지 확인한다. +// 있으면 true, 없으면 false bool checkCorpse(Zone* pZone, MonsterType_t MType, ZoneCoord_t x1, ZoneCoord_t y1, ZoneCoord_t x2, ZoneCoord_t y2) { @@ -2769,7 +2769,7 @@ bool checkCorpse(Zone* pZone, MonsterType_t MType, ZoneCoord_t x1, ZoneCoord_t y __END_CATCH } -//  Zone ޼ Ѹ ؼ ZoneIDList ʿ +// 몇개의 Zone 에만 메세지를 뿌리기 위해서 성에 속한 ZoneIDList가 필요함 void makeZoneIDList(const string& zoneIDs, list& zoneIDList) { @@ -2790,7 +2790,7 @@ void makeZoneIDList(const string& zoneIDs, list& zoneIDList) string zoneID = trim(zoneIDs.substr(a, b - a)); - // -_- ׳ atoi ᵵ ɷ ;; + // 음 -_- 그냥 atoi 써도 될려나 ;; zoneIDList.push_back(atoi(zoneID.c_str())); a = b + 1; @@ -2837,10 +2837,10 @@ bool createBulletinBoard(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y, MonsterType_ g_pConfig->getPropertyInt("ServerID"), pZone->getZoneID(), pt.x, pt.y, dbmsg.c_str(), (uint)type, timeLimit.toDateTime().c_str()); - // UPDATE Result* ſ.. pStmt->getAffectedRowCount() + // UPDATE인 경우는 Result* 대신에.. pStmt->getAffectedRowCount() if (pStmt->getAffectedRowCount() == 0) { - filelog("BulletinBoard.log", "DB ȵǹȽϴ. : %u, %u, %u, [%u:%s]", pZone->getZoneID(), pt.x, + filelog("BulletinBoard.log", "DB에 저장이 안되버렸습니다. : %u, %u, %u, [%u:%s]", pZone->getZoneID(), pt.x, pt.y, type, msg.c_str()); } @@ -2866,7 +2866,7 @@ void loadBulletinBoard(Zone* pZone) { "SELECT ID, X, Y, Message, Type, TimeLimit FROM BulletinBoardObject WHERE ServerID = %u AND ZoneID = %u", g_pConfig->getPropertyInt("ServerID"), pZone->getZoneID()); - // UPDATE Result* ſ.. pStmt->getAffectedRowCount() + // UPDATE인 경우는 Result* 대신에.. pStmt->getAffectedRowCount() while (pResult->next()) { uint ID = pResult->getInt(1); @@ -2877,7 +2877,7 @@ void loadBulletinBoard(Zone* pZone) { VSDateTime timeLimit(pResult->getString(6)); if (timeLimit < currentDateTime) { - cout << "Խ ð ٵǼ ϴ." << ID << " : [" << X << "," << Y << "] " << msg << " [" + cout << "게시판 시간 다되서 지워버립니다." << ID << " : [" << X << "," << Y << "] " << msg << " [" << type << "] " << endl; Statement* pStmt2 = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt2->executeQuery("DELETE FROM BulletinBoardObject WHERE ID = %u", ID); @@ -2894,7 +2894,7 @@ void loadBulletinBoard(Zone* pZone) { TPOINT pt = pZone->addItem(pCorpse, X, Y, true, delayTime * 10); if (pt.x == -1) { - filelog("BulletinBoard.log", "DB оµ ȵȽϴ. : %u, %u, %u, [%u:%s]", + filelog("BulletinBoard.log", "DB에서 읽었는데 존에 안들어가버렸습니다. : %u, %u, %u, [%u:%s]", pZone->getZoneID(), X, Y, type, msg.c_str()); } } diff --git a/src/server/gameserver/ZoneUtil.h b/src/server/gameserver/ZoneUtil.h index 75bb9271..98c9d16d 100644 --- a/src/server/gameserver/ZoneUtil.h +++ b/src/server/gameserver/ZoneUtil.h @@ -2,8 +2,8 @@ // Filename : ZoneUtil.h // Written by : excel96 // Description : -// õ Ư ۾ ϴ Լ ȿ ϱ, -// ʹ Ŀ ־, ܺη Լ̴. +// 존과 관련된 특정한 작업들을 수행하는 함수들을 존 안에 넣으니까, +// 존 파일이 너무 커지는 경향이 있어서, 존 파일 외부로 꺼낸 함수들이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ZONE_UTIL_H__ @@ -30,177 +30,177 @@ class Corpse; struct ZONE_COORD; struct SUMMON_INFO; -// ȯ +// 종류별로 소환 struct SUMMON_INFO2; ////////////////////////////////////////////////////////////////////////////// -// Ư ũĸ ִ ġ ã´. +// 특정 크리쳐를 더할 수 있는 위치를 찾는다. // -// Zone* pZone : -// ZoneCoord_t cx : ϰ ϴ ʱ ġ x -// ZoneCoord_t cy : ϰ ϴ ʱ ġ y -// Creature::MoveMode MMode : ũ +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t cx : 더하고자 하는 초기 위치 x +// ZoneCoord_t cy : 더하고자 하는 초기 위치 y +// Creature::MoveMode MMode : 크리쳐의 움직임 모드 ////////////////////////////////////////////////////////////////////////////// TPOINT findSuitablePosition(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy, Creature::MoveMode MMode); ////////////////////////////////////////////////////////////////////////////// -// Ư ִ ġ ã´. +// 특정 아이템을 더할 수 있는 위치를 찾는다. // -// Zone* pZone : -// ZoneCoord_t cx : ϰ ϴ ʱ ġ x -// ZoneCoord_t cy : ϰ ϴ ʱ ġ y -// bool bAllowCreature : ũİ ϴ ? +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t cx : 더하고자 하는 초기 위치 x +// ZoneCoord_t cy : 더하고자 하는 초기 위치 y +// bool bAllowCreature : 크리쳐가 존재하는 곳도 괜찮은가? ////////////////////////////////////////////////////////////////////////////// TPOINT findSuitablePositionForItem(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy, bool bAllowCreature, bool bAllowSafeZone = true, bool bForce = false); ////////////////////////////////////////////////////////////////////////////// -// Ư Ʈ ִ ġ ã´. +// 특정 이펙트를 더할 수 있는 위치를 찾는다. // -// Zone* pZone : -// ZoneCoord_t cx : ϰ ϴ ʱ ġ x -// ZoneCoord_t cy : ϰ ϴ ʱ ġ y -// Effect::EffectClass EClass : ϰ ϴ Ʈ Ŭ +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t cx : 더하고자 하는 초기 위치 x +// ZoneCoord_t cy : 더하고자 하는 초기 위치 y +// Effect::EffectClass EClass : 더하고자 하는 이펙트 클래스 ////////////////////////////////////////////////////////////////////////////// TPOINT findSuitablePositionForEffect(Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy, Effect::EffectClass EClass); ////////////////////////////////////////////////////////////////////////////// -// Ư ġ ũĸ ߰ ִ ˻Ѵ. +// 특정 위치에서 지정된 무브 모드의 크리쳐를 추가할 수 있는지 검사한다. // -// Zone* pZone : -// ZoneCoord_t x : οϰ ϴ ǥ x -// ZoneCoord_t y : οϰ ϴ ǥ y -// Creature::MoveMode MMode : ũ +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t x : 버로우하고자 하는 좌표 x +// ZoneCoord_t y : 버로우하고자 하는 좌표 y +// Creature::MoveMode MMode : 크리쳐의 무브 모드 ////////////////////////////////////////////////////////////////////////////// bool canAddCreature(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, Creature::MoveMode MMode); ////////////////////////////////////////////////////////////////////////////// -// Ư ġ ο찡 üũ Ѵ. +// 특정 위치에 버로우가 가능한지 체크를 한다. // -// Zone* pZone : -// ZoneCoord_t x : οϰ ϴ ǥ x -// ZoneCoord_t y : οϰ ϴ ǥ y +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t x : 버로우하고자 하는 좌표 x +// ZoneCoord_t y : 버로우하고자 하는 좌표 y ////////////////////////////////////////////////////////////////////////////// bool canBurrow(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y); ////////////////////////////////////////////////////////////////////////////// -// Ư ġ ο찡 üũ Ѵ. +// 특정 위치에 언버로우가 가능한지 체크를 한다. // -// Zone* pZone : -// ZoneCoord_t x : οϰ ϴ ǥ x -// ZoneCoord_t y : οϰ ϴ ǥ y +// Zone* pZone : 존에 대한 포인터 +// ZoneCoord_t x : 버로우하고자 하는 좌표 x +// ZoneCoord_t y : 버로우하고자 하는 좌표 y ////////////////////////////////////////////////////////////////////////////// bool canUnburrow(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y); ////////////////////////////////////////////////////////////////////////////// -// ũĸ ڷ Ѵ. +// 크리쳐를 뒤로 물러나게 한다. // -// Zone* pZone : -// Creature* pCreature : ũ -// ZoneCoord_t originX : pCreature ǥ x -// ZoneCoord_t originY : pCreature ǥ y +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 물러나게 할 크리쳐 +// ZoneCoord_t originX : pCreature를 물러나게 한 상대방의 좌표 x +// ZoneCoord_t originY : pCreature를 물러나게 한 상대방의 좌표 y ////////////////////////////////////////////////////////////////////////////// Dir_t knockbackCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t originX, ZoneCoord_t originY); ////////////////////////////////////////////////////////////////////////////// -// ̵带 ũĸ ߰Ѵ. +// 하이드를 쓴 크리쳐를 존에다 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̵带 ũ -// ZoneCoord_t cx : ũ ǥ x -// ZoneCoord_t cy : ũ ǥ y +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 하이드를 쓴 크리쳐 +// ZoneCoord_t cx : 크리쳐의 원래 좌표 x +// ZoneCoord_t cy : 크리쳐의 원래 좌표 y ////////////////////////////////////////////////////////////////////////////// void addBurrowingCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneCoord_t cy); ////////////////////////////////////////////////////////////////////////////// -// ̵带 Ǭ ũĸ ߰Ѵ. +// 하이드를 푼 크리쳐를 존에다 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̵带 Ǭ ũ -// ZoneCoord_t cx : ũ ǥ x -// ZoneCoord_t cy : ũ ǥ y -// Dir_t dir : ũİ +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 하이드를 푼 크리쳐 +// ZoneCoord_t cx : 크리쳐의 원래 좌표 x +// ZoneCoord_t cy : 크리쳐의 원래 좌표 y +// Dir_t dir : 나온 크리쳐가 향할 방향 ////////////////////////////////////////////////////////////////////////////// void addUnburrowCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneCoord_t cy, Dir_t dir); ////////////////////////////////////////////////////////////////////////////// -// Ǭ ũĸ ߰Ѵ. +// 변신을 푼 크리쳐를 존에다 추가한다. // -// Zone* pZone : -// Creature* pCreature : Ǭ ũ -// bool bForce : Ʈ duration Ⱑ ʾҴµ, -// Ǫ ΰ? +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 변신을 푼 크리쳐 +// bool bForce : 이펙트의 duration이 만기가 되지 않았는데, +// 강제로 푸는 것인가? ////////////////////////////////////////////////////////////////////////////// void addUntransformCreature(Zone* pZone, Creature* pCreature, bool bForce); ////////////////////////////////////////////////////////////////////////////// -// ̴ ũĸ ߰Ѵ. +// 안 보이는 크리쳐를 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̴ ũ -// ZoneCoord_t cx : ũ ǥ x -// ZoneCoord_t cy : ũ ǥ y +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 안 보이는 크리쳐 +// ZoneCoord_t cx : 크리쳐의 원래 좌표 x +// ZoneCoord_t cy : 크리쳐의 원래 좌표 y ////////////////////////////////////////////////////////////////////////////// void addInvisibleCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneCoord_t cy); ////////////////////////////////////////////////////////////////////////////// -// ̴ ũİ , ũĸ ߰Ѵ. +// 안 보이던 크리쳐가 보일 경우, 이 크리쳐를 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̴ ũ -// bool bForce : visible ° Ǿ? +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 안 보이던 크리쳐 +// bool bForce : 강제로 visible 상태가 되었나? ////////////////////////////////////////////////////////////////////////////// void addVisibleCreature(Zone* pZone, Creature* pCreature, bool bForced); ////////////////////////////////////////////////////////////////////////////// -// ũĸ ߰Ѵ. +// 스나이핑 모드의 크리쳐를 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̴ ũ -// ZoneCoord_t cx : ũ ǥ x -// ZoneCoord_t cy : ũ ǥ y +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 안 보이는 크리쳐 +// ZoneCoord_t cx : 크리쳐의 원래 좌표 x +// ZoneCoord_t cy : 크리쳐의 원래 좌표 y ////////////////////////////////////////////////////////////////////////////// void addSnipingModeCreature(Zone* pZone, Creature* pCreature, ZoneCoord_t cx, ZoneCoord_t cy); ////////////////////////////////////////////////////////////////////////////// -// ̴ ũİ , ũĸ ߰Ѵ. +// 안 보이던 크리쳐가 보일 경우, 이 크리쳐를 추가한다. // -// Zone* pZone : -// Creature* pCreature : ̴ ũ -// bool bForce : visible ° Ǿ? +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 안 보이던 크리쳐 +// bool bForce : 강제로 visible 상태가 되었나? ////////////////////////////////////////////////////////////////////////////// void addUnSnipingModeCreature(Zone* pZone, Creature* pCreature, bool bForced); ////////////////////////////////////////////////////////////////////////////// -// ڸ Ѵ. +// 존에다 지뢰를 더한다. // -// Zone* pZone : -// Mine* pMine : ü -// ZoneCoord_t cx : ڸ ǥ x -// ZoneCoord_t cy : ڸ ǥ y +// Zone* pZone : 존에 대한 포인터 +// Mine* pMine : 지뢰 객체에 대한 포인터 +// ZoneCoord_t cx : 지뢰를 더할 좌표 x +// ZoneCoord_t cy : 지뢰를 더할 좌표 y ////////////////////////////////////////////////////////////////////////////// void addInstalledMine(Zone* pZone, Mine* pMine, ZoneCoord_t cx, ZoneCoord_t cy); ////////////////////////////////////////////////////////////////////////////// -// Ư ũİ ڸ ʾҴ üũѴ. +// 특정 크리쳐가 지뢰를 밟지 않았는지 체크한다. // -// Zone* pZone : -// Creature* pCreature : ˻ ũ -// ZoneCoord_t X : ˻ ǥ x -// ZoneCoord_t Y : ˻ ǥ y +// Zone* pZone : 존에 대한 포인터 +// Creature* pCreature : 검사할 크리쳐 +// ZoneCoord_t X : 검사할 좌표 x +// ZoneCoord_t Y : 검사할 좌표 y ////////////////////////////////////////////////////////////////////////////// bool checkMine(Zone* pZone, Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y); bool checkMine(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y); @@ -208,26 +208,26 @@ bool checkMine(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y); bool checkTrap(Zone* pZone, Creature* pCreature); ////////////////////////////////////////////////////////////////////////////// -// Ư ũĸ ٸ ̵Ų. +// 특정 크리쳐를 다른 존으로 이동시킨다. // -// Creature* pCreature : ̵ ũ -// ZoneID_t TargetZoneID : ̵ ID -// ZoneCoord_t TargetX : ̵ ǥ X -// ZoneCoord_t TargetY : ̵ ǥ Y -// bool bSendMoveOK : GCMoveOK ִ° +// Creature* pCreature : 이동할 크리쳐 +// ZoneID_t TargetZoneID : 이동할 존 ID +// ZoneCoord_t TargetX : 이동할 존 좌표 X +// ZoneCoord_t TargetY : 이동할 존 좌표 Y +// bool bSendMoveOK : GCMoveOK를 날려주는가에 대한 여부 ////////////////////////////////////////////////////////////////////////////// void transportCreature(Creature* pCreature, ZoneID_t TargetZoneID, ZoneCoord_t TX, ZoneCoord_t TY, bool bSendMoveOK = true); ////////////////////////////////////////////////////////////////////////////// -// Ư ID ãƼ ͸ Ѵ. -// ZoneID_t ZID : ã ϴ ID +// 특정 존ID를 가진 존을 찾아서 포인터를 리턴한다. +// ZoneID_t ZID : 찾고자 하는 존 ID ////////////////////////////////////////////////////////////////////////////// Zone* getZoneByZoneID(ZoneID_t ZID); ////////////////////////////////////////////////////////////////////////////// -//  ɾμ, Ư Ÿ ͸ ߰Ѵ. +// 운영자 명령어로서, 특정 타입의 몬스터를 존에다 추가한다. ////////////////////////////////////////////////////////////////////////////// void addMonstersToZone(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, SpriteType_t SType, MonsterType_t MType, int num, const SUMMON_INFO& summonInfo, list* pSummonedMonsters = NULL); @@ -235,30 +235,30 @@ void addMonstersToZone(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, SpriteType_t S void addMonstersToZone(Zone* pZone, const SUMMON_INFO2& summonInfo, list* pSummonedMonsters = NULL); ////////////////////////////////////////////////////////////////////////////// -// Ư ũİ ο ִ° ˻ϴ Լ -// ȯ δ. +// 특정 크리쳐가 현재 안전 지대 내부에 있는가를 검사하는 함수 +// 교환할 때 쓰인다. ////////////////////////////////////////////////////////////////////////////// bool isInSafeZone(Creature* pCreature); ////////////////////////////////////////////////////////////////////////////// -// ǥ üũѴ. +// 좌표가 존의 범위 안인지를 체크한다. ////////////////////////////////////////////////////////////////////////////// bool isValidZoneCoord(Zone* pZone, ZoneCoord_t x, ZoneCoord_t y, int offset = 0); ////////////////////////////////////////////////////////////////////////////// -// master lair pCreature  ִ°? +// master lair 에 pCreature가 들어갈 수 있는가? ////////////////////////////////////////////////////////////////////////////// bool enterMasterLair(Zone* pZone, Creature* pCreature); -// ɺο ʺڵ ٸ .. ǥ +// 야전사령부에서 초보자들을 다른 곳으로 보낼때.. 목표 존의 정보 void checkNewbieTransportToGuild(Slayer* pSlayer); void getNewbieTransportZoneInfo(Slayer* pSlayer, ZONE_COORD& zoneInfo); -// Corpse Zone ߰Ѵ. +// Corpse를 Zone에 추가한다. bool addCorpseToZone(Corpse* pCorpse, Zone* pZone, ZoneCoord_t cx, ZoneCoord_t cy); -// ȿ Ư ü ִ ȮѴ. -// true, false +// 범위 안에 특정한 몬스터 시체가 있는지 확인한다. +// 있으면 true, 없으면 false bool checkCorpse(Zone* pZone, MonsterType_t MType, ZoneCoord_t x1, ZoneCoord_t y1, ZoneCoord_t x2, ZoneCoord_t y2); void makeZoneIDList(const string& zoneIDs, list& zoneIDList); diff --git a/src/server/gameserver/billing/BillingInfo.h b/src/server/gameserver/billing/BillingInfo.h index 3aa07c32..9f67770e 100644 --- a/src/server/gameserver/billing/BillingInfo.h +++ b/src/server/gameserver/billing/BillingInfo.h @@ -23,109 +23,109 @@ using namespace std; #endif //////////////////////////////////////////////////////////////////////////////// -// Packet_Type (G=GameServer, B=BillingServer) +// Packet_Type에 대한 값(G=GameServer, B=BillingServer) //////////////////////////////////////////////////////////////////////////////// enum BillingPacketType { - BILLING_PACKET_LOGIN = 0x00000001, // ӿ ö (G->B ̸ B->G) - BILLING_PACKET_LOGOUT = 0x00000002, // ӿ (G->B only) - BILLING_PACKET_POLLING = 0x00000003, // GameServer ( ) - BILLING_PACKET_INIT = 0x00000004, // Ӽ ó 㶧 (G->B only) - BILLING_PACKET_REMAIN = 0x00000005, // ð ش. (B->G only) - BILLING_PACKET_CHECK = 0x00000006, // üũ (B->G ̸ G->B) - BILLING_PACKET_LOGIN_CHECK = 0x00000008, // üũ (G->B ̸ B->G(LoginVerify(Type 1))) + BILLING_PACKET_LOGIN = 0x00000001, // 게임에 들어올때 (G->B 이면 B->G) + BILLING_PACKET_LOGOUT = 0x00000002, // 게임에서 나갈때 (G->B only) + BILLING_PACKET_POLLING = 0x00000003, // GameServer에서는 (사용 안함) + BILLING_PACKET_INIT = 0x00000004, // 게임서버 처음 뜰때 (G->B only) + BILLING_PACKET_REMAIN = 0x00000005, // 남은 시간 보여준다. (B->G only) + BILLING_PACKET_CHECK = 0x00000006, // 접속 중 체크 (B->G 이면 G->B) + BILLING_PACKET_LOGIN_CHECK = 0x00000008, // 접속 중 체크 (G->B 이면 B->G(LoginVerify(Type 1))) BILLING_PACKET_MAX }; //////////////////////////////////////////////////////////////////////////////// -// BILLING_PACKET_LOGIN Result +// BILLING_PACKET_LOGIN의 Result값 //////////////////////////////////////////////////////////////////////////////// enum BillingResultLogin { - BILLING_RESULT_LOGIN_OK = 0, // - BILLING_RESULT_LOGIN_DB_ERROR = 2, // DB Ұ - BILLING_RESULT_LOGIN_NETWORK_ERROR = 3, // Ʈũ - BILLING_RESULT_LOGIN_NO_ACCOUNT = 10, // - BILLING_RESULT_LOGIN_NO_CASH = 11, // ܾ - BILLING_RESULT_LOGIN_NO_SESSION = 12, // - BILLING_RESULT_LOGIN_BAD_PACKET = 20, // Ŷ + BILLING_RESULT_LOGIN_OK = 0, // 인증 성공 + BILLING_RESULT_LOGIN_DB_ERROR = 2, // DB에 접근 불가 + BILLING_RESULT_LOGIN_NETWORK_ERROR = 3, // 네트워크 오류 + BILLING_RESULT_LOGIN_NO_ACCOUNT = 10, // 인증 정보 없음 + BILLING_RESULT_LOGIN_NO_CASH = 11, // 잔액 부족 + BILLING_RESULT_LOGIN_NO_SESSION = 12, // 세션 없음 + BILLING_RESULT_LOGIN_BAD_PACKET = 20, // 정의 되지않은 패킷 BILLING_RESULT_LOGIN_COM_ERROR = 25, // COM Error - BILLING_RESULT_LOGIN_NO_RESPONSE = 26, // ð(30) - BILLING_RESULT_LOGIN_NO_MACHINE = 27, // ش Ұ - BILLING_RESULT_LOGIN_BAD_GAME_NO = 30, // Ŷ ѹ ϵ ӹȣ ٸ - BILLING_RESULT_LOGIN_ACCOUNT_ERROR = 31, // īƮ - // BILLING_RESULT_LOGIN_DUPLICATE = 32, // Ұ - BILLING_RESULT_LOGIN_DENY = 33, // Ұ( ) - BILLING_RESULT_LOGIN_TIME_OVER = 34, // ȿ Ⱓ - BILLING_RESULT_LOGIN_BUSY = 35, // ٸ - BILLING_RESULT_LOGIN_UNKNOWN_ERROR = 100, // - BILLING_RESULT_LOGIN_IP_COM_ERROR = 200, // IPȮ COM Error - BILLING_RESULT_LOGIN_IP_ERROR = 201, // IP - BILLING_RESULT_LOGIN_KEY_COM_ERROR = 210, // Ű Ȯ COM - BILLING_RESULT_LOGIN_NO_KEY = 211, // Ű + BILLING_RESULT_LOGIN_NO_RESPONSE = 26, // 시간(30초)동안 응답없음 + BILLING_RESULT_LOGIN_NO_MACHINE = 27, // 해당 장비 접속 불가 + BILLING_RESULT_LOGIN_BAD_GAME_NO = 30, // 패킷의 게임 넘버와 빌링 서버에 등록된 게임번호가 다름 + BILLING_RESULT_LOGIN_ACCOUNT_ERROR = 31, // 빌링 어카운트의 서비스 에러 + // BILLING_RESULT_LOGIN_DUPLICATE = 32, // 동시접속 불가 + BILLING_RESULT_LOGIN_DENY = 33, // 사용 불가(결제 정보는 있음) + BILLING_RESULT_LOGIN_TIME_OVER = 34, // 유효 기간 지남 + BILLING_RESULT_LOGIN_BUSY = 35, // 기다리는 사람이 많음 + BILLING_RESULT_LOGIN_UNKNOWN_ERROR = 100, // 정의 되지 않은 오류 + BILLING_RESULT_LOGIN_IP_COM_ERROR = 200, // IP확인 중 COM Error + BILLING_RESULT_LOGIN_IP_ERROR = 201, // IP 공급자 정보 부족 + BILLING_RESULT_LOGIN_KEY_COM_ERROR = 210, // 인증키 확인중 COM 에러 + BILLING_RESULT_LOGIN_NO_KEY = 211, // 인증키 없음 BILLING_RESULT_LOGIN_MAX }; //////////////////////////////////////////////////////////////////////////////// -// BILLING_PACKET_REMAIN Result +// BILLING_PACKET_REMAIN의 Result값 //////////////////////////////////////////////////////////////////////////////// enum BillingResultRemain { - BILLING_RESULT_REMAIN_DISCONNECT = -4, // - BILLING_RESULT_REMAIN_RESERVE = -3, // ο - BILLING_RESULT_REMAIN_DUPLICATE = -2, // ߺ α - BILLING_RESULT_REMAIN_REFUND = -1, // ȯ Ǿ. - BILLING_RESULT_REMAIN_NONE = 0, // ð . - BILLING_RESULT_REMAIN_TIME = 1, // ð + BILLING_RESULT_REMAIN_DISCONNECT = -4, // 강제 종료 + BILLING_RESULT_REMAIN_RESERVE = -3, // 새로운 결제정보 사용 시작 + BILLING_RESULT_REMAIN_DUPLICATE = -2, // 중복 로그인 + BILLING_RESULT_REMAIN_REFUND = -1, // 환불 되었다. + BILLING_RESULT_REMAIN_NONE = 0, // 남은 시간 없다. + BILLING_RESULT_REMAIN_TIME = 1, // 정상적으로 남은 시간 BILLING_RESULT_REMAIN_MAX }; //////////////////////////////////////////////////////////////////////////////// -// BILLING_PACKET_CHECK Result +// BILLING_PACKET_CHECK의 Result값 //////////////////////////////////////////////////////////////////////////////// enum BillingResultCheck { - BILLING_RESULT_CHECK_PLAYING = 0, // - BILLING_RESULT_CHECK_DISCONNECTED = 1, // + BILLING_RESULT_CHECK_PLAYING = 0, // 정상 사용자 + BILLING_RESULT_CHECK_DISCONNECTED = 1, // 종료된 사용자 BILLING_RESULT_CHECK_MAX }; //////////////////////////////////////////////////////////////////////////////// -// User_CC +// User_CC 값 //////////////////////////////////////////////////////////////////////////////// enum BillingUserCC { - BILLING_USER_METROTECH, // ~ - BILLING_USER_NETMARBLE, // ݸ + BILLING_USER_METROTECH, // 본썹~ + BILLING_USER_NETMARBLE, // 넷마블 서버 BILLING_USER_MAX }; const string BillingUserCC2String[BILLING_USER_MAX] = { - "DE", // BILLING_USER_METROTECH, // ~ - "NM" // BILLING_USER_NETMARBLE, // ݸ + "DE", // BILLING_USER_METROTECH, // 본썹~ + "NM" // BILLING_USER_NETMARBLE, // 넷마블 서버 }; //////////////////////////////////////////////////////////////////////////////// // BillingInfo == _AUTH_GAME //////////////////////////////////////////////////////////////////////////////// struct _AUTH_GAME { - mutable int Packet_Type; // Ŷ Ÿ - mutable int Result; // ó - char S_KEY[32]; // Ű Ҷ Ѵ. + mutable int Packet_Type; // 패킷 타입 + mutable int Result; // 처리결과값 + char S_KEY[32]; // 인증키를 사용할때만 사용한다. char Session[32]; // guid - char User_CC[4]; // ڵ - char User_No[20]; // ȣ ֹεϹȣ - char User_ID[40]; // ̵ - char User_IP[24]; // - char User_Gender; // - char User_Status[3]; // - char User_PayType[2]; // "F0" - mutable int User_Age; // - mutable int Game_No; // ȣ( DB ϵ ȣ) - char Bill_PayType[2]; // "A0" ĺ, "D0" , "P0" - char Bill_Method[2]; // - char Expire_Date[12]; // YYYYMMDDHHMM - mutable int Remain_Time; // : ð() : ȣ + char User_CC[4]; // 구분 코드 + char User_No[20]; // 사용자 번호나 주민등록번호 + char User_ID[40]; // 사용자 아이디 + char User_IP[24]; // 사용자 접속 아이피 + char User_Gender; // 사용자 성별 + char User_Status[3]; // 사용자 상태 + char User_PayType[2]; // 결제 수단 무료 사용자인 경우 "F0" + mutable int User_Age; // 사용자 나이 + mutable int Game_No; // 게임 번호(과금 DB에 등록된 번호) + char Bill_PayType[2]; // 지불 방식 "A0" 후불, "D0" 직불, "P0" 선불 + char Bill_Method[2]; // 과금 방식 + char Expire_Date[12]; // 과금 종료일 YYYYMMDDHHMM + mutable int Remain_Time; // 정량:남은 시간(초) 정액:번들 쿠폰번호 }; typedef _AUTH_GAME BillingInfo; diff --git a/src/server/gameserver/billing/BillingPlayer.h b/src/server/gameserver/billing/BillingPlayer.h index 49af6897..e0be4b40 100644 --- a/src/server/gameserver/billing/BillingPlayer.h +++ b/src/server/gameserver/billing/BillingPlayer.h @@ -43,9 +43,9 @@ class BillingPlayer : public Player { virtual void sendPacket(Packet* pPacket); // disconnect - // ÷̾ , ϰ α׾ƿ - // ̹ Ƿ disconnect(DISCONNECTED) ؼ ؾ Ѵ. ݸ, - // ϰ α׾ƿ 쿡 disconnect(UNDISCONNECTED) ؾ Ѵ. + // 플레이어의 연결을 종료할 때, 상대편이 적절하게 로그아웃하지 않을 경우 소켓의 연결이 + // 이미 끊겨 있으므로 disconnect(DISCONNECTED) 를 사용해서 연결을 종료해야 한다. 반면, + // 정당하게 로그아웃을 한 경우에는 disconnect(UNDISCONNECTED) 를 사용해야 한다. virtual void disconnect(bool bDisconnected = DISCONNECTED); void setSocket(Socket* pSocket); @@ -74,9 +74,9 @@ class BillingPlayer : public Player { } protected: - // ðȿ PayLogin (Retry) ÷̾ + // 일정 시간안에 새로 PayLogin 을 새로 보낸(Retry) 플레이어 수 int m_RetryCount; - // ðȿ PayLogin (Retry) ÷̾ Retry + // 일정 시간안에 새로 PayLogin 을 새로 보낸(Retry) 플레이어의 총 Retry 합 int m_RetryValue; }; diff --git a/src/server/gameserver/billing/BillingPlayerManager.h b/src/server/gameserver/billing/BillingPlayerManager.h index 7fb3572d..38007cf9 100644 --- a/src/server/gameserver/billing/BillingPlayerManager.h +++ b/src/server/gameserver/billing/BillingPlayerManager.h @@ -21,8 +21,8 @@ class CommonBillingPacket; ////////////////////////////////////////////////////////////////////////////// // class BillingPlayerManager; // -// ϴ ̴. -// ٽ ؾ ȴ. ~~ +// 쉐어드 서버와의 통신을 전담하는 쓰레드이다. +// 연결 끊기면 다시 연결해야 된다. 될 때까지~~ ////////////////////////////////////////////////////////////////////////////// class BillingPlayerManager : public Thread { diff --git a/src/server/gameserver/billing/BillingResultLoginErrorMessage.h b/src/server/gameserver/billing/BillingResultLoginErrorMessage.h index dc5dee5b..61ae47bf 100644 --- a/src/server/gameserver/billing/BillingResultLoginErrorMessage.h +++ b/src/server/gameserver/billing/BillingResultLoginErrorMessage.h @@ -46,24 +46,24 @@ BillingResultLoginErrorMessage::BillingResultLoginErrorMessage() { } void BillingResultLoginErrorMessage::initMessage() { - m_Messages[BILLING_RESULT_LOGIN_DB_ERROR] = "DB ϴ."; - m_Messages[BILLING_RESULT_LOGIN_NETWORK_ERROR] = "Ʈũ ߻Ͽϴ."; - m_Messages[BILLING_RESULT_LOGIN_NO_CASH] = "ܾ մϴ."; - m_Messages[BILLING_RESULT_LOGIN_NO_SESSION] = " ϴ."; - m_Messages[BILLING_RESULT_LOGIN_BAD_PACKET] = " ʴ Ŷ"; - m_Messages[BILLING_RESULT_LOGIN_COM_ERROR] = "COM "; - m_Messages[BILLING_RESULT_LOGIN_NO_RESPONSE] = " ð ϴ."; - m_Messages[BILLING_RESULT_LOGIN_NO_MACHINE] = "ش ϴ."; - m_Messages[BILLING_RESULT_LOGIN_BAD_GAME_NO] = " ϵ ӹȣ ٸϴ."; - m_Messages[BILLING_RESULT_LOGIN_ACCOUNT_ERROR] = " īƮ "; - m_Messages[BILLING_RESULT_LOGIN_DENY] = "ش ӿ Ұ ( )"; - m_Messages[BILLING_RESULT_LOGIN_TIME_OVER] = "ȿ Ⱓ "; - m_Messages[BILLING_RESULT_LOGIN_BUSY] = " ڰ ϴ."; - m_Messages[BILLING_RESULT_LOGIN_UNKNOWN_ERROR] = " ȣԴϴ."; - m_Messages[BILLING_RESULT_LOGIN_IP_COM_ERROR] = "IP Ȯϴ COM ߻Ͽϴ."; - m_Messages[BILLING_RESULT_LOGIN_IP_ERROR] = "ش IP մϴ."; - m_Messages[BILLING_RESULT_LOGIN_KEY_COM_ERROR] = "Ű Ȯϴ COM ߻Ͽϴ."; - m_Messages[BILLING_RESULT_LOGIN_NO_KEY] = "Ű ã ߽ϴ."; + m_Messages[BILLING_RESULT_LOGIN_DB_ERROR] = "DB에 접근할 수 없습니다."; + m_Messages[BILLING_RESULT_LOGIN_NETWORK_ERROR] = "네트워크에 오류가 발생하였습니다."; + m_Messages[BILLING_RESULT_LOGIN_NO_CASH] = "잔액이 부족합니다."; + m_Messages[BILLING_RESULT_LOGIN_NO_SESSION] = "세션이 없습니다."; + m_Messages[BILLING_RESULT_LOGIN_BAD_PACKET] = "정의 되지 않는 패킷"; + m_Messages[BILLING_RESULT_LOGIN_COM_ERROR] = "COM 에러"; + m_Messages[BILLING_RESULT_LOGIN_NO_RESPONSE] = "지정된 시간동안 응답이 없습니다."; + m_Messages[BILLING_RESULT_LOGIN_NO_MACHINE] = "해당 장비에 접속할 수 없습니다."; + m_Messages[BILLING_RESULT_LOGIN_BAD_GAME_NO] = "빌링 서버에 등록된 게임번호와 다릅니다."; + m_Messages[BILLING_RESULT_LOGIN_ACCOUNT_ERROR] = "빌링 어카운트의 서비스 에러"; + m_Messages[BILLING_RESULT_LOGIN_DENY] = "해당 게임에 사용 불가능 ( 결제 정보는 있음 )"; + m_Messages[BILLING_RESULT_LOGIN_TIME_OVER] = "유효 기간이 지남"; + m_Messages[BILLING_RESULT_LOGIN_BUSY] = "빌링 서버 사용자가 많습니다."; + m_Messages[BILLING_RESULT_LOGIN_UNKNOWN_ERROR] = "정의 되지 않은 오류 번호입니다."; + m_Messages[BILLING_RESULT_LOGIN_IP_COM_ERROR] = "IP를 확인하는중 COM에러가 발생하였습니다."; + m_Messages[BILLING_RESULT_LOGIN_IP_ERROR] = "해당 IP를 보유한 공급자의 정보가 부족합니다."; + m_Messages[BILLING_RESULT_LOGIN_KEY_COM_ERROR] = "인증키를 확인하는 중 COM에러가 발생하였습니다."; + m_Messages[BILLING_RESULT_LOGIN_NO_KEY] = "인증키를 찾지 못했습니다."; } string BillingResultLoginErrorMessage::getMessage(int index) const { diff --git a/src/server/gameserver/billing/CommonBillingPacket.h b/src/server/gameserver/billing/CommonBillingPacket.h index feebe86a..81682e27 100644 --- a/src/server/gameserver/billing/CommonBillingPacket.h +++ b/src/server/gameserver/billing/CommonBillingPacket.h @@ -20,7 +20,7 @@ // // class CommonBillingPacket; // -// GameServer BillingServer ְ ޴ packet̴. +// GameServer와 BillingServer가 주고 받는 packet이다. // ////////////////////////////////////////////////////////////////////// @@ -30,10 +30,10 @@ class GamePlayer; class CommonBillingPacket : public Packet, public BillingInfo { public: - // Է½Ʈ()κ Ÿ о Ŷ ʱȭѴ. + // 입력스트림(버퍼)으로부터 데이타를 읽어서 패킷을 초기화한다. void read(SocketInputStream& iStream); - // ½Ʈ() Ŷ ̳ʸ ̹ . + // 출력스트림(버퍼)으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream) const; // execute packet's handler @@ -91,7 +91,7 @@ class CommonBillingPacket : public Packet, public BillingInfo { string getExpire_DateToString() const; private: - // 256 BillingInfo 196̱ ϴ ̷ ƵаŴ + // 256은 BillingInfo가 196이기 때문에 일단 이렇게 잡아둔거다 char m_pBuffer[256]; }; @@ -122,7 +122,7 @@ class CommonBillingPacketFactory : public PacketFactory { } // get packet's max body size - // message ִ ũ⿡ ʿϴ. + // message 의 최대 크기에 대한 설정이 필요하다. PacketSize_t getPacketMaxSize() const { return szBillingInfo; } diff --git a/src/server/gameserver/billing/CommonBillingPacketHandler.cpp b/src/server/gameserver/billing/CommonBillingPacketHandler.cpp index 0dbff7e0..add54f0f 100644 --- a/src/server/gameserver/billing/CommonBillingPacketHandler.cpp +++ b/src/server/gameserver/billing/CommonBillingPacketHandler.cpp @@ -25,7 +25,7 @@ #include "GCSystemMessage.h" -// packetUtil.h ߰ؾ Ѵ. +// packetUtil.h에 추가해야 한다. extern void sendSystemMessage(GamePlayer* pGamePlayer, const string& msg); ////////////////////////////////////////////////////////////////////////////// @@ -35,28 +35,28 @@ void CommonBillingPacketHandler::execute(CommonBillingPacket* pPacket, Player* p // #ifdef __GAME_SERVER__ - // α׸ + // 다 로그를 남기자 filelog(LOGFILE_BILLING_PACKET, "%s", pPacket->toString().c_str()); int code = pPacket->Packet_Type; switch (code) { - // ӿ ö packet + // 게임에 들어올때 보낸 packet에 대한 인증 정보 case BILLING_PACKET_LOGIN: executeBillingLoginVerify(pPacket, pPlayer); break; - // ð ش. (B->G only) + // 남은 시간을 보여준다. (B->G only) case BILLING_PACKET_REMAIN: executeBillingRemain(pPacket, pPlayer); break; - // üũ. BillingServer ش. + // 접속 중 체크. BillingServer로 접속 정보를 보내준다. case BILLING_PACKET_CHECK: executeBillingCheck(pPacket, pPlayer); break; - // üũѴ. + // 유료 사용 가능한지만 체크한다. case BILLING_PACKET_LOGIN_CHECK: executeBillingLoginCheckVerify(pPacket, pPlayer); break; @@ -73,7 +73,7 @@ void CommonBillingPacketHandler::execute(CommonBillingPacket* pPacket, Player* p } ////////////////////////////////////////////////////////////////////////////// -// ӿ ö packet +// 게임에 들어올때 보낸 packet에 대한 인증 정보 ////////////////////////////////////////////////////////////////////////////// void CommonBillingPacketHandler::executeBillingLoginVerify(CommonBillingPacket* pPacket, Player* pPlayer) { __BEGIN_TRY __BEGIN_DEBUG_EX @@ -89,7 +89,7 @@ void CommonBillingPacketHandler::executeBillingLoginVerify(CommonBillingPacket* if (pCreature != NULL) { GamePlayer* pGamePlayer = dynamic_cast(pCreature->getPlayer()); - // Ǿٰ üũѴ. + // 검증 되었다고 체크한다. pGamePlayer->setBillingLoginVerified(); if (result == BILLING_RESULT_LOGIN_OK) { @@ -111,31 +111,31 @@ void CommonBillingPacketHandler::executeBillingLoginVerify(CommonBillingPacket* << ", " << pPacket->Remain_Time << " )" << endl; #endif } else { - // PC + // PC 방 사용자 filelog(LOGFILE_BILLING_PLAYER, "LoginVerify: PayPlay (%s, PCRoom)", pPacket->User_ID); #ifdef __COUT_BILLING_SYSTEM__ cout << "LoginVerify: PayPlay ( " << pPacket->User_ID << ", PCRoom )" << endl; #endif } - // + // 유료 접속 가능 pGamePlayer->setBillingUserStatus(pPacket->User_Status); pGamePlayer->setPremiumPlay(); -// ̸.. ÷̰ ʿ. +// 유료 사용자이면.. 무료플레이가 필요없다. #ifdef __PAY_SYSTEM_FREE_LIMIT__ if (pGamePlayer->isPayPlaying()) { - bool bClear = true; // Pay Ѵ. + bool bClear = true; // Pay정보 제거한다. pGamePlayer->logoutPayPlay(pGamePlayer->getID(), bClear); } #endif - // , ð ش. + // 접속 후, 남은 시간을 보내준다. sendBillingRemainMessage(pPacket, pGamePlayer); } else if (result == BILLING_RESULT_LOGIN_NO_ACCOUNT) { - // . - // ϴ д. - // ڵ ִ. + // 무료 사용자. + // 일단 걍 둔다. + // 무료 사용자도 게임할 수 있다. // by bezz 2003.04.22 filelog(LOGFILE_BILLING_PLAYER, "LoginVerify: No Account(%s)", pPacket->User_ID); @@ -144,8 +144,8 @@ void CommonBillingPacketHandler::executeBillingLoginVerify(CommonBillingPacket* cout << "LoginVerify: No Account(" << pPacket->User_ID << ")" << endl; #endif - // Ұ - // ϴ .. ¥. + // 유료 사용 불가 + // 일단은 찝찝하지만.. 걍 짜른다. // pGamePlayer->setPenaltyFlag( PENALTY_TYPE_KICKED ); // #ifdef __PAY_SYSTEM_FREE_LIMIT__ @@ -156,7 +156,7 @@ void CommonBillingPacketHandler::executeBillingLoginVerify(CommonBillingPacket* if (pPC->isPayPlayAvaiable()) { - // Ⱓ ִ . + // 아직 무료 기간이 남아있는 경우. filelog(LOGFILE_BILLING_PLAYER, "LoginVerify: FreePlay (%s)", pPacket->User_ID); #ifdef __COUT_BILLING_SYSTEM__ cout << "LoginVerify: FreePlay (" << pPacket->User_ID << ")" << endl; @@ -164,14 +164,14 @@ void CommonBillingPacketHandler::executeBillingLoginVerify(CommonBillingPacket* } else { - // ɷġ over + // 능력치 over된 경우 filelog(LOGFILE_BILLING_PLAYER, "LoginVerify: Disconnect by ATTR (%s)", pPacket->User_ID); #ifdef __COUT_BILLING_SYSTEM__ cout << "LoginVerify: Disconnect by ATTR (" << pPacket->User_ID << ")" << endl; #endif - disconnectGamePlayer( pGamePlayer, 5*10 ); // 5 ¥. + disconnectGamePlayer( pGamePlayer, 5*10 ); // 5초 후 짜른다. } } else @@ -183,7 +183,7 @@ void CommonBillingPacketHandler::executeBillingLoginVerify(CommonBillingPacket* cout << "LoginVerify: Disconnect (" << pPacket->User_ID << ")" << endl; #endif - disconnectGamePlayer( pGamePlayer, 5*10 ); // 5 ¥. + disconnectGamePlayer( pGamePlayer, 5*10 ); // 5초 후 짜른다. } */ } else { @@ -196,7 +196,7 @@ void CommonBillingPacketHandler::executeBillingLoginVerify(CommonBillingPacket* cout << "LoginVerify: Disconnect (" << pPacket->User_ID << ")" << endl; #endif - disconnectGamePlayer(pGamePlayer, 10 * 10); // 10 ¥. + disconnectGamePlayer(pGamePlayer, 10 * 10); // 10 초 후 짜른다. } } else { filelog(LOGFILE_BILLING_PLAYER, "LoginVerify: No Such Player(%s)", pPacket->User_ID); @@ -217,7 +217,7 @@ void CommonBillingPacketHandler::executeBillingLoginVerify(CommonBillingPacket* ////////////////////////////////////////////////////////////////////////////// -// α üũ ϴ +// 로그인 서버에서 유료 사용이 가능한지 체크만 하는 경우 ////////////////////////////////////////////////////////////////////////////// void CommonBillingPacketHandler::executeBillingLoginCheckVerify(CommonBillingPacket* pPacket, Player* pPlayer) { __BEGIN_TRY __BEGIN_DEBUG_EX @@ -231,7 +231,7 @@ void CommonBillingPacketHandler::executeBillingLoginCheckVerify(CommonBillingPac LoginPlayer* pLoginPlayer = g_pLoginPlayerManager->getPlayer_NOLOCKED(pPacket->User_ID); if (pLoginPlayer != NULL) { - // Ǿٰ üũѴ. + // 검증 되었다고 체크한다. pLoginPlayer->setBillingLoginVerified(); if (result == BILLING_RESULT_LOGIN_OK) { @@ -248,29 +248,29 @@ void CommonBillingPacketHandler::executeBillingLoginCheckVerify(CommonBillingPac << ", " << pPacket->Remain_Time << " )" << endl; #endif - // + // 유료 접속 가능 pLoginPlayer->setBillingUserStatus(pPacket->User_Status); -// ֵ UserStatus ־ ٶ ӽ÷ ߴ ڵ. by sigi. 2002.12.5 +// 애드빌에서 UserStatus를 안 넣어준 바람에 임시로 사용했던 코드. by sigi. 2002.12.5 // if (pLoginPlayer->getBillingUserStatus().empty()) //{ // pLoginPlayer->setBillingUserStatus( "HO" ); //} -// login ̰ ǹ̰ . +// login서버에서는 이게 의미가 없겠지. // pLoginPlayer->setPremiumPlay(); -// ̸.. ÷̰ ʿ. +// 유료 사용자이면.. 무료플레이가 필요없다. #ifdef __PAY_SYSTEM_FREE_LIMIT__ if (pLoginPlayer->isPayPlaying()) { - bool bClear = true; // Pay Ѵ. + bool bClear = true; // Pay정보 제거한다. pLoginPlayer->logoutPayPlay(pLoginPlayer->getID(), bClear); } #endif } else { if (pLoginPlayer->isPayPlaying()) { - // ¶.. ִ. - // ij ɷġ ¥°Ŵ CLSelectPCHandler.cpp Ѵ. + // 머 어쨋든.. 게임 가능한 애다. + // 캐릭터 능력치별로 짜르는거는 CLSelectPCHandler.cpp에서 한다. pLoginPlayer->setBillingUserStatus("XX"); filelog(LOGFILE_BILLING_PLAYER, "LoginCheckVerify: Can FreePlay (%s)", pPacket->User_ID); @@ -280,7 +280,7 @@ void CommonBillingPacketHandler::executeBillingLoginCheckVerify(CommonBillingPac #endif } else { - // ©ߵ ִ. + // 짤라야될 애당. cout << pPacket->User_ID << " cannot play by billing" << endl; filelog(LOGFILE_BILLING_PLAYER, "LoginCheckVerify: Cannot BillingPlay (%s)", pPacket->User_ID); @@ -308,7 +308,7 @@ void CommonBillingPacketHandler::executeBillingLoginCheckVerify(CommonBillingPac } ////////////////////////////////////////////////////////////////////////////// -// ð ش. (B->G only) +// 남은 시간을 보여준다. (B->G only) ////////////////////////////////////////////////////////////////////////////// void CommonBillingPacketHandler::executeBillingRemain(CommonBillingPacket* pPacket, Player* pPlayer) { __BEGIN_TRY __BEGIN_DEBUG_EX @@ -325,16 +325,16 @@ void CommonBillingPacketHandler::executeBillingRemain(CommonBillingPacket* pPack switch (result) { //----------------------------------------------------------------- - // Ű + // 접속을 종료 시키는 경우 //----------------------------------------------------------------- - case BILLING_RESULT_REMAIN_DISCONNECT: // - case BILLING_RESULT_REMAIN_DUPLICATE: // ߺ - case BILLING_RESULT_REMAIN_REFUND: // ȯ + case BILLING_RESULT_REMAIN_DISCONNECT: // 강제 종료 + case BILLING_RESULT_REMAIN_DUPLICATE: // 중복 접속 + case BILLING_RESULT_REMAIN_REFUND: // 환불 - // Ұ - // ϴ .. ¥. + // 유료 사용 불가 + // 일단은 찝찝하지만.. 걍 짜른다. // pGamePlayer->setPenaltyFlag( PENALTY_TYPE_KICKED ); - // 5 ¥. + // 5 초 후 짜른다. char session[40]; memcpy(session, pPacket->Session, 32); session[32] = '\0'; @@ -356,21 +356,21 @@ void CommonBillingPacketHandler::executeBillingRemain(CommonBillingPacket* pPack break; //----------------------------------------------------------------- - // ð Ǿ. ȯ + // 유료 사용 시간이 다 되었다. 무료 사용으로 전환 //----------------------------------------------------------------- case BILLING_RESULT_REMAIN_NONE: { // char message[40]; - // sprintf( message, " ð Ǿϴ." ) + // sprintf( message, "유료 사용시간이 다 되었습니다." ) // sendSystemMessage(pGamePlayer, message); - // ZonePlayerManager © ȴ. + // ZonePlayerManager 에서 유료존에 있을 경우 짤리게 된다. pGamePlayer->setBillingUserStatus(""); } break; //----------------------------------------------------------------- - // ִ + // 결제 정보를 보여주는 경우 //----------------------------------------------------------------- - case BILLING_RESULT_REMAIN_RESERVE: // ο + case BILLING_RESULT_REMAIN_RESERVE: // 새로운 결제정보 사용 시작 { char billMethod[10]; // char expireDate[20]; @@ -380,18 +380,18 @@ void CommonBillingPacketHandler::executeBillingRemain(CommonBillingPacket* pPack filelog(LOGFILE_BILLING_PLAYER, "BillingRemain: (%s, %dm)", pPacket->User_ID, (pPacket->Remain_Time / 60)); - // ٽ ִ + // 결제 정보를 다시 보여주는 경우 GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(g_pStringPool->getString(STRID_APPLY_NEW_BILLING_INFO)); pGamePlayer->sendPacket(&gcSystemMessage); - // , ð ش. + // 접속 후, 남은 시간을 보내준다. sendBillingRemainMessage(pPacket, pGamePlayer); } break; //----------------------------------------------------------------- - // ð + // 정상적으로 남은 시간 //----------------------------------------------------------------- case BILLING_RESULT_REMAIN_TIME: { char billMethod[10]; @@ -407,26 +407,26 @@ void CommonBillingPacketHandler::executeBillingRemain(CommonBillingPacket* pPack int min = (sec - (hour * 3600)) / 60; StringStream msg; - msg << " ð "; + msg << "유료 서비스 사용 가능 시간이 "; if (hour > 0) { - msg << hour << "ð "; + msg << hour << "시간 "; } - msg << min << " ҽϴ."; + msg << min << "분 남았습니다."; if (strcmp(billMethod, "FM") == 0) - msg << "()"; + msg << "(월정액)"; else if (strcmp(billMethod, "FD") == 0) - msg << "()"; + msg << "(일정액)"; else if (strcmp(billMethod, "TH") == 0) - msg << "()"; + msg << "(정량)"; #ifdef __COUT_BILLING_SYSTEM__ cout << "[" << pPacket->User_ID << "] " << msg.toString().c_str() << endl; //<< billMethod << ", " - //<< pPacket->getExpire_DateToString().c_str() << ", " + //<< pPacket->getExpire_DateToString().c_str() << "까지, " #endif sendSystemMessage(pGamePlayer, msg.toString()); @@ -448,7 +448,7 @@ void CommonBillingPacketHandler::executeBillingRemain(CommonBillingPacket* pPack } ////////////////////////////////////////////////////////////////////////////// -// üũ. BillingServer ش. +// 접속 중 체크. BillingServer로 접속 정보를 보내준다. ////////////////////////////////////////////////////////////////////////////// void CommonBillingPacketHandler::executeBillingCheck(CommonBillingPacket* pPacket, Player* pPlayer) { __BEGIN_TRY __BEGIN_DEBUG_EX @@ -458,7 +458,7 @@ void CommonBillingPacketHandler::executeBillingCheck(CommonBillingPacket* pPacke BillingPlayer* pBillingPlayer = dynamic_cast(pPlayer); Assert(pBillingPlayer != NULL); - // ٽ . + // 다시 결과값을 보낸다. pBillingPlayer->sendPayCheck(pPacket); #else @@ -480,7 +480,7 @@ void CommonBillingPacketHandler::disconnectGamePlayer(GamePlayer* pGamePlayer, T pEventKick->setDeadline(delay); - // Ŀ ©.. ش. + // 몇 초후에 짤린다..고 보내준다. pEventKick->sendMessage(); pGamePlayer->addEvent(pEventKick); @@ -504,14 +504,14 @@ void CommonBillingPacketHandler::sendBillingRemainMessage(CommonBillingPacket* p billMethod[2] = '\0'; StringStream msg; - msg << " "; + msg << "유료 서비스 사용 가능 "; - // PC + // PC 방 사용자일 경우 if (strcmp(userStatus, "PM") == 0) { - msg << "[PC]"; + msg << "[PC방]"; } - // ϴ - else if (strcmp(billMethod, "FM") == 0 || strcmp(billMethod, "FD") == 0) // + // 남은 날 수를 출력하는 경우 + else if (strcmp(billMethod, "FM") == 0 || strcmp(billMethod, "FD") == 0) // 남은 날 수 { char expireDate[20]; memcpy(expireDate, pPacket->Expire_Date, 12); @@ -528,13 +528,13 @@ void CommonBillingPacketHandler::sendBillingRemainMessage(CommonBillingPacket* p // int day = pPacket->Remain_Time; if (day == 0 && currentDateTime.date() == vsdtExpireDate.date()) { - msg << "Ⱓ ñ Դϴ"; + msg << "기간은 오늘까지 입니다"; } else { - msg << "Ⱓ " << (day == 0 ? 1 : day) << " ҽϴ."; + msg << "기간이 " << (day == 0 ? 1 : day) << "일 남았습니다."; } - // ׹ ̴̿. - // ޽ ¾Ѵ. + // 겜방 이용자이다. + // 메시지 출력안한다. if (sExpireDate.size() < 7) { filelog(LOGFILE_BILLING_PLAYER, "LoginRemain: (%s, Netmarble PCRoom)", pPacket->User_ID); return; @@ -542,21 +542,21 @@ void CommonBillingPacketHandler::sendBillingRemainMessage(CommonBillingPacket* p filelog(LOGFILE_BILLING_PLAYER, "LoginRemain: (%s, %d day)", pPacket->User_ID, day); } - // ð ϴ - else if (strcmp(billMethod, "TH") == 0) // ð + // 남은 시간을 출력하는 경우 + else if (strcmp(billMethod, "TH") == 0) // 남은 시간 { - // ð ѹ + // 남은 시간 무조건 한번 출력 int sec = pPacket->Remain_Time; int hour = sec / 3600; int min = (sec - (hour * 3600)) / 60; - msg << "ð "; + msg << "시간이 "; if (hour > 0) { - msg << hour << "ð "; + msg << hour << "시간 "; } - msg << min << " ҽϴ."; + msg << min << "분 남았습니다."; filelog(LOGFILE_BILLING_PLAYER, "LoginRemain: (%s, %dh %dm)", pPacket->User_ID, hour, min); } diff --git a/src/server/gameserver/billing/main.cpp b/src/server/gameserver/billing/main.cpp index 76825426..89c12a2b 100644 --- a/src/server/gameserver/billing/main.cpp +++ b/src/server/gameserver/billing/main.cpp @@ -14,26 +14,26 @@ int main(int argc, char* argv[]) { cout << cbp.toString().c_str() << endl; - // command-line parameter string ȯѴ. ^^; + // command-line parameter¸¦ string À¸·Î º¯È¯ÇÑ´Ù. ^^; string* Argv; Argv = new string[argc]; for (int i = 0; i < argc; i++) Argv[i] = argv[i]; - // ȯ оδ. - // $VSHOME/bin, ȯ $VSHOME/conf ؾ Ѵ. - // command line ȯ ֵ Ѵ. + // ȯ°æ ÆÄÀÏÀ» ÀоîµéÀδÙ. + // ´Ü ½ÇÇà ÆÄÀÏÀº $VSHOME/bin¿¡, ȯ°æ ÆÄÀÏÀº $VSHOME/conf ¿¡ Á¸ÀçÇØ¾ß ÇÑ´Ù.½ + // command line ¿¡¼­ ȯ°æ ÆÄÀÏÀ» ÁöÁ¤ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. //------------------------------------------------------------------- // Load config file //------------------------------------------------------------------- try { if (Argv[1] != "-f") { - throw Error("Usage : gameserver -f ȯ"); + throw Error("Usage : gameserver -f ȯ°æÆÄÀÏ"); } - // ù° ĶͰ -f , ι° Ķʹ ȯ ġ ȴ. + // ù¹øÂ° ÆÄ¶ó¹ÌÅͰ¡ -f ÀÏ °æ¿ì, µÎ¹øÂ° ÆÄ¶ó¹ÌÅʹ ȯ°æÆÄÀÏÀÇ À§Ä¡°¡ µÈ´Ù. g_pConfig = new Properties(); g_pConfig->load(Argv[2]); diff --git a/src/server/gameserver/couple/CoupleManager.h b/src/server/gameserver/couple/CoupleManager.h index d2f312eb..f701d7ed 100644 --- a/src/server/gameserver/couple/CoupleManager.h +++ b/src/server/gameserver/couple/CoupleManager.h @@ -7,7 +7,7 @@ class PlayerCreature; -// const ϸ 쿹 Ǵ°? +// const 안하면 우예 되는거지? const string Sex2FieldName[] = { "FemalePartnerName", "MalePartnerName", diff --git a/src/server/gameserver/couple/PartnerWaitingManager.cpp b/src/server/gameserver/couple/PartnerWaitingManager.cpp index 9a351e4e..29cd457a 100644 --- a/src/server/gameserver/couple/PartnerWaitingManager.cpp +++ b/src/server/gameserver/couple/PartnerWaitingManager.cpp @@ -17,7 +17,7 @@ PartnerWaitInfo::PartnerWaitInfo(PlayerCreature* pWaitingPC, string RequestedPCN m_RequestedPCName = RequestedPCName; m_WaitingPCOID = pWaitingPC->getObjectID(); - // ѽð 1 + // 제한시간 1분 Timeval currentTime; getCurrentTime(currentTime); m_Deadline = currentTime; @@ -70,7 +70,7 @@ PartnerWaitingManager::~PartnerWaitingManager() { m_WaitInfos.clear(); } -// ο PartnerWaitInfo Ѵ. +// 새로운 PartnerWaitInfo를 만들고 등록한다. uint PartnerWaitingManager::waitForPartner(PlayerCreature* pWaitingPC, string RequestedPCName) { __BEGIN_TRY @@ -101,7 +101,7 @@ uint PartnerWaitingManager::waitForPartner(PlayerCreature* pWaitingPC, string Re if (pTargetPC == NULL) return COUPLE_MESSAGE_LOGOFF; - // PartnerWaitInfo FactoryMethod ο PartnerWaitInfo ü . WaitForMeet or WaitForApart + // PartnerWaitInfo 의 FactoryMethod 로 새로운 PartnerWaitInfo 의 객체를 만든다. WaitForMeet or WaitForApart PartnerWaitInfo* pPartnerWaitInfo = PartnerWaitInfo::getPartnerWaitInfo(pWaitingPC, RequestedPCName, getWaitType()); Assert(pPartnerWaitInfo != NULL); @@ -118,7 +118,7 @@ uint PartnerWaitingManager::waitForPartner(PlayerCreature* pWaitingPC, string Re __END_CATCH } -// شϴ PC ٸ ִ Ʈ û ãƼ . +// 해당하는 PC가 기다리고 있는 파트너 요청을 찾아서 지운다. bool PartnerWaitingManager::stopWaitForPartner(PlayerCreature* pWaitingPC) { __BEGIN_TRY @@ -148,7 +148,7 @@ uint PartnerWaitingManager::acceptPartner(PlayerCreature* pRequestedPC) { Assert(pRequestedPC != NULL); WaitInfoHashMap::iterator itr = m_WaitInfos.find(pRequestedPC->getName()); - // ٸ ڰ . + // 이 사람을 기다리는 자가 없다. if (itr == m_WaitInfos.end()) return COUPLE_MESSAGE_NO_WAITING; @@ -159,13 +159,13 @@ uint PartnerWaitingManager::acceptPartner(PlayerCreature* pRequestedPC) { if (pWaitingPC == NULL) return COUPLE_MESSAGE_LOGOFF; - // . + // 성별이 같으면 성사될 수 없다. if (pWaitingPC->getSex() == pRequestedPC->getSex()) return COUPLE_MESSAGE_SAME_SEX; uint result = pPartnerWaitInfo->acceptPartner(pRequestedPC); - // Ŀ ش. + // 성사된 이후엔 지워준다. SAFE_DELETE(pPartnerWaitInfo); m_WaitInfos.erase(itr); @@ -211,7 +211,7 @@ void PartnerWaitingManager::heartbeat() { WaitInfoHashMap::iterator delitr = itr; itr++; - // ! + // 데드라인이 지났다! pPartnerWaitInfo->timeExpired(); SAFE_DELETE(pPartnerWaitInfo); m_WaitInfos.erase(delitr); diff --git a/src/server/gameserver/couple/WaitForApart.cpp b/src/server/gameserver/couple/WaitForApart.cpp index 2adaa048..38997dc6 100644 --- a/src/server/gameserver/couple/WaitForApart.cpp +++ b/src/server/gameserver/couple/WaitForApart.cpp @@ -38,7 +38,7 @@ uint WaitForApart::waitPartner(PlayerCreature* pTargetPC) { GCSystemMessage gcSystemMessage; // StringStream msg; - // msg << pWaitingPC->getName() << "κ ̺ û Խϴ."; + // msg << pWaitingPC->getName() << "님으로부터 이별 신청이 왔습니다."; char msg[100]; sprintf(msg, g_pStringPool->c_str(STRID_REQUEST_APART), pWaitingPC->getName().c_str()); @@ -75,14 +75,14 @@ uint WaitForApart::acceptPartner(PlayerCreature* pRequestedPC) { Assert(hasCoupleItem(pRequestedPC)); Assert(hasCoupleItem(pWaitingPC)); - // Ŀø ~_~; + // 커플링을 없애줘야 함~_~; Assert(removeCoupleItem(pRequestedPC)); Assert(removeCoupleItem(pWaitingPC)); - // ĿøŴ ٰ + // 커플매니저에서 헤어졌다고 등록함 g_pCoupleManager->removeCouple(pRequestedPC, pWaitingPC); - // Ŀ Flag ٽ ش. + // 커플이 깨졌으니 Flag 를 다시 돌려준다. pRequestedPC->getFlagSet()->turnOff(FLAGSET_IS_COUPLE); pWaitingPC->getFlagSet()->turnOff(FLAGSET_IS_COUPLE); @@ -111,18 +111,18 @@ uint WaitForApart::acceptPartner(PlayerCreature* pRequestedPC) { pRequestedPC->getPlayer()->sendPacket( &gcDeleteRequestedPCInventoryCoupleItem ); pWaitingPC->getPlayer()->sendPacket( &gcDeleteWaitingPCInventoryCoupleItem ); - // Ŀ PlayerCreature ItemNameInfo ϴµ ;; - // ׳ NULL ~_~ + // 커플이 깨졌으니 PlayerCreature 에 ItemNameInfo 도 없애줘야하는뎅 ;; + // 그냥 NULL 로 셋팅하자 ~_~ pRequestedPC->deleteItemNameInfoList( pRequestedPCCoupleItem->getObjectID() ); pWaitingPC->deleteItemNameInfoList( pWaitingPCCoupleItem->getObjectID() ); - // ش. + // 아이템을 없애준다. pRequestedPCCoupleItem->destroy(); SAFE_DELETE( pRequestedPCCoupleItem ); pWaitingPCCoupleItem->destroy(); SAFE_DELETE( pWaitingPCCoupleItem ); - // or ã ϹǷ. + // 딴 남자 or 여자 찾아 떠나야 하므로. return true; } @@ -135,7 +135,7 @@ uint WaitForApart::acceptPartner(PlayerCreature* pRequestedPC) { void WaitForApart::timeExpired() { __BEGIN_TRY - // ߴٰ ش. + // 헤어짐이 거절당했다고 보내준다. GCNPCResponse gcNPCResponse; gcNPCResponse.setCode(NPC_RESPONSE_APART_WAIT_TIME_EXPIRED); @@ -149,7 +149,7 @@ void WaitForApart::timeExpired() { bool WaitForApart::removeCoupleItem(PlayerCreature* pPC) { __BEGIN_TRY - // ׼հ-_- . + // 네손가락-_-부터 뒤진다. if (pPC->isSlayer()) { Slayer* pSlayer = dynamic_cast(pPC); Assert(pSlayer != NULL); @@ -199,10 +199,10 @@ bool WaitForApart::removeCoupleItem(PlayerCreature* pPC) { } else Assert(false); - // 콺 ִ. + // 마우스에 아이템이 있다. Item* pCoupleItem = pPC->getExtraInventorySlotItem(); if (pCoupleItem == NULL || !isMatchCoupleRing(pPC, pCoupleItem)) { - // 콺 ų 콺 ִ Ŀø ƴϸ κ丮 . + // 마우스에 아이템이 없거나 마우스에 있는 아이템이 커플링이 아니면 인벤토리를 뒤진다. pCoupleItem = pPC->getInventory()->findItem(getItemClass(pPC), getItemType(pPC)); if (pCoupleItem != NULL) pPC->getInventory()->deleteItem(pCoupleItem->getObjectID()); diff --git a/src/server/gameserver/couple/WaitForMeet.cpp b/src/server/gameserver/couple/WaitForMeet.cpp index 6a4541d2..76609190 100644 --- a/src/server/gameserver/couple/WaitForMeet.cpp +++ b/src/server/gameserver/couple/WaitForMeet.cpp @@ -33,7 +33,7 @@ uint WaitForMeet::waitPartner(PlayerCreature* pTargetPC) { __BEGIN_TRY if (pTargetPC == NULL) - return COUPLE_MESSAGE_LOGOFF; // ̸޽ . ⼭ ϵǴ + return COUPLE_MESSAGE_LOGOFF; // 걍 이메시지 쓴다. 별로 여기서 리턴되는 일을 없을듯 PlayerCreature* pWaitingPC = getWaitingPC(); if (pWaitingPC == NULL) @@ -45,7 +45,7 @@ uint WaitForMeet::waitPartner(PlayerCreature* pTargetPC) { GCSystemMessage gcSystemMessage; // StringStream msg; - // msg << pWaitingPC->getName() << "κ Ŀ û Խϴ."; + // msg << pWaitingPC->getName() << "님으로부터 커플 신청이 왔습니다."; char msg[100]; sprintf(msg, g_pStringPool->c_str(STRID_REQUEST_MEET), pWaitingPC->getName().c_str()); @@ -67,31 +67,31 @@ uint WaitForMeet::acceptPartner(PlayerCreature* pRequestedPC) { if (pWaitingPC == NULL) return COUPLE_MESSAGE_LOGOFF; - // ٸų ȵȴ. - // ѿ ɸų ڶ ȵȴ. - // Ѹ ̹ Ŀ̶ ȵȴ. + // 종족이 다르거나 성별이 같으면 안된다. + // 레벨 제한에 걸리거나 돈이 모자라도 안된다. + // 둘 중 한명이 이미 커플이라도 안된다. uint result = canMakeCouple(pRequestedPC, pWaitingPC); if (result != 0) return result; - // Ŀø ش. + // 커플링을 준다. _TPOINT pt1; _TPOINT pt2; - // Ѹ ޴ 츦 ϱ ̸ ִ ȮѴ. - // ٴڿ . + // 한명만 받는 경우를 방지하기 위해 미리 넣을 수 있는지를 확인한다. + // 바닥에 떨어지면 난리난다. if (!(canGetCoupleRing(pRequestedPC, pt1) && canGetCoupleRing(pWaitingPC, pt2))) return COUPLE_MESSAGE_INVENTORY_FULL; - // Ŀø ش. + // 커플링을 준다. CoupleRingBase* pNewItem1 = giveCoupleRing(pRequestedPC, pWaitingPC->getName(), &pt1); CoupleRingBase* pNewItem2 = giveCoupleRing(pWaitingPC, pRequestedPC->getName(), &pt2); - // ȮǷ ⼭ 縮 尡 ų ִ. + // 위에서 확인했으므로 여기서 삑사리나면 스레드가 꼬였거나 먼 문제가 있다. Assert(pNewItem1 != NULL); Assert(pNewItem2 != NULL); - // Ŀø ID صд. ߿ ﶧ Ǵϱ. + // 커플링에 서로 상대의 아이템ID를 기록해둔다. 나중에 지울때 같이 지워야 되니까. pNewItem1->setPartnerItemID(pNewItem2->getItemID()); pNewItem2->setPartnerItemID(pNewItem1->getItemID()); @@ -101,14 +101,14 @@ uint WaitForMeet::acceptPartner(PlayerCreature* pRequestedPC) { // pRequestedPC->addItemNameInfoList( pRequestedPCItemNameInfo ); // pWaitingPC->addItemNameInfoList( pWaitingPCItemNameInfo ); - // ĿøŴ Ѵ. + // 커플매니저에 등록한다. g_pCoupleManager->makeCouple(pWaitingPC, pRequestedPC); - // Ŀ ϱ ޾Ƴ. + // 커플 등록금을 받아낸다. receiveCoupleRegisterFee(pWaitingPC); receiveCoupleRegisterFee(pRequestedPC); - // Ŀ մϴ. + // 이제 정식으로 커플임을 선포합니다. pRequestedPC->getFlagSet()->turnOn(FLAGSET_IS_COUPLE); pWaitingPC->getFlagSet()->turnOn(FLAGSET_IS_COUPLE); pRequestedPC->getFlagSet()->turnOn(FLAGSET_WAS_COUPLE); @@ -117,9 +117,9 @@ uint WaitForMeet::acceptPartner(PlayerCreature* pRequestedPC) { pRequestedPC->getFlagSet()->save(pRequestedPC->getName()); pWaitingPC->getFlagSet()->save(pWaitingPC->getName()); - // ..... - // ̸ Ʈ ؼ ش. - // ش. -_- - 2003.2.24 + // 더 할 거 없나..... + // 이름붙은 아이템 리스트 목록을 갱신해서 보내준다. + // 안 보내준다. -_- - 2003.2.24 /* if ( !pRequestedPC->isEmptyItemNameInfoList() && !pWaitingPC->isEmptyItemNameInfoList() ) { @@ -145,7 +145,7 @@ uint WaitForMeet::acceptPartner(PlayerCreature* pRequestedPC) { void WaitForMeet::timeExpired() { __BEGIN_TRY - // ٸ ȵǼ̽ϴ.. ޽ ش. + // 기다리던 사람에게 안되셨습니다..라고 메시지를 보내준다. GCNPCResponse gcNPCResponse; gcNPCResponse.setCode(NPC_RESPONSE_MEET_WAIT_TIME_EXPIRED); diff --git a/src/server/gameserver/ctf/FlagManager.cpp b/src/server/gameserver/ctf/FlagManager.cpp index 2badc480..9f077404 100644 --- a/src/server/gameserver/ctf/FlagManager.cpp +++ b/src/server/gameserver/ctf/FlagManager.cpp @@ -106,10 +106,10 @@ void FlagManager::addPoleField(Zone* pZone, ZoneCoord_t left, ZoneCoord_t top, u void FlagManager::manualStart() { if (!isEmpty()) { - cout << " .." << endl; + cout << "스케줄 땡기기.." << endl; addSchedule(new Schedule(popRecentWork(), VSDateTime::currentDateTime())); } else { - cout << " .." << endl; + cout << "스케줄 만들기.." << endl; addSchedule(new Schedule(new FlagWar(), VSDateTime::currentDateTime())); } } @@ -144,7 +144,7 @@ bool FlagManager::endFlagWar() { if (m_bHasFlagWar) { recordFlagWarHistory(); - // script ., system Լ ̾ !_! + // script 돌리기 ㅡ.,ㅡ system 함수를 쓰게 될 줄이야 !_! char cmd[100]; sprintf(cmd, "/home/darkeden/vs/bin/script/recordFlagWarHistory.py %s %d %d %d %d %d %d %d ", m_EndTime.toStringforWeb().c_str(), (int)getWinnerRace(), g_pConfig->getPropertyInt("Dimension"), @@ -173,7 +173,7 @@ bool FlagManager::putFlag(PlayerCreature* pPC, MonsterCorpse* pFlagPole) { m_FlagCount[(RACEINDEX)(pPC->getRace())]++; m_StatusPacket.setFlagCount(pPC->getRace(), m_FlagCount[(RACEINDEX)(pPC->getRace())]); m_PutTime[pPC->getRace()] = VSDateTime::currentDateTime(); - filelog("FlagWar.log", "%s 뿡 ̽ϴ. S : %d, V : %d, O : %d", pPC->getName().c_str(), + filelog("FlagWar.log", "%s 님이 깃발을 깃대에 꽂으셨습니당. S : %d, V : %d, O : %d", pPC->getName().c_str(), m_FlagCount[SLAYER], m_FlagCount[VAMPIRE], m_FlagCount[OUSTERS]); unlock(); @@ -195,7 +195,7 @@ bool FlagManager::getFlag(PlayerCreature* pPC, MonsterCorpse* pFlagPole) { lock(); m_FlagCount[(RACEINDEX)(m_FlagPoles[pFlagPole])]--; m_StatusPacket.setFlagCount(m_FlagPoles[pFlagPole], m_FlagCount[(RACEINDEX)(m_FlagPoles[pFlagPole])]); - filelog("FlagWar.log", "%s ̽ϴ. S : %d, V : %d, O : %d", pPC->getName().c_str(), + filelog("FlagWar.log", "%s 님이 깃발을 뽑으셨습니당. S : %d, V : %d, O : %d", pPC->getName().c_str(), m_FlagCount[SLAYER], m_FlagCount[VAMPIRE], m_FlagCount[OUSTERS]); unlock(); @@ -222,7 +222,7 @@ bool FlagManager::putFlag(PlayerCreature* pPC, Item* pItem, MonsterCorpse* pFlag Effect* pEffect = pPC->findEffect(Effect::EFFECT_CLASS_HAS_FLAG); if (pEffect != NULL) { - // cout << "Ʈ ְ.." << endl; + // cout << "이펙트도 없애주고.." << endl; pEffect->setDeadline(0); } @@ -276,8 +276,8 @@ void FlagManager::resetFlagCounts() { m_FlagCount[VAMPIRE] = 0; m_FlagCount[OUSTERS] = 0; - // ߵ ִ ʿ - // ʵ ߵ 뿡 ݵ Ѵ + // 추적 실패한 깃발들을 지워주는 일이 필요한 거 같다 + // 필드의 깃발들은 문제가 없지만 깃대에 꽂힌 깃발은 반드시 지워줘야 한다 list::iterator itr = m_PoleFields.begin(); list::iterator endItr = m_PoleFields.end(); for (; itr != endItr; ++itr) { @@ -307,7 +307,7 @@ void FlagManager::resetFlagCounts() { } } - // Reset FlagWarStat ̺ Ѵ + // Reset 할 때 FlagWarStat 테이블을 정리한다 Statement* pStmt = NULL; Result* pResult = NULL; @@ -341,7 +341,7 @@ void FlagManager::recordPutFlag(PlayerCreature* pPC, Item* pItem) pResult = pStmt->executeQuery("SELECT Name FROM FlagWarStat WHERE Name = '%s' AND ItemID = %d", pPC->getName().c_str(), pItem->getItemID()); - // INSERT + // 있으면 무시 없으면 INSERT if (!pResult->next()) { pResult = pStmt->executeQuery( "INSERT INTO FlagWarStat (PlayerID, Name, Race, ServerID, ItemID) VALUES ('%s','%s',%d,%d,%d)", diff --git a/src/server/gameserver/ctf/FlagManager.h b/src/server/gameserver/ctf/FlagManager.h index 2abd6bbc..8c1b85bd 100644 --- a/src/server/gameserver/ctf/FlagManager.h +++ b/src/server/gameserver/ctf/FlagManager.h @@ -1,7 +1,7 @@ /////////////////////////////////////////////////////////////////// // FlagManager.h // -// Globalϰ 1 ư Ѵ. +// Global하게 1개만 돌아가야 한다. /////////////////////////////////////////////////////////////////// #ifndef __FLAG_MANAGER_H__ @@ -130,7 +130,7 @@ class FlagManager : public Scheduler { map m_FlagCount; mutable Mutex m_Mutex; - // ߰ ? -_-; + // 종족 추가할 일 없겠지? -_-; map m_FlagPoles; GCFlagWarStatus m_StatusPacket; diff --git a/src/server/gameserver/ctf/FlagWar.cpp b/src/server/gameserver/ctf/FlagWar.cpp index 9d3f59c8..0d5aa2ee 100644 --- a/src/server/gameserver/ctf/FlagWar.cpp +++ b/src/server/gameserver/ctf/FlagWar.cpp @@ -37,7 +37,7 @@ void FlagWar::execute() { setState(STATE_WAIT); break; default: - filelog("FlagWar.log", "̻ FlagWar .."); + filelog("FlagWar.log", "이상한 FlagWar 상태.."); break; } @@ -58,7 +58,7 @@ void FlagWar::executeReady() { g_pZoneGroupManager->broadcast(&gcNE); - // 5ִٰ + // 5분있다가 시작하자 g_pFlagManager->addSchedule(new Schedule(this, VSDateTime::currentDateTime().addSecs(300))); __END_CATCH @@ -90,7 +90,7 @@ void FlagWar::addFlagsRandom(ZoneID_t zoneID, uint no) { TPOINT ptInZone = pZone->addItem(pItem, pt.x, pt.y, true, 36000); pItem->create("", STORAGE_ZONE, pZone->getZoneID(), ptInZone.x, ptInZone.y); - filelog("FlagWar.log", "%d : (%d,%d) ϴ.", pZone->getZoneID(), ptInZone.x, ptInZone.y); + filelog("FlagWar.log", "%d : (%d,%d) 에 깃발이 만들어졌습니다.", pZone->getZoneID(), ptInZone.x, ptInZone.y); m_Flags.push_back(pItem->getItemID()); } @@ -119,8 +119,8 @@ void FlagWar::executeStart() { addFlags(); // addFlagsRandom( 1122, 20 ); - // ϰ ؼ 100 Ѵ. - // 2ð + // 랜덤하게 존을 선택해서 100개의 깃발을 생성한다. + // 2시간 하자 g_pFlagManager->addSchedule(new Schedule(this, VSDateTime::currentDateTime().addSecs(getWarTime()))); g_pFlagManager->startFlagWar(); @@ -138,7 +138,7 @@ void FlagWar::executeFinish() { g_pZoneGroupManager->broadcast(&gcNE); - // 3ִٰ ģ. + // 3분있다가 아템 터친다. g_pFlagManager->addSchedule(new Schedule(this, VSDateTime::currentDateTime().addSecs(180))); g_pFlagManager->endFlagWar(); @@ -148,7 +148,7 @@ void FlagWar::executeFinish() { void FlagWar::executeEnd() { __BEGIN_TRY - // ߴ ߵ Ѿư Ӵ. + // 생성했던 깃발들을 쫓아가서 다 지워뿐다. vector::iterator itr = m_Flags.begin(); vector::iterator endItr = m_Flags.end(); @@ -158,21 +158,21 @@ void FlagWar::executeEnd() { if (pItemPosition == NULL) continue; - // popItem ش ġ ̾ƳǷ ȴ. - // ̰ FlagManager 忡 ҷǷ ȿ ɾ ȴ. + // popItem은 아템을 해당 위치에서 뽑아내므로 지워버려도 된다. + // 이건 FlagManager 가 도는 스레드에서 불러지므로 안에서 락걸어줘야 된다. Item* pItem = pItemPosition->popItem(true); if (pItem != NULL) { pItem->destroy(); SAFE_DELETE(pItem); } else { - filelog("FlagWar.log", " ... ."); + filelog("FlagWar.log", "깃발 아이템 추적 실패... ㅜ.ㅠ"); } } g_pFlagManager->resetFlagCounts(); m_Flags.clear(); - // + // 다음을 기약하자 g_pFlagManager->addSchedule(new Schedule(this, getNextFlagWarTime())); /* ZoneCoord_t ZoneX, ZoneY; @@ -240,8 +240,8 @@ VSDateTime FlagWar::getNextFlagWarTime() { } } - // cout << nextWarDateTime.toString() << " Դ~" << endl; - filelog("FlagWar.log", "%s ̺Ʈ ", nextWarDateTime.toString().c_str()); + // cout << nextWarDateTime.toString() << "에 깃발 전쟁 시작함당~" << endl; + filelog("FlagWar.log", "%s에 깃발 뺏기 이벤트 시작", nextWarDateTime.toString().c_str()); return nextWarDateTime; } diff --git a/src/server/gameserver/ctf/FlagWar.h b/src/server/gameserver/ctf/FlagWar.h index 71438cd9..88a938b3 100644 --- a/src/server/gameserver/ctf/FlagWar.h +++ b/src/server/gameserver/ctf/FlagWar.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////// -// ߻⿡ ߻ óƾ. +// 깃발뺏기에 대한 전반적인 정보 및 깃발뺏기 시작 및 종료시 처리루틴. ///////////////////////////////////////////////////////////////////// #ifndef __FLAG_WAR_H__ diff --git a/src/server/gameserver/ctf/NewbieFlagWar.cpp b/src/server/gameserver/ctf/NewbieFlagWar.cpp index 8c9712ff..599aada2 100644 --- a/src/server/gameserver/ctf/NewbieFlagWar.cpp +++ b/src/server/gameserver/ctf/NewbieFlagWar.cpp @@ -52,7 +52,7 @@ VSDateTime NewbieFlagWar::getNextFlagWarTime() { nextWarDateTime = nextWarDateTime.addDays(NextFlagWarDay[nextWarDateTime.date().dayOfWeek()]); } - filelog("FlagWar.log", "%s ʺ ̺Ʈ ", nextWarDateTime.toString().c_str()); + filelog("FlagWar.log", "%s에 초보존 깃발 뺏기 이벤트 시작", nextWarDateTime.toString().c_str()); return nextWarDateTime; } diff --git a/src/server/gameserver/item/AR.cpp b/src/server/gameserver/item/AR.cpp index 8057bf0f..817c1b17 100644 --- a/src/server/gameserver/item/AR.cpp +++ b/src/server/gameserver/item/AR.cpp @@ -99,7 +99,7 @@ void AR::create(const string& ownerID, Storage storage, StorageID_t storageID, B pStmt->executeQueryString(sql.toString()); */ - // StringStream ֱ. by sigi. 2002.5.13 + // StringStream 없애기. by sigi. 2002.5.13 string optionField; setOptionTypeToField(getOptionTypeList(), optionField); pStmt->executeQuery("INSERT INTO ARObject (ItemID, ObjectID, ItemType, OwnerID, Storage, StorageID, X, Y, " @@ -511,7 +511,7 @@ void ARLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -638,7 +638,7 @@ void ARLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: SAFE_DELETE(pStmt); // by sigi - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: SAFE_DELETE(pStmt); // by sigi diff --git a/src/server/gameserver/item/AR.h b/src/server/gameserver/item/AR.h index 2708907c..3edb33e9 100644 --- a/src/server/gameserver/item/AR.h +++ b/src/server/gameserver/item/AR.h @@ -61,8 +61,8 @@ class AR : public ConcreteItemgetHeight(); i++) { for (int j = 0; j < m_pInventory->getWidth(); j++) { @@ -230,7 +230,7 @@ void Belt::save(const string& ownerID, Storage storage, StorageID_t storageID, B m_ObjectID, getItemType(), ownerID.c_str(), (int)storage, storageID, (int)x, (int)y, optionField.c_str(), getDurability(), getGrade(), (int)getEnchantLevel(), m_ItemID); - // ϳ ٷ UPDATE ϵ Ѵ. + // 일일이 아이템을 하나씩 꺼내서 바로 UPDATE 하도록 한다. for (int i = 0; i < m_pInventory->getHeight(); i++) { for (int j = 0; j < m_pInventory->getWidth(); j++) { Item* pItem = m_pInventory->getItem(j, 0); @@ -252,7 +252,7 @@ void Belt::makePCItemInfo(PCItemInfo& result) const { BYTE SubItemCount = 0; - // ڸŭ о δ. + // 포켓의 숫자만큼 아이템의 정보를 읽어 들인다. for (int i = 0; i < getPocketCount(); i++) { Item* pBeltItem = getInventory()->getItem(i, 0); if (pBeltItem != NULL) { @@ -539,7 +539,7 @@ void BeltLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -666,7 +666,7 @@ void BeltLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Belt.h b/src/server/gameserver/item/Belt.h index b51f4a93..f79840a6 100644 --- a/src/server/gameserver/item/Belt.h +++ b/src/server/gameserver/item/Belt.h @@ -83,13 +83,13 @@ class Belt : public ConcreteItem m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // - Inventory* m_pInventory; // κ丮 + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 + Inventory* m_pInventory; // 인벤토리 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -141,11 +141,11 @@ class BeltInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - uint m_PocketCount; // + Durability_t m_Durability; // 내구성 + uint m_PocketCount; // 포켓의 개수 Defense_t m_DefenseBonus; // defense bonus Protection_t m_ProtectionBonus; // protection bonus - uint m_ItemLevel; // + uint m_ItemLevel; // 아이템의 레벨 }; diff --git a/src/server/gameserver/item/Blade.cpp b/src/server/gameserver/item/Blade.cpp index 285cd3cc..7d2cf7ad 100644 --- a/src/server/gameserver/item/Blade.cpp +++ b/src/server/gameserver/item/Blade.cpp @@ -441,7 +441,7 @@ void BladeLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -568,7 +568,7 @@ void BladeLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Blade.h b/src/server/gameserver/item/Blade.h index 3e791813..ee01a8c1 100644 --- a/src/server/gameserver/item/Blade.h +++ b/src/server/gameserver/item/Blade.h @@ -86,8 +86,8 @@ class Blade // Durability_t m_Durability; // BYTE m_BonusDamage; // Silver_t m_Silver; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -171,7 +171,7 @@ class BladeInfo : public ItemInfo { Silver_t m_MaxSilver; Speed_t m_Speed; uint m_ItemLevel; - int m_CriticalBonus; // ۸ ٸ ũƼ Ȯ + int m_CriticalBonus; // 아이템마다 다른 크리티컬 확률 }; diff --git a/src/server/gameserver/item/BloodBible.cpp b/src/server/gameserver/item/BloodBible.cpp index 7a4adf82..9319058c 100644 --- a/src/server/gameserver/item/BloodBible.cpp +++ b/src/server/gameserver/item/BloodBible.cpp @@ -346,9 +346,9 @@ void BloodBibleLoader::load(Creature* pCreature) Result* pResult = pStmt->executeQueryString(sql.toString()); */ - // BloodBible loadҰ ִٴ°.. - // μ ٿ Ǿٴ ǹ̴. - // ׷, . by sigi + // BloodBible load할게 있다는것은.. + // 현재로서는 이전에 서버다운이 되었다는 의미이다. + // 그래서, 지운다. by sigi pStmt->executeQuery("DELETE FROM BloodBibleObject WHERE OwnerID = '%s'", pCreature->getName().c_str()); /* @@ -401,7 +401,7 @@ void BloodBibleLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } - else throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + else throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch(storage) { @@ -523,7 +523,7 @@ void BloodBibleLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/BloodBible.h b/src/server/gameserver/item/BloodBible.h index 1df2173a..b568e4b2 100644 --- a/src/server/gameserver/item/BloodBible.h +++ b/src/server/gameserver/item/BloodBible.h @@ -73,12 +73,12 @@ class BloodBible : public Item { } private: - ItemType_t m_ItemType; // Ÿ - Durability_t m_Durability; // + ItemType_t m_ItemType; // 아이템 타입 + Durability_t m_Durability; // 내구성 EnchantLevel_t m_EnchantLevel; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// @@ -121,8 +121,8 @@ class BloodBibleInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/Bomb.cpp b/src/server/gameserver/item/Bomb.cpp index e5fe2350..17b76459 100644 --- a/src/server/gameserver/item/Bomb.cpp +++ b/src/server/gameserver/item/Bomb.cpp @@ -369,7 +369,7 @@ void BombLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -476,7 +476,7 @@ void BombLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Bomb.h b/src/server/gameserver/item/Bomb.h index c5850fbe..5530d38a 100644 --- a/src/server/gameserver/item/Bomb.h +++ b/src/server/gameserver/item/Bomb.h @@ -79,13 +79,13 @@ class Bomb : public Item { } private: - ItemType_t m_ItemType; // Ÿ + ItemType_t m_ItemType; // 아이템 타입 Damage_t m_Damage; ItemNum_t m_Num; // Dir_t m_Dir; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -115,8 +115,8 @@ class BombInfo : public ItemInfo { } private: - Damage_t m_MinDamage; // ּ - Damage_t m_MaxDamage; // ִ + Damage_t m_MinDamage; // 최소 데미지 + Damage_t m_MaxDamage; // 최대 데미지 }; diff --git a/src/server/gameserver/item/BombMaterial.cpp b/src/server/gameserver/item/BombMaterial.cpp index 1273d5b0..5ff0bf25 100644 --- a/src/server/gameserver/item/BombMaterial.cpp +++ b/src/server/gameserver/item/BombMaterial.cpp @@ -347,7 +347,7 @@ void BombMaterialLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -454,7 +454,7 @@ void BombMaterialLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/BombMaterial.h b/src/server/gameserver/item/BombMaterial.h index 2a5a0116..a99140cd 100644 --- a/src/server/gameserver/item/BombMaterial.h +++ b/src/server/gameserver/item/BombMaterial.h @@ -66,11 +66,11 @@ class BombMaterial : public Item { } private: - ItemType_t m_ItemType; // Ÿ + ItemType_t m_ItemType; // 아이템 타입 ItemNum_t m_Num; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; diff --git a/src/server/gameserver/item/Bracelet.cpp b/src/server/gameserver/item/Bracelet.cpp index 8abc0887..406b0fba 100644 --- a/src/server/gameserver/item/Bracelet.cpp +++ b/src/server/gameserver/item/Bracelet.cpp @@ -415,7 +415,7 @@ void BraceletLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -540,7 +540,7 @@ void BraceletLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Bracelet.h b/src/server/gameserver/item/Bracelet.h index 392051d2..ae240788 100644 --- a/src/server/gameserver/item/Bracelet.h +++ b/src/server/gameserver/item/Bracelet.h @@ -74,8 +74,8 @@ class Bracelet // list m_OptionType; // Durability_t m_Durability; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; diff --git a/src/server/gameserver/item/CarryingReceiver.cpp b/src/server/gameserver/item/CarryingReceiver.cpp index c7efff7f..c744e762 100644 --- a/src/server/gameserver/item/CarryingReceiver.cpp +++ b/src/server/gameserver/item/CarryingReceiver.cpp @@ -308,7 +308,7 @@ void CarryingReceiverLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: diff --git a/src/server/gameserver/item/CarryingReceiver.h b/src/server/gameserver/item/CarryingReceiver.h index 18792d61..96ac693e 100644 --- a/src/server/gameserver/item/CarryingReceiver.h +++ b/src/server/gameserver/item/CarryingReceiver.h @@ -39,8 +39,8 @@ class CarryingReceiver : public ConcreteItemexecuteQueryString(sql.toString()); */ - // CastleSymbol loadҰ ִٴ°.. - // μ ٿ Ǿٴ ǹ̴. - // ׷, . by sigi + // CastleSymbol load할게 있다는것은.. + // 현재로서는 이전에 서버다운이 되었다는 의미이다. + // 그래서, 지운다. by sigi pStmt->executeQuery("DELETE FROM CastleSymbolObject WHERE OwnerID = '%s'", pCreature->getName().c_str()); /* @@ -402,7 +402,7 @@ void CastleSymbolLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } - else throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + else throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch(storage) { @@ -524,7 +524,7 @@ void CastleSymbolLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/CastleSymbol.h b/src/server/gameserver/item/CastleSymbol.h index a6139c5f..1ad6b725 100644 --- a/src/server/gameserver/item/CastleSymbol.h +++ b/src/server/gameserver/item/CastleSymbol.h @@ -73,12 +73,12 @@ class CastleSymbol : public Item { } private: - ItemType_t m_ItemType; // Ÿ - Durability_t m_Durability; // + ItemType_t m_ItemType; // 아이템 타입 + Durability_t m_Durability; // 내구성 EnchantLevel_t m_EnchantLevel; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// @@ -121,8 +121,8 @@ class CastleSymbolInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/Coat.cpp b/src/server/gameserver/item/Coat.cpp index 739dbef9..6f6903f6 100644 --- a/src/server/gameserver/item/Coat.cpp +++ b/src/server/gameserver/item/Coat.cpp @@ -412,7 +412,7 @@ void CoatLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -537,7 +537,7 @@ void CoatLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Coat.h b/src/server/gameserver/item/Coat.h index 33dc4ca5..2737a299 100644 --- a/src/server/gameserver/item/Coat.h +++ b/src/server/gameserver/item/Coat.h @@ -73,8 +73,8 @@ class Coat : public ConcreteItem m_OptionType; // Durability_t m_Durability; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; diff --git a/src/server/gameserver/item/CodeSheet.cpp b/src/server/gameserver/item/CodeSheet.cpp index 68597d04..15f652a5 100644 --- a/src/server/gameserver/item/CodeSheet.cpp +++ b/src/server/gameserver/item/CodeSheet.cpp @@ -19,7 +19,7 @@ #include "Vampire.h" void setStoneNum(vector& OptionType, CoordInven_t x, CoordInven_t y, - uint Num); // CGAddItemToCodeSheetHandler.cpp ǵǾִµ. ɶ + uint Num); // CGAddItemToCodeSheetHandler.cpp 에 정의되어있는데. 될라나 // global variable declaration CodeSheetInfoManager* g_pCodeSheetInfoManager = NULL; @@ -386,7 +386,7 @@ void CodeSheetLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -499,7 +499,7 @@ void CodeSheetLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/CodeSheet.h b/src/server/gameserver/item/CodeSheet.h index 6c7695e6..ad74e351 100644 --- a/src/server/gameserver/item/CodeSheet.h +++ b/src/server/gameserver/item/CodeSheet.h @@ -95,11 +95,11 @@ class CodeSheet : public Item { virtual Weight_t getWeight() const; private: - ItemType_t m_ItemType; // Ÿ - list m_OptionType; // ɼ Ÿ + ItemType_t m_ItemType; // 아이템 타입 + list m_OptionType; // 옵션 타입 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; diff --git a/src/server/gameserver/item/ComposMei.cpp b/src/server/gameserver/item/ComposMei.cpp index 96840978..8801c38b 100644 --- a/src/server/gameserver/item/ComposMei.cpp +++ b/src/server/gameserver/item/ComposMei.cpp @@ -87,7 +87,7 @@ void ComposMei::create(const string& ownerID, Storage storage, StorageID_t stora pStmt->executeQueryString(sql.toString()); */ - // StringStream. by sigi. 2002.5.13 + // StringStream제거. by sigi. 2002.5.13 pStmt->executeQuery("INSERT INTO ComposMeiObject (ItemID, ObjectID, ItemType, OwnerID, Storage, StorageID, X, " "Y, Num) VALUES(%ld, %ld, %d, '%s', %d, %ld, %d, %d, %d)", m_ItemID, m_ObjectID, getItemType(), ownerID.c_str(), (int)storage, storageID, x, y, @@ -511,7 +511,7 @@ void ComposMeiLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -661,7 +661,7 @@ void ComposMeiLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/ComposMei.h b/src/server/gameserver/item/ComposMei.h index 0e37ed5b..e69d1e93 100644 --- a/src/server/gameserver/item/ComposMei.h +++ b/src/server/gameserver/item/ComposMei.h @@ -57,7 +57,7 @@ class ComposMei : public ConcreteItemgetInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -531,7 +531,7 @@ void CoreZapLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/CoreZap.h b/src/server/gameserver/item/CoreZap.h index 14c5cea9..84281736 100644 --- a/src/server/gameserver/item/CoreZap.h +++ b/src/server/gameserver/item/CoreZap.h @@ -40,8 +40,8 @@ class CoreZap : public ConcreteItemgetAffectedRowCount() + // UPDATE인 경우는 Result* 대신에.. pStmt->getAffectedRowCount() if (pResult->next()) { int count = pResult->getInt(1); - // ! + // 위험! Assert(count >= 0); Assert(count <= 1); @@ -349,7 +349,7 @@ void CoupleRingLoader::load(Creature* pCreature) pCoupleRing->setName(pResult->getString(++i)); pCoupleRing->setPartnerItemID(pResult->getDWORD(++i)); - // Ʈ ų ̻ Ŀ ƴϸ ش. + // 파트너 아이템이 없거나 더 이상 커플이 아니면 아이템을 지워준다. if (pPC != NULL && (!g_pCoupleManager->isCouple(pPC, pCoupleRing->getName()) || !pCoupleRing->hasPartnerItem())) { g_pCoupleManager->removeCoupleForce(pPC, pCoupleRing->getName()); @@ -359,7 +359,7 @@ void CoupleRingLoader::load(Creature* pCreature) pCoupleRing->tinysave(sql); SAFE_DELETE(pCoupleRing); - // FlagSet ش. + // FlagSet 도 날려준다. pPC->getFlagSet()->turnOff(FLAGSET_IS_COUPLE); pPC->getFlagSet()->save(pPC->getName()); continue; @@ -388,7 +388,7 @@ void CoupleRingLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -468,7 +468,7 @@ void CoupleRingLoader::load(Zone* pZone) { __BEGIN_TRY - cout << " ε ʽϴ." << endl; + cout << "존에 떨어진 아이템 로드는 지원하지 않습니다." << endl; Assert(false); Assert(pZone != NULL); @@ -508,7 +508,7 @@ void CoupleRingLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/CoupleRing.h b/src/server/gameserver/item/CoupleRing.h index 838f006a..0a4f3c5d 100644 --- a/src/server/gameserver/item/CoupleRing.h +++ b/src/server/gameserver/item/CoupleRing.h @@ -107,8 +107,8 @@ class CoupleRing : public CoupleRingBase { ItemType_t m_ItemType; list m_OptionType; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/item/Cross.cpp b/src/server/gameserver/item/Cross.cpp index 98b28f59..4a4c11b4 100644 --- a/src/server/gameserver/item/Cross.cpp +++ b/src/server/gameserver/item/Cross.cpp @@ -454,7 +454,7 @@ void CrossLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -580,7 +580,7 @@ void CrossLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Cross.h b/src/server/gameserver/item/Cross.h index a19ca320..59b6bd2f 100644 --- a/src/server/gameserver/item/Cross.h +++ b/src/server/gameserver/item/Cross.h @@ -88,8 +88,8 @@ class Cross // BYTE m_BonusDamage; // Silver_t m_Silver; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -169,7 +169,7 @@ class CrossInfo : public ItemInfo { Silver_t m_MaxSilver; Speed_t m_Speed; uint m_ItemLevel; - int m_CriticalBonus; // ۸ ٸ ũƼ Ȯ + int m_CriticalBonus; // 아이템마다 다른 크리티컬 확률 }; diff --git a/src/server/gameserver/item/Dermis.cpp b/src/server/gameserver/item/Dermis.cpp index 4e17764c..d4a1cb05 100644 --- a/src/server/gameserver/item/Dermis.cpp +++ b/src/server/gameserver/item/Dermis.cpp @@ -304,7 +304,7 @@ void DermisLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: diff --git a/src/server/gameserver/item/Dermis.h b/src/server/gameserver/item/Dermis.h index 2e76e590..bbcc5271 100644 --- a/src/server/gameserver/item/Dermis.h +++ b/src/server/gameserver/item/Dermis.h @@ -39,8 +39,8 @@ class Dermis static void initItemIDRegistry(void); private: - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -78,7 +78,7 @@ class DermisInfo : public ItemInfo { virtual string toString() const; private: - Defense_t m_DefenseBonus; // ߷ ʽ + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/DyePotion.cpp b/src/server/gameserver/item/DyePotion.cpp index 60c1b753..c826bce5 100644 --- a/src/server/gameserver/item/DyePotion.cpp +++ b/src/server/gameserver/item/DyePotion.cpp @@ -299,7 +299,7 @@ void DyePotionLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -407,7 +407,7 @@ void DyePotionLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/DyePotion.h b/src/server/gameserver/item/DyePotion.h index 49174331..114784d1 100644 --- a/src/server/gameserver/item/DyePotion.h +++ b/src/server/gameserver/item/DyePotion.h @@ -59,8 +59,8 @@ class DyePotion : public ConcreteItemgetInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -448,7 +448,7 @@ void ETCLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/ETC.h b/src/server/gameserver/item/ETC.h index d90acf06..b459d7eb 100644 --- a/src/server/gameserver/item/ETC.h +++ b/src/server/gameserver/item/ETC.h @@ -68,10 +68,10 @@ class ETC : public Item { private: ItemType_t m_ItemType; - ItemNum_t m_Num; // ִ + ItemNum_t m_Num; // 겹쳐있는 포션의 갯수 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; diff --git a/src/server/gameserver/item/EffectItem.cpp b/src/server/gameserver/item/EffectItem.cpp index cc9b9bf7..0a47df0b 100644 --- a/src/server/gameserver/item/EffectItem.cpp +++ b/src/server/gameserver/item/EffectItem.cpp @@ -328,7 +328,7 @@ void EffectItemLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -436,7 +436,7 @@ void EffectItemLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/EffectItem.h b/src/server/gameserver/item/EffectItem.h index 67864f74..dc967ef0 100644 --- a/src/server/gameserver/item/EffectItem.h +++ b/src/server/gameserver/item/EffectItem.h @@ -59,8 +59,8 @@ class EffectItem : public ConcreteItemgetInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -421,7 +421,7 @@ void EventBallLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/EventBall.h b/src/server/gameserver/item/EventBall.h index 12e9d81f..53e88f55 100644 --- a/src/server/gameserver/item/EventBall.h +++ b/src/server/gameserver/item/EventBall.h @@ -70,8 +70,8 @@ class EventBall : public Item { ItemType_t m_ItemType; ItemNum_t m_Num; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/item/EventETC.cpp b/src/server/gameserver/item/EventETC.cpp index 6fdc9749..1a6b07ee 100644 --- a/src/server/gameserver/item/EventETC.cpp +++ b/src/server/gameserver/item/EventETC.cpp @@ -329,7 +329,7 @@ void EventETCLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -478,7 +478,7 @@ void EventETCLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/EventETC.h b/src/server/gameserver/item/EventETC.h index 6bfa8443..047221fc 100644 --- a/src/server/gameserver/item/EventETC.h +++ b/src/server/gameserver/item/EventETC.h @@ -70,8 +70,8 @@ class EventETC : public Item { ItemType_t m_ItemType; ItemNum_t m_Num; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// @@ -83,9 +83,9 @@ class EventETCInfo : public ItemInfo { /* enum ITEM_FUNCTION { FUNCTION_NULL = 0, - FUNCTION_ENCHANT_OPTION = 0x01, // ɼ ٲ۴. - FUNCTION_ADD_OPTION = 0x02, // ɼ ߰Ѵ. - FUNCTION_ENCHANT_RARE_OPTION = 0x04, // ɼ ~Ѵ. + FUNCTION_ENCHANT_OPTION = 0x01, // 옵션을 더 좋게 바꾼다. + FUNCTION_ADD_OPTION = 0x02, // 옵션을 추가한다. + FUNCTION_ENCHANT_RARE_OPTION = 0x04, // 레어 아이템의 옵션을 업~한다. };*/ public: diff --git a/src/server/gameserver/item/EventGiftBox.cpp b/src/server/gameserver/item/EventGiftBox.cpp index 4d5b5b6d..e390b52e 100644 --- a/src/server/gameserver/item/EventGiftBox.cpp +++ b/src/server/gameserver/item/EventGiftBox.cpp @@ -312,7 +312,7 @@ void EventGiftBoxLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -417,7 +417,7 @@ void EventGiftBoxLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/EventGiftBox.h b/src/server/gameserver/item/EventGiftBox.h index 60cebb39..5734f217 100644 --- a/src/server/gameserver/item/EventGiftBox.h +++ b/src/server/gameserver/item/EventGiftBox.h @@ -56,8 +56,8 @@ class EventGiftBox : public Item { private: ItemType_t m_ItemType; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/item/EventItem.cpp b/src/server/gameserver/item/EventItem.cpp index bc2ff6a2..76c1f4d3 100644 --- a/src/server/gameserver/item/EventItem.cpp +++ b/src/server/gameserver/item/EventItem.cpp @@ -328,12 +328,12 @@ void EventItemLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); PlayerCreature* pPC = dynamic_cast(pCreature); if (pEventItem->getItemType() == 27) { - // ȴ. -_- + // 깃발은 나오면 안 된다. -_- processItemBug(pCreature, pEventItem); } else switch (storage) { @@ -449,7 +449,7 @@ void EventItemLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/EventItem.h b/src/server/gameserver/item/EventItem.h index 642dd5dd..5f93c9db 100644 --- a/src/server/gameserver/item/EventItem.h +++ b/src/server/gameserver/item/EventItem.h @@ -67,8 +67,8 @@ class EventItem : public Item { ItemType_t m_ItemType; ItemNum_t m_Num; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/item/EventStar.cpp b/src/server/gameserver/item/EventStar.cpp index a3266dee..a0f4cf61 100644 --- a/src/server/gameserver/item/EventStar.cpp +++ b/src/server/gameserver/item/EventStar.cpp @@ -328,7 +328,7 @@ void EventStarLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -436,7 +436,7 @@ void EventStarLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/EventStar.h b/src/server/gameserver/item/EventStar.h index 8009e93f..5e24b760 100644 --- a/src/server/gameserver/item/EventStar.h +++ b/src/server/gameserver/item/EventStar.h @@ -70,8 +70,8 @@ class EventStar : public Item { ItemType_t m_ItemType; ItemNum_t m_Num; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// @@ -82,11 +82,11 @@ class EventStarInfo : public ItemInfo { public: enum ITEM_FUNCTION { FUNCTION_NULL = 0, - FUNCTION_ENCHANT_OPTION = 0x01, // ɼ ٲ۴. - FUNCTION_ADD_OPTION = 0x02, // ɼ ߰Ѵ. - FUNCTION_ENCHANT_RARE_OPTION = 0x04, // ɼ ~Ѵ. - FUNCTION_TRANS_KIT = 0x08, // ٲ۴. - FUNCTION_UP_GRADE = 0x10, // ޼ ø. + FUNCTION_ENCHANT_OPTION = 0x01, // 옵션을 더 좋게 바꾼다. + FUNCTION_ADD_OPTION = 0x02, // 옵션을 추가한다. + FUNCTION_ENCHANT_RARE_OPTION = 0x04, // 레어 아이템의 옵션을 업~한다. + FUNCTION_TRANS_KIT = 0x08, // 아템 성별을 바꾼다. + FUNCTION_UP_GRADE = 0x10, // 아이템 급수를 올린다. }; public: @@ -101,13 +101,13 @@ class EventStarInfo : public ItemInfo { } virtual BYTE isFunctionEnchantOption() const { return m_fFunction & FUNCTION_ENCHANT_OPTION; - } // ɼ ٲ۴. + } // 옵션을 더 좋게 바꾼다. virtual BYTE isFunctionAddOption() const { return m_fFunction & FUNCTION_ADD_OPTION; - } // ɼ ߰Ѵ. + } // 옵션을 추가한다. virtual BYTE isFunctionEnchantRareOption() const { return m_fFunction & FUNCTION_ENCHANT_RARE_OPTION; - } // ɼ ٲ۴. + } // 옵션을 더 좋게 바꾼다. virtual BYTE isFunctionTransKit() const { return m_fFunction & FUNCTION_TRANS_KIT; } @@ -123,8 +123,8 @@ class EventStarInfo : public ItemInfo { } - BYTE m_fFunction; // - int m_FunctionValue; // ɰ õ + BYTE m_fFunction; // 기능 + int m_FunctionValue; // 기능과 관련된 값 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/item/EventTree.cpp b/src/server/gameserver/item/EventTree.cpp index 19e6a617..978d7edb 100644 --- a/src/server/gameserver/item/EventTree.cpp +++ b/src/server/gameserver/item/EventTree.cpp @@ -327,7 +327,7 @@ void EventTreeLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -435,7 +435,7 @@ void EventTreeLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/EventTree.h b/src/server/gameserver/item/EventTree.h index efe4b994..30c399c4 100644 --- a/src/server/gameserver/item/EventTree.h +++ b/src/server/gameserver/item/EventTree.h @@ -66,8 +66,8 @@ class EventTree : public Item { ItemType_t m_ItemType; ItemNum_t m_Num; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// @@ -78,9 +78,9 @@ class EventTreeInfo : public ItemInfo { public: enum ITEM_FUNCTION { FUNCTION_NULL = 0, - FUNCTION_ENCHANT_OPTION = 0x01, // ɼ ٲ۴. - FUNCTION_ADD_OPTION = 0x02, // ɼ ߰Ѵ. - FUNCTION_ENCHANT_RARE_OPTION = 0x04, // ɼ ~Ѵ. + FUNCTION_ENCHANT_OPTION = 0x01, // 옵션을 더 좋게 바꾼다. + FUNCTION_ADD_OPTION = 0x02, // 옵션을 추가한다. + FUNCTION_ENCHANT_RARE_OPTION = 0x04, // 레어 아이템의 옵션을 업~한다. }; public: diff --git a/src/server/gameserver/item/Fascia.cpp b/src/server/gameserver/item/Fascia.cpp index 679073fe..50c1acf2 100644 --- a/src/server/gameserver/item/Fascia.cpp +++ b/src/server/gameserver/item/Fascia.cpp @@ -308,7 +308,7 @@ void FasciaLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: diff --git a/src/server/gameserver/item/Fascia.h b/src/server/gameserver/item/Fascia.h index 1e953324..0398cf7b 100644 --- a/src/server/gameserver/item/Fascia.h +++ b/src/server/gameserver/item/Fascia.h @@ -39,8 +39,8 @@ class Fascia static void initItemIDRegistry(void); private: - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; diff --git a/src/server/gameserver/item/Glove.cpp b/src/server/gameserver/item/Glove.cpp index c2722129..53e6ca9f 100644 --- a/src/server/gameserver/item/Glove.cpp +++ b/src/server/gameserver/item/Glove.cpp @@ -413,7 +413,7 @@ void GloveLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -538,7 +538,7 @@ void GloveLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Glove.h b/src/server/gameserver/item/Glove.h index 9f3d82b6..10b45c78 100644 --- a/src/server/gameserver/item/Glove.h +++ b/src/server/gameserver/item/Glove.h @@ -80,12 +80,12 @@ class Glove */ private: - // ItemType_t m_ItemType; // Ÿ - // list m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// @@ -133,8 +133,8 @@ class GloveInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/Helm.cpp b/src/server/gameserver/item/Helm.cpp index a2c9850a..f1550cfb 100644 --- a/src/server/gameserver/item/Helm.cpp +++ b/src/server/gameserver/item/Helm.cpp @@ -414,7 +414,7 @@ void HelmLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -540,7 +540,7 @@ void HelmLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Helm.h b/src/server/gameserver/item/Helm.h index a8518022..a330155e 100644 --- a/src/server/gameserver/item/Helm.h +++ b/src/server/gameserver/item/Helm.h @@ -72,12 +72,12 @@ class Helm : public ConcreteItem m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -122,8 +122,8 @@ class HelmInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/HolyWater.cpp b/src/server/gameserver/item/HolyWater.cpp index 1cd5b6a7..19c0197b 100644 --- a/src/server/gameserver/item/HolyWater.cpp +++ b/src/server/gameserver/item/HolyWater.cpp @@ -375,7 +375,7 @@ void HolyWaterLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -484,7 +484,7 @@ void HolyWaterLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/HolyWater.h b/src/server/gameserver/item/HolyWater.h index 6d807c1a..3f093a66 100644 --- a/src/server/gameserver/item/HolyWater.h +++ b/src/server/gameserver/item/HolyWater.h @@ -70,11 +70,11 @@ class HolyWater : public Item { } private: - ItemType_t m_ItemType; // Ÿ + ItemType_t m_ItemType; // 아이템 타입 ItemNum_t m_Num; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// @@ -103,8 +103,8 @@ class HolyWaterInfo : public ItemInfo { } private: - Damage_t m_MinDamage; // ּ - Damage_t m_MaxDamage; // ִ + Damage_t m_MinDamage; // 최소 데미지 + Damage_t m_MaxDamage; // 최대 데미지 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/item/ItemIDRegistry.cpp b/src/server/gameserver/item/ItemIDRegistry.cpp index 38f75673..674e4519 100644 --- a/src/server/gameserver/item/ItemIDRegistry.cpp +++ b/src/server/gameserver/item/ItemIDRegistry.cpp @@ -2,8 +2,8 @@ // Filename : ItemIDRegistry.cpp // Written by : excel96 // Description : -// Ͽ initItemIDRegistry Լ -// س ̴. +// 각 아이템 구현 파일에서 initItemIDRegistry 멤버 함수만을 빼서 +// 구현해놓은 파일이다. ////////////////////////////////////////////////////////////////////////////// #include "AR.h" diff --git a/src/server/gameserver/item/Key.cpp b/src/server/gameserver/item/Key.cpp index 072a9da8..87115ea4 100644 --- a/src/server/gameserver/item/Key.cpp +++ b/src/server/gameserver/item/Key.cpp @@ -149,7 +149,7 @@ ItemID_t Key::setNewMotorcycle(Slayer* pSlayer) { ItemID_t targetID = 0; - // Ÿ 0 ƴ϶ Ÿ ͻŬ ־ ȴ. + // 타겟이 0이 아니라도 타겟이 없으면 새 모터사이클을 넣어야 된다. // Assert( getTarget() == 0 ); Assert(pSlayer != NULL); Zone* pZone = pSlayer->getZone(); @@ -176,7 +176,7 @@ ItemID_t Key::setNewMotorcycle(Slayer* pSlayer) { Statement* pStmt = NULL; Result* pResult = NULL; - // targetID DB updateѾ Ѵ. + // targetID를 DB에도 update시켜야 한다. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pResult = pStmt->executeQuery("UPDATE KeyObject SET Target=%lu WHERE ItemID=%lu", targetID, getItemID()); @@ -189,7 +189,7 @@ ItemID_t Key::setNewMotorcycle(Slayer* pSlayer) { filelog("motorcycle.txt", "[SetTargetID] Owner = %s, KeyID = %lu, Key's targetID = %lu, MotorcycleID = %lu", pSlayer->getName().c_str(), getItemID(), getTarget(), pMotorcycle->getItemID()); - // ؿ pMotorcycle ص ǰ, ڵ ǵ帱 ⼭ . + // 밑에서 pMotorcycle을 사용해도 되겠지만, 기존 코드 안 건드릴려고 여기서 지운다. SAFE_DELETE(pMotorcycle); return targetID; @@ -398,7 +398,7 @@ void KeyLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -521,7 +521,7 @@ void KeyLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Key.h b/src/server/gameserver/item/Key.h index b390b77c..48ea9934 100644 --- a/src/server/gameserver/item/Key.h +++ b/src/server/gameserver/item/Key.h @@ -67,11 +67,11 @@ class Key : public Item { ItemID_t setNewMotorcycle(Slayer* pSlayer); private: - ItemType_t m_ItemType; // Ÿ - ItemID_t m_Target; // ΰ? + ItemType_t m_ItemType; // 아이템 타입 + ItemID_t m_Target; // 무엇을 열 것인가? - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; diff --git a/src/server/gameserver/item/Larva.cpp b/src/server/gameserver/item/Larva.cpp index 73be2340..df357a2d 100644 --- a/src/server/gameserver/item/Larva.cpp +++ b/src/server/gameserver/item/Larva.cpp @@ -80,7 +80,7 @@ void Larva::create(const string& ownerID, Storage storage, StorageID_t storageID pStmt->executeQueryString(sql.toString()); */ - // StringStream. by sigi. 2002.5.13 + // StringStream제거. by sigi. 2002.5.13 pStmt->executeQuery("INSERT INTO LarvaObject (ItemID, ObjectID, ItemType, OwnerID, Storage, StorageID, X, Y, " "Num) VALUES(%ld, %ld, %d, '%s', %d, %ld, %d, %d, %d)", m_ItemID, m_ObjectID, m_ItemType, ownerID.c_str(), (int)storage, storageID, x, y, @@ -501,7 +501,7 @@ void LarvaLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -651,7 +651,7 @@ void LarvaLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Larva.h b/src/server/gameserver/item/Larva.h index 30b97758..f69d6992 100644 --- a/src/server/gameserver/item/Larva.h +++ b/src/server/gameserver/item/Larva.h @@ -69,7 +69,7 @@ class Larva : public Item { return true; } - // ȸ + // 회복양 int getHPAmount(void) const; int getMPAmount(void) const; @@ -83,11 +83,11 @@ class Larva : public Item { int getMPRecoveryUnit(void) const; private: - ItemType_t m_ItemType; // Ÿ - ItemNum_t m_Num; // ִ + ItemType_t m_ItemType; // 아이템 타입 + ItemNum_t m_Num; // 겹쳐있는 포션의 갯수 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; diff --git a/src/server/gameserver/item/LearningItem.cpp b/src/server/gameserver/item/LearningItem.cpp index feba9b84..5ee947c4 100644 --- a/src/server/gameserver/item/LearningItem.cpp +++ b/src/server/gameserver/item/LearningItem.cpp @@ -341,7 +341,7 @@ void LearningItemLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -448,7 +448,7 @@ void LearningItemLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/LearningItem.h b/src/server/gameserver/item/LearningItem.h index 0794735d..f1a06092 100644 --- a/src/server/gameserver/item/LearningItem.h +++ b/src/server/gameserver/item/LearningItem.h @@ -55,10 +55,10 @@ class LearningItem : public Item { virtual Weight_t getWeight() const; private: - ItemType_t m_ItemType; // Ÿ + ItemType_t m_ItemType; // 아이템 타입 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; diff --git a/src/server/gameserver/item/LuckyBag.cpp b/src/server/gameserver/item/LuckyBag.cpp index 73686847..86229805 100644 --- a/src/server/gameserver/item/LuckyBag.cpp +++ b/src/server/gameserver/item/LuckyBag.cpp @@ -323,7 +323,7 @@ void LuckyBagLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -431,7 +431,7 @@ void LuckyBagLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/LuckyBag.h b/src/server/gameserver/item/LuckyBag.h index bd297eb7..7d15775d 100644 --- a/src/server/gameserver/item/LuckyBag.h +++ b/src/server/gameserver/item/LuckyBag.h @@ -70,8 +70,8 @@ class LuckyBag : public Item { ItemType_t m_ItemType; ItemNum_t m_Num; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/item/Mace.cpp b/src/server/gameserver/item/Mace.cpp index f513be25..abe6691e 100644 --- a/src/server/gameserver/item/Mace.cpp +++ b/src/server/gameserver/item/Mace.cpp @@ -452,7 +452,7 @@ void MaceLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -578,7 +578,7 @@ void MaceLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Mace.h b/src/server/gameserver/item/Mace.h index f64eac7b..091636a7 100644 --- a/src/server/gameserver/item/Mace.h +++ b/src/server/gameserver/item/Mace.h @@ -88,8 +88,8 @@ class Mace : public ConcreteItemgetInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -491,7 +491,7 @@ void MagazineLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Magazine.h b/src/server/gameserver/item/Magazine.h index 0a14e1c8..2d01d0e6 100644 --- a/src/server/gameserver/item/Magazine.h +++ b/src/server/gameserver/item/Magazine.h @@ -66,11 +66,11 @@ class Magazine : public Item { } private: - ItemType_t m_ItemType; // Ÿ - ItemNum_t m_Num; // ִ źâ + ItemType_t m_ItemType; // 아이템 타입 + ItemNum_t m_Num; // 겹쳐있는 탄창의 수 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; diff --git a/src/server/gameserver/item/Mine.cpp b/src/server/gameserver/item/Mine.cpp index a1816dfe..2240e5a5 100644 --- a/src/server/gameserver/item/Mine.cpp +++ b/src/server/gameserver/item/Mine.cpp @@ -372,7 +372,7 @@ void MineLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -479,7 +479,7 @@ void MineLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Mine.h b/src/server/gameserver/item/Mine.h index dfb09305..3391a3fe 100644 --- a/src/server/gameserver/item/Mine.h +++ b/src/server/gameserver/item/Mine.h @@ -97,15 +97,15 @@ class Mine : public Item { } private: - ItemType_t m_ItemType; // Ÿ + ItemType_t m_ItemType; // 아이템 타입 Damage_t m_Damage; ItemNum_t m_Num; Dir_t m_Dir; string m_InstallerName; int m_InstallerPartyID; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -135,8 +135,8 @@ class MineInfo : public ItemInfo { } private: - Damage_t m_MinDamage; // ּ - Damage_t m_MaxDamage; // ִ + Damage_t m_MinDamage; // 최소 데미지 + Damage_t m_MaxDamage; // 최대 데미지 }; diff --git a/src/server/gameserver/item/Mitten.cpp b/src/server/gameserver/item/Mitten.cpp index 21453591..475abf93 100644 --- a/src/server/gameserver/item/Mitten.cpp +++ b/src/server/gameserver/item/Mitten.cpp @@ -314,7 +314,7 @@ void MittenLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: diff --git a/src/server/gameserver/item/Mitten.h b/src/server/gameserver/item/Mitten.h index 51c2d53c..23f42fbb 100644 --- a/src/server/gameserver/item/Mitten.h +++ b/src/server/gameserver/item/Mitten.h @@ -39,8 +39,8 @@ class Mitten static void initItemIDRegistry(void); private: - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -85,7 +85,7 @@ class MittenInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // + Durability_t m_Durability; // 내구성 Defense_t m_DefenseBonus; Protection_t m_ProtectionBonus; uint m_ItemLevel; diff --git a/src/server/gameserver/item/MixingItem.cpp b/src/server/gameserver/item/MixingItem.cpp index 941456f1..5921a690 100644 --- a/src/server/gameserver/item/MixingItem.cpp +++ b/src/server/gameserver/item/MixingItem.cpp @@ -328,7 +328,7 @@ void MixingItemLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -436,7 +436,7 @@ void MixingItemLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/MixingItem.h b/src/server/gameserver/item/MixingItem.h index 40c2f5f6..4b856075 100644 --- a/src/server/gameserver/item/MixingItem.h +++ b/src/server/gameserver/item/MixingItem.h @@ -68,10 +68,10 @@ class MixingItem : public Item { public: private: ItemType_t m_ItemType; - ItemNum_t m_Num; // ִ + ItemNum_t m_Num; // 겹쳐있는 포션의 갯수 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/item/Money.cpp b/src/server/gameserver/item/Money.cpp index b6804d6a..a391359b 100644 --- a/src/server/gameserver/item/Money.cpp +++ b/src/server/gameserver/item/Money.cpp @@ -351,7 +351,7 @@ void MoneyLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -460,7 +460,7 @@ void MoneyLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Money.h b/src/server/gameserver/item/Money.h index 832c3df0..75efee16 100644 --- a/src/server/gameserver/item/Money.h +++ b/src/server/gameserver/item/Money.h @@ -86,14 +86,14 @@ class Money : public Item { } private: - ItemType_t m_ItemType; // Ÿ - DWORD m_Amount; // ׼ + ItemType_t m_ItemType; // 아이템 타입 + DWORD m_Amount; // 액수 // add by sonci 2006.10.30 ItemNum_t m_Num; // end - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; diff --git a/src/server/gameserver/item/MoonCard.cpp b/src/server/gameserver/item/MoonCard.cpp index 52691362..cdc51a42 100644 --- a/src/server/gameserver/item/MoonCard.cpp +++ b/src/server/gameserver/item/MoonCard.cpp @@ -323,7 +323,7 @@ void MoonCardLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -431,7 +431,7 @@ void MoonCardLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/MoonCard.h b/src/server/gameserver/item/MoonCard.h index 8054a7c2..e6ae79e2 100644 --- a/src/server/gameserver/item/MoonCard.h +++ b/src/server/gameserver/item/MoonCard.h @@ -70,8 +70,8 @@ class MoonCard : public Item { ItemType_t m_ItemType; ItemNum_t m_Num; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/item/Motorcycle.cpp b/src/server/gameserver/item/Motorcycle.cpp index 4ce46e28..636f631d 100644 --- a/src/server/gameserver/item/Motorcycle.cpp +++ b/src/server/gameserver/item/Motorcycle.cpp @@ -33,7 +33,7 @@ Motorcycle::Motorcycle(ItemType_t itemType, const list& optionType : m_ItemType(itemType), m_OptionType(optionType), m_Durability(0), m_pInventory(NULL) { __BEGIN_TRY - // ͻŬ ŸԿ κ丮 ũⰡ ٸ. + // 모터사이클은 타입에 따라 인벤토리의 크기가 다르다. switch (itemType) { case 0: m_pInventory = new Inventory(10, 6); @@ -383,7 +383,7 @@ void MotorcycleLoader::load(Creature* pCreature) case STORAGE_EXTRASLOT : case STORAGE_MOTORCYCLE: case STORAGE_STASH: - // Ŭ ȿ Ŭ ֳ + // 모터 사이클 안에 모터 사이클을 보관할 수가 있나 Assert(false); pMotorcycle->destroy(); SAFE_DELETE(pMotorcycle); @@ -460,7 +460,7 @@ void MotorcycleLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Motorcycle.h b/src/server/gameserver/item/Motorcycle.h index e3a8ad12..d6dddd2f 100644 --- a/src/server/gameserver/item/Motorcycle.h +++ b/src/server/gameserver/item/Motorcycle.h @@ -108,13 +108,13 @@ class Motorcycle : public Item { } private: - ItemType_t m_ItemType; // Ÿ - list m_OptionType; // ɼ Ÿ - Durability_t m_Durability; // - Inventory* m_pInventory; // κ丮 + ItemType_t m_ItemType; // 아이템 타입 + list m_OptionType; // 옵션 타입 + Durability_t m_Durability; // 내구성 + Inventory* m_pInventory; // 인벤토리 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -138,7 +138,7 @@ class MotorcycleInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // + Durability_t m_Durability; // 내구성 }; diff --git a/src/server/gameserver/item/Necklace.cpp b/src/server/gameserver/item/Necklace.cpp index 1ea1b31a..b388c97d 100644 --- a/src/server/gameserver/item/Necklace.cpp +++ b/src/server/gameserver/item/Necklace.cpp @@ -416,7 +416,7 @@ void NecklaceLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -541,7 +541,7 @@ void NecklaceLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Necklace.h b/src/server/gameserver/item/Necklace.h index 14d39176..fbd72269 100644 --- a/src/server/gameserver/item/Necklace.h +++ b/src/server/gameserver/item/Necklace.h @@ -72,12 +72,12 @@ class Necklace virtual Protection_t getProtectionBonus() const ; */ private: - // ItemType_t m_ItemType; // Ÿ - // list m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -122,8 +122,8 @@ class NecklaceInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/OustersArmsband.cpp b/src/server/gameserver/item/OustersArmsband.cpp index d69abe8a..7f754af3 100644 --- a/src/server/gameserver/item/OustersArmsband.cpp +++ b/src/server/gameserver/item/OustersArmsband.cpp @@ -123,11 +123,11 @@ bool OustersArmsband::destroy() Statement* pStmt; //------------------------------------------------------- - // Ͻ忡 ִ ִٸ ȿ ִ ۵鵵 - // destroy Ѵ. - // Ͻ deleteϸ鼭 - // ϱ ⼭ delete ʱ Ѵ... - // ٸ Ʈ Ѵ. + // 암스밴드에 남아있는 아이템이 있다면 안에 있는 아이템들도 + // destroy 해줘야 한다. + // 암스밴드 같은 경우는 위에서 delete하면서 아이템을 삭제 + // 하기 때문에 여기서는 delete해주지 않기로 한다... + // 쓸모가 없다면 위에서 필히 벨트를 지워야 한다. //------------------------------------------------------- for (int i = 0; i < m_pInventory->getHeight(); i++) { for (int j = 0; j < m_pInventory->getWidth(); j++) { @@ -219,7 +219,7 @@ void OustersArmsband::save(const string& ownerID, Storage storage, StorageID_t s m_ObjectID, getItemType(), ownerID.c_str(), (int)storage, storageID, (int)x, (int)y, optionField.c_str(), getDurability(), getGrade(), (int)getEnchantLevel(), m_ItemID); - // ϳ ٷ UPDATE ϵ Ѵ. + // 일일이 아이템을 하나씩 꺼내서 바로 UPDATE 하도록 한다. for (int i = 0; i < m_pInventory->getHeight(); i++) { for (int j = 0; j < m_pInventory->getWidth(); j++) { Item* pItem = m_pInventory->getItem(j, 0); @@ -241,7 +241,7 @@ void OustersArmsband::makePCItemInfo(PCItemInfo& result) const { BYTE SubItemCount = 0; - // ڸŭ о δ. + // 포켓의 숫자만큼 아이템의 정보를 읽어 들인다. for (int i = 0; i < getPocketCount(); i++) { Item* pOustersArmsbandItem = getInventory()->getItem(i, 0); @@ -535,7 +535,7 @@ void OustersArmsbandLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -661,7 +661,7 @@ void OustersArmsbandLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/OustersArmsband.h b/src/server/gameserver/item/OustersArmsband.h index cecf7c57..cf89b54e 100644 --- a/src/server/gameserver/item/OustersArmsband.h +++ b/src/server/gameserver/item/OustersArmsband.h @@ -84,13 +84,13 @@ class OustersArmsband : public ConcreteItem m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // - Inventory* m_pInventory; // κ丮 + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 + Inventory* m_pInventory; // 인벤토리 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -142,8 +142,8 @@ class OustersArmsbandInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - uint m_PocketCount; // + Durability_t m_Durability; // 내구성 + uint m_PocketCount; // 포켓의 개수 Defense_t m_DefenseBonus; Protection_t m_ProtectionBonus; uint m_ItemLevel; diff --git a/src/server/gameserver/item/OustersBoots.cpp b/src/server/gameserver/item/OustersBoots.cpp index 48dc059a..2737a806 100644 --- a/src/server/gameserver/item/OustersBoots.cpp +++ b/src/server/gameserver/item/OustersBoots.cpp @@ -418,7 +418,7 @@ void OustersBootsLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -544,7 +544,7 @@ void OustersBootsLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/OustersBoots.h b/src/server/gameserver/item/OustersBoots.h index d1adcd71..03ee7e37 100644 --- a/src/server/gameserver/item/OustersBoots.h +++ b/src/server/gameserver/item/OustersBoots.h @@ -71,12 +71,12 @@ class OustersBoots virtual Protection_t getProtectionBonus() const ; */ private: - // ItemType_t m_ItemType; // Ÿ - // list m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -121,8 +121,8 @@ class OustersBootsInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // 潺 ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 디펜스 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/OustersChakram.cpp b/src/server/gameserver/item/OustersChakram.cpp index 49508701..1c988e00 100644 --- a/src/server/gameserver/item/OustersChakram.cpp +++ b/src/server/gameserver/item/OustersChakram.cpp @@ -442,7 +442,7 @@ void OustersChakramLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -570,7 +570,7 @@ void OustersChakramLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/OustersChakram.h b/src/server/gameserver/item/OustersChakram.h index 7b8c5095..3f460f07 100644 --- a/src/server/gameserver/item/OustersChakram.h +++ b/src/server/gameserver/item/OustersChakram.h @@ -81,8 +81,8 @@ class OustersChakram // Durability_t m_Durability; // BYTE m_BonusDamage; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -158,7 +158,7 @@ class OustersChakramInfo : public ItemInfo { // ToHit_t m_ToHitBonus; Speed_t m_Speed; uint m_ItemLevel; - int m_CriticalBonus; // ۸ ٸ ũƼ Ȯ + int m_CriticalBonus; // 아이템마다 다른 크리티컬 확률 }; diff --git a/src/server/gameserver/item/OustersCirclet.cpp b/src/server/gameserver/item/OustersCirclet.cpp index 55c22fd7..55f8f7bd 100644 --- a/src/server/gameserver/item/OustersCirclet.cpp +++ b/src/server/gameserver/item/OustersCirclet.cpp @@ -418,7 +418,7 @@ void OustersCircletLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -544,7 +544,7 @@ void OustersCircletLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/OustersCirclet.h b/src/server/gameserver/item/OustersCirclet.h index 7f0347e5..944cf114 100644 --- a/src/server/gameserver/item/OustersCirclet.h +++ b/src/server/gameserver/item/OustersCirclet.h @@ -71,12 +71,12 @@ class OustersCirclet : public ConcreteItem m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -121,7 +121,7 @@ class OustersCircletInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // + Durability_t m_Durability; // 내구성 Defense_t m_DefenseBonus; Protection_t m_ProtectionBonus; uint m_ItemLevel; diff --git a/src/server/gameserver/item/OustersCoat.cpp b/src/server/gameserver/item/OustersCoat.cpp index a2794c4d..a31e1692 100644 --- a/src/server/gameserver/item/OustersCoat.cpp +++ b/src/server/gameserver/item/OustersCoat.cpp @@ -417,7 +417,7 @@ void OustersCoatLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -543,7 +543,7 @@ void OustersCoatLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/OustersCoat.h b/src/server/gameserver/item/OustersCoat.h index 17e93ce8..07965984 100644 --- a/src/server/gameserver/item/OustersCoat.h +++ b/src/server/gameserver/item/OustersCoat.h @@ -71,12 +71,12 @@ class OustersCoat virtual Protection_t getProtectionBonus() const ; */ private: - // ItemType_t m_ItemType; // Ÿ - // list m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -121,7 +121,7 @@ class OustersCoatInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // + Durability_t m_Durability; // 내구성 Defense_t m_DefenseBonus; Protection_t m_ProtectionBonus; uint m_ItemLevel; diff --git a/src/server/gameserver/item/OustersPendent.cpp b/src/server/gameserver/item/OustersPendent.cpp index 3b1277c3..26a78298 100644 --- a/src/server/gameserver/item/OustersPendent.cpp +++ b/src/server/gameserver/item/OustersPendent.cpp @@ -418,7 +418,7 @@ void OustersPendentLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -544,7 +544,7 @@ void OustersPendentLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/OustersPendent.h b/src/server/gameserver/item/OustersPendent.h index 19d1c24e..eeb2bddc 100644 --- a/src/server/gameserver/item/OustersPendent.h +++ b/src/server/gameserver/item/OustersPendent.h @@ -71,12 +71,12 @@ class OustersPendent : public ConcreteItem m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -121,7 +121,7 @@ class OustersPendentInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // + Durability_t m_Durability; // 내구성 Defense_t m_DefenseBonus; Protection_t m_ProtectionBonus; uint m_ItemLevel; diff --git a/src/server/gameserver/item/OustersRing.cpp b/src/server/gameserver/item/OustersRing.cpp index fd039483..4445c4e4 100644 --- a/src/server/gameserver/item/OustersRing.cpp +++ b/src/server/gameserver/item/OustersRing.cpp @@ -417,7 +417,7 @@ void OustersRingLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -543,7 +543,7 @@ void OustersRingLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/OustersRing.h b/src/server/gameserver/item/OustersRing.h index c302ab56..835e833a 100644 --- a/src/server/gameserver/item/OustersRing.h +++ b/src/server/gameserver/item/OustersRing.h @@ -71,12 +71,12 @@ class OustersRing : public ConcreteItem m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -121,7 +121,7 @@ class OustersRingInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // + Durability_t m_Durability; // 내구성 Defense_t m_DefenseBonus; Protection_t m_ProtectionBonus; uint m_ItemLevel; diff --git a/src/server/gameserver/item/OustersStone.cpp b/src/server/gameserver/item/OustersStone.cpp index b7ed2127..4f6af367 100644 --- a/src/server/gameserver/item/OustersStone.cpp +++ b/src/server/gameserver/item/OustersStone.cpp @@ -448,7 +448,7 @@ void OustersStoneLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -576,7 +576,7 @@ void OustersStoneLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/OustersStone.h b/src/server/gameserver/item/OustersStone.h index 6a3295b3..26675f90 100644 --- a/src/server/gameserver/item/OustersStone.h +++ b/src/server/gameserver/item/OustersStone.h @@ -74,12 +74,12 @@ class OustersStone : public ConcreteItem m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -138,7 +138,7 @@ class OustersStoneInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // + Durability_t m_Durability; // 내구성 Defense_t m_DefenseBonus; Protection_t m_ProtectionBonus; uint m_ItemLevel; diff --git a/src/server/gameserver/item/OustersSummonItem.cpp b/src/server/gameserver/item/OustersSummonItem.cpp index e34d7773..76dfd3a6 100644 --- a/src/server/gameserver/item/OustersSummonItem.cpp +++ b/src/server/gameserver/item/OustersSummonItem.cpp @@ -345,7 +345,7 @@ void OustersSummonItemLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); if (storage == STORAGE_INVENTORY) { if (pInventory->canAddingEx(x, y, pOustersSummonItem)) { diff --git a/src/server/gameserver/item/OustersSummonItem.h b/src/server/gameserver/item/OustersSummonItem.h index 2ea2466c..91fdd3f1 100644 --- a/src/server/gameserver/item/OustersSummonItem.h +++ b/src/server/gameserver/item/OustersSummonItem.h @@ -71,11 +71,11 @@ class OustersSummonItem : public Item { } private: - ItemType_t m_ItemType; // Ÿ - int m_Charge; // Ż ִ Ƚ + ItemType_t m_ItemType; // 아이템 타입 + int m_Charge; // 포탈을 열 수 있는 횟수 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; diff --git a/src/server/gameserver/item/OustersWristlet.cpp b/src/server/gameserver/item/OustersWristlet.cpp index da059cc8..89768a34 100644 --- a/src/server/gameserver/item/OustersWristlet.cpp +++ b/src/server/gameserver/item/OustersWristlet.cpp @@ -473,7 +473,7 @@ void OustersWristletLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -601,7 +601,7 @@ void OustersWristletLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/OustersWristlet.h b/src/server/gameserver/item/OustersWristlet.h index 1d8b691b..8555ec2a 100644 --- a/src/server/gameserver/item/OustersWristlet.h +++ b/src/server/gameserver/item/OustersWristlet.h @@ -83,8 +83,8 @@ class OustersWristlet // Durability_t m_Durability; // BYTE m_BonusDamage; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -174,7 +174,7 @@ class OustersWristletInfo : public ItemInfo { // ToHit_t m_ToHitBonus; Speed_t m_Speed; uint m_ItemLevel; - int m_CriticalBonus; // ۸ ٸ ũƼ Ȯ + int m_CriticalBonus; // 아이템마다 다른 크리티컬 확률 ElementalType m_ElementalType; Elemental_t m_Elemental; diff --git a/src/server/gameserver/item/Persona.cpp b/src/server/gameserver/item/Persona.cpp index 3a430774..e1e2e351 100644 --- a/src/server/gameserver/item/Persona.cpp +++ b/src/server/gameserver/item/Persona.cpp @@ -307,7 +307,7 @@ void PersonaLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: diff --git a/src/server/gameserver/item/Persona.h b/src/server/gameserver/item/Persona.h index 3f30061e..b9e453d5 100644 --- a/src/server/gameserver/item/Persona.h +++ b/src/server/gameserver/item/Persona.h @@ -39,8 +39,8 @@ class Persona static void initItemIDRegistry(void); private: - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -85,8 +85,8 @@ class PersonaInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/PetEnchantItem.cpp b/src/server/gameserver/item/PetEnchantItem.cpp index aaf7c6cf..99bab508 100644 --- a/src/server/gameserver/item/PetEnchantItem.cpp +++ b/src/server/gameserver/item/PetEnchantItem.cpp @@ -327,7 +327,7 @@ void PetEnchantItemLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -435,7 +435,7 @@ void PetEnchantItemLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/PetEnchantItem.h b/src/server/gameserver/item/PetEnchantItem.h index 554b6875..19d532fd 100644 --- a/src/server/gameserver/item/PetEnchantItem.h +++ b/src/server/gameserver/item/PetEnchantItem.h @@ -70,8 +70,8 @@ class PetEnchantItem : public Item { ItemType_t m_ItemType; ItemNum_t m_Num; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/item/PetFood.cpp b/src/server/gameserver/item/PetFood.cpp index 0e043ac6..54b1ff9c 100644 --- a/src/server/gameserver/item/PetFood.cpp +++ b/src/server/gameserver/item/PetFood.cpp @@ -328,7 +328,7 @@ void PetFoodLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -435,7 +435,7 @@ void PetFoodLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/PetFood.h b/src/server/gameserver/item/PetFood.h index 868adae1..40381752 100644 --- a/src/server/gameserver/item/PetFood.h +++ b/src/server/gameserver/item/PetFood.h @@ -70,8 +70,8 @@ class PetFood : public Item { ItemType_t m_ItemType; ItemNum_t m_Num; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/item/PetItem.cpp b/src/server/gameserver/item/PetItem.cpp index fe0ea34b..2d1e922b 100644 --- a/src/server/gameserver/item/PetItem.cpp +++ b/src/server/gameserver/item/PetItem.cpp @@ -224,7 +224,7 @@ void PetItem::whenPCTake(PlayerCreature* pPC) { pPC->getPetItems().push_back(this); if (!pPC->isFlag(Effect::EFFECT_CLASS_HAS_PET)) { - // cout << pPC->getName() << " ٴ Ʈ Ĩϴ" << endl; + // cout << pPC->getName() << " 에게 펫 가졌다는 이펙트 부칩니당" << endl; EffectHasPet* pEffect = new EffectHasPet(pPC); pEffect->setNextTime(600); pPC->setFlag(Effect::EFFECT_CLASS_HAS_PET); @@ -244,7 +244,7 @@ void PetItem::whenPCLost(PlayerCreature* pPC) { pPC->getPetItems().remove(this); if (pPC->getPetItems().empty()) { - // cout << pPC->getName() << " Լ ٴ Ʈ ϴ" << endl; + // cout << pPC->getName() << " 에게서 펫 가졌다는 이펙트 떼냄니당" << endl; Effect* pEffect = pPC->findEffect(Effect::EFFECT_CLASS_HAS_PET); if (pEffect != NULL) pEffect->setDeadline(0); @@ -433,7 +433,7 @@ void PetItemLoader::load(Creature* pCreature) pPetInfo->setFeedTime(VSDateTime(pResult->getString(++i))); pPetInfo->setNickname(pResult->getString(++i)); - // ũ + // 양방향 링크 pPetItem->setPetInfo(pPetInfo); pPetInfo->setPetItem(pPetItem); @@ -484,7 +484,7 @@ void PetItemLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); PlayerCreature* pPC = dynamic_cast(pCreature); Assert(pPC != NULL); @@ -537,7 +537,7 @@ void PetItemLoader::load(Creature* pCreature) case STORAGE_PET_STASH: - /* ҷٰ pCreature ־ dz?...*/ + /* 펫을 불러다가 pCreature에 넣어야 되나?...*/ if (pPC->getPetStashItem(storageID) == NULL) { pPC->addPetStashItem(storageID, pPetItem); pPetItem->whenPCTake(pPC); @@ -609,7 +609,7 @@ void PetItemLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/PetItem.h b/src/server/gameserver/item/PetItem.h index 4ffd4183..7f9d1a05 100644 --- a/src/server/gameserver/item/PetItem.h +++ b/src/server/gameserver/item/PetItem.h @@ -74,8 +74,8 @@ class PetItem : public Item { ItemType_t m_ItemType; PetInfo* m_pPetInfo; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/item/Potion.cpp b/src/server/gameserver/item/Potion.cpp index 5dd7563c..37761db2 100644 --- a/src/server/gameserver/item/Potion.cpp +++ b/src/server/gameserver/item/Potion.cpp @@ -86,7 +86,7 @@ void Potion::create(const string& ownerID, Storage storage, StorageID_t storageI pStmt->executeQueryString(sql.toString()); */ - // StringStream. by sigi. 2002.5.13 + // StringStream제거. by sigi. 2002.5.13 pStmt->executeQuery("INSERT INTO PotionObject (ItemID, ObjectID, ItemType, OwnerID, Storage, StorageID, X, Y, " "Num) VALUES(%ld, %ld, %d, '%s', %d, %ld, %d, %d, %d)", m_ItemID, m_ObjectID, getItemType(), ownerID.c_str(), (int)storage, storageID, x, y, @@ -110,7 +110,7 @@ bool Potion::destroy() Statement* pStmt = NULL; BEGIN_DB { - // ̶ ٸ Database ؼ 쵵 Ѵ. + // 만약 포션이라면 다른 Database에 연결해서 지우도록 한다. // pStmt = g_pDatabaseManager->getConnection("DIST_DARKEDEN")->createStatement(); pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); @@ -541,7 +541,7 @@ void PotionLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -676,7 +676,7 @@ void PotionLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Potion.h b/src/server/gameserver/item/Potion.h index 8b8527f4..fd9a0d20 100644 --- a/src/server/gameserver/item/Potion.h +++ b/src/server/gameserver/item/Potion.h @@ -57,7 +57,7 @@ class Potion : public ConcreteItemexecuteQueryString(sql.toString()); */ - // StringStream. by sigi. 2002.5.13 + // StringStream제거. by sigi. 2002.5.13 pStmt->executeQuery("INSERT INTO PupaObject (ItemID, ObjectID, ItemType, OwnerID, Storage, StorageID, X, Y, " "Num) VALUES(%ld, %ld, %d, '%s', %d, %ld, %d, %d, %d)", m_ItemID, m_ObjectID, m_ItemType, ownerID.c_str(), (int)storage, storageID, x, y, @@ -505,7 +505,7 @@ void PupaLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -655,7 +655,7 @@ void PupaLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Pupa.h b/src/server/gameserver/item/Pupa.h index 53d343a4..7cdbdf32 100644 --- a/src/server/gameserver/item/Pupa.h +++ b/src/server/gameserver/item/Pupa.h @@ -69,7 +69,7 @@ class Pupa : public Item { return true; } - // ȸ + // 회복양 int getHPAmount(void) const; int getMPAmount(void) const; @@ -83,11 +83,11 @@ class Pupa : public Item { int getMPRecoveryUnit(void) const; private: - ItemType_t m_ItemType; // Ÿ - ItemNum_t m_Num; // ִ + ItemType_t m_ItemType; // 아이템 타입 + ItemNum_t m_Num; // 겹쳐있는 포션의 갯수 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; diff --git a/src/server/gameserver/item/QuestItem.cpp b/src/server/gameserver/item/QuestItem.cpp index 9eb0a843..d495755d 100644 --- a/src/server/gameserver/item/QuestItem.cpp +++ b/src/server/gameserver/item/QuestItem.cpp @@ -322,7 +322,7 @@ void QuestItemLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -429,7 +429,7 @@ void QuestItemLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/QuestItem.h b/src/server/gameserver/item/QuestItem.h index 9f82aa14..be38a0e7 100644 --- a/src/server/gameserver/item/QuestItem.h +++ b/src/server/gameserver/item/QuestItem.h @@ -57,8 +57,8 @@ class QuestItem : public Item { private: ItemType_t m_ItemType; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/item/Relic.cpp b/src/server/gameserver/item/Relic.cpp index 6101d387..9266d106 100644 --- a/src/server/gameserver/item/Relic.cpp +++ b/src/server/gameserver/item/Relic.cpp @@ -351,9 +351,9 @@ void RelicLoader::load(Creature* pCreature) Result* pResult = pStmt->executeQueryString(sql.toString()); */ - // Relic loadҰ ִٴ°.. - // μ ٿ Ǿٴ ǹ̴. - // ׷, . by sigi + // Relic load할게 있다는것은.. + // 현재로서는 이전에 서버다운이 되었다는 의미이다. + // 그래서, 지운다. by sigi pStmt->executeQuery("DELETE FROM RelicObject WHERE OwnerID = '%s'", pCreature->getName().c_str()); /* @@ -406,7 +406,7 @@ void RelicLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } - else throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + else throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch(storage) { @@ -528,7 +528,7 @@ void RelicLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Relic.h b/src/server/gameserver/item/Relic.h index 8770d451..06273daa 100644 --- a/src/server/gameserver/item/Relic.h +++ b/src/server/gameserver/item/Relic.h @@ -73,12 +73,12 @@ class Relic : public Item { } private: - ItemType_t m_ItemType; // Ÿ - Durability_t m_Durability; // + ItemType_t m_ItemType; // 아이템 타입 + Durability_t m_Durability; // 내구성 EnchantLevel_t m_EnchantLevel; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -88,7 +88,7 @@ class Relic : public Item { const int maxRelic = 2; -// Relic Type, +// Relic Type, 성물의 본래 소유 enum RelicType { RELIC_TYPE_SLAYER, RELIC_TYPE_VAMPIRE }; extern const string RelicType2String[maxRelic]; @@ -147,8 +147,8 @@ class RelicInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/ResurrectItem.cpp b/src/server/gameserver/item/ResurrectItem.cpp index af2b6c9a..6d8ed02f 100644 --- a/src/server/gameserver/item/ResurrectItem.cpp +++ b/src/server/gameserver/item/ResurrectItem.cpp @@ -328,7 +328,7 @@ void ResurrectItemLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -436,7 +436,7 @@ void ResurrectItemLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/ResurrectItem.h b/src/server/gameserver/item/ResurrectItem.h index 98db5b72..cea1a6e3 100644 --- a/src/server/gameserver/item/ResurrectItem.h +++ b/src/server/gameserver/item/ResurrectItem.h @@ -70,8 +70,8 @@ class ResurrectItem : public Item { ItemType_t m_ItemType; ItemNum_t m_Num; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// @@ -81,8 +81,8 @@ class ResurrectItem : public Item { class ResurrectItemInfo : public ItemInfo { public: enum ResurrectType { - HP_1, // HP 1 · Ȱ - HP_FULL // HP · Ȱ + HP_1, // HP가 1인 상태로 부활 + HP_FULL // HP가 꽉찬 상태로 부활 }; public: diff --git a/src/server/gameserver/item/Ring.cpp b/src/server/gameserver/item/Ring.cpp index 148c10a7..7762d050 100644 --- a/src/server/gameserver/item/Ring.cpp +++ b/src/server/gameserver/item/Ring.cpp @@ -413,7 +413,7 @@ void RingLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -537,7 +537,7 @@ void RingLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Ring.h b/src/server/gameserver/item/Ring.h index 33413025..595d75f1 100644 --- a/src/server/gameserver/item/Ring.h +++ b/src/server/gameserver/item/Ring.h @@ -71,12 +71,12 @@ class Ring virtual Protection_t getProtectionBonus() const ; */ private: - // ItemType_t m_ItemType; // Ÿ - // list m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -121,8 +121,8 @@ class RingInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/SG.cpp b/src/server/gameserver/item/SG.cpp index e3b1ac57..8a8ce61f 100644 --- a/src/server/gameserver/item/SG.cpp +++ b/src/server/gameserver/item/SG.cpp @@ -505,7 +505,7 @@ void SGLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -631,7 +631,7 @@ void SGLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/SG.h b/src/server/gameserver/item/SG.h index 4f229fd9..836423f6 100644 --- a/src/server/gameserver/item/SG.h +++ b/src/server/gameserver/item/SG.h @@ -61,8 +61,8 @@ class SG : public ConcreteItemgetInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -631,7 +631,7 @@ void SMGLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/SMG.h b/src/server/gameserver/item/SMG.h index 621e222c..2ae5e4d1 100644 --- a/src/server/gameserver/item/SMG.h +++ b/src/server/gameserver/item/SMG.h @@ -61,8 +61,8 @@ class SMG : public ConcreteItemgetInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -430,7 +430,7 @@ void SMSItemLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/SMSItem.h b/src/server/gameserver/item/SMSItem.h index ddee245e..5bbd8cbc 100644 --- a/src/server/gameserver/item/SMSItem.h +++ b/src/server/gameserver/item/SMSItem.h @@ -39,8 +39,8 @@ class SMSItem : public ConcreteItemgetInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -633,7 +633,7 @@ void SRLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/SR.h b/src/server/gameserver/item/SR.h index 128333af..6ef5a0ce 100644 --- a/src/server/gameserver/item/SR.h +++ b/src/server/gameserver/item/SR.h @@ -61,8 +61,8 @@ class SR : public ConcreteItemgetInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -505,7 +505,7 @@ void SerumLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Serum.h b/src/server/gameserver/item/Serum.h index fdd20c43..63272c6e 100644 --- a/src/server/gameserver/item/Serum.h +++ b/src/server/gameserver/item/Serum.h @@ -70,11 +70,11 @@ class Serum : public Item { } private: - ItemType_t m_ItemType; // Ÿ - ItemNum_t m_Num; // ִ û + ItemType_t m_ItemType; // 아이템 타입 + ItemNum_t m_Num; // 겹쳐있는 혈청의 갯수 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -114,9 +114,9 @@ class SerumInfo : public ItemInfo { virtual string toString() const; private: - int m_HPAmount; // ð HP ȸ - int m_Period; // ð( ) - int m_Count; // ð ݺ ΰ? + int m_HPAmount; // 단위 시간당 HP 회복량 + int m_Period; // 단위 시간(초 단위) + int m_Count; // 단위 시간을 몇 번 반복할 것인가? }; diff --git a/src/server/gameserver/item/Shield.cpp b/src/server/gameserver/item/Shield.cpp index 2c0f10cd..8a53d4a6 100644 --- a/src/server/gameserver/item/Shield.cpp +++ b/src/server/gameserver/item/Shield.cpp @@ -415,7 +415,7 @@ void ShieldLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -539,7 +539,7 @@ void ShieldLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Shield.h b/src/server/gameserver/item/Shield.h index 371a6649..ab81ff47 100644 --- a/src/server/gameserver/item/Shield.h +++ b/src/server/gameserver/item/Shield.h @@ -71,12 +71,12 @@ class Shield virtual Protection_t getProtectionBonus() const ; */ private: - // ItemType_t m_ItemType; // Ÿ - // list m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -121,8 +121,8 @@ class ShieldInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/Shoes.cpp b/src/server/gameserver/item/Shoes.cpp index 75b714ed..a4c810a8 100644 --- a/src/server/gameserver/item/Shoes.cpp +++ b/src/server/gameserver/item/Shoes.cpp @@ -412,7 +412,7 @@ void ShoesLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -536,7 +536,7 @@ void ShoesLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Shoes.h b/src/server/gameserver/item/Shoes.h index 5776de69..56b7954c 100644 --- a/src/server/gameserver/item/Shoes.h +++ b/src/server/gameserver/item/Shoes.h @@ -71,12 +71,12 @@ class Shoes virtual Protection_t getProtectionBonus() const ; */ private: - // ItemType_t m_ItemType; // Ÿ - // list m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -121,8 +121,8 @@ class ShoesInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/ShoulderArmor.cpp b/src/server/gameserver/item/ShoulderArmor.cpp index 15de584c..4486128f 100644 --- a/src/server/gameserver/item/ShoulderArmor.cpp +++ b/src/server/gameserver/item/ShoulderArmor.cpp @@ -313,7 +313,7 @@ void ShoulderArmorLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: diff --git a/src/server/gameserver/item/ShoulderArmor.h b/src/server/gameserver/item/ShoulderArmor.h index add192d1..b9531810 100644 --- a/src/server/gameserver/item/ShoulderArmor.h +++ b/src/server/gameserver/item/ShoulderArmor.h @@ -39,8 +39,8 @@ class ShoulderArmor : public ConcreteItemgetInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -469,7 +469,7 @@ void SkullLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Skull.h b/src/server/gameserver/item/Skull.h index 0814eda7..9ad5df6f 100644 --- a/src/server/gameserver/item/Skull.h +++ b/src/server/gameserver/item/Skull.h @@ -68,11 +68,11 @@ class Skull : public Item { } private: - ItemType_t m_ItemType; // Ÿ - ItemNum_t m_Num; // ִ ذ + ItemType_t m_ItemType; // 아이템 타입 + ItemNum_t m_Num; // 겹쳐있는 해골의 갯수 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; diff --git a/src/server/gameserver/item/SlayerPortalItem.cpp b/src/server/gameserver/item/SlayerPortalItem.cpp index f4147ff5..9d1ac298 100644 --- a/src/server/gameserver/item/SlayerPortalItem.cpp +++ b/src/server/gameserver/item/SlayerPortalItem.cpp @@ -340,7 +340,7 @@ void SlayerPortalItemLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); if (storage == STORAGE_INVENTORY) { if (pInventory->canAddingEx(x, y, pSlayerPortalItem)) { diff --git a/src/server/gameserver/item/SlayerPortalItem.h b/src/server/gameserver/item/SlayerPortalItem.h index a69c142f..7afa01be 100644 --- a/src/server/gameserver/item/SlayerPortalItem.h +++ b/src/server/gameserver/item/SlayerPortalItem.h @@ -71,11 +71,11 @@ class SlayerPortalItem : public Item { } private: - ItemType_t m_ItemType; // Ÿ - int m_Charge; // Ż ִ Ƚ + ItemType_t m_ItemType; // 아이템 타입 + int m_Charge; // 포탈을 열 수 있는 횟수 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; diff --git a/src/server/gameserver/item/SubInventory.cpp b/src/server/gameserver/item/SubInventory.cpp index b1d0c373..e3f49b84 100644 --- a/src/server/gameserver/item/SubInventory.cpp +++ b/src/server/gameserver/item/SubInventory.cpp @@ -341,7 +341,7 @@ void SubInventoryLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -453,7 +453,7 @@ void SubInventoryLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/SubInventory.h b/src/server/gameserver/item/SubInventory.h index 9d2bdaa3..a5bd6442 100644 --- a/src/server/gameserver/item/SubInventory.h +++ b/src/server/gameserver/item/SubInventory.h @@ -70,8 +70,8 @@ class SubInventory : public Item { ItemType_t m_ItemType; Inventory* m_pInventory; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/item/Sweeper.cpp b/src/server/gameserver/item/Sweeper.cpp index 35c2d576..dd01dd29 100644 --- a/src/server/gameserver/item/Sweeper.cpp +++ b/src/server/gameserver/item/Sweeper.cpp @@ -345,9 +345,9 @@ void SweeperLoader::load(Creature* pCreature) Result* pResult = pStmt->executeQueryString(sql.toString()); */ - // Sweeper loadҰ ִٴ°.. - // μ ٿ Ǿٴ ǹ̴. - // ׷, . by sigi + // Sweeper load할게 있다는것은.. + // 현재로서는 이전에 서버다운이 되었다는 의미이다. + // 그래서, 지운다. by sigi pStmt->executeQuery("DELETE FROM SweeperObject WHERE OwnerID = '%s'", pCreature->getName().c_str()); /* @@ -400,7 +400,7 @@ void SweeperLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } - else throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + else throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch(storage) { @@ -522,7 +522,7 @@ void SweeperLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Sweeper.h b/src/server/gameserver/item/Sweeper.h index 7e1ce0fe..259d46a5 100644 --- a/src/server/gameserver/item/Sweeper.h +++ b/src/server/gameserver/item/Sweeper.h @@ -72,12 +72,12 @@ class Sweeper : public Item { } private: - ItemType_t m_ItemType; // Ÿ - Durability_t m_Durability; // + ItemType_t m_ItemType; // 아이템 타입 + Durability_t m_Durability; // 내구성 EnchantLevel_t m_EnchantLevel; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// @@ -120,8 +120,8 @@ class SweeperInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/Sword.cpp b/src/server/gameserver/item/Sword.cpp index ee317901..d69d590b 100644 --- a/src/server/gameserver/item/Sword.cpp +++ b/src/server/gameserver/item/Sword.cpp @@ -441,7 +441,7 @@ void SwordLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -566,7 +566,7 @@ void SwordLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Sword.h b/src/server/gameserver/item/Sword.h index 4d7ce344..889b3e1d 100644 --- a/src/server/gameserver/item/Sword.h +++ b/src/server/gameserver/item/Sword.h @@ -86,8 +86,8 @@ class Sword // BYTE m_BonusDamage; // Silver_t m_Silver; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -171,7 +171,7 @@ class SwordInfo : public ItemInfo { Silver_t m_MaxSilver; Speed_t m_Speed; uint m_ItemLevel; - int m_CriticalBonus; // ۸ ٸ ũƼ Ȯ + int m_CriticalBonus; // 아이템마다 다른 크리티컬 확률 }; diff --git a/src/server/gameserver/item/TrapItem.cpp b/src/server/gameserver/item/TrapItem.cpp index b3e4507e..6195a3b5 100644 --- a/src/server/gameserver/item/TrapItem.cpp +++ b/src/server/gameserver/item/TrapItem.cpp @@ -323,7 +323,7 @@ void TrapItemLoader::load(Creature* pCreature) pInventory = pOusters->getInventory(); pStash = pOusters->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -430,7 +430,7 @@ void TrapItemLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/TrapItem.h b/src/server/gameserver/item/TrapItem.h index 775d9675..cae627af 100644 --- a/src/server/gameserver/item/TrapItem.h +++ b/src/server/gameserver/item/TrapItem.h @@ -57,8 +57,8 @@ class TrapItem : public Item { private: ItemType_t m_ItemType; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/item/Trouser.cpp b/src/server/gameserver/item/Trouser.cpp index 0ba6c1ec..5f89b04b 100644 --- a/src/server/gameserver/item/Trouser.cpp +++ b/src/server/gameserver/item/Trouser.cpp @@ -416,7 +416,7 @@ void TrouserLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -540,7 +540,7 @@ void TrouserLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Trouser.h b/src/server/gameserver/item/Trouser.h index 46ee1ff7..7543de55 100644 --- a/src/server/gameserver/item/Trouser.h +++ b/src/server/gameserver/item/Trouser.h @@ -70,12 +70,12 @@ class Trouser virtual Protection_t getProtectionBonus() const ; */ private: - // ItemType_t m_ItemType; // Ÿ - // list m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -120,8 +120,8 @@ class TrouserInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/VampireAmulet.cpp b/src/server/gameserver/item/VampireAmulet.cpp index 6dd1c31e..00fbb221 100644 --- a/src/server/gameserver/item/VampireAmulet.cpp +++ b/src/server/gameserver/item/VampireAmulet.cpp @@ -414,7 +414,7 @@ void VampireAmuletLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -538,7 +538,7 @@ void VampireAmuletLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/VampireAmulet.h b/src/server/gameserver/item/VampireAmulet.h index 026754c6..0d735a5e 100644 --- a/src/server/gameserver/item/VampireAmulet.h +++ b/src/server/gameserver/item/VampireAmulet.h @@ -71,12 +71,12 @@ class VampireAmulet : public ConcreteItem m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -121,8 +121,8 @@ class VampireAmuletInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/VampireBracelet.cpp b/src/server/gameserver/item/VampireBracelet.cpp index 2bd65d4a..f8332f83 100644 --- a/src/server/gameserver/item/VampireBracelet.cpp +++ b/src/server/gameserver/item/VampireBracelet.cpp @@ -415,7 +415,7 @@ void VampireBraceletLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -539,7 +539,7 @@ void VampireBraceletLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/VampireBracelet.h b/src/server/gameserver/item/VampireBracelet.h index 2fde4f81..9eb57474 100644 --- a/src/server/gameserver/item/VampireBracelet.h +++ b/src/server/gameserver/item/VampireBracelet.h @@ -71,12 +71,12 @@ class VampireBracelet : public ConcreteItem m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -121,8 +121,8 @@ class VampireBraceletInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/VampireCoat.cpp b/src/server/gameserver/item/VampireCoat.cpp index dfe20148..55f8f11d 100644 --- a/src/server/gameserver/item/VampireCoat.cpp +++ b/src/server/gameserver/item/VampireCoat.cpp @@ -412,7 +412,7 @@ void VampireCoatLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -536,7 +536,7 @@ void VampireCoatLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/VampireCoat.h b/src/server/gameserver/item/VampireCoat.h index 71b9664d..7e373dfb 100644 --- a/src/server/gameserver/item/VampireCoat.h +++ b/src/server/gameserver/item/VampireCoat.h @@ -71,12 +71,12 @@ class VampireCoat virtual Protection_t getProtectionBonus() const ; */ private: - // ItemType_t m_ItemType; // Ÿ - // list m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -121,8 +121,8 @@ class VampireCoatInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/VampireCoupleRing.cpp b/src/server/gameserver/item/VampireCoupleRing.cpp index 0d9ab9dd..1dcd900e 100644 --- a/src/server/gameserver/item/VampireCoupleRing.cpp +++ b/src/server/gameserver/item/VampireCoupleRing.cpp @@ -201,7 +201,7 @@ bool VampireCoupleRing::hasPartnerItem() "SELECT count(*) from VampireCoupleRingObject where ItemID=%ld and Storage IN(0, 1, 2, 3, 4, 9)", getPartnerItemID()); - // UPDATE Result* ſ.. pStmt->getAffectedRowCount() + // UPDATE인 경우는 Result* 대신에.. pStmt->getAffectedRowCount() if (pResult->next()) { int count = pResult->getInt(1); @@ -350,7 +350,7 @@ void VampireCoupleRingLoader::load(Creature* pCreature) pVampireCoupleRing->setName(pResult->getString(++i)); pVampireCoupleRing->setPartnerItemID(pResult->getDWORD(++i)); - // Ʈ ų ̻ Ŀ ƴϸ ش. + // 파트너 아이템이 없거나 더 이상 커플이 아니면 아이템을 지워준다. PlayerCreature* pPC = dynamic_cast(pCreature); // if ( !pVampireCoupleRing->hasPartnerItem() ) // if ( pPC != NULL && !g_pCoupleManager->isCouple( pPC, pVampireCoupleRing->getName() ) ) @@ -363,7 +363,7 @@ void VampireCoupleRingLoader::load(Creature* pCreature) pVampireCoupleRing->tinysave(sql); SAFE_DELETE(pVampireCoupleRing); - // FlagSet ش. + // FlagSet 도 날려준다. pPC->getFlagSet()->turnOff(FLAGSET_IS_COUPLE); pPC->getFlagSet()->save(pPC->getName()); continue; @@ -392,7 +392,7 @@ void VampireCoupleRingLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -472,7 +472,7 @@ void VampireCoupleRingLoader::load(Zone* pZone) { __BEGIN_TRY - cout << " ε ʽϴ." << endl; + cout << "존에 떨어진 아이템 로드는 지원하지 않습니다." << endl; Assert(false); Assert(pZone != NULL); @@ -512,7 +512,7 @@ void VampireCoupleRingLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/VampireCoupleRing.h b/src/server/gameserver/item/VampireCoupleRing.h index d51f0fa8..bd9901d6 100644 --- a/src/server/gameserver/item/VampireCoupleRing.h +++ b/src/server/gameserver/item/VampireCoupleRing.h @@ -107,8 +107,8 @@ class VampireCoupleRing : public CoupleRingBase { ItemType_t m_ItemType; list m_OptionType; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/item/VampireETC.cpp b/src/server/gameserver/item/VampireETC.cpp index 3485035b..1a87ce12 100644 --- a/src/server/gameserver/item/VampireETC.cpp +++ b/src/server/gameserver/item/VampireETC.cpp @@ -342,7 +342,7 @@ void VampireETCLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -450,7 +450,7 @@ void VampireETCLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/VampireETC.h b/src/server/gameserver/item/VampireETC.h index 3a5130d0..c00f124c 100644 --- a/src/server/gameserver/item/VampireETC.h +++ b/src/server/gameserver/item/VampireETC.h @@ -67,10 +67,10 @@ class VampireETC : public Item { private: ItemType_t m_ItemType; // ... - ItemNum_t m_Num; // ִ + ItemNum_t m_Num; // 겹쳐있는 아이템의 갯수 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; diff --git a/src/server/gameserver/item/VampireEarring.cpp b/src/server/gameserver/item/VampireEarring.cpp index f95ff190..ac8fee16 100644 --- a/src/server/gameserver/item/VampireEarring.cpp +++ b/src/server/gameserver/item/VampireEarring.cpp @@ -417,7 +417,7 @@ void VampireEarringLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -542,7 +542,7 @@ void VampireEarringLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/VampireEarring.h b/src/server/gameserver/item/VampireEarring.h index 62dd418c..38b95332 100644 --- a/src/server/gameserver/item/VampireEarring.h +++ b/src/server/gameserver/item/VampireEarring.h @@ -71,12 +71,12 @@ class VampireEarring : public ConcreteItem m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -121,8 +121,8 @@ class VampireEarringInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/VampireNecklace.cpp b/src/server/gameserver/item/VampireNecklace.cpp index a950f204..4f6678ad 100644 --- a/src/server/gameserver/item/VampireNecklace.cpp +++ b/src/server/gameserver/item/VampireNecklace.cpp @@ -416,7 +416,7 @@ void VampireNecklaceLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -541,7 +541,7 @@ void VampireNecklaceLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/VampireNecklace.h b/src/server/gameserver/item/VampireNecklace.h index ac8c7c1c..a331f44a 100644 --- a/src/server/gameserver/item/VampireNecklace.h +++ b/src/server/gameserver/item/VampireNecklace.h @@ -71,12 +71,12 @@ class VampireNecklace : public ConcreteItem m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -121,8 +121,8 @@ class VampireNecklaceInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/VampirePortalItem.h b/src/server/gameserver/item/VampirePortalItem.h index 83419bf5..e4a8f1d5 100644 --- a/src/server/gameserver/item/VampirePortalItem.h +++ b/src/server/gameserver/item/VampirePortalItem.h @@ -95,14 +95,14 @@ class VampirePortalItem : public Item { virtual EnchantLevel_t getEnchantLevel() const; private: - ItemType_t m_ItemType; // Ÿ - int m_Charge; // Ż ִ Ƚ - ZoneID_t m_ZoneID; // ǥ ID - ZoneCoord_t m_X; // ǥ ǥ - ZoneCoord_t m_Y; // ǥ ǥ - - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + ItemType_t m_ItemType; // 아이템 타입 + int m_Charge; // 포탈을 열 수 있는 횟수 + ZoneID_t m_ZoneID; // 목표 존 ID + ZoneCoord_t m_X; // 목표 존 좌표 + ZoneCoord_t m_Y; // 목표 존 좌표 + + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; diff --git a/src/server/gameserver/item/VampireRing.cpp b/src/server/gameserver/item/VampireRing.cpp index 18d18b7b..d842ad86 100644 --- a/src/server/gameserver/item/VampireRing.cpp +++ b/src/server/gameserver/item/VampireRing.cpp @@ -414,7 +414,7 @@ void VampireRingLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -538,7 +538,7 @@ void VampireRingLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/VampireRing.h b/src/server/gameserver/item/VampireRing.h index 4a634f91..112d5845 100644 --- a/src/server/gameserver/item/VampireRing.h +++ b/src/server/gameserver/item/VampireRing.h @@ -71,12 +71,12 @@ class VampireRing : public ConcreteItem m_OptionType; // ɼ Ÿ - // Durability_t m_Durability; // + // ItemType_t m_ItemType; // 아이템 타입 + // list m_OptionType; // 옵션 타입 + // Durability_t m_Durability; // 내구성 - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -121,8 +121,8 @@ class VampireRingInfo : public ItemInfo { virtual string toString() const; private: - Durability_t m_Durability; // - Defense_t m_DefenseBonus; // ߷ ʽ + Durability_t m_Durability; // 내구성 + Defense_t m_DefenseBonus; // 명중률 보너스 Protection_t m_ProtectionBonus; uint m_ItemLevel; }; diff --git a/src/server/gameserver/item/VampireWeapon.cpp b/src/server/gameserver/item/VampireWeapon.cpp index 5cdb3f08..e596e03a 100644 --- a/src/server/gameserver/item/VampireWeapon.cpp +++ b/src/server/gameserver/item/VampireWeapon.cpp @@ -437,7 +437,7 @@ void VampireWeaponLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -563,7 +563,7 @@ void VampireWeaponLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/VampireWeapon.h b/src/server/gameserver/item/VampireWeapon.h index df45e362..e39281c1 100644 --- a/src/server/gameserver/item/VampireWeapon.h +++ b/src/server/gameserver/item/VampireWeapon.h @@ -81,8 +81,8 @@ class VampireWeapon // Durability_t m_Durability; // BYTE m_BonusDamage; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; @@ -158,7 +158,7 @@ class VampireWeaponInfo : public ItemInfo { // ToHit_t m_ToHitBonus; Speed_t m_Speed; uint m_ItemLevel; - int m_CriticalBonus; // ۸ ٸ ũƼ Ȯ + int m_CriticalBonus; // 아이템마다 다른 크리티컬 확률 }; diff --git a/src/server/gameserver/item/WarItem.h b/src/server/gameserver/item/WarItem.h index 7971cd6e..96c37a6d 100644 --- a/src/server/gameserver/item/WarItem.h +++ b/src/server/gameserver/item/WarItem.h @@ -64,11 +64,11 @@ class WarItem : public Item { } private: - ItemType_t m_ItemType; // Ÿ + ItemType_t m_ItemType; // 아이템 타입 int m_Index; // War Item index - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/item/Water.cpp b/src/server/gameserver/item/Water.cpp index bd5bd7c7..a6f8a571 100644 --- a/src/server/gameserver/item/Water.cpp +++ b/src/server/gameserver/item/Water.cpp @@ -337,7 +337,7 @@ void WaterLoader::load(Creature* pCreature) pInventory = pVampire->getInventory(); pStash = pVampire->getStash(); } else - throw UnsupportedError("Monster,NPC κ丮 ʽϴ."); + throw UnsupportedError("Monster,NPC 인벤토리의 저장은 아직 지원되지 않습니다."); switch (storage) { case STORAGE_INVENTORY: @@ -445,7 +445,7 @@ void WaterLoader::load(Zone* pZone) case STORAGE_STASH: case STORAGE_CORPSE: - throw UnsupportedError(" ü ʽϴ."); + throw UnsupportedError("상자 및 시체안의 아이템의 저장은 아직 지원되지 않습니다."); default: throw Error("Storage must be STORAGE_ZONE"); diff --git a/src/server/gameserver/item/Water.h b/src/server/gameserver/item/Water.h index fd12c3d9..830e0cfc 100644 --- a/src/server/gameserver/item/Water.h +++ b/src/server/gameserver/item/Water.h @@ -67,11 +67,11 @@ class Water : public Item { } private: - ItemType_t m_ItemType; // Ÿ + ItemType_t m_ItemType; // 아이템 타입 ItemNum_t m_Num; - static Mutex m_Mutex; // ID - static ItemID_t m_ItemIDRegistry; // Ŭ ̵ ߱ޱ + static Mutex m_Mutex; // 아이템 ID 관련 락 + static ItemID_t m_ItemIDRegistry; // 클래스별 고유 아이템 아이디 발급기 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/main.cpp b/src/server/gameserver/main.cpp index c9e813a7..6c0c416f 100644 --- a/src/server/gameserver/main.cpp +++ b/src/server/gameserver/main.cpp @@ -2,7 +2,7 @@ // // Filename : main.cpp // Written By : reiot@ewestsoft.com -// Description : Լ +// Description : °ÔÀÓ ¼­¹ö¿ë ¸ÞÀÎ ÇÔ¼ö // ////////////////////////////////////////////////////////////////////// @@ -72,7 +72,7 @@ int main(int argc, char* argv[]) { filelog("serverStart.log", "GameServer Start"); - // ڵ鷯 Ѵ. + // °¢Á¾ Çڵ鷯¸¦ ¼³Á¤ÇÑ´Ù. std::set_new_handler(handleMemoryError); std::set_terminate(handleUnhandledException); std::set_unexpected(handleUnexpectedException); @@ -83,16 +83,16 @@ int main(int argc, char* argv[]) { delete [] pPointer; */ - // ġ ãƺ. + // ÀûÀýÇÑ À§Ä¡¸¦ ã¾Æº¸ÀÚ. srand(time(0)); cout << ">>> RANDOMIZATION INITIALIZATION SUCCESS..." << endl; if (argc < 3) { - // cout << "Usage : gameserver -f ȯ" << endl; + // cout << "Usage : gameserver -f ȯ°æÆÄÀÏ" << endl; exit(1); } - // command-line parameter string ȯѴ. ^^; + // command-line parameter¸¦ string À¸·Î º¯È¯ÇÑ´Ù. ^^; string* Argv; Argv = new string[argc]; @@ -101,16 +101,16 @@ int main(int argc, char* argv[]) { cout << ">>> COMMAND-LINE PARAMETER READING SUCCESS..." << endl; - // ȯ оδ. - // $VSHOME/bin, ȯ $VSHOME/conf ؾ Ѵ. - // command line ȯ ֵ Ѵ. + // ȯ°æ ÆÄÀÏÀ» ÀоîµéÀδÙ. + // ´Ü ½ÇÇà ÆÄÀÏÀº $VSHOME/bin¿¡, ȯ°æ ÆÄÀÏÀº $VSHOME/conf ¿¡ Á¸ÀçÇØ¾ß ÇÑ´Ù.½ + // command line ¿¡¼­ ȯ°æ ÆÄÀÏÀ» ÁöÁ¤ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. try { if (Argv[1] != "-f") { - throw Error("Usage : gameserver -f ȯ -t ׽Ʈȯ"); + throw Error("Usage : gameserver -f ȯ°æÆÄÀÏ -t Å×½ºÆ®È¯°æÆÄÀÏ"); } - // ù° ĶͰ -f , ι° Ķʹ ȯ ġ ȴ. + // ù¹øÂ° ÆÄ¶ó¹ÌÅͰ¡ -f ÀÏ °æ¿ì, µÎ¹øÂ° ÆÄ¶ó¹ÌÅʹ ȯ°æÆÄÀÏÀÇ À§Ä¡°¡ µÈ´Ù. g_pConfig = new Properties(); g_pConfig->load(Argv[2]); @@ -128,11 +128,11 @@ int main(int argc, char* argv[]) { // cout << e.toString() << endl; } - // α Ŵ ϰ ʱȭ ȰȭŲ. - // α Ŵ ʱȭ ߻ ɼ ִ - // س ϹǷ ο ʱȭؼ ȵȴ. - // ٸ ü ϰ ʱȭϱ α׸Ŵ 켱 , - // ʱȭǾ Ѵ. + // ·Î±× ¸Å´ÏÀú¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇÑÈÄ È°¼ºÈ­½ÃŲ´Ù. + // ·Î±× ¸Å´ÏÀú´Â °ÔÀÓ ¼­¹öÀÇ ÃʱâÈ­°úÁ¤¿¡¼­ ¹ß»ýÇÒ °¡´É¼ºÀÌ ÀÖ´Â ¿¡·¯±îÁöµµ + // °ËÃâÇØ³»¾ß ÇϹǷΠ°ÔÀÓ ¼­¹ö ³»ºÎ¿¡¼­ ÃʱâÈ­ÇØ¼­´Â ¾ÈµÈ´Ù. + // ¶ÇÇÑ ´Ù¸¥ °´Ã¼¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇϱâÀü¿¡ ·Î±×¸Å´ÏÀú°¡ ¿ì¼±ÀûÀ¸·Î »ý¼º, + // ÃʱâÈ­µÇ¾î¾ß ÇÑ´Ù. try { string LogServerIP = g_pConfig->getProperty("LogServerIP"); int LogServerPort = g_pConfig->getPropertyInt("LogServerPort"); @@ -152,7 +152,7 @@ int main(int argc, char* argv[]) { cout << ">>> LOGCLIENT INITIALZATION SUCCESS..." << endl; // - // ü ϰ ʱȭ ȰȭŲ. + // °ÔÀÓ ¼­¹ö °´Ã¼¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇÑ ÈÄ È°¼ºÈ­½ÃŲ´Ù. // try { struct rlimit rl; @@ -160,29 +160,29 @@ int main(int argc, char* argv[]) { rl.rlim_max = RLIM_INFINITY; setrlimit(RLIMIT_CORE, &rl); - // ü Ѵ. + // °ÔÀÓ ¼­¹ö °´Ã¼¸¦ »ý¼ºÇÑ´Ù. g_pGameServer = new GameServer(); cout << ">>> GAME SERVER INSTANCE CREATED..." << endl; - // ü ʱȭѴ. + // °ÔÀÓ ¼­¹ö °´Ã¼¸¦ ÃʱâÈ­ÇÑ´Ù. g_pGameServer->init(); cout << ">>> GAME SERVER INITIALIZATION SUCCESS..." << endl; - // ü ȰȭŲ. + // °ÔÀÓ ¼­¹ö °´Ã¼¸¦ Ȱ¼ºÈ­½ÃŲ´Ù. g_pGameServer->start(); } catch (Throwable& e) { - // αװ ̷ 츦 ؼ + // ·Î±×°¡ ÀÌ·ïÁö±â Àü¿¡ ¼­¹ö°¡ ³¡³¯ °æ¿ì¸¦ ´ëºñÇØ¼­ ofstream ofile("../log/instant.log", ios::out); ofile << e.toString() << endl; ofile.close(); - // ǥ ε ش. + // Ç¥ÁØ Ãâ·ÂÀ¸·Îµµ Ãâ·ÂÇØÁØ´Ù. cout << e.toString() << endl; - // ߴܽŲ. - // ο Ŵ ߴܵǾ Ѵ. + // °ÔÀÓ ¼­¹ö¸¦ ÁߴܽÃŲ´Ù. + // ÀÌ ³»ºÎ¿¡¼­ ÇÏÀ§ ¸Å´ÏÀú ¿ª½Ã ÁߴܵǾî¾ß ÇÑ´Ù. g_pGameServer->stop(); } catch (...) { cout << "unknown exception..." << endl; diff --git a/src/server/gameserver/mission/AnotherQuestRewardInfo.h b/src/server/gameserver/mission/AnotherQuestRewardInfo.h index f08eaade..1514cd8f 100644 --- a/src/server/gameserver/mission/AnotherQuestRewardInfo.h +++ b/src/server/gameserver/mission/AnotherQuestRewardInfo.h @@ -26,7 +26,7 @@ class AnotherQuestRewardInfo : public RewardInfo { public: virtual QuestMessage canGiveReward(PlayerCreature* pPC) const; - // . + // 쓰지 말 것. virtual QuestMessage giveReward(PlayerCreature* pPC) const; bool isAnotherQuest() const { diff --git a/src/server/gameserver/mission/EventQuestAdvance.cpp b/src/server/gameserver/mission/EventQuestAdvance.cpp index fb8fed5e..d695d0dc 100644 --- a/src/server/gameserver/mission/EventQuestAdvance.cpp +++ b/src/server/gameserver/mission/EventQuestAdvance.cpp @@ -94,7 +94,7 @@ bool EventQuestAdvanceManager::advanced(int questLevel) { EventQuestAdvance::Status EventQuestAdvanceManager::getStatus(int questLevel) { Assert(questLevel < EVENT_QUEST_LEVEL_MAX); - // Ʈ ̸ ̹ Ʈ. -_-; + // 퀘스트 레벨이 음수값이면 모든 사람이 이미 끝낸 퀘스트다. -_-; if (questLevel < 0) return EventQuestAdvance::EVENT_QUEST_ADVANCED; if (m_Advances[questLevel] == NULL) diff --git a/src/server/gameserver/mission/EventQuestAdvance.h b/src/server/gameserver/mission/EventQuestAdvance.h index 45ef9333..74301da2 100644 --- a/src/server/gameserver/mission/EventQuestAdvance.h +++ b/src/server/gameserver/mission/EventQuestAdvance.h @@ -12,11 +12,11 @@ class PlayerCreature; class EventQuestAdvance { public: enum Status { - EVENT_QUEST_INIT, // ۵ ߴ. - EVENT_QUEST_STARTED, // ߾ ġ ߴ. - EVENT_QUEST_SUCCESS, // ߴ. - EVENT_QUEST_REWARDED, // ޾Ҵ. - EVENT_QUEST_ADVANCED // Ʈ ߴ. + EVENT_QUEST_INIT, // 시작도 안했다. + EVENT_QUEST_STARTED, // 시작했었고 끝마치지 못했다. + EVENT_QUEST_SUCCESS, // 끝마쳤으나 보상을 받지 못했다. + EVENT_QUEST_REWARDED, // 보상으로 복권을 받았다. + EVENT_QUEST_ADVANCED // 보상으로 다음 퀘스트로의 진행을 선택했다. }; EventQuestAdvance(const EventQuestAdvance& org) : m_QuestLevel(org.m_QuestLevel), m_Status(org.m_Status) {} diff --git a/src/server/gameserver/mission/EventQuestRewardManager.cpp b/src/server/gameserver/mission/EventQuestRewardManager.cpp index fc18a242..73afce4d 100644 --- a/src/server/gameserver/mission/EventQuestRewardManager.cpp +++ b/src/server/gameserver/mission/EventQuestRewardManager.cpp @@ -14,7 +14,7 @@ void EventQuestRewardManager::load(const string& name) { Statement* pStmt = NULL; BEGIN_DB { - // ̰ Ⱦ°Ŵ. + // 이거 안쓰는거다. /* pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); Result* pResult; @@ -32,7 +32,7 @@ void EventQuestRewardManager::load(const string& name) { if ( m_RewardClasses[rClass] != NULL ) { - cout << "EventQuestRewardManager : Ȱ ΰ ־" << (uint)rClass << endl; + cout << "EventQuestRewardManager : 왜 똑같은게 두개나 들어있어" << (uint)rClass << endl; Assert( false ); } @@ -56,7 +56,7 @@ void EventQuestRewardManager::load(const string& name) { DWORD time = (DWORD) pResult->getInt( ++index ); if ( m_RewardClasses[ rClass ] == NULL ){ - cout << "EventQuestRewardManager : ̳ ̺ƮƮڳ" << (uint)rClass << endl; + cout << "EventQuestRewardManager : 이놈이 줄 수 없는 이벤트퀘스트자나" << (uint)rClass << endl; Assert( false ); // m_RewardClasses[rClass] = new RandomRewardClass( rClass ); // cout << "NPC : " << name << ", RewardClass : " << (uint)rClass << endl; @@ -81,7 +81,7 @@ void EventQuestRewardManager::load(const string& name) { DWORD time = (DWORD) pResult->getInt( ++index ); if ( m_RewardClasses[ rClass ] == NULL ){ - cout << "EventQuestRewardManager : ̳ ̺ƮƮڳ" << endl; + cout << "EventQuestRewardManager : 이놈이 줄 수 없는 이벤트퀘스트자나" << endl; Assert( false ); } diff --git a/src/server/gameserver/mission/GatherItemQuestStatus.cpp b/src/server/gameserver/mission/GatherItemQuestStatus.cpp index 2cb83374..7d868edd 100644 --- a/src/server/gameserver/mission/GatherItemQuestStatus.cpp +++ b/src/server/gameserver/mission/GatherItemQuestStatus.cpp @@ -47,7 +47,7 @@ bool GatherItemQuestStatus::isSuccess() const { PlayerCreature* pOwnerPC = getOwnerPC(); Inventory* pInventory = pOwnerPC->getInventory(); - // κ丮 + // 인벤토리 뒤지기 ㅎㅎㅎ map ItemList; int height = pInventory->getHeight(); int width = pInventory->getWidth(); @@ -58,7 +58,7 @@ bool GatherItemQuestStatus::isSuccess() const { for (int i = 0; i < width; i++) { Item* pItem = pInventory->getItem(i, j); if (pItem != NULL) { - // üũ Ʈ ã´. + // 체크된 아이템의 리스트에서 현재 아이템을 찾는다. map::iterator itr = ItemList.find(pItem->getObjectID()); if (itr == ItemList.end()) { diff --git a/src/server/gameserver/mission/ItemRewardInfo.cpp b/src/server/gameserver/mission/ItemRewardInfo.cpp index e48a7003..bd82506a 100644 --- a/src/server/gameserver/mission/ItemRewardInfo.cpp +++ b/src/server/gameserver/mission/ItemRewardInfo.cpp @@ -109,7 +109,7 @@ QuestMessage ItemRewardInfo::giveReward(PlayerCreature* pPC) const if (!pInventory->addItem(pItem, tp)) { SAFE_DELETE(pItem); - filelog("Quest.log", "ItemRewardInfo::giveReward() : canGiveReward() Ȯ ʾҰų հ ϴ."); + filelog("Quest.log", "ItemRewardInfo::giveReward() : canGiveReward() 를 확인하지 않았거나 먼가 꼬였습니다."); return COMPLETE_FAIL_NO_INVENTORY_SPACE; } diff --git a/src/server/gameserver/mission/MiniGameQuestStatus.cpp b/src/server/gameserver/mission/MiniGameQuestStatus.cpp index 5d66526f..8c6699ac 100644 --- a/src/server/gameserver/mission/MiniGameQuestStatus.cpp +++ b/src/server/gameserver/mission/MiniGameQuestStatus.cpp @@ -42,7 +42,7 @@ void MiniGameQuestStatus::executeWhenStart() { "SELECT Name, Score FROM MiniGameScores WHERE Type=%u AND Level=0 ORDER BY Score DESC LIMIT 1", m_GameType); - // UPDATE Result* ſ.. pStmt->getAffectedRowCount() + // UPDATE인 경우는 Result* 대신에.. pStmt->getAffectedRowCount() if (pResult->next()) { @@ -69,7 +69,7 @@ void MiniGameQuestStatus::executeWhenFail() { PlayerCreature* pPC = getOwnerPC(); Assert(pPC != NULL); - // ϸ ״´. + // 실패하면 죽는다. if (pPC->isSlayer()) { dynamic_cast(pPC)->setHP(0); } else if (pPC->isVampire()) { diff --git a/src/server/gameserver/mission/MonsterKillQuestInfo.h b/src/server/gameserver/mission/MonsterKillQuestInfo.h index 0335b7ea..8b7e45c1 100644 --- a/src/server/gameserver/mission/MonsterKillQuestInfo.h +++ b/src/server/gameserver/mission/MonsterKillQuestInfo.h @@ -38,9 +38,9 @@ class MonsterKillQuestInfo : public QuestInfo { } private: - SpriteType_t m_TargetMonsterSpriteType; // Ʈ Ʈ Ÿ - bool m_IsChief; // Ʈ Ͱ chief̾ ϴ°? - int m_GoalNum; // Ʈ + SpriteType_t m_TargetMonsterSpriteType; // 퀘스트에서 잡을 몬스터의 스프라이트 타입 + bool m_IsChief; // 퀘스트에서 잡을 몬스터가 chief이어야 하는가? + int m_GoalNum; // 퀘스트에서 잡을 몬스터 수 }; #endif diff --git a/src/server/gameserver/mission/MonsterKillQuestStatus.h b/src/server/gameserver/mission/MonsterKillQuestStatus.h index 4ffc2e7b..bca28dbf 100644 --- a/src/server/gameserver/mission/MonsterKillQuestStatus.h +++ b/src/server/gameserver/mission/MonsterKillQuestStatus.h @@ -16,7 +16,7 @@ class MonsterKillQuestStatus : public QuestStatus { virtual ~MonsterKillQuestStatus() {} // virtual bool isSuccess() { return m_CurrentNum >= m_GoalNum; } - // ( !m_IsChief || isChief ) m_IsChief ̸ isChief ̾ Ѵ. . + // ( !m_IsChief || isChief ) 는 m_IsChief 이면 isChief 이어야 한다. 라는 말과 같다. bool killed(SpriteType_t targetSType, bool isChief); bool isTarget(SpriteType_t sType, bool isChief) { return (!m_IsChief || isChief) && m_TargetMonsterSpriteType == sType; diff --git a/src/server/gameserver/mission/QuestInfo.cpp b/src/server/gameserver/mission/QuestInfo.cpp index 8edf5ffa..5a92b486 100644 --- a/src/server/gameserver/mission/QuestInfo.cpp +++ b/src/server/gameserver/mission/QuestInfo.cpp @@ -69,8 +69,8 @@ bool QuestInfo::canExecute(PlayerCreature* pPC) const curGrade = (QuestGrade_t)pOusters->getLevel(); } else { - // cout << "ƿ콺? -_-; QuestInfo::canExecute()" << endl; - cout << "ʹüӳ-_-; QuestInfo::canExecute()" << endl; + // cout << "아우스터즈냐? -_-; QuestInfo::canExecute()" << endl; + cout << "넌대체머냐-_-; QuestInfo::canExecute()" << endl; return false; } diff --git a/src/server/gameserver/mission/QuestInfoManager.cpp b/src/server/gameserver/mission/QuestInfoManager.cpp index 02bd43c6..139d987e 100644 --- a/src/server/gameserver/mission/QuestInfoManager.cpp +++ b/src/server/gameserver/mission/QuestInfoManager.cpp @@ -106,7 +106,7 @@ rewardClass, iClass, iType, Count ); addQuestInfo( pGatherItemQI ); cout << "Loading Quest Info : " << pGatherItemQI->toString() << endl; } -// ߿ +// 나중에 하자 // pResult = pStmt->executeQuery( // "SELECT QuestID, Race, MaxGrade, MinGrade, TimeLimitSec, RewardClass, TargetSType, IsChief, Goal FROM MonsterKillQuestInfo"); @@ -151,7 +151,7 @@ void QuestInfoManager::addQuestInfo(QuestInfo* pQI) QuestInfoHashMap::iterator itr = m_QuestInfos.find(pQI->getQuestID()); if (itr != m_QuestInfos.end()) - throw Error("QuestInfoManager::addQuestInfo : QuestID ߺ˴ϴ."); + throw Error("QuestInfoManager::addQuestInfo : QuestID 가 중복됩니다."); m_QuestInfos[pQI->getQuestID()] = pQI; @@ -171,7 +171,7 @@ QuestMessage QuestInfoManager::canExecuteQuest(QuestID_t qID, PlayerCreature* pP QuestInfoHashMap::const_iterator itr = m_QuestInfos.find(qID); if (itr == m_QuestInfos.end()) { filelog("EventBug.txt", - "QuestInfoManager::canExcuteQuest : Ŭ̾Ʈ qID NPC . %s:%d", + "QuestInfoManager::canExcuteQuest : 클라이언트가 보내준 qID가 이 NPC한테 없다 ㅜ.ㅠ %s:%d", m_pOwnerNPC->getName().c_str(), qID); return FAIL_BUG; } @@ -195,7 +195,7 @@ QuestMessage QuestInfoManager::startQuest(QuestID_t qID, PlayerCreature* pPC) { if (pQuestStatus->isEventQuest()) { if (!pPC->getQuestManager()->getEventQuestAdvanceManager()->start(pQuestStatus->getQuestLevel())) { filelog("EventBug.txt", - "QuestInfoManager::startQuest : Ʈ ؾ Ǵµ Ʈ 꽺 Ŵ INIT ƴϴ. " + "QuestInfoManager::startQuest : 퀘스트 시작해야 되는데 퀘스트 어드밴스 매니저가 INIT가 아니다. " "%s:%d (Level %d)", pPC->getName().c_str(), qID, pQuestStatus->getQuestLevel()); } diff --git a/src/server/gameserver/mission/QuestManager.cpp b/src/server/gameserver/mission/QuestManager.cpp index f509bcd7..ddd7e666 100644 --- a/src/server/gameserver/mission/QuestManager.cpp +++ b/src/server/gameserver/mission/QuestManager.cpp @@ -41,7 +41,7 @@ QuestManager::~QuestManager() { void QuestManager::load() { __BEGIN_TRY - // Ʈ ̾ ϱ ʴ´. + // 아직 퀘스트 이어서 하기는 지원하지 않는다. m_pEventQuestAdvanceManager->load(); __END_CATCH @@ -133,7 +133,7 @@ void QuestManager::sendQuestInfo() { for (; itr != endItr; ++itr) { if (itr->second == NULL) { - filelog("Quest.log", "QuestManager::sendQuestInfo : QuestStatus NULL ֽϴ."); + filelog("Quest.log", "QuestManager::sendQuestInfo : QuestStatus에 NULL 이 들어가있습니다."); continue; } diff --git a/src/server/gameserver/mofus/MJob.h b/src/server/gameserver/mofus/MJob.h index 0ea3c49e..3d5f6242 100644 --- a/src/server/gameserver/mofus/MJob.h +++ b/src/server/gameserver/mofus/MJob.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // filename : MJob.h -// desc : ۽ ؼ ĿƮ ϳ ۾ +// desc : 모퍼스에 연결해서 파워포인트를 가져오는 하나의 작업 단위 ///////////////////////////////////////////////////////////////////////////// #ifndef __MJOB_H__ @@ -12,7 +12,7 @@ class MJob { : m_UserID(userID), m_Name(name), m_CellNum(cellnum), m_PowerPoint(0), m_ErrorCode(0), m_bEnd(false) {} public: - // Ʈ + // 포인트 누적 void addPowerPoint(int point) { m_PowerPoint += point; } @@ -48,22 +48,22 @@ class MJob { } private: - // ID + // 사용자 ID string m_UserID; - // ij + // 캐릭터 명 string m_Name; - // ڵ ȣ + // 핸드폰 번호 string m_CellNum; - // Ʈ + // 가져온 포인트 int m_PowerPoint; - // ڵ + // 에러 코드 int m_ErrorCode; - // ۾ ? + // 작업이 끝났나? bool m_bEnd; }; diff --git a/src/server/gameserver/mofus/MPacketID.h b/src/server/gameserver/mofus/MPacketID.h index aa426274..dcf6c6bb 100644 --- a/src/server/gameserver/mofus/MPacketID.h +++ b/src/server/gameserver/mofus/MPacketID.h @@ -7,21 +7,21 @@ // MPacketID send enum enum { - PTC_CONNECT_ASK = 0x01, // Ӽ û - PTC_LOGOUT = 0x11, // Ӽ - PTC_USERINFO = 0x20, // û - PTC_RECEIVE_OK = 0x30, // ڷῡ ó - PTC_RESULT = 0x40, // ۹ ڷῡ ó - PTC_ERROR = 0xFF, // Ӽ ó ؼ ȴ. + PTC_CONNECT_ASK = 0x01, // 게임서버의 접속 요청 + PTC_LOGOUT = 0x11, // 게임서버의 접속 종료 + PTC_USERINFO = 0x20, // 유저 정보 요청 + PTC_RECEIVE_OK = 0x30, // 받은 자료에 대한 처리 여부 + PTC_RESULT = 0x40, // 마지막으로 전송받은 자료에 대한 처리 여부 + PTC_ERROR = 0xFF, // 게임서버에서 처리 에러에 대한 결과를 보내기 위해서 사용된다. PTC_SEND_MAX }; // MPacketID recv enum enum { - PTS_CONNECT_ACCEPT = 0x01, // Ӽ û 㰡 - PTS_POWERPOINT = 0x20, // û - PTS_ERROR = 0xFF, // ˸ + PTS_CONNECT_ACCEPT = 0x01, // 게임서버의 접속 요청 허가 + PTS_POWERPOINT = 0x20, // 요청한 정보 + PTS_ERROR = 0xFF, // 서버 오류 알림 PTC_MAX }; diff --git a/src/server/gameserver/mofus/MPacketManager.cpp b/src/server/gameserver/mofus/MPacketManager.cpp index 3354dee5..30447001 100644 --- a/src/server/gameserver/mofus/MPacketManager.cpp +++ b/src/server/gameserver/mofus/MPacketManager.cpp @@ -10,7 +10,7 @@ #include "MPacketID.h" #include "Mofus.h" -// send Ŷ +// send 패킷 #include "PKTConnectAsk.h" #include "PKTLogout.h" #include "PKTReceiveOK.h" @@ -18,7 +18,7 @@ #include "PKTSError.h" #include "PKTUserInfo.h" -// receive Ŷ +// receive 패킷 #include "PKTConnectAccept.h" #include "PKTConnectAcceptHandler.h" #include "PKTError.h" @@ -27,13 +27,13 @@ #include "PKTPowerPointHandler.h" -// Ŷ ID ϱ ũ +// 패킷 ID 등록을 간단히 하기 위한 매크로 #define REGISTER_SEND_PACKET_ID(PACKET, PACKET_ID) \ MPacketID_t PACKET::getID() const { \ return PACKET_ID; \ } -// Ŷ ڵ鷯 ID ϱ ũ +// 패킷 핸들러 ID 등록을 간단히 하기 위한 매크로 #define REGISTER_RECV_PACKET_ID(PACKET, PACKET_ID) \ MPacketID_t PACKET::getID() const { \ return PACKET_ID; \ @@ -42,7 +42,7 @@ return PACKET_ID; \ } -// ŶID +// 보내기용 패킷ID 등록 REGISTER_SEND_PACKET_ID(PKTConnectAsk, PTC_CONNECT_ASK) REGISTER_SEND_PACKET_ID(PKTLogout, PTC_LOGOUT) REGISTER_SEND_PACKET_ID(PKTUserInfo, PTC_USERINFO) @@ -50,13 +50,13 @@ REGISTER_SEND_PACKET_ID(PKTReceiveOK, PTC_RECEIVE_OK) REGISTER_SEND_PACKET_ID(PKTResult, PTC_RESULT) REGISTER_SEND_PACKET_ID(PKTSError, PTC_ERROR) -// ޱ Ŷ ID ڵ鷯 ID +// 받기용 패킷 ID 등록 및 핸들러 ID 등록 REGISTER_RECV_PACKET_ID(PKTConnectAccept, PTS_CONNECT_ACCEPT) REGISTER_RECV_PACKET_ID(PKTPowerPoint, PTS_POWERPOINT) REGISTER_RECV_PACKET_ID(PKTError, PTS_ERROR) -// +// 내부 구현 데이터 struct MPacketManager::IMPL { MPacket* pCreators[PTC_MAX]; MPacketHandler* pHandlers[PTC_MAX]; @@ -64,27 +64,27 @@ struct MPacketManager::IMPL { IMPL(); ~IMPL(); - // Ŷ ڸ ߰Ѵ. + // 패킷 생성자를 추가한다. void addCreator(MPacket* pPacket); - // Ŷ ڵ鷯 ߰Ѵ. + // 패킷 핸들러를 추가한다. void addHandler(MPacketHandler* pHandler); }; -// +// 생성자 MPacketManager::MPacketManager() : m_pImpl(new IMPL) { Assert(m_pImpl != NULL); } -// Ҹ +// 소멸자 MPacketManager::~MPacketManager() { SAFE_DELETE(m_pImpl); } -// ʱȭ +// 초기화 void MPacketManager::init() { - // ڵ鷯 ũ ߰ + // 핸들러 및 크리에이터 추가 m_pImpl->addCreator(new PKTConnectAccept); m_pImpl->addHandler(new PKTConnectAcceptHandler); m_pImpl->addCreator(new PKTPowerPoint); @@ -93,19 +93,19 @@ void MPacketManager::init() { m_pImpl->addHandler(new PKTErrorHandler); } -// Ŷ ڸ ߰Ѵ. +// 패킷 생성자를 추가한다. void MPacketManager::addCreator(MPacket* pPacket) { Assert(pPacket != NULL); m_pImpl->addCreator(pPacket); } -// Ŷ ڵ鷯 ߰Ѵ. +// 패킷 핸들러를 추가한다. void MPacketManager::addHandler(MPacketHandler* pHandler) { Assert(pHandler != NULL); m_pImpl->addHandler(pHandler); } -// ο Ŷ ؼ ȯѴ. +// 새로운 패킷을 생성해서 반환한다. MPacket* MPacketManager::createPacket(MPacketID_t ID) const { if (ID < 0 || ID >= PTC_MAX) { filelog(MOFUS_ERROR_FILE, "MPacketManager::createPacket() out of ID"); @@ -115,7 +115,7 @@ MPacket* MPacketManager::createPacket(MPacketID_t ID) const { return m_pImpl->pCreators[ID]->create(); } -// Ŷ Ѵ. +// 패킷을 실행한다. void MPacketManager::execute(MPlayer* pPlayer, MPacket* pPacket) { Assert(pPlayer != NULL); Assert(pPacket != NULL); @@ -135,14 +135,14 @@ void MPacketManager::execute(MPlayer* pPlayer, MPacket* pPacket) { m_pImpl->pHandlers[ID]->execute(pPlayer, pPacket); } -// Ŷ Ѵ. +// 패킷을 실행한다. bool MPacketManager::hasHandler(MPacketID_t ID) const { - // ϴ Ȯ + // 일단 범위 확인 if (ID < 0 || ID >= PTC_MAX) { return false; } - // ڵ鷯 ִ Ȯ + // 핸들러가 있는지 확인 if (m_pImpl->pHandlers[ID] == NULL) { return false; } @@ -150,7 +150,7 @@ bool MPacketManager::hasHandler(MPacketID_t ID) const { return true; } -// Ŷ ũ⸦ ȯѴ. +// 패킷의 크기를 반환한다. MPacketSize_t MPacketManager::getPacketSize(MPacketID_t ID) const { if (ID < 0 || ID >= PTC_MAX) { filelog(MOFUS_ERROR_FILE, "MPacketManager::createPacket() out of ID"); @@ -160,49 +160,49 @@ MPacketSize_t MPacketManager::getPacketSize(MPacketID_t ID) const { return m_pImpl->pCreators[ID]->getSize(); } -// +// 생성자 MPacketManager::IMPL::IMPL() { - // 迭 ʱȭѴ. + // 각 배열을 초기화한다. for (MPacketID_t i = 0; i < PTC_MAX; ++i) { pCreators[i] = NULL; pHandlers[i] = NULL; } } -// Ҹ +// 소멸자 MPacketManager::IMPL::~IMPL() { - // Ŷ ڵ鷯 . + // 패킷 생성자 및 핸들러를 지운다. for (MPacketID_t i = 0; i < PTC_MAX; ++i) { SAFE_DELETE(pCreators[i]); SAFE_DELETE(pHandlers[i]); } } -// Ŷ ڸ ߰Ѵ. +// 패킷 생성자를 추가한다. void MPacketManager::IMPL::addCreator(MPacket* pPacket) { Assert(pPacket != NULL); - // ߺ ˻ + // 중복 검사 if (pCreators[pPacket->getID()] != NULL) { filelog(MOFUS_ERROR_FILE, "MPacketManager::IMPL::addCreator() dup creator"); Assert(false); } - // ڸ ߰Ѵ. + // 생성자를 추가한다. pCreators[pPacket->getID()] = pPacket; } -// Ŷ ڵ鷯 ߰Ѵ. +// 패킷 핸들러를 추가한다. void MPacketManager::IMPL::addHandler(MPacketHandler* pHandler) { Assert(pHandler != NULL); - // ߺ ˻ + // 중복 검사 if (pHandlers[pHandler->getID()] != NULL) { filelog(MOFUS_ERROR_FILE, "MPacketManager::IMPL::addHandler() dup handler"); Assert(false); } - // ڵ鷯 ߰Ѵ. + // 핸들러를 추가한다. pHandlers[pHandler->getID()] = pHandler; } diff --git a/src/server/gameserver/mofus/MPacketManager.h b/src/server/gameserver/mofus/MPacketManager.h index 48986481..2a5544f7 100644 --- a/src/server/gameserver/mofus/MPacketManager.h +++ b/src/server/gameserver/mofus/MPacketManager.h @@ -23,27 +23,27 @@ class MPacketManager { void init(); public: - // Ŷ ڸ ߰Ѵ. + // 패킷 생성자를 추가한다. void addCreator(MPacket* pPacket); - // Ŷ ڵ鷯 ߰Ѵ. + // 패킷 핸들러를 추가한다. void addHandler(MPacketHandler* pHandler); public: - // ο Ŷ ؼ ȯѴ. + // 새로운 패킷을 생성해서 반환한다. MPacket* createPacket(MPacketID_t ID) const; - // Ŷ ڵ鷯 Ѵ. + // 패킷의 핸들러를 실행한다. void execute(MPlayer* pPlayer, MPacket* pPacket); - // Ŷ ڵ鷯 ִ ȮѴ. + // 패킷의 핸들러가 있는지 확인한다. bool hasHandler(MPacketID_t ID) const; - // Ŷ ũ⸦ ȯѴ. + // 패킷의 크기를 반환한다. MPacketSize_t getPacketSize(MPacketID_t ID) const; private: - // + // 내부 구현 데이터 struct IMPL; IMPL* m_pImpl; }; diff --git a/src/server/gameserver/mofus/MPlayer.h b/src/server/gameserver/mofus/MPlayer.h index e89f592f..bea1b3d9 100644 --- a/src/server/gameserver/mofus/MPlayer.h +++ b/src/server/gameserver/mofus/MPlayer.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : MPlayer.h -// Desc : ۽ ü +// Desc : 모퍼스 통신 객체 ///////////////////////////////////////////////////////////////////////////// #ifndef __MPLAYER_H__ @@ -43,7 +43,7 @@ class MPlayer : public Player { void process(); /////////////////////////////////////////////// - // send Լ + // send 함수 /////////////////////////////////////////////// void sendConnectAsk(); void sendLogout(); @@ -63,11 +63,11 @@ class MPlayer : public Player { // set errorcode void setErrorCode(int errorCode); - // ۾ + // 작업 끝 void setEnd(bool bEnd = true); private: - // ó ۾ + // 처리할 작업 MJob* m_pJob; }; diff --git a/src/server/gameserver/mofus/Mofus.cpp b/src/server/gameserver/mofus/Mofus.cpp index a07b40d2..460f43a3 100644 --- a/src/server/gameserver/mofus/Mofus.cpp +++ b/src/server/gameserver/mofus/Mofus.cpp @@ -22,7 +22,7 @@ int loadPowerPoint(const string& name) { powerpoint = pResult->getInt(1); } } catch (SQLQueryException& sql) { - // SQL Ѵ. + // SQL 에러는 무시한다. } catch (...) { SAFE_DELETE(pStmt); @@ -58,7 +58,7 @@ int savePowerPoint(const string& name, int amount) { powerpoint = pResult->getInt(1); } } catch (SQLQueryException& sql) { - // SQL Ѵ. + // SQL 에러는 무시한다. } catch (...) { SAFE_DELETE(pStmt); @@ -83,7 +83,7 @@ void logPowerPoint(const string& name, int recvPoint, int savePoint) { "INSERT INTO MofusLog (OwnerID, SaveTime, RecvPoint, SavePoint) VALUES ('%s', now(), %u, %u)", name.c_str(), recvPoint, savePoint); } catch (SQLQueryException& sql) { - // SQL Ѵ. + // SQL 에러는 무시한다. } catch (...) { SAFE_DELETE(pStmt); diff --git a/src/server/gameserver/mofus/Mofus.h b/src/server/gameserver/mofus/Mofus.h index c9557032..8bcf3a83 100644 --- a/src/server/gameserver/mofus/Mofus.h +++ b/src/server/gameserver/mofus/Mofus.h @@ -1,16 +1,16 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : Mofus.h -// Desc : ۽ +// Desc : 모퍼스 헤더 ///////////////////////////////////////////////////////////////////////////// #include "Types.h" -// ۽ . ۽ ȴ. +// 모퍼스 정의. 켜져있으면 모퍼스 모듈이 실행된다. #if defined(__METRO_SERVER__) #define __MOFUS__ #endif -// α׿ +// 로그용 파일 #define MOFUS_ERROR_FILE "mofus_error.txt" #define MOFUS_LOG_FILE "mofus_log.txt" #define MOFUS_PACKET_FILE "mofus_packet.txt" diff --git a/src/server/gameserver/mofus/PKTConnectAccept.cpp b/src/server/gameserver/mofus/PKTConnectAccept.cpp index 0cd14c20..a67f8195 100644 --- a/src/server/gameserver/mofus/PKTConnectAccept.cpp +++ b/src/server/gameserver/mofus/PKTConnectAccept.cpp @@ -1,17 +1,17 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : PKTConnectAccept.cpp -// Desc : ӵǾ Ŷ ˷ش. +// Desc : 정상적으로 접속되었음을 패킷으로 알려준다. ///////////////////////////////////////////////////////////////////////////// // include files #include "PKTConnectAccept.h" -// +// 생성자 PKTConnectAccept::PKTConnectAccept() { nSize = szPKTConnectAccept - szMPacketSize; } -// Է Ʈκ ͸ о Ŷ ʱȭ Ѵ. +// 입력 스트림으로부터 데이터를 읽어서 패킷을 초기화 한다. void PKTConnectAccept::read(SocketInputStream& iStream) { iStream.read((char*)this, szPKTConnectAccept); @@ -20,7 +20,7 @@ void PKTConnectAccept::read(SocketInputStream& iStream) { // nCode = ntohl( nCode ); } -// Ʈ Ŷ ̳ʸ ̹ . +// 출력 스트림으로 패킷의 바이너리 이미지를 보낸다. void PKTConnectAccept::write(SocketOutputStream& oStream) { nCode = getID(); diff --git a/src/server/gameserver/mofus/PKTConnectAccept.h b/src/server/gameserver/mofus/PKTConnectAccept.h index 6445d9fc..d047ee1c 100644 --- a/src/server/gameserver/mofus/PKTConnectAccept.h +++ b/src/server/gameserver/mofus/PKTConnectAccept.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : PKTConnectAccept.h -// Desc : ӵǾ Ŷ ˷ش. +// Desc : 정상적으로 접속되었음을 패킷으로 알려준다. ///////////////////////////////////////////////////////////////////////////// #ifndef __PKT_CONNECT_ACCEPT_H__ @@ -10,10 +10,10 @@ #include "Assert.h" #include "MPacket.h" -// Ŷ +// 패킷 구조 struct _PKT_CONNECT_ACCEPT { - int nSize; // Ŷ ü ũ - int nCode; // Ŷ ڵ + int nSize; // 패킷 전체의 크리 + int nCode; // 패킷 코드 }; const int szPKTConnectAccept = sizeof(_PKT_CONNECT_ACCEPT); @@ -21,29 +21,29 @@ const int szPKTConnectAccept = sizeof(_PKT_CONNECT_ACCEPT); // class PKTConnectAccept class PKTConnectAccept : public _PKT_CONNECT_ACCEPT, public MPacket { public: - // + // 생성자 PKTConnectAccept(); public: - // Ŷ ̵ ȯѴ. + // 패킷 아이디를 반환한다. MPacketID_t getID() const; - // Ŷ ũ⸦ ȯѴ. + // 패킷의 크기를 반환한다. MPacketSize_t getSize() const { return szPKTConnectAccept - szMPacketSize; } - // ο Ŷ ؼ ȯѴ. + // 새로운 패킷을 생성해서 반환한다. MPacket* create() { MPacket* pPacket = new PKTConnectAccept; Assert(pPacket != NULL); return pPacket; } - // Է Ʈκ ͸ о Ŷ ʱȭ Ѵ. + // 입력 스트림으로부터 데이터를 읽어서 패킷을 초기화 한다. void read(SocketInputStream& iStream); - // Ʈ Ŷ ̳ʸ ̹ . + // 출력 스트림으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream); // debug message diff --git a/src/server/gameserver/mofus/PKTConnectAcceptHandler.cpp b/src/server/gameserver/mofus/PKTConnectAcceptHandler.cpp index bad7e226..4abec533 100644 --- a/src/server/gameserver/mofus/PKTConnectAcceptHandler.cpp +++ b/src/server/gameserver/mofus/PKTConnectAcceptHandler.cpp @@ -11,7 +11,7 @@ #include "Mofus.h" -// Լ +// 실행 함수 void PKTConnectAcceptHandler::execute(MPlayer* pPlayer, MPacket* pPacket) { cout << "--------------------------------------------------" << endl; cout << "RECV [" << pPlayer->getJob()->getName() << "] ConnectAccept" << endl; @@ -20,6 +20,6 @@ void PKTConnectAcceptHandler::execute(MPlayer* pPlayer, MPacket* pPacket) { filelog(MOFUS_LOG_FILE, "RECV [%s] ConnectAccept", pPlayer->getJob()->getName().c_str()); filelog(MOFUS_PACKET_FILE, "RECV : [%s] %s", pPlayer->getJob()->getName().c_str(), pPacket->toString().c_str()); - // û. ĿƮ + // 유저 인포를 요청. 파워포인트 가져오기 pPlayer->sendUserInfo(); } diff --git a/src/server/gameserver/mofus/PKTConnectAcceptHandler.h b/src/server/gameserver/mofus/PKTConnectAcceptHandler.h index f7988826..9c98bcf5 100644 --- a/src/server/gameserver/mofus/PKTConnectAcceptHandler.h +++ b/src/server/gameserver/mofus/PKTConnectAcceptHandler.h @@ -12,10 +12,10 @@ // class PKTConnectAcceptHandler class PKTConnectAcceptHandler : public MPacketHandler { public: - // ش Ŷ ID + // 해당 패킷의 ID MPacketID_t getID() const; - // Լ + // 실행 함수 void execute(MPlayer* pPlayer, MPacket* pPacket); }; diff --git a/src/server/gameserver/mofus/PKTConnectAsk.cpp b/src/server/gameserver/mofus/PKTConnectAsk.cpp index 32783128..fbc43557 100644 --- a/src/server/gameserver/mofus/PKTConnectAsk.cpp +++ b/src/server/gameserver/mofus/PKTConnectAsk.cpp @@ -1,19 +1,19 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : PKTConnectAsk.cpp -// Desc : ¶ Ŀ¯ ڻ ڵ Բ -// ûѴ. +// Desc : 온라인 게임 서버가 파워짱 서버에 자사의 게임 코드와 함께 +// 접속을 요청한다. ///////////////////////////////////////////////////////////////////////////// // include files #include "PKTConnectAsk.h" -// +// 생성자 PKTConnectAsk::PKTConnectAsk() { nSize = szPKTConnectAsk - szMPacketSize; nOnGameCode = 10; } -// Է Ʈκ ͸ о Ŷ ʱȭ Ѵ. +// 입력 스트림으로부터 데이터를 읽어서 패킷을 초기화 한다. void PKTConnectAsk::read(SocketInputStream& iStream) { iStream.read((char*)this, szPKTConnectAsk); @@ -23,7 +23,7 @@ void PKTConnectAsk::read(SocketInputStream& iStream) { // nOnGameCode = ntohl( nOnGameCode ); } -// Ʈ Ŷ ̳ʸ ̹ . +// 출력 스트림으로 패킷의 바이너리 이미지를 보낸다. void PKTConnectAsk::write(SocketOutputStream& oStream) { nCode = getID(); diff --git a/src/server/gameserver/mofus/PKTConnectAsk.h b/src/server/gameserver/mofus/PKTConnectAsk.h index 19161128..10094db8 100644 --- a/src/server/gameserver/mofus/PKTConnectAsk.h +++ b/src/server/gameserver/mofus/PKTConnectAsk.h @@ -1,7 +1,7 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : PKTConnectAsk.h -// Desc : ¶ Ŀ¯ ڻ ڵ Բ -// ûѴ. +// Desc : 온라인 게임 서버가 파워짱 서버에 자사의 게임 코드와 함께 +// 접속을 요청한다. ///////////////////////////////////////////////////////////////////////////// #ifndef __PKT_CONNECT_ASK_H__ @@ -11,11 +11,11 @@ #include "Assert.h" #include "MPacket.h" -// Ŷ +// 패킷 구조 struct _PKT_CONNECT_ASK { - int nSize; // Ŷ ü ũ - int nCode; // Ŷ ڵ - int nOnGameCode; // ۽ ߱ ¶λ ڵ + int nSize; // 패킷 전체의 크기 + int nCode; // 패킷 코드 + int nOnGameCode; // 모퍼스에서 발급한 온라인사 게임 코드 값 }; const int szPKTConnectAsk = sizeof(_PKT_CONNECT_ASK); @@ -23,29 +23,29 @@ const int szPKTConnectAsk = sizeof(_PKT_CONNECT_ASK); // class PKTConnectASK class PKTConnectAsk : public _PKT_CONNECT_ASK, public MPacket { public: - // + // 생성자 PKTConnectAsk(); public: - // Ŷ ̵ ȯѴ. + // 패킷 아이디를 반환한다. MPacketID_t getID() const; - // Ŷ ũ⸦ ȯѴ. + // 패킷의 크기를 반환한다. MPacketSize_t getSize() const { return szPKTConnectAsk - szMPacketSize; } - // ο Ŷ ؼ ȯ + // 새로운 패킷을 생성해서 반환 MPacket* create() { MPacket* pPacket = new PKTConnectAsk; Assert(pPacket != NULL); return pPacket; } - // Է Ʈκ ͸ о Ŷ ʱȭ Ѵ. + // 입력 스트림으로부터 데이터를 읽어서 패킷을 초기화 한다. void read(SocketInputStream& iStream); - // Ʈ Ŷ ̳ʸ ̹ . + // 출력 스트림으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream); // debug message diff --git a/src/server/gameserver/mofus/PKTError.cpp b/src/server/gameserver/mofus/PKTError.cpp index d1b96e4d..ae415914 100644 --- a/src/server/gameserver/mofus/PKTError.cpp +++ b/src/server/gameserver/mofus/PKTError.cpp @@ -1,8 +1,8 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : PKTError.cpp -// Desc : Ŀ¯ ؼ ȴ. -// ¶ ϰ óϰ κ -// ׿ +// Desc : 파워짱 서버에서 에러에 대한 결과를 보내기 위해서 사용된다. +// 온라인 서버에서는 서버 오류로 일관 처리하고 대부분 +// 디버그용으로 사용 ///////////////////////////////////////////////////////////////////////////// // include files @@ -10,12 +10,12 @@ #include "MPacketID.h" -// +// 생성자 PKTError::PKTError() { nSize = szPKTError - szMPacketSize; } -// Է Ʈκ ͸ о Ŷ ʱȭ Ѵ. +// 입력 스트림으로부터 데이터를 읽어서 패킷을 초기화 한다. void PKTError::read(SocketInputStream& iStream) { iStream.read((char*)this, szPKTError); @@ -25,7 +25,7 @@ void PKTError::read(SocketInputStream& iStream) { // nError = ntohl( nError ); } -// Ʈ Ŷ ̳ʸ ̹ . +// 출력 스트림으로 패킷의 바이너리 이미지를 보낸다. void PKTError::write(SocketOutputStream& oStream) { nCode = getID(); diff --git a/src/server/gameserver/mofus/PKTError.h b/src/server/gameserver/mofus/PKTError.h index a663d60f..a2767de4 100644 --- a/src/server/gameserver/mofus/PKTError.h +++ b/src/server/gameserver/mofus/PKTError.h @@ -1,8 +1,8 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : PKTError.h -// Desc : Ŀ¯ ؼ ȴ. -// ¶ ϰ óϰ κ -// ׿ +// Desc : 파워짱 서버에서 에러에 대한 결과를 보내기 위해서 사용된다. +// 온라인 서버에서는 서버 오류로 일관 처리하고 대부분 +// 디버그용으로 사용 ///////////////////////////////////////////////////////////////////////////// #ifndef __PKT_ERROR_H__ @@ -12,25 +12,25 @@ #include "Assert.h" #include "MPacket.h" -// ڵ +// 에러 코드 enum MERR_CODE { - MERR_SERVER = 0x01, // - // ϴ Ȳ - MERR_CONFIRM = 0x02, // ¶ ڵ Ȯ - MERR_PACKET = 0x03, // ߸ Ŷ /ŵ - MERR_PROCESS = 0x04, // ó ( ex: DB ) - MERR_SEARCH = 0x05, // Ŀ¯ ȸ ƴ - MERR_NULLPOINT = 0x06, // Ŀ¯ ȸ̳ Ŀ¯ Ʈ - // - MERR_MATCHING = 0x07, // Ī (ex: ȸ Ī ) - // Ȩ Ī ϴ . + MERR_SERVER = 0x01, // 서버는 살아 있으나 현재 정상적으로 + // 동작하지 못하는 상황 + MERR_CONFIRM = 0x02, // 온라인 게임 코드로 확인 이 실패할 경우 + MERR_PACKET = 0x03, // 잘못된 패킷이 송/수신된 경우 + MERR_PROCESS = 0x04, // 서버 처리 오류 ( ex: DB 오류 ) + MERR_SEARCH = 0x05, // 파워짱 회원이 아닌 경우 + MERR_NULLPOINT = 0x06, // 파워짱 회원이나 누적된 파워짱 포인트가 + // 없는 경우 + MERR_MATCHING = 0x07, // 매칭 정보 오류 (ex: 회원 매칭 정보가 없음) + // 홈페이지에서 매칭을 유도하는 문장을 전송. }; -// Ŷ +// 패킷 구조 struct _PKT_ERROR { - int nSize; // Ŷ ü ũ - int nCode; // Ŷ ڵ - int nError; // ڵ + int nSize; // 패킷 전체의 크기 + int nCode; // 패킷 코드 + int nError; // 에러 코드 }; const int szPKTError = sizeof(_PKT_ERROR); @@ -38,29 +38,29 @@ const int szPKTError = sizeof(_PKT_ERROR); // class PKTError class PKTError : public _PKT_ERROR, public MPacket { public: - // + // 생성자 PKTError(); public: - // Ŷ ̵ ȯѴ. + // 패킷 아이디를 반환한다. MPacketID_t getID() const; - // Ŷ ũ⸦ ȯѴ. + // 패킷의 크기를 반환한다. MPacketSize_t getSize() const { return szPKTError - szMPacketSize; } - // ο Ŷ ؼ ȯ + // 새로운 패킷을 생성해서 반환 MPacket* create() { MPacket* pPacket = new PKTError; Assert(pPacket != NULL); return pPacket; } - // Է Ʈκ ͸ о Ŷ ʱȭ Ѵ. + // 입력 스트림으로부터 데이터를 읽어서 패킷을 초기화 한다. void read(SocketInputStream& iStream); - // Ʈ Ŷ ̳ʸ ̹ . + // 출력 스트림으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream); // debug message diff --git a/src/server/gameserver/mofus/PKTErrorHandler.cpp b/src/server/gameserver/mofus/PKTErrorHandler.cpp index 9fd7a01a..09f4b8d0 100644 --- a/src/server/gameserver/mofus/PKTErrorHandler.cpp +++ b/src/server/gameserver/mofus/PKTErrorHandler.cpp @@ -13,7 +13,7 @@ #include "PKTError.h" -// Լ +// 실행 함수 void PKTErrorHandler::execute(MPlayer* pPlayer, MPacket* pPacket) { PKTError* pError = dynamic_cast(pPacket); Assert(pError != NULL); @@ -25,12 +25,12 @@ void PKTErrorHandler::execute(MPlayer* pPlayer, MPacket* pPacket) { filelog(MOFUS_LOG_FILE, "RECV [%s] Error : %d", pPlayer->getJob()->getName().c_str(), pError->nError); filelog(MOFUS_PACKET_FILE, "RECV : [%s] %s", pPlayer->getJob()->getName().c_str(), pPacket->toString().c_str()); - // ڵ带 + // 에러 코드를 세팅 pPlayer->setErrorCode(pError->getErrorCode()); - // α׾ƿ + // 로그아웃 보내기 pPlayer->sendLogout(); - // ۾ + // 작업 끝 pPlayer->setEnd(); } diff --git a/src/server/gameserver/mofus/PKTErrorHandler.h b/src/server/gameserver/mofus/PKTErrorHandler.h index 5f72fff6..2a749eb4 100644 --- a/src/server/gameserver/mofus/PKTErrorHandler.h +++ b/src/server/gameserver/mofus/PKTErrorHandler.h @@ -12,10 +12,10 @@ // class PKTErrorHandler class PKTErrorHandler : public MPacketHandler { public: - // ش Ŷ ID + // 해당 패킷의 ID MPacketID_t getID() const; - // Լ + // 실행 함수 void execute(MPlayer* pPlayer, MPacket* pPacket); }; diff --git a/src/server/gameserver/mofus/PKTLogout.cpp b/src/server/gameserver/mofus/PKTLogout.cpp index 610906c7..fd84e01d 100644 --- a/src/server/gameserver/mofus/PKTLogout.cpp +++ b/src/server/gameserver/mofus/PKTLogout.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : PKTLogout.cpp -// Desc : Ѵ. +// Desc : 접소을 종료함을 통지한다. ///////////////////////////////////////////////////////////////////////////// // include files @@ -8,12 +8,12 @@ #include "MPacketID.h" -// +// 생성자 PKTLogout::PKTLogout() { nSize = szPKTLogout - szMPacketSize; } -// Է Ʈκ ͸ о Ŷ ʱȭ Ѵ. +// 입력 스트림으로부터 데이터를 읽어서 패킷을 초기화 한다. void PKTLogout::read(SocketInputStream& iStream) { iStream.read((char*)this, szPKTLogout); @@ -22,7 +22,7 @@ void PKTLogout::read(SocketInputStream& iStream) { // nCode = ntohl( nCode ); } -// Ʈ Ŷ ̳ʸ ̹ . +// 출력 스트림으로 패킷의 바이너리 이미지를 보낸다. void PKTLogout::write(SocketOutputStream& oStream) { nCode = getID(); diff --git a/src/server/gameserver/mofus/PKTLogout.h b/src/server/gameserver/mofus/PKTLogout.h index f9d1c193..19b9b74d 100644 --- a/src/server/gameserver/mofus/PKTLogout.h +++ b/src/server/gameserver/mofus/PKTLogout.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : PKTLogout.h -// Desc : Ѵ. +// Desc : 접속을 종료함을 통지한다. ///////////////////////////////////////////////////////////////////////////// #ifndef __PKT_LOGOUT_H__ @@ -10,10 +10,10 @@ #include "Assert.h" #include "MPacket.h" -// Ŷ +// 패킷 구조 struct _PKT_LOGOUT { - int nSize; // Ŷ ü ũ - int nCode; // Ŷ ڵ + int nSize; // 패킷 전체의 크기 + int nCode; // 패킷 코드 }; const int szPKTLogout = sizeof(_PKT_LOGOUT); @@ -21,29 +21,29 @@ const int szPKTLogout = sizeof(_PKT_LOGOUT); // class PKTLogout class PKTLogout : public _PKT_LOGOUT, public MPacket { public: - // + // 생성자 PKTLogout(); public: - // Ŷ ̵ ȯѴ. + // 패킷 아이디를 반환한다. MPacketID_t getID() const; - // Ŷ ũ⸦ ȯѴ. + // 패킷의 크기를 반환한다. MPacketSize_t getSize() const { return szPKTLogout - szMPacketSize; } - // ο Ŷ ؼ ȯ + // 새로운 패킷을 생성해서 반환 MPacket* create() { MPacket* pPacket = new PKTLogout; Assert(pPacket != NULL); return pPacket; } - // Է Ʈκ ͸ о Ŷ ʱȭ Ѵ. + // 입력 스트림으로부터 데이터를 읽어서 패킷을 초기화 한다. void read(SocketInputStream& iStream); - // Ʈ Ŷ ̳ʸ ̹ . + // 출력 스트림으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream); // debug message diff --git a/src/server/gameserver/mofus/PKTPowerPoint.cpp b/src/server/gameserver/mofus/PKTPowerPoint.cpp index 6ee52f24..89b99b65 100644 --- a/src/server/gameserver/mofus/PKTPowerPoint.cpp +++ b/src/server/gameserver/mofus/PKTPowerPoint.cpp @@ -1,7 +1,7 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : PKTPowerPoint.cpp -// Desc : ¶ κ ۵Ǿ ͸ Ŀ DB -// ¶λ Ѱش. +// Desc : 온라인 게임으로부터 전송되어온 데이터를 통해 파워링 DB에서 +// 추훌한 값을 온라인사로 넘겨준다. ///////////////////////////////////////////////////////////////////////////// // include files @@ -9,14 +9,14 @@ #include "MPacketID.h" -// +// 생성자 PKTPowerPoint::PKTPowerPoint() { // memset( this, 0, szPKTPowerPoint ); nSize = szPKTPowerPoint - szMPacketSize; } -// Է Ʈκ ͸ о Ŷ ʱȭ Ѵ. +// 입력 스트림으로부터 데이터를 읽어서 패킷을 초기화 한다. void PKTPowerPoint::read(SocketInputStream& iStream) { iStream.read((char*)this, szPKTPowerPoint); @@ -34,7 +34,7 @@ void PKTPowerPoint::read(SocketInputStream& iStream) { // nIndex = ntohl( nIndex ); } -// Ʈ Ŷ ̳ʸ ̹ . +// 출력 스트림으로 패킷의 바이너리 이미지를 보낸다. void PKTPowerPoint::write(SocketOutputStream& oStream) { nCode = getID(); diff --git a/src/server/gameserver/mofus/PKTPowerPoint.h b/src/server/gameserver/mofus/PKTPowerPoint.h index 04c9b7c7..560ffc21 100644 --- a/src/server/gameserver/mofus/PKTPowerPoint.h +++ b/src/server/gameserver/mofus/PKTPowerPoint.h @@ -1,7 +1,7 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : PKTPowerPoint.h -// Desc : ¶ κ ۵Ǿ ͸ Ŀ DB -// ¶λ Ѱش. +// Desc : 온라인 게임으로부터 전송되어온 데이터를 통해 파워링 DB에서 +// 추훌한 값을 온라인사로 넘겨준다. ///////////////////////////////////////////////////////////////////////////// #ifndef __PKT_POWERPOINT_H__ @@ -11,28 +11,28 @@ #include "Assert.h" #include "MPacket.h" -// Ŷ +// 패킷 구조 struct _PKT_POWERPOINT { int nSize; int nCode; - int nMoDataCode; // ڷ ó Index, Unique - char sPhoneNo[12]; // Ŀ Ʈ ڵ ȣ - char sMemID[20]; // Ŀ ID - int nMatchingCode; // Ŀ ̺ Ī ڵ - char sMoGameName[20]; // ¶ Ӱ Ӹ - int nMoGameCode; // ¶ Ӱ ڵ - int nOnGameCode; // ¶ ڵ - char sOnGameName[20]; // ¶ Ӹ - int nOnGameSerCode; // ¶ ڵ - char sOnGameSerName[20]; // ¶ - char sOnGameID[20]; // ¶ ̵ - char sCharName[40]; // ¶ ij͸ - int nOnAbilityCode; // ¶ ɷġ ڵ - char sOnAbilityName[20]; // ¶ ɷġ - int nPowerPoint; // Ŀ Ʈ - char sInputDate[20]; // Ϸ Է Ŀ Ʈ Է ð - int nIndex; // ¶λ Ǹ ε - int nContinue; // . 1:. 0: + int nMoDataCode; // 자료 처리를 위한 Index, Unique 값 + char sPhoneNo[12]; // 파워링 포인트를 등록한 유저의 핸드폰 번호 + char sMemID[20]; // 파워링 유저 계정 ID + int nMatchingCode; // 파워링 테이블내 매칭 코드 + char sMoGameName[20]; // 온라인 게임과 연동된 모바일 게임명 + int nMoGameCode; // 온라인 게임과 연동되 모바일 게임코드 + int nOnGameCode; // 온라인 게임 코드 + char sOnGameName[20]; // 온라인 게임명 + int nOnGameSerCode; // 온라인 게임 서버 코드 + char sOnGameSerName[20]; // 온라인 게임 서버 명 + char sOnGameID[20]; // 온라인 게임 아이디 + char sCharName[40]; // 온라인 게임 캐릭터명 + int nOnAbilityCode; // 온라인 게임 적용 능력치 코드 + char sOnAbilityName[20]; // 온라인 게임 적용 능력치명 + int nPowerPoint; // 유저가 전송한 파워링 포인트 + char sInputDate[20]; // 유저가 모바일로 입력한 파워링 포인트 입력 시간 + int nIndex; // 온라인사의 편의를 위한 인덱스 + int nContinue; // 다음 데이터 유무. 1:있음. 0:없음 }; const int szPKTPowerPoint = sizeof(_PKT_POWERPOINT); @@ -40,29 +40,29 @@ const int szPKTPowerPoint = sizeof(_PKT_POWERPOINT); // class PKTPowerPoint class PKTPowerPoint : public _PKT_POWERPOINT, public MPacket { public: - // + // 생성자 PKTPowerPoint(); public: - // Ŷ ̵ ȯѴ. + // 패킷 아이디를 반환한다. MPacketID_t getID() const; - // Ŷ ũ⸦ ȯѴ. + // 패킷의 크기를 반환한다. MPacketSize_t getSize() const { return szPKTPowerPoint - szMPacketSize; } - // ο Ŷ ؼ ȯ + // 새로운 패킷을 생성해서 반환 MPacket* create() { MPacket* pPacket = new PKTPowerPoint; Assert(pPacket != NULL); return pPacket; } - // Է Ʈκ ͸ о Ŷ ʱȭ Ѵ. + // 입력 스트림으로부터 데이터를 읽어서 패킷을 초기화 한다. void read(SocketInputStream& iStream); - // Ʈ Ŷ ̳ʸ ̹ . + // 출력 스트림으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream); // debug message diff --git a/src/server/gameserver/mofus/PKTPowerPointHandler.cpp b/src/server/gameserver/mofus/PKTPowerPointHandler.cpp index 282ecebe..c510e32f 100644 --- a/src/server/gameserver/mofus/PKTPowerPointHandler.cpp +++ b/src/server/gameserver/mofus/PKTPowerPointHandler.cpp @@ -15,7 +15,7 @@ #include "PKTSError.h" #include "Properties.h" -// Լ +// 실행 함수 void PKTPowerPointHandler::execute(MPlayer* pPlayer, MPacket* pPacket) { PKTPowerPoint* pPowerPoint = dynamic_cast(pPacket); Assert(pPowerPoint != NULL); @@ -30,14 +30,14 @@ void PKTPowerPointHandler::execute(MPlayer* pPlayer, MPacket* pPacket) { filelog(MOFUS_PACKET_FILE, "RECV : [%s] %s", pPlayer->getJob()->getName().c_str(), pPacket->toString().c_str()); ////////////////////////////////////////////////////////////////////// - // Ŷ Ȯ. + // 받은 패킷 확인. ////////////////////////////////////////////////////////////////////// static int MofusServerCode = g_pConfig->getPropertyInt("MofusServerCode"); - // ڵ Ȯ + // 게임 코드 확인 bool bCheckGameCode = (pPowerPoint->getGameCode() == 1); - // ڵ Ȯ + // 서버 코드 확인 bool bCheckGameServerCode = (pPowerPoint->getGameServerCode() == MofusServerCode); - // ij ̸ Ȯ + // 캐릭터 이름 확인 bool bCheckCharacterName = (strcasecmp(pPlayer->getJob()->getName().c_str(), pPowerPoint->getCharacterName()) == 0); if (!bCheckGameCode || !bCheckGameServerCode || !bCheckCharacterName) { @@ -51,53 +51,53 @@ void PKTPowerPointHandler::execute(MPlayer* pPlayer, MPacket* pPacket) { pPlayer->getJob()->getName().c_str(), pPowerPoint->getCharacterName(), MofusServerCode, pPowerPoint->getGameServerCode()); - // Ī Ȯ - // Ŀ¯ Ȯ и ˸. + // 매칭 정보 확인 실패 + // 파워짱 서버로 확인 실패를 알린다. pPlayer->sendSError(MSERR_MATCH); - // ڿԴ Ī ˸. + // 사용자에게는 매칭 정보 오류로 알린다. pPlayer->setErrorCode(MERR_MATCHING); - // ۾ + // 작업 끝 pPlayer->setEnd(); return; } ////////////////////////////////////////////////////////////////////// - // Ŀ Ʈ - // 1ȸ ۽ ִ Ŀ¯ Ʈ. - // Ŀ¯ 60 Ʈ ׿ ְ 60 Ʈ ޾Ұ - // 1ȸ ۽ ִ Ŀ¯ Ʈ 20 - // 20 Ͽ ϰ 40 . - // ڴ Ŀ¯ ִ 60 Ʈ - // ũ DB 20 Ʈ Ǿ ִ. + // 파워 포인트 저장 + // 1회 전송시 적용할 최대 파워짱 포인트. + // 만일 파워짱 서버에 60 포인트가 쌓여 있고 60 포인트를 모두 받았고 + // 1회 전송시 적용할 최대 파워짱 포인트가 20 일 경우 + // 20 만 적용하여 누적하고 나머지 40 은 버린다. + // 결과적으로 사용자는 파워짱 서버에 있는 60 포인트는 모두 없어지고 + // 다크에덴 DB 에는 20 포인트만 누적되어 있다. static int MaxPowerPoint = 40; - // 1ȸ ۽ ִ Ŀ¯ Ʈ + // 1회 전송시 적용할 최대 파워짱 포인트 적용 int savepowerpoint = min(pPowerPoint->getPowerPoint(), MaxPowerPoint); - // Ŀ Ʈ DB Ͽ + // 가져온 파워 포인트를 DB에 누적하여 저장 savePowerPoint(pPlayer->getJob()->getName(), savepowerpoint); - // α + // 파일 로그 filelog(MOFUS_LOG_FILE, "SAVE PowerPoint (name:%s,savepoint:%d,recvpoint:%d)", pPlayer->getJob()->getName().c_str(), savepowerpoint, pPowerPoint->getPowerPoint()); logPowerPoint(pPlayer->getJob()->getName(), pPowerPoint->getPowerPoint(), savepowerpoint); - // Ŀ Ʈ + // 받은 파워 포인트를 누적 pPlayer->addPowerPoint(savepowerpoint); - // ó ߴٴ Ŀ¯ ˸. + // 처리 했다는 결과를 파워짱 서버에 알린다. if (pPowerPoint->isContinue()) { - // ۾ ִ. + // 작업이 더 있다. pPlayer->sendReceiveOK(); } else { pPlayer->sendResult(); pPlayer->sendLogout(); - // ۾ ̴. + // 작업 끝이다. pPlayer->setEnd(); } } diff --git a/src/server/gameserver/mofus/PKTPowerPointHandler.h b/src/server/gameserver/mofus/PKTPowerPointHandler.h index 40270fb1..85d3987f 100644 --- a/src/server/gameserver/mofus/PKTPowerPointHandler.h +++ b/src/server/gameserver/mofus/PKTPowerPointHandler.h @@ -12,10 +12,10 @@ // class PKTPowerPointHandler class PKTPowerPointHandler : public MPacketHandler { public: - // ش Ŷ ID + // 해당 패킷의 ID MPacketID_t getID() const; - // Լ + // 실행 함수 void execute(MPlayer* pPlayer, MPacket* pPacket); }; diff --git a/src/server/gameserver/mofus/PKTReceiveOK.cpp b/src/server/gameserver/mofus/PKTReceiveOK.cpp index b1f5ae74..2d76daa6 100644 --- a/src/server/gameserver/mofus/PKTReceiveOK.cpp +++ b/src/server/gameserver/mofus/PKTReceiveOK.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : PKTReceiveOK.cpp -// Desc : ڷῡ ó θ Ŀ Ѵ. +// Desc : 받은 자료에 대한 처리 여부를 파워링 서버에 답신한다. ///////////////////////////////////////////////////////////////////////////// // include files @@ -8,12 +8,12 @@ #include "MPacketID.h" -// +// 생성자 PKTReceiveOK::PKTReceiveOK() { nSize = szPKTReceiveOK - szMPacketSize; } -// Է Ʈκ ͸ о Ŷ ʱȭ Ѵ. +// 입력 스트림으로부터 데이터를 읽어서 패킷을 초기화 한다. void PKTReceiveOK::read(SocketInputStream& iStream) { iStream.read((char*)this, szPKTReceiveOK); @@ -22,7 +22,7 @@ void PKTReceiveOK::read(SocketInputStream& iStream) { // nCode = ntohl( nCode ); } -// Ʈ Ŷ ̳ʸ ̹ . +// 출력 스트림으로 패킷의 바이너리 이미지를 보낸다. void PKTReceiveOK::write(SocketOutputStream& oStream) { nCode = getID(); diff --git a/src/server/gameserver/mofus/PKTReceiveOK.h b/src/server/gameserver/mofus/PKTReceiveOK.h index c02cada1..2bcc2b7d 100644 --- a/src/server/gameserver/mofus/PKTReceiveOK.h +++ b/src/server/gameserver/mofus/PKTReceiveOK.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : PKTReceiveOK.h -// Desc : ڷῡ ó θ Ŀ Ѵ. +// Desc : 받은 자료에 대한 처리 여부를 파워링 서버에 답신한다. ///////////////////////////////////////////////////////////////////////////// #ifndef __PKT_RECEIVE_OK_H__ @@ -10,10 +10,10 @@ #include "Assert.h" #include "MPacket.h" -// Ŷ +// 패킷구조 struct _PKT_RECEIVE_OK { - int nSize; // Ŷ ü ũ - int nCode; // Ŷ ڵ + int nSize; // 패킷 전체의 크기 + int nCode; // 패킷 코드 }; const int szPKTReceiveOK = sizeof(_PKT_RECEIVE_OK); @@ -21,29 +21,29 @@ const int szPKTReceiveOK = sizeof(_PKT_RECEIVE_OK); // class PKTReceiveOK class PKTReceiveOK : public _PKT_RECEIVE_OK, public MPacket { public: - // + // 생성자 PKTReceiveOK(); public: - // Ŷ ̵ ȯѴ. + // 패킷 아이디를 반환한다. MPacketID_t getID() const; - // Ŷ ũ⸦ ȯѴ. + // 패킷의 크기를 반환한다. MPacketSize_t getSize() const { return szPKTReceiveOK - szMPacketSize; } - // ο Ŷ ؼ ȯ + // 새로운 패킷을 생성해서 반환 MPacket* create() { MPacket* pPacket = new PKTReceiveOK; Assert(pPacket != NULL); return pPacket; } - // Է Ʈκ ͸ о Ŷ ʱȭ Ѵ. + // 입력 스트림으로부터 데이터를 읽어서 패킷을 초기화 한다. void read(SocketInputStream& iStream); - // Ʈ Ŷ ̳ʸ ̹ . + // 출력 스트림으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream); // debug message diff --git a/src/server/gameserver/mofus/PKTResult.cpp b/src/server/gameserver/mofus/PKTResult.cpp index 2cd06ad2..37f9110d 100644 --- a/src/server/gameserver/mofus/PKTResult.cpp +++ b/src/server/gameserver/mofus/PKTResult.cpp @@ -1,7 +1,7 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : PKTResult.cpp -// Desc : ڷῡ ó θ Ŀ -// Ѵ. +// Desc : 마지마긍로 전송 받은 자료에 대한 처리 여부를 파워링 서버에 +// 답신한다. ///////////////////////////////////////////////////////////////////////////// // include files @@ -9,12 +9,12 @@ #include "MPacketID.h" -// +// 생성자 PKTResult::PKTResult() { nSize = szPKTResult - szMPacketSize; } -// Է Ʈκ ͸ о Ŷ ʱȭ Ѵ. +// 입력 스트림으로부터 데이터를 읽어서 패킷을 초기화 한다. void PKTResult::read(SocketInputStream& iStream) { iStream.read((char*)this, szPKTResult); @@ -23,7 +23,7 @@ void PKTResult::read(SocketInputStream& iStream) { // nCode = ntohl( nCode ); } -// Ʈ Ŷ ̳ʸ ̹ . +// 출력 스트림으로 패킷의 바이너리 이미지를 보낸다. void PKTResult::write(SocketOutputStream& oStream) { nCode = getID(); diff --git a/src/server/gameserver/mofus/PKTResult.h b/src/server/gameserver/mofus/PKTResult.h index a6ef6c96..b23c9d46 100644 --- a/src/server/gameserver/mofus/PKTResult.h +++ b/src/server/gameserver/mofus/PKTResult.h @@ -1,7 +1,7 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : PKTResult.h -// Desc : ڷῡ ó θ Ŀ -// Ѵ. +// Desc : 마지막으로 전송 받은 자료에 대한 처리 여부를 파워링 서버에 +// 답신한다. ///////////////////////////////////////////////////////////////////////////// #ifndef __PKT_RESULT_H__ @@ -11,10 +11,10 @@ #include "Assert.h" #include "MPacket.h" -// Ŷ +// 패킷 구조 struct _PKT_RESULT { - int nSize; // Ŷ ü ũ - int nCode; // Ŷ ڵ + int nSize; // 패킷 전체의 크기 + int nCode; // 패킷 코드 }; const int szPKTResult = sizeof(_PKT_RESULT); @@ -22,29 +22,29 @@ const int szPKTResult = sizeof(_PKT_RESULT); // class PKTResult class PKTResult : public _PKT_RESULT, public MPacket { public: - // + // 생성자 PKTResult(); public: - // Ŷ ̵ ȯѴ. + // 패킷 아이디를 반환한다. MPacketID_t getID() const; - // Ŷ ũ⸦ ȯѴ. + // 패킷의 크기를 반환한다. MPacketSize_t getSize() const { return szPKTResult - szMPacketSize; } - // ο Ŷ ؼ ȯ + // 새로운 패킷을 생성해서 반환 MPacket* create() { MPacket* pPacket = new PKTResult; Assert(pPacket != NULL); return pPacket; } - // Է Ʈκ ͸ о Ŷ ʱȭ Ѵ. + // 입력 스트림으로부터 데이터를 읽어서 패킷을 초기화 한다. void read(SocketInputStream& iStream); - // Ʈ Ŷ ̳ʸ ̹ . + // 출력 스트림으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream); // debug message diff --git a/src/server/gameserver/mofus/PKTSError.cpp b/src/server/gameserver/mofus/PKTSError.cpp index f0fb5753..1a681bcb 100644 --- a/src/server/gameserver/mofus/PKTSError.cpp +++ b/src/server/gameserver/mofus/PKTSError.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : PKTSError.cpp -// Desc : ¶ ó ؼ ȴ. +// Desc : 온라인 서버에서 처리 에러에 대한 결과를 보내기 위해서 사용된다. ///////////////////////////////////////////////////////////////////////////// // include files @@ -8,12 +8,12 @@ #include "MPacketID.h" -// +// 생성자 PKTSError::PKTSError() { nSize = szPKTSError - szMPacketSize; } -// Է Ʈκ ͸ о Ŷ ʱȭ Ѵ. +// 입력 스트림으로부터 데이터를 읽어서 패킷을 초기화 한다. void PKTSError::read(SocketInputStream& iStream) { iStream.read((char*)this, szPKTSError); @@ -23,7 +23,7 @@ void PKTSError::read(SocketInputStream& iStream) { // nError = ntohl( nError ); } -// Ʈ Ŷ ̳ʸ ̹ . +// 출력 스트림으로 패킷의 바이너리 이미지를 보낸다. void PKTSError::write(SocketOutputStream& oStream) { nCode = getID(); diff --git a/src/server/gameserver/mofus/PKTSError.h b/src/server/gameserver/mofus/PKTSError.h index 9fb76f5d..3a8dd13a 100644 --- a/src/server/gameserver/mofus/PKTSError.h +++ b/src/server/gameserver/mofus/PKTSError.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : PKTSError.h -// Desc : ¶ ó ؼ ȴ. +// Desc : 온라인 서버에서 처리 에러에 대한 결과를 보내기 위해서 사용된다. ///////////////////////////////////////////////////////////////////////////// #ifndef __PKT_SERROR_H__ @@ -10,18 +10,18 @@ #include "Assert.h" #include "MPacket.h" -// ڵ +// 에러 코드 enum MSERR_CODE { - MSERR_MATCH = 0x01, // ȸ Ȯ ġ - // ( ûڿ Ŀ¯ - // ġ ) + MSERR_MATCH = 0x01, // 회원을 확인했으나 정보가 서로 매치 되지 + // 않을 경우 ( 즉 요청자와 파워짱 정보가 + // 일치 되지 않을 경우 ) }; -// Ŷ +// 패킷 구조 struct _PKT_SERROR { - int nSize; // Ŷ ü ũ - int nCode; // Ŷ ڵ - int nError; // ڵ + int nSize; // 패킷 전체의 크기 + int nCode; // 패킷 코드 + int nError; // 에러 코드 }; const int szPKTSError = sizeof(_PKT_SERROR); @@ -29,36 +29,36 @@ const int szPKTSError = sizeof(_PKT_SERROR); // class PKTSError class PKTSError : public _PKT_SERROR, public MPacket { public: - // + // 생성자 PKTSError(); public: - // Ŷ ̵ ȯѴ. + // 패킷 아이디를 반환한다. MPacketID_t getID() const; - // Ŷ ũ⸦ ȯѴ. + // 패킷의 크기를 반환한다. MPacketSize_t getSize() const { return szPKTSError - szMPacketSize; } - // ο Ŷ ؼ ȯ + // 새로운 패킷을 생성해서 반환 MPacket* create() { MPacket* pPacket = new PKTSError; Assert(pPacket != NULL); return pPacket; } - // Է Ʈκ ͸ о Ŷ ʱȭ Ѵ. + // 입력 스트림으로부터 데이터를 읽어서 패킷을 초기화 한다. void read(SocketInputStream& iStream); - // Ʈ Ŷ ̳ʸ ̹ . + // 출력 스트림으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream); // debug message string toString() const; public: - // ڵ + // 에러 코드 설정 void setErrorCode(int errorCode) { nError = errorCode; } diff --git a/src/server/gameserver/mofus/PKTUserInfo.h b/src/server/gameserver/mofus/PKTUserInfo.h index 4fbd4a29..de6fb12d 100644 --- a/src/server/gameserver/mofus/PKTUserInfo.h +++ b/src/server/gameserver/mofus/PKTUserInfo.h @@ -1,7 +1,7 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : PKTUserInfo.h -// Desc : ¶ ID, ij͸, ȸ̸, -// Ŀ ȸ Ѵ. +// Desc : 온라인 게임 유저ID, 캐릭터명, 회원이름, 서버의 정보를 +// 파워링 서버로 보내 회원을 인증한다. ///////////////////////////////////////////////////////////////////////////// #ifndef __PKT_USERINFO_H__ @@ -11,13 +11,13 @@ #include "Assert.h" #include "MPacket.h" -// Ŷ +// 패킷 구조 struct _PKT_USERINFO { int nSize; int nCode; - char sJuminNo[20]; // ֹιȣ - char sHandPhone[12]; // ڵ ȣ - int nIndex; // ¶λ Ǹ ε + char sJuminNo[20]; // 주민번호 + char sHandPhone[12]; // 핸드폰 번호 + int nIndex; // 온라인사의 편의를 위한 인덱스 }; const int szPKTUserInfo = sizeof(_PKT_USERINFO); @@ -25,29 +25,29 @@ const int szPKTUserInfo = sizeof(_PKT_USERINFO); // class PKTUserInfo class PKTUserInfo : public _PKT_USERINFO, public MPacket { public: - // + // 생성자 PKTUserInfo(); public: - // Ŷ ̵ ȯѴ. + // 패킷 아이디를 반환한다. MPacketID_t getID() const; - // Ŷ ũ⸦ ȯѴ. + // 패킷의 크기를 반환한다. MPacketSize_t getSize() const { return szPKTUserInfo - szMPacketSize; } - // ο Ŷ ؼ ȯ + // 새로운 패킷을 생성해서 반환 MPacket* create() { MPacket* pPacket = new PKTUserInfo; Assert(pPacket != NULL); return pPacket; } - // Է Ʈκ ͸ о Ŷ ʱȭ Ѵ. + // 입력 스트림으로부터 데이터를 읽어서 패킷을 초기화 한다. void read(SocketInputStream& iStream); - // Ʈ Ŷ ̳ʸ ̹ . + // 출력 스트림으로 패킷의 바이너리 이미지를 보낸다. void write(SocketOutputStream& oStream); // debug message diff --git a/src/server/gameserver/mofus/StringParser.cpp b/src/server/gameserver/mofus/StringParser.cpp index 915cef5c..63fd5dd9 100644 --- a/src/server/gameserver/mofus/StringParser.cpp +++ b/src/server/gameserver/mofus/StringParser.cpp @@ -4,7 +4,7 @@ // filename : StringParser.cpp // author : bezz // -// purpose : StringParser Ŭ +// purpose : StringParser 클래스 // ////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/mofus/testserver/GameServerManager.cpp b/src/server/gameserver/mofus/testserver/GameServerManager.cpp index 97b2d8f8..9ff4790e 100644 --- a/src/server/gameserver/mofus/testserver/GameServerManager.cpp +++ b/src/server/gameserver/mofus/testserver/GameServerManager.cpp @@ -19,7 +19,7 @@ ////////////////////////////////////////////////////////////////////////////// // constructor -// Ŵ Ÿ Ѵ. +// 하위 매니저 및 데이타 멤버들을 생성한다. ////////////////////////////////////////////////////////////////////////////// GameServerManager::GameServerManager() throw(Error) @@ -33,10 +33,10 @@ GameServerManager::GameServerManager() throw(Error) m_pServerSocket = new ServerSocket(g_pConfig->getPropertyInt("TCPPort")); m_pServerSocket->setNonBlocking(); - // ũ͸ Ѵ. + // 서버 소켓 디스크립터를 지정한다. m_SocketID = m_pServerSocket->getSOCKET(); } catch (NoSuchElementException& nsee) { - // ȯ Ͽ ׷ element + // 환경 파일에 그런 element가 없을 경우 throw Error(nsee.toString()); } @@ -55,26 +55,26 @@ GameServerManager::~GameServerManager() throw(Error) { ////////////////////////////////////////////////////////////////////////////// -// Ŵ ʱȭѴ. +// 하위 매니저 및 데이터 멤버를 초기화한다. ////////////////////////////////////////////////////////////////////////////// void GameServerManager::init() throw(Error) { __BEGIN_TRY - // fd_set 0 ʱȭѴ. + // fd_set 들을 0 으로 초기화한다. FD_ZERO(&m_ReadFDs[0]); FD_ZERO(&m_WriteFDs[0]); FD_ZERO(&m_ExceptFDs[0]); - // Ʈ Ҵ. (write üũ ʿ䰡 .) + // 서버 소켓의 비트를 켠다. (write 는 체크할 필요가 없다.) FD_SET(m_SocketID, &m_ReadFDs[0]); FD_SET(m_SocketID, &m_ExceptFDs[0]); // set min/max fd m_MinFD = m_MaxFD = m_SocketID; - // m_Timeout ʱȭѴ. - // ߿ ֱ ɼ óϵ . + // m_Timeout 을 초기화한다. + // 나중에는 이 주기 역시 옵션으로 처리하도록 하자. m_Timeout[0].tv_sec = 0; m_Timeout[0].tv_usec = 0; @@ -113,27 +113,27 @@ void GameServerManager::run() throw(Error) { ////////////////////////////////////////////////////////////////////////////// // call select() system call -// TimeoutException ÷̾ ó ʾƵ ȴ. +// 상위에서 TimeoutException 을 받으면 플레이어는 처리하지 않아도 된다. ////////////////////////////////////////////////////////////////////////////// void GameServerManager::select() throw(TimeoutException, InterruptedException, Error) { __BEGIN_TRY //__ENTER_CRITICAL_SECTION(m_Mutex) - // m_Timeout[0] m_Timeout[1] Ѵ. + // m_Timeout[0] 을 m_Timeout[1] 으로 복사한다. m_Timeout[1].tv_sec = m_Timeout[0].tv_sec; m_Timeout[1].tv_usec = m_Timeout[0].tv_usec; - // m_XXXFDs[0] m_XXXFDs[1] Ѵ. + // m_XXXFDs[0] 을 m_XXXFDs[1] 으로 복사한다. m_ReadFDs[1] = m_ReadFDs[0]; m_WriteFDs[1] = m_WriteFDs[0]; m_ExceptFDs[1] = m_ExceptFDs[0]; try { - // m_XXXFDs[1] select() ȣѴ. + // 이제 m_XXXFDs[1] 을 가지고 select() 를 호출한다. SocketAPI::select_ex(m_MaxFD + 1, &m_ReadFDs[1], &m_WriteFDs[1], &m_ExceptFDs[1], &m_Timeout[1]); } catch (InterruptedException& ie) { - // ñ׳ ~~ + // 시그널이 올 리가 엄찌~~ // log(LOG_GAMESERVER_ERROR, "", "", ie.toString()); } @@ -145,9 +145,9 @@ void GameServerManager::select() throw(TimeoutException, InterruptedException, E ////////////////////////////////////////////////////////////////////////////// // process all players' inputs -// read flag , ο Ƿ -// ̸ óϰ, ٸ read flag , ο Ŷ -// Ƿ ÷̾ processInput() ȣϸ ȴ. +// 서버 소켓의 read flag가 켜졌을 경우, 새로운 접속이 들어왔으므로 +// 이를 처리하고, 다른 소켓의 read flag가 켜졌을 경우, 새로운 패킷이 +// 들어왔으므로 그 플레이어의 processInput()을 호출하면 된다. ////////////////////////////////////////////////////////////////////////////// void GameServerManager::processInputs() throw(IOException, Error) { __BEGIN_TRY @@ -163,7 +163,7 @@ void GameServerManager::processInputs() throw(IOException, Error) { for (int i = m_MinFD; i <= m_MaxFD; i++) { if (FD_ISSET(i, &m_ReadFDs[1])) { if (i == m_SocketID) { - // ο ߴٴ ̴. + // 서버 소켓일 경우 새로운 연결이 도착했다는 뜻이다. acceptNewConnection(); } else { if (m_pGameServerPlayers[i] != NULL) { @@ -173,7 +173,7 @@ void GameServerManager::processInputs() throw(IOException, Error) { if (pGameServerPlayer->getSocket()->getSockError()) { try { - // ̹ ǾǷ, ۸ ÷ؼ ȵȴ. + // 이미 연결이 종료되었으므로, 출력 버퍼를 플러시해서는 안된다. pGameServerPlayer->disconnect(DISCONNECTED); } catch (Throwable& t) { cerr << t.toString() << endl; @@ -186,9 +186,9 @@ void GameServerManager::processInputs() throw(IOException, Error) { try { pGameServerPlayer->processInput(); } catch (ConnectException& ce) { - // Blocking ̹Ƿ, ConnectException Error  ܵ ߻ ʴ´. - // , αϰ ÷̾ Ŀ (εǾٸ) - // ÷̾ ü Ѵ. + // Blocking 소켓이므로, ConnectException과 Error를 제외한 어떤 예외도 발생하지 않는다. + // 연결이 끊겼을 경우, 로그하고 플레이어 정보를 저장한 후에 (로드되었다면) + // 플레이어 객체를 삭제한다. try { pGameServerPlayer->disconnect(); } catch (Throwable& t) { @@ -237,7 +237,7 @@ void GameServerManager::processCommands() throw(IOException, Error) { if (pGameServerPlayer->getSocket()->getSockError()) { try { - // ̹ ǾǷ, ۸ ÷ؼ ȵȴ. + // 이미 연결이 종료되었으므로, 출력 버퍼를 플러시해서는 안된다. pGameServerPlayer->disconnect(); } catch (Throwable& t) { cerr << t.toString() << endl; @@ -302,7 +302,7 @@ void GameServerManager::processOutputs() throw(IOException, Error) { if (pGameServerPlayer->getSocket()->getSockError()) { try { - // ̹ ǾǷ, ۸ ÷ؼ ȵȴ. + // 이미 연결이 종료되었으므로, 출력 버퍼를 플러시해서는 안된다. pGameServerPlayer->disconnect(DISCONNECTED); } catch (Throwable& t) { cerr << t.toString() << endl; @@ -322,7 +322,7 @@ void GameServerManager::processOutputs() throw(IOException, Error) { // log(LOG_GAMESERVER_ERROR, "", "", msg.toString()); try { - // ̹ ǾǷ, ۸ ÷ؼ ȵȴ. + // 이미 연결이 종료되었으므로, 출력 버퍼를 플러시해서는 안된다. pGameServerPlayer->disconnect(DISCONNECTED); } catch (Throwable& t) { cerr << t.toString() << endl; @@ -336,7 +336,7 @@ void GameServerManager::processOutputs() throw(IOException, Error) { msg << "DISCONNECT " << pGameServerPlayer->getID() << "(" << cp.toString() << ")"; // log(LOG_GAMESERVER_ERROR, "", "", cp.toString()); - // ̹ ǾǷ, ۸ ÷ؼ ȵȴ. + // 이미 연결이 종료되었으므로, 출력 버퍼를 플러시해서는 안된다. try { pGameServerPlayer->disconnect(DISCONNECTED); @@ -361,8 +361,8 @@ void GameServerManager::processOutputs() throw(IOException, Error) { ////////////////////////////////////////////////////////////////////////////// // process all players' exceptions -// OOB Ÿ ȹ . -// , OOB ִٸ ϰ Ȯ © . +// 현재까지는 OOB 데이타를 전송할 계획은 없다. +// 따라서, 만약 OOB가 켜져 있다면 에러로 간주하고 접속을 확 짤라 버린다. ////////////////////////////////////////////////////////////////////////////// void GameServerManager::processExceptions() throw(IOException, Error) { @@ -412,14 +412,14 @@ void GameServerManager::processExceptions() throw(IOException, Error) { ////////////////////////////////////////////////////////////////////////////// -// select ݿ nonblocking ʴ´. +// select 기반에서는 nonblocking 소켓을 사용하지 않는다. ////////////////////////////////////////////////////////////////////////////// void GameServerManager::acceptNewConnection() throw(Error) { __BEGIN_TRY - // ŷ connection ٸ - // ϵǴ NULL . - // NonBlockingIOException ߻ . + // 블록킹 방식으로 connection을 기다릴 경우 + // 리턴되는 값은 절대 NULL이 될 수 없다. + // 또한 NonBlockingIOException도 발생할 수 없다. Socket* client = NULL; cout << "accepted" << endl; @@ -434,16 +434,16 @@ void GameServerManager::acceptNewConnection() throw(Error) { } try { - // ó Ͽ ־ ξµ Ѵ.. - // Ƹ Thread κп Ѵ - // Thread ó ӽ÷ . + // 에러 처리를 위하여 넣어 두었는데 원인을 꼭 밝혀야 한다.. + // 아마도 Thread의 소켓 관리 부분에서 문제가 생기지 않을까 생각 한다 + // Thread 관련 처리를 끝내기 전까지 임시로 들어간다. if (client->getSockError()) throw Error(); client->setNonBlocking(); - // ó Ͽ ־ ξµ Ѵ.. - // Ƹ Thread κп Ѵ - // Thread ó ӽ÷ . + // 에러 처리를 위하여 넣어 두었는데 원인을 꼭 밝혀야 한다.. + // 아마도 Thread의 소켓 관리 부분에서 문제가 생기지 않을까 생각 한다 + // Thread 관련 처리를 끝내기 전까지 임시로 들어간다. if (client->getSockError()) throw Error(); // set socket option (!NonBlocking, NoLinger) @@ -452,10 +452,10 @@ void GameServerManager::acceptNewConnection() throw(Error) { // StringStream msg; // cout << "NEW CONNECTION FROM " << client->getHost() << ":" << client->getPort(); - // Ŭ̾Ʈ Ķͷ ؼ ÷̾ ü Ѵ. + // 클라이언트 소켓을 파라미터로 사용해서 플레이어 객체를 생성한다. GameServerPlayer* pGameServerPlayer = new GameServerPlayer(client); - // IPM Ѵ. + // IPM 에 등록한다. try { addGameServerPlayer(pGameServerPlayer); } catch (DuplicatedException&) { @@ -469,7 +469,7 @@ void GameServerManager::acceptNewConnection() throw(Error) { msg2 << "ILLEGAL ACCESS FROM " << client->getHost() << ":" << client->getPort(); // log(LOG_GAMESERVER, "", "", msg2.toString()); - // ̹Ƿ ¥. -_-; + // 인증되지 못한 연결이므로 짜른다. -_-; client->send("Error : Unauthorized access", 27); client->close(); SAFE_DELETE(client); @@ -491,7 +491,7 @@ void GameServerManager::acceptNewConnection() throw(Error) { ////////////////////////////////////////////////////////////////////// // -// ο ῡ õ ÷̾ ü IPM ߰Ѵ. +// 새로운 연결에 관련된 플레이어 객체를 IPM에 추가한다. // ////////////////////////////////////////////////////////////////////// void GameServerManager::addGameServerPlayer(GameServerPlayer* pGameServerPlayer) throw(DuplicatedException, Error) { @@ -501,12 +501,12 @@ void GameServerManager::addGameServerPlayer(GameServerPlayer* pGameServerPlayer) SOCKET fd = pGameServerPlayer->getSocket()->getSOCKET(); - // m_MinFD , m_MaxFD Ѵ. + // m_MinFD , m_MaxFD 를 재조정한다. m_MinFD = min(fd, m_MinFD); m_MaxFD = max(fd, m_MaxFD); - // fd_set fd Ʈ on Ų. - // m_XXXFDs[1] óָ ȴ. + // 모든 fd_set 에 fd 비트를 on 시킨다. + // m_XXXFDs[1] 은 다음번에 처리해주면 된다. FD_SET(fd, &m_ReadFDs[0]); FD_SET(fd, &m_WriteFDs[0]); FD_SET(fd, &m_ExceptFDs[0]); @@ -520,7 +520,7 @@ void GameServerManager::addGameServerPlayer(GameServerPlayer* pGameServerPlayer) ////////////////////////////////////////////////////////////////////// // -// Ư ÷̾ IPM Ѵ. +// 특정 플레이어를 IPM 에서 삭제한다. // ////////////////////////////////////////////////////////////////////// void GameServerManager::deleteGameServerPlayer(SOCKET fd) throw(OutOfBoundException, NoSuchElementException, Error) { @@ -530,11 +530,11 @@ void GameServerManager::deleteGameServerPlayer(SOCKET fd) throw(OutOfBoundExcept m_pGameServerPlayers[fd] = NULL; - // m_MinFD , m_MaxFD Ѵ. - // fd == m_MinFD && fd == m_MaxFD ù° if óȴ. + // m_MinFD , m_MaxFD 를 재조정한다. + // fd == m_MinFD && fd == m_MaxFD 인 경우는 첫번째 if 에서 처리된다. if (fd == m_MinFD) { - // տ fd ã´. - // m_MinFD ڸ NULL Ǿ ϶. + // 앞에서부터 제일 작은 fd 를 찾는다. + // m_MinFD 자리는 현재 NULL 이 되어 있음을 유의하라. int i = m_MinFD; for (i = m_MinFD; i <= m_MaxFD; i++) { if (m_pGameServerPlayers[i] != NULL || i == m_SocketID) { @@ -543,14 +543,14 @@ void GameServerManager::deleteGameServerPlayer(SOCKET fd) throw(OutOfBoundExcept } } - // m_MinFD ã , - // ̶ m_MinFD == m_MaxFD ̴. - // ̶ -1 . + // 적절한 m_MinFD를 찾지 못했을 경우, + // 이때에는 m_MinFD == m_MaxFD 인 경우이다. + // 이때에는 둘 다 -1 로 설정해주자. if (i > m_MaxFD) m_MinFD = m_MaxFD = -1; } else if (fd == m_MaxFD) { - // ڿ ū fd ã´. - // SocketID ! (SocketID Player ʹ NULL ̴.) + // 뒤에서부터 가장 큰 fd 를 찾는다. + // SocketID 에 유의할 것! (SocketID 의 경우 Player 포인터는 NULL 이다.) int i = m_MaxFD; for (i = m_MaxFD; i >= m_MinFD; i--) { if (m_pGameServerPlayers[i] != NULL || i == m_SocketID) { @@ -559,15 +559,15 @@ void GameServerManager::deleteGameServerPlayer(SOCKET fd) throw(OutOfBoundExcept } } - // m_MinFD ã , + // 적절한 m_MinFD를 찾지 못했을 경우, if (i < m_MinFD) { throw UnknownError("m_MinFD & m_MaxFD problem."); } } - // fd_set fd Ʈ off Ų. - // m_XXXFDs[1] ľ ϴ , ó ü µ - // ó Ȯ ֱ ̴. + // 모든 fd_set 에 fd 비트를 off 시킨다. + // m_XXXFDs[1]도 고쳐야 하는 이유는, 이후 처리에서 객체가 없어졌는데도 + // 처리받을 확률이 있기 때문이다. FD_CLR(fd, &m_ReadFDs[0]); FD_CLR(fd, &m_ReadFDs[1]); FD_CLR(fd, &m_WriteFDs[0]); diff --git a/src/server/gameserver/mofus/testserver/GameServerManager.h b/src/server/gameserver/mofus/testserver/GameServerManager.h index b27e9075..2061976c 100644 --- a/src/server/gameserver/mofus/testserver/GameServerManager.h +++ b/src/server/gameserver/mofus/testserver/GameServerManager.h @@ -28,7 +28,7 @@ class GameServerManager : public Thread { ~GameServerManager() throw(Error); public: - // 弭 ޾Ƶ̴ ִ Ӽ + // 쉐어드서버에서 받아들이는 최대 게임서버 수 const static uint nMaxGameServers = 100; // initialize @@ -69,23 +69,23 @@ class GameServerManager : public Thread { void heartbeat() throw(Error); private: - // TCP ϰ ũ + // TCP 서버 소켓과 소켓 디스크립터 ServerSocket* m_pServerSocket; SOCKET m_SocketID; - // Ҽӵ ÷̾ ũ ̴. - // m_XXXXFDs[0] ̸, m_XXXFDs[1] select() Ķͷ ȴ. - // select()ϱ [0] -> [1] 簡 ̷ Ѵ. + // 소속된 플레이어들의 소켓 디스크립터의 집합이다. + // m_XXXXFDs[0]은 저장용이며, m_XXXFDs[1]이 실제로 select()의 파라미터로 사용된다. + // 즉 select()하기 전에 [0] -> [1] 로 복사가 이루어져야 한다. fd_set m_ReadFDs[2]; fd_set m_WriteFDs[2]; fd_set m_ExceptFDs[2]; - // select Ǵ ð + // select에 사용되는 시간 Timeval m_Timeout[2]; // min_fd, max_fd - // select() iterating ӵ ؼ Ѵ. - // select() ù° Ķ͸ ϱ ؼ Ѵ. + // select()후 iterating 할 때 속도 증가를 위해서 사용한다. + // 또한 select()의 첫번째 파라미터를 계산하기 위해서 사용한다. SOCKET m_MinFD; SOCKET m_MaxFD; @@ -93,7 +93,7 @@ class GameServerManager : public Thread { mutable Mutex m_Mutex; - // Ӽ 迭. ũ͸ ε Ѵ. + // 게임서버의 포인터 배열. 소켓 디스크립터를 인덱스로 사용한다. GameServerPlayer* m_pGameServerPlayers[nMaxGameServers]; }; diff --git a/src/server/gameserver/mofus/testserver/GameServerPlayer.cpp b/src/server/gameserver/mofus/testserver/GameServerPlayer.cpp index afb3d9ff..7cc4be72 100644 --- a/src/server/gameserver/mofus/testserver/GameServerPlayer.cpp +++ b/src/server/gameserver/mofus/testserver/GameServerPlayer.cpp @@ -86,7 +86,7 @@ void GameServerPlayer::processOutput() throw(IOException, Error) { try { m_pOutputStream->flush(); } catch (InvalidProtocolException&) { - throw DisconnectException("̻ Ŷ"); + throw DisconnectException("이상한 패킷임"); } __END_CATCH @@ -102,9 +102,9 @@ void GameServerPlayer::processCommand() throw(IOException, Error) { __BEGIN_TRY try { - // Է ۿ ִ Ŷ óѴ. + // 입력 버퍼에 들어있는 완전한 패킷들을 모조리 처리한다. while (true) { - // ϴ Ŷ ID о´. + // 일단 패킷의 사이즈와 ID 를 읽어온다. char header[szMPacketHeader]; MPacketSize_t packetSize; MPacketID_t packetID; @@ -118,34 +118,34 @@ void GameServerPlayer::processCommand() throw(IOException, Error) { // packetSize = ntohl( packetSize ); // packetID = ntohl( packetID ); - // Ŷ ̵ ̻ϸ + // 패킷 아이디가 이상하면 프로토콜 에러 if (!g_pMPacketManager->hasHandler(packetID)) { filelog(MOFUS_ERROR_FILE, "Invalid PacketID : %d", packetID); throw ProtocolException("Invalid PacketID"); } - // Ŷ Ȯ + // 패킷 사이즈 확인 if (g_pMPacketManager->getPacketSize(packetID) != packetSize) { filelog(MOFUS_ERROR_FILE, "Invalid PacketSize : %d, expected size : %d", packetSize, g_pMPacketManager->getPacketSize(packetID)); throw ProtocolException("Invalid PacketSize"); } - // ϳ Ŷ ִ Ȯ + // 완전한 하나의 패킷이 들어있는지 확인 if (m_pInputStream->length() < (unsigned int)(packetSize + szMPacketSize)) return; - // Ŷ + // 패킷을 생성 MPacket* pPacket = g_pMPacketManager->createPacket(packetID); - // Ŷ ü ä. + // 패킷 객체에 읽은 내용을 채운다. pPacket->read(*m_pInputStream); - // Ŷ ش ڵ鷯 Ѵ. + // 패킷의 해당 핸들러를 실행한다. g_pMPacketManager->execute(this, pPacket); } } catch (InsufficientDataException) { - // + // 무시 } __END_CATCH @@ -177,9 +177,9 @@ void GameServerPlayer::disconnect(bool bDisconnected) throw(InvalidProtocolExcep __BEGIN_TRY try { - // ϰ α׾ƿ 쿡 ۸ ÷ ִ. - // ׷, ҹ 𽺸 ɾٸ ݰǷ - // ÷ SIG_PIPE ް ȴ. + // 정당하게 로그아웃한 경우에는 출력 버퍼를 플러시할 수 있다. + // 그러나, 불법적인 디스를 걸었다면 소켓이 닫겼으므로 + // 플러시할 경우 SIG_PIPE 을 받게 된다. if (bDisconnected == UNDISCONNECTED) { m_pOutputStream->flush(); } @@ -189,7 +189,7 @@ void GameServerPlayer::disconnect(bool bDisconnected) throw(InvalidProtocolExcep cerr << "GameServerPlayer::disconnect Exception Check!!" << endl; cerr << t.toString() << endl; m_pSocket->close(); - // throw Error("..."); + // throw Error("씨바..."); } __END_CATCH diff --git a/src/server/gameserver/mofus/testserver/GameServerPlayer.h b/src/server/gameserver/mofus/testserver/GameServerPlayer.h index fcb25166..bed8eec9 100644 --- a/src/server/gameserver/mofus/testserver/GameServerPlayer.h +++ b/src/server/gameserver/mofus/testserver/GameServerPlayer.h @@ -39,9 +39,9 @@ class GameServerPlayer : public Player { virtual void processCommand() throw(IOException, Error); // disconnect - // ÷̾ , ϰ α׾ƿ - // ̹ Ƿ disconnect(DISCONNECTED) ؼ ؾ Ѵ. ݸ, - // ϰ α׾ƿ 쿡 disconnect(UNDISCONNECTED) ؾ Ѵ. + // 플레이어의 연결을 종료할 때, 상대편이 적절하게 로그아웃하지 않을 경우 소켓의 연결이 + // 이미 끊겨 있으므로 disconnect(DISCONNECTED) 를 사용해서 연결을 종료해야 한다. 반면, + // 정당하게 로그아웃을 한 경우에는 disconnect(UNDISCONNECTED) 를 사용해야 한다. virtual void disconnect(bool bDisconnected = DISCONNECTED) throw(InvalidProtocolException, Error); void sendPacket(MPacket* pPacket) throw(ProtocolException, Error); diff --git a/src/server/gameserver/mofus/testserver/MPacketHandler.h b/src/server/gameserver/mofus/testserver/MPacketHandler.h index f683d8de..4814e2d6 100644 --- a/src/server/gameserver/mofus/testserver/MPacketHandler.h +++ b/src/server/gameserver/mofus/testserver/MPacketHandler.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Filename : MPacketHandler.h -// Desc : ۽ Ŷ ڵ鷯 +// Desc : 모퍼스 용 패킷 핸들러 ///////////////////////////////////////////////////////////////////////////// #ifndef __MPACKET_HANDLER_H__ diff --git a/src/server/gameserver/mofus/testserver/MPacketManager.cpp b/src/server/gameserver/mofus/testserver/MPacketManager.cpp index ff71928b..c23602db 100644 --- a/src/server/gameserver/mofus/testserver/MPacketManager.cpp +++ b/src/server/gameserver/mofus/testserver/MPacketManager.cpp @@ -10,7 +10,7 @@ #include "Assert.h" #include "MPacketHandler.h" -// receive Ŷ +// receive 패킷 #include "../PKTConnectAsk.h" #include "../PKTLogout.h" #include "../PKTReceiveOK.h" @@ -22,19 +22,19 @@ #include "PKTResultHandler.h" #include "PKTUserInfoHandler.h" -// send Ŷ +// send 패킷 #include "../PKTConnectAccept.h" #include "../PKTError.h" #include "../PKTPowerPoint.h" -// Ŷ ID ϱ ũ +// 패킷 ID 등록을 간단히 하기 위한 매크로 #define REGISTER_SEND_PACKET_ID(PACKET, PACKET_ID) \ MPacketID_t PACKET::getID() const { \ return PACKET_ID; \ } -// Ŷ ڵ鷯 ID ϱ ũ +// 패킷 핸들러 ID 등록을 간단히 하기 위한 매크로 #define REGISTER_RECV_PACKET_ID(PACKET, PACKET_ID) \ MPacketID_t PACKET::getID() const { \ return PACKET_ID; \ @@ -43,20 +43,20 @@ return PACKET_ID; \ } -// ŶID +// 보내기용 패킷ID 등록 REGISTER_RECV_PACKET_ID(PKTConnectAsk, PTC_CONNECT_ASK) REGISTER_RECV_PACKET_ID(PKTLogout, PTC_LOGOUT) REGISTER_RECV_PACKET_ID(PKTUserInfo, PTC_USERINFO) REGISTER_RECV_PACKET_ID(PKTReceiveOK, PTC_RECEIVE_OK) REGISTER_RECV_PACKET_ID(PKTResult, PTC_RESULT) -// Ŷ ID ڵ鷯 ID +// 보내기용 패킷 ID 등록 및 핸들러 ID 등록 REGISTER_SEND_PACKET_ID(PKTConnectAccept, PTS_CONNECT_ACCEPT) REGISTER_SEND_PACKET_ID(PKTPowerPoint, PTS_POWERPOINT) REGISTER_SEND_PACKET_ID(PKTError, PTS_ERROR) -// +// 내부 구현 데이터 struct MPacketManager::IMPL { MPacket* pCreators[PTC_SEND_MAX]; MPacketHandler* pHandlers[PTC_SEND_MAX]; @@ -64,27 +64,27 @@ struct MPacketManager::IMPL { IMPL(); ~IMPL(); - // Ŷ ڸ ߰Ѵ. + // 패킷 생성자를 추가한다. void addCreator(MPacket* pPacket); - // Ŷ ڵ鷯 ߰Ѵ. + // 패킷 핸들러를 추가한다. void addHandler(MPacketHandler* pHandler); }; -// +// 생성자 MPacketManager::MPacketManager() : m_pImpl(new IMPL) { Assert(m_pImpl != NULL); } -// Ҹ +// 소멸자 MPacketManager::~MPacketManager() { SAFE_DELETE(m_pImpl); } -// ʱȭ +// 초기화 void MPacketManager::init() { - // ڵ鷯 ũ ߰ + // 핸들러 및 크리에이터 추가 m_pImpl->addCreator(new PKTConnectAsk); m_pImpl->addHandler(new PKTConnectAskHandler); m_pImpl->addCreator(new PKTLogout); @@ -97,19 +97,19 @@ void MPacketManager::init() { m_pImpl->addHandler(new PKTResultHandler); } -// Ŷ ڸ ߰Ѵ. +// 패킷 생성자를 추가한다. void MPacketManager::addCreator(MPacket* pPacket) { Assert(pPacket != NULL); m_pImpl->addCreator(pPacket); } -// Ŷ ڵ鷯 ߰Ѵ. +// 패킷 핸들러를 추가한다. void MPacketManager::addHandler(MPacketHandler* pHandler) { Assert(pHandler != NULL); m_pImpl->addHandler(pHandler); } -// ο Ŷ ؼ ȯѴ. +// 새로운 패킷을 생성해서 반환한다. MPacket* MPacketManager::createPacket(MPacketID_t ID) const { if (ID < 0 || ID >= PTC_SEND_MAX) { filelog(MOFUS_ERROR_FILE, "MPacketManager::createPacket() out of ID"); @@ -119,7 +119,7 @@ MPacket* MPacketManager::createPacket(MPacketID_t ID) const { return m_pImpl->pCreators[ID]->create(); } -// Ŷ Ѵ. +// 패킷을 실행한다. void MPacketManager::execute(GameServerPlayer* pPlayer, MPacket* pPacket) { Assert(pPlayer != NULL); Assert(pPacket != NULL); @@ -139,14 +139,14 @@ void MPacketManager::execute(GameServerPlayer* pPlayer, MPacket* pPacket) { m_pImpl->pHandlers[ID]->execute(pPlayer, pPacket); } -// Ŷ Ѵ. +// 패킷을 실행한다. bool MPacketManager::hasHandler(MPacketID_t ID) const { - // ϴ Ȯ + // 일단 범위 확인 if (ID < 0 || ID >= PTC_SEND_MAX) { return false; } - // ڵ鷯 ִ Ȯ + // 핸들러가 있는지 확인 if (m_pImpl->pHandlers[ID] == NULL) { return false; } @@ -154,7 +154,7 @@ bool MPacketManager::hasHandler(MPacketID_t ID) const { return true; } -// Ŷ ũ⸦ ȯѴ. +// 패킷의 크기를 반환한다. MPacketSize_t MPacketManager::getPacketSize(MPacketID_t ID) const { if (ID < 0 || ID >= PTC_SEND_MAX) { filelog(MOFUS_ERROR_FILE, "MPacketManager::createPacket() out of ID"); @@ -164,49 +164,49 @@ MPacketSize_t MPacketManager::getPacketSize(MPacketID_t ID) const { return m_pImpl->pCreators[ID]->getSize(); } -// +// 생성자 MPacketManager::IMPL::IMPL() { - // 迭 ʱȭѴ. + // 각 배열을 초기화한다. for (MPacketID_t i = 0; i < PTC_SEND_MAX; ++i) { pCreators[i] = NULL; pHandlers[i] = NULL; } } -// Ҹ +// 소멸자 MPacketManager::IMPL::~IMPL() { - // Ŷ ڵ鷯 . + // 패킷 생성자 및 핸들러를 지운다. for (MPacketID_t i = 0; i < PTC_SEND_MAX; ++i) { SAFE_DELETE(pCreators[i]); SAFE_DELETE(pHandlers[i]); } } -// Ŷ ڸ ߰Ѵ. +// 패킷 생성자를 추가한다. void MPacketManager::IMPL::addCreator(MPacket* pPacket) { Assert(pPacket != NULL); - // ߺ ˻ + // 중복 검사 if (pCreators[pPacket->getID()] != NULL) { filelog(MOFUS_ERROR_FILE, "MPacketManager::IMPL::addCreator() dup creator"); Assert(false); } - // ڸ ߰Ѵ. + // 생성자를 추가한다. pCreators[pPacket->getID()] = pPacket; } -// Ŷ ڵ鷯 ߰Ѵ. +// 패킷 핸들러를 추가한다. void MPacketManager::IMPL::addHandler(MPacketHandler* pHandler) { Assert(pHandler != NULL); - // ߺ ˻ + // 중복 검사 if (pHandlers[pHandler->getID()] != NULL) { filelog(MOFUS_ERROR_FILE, "MPacketManager::IMPL::addHandler() dup handler"); Assert(false); } - // ڵ鷯 ߰Ѵ. + // 핸들러를 추가한다. pHandlers[pHandler->getID()] = pHandler; } diff --git a/src/server/gameserver/mofus/testserver/MPacketManager.h b/src/server/gameserver/mofus/testserver/MPacketManager.h index ea0accbc..13fd0085 100644 --- a/src/server/gameserver/mofus/testserver/MPacketManager.h +++ b/src/server/gameserver/mofus/testserver/MPacketManager.h @@ -23,27 +23,27 @@ class MPacketManager { void init(); public: - // Ŷ ڸ ߰Ѵ. + // 패킷 생성자를 추가한다. void addCreator(MPacket* pPacket); - // Ŷ ڵ鷯 ߰Ѵ. + // 패킷 핸들러를 추가한다. void addHandler(MPacketHandler* pHandler); public: - // ο Ŷ ؼ ȯѴ. + // 새로운 패킷을 생성해서 반환한다. MPacket* createPacket(MPacketID_t ID) const; - // Ŷ ڵ鷯 Ѵ. + // 패킷의 핸들러를 실행한다. void execute(GameServerPlayer* pPlayer, MPacket* pPacket); - // Ŷ ڵ鷯 ִ ȮѴ. + // 패킷의 핸들러가 있는지 확인한다. bool hasHandler(MPacketID_t ID) const; - // Ŷ ũ⸦ ȯѴ. + // 패킷의 크기를 반환한다. MPacketSize_t getPacketSize(MPacketID_t ID) const; private: - // + // 내부 구현 데이터 struct IMPL; IMPL* m_pImpl; }; diff --git a/src/server/gameserver/mofus/testserver/PKTConnectAskHandler.cpp b/src/server/gameserver/mofus/testserver/PKTConnectAskHandler.cpp index 84ea86cb..3bfd63ba 100644 --- a/src/server/gameserver/mofus/testserver/PKTConnectAskHandler.cpp +++ b/src/server/gameserver/mofus/testserver/PKTConnectAskHandler.cpp @@ -11,7 +11,7 @@ #include "PKTConnectAccept.h" -// Լ +// 실행 함수 void PKTConnectAskHandler::execute(GameServerPlayer* pPlayer, MPacket* pPacket) { cout << "RECV ConnectAsk" << endl; diff --git a/src/server/gameserver/mofus/testserver/PKTConnectAskHandler.h b/src/server/gameserver/mofus/testserver/PKTConnectAskHandler.h index 938dbd04..4174c189 100644 --- a/src/server/gameserver/mofus/testserver/PKTConnectAskHandler.h +++ b/src/server/gameserver/mofus/testserver/PKTConnectAskHandler.h @@ -12,10 +12,10 @@ // class PKTConnectAskHandler class PKTConnectAskHandler : public MPacketHandler { public: - // ش Ŷ ID + // 해당 패킷의 ID MPacketID_t getID() const; - // Լ + // 실행 함수 void execute(GameServerPlayer* pPlayer, MPacket* pPacket); }; diff --git a/src/server/gameserver/mofus/testserver/PKTLogoutHandler.cpp b/src/server/gameserver/mofus/testserver/PKTLogoutHandler.cpp index e1d31922..01d950b7 100644 --- a/src/server/gameserver/mofus/testserver/PKTLogoutHandler.cpp +++ b/src/server/gameserver/mofus/testserver/PKTLogoutHandler.cpp @@ -9,7 +9,7 @@ #include "Mofus.h" -// Լ +// 실행 함수 void PKTLogoutHandler::execute(GameServerPlayer* pPlayer, MPacket* pPacket) { cout << "--------------------------------------------------" << endl; cout << "RECV Logout" << endl; diff --git a/src/server/gameserver/mofus/testserver/PKTLogoutHandler.h b/src/server/gameserver/mofus/testserver/PKTLogoutHandler.h index 624bc5f6..50fdc30e 100644 --- a/src/server/gameserver/mofus/testserver/PKTLogoutHandler.h +++ b/src/server/gameserver/mofus/testserver/PKTLogoutHandler.h @@ -12,10 +12,10 @@ // class PKTLogoutHandler class PKTLogoutHandler : public MPacketHandler { public: - // ش Ŷ ID + // 해당 패킷의 ID MPacketID_t getID() const; - // Լ + // 실행 함수 void execute(GameServerPlayer* pPlayer, MPacket* pPacket); }; diff --git a/src/server/gameserver/mofus/testserver/PKTReceiveOKHandler.cpp b/src/server/gameserver/mofus/testserver/PKTReceiveOKHandler.cpp index b3354e1d..f0210d5d 100644 --- a/src/server/gameserver/mofus/testserver/PKTReceiveOKHandler.cpp +++ b/src/server/gameserver/mofus/testserver/PKTReceiveOKHandler.cpp @@ -11,7 +11,7 @@ #include "PKTPowerPoint.h" -// Լ +// 실행 함수 void PKTReceiveOKHandler::execute(GameServerPlayer* pPlayer, MPacket* pPacket) { cout << "--------------------------------------------------" << endl; cout << "RECV ReceiveOK" << endl; @@ -21,7 +21,7 @@ void PKTReceiveOKHandler::execute(GameServerPlayer* pPlayer, MPacket* pPacket) { filelog(MOFUS_PACKET_FILE, "RECV : %s", pPacket->toString().c_str()); PKTPowerPoint pkt; - strcpy(pkt.sCharName, "11"); + strcpy(pkt.sCharName, "슬11"); pkt.nPowerPoint = 300; pkt.nContinue = rand() % 2; pPlayer->sendPacket(&pkt); diff --git a/src/server/gameserver/mofus/testserver/PKTReceiveOKHandler.h b/src/server/gameserver/mofus/testserver/PKTReceiveOKHandler.h index d1f21cd0..f372f17d 100644 --- a/src/server/gameserver/mofus/testserver/PKTReceiveOKHandler.h +++ b/src/server/gameserver/mofus/testserver/PKTReceiveOKHandler.h @@ -12,10 +12,10 @@ // class PKTReceiveOKHandler class PKTReceiveOKHandler : public MPacketHandler { public: - // ش Ŷ ID + // 해당 패킷의 ID MPacketID_t getID() const; - // Լ + // 실행 함수 void execute(GameServerPlayer* pPlayer, MPacket* pPacket); }; diff --git a/src/server/gameserver/mofus/testserver/PKTResultHandler.cpp b/src/server/gameserver/mofus/testserver/PKTResultHandler.cpp index 309f5738..8b7be47d 100644 --- a/src/server/gameserver/mofus/testserver/PKTResultHandler.cpp +++ b/src/server/gameserver/mofus/testserver/PKTResultHandler.cpp @@ -9,7 +9,7 @@ #include "Mofus.h" -// Լ +// 실행 함수 void PKTResultHandler::execute(GameServerPlayer* pPlayer, MPacket* pPacket) { cout << "--------------------------------------------------" << endl; cout << "RECV Result" << endl; diff --git a/src/server/gameserver/mofus/testserver/PKTResultHandler.h b/src/server/gameserver/mofus/testserver/PKTResultHandler.h index d5b2df21..7776e95d 100644 --- a/src/server/gameserver/mofus/testserver/PKTResultHandler.h +++ b/src/server/gameserver/mofus/testserver/PKTResultHandler.h @@ -12,10 +12,10 @@ // class PKTResultHandler class PKTResultHandler : public MPacketHandler { public: - // ش Ŷ ID + // 해당 패킷의 ID MPacketID_t getID() const; - // Լ + // 실행 함수 void execute(GameServerPlayer* pPlayer, MPacket* pPacket); }; diff --git a/src/server/gameserver/mofus/testserver/PKTUserInfoHandler.cpp b/src/server/gameserver/mofus/testserver/PKTUserInfoHandler.cpp index ec3c9781..c1375087 100644 --- a/src/server/gameserver/mofus/testserver/PKTUserInfoHandler.cpp +++ b/src/server/gameserver/mofus/testserver/PKTUserInfoHandler.cpp @@ -12,7 +12,7 @@ #include "PKTUserInfo.h" -// Լ +// 실행 함수 void PKTUserInfoHandler::execute(GameServerPlayer* pPlayer, MPacket* pPacket) { cout << "--------------------------------------------------" << endl; cout << "RECV UserInfo" << endl; @@ -22,7 +22,7 @@ void PKTUserInfoHandler::execute(GameServerPlayer* pPlayer, MPacket* pPacket) { filelog(MOFUS_PACKET_FILE, "RECV : %s", pPacket->toString().c_str()); PKTPowerPoint pkt; - strcpy(pkt.sCharName, "11"); + strcpy(pkt.sCharName, "슬11"); pkt.nPowerPoint = 300; pkt.nContinue = rand() % 2; pkt.nOnGameCode = 1; diff --git a/src/server/gameserver/mofus/testserver/PKTUserInfoHandler.h b/src/server/gameserver/mofus/testserver/PKTUserInfoHandler.h index ffd4b0c3..eb88cb77 100644 --- a/src/server/gameserver/mofus/testserver/PKTUserInfoHandler.h +++ b/src/server/gameserver/mofus/testserver/PKTUserInfoHandler.h @@ -12,10 +12,10 @@ // class PKTUserInfoHandler class PKTUserInfoHandler : public MPacketHandler { public: - // ش Ŷ ID + // 해당 패킷의 ID MPacketID_t getID() const; - // Լ + // 실행 함수 void execute(GameServerPlayer* pPlayer, MPacket* pPacket); }; diff --git a/src/server/gameserver/quest/Action.h b/src/server/gameserver/quest/Action.h index 746df526..2bc2d311 100644 --- a/src/server/gameserver/quest/Action.h +++ b/src/server/gameserver/quest/Action.h @@ -2,7 +2,7 @@ // Filename : Action.h // Written By : // Description : -// Ʈ Ǿ ϴ ׼ Ÿ Ŭ +// 트리거의 조건이 만족할 경우 실행되어야 하는 액션을 나타내는 클래스 ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_H__ @@ -21,43 +21,43 @@ class Creature; class Action { public: enum ActionTypes { - ACTION_SET_POSITION, // ġ Ѵ. - ACTION_WANDER, // ȲѴ. - ACTION_SAY, // ũƮ Ѵ. - ACTION_RANDOM_SAY, // ũƮ εijѴ. - ACTION_ASK, // ÷̾ Ѵ. - ACTION_QUIT_DIALOGUE, // Ŭ̾Ʈ Ͽ ȭâ ݰ Ѵ. - ACTION_PREPARE_SHOP, // غѴ. - ACTION_SELL, // ÷̾ Ǵ. - ACTION_BUY, // ÷̾κ δ. - ACTION_REGEN_SHOP, // ȿ ִ Ѵ. - ACTION_PREPARE_TEACH, // ĥ غ Ѵ. - ACTION_TEACH_SKILL, // ÷̾ ش. - ACTION_HEAL, // ÷̾ ġش. - ACTION_REDEEM_MOTORCYCLE, // ͻŬ ȯش. - ACTION_SEARCH_MOTORCYCLE, // ÷̾ ġ ش. - ACTION_REPAIR, // ÷̾ ش. - ACTION_STASH_SELL, // ̽ Ѵ. - ACTION_STASH_OPEN, // ̽ Ѵ. - ACTION_RESTORE, // ̾ ̾ ȯ ش. - ACTION_SET_RESURRECT_ZONE, // Ȱ ġ Ѵ. - ACTION_SILVER_COATING, // ۿ ش. - ACTION_CREATE_GUILD, // ̽ Ѵ. - ACTION_DESTROY_GUILD, // ü ̽ Ѵ. - ACTION_TUTORIAL, // Ʃ丮 ̽ Ѵ. - ACTION_GIVE_NEWBIE_ITEM, // ʺڿ ̽ Ѵ. - ACTION_ACTIVATE_PORTAL, // Ż ۵Ų. - ACTION_TURN_ON_FLAG, // ÷׸ Ѱ Ѵ. - ACTION_TURN_OFF_FLAG, // ÷׸ Ѵ. - ACTION_SYSTEM_MESSAGE, // ý ޽ . - ACTION_TAKE_DONATION, // θ ޴´. - ACTION_CALL_HELICOPTER, // ̽ Ѵ. - ACTION_REGEN_EVENT_SHOP, // ̺Ʈ Ѵ. - ACTION_SAY_DYNAMIC, // ũƮ Ѵ. - ACTION_ASK_DYNAMIC, // ÷̾ Ѵ. + ACTION_SET_POSITION, // 위치를 지정한다. + ACTION_WANDER, // 일정 범위를 방황한다. + ACTION_SAY, // 일정 스크립트를 말한다. + ACTION_RANDOM_SAY, // 일정 스크립트를 브로드캐스팅한다. + ACTION_ASK, // 플레이어에게 질문을 한다. + ACTION_QUIT_DIALOGUE, // 클라이언트로 하여금 대화창을 닫게 한다. + ACTION_PREPARE_SHOP, // 상점을 준비한다. + ACTION_SELL, // 플레이어에게 아이템을 판다. + ACTION_BUY, // 플레이어로부터 물건을 사들인다. + ACTION_REGEN_SHOP, // 상점 안에 있는 아이템을 재정리한다. + ACTION_PREPARE_TEACH, // 기술을 가르칠 준비를 한다. + ACTION_TEACH_SKILL, // 플레이어에게 기술을 가르쳐준다. + ACTION_HEAL, // 플레이어를 치료해준다. + ACTION_REDEEM_MOTORCYCLE, // 모터사이클을 반환해준다. + ACTION_SEARCH_MOTORCYCLE, // 플레이어의 오토바이 위치를 말해준다. + ACTION_REPAIR, // 플레이어의 아이템을 수리해준다. + ACTION_STASH_SELL, // 보관함 사기 인터페이스를 열도록 한다. + ACTION_STASH_OPEN, // 보관함 인터페이스를 열도록 한다. + ACTION_RESTORE, // 뱀파이어를 슬레이어로 변환해 준다. + ACTION_SET_RESURRECT_ZONE, // 부활 위치를 지정한다. + ACTION_SILVER_COATING, // 아이템에다 은 도금을 해준다. + ACTION_CREATE_GUILD, // 길드 생성 인터페이스를 열게 한다. + ACTION_DESTROY_GUILD, // 길드 해체 인터페이스를 열게 한다. + ACTION_TUTORIAL, // 튜토리얼 인터페이스를 열게 한다. + ACTION_GIVE_NEWBIE_ITEM, // 초보자용 아이템 선택 인터페이스를 열게 한다. + ACTION_ACTIVATE_PORTAL, // 포탈을 작동시킨다. + ACTION_TURN_ON_FLAG, // 플래그를 켜고 저장한다. + ACTION_TURN_OFF_FLAG, // 플래그를 끄고 저장한다. + ACTION_SYSTEM_MESSAGE, // 시스템 메시지를 날린다. + ACTION_TAKE_DONATION, // 기부를 받는다. + ACTION_CALL_HELICOPTER, // 헬기 인터페이스를 열게 한다. + ACTION_REGEN_EVENT_SHOP, // 이벤트용 상점을 갱신한다. + ACTION_SAY_DYNAMIC, // 일정 스크립트를 말한다. + ACTION_ASK_DYNAMIC, // 플레이어에게 질문을 한다. ACTION_GIVE_SPECIAL_EVENT_ITEM, // ACTION_REDISTRIBUTE_ATTR, // - ACTION_GIVE_GARBAGE_ITEM, // ش. + ACTION_GIVE_GARBAGE_ITEM, // 가비지 아이템을 준다. // ACTION_TALK , // ACTION_RANDOM_TALK , @@ -96,27 +96,27 @@ class Action { ACTION_GIVE_TEST_SERVER_REWARD, - //  Action + // 성에 들어가는 Action // 2003. 1.20. by bezz,Sequoia ACTION_ENTER_CASTLE_WITH_FEE, - // ׿ִ ܾ ش. + // 성에 쌓여있는 세금의 잔액을 보여준다. ACTION_SHOW_TAX_BALANCE, ACTION_ASK_VARIABLE, - // û ׼ǵ + // 전쟁 신청 관련 액션들 ACTION_WAR_REGISTRATION, ACTION_SHOW_WAR_SCHEDULE, - // û + // 종족 전쟁 신청 ACTION_JOIN_RACE_WAR, - // ̺Ʈ - ACTION_GIVE_EVENT_ITEM, // ij - ACTION_GIVE_ACCOUNT_EVENT_ITEM, // + // 이벤트 선물 아이템 + ACTION_GIVE_EVENT_ITEM, // 캐릭별로 줄 때 + ACTION_GIVE_ACCOUNT_EVENT_ITEM, // 계정별로 줄 때 - // Ŀ Ŵ ʱȭ ׼ + // 커플 매니저 관련 초기화 액션 ACTION_INIT_PARTNER_WAITING_MANAGER, ACTION_WAIT_FOR_MEET_COUPLE, ACTION_WAIT_FOR_APART_COUPLE, @@ -160,39 +160,39 @@ class Action { ACTION_ACTIVATE_MAZE_ENTER, ACTION_ACTIVATE_MAZE_RETURN, - ACTION_SYSTEM_MESSAGE_PER_RACE, // ý ޽ . + ACTION_SYSTEM_MESSAGE_PER_RACE, // 시스템 메시지를 날린다. ACTION_WARP_LEVEL_WAR_ZONE, - ACTION_CHECK_PARTNER_NAME, // Ʈ ̸ Ȯ + ACTION_CHECK_PARTNER_NAME, // 파트너 이름 확인 - ACTION_START_PET_QUEST, // 2 Ʈ Ѵ. + ACTION_START_PET_QUEST, // 2차 펫 퀘스트를 시작한다. - ACTION_PET_WITHDRAW, // ã - ACTION_PET_DEPOSIT, // ñ淡 + ACTION_PET_WITHDRAW, // 펫 찾을래요 + ACTION_PET_DEPOSIT, // 펫 맡길래요 - ACTION_ENTER_EVENT_ZONE, // ̺Ʈ . - ACTION_ENTER_GDR_LAIR, // Ϸ ̿ 巹  + ACTION_ENTER_EVENT_ZONE, // 이벤트 존으로 들어갈래요. + ACTION_ENTER_GDR_LAIR, // 일루젼스 웨이에서 질드레 레어로 들어가기 - ACTION_TRADE_GQUEST_EVENT_ITEM, // ̺Ʈ Ʈ + ACTION_TRADE_GQUEST_EVENT_ITEM, // 이벤트 퀘스트 아이템 - ACTION_ENTER_SIEGE, // ( ̵) + ACTION_ENTER_SIEGE, // 공성전 참가(공성 지역으로 이동) - ACTION_REGISTER_SIEGE, // û - ACTION_REGISTER_REINFORCE, // û - ACTION_ACCEPT_REINFORCE, // û - ACTION_DENY_REINFORCE, // û ź + ACTION_REGISTER_SIEGE, // 공성 신청 + ACTION_REGISTER_REINFORCE, // 수비측 참전 신청 + ACTION_ACCEPT_REINFORCE, // 수비측 참전 신청 수락 + ACTION_DENY_REINFORCE, // 수비측 참전 신청 거부 - ACTION_RECALL_SIEGE, // - ACTION_SELECT_BLOOD_BIBLE, // 뿩 - ACTION_CLEAR_BLOOD_BIBLE, // + ACTION_RECALL_SIEGE, // 공성전에 길드원 데려오기 + ACTION_SELECT_BLOOD_BIBLE, // 피의 성서 대여 + ACTION_CLEAR_BLOOD_BIBLE, // 피의 성서 제거 - ACTION_MODIFY_TAX_RATIO, // - ACTION_SWAP_ADVANCEMENT_ITEM, // ȯ + ACTION_MODIFY_TAX_RATIO, // 세율 조절 + ACTION_SWAP_ADVANCEMENT_ITEM, // 승직 아이템 교환 - ACTION_SHOW_DONATION_DIALOG, // â ֱ - ACTION_ENTER_QUEST_ZONE, // DynamicZone - ACTION_SHOW_CONFIRM_GET_EVENT_ITEM_DIALOG, // ̺Ʈ ޱ Ȯâ + ACTION_SHOW_DONATION_DIALOG, // 기부창 보여주기 + ACTION_ENTER_QUEST_ZONE, // DynamicZone 입장 + ACTION_SHOW_CONFIRM_GET_EVENT_ITEM_DIALOG, // 이벤트 아이템 받기 확인창 ACTION_MAX }; diff --git a/src/server/gameserver/quest/ActionAcceptApartCouple.cpp b/src/server/gameserver/quest/ActionAcceptApartCouple.cpp index 29a89bcb..fa2cf95a 100644 --- a/src/server/gameserver/quest/ActionAcceptApartCouple.cpp +++ b/src/server/gameserver/quest/ActionAcceptApartCouple.cpp @@ -32,7 +32,7 @@ void ActionAcceptApartCouple::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionAcceptApartCouple::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionAcceptApartCouple.h b/src/server/gameserver/quest/ActionAcceptApartCouple.h index 0bab2a12..25b4d9c3 100644 --- a/src/server/gameserver/quest/ActionAcceptApartCouple.h +++ b/src/server/gameserver/quest/ActionAcceptApartCouple.h @@ -2,7 +2,7 @@ // Filename : ActionAcceptApartCouple.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_ACCEPT_APART_COUPLE_H__ diff --git a/src/server/gameserver/quest/ActionAcceptCoupleRequest.cpp b/src/server/gameserver/quest/ActionAcceptCoupleRequest.cpp index 726ddf94..5a966eb7 100644 --- a/src/server/gameserver/quest/ActionAcceptCoupleRequest.cpp +++ b/src/server/gameserver/quest/ActionAcceptCoupleRequest.cpp @@ -32,7 +32,7 @@ void ActionAcceptCoupleRequest::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionAcceptCoupleRequest::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionAcceptCoupleRequest.h b/src/server/gameserver/quest/ActionAcceptCoupleRequest.h index 5957635f..b259654d 100644 --- a/src/server/gameserver/quest/ActionAcceptCoupleRequest.h +++ b/src/server/gameserver/quest/ActionAcceptCoupleRequest.h @@ -3,7 +3,7 @@ // Filename : ActionAcceptCoupleRequest.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_ACCEPT_COUPLE_REQUEST_H__ diff --git a/src/server/gameserver/quest/ActionAcceptReinforce.cpp b/src/server/gameserver/quest/ActionAcceptReinforce.cpp index ae163970..7b913519 100644 --- a/src/server/gameserver/quest/ActionAcceptReinforce.cpp +++ b/src/server/gameserver/quest/ActionAcceptReinforce.cpp @@ -45,7 +45,7 @@ void ActionAcceptReinforce::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionAcceptReinforce::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionAcceptReinforce.h b/src/server/gameserver/quest/ActionAcceptReinforce.h index 21fd45e8..6c0e9e37 100644 --- a/src/server/gameserver/quest/ActionAcceptReinforce.h +++ b/src/server/gameserver/quest/ActionAcceptReinforce.h @@ -2,7 +2,7 @@ // Filename : ActionAcceptReinforce.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_ACCEPT_REINFORCE_H__ @@ -35,7 +35,7 @@ class ActionAcceptReinforce : public Action { } private: - ZoneID_t m_ZoneID; // û ZoneID + ZoneID_t m_ZoneID; // 전쟁을 신청한 성의 ZoneID }; diff --git a/src/server/gameserver/quest/ActionActivateMazeEnter.cpp b/src/server/gameserver/quest/ActionActivateMazeEnter.cpp index 3d01ce73..0c48cf87 100644 --- a/src/server/gameserver/quest/ActionActivateMazeEnter.cpp +++ b/src/server/gameserver/quest/ActionActivateMazeEnter.cpp @@ -50,7 +50,7 @@ void ActionActivateMazeEnter::read(PropertyBuffer& pb) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionActivateMazeEnter::execute(Creature* pNPC, Creature* pCreature) @@ -70,16 +70,16 @@ void ActionActivateMazeEnter::execute(Creature* pNPC, Creature* pCreature) try { ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(m_ZoneID); - // ε ڰ ƴϸ... + // 유료존인데 유료사용자가 아니면... if (pZoneInfo == NULL || pZoneInfo->isPayPlay() && !pGamePlayer->isPayPlaying()) { string connectIP = pGamePlayer->getSocket()->getHost(); - // Ѱ? + // 유료 서비스 사용이 가능한가? if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { sendPayInfo(pGamePlayer); - } else if (!pGamePlayer->isFamilyFreePass()) // йи н ִ. + } else if (!pGamePlayer->isFamilyFreePass()) // 패밀리 프리 패스는 유료존으로 갈 수 있다. { - // Ұ + // 유료 서비스 사용 불가인 경우 GCSystemMessage gcSystemMessage; if (g_pConfig->getPropertyInt("IsNetMarble") == 0) { diff --git a/src/server/gameserver/quest/ActionActivateMazeEnter.h b/src/server/gameserver/quest/ActionActivateMazeEnter.h index 2880a4f6..dd1e10e0 100644 --- a/src/server/gameserver/quest/ActionActivateMazeEnter.h +++ b/src/server/gameserver/quest/ActionActivateMazeEnter.h @@ -2,7 +2,7 @@ // Filename : ActionActivateMazeEnter.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_ACTIVATE_MAZE_ENTER_H__ diff --git a/src/server/gameserver/quest/ActionActivateMazeExit.cpp b/src/server/gameserver/quest/ActionActivateMazeExit.cpp index 6c4e4bbf..5cf820ae 100644 --- a/src/server/gameserver/quest/ActionActivateMazeExit.cpp +++ b/src/server/gameserver/quest/ActionActivateMazeExit.cpp @@ -55,7 +55,7 @@ void ActionActivateMazeExit::read(PropertyBuffer& pb) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionActivateMazeExit::execute(Creature* pNPC, Creature* pCreature) @@ -66,14 +66,14 @@ void ActionActivateMazeExit::execute(Creature* pNPC, Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isPC()); - // ̷ ⱸ üũ ϰ ش. -_- + // 미로 출구는 유료존 체크 안하고 보내준다. 젠장 -_- PlayerCreature* pPC = dynamic_cast(pCreature); Assert(pPC != NULL); bool isCorrect = false; if (!pPC->isFlag(Effect::EFFECT_CLASS_REFINIUM_TICKET)) { - filelog("EventBug.log", "̷ ȿ ִµ Ǵ Ƽ . α׾ƿϴ¼ۿ.. : %s", + filelog("EventBug.log", "미로 안에 있는데 리피늄 티켓이 없어. 로그아웃하는수밖에.. : %s", pPC->getName().c_str()); } else { EffectRefiniumTicket* pEffect = diff --git a/src/server/gameserver/quest/ActionActivateMazeExit.h b/src/server/gameserver/quest/ActionActivateMazeExit.h index 1623a76f..f9c1ac3b 100644 --- a/src/server/gameserver/quest/ActionActivateMazeExit.h +++ b/src/server/gameserver/quest/ActionActivateMazeExit.h @@ -2,7 +2,7 @@ // Filename : ActionActivateMazeExit.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_ACTIVATE_MAZE_EXIT_H__ diff --git a/src/server/gameserver/quest/ActionActivateMazeReturn.cpp b/src/server/gameserver/quest/ActionActivateMazeReturn.cpp index af8e2736..cdbf299c 100644 --- a/src/server/gameserver/quest/ActionActivateMazeReturn.cpp +++ b/src/server/gameserver/quest/ActionActivateMazeReturn.cpp @@ -50,7 +50,7 @@ void ActionActivateMazeReturn::read(PropertyBuffer& pb) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionActivateMazeReturn::execute(Creature* pNPC, Creature* pCreature) diff --git a/src/server/gameserver/quest/ActionActivateMazeReturn.h b/src/server/gameserver/quest/ActionActivateMazeReturn.h index 8a8c3f5d..ebe327bf 100644 --- a/src/server/gameserver/quest/ActionActivateMazeReturn.h +++ b/src/server/gameserver/quest/ActionActivateMazeReturn.h @@ -2,7 +2,7 @@ // Filename : ActionActivateMazeReturn.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_ACTIVATE_MAZE_RETURN_H__ diff --git a/src/server/gameserver/quest/ActionActivatePortal.cpp b/src/server/gameserver/quest/ActionActivatePortal.cpp index 16163ba2..40a34054 100644 --- a/src/server/gameserver/quest/ActionActivatePortal.cpp +++ b/src/server/gameserver/quest/ActionActivatePortal.cpp @@ -51,7 +51,7 @@ void ActionActivatePortal::read(PropertyBuffer& pb) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionActivatePortal::execute(Creature* pNPC, Creature* pCreature) @@ -72,16 +72,16 @@ void ActionActivatePortal::execute(Creature* pNPC, Creature* pCreature) try { ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(m_ZoneID); - // ε ڰ ƴϸ... + // 유료존인데 유료사용자가 아니면... if (pZoneInfo == NULL || pZoneInfo->isPayPlay() && !pGamePlayer->isPayPlaying()) { string connectIP = pGamePlayer->getSocket()->getHost(); - // Ѱ? + // 유료 서비스 사용이 가능한가? if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { sendPayInfo(pGamePlayer); - } else if (!pGamePlayer->isFamilyFreePass()) // йи н ִ. + } else if (!pGamePlayer->isFamilyFreePass()) // 패밀리 프리 패스는 유료존으로 갈 수 있다. { - // Ұ + // 유료 서비스 사용 불가인 경우 GCSystemMessage gcSystemMessage; if (g_pConfig->getPropertyInt("IsNetMarble") == 0) { @@ -111,7 +111,7 @@ void ActionActivatePortal::execute(Creature* pNPC, Creature* pCreature) Slayer* pSlayer = dynamic_cast(pCreature); Assert(pSlayer != NULL); - // ̸ Ÿ ̿ . + // 오토바이를 타고 있으면 오토바이에서 내린다. if (pSlayer->hasRideMotorcycle()) { pSlayer->getOffMotorcycle(); } @@ -121,7 +121,7 @@ void ActionActivatePortal::execute(Creature* pNPC, Creature* pCreature) Ousters* pOusters = dynamic_cast(pCreature); Assert(pOusters != NULL); - // Ÿ ش + // 실프 타고 있으면 내려준다 if (pOusters->isFlag(Effect::EFFECT_CLASS_SUMMON_SYLPH)) { Effect* pEffect = pOusters->findEffect(Effect::EFFECT_CLASS_SUMMON_SYLPH); if (pEffect != NULL) diff --git a/src/server/gameserver/quest/ActionActivatePortal.h b/src/server/gameserver/quest/ActionActivatePortal.h index 7d5984ab..a7d0b4bb 100644 --- a/src/server/gameserver/quest/ActionActivatePortal.h +++ b/src/server/gameserver/quest/ActionActivatePortal.h @@ -2,7 +2,7 @@ // Filename : ActionActivatePortal.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_ACTIVATE_PORTAL_H__ diff --git a/src/server/gameserver/quest/ActionAdvanceEventQuest.cpp b/src/server/gameserver/quest/ActionAdvanceEventQuest.cpp index e4e0416b..0e778cf7 100644 --- a/src/server/gameserver/quest/ActionAdvanceEventQuest.cpp +++ b/src/server/gameserver/quest/ActionAdvanceEventQuest.cpp @@ -38,7 +38,7 @@ void ActionAdvanceEventQuest::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionAdvanceEventQuest::execute(Creature* pCreature1, Creature* pCreature2) @@ -75,7 +75,7 @@ void ActionAdvanceEventQuest::execute(Creature* pCreature1, Creature* pCreature2 pPC->getQuestManager()->getEventQuestAdvanceManager()->save(m_QuestLevel); else filelog("EventBug.txt", - "ActionAdvanceEventQuest : 꽺 µ ȵǴ°ž߾ƾƾƾƾ... %s:%d", + "ActionAdvanceEventQuest : 어드밴스 해줬는데 왜 안되는거야아아아아아... %s:%d", pPC->getName().c_str(), qID); pPC->getQuestManager()->questRewarded(qID); diff --git a/src/server/gameserver/quest/ActionAdvanceEventQuest.h b/src/server/gameserver/quest/ActionAdvanceEventQuest.h index b7356c8b..f964d31a 100644 --- a/src/server/gameserver/quest/ActionAdvanceEventQuest.h +++ b/src/server/gameserver/quest/ActionAdvanceEventQuest.h @@ -2,7 +2,7 @@ // Filename : ActionAdvanceEventQuest.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_ADVANCE_EVENT_QUEST_H__ diff --git a/src/server/gameserver/quest/ActionAsk.cpp b/src/server/gameserver/quest/ActionAsk.cpp index 4ed94d21..c70b92ca 100644 --- a/src/server/gameserver/quest/ActionAsk.cpp +++ b/src/server/gameserver/quest/ActionAsk.cpp @@ -31,7 +31,7 @@ void ActionAsk::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionAsk::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionAsk.h b/src/server/gameserver/quest/ActionAsk.h index 97c023ca..bb5d80fc 100644 --- a/src/server/gameserver/quest/ActionAsk.h +++ b/src/server/gameserver/quest/ActionAsk.h @@ -2,7 +2,7 @@ // Filename : ActionAsk.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_ASK_H__ @@ -35,7 +35,7 @@ class ActionAsk : public Action { } private: - ScriptID_t m_ScriptID; // ̵ + ScriptID_t m_ScriptID; // 말할 대사 아이디 }; diff --git a/src/server/gameserver/quest/ActionAskByQuestLevel.cpp b/src/server/gameserver/quest/ActionAskByQuestLevel.cpp index 6d9346e0..8edffadb 100644 --- a/src/server/gameserver/quest/ActionAskByQuestLevel.cpp +++ b/src/server/gameserver/quest/ActionAskByQuestLevel.cpp @@ -39,7 +39,7 @@ void ActionAskByQuestLevel::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionAskByQuestLevel::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionAskByQuestLevel.h b/src/server/gameserver/quest/ActionAskByQuestLevel.h index 44c2f7e2..50dd027e 100644 --- a/src/server/gameserver/quest/ActionAskByQuestLevel.h +++ b/src/server/gameserver/quest/ActionAskByQuestLevel.h @@ -2,7 +2,7 @@ // Filename : ActionAskByQuestLevel.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_ASK_BY_QUEST_LEVEL_H__ @@ -35,7 +35,7 @@ class ActionAskByQuestLevel : public Action { } private: - ScriptID_t m_ScriptID[5]; // ̵ + ScriptID_t m_ScriptID[5]; // 말할 대사 아이디 }; diff --git a/src/server/gameserver/quest/ActionAskDynamic.cpp b/src/server/gameserver/quest/ActionAskDynamic.cpp index a868d2e5..44228a72 100644 --- a/src/server/gameserver/quest/ActionAskDynamic.cpp +++ b/src/server/gameserver/quest/ActionAskDynamic.cpp @@ -32,7 +32,7 @@ void ActionAskDynamic::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionAskDynamic::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionAskDynamic.h b/src/server/gameserver/quest/ActionAskDynamic.h index 4b3617f6..a465e219 100644 --- a/src/server/gameserver/quest/ActionAskDynamic.h +++ b/src/server/gameserver/quest/ActionAskDynamic.h @@ -2,7 +2,7 @@ // Filename : ActionAskDynamic.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_ASK_DYNAMIC_H__ @@ -33,7 +33,7 @@ class ActionAskDynamic : public Action { } private: - ScriptID_t m_ScriptID; // ̵ + ScriptID_t m_ScriptID; // 말할 대사 아이디 }; diff --git a/src/server/gameserver/quest/ActionAskVariable.cpp b/src/server/gameserver/quest/ActionAskVariable.cpp index df3f11b1..412d919f 100644 --- a/src/server/gameserver/quest/ActionAskVariable.cpp +++ b/src/server/gameserver/quest/ActionAskVariable.cpp @@ -60,7 +60,7 @@ void ActionAskVariable::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionAskVariable::execute(Creature* pCreature1, Creature* pCreature2) @@ -90,7 +90,7 @@ void ActionAskVariable::execute(Creature* pCreature1, Creature* pCreature2) string keyword = pInfo->getKeyword(); if (keyword == "EntranceFee") { - // Ḧ ־ش. + // 입장료를 넣어준다. ZoneID_t zoneID = atoi(pInfo->getParameter(0).c_str()); if (zoneID == 0) @@ -102,24 +102,24 @@ void ActionAskVariable::execute(Creature* pCreature1, Creature* pCreature2) Race_t race = g_pCastleInfoManager->getCastleInfo(zoneID)->getRace(); char strValue[20]; - // ϶ - // ϶  ִ + // 종족전쟁 중일땐 모두 무료 + // 길드전쟁 중일땐 성에 들어갈 수 있는 종족만 무료 if (g_pWarSystem->hasActiveRaceWar() || g_pWarSystem->hasCastleActiveWar(zoneID)) { - // sprintf( strValue, "" ); + // sprintf( strValue, "무료" ); sprintf(strValue, "%s", g_pStringPool->getString(STRID_FREE).c_str()); } else if (race == RACE_SLAYER) { char gold[15]; sprintf(gold, "%lu", value); string sGold(gold); convertCommaString(sGold); - // sprintf( strValue, "%s ", sGold.c_str() ); + // sprintf( strValue, "%s 레이", sGold.c_str() ); sprintf(strValue, "%s", (sGold + " " + g_pStringPool->getString(STRID_REI)).c_str()); } else { char gold[15]; sprintf(gold, "%lu", value); string sGold(gold); convertCommaString(sGold); - // sprintf( strValue, "%s ֵ", sGold.c_str() ); + // sprintf( strValue, "%s 겔드", sGold.c_str() ); sprintf(strValue, "%s", (sGold + " " + g_pStringPool->getString(STRID_GELD)).c_str()); } @@ -128,7 +128,7 @@ void ActionAskVariable::execute(Creature* pCreature1, Creature* pCreature2) else pParam->setValue(g_pStringPool->getString(STRID_NO_ENTER)); } else if (keyword == "CastleOwner") { - // üũؼ ־ش. + // 성 주인을 체크해서 넣어준다. ZoneID_t zoneID = atoi(pInfo->getParameter(0).c_str()); if (zoneID == 0) @@ -138,28 +138,28 @@ void ActionAskVariable::execute(Creature* pCreature1, Creature* pCreature2) string result; if (pCastleInfo != NULL) { if (pCastleInfo->isCommon()) { - // 뼺̴. + // 공용성이다. if (pCastleInfo->getRace() == Guild::GUILD_RACE_SLAYER) { - // ̾ 뼺̴. - // result = "̾ 뼺"; + // 슬레이어 공용성이다. + // result = "슬레이어 공용성"; result = g_pStringPool->getString(STRID_SLAYER_COMMON_CASTLE); } else if (pCastleInfo->getRace() == Guild::GUILD_RACE_VAMPIRE) { - // ̾ 뼺̴. - // result = "̾ 뼺"; + // 뱀파이어 공용성이다. + // result = "뱀파이어 공용성"; result = g_pStringPool->getString(STRID_VAMPIRE_COMMON_CASTLE); } else { - // result = "ƿ콺 뼺"; + // result = "아우스터즈 공용성"; result = g_pStringPool->getString(STRID_OUSTERS_COMMON_CASTLE); } } else { - // 尡 ̴. + // 길드가 소유한 성이다. Guild* pGuild = g_pGuildManager->getGuild(pCastleInfo->getGuildID()); if (pGuild == NULL) - // result = "ξ "; + // result = "주인없는 성"; result = g_pStringPool->getString(STRID_NO_MASTER_CASTLE); else // result = pGuild->getName() + ( (pGuild->getRace() == - // RACE_SLAYER)?"":"Ŭ" ) + " "; + // RACE_SLAYER)?"팀":"클랜" ) + "의 성"; result = pGuild->getName() + ((pGuild->getRace() == RACE_SLAYER) ? (g_pStringPool->getString(STRID_TEAM)) : (g_pStringPool->getString(STRID_CLAN))) + @@ -201,16 +201,16 @@ void ActionAskVariable::execute(Creature* pCreature1, Creature* pCreature2) SiegeWar* pNextWar = dynamic_cast(pNextWork); if (pNextWar == NULL) { - pParam->setValue(""); + pParam->setValue("없는"); } else { GuildID_t gID = pNextWar->recentReinforceGuild(); Guild* pGuild = g_pGuildManager->getGuild(gID); if (pGuild == NULL) - pParam->setValue(""); + pParam->setValue("없는"); else pParam->setValue(pGuild->getName()); - cout << pParam->getValue() << " " << endl; + cout << pParam->getValue() << " 원군" << endl; ; } } else if (keyword == "RedistGold") { @@ -243,13 +243,13 @@ void ActionAskVariable::execute(Creature* pCreature1, Creature* pCreature2) char strValue[20]; if (pCastleInfo->getRace() == RACE_SLAYER) { - // sprintf( strValue, "%s ", sGold.c_str() ); + // sprintf( strValue, "%s 레이", sGold.c_str() ); sprintf(strValue, "%s", (sGold + " " + g_pStringPool->getString(STRID_REI)).c_str()); } else if (pCastleInfo->getRace() == RACE_VAMPIRE) { - // sprintf( strValue, "%s ֵ", sGold.c_str() ); + // sprintf( strValue, "%s 겔드", sGold.c_str() ); sprintf(strValue, "%s", (sGold + " " + g_pStringPool->getString(STRID_GELD)).c_str()); } else { - // sprintf( strValue, "%s ڵ", sGold.c_str() ); + // sprintf( strValue, "%s 자드", sGold.c_str() ); sprintf(strValue, "%s", (sGold + " " + g_pStringPool->getString(STRID_ZARD)).c_str()); } @@ -266,34 +266,34 @@ void ActionAskVariable::execute(Creature* pCreature1, Creature* pCreature2) Attr_t grade = pSlayer->getQuestGrade(); if (grade < 61) { - // pParam->setValue("ϼ"); + // pParam->setValue("지하수로"); pParam->setValue(g_pStringPool->getString(STRID_SLAYER_QUESTZONE_2_1)); } else if (grade < 96) { - pParam->setValue("Ͼ ϼ"); + pParam->setValue("에슬라니아 북서"); pParam->setValue(g_pStringPool->getString(STRID_SLAYER_QUESTZONE_2_2)); } else if (grade < 131) { - pParam->setValue("Ͼ ϵ"); + pParam->setValue("에슬라니아 북동"); pParam->setValue(g_pStringPool->getString(STRID_SLAYER_QUESTZONE_2_3)); } else if (grade < 171) { - pParam->setValue("Ͼ "); + pParam->setValue("에슬라니아 남서"); pParam->setValue(g_pStringPool->getString(STRID_SLAYER_QUESTZONE_2_4)); } else if (grade < 211) { - pParam->setValue("Ͼ "); + pParam->setValue("에슬라니아 던전"); pParam->setValue(g_pStringPool->getString(STRID_SLAYER_QUESTZONE_2_5)); } else if (grade < 241) { - pParam->setValue("κŸ "); + pParam->setValue("드로베타 남서"); pParam->setValue(g_pStringPool->getString(STRID_SLAYER_QUESTZONE_2_6)); } else if (grade < 271) { - pParam->setValue("κŸ "); + pParam->setValue("드로베타 남동"); pParam->setValue(g_pStringPool->getString(STRID_SLAYER_QUESTZONE_2_7)); } else if (grade < 291) { - pParam->setValue("Ƽȣ "); + pParam->setValue("티모르호수 남서"); pParam->setValue(g_pStringPool->getString(STRID_SLAYER_QUESTZONE_2_8)); } else if (grade < 301) { - pParam->setValue("Ƽȣ "); + pParam->setValue("티모르호수 남동"); pParam->setValue(g_pStringPool->getString(STRID_SLAYER_QUESTZONE_2_9)); } else { - pParam->setValue("ȴ 2"); + pParam->setValue("라옴던전 2층"); pParam->setValue(g_pStringPool->getString(STRID_SLAYER_QUESTZONE_2_10)); } } else if (pCreature2->isVampire()) { @@ -301,34 +301,34 @@ void ActionAskVariable::execute(Creature* pCreature1, Creature* pCreature2) Level_t level = pVampire->getLevel(); if (level < 11) { - pParam->setValue("丮 2"); + pParam->setValue("바토리 던전 2층"); pParam->setValue(g_pStringPool->getString(STRID_VAMPIRE_QUESTZONE_2_1)); } else if (level < 21) { - pParam->setValue(" "); + pParam->setValue("림보 남동"); pParam->setValue(g_pStringPool->getString(STRID_VAMPIRE_QUESTZONE_2_2)); } else if (level < 31) { - pParam->setValue(" ϵ"); + pParam->setValue("림보 북동"); pParam->setValue(g_pStringPool->getString(STRID_VAMPIRE_QUESTZONE_2_3)); } else if (level < 41) { - pParam->setValue(" ϼ"); + pParam->setValue("림보 북서"); pParam->setValue(g_pStringPool->getString(STRID_VAMPIRE_QUESTZONE_2_4)); } else if (level < 51) { - pParam->setValue("Ƽ ȣ ϵ"); + pParam->setValue("티모르 호수 북동"); pParam->setValue(g_pStringPool->getString(STRID_VAMPIRE_QUESTZONE_2_5)); } else if (level < 61) { - pParam->setValue("ε "); + pParam->setValue("로딘산 남서"); pParam->setValue(g_pStringPool->getString(STRID_VAMPIRE_QUESTZONE_2_6)); } else if (level < 71) { - pParam->setValue("ε "); + pParam->setValue("로딘산 남동"); pParam->setValue(g_pStringPool->getString(STRID_VAMPIRE_QUESTZONE_2_7)); } else if (level < 81) { - pParam->setValue("̼ 1"); + pParam->setValue("아이센 던전 1층"); pParam->setValue(g_pStringPool->getString(STRID_VAMPIRE_QUESTZONE_2_8)); } else if (level < 91) { - pParam->setValue("̼ 2"); + pParam->setValue("아이센 던전 2층"); pParam->setValue(g_pStringPool->getString(STRID_VAMPIRE_QUESTZONE_2_9)); } else { - pParam->setValue("ƴ "); + pParam->setValue("아담의 성지 동쪽"); pParam->setValue(g_pStringPool->getString(STRID_VAMPIRE_QUESTZONE_2_10)); } } else if (pCreature2->isOusters()) { @@ -336,49 +336,49 @@ void ActionAskVariable::execute(Creature* pCreature1, Creature* pCreature2) Level_t level = pOusters->getLevel(); if (level < 11) { - pParam->setValue("ϴϾ 1"); + pParam->setValue("하니알 던전 1층"); pParam->setValue(g_pStringPool->getString(STRID_OUSTERS_QUESTZONE_2_1)); } else if (level < 21) { - pParam->setValue("ϴϾ 2"); + pParam->setValue("하니알 던전 2층"); pParam->setValue(g_pStringPool->getString(STRID_OUSTERS_QUESTZONE_2_2)); } else if (level < 31) { - pParam->setValue("īŻ ϵ"); + pParam->setValue("카스탈로 북동"); pParam->setValue(g_pStringPool->getString(STRID_OUSTERS_QUESTZONE_2_3)); } else if (level < 41) { - pParam->setValue(" ͳ"); + pParam->setValue("고르고바 터널"); pParam->setValue(g_pStringPool->getString(STRID_OUSTERS_QUESTZONE_2_4)); } else if (level < 51) { - pParam->setValue("κŸ ϵ"); + pParam->setValue("드로베타 북동"); pParam->setValue(g_pStringPool->getString(STRID_OUSTERS_QUESTZONE_2_5)); } else if (level < 61) { - pParam->setValue("κŸ ϼ"); + pParam->setValue("드로베타 북서"); pParam->setValue(g_pStringPool->getString(STRID_OUSTERS_QUESTZONE_2_6)); } else if (level < 71) { - pParam->setValue("ε ϵ"); + pParam->setValue("로딘산 북동"); pParam->setValue(g_pStringPool->getString(STRID_OUSTERS_QUESTZONE_2_7)); } else if (level < 81) { - pParam->setValue("ε ϼ"); + pParam->setValue("로딘산 북서"); pParam->setValue(g_pStringPool->getString(STRID_OUSTERS_QUESTZONE_2_8)); } else if (level < 91) { - pParam->setValue(" 2"); + pParam->setValue("라센 내성 2층"); pParam->setValue(g_pStringPool->getString(STRID_OUSTERS_QUESTZONE_2_9)); } else { - pParam->setValue(" 2"); + pParam->setValue("라옴 던전 2층"); pParam->setValue(g_pStringPool->getString(STRID_OUSTERS_QUESTZONE_2_10)); } } } else if (questLevel == 3) { if (pCreature2->isSlayer()) { - pParam->setValue("Ͼ "); + pParam->setValue("에슬라니아 남서"); pParam->setValue(g_pStringPool->getString(STRID_SLAYER_MINE_ENTER)); } else if (pCreature2->isVampire()) { - pParam->setValue(" ϵ"); + pParam->setValue("림보 북동"); pParam->setValue(g_pStringPool->getString(STRID_VAMPIRE_MINE_ENTER)); } else if (pCreature2->isOusters()) { - pParam->setValue("īŻ ϵ"); + pParam->setValue("카스탈로 북동"); pParam->setValue(g_pStringPool->getString(STRID_OUSTERS_MINE_ENTER)); } else { - filelog("EventBug.txt", "ActionAskVariable : 3ܰ Ʈ ãµ ÷̾ ̻ϴ."); + filelog("EventBug.txt", "ActionAskVariable : 3단계 퀘스트 존 찾는데 플레이어가 이상하다."); } } else if (questLevel == 4) { if (pCreature2->isSlayer()) { @@ -386,19 +386,19 @@ void ActionAskVariable::execute(Creature* pCreature1, Creature* pCreature2) Attr_t grade = pSlayer->getQuestGrade(); if (grade < 131) { - pParam->setValue("Ͼ ϼ"); + pParam->setValue("에슬라니아 북서"); pParam->setValue(g_pStringPool->getString(STRID_SLAYER_QUESTZONE_4_1)); } else if (grade < 211) { - pParam->setValue("Ͼ "); + pParam->setValue("에슬라니아 던전"); pParam->setValue(g_pStringPool->getString(STRID_SLAYER_QUESTZONE_4_2)); } else if (grade < 271) { - pParam->setValue("κŸ "); + pParam->setValue("드로베타 남동"); pParam->setValue(g_pStringPool->getString(STRID_SLAYER_QUESTZONE_4_3)); } else if (grade < 300) { - pParam->setValue("Ƽ "); + pParam->setValue("티모르 남동"); pParam->setValue(g_pStringPool->getString(STRID_SLAYER_QUESTZONE_4_4)); } else { - pParam->setValue(" 2"); + pParam->setValue("라옴 던전 2층"); pParam->setValue(g_pStringPool->getString(STRID_SLAYER_QUESTZONE_4_5)); } } else if (pCreature2->isVampire()) { @@ -406,19 +406,19 @@ void ActionAskVariable::execute(Creature* pCreature1, Creature* pCreature2) Level_t level = pVampire->getLevel(); if (level < 31) { - pParam->setValue(" "); + pParam->setValue("림보 남동"); pParam->setValue(g_pStringPool->getString(STRID_VAMPIRE_QUESTZONE_4_1)); } else if (level < 51) { - pParam->setValue(" ϼ"); + pParam->setValue("림보 북서"); pParam->setValue(g_pStringPool->getString(STRID_VAMPIRE_QUESTZONE_4_2)); } else if (level < 71) { - pParam->setValue("κŸ "); + pParam->setValue("드로베타 남서"); pParam->setValue(g_pStringPool->getString(STRID_VAMPIRE_QUESTZONE_4_3)); } else if (level < 91) { - pParam->setValue("̼ 1"); + pParam->setValue("아이센 던전 1층"); pParam->setValue(g_pStringPool->getString(STRID_VAMPIRE_QUESTZONE_4_4)); } else { - pParam->setValue("̼ 2"); + pParam->setValue("아이센 던전 2층"); pParam->setValue(g_pStringPool->getString(STRID_VAMPIRE_QUESTZONE_4_5)); } } else if (pCreature2->isOusters()) { @@ -426,26 +426,26 @@ void ActionAskVariable::execute(Creature* pCreature1, Creature* pCreature2) Level_t level = pOusters->getLevel(); if (level < 31) { - pParam->setValue("īŻ ϵ"); + pParam->setValue("카스탈로 북동"); pParam->setValue(g_pStringPool->getString(STRID_OUSTERS_QUESTZONE_4_1)); } else if (level < 51) { - pParam->setValue("κŸ ϼ"); + pParam->setValue("드로베타 북서"); pParam->setValue(g_pStringPool->getString(STRID_OUSTERS_QUESTZONE_4_2)); } else if (level < 71) { - pParam->setValue("ε "); + pParam->setValue("로딘산 남서"); pParam->setValue(g_pStringPool->getString(STRID_OUSTERS_QUESTZONE_4_3)); } else if (level < 91) { - pParam->setValue("Ƽ "); + pParam->setValue("티모르 남동"); pParam->setValue(g_pStringPool->getString(STRID_OUSTERS_QUESTZONE_4_4)); } else { - pParam->setValue(" 1"); + pParam->setValue("라옴 던전 1층"); pParam->setValue(g_pStringPool->getString(STRID_OUSTERS_QUESTZONE_4_5)); } } else { - filelog("EventBug.txt", "ActionAskVariable : 4ܰ Ʈ ãµ ÷̾ ̻ϴ."); + filelog("EventBug.txt", "ActionAskVariable : 4단계 퀘스트 존 찾는데 플레이어가 이상하다."); } } else { - filelog("EventBug.txt", "ActionAskVariable : Ʈ ãµ Ʈ ̻ϴ. %d", questLevel); + filelog("EventBug.txt", "ActionAskVariable : 퀘스트 존 찾는데 퀘스트 레벨이 이상하다. %d", questLevel); Assert(false); } } else if (keyword == "EventQuestMonster") { @@ -575,10 +575,10 @@ void ActionAskVariable::execute(Creature* pCreature1, Creature* pCreature2) pParam->setValue(g_pStringPool->getString(STRID_QUEST_MONSTER_5)); } } else { - filelog("EventBug.txt", "ActionAskVariable : 4ܰ Ʈ ãµ ÷̾ ̻ϴ."); + filelog("EventBug.txt", "ActionAskVariable : 4단계 퀘스트 몬스터 찾는데 플레이어가 이상하다."); } } else { - filelog("EventBug.txt", "ActionAskVariable : Ʈ ãµ Ʈ ̻ϴ. %d", + filelog("EventBug.txt", "ActionAskVariable : 퀘스트 몬스터 찾는데 퀘스트 레벨이 이상하다. %d", questLevel); Assert(false); } @@ -602,7 +602,7 @@ void ActionAskVariable::execute(Creature* pCreature1, Creature* pCreature2) if (level < 40) { GCSystemMessage gcSM; - gcSM.setMessage("ǰȼ޷г."); + gcSM.setMessage("뎠품된섬轟랬쏵契녘膠훨蛟."); pCreature2->getPlayer()->sendPacket(&gcSM); GCNPCResponse gcNPCR; gcNPCR.setCode(NPC_RESPONSE_QUIT_DIALOGUE); diff --git a/src/server/gameserver/quest/ActionAskVariable.h b/src/server/gameserver/quest/ActionAskVariable.h index 1f0ad49f..de496eef 100644 --- a/src/server/gameserver/quest/ActionAskVariable.h +++ b/src/server/gameserver/quest/ActionAskVariable.h @@ -2,7 +2,7 @@ // Filename : ActionAskVariable.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_ASK_VARIABLE_H__ @@ -40,7 +40,7 @@ class ActionAskVariable : public Action { } private: - ScriptID_t m_ScriptID; // ̵ + ScriptID_t m_ScriptID; // 말할 대사 아이디 VariableBuffer* m_pVariableBuffer; }; diff --git a/src/server/gameserver/quest/ActionBuy.cpp b/src/server/gameserver/quest/ActionBuy.cpp index 13399552..885b86a4 100644 --- a/src/server/gameserver/quest/ActionBuy.cpp +++ b/src/server/gameserver/quest/ActionBuy.cpp @@ -2,9 +2,9 @@ // Filename : ActionBuy.cpp // Written By : // Description : -// NPC ÷̾κ ̴ ׼̴. Sell ׼ǰ -// Ư ϴ , ÷̾ -// Ŷ ִ Ѵ. +// NPC가 플레이어로부터 아이템을 사들이는 액션이다. Sell 액션과 +// 마찬가지로 특별히 하는 일은 없고, 단지 플레이어에게 현재 +// 상점의 버전의 패킷으로 보내주는 역할을 한다. //////////////////////////////////////////////////////////////////////////////// #include "ActionBuy.h" @@ -16,12 +16,12 @@ #include "NPC.h" //////////////////////////////////////////////////////////////////////////////// -// ActionBuy ׼ ׳ Ŭ̾Ʈ ShopVersion ִ ̹Ƿ, -// Ư о鿩 ĶͰ . +// ActionBuy 액션은 그냥 클라이언트에게 ShopVersion을 보내주는 것이므로, +// 특별히 읽어들여야 할 파라미터가 없다. // -// ߿ Ư ̴ ϸ, -// ⼭ Ƽ  о̸ ǰ. ... NPC κе ľ -// ̰... +// 나중에 특정 종류의 아이템을 사들이는 상점 같은 것을 만들고자 하면, +// 여기서 프로퍼티를 만들어서 읽어들이면 되겠지. 흠... NPC 부분도 고쳐야 +// 할 것이고... //////////////////////////////////////////////////////////////////////////////// void ActionBuy::read(PropertyBuffer& propertyBuffer) @@ -32,7 +32,7 @@ void ActionBuy::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionBuy::execute(Creature* pCreature1, Creature* pCreature2) @@ -48,11 +48,11 @@ void ActionBuy::execute(Creature* pCreature1, Creature* pCreature2) Player* pPlayer = pCreature2->getPlayer(); Assert(pPlayer != NULL); - // ޾Ҵٴ Ŭ̾Ʈ ˷ش. + // 먼저 대답을 잘 받았다는 사실을 클라이언트에게 알려준다. GCNPCResponse okpkt; pPlayer->sendPacket(&okpkt); - // ü ˷ش. + // 현재 시장 시세를 알려준다. GCShopMarketCondition pkt; pkt.setObjectID(pNPC->getObjectID()); pkt.setMarketCondBuy(pNPC->getMarketCondBuy()); diff --git a/src/server/gameserver/quest/ActionBuy.h b/src/server/gameserver/quest/ActionBuy.h index eb989288..c09e666f 100644 --- a/src/server/gameserver/quest/ActionBuy.h +++ b/src/server/gameserver/quest/ActionBuy.h @@ -2,9 +2,9 @@ // Filename : ActionBuy.h // Written By : excel96 // Description : -// NPC ÷̾κ ̴ ׼̴. Sell ׼ǰ -// Ư ϴ , ÷̾ Ŷ -// ִ Ѵ. +// NPC가 플레이어로부터 아이템을 사들이는 액션이다. Sell 액션과 마찬가지로 +// 특별히 하는 일은 없고, 단지 플레이어에게 현재 상점의 버전을 패킷으로 +// 보내주는 역할을 한다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_BUY_H__ diff --git a/src/server/gameserver/quest/ActionCallHelicopter.cpp b/src/server/gameserver/quest/ActionCallHelicopter.cpp index 2c78ca58..4cc319c7 100644 --- a/src/server/gameserver/quest/ActionCallHelicopter.cpp +++ b/src/server/gameserver/quest/ActionCallHelicopter.cpp @@ -24,7 +24,7 @@ void ActionCallHelicopter::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionCallHelicopter::execute(Creature* pCreature1, Creature* pCreature2) @@ -36,7 +36,7 @@ void ActionCallHelicopter::execute(Creature* pCreature1, Creature* pCreature2) Assert(pCreature1->isNPC()); Assert(pCreature2->isPC()); - // ̾ ׼ ȴ. + // 슬레이어만이 이 액션의 대상이 된다. if (!pCreature2->isSlayer()) return; if (pCreature2->isFlag(Effect::EFFECT_CLASS_HAS_FLAG) || pCreature2->isFlag(Effect::EFFECT_CLASS_HAS_SWEEPER)) @@ -45,7 +45,7 @@ void ActionCallHelicopter::execute(Creature* pCreature1, Creature* pCreature2) Slayer* pSlayer = dynamic_cast(pCreature2); Assert(pSlayer != NULL); - // ̾ Ʈ ɾش. + // 슬레이어에게 이펙트를 걸어준다. if (!pSlayer->isFlag(Effect::EFFECT_CLASS_SLAYER_PORTAL)) pSlayer->setFlag(Effect::EFFECT_CLASS_SLAYER_PORTAL); diff --git a/src/server/gameserver/quest/ActionCancelEventQuestScript.cpp b/src/server/gameserver/quest/ActionCancelEventQuestScript.cpp index 2bd84b91..5e5ad410 100644 --- a/src/server/gameserver/quest/ActionCancelEventQuestScript.cpp +++ b/src/server/gameserver/quest/ActionCancelEventQuestScript.cpp @@ -40,7 +40,7 @@ void ActionCancelEventQuestScript::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionCancelEventQuestScript::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionCancelEventQuestScript.h b/src/server/gameserver/quest/ActionCancelEventQuestScript.h index 68a9ccba..45c2acc8 100644 --- a/src/server/gameserver/quest/ActionCancelEventQuestScript.h +++ b/src/server/gameserver/quest/ActionCancelEventQuestScript.h @@ -2,7 +2,7 @@ // Filename : ActionCancelEventQuestScript.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_CANCEL_EVENT_QUEST_SCRIPT_H__ @@ -35,7 +35,7 @@ class ActionCancelEventQuestScript : public Action { } private: - ScriptID_t m_ScriptID[5]; // ̵ + ScriptID_t m_ScriptID[5]; // 말할 대사 아이디 ScriptID_t m_CounterScriptID; ScriptID_t m_SuccessScriptID; }; diff --git a/src/server/gameserver/quest/ActionCancelQuest.cpp b/src/server/gameserver/quest/ActionCancelQuest.cpp index 4d22b275..78b85193 100644 --- a/src/server/gameserver/quest/ActionCancelQuest.cpp +++ b/src/server/gameserver/quest/ActionCancelQuest.cpp @@ -37,7 +37,7 @@ void ActionCancelQuest::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionCancelQuest::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionCancelQuest.h b/src/server/gameserver/quest/ActionCancelQuest.h index e3862718..21a4fab7 100644 --- a/src/server/gameserver/quest/ActionCancelQuest.h +++ b/src/server/gameserver/quest/ActionCancelQuest.h @@ -2,7 +2,7 @@ // Filename : ActionCancelQuest.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_CANCEL_QUEST_H__ diff --git a/src/server/gameserver/quest/ActionCheckPartnerName.cpp b/src/server/gameserver/quest/ActionCheckPartnerName.cpp index 99dc18da..fd8a80d1 100644 --- a/src/server/gameserver/quest/ActionCheckPartnerName.cpp +++ b/src/server/gameserver/quest/ActionCheckPartnerName.cpp @@ -35,7 +35,7 @@ void ActionCheckPartnerName::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionCheckPartnerName::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionCheckPartnerName.h b/src/server/gameserver/quest/ActionCheckPartnerName.h index 7c6e2286..f04568f4 100644 --- a/src/server/gameserver/quest/ActionCheckPartnerName.h +++ b/src/server/gameserver/quest/ActionCheckPartnerName.h @@ -2,7 +2,7 @@ // Filename : ActionCheckPartnerName.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_CHECK_PARTNER_NAME_H__ diff --git a/src/server/gameserver/quest/ActionClearBloodBible.cpp b/src/server/gameserver/quest/ActionClearBloodBible.cpp index a6027483..0c5d862e 100644 --- a/src/server/gameserver/quest/ActionClearBloodBible.cpp +++ b/src/server/gameserver/quest/ActionClearBloodBible.cpp @@ -33,7 +33,7 @@ void ActionClearBloodBible::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionClearBloodBible::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionClearBloodBible.h b/src/server/gameserver/quest/ActionClearBloodBible.h index 46d36cf5..d4f7a93d 100644 --- a/src/server/gameserver/quest/ActionClearBloodBible.h +++ b/src/server/gameserver/quest/ActionClearBloodBible.h @@ -2,7 +2,7 @@ // Filename : ActionClearBloodBible.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_CLEAR_BLOOD_BIBLE_H__ diff --git a/src/server/gameserver/quest/ActionClearRankBonus.cpp b/src/server/gameserver/quest/ActionClearRankBonus.cpp index aafd1708..87c71adc 100644 --- a/src/server/gameserver/quest/ActionClearRankBonus.cpp +++ b/src/server/gameserver/quest/ActionClearRankBonus.cpp @@ -38,7 +38,7 @@ void ActionClearRankBonus::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionClearRankBonus::execute(Creature* pCreature1, Creature* pCreature2) @@ -57,7 +57,7 @@ void ActionClearRankBonus::execute(Creature* pCreature1, Creature* pCreature2) PlayerCreature* pPC = dynamic_cast(pCreature2); Assert(pPC != NULL); - // ϴ â ݰ . + // 일단 창을 닫고 본다. GCNPCResponse response; Gold_t clearFee = 0; diff --git a/src/server/gameserver/quest/ActionContractGnomesHorn.cpp b/src/server/gameserver/quest/ActionContractGnomesHorn.cpp index f6fad00f..8cb3f178 100644 --- a/src/server/gameserver/quest/ActionContractGnomesHorn.cpp +++ b/src/server/gameserver/quest/ActionContractGnomesHorn.cpp @@ -2,9 +2,9 @@ // Filename : ActionContractGnomesHorn.cpp // Written By : // Description : -// NPC ÷̾ Ĵ ׼̴. δ ŷ -// ϰ ׼̸, ϴ ÷̾ NPC -// Ŷ ִ ̴. +// NPC가 아이템을 플레이어에게 파는 액션이다. 실제로는 거래를 +// 시작하게 만드는 액션이며, 하는 일은 플레이어에게 현재 NPC의 +// 상점 버전을 패킷으로 보내주는 일 뿐이다. //////////////////////////////////////////////////////////////////////////////// #include "ActionContractGnomesHorn.h" @@ -19,8 +19,8 @@ #include "Trigger.h" //////////////////////////////////////////////////////////////////////////////// -// ActionContractGnomesHorn ׼ ׳ Ŭ̾Ʈ ShopVersion ִ ̹Ƿ, -// Ư о鿩 ĶͰ . +// ActionContractGnomesHorn 액션은 그냥 클라이언트에게 ShopVersion을 보내주는 것이므로, +// 특별히 읽어들여야 할 파라미터가 없다. //////////////////////////////////////////////////////////////////////////////// void ActionContractGnomesHorn::read(PropertyBuffer& propertyBuffer) @@ -31,7 +31,7 @@ void ActionContractGnomesHorn::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionContractGnomesHorn::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionCreateGuild.cpp b/src/server/gameserver/quest/ActionCreateGuild.cpp index aba15486..a809b3f9 100644 --- a/src/server/gameserver/quest/ActionCreateGuild.cpp +++ b/src/server/gameserver/quest/ActionCreateGuild.cpp @@ -2,7 +2,7 @@ // Filename : ActionCreateGuild.cpp // Written By : // Description : -// NPC Ŭ̾Ʈ Ͽ â Ѵ. +// NPC를 통해 클라이언트로 하여금 길드 생성창을 띄우게 한다. //////////////////////////////////////////////////////////////////////////////// #include "ActionCreateGuild.h" @@ -20,14 +20,14 @@ void ActionCreateGuild::read(PropertyBuffer& propertyBuffer) { __BEGIN_TRY - // â ͻ̹Ƿ Ư о μ . + // 길드 생성창을 띄우는 것뿐이므로 특별히 읽어들일 인수는 없다. __END_CATCH } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionCreateGuild::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionCreateGuild.h b/src/server/gameserver/quest/ActionCreateGuild.h index 4320fea8..6e88c3dd 100644 --- a/src/server/gameserver/quest/ActionCreateGuild.h +++ b/src/server/gameserver/quest/ActionCreateGuild.h @@ -2,7 +2,7 @@ // Filename : ActionCreateGuild.h // Written By : excel96 // Description : -// NPC Ŭ̾Ʈ Ͽ â Ѵ. +// NPC를 통해 클라이언트로 하여금 길드 생성창을 띄우게 한다. //////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_CREATE_GUILD_H__ diff --git a/src/server/gameserver/quest/ActionDenyReinforce.cpp b/src/server/gameserver/quest/ActionDenyReinforce.cpp index 25d4cf27..290cabe6 100644 --- a/src/server/gameserver/quest/ActionDenyReinforce.cpp +++ b/src/server/gameserver/quest/ActionDenyReinforce.cpp @@ -45,7 +45,7 @@ void ActionDenyReinforce::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionDenyReinforce::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionDenyReinforce.h b/src/server/gameserver/quest/ActionDenyReinforce.h index b4652774..84c3934f 100644 --- a/src/server/gameserver/quest/ActionDenyReinforce.h +++ b/src/server/gameserver/quest/ActionDenyReinforce.h @@ -2,7 +2,7 @@ // Filename : ActionDenyReinforce.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_DENY_REINFORCE_H__ @@ -35,7 +35,7 @@ class ActionDenyReinforce : public Action { } private: - ZoneID_t m_ZoneID; // û ZoneID + ZoneID_t m_ZoneID; // 전쟁을 신청한 성의 ZoneID }; diff --git a/src/server/gameserver/quest/ActionDestroyGuild.cpp b/src/server/gameserver/quest/ActionDestroyGuild.cpp index 27b786e6..9261ef04 100644 --- a/src/server/gameserver/quest/ActionDestroyGuild.cpp +++ b/src/server/gameserver/quest/ActionDestroyGuild.cpp @@ -2,7 +2,7 @@ // Filename : ActionDestroyGuild.cpp // Written By : // Description : -// NPC Ŭ̾Ʈ Ͽ ü â Ѵ. +// NPC를 통해 클라이언트로 하여금 길드 해체 창을 띄우게 한다. //////////////////////////////////////////////////////////////////////////////// #include "ActionDestroyGuild.h" @@ -20,14 +20,14 @@ void ActionDestroyGuild::read(PropertyBuffer& propertyBuffer) { __BEGIN_TRY - // ü â ͻ̹Ƿ Ư о μ . + // 길드 해체 창을 띄우는 것뿐이므로 특별히 읽어들일 인수는 없다. __END_CATCH } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionDestroyGuild::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionDestroyGuild.h b/src/server/gameserver/quest/ActionDestroyGuild.h index ebcb972f..f824f5c5 100644 --- a/src/server/gameserver/quest/ActionDestroyGuild.h +++ b/src/server/gameserver/quest/ActionDestroyGuild.h @@ -2,7 +2,7 @@ // Filename : ActionDestroyGuild.h // Written By : // Description : -// NPC Ŭ̾Ʈ Ͽ â Ѵ. +// NPC를 통해 클라이언트로 하여금 길드 생성창을 띄우게 한다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_DESTROY_GUILD_H__ diff --git a/src/server/gameserver/quest/ActionDownSkill.cpp b/src/server/gameserver/quest/ActionDownSkill.cpp index 6727ba8a..29f256be 100644 --- a/src/server/gameserver/quest/ActionDownSkill.cpp +++ b/src/server/gameserver/quest/ActionDownSkill.cpp @@ -2,7 +2,7 @@ // Filename : ActionDownSkill.cpp // Written By : // Description : -// NPC Ŭ̾Ʈ Ͽ â Ѵ. +// NPC를 통해 클라이언트로 하여금 길드 생성창을 띄우게 한다. //////////////////////////////////////////////////////////////////////////////// #include "ActionDownSkill.h" @@ -19,14 +19,14 @@ void ActionDownSkill::read(PropertyBuffer& propertyBuffer) { __BEGIN_TRY - // â ͻ̹Ƿ Ư о μ . + // 길드 생성창을 띄우는 것뿐이므로 특별히 읽어들일 인수는 없다. __END_CATCH } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionDownSkill::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionDownSkill.h b/src/server/gameserver/quest/ActionDownSkill.h index 4ab212c1..1490eac5 100644 --- a/src/server/gameserver/quest/ActionDownSkill.h +++ b/src/server/gameserver/quest/ActionDownSkill.h @@ -2,7 +2,7 @@ // Filename : ActionDownSkill.h // Written By : excel96 // Description : -// NPC Ŭ̾Ʈ Ͽ â Ѵ. +// NPC를 통해 클라이언트로 하여금 길드 생성창을 띄우게 한다. //////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_DOWN_SKILL_H__ diff --git a/src/server/gameserver/quest/ActionEnterCastleWithFee.cpp b/src/server/gameserver/quest/ActionEnterCastleWithFee.cpp index fcbf9241..77b50f7f 100644 --- a/src/server/gameserver/quest/ActionEnterCastleWithFee.cpp +++ b/src/server/gameserver/quest/ActionEnterCastleWithFee.cpp @@ -54,7 +54,7 @@ void ActionEnterCastleWithFee::read(PropertyBuffer& pb) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionEnterCastleWithFee::execute(Creature* pNPC, Creature* pCreature) @@ -75,16 +75,16 @@ void ActionEnterCastleWithFee::execute(Creature* pNPC, Creature* pCreature) try { ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(m_ZoneID); - // ε ڰ ƴϸ... + // 유료존인데 유료사용자가 아니면... if (pZoneInfo == NULL || pZoneInfo->isPayPlay() && !(pGamePlayer->isPayPlaying() || pGamePlayer->isFamilyFreePass())) { string connectIP = pGamePlayer->getSocket()->getHost(); - // Ѱ? + // 유료 서비스 사용이 가능한가? if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { sendPayInfo(pGamePlayer); } else { - // Ұ + // 유료 서비스 사용 불가인 경우 GCSystemMessage gcSystemMessage; if (g_pConfig->getPropertyInt("IsNetMarble") == 0) { @@ -110,7 +110,7 @@ void ActionEnterCastleWithFee::execute(Creature* pNPC, Creature* pCreature) if (remain < fee) { static char buf[200]; sprintf(buf, g_pStringPool->c_str(STRID_NOT_ENOUGH_ENTRANCE_FEE), (int)fee); - // ڶ. + // 돈이 모자란다. GCSystemMessage message; message.setType(SYSTEM_MESSAGE_HOLY_LAND); message.setMessage(buf); @@ -119,7 +119,7 @@ void ActionEnterCastleWithFee::execute(Creature* pNPC, Creature* pCreature) bTransport = false; } else { if (fee > 0) { - // Ḧ . + // 입장료를 낸다. pPC->decreaseGoldEx(fee); g_pCastleInfoManager->increaseTaxBalance(m_ZoneID, fee); diff --git a/src/server/gameserver/quest/ActionEnterCastleWithFee.h b/src/server/gameserver/quest/ActionEnterCastleWithFee.h index 74779044..b5f83c66 100644 --- a/src/server/gameserver/quest/ActionEnterCastleWithFee.h +++ b/src/server/gameserver/quest/ActionEnterCastleWithFee.h @@ -2,7 +2,7 @@ // Filename : ActionEnterCastleWithFee.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_ENTER_CASTLE_WITH_FEE_H__ diff --git a/src/server/gameserver/quest/ActionEnterEventZone.cpp b/src/server/gameserver/quest/ActionEnterEventZone.cpp index e10a8b1e..210d6de9 100644 --- a/src/server/gameserver/quest/ActionEnterEventZone.cpp +++ b/src/server/gameserver/quest/ActionEnterEventZone.cpp @@ -55,7 +55,7 @@ void ActionEnterEventZone::read(PropertyBuffer& pb) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionEnterEventZone::execute(Creature* pNPC, Creature* pCreature) @@ -98,15 +98,15 @@ void ActionEnterEventZone::execute(Creature* pNPC, Creature* pCreature) try { ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(pEventZoneInfo->getZoneID()); - // ε ڰ ƴϸ... + // 유료존인데 유료사용자가 아니면... if (pZoneInfo == NULL || pZoneInfo->isPayPlay() && !pGamePlayer->isPayPlaying()) { string connectIP = pGamePlayer->getSocket()->getHost(); - // Ѱ? + // 유료 서비스 사용이 가능한가? if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { sendPayInfo(pGamePlayer); } else { - // Ұ + // 유료 서비스 사용 불가인 경우 GCSystemMessage gcSystemMessage; if (g_pConfig->getPropertyInt("IsNetMarble") == 0) { @@ -131,7 +131,7 @@ void ActionEnterEventZone::execute(Creature* pNPC, Creature* pCreature) Slayer* pSlayer = dynamic_cast(pPC); Assert(pSlayer != NULL); - // ̸ Ÿ ̿ . + // 오토바이를 타고 있으면 오토바이에서 내린다. if (pSlayer->hasRideMotorcycle()) { pSlayer->getOffMotorcycle(); } @@ -141,7 +141,7 @@ void ActionEnterEventZone::execute(Creature* pNPC, Creature* pCreature) Ousters* pOusters = dynamic_cast(pPC); Assert(pOusters != NULL); - // Ÿ ش + // 실프 타고 있으면 내려준다 if (pOusters->isFlag(Effect::EFFECT_CLASS_SUMMON_SYLPH)) { Effect* pEffect = pOusters->findEffect(Effect::EFFECT_CLASS_SUMMON_SYLPH); if (pEffect != NULL) diff --git a/src/server/gameserver/quest/ActionEnterEventZone.h b/src/server/gameserver/quest/ActionEnterEventZone.h index 5daab9f8..1693aa60 100644 --- a/src/server/gameserver/quest/ActionEnterEventZone.h +++ b/src/server/gameserver/quest/ActionEnterEventZone.h @@ -2,7 +2,7 @@ // Filename : ActionEnterEventZone.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_ENTER_EVENT_ZONE_H__ diff --git a/src/server/gameserver/quest/ActionEnterGDRLair.cpp b/src/server/gameserver/quest/ActionEnterGDRLair.cpp index a3046752..b5c0c028 100644 --- a/src/server/gameserver/quest/ActionEnterGDRLair.cpp +++ b/src/server/gameserver/quest/ActionEnterGDRLair.cpp @@ -55,7 +55,7 @@ void ActionEnterGDRLair::read(PropertyBuffer& pb) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionEnterGDRLair::execute(Creature* pNPC, Creature* pCreature) @@ -89,15 +89,15 @@ void ActionEnterGDRLair::execute(Creature* pNPC, Creature* pCreature) try { ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(zoneID); - // ε ڰ ƴϸ... + // 유료존인데 유료사용자가 아니면... if (pZoneInfo == NULL || pZoneInfo->isPayPlay() && !pGamePlayer->isPayPlaying()) { string connectIP = pGamePlayer->getSocket()->getHost(); - // Ѱ? + // 유료 서비스 사용이 가능한가? if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { sendPayInfo(pGamePlayer); } else { - // Ұ + // 유료 서비스 사용 불가인 경우 GCSystemMessage gcSystemMessage; if (g_pConfig->getPropertyInt("IsNetMarble") == 0) { @@ -122,7 +122,7 @@ void ActionEnterGDRLair::execute(Creature* pNPC, Creature* pCreature) Slayer* pSlayer = dynamic_cast(pPC); Assert(pSlayer != NULL); - // ̸ Ÿ ̿ . + // 오토바이를 타고 있으면 오토바이에서 내린다. if (pSlayer->hasRideMotorcycle()) { pSlayer->getOffMotorcycle(); } @@ -132,7 +132,7 @@ void ActionEnterGDRLair::execute(Creature* pNPC, Creature* pCreature) Ousters* pOusters = dynamic_cast(pPC); Assert(pOusters != NULL); - // Ÿ ش + // 실프 타고 있으면 내려준다 if (pOusters->isFlag(Effect::EFFECT_CLASS_SUMMON_SYLPH)) { Effect* pEffect = pOusters->findEffect(Effect::EFFECT_CLASS_SUMMON_SYLPH); if (pEffect != NULL) diff --git a/src/server/gameserver/quest/ActionEnterGDRLair.h b/src/server/gameserver/quest/ActionEnterGDRLair.h index 8d2ddd37..174f0ddb 100644 --- a/src/server/gameserver/quest/ActionEnterGDRLair.h +++ b/src/server/gameserver/quest/ActionEnterGDRLair.h @@ -2,7 +2,7 @@ // Filename : ActionEnterGDRLair.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_ENTER_GDR_LAIR_H__ diff --git a/src/server/gameserver/quest/ActionEnterPKZone.cpp b/src/server/gameserver/quest/ActionEnterPKZone.cpp index 1130e1f1..bace3ed4 100644 --- a/src/server/gameserver/quest/ActionEnterPKZone.cpp +++ b/src/server/gameserver/quest/ActionEnterPKZone.cpp @@ -57,7 +57,7 @@ void ActionEnterPKZone::read(PropertyBuffer& pb) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionEnterPKZone::execute(Creature* pNPC, Creature* pCreature) @@ -80,15 +80,15 @@ void ActionEnterPKZone::execute(Creature* pNPC, Creature* pCreature) try { ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(m_ZoneID); - // ε ڰ ƴϸ... + // 유료존인데 유료사용자가 아니면... if (pZoneInfo == NULL || pZoneInfo->isPayPlay() && !pGamePlayer->isPayPlaying()) { string connectIP = pGamePlayer->getSocket()->getHost(); - // Ѱ? + // 유료 서비스 사용이 가능한가? if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { sendPayInfo(pGamePlayer); } else { - // Ұ + // 유료 서비스 사용 불가인 경우 GCSystemMessage gcSystemMessage; if (g_pConfig->getPropertyInt("IsNetMarble") == 0) { @@ -122,13 +122,13 @@ void ActionEnterPKZone::execute(Creature* pNPC, Creature* pCreature) pGamePlayer->sendPacket(&gcSystemMessage); } - // ڴ ο ް . -_-; + // 운영자는 인원 제한 안 받고 들어간다. -_-; if (!pPC->isPLAYER() || pPKZoneInfo->enterZone()) { if (pPC->isSlayer()) { Slayer* pSlayer = dynamic_cast(pPC); Assert(pSlayer != NULL); - // ̸ Ÿ ̿ . + // 오토바이를 타고 있으면 오토바이에서 내린다. if (pSlayer->hasRideMotorcycle()) { pSlayer->getOffMotorcycle(); } @@ -138,7 +138,7 @@ void ActionEnterPKZone::execute(Creature* pNPC, Creature* pCreature) Ousters* pOusters = dynamic_cast(pPC); Assert(pOusters != NULL); - // Ÿ ش + // 실프 타고 있으면 내려준다 if (pOusters->isFlag(Effect::EFFECT_CLASS_SUMMON_SYLPH)) { Effect* pEffect = pOusters->findEffect(Effect::EFFECT_CLASS_SUMMON_SYLPH); if (pEffect != NULL) diff --git a/src/server/gameserver/quest/ActionEnterPKZone.h b/src/server/gameserver/quest/ActionEnterPKZone.h index e635b518..5556a81b 100644 --- a/src/server/gameserver/quest/ActionEnterPKZone.h +++ b/src/server/gameserver/quest/ActionEnterPKZone.h @@ -2,7 +2,7 @@ // Filename : ActionEnterPKZone.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_ENTER_PK_ZONE_H__ diff --git a/src/server/gameserver/quest/ActionEnterQuestZone.cpp b/src/server/gameserver/quest/ActionEnterQuestZone.cpp index a6a0b360..bfdc7f65 100644 --- a/src/server/gameserver/quest/ActionEnterQuestZone.cpp +++ b/src/server/gameserver/quest/ActionEnterQuestZone.cpp @@ -44,7 +44,7 @@ void ActionEnterQuestZone::read(PropertyBuffer& pb) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionEnterQuestZone::execute(Creature* pNPC, Creature* pCreature) @@ -65,16 +65,16 @@ void ActionEnterQuestZone::execute(Creature* pNPC, Creature* pCreature) try { ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(m_ZoneID); - // ε ڰ ƴϸ... + // 유료존인데 유료사용자가 아니면... if (pZoneInfo == NULL || pZoneInfo->isPayPlay() && !(pGamePlayer->isPayPlaying() || pGamePlayer->isFamilyFreePass())) { string connectIP = pGamePlayer->getSocket()->getHost(); - // Ѱ? + // 유료 서비스 사용이 가능한가? if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { sendPayInfo(pGamePlayer); } else { - // Ұ + // 유료 서비스 사용 불가인 경우 GCSystemMessage gcSystemMessage; if (g_pConfig->getPropertyInt("IsNetMarble") == 0) { @@ -93,11 +93,11 @@ void ActionEnterQuestZone::execute(Creature* pNPC, Creature* pCreature) #endif if (bTransport) { - // Dynamic Ȯ. + // Dynamic 존인지 확인. int targetDynamicZoneType = g_pDynamicZoneInfoManager->getDynamicZoneTypeByZoneID(m_ZoneID); if (targetDynamicZoneType != DYNAMIC_ZONE_MAX) { - // Dynamic + // Dynamic 존일 경우 DynamicZoneGroup* pDynamicZoneGroup = g_pDynamicZoneManager->getDynamicZoneGroup(targetDynamicZoneType); Assert(pDynamicZoneGroup != NULL); @@ -112,7 +112,7 @@ void ActionEnterQuestZone::execute(Creature* pNPC, Creature* pCreature) pAlterOfBlood->setRace(pPC->getRace()); } } else { - // Dynamic ƴ + // Dynamic 존이 아닐 경우 transportCreature(pCreature, m_ZoneID, m_X, m_Y, true); } } else { diff --git a/src/server/gameserver/quest/ActionEnterSiege.cpp b/src/server/gameserver/quest/ActionEnterSiege.cpp index 5c0b45f1..af3c4711 100644 --- a/src/server/gameserver/quest/ActionEnterSiege.cpp +++ b/src/server/gameserver/quest/ActionEnterSiege.cpp @@ -46,7 +46,7 @@ void ActionEnterSiege::read(PropertyBuffer& pb) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// ¾×¼ÇÀ» ½ÇÇàÇÑ´Ù. //////////////////////////////////////////////////////////////////////////////// void ActionEnterSiege::execute(Creature* pNPC, Creature* pCreature) @@ -60,7 +60,7 @@ void ActionEnterSiege::execute(Creature* pNPC, Creature* pCreature) GamePlayer* pGamePlayer = dynamic_cast(pCreature->getPlayer()); if (!g_pWarSystem->hasCastleActiveWar(m_ZoneID)) { GCSystemMessage gcSM; - gcSM.setMessage("ֻڽйսн."); + gcSM.setMessage("Ö»ÄÜÔÚ½øÐй¥³ÇÕ½ÖнøÈë."); pGamePlayer->sendPacket(&gcSM); return; } @@ -87,7 +87,7 @@ void ActionEnterSiege::execute(Creature* pNPC, Creature* pCreature) SiegeWar* pSiegeWar = dynamic_cast(g_pWarSystem->getActiveWar(m_ZoneID)); if (pSiegeWar == NULL) { GCSystemMessage gcSM; - gcSM.setMessage("1ϣӪϵ."); + gcSM.setMessage("µÚ1¸ö·þÎñÆ÷·¢Éú¹ÊÕÏ£¬ÇëÓëÔËÓªÉÌÁªÏµ."); pGamePlayer->sendPacket(&gcSM); return; } @@ -95,21 +95,21 @@ void ActionEnterSiege::execute(Creature* pNPC, Creature* pCreature) int side = pSiegeWar->getGuildSide(pPC->getGuildID()); if (side == 0) { GCSystemMessage gcSM; - gcSM.setMessage("սл."); + gcSM.setMessage("²»ÊÇÉêÇëÕ½¶·µÄÐлá."); pGamePlayer->sendPacket(&gcSM); return; } if (!g_pGuildManager->isGuildMaster(pPC->getGuildID(), pPC)) { GCSystemMessage gcSM; - gcSM.setMessage("ֻл᳤,ſԽ."); + gcSM.setMessage("Ö»ÓÐÐлá»á³¤,²Å¿ÉÒÔ½øÐÐÉêÇë."); pGamePlayer->sendPacket(&gcSM); return; } static TPOINT targetPos[7] = {{172, 38}, {172, 38}, {20, 232}, {20, 232}, {20, 232}, {20, 232}, {20, 232}}; - // ȯ ǥ. + // ¼ÒȯÀÚÀÇ Á¸°ú ÁÂÇ¥. ZoneID_t ZoneNum = siegeZoneID; Coord_t ZoneX = targetPos[side - 1].x; Coord_t ZoneY = targetPos[side - 1].y; diff --git a/src/server/gameserver/quest/ActionEnterSiege.h b/src/server/gameserver/quest/ActionEnterSiege.h index 62b0b5b4..ccc25fe5 100644 --- a/src/server/gameserver/quest/ActionEnterSiege.h +++ b/src/server/gameserver/quest/ActionEnterSiege.h @@ -2,7 +2,7 @@ // Filename : ActionEnterSiege.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_ENTER_SIEGE_H__ diff --git a/src/server/gameserver/quest/ActionEventMeet.cpp b/src/server/gameserver/quest/ActionEventMeet.cpp index 8ad323f8..fc663464 100644 --- a/src/server/gameserver/quest/ActionEventMeet.cpp +++ b/src/server/gameserver/quest/ActionEventMeet.cpp @@ -35,7 +35,7 @@ void ActionEventMeet::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionEventMeet::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionEventMeet.h b/src/server/gameserver/quest/ActionEventMeet.h index 94241263..c58e0a4a 100644 --- a/src/server/gameserver/quest/ActionEventMeet.h +++ b/src/server/gameserver/quest/ActionEventMeet.h @@ -2,7 +2,7 @@ // Filename : ActionEventMeet.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_EVENT_MEET_H__ @@ -28,7 +28,7 @@ class ActionEventMeet : public Action { public: private: - ScriptID_t m_ScriptID; // ̵ + ScriptID_t m_ScriptID; // 말할 대사 아이디 ScriptID_t m_CounterScriptID; bool m_bGiveInfo; }; diff --git a/src/server/gameserver/quest/ActionForceApartCouple.cpp b/src/server/gameserver/quest/ActionForceApartCouple.cpp index 802d0fe4..c7f15785 100644 --- a/src/server/gameserver/quest/ActionForceApartCouple.cpp +++ b/src/server/gameserver/quest/ActionForceApartCouple.cpp @@ -30,7 +30,7 @@ void ActionForceApartCouple::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionForceApartCouple::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionForceApartCouple.h b/src/server/gameserver/quest/ActionForceApartCouple.h index c83475c4..dd706d0b 100644 --- a/src/server/gameserver/quest/ActionForceApartCouple.h +++ b/src/server/gameserver/quest/ActionForceApartCouple.h @@ -2,7 +2,7 @@ // Filename : ActionForceApartCouple.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_FORCE_APART_COUPLE_H__ diff --git a/src/server/gameserver/quest/ActionGiveChildrenDayEvent.cpp b/src/server/gameserver/quest/ActionGiveChildrenDayEvent.cpp index d9428447..ccfeb228 100644 --- a/src/server/gameserver/quest/ActionGiveChildrenDayEvent.cpp +++ b/src/server/gameserver/quest/ActionGiveChildrenDayEvent.cpp @@ -33,12 +33,12 @@ void ActionGiveChildrenItem::read(PropertyBuffer& propertyBuffer) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. -// 5 5 ̺Ʈ -// 絹, Ÿ ͸ ׿ ƿ -// ׿ شϴ ֵ Ѵ. -// ̰.. -// ̴. +// 액션을 실행한다. +// 5월 5일 이벤트로 +// 연변루돌프, 연변산타 몬스터를 죽였을대 나오는 아이템을 모아오면 +// 그에 해당하는 아이템을 주도록 한다. +// 몬스터 아이템은 별로 정해질 예정이고.. +// 나오는 아이템은 아직은 미정이다. //////////////////////////////////////////////////////////////////////////////// void ActionGiveChildrenItem::execute(Creature* pCreature1, Creature* pCreature2) @@ -56,7 +56,7 @@ void ActionGiveChildrenItem::execute(Creature* pCreature1, Creature* pCreature2) Player* pPlayer = pPC->getPlayer(); Assert(pPlayer != NULL); - // Ŭ̾Ʈ GCNPCResponse ش. + // 먼저 클라이언트를 위해 GCNPCResponse를 보내준다. GCNPCResponse okpkt; pPlayer->sendPacket(&okpkt); @@ -75,17 +75,17 @@ void ActionGiveChildrenItem::execute(Creature* pCreature1, Creature* pCreature2) msg << "PlayerID[" << pPlayer->getID() << "], " << "CreatureName[" << pPC->getName() << "]\n"; if (pPC->isSlayer()) { - // Ѵ. + // 아이템을 생성한다. Item* pItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_BRACELET, 3, 50); - // OID Ϲ޴´. + // OID를 등록받는다. OR.registerObject(pItem); if (pInventory->addItem(pItem, pt)) { - // κ丮 . + // 아이템을 인벤토리에 만든다. pItem->create(pPC->getName(), STORAGE_INVENTORY, 0, pt.x, pt.y); - // ޾Ҵٴ ˷ش. + // 아이템을 받았다는 것을 알려준다. gcCreateItem.setObjectID(pItem->getObjectID()); gcCreateItem.setItemClass(pItem->getItemClass()); gcCreateItem.setItemType(pItem->getItemType()); @@ -100,14 +100,14 @@ void ActionGiveChildrenItem::execute(Creature* pCreature1, Creature* pCreature2) msg << "Inventory Adding Success : " << pItem->toString() << "\n"; - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { remainTraceLog(pItem, pCreature1->getName(), pCreature2->getName(), ITEM_LOG_CREATE, DETAIL_EVENTNPC); remainTraceLogNew(pItem, pCreature2->getName(), ITL_GET, ITLD_EVENTNPC, pCreature1->getZone()->getZoneID(), pCreature1->getX(), pCreature1->getY()); } } else { - // κ丮 ڸ ٸ ޽ ׸д. + // 인벤토리에 자리가 없다면 메시지를 보내고 그만둔다. StringStream buf; buf << pPlayer->getID() << g_pStringPool->getString(STRID_NOT_ENOUGH_INVENTORY_SPACE); @@ -121,7 +121,7 @@ void ActionGiveChildrenItem::execute(Creature* pCreature1, Creature* pCreature2) } else { Item* pItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_BRACELET, 3, 50); - // OID Ϲ޴´. + // OID를 등록받는다. OR.registerObject(pItem); if (pInventory->addItem(pItem, pt)) { @@ -142,14 +142,14 @@ void ActionGiveChildrenItem::execute(Creature* pCreature1, Creature* pCreature2) msg << "Inventory Adding Succeeded : " << pItem->toString() << "\n"; - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { remainTraceLog(pItem, pCreature1->getName(), pCreature2->getName(), ITEM_LOG_CREATE, DETAIL_EVENTNPC); remainTraceLogNew(pItem, pCreature2->getName(), ITL_GET, ITLD_EVENTNPC, pCreature1->getZone()->getZoneID(), pCreature1->getX(), pCreature1->getY()); } } else { - // κ丮 ڸ ٸ ޽ ׸д. + // 인벤토리에 자리가 없다면 메시지를 보내고 그만둔다. StringStream buf; buf << pPlayer->getID() << g_pStringPool->getString(STRID_NOT_ENOUGH_INVENTORY_SPACE); diff --git a/src/server/gameserver/quest/ActionGiveCommonEventItem.cpp b/src/server/gameserver/quest/ActionGiveCommonEventItem.cpp index 59cd20bb..2cffe6aa 100644 --- a/src/server/gameserver/quest/ActionGiveCommonEventItem.cpp +++ b/src/server/gameserver/quest/ActionGiveCommonEventItem.cpp @@ -34,74 +34,74 @@ struct EVENT_ITEM_TEMPLATE { const int EVENT_ITEM_200505_SLAYER_MAX = 24; const EVENT_ITEM_TEMPLATE Event200505SlayerTemplate[EVENT_ITEM_200505_SLAYER_MAX] = { - {Item::ITEM_CLASS_COAT, 10, 4, "DUR+5", 80, "Ĺ (M)"}, - {Item::ITEM_CLASS_TROUSER, 10, 4, "DUR+5", 80, "Ĺ (M)"}, - {Item::ITEM_CLASS_COAT, 11, 4, "VIS+3", 80, "Ĺ (W)"}, - {Item::ITEM_CLASS_TROUSER, 11, 4, "VIS+3", 80, "Ĺ (W)"}, - {Item::ITEM_CLASS_GLOVE, 5, 4, "DEF+5", 80, "ƾ ÷Ʈ Ʋ"}, - {Item::ITEM_CLASS_SHOES, 5, 4, "ASPD+5", 80, " "}, - {Item::ITEM_CLASS_BELT, 2, 4, "RES+5", 80, "̵ Ʈ"}, - {Item::ITEM_CLASS_SHIELD, 5, 4, "DAM+4", 80, "巡 "}, - {Item::ITEM_CLASS_BLADE, 3, 4, "BLRES+3", 80, " ̵"}, - {Item::ITEM_CLASS_SG, 3, 4, "TOHIT+3", 80, "AM-99 "}, + {Item::ITEM_CLASS_COAT, 10, 4, "DUR+5", 80, "컴뱃 메일(M)"}, + {Item::ITEM_CLASS_TROUSER, 10, 4, "DUR+5", 80, "컴뱃 게이터(M)"}, + {Item::ITEM_CLASS_COAT, 11, 4, "VIS+3", 80, "컴뱃 메일(W)"}, + {Item::ITEM_CLASS_TROUSER, 11, 4, "VIS+3", 80, "컴뱃 게이터(W)"}, + {Item::ITEM_CLASS_GLOVE, 5, 4, "DEF+5", 80, "틴 플레이트 건틀렛"}, + {Item::ITEM_CLASS_SHOES, 5, 4, "ASPD+5", 80, "사란 부츠"}, + {Item::ITEM_CLASS_BELT, 2, 4, "RES+5", 80, "미디엄 벨트"}, + {Item::ITEM_CLASS_SHIELD, 5, 4, "DAM+4", 80, "드래곤 쉴드"}, + {Item::ITEM_CLASS_BLADE, 3, 4, "BLRES+3", 80, "세버드 블레이드"}, + {Item::ITEM_CLASS_SG, 3, 4, "TOHIT+3", 80, "AM-99 맘모스"}, {Item::ITEM_CLASS_SMG, 3, 4, "INT+5", 80, "B-INTER"}, {Item::ITEM_CLASS_AR, 3, 4, "ACRES+3", 80, "MK-2 G2"}, - {Item::ITEM_CLASS_SR, 3, 4, "ATTR+3", 80, "X-45T 丶ȣũ"}, - {Item::ITEM_CLASS_NECKLACE, 4, 4, "TOHIT+4", 80, "ũƮ ũ"}, - {Item::ITEM_CLASS_BRACELET, 4, 4, "DEF+4", 80, " 극̽"}, - {Item::ITEM_CLASS_NECKLACE, 5, 4, "CURES+2", 80, " "}, - {Item::ITEM_CLASS_BRACELET, 5, 4, "HP+5", 80, " 극̽"}, - {Item::ITEM_CLASS_RING, 5, 4, "VIS+3", 80, " "}, - {Item::ITEM_CLASS_CARRYING_RECEIVER, 0, 4, "", 20, "ij ù 1"}, - {Item::ITEM_CLASS_RESURRECT_ITEM, 0, 0, "", 200, "Ȱ ũ"}, - {Item::ITEM_CLASS_RESURRECT_ITEM, 1, 0, "", 100, " ũ"}, - {Item::ITEM_CLASS_EVENT_ETC, 13, 0, "", 3000, " "}, - {Item::ITEM_CLASS_EVENT_ETC, 3, 0, "", 4740, "巡 "}, - {Item::ITEM_CLASS_EVENT_TREE, 27, 0, "", 500, "12ð ˸"}}; + {Item::ITEM_CLASS_SR, 3, 4, "ATTR+3", 80, "X-45T 토마호크"}, + {Item::ITEM_CLASS_NECKLACE, 4, 4, "TOHIT+4", 80, "크레센트 네크리스"}, + {Item::ITEM_CLASS_BRACELET, 4, 4, "DEF+4", 80, "오러스 브레이슬릿"}, + {Item::ITEM_CLASS_NECKLACE, 5, 4, "CURES+2", 80, "블루 센스"}, + {Item::ITEM_CLASS_BRACELET, 5, 4, "HP+5", 80, "오러스 브레이슬릿"}, + {Item::ITEM_CLASS_RING, 5, 4, "VIS+3", 80, "행운의 반지"}, + {Item::ITEM_CLASS_CARRYING_RECEIVER, 0, 4, "", 20, "캐링 리시버 1단"}, + {Item::ITEM_CLASS_RESURRECT_ITEM, 0, 0, "", 200, "부활 스크롤"}, + {Item::ITEM_CLASS_RESURRECT_ITEM, 1, 0, "", 100, "엘릭서 스크롤"}, + {Item::ITEM_CLASS_EVENT_ETC, 13, 0, "", 3000, "스톰 폭죽"}, + {Item::ITEM_CLASS_EVENT_ETC, 3, 0, "", 4740, "드래곤 폭죽"}, + {Item::ITEM_CLASS_EVENT_TREE, 27, 0, "", 500, "12시간 알림판"}}; const int EVENT_ITEM_200505_VAMPIRE_MAX = 19; const EVENT_ITEM_TEMPLATE Event200505VampireTemplate[EVENT_ITEM_200505_VAMPIRE_MAX] = { - {Item::ITEM_CLASS_VAMPIRE_COAT, 6, 4, "CRI+9", 110, "̵ κ"}, - {Item::ITEM_CLASS_VAMPIRE_COAT, 8, 4, "VIS+3", 110, "Ƽ- "}, - {Item::ITEM_CLASS_VAMPIRE_COAT, 7, 4, "DUR+5", 110, "Ʈ Ŭ"}, - {Item::ITEM_CLASS_VAMPIRE_COAT, 9, 4, "VIS+3", 110, "Ƽ- "}, - {Item::ITEM_CLASS_VAMPIRE_NECKLACE, 3, 4, "TOHIT+5", 110, " ũ"}, - {Item::ITEM_CLASS_VAMPIRE_BRACELET, 2, 4, "DEF+5", 110, " 극̽"}, - {Item::ITEM_CLASS_VAMPIRE_RING, 3, 4, "CURES+3", 110, "Ʈ "}, - {Item::ITEM_CLASS_VAMPIRE_EARRING, 3, 4, "HP+5", 110, " ̾"}, - {Item::ITEM_CLASS_VAMPIRE_AMULET, 2, 4, "PORES+3", 110, ""}, - {Item::ITEM_CLASS_VAMPIRE_WEAPON, 3, 4, "RES+5", 110, "̳θ Ŭ"}, - {Item::ITEM_CLASS_VAMPIRE_WEAPON, 4, 4, "ATTR+3", 110, "Ƽ ũο"}, - {Item::ITEM_CLASS_VAMPIRE_WEAPON, 5, 4, "INT+5", 110, "Ĺ ũο"}, - {Item::ITEM_CLASS_VAMPIRE_WEAPON, 6, 4, "DAM+4", 110, "ǽƮ Ŭ"}, - {Item::ITEM_CLASS_PERSONA, 0, 4, "", 20, "丣ҳ 1"}, - {Item::ITEM_CLASS_RESURRECT_ITEM, 0, 0, "", 200, "Ȱ ũ"}, - {Item::ITEM_CLASS_RESURRECT_ITEM, 1, 0, "", 100, " ũ"}, - {Item::ITEM_CLASS_EVENT_ETC, 13, 0, "", 3000, " "}, - {Item::ITEM_CLASS_EVENT_ETC, 3, 0, "", 4750, "巡 "}, - {Item::ITEM_CLASS_EVENT_TREE, 27, 0, "", 500, "12ð ˸"}}; + {Item::ITEM_CLASS_VAMPIRE_COAT, 6, 4, "CRI+9", 110, "하이딩 로브"}, + {Item::ITEM_CLASS_VAMPIRE_COAT, 8, 4, "VIS+3", 110, "안티-썬 폴"}, + {Item::ITEM_CLASS_VAMPIRE_COAT, 7, 4, "DUR+5", 110, "레버테이트 클록"}, + {Item::ITEM_CLASS_VAMPIRE_COAT, 9, 4, "VIS+3", 110, "안티-썬 코프"}, + {Item::ITEM_CLASS_VAMPIRE_NECKLACE, 3, 4, "TOHIT+5", 110, "젯 네크리스"}, + {Item::ITEM_CLASS_VAMPIRE_BRACELET, 2, 4, "DEF+5", 110, "쥬얼 브레이슬릿"}, + {Item::ITEM_CLASS_VAMPIRE_RING, 3, 4, "CURES+3", 110, "길트 링"}, + {Item::ITEM_CLASS_VAMPIRE_EARRING, 3, 4, "HP+5", 110, "골드 이어링"}, + {Item::ITEM_CLASS_VAMPIRE_AMULET, 2, 4, "PORES+3", 110, "제라"}, + {Item::ITEM_CLASS_VAMPIRE_WEAPON, 3, 4, "RES+5", 110, "제미널링 너클"}, + {Item::ITEM_CLASS_VAMPIRE_WEAPON, 4, 4, "ATTR+3", 110, "예티 크로우"}, + {Item::ITEM_CLASS_VAMPIRE_WEAPON, 5, 4, "INT+5", 110, "캣츠 크로우"}, + {Item::ITEM_CLASS_VAMPIRE_WEAPON, 6, 4, "DAM+4", 110, "피스트 너클"}, + {Item::ITEM_CLASS_PERSONA, 0, 4, "", 20, "페르소나 1단"}, + {Item::ITEM_CLASS_RESURRECT_ITEM, 0, 0, "", 200, "부활 스크롤"}, + {Item::ITEM_CLASS_RESURRECT_ITEM, 1, 0, "", 100, "엘릭서 스크롤"}, + {Item::ITEM_CLASS_EVENT_ETC, 13, 0, "", 3000, "스톰 폭죽"}, + {Item::ITEM_CLASS_EVENT_ETC, 3, 0, "", 4750, "드래곤 폭죽"}, + {Item::ITEM_CLASS_EVENT_TREE, 27, 0, "", 500, "12시간 알림판"}}; const int EVENT_ITEM_200505_OUSTERS_MAX = 19; const EVENT_ITEM_TEMPLATE Event200505OustersTemplate[EVENT_ITEM_200505_OUSTERS_MAX] = { - {Item::ITEM_CLASS_OUSTERS_COAT, 4, 4, "DUR+5", 110, " Ʈ"}, - {Item::ITEM_CLASS_OUSTERS_BOOTS, 4, 4, "ASPD+5", 110, " "}, - {Item::ITEM_CLASS_OUSTERS_BOOTS, 4, 4, "VIS+3", 110, " "}, - {Item::ITEM_CLASS_OUSTERS_ARMSBAND, 4, 4, "CURES+3", 110, " Ͻ"}, - {Item::ITEM_CLASS_OUSTERS_CIRCLET, 3, 4, "HP+5", 110, "ǹٳ Ŭ"}, - {Item::ITEM_CLASS_OUSTERS_PENDENT, 3, 4, "TOHIT+4", 110, " Ʈ"}, - {Item::ITEM_CLASS_OUSTERS_RING, 3, 4, "CURES+2", 110, " "}, - {Item::ITEM_CLASS_OUSTERS_STONE, 10, 4, "VIS+3", 110, " ɼ1"}, - {Item::ITEM_CLASS_OUSTERS_STONE, 6, 4, "MP+5", 110, " ɼ2"}, - {Item::ITEM_CLASS_OUSTERS_WRISTLET, 4, 4, "ASPD+5", 110, " н÷ Ʋ"}, - {Item::ITEM_CLASS_OUSTERS_WRISTLET, 15, 4, "HP+5", 110, " ũ Ʋ"}, - {Item::ITEM_CLASS_OUSTERS_CHAKRAM, 3, 4, "DAM+5", 110, " íũ"}, - {Item::ITEM_CLASS_OUSTERS_CHAKRAM, 4, 4, "ACRES+3", 110, "ƴϸ íũ"}, - {Item::ITEM_CLASS_FASCIA, 0, 4, "", 20, "̻ 1"}, - {Item::ITEM_CLASS_RESURRECT_ITEM, 0, 0, "", 200, "Ȱ ũ"}, - {Item::ITEM_CLASS_RESURRECT_ITEM, 1, 0, "", 100, " ũ"}, - {Item::ITEM_CLASS_EVENT_ETC, 13, 0, "", 3000, " "}, - {Item::ITEM_CLASS_EVENT_ETC, 3, 0, "", 4750, "巡 "}, - {Item::ITEM_CLASS_EVENT_TREE, 27, 0, "", 500, "12ð ˸"}}; + {Item::ITEM_CLASS_OUSTERS_COAT, 4, 4, "DUR+5", 110, "레프리컨 코트"}, + {Item::ITEM_CLASS_OUSTERS_BOOTS, 4, 4, "ASPD+5", 110, "레프리컨 부츠"}, + {Item::ITEM_CLASS_OUSTERS_BOOTS, 4, 4, "VIS+3", 110, "레프리컨 부츠"}, + {Item::ITEM_CLASS_OUSTERS_ARMSBAND, 4, 4, "CURES+3", 110, "블라즘 암스밴드"}, + {Item::ITEM_CLASS_OUSTERS_CIRCLET, 3, 4, "HP+5", 110, "실바나 서클릿"}, + {Item::ITEM_CLASS_OUSTERS_PENDENT, 3, 4, "TOHIT+4", 110, "이져실 펜던트"}, + {Item::ITEM_CLASS_OUSTERS_RING, 3, 4, "CURES+2", 110, "위스퍼 오브 엘프 링"}, + {Item::ITEM_CLASS_OUSTERS_STONE, 10, 4, "VIS+3", 110, "대지의 정령석1"}, + {Item::ITEM_CLASS_OUSTERS_STONE, 6, 4, "MP+5", 110, "물의 정령석2"}, + {Item::ITEM_CLASS_OUSTERS_WRISTLET, 4, 4, "ASPD+5", 110, "불의 닉스플로즈 리스틀릿"}, + {Item::ITEM_CLASS_OUSTERS_WRISTLET, 15, 4, "HP+5", 110, "물의 라크리마 리스틀릿"}, + {Item::ITEM_CLASS_OUSTERS_CHAKRAM, 3, 4, "DAM+5", 110, "뉴보 챠크람"}, + {Item::ITEM_CLASS_OUSTERS_CHAKRAM, 4, 4, "ACRES+3", 110, "아니마 챠크람"}, + {Item::ITEM_CLASS_FASCIA, 0, 4, "", 20, "페이샤 1단"}, + {Item::ITEM_CLASS_RESURRECT_ITEM, 0, 0, "", 200, "부활 스크롤"}, + {Item::ITEM_CLASS_RESURRECT_ITEM, 1, 0, "", 100, "엘릭서 스크롤"}, + {Item::ITEM_CLASS_EVENT_ETC, 13, 0, "", 3000, "스톰 폭죽"}, + {Item::ITEM_CLASS_EVENT_ETC, 3, 0, "", 4750, "드래곤 폭죽"}, + {Item::ITEM_CLASS_EVENT_TREE, 27, 0, "", 500, "12시간 알림판"}}; //////////////////////////////////////////////////////////////////////////////// // ActionGiveCommonEventItem @@ -132,7 +132,7 @@ void ActionGiveCommonEventItem::read(PropertyBuffer& propertyBuffer) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionGiveCommonEventItem::execute(Creature* pCreature1, Creature* pCreature2) @@ -156,7 +156,7 @@ void ActionGiveCommonEventItem::execute(Creature* pCreature1, Creature* pCreatur Zone* pZone = pPC->getZone(); Assert(pZone != NULL); - // ̺Ʈ Ⱓ ƴ + // 이벤트 기간이 아닌 경우 if (g_pVariableManager->getVariable(FAMILY_COIN_EVENT) == 0) { GCNPCResponse response; response.setCode(NPC_RESPONSE_QUIT_DIALOGUE); @@ -165,7 +165,7 @@ void ActionGiveCommonEventItem::execute(Creature* pCreature1, Creature* pCreatur return; } - // κ丮 üũ + // 인벤토리 공간 체크 _TPOINT pt; if (!pInventory->getEmptySlot(2, 3, pt)) { GCNPCResponse response; @@ -176,7 +176,7 @@ void ActionGiveCommonEventItem::execute(Creature* pCreature1, Creature* pCreatur } - // йи üũ + // 패밀리 코인 체크 if (!pInventory->hasEnoughNumItem(Item::ITEM_CLASS_EVENT_ETC, 18, 9)) { GCNPCResponse response; response.setCode(NPC_RESPONSE_QUIT_DIALOGUE); @@ -185,7 +185,7 @@ void ActionGiveCommonEventItem::execute(Creature* pCreature1, Creature* pCreatur return; } - // + // 아이템 랜덤 생석 int ratio = rand() % 10000 + 1; Item::ItemClass itemClass; @@ -254,10 +254,10 @@ void ActionGiveCommonEventItem::execute(Creature* pCreature1, Creature* pCreatur } if (bFind) { - // ߰ + // 아이템 생성 및 추가 list options; - // ɼ üũ + // 아이템 옵션 체크 if (itemOption != "") { options.push_back(g_pOptionInfoManager->getOptionType(itemOption)); } @@ -265,7 +265,7 @@ void ActionGiveCommonEventItem::execute(Creature* pCreature1, Creature* pCreatur Item* pItem = g_pItemFactoryManager->createItem(itemClass, itemType, options); Assert(pItem != NULL); - // ޼ üũ + // 아이템 급수 체크 if (itemGrade != 0) { pItem->setGrade(itemGrade); } @@ -273,16 +273,16 @@ void ActionGiveCommonEventItem::execute(Creature* pCreature1, Creature* pCreatur pZone->registerObject(pItem); if (pInventory->addItem(pItem, pt)) { - // йи ش. + // 패밀리 코인을 없앤다. pInventory->decreaseNumItem(Item::ITEM_CLASS_EVENT_ETC, 18, 9, pPlayer); - // DB + // DB 에 아이템 생성 pItem->create(pPC->getName(), STORAGE_INVENTORY, 0, pt.x, pt.y); - // itemTraceLog . + // itemTraceLog 를 남긴다. remainTraceLog(pItem, "Event200505", pPC->getName(), ITEM_LOG_CREATE, DETAIL_EVENTNPC); - // Ŭ̾Ʈ ˸ + // 결과를 클라이언트에 알리기 GCCreateItem gcCreateItem; gcCreateItem.setObjectID(pItem->getObjectID()); gcCreateItem.setItemClass(pItem->getItemClass()); @@ -307,7 +307,7 @@ void ActionGiveCommonEventItem::execute(Creature* pCreature1, Creature* pCreatur END_DB(pStmt) } - // ȭâ ݱ + // 대화창 닫기 GCNPCResponse response; response.setCode(NPC_RESPONSE_QUIT_DIALOGUE); pPlayer->sendPacket(&response); diff --git a/src/server/gameserver/quest/ActionGiveEventQuest.cpp b/src/server/gameserver/quest/ActionGiveEventQuest.cpp index 2ed802af..1abfcb69 100644 --- a/src/server/gameserver/quest/ActionGiveEventQuest.cpp +++ b/src/server/gameserver/quest/ActionGiveEventQuest.cpp @@ -41,7 +41,7 @@ void ActionGiveEventQuest::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionGiveEventQuest::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionGiveEventQuest.h b/src/server/gameserver/quest/ActionGiveEventQuest.h index ea328e54..ae076f96 100644 --- a/src/server/gameserver/quest/ActionGiveEventQuest.h +++ b/src/server/gameserver/quest/ActionGiveEventQuest.h @@ -2,7 +2,7 @@ // Filename : ActionGiveEventQuest.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_GIVE_EVENT_QUEST_H__ diff --git a/src/server/gameserver/quest/ActionGiveEventQuestScript.cpp b/src/server/gameserver/quest/ActionGiveEventQuestScript.cpp index fe1009f8..8791e717 100644 --- a/src/server/gameserver/quest/ActionGiveEventQuestScript.cpp +++ b/src/server/gameserver/quest/ActionGiveEventQuestScript.cpp @@ -40,7 +40,7 @@ void ActionGiveEventQuestScript::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionGiveEventQuestScript::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionGiveEventQuestScript.h b/src/server/gameserver/quest/ActionGiveEventQuestScript.h index 9b9a00fa..174b42ff 100644 --- a/src/server/gameserver/quest/ActionGiveEventQuestScript.h +++ b/src/server/gameserver/quest/ActionGiveEventQuestScript.h @@ -2,7 +2,7 @@ // Filename : ActionGiveEventQuestScript.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_GIVE_EVENT_QUEST_SCRIPT_H__ @@ -35,7 +35,7 @@ class ActionGiveEventQuestScript : public Action { } private: - ScriptID_t m_ScriptID[5]; // ̵ + ScriptID_t m_ScriptID[5]; // 말할 대사 아이디 ScriptID_t m_NotComplete; ScriptID_t m_Success; }; diff --git a/src/server/gameserver/quest/ActionGiveFinalLottoScript.cpp b/src/server/gameserver/quest/ActionGiveFinalLottoScript.cpp index bd6acc13..0a24b314 100644 --- a/src/server/gameserver/quest/ActionGiveFinalLottoScript.cpp +++ b/src/server/gameserver/quest/ActionGiveFinalLottoScript.cpp @@ -40,7 +40,7 @@ void ActionGiveFinalLottoScript::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionGiveFinalLottoScript::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionGiveFinalLottoScript.h b/src/server/gameserver/quest/ActionGiveFinalLottoScript.h index 49113eca..90df282b 100644 --- a/src/server/gameserver/quest/ActionGiveFinalLottoScript.h +++ b/src/server/gameserver/quest/ActionGiveFinalLottoScript.h @@ -2,7 +2,7 @@ // Filename : ActionGiveFinalLottoScript.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_GIVE_FINAL_LOTTO_SCRIPT_H__ diff --git a/src/server/gameserver/quest/ActionGiveGarbageItem.cpp b/src/server/gameserver/quest/ActionGiveGarbageItem.cpp index 7d48b042..c59ed2be 100644 --- a/src/server/gameserver/quest/ActionGiveGarbageItem.cpp +++ b/src/server/gameserver/quest/ActionGiveGarbageItem.cpp @@ -31,7 +31,7 @@ void ActionGiveGarbageEventItem::read(PropertyBuffer& propertyBuffer) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionGiveGarbageEventItem::execute(Creature* pCreature1, Creature* pCreature2) @@ -49,18 +49,18 @@ void ActionGiveGarbageEventItem::execute(Creature* pCreature1, Creature* pCreatu Player* pPlayer = pPC->getPlayer(); Assert(pPlayer != NULL); - // Ŭ̾Ʈ GCNPCResponse ش. + // 먼저 클라이언트를 위해 GCNPCResponse를 보내준다. GCNPCResponse okpkt; pPlayer->sendPacket(&okpkt); - // Ʈ Ѵٸ... + // 가비지 리스트에 아이템이 존재한다면... if (pPC->getGarbageSize() > 0) { TPOINT pt; Item* pItem = pPC->popItemFromGarbage(); Assert(pItem != NULL); - // κ丮 ڸ ִٸ κ丮ٰ ϰ ÷̾ ˷ش. + // 인벤토리에 자리가 있다면 인벤토리에다가 더하고 플레이어에게 알려준다. if (pInventory->addItem(pItem, pt)) { pItem->save(pPC->getName(), STORAGE_INVENTORY, 0, pt.x, pt.y); @@ -77,15 +77,15 @@ void ActionGiveGarbageEventItem::execute(Creature* pCreature1, Creature* pCreatu pPlayer->sendPacket(&gcCreateItem); - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { remainTraceLog(pItem, pCreature1->getName(), pCreature2->getName(), ITEM_LOG_CREATE, DETAIL_EVENTNPC); remainTraceLogNew(pItem, pCreature2->getName(), ITL_GET, ITLD_EVENTNPC, pCreature1->getZone()->getZoneID(), pCreature1->getX(), pCreature1->getY()); } } - // κ丮 ڸ ٸ, ٽ Ʈٰ ϰ - // ÷̾ ˷ش. + // 인벤토리에 자리가 없다면, 다시 가비지 리스트에다가 더하고 + // 플레이어에게 그 사실을 알려준다. else { pPC->addItemToGarbage(pItem); diff --git a/src/server/gameserver/quest/ActionGiveItem.cpp b/src/server/gameserver/quest/ActionGiveItem.cpp index c937013c..60f4fd8f 100644 --- a/src/server/gameserver/quest/ActionGiveItem.cpp +++ b/src/server/gameserver/quest/ActionGiveItem.cpp @@ -36,7 +36,7 @@ void ActionGiveItem::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionGiveItem::execute(Creature* pCreature1, Creature* pCreature2) @@ -63,8 +63,8 @@ void ActionGiveItem::execute(Creature* pCreature1, Creature* pCreature2) Assert(pInventory != NULL); if (!pInventory->getEmptySlot(pItem, pt)) { - // ConditionHasInvenSpace ǰ ݵ Բ ߸ Ѵ. - throw Error("ActionGiveItem: ConditionHasInvenSpace . κ丮 ڸ."); + // ConditionHasInvenSpace 컨디션과 반드시 함께 써야만 한다. + throw Error("ActionGiveItem: 제발 ConditionHasInvenSpace랑 같이 쓰자. 인벤토리에 자리없다."); } CoordInven_t X = pt.x; @@ -79,7 +79,7 @@ void ActionGiveItem::execute(Creature* pCreature1, Creature* pCreature2) remainTraceLogNew(pItem, pCreature2->getName(), ITL_GET, ITLD_EVENTNPC, pCreature2->getZone()->getZoneID()); } - // Ŭ̾Ʈ ߰Ǿ ˸. + // 클라이언트에 선물이 추가되었음을 알린다. GCCreateItem gcCreateItem; makeGCCreateItem(&gcCreateItem, pItem, X, Y); pPlayer->sendPacket(&gcCreateItem); diff --git a/src/server/gameserver/quest/ActionGiveItem.h b/src/server/gameserver/quest/ActionGiveItem.h index b7850b77..01fcd135 100644 --- a/src/server/gameserver/quest/ActionGiveItem.h +++ b/src/server/gameserver/quest/ActionGiveItem.h @@ -2,7 +2,7 @@ // Filename : ActionGiveItem.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_GIVE_ITEM_H__ diff --git a/src/server/gameserver/quest/ActionGiveLotto.cpp b/src/server/gameserver/quest/ActionGiveLotto.cpp index acafe588..7f9e909c 100644 --- a/src/server/gameserver/quest/ActionGiveLotto.cpp +++ b/src/server/gameserver/quest/ActionGiveLotto.cpp @@ -39,7 +39,7 @@ void ActionGiveLotto::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionGiveLotto::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionGiveLotto.h b/src/server/gameserver/quest/ActionGiveLotto.h index e6bab1d3..daf0460e 100644 --- a/src/server/gameserver/quest/ActionGiveLotto.h +++ b/src/server/gameserver/quest/ActionGiveLotto.h @@ -2,7 +2,7 @@ // Filename : ActionGiveLotto.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_GIVE_LOTTO_H__ diff --git a/src/server/gameserver/quest/ActionGiveNewbieItem.cpp b/src/server/gameserver/quest/ActionGiveNewbieItem.cpp index 382de1bf..0337da91 100644 --- a/src/server/gameserver/quest/ActionGiveNewbieItem.cpp +++ b/src/server/gameserver/quest/ActionGiveNewbieItem.cpp @@ -59,7 +59,7 @@ void ActionGiveNewbieItem::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionGiveNewbieItem::execute(Creature* pCreature1, Creature* pCreature2) @@ -74,11 +74,11 @@ void ActionGiveNewbieItem::execute(Creature* pCreature1, Creature* pCreature2) Player* pPlayer = pCreature2->getPlayer(); Assert(pPlayer != NULL); - // Ŭ̾Ʈ GCNPCResponse ش. + // 먼저 클라이언트를 위해 GCNPCResponse를 보내준다. GCNPCResponse okpkt; pPlayer->sendPacket(&okpkt); - // ʺڰ ̾ ƴ . + // 초보자가 슬레이어가 아닌 경우는 없다. if (!pCreature2->isSlayer()) return; @@ -88,16 +88,16 @@ void ActionGiveNewbieItem::execute(Creature* pCreature1, Creature* pCreature2) Zone* pZone = pSlayer->getZone(); //////////////////////////////////////////////////////////// - // ¥ ʺ ˻Ѵ. - // 0 ʺ ޾Ҵ ÷׷ ߴ. - // ̰ ڵ. + // 진짜 초보인지를 검사한다. + // 0번을 초보 아이템 받았다 플래그로 정했다. + // 이것은 어디까지나 땜빵 코드다. //////////////////////////////////////////////////////////// if (pFlagSet->isOn(0)) return; //////////////////////////////////////////////////////////// - // Ŭ Ѵ. + // 각 아이템 클래스에 따라 아이템을 생성한다. //////////////////////////////////////////////////////////// Item* pItem[10] = { NULL, @@ -110,82 +110,82 @@ void ActionGiveNewbieItem::execute(Creature* pCreature1, Creature* pCreature2) list nullList; if (m_ItemClass == Item::ITEM_CLASS_SWORD) { - // + // 무기 pItem[0] = CREATE_ITEM(Item::ITEM_CLASS_SWORD, 0, nullList); - // + // 포션 pItem[1] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 0, nullList); pItem[2] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 0, nullList); pItem[3] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 0, nullList); pItem[4] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 5, nullList); } else if (m_ItemClass == Item::ITEM_CLASS_BLADE) { - // + // 무기 pItem[0] = CREATE_ITEM(Item::ITEM_CLASS_BLADE, 0, nullList); - // + // 포션 pItem[1] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 0, nullList); pItem[2] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 0, nullList); pItem[3] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 0, nullList); pItem[4] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 5, nullList); } else if (m_ItemClass == Item::ITEM_CLASS_CROSS) { - // + // 무기 pItem[0] = CREATE_ITEM(Item::ITEM_CLASS_CROSS, 0, nullList); - // + // 포션 pItem[1] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 0, nullList); pItem[2] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 5, nullList); pItem[3] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 5, nullList); pItem[4] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 5, nullList); } else if (m_ItemClass == Item::ITEM_CLASS_MACE) { - // + // 무기 pItem[0] = CREATE_ITEM(Item::ITEM_CLASS_MACE, 0, nullList); - // + // 포션 pItem[1] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 0, nullList); pItem[2] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 5, nullList); pItem[3] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 5, nullList); pItem[4] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 5, nullList); } else if (m_ItemClass == Item::ITEM_CLASS_AR) { - // + // 무기 pItem[0] = CREATE_ITEM(Item::ITEM_CLASS_AR, 0, nullList); - // + // 포션 pItem[1] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 0, nullList); pItem[2] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 0, nullList); pItem[3] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 5, nullList); pItem[4] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 5, nullList); - // źâ + // 탄창 pItem[5] = CREATE_ITEM(Item::ITEM_CLASS_MAGAZINE, 2, nullList); Magazine* pMagazine = dynamic_cast(pItem[5]); pMagazine->setNum(9); } else if (m_ItemClass == Item::ITEM_CLASS_SR) { - // + // 무기 pItem[0] = CREATE_ITEM(Item::ITEM_CLASS_SR, 0, nullList); - // + // 포션 pItem[1] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 0, nullList); pItem[2] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 0, nullList); pItem[3] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 5, nullList); pItem[4] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 5, nullList); - // źâ + // 탄창 pItem[5] = CREATE_ITEM(Item::ITEM_CLASS_MAGAZINE, 6, nullList); Magazine* pMagazine = dynamic_cast(pItem[5]); pMagazine->setNum(9); } else if (m_ItemClass == Item::ITEM_CLASS_SG) { - // + // 무기 pItem[0] = CREATE_ITEM(Item::ITEM_CLASS_SG, 0, nullList); - // + // 포션 pItem[1] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 0, nullList); pItem[2] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 0, nullList); pItem[3] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 5, nullList); pItem[4] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 5, nullList); - // źâ + // 탄창 pItem[5] = CREATE_ITEM(Item::ITEM_CLASS_MAGAZINE, 0, nullList); Magazine* pMagazine = dynamic_cast(pItem[5]); pMagazine->setNum(9); } else if (m_ItemClass == Item::ITEM_CLASS_SMG) { - // + // 무기 pItem[0] = CREATE_ITEM(Item::ITEM_CLASS_SMG, 0, nullList); - // + // 포션 pItem[1] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 0, nullList); pItem[2] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 0, nullList); pItem[3] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 5, nullList); pItem[4] = CREATE_ITEM(Item::ITEM_CLASS_POTION, 5, nullList); - // źâ + // 탄창 pItem[5] = CREATE_ITEM(Item::ITEM_CLASS_MAGAZINE, 4, nullList); Magazine* pMagazine = dynamic_cast(pItem[5]); pMagazine->setNum(9); @@ -194,8 +194,8 @@ void ActionGiveNewbieItem::execute(Creature* pCreature1, Creature* pCreature2) } //////////////////////////////////////////////////////////// - // ϰ, DB ϰ, - // Ŭ̾Ʈ ش. + // 생성한 아이템을 등록하고, DB에 저장하고, + // 클라이언트에게 정보를 날려준다. //////////////////////////////////////////////////////////// ObjectRegistry& OR = pZone->getObjectRegistry(); TPOINT pt; @@ -232,7 +232,7 @@ void ActionGiveNewbieItem::execute(Creature* pCreature1, Creature* pCreature2) } } - // شٳ... + // 돈도 준다네... // pSlayer->setGoldEx(pSlayer->getGold() + 500); // by sigi. 2002.9.18 pSlayer->increaseGoldEx(500); @@ -241,20 +241,20 @@ void ActionGiveNewbieItem::execute(Creature* pCreature1, Creature* pCreature2) pPlayer->sendPacket(&gcModifyInformation); //////////////////////////////////////////////////////////// - // ޾, FlagSet Ѵ. - // 0 ʺ ޾Ҵ ÷׷ ߴ. - // ̰ ڵ. + // 아이템을 받았으니, 현재 FlagSet을 저장한다. + // 0번을 초보 아이템 받았다 플래그로 정했다. + // 이것은 어디까지나 땜빵 코드다. //////////////////////////////////////////////////////////// pFlagSet->turnOn(FLAGSET_RECEIVE_NEWBIE_ITEM); if (m_ItemClass == Item::ITEM_CLASS_SWORD || m_ItemClass == Item::ITEM_CLASS_BLADE) { - // 1 + // 무사일 경우 1 pFlagSet->turnOn(FLAGSET_RECEIVE_NEWBIE_ITEM_FIGHTER); } else if (m_ItemClass == Item::ITEM_CLASS_CROSS || m_ItemClass == Item::ITEM_CLASS_MACE) { - // 2 + // 성직자일 경우 2 pFlagSet->turnOn(FLAGSET_RECEIVE_NEWBIE_ITEM_CLERIC); } else { - // 3 + // 군인일 경우 3 pFlagSet->turnOn(FLAGSET_RECEIVE_NEWBIE_ITEM_GUNNER); } diff --git a/src/server/gameserver/quest/ActionGiveQuestItem.cpp b/src/server/gameserver/quest/ActionGiveQuestItem.cpp index bf06f02a..7e5d0c7b 100644 --- a/src/server/gameserver/quest/ActionGiveQuestItem.cpp +++ b/src/server/gameserver/quest/ActionGiveQuestItem.cpp @@ -39,7 +39,7 @@ void ActionGiveQuestItem::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionGiveQuestItem::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionGiveQuestItem.h b/src/server/gameserver/quest/ActionGiveQuestItem.h index 62a7474c..c7389836 100644 --- a/src/server/gameserver/quest/ActionGiveQuestItem.h +++ b/src/server/gameserver/quest/ActionGiveQuestItem.h @@ -2,7 +2,7 @@ // Filename : ActionGiveQuestItem.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_GIVE_QUEST_ITEM_H__ diff --git a/src/server/gameserver/quest/ActionHeal.cpp b/src/server/gameserver/quest/ActionHeal.cpp index ab8620ec..05c76f42 100644 --- a/src/server/gameserver/quest/ActionHeal.cpp +++ b/src/server/gameserver/quest/ActionHeal.cpp @@ -47,17 +47,17 @@ void ActionHeal::execute(Creature* pCreature1, Creature* pCreature2) Assert(pPlayer != NULL); - // ϴ Ŭ̾Ʈ ؼ OK Ŷ . + // 일단 클라이언트를 위해서 OK 패킷을 함 날린다. GCNPCResponse okpkt; okpkt.setCode(NPC_RESPONSE_HEAL); pPlayer->sendPacket(&okpkt); - // ׾ų ڸ ɷ ġش. + // 죽었거나 코마 걸려있으면 안 치료해준다. if (pCreature2->isDead() || pCreature2->isFlag(Effect::EFFECT_CLASS_COMA)) { return; } - // ̾... + // 슬레이어라면... if (pCreature2->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature2); EffectManager* pEffectManager = pSlayer->getEffectManager(); @@ -65,7 +65,7 @@ void ActionHeal::execute(Creature* pCreature1, Creature* pCreature2) GCRemoveEffect removePkt; GCStatusCurrentHP hpPkt; - // HP MP Ǯ äش. + // 먼저 HP랑 MP를 풀로 채워준다. if (pSlayer->getHP(ATTR_CURRENT) < pSlayer->getHP(ATTR_MAX)) { pSlayer->setHP(pSlayer->getHP(ATTR_MAX), ATTR_CURRENT); modifyPkt.addShortData(MODIFY_CURRENT_HP, pSlayer->getHP(ATTR_CURRENT)); @@ -78,30 +78,30 @@ void ActionHeal::execute(Creature* pCreature1, Creature* pCreature2) modifyPkt.addShortData(MODIFY_CURRENT_MP, pSlayer->getMP(ATTR_CURRENT)); } - // Ʈ Ѵ. + // 흡혈 이펙트를 삭제한다. Effect* pBloodDrainEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_BLOOD_DRAIN); if (pBloodDrainEffect != NULL) { - // DB ϰ, Ʈ Ŵ Ѵ. + // DB에서 삭제하고, 이펙트 매니저에서 삭제한다. pBloodDrainEffect->destroy(pSlayer->getName()); pEffectManager->deleteEffect(pSlayer, Effect::EFFECT_CLASS_BLOOD_DRAIN); - // ƸƮ ϱ Ʈ ٿش. + // 흡혈 아르바이트를 방지하기 위한 후유증 이펙트를 붙여준다. if (pSlayer->isFlag(Effect::EFFECT_CLASS_AFTERMATH)) { Effect* pEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_AFTERMATH); EffectAftermath* pEffectAftermath = dynamic_cast(pEffect); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. } else { EffectAftermath* pEffectAftermath = new EffectAftermath(pSlayer); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. pEffectManager->addEffect(pEffectAftermath); pSlayer->setFlag(Effect::EFFECT_CLASS_AFTERMATH); pEffectAftermath->create(pSlayer->getName()); } - // Ŷ Ѵ. + // 패킷에다 정보를 더한다. removePkt.addEffectList((EffectID_t)Effect::EFFECT_CLASS_BLOOD_DRAIN); - // ġϸ ɷġ ȭϰ ȴ. + // 흡혈을 치료하면 능력치가 변화하게 된다. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); @@ -109,27 +109,27 @@ void ActionHeal::execute(Creature* pCreature1, Creature* pCreature2) pSlayer->sendRealWearingInfo(); } - // Ʈ Ѵ. + // 독 이펙트를 삭제한다. Effect* pEffectPoison = pEffectManager->findEffect(Effect::EFFECT_CLASS_POISON); if (pEffectPoison != NULL) { - // Ʈ Ŵ Ѵ. + // 이펙트 매니저에서 삭제한다. pEffectManager->deleteEffect(pSlayer, Effect::EFFECT_CLASS_POISON); - // Ŷ Ѵ. + // 패킷에다 정보를 더한다. removePkt.addEffectList((EffectID_t)Effect::EFFECT_CLASS_POISON); } - // ũ Ʈ Ѵ. + // 다크블루 포이즌 이펙트를 삭제한다. Effect* pEffectDarkBluePoison = pEffectManager->findEffect(Effect::EFFECT_CLASS_DARKBLUE_POISON); if (pEffectDarkBluePoison != NULL) { - // Ʈ Ŵ Ѵ. + // 이펙트 매니저에서 삭제한다. pEffectManager->deleteEffect(pSlayer, Effect::EFFECT_CLASS_DARKBLUE_POISON); - // Ŷ Ѵ. + // 패킷에다 정보를 더한다. removePkt.addEffectList((EffectID_t)Effect::EFFECT_CLASS_DARKBLUE_POISON); } - // Ŷ ش. + // 패킷 날려준다. removePkt.setObjectID(pSlayer->getObjectID()); pPlayer->sendPacket(&modifyPkt); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &removePkt); @@ -143,7 +143,7 @@ void ActionHeal::execute(Creature* pCreature1, Creature* pCreature2) GCRemoveEffect removePkt; GCStatusCurrentHP hpPkt; - // HP äְ... + // HP 채워주고... if (pVampire->getHP(ATTR_CURRENT) < pVampire->getHP(ATTR_MAX)) { pVampire->setHP(pVampire->getHP(ATTR_MAX), ATTR_CURRENT); modifyPkt.addShortData(MODIFY_CURRENT_HP, pVampire->getHP(ATTR_CURRENT)); @@ -152,7 +152,7 @@ void ActionHeal::execute(Creature* pCreature1, Creature* pCreature2) hpPkt.setCurrentHP(pVampire->getHP(ATTR_CURRENT)); } - // Ŷ ش. + // 패킷 날려준다. removePkt.setObjectID(pVampire->getObjectID()); pPlayer->sendPacket(&modifyPkt); pZone->broadcastPacket(pVampire->getX(), pVampire->getY(), &removePkt); @@ -166,7 +166,7 @@ void ActionHeal::execute(Creature* pCreature1, Creature* pCreature2) GCRemoveEffect removePkt; GCStatusCurrentHP hpPkt; - // HP MP Ǯ äش. + // 먼저 HP랑 MP를 풀로 채워준다. if (pOusters->getHP(ATTR_CURRENT) < pOusters->getHP(ATTR_MAX) || pOusters->getSilverDamage() != 0) { Silver_t prev = pOusters->getSilverDamage(); @@ -186,50 +186,50 @@ void ActionHeal::execute(Creature* pCreature1, Creature* pCreature2) modifyPkt.addShortData(MODIFY_CURRENT_MP, pOusters->getMP(ATTR_CURRENT)); } - // Ʈ Ѵ. + // 독 이펙트를 삭제한다. Effect* pEffectPoison = pEffectManager->findEffect(Effect::EFFECT_CLASS_POISON); if (pEffectPoison != NULL) { - // Ʈ Ŵ Ѵ. + // 이펙트 매니저에서 삭제한다. pEffectManager->deleteEffect(pOusters, Effect::EFFECT_CLASS_POISON); - // Ŷ Ѵ. + // 패킷에다 정보를 더한다. removePkt.addEffectList((EffectID_t)Effect::EFFECT_CLASS_POISON); } - // ũ Ʈ Ѵ. + // 다크블루 포이즌 이펙트를 삭제한다. Effect* pEffectDarkBluePoison = pEffectManager->findEffect(Effect::EFFECT_CLASS_DARKBLUE_POISON); if (pEffectDarkBluePoison != NULL) { - // Ʈ Ŵ Ѵ. + // 이펙트 매니저에서 삭제한다. pEffectManager->deleteEffect(pOusters, Effect::EFFECT_CLASS_DARKBLUE_POISON); - // Ŷ Ѵ. + // 패킷에다 정보를 더한다. removePkt.addEffectList((EffectID_t)Effect::EFFECT_CLASS_DARKBLUE_POISON); } - // Ʈ Ѵ. + // 흡혈 이펙트를 삭제한다. Effect* pBloodDrainEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_BLOOD_DRAIN); if (pBloodDrainEffect != NULL) { pBloodDrainEffect->setDeadline(0); - // ƸƮ ϱ Ʈ ٿش. + // 흡혈 아르바이트를 방지하기 위한 후유증 이펙트를 붙여준다. if (pOusters->isFlag(Effect::EFFECT_CLASS_AFTERMATH)) { Effect* pEffect = pEffectManager->findEffect(Effect::EFFECT_CLASS_AFTERMATH); EffectAftermath* pEffectAftermath = dynamic_cast(pEffect); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. } else { EffectAftermath* pEffectAftermath = new EffectAftermath(pOusters); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. pEffectManager->addEffect(pEffectAftermath); pOusters->setFlag(Effect::EFFECT_CLASS_AFTERMATH); pEffectAftermath->create(pOusters->getName()); } - // Ŷ Ѵ. + // 패킷에다 정보를 더한다. removePkt.addEffectList((EffectID_t)Effect::EFFECT_CLASS_BLOOD_DRAIN); } - // Ŷ ش. + // 패킷 날려준다. removePkt.setObjectID(pOusters->getObjectID()); pPlayer->sendPacket(&modifyPkt); pZone->broadcastPacket(pOusters->getX(), pOusters->getY(), &removePkt); diff --git a/src/server/gameserver/quest/ActionInitEventQuest.cpp b/src/server/gameserver/quest/ActionInitEventQuest.cpp index 7643c86e..a69e968a 100644 --- a/src/server/gameserver/quest/ActionInitEventQuest.cpp +++ b/src/server/gameserver/quest/ActionInitEventQuest.cpp @@ -29,7 +29,7 @@ void ActionInitEventQuest::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionInitEventQuest::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionInitEventQuest.h b/src/server/gameserver/quest/ActionInitEventQuest.h index 830d1329..5d52a279 100644 --- a/src/server/gameserver/quest/ActionInitEventQuest.h +++ b/src/server/gameserver/quest/ActionInitEventQuest.h @@ -2,7 +2,7 @@ // Filename : ActionInitEventQuest.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_INIT_EVENT_QUEST_H__ diff --git a/src/server/gameserver/quest/ActionInitPartnerWaitingManager.cpp b/src/server/gameserver/quest/ActionInitPartnerWaitingManager.cpp index 673e646d..abe4f6ea 100644 --- a/src/server/gameserver/quest/ActionInitPartnerWaitingManager.cpp +++ b/src/server/gameserver/quest/ActionInitPartnerWaitingManager.cpp @@ -30,7 +30,7 @@ void ActionInitPartnerWaitingManager::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionInitPartnerWaitingManager::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionInitPartnerWaitingManager.h b/src/server/gameserver/quest/ActionInitPartnerWaitingManager.h index c0183a65..42d46ee5 100644 --- a/src/server/gameserver/quest/ActionInitPartnerWaitingManager.h +++ b/src/server/gameserver/quest/ActionInitPartnerWaitingManager.h @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : ActionInitPartnerWaitingManager.h -// Description : NPC ʱȭɶ Ư NPC Ŀ Ŵ ʱȭ ȴ. +// Description : NPC가 초기화될때 특정 NPC는 커플 등록 매니저를 초기화시켜줘야 된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_INIT_PARTNER_WAITING_MANAGER_H__ diff --git a/src/server/gameserver/quest/ActionInitSimpleQuest.cpp b/src/server/gameserver/quest/ActionInitSimpleQuest.cpp index 724727f9..1b9d081f 100644 --- a/src/server/gameserver/quest/ActionInitSimpleQuest.cpp +++ b/src/server/gameserver/quest/ActionInitSimpleQuest.cpp @@ -29,7 +29,7 @@ void ActionInitSimpleQuest::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionInitSimpleQuest::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionInitSimpleQuest.h b/src/server/gameserver/quest/ActionInitSimpleQuest.h index a01c4fd6..38b84be5 100644 --- a/src/server/gameserver/quest/ActionInitSimpleQuest.h +++ b/src/server/gameserver/quest/ActionInitSimpleQuest.h @@ -2,7 +2,7 @@ // Filename : ActionInitSimpleQuest.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_INIT_SIMPLE_QUEST_H__ diff --git a/src/server/gameserver/quest/ActionJoinRaceWar.cpp b/src/server/gameserver/quest/ActionJoinRaceWar.cpp index 4335e14b..6a13e50b 100644 --- a/src/server/gameserver/quest/ActionJoinRaceWar.cpp +++ b/src/server/gameserver/quest/ActionJoinRaceWar.cpp @@ -36,7 +36,7 @@ void ActionJoinRaceWar::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionJoinRaceWar::execute(Creature* pCreature1, Creature* pCreature2) @@ -56,7 +56,7 @@ void ActionJoinRaceWar::execute(Creature* pCreature1, Creature* pCreature2) static int isJoinRaceWar = g_pConfig->getPropertyInt("JoinRaceWar"); - // ü û ִ + // 서버 자체에 종족 전쟁 참가 신청 기능이 꺼져있는 경우 if (!isJoinRaceWar) { gcNPCResponse.setCode(NPC_RESPONSE_RACE_WAR_GO_FIRST_SERVER); pPC->getPlayer()->sendPacket(&gcNPCResponse); diff --git a/src/server/gameserver/quest/ActionJoinRaceWar.h b/src/server/gameserver/quest/ActionJoinRaceWar.h index d668f746..916f472c 100644 --- a/src/server/gameserver/quest/ActionJoinRaceWar.h +++ b/src/server/gameserver/quest/ActionJoinRaceWar.h @@ -2,7 +2,7 @@ // Filename : ActionJoinRaceWar.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_JOIN_RACE_WAR_H__ diff --git a/src/server/gameserver/quest/ActionMiniGame.cpp b/src/server/gameserver/quest/ActionMiniGame.cpp index 8e067fed..1e9ee7c5 100644 --- a/src/server/gameserver/quest/ActionMiniGame.cpp +++ b/src/server/gameserver/quest/ActionMiniGame.cpp @@ -31,7 +31,7 @@ void ActionMiniGame::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionMiniGame::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionMiniGame.h b/src/server/gameserver/quest/ActionMiniGame.h index 7abe8d2c..3998fedc 100644 --- a/src/server/gameserver/quest/ActionMiniGame.h +++ b/src/server/gameserver/quest/ActionMiniGame.h @@ -2,7 +2,7 @@ // Filename : ActionMiniGame.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_MINI_GAME_H__ @@ -35,7 +35,7 @@ class ActionMiniGame : public Action { } private: - int m_GameType; // ̵ + int m_GameType; // 말할 대사 아이디 }; diff --git a/src/server/gameserver/quest/ActionModifyTaxRatio.cpp b/src/server/gameserver/quest/ActionModifyTaxRatio.cpp index 3eb11543..2fae4ca0 100644 --- a/src/server/gameserver/quest/ActionModifyTaxRatio.cpp +++ b/src/server/gameserver/quest/ActionModifyTaxRatio.cpp @@ -28,7 +28,7 @@ void ActionModifyTaxRatio::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionModifyTaxRatio::execute(Creature* pCreature1, Creature* pCreature2) @@ -52,21 +52,21 @@ void ActionModifyTaxRatio::execute(Creature* pCreature1, Creature* pCreature2) Guild* pGuild = g_pGuildManager->getGuild(guildID); if (bSuccess && pGuild == NULL) { - // 尡 . + // 길드가 없다. bSuccess = false; deny.setCode(NPC_RESPONSE_NO_GUILD); } if (bSuccess && pGuild->getMaster() != pPC->getName()) { - // Ͱ ƴϴ. + // 길드 마스터가 아니다. bSuccess = false; deny.setCode(NPC_RESPONSE_NOT_GUILD_MASTER); } - // ̴. + // 길드 마스터이다. list pCastleInfoList = g_pCastleInfoManager->getGuildCastleInfos(guildID); if (bSuccess && pCastleInfoList.empty()) { - // 尡 . + // 길드가 소유한 성이 없다. bSuccess = false; deny.setCode(NPC_RESPONSE_HAS_NO_CASTLE); } diff --git a/src/server/gameserver/quest/ActionModifyTaxRatio.h b/src/server/gameserver/quest/ActionModifyTaxRatio.h index bd534553..8deb1d82 100644 --- a/src/server/gameserver/quest/ActionModifyTaxRatio.h +++ b/src/server/gameserver/quest/ActionModifyTaxRatio.h @@ -2,7 +2,7 @@ // Filename : ActionModifyTaxRatio.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_MODIFY_TAX_RATIO_H__ diff --git a/src/server/gameserver/quest/ActionPetDeposit.cpp b/src/server/gameserver/quest/ActionPetDeposit.cpp index 42c281a7..fb9645fe 100644 --- a/src/server/gameserver/quest/ActionPetDeposit.cpp +++ b/src/server/gameserver/quest/ActionPetDeposit.cpp @@ -32,7 +32,7 @@ void ActionPetDeposit::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionPetDeposit::execute(Creature* pCreature1, Creature* pCreature2) @@ -50,7 +50,7 @@ void ActionPetDeposit::execute(Creature* pCreature1, Creature* pCreature2) GCPetStashList gcPetStashList; makeGCPetStashList(&gcPetStashList, pPC); - /* ֺ ߱ ȭâ ݾ־ ϱ⿡ .*/ + /* 팻보관함이 뜨기 전에 대화창을 닫아주어야 하기에 날린다.*/ GCNPCResponse response; response.setCode(NPC_RESPONSE_QUIT_DIALOGUE); pPC->getPlayer()->sendPacket(&response); diff --git a/src/server/gameserver/quest/ActionPetDeposit.h b/src/server/gameserver/quest/ActionPetDeposit.h index 5ef95c1c..f160cca6 100644 --- a/src/server/gameserver/quest/ActionPetDeposit.h +++ b/src/server/gameserver/quest/ActionPetDeposit.h @@ -2,7 +2,7 @@ // Filename : ActionPetDeposit.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_PET_DEPOSIT_H__ diff --git a/src/server/gameserver/quest/ActionPetWithdraw.cpp b/src/server/gameserver/quest/ActionPetWithdraw.cpp index ce925cab..ee1f2446 100644 --- a/src/server/gameserver/quest/ActionPetWithdraw.cpp +++ b/src/server/gameserver/quest/ActionPetWithdraw.cpp @@ -30,7 +30,7 @@ void ActionPetWithdraw::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionPetWithdraw::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionPetWithdraw.h b/src/server/gameserver/quest/ActionPetWithdraw.h index 4ba972f4..356d2da2 100644 --- a/src/server/gameserver/quest/ActionPetWithdraw.h +++ b/src/server/gameserver/quest/ActionPetWithdraw.h @@ -2,7 +2,7 @@ // Filename : ActionPetWithdraw.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_PET_WITHDRAW_H__ diff --git a/src/server/gameserver/quest/ActionPrepareShop.h b/src/server/gameserver/quest/ActionPrepareShop.h index d6711609..1df55162 100644 --- a/src/server/gameserver/quest/ActionPrepareShop.h +++ b/src/server/gameserver/quest/ActionPrepareShop.h @@ -2,8 +2,8 @@ // Filename : ActionPrepareShop.h // Written By : // Description : -// NPC ó ε , NPC Ȱ -// غϴ ׼̴. ShopTemplate Ŭ Ŵ . +// 상점 NPC를 제일 처음 로딩할 때, 상점 NPC가 팔게 될 아이템을 +// 준비하는 액션이다. ShopTemplate 클래스와 매니저를 참고할 것. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_PREPARE_SHOP_H__ diff --git a/src/server/gameserver/quest/ActionPrepareTeach.cpp b/src/server/gameserver/quest/ActionPrepareTeach.cpp index ebbc98cb..3f79e289 100644 --- a/src/server/gameserver/quest/ActionPrepareTeach.cpp +++ b/src/server/gameserver/quest/ActionPrepareTeach.cpp @@ -2,9 +2,9 @@ // Filename : ActionPrepareTeach.cpp // Written By : // Description : -// NPC ִ ϴ ׼̴. -// PrepareShop ϰ AtFirst ̿Ͽ ó -// ѹ ϰ ٽô ʴ´. +// 교관 NPC가 가르쳐 줄 수 있는 기술의 종류를 정하는 액션이다. +// PrepareShop과 비슷하게 AtFirst 컨디션을 이용하여 처음 +// 한번만 실행하고 다시는 실행하지 않는다. //////////////////////////////////////////////////////////////////////////////// #include "ActionPrepareTeach.h" @@ -21,7 +21,7 @@ void ActionPrepareTeach::read(PropertyBuffer& propertyBuffer) __BEGIN_TRY try { - // NPC ִ ƽ оδ. + // 이 NPC가 가르쳐 줄 수 있는 맥스 레벨을 읽어들인다. m_MaxLevel = (SkillLevel_t)propertyBuffer.getPropertyInt("MaxLevel"); } catch (NoSuchElementException& nsee) { throw Error(nsee.toString()); @@ -32,7 +32,7 @@ void ActionPrepareTeach::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionPrepareTeach::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionPrepareTeach.h b/src/server/gameserver/quest/ActionPrepareTeach.h index 174b1ea2..1ce73872 100644 --- a/src/server/gameserver/quest/ActionPrepareTeach.h +++ b/src/server/gameserver/quest/ActionPrepareTeach.h @@ -2,9 +2,9 @@ // Filename : ActionPrepareTeach.h // Written By : // Description : -// NPC ִ ϴ ׼̴. -// PrepareShop ϰ AtFirst ̿Ͽ ó -// ѹ ϰ ٽô ʴ´. +// 교관 NPC가 가르쳐 줄 수 있는 기술의 종류를 정하는 액션이다. +// PrepareShop과 비슷하게 AtFirst 컨디션을 이용하여 처음 +// 한번만 실행하고 다시는 실행하지 않는다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_PREPARE_TEACH_H__ @@ -37,7 +37,7 @@ class ActionPrepareTeach : public Action { } private: - SkillLevel_t m_MaxLevel; // ų ƽ + SkillLevel_t m_MaxLevel; // 가르쳐 줄 스킬의 맥스 레벨 }; diff --git a/src/server/gameserver/quest/ActionQuestReward.cpp b/src/server/gameserver/quest/ActionQuestReward.cpp index c966d44f..ca5d2323 100644 --- a/src/server/gameserver/quest/ActionQuestReward.cpp +++ b/src/server/gameserver/quest/ActionQuestReward.cpp @@ -36,7 +36,7 @@ void ActionQuestReward::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionQuestReward::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionQuestReward.h b/src/server/gameserver/quest/ActionQuestReward.h index 561f126f..11c6eae0 100644 --- a/src/server/gameserver/quest/ActionQuestReward.h +++ b/src/server/gameserver/quest/ActionQuestReward.h @@ -2,7 +2,7 @@ // Filename : ActionQuestReward.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_QUEST_REWARD_H__ diff --git a/src/server/gameserver/quest/ActionQuitDialogue.cpp b/src/server/gameserver/quest/ActionQuitDialogue.cpp index 8a14a2e1..4c785111 100644 --- a/src/server/gameserver/quest/ActionQuitDialogue.cpp +++ b/src/server/gameserver/quest/ActionQuitDialogue.cpp @@ -18,14 +18,14 @@ void ActionQuitDialogue::read(PropertyBuffer& propertyBuffer) { __BEGIN_TRY - // ׼ NPC ÷̾ ȭ Ű ϹǷ - // Ư о鿩 ĶͰ ʴ´. + // 이 액션은 NPC와 플레이어 간의 대화를 종료시키는 역할을 하므로 + // 특별히 읽어들여야 할 파라미터가 존재하지 않는다. __END_CATCH } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionQuitDialogue::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionRandomSay.cpp b/src/server/gameserver/quest/ActionRandomSay.cpp index 7fc2a593..bb2e29f6 100644 --- a/src/server/gameserver/quest/ActionRandomSay.cpp +++ b/src/server/gameserver/quest/ActionRandomSay.cpp @@ -33,7 +33,7 @@ void ActionRandomSay::read(PropertyBuffer& propertyBuffer) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionRandomSay::execute(Creature* pCreature1, Creature* pCreature2) @@ -45,11 +45,11 @@ void ActionRandomSay::execute(Creature* pCreature1, Creature* pCreature2) Assert(pCreature2 == NULL); Assert(pCreature1->isNPC()); - // RandomSay Ʒ ٽ, (Start End) - // ũƮ ϳ Ŭ̾Ʈ ̴. - // ׷Ƿ Start End ̿ ʴ ũƮ ϴ. - // ũƮ ̺ , RandomSay ϴ - // Ͱ ݵ ϰ Ѵ. + // RandomSay는 아래에서 보다시피, 임의의 범위(Start와 End) 안의 + // 스크립트 중 랜덤을 돌려 하나를 클라이언트에게 보내는 식이다. + // 그러므로 Start와 End 사이에 존재하지 않는 스크립트가 있으면 곤란하다. + // 스크립트 테이블을 만들 때, RandomSay에 사용하는 것은 + // 데이터가 반드시 연속적으로 존재하게 만들어야 한다. NPC* pNPC = dynamic_cast(pCreature1); ScriptID_t scriptID = m_StartScriptID + random() % (m_EndScriptID - m_StartScriptID + 1); const Script* pScript = g_pPublicScriptManager->getScript(scriptID); diff --git a/src/server/gameserver/quest/ActionRandomSay.h b/src/server/gameserver/quest/ActionRandomSay.h index cad20c48..9acd9b9f 100644 --- a/src/server/gameserver/quest/ActionRandomSay.h +++ b/src/server/gameserver/quest/ActionRandomSay.h @@ -41,8 +41,8 @@ class ActionRandomSay : public Action { } private: - ScriptID_t m_StartScriptID; // ̵ ID - ScriptID_t m_EndScriptID; // ̵ ID + ScriptID_t m_StartScriptID; // 말할 대사 아이디 시작 ID + ScriptID_t m_EndScriptID; // 말할 대사 아이디 끝 ID }; diff --git a/src/server/gameserver/quest/ActionRecallSiege.cpp b/src/server/gameserver/quest/ActionRecallSiege.cpp index 1484df99..909ac837 100644 --- a/src/server/gameserver/quest/ActionRecallSiege.cpp +++ b/src/server/gameserver/quest/ActionRecallSiege.cpp @@ -48,7 +48,7 @@ void ActionRecallSiege::read(PropertyBuffer& pb) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// ¾×¼ÇÀ» ½ÇÇàÇÑ´Ù. //////////////////////////////////////////////////////////////////////////////// void ActionRecallSiege::execute(Creature* pNPC, Creature* pCreature) @@ -98,12 +98,12 @@ void ActionRecallSiege::execute(Creature* pNPC, Creature* pCreature) if (!g_pGuildManager->isGuildMaster(pPC->getGuildID(), pPC)) { GCSystemMessage gcSM; - gcSM.setMessage("ֻл᳤,ſԽ."); + gcSM.setMessage("Ö»ÓÐÐлá»á³¤,²Å¿ÉÒÔ½øÐÐÉêÇë."); pGamePlayer->sendPacket(&gcSM); return; } - // 带 ´. + // ¼±ÅÃÇÑ ±æµå¸¦ °¡Á®¿Â´Ù. Guild* pGuild = g_pGuildManager->getGuild(pPC->getGuildID()); // try { Assert( pGuild != NULL ); } catch ( Throwable& ) { return; } if (pGuild == NULL) diff --git a/src/server/gameserver/quest/ActionRecallSiege.h b/src/server/gameserver/quest/ActionRecallSiege.h index 50f519b3..b39515d8 100644 --- a/src/server/gameserver/quest/ActionRecallSiege.h +++ b/src/server/gameserver/quest/ActionRecallSiege.h @@ -2,7 +2,7 @@ // Filename : ActionRecallSiege.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_RECALL_SIEGE_H__ diff --git a/src/server/gameserver/quest/ActionRedeemMotorcycle.cpp b/src/server/gameserver/quest/ActionRedeemMotorcycle.cpp index d7b2ab93..d6f11ce9 100644 --- a/src/server/gameserver/quest/ActionRedeemMotorcycle.cpp +++ b/src/server/gameserver/quest/ActionRedeemMotorcycle.cpp @@ -44,11 +44,11 @@ void ActionRedeemMotorcycle::execute(Creature* pCreature1, Creature* pCreature2) Player* pPlayer = pCreature2->getPlayer(); Assert(pPlayer != NULL); - // ϴ Ŭ̾Ʈ okŶ ϳ ְ... + // 일단 클라이언트를 위해 ok패킷을 하나 날려주고... GCNPCResponse answerOKpkt; pPlayer->sendPacket(&answerOKpkt); - // ÷̾ ̾ ˻Ѵ. + // 플레이어가 슬레이어인지 검사한다. if (pCreature2->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature2); Zone* pZone = pSlayer->getZone(); @@ -70,10 +70,10 @@ void ActionRedeemMotorcycle::execute(Creature* pCreature1, Creature* pCreature2) BeltInvenHeight = pBeltInventory->getHeight(); } - // κ丮 ˻Ѵ. + // 인벤토리를 검색한다. for (uint y = 0; y < InvenHeight; y++) { for (uint x = 0; x < InvenWidth; x++) { - // x, y ִٸ... + // x, y에 아이템이 있다면... if (pInventory->hasItem(x, y)) { pItem = pInventory->getItem(x, y); if (load(pItem, pSlayer, pZone, pSlayer->getX(), pSlayer->getY())) { @@ -84,7 +84,7 @@ void ActionRedeemMotorcycle::execute(Creature* pCreature1, Creature* pCreature2) } if (pBelt != NULL) { - // Ʈ ˻Ѵ + // 벨트를 검색한다 for (uint y = 0; y < BeltInvenHeight; y++) { for (uint x = 0; x < BeltInvenWidth; x++) { if (pBeltInventory->hasItem(x, y)) { @@ -96,7 +96,7 @@ void ActionRedeemMotorcycle::execute(Creature* pCreature1, Creature* pCreature2) } } } - } else // ̾...̸ ã ? + } else // 뱀파이어라면...오토바이를 찾아줄 이유가 있을까? { } @@ -112,7 +112,7 @@ bool ActionRedeemMotorcycle::load(Item* pItem, Slayer* pSlayer, Zone* pZone, Zon __BEGIN_TRY - // ܼ Ǵ Ű ƴ϶ false . + // 단서가 되는 아이템이 키가 아니라면 false를 리턴. if (pItem->getItemClass() != Item::ITEM_CLASS_KEY) return false; @@ -120,19 +120,19 @@ bool ActionRedeemMotorcycle::load(Item* pItem, Slayer* pSlayer, Zone* pZone, Zon ItemID_t targetID = pKey->getTarget(); try { - // Ű ´ٸ Ű Ÿ Ǵ ID . + // 키가 맞다면 키의 타겟이 되는 아이템의 아이템 ID를 얻어낸다. Statement* pStmt = NULL; Result* pResult = NULL; - // targetID 0 .. targetID(motorcycleObject ItemID) ȵ . - // ӽ÷ targetID key ItemID ϸ ȴ... . - // targetID motorcycle itemID  .. - // broadcasting .. Assert() ؼ ٿǾ... . - -; + // targetID가 0인 경우는.. targetID(motorcycleObject의 ItemID)가 설정이 안된 경우다. + // 이 때는 임시로 targetID를 key의 ItemID와 같게 하면 된다...고 본다. + // targetID가 motorcycle의 itemID로 들어가기 때문에.. + // broadcasting 등에서.. Assert()에 의해서 다운되었다...고 보여진다. - -; // by sigi. 2002.12.25 x-mas T_T; if (targetID == 0) { targetID = pKey->setNewMotorcycle(pSlayer); - /* // (!) MotorcycleObject ϰ MotorcycleItemID==Target ޾ƾ Ѵ. - // ڵ Լ ⸦.. -_-; by sigi + /* // (!) MotorcycleObject를 생성하고 MotorcycleItemID==Target를 받아야 한다. + // 이 코드 제발 함수로 빼기를.. -_-; by sigi list optionNULL; Item* pMotorcycle = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_MOTORCYCLE, 0, optionNULL); Assert(pMotorcycle != NULL); @@ -143,7 +143,7 @@ bool ActionRedeemMotorcycle::load(Item* pItem, Slayer* pSlayer, Zone* pZone, Zon targetID = pMotorcycle->getItemID(); - // targetID DB updateѾ Ѵ. + // targetID를 DB에도 update시켜야 한다. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); @@ -155,11 +155,11 @@ bool ActionRedeemMotorcycle::load(Item* pItem, Slayer* pSlayer, Zone* pZone, Zon } END_DB(pStmt) - // ؿ pMotorcycle ص ǰ, ڵ ǵ帱 ⼭ . + // 밑에서 pMotorcycle을 사용해도 되겠지만, 기존 코드 안 건드릴려고 여기서 지운다. SAFE_DELETE(pMotorcycle);*/ } else { - // ѹ ͻŬ̶ Ű ƴµ ͻŬ ڲ 쳪. - // Ű ͻŬ ִ üũϰ  ־ش. + // 한번 모터사이클이랑 키랑 연결됐는데 모터사이클을 누가 자꾸 지우나보다. + // 키에 연결된 모터사이클이 실제로 디비에 있는지 체크하고 없으면 새로 만들어서 넣어준다. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pResult = pStmt->executeQuery("SELECT ItemID FROM MotorcycleObject WHERE ItemID=%lu", targetID); @@ -177,17 +177,17 @@ bool ActionRedeemMotorcycle::load(Item* pItem, Slayer* pSlayer, Zone* pZone, Zon } - // ʻ ڵ -_-; + // 필살 방어 코드 -_-; if (targetID == 0) { filelog("errorLog.txt", "[ActionRedeemMotorcycle] itemID=%d, motorItemID=%d", (int)pItem->getItemID(), (int)targetID); return false; } - // DB ϱ ü Ǿ üũѴ. + // DB에 쿼리하기 전에 먼저 객체가 생성되어 있지는 않은지 체크한다. if (g_pParkingCenter->hasMotorcycleBox(targetID)) { - // ڲ ٿǾ Ȥó ϰ.. - // ϴ ּóѴ. by sigi. 2002.11.16 + // 자꾸 다운되어서 혹시나 하고.. + // 일단 주석처리한다. by sigi. 2002.11.16 /* if (!pSlayer->hasRideMotorcycle() && !pSlayer->isFlag(Effect::EFFECT_CLASS_COMA)) @@ -197,7 +197,7 @@ bool ActionRedeemMotorcycle::load(Item* pItem, Slayer* pSlayer, Zone* pZone, Zon // by sigi. 2002.11.14 MotorcycleBox* pMotorcycleBox = g_pParkingCenter->getMotorcycleBox(targetID); - // ִٸ ȯѴ. + // 있다면 소환한다. if (pMotorcycleBox!=NULL && !pMotorcycleBox->isTransport()) { @@ -206,25 +206,25 @@ bool ActionRedeemMotorcycle::load(Item* pItem, Slayer* pSlayer, Zone* pZone, Zon ZoneCoord_t motorY = pMotorcycleBox->getY(); Motorcycle* pMotorcycle = pMotorcycleBox->getMotorcycle(); - // ִ - // Ÿ ʹ θ ~ + // 같은 존에 있는 경우 + // 거리가 너무 가까우면 부르지 말자~ if (pMotorZone!=pZone || pSlayer->getDistance(motorX, motorY) > 15) { - // ٸ zone ̵̶ ǥѴ. + // 다른 zone으로 이동중이라고 표시한다. pMotorcycleBox->setTransport(); - // motorcycle slayer zone ű. + // motorcycle을 slayer의 zone으로 옮긴다. pMotorZone->transportItem( motorX, motorY, pMotorcycle, pZone, pSlayer->getX(), pSlayer->getY() ); - // Use OK ̴. - // Useϸ ׷ ʹ. - -; + // Use OK 대용이다. + // Use하면 아이템이 사라지던가 그렇지 싶다. - -; //GCCannotUse _GCCannotUse; //_GCCannotUse.setObjectID(pPacket->getObjectID()); //pGamePlayer->sendPacket(&_GCCannotUse); - // ѵ delay ϴµ.. + // 한동안 delay를 줘야하는데.. } } @@ -249,7 +249,7 @@ bool ActionRedeemMotorcycle::load(Item* pItem, Slayer* pSlayer, Zone* pZone, Zon pResult = pStmt->executeQueryString(sql.toString()); // by sigi. 2002.10.14 - // ٸ ͻŬ . + // 결과물이 없다면 모터사이클이 없는 거쥐. if (pResult->getRowCount() <= 0) { bFound = false; @@ -269,7 +269,7 @@ bool ActionRedeemMotorcycle::load(Item* pItem, Slayer* pSlayer, Zone* pZone, Zon } - // ͻŬ ü Ѵ. + // 모터사이클 객체를 생성한다. list optionTypes; setOptionTypeFromField(optionTypes, optionType); Motorcycle* pMotorcycle = new Motorcycle(itemType, optionTypes); @@ -279,17 +279,17 @@ bool ActionRedeemMotorcycle::load(Item* pItem, Slayer* pSlayer, Zone* pZone, Zon pMotorcycle->setItemID(itemID); pMotorcycle->setDurability(durability); - // ̱ oid Ҵ޴´. + // 존에다 붙이기 전에 oid를 새로 할당받는다. (pZone->getObjectRegistry()).registerObject(pMotorcycle); - // ͻŬ ٺδ. + // 생성한 모터사이클을 존에다 갖다붙인다. TPOINT pt = pZone->addItem(pMotorcycle, x, y, false); if (pt.x == -1) { - // ̸ . . + // 오토바이를 존에다 더할 수 없었다. 씨바. filelog("motorError.txt", - "ActionRedeemMotorcycle::load() : ͻŬ ϴ. zoneID=%d, xy=(%d, %d)", + "ActionRedeemMotorcycle::load() : 모터사이클을 존에다 더할 수 없습니다. zoneID=%d, xy=(%d, %d)", (int)pZone->getZoneID(), (int)x, (int)y); // by sigi. 2002.12.24 - throw Error("ActionRedeemMotorcycle::load() : ͻŬ ϴ"); + throw Error("ActionRedeemMotorcycle::load() : 모터사이클을 존에다 더할 수 없습니다"); } // by sigi. 2002.10.14 @@ -301,7 +301,7 @@ bool ActionRedeemMotorcycle::load(Item* pItem, Slayer* pSlayer, Zone* pZone, Zon durability); } - // ͻŬ ŷ Ϳ ش. + // 모터사이클을 뻑킹 센터에 등록해준다. MotorcycleBox* pBox = new MotorcycleBox(pMotorcycle, pZone, pt.x, pt.y); Assert(pBox != NULL); @@ -322,7 +322,7 @@ bool ActionRedeemMotorcycle::load(Item* pItem, Slayer* pSlayer, Zone* pZone, Zon } catch (Throwable& t) { // by sigi. 2002.12.25 filelog("motorError.txt", "%s - itemID=%d, motorItemID=%d", t.toString().c_str(), (int)pItem->getItemID(), (int)targetID); - // ϴ ٿ . + // 일단 다운은 막자. // throw; } diff --git a/src/server/gameserver/quest/ActionRedeemMotorcycle.h b/src/server/gameserver/quest/ActionRedeemMotorcycle.h index 520f7993..8d805b39 100644 --- a/src/server/gameserver/quest/ActionRedeemMotorcycle.h +++ b/src/server/gameserver/quest/ActionRedeemMotorcycle.h @@ -2,8 +2,8 @@ // Filename : ActionRedeemMotorcycle.h // Written By : // Description : -// ÷̾ ӿ , ̰ ְ, ÷̾ տ -// ü ִ Ѵ. +// 플레이어가 게임에 들어왔을 때, 오토바이가 어디 있건, 플레이어의 앞에 +// 오토바이 객체를 생성해 주는 역할을 한다. //////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_REDEEM_MOTORCYCLE_H__ diff --git a/src/server/gameserver/quest/ActionRedistributeAttr.cpp b/src/server/gameserver/quest/ActionRedistributeAttr.cpp index e2f8dd42..1537705d 100644 --- a/src/server/gameserver/quest/ActionRedistributeAttr.cpp +++ b/src/server/gameserver/quest/ActionRedistributeAttr.cpp @@ -50,7 +50,7 @@ void ActionRedistributeAttr::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionRedistributeAttr::execute(Creature* pCreature1, Creature* pCreature2) @@ -65,7 +65,7 @@ void ActionRedistributeAttr::execute(Creature* pCreature1, Creature* pCreature2) Player* pPlayer = pCreature2->getPlayer(); Assert(pPlayer != NULL); - // Ŭ̾Ʈ GCNPCResponse ش. + // 먼저 클라이언트를 위해 GCNPCResponse를 보내준다. GCNPCResponse okpkt; pPlayer->sendPacket(&okpkt); @@ -73,15 +73,15 @@ void ActionRedistributeAttr::execute(Creature* pCreature1, Creature* pCreature2) Gold_t ATTR_PRICE = g_pVariableManager->getVariable(VAMPIRE_REDISTRIBUTE_ATTR_PRICE); - // ʴٸ . + // 돈을 가지고 있지 않다면 에러다. if (pVampire->getGold() < ATTR_PRICE) { - // ȭâ ݰ Ѵ. + // 먼저 대화창을 닫게 한다. GCNPCResponse gcNPCResponse; gcNPCResponse.setCode(NPC_RESPONSE_QUIT_DIALOGUE); pPlayer->sendPacket(&gcNPCResponse); /* StringStream msg; - msg << pVampire->getName() << " ʽϴ.(" << ATTR_PRICE << " ֵ)"; */ + msg << pVampire->getName() << " 님은 충분한 돈을 가지고 있지 않습니다.(" << ATTR_PRICE << " 겔드)"; */ char msg[100]; sprintf(msg, g_pStringPool->c_str(STRID_NOT_ENOUGH_MONEY), pVampire->getName().c_str()); @@ -92,8 +92,8 @@ void ActionRedistributeAttr::execute(Creature* pCreature1, Creature* pCreature2) return; } - // 2ŭ ɷġ ʽ Ʈ ȯ ִ. - // ׷Ƿ ̹ Ѱ踦 ä ʾҴ ˻Ѵ. + // 레벨 나누기 2만큼의 능력치만 보너스 포인트로 전환할 수 있다. + // 그러므로 이미 그 한계를 다 채우지는 않았는지 검사한다. Statement* pStmt = NULL; Result* pResult = NULL; int RedistributedAttr = 0; @@ -111,13 +111,13 @@ void ActionRedistributeAttr::execute(Creature* pCreature1, Creature* pCreature2) } if (RedistributedAttr >= pVampire->getLevel()) { - // ȭâ ݰ Ѵ. + // 먼저 대화창을 닫게 한다. GCNPCResponse gcNPCResponse; gcNPCResponse.setCode(NPC_RESPONSE_QUIT_DIALOGUE); pPlayer->sendPacket(&gcNPCResponse); // StringStream msg; - // msg << "ŭ ʽ Ʈ ȯ ֽϴ."; + // msg << "레벨만큼만 보너스 포인트로 전환할 수 있습니다."; GCSystemMessage gcSM; gcSM.setMessage(g_pStringPool->getString(STRID_TRANS_BONUS_POINT)); @@ -130,24 +130,24 @@ void ActionRedistributeAttr::execute(Creature* pCreature1, Creature* pCreature2) } END_DB(pStmt) - // ɷġ ϱ⿡ ռ ɷġ Ѵ. + // 능력치를 변경하기에 앞서 기존의 능력치를 저장한다. VAMPIRE_RECORD prev; pVampire->getVampireRecord(prev); StringStream sql; StringStream sql2; - // STR й + // STR 재분배 if (m_AttrType == 0) { - // 20϶ ̻ й . + // 순수힘이 20이하라면 더 이상 재분배할 수가 없다. if (pVampire->getSTR(ATTR_BASIC) <= 20) { - // ȭâ ݰ Ѵ. + // 먼저 대화창을 닫게 한다. GCNPCResponse gcNPCResponse; gcNPCResponse.setCode(NPC_RESPONSE_QUIT_DIALOGUE); pPlayer->sendPacket(&gcNPCResponse); // StringStream msg; - // msg << "STR 20Ϸ ϴ."; + // msg << "STR을 20이하로 낮출 수는 없습니다."; GCSystemMessage gcSM; gcSM.setMessage(g_pStringPool->getString(STRID_STR_LOW_LIMIT)); @@ -158,16 +158,16 @@ void ActionRedistributeAttr::execute(Creature* pCreature1, Creature* pCreature2) pVampire->setSTR(pVampire->getSTR(ATTR_BASIC) - 1, ATTR_BASIC); sql << "STR = " << (int)pVampire->getSTR(ATTR_BASIC); } - // DEX й + // DEX 재분배 else if (m_AttrType == 1) { if (pVampire->getDEX(ATTR_BASIC) <= 20) { - // ȭâ ݰ Ѵ. + // 먼저 대화창을 닫게 한다. GCNPCResponse gcNPCResponse; gcNPCResponse.setCode(NPC_RESPONSE_QUIT_DIALOGUE); pPlayer->sendPacket(&gcNPCResponse); // StringStream msg; - // msg << "DEX 20Ϸ ϴ."; + // msg << "DEX를 20이하로 낮출 수는 없습니다."; GCSystemMessage gcSM; gcSM.setMessage(g_pStringPool->getString(STRID_DEX_LOW_LIMIT)); @@ -178,16 +178,16 @@ void ActionRedistributeAttr::execute(Creature* pCreature1, Creature* pCreature2) pVampire->setDEX(pVampire->getDEX(ATTR_BASIC) - 1, ATTR_BASIC); sql << "DEX = " << (int)pVampire->getDEX(ATTR_BASIC); } - // INT й + // INT 재분배 else if (m_AttrType == 2) { if (pVampire->getINT(ATTR_BASIC) <= 20) { - // ȭâ ݰ Ѵ. + // 먼저 대화창을 닫게 한다. GCNPCResponse gcNPCResponse; gcNPCResponse.setCode(NPC_RESPONSE_QUIT_DIALOGUE); pPlayer->sendPacket(&gcNPCResponse); // StringStream msg; - // msg << "INT 20Ϸ ϴ."; + // msg << "INT를 20이하로 낮출 수는 없습니다."; GCSystemMessage gcSM; gcSM.setMessage(g_pStringPool->getString(STRID_INT_LOW_LIMIT)); @@ -201,9 +201,9 @@ void ActionRedistributeAttr::execute(Creature* pCreature1, Creature* pCreature2) Assert(false); } - // پ ɷġ ̺ϰ, - // ɷġ پ, ʽ ø. - // ׸ δ. + // 줄어든 능력치를 세이브하고, + // 능력치가 줄어들었으니, 보너스를 늘린다. + // 그리고 돈을 줄인다. pVampire->tinysave(sql.toString()); pVampire->setBonus(pVampire->getBonus() + 1); sql2 << "Bonus = " << (int)pVampire->getBonus(); @@ -221,7 +221,7 @@ void ActionRedistributeAttr::execute(Creature* pCreature1, Creature* pCreature2) pVampire->sendRealWearingInfo(); pPlayer->sendPacket(&gcMI); - // ȯ ɷġ ؾ Ѵ. + // 변환한 능력치의 양을 저장해야 한다. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery("UPDATE Vampire SET RedistributeAttr = %d WHERE Name='%s'", RedistributedAttr + 1, diff --git a/src/server/gameserver/quest/ActionRegenEventShop.h b/src/server/gameserver/quest/ActionRegenEventShop.h index a48ace51..a7933494 100644 --- a/src/server/gameserver/quest/ActionRegenEventShop.h +++ b/src/server/gameserver/quest/ActionRegenEventShop.h @@ -2,7 +2,7 @@ // Filename : ActionRegenEventShop.h // Written By : excel96 // Description : -// ũ ̺Ʈ ϴ ׼ +// 크리스마스 이벤트용 상점을 갱신하는 액션 ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_REGEN_EVENT_SHOP_H__ @@ -41,8 +41,8 @@ class ActionRegenEventShop : public Action { private: list m_List; // Shop template ID list - Timeval m_Period; // ֱ - Timeval m_NextRegen; // ð + Timeval m_Period; // 상점을 리젠할 주기 + Timeval m_NextRegen; // 다음 상점 리젠 시간 }; diff --git a/src/server/gameserver/quest/ActionRegenShop.h b/src/server/gameserver/quest/ActionRegenShop.h index 8f0a6457..9a7fcfb2 100644 --- a/src/server/gameserver/quest/ActionRegenShop.h +++ b/src/server/gameserver/quest/ActionRegenShop.h @@ -2,8 +2,8 @@ // Filename : ActionRegenShop.h // Written By : // Description : -// NPC ó ε , NPC Ȱ -// غϴ ׼̴. ShopTemplate Ŭ Ŵ . +// 상점 NPC를 제일 처음 로딩할 때, 상점 NPC가 팔게 될 아이템을 +// 준비하는 액션이다. ShopTemplate 클래스와 매니저를 참고할 것. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_REGEN_SHOP_H__ @@ -42,8 +42,8 @@ class ActionRegenShop : public Action { private: list m_List; // Shop template ID list - Timeval m_Period; // ֱ - Timeval m_NextRegen; // ð + Timeval m_Period; // 상점을 리젠할 주기 + Timeval m_NextRegen; // 다음 상점 리젠 시간 }; diff --git a/src/server/gameserver/quest/ActionRegisterReinforce.cpp b/src/server/gameserver/quest/ActionRegisterReinforce.cpp index 3a10a2e3..df4e60d8 100644 --- a/src/server/gameserver/quest/ActionRegisterReinforce.cpp +++ b/src/server/gameserver/quest/ActionRegisterReinforce.cpp @@ -45,7 +45,7 @@ void ActionRegisterReinforce::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionRegisterReinforce::execute(Creature* pCreature1, Creature* pCreature2) @@ -85,8 +85,8 @@ void ActionRegisterReinforce::execute(Creature* pCreature1, Creature* pCreature2 WarScheduler* pWarScheduler = pZone->getWarScheduler(); Assert(pWarScheduler != NULL); - /* ߾ û ǵ (ڱ û ϰ -_-;;) - // ̹ ΰ? + /* 성을 소유했어도 전쟁 신청이 되도록 수정함 (자기 성에는 신청 못하겠지 -_-;;) + // 이미 성을 소유한 길드인가? if ( g_pGuildManager->hasCastle( guildID ) ) { gcNPCResponse.setCode( NPC_RESPONSE_ALREADY_HAS_CASTLE ); @@ -110,14 +110,14 @@ void ActionRegisterReinforce::execute(Creature* pCreature1, Creature* pCreature2 return; } - // ̹ û ߴ°? + // 이미 전쟁 신청을 했는가? if (g_pGuildManager->hasWarSchedule(guildID)) { gcNPCResponse.setCode(NPC_RESPONSE_WAR_ALREADY_REGISTERED); pPC->getPlayer()->sendPacket(&gcNPCResponse); return; } - // á°? + // 전쟁 스케쥴이 다 찼는가? /* if ( !pWarScheduler->canAddWar( WAR_GUILD ) ) { gcNPCResponse.setCode( NPC_RESPONSE_WAR_SCHEDULE_FULL ); diff --git a/src/server/gameserver/quest/ActionRegisterReinforce.h b/src/server/gameserver/quest/ActionRegisterReinforce.h index 0f69ef5d..cab0ec26 100644 --- a/src/server/gameserver/quest/ActionRegisterReinforce.h +++ b/src/server/gameserver/quest/ActionRegisterReinforce.h @@ -2,7 +2,7 @@ // Filename : ActionRegisterReinforce.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_REGISTER_REINFORCE_H__ @@ -35,7 +35,7 @@ class ActionRegisterReinforce : public Action { } private: - ZoneID_t m_ZoneID; // û ZoneID + ZoneID_t m_ZoneID; // 전쟁을 신청한 성의 ZoneID }; diff --git a/src/server/gameserver/quest/ActionRegisterSiege.cpp b/src/server/gameserver/quest/ActionRegisterSiege.cpp index a5a8626b..1568ae2b 100644 --- a/src/server/gameserver/quest/ActionRegisterSiege.cpp +++ b/src/server/gameserver/quest/ActionRegisterSiege.cpp @@ -45,7 +45,7 @@ void ActionRegisterSiege::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionRegisterSiege::execute(Creature* pCreature1, Creature* pCreature2) @@ -92,8 +92,8 @@ void ActionRegisterSiege::execute(Creature* pCreature1, Creature* pCreature2) WarScheduler* pWarScheduler = pZone->getWarScheduler(); Assert(pWarScheduler != NULL); - /* ߾ û ǵ (ڱ û ϰ -_-;;) - // ̹ ΰ? + /* 성을 소유했어도 전쟁 신청이 되도록 수정함 (자기 성에는 신청 못하겠지 -_-;;) + // 이미 성을 소유한 길드인가? if ( g_pGuildManager->hasCastle( guildID ) ) { gcNPCResponse.setCode( NPC_RESPONSE_ALREADY_HAS_CASTLE ); @@ -117,14 +117,14 @@ void ActionRegisterSiege::execute(Creature* pCreature1, Creature* pCreature2) return; } - // ̹ û ߴ°? + // 이미 전쟁 신청을 했는가? if (g_pGuildManager->hasWarSchedule(guildID)) { gcNPCResponse.setCode(NPC_RESPONSE_WAR_ALREADY_REGISTERED); pPC->getPlayer()->sendPacket(&gcNPCResponse); return; } - // á°? + // 전쟁 스케쥴이 다 찼는가? /* if ( !pWarScheduler->canAddWar( WAR_GUILD ) ) { gcNPCResponse.setCode( NPC_RESPONSE_WAR_SCHEDULE_FULL ); diff --git a/src/server/gameserver/quest/ActionRegisterSiege.h b/src/server/gameserver/quest/ActionRegisterSiege.h index e1275c9d..e22224d0 100644 --- a/src/server/gameserver/quest/ActionRegisterSiege.h +++ b/src/server/gameserver/quest/ActionRegisterSiege.h @@ -2,7 +2,7 @@ // Filename : ActionRegisterSiege.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_REGISTER_SIEGE_H__ @@ -35,7 +35,7 @@ class ActionRegisterSiege : public Action { } private: - ZoneID_t m_ZoneID; // û ZoneID + ZoneID_t m_ZoneID; // 전쟁을 신청한 성의 ZoneID }; diff --git a/src/server/gameserver/quest/ActionRepair.cpp b/src/server/gameserver/quest/ActionRepair.cpp index 3b6e95ff..5c2aaad2 100644 --- a/src/server/gameserver/quest/ActionRepair.cpp +++ b/src/server/gameserver/quest/ActionRepair.cpp @@ -23,7 +23,7 @@ void ActionRepair::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionRepair::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionRestore.cpp b/src/server/gameserver/quest/ActionRestore.cpp index e6be08da..3b4f50ef 100644 --- a/src/server/gameserver/quest/ActionRestore.cpp +++ b/src/server/gameserver/quest/ActionRestore.cpp @@ -23,7 +23,7 @@ void ActionRestore::read(PropertyBuffer& propertyBuffer) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionRestore::execute(Creature* pCreature1, Creature* pCreature2) @@ -38,17 +38,17 @@ void ActionRestore::execute(Creature* pCreature1, Creature* pCreature2) GCNPCResponse okpkt; pCreature2->getPlayer()->sendPacket(&okpkt); - // NPC ... + // NPC를 얻어내고... NPC* pNPC = dynamic_cast(pCreature1); - // ų ڵ鷯 ... + // 스킬 핸들러를 얻어낸다... SkillHandler* pSkillHandler = g_pSkillHandlerManager->getSkillHandler(SKILL_RESTORE); Assert(pSkillHandler != NULL); - // ڵ鷯 ٲٰ... + // 리스토어 핸들러로 바꾸고... Restore* pRestore = dynamic_cast(pSkillHandler); - //  Ѵ. + // 리스토어를 수행한다. pRestore->execute(pNPC, pCreature2); __END_CATCH diff --git a/src/server/gameserver/quest/ActionRestore.h b/src/server/gameserver/quest/ActionRestore.h index bd61043e..1ee36983 100644 --- a/src/server/gameserver/quest/ActionRestore.h +++ b/src/server/gameserver/quest/ActionRestore.h @@ -2,7 +2,7 @@ // Filename : ActionRestore.h // Written By : // Description : -// ̾ ÷̾ ̾ ִ ׼̴. +// 뱀파이어가 된 플레이어를 슬레이어로 돌려주는 액션이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_RESTORE_H__ diff --git a/src/server/gameserver/quest/ActionRewardEventQuest.cpp b/src/server/gameserver/quest/ActionRewardEventQuest.cpp index 944e990a..ed817783 100644 --- a/src/server/gameserver/quest/ActionRewardEventQuest.cpp +++ b/src/server/gameserver/quest/ActionRewardEventQuest.cpp @@ -44,7 +44,7 @@ void ActionRewardEventQuest::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionRewardEventQuest::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionRewardEventQuest.h b/src/server/gameserver/quest/ActionRewardEventQuest.h index 387b194c..719d9949 100644 --- a/src/server/gameserver/quest/ActionRewardEventQuest.h +++ b/src/server/gameserver/quest/ActionRewardEventQuest.h @@ -2,7 +2,7 @@ // Filename : ActionRewardEventQuest.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_REWARD_EVENT_QUEST_H__ @@ -35,9 +35,9 @@ class ActionRewardEventQuest : public Action { } private: - ScriptID_t m_ScriptID[5]; // ̵ - ScriptID_t m_CounterScriptID; // Ʈ Ϸ ʾ - ScriptID_t m_CancelScriptID; // ܰ Ʈ + ScriptID_t m_ScriptID[5]; // 말할 대사 아이디 + ScriptID_t m_CounterScriptID; // 퀘스트가 완료되지 않았을 때 + ScriptID_t m_CancelScriptID; // 이전 단계 퀘스트의 보상을 받을 때 }; diff --git a/src/server/gameserver/quest/ActionSay.cpp b/src/server/gameserver/quest/ActionSay.cpp index 5fa092d0..ff0e6b0a 100644 --- a/src/server/gameserver/quest/ActionSay.cpp +++ b/src/server/gameserver/quest/ActionSay.cpp @@ -31,7 +31,7 @@ void ActionSay::read(PropertyBuffer& propertyBuffer) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionSay::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionSay.h b/src/server/gameserver/quest/ActionSay.h index 2c137152..ef4ccc2f 100644 --- a/src/server/gameserver/quest/ActionSay.h +++ b/src/server/gameserver/quest/ActionSay.h @@ -2,8 +2,8 @@ // Filename : ActionSay.h // Written By : // Description : -// Creature ־ 縦 Ѵ. ũó Ӹ dz -// µȴ. +// Creature가 주어진 대사를 말한다. 이 대사는 크리처의 머리 위의 말풍선으로 +// 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_SAY_H__ @@ -36,7 +36,7 @@ class ActionSay : public Action { } private: - ScriptID_t m_ScriptID; // ̵ + ScriptID_t m_ScriptID; // 말할 대사 아이디 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/quest/ActionSayDynamic.cpp b/src/server/gameserver/quest/ActionSayDynamic.cpp index 2c94ae54..09b8a816 100644 --- a/src/server/gameserver/quest/ActionSayDynamic.cpp +++ b/src/server/gameserver/quest/ActionSayDynamic.cpp @@ -32,7 +32,7 @@ void ActionSayDynamic::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionSayDynamic::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionSayDynamic.h b/src/server/gameserver/quest/ActionSayDynamic.h index 27df8102..1ea6cd30 100644 --- a/src/server/gameserver/quest/ActionSayDynamic.h +++ b/src/server/gameserver/quest/ActionSayDynamic.h @@ -32,7 +32,7 @@ class ActionSayDynamic : public Action { } private: - ScriptID_t m_ScriptID; // ̵ + ScriptID_t m_ScriptID; // 말할 대사 아이디 }; diff --git a/src/server/gameserver/quest/ActionSearchMotorcycle.cpp b/src/server/gameserver/quest/ActionSearchMotorcycle.cpp index a2fc122e..32f6d768 100644 --- a/src/server/gameserver/quest/ActionSearchMotorcycle.cpp +++ b/src/server/gameserver/quest/ActionSearchMotorcycle.cpp @@ -42,11 +42,11 @@ void ActionSearchMotorcycle::execute(Creature* pCreature1, Creature* pCreature2) Player* pPlayer = pCreature2->getPlayer(); Assert(pPlayer != NULL); - // ϴ Ŭ̾Ʈ okŶ ϳ ְ... + // 일단 클라이언트를 위해 ok패킷을 하나 날려주고... GCNPCResponse answerOKpkt; pPlayer->sendPacket(&answerOKpkt); - // ÷̾ ̾ ˻Ѵ. + // 플레이어가 슬레이어인지 검사한다. if (pCreature2->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature2); Inventory* pInventory = pSlayer->getInventory(); @@ -70,10 +70,10 @@ void ActionSearchMotorcycle::execute(Creature* pCreature1, Creature* pCreature2) BeltInvenHeight = pBeltInventory->getHeight(); } - // κ丮 ˻Ѵ. + // 인벤토리를 검색한다. for (uint y = 0; y < InvenHeight; y++) { for (uint x = 0; x < InvenWidth; x++) { - // x, y ִٸ... + // x, y에 아이템이 있다면... if (pInventory->hasItem(x, y)) { pItem = pInventory->getItem(x, y); if (search(pItem, motorZoneID, motorX, motorY)) { @@ -89,10 +89,10 @@ void ActionSearchMotorcycle::execute(Creature* pCreature1, Creature* pCreature2) } if (pBelt != NULL) { - // κ丮 ˻Ѵ. + // 인벤토리를 검색한다. for (uint y = 0; y < BeltInvenHeight; y++) { for (uint x = 0; x < BeltInvenWidth; x++) { - // x, y ִٸ... + // x, y에 아이템이 있다면... if (pBeltInventory->hasItem(x, y)) { pItem = pBeltInventory->getItem(x, y); if (search(pItem, motorZoneID, motorX, motorY)) { @@ -107,7 +107,7 @@ void ActionSearchMotorcycle::execute(Creature* pCreature1, Creature* pCreature2) } } } - } else // ̾...̸ ã ? + } else // 뱀파이어라면...오토바이를 찾아줄 이유가 있을까? { } @@ -124,14 +124,14 @@ bool ActionSearchMotorcycle::search(Item* pItem, uint& zoneid, uint& x, uint& y) bool bFound = false; - // ܼ Ǵ Ű ƴ϶ false . + // 단서가 되는 아이템이 키가 아니라면 false를 리턴. if (pItem->getItemClass() != Item::ITEM_CLASS_KEY) return false; - // Ű ´ٸ Ű Ÿ Ǵ ID . + // 키가 맞다면 키의 타겟이 되는 아이템의 아이템 ID를 얻어낸다. DWORD targetID = dynamic_cast(pItem)->getTarget(); - // شϴ ̰ ϴ üũ Ѵ. + // 해당하는 오토바이가 존재하는지 체크를 한다. if (g_pParkingCenter->hasMotorcycleBox(targetID)) { MotorcycleBox* pBox = g_pParkingCenter->getMotorcycleBox(targetID); Assert(pBox != NULL); diff --git a/src/server/gameserver/quest/ActionSelectBloodBible.cpp b/src/server/gameserver/quest/ActionSelectBloodBible.cpp index bcf1d85a..036be9dc 100644 --- a/src/server/gameserver/quest/ActionSelectBloodBible.cpp +++ b/src/server/gameserver/quest/ActionSelectBloodBible.cpp @@ -33,7 +33,7 @@ void ActionSelectBloodBible::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionSelectBloodBible::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionSelectBloodBible.h b/src/server/gameserver/quest/ActionSelectBloodBible.h index 2be3c30b..c4492614 100644 --- a/src/server/gameserver/quest/ActionSelectBloodBible.h +++ b/src/server/gameserver/quest/ActionSelectBloodBible.h @@ -2,7 +2,7 @@ // Filename : ActionSelectBloodBible.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_SELECT_BLOOD_BIBLE_H__ diff --git a/src/server/gameserver/quest/ActionSelectQuest.cpp b/src/server/gameserver/quest/ActionSelectQuest.cpp index 5df9c6bf..fb5f2d8f 100644 --- a/src/server/gameserver/quest/ActionSelectQuest.cpp +++ b/src/server/gameserver/quest/ActionSelectQuest.cpp @@ -38,7 +38,7 @@ void ActionSelectQuest::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionSelectQuest::execute(Creature* pCreature1, Creature* pCreature2) @@ -61,7 +61,7 @@ void ActionSelectQuest::execute(Creature* pCreature1, Creature* pCreature2) Assert(pPlayer != NULL); #ifdef __CHINA_SERVER__ - // ߱ Ƴ. + // 중국에는 막아놓기다. GCNPCResponse gcNPCResponse; gcNPCResponse.setCode(NPC_RESPONSE_QUIT_DIALOGUE); pPlayer->sendPacket(&gcNPCResponse); diff --git a/src/server/gameserver/quest/ActionSelectQuest.h b/src/server/gameserver/quest/ActionSelectQuest.h index cfa334d7..2ca39437 100644 --- a/src/server/gameserver/quest/ActionSelectQuest.h +++ b/src/server/gameserver/quest/ActionSelectQuest.h @@ -2,7 +2,7 @@ // Filename : ActionSelectQuest.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_SELECT_QUEST_H__ diff --git a/src/server/gameserver/quest/ActionSell.cpp b/src/server/gameserver/quest/ActionSell.cpp index 376c9cbd..e611a685 100644 --- a/src/server/gameserver/quest/ActionSell.cpp +++ b/src/server/gameserver/quest/ActionSell.cpp @@ -2,9 +2,9 @@ // Filename : ActionSell.cpp // Written By : // Description : -// NPC ÷̾ Ĵ ׼̴. δ ŷ -// ϰ ׼̸, ϴ ÷̾ NPC -// Ŷ ִ ̴. +// NPC가 아이템을 플레이어에게 파는 액션이다. 실제로는 거래를 +// 시작하게 만드는 액션이며, 하는 일은 플레이어에게 현재 NPC의 +// 상점 버전을 패킷으로 보내주는 일 뿐이다. //////////////////////////////////////////////////////////////////////////////// #include "ActionSell.h" @@ -18,8 +18,8 @@ #include "Trigger.h" //////////////////////////////////////////////////////////////////////////////// -// ActionSell ׼ ׳ Ŭ̾Ʈ ShopVersion ִ ̹Ƿ, -// Ư о鿩 ĶͰ . +// ActionSell 액션은 그냥 클라이언트에게 ShopVersion을 보내주는 것이므로, +// 특별히 읽어들여야 할 파라미터가 없다. //////////////////////////////////////////////////////////////////////////////// void ActionSell::read(PropertyBuffer& propertyBuffer) @@ -30,7 +30,7 @@ void ActionSell::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionSell::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionSell.h b/src/server/gameserver/quest/ActionSell.h index 461cc122..eea3f12f 100644 --- a/src/server/gameserver/quest/ActionSell.h +++ b/src/server/gameserver/quest/ActionSell.h @@ -2,9 +2,9 @@ // Filename : ActionSell.h // Written By : // Description : -// NPC ÷̾ Ĵ ׼̴. δ ŷ -// ϰ ׼̸, ϴ ÷̾ NPC -// Ŷ ִ ̴. +// NPC가 아이템을 플레이어에게 파는 액션이다. 실제로는 거래를 +// 시작하게 만드는 액션이며, 하는 일은 플레이어에게 현재 NPC의 +// 상점 버전을 패킷으로 보내주는 일 뿐이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_SELL_H__ diff --git a/src/server/gameserver/quest/ActionSetPosition.cpp b/src/server/gameserver/quest/ActionSetPosition.cpp index 6477e6c0..df732be0 100644 --- a/src/server/gameserver/quest/ActionSetPosition.cpp +++ b/src/server/gameserver/quest/ActionSetPosition.cpp @@ -34,7 +34,7 @@ void ActionSetPosition::read(PropertyBuffer& propertyBuffer) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionSetPosition::execute(Creature* pCreature1, Creature* pCreature2) @@ -47,15 +47,15 @@ void ActionSetPosition::execute(Creature* pCreature1, Creature* pCreature2) Assert(!pCreature1->isPC()); //////////////////////////////////////////////////////////////////////////////// - // ũó Ѵ. - // ο ZoneInfoManager, ZoneGroupManager - // ˻ؼ ϰ ͸ ش. + // 크리처의 존을 지정한다. + // 내부에서 ZoneInfoManager, ZoneGroupManager 를 + // 검색해서 적절하게 존 포인터를 지정해준다. //////////////////////////////////////////////////////////////////////////////// pCreature1->setZoneID(m_ZoneID); //////////////////////////////////////////////////////////////////////////////// - // ũó ߰Ѵ. - // ο ũó ǥ, ش. + // 존에 크리처를 추가한다. + // 내부에서 크리처의 좌표, 방향을 지정해준다. //////////////////////////////////////////////////////////////////////////////// Zone* pZone = pCreature1->getZone(); Assert(pZone != NULL); diff --git a/src/server/gameserver/quest/ActionSetPosition.h b/src/server/gameserver/quest/ActionSetPosition.h index 0b30464d..74a47320 100644 --- a/src/server/gameserver/quest/ActionSetPosition.h +++ b/src/server/gameserver/quest/ActionSetPosition.h @@ -2,7 +2,7 @@ // Filename : ActionSetPosition.h // Written By : // Description : -// NPC ʱ ġ Ѵ. 1ȸ Ǿ Ѵ. +// NPC 의 초기 위치를 설정한다. 1회만 실행되어야 한다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_SET_POSITION_H__ diff --git a/src/server/gameserver/quest/ActionSetResurrectZone.cpp b/src/server/gameserver/quest/ActionSetResurrectZone.cpp index a0ae0560..406767b8 100644 --- a/src/server/gameserver/quest/ActionSetResurrectZone.cpp +++ b/src/server/gameserver/quest/ActionSetResurrectZone.cpp @@ -35,7 +35,7 @@ void ActionSetResurrectZone::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionSetResurrectZone::execute(Creature* pCreature1, Creature* pCreature2) @@ -47,7 +47,7 @@ void ActionSetResurrectZone::execute(Creature* pCreature1, Creature* pCreature2) Assert(pCreature1->isNPC()); Assert(pCreature2->isPC()); - // ϴ Ŭ̾Ʈ ؼ OK Ŷ . + // 일단 클라이언트를 위해서 OK 패킷을 함 날린다. GCNPCResponse okpkt; Player* pPlayer = pCreature2->getPlayer(); Assert(pPlayer != NULL); diff --git a/src/server/gameserver/quest/ActionShowConfirmGetEventItemDialog.cpp b/src/server/gameserver/quest/ActionShowConfirmGetEventItemDialog.cpp index 87626831..44a86604 100644 --- a/src/server/gameserver/quest/ActionShowConfirmGetEventItemDialog.cpp +++ b/src/server/gameserver/quest/ActionShowConfirmGetEventItemDialog.cpp @@ -30,7 +30,7 @@ void ActionShowConfirmGetEventItemDialog::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionShowConfirmGetEventItemDialog::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionShowDonationDialog.cpp b/src/server/gameserver/quest/ActionShowDonationDialog.cpp index b3c21356..c92fba93 100644 --- a/src/server/gameserver/quest/ActionShowDonationDialog.cpp +++ b/src/server/gameserver/quest/ActionShowDonationDialog.cpp @@ -30,7 +30,7 @@ void ActionShowDonationDialog::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionShowDonationDialog::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionShowGuildDialog.cpp b/src/server/gameserver/quest/ActionShowGuildDialog.cpp index 60c2f58a..f741bbdb 100644 --- a/src/server/gameserver/quest/ActionShowGuildDialog.cpp +++ b/src/server/gameserver/quest/ActionShowGuildDialog.cpp @@ -32,7 +32,7 @@ void ActionShowGuildDialog::read(PropertyBuffer& propertyBuffer) __BEGIN_TRY try { - // ̾α + // 다이얼로그의 종류 m_Type = (GuildDialog_t)propertyBuffer.getPropertyInt("Type"); } catch (NoSuchElementException& nsee) { throw Error(nsee.toString()); @@ -43,7 +43,7 @@ void ActionShowGuildDialog::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionShowGuildDialog::execute(Creature* pCreature1, Creature* pCreature2) @@ -67,39 +67,39 @@ void ActionShowGuildDialog::execute(Creature* pCreature1, Creature* pCreature2) Assert(pCreature != NULL); if (m_Type == GUILD_DIALOG_REGIST) { - // cout << " " << endl; + // cout << "길드 등록" << endl; //////////////////////////////////////////////////////////////////////////////// - // + // 길드 등록을 선택했을 경우 //////////////////////////////////////////////////////////////////////////////// Statement* pStmt; Result* pResult; BEGIN_DB { - // ٸ Ҽ üũ + // 다른 길드 소속인지 체크 pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pResult = pStmt->executeQuery("SELECT `Rank`, ExpireDate FROM GuildMember WHERE Name = '%s'", pCreature->getName().c_str()); if (pResult->next()) { - // ִ. expire date Ѵ. + // 길드 등록 정보가 있다. expire date를 보고 결정한다. int Rank = pResult->getInt(1); string ExpireDate = pResult->getString(2); if (ExpireDate.size() == 7) { - // ٸ 忡 Ż 쿡 带 . + // 다른 길드에서 탈퇴한 경우에는 일주일 동안 길드를 만들 수 없다. if (Rank == GuildMember::GUILDMEMBER_RANK_LEAVE) { - // Ҽ ° ƴϴ. expire date 7 Ѵ. + // 현재는 길드 소속 상태가 아니다. 하지만 expire date 에서 7일이 지나야 한다. time_t daytime = time(0); tm Time; Time.tm_year = atoi(ExpireDate.substr(0, 3).c_str()); Time.tm_mon = atoi(ExpireDate.substr(3, 2).c_str()); Time.tm_mday = atoi(ExpireDate.substr(5, 2).c_str()); - if (difftime(daytime, mktime(&Time)) < 604800) // ǽð 7 °? + if (difftime(daytime, mktime(&Time)) < 604800) // 실시간 7일이 지났는가? { SAFE_DELETE(pStmt); - // ð ...¼ + // 시간이 일주일 ...어쩌고 if (pCreature->isSlayer()) { GCNPCResponse response; response.setCode(NPC_RESPONSE_TEAM_REGIST_FAIL_QUIT_TIMEOUT); @@ -120,7 +120,7 @@ void ActionShowGuildDialog::execute(Creature* pCreature1, Creature* pCreature2) } else { SAFE_DELETE(pStmt); - // ٸ 忡 ԵǾִ + // 다른 길드에 가입되어있는 경우 if (pCreature->isSlayer()) { GCNPCResponse response; response.setCode(NPC_RESPONSE_TEAM_REGIST_FAIL_ALREADY_JOIN); @@ -148,34 +148,34 @@ void ActionShowGuildDialog::execute(Creature* pCreature1, Creature* pCreature2) SkillDomainType_t highest = pSlayer->getHighestSkillDomain(); - if (pSlayer->getSkillDomainLevel(highest) < REQUIRE_SLAYER_MASTER_SKILL_DOMAIN_LEVEL) // 50 ̻ + if (pSlayer->getSkillDomainLevel(highest) < REQUIRE_SLAYER_MASTER_SKILL_DOMAIN_LEVEL) // 레벨 50 이상 { - // + // 레벨이 낮음 GCNPCResponse response; response.setCode(NPC_RESPONSE_TEAM_REGIST_FAIL_LEVEL); pPlayer->sendPacket(&response); return; } - if (pSlayer->getGold() < REQUIRE_SLAYER_MASTER_GOLD) // Ϻ 1 + if (pSlayer->getGold() < REQUIRE_SLAYER_MASTER_GOLD) // 등록비 1억 { - // Ϻ ڶ + // 등록비가 모자람 GCNPCResponse response; response.setCode(NPC_RESPONSE_TEAM_REGIST_FAIL_MONEY); pPlayer->sendPacket(&response); return; } - if (pSlayer->getFame() < REQUIRE_SLAYER_MASTER_FAME[highest]) // + if (pSlayer->getFame() < REQUIRE_SLAYER_MASTER_FAME[highest]) // 명성 { - // ڶ + // 명성이 모자람 GCNPCResponse response; response.setCode(NPC_RESPONSE_TEAM_REGIST_FAIL_FAME); pPlayer->sendPacket(&response); return; } - // â 쵵 ޽ . + // 길드 등록 창을 띄우도록 메시지를 보낸다. GCNPCResponse response; response.setCode(NPC_RESPONSE_GUILD_SHOW_REGIST); response.setParameter(REQUIRE_SLAYER_MASTER_GOLD); @@ -184,59 +184,59 @@ void ActionShowGuildDialog::execute(Creature* pCreature1, Creature* pCreature2) Vampire* pVampire = dynamic_cast(pCreature); Assert(pVampire != NULL); - // üũ - if (pVampire->getLevel() < REQUIRE_VAMPIRE_MASTER_LEVEL) // 50̻ + // 등록 가능 여부 체크 + if (pVampire->getLevel() < REQUIRE_VAMPIRE_MASTER_LEVEL) // 레벨 50이상 { - // + // 레벨이 낮음 GCNPCResponse response; response.setCode(NPC_RESPONSE_CLAN_REGIST_FAIL_LEVEL); pPlayer->sendPacket(&response); return; } - if (pVampire->getGold() < REQUIRE_VAMPIRE_MASTER_GOLD) // Ϻ 1 + if (pVampire->getGold() < REQUIRE_VAMPIRE_MASTER_GOLD) // 등록비 1억 { - // Ϻ ڶ + // 등록비가 모자람 GCNPCResponse response; response.setCode(NPC_RESPONSE_CLAN_REGIST_FAIL_MONEY); pPlayer->sendPacket(&response); return; } - // if ( pVampire->getFame() < 500000 ) // 50 + // if ( pVampire->getFame() < 500000 ) // 명성 50만 // { - // // ڶ + // // 명성이 모자람 // GCNPCResponse response; // response.setCode( NPC_RESPONSE_CLAN_REGIST_FAIL_FAME ); // pPlayer->sendPacket( &response ); // // return; // } - // â 쵵 ޽ . + // 길드 등록 창을 띄우도록 메시지를 보낸다. GCNPCResponse response; response.setCode(NPC_RESPONSE_GUILD_SHOW_REGIST); - // cout << "尡Ժ : " << REQUIRE_VAMPIRE_MASTER_GOLD << endl; + // cout << "길드가입비 : " << REQUIRE_VAMPIRE_MASTER_GOLD << endl; response.setParameter(REQUIRE_VAMPIRE_MASTER_GOLD); - // cout << "尡Ժ(param) : " << response.getParameter() << endl; + // cout << "길드가입비(param) : " << response.getParameter() << endl; pPlayer->sendPacket(&response); } else if (pCreature->isOusters()) { Ousters* pOusters = dynamic_cast(pCreature); Assert(pOusters != NULL); - // üũ - if (pOusters->getLevel() < REQUIRE_OUSTERS_MASTER_LEVEL) // 50̻ + // 등록 가능 여부 체크 + if (pOusters->getLevel() < REQUIRE_OUSTERS_MASTER_LEVEL) // 레벨 50이상 { - // + // 레벨이 낮음 GCNPCResponse response; response.setCode(NPC_RESPONSE_GUILD_REGIST_FAIL_LEVEL); pPlayer->sendPacket(&response); return; } - if (pOusters->getGold() < REQUIRE_OUSTERS_MASTER_GOLD) // Ϻ 1 + if (pOusters->getGold() < REQUIRE_OUSTERS_MASTER_GOLD) // 등록비 1억 { - // Ϻ ڶ + // 등록비가 모자람 GCNPCResponse response; response.setCode(NPC_RESPONSE_GUILD_REGIST_FAIL_MONEY); pPlayer->sendPacket(&response); @@ -244,17 +244,17 @@ void ActionShowGuildDialog::execute(Creature* pCreature1, Creature* pCreature2) return; } - // â 쵵 ޽ . + // 길드 등록 창을 띄우도록 메시지를 보낸다. GCNPCResponse response; response.setCode(NPC_RESPONSE_GUILD_SHOW_REGIST); - // cout << "尡Ժ : " << REQUIRE_VAMPIRE_MASTER_GOLD << endl; + // cout << "길드가입비 : " << REQUIRE_VAMPIRE_MASTER_GOLD << endl; response.setParameter(REQUIRE_OUSTERS_MASTER_GOLD); - // cout << "尡Ժ(param) : " << response.getParameter() << endl; + // cout << "길드가입비(param) : " << response.getParameter() << endl; pPlayer->sendPacket(&response); } } else if (m_Type == GUILD_DIALOG_WAIT_LIST) { - // cout << " Ʈ" << endl; + // cout << "길드 대기 리스트" << endl; GCWaitGuildList gcWaitGuildList; // const HashMapGuild& Guilds = g_pGuildManager->getGuilds_const(); @@ -274,7 +274,7 @@ void ActionShowGuildDialog::execute(Creature* pCreature1, Creature* pCreature2) pPlayer->sendPacket(&gcWaitGuildList); } else if (m_Type == GUILD_DIALOG_LIST) { - // cout << " Ʈ" << endl; + // cout << "길드 리스트" << endl; GCActiveGuildList gcActiveGuildList; GuildRace_t race; @@ -291,7 +291,7 @@ void ActionShowGuildDialog::execute(Creature* pCreature1, Creature* pCreature2) pPlayer->sendPacket(&gcActiveGuildList); } else if (m_Type == GUILD_DIALOG_QUIT) { - // Ż â ʰ Ż Ȯ Ѵ. + // 길드 탈퇴 창을 띄우지 않고 길드 탈퇴를 확정한 것으로 간주한다. Guild* pGuild = NULL; Statement* pStmt = NULL; @@ -310,7 +310,7 @@ void ActionShowGuildDialog::execute(Creature* pCreature1, Creature* pCreature2) } END_DB(pStmt) - // ° Ȱ̰ų ̾ Ѵ. + // 길드 상태가 활동중이거나 대기중이어야 한다. if (pGuild == NULL || (pGuild->getState() != Guild::GUILD_STATE_ACTIVE && pGuild->getState() != Guild::GUILD_STATE_WAIT)) { GCNPCResponse response; @@ -320,7 +320,7 @@ void ActionShowGuildDialog::execute(Creature* pCreature1, Creature* pCreature2) return; } - // ÷̾ ȮѴ. + // 플레이어가 길드의 멤버인지 확인한다. GuildMember* pGuildMember = pGuild->getMember(pCreature->getName()); if (pGuildMember == NULL) { GCNPCResponse response; @@ -330,7 +330,7 @@ void ActionShowGuildDialog::execute(Creature* pCreature1, Creature* pCreature2) return; } - // Ȱ Ͷ Ż Ѵ. + // 활동 중인 길드의 마스터라면 탈퇴를 무시한다. if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_MASTER && pGuild->getState() == Guild::GUILD_STATE_ACTIVE) { GCNPCResponse response; diff --git a/src/server/gameserver/quest/ActionShowGuildDialog.h b/src/server/gameserver/quest/ActionShowGuildDialog.h index 2411adff..f3395683 100644 --- a/src/server/gameserver/quest/ActionShowGuildDialog.h +++ b/src/server/gameserver/quest/ActionShowGuildDialog.h @@ -2,8 +2,8 @@ // Filename : ActionShowGuildDialog.h // Written By : // Description : -// Creature ־ 縦 Ѵ. ũó Ӹ dz -// µȴ. +// Creature가 주어진 대사를 말한다. 이 대사는 크리처의 머리 위의 말풍선으로 +// 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_SHOW_GUILD_DIALOG_H__ @@ -32,10 +32,10 @@ class ActionShowGuildDialog : public Action { virtual string toString() const; enum GUILDDIALOG { - GUILD_DIALOG_REGIST = 0, // â - GUILD_DIALOG_WAIT_LIST, // Ʈ - GUILD_DIALOG_LIST, // Ʈ - GUILD_DIALOG_QUIT, // Ż â + GUILD_DIALOG_REGIST = 0, // 길드 등록 창 + GUILD_DIALOG_WAIT_LIST, // 길드 등록 대기 리스트 + GUILD_DIALOG_LIST, // 길드 리스트 + GUILD_DIALOG_QUIT, // 길드 탈퇴 창 GUILD_DIALOG_MAX }; diff --git a/src/server/gameserver/quest/ActionShowTaxBalance.cpp b/src/server/gameserver/quest/ActionShowTaxBalance.cpp index ff105847..7385fc81 100644 --- a/src/server/gameserver/quest/ActionShowTaxBalance.cpp +++ b/src/server/gameserver/quest/ActionShowTaxBalance.cpp @@ -28,7 +28,7 @@ void ActionShowTaxBalance::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionShowTaxBalance::execute(Creature* pCreature1, Creature* pCreature2) @@ -52,21 +52,21 @@ void ActionShowTaxBalance::execute(Creature* pCreature1, Creature* pCreature2) Guild* pGuild = g_pGuildManager->getGuild(guildID); if (bSuccess && pGuild == NULL) { - // 尡 . + // 길드가 없다. bSuccess = false; deny.setCode(NPC_RESPONSE_NO_GUILD); } if (bSuccess && pGuild->getMaster() != pPC->getName()) { - // Ͱ ƴϴ. + // 길드 마스터가 아니다. bSuccess = false; deny.setCode(NPC_RESPONSE_NOT_GUILD_MASTER); } - // ̴. + // 길드 마스터이다. list pCastleInfoList = g_pCastleInfoManager->getGuildCastleInfos(guildID); if (bSuccess && pCastleInfoList.empty()) { - // 尡 . + // 길드가 소유한 성이 없다. bSuccess = false; deny.setCode(NPC_RESPONSE_HAS_NO_CASTLE); } diff --git a/src/server/gameserver/quest/ActionShowTaxBalance.h b/src/server/gameserver/quest/ActionShowTaxBalance.h index 06e53e9c..12487c6e 100644 --- a/src/server/gameserver/quest/ActionShowTaxBalance.h +++ b/src/server/gameserver/quest/ActionShowTaxBalance.h @@ -2,7 +2,7 @@ // Filename : ActionShowTaxBalance.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_SHOW_TAX_BALANCE_H__ diff --git a/src/server/gameserver/quest/ActionShowWarSchedule.cpp b/src/server/gameserver/quest/ActionShowWarSchedule.cpp index 49bf9365..21412873 100644 --- a/src/server/gameserver/quest/ActionShowWarSchedule.cpp +++ b/src/server/gameserver/quest/ActionShowWarSchedule.cpp @@ -40,7 +40,7 @@ void ActionShowWarSchedule::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionShowWarSchedule::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionShowWarSchedule.h b/src/server/gameserver/quest/ActionShowWarSchedule.h index 19c134ed..d61c8300 100644 --- a/src/server/gameserver/quest/ActionShowWarSchedule.h +++ b/src/server/gameserver/quest/ActionShowWarSchedule.h @@ -2,7 +2,7 @@ // Filename : ActionShowWarSchedule.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_SHOW_WAR_SCHEDULE_H__ @@ -35,7 +35,7 @@ class ActionShowWarSchedule : public Action { } private: - ZoneID_t m_ZoneID; // û ZoneID + ZoneID_t m_ZoneID; // 전쟁을 신청한 성의 ZoneID }; diff --git a/src/server/gameserver/quest/ActionSilverCoating.cpp b/src/server/gameserver/quest/ActionSilverCoating.cpp index 26ae3cf9..7eb7caa9 100644 --- a/src/server/gameserver/quest/ActionSilverCoating.cpp +++ b/src/server/gameserver/quest/ActionSilverCoating.cpp @@ -23,7 +23,7 @@ void ActionSilverCoating::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionSilverCoating::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionSimpleQuestComplete.cpp b/src/server/gameserver/quest/ActionSimpleQuestComplete.cpp index 7f737c6e..d6de4da0 100644 --- a/src/server/gameserver/quest/ActionSimpleQuestComplete.cpp +++ b/src/server/gameserver/quest/ActionSimpleQuestComplete.cpp @@ -32,7 +32,7 @@ void ActionSimpleQuestComplete::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionSimpleQuestComplete::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionSimpleQuestComplete.h b/src/server/gameserver/quest/ActionSimpleQuestComplete.h index cb236ae8..1a05a5b8 100644 --- a/src/server/gameserver/quest/ActionSimpleQuestComplete.h +++ b/src/server/gameserver/quest/ActionSimpleQuestComplete.h @@ -2,7 +2,7 @@ // Filename : ActionSimpleQuestComplete.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_SIMPLE_QUEST_COMPLETE_H__ @@ -33,7 +33,7 @@ class ActionSimpleQuestComplete : public Action { } private: - ScriptID_t m_ScriptID; // ̵ + ScriptID_t m_ScriptID; // 말할 대사 아이디 }; diff --git a/src/server/gameserver/quest/ActionSimpleQuestList.cpp b/src/server/gameserver/quest/ActionSimpleQuestList.cpp index 4c8d54c3..327e3668 100644 --- a/src/server/gameserver/quest/ActionSimpleQuestList.cpp +++ b/src/server/gameserver/quest/ActionSimpleQuestList.cpp @@ -34,7 +34,7 @@ void ActionSimpleQuestList::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionSimpleQuestList::execute(Creature* pCreature1, Creature* pCreature2) @@ -48,12 +48,12 @@ void ActionSimpleQuestList::execute(Creature* pCreature1, Creature* pCreature2) NPC* pNPC = dynamic_cast(pCreature1); - // m_ScriptID õ PublicScriptManager + // m_ScriptID와 관련된 정보를 PublicScriptManager에 생성 Script* pScript = g_pPublicScriptManager->getScript(m_ScriptID); pNPC->setSimpleQuestListScript( pScript ); - // Ŷ + // 패킷 보냄 GCNPCAskDynamic gcNPCAskDynamic; gcNPCAskDynamic.setObjectID(pCreature1->getObjectID()); gcNPCAskDynamic.setScriptID(m_ScriptID); diff --git a/src/server/gameserver/quest/ActionSimpleQuestList.h b/src/server/gameserver/quest/ActionSimpleQuestList.h index 3dfd7b0b..d360854a 100644 --- a/src/server/gameserver/quest/ActionSimpleQuestList.h +++ b/src/server/gameserver/quest/ActionSimpleQuestList.h @@ -2,7 +2,7 @@ // Filename : ActionSimpleQuestList.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_SIMPLE_QUEST_LIST_H__ @@ -33,7 +33,7 @@ class ActionSimpleQuestList : public Action { } private: - ScriptID_t m_ScriptID; // ̵ + ScriptID_t m_ScriptID; // 말할 대사 아이디 }; diff --git a/src/server/gameserver/quest/ActionSimpleQuestRegen.h b/src/server/gameserver/quest/ActionSimpleQuestRegen.h index f5d5f72c..50e6e76c 100644 --- a/src/server/gameserver/quest/ActionSimpleQuestRegen.h +++ b/src/server/gameserver/quest/ActionSimpleQuestRegen.h @@ -2,8 +2,8 @@ // Filename : ActionSimpleQuestRegen.h // Written By : // Description : -// NPC ó ε , NPC Ȱ -// غϴ ׼̴. ShopTemplate Ŭ Ŵ . +// 상점 NPC를 제일 처음 로딩할 때, 상점 NPC가 팔게 될 아이템을 +// 준비하는 액션이다. ShopTemplate 클래스와 매니저를 참고할 것. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_SIMPLE_QUEST_REGEN_H__ @@ -33,8 +33,8 @@ class ActionSimpleQuestRegen : public Action { virtual string toString() const; private: - Timeval m_Period; // ֱ - Timeval m_NextRegen; // ð + Timeval m_Period; // 상점을 리젠할 주기 + Timeval m_NextRegen; // 다음 상점 리젠 시간 }; diff --git a/src/server/gameserver/quest/ActionStartEventQuest.cpp b/src/server/gameserver/quest/ActionStartEventQuest.cpp index 0246c06f..91a744e5 100644 --- a/src/server/gameserver/quest/ActionStartEventQuest.cpp +++ b/src/server/gameserver/quest/ActionStartEventQuest.cpp @@ -38,7 +38,7 @@ void ActionStartEventQuest::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionStartEventQuest::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionStartEventQuest.h b/src/server/gameserver/quest/ActionStartEventQuest.h index 7702ca0b..ae07c76a 100644 --- a/src/server/gameserver/quest/ActionStartEventQuest.h +++ b/src/server/gameserver/quest/ActionStartEventQuest.h @@ -2,7 +2,7 @@ // Filename : ActionStartEventQuest.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_START_EVENT_QUEST_H__ diff --git a/src/server/gameserver/quest/ActionStartPetQuest.cpp b/src/server/gameserver/quest/ActionStartPetQuest.cpp index 32b1d5ab..ddb3bac2 100644 --- a/src/server/gameserver/quest/ActionStartPetQuest.cpp +++ b/src/server/gameserver/quest/ActionStartPetQuest.cpp @@ -36,7 +36,7 @@ void ActionStartPetQuest::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionStartPetQuest::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionStartPetQuest.h b/src/server/gameserver/quest/ActionStartPetQuest.h index 0afed988..f386f36c 100644 --- a/src/server/gameserver/quest/ActionStartPetQuest.h +++ b/src/server/gameserver/quest/ActionStartPetQuest.h @@ -2,7 +2,7 @@ // Filename : ActionStartPetQuest.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_START_PET_QUEST_H__ diff --git a/src/server/gameserver/quest/ActionStashOpen.cpp b/src/server/gameserver/quest/ActionStashOpen.cpp index e765333f..db0150f0 100644 --- a/src/server/gameserver/quest/ActionStashOpen.cpp +++ b/src/server/gameserver/quest/ActionStashOpen.cpp @@ -34,8 +34,8 @@ void ActionStashOpen::execute(Creature* pCreature1, Creature* pCreature2) Assert(pCreature1->isNPC()); Assert(pCreature2->isPC()); - // ÷̾ Կ õ OID - // Ҵ ʾҴٸ ⼭ Ҵ ش. + // 만일 플레이어가 아직 이 존에서 보관함에 관련된 OID를 + // 할당받지 않았다면 여기서 할당해 준다. if (pCreature2->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature2); if (!pSlayer->getStashStatus()) diff --git a/src/server/gameserver/quest/ActionStashSell.cpp b/src/server/gameserver/quest/ActionStashSell.cpp index fac217a8..5e72baf2 100644 --- a/src/server/gameserver/quest/ActionStashSell.cpp +++ b/src/server/gameserver/quest/ActionStashSell.cpp @@ -26,7 +26,7 @@ void ActionStashSell::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionStashSell::execute(Creature* pCreature1, Creature* pCreature2) @@ -43,7 +43,7 @@ void ActionStashSell::execute(Creature* pCreature1, Creature* pCreature2) GCStashSell pkt; if (pCreature2->isSlayer()) { - // ִ Ѵ. + // 현재 가지고 있는 보관함의 갯수로 다음 보관함의 값을 정한다. curStashNum = dynamic_cast(pCreature2)->getStashNum(); if (curStashNum < STASH_RACK_MAX) { @@ -51,7 +51,7 @@ void ActionStashSell::execute(Creature* pCreature1, Creature* pCreature2) } else price = 0; } else if (pCreature2->isVampire()) { - // ִ Ѵ. + // 현재 가지고 있는 보관함의 갯수로 다음 보관함의 값을 정한다. curStashNum = dynamic_cast(pCreature2)->getStashNum(); if (curStashNum < STASH_RACK_MAX) { @@ -59,7 +59,7 @@ void ActionStashSell::execute(Creature* pCreature1, Creature* pCreature2) } else price = 0; } else if (pCreature2->isOusters()) { - // ִ Ѵ. + // 현재 가지고 있는 보관함의 갯수로 다음 보관함의 값을 정한다. curStashNum = dynamic_cast(pCreature2)->getStashNum(); if (curStashNum < STASH_RACK_MAX) { @@ -68,7 +68,7 @@ void ActionStashSell::execute(Creature* pCreature1, Creature* pCreature2) price = 0; } - // Ŷ ش. + // 패킷에다 값을 세팅해 준다. pkt.setPrice(price); Player* pPlayer = pCreature2->getPlayer(); diff --git a/src/server/gameserver/quest/ActionSwapAdvancementItem.cpp b/src/server/gameserver/quest/ActionSwapAdvancementItem.cpp index 660f118b..b776a7c3 100644 --- a/src/server/gameserver/quest/ActionSwapAdvancementItem.cpp +++ b/src/server/gameserver/quest/ActionSwapAdvancementItem.cpp @@ -28,7 +28,7 @@ void ActionSwapAdvancementItem::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionSwapAdvancementItem::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionSwapAdvancementItem.h b/src/server/gameserver/quest/ActionSwapAdvancementItem.h index 5b091c7d..1431ff86 100644 --- a/src/server/gameserver/quest/ActionSwapAdvancementItem.h +++ b/src/server/gameserver/quest/ActionSwapAdvancementItem.h @@ -2,7 +2,7 @@ // Filename : ActionSwapAdvancementItem.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_SWAP_ADVANCEMENT_ITEM_H__ diff --git a/src/server/gameserver/quest/ActionSystemMessage.cpp b/src/server/gameserver/quest/ActionSystemMessage.cpp index 03ddd984..68ea2e8a 100644 --- a/src/server/gameserver/quest/ActionSystemMessage.cpp +++ b/src/server/gameserver/quest/ActionSystemMessage.cpp @@ -30,7 +30,7 @@ void ActionSystemMessage::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionSystemMessage::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionSystemMessagePerRace.cpp b/src/server/gameserver/quest/ActionSystemMessagePerRace.cpp index 32e46273..0fab0233 100644 --- a/src/server/gameserver/quest/ActionSystemMessagePerRace.cpp +++ b/src/server/gameserver/quest/ActionSystemMessagePerRace.cpp @@ -24,7 +24,7 @@ void ActionSystemMessagePerRace::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionSystemMessagePerRace::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionTakeDonation.cpp b/src/server/gameserver/quest/ActionTakeDonation.cpp index 856633a5..31d8fac3 100644 --- a/src/server/gameserver/quest/ActionTakeDonation.cpp +++ b/src/server/gameserver/quest/ActionTakeDonation.cpp @@ -24,7 +24,7 @@ void ActionTakeDonation::read(PropertyBuffer& propertyBuffer) __BEGIN_TRY try { - // оδ. + // 받을 돈의 양을 읽어들인다. m_Amount = (Gold_t)propertyBuffer.getPropertyInt("Amount"); } catch (NoSuchElementException& nsee) { throw Error(nsee.toString()); @@ -35,7 +35,7 @@ void ActionTakeDonation::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionTakeDonation::execute(Creature* pCreature1, Creature* pCreature2) @@ -59,18 +59,18 @@ void ActionTakeDonation::execute(Creature* pCreature1, Creature* pCreature2) if (pCreature2->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature2); - // η ٸ . + // 기부량보다 가진 돈이 적다면 기부할 수가 없다. if (pSlayer->getGold() < m_Amount) { gcNPCResponse.setCode(NPC_RESPONSE_DONATION_FAIL_MONEY); pPlayer->sendPacket(&gcNPCResponse); return; } - // ݾ׿ ȸش. + // 기부 금액에 따라 성향을 회복시켜준다. oldAlignment = pSlayer->getAlignment(); newAlignment = pSlayer->getAlignment(); - // -2500 쿡 ȭѴ. + // 성향이 -2500 이하일 경우에만 변화한다. if (oldAlignment < -2500) { if (-4999 <= oldAlignment && oldAlignment <= -2500) { newAlignment = min(-2500, (int)(oldAlignment + m_Amount / 100)); @@ -83,12 +83,12 @@ void ActionTakeDonation::execute(Creature* pCreature1, Creature* pCreature2) pSlayer->saveAlignment(newAlignment); } - // αݾ׸ŭ δ. + // 기부금액만큼 돈을 줄인다. // pSlayer->setGoldEx(pSlayer->getGold() - m_Amount); // by sigi. 2002.9.17 pSlayer->decreaseGoldEx(m_Amount); - // Ŷ . + // 패킷을 보낸다. gcNPCResponse.setCode(NPC_RESPONSE_DONATION_OK); gcNPCResponse.setParameter(pSlayer->getGold()); pPlayer->sendPacket(&gcNPCResponse); @@ -98,18 +98,18 @@ void ActionTakeDonation::execute(Creature* pCreature1, Creature* pCreature2) } else if (pCreature2->isVampire()) { Vampire* pVampire = dynamic_cast(pCreature2); - // η ٸ . + // 기부량보다 가진 돈이 적다면 기부할 수가 없다. if (pVampire->getGold() < m_Amount) { gcNPCResponse.setCode(NPC_RESPONSE_DONATION_FAIL_MONEY); pPlayer->sendPacket(&gcNPCResponse); return; } - // ݾ׿ ȸش. + // 기부 금액에 따라 성향을 회복시켜준다. oldAlignment = pVampire->getAlignment(); newAlignment = pVampire->getAlignment(); - // -2500 쿡 ȭѴ. + // 성향이 -2500 이하일 경우에만 변화한다. if (oldAlignment < -2500) { if (-4999 <= oldAlignment && oldAlignment <= -2500) { newAlignment = min(-2500, (int)(oldAlignment + m_Amount / 100)); @@ -122,12 +122,12 @@ void ActionTakeDonation::execute(Creature* pCreature1, Creature* pCreature2) pVampire->saveAlignment(newAlignment); } - // αݾ׸ŭ δ. + // 기부금액만큼 돈을 줄인다. // pVampire->setGoldEx(pVampire->getGold() - m_Amount); // by sigi. 2002.9.18 pVampire->decreaseGoldEx(m_Amount); - // Ŷ . + // 패킷을 보낸다. gcNPCResponse.setCode(NPC_RESPONSE_DONATION_OK); gcNPCResponse.setParameter(pVampire->getGold()); pPlayer->sendPacket(&gcNPCResponse); @@ -137,18 +137,18 @@ void ActionTakeDonation::execute(Creature* pCreature1, Creature* pCreature2) } else if (pCreature2->isOusters()) { Ousters* pOusters = dynamic_cast(pCreature2); - // η ٸ . + // 기부량보다 가진 돈이 적다면 기부할 수가 없다. if (pOusters->getGold() < m_Amount) { gcNPCResponse.setCode(NPC_RESPONSE_DONATION_FAIL_MONEY); pPlayer->sendPacket(&gcNPCResponse); return; } - // ݾ׿ ȸش. + // 기부 금액에 따라 성향을 회복시켜준다. oldAlignment = pOusters->getAlignment(); newAlignment = pOusters->getAlignment(); - // -2500 쿡 ȭѴ. + // 성향이 -2500 이하일 경우에만 변화한다. if (oldAlignment < -2500) { if (-4999 <= oldAlignment && oldAlignment <= -2500) { newAlignment = min(-2500, (int)(oldAlignment + m_Amount / 100)); @@ -161,12 +161,12 @@ void ActionTakeDonation::execute(Creature* pCreature1, Creature* pCreature2) pOusters->saveAlignment(newAlignment); } - // αݾ׸ŭ δ. + // 기부금액만큼 돈을 줄인다. // pOusters->setGoldEx(pOusters->getGold() - m_Amount); // by sigi. 2002.9.18 pOusters->decreaseGoldEx(m_Amount); - // Ŷ . + // 패킷을 보낸다. gcNPCResponse.setCode(NPC_RESPONSE_DONATION_OK); gcNPCResponse.setParameter(pOusters->getGold()); pPlayer->sendPacket(&gcNPCResponse); diff --git a/src/server/gameserver/quest/ActionTakeDonation.h b/src/server/gameserver/quest/ActionTakeDonation.h index 5a3f00c8..fc9ea45d 100644 --- a/src/server/gameserver/quest/ActionTakeDonation.h +++ b/src/server/gameserver/quest/ActionTakeDonation.h @@ -2,8 +2,8 @@ // Filename : ActionTakeDonation.h // Written By : // Description : -// Creature ־ 縦 Ѵ. ũó Ӹ dz -// µȴ. +// Creature가 주어진 대사를 말한다. 이 대사는 크리처의 머리 위의 말풍선으로 +// 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_TAKE_DONATION_H__ @@ -36,7 +36,7 @@ class ActionTakeDonation : public Action { } private: - Gold_t m_Amount; // + Gold_t m_Amount; // 받을 돈의 양 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/quest/ActionTakeOutGoods.cpp b/src/server/gameserver/quest/ActionTakeOutGoods.cpp index 9b176ba2..88d63a26 100644 --- a/src/server/gameserver/quest/ActionTakeOutGoods.cpp +++ b/src/server/gameserver/quest/ActionTakeOutGoods.cpp @@ -33,7 +33,7 @@ void ActionTakeOutGoods::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionTakeOutGoods::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionTakeOutGoods.h b/src/server/gameserver/quest/ActionTakeOutGoods.h index 005a7525..68dae3e1 100644 --- a/src/server/gameserver/quest/ActionTakeOutGoods.h +++ b/src/server/gameserver/quest/ActionTakeOutGoods.h @@ -2,7 +2,7 @@ // Filename : ActionTakeOutGoods.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_TAKE_OUT_GOODS_H__ diff --git a/src/server/gameserver/quest/ActionTeachSkill.cpp b/src/server/gameserver/quest/ActionTeachSkill.cpp index 21697bd8..78bb42e2 100644 --- a/src/server/gameserver/quest/ActionTeachSkill.cpp +++ b/src/server/gameserver/quest/ActionTeachSkill.cpp @@ -2,10 +2,10 @@ // Filename : ActionTeachSkill.cpp // Written By : // Description : -// NPC ÷̾ ̴ ׼̴. -// δ NPC ִ Ŷ -// ̰, ۾ Ŷ պϴ ̿ -// óȴ. +// NPC가 플레이어에게 기술을 가르쳐 줄 때 쓰이는 액션이다. +// 실제적으로는 NPC가 가르쳐 줄 수 있는 기술을 패킷으로 +// 전송해 줄 뿐이고, 나머지 작업들은 패킷이 왕복하는 사이에 +// 처리된다. //////////////////////////////////////////////////////////////////////////////// #include "ActionTeachSkill.h" @@ -28,7 +28,7 @@ void ActionTeachSkill::read(PropertyBuffer& propertyBuffer) __BEGIN_TRY try { - // Ÿ оδ. + // 도메인 타입을 읽어들인다. string domainType = propertyBuffer.getProperty("DomainType"); if (domainType == "BLADE") @@ -47,7 +47,7 @@ void ActionTeachSkill::read(PropertyBuffer& propertyBuffer) else if (domainType == "VAMPIRE") m_DomainType = SKILL_DOMAIN_VAMPIRE; else - throw Error("TeachSkill::read() : ߸ ŸԴϴ."); + throw Error("TeachSkill::read() : 잘못된 기술 타입입니다."); } catch (NoSuchElementException& nsee) { throw Error(nsee.toString()); } @@ -57,7 +57,7 @@ void ActionTeachSkill::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionTeachSkill::execute(Creature* pCreature1, Creature* pCreature2) @@ -69,7 +69,7 @@ void ActionTeachSkill::execute(Creature* pCreature1, Creature* pCreature2) Assert(pCreature1->isNPC()); Assert(pCreature2->isPC()); - // ϴ Ŭ̾Ʈ ؼ OK Ŷ . + // 일단 클라이언트를 위해서 OK 패킷을 함 날린다. GCNPCResponse okpkt; Player* pPlayer = pCreature2->getPlayer(); Assert(pPlayer != NULL); @@ -80,13 +80,13 @@ void ActionTeachSkill::execute(Creature* pCreature1, Creature* pCreature2) else if (pCreature2->isVampire()) executeVampire(pCreature1, pCreature2); else - throw("ActionTeachSkill::execute() : ÷̾ ũԴϴ!"); + throw("ActionTeachSkill::execute() : 알 수 없는 플레이어 크리쳐입니다!"); __END_CATCH } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionTeachSkill::executeSlayer(Creature* pCreature1, Creature* pCreature2) @@ -99,9 +99,9 @@ void ActionTeachSkill::executeSlayer(Creature* pCreature1, Creature* pCreature2) Assert(pPlayer != NULL); - // ϴ ִ üũ Ѵ. + // 일단 기술을 배울 수 있는지 체크를 한다. if (pSlayer->getGoalExp(m_DomainType) != 0) { - // Ŷ ... + // 패킷을 만들어 가지고... teachinfo.setDomainType(m_DomainType); teachinfo.setTargetLevel(0); pPlayer->sendPacket(&teachinfo); @@ -113,11 +113,11 @@ void ActionTeachSkill::executeSlayer(Creature* pCreature1, Creature* pCreature2) /* - // ũİ ִ ȮѴ. + // 크리쳐가 배울 수 있는 기술의 레벨을 확인한다. LastLearnSkillType = pSlayer->findLastSkill(); - // ÷̾ ϳ ٸ 1̴. - // ÷̾ ٸ س ش. + // 플레이어가 배운 기술이 하나도 없다면 다음 배울 기술은 1레벨이다. + // 플레이어가 모든 기술을 배웠다면 정해놓은 상수를 보내준다. if (LastLearnSkillType == 0) { targetLevel = 1; @@ -133,7 +133,7 @@ void ActionTeachSkill::executeSlayer(Creature* pCreature1, Creature* pCreature2) } */ - // Ŷ ... + // 패킷을 만들어 가지고... teachinfo.setDomainType(m_DomainType); teachinfo.setTargetLevel(SkillType); @@ -144,7 +144,7 @@ void ActionTeachSkill::executeSlayer(Creature* pCreature1, Creature* pCreature2) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionTeachSkill::executeVampire(Creature* pCreature1, Creature* pCreature2) @@ -154,13 +154,13 @@ void ActionTeachSkill::executeVampire(Creature* pCreature1, Creature* pCreature2 Vampire* pVampire = dynamic_cast(pCreature2); /* - // ũİ ִ ȮѴ. + // 크리쳐가 배울 수 있는 기술의 레벨을 확인한다. SkillType_t LastLearnSkillType = pVampire->findLastSkill(); SkillInfo* pSkillInfo = NULL; SkillLevel_t targetLevel = 0; - // ÷̾ ϳ ٸ 1̴. - // ÷̾ ٸ س ش. + // 플레이어가 배운 기술이 하나도 없다면 다음 배울 기술은 1레벨이다. + // 플레이어가 모든 기술을 배웠다면 정해놓은 상수를 보내준다. if (LastLearnSkillType == 0) { targetLevel = 1; @@ -181,12 +181,12 @@ void ActionTeachSkill::executeVampire(Creature* pCreature1, Creature* pCreature2 SkillType_t SkillType = g_pSkillInfoManager->getSkillTypeByLevel(m_DomainType, DomainLevel); - // Ŷ ... + // 패킷을 만들어 가지고... GCTeachSkillInfo teachinfo; teachinfo.setDomainType(m_DomainType); teachinfo.setTargetLevel(SkillType); - // Ѵ. + // 전송한다. Player* pPlayer = pCreature2->getPlayer(); Assert(pPlayer != NULL); pPlayer->sendPacket(&teachinfo); diff --git a/src/server/gameserver/quest/ActionTeachSkill.h b/src/server/gameserver/quest/ActionTeachSkill.h index 4f3c2981..d26b4701 100644 --- a/src/server/gameserver/quest/ActionTeachSkill.h +++ b/src/server/gameserver/quest/ActionTeachSkill.h @@ -2,9 +2,9 @@ // Filename : ActionTeachSkill.h // Written By : // Description : -// NPC ÷̾ ̴ ׼̴. -// δ NPC ִ Ŷ -// ̰, ۾ Ŷ պϴ ̿ óȴ. +// NPC가 플레이어에게 기술을 가르쳐 줄 때 쓰이는 액션이다. +// 실제적으로는 NPC가 가르쳐 줄 수 있는 기술을 패킷으로 +// 전송해 줄 뿐이고, 나머지 작업들은 패킷이 왕복하는 사이에 처리된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_TEACH_SKILL_H__ @@ -43,7 +43,7 @@ class ActionTeachSkill : public Action { } private: - SkillDomainType_t m_DomainType; // ų + SkillDomainType_t m_DomainType; // 가르쳐 줄 스킬의 도메인 }; diff --git a/src/server/gameserver/quest/ActionTradeEventItem.cpp b/src/server/gameserver/quest/ActionTradeEventItem.cpp index fe9bd06f..066cdee4 100644 --- a/src/server/gameserver/quest/ActionTradeEventItem.cpp +++ b/src/server/gameserver/quest/ActionTradeEventItem.cpp @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : ActionTradeEventItem.cpp -// Written By : ȫâ +// Written By : 장홍창 // Description : //////////////////////////////////////////////////////////////////////////////// #include "ActionTradeEventItem.h" @@ -36,7 +36,7 @@ void ActionTradeEventItem::read(PropertyBuffer& propertyBuffer) __BEGIN_TRY try { - // оδ. + // 받을 돈의 양을 읽어들인다. m_GoalAmount = (Gold_t)propertyBuffer.getPropertyInt("Amount"); } catch (NoSuchElementException& nsee) { throw Error(nsee.toString()); @@ -46,7 +46,7 @@ void ActionTradeEventItem::read(PropertyBuffer& propertyBuffer) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionTradeEventItem::execute(Creature* pCreature1, Creature* pCreature2) @@ -67,21 +67,21 @@ void ActionTradeEventItem::execute(Creature* pCreature1, Creature* pCreature2) Inventory* pInventory = pPC->getInventory(); XMAS_STAR star; - // Ŭ̾Ʈ GCNPCResponse ش. + // 먼저 클라이언트를 위해 GCNPCResponse를 보내준다. GCNPCResponse okpkt; pPlayer->sendPacket(&okpkt); // StringStream message; char message[100]; - // κ丮 ౸ ɴ. + // 이 사람의 인벤토리에 축구공이 충분한지 살핀다. - // cout << "౸ " << m_GoalAmount << " : " << endl; + // cout << "축구공 " << m_GoalAmount << " 개 아이템: " << endl; g_pPriceManager->getBallPrice(m_GoalAmount, star); if (!pInventory->hasEnoughStar(star)) { // StringStream buf; - // buf << "౸ մϴ. "; + // buf << "축구공의 개수가 부족합니다. 더 모아 오세요"; GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(g_pStringPool->getString(STRID_REQUIRE_MORE_SOCCER_BALL)); @@ -94,8 +94,8 @@ void ActionTradeEventItem::execute(Creature* pCreature1, Creature* pCreature2) return; } - // κ丮 ڸ ϴٸ ִ´. - // ΰ . + // 만약 이 사람의 인벤토리에 자리가 충분하다면 아이템을 넣는다. + // 먼저 아이템을 두개 만든다. Zone* pZone = pPC->getZone(); ObjectRegistry& OR = pZone->getObjectRegistry(); @@ -122,31 +122,31 @@ void ActionTradeEventItem::execute(Creature* pCreature1, Creature* pCreature2) case 100: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_COAT, 0, option4); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_TROUSER, 0, option4); - // message << "STR+4 ÷ Ŷ STR+4 Ƚϴ. ڸ !"; + // message << "STR+4 플렛 제킷과 STR+4 슬랙을 지급해 드렸습니다. 코리아팀 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_1)); break; case 125: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_COAT, 2, option5); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_TROUSER, 2, option5); - // message << "STR+5 Ʈ STR+5 Ʈ Ƚϴ. ڸ !"; + // message << "STR+5 베스트와 STR+5 트라우져를 지급해 드렸습니다. 코리아팀 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_2)); break; case 175: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_COAT, 4, option1); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_TROUSER, 4, option1); - // message << "STR+1 ƲƮ STR+1  Ƚϴ. ڸ !"; + // message << "STR+1 배틀슈트와 STR+1 레깅즈를 지급해 드렸습니다. 코리아팀 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_3)); break; case 225: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_COAT, 4, option2); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_TROUSER, 4, option2); - // message << "STR+2 ƲƮ STR+2  Ƚϴ. ڸ !"; + // message << "STR+2 배틀슈트와 STR+2 레깅즈를 지급해 드렸습니다. 코리아팀 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_4)); break; case 275: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_COAT, 4, option3); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_TROUSER, 4, option3); - // message << "STR+3 ƲƮ STR+3  Ƚϴ. ڸ !"; + // message << "STR+3 배틀슈트와 STR+3 레깅즈를 지급해 드렸습니다. 코리아팀 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_5)); break; default: @@ -157,31 +157,31 @@ void ActionTradeEventItem::execute(Creature* pCreature1, Creature* pCreature2) case 100: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_COAT, 1, option4); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_TROUSER, 1, option4); - // message << "STR+4 ÷ Ŷ STR+4 Ƚϴ. ڸ !"; + // message << "STR+4 플렛 제킷과 STR+4 슬랙을 지급해 드렸습니다. 코리아팀 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_6)); break; case 125: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_COAT, 3, option5); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_TROUSER, 3, option5); - // message << "STR+5 Ʈ STR+5 Ʈ Ƚϴ. ڸ !"; + // message << "STR+5 베스트와 STR+5 트라우져를 지급해 드렸습니다. 코리아팀 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_7)); break; case 175: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_COAT, 5, option1); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_TROUSER, 5, option1); - // message << "STR+1 ƲƮ STR+1  Ƚϴ. ڸ !"; + // message << "STR+1 배틀슈트와 STR+1 레깅즈를 지급해 드렸습니다. 코리아팀 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_8)); break; case 225: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_COAT, 5, option2); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_TROUSER, 5, option2); - // message << "STR+2 ƲƮ STR+2  Ƚϴ. ڸ !"; + // message << "STR+2 배틀슈트와 STR+2 레깅즈를 지급해 드렸습니다. 코리아팀 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_9)); break; case 275: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_COAT, 5, option3); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_TROUSER, 5, option3); - // message << "STR+3 ƲƮ STR+3  Ƚϴ. ڸ !"; + // message << "STR+3 배틀슈트와 STR+3 레깅즈를 지급해 드렸습니다. 코리아팀 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_10)); break; default: @@ -196,36 +196,36 @@ void ActionTradeEventItem::execute(Creature* pCreature1, Creature* pCreature2) case 100: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_COAT, 1, option4); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_NECKLACE, 2, option4); - // message << "STR+4 ٵƮ STR+4 Ŀǵ ũ Ƚϴ. ڸ - // !"; + // message << "STR+4 바디슈트와 STR+4 커시피드 네크리스를 지급해 드렸습니다. 코리아팀 + // 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_11)); break; case 125: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_COAT, 3, option4); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_NECKLACE, 3, option4); - // message << "STR+4 Ʈ STR+4 ũ Ƚϴ.ڸ - // !";; + // message << "STR+4 점프슈트와 STR+4 젯 네크리스를 지급해 드렸습니다.코리아팀 + // 파이팅!";; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_12)); break; case 175: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_COAT, 3, option5); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_NECKLACE, 4, option3); - // message << "STR+5 Ʈ STR+4 ̵ ҴƮ Ƚϴ. ڸ - // !"; + // message << "STR+5 점프슈트와 STR+4 아이돌 팬던트를 지급해 드렸습니다. 코리아팀 + // 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_13)); break; case 225: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_COAT, 3, option5); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_NECKLACE, 5, option3); - // message << "STR+5 Ʈ STR+4 ڰ(Anti-Cross) ҴƮ - // Ƚϴ. ڸ !"; + // message << "STR+5 점프슈트와 STR+4 역십자가(Anti-Cross)를 팬던트를 지급해 + // 드렸습니다. 코리아팀 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_14)); break; case 275: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_COAT, 3, option5); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_NECKLACE, 6, option3); - // message << "STR+5 Ʈ STR+4 Ÿ(Death-Star) ҴƮ Ƚϴ. - // ڸ !"; + // message << "STR+5 점프슈트와 STR+4 데스스타(Death-Star) 팬던트를 지급해 드렸습니다. + // 코리아팀 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_15)); break; default: @@ -236,36 +236,36 @@ void ActionTradeEventItem::execute(Creature* pCreature1, Creature* pCreature2) case 100: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_COAT, 0, option4); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_NECKLACE, 2, option4); - // message << "STR+4 Ʈ STR+4 Ŀǵ ũ Ƚϴ. ڸ - // !"; + // message << "STR+4 스윙코트와 STR+4 커시피드 네크리스를 지급해 드렸습니다. 코리아팀 + // 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_16)); break; case 125: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_COAT, 2, option4); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_NECKLACE, 3, option4); - // message << "STR+4 Ʈ STR+4 ũ Ƚϴ.ڸ - // !";; + // message << "STR+4 프록코트와 STR+4 젯 네크리스를 지급해 드렸습니다.코리아팀 + // 파이팅!";; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_17)); break; case 175: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_COAT, 2, option5); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_NECKLACE, 4, option3); - // message << "STR+5 Ʈ STR+4 ̵ ҴƮ Ƚϴ. ڸ - // !"; + // message << "STR+5 프록코트와 STR+4 아이돌 팬던트를 지급해 드렸습니다. 코리아팀 + // 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_18)); break; case 225: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_COAT, 2, option5); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_NECKLACE, 5, option3); - // message << "STR+5 Ʈ STR+4 ڰ(Anti-Cross) ҴƮ - // Ƚϴ. ڸ !"; + // message << "STR+5 프록코트와 STR+4 역십자가(Anti-Cross)를 팬던트를 지급해 + // 드렸습니다. 코리아팀 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_19)); break; case 275: pItem1 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_COAT, 2, option5); pItem2 = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_VAMPIRE_NECKLACE, 6, option3); - // message << "STR+5 Ʈ STR+4 Ÿ(Death-Star) ҴƮ Ƚϴ. - // ڸ !"; + // message << "STR+5 프록코트와 STR+4 데스스타(Death-Star) 팬던트를 지급해 드렸습니다. + // 코리아팀 파이팅!"; sprintf(message, g_pStringPool->c_str(STRID_KOREA_FIGHTING_20)); break; default: @@ -279,21 +279,21 @@ void ActionTradeEventItem::execute(Creature* pCreature1, Creature* pCreature2) OR.registerObject(pItem1); OR.registerObject(pItem2); - // inventory ִٸ, ִ´. - // ΰ ־ ϱ ϳ ְ ٽ ϳ ̾ - // ΰ  ౸ δ. - // ι°  ʴٸ, ù° Ѵ. + // 만약 inventory에 공간이 있다면, 넣는다. + // 두개를 넣어야 하기 때문에 하나를 넣고 다시 하나를 이어서 넣은 다음에 + // 최종적으로 두개 다 들어가면 축구공의 개수를 줄인다. + // 만약 두번째가 들어가지 않느다면, 첫번째 아이템을 삭제한다. if (pInventory->addItem(pItem1, pt)) { if (pInventory->addItem(pItem2, pt2)) { pItem1->create(pPC->getName(), STORAGE_INVENTORY, 0, pt.x, pt.y); pItem2->create(pPC->getName(), STORAGE_INVENTORY, 0, pt2.x, pt2.y); - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem1 != NULL && pItem1->isTraceItem()) { remainTraceLog(pItem1, pCreature1->getName(), pCreature2->getName(), ITEM_LOG_CREATE, DETAIL_EVENTNPC); } - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem2 != NULL && pItem2->isTraceItem()) { remainTraceLog(pItem2, pCreature1->getName(), pCreature2->getName(), ITEM_LOG_CREATE, DETAIL_EVENTNPC); } @@ -322,9 +322,9 @@ void ActionTradeEventItem::execute(Creature* pCreature1, Creature* pCreature2) pPlayer->sendPacket(&gcCreateItem); - // ౸ δ. + // 축구공을 줄인다. pInventory->decreaseStar(star); - cout << "÷̾ ౸ " << star.amount << " ٿϴ." << endl; + cout << "플레이어의 축구공을 " << star.amount << " 개 줄였습니다." << endl; GCNPCResponse gcNPCResponse; gcNPCResponse.setCode(NPC_RESPONSE_DECREASE_BALL); @@ -341,7 +341,7 @@ void ActionTradeEventItem::execute(Creature* pCreature1, Creature* pCreature2) SAFE_DELETE(pItem2); // StringStream buf; - // buf << "κ丮 մϴ"; + // buf << "인벤토리에 공간이 부족합니다"; GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(g_pStringPool->getString(STRID_NOT_ENOUGH_INVENTORY_SPACE)); @@ -349,7 +349,7 @@ void ActionTradeEventItem::execute(Creature* pCreature1, Creature* pCreature2) } } else { // StringStream buf; - // buf << "κ丮 մϴ"; + // buf << "인벤토리에 공간이 부족합니다"; GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(g_pStringPool->getString(STRID_NOT_ENOUGH_INVENTORY_SPACE)); diff --git a/src/server/gameserver/quest/ActionTradeEventItem.h b/src/server/gameserver/quest/ActionTradeEventItem.h index 1c39782b..7dda288e 100644 --- a/src/server/gameserver/quest/ActionTradeEventItem.h +++ b/src/server/gameserver/quest/ActionTradeEventItem.h @@ -34,7 +34,7 @@ class ActionTradeEventItem : public Action { } private: - int m_GoalAmount; // ౸ + int m_GoalAmount; // 받을 축구공의 수 }; diff --git a/src/server/gameserver/quest/ActionTradeGQuestEventItem.cpp b/src/server/gameserver/quest/ActionTradeGQuestEventItem.cpp index 0b18f55c..c7dddbf4 100644 --- a/src/server/gameserver/quest/ActionTradeGQuestEventItem.cpp +++ b/src/server/gameserver/quest/ActionTradeGQuestEventItem.cpp @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : ActionTradeGQuestEventItem.cpp -// Written By : ȫâ +// Written By : 장홍창 // Description : //////////////////////////////////////////////////////////////////////////////// #include "ActionTradeGQuestEventItem.h" @@ -47,7 +47,7 @@ void ActionTradeGQuestEventItem::read(PropertyBuffer& propertyBuffer) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionTradeGQuestEventItem::execute(Creature* pCreature1, Creature* pCreature2) @@ -67,7 +67,7 @@ void ActionTradeGQuestEventItem::execute(Creature* pCreature1, Creature* pCreatu GQuestInventory& inven = pPC->getGQuestManager()->getGQuestInventory(); - // Ŭ̾Ʈ GCNPCResponse ش. + // 먼저 클라이언트를 위해 GCNPCResponse를 보내준다. GCNPCResponse okpkt; pPlayer->sendPacket(&okpkt); @@ -85,7 +85,7 @@ void ActionTradeGQuestEventItem::execute(Creature* pCreature1, Creature* pCreatu if (count[0] < 5 || count[1] < 5 || count[2] < 5) { GCSystemMessage gcSM; - gcSM.setMessage("Ҫ15."); + gcSM.setMessage("矜狼15몸훨蛟돛야."); pPC->getPlayer()->sendPacket(&gcSM); return; } @@ -93,7 +93,7 @@ void ActionTradeGQuestEventItem::execute(Creature* pCreature1, Creature* pCreatu _TPOINT tp; if (!pPC->getInventory()->getEmptySlot(1, 1, tp)) { GCSystemMessage gcSM; - gcSM.setMessage("ռ䲻."); + gcSM.setMessage("돛야으왕쇌꼇璃."); pPC->getPlayer()->sendPacket(&gcSM); return; } @@ -153,7 +153,7 @@ void ActionTradeGQuestEventItem::execute(Creature* pCreature1, Creature* pCreatu makeOptionList(option, optionList); if (optionList.size() != 2) { - filelog("GQuestEventBug.log", "ɼ ƲȽϴ. : %d/%s", value, option.c_str()); + filelog("GQuestEventBug.log", "옵션이 틀렸습니다. : %d/%s", value, option.c_str()); } Item* pItem = g_pItemFactoryManager->createItem(iClass, iType, optionList); @@ -169,7 +169,7 @@ void ActionTradeGQuestEventItem::execute(Creature* pCreature1, Creature* pCreatu makeGCCreateItem(&gcCI, pItem, tp.x, tp.y); pPC->getPlayer()->sendPacket(&gcCI); - filelog("GQuestEvent.log", "̺Ʈ Ʈ ϴ. : [%s]%u/%s/%u", pPC->getName().c_str(), iType, + filelog("GQuestEvent.log", "이벤트 퀘스트 아이템을 줬습니다. : [%s]%u/%s/%u", pPC->getName().c_str(), iType, option.c_str(), pItem->getItemID()); GCNPCResponse response; @@ -177,7 +177,7 @@ void ActionTradeGQuestEventItem::execute(Creature* pCreature1, Creature* pCreatu pPlayer->sendPacket(&response); GCSystemMessage gcSM; - gcSM.setMessage("Ʒѷ."); + gcSM.setMessage("쉽틔綠랙렴."); pPC->getPlayer()->sendPacket(&gcSM); __END_CATCH diff --git a/src/server/gameserver/quest/ActionTradeLairItem.cpp b/src/server/gameserver/quest/ActionTradeLairItem.cpp index 88828160..42d94a85 100644 --- a/src/server/gameserver/quest/ActionTradeLairItem.cpp +++ b/src/server/gameserver/quest/ActionTradeLairItem.cpp @@ -1,18 +1,18 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : ActionTradeLairItem.cpp -// Written By : ȫâ +// Written By : 장홍창 // Description : -// ͸ ׿ -// NPC ȯϴ ̴. -// Ǵ Randomϰ ȴ. ( Gameble -// ̿ϸ ϴ) +// 레어 마스터를 죽였을 경우 생기는 아이템을 +// NPC와 교환하는 로직이다. +// 생성되는 아이템은 Random하게 결정된다. ( 이 경우 Gameble을 +// 잘 이용하면 쉬울 듯 하다) // // // History. // // Date Writer Description // ---------- ----------- ------------------------------------------------------ -// 2002.09.04 ȫâ ű +// 2002.09.04 장홍창 신규 생성 //////////////////////////////////////////////////////////////////////////////// #include "ActionTradeLairItem.h" @@ -53,7 +53,7 @@ void ActionTradeLairItem::read(PropertyBuffer& propertyBuffer) __BEGIN_TRY try { - // оδ. + // 받을 돈의 양을 읽어들인다. m_Type = (ItemType_t)propertyBuffer.getPropertyInt("Type"); } catch (NoSuchElementException& nsee) { throw Error(nsee.toString()); @@ -63,7 +63,7 @@ void ActionTradeLairItem::read(PropertyBuffer& propertyBuffer) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionTradeLairItem::execute(Creature* pCreature1, Creature* pCreature2) @@ -92,7 +92,7 @@ void ActionTradeLairItem::execute(Creature* pCreature1, Creature* pCreature2) /* GCSystemMessage gcSystemMessage; - gcSystemMessage.setMessage(" ʴ Դϴ"); + gcSystemMessage.setMessage("아직 지원되지 않는 기능입니다"); pPlayer->sendPacket(&gcSystemMessage); */ @@ -101,19 +101,19 @@ void ActionTradeLairItem::execute(Creature* pCreature1, Creature* pCreature2) Inventory* pInventory = pPC->getInventory(); - // ִ° üũѴ. + // 먼저 아이템을 가지고 있는가를 체크한다. Item* pMasterItem = NULL; MonsterType_t MonsterType = 0; Item* pItem1 = NULL; bool bUpgrade = false; - // ɼǿ ٸ ˻ؾ Ѵ. - // ڳ : ҴƮ/ 길 üũѴ. - // 긮ݶī: Ʈ/길 üũؾ Ѵ - // ī : 丮 ҴƮ/길 üũؾ Ѵ. + // 옵션에 따라서 다른 아이템을 검사해야 한다. + // 코난 : 팬던트/ 비쥬만 체크한다. + // 브리콜라카스: 테페즈 펜던트/비쥬만 체크해야 한다 + // 카임 : 바토리 팬던트/비쥬만 체크해야 한다. - if (m_Type == 0) // ڳ, + if (m_Type == 0) // 코난, 비쥬 { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 0); MonsterType = BATORI_TYPE; @@ -122,12 +122,12 @@ void ActionTradeLairItem::execute(Creature* pCreature1, Creature* pCreature2) pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 2); MonsterType = TEPEZ_TYPE; if (pMasterItem == NULL) { - pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 8); // 巹 + pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 8); // 질드레 비쥬 MonsterType = GDR_TYPE; bUpgrade = true; } } - } else if (m_Type == 1) // ڳ, ҴƮ + } else if (m_Type == 1) // 코난, 팬던트 { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 1); MonsterType = BATORI_TYPE; @@ -136,50 +136,50 @@ void ActionTradeLairItem::execute(Creature* pCreature1, Creature* pCreature2) pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 3); MonsterType = TEPEZ_TYPE; if (pMasterItem == NULL) { - pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 9); // 巹 Ʈ + pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 9); // 질드레 펜던트 MonsterType = GDR_TYPE; bUpgrade = true; } } - } else if (m_Type == 2) // 긮ݶī, + } else if (m_Type == 2) // 브리콜라카스, 비쥬 { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 2); - // if ( pMasterItem == NULL ) pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 8); //巹 - // + // if ( pMasterItem == NULL ) pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 8); //질드레 + // 비쥬 MonsterType = TEPEZ_TYPE; - } else if (m_Type == 3) // 긮ݶī, ҴƮ + } else if (m_Type == 3) // 브리콜라카스, 팬던트 { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 3); - // if ( pMasterItem == NULL ) pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 9); //巹 - // Ʈ + // if ( pMasterItem == NULL ) pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 9); //질드레 + // 펜던트 MonsterType = TEPEZ_TYPE; - } else if (m_Type == 4) // ī, + } else if (m_Type == 4) // 카임, 비쥬 { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 0); - // if ( pMasterItem == NULL ) pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 8); //巹 - // + // if ( pMasterItem == NULL ) pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 8); //질드레 + // 비쥬 MonsterType = BATORI_TYPE; - } else if (m_Type == 5) // ī, ҴƮ + } else if (m_Type == 5) // 카임, 팬던트 { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 1); - // if ( pMasterItem == NULL ) pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 9); //巹 - // Ʈ + // if ( pMasterItem == NULL ) pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 9); //질드레 + // 펜던트 MonsterType = BATORI_TYPE; - } else if (m_Type == 10) // 巹, + } else if (m_Type == 10) // 질드레, 비쥬 { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 8); bUpgrade = true; MonsterType = GDR_TYPE; - } else if (m_Type == 11) // 巹, ҴƮ + } else if (m_Type == 11) // 질드레, 팬던트 { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 9); bUpgrade = true; MonsterType = GDR_TYPE; - } else if (m_Type == 6) // ~ + } else if (m_Type == 6) // 젬스톤이지롱~ { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 4); MonsterType = BATORI_TYPE; - } else if (m_Type == 7) // ~ + } else if (m_Type == 7) // 보름달~ { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 5); ItemMineInfo* pItemMineInfo; @@ -190,7 +190,7 @@ void ActionTradeLairItem::execute(Creature* pCreature1, Creature* pCreature2) Attr_t totalAttr = pSlayer->getTotalAttr(ATTR_BASIC); - if (totalAttr <= 130) // ϵڵ . + if (totalAttr <= 130) // 하드코딩 ㅜ.ㅠ pItemMineInfo = g_pItemMineInfoManager->getItemMineInfo(0); else if (totalAttr <= 210) pItemMineInfo = g_pItemMineInfoManager->getItemMineInfo(1); @@ -237,7 +237,7 @@ void ActionTradeLairItem::execute(Creature* pCreature1, Creature* pCreature2) pItem1 = pItemMineInfo->getItem(); setItemGender(pItem1, (pPC->getSex() == FEMALE) ? GENDER_FEMALE : GENDER_MALE); - } else if (m_Type == 8) // ׹ʴ~ + } else if (m_Type == 8) // 그믐달~ { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 6); @@ -250,7 +250,7 @@ void ActionTradeLairItem::execute(Creature* pCreature1, Creature* pCreature2) } setItemGender(pItem1, (pPC->getSex() == FEMALE) ? GENDER_FEMALE : GENDER_MALE); - } else if (m_Type == 9) // ָӴ + } else if (m_Type == 9) // 빨간색 복주머니 { pMasterItem = pInventory->findItem(Item::ITEM_CLASS_QUEST_ITEM, 7); @@ -262,8 +262,8 @@ void ActionTradeLairItem::execute(Creature* pCreature1, Creature* pCreature2) pItem1 = g_pItemMineInfoManager->getRandomItem(97, 112); } } else { - // ŷ NPC Property ߸Ǿ. ̷ 쿡 - //  Ǹ ϸ ٷ ó ִ. + // 거래를 위한 NPC의 Property가 잘못되었다. 이런 경우에는 + // 운영팀으로 문의를 하면 바로 처리를 할 수 있다. GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(g_pStringPool->getString(STRID_NPC_ERROR)); pPlayer->sendPacket(&gcSystemMessage); @@ -288,21 +288,21 @@ void ActionTradeLairItem::execute(Creature* pCreature1, Creature* pCreature2) Zone* pZone = pPC->getZone(); - // if ( MonsterType != 0 ) // ǥ ؼ + // if ( MonsterType != 0 ) // 루팅표를 참조해서 아이템을 만들어오는 경우 if (pItem1 == NULL) { QuestItemInfo* pItemInfo = dynamic_cast(g_pQuestItemInfoManager->getItemInfo(pMasterItem->getItemType())); Assert(pItemInfo != NULL); /////////////////////////////////////////////////////////////////////////////// - // κ - // ϰ ؾ Ѵ. - // ϴ ⺻ ϳ Ѵ. + // 가장 난감한 부분 + // 아이템을 랜덤하게 선택해야 한다. + // 일단은 기본 아이템 하나로 한다. ////////////////////////////////////////////////////////////////////////////// const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo(MonsterType); TreasureList* pTreasureList = NULL; - // ִ ۵ ޶ Ѵ. + // 종족에 따라서 주는 아이템도 달라야 한다. if (pCreature2->isSlayer()) pTreasureList = pMonsterInfo->getSlayerTreasureList(); else if (pCreature2->isVampire()) @@ -322,7 +322,7 @@ void ActionTradeLairItem::execute(Creature* pCreature1, Creature* pCreature2) it.ItemClass = Item::ITEM_CLASS_MAX; it.ItemType = 0; - // QuestItem ٸ.. ɼ 2 Ȯ + // QuestItem 마다 다른.. 옵션이 2개 붙을 확률 it.NextOptionRatio = pItemInfo->getBonusRatio(); // cout << "TradeLairItem: BonusRatio = " << it.NextOptionRatio << endl; @@ -362,7 +362,7 @@ void ActionTradeLairItem::execute(Creature* pCreature1, Creature* pCreature2) pItem1->setGrade(min(7, ItemGradeManager::Instance().getRandomBeadGrade())); pZone->registerObject(pItem1); - // inventory ִٸ, ִ´. + // 만약 inventory에 공간이 있다면, 넣는다. if (pInventory->addItem(pItem1, pt)) { pItem1->create(pPC->getName(), STORAGE_INVENTORY, 0, pt.x, pt.y); @@ -381,34 +381,34 @@ void ActionTradeLairItem::execute(Creature* pCreature1, Creature* pCreature2) pPlayer->sendPacket(&gcCreateItem); - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem1 != NULL && pItem1->isTraceItem()) { remainTraceLog(pItem1, pCreature1->getName(), pCreature2->getName(), ITEM_LOG_CREATE, DETAIL_EVENTNPC); } - // ش + // 기존의 아이템을 없앤다 GCDeleteInventoryItem gcDeleteInventoryItem; gcDeleteInventoryItem.setObjectID(pMasterItem->getObjectID()); pPlayer->sendPacket(&gcDeleteInventoryItem); - // ش. - pInventory->deleteItem(pMasterItem->getObjectID()); // ǥ ٲָ ǵ.. - // ItemTraceLog + // 서버에서 없애준다. + pInventory->deleteItem(pMasterItem->getObjectID()); // 좌표로 바꿔주면 좋을건데.. + // ItemTraceLog 를 남긴다 if (pMasterItem != NULL && pMasterItem->isTraceItem()) { remainTraceLog(pMasterItem, pCreature2->getName(), pCreature1->getName(), ITEM_LOG_DELETE, DETAIL_EVENTNPC); } pMasterItem->destroy(); SAFE_DELETE(pMasterItem); - // ڿ ޽ + // 사용자에게 성공 메시지 출력 // StringStream message; - // message << " ȯǾϴ"; + // message << "성공적으로 교환되었습니다"; GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(g_pStringPool->getString(STRID_TRADE_SUCCESS)); pPlayer->sendPacket(&gcSystemMessage); } else { // StringStream buf; - // buf << "κ丮 մϴ"; + // buf << "인벤토리에 공간이 부족합니다"; GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(g_pStringPool->getString(STRID_NOT_ENOUGH_INVENTORY_SPACE)); diff --git a/src/server/gameserver/quest/ActionTradeLairItem.h b/src/server/gameserver/quest/ActionTradeLairItem.h index b989859d..dde3e88d 100644 --- a/src/server/gameserver/quest/ActionTradeLairItem.h +++ b/src/server/gameserver/quest/ActionTradeLairItem.h @@ -38,7 +38,7 @@ class ActionTradeLairItem : public Action { } private: - ItemType_t m_Type; // ౸ + ItemType_t m_Type; // 받을 축구공의 수 }; diff --git a/src/server/gameserver/quest/ActionTurnOffFlag.cpp b/src/server/gameserver/quest/ActionTurnOffFlag.cpp index e915801b..887f72f8 100644 --- a/src/server/gameserver/quest/ActionTurnOffFlag.cpp +++ b/src/server/gameserver/quest/ActionTurnOffFlag.cpp @@ -29,7 +29,7 @@ void ActionTurnOffFlag::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionTurnOffFlag::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionTurnOnFlag.cpp b/src/server/gameserver/quest/ActionTurnOnFlag.cpp index 1fa14411..6bf25662 100644 --- a/src/server/gameserver/quest/ActionTurnOnFlag.cpp +++ b/src/server/gameserver/quest/ActionTurnOnFlag.cpp @@ -29,7 +29,7 @@ void ActionTurnOnFlag::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionTurnOnFlag::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionTutorial.cpp b/src/server/gameserver/quest/ActionTutorial.cpp index 80aa131e..2bcdabee 100644 --- a/src/server/gameserver/quest/ActionTutorial.cpp +++ b/src/server/gameserver/quest/ActionTutorial.cpp @@ -33,7 +33,7 @@ void ActionTutorial::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionTutorial::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionTutorial.h b/src/server/gameserver/quest/ActionTutorial.h index bab94ff8..1bd9fb50 100644 --- a/src/server/gameserver/quest/ActionTutorial.h +++ b/src/server/gameserver/quest/ActionTutorial.h @@ -2,7 +2,7 @@ // Filename : ActionTutorial.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_TUTORIAL_H__ diff --git a/src/server/gameserver/quest/ActionWaitForApartCouple.cpp b/src/server/gameserver/quest/ActionWaitForApartCouple.cpp index 7f0a982f..98d9f684 100644 --- a/src/server/gameserver/quest/ActionWaitForApartCouple.cpp +++ b/src/server/gameserver/quest/ActionWaitForApartCouple.cpp @@ -30,7 +30,7 @@ void ActionWaitForApartCouple::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionWaitForApartCouple::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionWaitForApartCouple.h b/src/server/gameserver/quest/ActionWaitForApartCouple.h index a548a57d..5d75ce52 100644 --- a/src/server/gameserver/quest/ActionWaitForApartCouple.h +++ b/src/server/gameserver/quest/ActionWaitForApartCouple.h @@ -2,7 +2,7 @@ // Filename : ActionWaitForApartCouple.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_WAIT_FOR_APART_COUPLE_H__ diff --git a/src/server/gameserver/quest/ActionWaitForMeetCouple.cpp b/src/server/gameserver/quest/ActionWaitForMeetCouple.cpp index 87316e5c..4df1a8ad 100644 --- a/src/server/gameserver/quest/ActionWaitForMeetCouple.cpp +++ b/src/server/gameserver/quest/ActionWaitForMeetCouple.cpp @@ -30,7 +30,7 @@ void ActionWaitForMeetCouple::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionWaitForMeetCouple::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionWaitForMeetCouple.h b/src/server/gameserver/quest/ActionWaitForMeetCouple.h index 623d7f5f..74613ff9 100644 --- a/src/server/gameserver/quest/ActionWaitForMeetCouple.h +++ b/src/server/gameserver/quest/ActionWaitForMeetCouple.h @@ -2,7 +2,7 @@ // Filename : ActionWaitForMeetCouple.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_WAIT_FOR_MEET_COUPLE_H__ diff --git a/src/server/gameserver/quest/ActionWander.cpp b/src/server/gameserver/quest/ActionWander.cpp index 7d5f4630..f644f9e5 100644 --- a/src/server/gameserver/quest/ActionWander.cpp +++ b/src/server/gameserver/quest/ActionWander.cpp @@ -45,7 +45,7 @@ void ActionWander::read(PropertyBuffer& propertyBuffer) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionWander::execute(Creature* pCreature1, Creature* pCreature2) @@ -57,7 +57,7 @@ void ActionWander::execute(Creature* pCreature1, Creature* pCreature2) Assert(pCreature1->isNPC() || pCreature1->isMonster()); - // ̹ Ͽ üũѴ. + // 이번 턴에 움직일 것인지 체크한다. uint diceResult = Dice(1, 100); if (diceResult < m_MovePercentage) { @@ -68,14 +68,14 @@ void ActionWander::execute(Creature* pCreature1, Creature* pCreature2) ZoneCoord_t nx = 0; ZoneCoord_t ny = 0; - // ̱ ߴٸ, üũѴ. - // ϴ ִ Ϻ ۼѴ. + // 움직이기로 했다면, 어느 방향으로 움직일 것인지 체크한다. + // 일단 갈 수 있는 방향의 목록부터 작성한다. for (uint i = 0; i < 8; i++) { nx = cx + d[i].x; ny = cy + d[i].y; - // (x,y,r) ȿ ϸ鼭, - // NPC ִ - - Ÿ̾ Ѵ. + // 다음 도착 지점은 (x,y,r) 영역 안에 존재하면서, + // NPC가 움직일 수 있는 - 블락되지 않은 - 타일이어야 한다. if (max(abs(m_X - nx), abs(m_Y - ny)) <= m_Radius && pCreature1->canMove(nx, ny)) { movableDir[i] = true; movableDirCount++; @@ -84,8 +84,8 @@ void ActionWander::execute(Creature* pCreature1, Creature* pCreature2) } } - // ġ ٸ, Ѵ. - // ִٸ.. δ. + // 만약 현재 위치에서 움직일 수 없다면, 정지한다. + // 움직일 수 있다면.. 움직인다. if (movableDirCount > 0) { Dir_t nextDir = pCreature1->getDir(); bool changeDir = false; @@ -100,7 +100,7 @@ void ActionWander::execute(Creature* pCreature1, Creature* pCreature2) if (changeDir) { uint j = rand() % movableDirCount + 1; - uint k = 0; // movableDir[l] == true ε + uint k = 0; // movableDir[l] == true 인 방향의 인덱스 for (uint l = 0; l < 8; l++) { if (movableDir[l] && ++k == j) { nextDir = l; diff --git a/src/server/gameserver/quest/ActionWander.h b/src/server/gameserver/quest/ActionWander.h index 99ab7d2c..c267e474 100644 --- a/src/server/gameserver/quest/ActionWander.h +++ b/src/server/gameserver/quest/ActionWander.h @@ -2,9 +2,9 @@ // Filename : ActionWander.h // Written By : // Description : -// ġ Դٰ Ȳϴ ũó ǥҶ ϴ ׼̴. -// ũó ġ ߽ ݰ r 簢 -// M ۼƮ Ȯ ̵ϰ ȴ. +// 현재 위치에서 왔다갔다 방황하는 크리처를 표현할때 사용하는 액션이다. +// 크리처가 현재 위치를 중심으로 반경 r 안의 사각 영역에서 +// M 퍼센트의 확률로 이동하게 된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_WANDER_H__ diff --git a/src/server/gameserver/quest/ActionWanderZone.cpp b/src/server/gameserver/quest/ActionWanderZone.cpp index bb36a6ca..1985de95 100644 --- a/src/server/gameserver/quest/ActionWanderZone.cpp +++ b/src/server/gameserver/quest/ActionWanderZone.cpp @@ -42,7 +42,7 @@ void ActionWanderZone::read(PropertyBuffer& propertyBuffer) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionWanderZone::execute(Creature* pCreature1, Creature* pCreature2) @@ -62,7 +62,7 @@ void ActionWanderZone::execute(Creature* pCreature1, Creature* pCreature2) const int right = pZone->getWidth() - 5; const int bottom = pZone->getHeight() - 5; - // ̹ Ͽ üũѴ. + // 이번 턴에 움직일 것인지 체크한다. uint diceResult = Dice(1, 100); if (diceResult < m_MovePercentage) { @@ -73,14 +73,14 @@ void ActionWanderZone::execute(Creature* pCreature1, Creature* pCreature2) ZoneCoord_t nx = 0; ZoneCoord_t ny = 0; - // ̱ ߴٸ, üũѴ. - // ϴ ִ Ϻ ۼѴ. + // 움직이기로 했다면, 어느 방향으로 움직일 것인지 체크한다. + // 일단 갈 수 있는 방향의 목록부터 작성한다. for (uint i = 0; i < 8; i++) { nx = cx + d[i].x; ny = cy + d[i].y; - // (x,y,r) ȿ ϸ鼭, - // NPC ִ - - Ÿ̾ Ѵ. + // 다음 도착 지점은 (x,y,r) 영역 안에 존재하면서, + // NPC가 움직일 수 있는 - 블락되지 않은 - 타일이어야 한다. if (pCreature1->canMove(nx, ny) && (nx >= left && nx <= right) && (ny >= top && ny <= bottom)) { movableDir[i] = true; movableDirCount++; @@ -89,8 +89,8 @@ void ActionWanderZone::execute(Creature* pCreature1, Creature* pCreature2) } } - // ġ ٸ, Ѵ. - // ִٸ.. δ. + // 만약 현재 위치에서 움직일 수 없다면, 정지한다. + // 움직일 수 있다면.. 움직인다. if (movableDirCount > 0) { Dir_t nextDir = pCreature1->getDir(); bool changeDir = false; @@ -105,7 +105,7 @@ void ActionWanderZone::execute(Creature* pCreature1, Creature* pCreature2) if (changeDir) { uint j = rand() % movableDirCount + 1; - uint k = 0; // movableDir[l] == true ε + uint k = 0; // movableDir[l] == true 인 방향의 인덱스 for (uint l = 0; l < 8; l++) { if (movableDir[l] && ++k == j) { nextDir = l; diff --git a/src/server/gameserver/quest/ActionWanderZone.h b/src/server/gameserver/quest/ActionWanderZone.h index a7023145..dc2b5a7c 100644 --- a/src/server/gameserver/quest/ActionWanderZone.h +++ b/src/server/gameserver/quest/ActionWanderZone.h @@ -2,9 +2,9 @@ // Filename : ActionWanderZone.h // Written By : // Description : -// ġ Դٰ Ȳϴ ũó ǥҶ ϴ ׼̴. -// ũó ġ ߽ ݰ r 簢 -// M ۼƮ Ȯ ̵ϰ ȴ. +// 현재 위치에서 왔다갔다 방황하는 크리처를 표현할때 사용하는 액션이다. +// 크리처가 현재 위치를 중심으로 반경 r 안의 사각 영역에서 +// M 퍼센트의 확률로 이동하게 된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_WANDER_ZONE_H__ diff --git a/src/server/gameserver/quest/ActionWarRegistration.cpp b/src/server/gameserver/quest/ActionWarRegistration.cpp index e73d35da..407eddd6 100644 --- a/src/server/gameserver/quest/ActionWarRegistration.cpp +++ b/src/server/gameserver/quest/ActionWarRegistration.cpp @@ -43,7 +43,7 @@ void ActionWarRegistration::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionWarRegistration::execute(Creature* pCreature1, Creature* pCreature2) @@ -88,7 +88,7 @@ void ActionWarRegistration::execute(Creature* pCreature1, Creature* pCreature2) WarScheduler* pWarScheduler = pZone->getWarScheduler(); Assert(pWarScheduler != NULL); - // ̹ ΰ? + // 이미 성을 소유한 길드인가? if (g_pGuildManager->hasCastle(guildID)) { gcNPCResponse.setCode(NPC_RESPONSE_ALREADY_HAS_CASTLE); pPC->getPlayer()->sendPacket(&gcNPCResponse); @@ -110,14 +110,14 @@ void ActionWarRegistration::execute(Creature* pCreature1, Creature* pCreature2) return; } - // ̹ û ߴ°? + // 이미 전쟁 신청을 했는가? if (g_pGuildManager->hasWarSchedule(guildID)) { gcNPCResponse.setCode(NPC_RESPONSE_WAR_ALREADY_REGISTERED); pPC->getPlayer()->sendPacket(&gcNPCResponse); return; } - // á°? + // 전쟁 스케쥴이 다 찼는가? if (!pWarScheduler->canAddWar(WAR_GUILD)) { gcNPCResponse.setCode(NPC_RESPONSE_WAR_SCHEDULE_FULL); pPC->getPlayer()->sendPacket(&gcNPCResponse); diff --git a/src/server/gameserver/quest/ActionWarRegistration.h b/src/server/gameserver/quest/ActionWarRegistration.h index a18d19c6..5aa42c70 100644 --- a/src/server/gameserver/quest/ActionWarRegistration.h +++ b/src/server/gameserver/quest/ActionWarRegistration.h @@ -2,7 +2,7 @@ // Filename : ActionWarRegistration.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_WAR_REGISTRATION_H__ @@ -35,7 +35,7 @@ class ActionWarRegistration : public Action { } private: - ZoneID_t m_ZoneID; // û ZoneID + ZoneID_t m_ZoneID; // 전쟁을 신청한 성의 ZoneID }; diff --git a/src/server/gameserver/quest/ActionWarpInZone.cpp b/src/server/gameserver/quest/ActionWarpInZone.cpp index add37dff..5239e92b 100644 --- a/src/server/gameserver/quest/ActionWarpInZone.cpp +++ b/src/server/gameserver/quest/ActionWarpInZone.cpp @@ -45,7 +45,7 @@ void ActionWarpInZone::read(PropertyBuffer& propertyBuffer) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionWarpInZone::execute(Creature* pCreature1, Creature* pCreature2) @@ -56,7 +56,7 @@ void ActionWarpInZone::execute(Creature* pCreature1, Creature* pCreature2) Assert(pCreature1->isNPC()); - // ̹ Ͽ üũѴ. + // 이번 턴에 움직일 것인지 체크한다. uint diceResult = Dice(1, 100); if (diceResult < m_MovePercentage) { @@ -71,7 +71,7 @@ void ActionWarpInZone::execute(Creature* pCreature1, Creature* pCreature2) tx = rand() % (pZone->getWidth() - 10) + 5; ty = rand() % (pZone->getHeight() - 10) + 5; - // 10 Ѱ ã д. + // 10 넘게 못 찾으면 걍 둔다. if (++count > 10) return; } diff --git a/src/server/gameserver/quest/ActionWarpInZone.h b/src/server/gameserver/quest/ActionWarpInZone.h index c22baef5..7c282ea6 100644 --- a/src/server/gameserver/quest/ActionWarpInZone.h +++ b/src/server/gameserver/quest/ActionWarpInZone.h @@ -2,9 +2,9 @@ // Filename : ActionWarpInZone.h // Written By : // Description : -// ġ Դٰ Ȳϴ ũó ǥҶ ϴ ׼̴. -// ũó ġ ߽ ݰ r 簢 -// M ۼƮ Ȯ ̵ϰ ȴ. +// 현재 위치에서 왔다갔다 방황하는 크리처를 표현할때 사용하는 액션이다. +// 크리처가 현재 위치를 중심으로 반경 r 안의 사각 영역에서 +// M 퍼센트의 확률로 이동하게 된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_WARP_IN_ZONE_H__ diff --git a/src/server/gameserver/quest/ActionWarpLevelWarZone.cpp b/src/server/gameserver/quest/ActionWarpLevelWarZone.cpp index 4250574c..b706fd83 100644 --- a/src/server/gameserver/quest/ActionWarpLevelWarZone.cpp +++ b/src/server/gameserver/quest/ActionWarpLevelWarZone.cpp @@ -35,7 +35,7 @@ void ActionWarpLevelWarZone::read(PropertyBuffer& propertyBuffer) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionWarpLevelWarZone::execute(Creature* pCreature1, Creature* pCreature2) @@ -57,14 +57,14 @@ void ActionWarpLevelWarZone::execute(Creature* pCreature1, Creature* pCreature2) return; }*/ - // ʹ ijʹ  + // 레벨 너무 높은 캐릭터는 들어갈 수 없다 if (g_pLevelWarZoneInfoManager->getCreatureLevelGrade(pCreature2) == -1) { gcSystemMessage.setMessage(g_pStringPool->getString(STRID_TO_HIGH_LEVEL_FOR_LEVEL_WAR)); pGamePlayer->sendPacket(&gcSystemMessage); return; } - // ũ ˾Ƽ ƨ =_=;; + // 크리쳐 정보 보고 알아서 튕겨주자 =_=;; ZONE_COORD pos(g_pLevelWarZoneInfoManager->getCreatureZoneID(pCreature2)); if (pCreature2->isSlayer()) { diff --git a/src/server/gameserver/quest/ActionWarpToNoviceZone.cpp b/src/server/gameserver/quest/ActionWarpToNoviceZone.cpp index d44652e4..d455e2a7 100644 --- a/src/server/gameserver/quest/ActionWarpToNoviceZone.cpp +++ b/src/server/gameserver/quest/ActionWarpToNoviceZone.cpp @@ -53,7 +53,7 @@ void ActionWarpToNoviceZone::read(PropertyBuffer& pb) } //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionWarpToNoviceZone::execute(Creature* pNPC, Creature* pCreature) @@ -101,15 +101,15 @@ void ActionWarpToNoviceZone::execute(Creature* pNPC, Creature* pCreature) try { ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo(ZoneID); - // ε ڰ ƴϸ... + // 유료존인데 유료사용자가 아니면... if (pZoneInfo == NULL || pZoneInfo->isPayPlay() && !pGamePlayer->isPayPlaying()) { string connectIP = pGamePlayer->getSocket()->getHost(); - // Ѱ? + // 유료 서비스 사용이 가능한가? if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { sendPayInfo(pGamePlayer); } else { - // Ұ + // 유료 서비스 사용 불가인 경우 GCSystemMessage gcSystemMessage; if (g_pConfig->getPropertyInt("IsNetMarble") == 0) { diff --git a/src/server/gameserver/quest/ActionWarpToNoviceZone.h b/src/server/gameserver/quest/ActionWarpToNoviceZone.h index df604cca..80b9dad8 100644 --- a/src/server/gameserver/quest/ActionWarpToNoviceZone.h +++ b/src/server/gameserver/quest/ActionWarpToNoviceZone.h @@ -2,7 +2,7 @@ // Filename : ActionWarpToNoviceZone.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_WARP_TO_NOVICE_ZONE_H__ diff --git a/src/server/gameserver/quest/ActionWarpToResurrectPosition.cpp b/src/server/gameserver/quest/ActionWarpToResurrectPosition.cpp index c2740859..327d8f5c 100644 --- a/src/server/gameserver/quest/ActionWarpToResurrectPosition.cpp +++ b/src/server/gameserver/quest/ActionWarpToResurrectPosition.cpp @@ -33,7 +33,7 @@ void ActionWarpToResurrectPosition::read(PropertyBuffer& propertyBuffer) //////////////////////////////////////////////////////////////////////////////// -// ׼ Ѵ. +// 액션을 실행한다. //////////////////////////////////////////////////////////////////////////////// void ActionWarpToResurrectPosition::execute(Creature* pCreature1, Creature* pCreature2) diff --git a/src/server/gameserver/quest/ActionWarpToResurrectPosition.h b/src/server/gameserver/quest/ActionWarpToResurrectPosition.h index 6f16b2ca..1e414634 100644 --- a/src/server/gameserver/quest/ActionWarpToResurrectPosition.h +++ b/src/server/gameserver/quest/ActionWarpToResurrectPosition.h @@ -1,7 +1,7 @@ // Filename : ActionWarpToResurrectPosition.h // Written By : excel96 // Description : -// Creature PC . NPC ȭâ µȴ. +// Creature가 PC에게 질문을 던진다. 이 대사는 NPC 대화창에 출력된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ACTION_WARP_TO_RESURRECT_POSITION_H__ diff --git a/src/server/gameserver/quest/Condition.h b/src/server/gameserver/quest/Condition.h index 7306532c..c494c6cd 100644 --- a/src/server/gameserver/quest/Condition.h +++ b/src/server/gameserver/quest/Condition.h @@ -2,8 +2,8 @@ // Filename : Condition.h // Written By : // Description : -// Ʈ ׼ DZ ؼ ؾ ϴ Ÿ Ŭ. -// Ŭ ӹ޾Ƽ ٸ ü ǵ Ѵ. +// 트리거의 액션이 실행되기 위해서 만족해야 하는 조건을 나타내는 클래스. +// 이 클래스를 상속받아서 다른 구체적인 조건들을 구현한다. ////////////////////////////////////////////////////////////////////////////// #ifndef __CONDITION_H__ @@ -16,7 +16,7 @@ #include "Types.h" ////////////////////////////////////////////////////////////////////////////// -// üũ ΰ Ķ͸ ϱ ü. +// 컨디션의 체크를 위한 부가적인 파라미터를 전달하기 위한 구조체들. ////////////////////////////////////////////////////////////////////////////// typedef struct { @@ -33,16 +33,16 @@ typedef struct { // //* isActive() | isPassive() | isNeutral() // -// ZoneGroupThread Ư ִ Ȥ NPC ó , ִ -// Ʈŵ ϴ üũѴ. ׷, Ȥ NPC -// Ŷ ڵ鷯 ǹ̸ passive ƮŸ -// ϰ ִ. passive ǵ isSatisfied() Ư üũ Ǵ.. -// ϸ true ϰ ȴ. +// ZoneGroupThread가 특정 존에 있는 몬스터 혹은 NPC를 처리할 때, 현재 갖고 있는 +// 트리거들의 모든 컨디션이 만족하는지 체크한다. 그런데, 몬스터 혹은 NPC들은 +// 패킷 핸들러에서만 의미를 가지는 passive 컨디션을 가진 트리거를 여전히 포함 +// 하고 있다. passive 컨디션들은 isSatisfied()에서 특별히 체크할 건덕지..가 없기 +// 때문에 웬만하면 true 를 리턴하게 된다. // -// , ZGT ó passive ǵ üũ ʿ䰡 üũǾ ȵȴ. -// ̸ ؼ ߰ ޽ isActive(), isPassive() ̴. +// 따라서, ZGT의 처리시 passive 컨디션들은 체크될 필요가 없으며 체크되어서도 안된다. +// 이를 위해서 추가된 메쏘드들이 isActive(), isPassive() 이다. // -// neutral active | passive ٿ Բ ִ ǵ̴. +// neutral 컨디션은 active | passive 둘 다와 함께 사용될 수 있는 조건들이다. //(ex: PC_HAS_SKILL, PC_HAS_ITEM ...) // //////////////////////////////////////////////////////////////////////////////// @@ -61,7 +61,7 @@ class Condition { // passive conditions CONDITION_TALKED_BY, - CONDITION_ANSWERED_BY, // 2000.10.13 輺 ߰ + CONDITION_ANSWERED_BY, // 2000.10.13 김성민이 추가 CONDITION_BLOOD_DRAINED, CONDITION_FLAG_ON, CONDITION_FLAG_OFF, @@ -85,40 +85,40 @@ class Condition { CONDITION_PAY_PLAY, // 2002.9.2 by sigi - CONDITION_ENTER_MASTER_LAIR, // conditionüũ actionҸ óѴ. ó Ǹ ؼ-_-; + CONDITION_ENTER_MASTER_LAIR, // condition체크후 action요소를 같이 처리한다. 처리의 편의를 위해서-_-; // 2003.1.20 by bezz, Sequoia - CONDITION_ENTER_CASTLE, // Ż  - CONDITION_HAS_ENOUGH_CASTLE_ENTRANCE_FEE, //  Ḧ ִ + CONDITION_ENTER_CASTLE, // 포탈을 통해 성에 들어가려고 할 때 + CONDITION_HAS_ENOUGH_CASTLE_ENTRANCE_FEE, // 성에 들어갈 입장료를 지불할 수 있는지 // 2003.2.18 by sigi - CONDITION_ENTER_HOLY_LAND, // ƴ  - CONDITION_ENTER_CASTLE_DUNGEON, // (ƴ ) ʿ Ҷ + CONDITION_ENTER_HOLY_LAND, // 아담의 성지에 들어갈려고 할 때 + CONDITION_ENTER_CASTLE_DUNGEON, // (아담의 성지) 성 지하 맵에 들어갈려고할때 CONDITION_HAS_QUEST, CONDITION_HAS_INVEN_SPACE, - CONDITION_CAN_ENTER_PAY_ZONE, //  + CONDITION_CAN_ENTER_PAY_ZONE, // 유료존으로 들어갈 때 - CONDITION_CAN_ENTER_BEGINNER_ZONE, // ׸޸  - CONDITION_CAN_WARP_GATE, // Ʈ ֳ? - CONDITION_CAN_ENTER_LEVEL_WAR_ZONE, // Ʈ ֳ? + CONDITION_CAN_ENTER_BEGINNER_ZONE, // 테메리에 성지로 들어갈 때 + CONDITION_CAN_WARP_GATE, // 워프 게이트 지나갈 수 있남? + CONDITION_CAN_ENTER_LEVEL_WAR_ZONE, // 워프 게이트 지나갈 수 있남? CONDITION_CAN_PET_QUEST, CONDITION_CAN_ENTER_EVENT_ZONE, - CONDITION_EFFECT_FLAG, // Ư Ʈ ÷װ ִ° - CONDITION_CAN_ENTER_GDR_LAIR, // 巹  ֳ + CONDITION_EFFECT_FLAG, // 특정 이펙트 플래그가 켜져 있는가 + CONDITION_CAN_ENTER_GDR_LAIR, // 질드레 레어 들어갈 수 있냐 - CONDITION_EXIST_REINFORCE, // û ֳ + CONDITION_EXIST_REINFORCE, // 공성 원군 신청한 넘이 있나 - CONDITION_SIEGE_DEFENDER_SIDE, // ΰ - CONDITION_SIEGE_ATTACKER_SIDE, // ΰ + CONDITION_SIEGE_DEFENDER_SIDE, // 수성측인가 + CONDITION_SIEGE_ATTACKER_SIDE, // 공성측인가 - CONDITION_NOT_GUILD_MEMBER, // 忡 ? - CONDITION_IS_GUILD_MEMBER, // 忡 ִ°? + CONDITION_NOT_GUILD_MEMBER, // 길드에 속해 있지 않은가? + CONDITION_IS_GUILD_MEMBER, // 길드에 속해 있는가? - CONDITION_CAN_ENTER_QUEST_ZONE, // Ʈ  ִ° + CONDITION_CAN_ENTER_QUEST_ZONE, // 퀘스트존에 들어갈 수 있는가 CONDITION_MAX }; diff --git a/src/server/gameserver/quest/ConditionAnsweredBy.cpp b/src/server/gameserver/quest/ConditionAnsweredBy.cpp index 5f8fc57f..45b5a337 100644 --- a/src/server/gameserver/quest/ConditionAnsweredBy.cpp +++ b/src/server/gameserver/quest/ConditionAnsweredBy.cpp @@ -16,7 +16,7 @@ bool ConditionAnsweredBy::isSatisfied(Creature* pCreature1, Creature* pCreature2 COND_ANSWERED_BY* pCond = (COND_ANSWERED_BY*)pParam; - // ũƮ ID ID ٸ true + // 스크립트 ID와 대답ID가 같다면 이 컨디션은 true if (pCond->ScriptID == m_ScriptID && pCond->AnswerID == m_AnswerID) return true; return false; diff --git a/src/server/gameserver/quest/ConditionAnsweredBy.h b/src/server/gameserver/quest/ConditionAnsweredBy.h index c47bc196..15bc22d3 100644 --- a/src/server/gameserver/quest/ConditionAnsweredBy.h +++ b/src/server/gameserver/quest/ConditionAnsweredBy.h @@ -2,7 +2,7 @@ // Filename : ConditionAnsweredBy.h // Written By : // Description : -// PC NPC 쿡 ߻ϴ ̴. +// PC가 NPC의 질문에 대답했을 경우에 발생하는 컨디션이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __ANSWEREDBY_H__ @@ -27,7 +27,7 @@ class ConditionAnsweredBy : public Condition { } virtual bool isPassive() const { return true; - } // Ŷ ϴϱ... passive condition̴. + } // 패킷에 반응을 하니까... passive condition이다. virtual bool isNeutral() const { return false; } diff --git a/src/server/gameserver/quest/ConditionAtFirst.h b/src/server/gameserver/quest/ConditionAtFirst.h index 0d85586b..fd7668eb 100644 --- a/src/server/gameserver/quest/ConditionAtFirst.h +++ b/src/server/gameserver/quest/ConditionAtFirst.h @@ -2,8 +2,8 @@ // Filename : ConditionAtFirst.h // Written By : // Description : -// NPC ε Ŀ ʷ ѹ Ǿ ϴ ׼ǵ -// ǰ ָ ڵ ȴ. +// NPC 가 로딩된 직후에 최초로 한번만 실행되어야 하는 액션들을 +// 이 컨디션과 연관시켜주면 자동으로 실행된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __AT_FIRST_H__ diff --git a/src/server/gameserver/quest/ConditionAttrComp.h b/src/server/gameserver/quest/ConditionAttrComp.h index f6b108e1..69da244e 100644 --- a/src/server/gameserver/quest/ConditionAttrComp.h +++ b/src/server/gameserver/quest/ConditionAttrComp.h @@ -48,17 +48,17 @@ class ConditionAttrComp : public Condition { bool satisfy(uint op, uint current, uint restriction) const; private: - uint m_ReqSTR; // ʿ STR - uint m_ReqDEX; // ʿ DEX - uint m_ReqINT; // ʿ INT - uint m_ReqSum; // ʿ ɷġ - uint m_ReqLevel; // ʿ LEVEL + uint m_ReqSTR; // 필요 STR + uint m_ReqDEX; // 필요 DEX + uint m_ReqINT; // 필요 INT + uint m_ReqSum; // 필요 능력치의 합 + uint m_ReqLevel; // 필요 LEVEL - uint m_STROperator; // STR - uint m_DEXOperator; // DEX - uint m_INTOperator; // INT - uint m_SumOperator; // SUM - uint m_LevelOperator; // LEVEL + uint m_STROperator; // STR 연산자 + uint m_DEXOperator; // DEX 연산자 + uint m_INTOperator; // INT 연산자 + uint m_SumOperator; // SUM 연산자 + uint m_LevelOperator; // LEVEL 연산자 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/quest/ConditionCanEnterGDRLair.cpp b/src/server/gameserver/quest/ConditionCanEnterGDRLair.cpp index 0abf1f8b..a281a386 100644 --- a/src/server/gameserver/quest/ConditionCanEnterGDRLair.cpp +++ b/src/server/gameserver/quest/ConditionCanEnterGDRLair.cpp @@ -25,21 +25,21 @@ bool ConditionCanEnterGDRLair::isSatisfied(Creature* pCreature1, Creature* pCrea /* if ( GDRLairManager::Instance().getTotalPCs() > 36 ) { GCSystemMessage gcSystemMessage; - gcSystemMessage.setMessage( " ο ʰǾ  ϴ." ); + gcSystemMessage.setMessage( "제한 인원이 초과되어 들어갈 수 없습니다." ); pCreature2->getPlayer()->sendPacket (&gcSystemMessage); return false; }*/ if (!GDRLairManager::Instance().canEnter()) { GCSystemMessage gcSystemMessage; - gcSystemMessage.setMessage("ȴйû."); + gcSystemMessage.setMessage("훑댐흩契묵뻘청역폘."); pCreature2->getPlayer()->sendPacket(&gcSystemMessage); return false; } if (!pCreature2->isFlag(Effect::EFFECT_CLASS_CAN_ENTER_GDR_LAIR)) { GCSystemMessage gcSystemMessage; - gcSystemMessage.setMessage("뵽ʧ֮2ƻ˹äʯ."); + gcSystemMessage.setMessage("극伎돕呵쭝裂檢2꿔팎뻐謳찝薑채훙柯獗."); pCreature2->getPlayer()->sendPacket(&gcSystemMessage); return false; } diff --git a/src/server/gameserver/quest/ConditionCanEnterPayZone.cpp b/src/server/gameserver/quest/ConditionCanEnterPayZone.cpp index 00092287..2e2c58be 100644 --- a/src/server/gameserver/quest/ConditionCanEnterPayZone.cpp +++ b/src/server/gameserver/quest/ConditionCanEnterPayZone.cpp @@ -27,8 +27,8 @@ bool ConditionCanEnterPayZone::isSatisfied(Creature* pCreature1, Creature* pCrea Assert(pGamePlayer != NULL); - // ̹ ִ ... . - // йи + // 이미 유료존에 있는 경우라면... 관계없겠지. + // 패밀리 요금 적용중인 경우 if (pGamePlayer->isPayPlaying() || pGamePlayer->isFamilyFreePass()) { return true; } diff --git a/src/server/gameserver/quest/ConditionCanEnterQuestZone.cpp b/src/server/gameserver/quest/ConditionCanEnterQuestZone.cpp index ed8c7aff..d5d512c4 100644 --- a/src/server/gameserver/quest/ConditionCanEnterQuestZone.cpp +++ b/src/server/gameserver/quest/ConditionCanEnterQuestZone.cpp @@ -27,7 +27,7 @@ bool ConditionCanEnterQuestZone::isSatisfied(Creature* pCreature1, Creature* pCr bool bQuestCondition = pPC->getGQuestManager()->canEnterDynamicZone(m_QuestZoneID); bool bDynamicZoneAvailable = true; - // Dynamic ȮѴ. + // Dynamic 존인지를 확인한다. int targetDynamicZoneType = g_pDynamicZoneInfoManager->getDynamicZoneTypeByZoneID(m_QuestZoneID); if (targetDynamicZoneType != DYNAMIC_ZONE_MAX) { diff --git a/src/server/gameserver/quest/ConditionEffectFlag.h b/src/server/gameserver/quest/ConditionEffectFlag.h index 12d3f882..83773a0e 100644 --- a/src/server/gameserver/quest/ConditionEffectFlag.h +++ b/src/server/gameserver/quest/ConditionEffectFlag.h @@ -38,7 +38,7 @@ class ConditionEffectFlag : public Condition { } private: - Effect::EffectClass m_Index; // ÷ + Effect::EffectClass m_Index; // 플래그의 값 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/quest/ConditionEnterCastle.cpp b/src/server/gameserver/quest/ConditionEnterCastle.cpp index 3f3472b7..b0562600 100644 --- a/src/server/gameserver/quest/ConditionEnterCastle.cpp +++ b/src/server/gameserver/quest/ConditionEnterCastle.cpp @@ -29,7 +29,7 @@ bool ConditionEnterCastle::isSatisfied(Creature* pCreature1, Creature* pCreature { return false; }*/ - // ߿ üũؾ ȴ + // 나중에 전쟁중인지 체크해야 된다 Assert(pCreature2 != NULL); Assert(pCreature2->isPC()); @@ -42,12 +42,12 @@ bool ConditionEnterCastle::isSatisfied(Creature* pCreature1, Creature* pCreature Assert(pGamePlayer != NULL); #if defined(__PAY_SYSTEM_ZONE__) || defined(__PAY_SYSTEM_FREE_LIMIT__) - // ̹ ִ ... . - // йи + // 이미 유료존에 있는 경우라면... 관계없겠지. + // 패밀리 요금 적용중일 경우 if (pGamePlayer->isPayPlaying() || pGamePlayer->isFamilyFreePass()) { bPayPlay = true; } else { - // ϴ zone üũ + // 일단 zone 요금 체크 string connectIP = pGamePlayer->getSocket()->getHost(); if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { @@ -59,21 +59,21 @@ bool ConditionEnterCastle::isSatisfied(Creature* pCreature1, Creature* pCreature bPayPlay = true; #endif - // castle  ִ. + // 돈 낸 사람만 castle 에 들어갈 수 있다. if (bPayPlay) { - // ã´. + // 존을 찾는다. Zone* pZone = getZoneByZoneID(m_TargetZoneID); Assert(pZone != NULL); - // castle ƴϸ üũ ʿ䰡 °Ŵ. + // castle 이 아니면 체크할 필요가 없는거다. if (!pZone->isCastle()) { return true; } - // ߿ Ѿ Ѵ. - // ߿ Ÿ Ѽ ȴ. - // ÿ NPC ؾ ϹǷ ų . - // ý 鶧 ̰ ߰Ѿ ȴ. 2003. 1.20. + // 종족간 전쟁중에는 종족에 상관없이 누구나 통과시켜야 한다. + // 동족간 전쟁중에는 타종족을 통과시켜서는 안 된다. + // 평시에는 NPC를 통해야 하므로 누구도 통과시킬 수 없다. + // 전쟁시스템 만들때 이거 다 추가시켜야 된다. 2003. 1.20. PlayerCreature* pPC = dynamic_cast(pCreature2); return g_pCastleInfoManager->canPortalActivate(m_TargetZoneID, pPC); diff --git a/src/server/gameserver/quest/ConditionEnterCastleDungeon.cpp b/src/server/gameserver/quest/ConditionEnterCastleDungeon.cpp index c298f769..4eda4505 100644 --- a/src/server/gameserver/quest/ConditionEnterCastleDungeon.cpp +++ b/src/server/gameserver/quest/ConditionEnterCastleDungeon.cpp @@ -25,7 +25,7 @@ bool ConditionEnterCastleDungeon::isSatisfied(Creature* pCreature1, Creature* pC { return false; }*/ - // ߿ üũؾ ȴ + // 나중에 전쟁중인지 체크해야 된다 Assert(pCreature2 != NULL); Assert(pCreature2->isPC()); @@ -38,12 +38,12 @@ bool ConditionEnterCastleDungeon::isSatisfied(Creature* pCreature1, Creature* pC Assert(pGamePlayer != NULL); #if defined(__PAY_SYSTEM_ZONE__) || defined(__PAY_SYSTEM_FREE_LIMIT__) - // ̹ ִ ... . - // йи + // 이미 유료존에 있는 경우라면... 관계없겠지. + // 패밀리 요금제 적용중일 경우 if (pGamePlayer->isPayPlaying() || pGamePlayer->isFamilyFreePass()) { bPayPlay = true; } else { - // ϴ zone üũ + // 일단 zone 요금 체크 string connectIP = pGamePlayer->getSocket()->getHost(); if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { @@ -55,7 +55,7 @@ bool ConditionEnterCastleDungeon::isSatisfied(Creature* pCreature1, Creature* pC bPayPlay = true; #endif - // castle  ִ. + // 돈 낸 사람만 castle 에 들어갈 수 있다. if (bPayPlay) { bool hasGuildWar = g_pWarSystem->hasCastleActiveWar(m_CastleZoneID); @@ -68,8 +68,8 @@ bool ConditionEnterCastleDungeon::isSatisfied(Creature* pCreature1, Creature* pC GuildID_t GuildID = pPC->getGuildID(); GuildID_t OwnerGuildID = pCastleInfo->getGuildID(); - // --> 常  ִ. - // --> 嵵  ִ. + // 전쟁이 없을 때 --> 성 소유 길드만 들어갈 수 있다. + // 길드 전쟁 중 --> 공격 길드도 들어갈 수 있다. if (OwnerGuildID != SlayerCommon && OwnerGuildID != VampireCommon && OwnerGuildID != OustersCommon && GuildID == OwnerGuildID) { return true; diff --git a/src/server/gameserver/quest/ConditionEnterHolyLand.cpp b/src/server/gameserver/quest/ConditionEnterHolyLand.cpp index 247896a8..e69ec85e 100644 --- a/src/server/gameserver/quest/ConditionEnterHolyLand.cpp +++ b/src/server/gameserver/quest/ConditionEnterHolyLand.cpp @@ -29,7 +29,7 @@ bool ConditionEnterHolyLand::isSatisfied(Creature* pCreature1, Creature* pCreatu { return false; }*/ - // ߿ üũؾ ȴ + // 나중에 전쟁중인지 체크해야 된다 Assert(pCreature2 != NULL); Assert(pCreature2->isPC()); @@ -42,12 +42,12 @@ bool ConditionEnterHolyLand::isSatisfied(Creature* pCreature1, Creature* pCreatu Assert(pGamePlayer != NULL); #if defined(__PAY_SYSTEM_ZONE__) || defined(__PAY_SYSTEM_FREE_LIMIT__) - // ̹ ִ ... . - // йи + // 이미 유료존에 있는 경우라면... 관계없겠지. + // 패밀리 요금제 적용중일 경우 if (pGamePlayer->isPayPlaying() || pGamePlayer->isFamilyFreePass()) { bPayPlay = true; } else { - // ϴ zone üũ + // 일단 zone 요금 체크 string connectIP = pGamePlayer->getSocket()->getHost(); if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { @@ -59,25 +59,25 @@ bool ConditionEnterHolyLand::isSatisfied(Creature* pCreature1, Creature* pCreatu bPayPlay = true; #endif - // castle  ִ. + // 돈 낸 사람만 castle 에 들어갈 수 있다. if (bPayPlay) { - // ߿.. ο Ѵٸ.. + // 종족 전쟁 중에.. 전쟁 참가 인원 제한을 한다면.. if (g_pWarSystem->hasActiveRaceWar() && g_pVariableManager->isActiveRaceWarLimiter()) { Zone* pZone = getZoneByZoneID(m_TargetZoneID); Assert(pZone != NULL); - // ƴ  + // 아담의 성지에 들어갈때 if (!pZone->isHolyLand()) { return true; } PlayerCreature* pPC = dynamic_cast(pCreature2); - // ߾ Ѵ. + // 전쟁 참가를 했었어야 한다. return pPC->isFlag(Effect::EFFECT_CLASS_RACE_WAR_JOIN_TICKET); } - // ƴϸ ׳ . + // 전쟁 중 아니면 그냥 들어간다. return true; } diff --git a/src/server/gameserver/quest/ConditionEnterMasterLair.cpp b/src/server/gameserver/quest/ConditionEnterMasterLair.cpp index 648a4c77..4e19c8b6 100644 --- a/src/server/gameserver/quest/ConditionEnterMasterLair.cpp +++ b/src/server/gameserver/quest/ConditionEnterMasterLair.cpp @@ -40,12 +40,12 @@ bool ConditionEnterMasterLair::isSatisfied(Creature* pCreature1, Creature* pCrea Assert(pGamePlayer != NULL); #if defined(__PAY_SYSTEM_ZONE__) || defined(__PAY_SYSTEM_FREE_LIMIT__) - // ̹ ִ ... . - // йи + // 이미 유료존에 있는 경우라면... 관계없겠지. + // 패밀리 요금 적용중일 경우 if (pGamePlayer->isPayPlaying() || pGamePlayer->isFamilyFreePass()) { bPayPlay = true; } else { - // ϴ zone üũ + // 일단 zone 요금 체크 string connectIP = pGamePlayer->getSocket()->getHost(); if (pGamePlayer->loginPayPlay(connectIP, pGamePlayer->getID())) { @@ -57,13 +57,13 @@ bool ConditionEnterMasterLair::isSatisfied(Creature* pCreature1, Creature* pCrea bPayPlay = true; #endif - //   ִ. + // 돈 낸 사람만 마스터 레어에 들어갈 수 있다. if (bPayPlay) { - // ã´. + // 존을 찾는다. Zone* pZone = getZoneByZoneID(m_TargetZoneID); Assert(pZone != NULL); - //  ƴϸ üũ ʿ䰡 °Ŵ. + // 마스터 레어가 아니면 체크할 필요가 없는거다. if (!pZone->isMasterLair()) { return true; } @@ -72,7 +72,7 @@ bool ConditionEnterMasterLair::isSatisfied(Creature* pCreature1, Creature* pCrea Assert(pMasterLairManager != NULL); if (pMasterLairManager->enterCreature(pCreature2)) { - // + // 출입 가능 return true; } } diff --git a/src/server/gameserver/quest/ConditionEveryTime.cpp b/src/server/gameserver/quest/ConditionEveryTime.cpp index e3992367..e29c0286 100644 --- a/src/server/gameserver/quest/ConditionEveryTime.cpp +++ b/src/server/gameserver/quest/ConditionEveryTime.cpp @@ -19,7 +19,7 @@ bool ConditionEveryTime::isSatisfied(Creature* pCreature1, Creature* pCreature2, bool expired = pCreature1 != NULL && pCreature2 == NULL && currentTime > m_NextTurn; //////////////////////////////////////////////////////////////////////////////// - // ð ʰǾ, ð m_Turn ķ 缳Ѵ. + // 시간이 초과되었으면, 다음 실행시간을 m_Turn 이후로 재설정한다. //////////////////////////////////////////////////////////////////////////////// if (expired) { Timeval delay; diff --git a/src/server/gameserver/quest/ConditionEveryTime.h b/src/server/gameserver/quest/ConditionEveryTime.h index e8a20e75..c2bda6da 100644 --- a/src/server/gameserver/quest/ConditionEveryTime.h +++ b/src/server/gameserver/quest/ConditionEveryTime.h @@ -2,7 +2,7 @@ // Filename : ConditionEveryTime.h // Written By : // Description : -// ֱ⸶ Ư ׼ ϵ Ѵ. +// 매 주기마다 특정 액션을 실행하도록 한다. //////////////////////////////////////////////////////////////////////////////// #ifndef __EVERY_TIME_H__ @@ -49,9 +49,9 @@ class ConditionEveryTime : public Condition { private: Turn_t m_Turn; - // ð - // isSatisfied() const method , ο ؾ - // ϱ mutable ߴ. + // 다음 실행시간 + // isSatisfied() 가 const method 이지만, 내부에서 값을 변경해야 + // 하기 때문에 mutable 로 설정했다. mutable Timeval m_NextTurn; }; diff --git a/src/server/gameserver/quest/ConditionFlagOff.h b/src/server/gameserver/quest/ConditionFlagOff.h index 566c7309..4b5b026f 100644 --- a/src/server/gameserver/quest/ConditionFlagOff.h +++ b/src/server/gameserver/quest/ConditionFlagOff.h @@ -36,7 +36,7 @@ class ConditionFlagOff : public Condition { } private: - int m_Index; // ÷ + int m_Index; // 플래그의 값 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/quest/ConditionFlagOn.h b/src/server/gameserver/quest/ConditionFlagOn.h index f105ffd3..531fd7cf 100644 --- a/src/server/gameserver/quest/ConditionFlagOn.h +++ b/src/server/gameserver/quest/ConditionFlagOn.h @@ -36,7 +36,7 @@ class ConditionFlagOn : public Condition { } private: - int m_Index; // ÷ + int m_Index; // 플래그의 값 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/quest/ConditionHasEnoughCastleEntranceFee.h b/src/server/gameserver/quest/ConditionHasEnoughCastleEntranceFee.h index 0ccbd289..ccb2bba5 100644 --- a/src/server/gameserver/quest/ConditionHasEnoughCastleEntranceFee.h +++ b/src/server/gameserver/quest/ConditionHasEnoughCastleEntranceFee.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////////////////////////// // Filename : ConditionHasEnoughCastleEntranceFee.h // Written By : -// Description : . +// Description : 사용되지 않음. //////////////////////////////////////////////////////////////////////////////// #ifndef __HAS_ENOUGH_CASTLE_ENTRANCE_FEE_H__ diff --git a/src/server/gameserver/quest/ConditionIdle.h b/src/server/gameserver/quest/ConditionIdle.h index 0bfeb7b6..6d8d2e88 100644 --- a/src/server/gameserver/quest/ConditionIdle.h +++ b/src/server/gameserver/quest/ConditionIdle.h @@ -2,9 +2,9 @@ // Filename : ConditionIdle.h // Written By : // Description : -// NPC Ǵ Ͱ ҿ ϴ ȴ. -// ƹ , õ ׼ ȴ. -// Ʈ ġǾ Ѵ. +// NPC 또는 몬스터가 평소에 하는 행위를 지정할 때 사용된다. +// 아무런 사건이 없을 경우, 관련된 액션이 실행된다. +// 이 컨디션은 트리거의 가장 끝에 배치되어야 한다. ////////////////////////////////////////////////////////////////////////////// #ifndef __IDLE_H__ diff --git a/src/server/gameserver/quest/ConditionIsGuildMember.cpp b/src/server/gameserver/quest/ConditionIsGuildMember.cpp index 0ef050be..7cd8680b 100644 --- a/src/server/gameserver/quest/ConditionIsGuildMember.cpp +++ b/src/server/gameserver/quest/ConditionIsGuildMember.cpp @@ -19,7 +19,7 @@ bool ConditionIsGuildMember::isSatisfied(Creature* pCreature1, Creature* pCreatu PlayerCreature* pPC = dynamic_cast(pCreature2); - // ̸ ͼ ̴. + // 길드 이름을 가져와서 있으면 길드원이다. if (pPC->getGuildName().size() != 0) return true; diff --git a/src/server/gameserver/quest/ConditionNotGuildMember.cpp b/src/server/gameserver/quest/ConditionNotGuildMember.cpp index 366a94ae..8dd1dd81 100644 --- a/src/server/gameserver/quest/ConditionNotGuildMember.cpp +++ b/src/server/gameserver/quest/ConditionNotGuildMember.cpp @@ -19,7 +19,7 @@ bool ConditionNotGuildMember::isSatisfied(Creature* pCreature1, Creature* pCreat PlayerCreature* pPC = dynamic_cast(pCreature2); - // ̸ ͼ ƴϴ + // 길드 이름을 가져와서 없으면 길드원이 아니다 if (pPC->getGuildName().size() == 0) return true; diff --git a/src/server/gameserver/quest/ConditionPayPlay.cpp b/src/server/gameserver/quest/ConditionPayPlay.cpp index 69948d37..ef13c616 100644 --- a/src/server/gameserver/quest/ConditionPayPlay.cpp +++ b/src/server/gameserver/quest/ConditionPayPlay.cpp @@ -27,12 +27,12 @@ bool ConditionPayPlay::isSatisfied(Creature* pCreature1, Creature* pCreature2, v Assert(pGamePlayer != NULL); - // ̹ ִ ... . + // 이미 유료존에 있는 경우라면... 관계없겠지. if (pGamePlayer->isPayPlaying() || pGamePlayer->isFamilyFreePass()) { return true; } - // ϴ zone üũ + // 일단 zone 요금 체크 // return pGamePlayer->hasPayPlayFlag(PAY_PLAY_FLAG_ZONE) string connectIP = pGamePlayer->getSocket()->getHost(); diff --git a/src/server/gameserver/quest/ConditionRaceComp.h b/src/server/gameserver/quest/ConditionRaceComp.h index adb4fe6a..03a67933 100644 --- a/src/server/gameserver/quest/ConditionRaceComp.h +++ b/src/server/gameserver/quest/ConditionRaceComp.h @@ -28,7 +28,7 @@ class ConditionRaceComp : public Condition { virtual string toString() const; private: - Creature::CreatureClass m_CClass; // ũ Ŭ + Creature::CreatureClass m_CClass; // 크리쳐 클래스 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/quest/ConditionSiegeAttackerSide.cpp b/src/server/gameserver/quest/ConditionSiegeAttackerSide.cpp index 8aeddd11..48ea0c2a 100644 --- a/src/server/gameserver/quest/ConditionSiegeAttackerSide.cpp +++ b/src/server/gameserver/quest/ConditionSiegeAttackerSide.cpp @@ -26,7 +26,7 @@ bool ConditionSiegeAttackerSide::isSatisfied(Creature* pCreature1, Creature* pCr !pCreature2->isFlag(Effect::EFFECT_CLASS_SIEGE_ATTACKER_4) && !pCreature2->isFlag(Effect::EFFECT_CLASS_SIEGE_ATTACKER_5)) { /* GCSystemMessage gcSystemMessage; - gcSystemMessage.setMessage( " ֽϴ." ); + gcSystemMessage.setMessage( "수비측만 사용할 수 있습니다." ); pCreature2->getPlayer()->sendPacket (&gcSystemMessage);*/ return false; } diff --git a/src/server/gameserver/quest/ConditionSiegeDefenderSide.cpp b/src/server/gameserver/quest/ConditionSiegeDefenderSide.cpp index e751d82e..c01051cf 100644 --- a/src/server/gameserver/quest/ConditionSiegeDefenderSide.cpp +++ b/src/server/gameserver/quest/ConditionSiegeDefenderSide.cpp @@ -23,7 +23,7 @@ bool ConditionSiegeDefenderSide::isSatisfied(Creature* pCreature1, Creature* pCr if (!pCreature2->isFlag(Effect::EFFECT_CLASS_SIEGE_DEFENDER) && !pCreature2->isFlag(Effect::EFFECT_CLASS_SIEGE_REINFORCE)) { /* GCSystemMessage gcSystemMessage; - gcSystemMessage.setMessage( " ֽϴ." ); + gcSystemMessage.setMessage( "수비측만 사용할 수 있습니다." ); pCreature2->getPlayer()->sendPacket (&gcSystemMessage);*/ return false; } diff --git a/src/server/gameserver/quest/ConditionTalkedBy.h b/src/server/gameserver/quest/ConditionTalkedBy.h index fa2d13df..163bbcf3 100644 --- a/src/server/gameserver/quest/ConditionTalkedBy.h +++ b/src/server/gameserver/quest/ConditionTalkedBy.h @@ -2,7 +2,7 @@ // Filename : ConditionTalkedBy.h // Written By : // Description : -// NPC PCκ ȭ ޾ , Ư ƴ ɼ . +// NPC가 PC로부터 대화를 받았을 경우, 특별히 이 컨디션이 참이 아닐 가능성은 없다. ////////////////////////////////////////////////////////////////////////////// #ifndef __TALKED_BY_H__ diff --git a/src/server/gameserver/quest/PropertyBuffer.cpp b/src/server/gameserver/quest/PropertyBuffer.cpp index d4a65af5..f98bdd81 100644 --- a/src/server/gameserver/quest/PropertyBuffer.cpp +++ b/src/server/gameserver/quest/PropertyBuffer.cpp @@ -41,7 +41,7 @@ string PropertyBuffer::getProperty(string key) { while (m_Index < bufferLen) { string line = trim(getline(m_Buffer, m_Index)); - // Ǵ ڸƮ ƴ + // 빈 라인 또는 코멘트 라인이 아닌 경우 if (line.size() != 0 && line[0] != Comment) { size_t i = line.find(Separator); @@ -81,7 +81,7 @@ bool PropertyBuffer::getProperty(string key, string& value) { while (m_Index < bufferLen) { string line = trim(getline(m_Buffer, m_Index)); - // Ǵ ڸƮ ƴ + // 빈 라인 또는 코멘트 라인이 아닌 경우 if (line.size() != 0 && line[0] != Comment) { size_t i = line.find(Separator); diff --git a/src/server/gameserver/quest/PropertyBuffer.h b/src/server/gameserver/quest/PropertyBuffer.h index b7eaf5ef..9553dbd2 100644 --- a/src/server/gameserver/quest/PropertyBuffer.h +++ b/src/server/gameserver/quest/PropertyBuffer.h @@ -2,11 +2,11 @@ // Filename : PropertyBuffer.h // Written By : // Description : -// DB TEXT Condition/Action ʵ带 Ľش. -// Properties ٸ , Properties Ľؼ map -// ȯ , getProperty() ȣǸ value , -// PropertyBuffer ο ū Ʈ ۸ ΰ, getProperty() ȣ -// տ Ľ ѹ Ѵٴ ̴. +// DB에 TEXT 로 저장된 Condition/Action 필드를 파싱해준다. +// Properties 와 다른 점은, Properties 는 파일 내용을 모두 파싱해서 map 으로 +// 변환한 다음, getProperty() 가 호출되면 적절한 value 를 리턴하지만, +// PropertyBuffer 는 내부에 큰 스트링의 버퍼를 두고, getProperty()가 호출될 +// 때마다 버퍼의 앞에서부터 파싱을 한번씩 실행한다는 점이다. //////////////////////////////////////////////////////////////////////////////// #ifndef __PROPERTY_BUFFER_H__ diff --git a/src/server/gameserver/quest/Squest/MonsterKillQuest.cpp b/src/server/gameserver/quest/Squest/MonsterKillQuest.cpp index ba6c0aa8..d4ebc080 100644 --- a/src/server/gameserver/quest/Squest/MonsterKillQuest.cpp +++ b/src/server/gameserver/quest/Squest/MonsterKillQuest.cpp @@ -83,10 +83,10 @@ bool MonsterKillQuest::checkSuccess(const QuestEvent* pQuestEvent) throw(Error) dynamic_cast(pQuestEvent); if (*this == *pQuestEventMonsterKill) { - // δ. + // 한 마리 줄인다. decreaseNumber(); - // ׿.. Ϸ + // 다 죽였으면.. 완료 if (getNumber() == 0) { setState(STATE_COMPLETE); return true; @@ -135,7 +135,7 @@ Quest* MonsterKillQuestFactory::create(const QuestCreateInfo* qcInfo) const thro Assert(pQuest != NULL); // deadline - int availableMinute = (rand() % 6) * 10 + 10; // 10~60 + int availableMinute = (rand() % 6) * 10 + 10; // 10분~60분 int goldReward = (level + (60 - availableMinute) * 2) * 1000; int rankExpReward = (level + (60 - availableMinute) * 2) * 1000; @@ -148,7 +148,7 @@ Quest* MonsterKillQuestFactory::create(const QuestCreateInfo* qcInfo) const thro pQuest->addReward(pReward); pQuest->addPenalty(pPenalty); - pQuest->setAvailableSecond(availableMinute * 60); // ʷ + pQuest->setAvailableSecond(availableMinute * 60); // 분을 초로 return pQuest; @@ -202,23 +202,23 @@ string MonsterKillQuest::toString() const throw(Error) { StringStream msg; - msg << " ̱(" << getObjectiveToString() << "), " - << "(" << getRewardToString() << ") : " - << "(" << getPenaltyToString() << ")"; + msg << "몬스터 죽이기(" << getObjectiveToString() << "), " + << "성공(" << getRewardToString() << ") : " + << "실패(" << getPenaltyToString() << ")"; switch (getState()) { case Quest::STATE_NULL: case Quest::STATE_WAIT: { - msg << ", ð(" << (m_AvailableSecond / 60) << ")"; + msg << ", 수행시간(" << (m_AvailableSecond / 60) << ")분"; } break; case Quest::STATE_COMPLETE: case Quest::STATE_END: - msg << ", Ϸ"; + msg << ", 완료"; break; default: { - msg << ", ð(" << (getRemainDuration() / 600) << ")"; + msg << ", 남은시간(" << (getRemainDuration() / 600) << ")분"; } } diff --git a/src/server/gameserver/quest/Squest/MonsterKillQuest.h b/src/server/gameserver/quest/Squest/MonsterKillQuest.h index 5e4453db..567c3971 100644 --- a/src/server/gameserver/quest/Squest/MonsterKillQuest.h +++ b/src/server/gameserver/quest/Squest/MonsterKillQuest.h @@ -59,7 +59,7 @@ class MonsterKillQuestFactory : public QuestFactory { static void initMonsterTypeInfos(); private: - typedef vector MonsterTypeInfos; // + typedef vector MonsterTypeInfos; // 레벨에 따른 몬스터 종류 static MonsterTypeInfos m_MonsterTypeInfos; }; diff --git a/src/server/gameserver/quest/Squest/Quest.h b/src/server/gameserver/quest/Squest/Quest.h index 815031ec..bedf617d 100644 --- a/src/server/gameserver/quest/Squest/Quest.h +++ b/src/server/gameserver/quest/Squest/Quest.h @@ -23,8 +23,8 @@ // // //-------------------------------------------------------------------------------- -// QuestID ܼ Questп̴. -// Thread Safe ʰ, ȭ ʴ´. +// QuestID는 단순한 각 Quest구분용이다. +// Thread Safe하지 않고, 서버간에도 동기화되지 않는다. //-------------------------------------------------------------------------------- #ifndef __QUEST_H__ @@ -49,10 +49,10 @@ class Quest { enum QuestState { STATE_NULL, - STATE_WAIT, // QuestBoard ޾ư⸦ ٸ - STATE_ACTIVE, // Quest ޾Ƽ - STATE_COMPLETE, // Quest Ϸ (Reward ޱ ) - STATE_END // Quest + STATE_WAIT, // QuestBoard에서 누군가가 받아가기를 기다리는 상태 + STATE_ACTIVE, // 누가 Quest를 받아서 진행중인 상태 + STATE_COMPLETE, // Quest가 완료된 상태(Reward 받기 전) + STATE_END // Quest가 끝난 상태 }; public: diff --git a/src/server/gameserver/quest/Squest/QuestBoard.cpp b/src/server/gameserver/quest/Squest/QuestBoard.cpp index 4630a96d..90d4b4b2 100644 --- a/src/server/gameserver/quest/Squest/QuestBoard.cpp +++ b/src/server/gameserver/quest/Squest/QuestBoard.cpp @@ -90,8 +90,8 @@ void QuestBoard::regenerate(int num) throw(Error) { //-------------------------------------------------------------------------------- // add( pQuest ) //-------------------------------------------------------------------------------- -// questID ߰Ѵ. -// ID duplicate return false +// questID를 추가한다. +// ID가 duplicate인 경우는 return false //-------------------------------------------------------------------------------- bool QuestBoard::add(Quest* pQuest) throw(Error) { __BEGIN_TRY @@ -114,8 +114,8 @@ bool QuestBoard::add(Quest* pQuest) throw(Error) { //-------------------------------------------------------------------------------- // remove( questID ) //-------------------------------------------------------------------------------- -// questID Quest* ãƼ returnѴ. -// NULL +// questID의 Quest*를 찾아서 return한다. +// 없으면 NULL //-------------------------------------------------------------------------------- Quest* QuestBoard::remove(QuestID_t qid) throw(Error) { __BEGIN_TRY @@ -137,7 +137,7 @@ Quest* QuestBoard::remove(QuestID_t qid) throw(Error) { //-------------------------------------------------------------------------------- // makeNPCAskPacket( GCNPCAskDynamic& ) //-------------------------------------------------------------------------------- -// QuestBoard ִ Quest GCNPCAskDynamic packet . +// QuestBoard에 들어있는 모든 Quest들의 내용을 GCNPCAskDynamic packet으로 만든다. //-------------------------------------------------------------------------------- void QuestBoard::setScript(Script* pScript) const throw(Error) { __BEGIN_TRY @@ -162,7 +162,7 @@ void QuestBoard::setScript(Script* pScript) const throw(Error) { //-------------------------------------------------------------------------------- // makeNPCAskPacket( GCNPCAskDynamic& ) //-------------------------------------------------------------------------------- -// QuestBoard ִ Quest GCNPCAskDynamic packet . +// QuestBoard에 들어있는 모든 Quest들의 내용을 GCNPCAskDynamic packet으로 만든다. //-------------------------------------------------------------------------------- /* void diff --git a/src/server/gameserver/quest/Squest/QuestPricePenalty.cpp b/src/server/gameserver/quest/Squest/QuestPricePenalty.cpp index e206e8bf..75bac4e2 100644 --- a/src/server/gameserver/quest/Squest/QuestPricePenalty.cpp +++ b/src/server/gameserver/quest/Squest/QuestPricePenalty.cpp @@ -15,13 +15,13 @@ void QuestPricePenalty::affect(Creature* pCreature) throw(Error) { if (pCreature == NULL) return; - // pCreature gold - // pCreature rankExp - // pCreature fame + // pCreature의 gold감소 + // pCreature의 rankExp감소 + // pCreature의 fame감소 cout << "[Penalty to " << pCreature->getName().c_str() << "] " << "Gold=" << (int)getGold() << ", RankExp=" << (int)getRankExp() << ", Fame=" << (int)getFame() << endl; - // ȭ DB + // 변화된 값들을 DB에 저장 __END_CATCH } diff --git a/src/server/gameserver/quest/Squest/QuestPriceReward.cpp b/src/server/gameserver/quest/Squest/QuestPriceReward.cpp index 5f841074..ce4d0829 100644 --- a/src/server/gameserver/quest/Squest/QuestPriceReward.cpp +++ b/src/server/gameserver/quest/Squest/QuestPriceReward.cpp @@ -15,13 +15,13 @@ void QuestPriceReward::affect(Creature* pCreature) throw(Error) { if (pCreature == NULL) return; - // pCreature gold - // pCreature rankExp - // pCreature fame + // pCreature의 gold증가 + // pCreature의 rankExp증가 + // pCreature의 fame증가 cout << "[Reward to " << pCreature->getName().c_str() << "] " << "Gold=" << (int)getGold() << ", RankExp=" << (int)getRankExp() << ", Fame=" << (int)getFame() << endl; - // ȭ DB + // 변화된 값들을 DB에 저장 __END_CATCH } diff --git a/src/server/gameserver/quest/Squest/SimpleQuest.cpp b/src/server/gameserver/quest/Squest/SimpleQuest.cpp index cac151de..a89b4ff4 100644 --- a/src/server/gameserver/quest/Squest/SimpleQuest.cpp +++ b/src/server/gameserver/quest/Squest/SimpleQuest.cpp @@ -35,18 +35,18 @@ SimpleQuest::~SimpleQuest() throw(Error) { void SimpleQuest::setDeadline(Turn_t delay) throw() { __BEGIN_TRY - // ð Ѵ. + // 현재 시간을 측정한다. getCurrentTime(m_Deadline); - // Ѵ. - // ̶, delay 0.1 ʰ 1 ̴. + // 데드라인을 결정한다. + // 이때, delay 는 0.1 초가 1 이다. m_Deadline.tv_sec += delay / 10; m_Deadline.tv_usec += (delay % 10) * 100000; __END_CATCH } -// duration(1/10 ) +// 남은 duration(1/10초 단위) Duration_t SimpleQuest::getRemainDuration() const throw() { __BEGIN_TRY @@ -152,7 +152,7 @@ void SimpleQuest::take(Creature* pCreature, bool bNewQuest) throw(Error) { setOwner(pCreature); - // ó Ʈ 츸.. ð DB Ѵ + // 처음 받은 퀘스트인 경우만.. 시간 설정과 DB생성을 한다 if (bNewQuest) { getCurrentTime(m_Deadline); m_Deadline.tv_sec += m_AvailableSecond; diff --git a/src/server/gameserver/quest/Squest/SimpleQuest.h b/src/server/gameserver/quest/Squest/SimpleQuest.h index 910dc4bd..995502c3 100644 --- a/src/server/gameserver/quest/Squest/SimpleQuest.h +++ b/src/server/gameserver/quest/Squest/SimpleQuest.h @@ -24,14 +24,14 @@ // //-------------------------------------------------------------------------------- // -// ϴ Quest gameserver󿡼 ȴ. -// ׷ٰ. Quest , DB Ѵ. -// Quest ̹ Quest ޱ üũDZ -// DB ʿ䰡 . +// 일단 Quest는 gameserver상에서만 생성된다. +// 그러다가. 누가 Quest를 받으면, DB에 생성한다. +// Quest받을 조건은 이미 Quest를 받기 이전에 체크되기 때문에 +// DB에 저장할 필요가 없다. // // DB table: < SimpleQuest > // -// pOwner varchar, // Ʈ +// pOwner varchar, // 이 퀘스트를 받은 사람 // QuestType int, // Objective text, // Bonus text, diff --git a/src/server/gameserver/quest/Squest/SimpleQuestLoader.cpp b/src/server/gameserver/quest/Squest/SimpleQuestLoader.cpp index 93980164..60cb05e1 100644 --- a/src/server/gameserver/quest/Squest/SimpleQuestLoader.cpp +++ b/src/server/gameserver/quest/Squest/SimpleQuestLoader.cpp @@ -19,7 +19,7 @@ void SimpleQuestLoader::load(Creature* pCreature) throw(Error) { Assert(pCreature->isPC()); PlayerCreature* pPC = dynamic_cast(pCreature); - // quest ٽ loadѴ. + // 기존의 quest를 다 지우고 다시 load한다. pPC->removeAllQuest(); Statement* pStmt = NULL; @@ -53,14 +53,14 @@ void SimpleQuestLoader::load(Creature* pCreature) throw(Error) { int DayTime = pResult->getDWORD(++i); - // deadline üũ + // deadline 체크 if (currentTime.tv_sec < DayTime) { pSimpleQuest->setDeadline((DayTime - currentTime.tv_sec) * 10); } else { pSimpleQuest->setDeadline(0); } - // Creature QuestManager ߰Ѵ. + // Creature의 QuestManager에 추가한다. pSimpleQuest->take(pCreature, false); pPC->addQuest(pSimpleQuest); diff --git a/src/server/gameserver/quest/Trigger.h b/src/server/gameserver/quest/Trigger.h index 5d0ac6fa..0238ef07 100644 --- a/src/server/gameserver/quest/Trigger.h +++ b/src/server/gameserver/quest/Trigger.h @@ -104,14 +104,14 @@ class Trigger { private: - // Ʈ Ÿ + // 트리거 타입 TriggerType m_TriggerType; - // Ʈ ̵ + // 트리거 아이디 TriggerID_t m_TriggerID; - // Ǵ Ʈ ̵ - // m_TriggerType == QUEST_TRIGGER 쿡 ǹ̰ ִ. + // 연관되는 퀘스트 아이디 + // m_TriggerType == QUEST_TRIGGER 일 경우에만 의미가 있다. QuestID_t m_QuestID; // bitset of conditions for fastest reference diff --git a/src/server/gameserver/quest/TriggerManager.h b/src/server/gameserver/quest/TriggerManager.h index 06f0fa5f..84b9b43c 100644 --- a/src/server/gameserver/quest/TriggerManager.h +++ b/src/server/gameserver/quest/TriggerManager.h @@ -2,8 +2,8 @@ // Filename : TriggerManager.h // Written By : // Description : -// Ʈŵ ϴ Ŭ. ũó// ƮŸ -// ִ ü鿡 ӵȴ. +// 트리거들의 집합을 관리하는 클래스. 크리처/아이템/존 등 트리거를 가질 +// 수 있는 객체들에 종속된다. ////////////////////////////////////////////////////////////////////////////// #ifndef __TRIGGER_MANAGER_H__ @@ -52,7 +52,7 @@ class TriggerManager { ConditionSet m_ConditionSet; // list of triggers - // Ÿӿ ƮŰ ߰ ɼ ִ. + // 런타임에 트리거가 추가될 가능성이 있다. list m_Triggers; }; diff --git a/src/server/gameserver/quest/VariableBuffer.cpp b/src/server/gameserver/quest/VariableBuffer.cpp index a1803c4f..0eb85d20 100644 --- a/src/server/gameserver/quest/VariableBuffer.cpp +++ b/src/server/gameserver/quest/VariableBuffer.cpp @@ -67,7 +67,7 @@ void VariableBuffer::parse() do { size_t j = subStr.find_first_of(Separator, i); - // separator ٸ Variable ̴. + // separator 가 없다면 마지막 Variable 이다. if (j == string::npos) { j = subStr.size(); bEnd = true; diff --git a/src/server/gameserver/quest/VariableInfo.cpp b/src/server/gameserver/quest/VariableInfo.cpp index 55b7c7d2..26660d04 100644 --- a/src/server/gameserver/quest/VariableInfo.cpp +++ b/src/server/gameserver/quest/VariableInfo.cpp @@ -61,7 +61,7 @@ void VariableInfo::parse() do { j = parameters.find_first_of(ParamSeperator, i); - // seperator ٸ ̴. + // seperator 가 없다면 마지막 값이다. if (j == string::npos) { j = parameters.size(); bEnd = true; diff --git a/src/server/gameserver/quest/luaScript/LuaSelectItem.cpp b/src/server/gameserver/quest/luaScript/LuaSelectItem.cpp index 828e562b..8045d46d 100644 --- a/src/server/gameserver/quest/luaScript/LuaSelectItem.cpp +++ b/src/server/gameserver/quest/luaScript/LuaSelectItem.cpp @@ -16,7 +16,7 @@ int LuaSelectItem::executeFile(const string& filename) lua_getglobal(m_pState->getState(), "ItemClass"); lua_getglobal(m_pState->getState(), "ItemType"); lua_getglobal(m_pState->getState(), "OptionType"); - lua_getglobal(m_pState->getState(), "OptionType2"); // -_-; Ѱ ߰Ǹ list ٲ~ + lua_getglobal(m_pState->getState(), "OptionType2"); // -_-; 한개 더 추가되면 list로 바꾸자~ m_ItemClass = (Item::ItemClass)lua_tonumber(m_pState->getState(), 1); m_ItemType = (ItemType_t)lua_tonumber(m_pState->getState(), 2); diff --git a/src/server/gameserver/skill/ARAttack.cpp b/src/server/gameserver/skill/ARAttack.cpp index 8a48c1c9..b51dfa81 100644 --- a/src/server/gameserver/skill/ARAttack.cpp +++ b/src/server/gameserver/skill/ARAttack.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ARAttack::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/Aberration.cpp b/src/server/gameserver/skill/Aberration.cpp index bd57ff3a..6a1e9675 100644 --- a/src/server/gameserver/skill/Aberration.cpp +++ b/src/server/gameserver/skill/Aberration.cpp @@ -19,7 +19,7 @@ #include "Reflection.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Aberration::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -41,8 +41,8 @@ void Aberration::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_CURSE) || pTargetCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_HALLUCINATION) || pTargetCreature->isNPC()) { @@ -85,13 +85,13 @@ void Aberration::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk SkillOutput output; computeOutput(input, output); - // pTargetCreature ָ ݻϴ + // pTargetCreature가 저주마법을 반사하는 경우 if (CheckReflection(pVampire, pTargetCreature, getSkillType())) { pTargetCreature = (Creature*)pVampire; TargetObjectID = pVampire->getObjectID(); } - // Ʈ Ʈ δ. + // 이펙트 오브젝트를 생성해 붙인다. EffectAberration* pEffect = new EffectAberration(pTargetCreature); pEffect->setDeadline(output.Duration); pEffect->setRatio(output.Range); @@ -124,10 +124,10 @@ void Aberration::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk _GCSkillToObjectOK6.setSkillType(SkillType); _GCSkillToObjectOK6.setDuration(output.Duration); - if (bCanSeeCaster) // 10 ġ. + if (bCanSeeCaster) // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); - } else // 10 ġ. + } else // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK6, &_GCSkillToObjectOK1); } diff --git a/src/server/gameserver/skill/AbsorbSoul.cpp b/src/server/gameserver/skill/AbsorbSoul.cpp index 1fe3e9aa..2e170542 100644 --- a/src/server/gameserver/skill/AbsorbSoul.cpp +++ b/src/server/gameserver/skill/AbsorbSoul.cpp @@ -22,13 +22,13 @@ #include "item/Pupa.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺ͽ Ʈ ڵ鷯 +// 아우스터스 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// -// ų 2 ȴ. -// ⿡ ϳ ϰ -// ϳ. -// ׷ ó üũϴٰ 쿡 -// SkillFail Ŷ 2 ش. +// 스킬의 결과를 2번 날려줘야 된다. +// 라바 만들기에 대한 것 하나 하고 +// 흡영에 관한 것 하나. +// 그래서 처음에 조건 체크하다가 실패할 경우에 +// SkillFail 패킷을 2번 보내준다. // /////////////////////////////////////////////////////////////////////////// void AbsorbSoul::execute(Ousters* pOusters, ObjectID_t TargetObjectID, ZoneCoord_t TargetZoneX, ZoneCoord_t TargetZoneY, ObjectID_t ItemObjectID, CoordInven_t InvenX, CoordInven_t InvenY, CoordInven_t TargetInvenX, @@ -38,7 +38,7 @@ void AbsorbSoul::execute(Ousters* pOusters, ObjectID_t TargetObjectID, ZoneCoord __BEGIN_TRY Assert(pOusters != NULL); - // Ŭ̾Ʈ ɷ Ŷ 2 ȴ. + // 클라이언트에 락이 걸려있으면 검증 패킷을 2번 보내줘야 된다. bool bClientLocked = InvenX != 255; try { @@ -47,7 +47,7 @@ void AbsorbSoul::execute(Ousters* pOusters, ObjectID_t TargetObjectID, ZoneCoord Assert(pPlayer != NULL); Assert(pZone != NULL); - // ü Creature ְ Item ִ.. + // 죽은 시체가 Creature 일 수도 있고 Item 일 수도 있다.. Item* pTargetItem = pZone->getItem(TargetObjectID); Creature* pTargetCreature = NULL; @@ -59,9 +59,9 @@ void AbsorbSoul::execute(Ousters* pOusters, ObjectID_t TargetObjectID, ZoneCoord executeAbsorbSoulSkillFail(pOusters, getSkillType(), TargetObjectID, false, bClientLocked); return; } - // NPC . - // üũ. by sigi.2002.9.5 - // ִ . by Sequoia.2003. 3. 20 + // NPC는 공격할 수가 없다. + // 무적상태 체크. by sigi.2002.9.5 + // 안 죽은 애는 영 빨 수 없다. by Sequoia.2003. 3. 20 if (pTargetCreature != NULL) { if (pTargetCreature->isNPC() || !canAttack(pOusters, pTargetCreature) || !pTargetCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { @@ -93,7 +93,7 @@ void AbsorbSoul::execute(Ousters* pOusters, ObjectID_t TargetObjectID, ZoneCoord // bool bRangeCheck = verifyDistance(pOusters, pTargetCreature, 2); - // Ÿ ü ( ü Creature ) + // 타 종족의 시체에 흡영을 한 경우 (아직 시체가 Creature 인 경우) if (pTargetCreature != NULL) //&& bRangeCheck) { int targetLevel = 0; @@ -111,18 +111,18 @@ void AbsorbSoul::execute(Ousters* pOusters, ObjectID_t TargetObjectID, ZoneCoord targetLevel = pMonster->getLevel(); } - // Ǫ ⿡ ó Ǿ Ѵ. - // ٸ Ǫķ Ѵ - // Լ ؿ - // SkillOK ۿ ó Ŷ Ѵ. !!! + // 푸파 만들기에 대한 처리가 먼저 되어야 한다. + // 라바를 푸파로 만들어줘야 한다 + // 따로 함수로 때서 밑에서 구현 할 것임 + // SkillOK를 보내기 전에 아이템에 대한 처리 패킷을 먼저 보내야 한다. 반!드!시! if (InvenX != 255) makeLarvaToPupa(pOusters, targetLevel, ItemObjectID, InvenX, InvenY, TargetInvenX, TargetInvenY); - // ġ?? - ߿ ?? + // 흡영에 대한 경험치는?? - 나중에 수정 ?? // Exp_t Exp = computeCreatureExp(pTargetCreature, BLOODDRAIN_EXP); - // ϰ Ǹ EP ö󰣴. - // ö󰡴 Creature Exp Ѵ. + // 흡영을 하게 되면 흡영한 사람의 EP가 올라간다. + // 올라가는 양은 Creature Exp에 비례한다. MP_t CurrentMP = pOusters->getMP(); MP_t MaxMP = pOusters->getMP(ATTR_MAX); MP_t HealPoint = 0; @@ -141,7 +141,7 @@ void AbsorbSoul::execute(Ousters* pOusters, ObjectID_t TargetObjectID, ZoneCoord MP_t NewMP = min((int)MaxMP * 3, (int)CurrentMP + (int)HealPoint); // cout << NewMP << endl; - // ƿ콺 MP Ѵ. + // 아우스터즈의 MP를 세팅한다. pOusters->setMP(NewMP); // cout << pOusters->getMP(ATTR_CURRENT) << endl; @@ -190,8 +190,8 @@ void AbsorbSoul::execute(Ousters* pOusters, ObjectID_t TargetObjectID, ZoneCoord cList.push_back(pOusters); pZone->broadcastPacket(pOusters->getX(), pOusters->getY(), &_GCSkillToTileOK5, cList); - // -_- Ŀ ϰ ƾ ǰ - // Ŀ Ȱ ǵ ƾ + // 아음 -_- 흡영 당한 후에 또 흡영 못하게 막아야 되고 + // 흡영 당한 후에 부활 안 되도록 막아야함 pTargetCreature->setFlag(Effect::EFFECT_CLASS_CANNOT_ABSORB_SOUL); pOusters->getGQuestManager()->blooddrain(); @@ -221,16 +221,16 @@ void AbsorbSoul::execute(Ousters* pOusters, ObjectID_t TargetObjectID, ZoneCoord return; } - // Ǫ ⿡ ó Ǿ Ѵ. - // ٸ Ǫķ Ѵ - // Լ ؿ - // SkillOK ۿ ó Ŷ Ѵ. !!! + // 푸파 만들기에 대한 처리가 먼저 되어야 한다. + // 라바를 푸파로 만들어줘야 한다 + // 따로 함수로 때서 밑에서 구현 할 것임 + // SkillOK를 보내기 전에 아이템에 대한 처리 패킷을 먼저 보내야 한다. 반!드!시! if (bClientLocked) makeLarvaToPupa(pOusters, targetLevel, ItemObjectID, InvenX, InvenY, TargetInvenX, TargetInvenY); - // ϰ Ǹ SP ö󰣴. - // ̰  ߿ ߵɵ - // HealPoint == Exp -_- + // 흡영을 하게 되면 흡영한 사람의 SP가 올라간다. + // 이거 어떻게 될지 나중에 더 봐야될듯 + // HealPoint == Exp 임 -_- // MP_t HealPoint = Exp; MP_t CurrentMP = pOusters->getMP(); MP_t MaxMP = pOusters->getMP(ATTR_MAX); @@ -252,7 +252,7 @@ void AbsorbSoul::execute(Ousters* pOusters, ObjectID_t TargetObjectID, ZoneCoord MP_t NewMP = min((int)MaxMP * 3, (int)CurrentMP + (int)HealPoint); // cout << NewMP << endl; - // ƿ콺 MP Ѵ. + // 아우스터즈의 MP를 세팅한다. pOusters->setMP(NewMP); // cout << pOusters->getMP(ATTR_CURRENT) << endl; @@ -284,7 +284,7 @@ void AbsorbSoul::execute(Ousters* pOusters, ObjectID_t TargetObjectID, ZoneCoord cList.push_back(pOusters); pZone->broadcastPacket(pOusters->getX(), pOusters->getY(), &_GCSkillToTileOK5, cList); - // -_- Ŀ ϰ ƾ + // 아음 -_- 흡영 당한 후에 또 흡영 못하게 막아야 됨 pTargetItem->setFlag(Effect::EFFECT_CLASS_CANNOT_ABSORB_SOUL); pOusters->getGQuestManager()->blooddrain(); @@ -324,46 +324,46 @@ void AbsorbSoul::makeLarvaToPupa(Ousters* pOusters, int TargetLevel, ObjectID_t ItemType_t LarvaType = pLarva->getItemType(); // int ratio = ( 100 * TargetLevel ) / ( (pOusters->getLevel() * 2) * ( pLarva->getItemType() + 1 ) ); - // Ȯ 4 + // 확률 4배로 증가 int ratio = (200 * TargetLevel) / (pOusters->getLevel() * (pLarva->getItemType() + 1)); - // Ǫ + // 푸파 만들기 실패 if ((rand() % 100) > ratio) { executeSkillFailException(pOusters, getSkillType()); return; } - // Ȯ Ѿ -_- Ǫĸ  + // 확률은 넘었으니 -_- 푸파를 만들어볼까 list optionNULL; Item* pPupa = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_PUPA, pLarva->getItemType(), optionNULL); - // ٿش. - // Լ ȿ ڵ ϳ پ, - // 1 ٿٸ κ丮 DB ǰ ȴ. + // 라바의 갯수를 줄여준다. + // 이 함수 안에서 라바의 갯수가 자동적으로 하나 줄어들고, + // 만일 1개인 라바였다면 인벤토리 및 DB에서 삭제되게 된다. decreaseItemNum(pLarva, pInventory, pOusters->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); - // Ǫĸ ´. + // 기존의 푸파를 가져온다. Item* pPrevPupa = pInventory->getItem(TargetInvenX, TargetInvenY); GCSkillToInventoryOK1 gcSkillToInventoryOK1; if (pPrevPupa != NULL) { - // Ǫİ ִٸ + // 기존에 더할 푸파가 있다면 if (!canStack(pPrevPupa, pPupa) || pPrevPupa->getNum() >= ItemMaxStack[(int)pPrevPupa->getItemClass()]) { executeSkillFailException(pOusters, getSkillType()); return; } - // ϳ Ű Ѵ. + // 갯수를 하나 증가시키고 저장한다. pPrevPupa->setNum(pPrevPupa->getNum() + 1); pPrevPupa->save(pOusters->getName(), STORAGE_INVENTORY, 0, TargetInvenX, TargetInvenY); - // κ decreaseItemNum() Լ κп ڸ ҽŰǷ, - // ⼭ ٽ κ丮 ڸ Ų. + // 위부분의 decreaseItemNum() 함수 부분에서 아이템 숫자를 감소시키므로, + // 여기서 다시 인벤토리의 아이템 숫자를 증가시킨다. pInventory->increaseNum(); - // ǪĴ ǪĿ Ƿ Ѵ. + // 만들어진 푸파는 기존의 푸파에 더해졌으므로 삭제한다. SAFE_DELETE(pPupa); gcSkillToInventoryOK1.setObjectID(pPrevPupa->getObjectID()); @@ -371,7 +371,7 @@ void AbsorbSoul::makeLarvaToPupa(Ousters* pOusters, int TargetLevel, ObjectID_t ObjectRegistry& OR = pZone->getObjectRegistry(); OR.registerObject(pPupa); - // Ǫĸ Inventory ְ DBٰ Ѵ. + // 푸파를 Inventory 에 집어넣고 DB에다가 생성한다. pInventory->addItem(TargetInvenX, TargetInvenY, pPupa); pPupa->create(pOusters->getName(), STORAGE_INVENTORY, 0, TargetInvenX, TargetInvenY); diff --git a/src/server/gameserver/skill/AcidBall.cpp b/src/server/gameserver/skill/AcidBall.cpp index 0753f0b7..74f19a4b 100644 --- a/src/server/gameserver/skill/AcidBall.cpp +++ b/src/server/gameserver/skill/AcidBall.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void AcidBall::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -38,7 +38,7 @@ void AcidBall::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil SIMPLE_SKILL_OUTPUT result; - // Knowledge of Acid ִٸ hit bonus 10 + // Knowledge of Acid 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_ACID)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_ACID); @@ -55,7 +55,7 @@ void AcidBall::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void AcidBall::execute(Monster* pMonster, Creature* pEnemy) @@ -82,13 +82,13 @@ void AcidBall::execute(Monster* pMonster, Creature* pEnemy) SIMPLE_SKILL_OUTPUT result; - // ʹ Ѵ. + // 마스터는 여러마리 공격한다. if (0) // pMonster->isMaster()) { int x = pMonster->getX(); int y = pMonster->getY(); - int Splash = 3 + rand() % 5; // 3~7 + int Splash = 3 + rand() % 5; // 3~7 마리 int range = 2; // 5x5 list creatureList; getSplashVictims(pMonster->getZone(), x, y, Creature::CREATURE_CLASS_MAX, creatureList, Splash, range); diff --git a/src/server/gameserver/skill/AcidBolt.cpp b/src/server/gameserver/skill/AcidBolt.cpp index 3841bb38..7a71e6b8 100644 --- a/src/server/gameserver/skill/AcidBolt.cpp +++ b/src/server/gameserver/skill/AcidBolt.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void AcidBolt::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -38,7 +38,7 @@ void AcidBolt::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil SIMPLE_SKILL_OUTPUT result; - // Knowledge of Acid ִٸ hit bonus 10 + // Knowledge of Acid 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_ACID)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_ACID); @@ -55,7 +55,7 @@ void AcidBolt::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void AcidBolt::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/AcidEruption.cpp b/src/server/gameserver/skill/AcidEruption.cpp index 4836157d..9fb2dfe9 100644 --- a/src/server/gameserver/skill/AcidEruption.cpp +++ b/src/server/gameserver/skill/AcidEruption.cpp @@ -16,7 +16,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void AcidEruption::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -36,7 +36,7 @@ void AcidEruption::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire Creature* pTargetCreature = pZone->getCreature(TargetObjectID); SkillType_t SkillType = pVampireSkillSlot->getSkillType(); - // NPC . + // NPC는 공격할 수가 없다. if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, SkillType); return; @@ -152,7 +152,7 @@ void AcidEruption::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void AcidEruption::execute(Monster* pMonster, Creature* pEnemy) @@ -193,7 +193,7 @@ void AcidEruption::execute(Monster* pMonster, Creature* pEnemy) Damage_t Damage = computeMagicDamage(pEnemy, output.Damage, SkillType); - // Ʈ Ʈ ؼ δ. + // 이펙트 오브젝트를 생성해서 붙인다. EffectAcidEruption* pEffectAcidEruption = new EffectAcidEruption(pEnemy); pEffectAcidEruption->setDamage(Damage); pEffectAcidEruption->setTick(5); @@ -203,7 +203,7 @@ void AcidEruption::execute(Monster* pMonster, Creature* pEnemy) pEnemy->addEffect(pEffectAcidEruption); pEnemy->setFlag(pEffectAcidEruption->getEffectClass()); - // Ʈ پ, پٰ εijش. + // 이펙트가 붙었으니, 붙었다고 브로드캐스팅해준다. /* GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pEnemy->getObjectID()); gcAddEffect.setEffectID(pEffectAcidEruption->getSendEffectClass()); diff --git a/src/server/gameserver/skill/AcidStorm.cpp b/src/server/gameserver/skill/AcidStorm.cpp index 7405a3b0..62d8693f 100644 --- a/src/server/gameserver/skill/AcidStorm.cpp +++ b/src/server/gameserver/skill/AcidStorm.cpp @@ -18,7 +18,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void AcidStorm::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -39,7 +39,7 @@ void AcidStorm::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSki Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); @@ -58,7 +58,7 @@ void AcidStorm::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSki } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void AcidStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -88,7 +88,7 @@ void AcidStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire ZoneCoord_t myX = pVampire->getX(); ZoneCoord_t myY = pVampire->getY(); - // Knowledge of Acid ִٸ hit bonus 10 + // Knowledge of Acid 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_ACID)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_ACID); @@ -122,7 +122,7 @@ void AcidStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire SkillOutput output; computeOutput(input, output); - // Disruption Storm ִٸ 20% + // Disruption Storm 이 있다면 데미지 20% 증가 if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_DISRUPTION_STORM)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_DISRUPTION_STORM); Assert(pRankBonus != NULL); @@ -132,7 +132,7 @@ void AcidStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire Range_t Range = 3; - // Ʈ ŸϿ ִٸ Ѵ. + // 기존에 같은 이펙트가 타일에 있다면 지우고 새로 설정한다. Tile& tile = pZone->getTile(X, Y); Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_ACID_STORM); @@ -141,7 +141,7 @@ void AcidStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire pZone->deleteEffect(effectID); } - // Ʈ Ʈ ؼ ŸϿ δ. + // 이펙트 오브젝트를 생성해서 타일에 붙인다. // cout << "make EffectObject to Tile" << X << " " << Y << endl; EffectAcidStorm* pEffect = new EffectAcidStorm(pZone, X, Y); pEffect->setDeadline(output.Duration); @@ -162,9 +162,9 @@ void AcidStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire tile.addEffect(pEffect); - // Ʈ Creature effect ٿش. - // Vampire VampireԴ - // ش ʴ´. + // 이펙트 범위내의 모든 Creature에게 effect를 붙여준다. + // Vampire가 기술을 사용한 경우 같은 Vampire에게는 + // 해당하지 않는다. bool bEffected = false; Creature* pTargetCreature; @@ -175,7 +175,7 @@ void AcidStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire int oX, oY; int edge = 1; - // Wide Storm ִٸ 5*5 + // Wide Storm 이 있다면 범위가 5*5 로 수정 if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_WIDE_STORM)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_WIDE_STORM); Assert(pRankBonus != NULL); @@ -224,7 +224,7 @@ void AcidStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire cList.push_back(pTargetCreature); if (bCanSee) { - // + // 공격을 당한 사람에게 _GCSkillToTileOK2.setObjectID(pVampire->getObjectID()); _GCSkillToTileOK2.setSkillType(SkillType); _GCSkillToTileOK2.setX(X); @@ -242,14 +242,14 @@ void AcidStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pVampire); - // ְ ̾ Ѵ. by sigi. 2002.6.21 + // 마지막 때린 애가 뱀파이어라고 설정한다. by sigi. 2002.6.21 pMonster->setLastHitCreatureClass(Creature::CREATURE_CLASS_VAMPIRE); } } } // if(pTargetCreature!= NULL) } - // 鿡 + // 기술을 사용한 사람들에게 _GCSkillToTileOK1.setSkillType(SkillType); _GCSkillToTileOK1.setCEffectID(CEffectID); _GCSkillToTileOK1.setX(X); @@ -257,21 +257,21 @@ void AcidStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire _GCSkillToTileOK1.setDuration(output.Duration); _GCSkillToTileOK1.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(X); _GCSkillToTileOK3.setY(Y); //_GCSkillToTileOK3.setDuration(output.Duration); //_GCSkillToTileOK3.setRange(Range); - // ִ 鿡 + // 기술을 당한 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람과 당한 사람을 모두 볼 수 있는 사람들에게 _GCSkillToTileOK5.setObjectID(pVampire->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); @@ -279,21 +279,21 @@ void AcidStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); - // packet + // 기술을 사용한 사람에게 packet 전달 pPlayer->sendPacket(&_GCSkillToTileOK1); - // ִ 鿡 broadcasing - // broadcasting 5OK Ѵ. - // ⿡ ϵ broadcasting ܵȴ. + // 기술을 쓸 사람과 당한 사람을 모두 볼 수 있는 사람들에게 broadcasing + // broadcasting후 5번OK를 받은 사람을 기록한다. + // 여기에 기록된 사람은 차후 broadcasting에서 제외된다. cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); - // ִ 鿡 broadcasting + // 기술을 쓴 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); - // ִ 鿡 broadcasting + // 기술을 당한 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); - // delay setting + // 기술 delay setting pVampireSkillSlot->setRunTime(output.Delay); } else { executeSkillFailNormal(pVampire, getSkillType(), NULL); @@ -308,7 +308,7 @@ void AcidStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void AcidStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -356,7 +356,7 @@ void AcidStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) Range_t Range = 3; - // Ʈ ŸϿ ִٸ Ѵ. + // 기존에 같은 이펙트가 타일에 있다면 지우고 새로 설정한다. Tile& tile = pZone->getTile(X, Y); Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_ACID_STORM); if (pOldEffect != NULL) { @@ -364,7 +364,7 @@ void AcidStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pZone->deleteEffect(effectID); } - // Ʈ Ʈ ؼ ŸϿ δ. + // 이펙트 오브젝트를 생성해서 타일에 붙인다. EffectAcidStorm* pEffect = new EffectAcidStorm(pZone, X, Y); pEffect->setDeadline(output.Duration); pEffect->setNextTime(0); @@ -383,9 +383,9 @@ void AcidStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) tile.addEffect(pEffect); - // Ʈ Creature effect ٿش. - // Vampire VampireԴ - // ش ʴ´. + // 이펙트 범위내의 모든 Creature에게 effect를 붙여준다. + // Vampire가 기술을 사용한 경우 같은 Vampire에게는 + // 해당하지 않는다. bool bEffected = false; Creature* pTargetCreature; @@ -435,7 +435,7 @@ void AcidStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) cList.push_back(pTargetCreature); if (bCanSee) { - // + // 공격을 당한 사람에게 _GCSkillToTileOK2.setObjectID(pMonster->getObjectID()); _GCSkillToTileOK2.setSkillType(SkillType); _GCSkillToTileOK2.setX(X); @@ -454,21 +454,21 @@ void AcidStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) } // if(pTargetCreature!= NULL) } - // ִ 鿡 + // 기술을 쓴 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(myX); _GCSkillToTileOK3.setY(myY); //_GCSkillToTileOK3.setDuration(output.Duration); //_GCSkillToTileOK3.setRange(Range); - // ִ 鿡 + // 기술을 당한 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람과 당한 사람을 모두 볼 수 있는 사람들에게 _GCSkillToTileOK5.setObjectID(pMonster->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); @@ -476,13 +476,13 @@ void AcidStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); - // ִ 鿡 broadcasing + // 기술을 쓸 사람과 당한 사람을 모두 볼 수 있는 사람들에게 broadcasing cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); - // ִ 鿡 broadcasting + // 기술을 쓴 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); - // ִ 鿡 broadcasting + // 기술을 당한 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); } else { diff --git a/src/server/gameserver/skill/AcidStrike.cpp b/src/server/gameserver/skill/AcidStrike.cpp index 7588f067..f0c84f5f 100644 --- a/src/server/gameserver/skill/AcidStrike.cpp +++ b/src/server/gameserver/skill/AcidStrike.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void AcidStrike::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -38,7 +38,7 @@ void AcidStrike::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk SIMPLE_SKILL_OUTPUT result; - // Knowledge of Acid ִٸ hit bonus 10 + // Knowledge of Acid 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_ACID)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_ACID); @@ -55,7 +55,7 @@ void AcidStrike::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void AcidStrike::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/AcidSwamp.cpp b/src/server/gameserver/skill/AcidSwamp.cpp index a0cf388c..b39ce756 100644 --- a/src/server/gameserver/skill/AcidSwamp.cpp +++ b/src/server/gameserver/skill/AcidSwamp.cpp @@ -17,7 +17,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void AcidSwamp::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -37,8 +37,8 @@ void AcidSwamp::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSki Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -57,7 +57,7 @@ void AcidSwamp::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSki } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void AcidSwamp::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -84,7 +84,7 @@ void AcidSwamp::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire SkillType_t SkillType = pVampireSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // Knowledge of Acid ִٸ hit bonus 10 + // Knowledge of Acid 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_ACID)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_ACID); @@ -105,7 +105,7 @@ void AcidSwamp::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire Tile& tile = pZone->getTile(X, Y); if (tile.canAddEffect()) bTileCheck = true; - // ӽ ׶ ߰ Ѵ. + // 머시 그라운드 있음 추가 못한당. if (tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL) bTileCheck = false; if (tile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION) != NULL) @@ -120,9 +120,9 @@ void AcidSwamp::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); Tile& tile = pZone->getTile(X, Y); - Range_t Range = 1; // ׻ 1̴. + Range_t Range = 1; // 항상 1이다. - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_ACID_SWAMP); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); @@ -131,12 +131,12 @@ void AcidSwamp::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire checkMine(pZone, X, Y); - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); - // Wisdom of Swamp ִٸ ӽð 20% + // Wisdom of Swamp 가 있다면 지속시간 20% 증가 if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_WISDOM_OF_SWAMP)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_WISDOM_OF_SWAMP); Assert(pRankBonus != NULL); @@ -144,7 +144,7 @@ void AcidSwamp::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire output.Duration += getPercentValue(output.Duration, pRankBonus->getPoint()); } - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectAcidSwamp* pEffect = new EffectAcidSwamp(pZone, X, Y); pEffect->setUserObjectID(pVampire->getObjectID()); pEffect->setDeadline(output.Duration); @@ -162,15 +162,15 @@ void AcidSwamp::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire pEffect->setBurrowingTargetObjectID(tile.getCreature(Creature::MOVE_MODE_BURROWING)->getObjectID()); } - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); - // Ÿ ũİ ִٸ ٷ ֵ Ѵ. + // 타일 위에 크리쳐가 있다면 바로 영향을 주도록 한다. bool bEffected = false; Creature* pTargetCreature = NULL; @@ -275,7 +275,7 @@ void AcidSwamp::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void AcidSwamp::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -306,7 +306,7 @@ void AcidSwamp::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) Tile& tile = pZone->getTile(X, Y); if (tile.canAddEffect()) bTileCheck = true; - // ӽ ׶ ߰ Ѵ. + // 머시 그라운드 있음 추가 못한당. if (tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL) bTileCheck = false; if (tile.getEffect(Effect::EFFECT_CLASS_HEAVEN_GROUND) != NULL) @@ -319,21 +319,21 @@ void AcidSwamp::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) } Tile& tile = pZone->getTile(X, Y); - Range_t Range = 1; // ׻ 1̴. + Range_t Range = 1; // 항상 1이다. - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_ACID_SWAMP); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); } - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectAcidSwamp* pEffect = new EffectAcidSwamp(pZone, X, Y); pEffect->setUserObjectID(pMonster->getObjectID()); pEffect->setDeadline(output.Duration); @@ -342,15 +342,15 @@ void AcidSwamp::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pEffect->setDamage(output.Damage); pEffect->setLevel(pSkillInfo->getLevel() / 2); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); - // Ÿ ũİ ִٸ ٷ ֵ Ѵ. + // 타일 위에 크리쳐가 있다면 바로 영향을 주도록 한다. bool bEffected = false; Creature* pTargetCreature = NULL; diff --git a/src/server/gameserver/skill/AcidTouch.cpp b/src/server/gameserver/skill/AcidTouch.cpp index af8fa198..a55c0336 100644 --- a/src/server/gameserver/skill/AcidTouch.cpp +++ b/src/server/gameserver/skill/AcidTouch.cpp @@ -10,7 +10,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void AcidTouch::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -38,7 +38,7 @@ void AcidTouch::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSki SIMPLE_SKILL_OUTPUT result; - // Tiger Nail ִٸ 10% + // Tiger Nail 이 있다면 데미지 10% 증가 if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_TIGER_NAIL)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_TIGER_NAIL); Assert(pRankBonus != NULL); @@ -46,7 +46,7 @@ void AcidTouch::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSki param.SkillDamage += getPercentValue(param.SkillDamage, pRankBonus->getPoint()); } - // Knowledge of Acid ִٸ hit bonus 10 + // Knowledge of Acid 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_ACID)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_ACID); @@ -63,7 +63,7 @@ void AcidTouch::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSki } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void AcidTouch::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/Activation.cpp b/src/server/gameserver/skill/Activation.cpp index 6a15df70..39d7f3a8 100644 --- a/src/server/gameserver/skill/Activation.cpp +++ b/src/server/gameserver/skill/Activation.cpp @@ -13,7 +13,7 @@ #include "Party.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Activation::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -49,18 +49,18 @@ void Activation::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEf if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // Ǵ ð õ ޶. + // 기술이 유지되는 시간은 숙련도에 따라서 달라진다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ ؼ δ. + // 이펙트 오브젝트를 생성해서 붙인다. EffectActivation* pEffectActivation = new EffectActivation(pSlayer); pEffectActivation->setDeadline(output.Duration); pSlayer->addEffect(pEffectActivation); pSlayer->setFlag(Effect::EFFECT_CLASS_ACTIVATION); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1) * 2; shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); @@ -79,7 +79,7 @@ void Activation::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEf pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCSkillToSelfOK2, pSlayer); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pSlayer->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_ACTIVATION); diff --git a/src/server/gameserver/skill/AirShield.cpp b/src/server/gameserver/skill/AirShield.cpp index bb2b83e0..4dc5130f 100644 --- a/src/server/gameserver/skill/AirShield.cpp +++ b/src/server/gameserver/skill/AirShield.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void AirShield::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -31,7 +31,7 @@ void AirShield::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEff Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 도가 아니라면 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_BLADE) { executeSkillFailException(pSlayer, getSkillType()); @@ -58,12 +58,12 @@ void AirShield::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEff if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectAirShield* pEffect = new EffectAirShield(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setLevel(SkillLevel); @@ -71,7 +71,7 @@ void AirShield::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEff pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_AIR_SHIELD_1); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); if (bIncreaseDomainExp) { diff --git a/src/server/gameserver/skill/Armageddon.cpp b/src/server/gameserver/skill/Armageddon.cpp index 50b25fcd..05a3a487 100644 --- a/src/server/gameserver/skill/Armageddon.cpp +++ b/src/server/gameserver/skill/Armageddon.cpp @@ -19,7 +19,7 @@ #include "Vampire.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Armageddon::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -41,9 +41,9 @@ void Armageddon::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); SkillType_t SkillType = pVampireSkillSlot->getSkillType(); - // NPC . - // 鿪̰ų. by sigi. 2002.9.13 - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // 면역이거나. by sigi. 2002.9.13 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -59,7 +59,7 @@ void Armageddon::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // Knowledge of Blood ִٸ hit bonus + // Knowledge of Blood 가 있다면 hit bonus int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD); @@ -92,12 +92,12 @@ void Armageddon::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ ؼ δ. + // 이펙트 오브젝트를 생성해서 붙인다. EffectArmageddon* pEffectArmageddon = new EffectArmageddon(pTargetCreature); // pEffectArmageddon->setCasterName( pVampire->getName() ); // pEffectArmageddon->setPartyID( pVampire->getPartyID() ); pEffectArmageddon->setUserObjectID(pVampire->getObjectID()); - pEffectArmageddon->setHP(400); // ϵڵ --; by Sequoia + pEffectArmageddon->setHP(400); // 하드코딩됨 --; by Sequoia pEffectArmageddon->setDelay(output.Tick); pEffectArmageddon->setDamage(output.Damage); pEffectArmageddon->setNextTime(output.Tick); @@ -109,7 +109,7 @@ void Armageddon::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk pTargetCreature->addEffect(pEffectArmageddon); pTargetCreature->setFlag(Effect::EFFECT_CLASS_ARMAGEDDON); - // Ʈ پٴ εijش. + // 이펙트가 붙었다는 것을 브로드캐스팅해준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_ARMAGEDDON); @@ -141,10 +141,10 @@ void Armageddon::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk _GCSkillToObjectOK6.setSkillType(SkillType); _GCSkillToObjectOK6.setDuration(output.Duration); - if (bCanSeeCaster) // 10 ġ. + if (bCanSeeCaster) // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); - } else // 10 ġ. + } else // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK6, &_GCSkillToObjectOK1); } diff --git a/src/server/gameserver/skill/AttackArms.cpp b/src/server/gameserver/skill/AttackArms.cpp index 1de673fa..b58508ad 100644 --- a/src/server/gameserver/skill/AttackArms.cpp +++ b/src/server/gameserver/skill/AttackArms.cpp @@ -22,7 +22,7 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void AttackArms::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) @@ -42,15 +42,15 @@ void AttackArms::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + // NPC는 공격할 수 없다. + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || !canAttack(pSlayer, pTargetCreature)) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayer)" << endl; return; } - // Ŷ غϰ... + // 패킷을 준비하고... GCAttackArmsOK1 _GCAttackArmsOK1; GCAttackArmsOK2 _GCAttackArmsOK2; GCAttackArmsOK3 _GCAttackArmsOK3; @@ -60,12 +60,12 @@ void AttackArms::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) _GCAttackArmsOK5.setSkillSuccess(false); _GCAttackArmsOK1.setSkillSuccess(false); - // ų ޾ƿ´. + // 스킬 슬랏을 받아온다. SkillSlot* pSkillSlot = pSlayer->getSkill(SKILL_ATTACK_ARMS); Assert(pSkillSlot != NULL); - // ̾ ִ ´. - // Ǽ̰ų, Ⱑ ƴ϶ . + // 슬레이어가 쓰고 있는 아이템을 가져온다. + // 맨손이거나, 총 종류의 무기가 아니라면 에러다. Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL || isArmsWeapon(pWeapon) == false) { executeSkillFailException(pSlayer, getSkillType()); @@ -77,16 +77,16 @@ void AttackArms::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) bool bBulletCheck = (getRemainBullet(pWeapon) > 0) ? true : false; - // Ѿ ߸. + // 총알은 무조건 떨어뜨린다. Bullet_t RemainBullet = 0; if (bBulletCheck) { decreaseBullet(pWeapon); - // ѹ߾ ʿ . by sigi. 2002.5.9 + // 한발쓸때마다 저장할 필요 없다. by sigi. 2002.5.9 // pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); RemainBullet = getRemainBullet(pWeapon); } - // ѿ Ѿ ִٸ... + // 총에 총알이 남아있다면... if (bBulletCheck) { SkillDomainType_t DomainType = SKILL_DOMAIN_GUN; int ToHitBonus = 0; @@ -100,7 +100,7 @@ void AttackArms::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) int Splash = computeArmsWeaponSplashSize(pWeapon, myX, myY, targetX, targetY); //////////////////////////////////////////////////////////////////////////////// - // SG ƴ ٸ Ϲ + // SG가 아닌 다른 총의 일반 공격 //////////////////////////////////////////////////////////////////////////////// if (Splash == 0) { ToHitBonus = computeArmsWeaponToHitBonus(pWeapon, myX, myY, targetX, targetY); @@ -111,8 +111,8 @@ void AttackArms::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) bool bRangeCheck = verifyDistance(pSlayer, pTargetCreature, pWeapon->getRange()); bool bPK = verifyPK(pSlayer, pTargetCreature); - // ڿ Ʈ. - // ؿ ִ Ű. by sigi. 2002.5.13 + // 공격자와 상대의 아이템 내구성 떨어트림. + // 밑에 있던걸 이쪽으로 옮겼다. by sigi. 2002.5.13 decreaseDurability(pSlayer, pTargetCreature, NULL, &_GCAttackArmsOK1, &_GCAttackArmsOK2); if (bHitRoll && bTimeCheck && bRangeCheck && bPK) { @@ -123,7 +123,7 @@ void AttackArms::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) setDamage(pTargetCreature, Damage, pSlayer, getSkillType(), &_GCAttackArmsOK2, &_GCAttackArmsOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCAttackArmsOK2, &_GCAttackArmsOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, myX, myY); } @@ -173,11 +173,11 @@ void AttackArms::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) pZone->broadcastPacket(targetX, targetY, &_GCAttackArmsOK4, cList); } //////////////////////////////////////////////////////////////////////////////// - // SG ⺻ splash . + // SG는 기본적으로 splash가 들어간다. //////////////////////////////////////////////////////////////////////////////// else { - Damage_t Damage = 0; // ϱ . - bool bHit = false; // ̶ ¾Ҵ° ϱ . + Damage_t Damage = 0; // 마지막으로 입힌 데미지를 저장하기 위한 변수. + bool bHit = false; // 한 명이라도 맞았는가를 저장하기 위한 변수. GCSkillToTileOK1 _GCSkillToTileOK1; GCSkillToTileOK2 _GCSkillToTileOK2; @@ -210,8 +210,8 @@ void AttackArms::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) Damage = computeDamage(pSlayer, pEnemy, 0, bCriticalHit); - // Ÿ ϰ, ÷ Դµ, - // ÷ Ϲ 50%̴. + // 메인 타겟을 제외하고는, 스플래시 데미지를 입는데, + // 스플래시 데미지는 일반 데미지의 50%이다. if (pTargetCreature != pEnemy) { Damage = Damage / 2; } @@ -227,12 +227,12 @@ void AttackArms::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) increaseAlignment(pSlayer, pEnemy, _GCSkillToTileOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pEnemy, myX, myY); } - // Ÿ ̾ ƴ 쿡 ġ ÷ش. + // 타겟이 슬레이어가 아닐 경우에만 경험치를 올려준다. if (!pTargetCreature->isSlayer()) { bHit = true; if (maxEnemyLevel < pTargetCreature->getLevel()) @@ -247,7 +247,7 @@ void AttackArms::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) increaseDomainExp(pSlayer, DomainType, 1, _GCSkillToTileOK1, maxEnemyLevel, EnemyNum); } - // Ѿ ڸ ̰, Ѿ ڸ ϰ, Ѿ ڸ ߸. + // 총알 숫자를 줄이고, 총알 숫자를 저장하고, 남은 총알 숫자를 받은 다음에 내구력을 떨어뜨린다. _GCSkillToTileOK1.addShortData(MODIFY_BULLET, RemainBullet); decreaseDurability(pSlayer, NULL, NULL, &_GCSkillToTileOK1, NULL); @@ -286,7 +286,7 @@ void AttackArms::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) pPlayer->sendPacket(&_GCSkillToTileOK1); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pVictim = *itr; Assert(pVictim != NULL); @@ -340,7 +340,7 @@ void AttackArms::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void AttackArms::execute(Monster* pMonster, Creature* pEnemy) @@ -377,7 +377,7 @@ void AttackArms::execute(Monster* pMonster, Creature* pEnemy) Damage_t Damage = computeDamage(pMonster, pEnemy, 0, bCriticalHit); setDamage(pEnemy, Damage, pMonster, SKILL_ATTACK_ARMS, &_GCAttackArmsOK2, NULL); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pEnemy, pMonster->getX(), pMonster->getY()); } @@ -395,7 +395,7 @@ void AttackArms::execute(Monster* pMonster, Creature* pEnemy) pTargetMonster->addEnemy(pMonster); - // ʹ ̾. + // 마스터는 딜레이없다. if (!pMonster->isMaster() #ifdef __UNDERWORLD__ && !pMonster->isUnderworld() && pMonster->getMonsterType() != 599 @@ -411,7 +411,7 @@ void AttackArms::execute(Monster* pMonster, Creature* pEnemy) } } - // ڿ Ʈ. + // 공격자와 상대의 아이템 내구성 떨어트림. decreaseDurability(pMonster, pEnemy, NULL, NULL, &_GCAttackArmsOK2); ZoneCoord_t targetX = pEnemy->getX(); diff --git a/src/server/gameserver/skill/AttackMelee.cpp b/src/server/gameserver/skill/AttackMelee.cpp index dcdfb5a5..1e0e64d4 100644 --- a/src/server/gameserver/skill/AttackMelee.cpp +++ b/src/server/gameserver/skill/AttackMelee.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : AttackMelee.cpp // Written by : elca@ewestsoft.com -// Description : ⺻ +// Description : 기본 공격 ////////////////////////////////////////////////////////////////////////////// #include "AttackMelee.h" @@ -17,7 +17,7 @@ ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ +// 슬레이어 오브젝트 ////////////////////////////////////////////////////////////////////////////// void AttackMelee::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) @@ -38,15 +38,15 @@ void AttackMelee::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + // NPC를 공격할 수는 없다. + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayer)" << endl; return; } - // ̾ Ǽ̸ . by sigi. 2002.6.29 + // 슬레이어는 맨손이면 공격할 수 없다. by sigi. 2002.6.29 /* Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); @@ -58,7 +58,7 @@ void AttackMelee::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) */ bool bIncreaseDomainExp = pSlayer->isRealWearingEx(Slayer::WEAR_RIGHTHAND); - // ⺻ ų ޾ƿ´. + // 기본 공격 스킬 슬랏을 받아온다. SkillSlot* pSkillSlot = pSlayer->hasSkill(SKILL_ATTACK_MELEE); Assert(pSkillSlot != NULL); @@ -79,17 +79,17 @@ void AttackMelee::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) Exp_t Point = 1; - // ְ, ߸. + // 데미지를 주고, 아이템 내구도를 떨어뜨린다. setDamage(pTargetCreature, Damage, pSlayer, SKILL_ATTACK_MELEE, &_GCAttackMeleeOK2, &_GCAttackMeleeOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCAttackMeleeOK2, &_GCAttackMeleeOK1); decreaseDurability(pSlayer, pTargetCreature, NULL, &_GCAttackMeleeOK1, &_GCAttackMeleeOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } - // Ÿ ̾ ƴ϶ ġ ÷ش. + // 타겟이 슬레이어가 아니라면 경험치를 올려준다. if (!pTargetCreature->isSlayer()) { Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); @@ -104,22 +104,22 @@ void AttackMelee::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) increaseDomainExp(pSlayer, SKILL_DOMAIN_SWORD, Point, _GCAttackMeleeOK1, pTargetCreature->getLevel()); } else if (pWeapon->getItemClass() == Item::ITEM_CLASS_CROSS) { - // ڰ Heal 迭 ġ ÷ش. + // 십자가를 들고 있을 경우 Heal 계열의 경험치를 올려준다. shareAttrExp(pSlayer, Damage, 1, 1, 8, _GCAttackMeleeOK1); increaseDomainExp(pSlayer, SKILL_DOMAIN_HEAL, Point, _GCAttackMeleeOK1, pTargetCreature->getLevel()); } else if (pWeapon->getItemClass() == Item::ITEM_CLASS_MACE) { - // ̽ Enchant 迭 ġ ÷ش. + // 메이스를 들고 있을 경우 Enchant 계열의 경험치를 올려준다. shareAttrExp(pSlayer, Damage, 1, 1, 8, _GCAttackMeleeOK1); increaseDomainExp(pSlayer, SKILL_DOMAIN_ENCHANT, Point, _GCAttackMeleeOK1, pTargetCreature->getLevel()); } else { - // ٸ 迭 ⸦ , AttackMelee ϴ ҹ(?)̴. + // 다른 계열의 무기를 들고, AttackMelee를 하는 것은 불법(?)이다. Assert(false); } } } else { - // ƹ ⵵ ʰ, , ɷġ ġ ణ ÷ش. + // 아무 무기도 들지 않고, 공격을 할 경우, 능력치 경험치만 약간 올려준다. shareAttrExp(pSlayer, Damage, 1, 1, 1, _GCAttackMeleeOK1); } @@ -143,8 +143,8 @@ void AttackMelee::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pSlayer); - // κ κ ؼ ϴµ... - // ʹ ̾. + // 이 부분은 새로 만들어진 부분을 생각해서 고쳐져야 하는데... + // 마스터는 딜레이없다. if (!pMonster->isMaster() #ifdef __UNDERWORLD__ && !pMonster->isUnderworld() && pMonster->getMonsterType() != 599 @@ -179,7 +179,7 @@ void AttackMelee::execute(Slayer* pSlayer, ObjectID_t TargetObjectID) } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ +// 뱀파이어 오브젝트 ////////////////////////////////////////////////////////////////////////////// void AttackMelee::execute(Vampire* pVampire, ObjectID_t TargetObjectID) @@ -199,7 +199,7 @@ void AttackMelee::execute(Vampire* pVampire, ObjectID_t TargetObjectID) Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch . by sigi. 2002.5.2 + // NoSuch제거 때문에. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature)) { executeSkillFailException(pVampire, getSkillType()); return; @@ -210,7 +210,7 @@ void AttackMelee::execute(Vampire* pVampire, ObjectID_t TargetObjectID) GCAttackMeleeOK2 _GCAttackMeleeOK2; GCAttackMeleeOK3 _GCAttackMeleeOK3; - // ų ޾ƿ´. + // 스킬 슬랏을 받아온다. VampireSkillSlot* pSkillSlot = pVampire->hasSkill(SKILL_ATTACK_MELEE); Assert(pSkillSlot != NULL); @@ -227,19 +227,19 @@ void AttackMelee::execute(Vampire* pVampire, ObjectID_t TargetObjectID) if (bTimeCheck && bRangeCheck && bHitRoll && bCanHit && bPK) { CheckCrossCounter(pVampire, pTargetCreature, Damage); - // ְ, ߸. + // 데미지를 주고, 내구도를 떨어뜨린다. setDamage(pTargetCreature, Damage, pVampire, SKILL_ATTACK_MELEE, &_GCAttackMeleeOK2, &_GCAttackMeleeOK1); computeAlignmentChange(pTargetCreature, Damage, pVampire, &_GCAttackMeleeOK2, &_GCAttackMeleeOK1); decreaseDurability(pVampire, pTargetCreature, NULL, &_GCAttackMeleeOK1, &_GCAttackMeleeOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pVampire->getX(), pVampire->getY()); } increaseAlignment(pVampire, pTargetCreature, _GCAttackMeleeOK1); - // 밡 ׾ٸ ġ ÷ش. + // 상대가 죽었다면 경험치를 좀 올려준다. if (pTargetCreature->isDead()) { int exp = computeCreatureExp(pTargetCreature, KILL_EXP); shareVampExp(pVampire, exp, _GCAttackMeleeOK1); @@ -262,7 +262,7 @@ void AttackMelee::execute(Vampire* pVampire, ObjectID_t TargetObjectID) Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pVampire); - // ʹ ̾. + // 마스터는 딜레이없다. if (!pMonster->isMaster()) { Timeval NextTurn = pMonster->getNextTurn(); Timeval DelayTurn; @@ -293,7 +293,7 @@ void AttackMelee::execute(Vampire* pVampire, ObjectID_t TargetObjectID) ////////////////////////////////////////////////////////////////////////////// -// ƿ콺ͽ Ʈ +// 아우스터스 오브젝트 ////////////////////////////////////////////////////////////////////////////// void AttackMelee::execute(Ousters* pOusters, ObjectID_t TargetObjectID) @@ -310,7 +310,7 @@ void AttackMelee::execute(Ousters* pOusters, ObjectID_t TargetObjectID) Creature* pTargetCreature = pZone->getCreature(TargetObjectID); - // NoSuch . by sigi. 2002.5.2 + // NoSuch제거 때문에. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pOusters, pTargetCreature)) { executeSkillFailException(pOusters, getSkillType()); return; @@ -320,7 +320,7 @@ void AttackMelee::execute(Ousters* pOusters, ObjectID_t TargetObjectID) GCAttackMeleeOK2 _GCAttackMeleeOK2; GCAttackMeleeOK3 _GCAttackMeleeOK3; - // ų ޾ƿ´. + // 스킬 슬랏을 받아온다. OustersSkillSlot* pSkillSlot = pOusters->hasSkill(SKILL_ATTACK_MELEE); Assert(pSkillSlot != NULL); @@ -338,19 +338,19 @@ void AttackMelee::execute(Ousters* pOusters, ObjectID_t TargetObjectID) Damage += computeElementalCombatSkill(pOusters, pTargetCreature, _GCAttackMeleeOK1); CheckCrossCounter(pOusters, pTargetCreature, Damage); - // ְ, ߸. + // 데미지를 주고, 내구도를 떨어뜨린다. setDamage(pTargetCreature, Damage, pOusters, SKILL_ATTACK_MELEE, &_GCAttackMeleeOK2, &_GCAttackMeleeOK1); computeAlignmentChange(pTargetCreature, Damage, pOusters, &_GCAttackMeleeOK2, &_GCAttackMeleeOK1); decreaseDurability(pOusters, pTargetCreature, NULL, &_GCAttackMeleeOK1, &_GCAttackMeleeOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pOusters->getX(), pOusters->getY()); } increaseAlignment(pOusters, pTargetCreature, _GCAttackMeleeOK1); - // 밡 ׾ٸ ġ ÷ش. + // 상대가 죽었다면 경험치를 좀 올려준다. if (pTargetCreature->isDead()) { int exp = computeCreatureExp(pTargetCreature, 100, pOusters); shareOustersExp(pOusters, exp, _GCAttackMeleeOK1); @@ -373,7 +373,7 @@ void AttackMelee::execute(Ousters* pOusters, ObjectID_t TargetObjectID) Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pOusters); - // ʹ ̾. + // 마스터는 딜레이없다. if (!pMonster->isMaster()) { Timeval NextTurn = pMonster->getNextTurn(); Timeval DelayTurn; @@ -403,7 +403,7 @@ void AttackMelee::execute(Ousters* pOusters, ObjectID_t TargetObjectID) } ////////////////////////////////////////////////////////////////////////////// -// Ʈ +// 몬스터 오브젝트 ////////////////////////////////////////////////////////////////////////////// void AttackMelee::execute(Monster* pMonster, Creature* pEnemy) @@ -442,11 +442,11 @@ void AttackMelee::execute(Monster* pMonster, Creature* pEnemy) if (bRangeCheck && bHitRoll && bCanHit) { CheckCrossCounter(pMonster, pEnemy, Damage); - // ְ, ߸. + // 데미지를 주고, 내구도를 떨어뜨린다. setDamage(pEnemy, Damage, pMonster, SKILL_ATTACK_MELEE, &_GCAttackMeleeOK2); decreaseDurability(pMonster, pEnemy, NULL, NULL, &_GCAttackMeleeOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pEnemy, pMonster->getX(), pMonster->getY()); } diff --git a/src/server/gameserver/skill/AuraBall.cpp b/src/server/gameserver/skill/AuraBall.cpp index df1af621..48ca81bc 100644 --- a/src/server/gameserver/skill/AuraBall.cpp +++ b/src/server/gameserver/skill/AuraBall.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void AuraBall::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,7 +37,7 @@ void AuraBall::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS SIMPLE_SKILL_OUTPUT result; - // Holy Smashing ִٸ 10% + // Holy Smashing 이 있다면 데미지 10% 증가 if (pSlayer->hasRankBonus(RankBonus::RANK_BONUS_HOLY_SMASHING)) { RankBonus* pRankBonus = pSlayer->getRankBonus(RankBonus::RANK_BONUS_HOLY_SMASHING); Assert(pRankBonus != NULL); diff --git a/src/server/gameserver/skill/AuraRing.cpp b/src/server/gameserver/skill/AuraRing.cpp index cc3e7403..0e99fdfc 100644 --- a/src/server/gameserver/skill/AuraRing.cpp +++ b/src/server/gameserver/skill/AuraRing.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void AuraRing::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,7 +37,7 @@ void AuraRing::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS SIMPLE_SKILL_OUTPUT result; - // Holy Smashing ִٸ 10% + // Holy Smashing 이 있다면 데미지 10% 증가 if (pSlayer->hasRankBonus(RankBonus::RANK_BONUS_HOLY_SMASHING)) { RankBonus* pRankBonus = pSlayer->getRankBonus(RankBonus::RANK_BONUS_HOLY_SMASHING); Assert(pRankBonus != NULL); diff --git a/src/server/gameserver/skill/AuraShield.cpp b/src/server/gameserver/skill/AuraShield.cpp index d4155deb..64d7f772 100644 --- a/src/server/gameserver/skill/AuraShield.cpp +++ b/src/server/gameserver/skill/AuraShield.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void AuraShield::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -49,19 +49,19 @@ void AuraShield::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEf if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectAuraShield* pEffect = new EffectAuraShield(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setLevel(SkillLevel); pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_AURA_SHIELD); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); diff --git a/src/server/gameserver/skill/BackStab.cpp b/src/server/gameserver/skill/BackStab.cpp index bc2b81b9..3c65f98b 100644 --- a/src/server/gameserver/skill/BackStab.cpp +++ b/src/server/gameserver/skill/BackStab.cpp @@ -11,7 +11,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BackStab::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/BeatHead.cpp b/src/server/gameserver/skill/BeatHead.cpp index 4c4d9363..6789b1dd 100644 --- a/src/server/gameserver/skill/BeatHead.cpp +++ b/src/server/gameserver/skill/BeatHead.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BeatHead::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/Berserker.cpp b/src/server/gameserver/skill/Berserker.cpp index e08ff676..a82bb889 100644 --- a/src/server/gameserver/skill/Berserker.cpp +++ b/src/server/gameserver/skill/Berserker.cpp @@ -13,7 +13,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Berserker::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -32,7 +32,7 @@ void Berserker::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEff Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 도가 아니라면 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_BLADE) { executeSkillFailException(pSlayer, getSkillType()); @@ -57,7 +57,7 @@ void Berserker::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEff bool bTimeCheck = verifyRunTime(pSkillSlot); bool bRangeCheck = checkZoneLevelToUseSkill(pSlayer); bool bHitRoll = HitRoll::isSuccessMagic(pSlayer, pSkillInfo, pSkillSlot); - // ¡ Ŀ ÿ . + // 차징 파워랑 동시에 사용할 수 없다. bool bEffected = pSlayer->isFlag(Effect::EFFECT_CLASS_BERSERKER) || pSlayer->isFlag(Effect::EFFECT_CLASS_CHARGING_POWER); @@ -69,13 +69,13 @@ void Berserker::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEff computeOutput(input, output); // by sigi. 2002.12.3 - // by ȫâ. 2002.12.6 + // by 홍창. 2002.12.6 // int DefensePenalty = 35 - pSkillSlot->getExpLevel()*2/13; // % // int ProtectionPenalty = 25 - pSkillSlot->getExpLevel()*2/13; // % int DefensePenalty = 25 - pSkillSlot->getExpLevel() * 2 / 13; // % int ProtectionPenalty = 20 - pSkillSlot->getExpLevel() * 2 / 13; // % - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectBerserker* pEffect = new EffectBerserker(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setDefensePenalty(DefensePenalty); @@ -85,14 +85,14 @@ void Berserker::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEff pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_BERSERKER); - // ̷ Ͽ ٲ ɷġ . + // 이로 인하여 바뀌는 능력치를 보낸다. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); diff --git a/src/server/gameserver/skill/BigRockfall.cpp b/src/server/gameserver/skill/BigRockfall.cpp index 898d049a..fe28a495 100644 --- a/src/server/gameserver/skill/BigRockfall.cpp +++ b/src/server/gameserver/skill/BigRockfall.cpp @@ -10,7 +10,7 @@ #include "SimpleTileMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BigRockfall::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -30,7 +30,7 @@ void BigRockfall::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pOusters, pTargetCreature)) { executeSkillFailException(pOusters, getSkillType()); return; diff --git a/src/server/gameserver/skill/BiteOfDeath.cpp b/src/server/gameserver/skill/BiteOfDeath.cpp index 34ce1f20..c76999f4 100644 --- a/src/server/gameserver/skill/BiteOfDeath.cpp +++ b/src/server/gameserver/skill/BiteOfDeath.cpp @@ -17,7 +17,7 @@ #include "Reflection.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BiteOfDeath::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -38,9 +38,9 @@ void BiteOfDeath::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // 鿪. by sigi. 2002.9.13 - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수 없다. + // 저주 면역. by sigi. 2002.9.13 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC() || !pVampire->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WERWOLF) || pTargetCreature->isDead() || pTargetCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { @@ -99,12 +99,12 @@ void BiteOfDeath::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS HP_t MaxHP = pVampire->getHP(ATTR_MAX); HP_t NewHP = min((int)MaxHP, (int)CurrentHP + (int)HealPoint); - // ó ش. + // 은 데미지 관련 처리를 해 준다. Silver_t newSilverDamage = max(0, (int)pVampire->getSilverDamage() - (int)HealPoint); pVampire->saveSilverDamage(newSilverDamage); _GCSkillToObjectOK1.addShortData(MODIFY_SILVER_DAMAGE, newSilverDamage); - // ̾ HP Ѵ. + // 뱀파이어의 HP를 세팅한다. pVampire->setHP(NewHP); GCStatusCurrentHP gcStatusCurrentHP; @@ -116,7 +116,7 @@ void BiteOfDeath::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS } - // Ÿ 俩Ӵ. + // 타겟 쥑여뿐다. if (pTargetCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pTargetCreature); pSlayer->setHP(0); @@ -159,10 +159,10 @@ void BiteOfDeath::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS _GCSkillToObjectOK6.setXY(myX, myY); _GCSkillToObjectOK6.setSkillType(SkillType); - if (bCanSeeCaster) // 10 ġ. + if (bCanSeeCaster) // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); - } else // 10 ġ. + } else // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK6, &_GCSkillToObjectOK1); } diff --git a/src/server/gameserver/skill/BlazeBolt.cpp b/src/server/gameserver/skill/BlazeBolt.cpp index cd8b70ba..b5aac838 100644 --- a/src/server/gameserver/skill/BlazeBolt.cpp +++ b/src/server/gameserver/skill/BlazeBolt.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BlazeBolt::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/BlazeWalk.cpp b/src/server/gameserver/skill/BlazeWalk.cpp index 36dbb1fc..7db9f797 100644 --- a/src/server/gameserver/skill/BlazeWalk.cpp +++ b/src/server/gameserver/skill/BlazeWalk.cpp @@ -16,7 +16,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BlazeWalk::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,8 +37,8 @@ void BlazeWalk::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 - // NPC . + // NoSuch제거. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. if (pTargetCreature == NULL || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -47,7 +47,7 @@ void BlazeWalk::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p bool bIncreaseDomainExp = pSlayer->isRealWearingEx(Slayer::WEAR_RIGHTHAND); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 검이 아니라면 기술을 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL) { executeSkillFailException(pSlayer, getSkillType()); @@ -77,7 +77,7 @@ void BlazeWalk::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p bool bEffected = pSlayer->hasRelicItem(); if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bCanHit && bPK && !bEffected) { - // PC ش. + // 빠르게 PC를 움직여준다. if (pZone->moveFastPC(pSlayer, pSlayer->getX(), pSlayer->getY(), pTargetCreature->getX(), pTargetCreature->getY(), getSkillType())) { decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); @@ -88,14 +88,14 @@ void BlazeWalk::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p bool bCriticalHit = false; - // ش. + // 데미지를 준다. Damage_t BasicDamage = computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); Damage_t Damage = BasicDamage + output.Damage; setDamage(pTargetCreature, Damage, pSlayer, SkillType, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); decreaseDurability(pSlayer, pTargetCreature, pSkillInfo, &_GCSkillToObjectOK1, &_GCSkillToObjectOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } @@ -127,7 +127,7 @@ void BlazeWalk::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p pTargetCreature->setFlag(Effect::EFFECT_CLASS_BLAZE_WALK); pTargetCreature->addEffect(pEffect); - // Ŷ غϰ . + // 패킷을 준비하고 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); diff --git a/src/server/gameserver/skill/Bless.cpp b/src/server/gameserver/skill/Bless.cpp index 23e3b9c5..8e878960 100644 --- a/src/server/gameserver/skill/Bless.cpp +++ b/src/server/gameserver/skill/Bless.cpp @@ -19,7 +19,7 @@ #include "PacketUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Bless::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -40,8 +40,8 @@ void Bless::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkil Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // ̾ ƴ϶ . - if (pTargetCreature == NULL // NoSuch . by sigi. 2002.5.2 + // 슬레이어가 아니라면 사용할 수가 없다. + if (pTargetCreature == NULL // NoSuch 제거. by sigi. 2002.5.2 || pTargetCreature->isSlayer() == false) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayerobject)" << endl; @@ -70,7 +70,7 @@ void Bless::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkil if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); - // ȿġ ӽð Ѵ. + // 기술의 효과치 및 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); input.TargetType = SkillInput::TARGET_OTHER; SkillOutput output; @@ -78,7 +78,7 @@ void Bless::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkil uint AttrBonus = output.Damage; - // Ʈ δ. + // 이펙트를 만들어 붙인다. EffectBless* pEffect = new EffectBless(pTargetCreature); pEffect->setDeadline(output.Duration); pEffect->setSTRBonus(AttrBonus); @@ -86,14 +86,14 @@ void Bless::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkil pTargetCreature->setFlag(Effect::EFFECT_CLASS_BLESS); pTargetCreature->addEffect(pEffect); - // Ʈ ٿ, ɷġ Ѵ. + // 이펙트를 붙였으니, 능력치를 재계산한다. SLAYER_RECORD prev; pTargetSlayer->getSlayerRecord(prev); pTargetSlayer->initAllStat(); pTargetSlayer->sendRealWearingInfo(); pTargetSlayer->addModifyInfo(prev, _GCSkillToObjectOK2); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToObjectOK1); @@ -173,7 +173,7 @@ void Bless::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkil } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Bless::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -216,7 +216,7 @@ void Bless::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectI SkillOutput output; computeOutput(input, output); - // Ʈ δ. + // 이펙트를 만들어 붙인다. EffectBless* pEffect = new EffectBless(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setSTRBonus(output.Damage); @@ -224,14 +224,14 @@ void Bless::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectI pSlayer->setFlag(Effect::EFFECT_CLASS_BLESS); pSlayer->addEffect(pEffect); - // Ʈ ٿ, ɷġ Ѵ. + // 이펙트를 붙였으니, 능력치를 재계산한다. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->addModifyInfo(prev, _GCSkillToSelfOK1); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); diff --git a/src/server/gameserver/skill/BlitzSliding.cpp b/src/server/gameserver/skill/BlitzSliding.cpp index f54410c9..4a283f58 100644 --- a/src/server/gameserver/skill/BlitzSliding.cpp +++ b/src/server/gameserver/skill/BlitzSliding.cpp @@ -16,7 +16,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BlitzSliding::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,8 +37,8 @@ void BlitzSliding::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 - // NPC . + // NoSuch제거. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. if (pTargetCreature == NULL || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -47,7 +47,7 @@ void BlitzSliding::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot bool bIncreaseDomainExp = pSlayer->isRealWearingEx(Slayer::WEAR_RIGHTHAND); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 검이 아니라면 기술을 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL) { executeSkillFailException(pSlayer, getSkillType()); @@ -77,7 +77,7 @@ void BlitzSliding::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot bool bEffected = pSlayer->hasRelicItem(); if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bCanHit && bPK && !bEffected) { - // PC ش. + // 빠르게 PC를 움직여준다. if (pZone->moveFastPC(pSlayer, pSlayer->getX(), pSlayer->getY(), pTargetCreature->getX(), pTargetCreature->getY(), getSkillType())) { decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); @@ -88,14 +88,14 @@ void BlitzSliding::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot bool bCriticalHit = false; - // ش. + // 데미지를 준다. Damage_t BasicDamage = computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); Damage_t Damage = BasicDamage + output.Damage; setDamage(pTargetCreature, Damage, pSlayer, SkillType, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); decreaseDurability(pSlayer, pTargetCreature, pSkillInfo, &_GCSkillToObjectOK1, &_GCSkillToObjectOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } @@ -130,7 +130,7 @@ void BlitzSliding::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot pTargetCreature->setFlag(Effect::EFFECT_CLASS_BLAZE_WALK); pTargetCreature->addEffect(pEffect); - // Ŷ غϰ . + // 패킷을 준비하고 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); diff --git a/src/server/gameserver/skill/BloodCurse.cpp b/src/server/gameserver/skill/BloodCurse.cpp index 5e7e2a23..1be40ad5 100644 --- a/src/server/gameserver/skill/BloodCurse.cpp +++ b/src/server/gameserver/skill/BloodCurse.cpp @@ -17,7 +17,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodCurse::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -37,8 +37,8 @@ void BloodCurse::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -57,7 +57,7 @@ void BloodCurse::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodCurse::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -84,7 +84,7 @@ void BloodCurse::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir SkillType_t SkillType = pVampireSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // Knowledge of Innate ִٸ hit bonus 10 + // Knowledge of Innate 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE); @@ -98,7 +98,7 @@ void BloodCurse::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir bool bTimeCheck = verifyRunTime(pVampireSkillSlot); bool bRangeCheck = verifyDistance(pVampire, X, Y, pSkillInfo->getRange()); bool bHitRoll = HitRoll::isSuccessMagic(pVampire, pSkillInfo, pVampireSkillSlot, HitBonus); - // add by Coffee 2007-6-9 ӿ۳ܿ + // add by Coffee 2007-6-9 藤속왱뇜세콘엥 // bool bUseSkillCrad = useSkillCrad(pVampire); bool bTileCheck = false; @@ -114,9 +114,9 @@ void BloodCurse::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); Tile& tile = pZone->getTile(X, Y); - Range_t Range = 1; // ׻ 1̴. + Range_t Range = 1; // 항상 1이다. - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_BLOOD_CURSE); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); @@ -125,12 +125,12 @@ void BloodCurse::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir checkMine(pZone, X, Y); - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectBloodCurse* pEffect = new EffectBloodCurse(pZone, X, Y, true); pEffect->setUserObjectID(pVampire->getObjectID()); pEffect->setDamage(output.Damage); @@ -138,18 +138,18 @@ void BloodCurse::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir // pEffect->setNextTime(0); // pEffect->setTick(output.Tick); - // 켱 ý Ͽ ̸ Ƽ ̵ ִ´. + // 우선권 시스템을 위하여 이름과 파티 아이디를 넣는다. // pEffect->setCasterName(pVampire->getName()); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); - // Ÿ ũİ ִٸ ٷ ֵ Ѵ. + // 타일 위에 크리쳐가 있다면 바로 영향을 주도록 한다. bool bEffected = false; Creature* pTargetCreature = NULL; @@ -254,7 +254,7 @@ void BloodCurse::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodCurse::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -293,22 +293,22 @@ void BloodCurse::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) } Tile& tile = pZone->getTile(X, Y); - Range_t Range = 1; // ׻ 1̴. + Range_t Range = 1; // 항상 1이다. - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_BLOOD_CURSE); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); } - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); input.SkillLevel = pMonster->getLevel(); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectBloodCurse* pEffect = new EffectBloodCurse(pZone, X, Y); pEffect->setNextTime(output.Duration); pEffect->setUserObjectID(pMonster->getObjectID()); @@ -317,15 +317,15 @@ void BloodCurse::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pEffect->setDamage(output.Damage); // pEffect->setLevel(pSkillInfo->getLevel()/2); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); - // Ÿ ũİ ִٸ ٷ ֵ Ѵ. + // 타일 위에 크리쳐가 있다면 바로 영향을 주도록 한다. bool bEffected = false; Creature* pTargetCreature = NULL; diff --git a/src/server/gameserver/skill/BloodDrain.cpp b/src/server/gameserver/skill/BloodDrain.cpp index a5bbd01e..683da09f 100644 --- a/src/server/gameserver/skill/BloodDrain.cpp +++ b/src/server/gameserver/skill/BloodDrain.cpp @@ -18,7 +18,7 @@ #include "LogClient.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodDrain::execute(Vampire* pVampire, ObjectID_t TargetObjectID) @@ -38,11 +38,11 @@ void BloodDrain::execute(Vampire* pVampire, ObjectID_t TargetObjectID) Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // 鿪 . by sigi. 2002.9.13 - // üũ. by sigi.2002.9.5 - // ִ . by Sequoia.2003. 3. 20 - if (pTargetCreature == NULL // NoSuch . by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // 면역 상태. by sigi. 2002.9.13 + // 무적상태 체크. by sigi.2002.9.5 + // 죽은 애는 피 빨 수 없다. by Sequoia.2003. 3. 20 + if (pTargetCreature == NULL // NoSuch 제거. by sigi. 2002.5.2 || pTargetCreature->isNPC() || pTargetCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_BLOOD_DRAIN) || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isFlag(Effect::EFFECT_CLASS_COMA) || pTargetCreature->isDead()) { @@ -65,16 +65,16 @@ void BloodDrain::execute(Vampire* pVampire, ObjectID_t TargetObjectID) bool bPK = verifyPK(pVampire, pTargetCreature); if (bHitRoll && bCanHit && bTimeCheck && bRangeCheck && bPK) { - // ̾ 쿡 Ʈ Ʈ Ѵ. + // 슬레이어일 경우에만 이펙트 오브젝트를 생성한다. if (pTargetCreature->isSlayer()) { EffectBloodDrain* pEffectBloodDrain = new EffectBloodDrain(pTargetCreature); pEffectBloodDrain->setLevel(pVampire->getLevel()); - pEffectBloodDrain->setDeadline(BLOODDRAIN_DURATION); // 3?? + pEffectBloodDrain->setDeadline(BLOODDRAIN_DURATION); // 3일?? pTargetCreature->addEffect(pEffectBloodDrain); pEffectBloodDrain->create(pTargetCreature->getName()); _GCBloodDrainOK2.addShortData(MODIFY_EFFECT_STAT, Effect::EFFECT_CLASS_BLOOD_DRAIN); - // Ÿ ÷״ Ǵ. + // 타겟이 뭐든 플래그는 건다. pTargetCreature->setFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN); Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); @@ -84,10 +84,10 @@ void BloodDrain::execute(Vampire* pVampire, ObjectID_t TargetObjectID) pTargetSlayer->sendRealWearingInfo(); pTargetSlayer->addModifyInfo(prev, _GCBloodDrainOK2); - // α׸ . + // 로그를 남긴다. log(LOG_BLOODDRAINED, pTargetCreature->getName(), pVampire->getName()); } - // ƿ콺 쿣..... -_-; ѽð Ʈ Ѵ. ѽð ƴ.. + // 아우스터즈의 경우엔..... -_-; 제한시간 없는 이펙트를 생성한다. 엄밀히 말해 제한시간이 없는 건 아니지만.. // else if ( pTargetCreature->isOusters() ) // { // EffectBloodDrain* pEffectBloodDrain = new EffectBloodDrain(pTargetCreature); @@ -96,7 +96,7 @@ void BloodDrain::execute(Vampire* pVampire, ObjectID_t TargetObjectID) // pEffectBloodDrain->create(pTargetCreature->getName()); // _GCBloodDrainOK2.addShortData(MODIFY_EFFECT_STAT, Effect::EFFECT_CLASS_BLOOD_DRAIN); // - // // Ÿ ÷״ Ǵ. + // // 타겟이 뭐든 플래그는 건다. // pTargetCreature->setFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN); // // Sight_t oldSight = pTargetCreature->getSight(); @@ -115,15 +115,15 @@ void BloodDrain::execute(Vampire* pVampire, ObjectID_t TargetObjectID) // } // } - // Ÿ ÷״ Ǵ. + // 타겟이 뭐든 플래그는 건다. pTargetCreature->setFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN); - // ø ġ Ѵ. + // 올릴 경험치량을 계산한다. Exp_t Exp = computeCreatureExp(pTargetCreature, BLOODDRAIN_EXP); int targetLevel = 0; int targetMaxHP = 0; - // ÷ش. + // 페임을 올려준다. if (pTargetCreature->isSlayer()) { // increaseFame(pVampire, Exp); Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); @@ -155,20 +155,20 @@ void BloodDrain::execute(Vampire* pVampire, ObjectID_t TargetObjectID) shareVampExp(pVampire, Exp, _GCBloodDrainOK1); - // ϰ Ǹ ü ö󰣴. - // MephistoƮ ɷ HP ö󰣴. + // 흡혈을 하게 되면 흡혈한 사람의 체력이 올라간다. + // Mephisto이펙트가 걸려있으면 HP는 안 올라간다. if (!pVampire->isFlag(Effect::EFFECT_CLASS_MEPHISTO)) { HP_t HealPoint = (Exp == 0 ? computeBloodDrainHealPoint(pTargetCreature, BLOODDRAIN_EXP) : Exp); HP_t CurrentHP = pVampire->getHP(); HP_t MaxHP = pVampire->getHP(ATTR_MAX); HP_t NewHP = min((int)MaxHP, (int)CurrentHP + (int)HealPoint); - // ó ش. + // 은 데미지 관련 처리를 해 준다. Silver_t newSilverDamage = max(0, (int)pVampire->getSilverDamage() - (int)HealPoint); pVampire->saveSilverDamage(newSilverDamage); _GCBloodDrainOK1.addShortData(MODIFY_SILVER_DAMAGE, newSilverDamage); - // ̾ HP Ѵ. + // 뱀파이어의 HP를 세팅한다. pVampire->setHP(NewHP); GCStatusCurrentHP gcStatusCurrentHP; @@ -179,8 +179,8 @@ void BloodDrain::execute(Vampire* pVampire, ObjectID_t TargetObjectID) _GCBloodDrainOK1.addShortData(MODIFY_CURRENT_HP, NewHP); } - // ִ HP پ. - // ٸ.. MaxHP 10~15% damage + // 흡혈을 당한 애는 HP가 줄어든다. + // 대상이 내 레벨보다 높다면.. MaxHP의 10~15% damage // by sigi. 2002.9.14 int drainDamage = 0; int myLevel = pVampire->getLevel(); @@ -188,7 +188,7 @@ void BloodDrain::execute(Vampire* pVampire, ObjectID_t TargetObjectID) if (targetLevel > myLevel) { drainDamage = targetMaxHP * (rand() % 6 + 10) / 100; } else { - // 5̸ 1% ~ + // 레벨 5차이마다 1%씩 더~ int damagePercent = min(30, (rand() % 6 + 10 + (myLevel - targetLevel))); drainDamage = targetMaxHP * damagePercent / 100; } @@ -197,7 +197,7 @@ void BloodDrain::execute(Vampire* pVampire, ObjectID_t TargetObjectID) // decreaseHP(pZone, pTargetCreature, drainDamage, pVampire->getObjectID()); EffectDecreaseHP* pEffect = new EffectDecreaseHP(pTargetCreature); pEffect->setPoint(drainDamage); - pEffect->setDeadline(20); // 2 + pEffect->setDeadline(20); // 2초 후 pEffect->setUserObjectID(pVampire->getObjectID()); pTargetCreature->addEffect(pEffect); pTargetCreature->setFlag(Effect::EFFECT_CLASS_DECREASE_HP); @@ -205,10 +205,10 @@ void BloodDrain::execute(Vampire* pVampire, ObjectID_t TargetObjectID) pVampire->getGQuestManager()->blooddrain(); - // ÿ ٲ + // 흡혈시에도 성향 바뀜 // by sigi. 2002.12.16 - // EffectDecreaseHP HP Ƽ 0 Ǿϴ 찡 ־ - // EffectDecreaseHP::unaffect() ű. + // EffectDecreaseHP에서 HP가 닳아서 0이 되어야하는 경우가 있어서 + // EffectDecreaseHP::unaffect()로 옮긴다. // computeAlignmentChange(pTargetCreature, drainDamage, pVampire, NULL, &_GCBloodDrainOK1); _GCBloodDrainOK1.setObjectID(TargetObjectID); @@ -275,16 +275,16 @@ void BloodDrain::execute(Monster* pMonster, Creature* pEnemy) addVisibleCreature(pZone, pMonster, true); } - // : - -; + // 마스터 : 광역 흡혈 - -; if (pMonster->isMaster() #ifdef __UNDERWORLD__ || pMonster->isUnderworld() || pMonster->getMonsterType() == 599 #endif ) { - // cout << pMonster->getName() << " " << endl; + // cout << pMonster->getName() << "가 광역흡혈함" << endl; int x = pMonster->getX(); int y = pMonster->getY(); - int Splash = 3 + rand() % 5; // 3~7 + int Splash = 3 + rand() % 5; // 3~7 마리 int range = 5; // 11 x 11 list creatureList; getSplashVictims(pMonster->getZone(), x, y, Creature::CREATURE_CLASS_MAX, creatureList, Splash, range); @@ -300,7 +300,7 @@ void BloodDrain::execute(Monster* pMonster, Creature* pEnemy) } } } - // Ϲ : + // 일반 몹 : 한 마리 else { if (executeMonster(pMonster, pEnemy)) { bSuccess = true; @@ -312,10 +312,10 @@ void BloodDrain::execute(Monster* pMonster, Creature* pEnemy) executeSkillFailException(pMonster, getSkillType()); } - // ̵ е Ϳ ̴ ɾش. + // 성공이든 실패든 몬스터에게 딜레이는 걸어준다. Timeval NextTurn = pMonster->getNextTurn(); Timeval DelayTurn; - DelayTurn.tv_sec = (bSuccess ? 4 : 1); // delay ٸ Ѵ. by sigi. 2002.9.14 + DelayTurn.tv_sec = (bSuccess ? 4 : 1); // 성공과 실패의 delay를 다르게 한다. by sigi. 2002.9.14 DelayTurn.tv_usec = 500000; pMonster->addAccuDelay(DelayTurn); @@ -336,9 +336,9 @@ bool BloodDrain::executeMonster(Monster* pMonster, Creature* pEnemy) #endif ; - // ׾ ϰ.. - // ʹ ƹ - -; - // ׾ . + // 죽었으면 흡혈 못하고.. + // 마스터는 아무나 다 빤다 - -; + // 대상이 죽었으면 못 빤다. if (pMonster->isDead() || pMonster->isFlag(Effect::EFFECT_CLASS_COMA) || !pMonster->isEnemyToAttack(pEnemy) && !isMaster || pEnemy->isDead() || pEnemy->isFlag(Effect::EFFECT_CLASS_COMA)) { @@ -352,24 +352,24 @@ bool BloodDrain::executeMonster(Monster* pMonster, Creature* pEnemy) GCBloodDrainOK2 _GCBloodDrainOK2; GCBloodDrainOK3 _GCBloodDrainOK3; - // ʹ ü 100% . - int HPMultiplier = (isMaster ? 1 : 3); // HP 1/1, 1/3 + // 마스터는 체력 100% 라도 문다. + int HPMultiplier = (isMaster ? 1 : 3); // 현재 HP가 1/1, 1/3 bool bHitRoll = HitRoll::isSuccessBloodDrain(pMonster, pEnemy, HPMultiplier); bool bCanHit = canHit(pMonster, pEnemy, SKILL_BLOOD_DRAIN); - // ʹ Ÿ ~ + // 마스터는 거리에 관계없이 문다~ bool bRangeCheck = isMaster || verifyDistance(pMonster, pEnemy, 1); - // 鿪 . by sigi. 2002.9.13 + // 흡혈 면역 상태. by sigi. 2002.9.13 bool bEffected = pEnemy->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_BLOOD_DRAIN); if (bHitRoll && bCanHit && bRangeCheck && !bEffected) { if (pEnemy->isSlayer()) { // Set EffectBloodDrain - // ͸ ȰǴ. + // 마스터면 안건다. if (!isMaster) { EffectBloodDrain* pEffectBloodDrain = new EffectBloodDrain(pEnemy); pEffectBloodDrain->setLevel(pMonster->getLevel()); - pEffectBloodDrain->setDeadline(BLOODDRAIN_DURATION); // ӽð 3 + pEffectBloodDrain->setDeadline(BLOODDRAIN_DURATION); // 게임시간으로 3일 정도 pEnemy->addEffect(pEffectBloodDrain); pEffectBloodDrain->create(pEnemy->getName()); _GCBloodDrainOK2.addShortData(MODIFY_EFFECT_STAT, Effect::EFFECT_CLASS_BLOOD_DRAIN); @@ -384,10 +384,10 @@ bool BloodDrain::executeMonster(Monster* pMonster, Creature* pEnemy) pTargetSlayer->addModifyInfo(prev, _GCBloodDrainOK2); } - // α׸ . - log(LOG_BLOODDRAINED, pEnemy->getName(), " "); + // 로그를 남긴다. + log(LOG_BLOODDRAINED, pEnemy->getName(), "게임 내의 몬스터"); } - // ƿ콺 쿣..... -_-; ѽð Ʈ Ѵ. ѽð ƴ.. + // 아우스터즈의 경우엔..... -_-; 제한시간 없는 이펙트를 생성한다. 엄밀히 말해 제한시간이 없는 건 아니지만.. // else if ( pEnemy->isOusters() && !isMaster ) // { // EffectBloodDrain* pEffectBloodDrain = new EffectBloodDrain(pEnemy); @@ -418,8 +418,8 @@ bool BloodDrain::executeMonster(Monster* pMonster, Creature* pEnemy) _GCBloodDrainOK3.setObjectID(pMonster->getObjectID()); _GCBloodDrainOK3.setTargetObjectID(pEnemy->getObjectID()); - // Ÿ ÷״ Ǵ. - // ͸ ȰǴ. + // 타겟이 뭐든 플래그는 건다. + // 마스터면 안건다. if (!isMaster) { pEnemy->setFlag(Effect::EFFECT_CLASS_BLOOD_DRAIN); } @@ -455,7 +455,7 @@ bool BloodDrain::executeMonster(Monster* pMonster, Creature* pEnemy) } else if (pEnemy->isMonster()) { Monster* pEnemyMonster = dynamic_cast(pEnemy); - // ϴ ɾش. + // 흡혈당하는 몬스터한테 딜레이 걸어준다. Timeval DelayTurn; DelayTurn.tv_sec = 4; DelayTurn.tv_usec = 500000; @@ -467,7 +467,7 @@ bool BloodDrain::executeMonster(Monster* pMonster, Creature* pEnemy) #endif ) && pMonster->getClanType() == pEnemyMonster->getClanType()) { - // clan ̸ ̶ -_-; + // 같은 clan의 마스터이면 피 상납이라고 볼 수 있을까 -_-; } else { pEnemyMonster->addEnemy(pMonster); } @@ -476,22 +476,22 @@ bool BloodDrain::executeMonster(Monster* pMonster, Creature* pEnemy) targetMaxHP = pEnemyMonster->getHP(ATTR_MAX); } - // ڽ̳ .. HP 15~25% + // 자신이나 상대방 중.. HP가 많은 쪽의 15~25% HP_t maxHP = max((int)pMonster->getHP(ATTR_MAX), targetMaxHP); HP_t drainHP = maxHP * (rand() % 11 + 15) / 100; // 15~25% - // ѹ 1000̻ . + // 한번에 1000이상 안 찬다. if (pMonster->getMonsterType() >= 717) drainHP = min((int)drainHP, 2000); else drainHP = min((int)drainHP, 1000); - // HP ÷ش. + // 몬스터의 HP를 올려준다. HP_t CurrentHP = pMonster->getHP(); HP_t MaxHP = pMonster->getHP(ATTR_MAX); HP_t NewHP = min((int)MaxHP, (int)CurrentHP + (int)drainHP); - // ̾ HP Ѵ. + // 뱀파이어의 HP를 세팅한다. pMonster->setHP(NewHP); GCStatusCurrentHP gcStatusCurrentHP; @@ -499,8 +499,8 @@ bool BloodDrain::executeMonster(Monster* pMonster, Creature* pEnemy) gcStatusCurrentHP.setCurrentHP(NewHP); pZone->broadcastPacket(pMonster->getX(), pMonster->getY(), &gcStatusCurrentHP); - // HP δ. - // ٸ.. MaxHP 10~15% damage + // 흡혈 당한 애의 HP를 줄인다. + // 대상이 내 레벨보다 높다면.. MaxHP의 10~15% damage // by sigi. 2002.9.14 int drainDamage = 0; int myLevel = pMonster->getLevel(); @@ -508,7 +508,7 @@ bool BloodDrain::executeMonster(Monster* pMonster, Creature* pEnemy) if (targetLevel > myLevel) { drainDamage = targetMaxHP * (rand() % 6 + 10) / 100; } else { - // 5̸ 1% ~ + // 레벨 5차이마다 1%씩 더~ int damagePercent = min(30, (rand() % 6 + 10 + (myLevel - targetLevel))); drainDamage = targetMaxHP * damagePercent / 100; } @@ -517,19 +517,19 @@ bool BloodDrain::executeMonster(Monster* pMonster, Creature* pEnemy) // decreaseHP(pZone, pEnemy, drainDamage); EffectDecreaseHP* pEffect = new EffectDecreaseHP(pEnemy); pEffect->setPoint(drainDamage); - pEffect->setDeadline(20); // 2 + pEffect->setDeadline(20); // 2초 후 pEffect->setUserObjectID(pMonster->getObjectID()); pEnemy->addEffect(pEffect); pEnemy->setFlag(Effect::EFFECT_CLASS_DECREASE_HP); } - // ̰.. + // 흡혈 모습 보이게.. list cList; cList.push_back(pEnemy); cList.push_back(pMonster); pZone->broadcastPacket(pMonster->getX(), pMonster->getY(), &_GCBloodDrainOK3, cList); - // + // 흡혈 성공 return true; } diff --git a/src/server/gameserver/skill/BloodDrain.h b/src/server/gameserver/skill/BloodDrain.h index 67a68131..033d2c51 100644 --- a/src/server/gameserver/skill/BloodDrain.h +++ b/src/server/gameserver/skill/BloodDrain.h @@ -9,7 +9,7 @@ #include "SkillHandler.h" -#define BLOODDRAIN_DURATION (3 * 4 * 3600 * 10) // 3 +#define BLOODDRAIN_DURATION (3 * 4 * 3600 * 10) // 3 일 ////////////////////////////////////////////////////////////////////// // class BloodDrain; diff --git a/src/server/gameserver/skill/BloodyBall.cpp b/src/server/gameserver/skill/BloodyBall.cpp index e29c9c6c..c3ea5c1f 100644 --- a/src/server/gameserver/skill/BloodyBall.cpp +++ b/src/server/gameserver/skill/BloodyBall.cpp @@ -10,8 +10,8 @@ #include "SimpleTileMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// BloodyBall::BloodyBall() throw() { __BEGIN_TRY @@ -31,7 +31,7 @@ BloodyBall::BloodyBall() throw() { ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyBall::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -51,7 +51,7 @@ void BloodyBall::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pVampire, getSkillType()); @@ -70,7 +70,7 @@ void BloodyBall::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyBall::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -102,7 +102,7 @@ void BloodyBall::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir param.addMask(m_pBloodyBallMask[i].x, m_pBloodyBallMask[i].y, 100); } - // Knowledge of Blood ִٸ hit bonus 10 + // Knowledge of Blood 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD); @@ -119,7 +119,7 @@ void BloodyBall::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyBall::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) diff --git a/src/server/gameserver/skill/BloodyBreaker.cpp b/src/server/gameserver/skill/BloodyBreaker.cpp index de1d1d68..c0bbf03b 100644 --- a/src/server/gameserver/skill/BloodyBreaker.cpp +++ b/src/server/gameserver/skill/BloodyBreaker.cpp @@ -18,8 +18,8 @@ ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// BloodyBreaker::BloodyBreaker() throw() { __BEGIN_TRY @@ -77,7 +77,7 @@ BloodyBreaker::BloodyBreaker() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyBreaker::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -97,7 +97,7 @@ void BloodyBreaker::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampir Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pVampire, getSkillType()); @@ -116,7 +116,7 @@ void BloodyBreaker::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampir } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyBreaker::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -127,7 +127,7 @@ void BloodyBreaker::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vam // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << "begin " << endl; SkillType_t SkillType = getSkillType(); - // Knowledge of Blood ִٸ hit bonus 10 + // Knowledge of Blood 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD); @@ -143,7 +143,7 @@ void BloodyBreaker::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vam Dir_t Dir = getDirectionToPosition(pVampire->getX(), pVampire->getY(), X, Y); - // knockbackų Ȯ + // 강제로 knockback시킬 확률 // bool bForceKnockback = rand()%100 < output.ToHit; Player* pPlayer = pVampire->getPlayer(); @@ -173,25 +173,25 @@ void BloodyBreaker::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vam bool bRangeCheck = verifyDistance(pVampire, X, Y, pSkillInfo->getRange()); if (bManaCheck && bTimeCheck && bRangeCheck) { - // ߸. + // 마나를 떨어뜨린다. decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); - // ǥ Ѵ. + // 좌표와 방향을 구한다. ZoneCoord_t myX = pVampire->getX(); ZoneCoord_t myY = pVampire->getY(); Dir_t dir = calcDirection(myX, myY, X, Y); list cList; - // knockback recursive ϰ Դ 찡 ִ. - // ׷ ʿ ִ ũ üũѴ. + // knockback 때문에 recursive 하게 데미지를 먹는 경우가 있다. + // 그래서 제일 먼쪽에 있는 마스크부터 체크한다. for (int i = 21; i >= 0; i--) { int tileX = myX + m_pBloodyBreakerMask[Dir][i].x; int tileY = myY + m_pBloodyBreakerMask[Dir][i].y; - // Ÿ ̰, 밡 ƴ϶ ɼ ִ. + // 현재 타일이 존 내부이고, 안전지대가 아니라면 맞을 가능성이 있다. if (rect.ptInRect(tileX, tileY)) { - // Ÿ ޾ƿ´. + // 타일을 받아온다. Tile& tile = pZone->getTile(tileX, tileY); list targetList; @@ -256,13 +256,13 @@ void BloodyBreaker::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vam _GCSkillToTileOK2.addCListElement(targetObjectID); _GCSkillToTileOK5.addCListElement(targetObjectID); - // ϴ ´ Ŷ · ä, ش. + // 일단 맞는 놈이 받을 패킷은 널 상태로 한 채로, 데미지를 준다. setDamage(pTargetCreature, Damage, pVampire, SkillType, NULL, &_GCSkillToTileOK1); computeAlignmentChange(pTargetCreature, Damage, pVampire, NULL, &_GCSkillToTileOK1); increaseAlignment(pVampire, pTargetCreature, _GCSkillToTileOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bForceKnockback) { knockbackCreature(pZone, pTargetCreature, pVampire->getX(), pVampire->getY()); } @@ -278,7 +278,7 @@ void BloodyBreaker::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vam } - // ߸. + // 공격자의 아이템 내구성을 떨어뜨린다. decreaseDurability(pVampire, NULL, pSkillInfo, &_GCSkillToTileOK1, NULL); _GCSkillToTileOK1.setSkillType(SkillType); @@ -304,7 +304,7 @@ void BloodyBreaker::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vam pPlayer->sendPacket(&_GCSkillToTileOK1); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; Assert(pTargetCreature != NULL); @@ -312,7 +312,7 @@ void BloodyBreaker::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vam if (pTargetCreature->isPC()) { _GCSkillToTileOK2.clearList(); - // HP Ŷ Ѵ. + // HP의 변경사항을 패킷에다 기록한다. HP_t targetHP = 0; if (pTargetCreature->isSlayer()) { targetHP = (dynamic_cast(pTargetCreature))->getHP(ATTR_CURRENT); @@ -324,13 +324,13 @@ void BloodyBreaker::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vam _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // ߸. + // 아이템의 내구력을 떨어뜨린다. decreaseDurability(NULL, pTargetCreature, pSkillInfo, NULL, &_GCSkillToTileOK2); - // Ŷ ش. + // 패킷을 보내준다. pTargetCreature->getPlayer()->sendPacket(&_GCSkillToTileOK2); } else if (pTargetCreature->isMonster()) { - // νѴ. + // 당근 적으로 인식한다. Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pVampire); } diff --git a/src/server/gameserver/skill/BloodyKnife.cpp b/src/server/gameserver/skill/BloodyKnife.cpp index be001af2..d43a80d4 100644 --- a/src/server/gameserver/skill/BloodyKnife.cpp +++ b/src/server/gameserver/skill/BloodyKnife.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyKnife::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -38,7 +38,7 @@ void BloodyKnife::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS SIMPLE_SKILL_OUTPUT result; - // Knowledge of Blood ִٸ hit bonus 10 + // Knowledge of Blood 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD); @@ -55,7 +55,7 @@ void BloodyKnife::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyKnife::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/BloodyMarker.cpp b/src/server/gameserver/skill/BloodyMarker.cpp index 5eeb7e45..7268df99 100644 --- a/src/server/gameserver/skill/BloodyMarker.cpp +++ b/src/server/gameserver/skill/BloodyMarker.cpp @@ -14,7 +14,7 @@ #include "item/VampirePortalItem.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ κ丮 ڵ鷯 +// 뱀파이어 인벤토리 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyMarker::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordInven_t X, CoordInven_t Y, CoordInven_t TargetX, CoordInven_t TargetY, VampireSkillSlot* pSkillSlot) @@ -36,17 +36,17 @@ void BloodyMarker::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordInv Assert(pInventory != NULL); Assert(pZone != NULL); - // ̶ BloodyMark . - // ϴ ZoneID µ.. ZoneInfo ֵ ؾѴ. + // 전쟁 존이라면 BloodyMark를 사용할 수 없다. + // 일단은 ZoneID로 가는데.. ZoneInfo에 넣도록 해야한다. ///* // int zoneID = pZone->getZoneID(); // if (pZone->getZoneID()==1122 || pZone->getZoneID()==1123) - // ̺Ʈ /OX . by sigi. 2002.8.31 + // 이벤트 경기장/OX 막기. by sigi. 2002.8.31 // if (zoneID==1005 || zoneID==1006) if (pZone->isNoPortalZone() || pZone->isMasterLair() - // ε . by bezz, Sequoia 2003. 1.20. + // 성 안으로도 막기. by bezz, Sequoia 2003. 1.20. || pZone->isCastle() || pZone->isHolyLand()) { executeSkillFailException(pVampire, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -55,7 +55,7 @@ void BloodyMarker::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordInv //*/ Item* pItem = pInventory->getItem(X, Y); - // ̰ų, Ż ƴϰų, ƮID Ʋٸ... + // 아이템이 널이거나, 포탈 아이템이 아니거나, 오브젝트ID가 틀리다면... if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_VAMPIRE_PORTAL_ITEM || pItem->getObjectID() != InvenObjectID) { executeSkillFailException(pVampire, getSkillType()); @@ -66,7 +66,7 @@ void BloodyMarker::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordInv VampirePortalItem* pVampirePortalItem = dynamic_cast(pItem); Assert(pVampirePortalItem != NULL); - // ̾ Ż ۿ ̹ ġ ϵǾ 쿡... + // 뱀파이어 포탈 아이템에 이미 임의의 위치가 기록되어 있을 경우에도... if (pVampirePortalItem->getZoneID() != 0 || pVampirePortalItem->getX() != 0 || pVampirePortalItem->getY() != 0) { executeSkillFailException(pVampire, getSkillType()); @@ -85,14 +85,14 @@ void BloodyMarker::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordInv bool bRangeCheck = checkZoneLevelToUseSkill(pVampire); if (bManaCheck && bTimeCheck && bRangeCheck) { - // ̰... + // 마나를 줄이고... decreaseMana(pVampire, RequiredMP, _GCSkillToInventoryOK1); SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); - // ۿٰ ġ ϰ, ̺Ѵ. + // 아이템에다가 현재의 위치를 기록하고, 세이브한다. pVampirePortalItem->setZoneID(pZone->getZoneID()); pVampirePortalItem->setX(pVampire->getX()); pVampirePortalItem->setY(pVampire->getY()); diff --git a/src/server/gameserver/skill/BloodyMasterWave.cpp b/src/server/gameserver/skill/BloodyMasterWave.cpp index b655d347..a9933c7c 100644 --- a/src/server/gameserver/skill/BloodyMasterWave.cpp +++ b/src/server/gameserver/skill/BloodyMasterWave.cpp @@ -9,8 +9,8 @@ #include "SimpleTileMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// BloodyMasterWave::BloodyMasterWave() throw() { __BEGIN_TRY @@ -48,7 +48,7 @@ BloodyMasterWave::BloodyMasterWave() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ̾ +// 뱀파이어 셀프 ////////////////////////////////////////////////////////////////////////////// void BloodyMasterWave::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -73,7 +73,7 @@ void BloodyMasterWave::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkil } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyMasterWave::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -93,7 +93,7 @@ void BloodyMasterWave::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vam // Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 /* if (pTargetCreature==NULL) { @@ -115,7 +115,7 @@ void BloodyMasterWave::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vam } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyMasterWave::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -147,7 +147,7 @@ void BloodyMasterWave::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, param.addMask(m_pBloodyMasterWaveMask[i].x, m_pBloodyMasterWaveMask[i].y, 100); } - // knockbackų Ȯ + // 강제로 knockback시킬 확률 bool bForceKnockback = rand() % 100 < output.ToHit; g_SimpleTileMissileSkill.execute(pVampire, pVampire->getX(), pVampire->getY(), pVampireSkillSlot, param, result, 0, @@ -159,7 +159,7 @@ void BloodyMasterWave::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyMasterWave::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -192,7 +192,7 @@ void BloodyMasterWave::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) bool bForceKnockback = false; - // ʹ knockbackŲ. + // 마스터는 강제로 knockback시킨다. if (pMonster->isMaster()) { bForceKnockback = true; } diff --git a/src/server/gameserver/skill/BloodyNail.cpp b/src/server/gameserver/skill/BloodyNail.cpp index cb3e70c9..b231560b 100644 --- a/src/server/gameserver/skill/BloodyNail.cpp +++ b/src/server/gameserver/skill/BloodyNail.cpp @@ -10,7 +10,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyNail::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -38,7 +38,7 @@ void BloodyNail::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk SIMPLE_SKILL_OUTPUT result; - // Tiger Nail ִٸ 10% + // Tiger Nail 이 있다면 데미지 10% 증가 if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_TIGER_NAIL)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_TIGER_NAIL); Assert(pRankBonus != NULL); @@ -46,7 +46,7 @@ void BloodyNail::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk param.SkillDamage += getPercentValue(param.SkillDamage, pRankBonus->getPoint()); } - // Knowledge of Blood ִٸ hit bonus 10 + // Knowledge of Blood 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD); @@ -63,7 +63,7 @@ void BloodyNail::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyNail::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/BloodyScarify.cpp b/src/server/gameserver/skill/BloodyScarify.cpp index 5d761e70..6049e8e2 100644 --- a/src/server/gameserver/skill/BloodyScarify.cpp +++ b/src/server/gameserver/skill/BloodyScarify.cpp @@ -24,7 +24,7 @@ #include "Zone.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyScarify::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -54,8 +54,8 @@ void BloodyScarify::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampir return; } - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (!canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); return; @@ -81,7 +81,7 @@ void BloodyScarify::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampir bool bHitRoll = HitRoll::isSuccess(pVampire, pTargetCreature); bool bCanHit = canHit(pVampire, pTargetCreature, getSkillType()); bool bPK = verifyPK(pVampire, pTargetCreature); - // add by Coffee 2007-6-9 ӿ۳ܿ + // add by Coffee 2007-6-9 藤속왱뇜세콘엥 // bool bUseSkillCrad = useSkillCrad(pVampire); /* bool bFastMove = false; @@ -104,7 +104,7 @@ void BloodyScarify::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampir bool bCriticalHit = false; Damage += computeDamage(pVampire, pTargetCreature, 0, bCriticalHit); - // ´. + // 마나를 깍는다. decreaseMana(pVampire, RequiredMP, _GCSkillToObjectOK1); EffectSetAfire* pEffect = new EffectSetAfire(pTargetCreature); @@ -117,7 +117,7 @@ void BloodyScarify::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampir increaseAlignment(pVampire, pTargetCreature, _GCSkillToObjectOK1); - // Ŷ . + // 패킷을 보낸다. _GCSkillToObjectOK1.setSkillType(getSkillType()); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); @@ -216,22 +216,22 @@ void BloodyScarify::eatCorpse(Vampire* pVampire, Item* pCorpse, VampireSkillSlot Effect* pEffect = pVampire->findEffect(Effect::EFFECT_CLASS_HP_RECOVERY); EffectHPRecovery* pEffectHPRecoveryEffect = dynamic_cast(pEffect); - // ؾ Ѵٴ ش. + // 몇번 더 해야 한다는 것을 갱신해 준다. Turn_t OldCount = pEffectHPRecoveryEffect->getPeriod(); Turn_t NewPeriod = OldCount + Period; pEffectHPRecoveryEffect->setPeriod(NewPeriod); pEffectHPRecoveryEffect->setDeadline(NewPeriod * RegenPeriod); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; - gcHPRecoveryStartToSelf.setPeriod(NewPeriod); // ȸϳ? - gcHPRecoveryStartToSelf.setDelay(RegenPeriod); // ϳ? - gcHPRecoveryStartToSelf.setQuantity(RegenHPUnit); // ѹ 󸶳 ȸϳ? + gcHPRecoveryStartToSelf.setPeriod(NewPeriod); // 몇번 회복하나? + gcHPRecoveryStartToSelf.setDelay(RegenPeriod); // 몇 초 단위로 하나? + gcHPRecoveryStartToSelf.setQuantity(RegenHPUnit); // 한번에 얼마나 회복하나? pVampire->getPlayer()->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ٸ̵鿡 . - // ȸ Ŷ, ۰ Ŷ . + // 회복 시작하라는 패킷을 다른이들에게 보낸다. + // 회복 갱신 패킷, 시작과 똑 같은 패킷을 보낸다. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pVampire->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(NewPeriod); @@ -251,7 +251,7 @@ void BloodyScarify::eatCorpse(Vampire* pVampire, Item* pCorpse, VampireSkillSlot pVampire->addEffect(pEffectHPRecovery); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; gcHPRecoveryStartToSelf.setPeriod(Period); gcHPRecoveryStartToSelf.setDelay(RegenPeriod); @@ -259,7 +259,7 @@ void BloodyScarify::eatCorpse(Vampire* pVampire, Item* pCorpse, VampireSkillSlot pVampire->getPlayer()->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ̵鿡 . + // 회복 시작하라는 패킷을 보는이들에게 보낸다. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pVampire->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(Period); @@ -269,7 +269,7 @@ void BloodyScarify::eatCorpse(Vampire* pVampire, Item* pCorpse, VampireSkillSlot pZone->broadcastPacket(pVampire->getX(), pVampire->getY(), &gcHPRecoveryStartToOthers, pVampire); } - // Ŷ . + // 패킷을 보낸다. _GCSkillToObjectOK1.setSkillType(getSkillType()); _GCSkillToObjectOK1.setCEffectID(0); _GCSkillToObjectOK1.setTargetObjectID(pTargetCorpse->getObjectID()); @@ -291,13 +291,13 @@ void BloodyScarify::eatCorpse(Vampire* pVampire, Item* pCorpse, VampireSkillSlot pVampireSkillSlot->setRunTime(output.Delay); - // Ŷ . + // 사라지는 패킷을 날린다. GCDeleteObject gcDO; gcDO.setObjectID(pTargetCorpse->getObjectID()); pZone->broadcastPacket(pTargetCorpse->getX(), pTargetCorpse->getY(), &gcDO); - // . + // 존에서 지운다. pZone->deleteItem(pTargetCorpse, pTargetCorpse->getX(), pTargetCorpse->getY()); - // ȿ ͸ Ƿ ͸ Ѵ. + // 존안에서 실제적으로 포인터를 없애지는 않으므로 포인터를 삭제 시켜 줘야 한다. SAFE_DELETE(pTargetCorpse); } diff --git a/src/server/gameserver/skill/BloodySnake.cpp b/src/server/gameserver/skill/BloodySnake.cpp index 9d6e0760..922f6502 100644 --- a/src/server/gameserver/skill/BloodySnake.cpp +++ b/src/server/gameserver/skill/BloodySnake.cpp @@ -19,7 +19,7 @@ #include "GCSkillToTileOK6.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodySnake::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -39,7 +39,7 @@ void BloodySnake::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature)) { executeSkillFailException(pVampire, getSkillType()); return; @@ -56,7 +56,7 @@ void BloodySnake::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodySnake::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -103,7 +103,7 @@ void BloodySnake::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bTileCheck) { decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); - // Ʈ ӽð Ѵ. + // 이펙트의 지속시간을 계산한다. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); @@ -120,16 +120,16 @@ void BloodySnake::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi if (rect.ptInRect(tileX, tileY)) { Tile& tile = pZone->getTile(tileX, tileY); - // ŸϿ Ʈ ߰ ִٸ... + // 현재 타일에다 이펙트를 추가할 수 있다면... if (tile.canAddEffect()) { - // effect . + // 같은 effect가 있으면 지운다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_BLOODY_SNAKE); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); // fix me } - // Ʈ Ŭ Ѵ. + // 이펙트 클래스를 생성한다. EffectBloodySnake* pEffect = new EffectBloodySnake(pZone, tileX, tileY); pEffect->setCasterName(pVampire->getName()); pEffect->setCasterID(pVampire->getObjectID()); @@ -141,7 +141,7 @@ void BloodySnake::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi pEffect->setTick(output.Tick + (output.Tick >> 1)); pEffect->setDir(Dir); - // Tile ̴ Effect ObjectID Ϲ޾ƾ Ѵ. + // Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); pZone->addEffect(pEffect); @@ -230,8 +230,8 @@ void BloodySnake::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi list watcherList = pZone->getWatcherList(myX, myY, pVampire); - // watcherList cList ʰ, caster(pVampire) - // OK4 .. cList ߰Ѵ. + // watcherList에서 cList에 속하지 않고, caster(pVampire)를 볼 수 없는 경우는 + // OK4를 보내고.. cList에 추가한다. for (list::const_iterator itr = watcherList.begin(); itr != watcherList.end(); itr++) { bool bBelong = false; for (list::const_iterator tItr = cList.begin(); tItr != cList.end(); tItr++) @@ -240,9 +240,9 @@ void BloodySnake::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi Creature* pWatcher = (*itr); if (bBelong == false && canSee(pWatcher, pVampire) == false) { - // Assert(pWatcher->isPC()); // 翬 PC.. Zone::getWatcherList PC returnѴ + // Assert(pWatcher->isPC()); // 당연 PC다.. Zone::getWatcherList는 PC만 return한다 if (!pWatcher->isPC()) { - // cout << "BloodySnake : ó Ʈ PC ƴմϴ." << endl; + // cout << "BloodySnake : 왓처 리스트가 PC가 아닙니다." << endl; GCSkillFailed1 _GCSkillFailed1; _GCSkillFailed1.setSkillType(getSkillType()); pVampire->getPlayer()->sendPacket(&_GCSkillFailed1); @@ -289,7 +289,7 @@ void BloodySnake::execute(Monster* pMonster, Creature* pEnemy) } ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodySnake::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -317,7 +317,7 @@ void BloodySnake::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) ZoneCoord_t myX = pMonster->getX(); ZoneCoord_t myY = pMonster->getY(); - // ʹ ~~ + // 마스터는 무조건~~ bool bRangeCheck = pMonster->isMaster() || verifyDistance(pMonster, X, Y, pSkillInfo->getRange()); bool bHitRoll = pMonster->isMaster() || HitRoll::isSuccessMagic(pMonster, pSkillInfo); @@ -328,7 +328,7 @@ void BloodySnake::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) bTileCheck = true; if (bRangeCheck && bHitRoll && bTileCheck) { - // Ʈ ӽð Ѵ. + // 이펙트의 지속시간을 계산한다. SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); @@ -336,7 +336,7 @@ void BloodySnake::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) // Range_t Range = 3; Dir_t StartDir, EndDir; - // ʹ 8 + // 마스터는 8방향 if (pMonster->isMaster()) { StartDir = LEFT; EndDir = LEFTUP; @@ -356,16 +356,16 @@ void BloodySnake::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) if (rect.ptInRect(tileX, tileY)) { Tile& tile = pZone->getTile(tileX, tileY); - // ŸϿ Ʈ ߰ ִٸ... + // 현재 타일에다 이펙트를 추가할 수 있다면... if (tile.canAddEffect()) { - // effect . + // 같은 effect가 있으면 지운다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_BLOODY_SNAKE); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); // fix me } - // Ʈ Ŭ Ѵ. + // 이펙트 클래스를 생성한다. EffectBloodySnake* pEffect = new EffectBloodySnake(pZone, tileX, tileY); pEffect->setCasterName(pMonster->getName()); pEffect->setCasterID(pMonster->getObjectID()); @@ -377,7 +377,7 @@ void BloodySnake::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pEffect->setTick(output.Tick + (output.Tick >> 1)); pEffect->setDir(Dir); - // Tile ̴ Effect ObjectID Ϲ޾ƾ Ѵ. + // Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); @@ -459,8 +459,8 @@ void BloodySnake::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) list watcherList = pZone->getWatcherList(myX, myY, pMonster); - // watcherList cList ʰ, caster(pMonster) - // OK4 .. cList ߰Ѵ. + // watcherList에서 cList에 속하지 않고, caster(pMonster)를 볼 수 없는 경우는 + // OK4를 보내고.. cList에 추가한다. for (list::const_iterator itr = watcherList.begin(); itr != watcherList.end(); itr++) { bool bBelong = false; for (list::const_iterator tItr = cList.begin(); tItr != cList.end(); tItr++) @@ -469,7 +469,7 @@ void BloodySnake::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) Creature* pWatcher = (*itr); if (bBelong == false && canSee(pWatcher, pMonster) == false) { - // Assert(pWatcher->isPC()); // 翬 PC.. Zone::getWatcherList PC returnѴ + // Assert(pWatcher->isPC()); // 당연 PC다.. Zone::getWatcherList는 PC만 return한다 if (!pWatcher->isPC()) { // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; diff --git a/src/server/gameserver/skill/BloodySpear.cpp b/src/server/gameserver/skill/BloodySpear.cpp index 4cee1e43..1440e0a1 100644 --- a/src/server/gameserver/skill/BloodySpear.cpp +++ b/src/server/gameserver/skill/BloodySpear.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodySpear::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -38,7 +38,7 @@ void BloodySpear::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS SIMPLE_SKILL_OUTPUT result; - // Knowledge of Blood ִٸ hit bonus 10 + // Knowledge of Blood 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD); @@ -55,7 +55,7 @@ void BloodySpear::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodySpear::execute(Monster* pMonster, Creature* pEnemy) @@ -111,9 +111,9 @@ void BloodySpear::execute(Monster* pMonster, Creature* pEnemy) pTargetCreature = tile.getCreature(Creature::MOVE_MODE_WALKING); if (pTargetCreature != NULL - // NPC ƴϾ Ѵ. + // NPC도 아니어야 한다. && !pTargetCreature->isNPC() - // ´ Ȯ + // 공격 대상이 맞는지 확인 && pMonster->isEnemyToAttack(pTargetCreature)) { g_SimpleMissileSkill.execute(pMonster, pTargetCreature, param, result); } diff --git a/src/server/gameserver/skill/BloodyStorm.cpp b/src/server/gameserver/skill/BloodyStorm.cpp index f6a64c95..e3ec6e03 100644 --- a/src/server/gameserver/skill/BloodyStorm.cpp +++ b/src/server/gameserver/skill/BloodyStorm.cpp @@ -18,7 +18,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// ¹ìÆÄÀÌ¾î ¿ÀºêÁ§Æ® Çڵ鷯 ////////////////////////////////////////////////////////////////////////////// void BloodyStorm::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -39,7 +39,7 @@ void BloodyStorm::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuchÁ¦°Å. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); @@ -58,7 +58,7 @@ void BloodyStorm::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// ¹ìÆÄÀ̾î ŸÀÏ Çڵ鷯 ////////////////////////////////////////////////////////////////////////////// void BloodyStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -88,7 +88,7 @@ void BloodyStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi ZoneCoord_t myX = pVampire->getX(); ZoneCoord_t myY = pVampire->getY(); - // Knowledge of Blood ִٸ hit bonus 10 + // Knowledge of Blood °¡ ÀÖ´Ù¸é hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD); @@ -121,7 +121,7 @@ void BloodyStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi SkillOutput output; computeOutput(input, output); - // Disruption Storm ִٸ 20% + // Disruption Storm ÀÌ ÀÖ´Ù¸é µ¥¹ÌÁö 20% Áõ°¡ if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_DISRUPTION_STORM)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_DISRUPTION_STORM); Assert(pRankBonus != NULL); @@ -131,7 +131,7 @@ void BloodyStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi Range_t Range = 3; - // Ʈ ŸϿ ִٸ Ѵ. + // ±âÁ¸¿¡ °°Àº ÀÌÆåÆ®°¡ ŸÀÏ¿¡ ÀÖ´Ù¸é Áö¿ì°í »õ·Î ¼³Á¤ÇÑ´Ù. Tile& tile = pZone->getTile(X, Y); Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_BLOODY_STORM); if (pOldEffect != NULL) { @@ -139,7 +139,7 @@ void BloodyStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi pZone->deleteEffect(effectID); } - // Ʈ Ʈ ؼ ŸϿ δ. + // ÀÌÆåÆ® ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇؼ­ ŸÀÏ¿¡ ºÙÀδÙ. EffectBloodyStorm* pEffect = new EffectBloodyStorm(pZone, X, Y); pEffect->setDeadline(output.Duration); pEffect->setNextTime(0); @@ -159,9 +159,9 @@ void BloodyStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi tile.addEffect(pEffect); - // Ʈ Creature effect ٿش. - // Vampire VampireԴ - // ش ʴ´. + // ÀÌÆåÆ® ¹üÀ§³»ÀÇ ¸ðµç Creature¿¡°Ô effect¸¦ ºÙ¿©ÁØ´Ù. + // Vampire°¡ ±â¼úÀ» »ç¿ëÇÑ °æ¿ì °°Àº Vampire¿¡°Ô´Â + // ÇØ´çÇÏÁö ¾Ê´Â´Ù. // bool bEffected = false; Creature* pTargetCreature; @@ -176,13 +176,13 @@ void BloodyStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi int tileX = X + oX; int tileY = Y + oY; - // Ʈ ߰Ϸ Zone ʴٸ Ѿ + // ¸¸¾à ÀÌÆåÆ®¸¦ Ãß°¡ÇÏ·Á´Â °÷ÀÌ Zone¿¡ ¼ÓÇØ ÀÖÁö ¾Ê´Ù¸é ³Ñ¾î°£´ if (!rect.ptInRect(tileX, tileY)) continue; Tile& tile = pZone->getTile(tileX, tileY); - // ش ŸϿ Ʈ ߰ ٸ Ѿ. + // ÇØ´ç ŸÀÏ¿¡ ÀÌÆåÆ®¸¦ Ãß°¡ÇÒ ¼ö ¾ø´Ù¸é ³Ñ¾î°£´Ù. if (!tile.canAddEffect()) continue; @@ -209,7 +209,7 @@ void BloodyStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi cList.push_back(pTargetCreature); if (bCanSee) { - // + // °ø°ÝÀ» ´çÇÑ »ç¶÷¿¡°Ô _GCSkillToTileOK2.setObjectID(pVampire->getObjectID()); _GCSkillToTileOK2.setSkillType(SkillType); _GCSkillToTileOK2.setX(X); @@ -228,7 +228,7 @@ void BloodyStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi } // if(pTargetCreature!= NULL) } - // 鿡 + // ±â¼úÀ» »ç¿ëÇÑ »ç¶÷µé¿¡°Ô _GCSkillToTileOK1.setSkillType(SkillType); _GCSkillToTileOK1.setCEffectID(CEffectID); _GCSkillToTileOK1.setX(X); @@ -236,19 +236,19 @@ void BloodyStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi _GCSkillToTileOK1.setDuration(output.Duration); _GCSkillToTileOK1.setRange(Range); - // ִ 鿡 + // ±â¼úÀ» ¾´ »ç¶÷¸¸ º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(X); _GCSkillToTileOK3.setY(Y); - // ִ 鿡 + // ±â¼úÀ» ´çÇÑ »ç¶÷¸¸ º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); - // ִ 鿡 + // ±â¼úÀ» ¾´ »ç¶÷°ú ´çÇÑ »ç¶÷À» ¸ðµÎ º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô _GCSkillToTileOK5.setObjectID(pVampire->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); @@ -256,19 +256,19 @@ void BloodyStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); - // packet + // ±â¼úÀ» »ç¿ëÇÑ »ç¶÷¿¡°Ô packet Àü´Þ pPlayer->sendPacket(&_GCSkillToTileOK1); - // ִ 鿡 broadcasing + // ±â¼úÀ» ¾µ »ç¶÷°ú ´çÇÑ »ç¶÷À» ¸ðµÎ º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô broadcasing cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); - // ִ 鿡 broadcasting + // ±â¼úÀ» ¾´ »ç¶÷À» º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô broadcasting pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); - // ִ 鿡 broadcasting + // ±â¼úÀ» ´çÇÑ »ç¶÷À» º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô broadcasting pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); - // delay setting + // ±â¼ú delay setting pVampireSkillSlot->setRunTime(output.Delay); } else { executeSkillFailNormal(pVampire, getSkillType(), NULL); @@ -283,7 +283,7 @@ void BloodyStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// ¸ó½ºÅÍ Å¸ÀÏ Çڵ鷯 ////////////////////////////////////////////////////////////////////////////// void BloodyStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -332,7 +332,7 @@ void BloodyStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) Range_t Range = 3; - // Ʈ ŸϿ ִٸ Ѵ. + // ±âÁ¸¿¡ °°Àº ÀÌÆåÆ®°¡ ŸÀÏ¿¡ ÀÖ´Ù¸é Áö¿ì°í »õ·Î ¼³Á¤ÇÑ´Ù. Tile& tile = pZone->getTile(X, Y); Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_BLOODY_STORM); if (pOldEffect != NULL) { @@ -340,7 +340,7 @@ void BloodyStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pZone->deleteEffect(effectID); } - // Ʈ Ʈ ؼ ŸϿ δ. + // ÀÌÆåÆ® ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇؼ­ ŸÀÏ¿¡ ºÙÀδÙ. EffectBloodyStorm* pEffect = new EffectBloodyStorm(pZone, X, Y); pEffect->setDeadline(output.Duration); pEffect->setNextTime(0); @@ -359,9 +359,9 @@ void BloodyStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) tile.addEffect(pEffect); - // Ʈ Creature effect ٿش. - // Vampire VampireԴ - // ش ʴ´. + // ÀÌÆåÆ® ¹üÀ§³»ÀÇ ¸ðµç Creature¿¡°Ô effect¸¦ ºÙ¿©ÁØ´Ù. + // Vampire°¡ ±â¼úÀ» »ç¿ëÇÑ °æ¿ì °°Àº Vampire¿¡°Ô´Â + // ÇØ´çÇÏÁö ¾Ê´Â´Ù. // bool bEffected = false; Creature* pTargetCreature; @@ -382,7 +382,7 @@ void BloodyStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) int tileX = X + oX; int tileY = Y + oY; - // Ÿ  Damage/2 Ѵ. + // °Å¸®¸¦ ¹þ¾î³ª¸é Damage/2¸¸ Àû¿ëÇÑ´Ù. if (oX <= -2 || oY <= -2 || oX >= 2 || oY >= 2) pEffect->setDamage(output.Damage / 2); else @@ -401,7 +401,7 @@ void BloodyStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pTargetCreature = tile.getCreature(Creature::MOVE_MODE_WALKING); if (pTargetCreature != NULL - // ´ ȮѴ. + // °ø°Ý ´ë»óÀÌ ¸Â´ÂÁö È®ÀÎÇÑ´Ù. && pMonster->isEnemyToAttack(pTargetCreature)) { // 2003. 1. 10. Sequoia if (!checkZoneLevelToHitTarget(pTargetCreature)) @@ -421,7 +421,7 @@ void BloodyStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) cList.push_back(pTargetCreature); if (bCanSee) { - // + // °ø°ÝÀ» ´çÇÑ »ç¶÷¿¡°Ô _GCSkillToTileOK2.setObjectID(pMonster->getObjectID()); _GCSkillToTileOK2.setSkillType(SkillType); _GCSkillToTileOK2.setX(X); @@ -440,19 +440,19 @@ void BloodyStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) } // if(pTargetCreature!= NULL) } - // ִ 鿡 + // ±â¼úÀ» ¾´ »ç¶÷¸¸ º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(myX); _GCSkillToTileOK3.setY(myY); - // ִ 鿡 + // ±â¼úÀ» ´çÇÑ »ç¶÷¸¸ º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); - // ִ 鿡 + // ±â¼úÀ» ¾´ »ç¶÷°ú ´çÇÑ »ç¶÷À» ¸ðµÎ º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô _GCSkillToTileOK5.setObjectID(pMonster->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); @@ -460,13 +460,13 @@ void BloodyStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); - // ִ 鿡 broadcasing + // ±â¼úÀ» ¾µ »ç¶÷°ú ´çÇÑ »ç¶÷À» ¸ðµÎ º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô broadcasing cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); - // ִ 鿡 broadcasting + // ±â¼úÀ» ¾´ »ç¶÷À» º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô broadcasting pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); - // ִ 鿡 broadcasting + // ±â¼úÀ» ´çÇÑ »ç¶÷À» º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô broadcasting pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); } else { diff --git a/src/server/gameserver/skill/BloodyStrike.cpp b/src/server/gameserver/skill/BloodyStrike.cpp index a1a8db4e..b5f20f7a 100644 --- a/src/server/gameserver/skill/BloodyStrike.cpp +++ b/src/server/gameserver/skill/BloodyStrike.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyStrike::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -38,7 +38,7 @@ void BloodyStrike::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire SIMPLE_SKILL_OUTPUT result; - // Knowledge of Blood ִٸ hit bonus 10 + // Knowledge of Blood 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD); @@ -55,7 +55,7 @@ void BloodyStrike::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyStrike::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/BloodyTunnel.cpp b/src/server/gameserver/skill/BloodyTunnel.cpp index 39526943..2e192932 100644 --- a/src/server/gameserver/skill/BloodyTunnel.cpp +++ b/src/server/gameserver/skill/BloodyTunnel.cpp @@ -15,7 +15,7 @@ #include "item/VampirePortalItem.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ κ丮 ڵ鷯 +// 뱀파이어 인벤토리 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyTunnel::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordInven_t X, CoordInven_t Y, CoordInven_t TargetX, CoordInven_t TargetY, VampireSkillSlot* pSkillSlot) @@ -37,11 +37,11 @@ void BloodyTunnel::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordInv Assert(pZone != NULL); Assert(pInventory != NULL); - // ̶ BloodyTunnel . - // ϴ ZoneID µ.. ZoneInfo ֵ ؾѴ. + // 전쟁 존이라면 BloodyTunnel를 사용할 수 없다. + // 일단은 ZoneID로 가는데.. ZoneInfo에 넣도록 해야한다. ///* // if (pZone->getZoneID()==1122 || pZone->getZoneID()==1123) - // ̺Ʈ /OX . by sigi. 2002.8.31 + // 이벤트 경기장/OX 막기. by sigi. 2002.8.31 // int zoneID = pZone->getZoneID(); // if (zoneID==1005 || zoneID==1006) if (pZone->isNoPortalZone() || pZone->isMasterLair() || pZone->isCastle() || pZone->isHolyLand()) { @@ -53,7 +53,7 @@ void BloodyTunnel::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordInv Item* pItem = pInventory->getItem(X, Y); - // ų, ̾ Ż ƴϰų, OID Ʋٸ Ұ + // 아이템이 없거나, 뱀파이어 포탈 아이템이 아니거나, OID가 틀리다면 기술 사용 불가 if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_VAMPIRE_PORTAL_ITEM || pItem->getObjectID() != InvenObjectID) { executeSkillFailException(pVampire, getSkillType()); @@ -64,7 +64,7 @@ void BloodyTunnel::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordInv VampirePortalItem* pVampirePortalItem = dynamic_cast(pItem); Assert(pVampirePortalItem != NULL); - // ̾ Ż ۿ ϵ ġ 쿡 д. + // 뱀파이어 포탈 아이템에 기록된 위치가 없을 경우에는 실패다. ZoneID_t zoneid = pVampirePortalItem->getZoneID(); ZoneCoord_t tx = pVampirePortalItem->getX(); ZoneCoord_t ty = pVampirePortalItem->getY(); @@ -74,16 +74,16 @@ void BloodyTunnel::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordInv return; } - // ǥ ǥ Ѵ. + // 얻어온 목표 존과 좌표를 검증한다. Zone* pTargetZone = getZoneByZoneID(zoneid); - // ƴ ٸ ʴ´. + // 아담의 성지와 다른 존과는 연결되지 않는다. if (pZone->isHolyLand() != pTargetZone->isHolyLand()) { executeSkillFailException(pVampire, getSkillType()); return; } - // cout << "Ÿ ȹ " << endl; + // cout << "타겟 존 포인터 획득 성공" << endl; VSRect* pRect = pTargetZone->getOuterRect(); @@ -93,7 +93,7 @@ void BloodyTunnel::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordInv return; } - // cout << "ǥ " << endl; + // cout << "좌표 검증 성공" << endl; GCSkillToInventoryOK1 _GCSkillToInventoryOK1; @@ -114,7 +114,7 @@ void BloodyTunnel::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordInv SkillOutput output; computeOutput(input, output); - // ٰ Ż Ѵ. + // 각각의 존에다가 포탈을 더한다. ZONE_COORD s_coord; ZONE_COORD t_coord; @@ -136,19 +136,19 @@ void BloodyTunnel::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordInv pPlayer->sendPacket(&_GCSkillToInventoryOK1); - // δ. + // 차지 수를 줄인다. pVampirePortalItem->setCharge(pVampirePortalItem->getCharge() - 1); if (pVampirePortalItem->getCharge() > 0) { - // Ҵٸ д. + // 아직 차지가 남았다면 살려둔다. pVampirePortalItem->save(pVampire->getName(), STORAGE_INVENTORY, 0, X, Y); } else { - // Ż ҸǾٸ Ų. + // 포탈 아이템의 차지가 다 소모되었다면 삭제시킨다. pInventory->deleteItem(X, Y); pVampirePortalItem->destroy(); - // ü , NULL Ǹ, - // Ʈ ο ͵ NULL ǰ... + // 아이템 포인터 자체가 지워지고, NULL이 되면, + // 이펙트 내부에서의 아이템 포인터도 NULL이 되겠지... SAFE_DELETE(pVampirePortalItem); } diff --git a/src/server/gameserver/skill/BloodyWall.cpp b/src/server/gameserver/skill/BloodyWall.cpp index 7711b734..870812c0 100644 --- a/src/server/gameserver/skill/BloodyWall.cpp +++ b/src/server/gameserver/skill/BloodyWall.cpp @@ -77,7 +77,7 @@ BloodyWall::BloodyWall() throw() { }; ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyWall::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -97,7 +97,7 @@ void BloodyWall::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature)) { executeSkillFailException(pVampire, getSkillType()); return; @@ -114,7 +114,7 @@ void BloodyWall::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyWall::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -147,7 +147,7 @@ void BloodyWall::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir ZoneCoord_t myX = pVampire->getX(); ZoneCoord_t myY = pVampire->getY(); - // Knowledge of Blood ִٸ hit bonus 10 + // Knowledge of Blood 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD); @@ -170,7 +170,7 @@ void BloodyWall::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bTileCheck) { decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); - // Ʈ ӽð Ѵ. + // 이펙트의 지속시간을 계산한다. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); @@ -192,16 +192,16 @@ void BloodyWall::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir if (tile.getEffect(Effect::EFFECT_CLASS_HEAVEN_GROUND) != NULL) continue; - // ŸϿ Ʈ ߰ ִٸ... + // 현재 타일에다 이펙트를 추가할 수 있다면... if (tile.canAddEffect()) { - // effect . + // 같은 effect가 있으면 지운다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_BLOODY_WALL); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); // fix me } - // Ʈ Ŭ Ѵ. + // 이펙트 클래스를 생성한다. EffectBloodyWall* pEffect = new EffectBloodyWall(pZone, tileX, tileY); pEffect->setCasterName(pVampire->getName()); pEffect->setCasterID(pVampire->getObjectID()); @@ -212,7 +212,7 @@ void BloodyWall::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir pEffect->setNextTime(0); pEffect->setTick(output.Tick); - // Tile ̴ Effect ObjectID Ϲ޾ƾ Ѵ. + // Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); pZone->addEffect(pEffect); @@ -294,8 +294,8 @@ void BloodyWall::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir list watcherList = pZone->getWatcherList(myX, myY, pVampire); - // watcherList cList ʰ, caster(pVampire) - // OK4 .. cList ߰Ѵ. + // watcherList에서 cList에 속하지 않고, caster(pVampire)를 볼 수 없는 경우는 + // OK4를 보내고.. cList에 추가한다. for (list::const_iterator itr = watcherList.begin(); itr != watcherList.end(); itr++) { bool bBelong = false; for (list::const_iterator tItr = cList.begin(); tItr != cList.end(); tItr++) @@ -304,9 +304,9 @@ void BloodyWall::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir Creature* pWatcher = (*itr); if (bBelong == false && canSee(pWatcher, pVampire) == false) { - // Assert(pWatcher->isPC()); // 翬 PC.. Zone::getWatcherList PC returnѴ + // Assert(pWatcher->isPC()); // 당연 PC다.. Zone::getWatcherList는 PC만 return한다 if (!pWatcher->isPC()) { - // cout << "BloodyWall : ó Ʈ PC ƴմϴ." << endl; + // cout << "BloodyWall : 왓처 리스트가 PC가 아닙니다." << endl; GCSkillFailed1 _GCSkillFailed1; _GCSkillFailed1.setSkillType(getSkillType()); pVampire->getPlayer()->sendPacket(&_GCSkillFailed1); @@ -353,7 +353,7 @@ void BloodyWall::execute(Monster* pMonster, Creature* pEnemy) } ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyWall::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -381,7 +381,7 @@ void BloodyWall::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) ZoneCoord_t myX = pMonster->getX(); ZoneCoord_t myY = pMonster->getY(); - // ʹ ~~ + // 마스터는 무조건~~ bool bRangeCheck = pMonster->isMaster() #ifdef __UNDERWORLD__ || pMonster->isUnderworld() || pMonster->getMonsterType() == 599 @@ -400,7 +400,7 @@ void BloodyWall::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) bTileCheck = true; if (bRangeCheck && bHitRoll && bTileCheck) { - // Ʈ ӽð Ѵ. + // 이펙트의 지속시간을 계산한다. SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); @@ -420,16 +420,16 @@ void BloodyWall::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) Tile& tile = pZone->getTile(tileX, tileY); if (tile.getEffect(Effect::EFFECT_CLASS_HEAVEN_GROUND) != NULL) continue; - // ŸϿ Ʈ ߰ ִٸ... + // 현재 타일에다 이펙트를 추가할 수 있다면... if (tile.canAddEffect()) { - // effect . + // 같은 effect가 있으면 지운다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_BLOODY_WALL); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); // fix me } - // Ʈ Ŭ Ѵ. + // 이펙트 클래스를 생성한다. EffectBloodyWall* pEffect = new EffectBloodyWall(pZone, tileX, tileY); pEffect->setCasterName(pMonster->getName()); pEffect->setCasterID(pMonster->getObjectID()); @@ -440,7 +440,7 @@ void BloodyWall::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pEffect->setNextTime(0); pEffect->setTick(output.Tick); - // Tile ̴ Effect ObjectID Ϲ޾ƾ Ѵ. + // Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); @@ -521,8 +521,8 @@ void BloodyWall::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) list watcherList = pZone->getWatcherList(myX, myY, pMonster); - // watcherList cList ʰ, caster(pMonster) - // OK4 .. cList ߰Ѵ. + // watcherList에서 cList에 속하지 않고, caster(pMonster)를 볼 수 없는 경우는 + // OK4를 보내고.. cList에 추가한다. for (list::const_iterator itr = watcherList.begin(); itr != watcherList.end(); itr++) { bool bBelong = false; for (list::const_iterator tItr = cList.begin(); tItr != cList.end(); tItr++) @@ -531,7 +531,7 @@ void BloodyWall::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) Creature* pWatcher = (*itr); if (bBelong == false && canSee(pWatcher, pMonster) == false) { - // Assert(pWatcher->isPC()); // 翬 PC.. Zone::getWatcherList PC returnѴ + // Assert(pWatcher->isPC()); // 당연 PC다.. Zone::getWatcherList는 PC만 return한다 if (!pWatcher->isPC()) { // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; diff --git a/src/server/gameserver/skill/BloodyWall.h b/src/server/gameserver/skill/BloodyWall.h index 3a71a615..ad083f35 100644 --- a/src/server/gameserver/skill/BloodyWall.h +++ b/src/server/gameserver/skill/BloodyWall.h @@ -35,7 +35,7 @@ class BloodyWall : public SkillHandler { void computeOutput(const SkillInput& input, SkillOutput& output); private: - POINT m_BloodyWallMask[8][5]; // 8, 5 + POINT m_BloodyWallMask[8][5]; // 8방향, 5개씩 }; // global variable declaration diff --git a/src/server/gameserver/skill/BloodyWarp.cpp b/src/server/gameserver/skill/BloodyWarp.cpp index 804b004d..0b6ac8a2 100644 --- a/src/server/gameserver/skill/BloodyWarp.cpp +++ b/src/server/gameserver/skill/BloodyWarp.cpp @@ -10,8 +10,8 @@ #include "Zone.h" ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// POINT BloodyWarp::getWarpPosition(int myX, int myY, int targetX, int targetY) throw() { @@ -19,7 +19,7 @@ BloodyWarp::getWarpPosition(int myX, int myY, int targetX, int targetY) throw() POINT pt; - // 10% Ȯ random ġ + // 10%의 확률로 random한 위치로 워프 /* if (rand()%10==0) { pt.x = myX + rand()%9 - 4; @@ -45,7 +45,7 @@ BloodyWarp::getWarpPosition(int myX, int myY, int targetX, int targetY) throw() ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyWarp::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -65,7 +65,7 @@ void BloodyWarp::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pVampire, getSkillType()); @@ -84,7 +84,7 @@ void BloodyWarp::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyWarp::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -120,7 +120,7 @@ void BloodyWarp::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyWarp::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -140,7 +140,7 @@ void BloodyWarp::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) POINT pt = getWarpPosition(myX, myY, X, Y); - // BLOODY_WALL ġ Ѵ. + // BLOODY_WALL를 적의 위치에 사용한다. SkillType_t SkillType = SKILL_BLOODY_WALL; if (pMonster->getMonsterType() >= 717) @@ -153,7 +153,7 @@ void BloodyWarp::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) if (pZone->moveFastMonster(pMonster, myX, myY, pt.x, pt.y, getSkillType())) { - // BLOODY_WAVE pMonster Ѵ. + // BLOODY_WAVE를 pMonster의 도착지점에 사용한다. SkillType = (pMonster->isMaster() ? SKILL_BLOODY_MASTER_WAVE : SKILL_BLOODY_WAVE); pSkillHandler = g_pSkillHandlerManager->getSkillHandler(SkillType); diff --git a/src/server/gameserver/skill/BloodyWave.cpp b/src/server/gameserver/skill/BloodyWave.cpp index 6e8b6ae3..1e566101 100644 --- a/src/server/gameserver/skill/BloodyWave.cpp +++ b/src/server/gameserver/skill/BloodyWave.cpp @@ -10,8 +10,8 @@ #include "SimpleTileMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// BloodyWave::BloodyWave() throw() { __BEGIN_TRY @@ -33,7 +33,7 @@ BloodyWave::BloodyWave() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ̾ +// 뱀파이어 셀프 ////////////////////////////////////////////////////////////////////////////// void BloodyWave::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -59,7 +59,7 @@ void BloodyWave::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyWave::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -79,7 +79,7 @@ void BloodyWave::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk // Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 /* if (pTargetCreature==NULL) { @@ -101,7 +101,7 @@ void BloodyWave::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyWave::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -133,10 +133,10 @@ void BloodyWave::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir param.addMask(m_pBloodyWaveMask[i].x, m_pBloodyWaveMask[i].y, 100); } - // knockbackų Ȯ + // 강제로 knockback시킬 확률 bool bForceKnockback = rand() % 100 < output.ToHit; - // Knowledge of Blood ִٸ hit bonus 10 + // Knowledge of Blood 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD); @@ -154,7 +154,7 @@ void BloodyWave::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyWave::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -187,7 +187,7 @@ void BloodyWave::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) bool bForceKnockback = false; - // ʹ knockbackŲ. + // 마스터는 강제로 knockback시킨다. if (pMonster->isMaster()) { bForceKnockback = true; } diff --git a/src/server/gameserver/skill/BloodyZenith.cpp b/src/server/gameserver/skill/BloodyZenith.cpp index fa372f8f..fde1b3d3 100644 --- a/src/server/gameserver/skill/BloodyZenith.cpp +++ b/src/server/gameserver/skill/BloodyZenith.cpp @@ -17,7 +17,7 @@ #include "Zone.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyZenith::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -37,8 +37,8 @@ void BloodyZenith::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); return; @@ -88,21 +88,21 @@ void BloodyZenith::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire CheckCrossCounter(pVampire, pTargetCreature, Damage); - // ´. + // 마나를 깍는다. decreaseMana(pVampire, RequiredMP, _GCSkillToObjectOK1); - // ϰ, ߸. + // 데미지를 가하고, 아이템 내구도를 떨어뜨린다. setDamage(pTargetCreature, Damage, pVampire, getSkillType(), &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); computeAlignmentChange(pTargetCreature, Damage, pVampire, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); decreaseDurability(pVampire, pTargetCreature, pSkillInfo, &_GCSkillToObjectOK1, &_GCSkillToObjectOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. // if (bCriticalHit) // { // knockbackCreature(pZone, pTargetCreature, pVampire->getX(), pVampire->getY()); // } - // ̹ 밡 ׾ٸ ġ ö󰣴. + // 이번 공격으로 상대가 죽었다면 경험치가 올라간다. if (pTargetCreature->isDead()) { int exp = computeCreatureExp(pTargetCreature, KILL_EXP); shareVampExp(pVampire, exp, _GCSkillToObjectOK1); @@ -110,7 +110,7 @@ void BloodyZenith::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire increaseAlignment(pVampire, pTargetCreature, _GCSkillToObjectOK1); - // Ŷ . + // 패킷을 보낸다. _GCSkillToObjectOK1.setSkillType(getSkillType()); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); @@ -156,7 +156,7 @@ void BloodyZenith::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BloodyZenith::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/Blunting.cpp b/src/server/gameserver/skill/Blunting.cpp index 241e194f..0891b8dd 100644 --- a/src/server/gameserver/skill/Blunting.cpp +++ b/src/server/gameserver/skill/Blunting.cpp @@ -20,7 +20,7 @@ #include "Reflection.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Blunting::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -45,9 +45,9 @@ void Blunting::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkil Item* pWeapon = pOusters->getWearItem(Ousters::WEAR_RIGHTHAND); - // NPC . - // 鿪. by sigi. 2002.9.13 - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수 없다. + // 저주 면역. by sigi. 2002.9.13 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_CURSE) || !canAttack(pOusters, pTargetCreature) || pTargetCreature->isNPC() || pWeapon == NULL || pWeapon->getItemClass() != Item::ITEM_CLASS_OUSTERS_CHAKRAM || @@ -93,13 +93,13 @@ void Blunting::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkil bool bCanSeeCaster = canSee(pTargetCreature, pOusters); - // pTargetCreature ָ ݻϴ + // pTargetCreature가 저주마법을 반사하는 경우 if (CheckReflection(pOusters, pTargetCreature, getSkillType())) { pTargetCreature = (Creature*)pOusters; TargetObjectID = pOusters->getObjectID(); } - // Ʈ Ʈ δ. + // 이펙트 오브젝트를 생성해 붙인다. EffectBlunting* pEffect = new EffectBlunting(pTargetCreature); pEffect->setDeadline(output.Duration); pEffect->setLevel(47 + (pSkillSlot->getExpLevel() / 2)); @@ -107,7 +107,7 @@ void Blunting::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkil pTargetCreature->addEffect(pEffect); pTargetCreature->setFlag(Effect::EFFECT_CLASS_BLUNTING); - // ɷġ ؼ ش. + // 능력치를 계산해서 보내준다. if (pTargetCreature->isSlayer()) { Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); @@ -176,10 +176,10 @@ void Blunting::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkil _GCSkillToObjectOK6.setSkillType(SkillType); _GCSkillToObjectOK6.setDuration(output.Duration); - if (bCanSeeCaster) // 10 ġ. + if (bCanSeeCaster) // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pOusters, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); - } else // 10 ġ. + } else // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pOusters, &_GCSkillToObjectOK6, &_GCSkillToObjectOK1); } diff --git a/src/server/gameserver/skill/BombCrashWalk.cpp b/src/server/gameserver/skill/BombCrashWalk.cpp index 86036433..a08eb67b 100644 --- a/src/server/gameserver/skill/BombCrashWalk.cpp +++ b/src/server/gameserver/skill/BombCrashWalk.cpp @@ -17,7 +17,7 @@ #include "GCSkillToTileOK6.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// ½½·¹ÀÌ¾î ¿ÀºêÁ§Æ® Çڵ鷯 ////////////////////////////////////////////////////////////////////////////// void BombCrashWalk::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,7 +37,7 @@ void BombCrashWalk::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuchÁ¦°Å. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); @@ -56,8 +56,8 @@ void BombCrashWalk::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 -// ̾ Wide Lightning Skill Tile ϴ Handler +// ½½·¹À̾î ŸÀÏ Çڵ鷯 +// ½½·¹À̾ Wide Lightning SkillÀ» Tile¿¡ »ç¿ëÇßÀ»¶§ »ç¿ëÇÏ´Â Handler ////////////////////////////////////////////////////////////////////////////// void BombCrashWalk::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -91,8 +91,8 @@ void BombCrashWalk::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill bool bTimeCheck = verifyRunTime(pSkillSlot); bool bRangeCheck = verifyDistance(pSlayer, X, Y, pSkillInfo->getRange()); - // ϴ ϴ ϰ Ҷ(EffectBombCrashWalk::affect()) - // ũ ٽ ϴ ɷ Ѵ. + // ÀÏ´Ü ±â¼úÀº ¼º°øÇÏ´Â °ÍÀ¸·Î ÇÏ°í µ¥¹ÌÁö¸¦ °è»êÇÒ¶§(EffectBombCrashWalk::affect()) + // Å©¸®ÃÄ º°·Î ´Ù½Å °è»êÇÏ´Â °É·Î ÇÑ´Ù. // 2003.1.8 by bezz // bool bHitRoll = HitRoll::isSuccessMagic(pSlayer, pSkillInfo, pSkillSlot); @@ -104,9 +104,9 @@ void BombCrashWalk::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill bTileCheck = true; } // bool bUseSkill = false; - // // ȡǰʹüܽɫʹõ + // // È¡³öµ±Ç°Ê¹Óü¼ÄܽÇÉ«ËùʹÓõÄÎäÆ÷ // Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); - // //ûʹü + // //ûÓÐÎäÆ÷²»ÄÜʹÓü¼ÄÜ // if (pWeapon != NULL) // { // Silver_t silverDamage= pWeapon->getSilver(); @@ -144,7 +144,7 @@ void BombCrashWalk::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill pZone->addEffect(pEffect); tile.addEffect(pEffect); - // 鿡 + // ±â¼úÀ» »ç¿ëÇÑ »ç¶÷µé¿¡°Ô _GCSkillToTileOK1.setSkillType(SkillType); _GCSkillToTileOK1.setCEffectID(CEffectID); _GCSkillToTileOK1.setX(X); @@ -152,21 +152,21 @@ void BombCrashWalk::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill _GCSkillToTileOK1.setDuration(output.Duration); _GCSkillToTileOK1.setRange(Range); - // ִ 鿡 + // ±â¼úÀ» ¾´ »ç¶÷¸¸ º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô _GCSkillToTileOK3.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(X); _GCSkillToTileOK3.setY(Y); //_GCSkillToTileOK3.setRange(Range); - // ִ 鿡 + // ±â¼úÀ» ´çÇÑ »ç¶÷¸¸ º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); - // ִ 鿡 + // ±â¼úÀ» ¾´ »ç¶÷°ú ´çÇÑ »ç¶÷À» ¸ðµÎ º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô _GCSkillToTileOK5.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); @@ -174,23 +174,23 @@ void BombCrashWalk::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); - // packet + // ±â¼úÀ» »ç¿ëÇÑ »ç¶÷¿¡°Ô packet Àü´Þ pPlayer->sendPacket(&_GCSkillToTileOK1); - // ִ 鿡 broadcasing - // broadcasting 5OK Ѵ. - // ⿡ ϵ broadcasting ܵȴ. + // ±â¼úÀ» ¾µ »ç¶÷°ú ´çÇÑ »ç¶÷À» ¸ðµÎ º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô broadcasing + // broadcastingÈÄ 5¹øOK¸¦ ¹ÞÀº »ç¶÷À» ±â·ÏÇÑ´Ù. + // ¿©±â¿¡ ±â·ÏµÈ »ç¶÷Àº Â÷ÈÄ broadcasting¿¡¼­ Á¦¿ÜµÈ´Ù. list cList; cList.push_back(pSlayer); cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); - // ִ 鿡 broadcasting + // ±â¼úÀ» ¾´ »ç¶÷À» º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô broadcasting pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); - // ִ 鿡 broadcasting + // ±â¼úÀ» ´çÇÑ »ç¶÷À» º¼ ¼ö ÀÖ´Â »ç¶÷µé¿¡°Ô broadcasting pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); - // delay setting + // ±â¼ú delay setting pSkillSlot->setRunTime(output.Delay); } else { diff --git a/src/server/gameserver/skill/BombingStar.cpp b/src/server/gameserver/skill/BombingStar.cpp index 9fd23167..e430a4b6 100644 --- a/src/server/gameserver/skill/BombingStar.cpp +++ b/src/server/gameserver/skill/BombingStar.cpp @@ -11,7 +11,7 @@ #include "SimpleTileMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BombingStar::execute(Slayer* pSlayer, ObjectID_t targetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) { __BEGIN_TRY @@ -22,7 +22,7 @@ void BombingStar::execute(Slayer* pSlayer, ObjectID_t targetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(targetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -64,7 +64,7 @@ void BombingStar::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl SIMPLE_SKILL_OUTPUT result; - // Holy Smashing ִٸ 10% + // Holy Smashing 이 있다면 데미지 10% 증가 if (pSlayer->hasRankBonus(RankBonus::RANK_BONUS_HOLY_SMASHING)) { RankBonus* pRankBonus = pSlayer->getRankBonus(RankBonus::RANK_BONUS_HOLY_SMASHING); Assert(pRankBonus != NULL); diff --git a/src/server/gameserver/skill/BrambleHalo.cpp b/src/server/gameserver/skill/BrambleHalo.cpp index f4805ac5..1f84df21 100644 --- a/src/server/gameserver/skill/BrambleHalo.cpp +++ b/src/server/gameserver/skill/BrambleHalo.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void BrambleHalo::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -49,22 +49,22 @@ void BrambleHalo::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectBrambleHalo* pEffect = new EffectBrambleHalo(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setLevel(SkillLevel); pEffect->setDamage(output.Damage); - pEffect->setNextTime(0); // ϴ ܹ ߵѴ. by Sequoia + pEffect->setNextTime(0); // 일단 단번에 발동한다. by Sequoia pEffect->setDelay(output.Tick); // added by Sequoia pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_Bramble_Halo); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); diff --git a/src/server/gameserver/skill/BulletOfLight.cpp b/src/server/gameserver/skill/BulletOfLight.cpp index 54296354..c18530d3 100644 --- a/src/server/gameserver/skill/BulletOfLight.cpp +++ b/src/server/gameserver/skill/BulletOfLight.cpp @@ -14,7 +14,7 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ +// 슬레이어 오브젝트 ////////////////////////////////////////////////////////////////////////////// void BulletOfLight::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -35,7 +35,7 @@ void BulletOfLight::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -47,7 +47,7 @@ void BulletOfLight::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo GCAttackArmsOK4 _GCAttackArmsOK4; GCAttackArmsOK5 _GCAttackArmsOK5; - // ִ Ⱑ ų, 迭 Ⱑ ƴ϶ . + // 들고 있는 무기가 없거나, 총 계열 무기가 아니라면 기술을 쓸 수 없다. Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL || isArmsWeapon(pWeapon) == false) { executeSkillFailException(pSlayer, getSkillType()); @@ -65,7 +65,7 @@ void BulletOfLight::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo SkillOutput output; computeOutput(input, output); - // ToHit Ƽ Ѵ. + // ToHit 페널티 값을 계산한다. // int ToHitPenalty = getPercentValue( pSlayer->getToHit(), output.ToHit ); int RequiredMP = (int)pSkillInfo->getConsumeMP(); @@ -76,12 +76,12 @@ void BulletOfLight::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo bool bHitRoll = HitRoll::isSuccess(pSlayer, pTargetCreature, output.ToHit); // ToHitPenalty); bool bPK = verifyPK(pSlayer, pTargetCreature); - // Ѿ ڴ ߸. + // 총알 숫자는 무조건 떨어뜨린다. Bullet_t RemainBullet = 0; if (bBulletCheck) { - // Ѿ ڸ ߸, ϰ, Ѿ ڸ ޾ƿ´. + // 총알 숫자를 떨어뜨리고, 저장하고, 남은 총알 숫자를 받아온다. decreaseBullet(pWeapon); - // ѹ߾ ʿ . by sigi. 2002.5.9 + // 한발쓸때마다 저장할 필요 없다. by sigi. 2002.5.9 // pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); RemainBullet = getRemainBullet(pWeapon); } @@ -95,18 +95,18 @@ void BulletOfLight::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo bool bCriticalHit = false; - // ʽ Ѵ. + // 데미지 보너스를 계산한다. int Damage = computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); Damage += getPercentValue(Damage, output.Damage); Damage = max(0, Damage); // cout << "BulletOfLightDamage:" << Damage << endl; - // Ѵ. + // 데미지를 세팅한다. setDamage(pTargetCreature, Damage, pSlayer, SkillType, &_GCAttackArmsOK2, &_GCAttackArmsOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCAttackArmsOK2, &_GCAttackArmsOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } @@ -133,7 +133,7 @@ void BulletOfLight::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo pMonster->addEnemy(pSlayer); } - // ڿ Ʈ. + // 공격자와 상대의 아이템 내구성 떨어트림. decreaseDurability(pSlayer, pTargetCreature, NULL, &_GCAttackArmsOK1, &_GCAttackArmsOK2); ZoneCoord_t targetX = pTargetCreature->getX(); diff --git a/src/server/gameserver/skill/BurningSolCharging.cpp b/src/server/gameserver/skill/BurningSolCharging.cpp index 81e4cfeb..fad041f1 100644 --- a/src/server/gameserver/skill/BurningSolCharging.cpp +++ b/src/server/gameserver/skill/BurningSolCharging.cpp @@ -12,7 +12,7 @@ #include "GCSkillToTileOK5.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void BurningSolCharging::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -32,7 +32,7 @@ void BurningSolCharging::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 도가 아니라면 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_BLADE) { executeSkillFailException(pSlayer, getSkillType()); @@ -60,12 +60,12 @@ void BurningSolCharging::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, // cout << "Charging Burning sol..." << endl; decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectBurningSolCharging* pEffect = new EffectBurningSolCharging(pSlayer); pEffect->setDeadline(300); pEffect->setNextTime(10); @@ -73,7 +73,7 @@ void BurningSolCharging::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_BURNING_SOL_CHARGE_1); - // ġ ø. + // 경험치를 올린다. /* SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10* (Grade + 1); if ( bIncreaseDomainExp ) diff --git a/src/server/gameserver/skill/BurningSolLaunch.cpp b/src/server/gameserver/skill/BurningSolLaunch.cpp index cb088cf0..f86b9c0a 100644 --- a/src/server/gameserver/skill/BurningSolLaunch.cpp +++ b/src/server/gameserver/skill/BurningSolLaunch.cpp @@ -60,7 +60,7 @@ void BurningSolLaunch::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Sk int offset = 2; // if ( pEffect->getLevel() >= 2 ) offset = 2; - // ǥġ+4 + // 목표위치+4방향 for (int i = -offset; i <= offset; ++i) for (int j = -offset; j <= offset; ++j) param.addMask(i, j, 100); @@ -85,7 +85,7 @@ void BurningSolLaunch::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Sk } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void BurningSolLaunch::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/Cannonade.cpp b/src/server/gameserver/skill/Cannonade.cpp index 11c3024e..dc965fb6 100644 --- a/src/server/gameserver/skill/Cannonade.cpp +++ b/src/server/gameserver/skill/Cannonade.cpp @@ -32,12 +32,12 @@ void Cannonade::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) { ZoneCoord_t myX = pMonster->getX(); ZoneCoord_t myY = pMonster->getY(); - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectCannonade* pEffect = new EffectCannonade(pMonster, pZone, X, Y); pEffect->setDeadline(output.Duration); pEffect->setDamage(output.Damage); diff --git a/src/server/gameserver/skill/CauseCriticalWounds.cpp b/src/server/gameserver/skill/CauseCriticalWounds.cpp index 5016ae05..a2885297 100644 --- a/src/server/gameserver/skill/CauseCriticalWounds.cpp +++ b/src/server/gameserver/skill/CauseCriticalWounds.cpp @@ -18,7 +18,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void CauseCriticalWounds::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -39,9 +39,9 @@ void CauseCriticalWounds::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); - // NPC - // 鿪̰ų.. by sigi. 2002.9.13 - // NoSuch. by sigi. 2002.5.5 + // NPC 를 공격할 수 없다 + // 면역이거나.. by sigi. 2002.9.13 + // NoSuch제거. by sigi. 2002.5.5 if (pTargetCreature == NULL || pTargetCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_PARALYZE) || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); @@ -55,7 +55,7 @@ void CauseCriticalWounds::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk Tile& rTile = pZone->getTile(pTargetCreature->getX(), pTargetCreature->getY()); - // ų üũѴ + // 스킬 사용이 가능한지 체크한다 int RequiredMP = (int)pSkillInfo->getConsumeMP(); bool bManaCheck = hasEnoughMana(pSlayer, RequiredMP); bool bTimeCheck = verifyRunTime(pSkillSlot); @@ -80,12 +80,12 @@ void CauseCriticalWounds::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk ZoneCoord_t targetX = pTargetCreature->getX(); ZoneCoord_t targetY = pTargetCreature->getY(); - // ų damage, delay, duration + // 스킬의 damage, delay, duration을 계산 SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); - // Soul Smashing ִٸ 10% + // Soul Smashing 이 있다면 데미지 10% 증가 if (pSlayer->hasRankBonus(RankBonus::RANK_BONUS_SOUL_SMASHING)) { RankBonus* pRankBonus = pSlayer->getRankBonus(RankBonus::RANK_BONUS_SOUL_SMASHING); Assert(pRankBonus != NULL); @@ -93,18 +93,18 @@ void CauseCriticalWounds::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk output.Damage += pRankBonus->getPoint(); } - // δ + // 마나를 줄인다 decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); - // ϰ, ߸. ݴ ̾ ƴϹǷ alignment, PK üũ ʿ䰡 + // 데미지를 가하고, 내구도를 떨어뜨린다. 공격대상이 슬레이어가 아니므로 alignment, PK 체크할 필요가 없다 setDamage(pTargetCreature, output.Damage, pSlayer, SkillType, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); computeAlignmentChange(pTargetCreature, output.Damage, pSlayer, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); decreaseDurability(pSlayer, pTargetCreature, NULL, &_GCSkillToObjectOK1, &_GCSkillToObjectOK2); - // Ÿ ̾ ƴ 쿡 - // ġ ø - // Effect δ - // Effect ε ij Ѵ + // 타겟이 슬레이어가 아닌 경우에만 + // 경험치를 올린다 + // Effect를 붙인다 + // Effect를 브로드 캐스팅 한다 if (!pTargetCreature->isSlayer()) { SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); @@ -114,53 +114,53 @@ void CauseCriticalWounds::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToObjectOK1); increaseAlignment(pSlayer, pTargetCreature, _GCSkillToObjectOK1); - // Effect ؼ δ + // Effect를 생성해서 붙인다 EffectCauseCriticalWounds* pEffectCauseCriticalWounds = new EffectCauseCriticalWounds(pTargetCreature); pEffectCauseCriticalWounds->setDeadline(output.Duration); pTargetCreature->addEffect(pEffectCauseCriticalWounds); pTargetCreature->setFlag(Effect::EFFECT_CLASS_CAUSE_CRITICAL_WOUNDS); - // Effect ε ij Ѵ + // Effect 를 브로드 캐스팅 한다 GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_CAUSE_CRITICAL_WOUNDS); gcAddEffect.setDuration(output.Duration); pZone->broadcastPacket(targetX, targetY, &gcAddEffect); - } else // ̾ + } else // 슬레이어 일 경우 { - // ̾ Duration 0 Ѵ. ʰ Ѵ. + // 슬레이어 일 경우 Duration을 0으로 세팅한다. 마비는 하지 않고 데미지만 적용한다. output.Duration = 0; } bool bCanSeePrayer = canSee(pTargetCreature, pSlayer); - // ų + // 스킬을 사용한 사람에게 _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); _GCSkillToObjectOK1.setDuration(output.Duration); - // ų ڿ + // 스킬의 대상자에게 _GCSkillToObjectOK2.setObjectID(pSlayer->getObjectID()); _GCSkillToObjectOK2.setSkillType(SkillType); _GCSkillToObjectOK2.setDuration(output.Duration); - // ų ִ + // 스킬을 사용한 사람만 볼 수 있는 사람에게 _GCSkillToObjectOK3.setObjectID(pSlayer->getObjectID()); _GCSkillToObjectOK3.setSkillType(SkillType); _GCSkillToObjectOK3.setTargetXY(targetX, targetY); - // ų ڸ ִ + // 스킬의 대상자만 불 수 있는 사람에게 _GCSkillToObjectOK4.setSkillType(SkillType); _GCSkillToObjectOK4.setTargetObjectID(TargetObjectID); - // ų ڿ ִ + // 스킬 사용자와 대상자 모두 볼 수 있는 사람에게 _GCSkillToObjectOK5.setObjectID(pSlayer->getObjectID()); _GCSkillToObjectOK5.setTargetObjectID(TargetObjectID); _GCSkillToObjectOK5.setSkillType(SkillType); _GCSkillToObjectOK5.setDuration(output.Duration); - // ų ڰ ų ڸ + // 스킬 대상자가 스킬 사용자를 볼 수 없을 때 _GCSkillToObjectOK6.setXY(prayerX, prayerY); _GCSkillToObjectOK6.setSkillType(SkillType); _GCSkillToObjectOK6.setDuration(output.Duration); diff --git a/src/server/gameserver/skill/CauseLightWounds.cpp b/src/server/gameserver/skill/CauseLightWounds.cpp index 85e35619..cdd492b3 100644 --- a/src/server/gameserver/skill/CauseLightWounds.cpp +++ b/src/server/gameserver/skill/CauseLightWounds.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void CauseLightWounds::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,7 +37,7 @@ void CauseLightWounds::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Skill SIMPLE_SKILL_OUTPUT result; - // Soul Smashing ִٸ 10% + // Soul Smashing 이 있다면 데미지 10% 증가 if (pSlayer->hasRankBonus(RankBonus::RANK_BONUS_SOUL_SMASHING)) { RankBonus* pRankBonus = pSlayer->getRankBonus(RankBonus::RANK_BONUS_SOUL_SMASHING); Assert(pRankBonus != NULL); diff --git a/src/server/gameserver/skill/CauseSeriousWounds.cpp b/src/server/gameserver/skill/CauseSeriousWounds.cpp index c12aa830..5031902f 100644 --- a/src/server/gameserver/skill/CauseSeriousWounds.cpp +++ b/src/server/gameserver/skill/CauseSeriousWounds.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void CauseSeriousWounds::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -38,7 +38,7 @@ void CauseSeriousWounds::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Ski SIMPLE_SKILL_OUTPUT result; - // Soul Smashing ִٸ 10% + // Soul Smashing 이 있다면 데미지 10% 증가 if (pSlayer->hasRankBonus(RankBonus::RANK_BONUS_SOUL_SMASHING)) { RankBonus* pRankBonus = pSlayer->getRankBonus(RankBonus::RANK_BONUS_SOUL_SMASHING); Assert(pRankBonus != NULL); diff --git a/src/server/gameserver/skill/ChainThrowingAxe.cpp b/src/server/gameserver/skill/ChainThrowingAxe.cpp index a3d9dbe2..67976f5d 100644 --- a/src/server/gameserver/skill/ChainThrowingAxe.cpp +++ b/src/server/gameserver/skill/ChainThrowingAxe.cpp @@ -17,7 +17,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void ChainThrowingAxe::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -60,16 +60,16 @@ void ChainThrowingAxe::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) } Tile& tile = pZone->getTile(X, Y); - Range_t Range = 1; // ׻ 1̴. + Range_t Range = 1; // 항상 1이다. - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); input.SkillLevel = pMonster->getLevel(); SkillOutput output; computeOutput(input, output); for (int i = 0; i < 3; i++) { - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectMeteorStrike* pEffect = new EffectMeteorStrike(pZone, X, Y); pEffect->setNextTime(output.Duration + (int)(i * 2.5)); pEffect->setUserObjectID(pMonster->getObjectID()); @@ -81,11 +81,11 @@ void ChainThrowingAxe::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pEffect->setSplashRatio(2, 50); // pEffect->setLevel(pSkillInfo->getLevel()/2); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); } diff --git a/src/server/gameserver/skill/ChargingAttack.cpp b/src/server/gameserver/skill/ChargingAttack.cpp index eebb9b5a..9afe8726 100644 --- a/src/server/gameserver/skill/ChargingAttack.cpp +++ b/src/server/gameserver/skill/ChargingAttack.cpp @@ -11,7 +11,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ChargingAttack::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -33,15 +33,15 @@ void ChargingAttack::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ouste Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 - // NPC . + // NoSuch제거. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. if (pTargetCreature == NULL || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; } - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 검이 아니라면 기술을 사용할 수 없다. Item* pItem = pOusters->getWearItem(Ousters::WEAR_RIGHTHAND); if (pItem == NULL) { executeSkillFailException(pOusters, getSkillType()); @@ -71,20 +71,20 @@ void ChargingAttack::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ouste pOusters->isFlag(Effect::EFFECT_CLASS_HAS_SWEEPER); if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bCanHit && bPK && !bEffected) { - // PC ش. + // 빠르게 PC를 움직여준다. if (pZone->moveFastPC(pOusters, pOusters->getX(), pOusters->getY(), pTargetCreature->getX(), pTargetCreature->getY(), getSkillType())) { decreaseMana(pOusters, RequiredMP, _GCSkillToObjectOK1); bool bCriticalHit = false; - // ش. + // 데미지를 준다. Damage_t Damage = computeDamage(pOusters, pTargetCreature, 0, bCriticalHit) + output.Damage; setDamage(pTargetCreature, Damage, pOusters, SkillType, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); computeAlignmentChange(pTargetCreature, Damage, pOusters, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); decreaseDurability(pOusters, pTargetCreature, pSkillInfo, &_GCSkillToObjectOK1, &_GCSkillToObjectOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pOusters->getX(), pOusters->getY()); } @@ -94,7 +94,7 @@ void ChargingAttack::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ouste shareOustersExp(pOusters, exp, _GCSkillToObjectOK1); } - // Ŷ غϰ . + // 패킷을 준비하고 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); diff --git a/src/server/gameserver/skill/ChargingPower.cpp b/src/server/gameserver/skill/ChargingPower.cpp index e39acc86..afe31907 100644 --- a/src/server/gameserver/skill/ChargingPower.cpp +++ b/src/server/gameserver/skill/ChargingPower.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void ChargingPower::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -31,7 +31,7 @@ void ChargingPower::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 도가 아니라면 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_BLADE) { executeSkillFailException(pSlayer, getSkillType()); @@ -53,33 +53,33 @@ void ChargingPower::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t bool bTimeCheck = verifyRunTime(pSkillSlot); bool bRangeCheck = checkZoneLevelToUseSkill(pSlayer); bool bHitRoll = HitRoll::isSuccessMagic(pSlayer, pSkillInfo, pSkillSlot); - // Ŀ ÿ . + // 버서커랑 동시에 사용할 수 없다. bool bEffected = pSlayer->isFlag(Effect::EFFECT_CLASS_CHARGING_POWER) || pSlayer->isFlag(Effect::EFFECT_CLASS_BERSERKER); if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ų ʽ ޶. + // 스킬 레벨에 따라 데미지 보너스가 달라진다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectChargingPower* pEffect = new EffectChargingPower(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setDamageBonus(output.Damage); pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_CHARGING_POWER); - // ̷ Ͽ ٲ ɷġ . + // 이로 인하여 바뀌는 능력치를 보낸다. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); if (bIncreaseExp) { @@ -88,7 +88,7 @@ void ChargingPower::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t // increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); } - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(output.Duration); @@ -101,7 +101,7 @@ void ChargingPower::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCSkillToSelfOK2, pSlayer); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pSlayer->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_CHARGING_POWER); diff --git a/src/server/gameserver/skill/ChoppingFirewood.cpp b/src/server/gameserver/skill/ChoppingFirewood.cpp index a3ba55d6..43bc4947 100644 --- a/src/server/gameserver/skill/ChoppingFirewood.cpp +++ b/src/server/gameserver/skill/ChoppingFirewood.cpp @@ -17,7 +17,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void ChoppingFirewood::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -61,15 +61,15 @@ void ChoppingFirewood::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) } Tile& tile = pZone->getTile(X, Y); - Range_t Range = 1; // ׻ 1̴. + Range_t Range = 1; // 항상 1이다. - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); input.SkillLevel = pMonster->getLevel(); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectMeteorStrike* pEffect = new EffectMeteorStrike(pZone, X, Y); pEffect->setNextTime(output.Duration); pEffect->setUserObjectID(pMonster->getObjectID()); @@ -81,11 +81,11 @@ void ChoppingFirewood::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pEffect->setSplashRatio(2, 50); // pEffect->setLevel(pSkillInfo->getLevel()/2); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); diff --git a/src/server/gameserver/skill/ClaymoreExplosion.cpp b/src/server/gameserver/skill/ClaymoreExplosion.cpp index d83d9db5..0b90de76 100644 --- a/src/server/gameserver/skill/ClaymoreExplosion.cpp +++ b/src/server/gameserver/skill/ClaymoreExplosion.cpp @@ -11,8 +11,8 @@ ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// ClaymoreExplosion::ClaymoreExplosion() throw() { __BEGIN_TRY @@ -25,7 +25,7 @@ ClaymoreExplosion::ClaymoreExplosion() throw() { m_pClaymoreExplosionMask[index++].set(j, i); } - // 8Ÿ + // 주위 8타일 /* m_pClaymoreExplosionMask[0].set(1, 1); m_pClaymoreExplosionMask[1].set(-1, -1); m_pClaymoreExplosionMask[2].set(0, -1); @@ -39,7 +39,7 @@ ClaymoreExplosion::ClaymoreExplosion() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void ClaymoreExplosion::execute(Monster* pMonster) @@ -63,7 +63,7 @@ void ClaymoreExplosion::execute(Monster* pMonster) if (bRangeCheck) { //-------------------------------------------------------- - // knockbackǴ¸´ ֵ üũش. + // 주위에 knockback되는맞는 애들을 체크해준다. //-------------------------------------------------------- SkillInput input(pMonster); SkillOutput output; @@ -87,7 +87,7 @@ void ClaymoreExplosion::execute(Monster* pMonster) param.addMask(m_pClaymoreExplosionMask[i].x, m_pClaymoreExplosionMask[i].y, 100); } - // ´ ֵ knockback Ų. + // 강제로 맞는 애들을 knockback 시킨다. // bool bForceKnockback = true; g_SimpleTileMeleeSkill.execute(pMonster, x, y, param, result, 0, false); GCAddEffectToTile gcAE; diff --git a/src/server/gameserver/skill/Concealment.cpp b/src/server/gameserver/skill/Concealment.cpp index fc0dac43..174ac510 100644 --- a/src/server/gameserver/skill/Concealment.cpp +++ b/src/server/gameserver/skill/Concealment.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Concealment::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -49,12 +49,12 @@ void Concealment::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectConcealment* pEffect = new EffectConcealment(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setLevel(SkillLevel); @@ -66,7 +66,7 @@ void Concealment::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE pSlayer->initAllStat(); pSlayer->addModifyInfo(prev, _GCSkillToSelfOK1); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 8, 1, _GCSkillToSelfOK1); diff --git a/src/server/gameserver/skill/ContinualLight.cpp b/src/server/gameserver/skill/ContinualLight.cpp index cd57288c..eedc38be 100644 --- a/src/server/gameserver/skill/ContinualLight.cpp +++ b/src/server/gameserver/skill/ContinualLight.cpp @@ -16,7 +16,7 @@ #include "GCSkillToTileOK5.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 슬레이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void ContinualLight::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -78,7 +78,7 @@ void ContinualLight::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skil int oX = 0, oY = 0; - list cList; // ϴ е list + list cList; // 당하는 분들 list for (oY = -output.Range; oY <= output.Range; oY++) { for (oX = -output.Range; oX <= output.Range; oX++) { int tileX = X + oX; @@ -89,13 +89,13 @@ void ContinualLight::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skil EffectDarkness* pEffect = (EffectDarkness*)(tile.getEffect(Effect::EFFECT_CLASS_DARKNESS)); bool success = false; - // ŸϿ ũϽ Ѵٸ... + // 이 타일에 다크니스가 존재한다면... if (pEffect != NULL) { bool Remove = false; - // Ȯ - // min(0) - max(150) - // min(25) - max(75) 2002.7.9 ȫâ + // 성공할 확률 + // min(0) - max(150) 에서 + // min(25) - max(75) 로 조정 2002.7.9 장홍창 int ratio = min(max(25, SkillLevel - pEffect->getLevel() / 3), 75); if (rand() % 100 < ratio) @@ -118,13 +118,13 @@ void ContinualLight::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skil EffectGrayDarkness* pGrayEffect = (EffectGrayDarkness*)(tile.getEffect(Effect::EFFECT_CLASS_GRAY_DARKNESS)); - // ŸϿ ũϽ Ѵٸ... + // 이 타일에 다크니스가 존재한다면... if (pGrayEffect != NULL) { bool Remove = false; - // Ȯ - // min(0) - max(150) - // min(25) - max(75) 2002.7.9 ȫâ + // 성공할 확률 + // min(0) - max(150) 에서 + // min(25) - max(75) 로 조정 2002.7.9 장홍창 int ratio = min(max(20, SkillLevel - (int)(pGrayEffect->getLevel() / 2.8)), 70); if (rand() % 100 < ratio) @@ -134,7 +134,7 @@ void ContinualLight::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skil ObjectID_t effectObjectID = pGrayEffect->getObjectID(); pZone->deleteEffect(effectObjectID); - // ŸϿ ɾٴϴ ũİ Ѵٸ ͸ ޾ƿ´. + // 타일에 걸어다니는 크리쳐가 존재한다면 포인터를 받아온다. // Creature* pTargetCreature = NULL; // if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) // pTargetCreature = @@ -155,7 +155,7 @@ void ContinualLight::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skil } if (success) { - // ŸϿ ɾٴϴ ũİ Ѵٸ ͸ ޾ƿ´. + // 타일에 걸어다니는 크리쳐가 존재한다면 포인터를 받아온다. Creature* pTargetCreature = NULL; if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) pTargetCreature = tile.getCreature(Creature::MOVE_MODE_WALKING); @@ -168,7 +168,7 @@ void ContinualLight::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skil } } - // ġ ÷ش. + // 경험치를 올려준다. Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToTileOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToTileOK1); diff --git a/src/server/gameserver/skill/CreateBomb.cpp b/src/server/gameserver/skill/CreateBomb.cpp index 84aecbba..bad1a4f6 100644 --- a/src/server/gameserver/skill/CreateBomb.cpp +++ b/src/server/gameserver/skill/CreateBomb.cpp @@ -47,8 +47,8 @@ void CreateBomb::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordInven_t Assert(pZone != NULL); Assert(pInventory != NULL); - // ź ̰ų, ź ᰡ ƴϰų, - // OID Ʋٸ . + // 폭탄을 만들 대상이 널이거나, 보통 폭탄 재료가 아니거나, + // OID가 틀리다면 사용할 수 없다. Item* pBombMaterial = pInventory->getItem(X, Y); if (pBombMaterial == NULL || pBombMaterial->getItemClass() != Item::ITEM_CLASS_BOMB_MATERIAL || pBombMaterial->getObjectID() != InvenObjectID) { @@ -61,21 +61,21 @@ void CreateBomb::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordInven_t if (X == TargetX && Y == TargetY) bSamePosition = true; - // ġ Ÿ ġ ƿ - // ź ȯϰ ϴ C4 ڰ 1 ̴. - // ( C4 ϰ, ġ ź Ѵٴ ǹ̴.) - // 1 ƴ϶ ؾѴ. + // 대상 위치와 타겟 위치가 같게 날아오는 경우는 + // 폭탄로 변환하고자 하는 C4의 숫자가 1인 경우이다. + // (이전의 C4을 삭제하고, 같은 위치에 폭탄를 생성한다는 의미이다.) + // 1이 아니라면 리턴해야한다. if (bSamePosition && pBombMaterial->getNum() != 1) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayerinventory)" << endl; return; } - // Ÿ԰ ̿ ϴ ź Ÿ Ѵ. + // 아이템 타입과 이에 대응하는 폭탄의 타입을 구한다. ItemType_t MaterialType = pBombMaterial->getItemType(); int BombType = MaterialType2BombTypeMap[MaterialType]; if (BombType == -1) { - // ź ᰡ ƴ϶, , ų д. + // 폭탄 재료가 아니라, 지뢰 재료라면, 스킬 실패다. executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayerinventory)" << endl; return; @@ -106,17 +106,17 @@ void CreateBomb::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordInven_t list optionNULL; Item* pBomb = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_BOMB, BombType, optionNULL); - // ź ٿش. - // Լ ȿ ź ڵ ϳ پ, - // 1 ź̾ٸ κ丮 DB ǰ ȴ. + // 폭탄재료의 갯수를 줄여준다. + // 이 함수 안에서 폭탄재료의 갯수가 자동적으로 하나 줄어들고, + // 만일 1개인 폭탄재료이었다면 인벤토리 및 DB에서 삭제되게 된다. decreaseItemNum(pBombMaterial, pInventory, pSlayer->getName(), STORAGE_INVENTORY, 0, X, Y); Item* pPrevBomb = pInventory->getItem(TargetX, TargetY); - // ź ü ִٴ ׾ƾ Ѵٴ ̴. + // 기존의 폭탄 객체가 있다는 말은 쌓아야 한다는 말이다. if (pPrevBomb != NULL) { if (canStack(pPrevBomb, pBomb) == false) { - // Ÿ ź ƴ ε... ̷ 찡  ϸ ... + // 같은 타입의 폭탄가 아닐 때인데... 이런 경우가 어떻게 하면 생길까... SAFE_DELETE(pBomb); executeSkillFailException(pSlayer, getSkillType()); @@ -126,25 +126,25 @@ void CreateBomb::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordInven_t return; } - // ϳ Ű Ѵ. + // 갯수를 하나 증가시키고 저장한다. pPrevBomb->setNum(pPrevBomb->getNum() + 1); pPrevBomb->save(pSlayer->getName(), STORAGE_INVENTORY, 0, TargetX, TargetY); - // κ decreaseItemNum() Լ κп ڸ ҽŰǷ, - // ⼭ ٽ κ丮 ڸ Ų. + // 위부분의 decreaseItemNum() 함수 부분에서 아이템 숫자를 감소시키므로, + // 여기서 다시 인벤토리의 아이템 숫자를 증가시킨다. pInventory->increaseNum(); - // ź ź Ƿ Ѵ. + // 방금 만들어진 폭탄는 기존의 폭탄에 더해졌으므로 삭제한다. SAFE_DELETE(pBomb); _GCSkillToInventoryOK1.setObjectID(pPrevBomb->getObjectID()); } - // ź ü ٴ ź ü DB ؾ Ѵٴ ̴. + // 기존의 폭탄 객체가 없다는 말은 폭탄 객체를 DB에 생성해야 한다는 말이다. else { ObjectRegistry& OR = pZone->getObjectRegistry(); OR.registerObject(pBomb); - // ź Inventory ְ DBٰ Ѵ. + // 폭탄를 Inventory로 집어 넣고 DB에다가 생성한다. pBomb->setNum(1); pInventory->addItem(TargetX, TargetY, pBomb); pBomb->create(pSlayer->getName(), STORAGE_INVENTORY, 0, TargetX, TargetY); @@ -152,7 +152,7 @@ void CreateBomb::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordInven_t _GCSkillToInventoryOK1.setObjectID(pBomb->getObjectID()); } - // Ŷ . + // 패킷을 보낸다. _GCSkillToInventoryOK1.setSkillType(SkillType); _GCSkillToInventoryOK1.setItemType(BombType); _GCSkillToInventoryOK1.setCEffectID(0); @@ -175,12 +175,12 @@ void CreateBomb::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordInven_t pSkillSlot->setRunTime(output.Delay); } else { // executeSkillFailNormal(pSlayer, getSkillType(), NULL); - // ź 쿡, ̰ , - // Ŭ̾ƮԼ Ŷ ƿ´. - // , Ŷ ε ijϰ Ǹ, ִ ⿡ - // ij ſ ǥõȴ. (ǵ ó...) - // ׷ κп εij ʰ, οԸ Ŷ ش. - // 2002-02-06 輺 + // 폭탄 만들기 같은 경우에는, 실패했을 때 딜레이가 없기 때문에, + // 클라이언트에게서 패킷이 상당히 빠르게 연속적으로 날아온다. + // 이 때, 실패 패킷을 브로드 캐스팅하게 되면, 옆에 있는 사람이 보기에는 + // 캐스팅 동작이 매우 빠르게 연속적으로 표시된다. (스피드핵 쓰는 것처럼...) + // 그래서 이 부분에서 브로드캐스팅을 하지 않고, 본인에게만 패킷을 날려준다. + // 2002-02-06 김성민 executeSkillFailException(pSlayer, getSkillType()); } } catch (Throwable& t) { diff --git a/src/server/gameserver/skill/CreateHolyPotion.cpp b/src/server/gameserver/skill/CreateHolyPotion.cpp index a6818a7a..6b62207b 100644 --- a/src/server/gameserver/skill/CreateHolyPotion.cpp +++ b/src/server/gameserver/skill/CreateHolyPotion.cpp @@ -35,8 +35,8 @@ void CreateHolyPotion::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordI Assert(pZone != NULL); Assert(pInventory != NULL); - // ̰ų, ƴϰų, - // OID Ʋٸ . + // 성수를 만들 대상이 널이거나, 보통 물이 아니거나, + // OID가 틀리다면 사용할 수 없다. Item* pPotion = pInventory->getItem(X, Y); if (pPotion == NULL || pPotion->getItemClass() != Item::ITEM_CLASS_WATER || pPotion->getObjectID() != InvenObjectID) { @@ -49,11 +49,11 @@ void CreateHolyPotion::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordI if (X == TargetX && Y == TargetY) bSamePosition = true; - // ġ Ÿ ġ ƿ - // ȯϰ ϴ ڰ 1 ̴. - // ( ϰ, ġ Ѵٴ ǹ̴.) - // 1 ƴ϶ ؾѴ. - // Ѱ ƴ϶ ٲǷ üũ ʿ . + // 대상 위치와 타겟 위치가 같게 날아오는 경우는 + // 성수로 변환하고자 하는 물병의 숫자가 1인 경우이다. + // (이전의 물병을 삭제하고, 같은 위치에 성수를 생성한다는 의미이다.) + // 1이 아니라면 리턴해야한다. + // 이제 한개씩만 아니라 물병이 몽땅 다 바뀌므로 체크할 필요 없다. if (bSamePosition && pPotion->getNum() != 1) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayerinventory)" << endl; @@ -69,7 +69,7 @@ void CreateHolyPotion::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordI SkillDomainType_t DomainType = pSkillInfo->getDomainType(); SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); - // ڵ -_- + // 땜빵 코드 -_- ItemType_t waterType = pPotion->getItemType() + 11; int RequiredMP = (int)pSkillInfo->getConsumeMP(); @@ -85,22 +85,22 @@ void CreateHolyPotion::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordI SkillOutput output; computeOutput(input, output); - // ItemType ̿ Ȧ͸ Ѵ. - // ̴ Potion HolyPotion ItemType 1:1 DZ - // ڵ̴. + // 원래 보통 물의 ItemType을 이용해 홀리워터를 생성한다. + // 이는 Potion와 HolyPotion의 ItemType이 1:1 대응이 되기 때문에 + // 가능한 코드이다. list optionNULL; Item* pHolyPotion = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_POTION, waterType, optionNULL); - // ٿش. - // Լ ȿ ڵ ϳ پ, - // 1 ̾ٸ κ丮 DB ǰ ȴ. + // 물병의 갯수를 줄여준다. + // 이 함수 안에서 물병의 갯수가 자동적으로 하나 줄어들고, + // 만일 1개인 물병이었다면 인벤토리 및 DB에서 삭제되게 된다. decreaseItemNum(pPotion, pInventory, pSlayer->getName(), STORAGE_INVENTORY, 0, X, Y); Item* pPrevHolyPotion = pInventory->getItem(TargetX, TargetY); - // ü ִٴ ׾ƾ Ѵٴ ̴. + // 기존의 성수 객체가 있다는 말은 쌓아야 한다는 말이다. if (pPrevHolyPotion != NULL) { if (canStack(pPrevHolyPotion, pHolyPotion) == false) { - // Ÿ ƴ ε... ̷ 찡  ϸ ... + // 같은 타입의 성수가 아닐 때인데... 이런 경우가 어떻게 하면 생길까... SAFE_DELETE(pHolyPotion); executeSkillFailException(pSlayer, getSkillType()); @@ -110,32 +110,32 @@ void CreateHolyPotion::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordI return; } - // ϳ Ű Ѵ. + // 갯수를 하나 증가시키고 저장한다. pPrevHolyPotion->setNum(pPrevHolyPotion->getNum() + pHolyPotion->getNum()); pPrevHolyPotion->save(pSlayer->getName(), STORAGE_INVENTORY, 0, TargetX, TargetY); - // κ decreaseItemNum() Լ κп ڸ ҽŰǷ, - // ⼭ ٽ κ丮 ڸ Ų. + // 위부분의 decreaseItemNum() 함수 부분에서 아이템 숫자를 감소시키므로, + // 여기서 다시 인벤토리의 아이템 숫자를 증가시킨다. pInventory->increaseNum(pHolyPotion->getNum()); - // Ƿ Ѵ. + // 방금 만들어진 성수는 기존의 성수에 더해졌으므로 삭제한다. SAFE_DELETE(pHolyPotion); _GCSkillToInventoryOK1.setObjectID(pPrevHolyPotion->getObjectID()); } - // ü ٴ ü DB ؾ Ѵٴ ̴. + // 기존의 성수 객체가 없다는 말은 성수 객체를 DB에 생성해야 한다는 말이다. else { ObjectRegistry& OR = pZone->getObjectRegistry(); OR.registerObject(pHolyPotion); - // Inventory ְ DBٰ Ѵ. + // 성수를 Inventory로 집어 넣고 DB에다가 생성한다. pInventory->addItem(TargetX, TargetY, pHolyPotion); pHolyPotion->create(pSlayer->getName(), STORAGE_INVENTORY, 0, TargetX, TargetY); _GCSkillToInventoryOK1.setObjectID(pHolyPotion->getObjectID()); } - // Ŷ . + // 패킷을 보낸다. _GCSkillToInventoryOK1.setSkillType(SkillType); _GCSkillToInventoryOK1.setItemType(waterType); _GCSkillToInventoryOK1.setCEffectID(0); @@ -148,7 +148,7 @@ void CreateHolyPotion::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordI // EXP UP! Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToInventoryOK1); - // Ȧ ġ ش. + // 홀리포션 만들기는 도메인 경험치 안 준다. // increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToInventoryOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToInventoryOK1); @@ -159,12 +159,12 @@ void CreateHolyPotion::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordI pSkillSlot->setRunTime(output.Delay); } else { // executeSkillFailNormal(pSlayer, getSkillType(), NULL); - // 쿡, ̰ , - // Ŭ̾ƮԼ Ŷ ƿ´. - // , Ŷ ε ijϰ Ǹ, ִ ⿡ - // ij ſ ǥõȴ. (ǵ ó...) - // ׷ κп εij ʰ, οԸ Ŷ ش. - // 2002-02-06 輺 + // 성수 만들기 같은 경우에는, 실패했을 때 딜레이가 없기 때문에, + // 클라이언트에게서 패킷이 상당히 빠르게 연속적으로 날아온다. + // 이 때, 실패 패킷을 브로드 캐스팅하게 되면, 옆에 있는 사람이 보기에는 + // 캐스팅 동작이 매우 빠르게 연속적으로 표시된다. (스피드핵 쓰는 것처럼...) + // 그래서 이 부분에서 브로드캐스팅을 하지 않고, 본인에게만 패킷을 날려준다. + // 2002-02-06 김성민 executeSkillFailException(pSlayer, getSkillType()); } } catch (Throwable& t) { @@ -182,21 +182,21 @@ bool CreateHolyPotion::canMake(ItemType_t PotionType, int DomainLevel, int Skill bool rvalue = false; int ratio = 60 + SkillLevel; - // ִ ũ⿡ ִ. - // ׷ ̻ 쿡 гƼ ϴµ, - // ̴  ó ? + // 도메인 레벨에 따라 만들 수 있는 성수의 크기에 제한이 있다. + // 그런데 도메인 레벨이 마스터 이상일 경우에는 패널티가 없어야 하는데, + // 이는 어떻게 처리할 수 있을까? if (PotionType == 6 && DomainLevel >= 101) { rvalue = true; } else if (PotionType == 5 && DomainLevel >= 81) { rvalue = true; } else if (PotionType == 4 && DomainLevel >= 61) { - // Ƽ ̻ Ǿ Ȧ ͸ ִ. + // 어프렌티스 이상은 되어야 스몰 홀리 워터를 만들 수 있다. rvalue = true; } else if (PotionType == 3) { rvalue = true; } - // ϴ ִ Ȯ ִٸ Ȯ üũ Ѵ. + // 일단 만들 수 있는 확률이 있다면 확률 체크를 한다. if (rvalue) { if ((rand() % 100) < ratio) return true; diff --git a/src/server/gameserver/skill/CreateHolyWater.cpp b/src/server/gameserver/skill/CreateHolyWater.cpp index bc146d57..7868d9f5 100644 --- a/src/server/gameserver/skill/CreateHolyWater.cpp +++ b/src/server/gameserver/skill/CreateHolyWater.cpp @@ -35,8 +35,8 @@ void CreateHolyWater::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordIn Assert(pZone != NULL); Assert(pInventory != NULL); - // ̰ų, ƴϰų, - // OID Ʋٸ . + // 성수를 만들 대상이 널이거나, 보통 물이 아니거나, + // OID가 틀리다면 사용할 수 없다. Item* pWater = pInventory->getItem(X, Y); if (pWater == NULL || pWater->getItemClass() != Item::ITEM_CLASS_WATER || pWater->getObjectID() != InvenObjectID) { @@ -49,11 +49,11 @@ void CreateHolyWater::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordIn if (X == TargetX && Y == TargetY) bSamePosition = true; - // ġ Ÿ ġ ƿ - // ȯϰ ϴ ڰ 1 ̴. - // ( ϰ, ġ Ѵٴ ǹ̴.) - // 1 ƴ϶ ؾѴ. - // Ѱ ƴ϶ ٲǷ üũ ʿ . + // 대상 위치와 타겟 위치가 같게 날아오는 경우는 + // 성수로 변환하고자 하는 물병의 숫자가 1인 경우이다. + // (이전의 물병을 삭제하고, 같은 위치에 성수를 생성한다는 의미이다.) + // 1이 아니라면 리턴해야한다. + // 이제 한개씩만 아니라 물병이 몽땅 다 바뀌므로 체크할 필요 없다. /* if (bSamePosition && pWater->getNum() != 1) { executeSkillFailException(pSlayer, getSkillType()); @@ -85,29 +85,29 @@ void CreateHolyWater::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordIn SkillOutput output; computeOutput(input, output); - // ItemType ̿ Ȧ͸ Ѵ. - // ̴ Water HolyWater ItemType 1:1 DZ - // ڵ̴. + // 원래 보통 물의 ItemType을 이용해 홀리워터를 생성한다. + // 이는 Water와 HolyWater의 ItemType이 1:1 대응이 되기 때문에 + // 가능한 코드이다. list optionNULL; Item* pHolyWater = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_HOLYWATER, waterType, optionNULL); - // ش. + // 이제 개수도 세팅해준다. pHolyWater->setNum(pWater->getNum()); - // ٿش. - // Լ ȿ ڵ ϳ پ, - // 1 ̾ٸ κ丮 DB ǰ ȴ. + // 물병의 갯수를 줄여준다. + // 이 함수 안에서 물병의 갯수가 자동적으로 하나 줄어들고, + // 만일 1개인 물병이었다면 인벤토리 및 DB에서 삭제되게 된다. // decreaseItemNum(pWater, pInventory, pSlayer->getName(), STORAGE_INVENTORY, 0, X, Y); - //  ٲ. + // 이제 몇개든 상관없이 몽땅 바꿔버린다. pInventory->deleteItem(X, Y); pWater->destroy(); SAFE_DELETE(pWater); Item* pPrevHolyWater = pInventory->getItem(TargetX, TargetY); - // ü ִٴ ׾ƾ Ѵٴ ̴. + // 기존의 성수 객체가 있다는 말은 쌓아야 한다는 말이다. if (pPrevHolyWater != NULL) { if (canStack(pPrevHolyWater, pHolyWater) == false) { - // Ÿ ƴ ε... ̷ 찡  ϸ ... + // 같은 타입의 성수가 아닐 때인데... 이런 경우가 어떻게 하면 생길까... SAFE_DELETE(pHolyWater); executeSkillFailException(pSlayer, getSkillType()); @@ -117,32 +117,32 @@ void CreateHolyWater::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordIn return; } - // ϳ Ű Ѵ. + // 갯수를 하나 증가시키고 저장한다. pPrevHolyWater->setNum(pPrevHolyWater->getNum() + pHolyWater->getNum()); pPrevHolyWater->save(pSlayer->getName(), STORAGE_INVENTORY, 0, TargetX, TargetY); - // κ decreaseItemNum() Լ κп ڸ ҽŰǷ, - // ⼭ ٽ κ丮 ڸ Ų. + // 위부분의 decreaseItemNum() 함수 부분에서 아이템 숫자를 감소시키므로, + // 여기서 다시 인벤토리의 아이템 숫자를 증가시킨다. pInventory->increaseNum(pHolyWater->getNum()); - // Ƿ Ѵ. + // 방금 만들어진 성수는 기존의 성수에 더해졌으므로 삭제한다. SAFE_DELETE(pHolyWater); _GCSkillToInventoryOK1.setObjectID(pPrevHolyWater->getObjectID()); } - // ü ٴ ü DB ؾ Ѵٴ ̴. + // 기존의 성수 객체가 없다는 말은 성수 객체를 DB에 생성해야 한다는 말이다. else { ObjectRegistry& OR = pZone->getObjectRegistry(); OR.registerObject(pHolyWater); - // Inventory ְ DBٰ Ѵ. + // 성수를 Inventory로 집어 넣고 DB에다가 생성한다. pInventory->addItem(TargetX, TargetY, pHolyWater); pHolyWater->create(pSlayer->getName(), STORAGE_INVENTORY, 0, TargetX, TargetY); _GCSkillToInventoryOK1.setObjectID(pHolyWater->getObjectID()); } - // Ŷ . + // 패킷을 보낸다. _GCSkillToInventoryOK1.setSkillType(SkillType); _GCSkillToInventoryOK1.setItemType(waterType); _GCSkillToInventoryOK1.setCEffectID(0); @@ -165,12 +165,12 @@ void CreateHolyWater::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordIn pSkillSlot->setRunTime(output.Delay); } else { // executeSkillFailNormal(pSlayer, getSkillType(), NULL); - // 쿡, ̰ , - // Ŭ̾ƮԼ Ŷ ƿ´. - // , Ŷ ε ijϰ Ǹ, ִ ⿡ - // ij ſ ǥõȴ. (ǵ ó...) - // ׷ κп εij ʰ, οԸ Ŷ ش. - // 2002-02-06 輺 + // 성수 만들기 같은 경우에는, 실패했을 때 딜레이가 없기 때문에, + // 클라이언트에게서 패킷이 상당히 빠르게 연속적으로 날아온다. + // 이 때, 실패 패킷을 브로드 캐스팅하게 되면, 옆에 있는 사람이 보기에는 + // 캐스팅 동작이 매우 빠르게 연속적으로 표시된다. (스피드핵 쓰는 것처럼...) + // 그래서 이 부분에서 브로드캐스팅을 하지 않고, 본인에게만 패킷을 날려준다. + // 2002-02-06 김성민 executeSkillFailException(pSlayer, getSkillType()); } } catch (Throwable& t) { @@ -189,24 +189,24 @@ bool CreateHolyWater::canMake(ItemType_t WaterType, int DomainLevel, int SkillLe SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(DomainLevel); int ratio = 0; - // ִ ũ⿡ ִ. - // ׷ ̻ 쿡 гƼ ϴµ, - // ̴  ó ? + // 도메인 레벨에 따라 만들 수 있는 성수의 크기에 제한이 있다. + // 그런데 도메인 레벨이 마스터 이상일 경우에는 패널티가 없어야 하는데, + // 이는 어떻게 처리할 수 있을까? if (WaterType == 2 && Grade >= SKILL_GRADE_EXPERT) { - // Ʈ ̻ Ǿ Ȧ ͸ ִ. + // 엑스퍼트 이상은 되어야 라지 홀리 워터를 만들 수 있다. rvalue = true; ratio = 50 + SkillLevel - 50; } else if (WaterType == 1 && Grade >= SKILL_GRADE_ADEPT) { - // Ʈ ̻ Ǿ ̵ Ȧ ͸ մ. + // 어뎁트 이상은 되어야 미디엄 홀리 워터를 만들 수 잇다. rvalue = true; ratio = 50 + SkillLevel - 30; } else if (WaterType == 0 && Grade >= SKILL_GRADE_APPRENTICE) { - // Ƽ ̻ Ǿ Ȧ ͸ ִ. + // 어프렌티스 이상은 되어야 스몰 홀리 워터를 만들 수 있다. rvalue = true; ratio = 50 + SkillLevel - 10; } - // ϴ ִ Ȯ ִٸ Ȯ üũ Ѵ. + // 일단 만들 수 있는 확률이 있다면 확률 체크를 한다. if (rvalue) { if ((rand() % 100) < ratio) return true; diff --git a/src/server/gameserver/skill/CreateMine.cpp b/src/server/gameserver/skill/CreateMine.cpp index e904b9c8..0f752457 100644 --- a/src/server/gameserver/skill/CreateMine.cpp +++ b/src/server/gameserver/skill/CreateMine.cpp @@ -47,8 +47,8 @@ void CreateMine::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordInven_t Assert(pZone != NULL); Assert(pInventory != NULL); - // ڸ ̰ų, ź ᰡ ƴϰų, - // OID Ʋٸ . + // 지뢰를 만들 대상이 널이거나, 폭탄 재료가 아니거나, + // OID가 틀리다면 사용할 수 없다. Item* pBombMaterial = pInventory->getItem(X, Y); if (pBombMaterial == NULL || pBombMaterial->getItemClass() != Item::ITEM_CLASS_BOMB_MATERIAL || pBombMaterial->getObjectID() != InvenObjectID) { @@ -61,21 +61,21 @@ void CreateMine::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordInven_t if (X == TargetX && Y == TargetY) bSamePosition = true; - // ġ Ÿ ġ ƿ - // ڷ ȯϰ ϴ ź ڰ 1 ̴. - // ( ź Ḧ ϰ, ġ ڸ Ѵٴ ǹ̴.) - // 1 ƴ϶ ؾѴ. + // 대상 위치와 타겟 위치가 같게 날아오는 경우는 + // 지뢰로 변환하고자 하는 폭탄재료의 숫자가 1인 경우이다. + // (이전의 폭탄 재료를 삭제하고, 같은 위치에 지뢰를 생성한다는 의미이다.) + // 1이 아니라면 리턴해야한다. if (bSamePosition && pBombMaterial->getNum() != 1) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayerinventory)" << endl; return; } - // Ÿ԰ ̿ Ǵ Ÿ Ѵ. + // 아이템 타입과 이에 대응되는 지뢰의 타입을 구한다. ItemType_t MaterialType = pBombMaterial->getItemType(); int MineType = MaterialType2MineTypeMap[MaterialType]; if (MineType == -1) { - // ᰡ ƴ϶, ź , ų д. + // 지뢰 재료가 아니라, 폭탄 재료라면, 스킬 실패다. executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayerinventory)" << endl; return; @@ -106,17 +106,17 @@ void CreateMine::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordInven_t list optionNULL; Item* pMine = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_MINE, MineType, optionNULL); - // ٿش. - // Լ ȿ ڵ ϳ پ, - // 1 ̾ٸ κ丮 DB ǰ ȴ. + // 물병의 갯수를 줄여준다. + // 이 함수 안에서 물병의 갯수가 자동적으로 하나 줄어들고, + // 만일 1개인 물병이었다면 인벤토리 및 DB에서 삭제되게 된다. decreaseItemNum(pBombMaterial, pInventory, pSlayer->getName(), STORAGE_INVENTORY, 0, X, Y); Item* pPrevMine = pInventory->getItem(TargetX, TargetY); - // ü ִٴ ׾ƾ Ѵٴ ̴. + // 기존의 지뢰 객체가 있다는 말은 쌓아야 한다는 말이다. if (pPrevMine != NULL) { if (canStack(pPrevMine, pMine) == false) { - // Ÿ ڰ ƴ ε... ̷ 찡  ϸ ... + // 같은 타입의 지뢰가 아닐 때인데... 이런 경우가 어떻게 하면 생길까... SAFE_DELETE(pMine); executeSkillFailException(pSlayer, getSkillType()); @@ -126,25 +126,25 @@ void CreateMine::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordInven_t return; } - // ϳ Ű Ѵ. + // 갯수를 하나 증가시키고 저장한다. pPrevMine->setNum(pPrevMine->getNum() + 1); pPrevMine->save(pSlayer->getName(), STORAGE_INVENTORY, 0, TargetX, TargetY); - // κ decreaseItemNum() Լ κп ڸ ҽŰǷ, - // ⼭ ٽ κ丮 ڸ Ų. + // 위부분의 decreaseItemNum() 함수 부분에서 아이템 숫자를 감소시키므로, + // 여기서 다시 인벤토리의 아이템 숫자를 증가시킨다. pInventory->increaseNum(); - // ڴ ڿ Ƿ Ѵ. + // 방금 만들어진 지뢰는 기존의 지뢰에 더해졌으므로 삭제한다. SAFE_DELETE(pMine); _GCSkillToInventoryOK1.setObjectID(pPrevMine->getObjectID()); } - // ü ٴ ü DB ؾ Ѵٴ ̴. + // 기존의 지뢰 객체가 없다는 말은 지뢰 객체를 DB에 생성해야 한다는 말이다. else { ObjectRegistry& OR = pZone->getObjectRegistry(); OR.registerObject(pMine); - // ڸ Inventory ְ DBٰ Ѵ. + // 지뢰를 Inventory로 집어 넣고 DB에다가 생성한다. pInventory->addItem(TargetX, TargetY, pMine); pMine->setNum(1); pMine->create(pSlayer->getName(), STORAGE_INVENTORY, 0, TargetX, TargetY); @@ -152,7 +152,7 @@ void CreateMine::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordInven_t _GCSkillToInventoryOK1.setObjectID(pMine->getObjectID()); } - // Ŷ . + // 패킷을 보낸다. _GCSkillToInventoryOK1.setSkillType(SkillType); _GCSkillToInventoryOK1.setItemType(MineType); _GCSkillToInventoryOK1.setCEffectID(0); @@ -175,12 +175,12 @@ void CreateMine::execute(Slayer* pSlayer, ObjectID_t InvenObjectID, CoordInven_t pSkillSlot->setRunTime(output.Delay); } else { // executeSkillFailNormal(pSlayer, getSkillType(), NULL); - // 쿡, ̰ , - // Ŭ̾ƮԼ Ŷ ƿ´. - // , Ŷ ε ijϰ Ǹ, ִ ⿡ - // ij ſ ǥõȴ. (ǵ ó...) - // ׷ κп εij ʰ, οԸ Ŷ ش. - // 2002-02-06 輺 + // 지뢰 만들기 같은 경우에는, 실패했을 때 딜레이가 없기 때문에, + // 클라이언트에게서 패킷이 상당히 빠르게 연속적으로 날아온다. + // 이 때, 실패 패킷을 브로드 캐스팅하게 되면, 옆에 있는 사람이 보기에는 + // 캐스팅 동작이 매우 빠르게 연속적으로 표시된다. (스피드핵 쓰는 것처럼...) + // 그래서 이 부분에서 브로드캐스팅을 하지 않고, 본인에게만 패킷을 날려준다. + // 2002-02-06 김성민 executeSkillFailException(pSlayer, getSkillType()); } } catch (Throwable& t) { diff --git a/src/server/gameserver/skill/CriticalGround.cpp b/src/server/gameserver/skill/CriticalGround.cpp index adb4902a..4458476d 100644 --- a/src/server/gameserver/skill/CriticalGround.cpp +++ b/src/server/gameserver/skill/CriticalGround.cpp @@ -11,13 +11,13 @@ ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// CriticalGround::CriticalGround() throw() { __BEGIN_TRY - // 8Ÿ + // 주위 8타일 m_pCriticalGroundMask[0].set(1, 1); m_pCriticalGroundMask[1].set(-1, -1); m_pCriticalGroundMask[2].set(0, -1); @@ -31,7 +31,7 @@ CriticalGround::CriticalGround() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 뱀파이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// /* void CriticalGround::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -74,7 +74,7 @@ void CriticalGround::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CE { decreaseMana(pVampire, RequiredMP, _GCSkillToSelfOK1); - // ̾ ϱ Ŷ . + // 뱀파이어를 땅 위에서 삭제하기 이전에 기술 패킷들을 날린다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(0); @@ -86,12 +86,12 @@ void CriticalGround::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CE pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(x, y, &_GCSkillToSelfOK2, pVampire); - // ִ ̾ ϶ ˸. + // 땅 위에 나와있는 뱀파이어 삭제하라고 알린다. GCDeleteObject gcDO; gcDO.setObjectID(pVampire->getObjectID()); pZone->broadcastPacket(x, y, &gcDO, pVampire); - // ӿٰ ̾ ߰Ѵ. + // 땅 속에다가 뱀파이어를 추가한다. addBurrowingCreature(pZone, pVampire, x, y); pSkillSlot->setRunTime(); @@ -114,7 +114,7 @@ void CriticalGround::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CE */ ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void CriticalGround::execute(Monster* pMonster) @@ -147,7 +147,7 @@ void CriticalGround::execute(Monster* pMonster) if (bRangeCheck && bMoveModeCheck) { //-------------------------------------------------------- - // Critical Ground ̰ Ѵ. + // Critical Ground 기술을 보이게 한다. //-------------------------------------------------------- //_GCSkillToSelfOK2.setObjectID(pMonster->getObjectID()); //_GCSkillToSelfOK2.setDuration(0); @@ -156,7 +156,7 @@ void CriticalGround::execute(Monster* pMonster) //-------------------------------------------------------- - // knockbackǴ¸´ ֵ üũش. + // 주위에 knockback되는맞는 애들을 체크해준다. //-------------------------------------------------------- SkillInput input(pMonster); SkillOutput output; @@ -180,7 +180,7 @@ void CriticalGround::execute(Monster* pMonster) param.addMask(m_pCriticalGroundMask[i].x, m_pCriticalGroundMask[i].y, 100); } - // ´ ֵ knockback Ų. + // 강제로 맞는 애들을 knockback 시킨다. bool bForceKnockback = true; g_SimpleTileMeleeSkill.execute(pMonster, x, y, param, result, 0, bForceKnockback); } else { diff --git a/src/server/gameserver/skill/CrossCounter.cpp b/src/server/gameserver/skill/CrossCounter.cpp index 1c30b08b..7a0e6e69 100644 --- a/src/server/gameserver/skill/CrossCounter.cpp +++ b/src/server/gameserver/skill/CrossCounter.cpp @@ -17,7 +17,7 @@ #include "SkillHandlerManager.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void CrossCounter::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -36,7 +36,7 @@ void CrossCounter::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t C Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 검이 아니라면 기술을 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_SWORD) { executeSkillFailException(pSlayer, getSkillType()); @@ -67,13 +67,13 @@ void CrossCounter::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t C SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectCrossCounter* pEffect = new EffectCrossCounter(pSlayer); pEffect->setDeadline(output.Duration); pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_CROSS_COUNTER); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); if (bIncreaseDomainExp) { @@ -82,7 +82,7 @@ void CrossCounter::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t C increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); } - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(output.Duration); @@ -95,7 +95,7 @@ void CrossCounter::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t C pPlayer->sendPacket(&_GCSkillToSelfOK1); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pSlayer->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_CROSS_COUNTER); @@ -116,8 +116,8 @@ void CrossCounter::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t C } ////////////////////////////////////////////////////////////////////////////// -// ũν ī üũ Լ -// ũν īͰ ߵǸ true Ѵ. +// 크로스 카운터 체크 함수 +// 크로스 카운터가 발동되면 true를 리턴한다. ////////////////////////////////////////////////////////////////////////////// bool CheckCrossCounter(Creature* pAttacker, Creature* pTargetCreature, Damage_t damage, Range_t range) { __BEGIN_TRY @@ -127,7 +127,7 @@ bool CheckCrossCounter(Creature* pAttacker, Creature* pTargetCreature, Damage_t Assert(pAttacker != NULL); Assert(pTargetCreature != NULL); - // ̾ ְ, Ÿ 1̾߸ Ѵ. + // 슬레이어만이 이 기술을 쓸 수 있고, 그 거리는 1이어야만 한다. if (pTargetCreature->isSlayer() == false || range != 1) { // cout << "CheckCrossCounter End" << endl; return false; @@ -135,7 +135,7 @@ bool CheckCrossCounter(Creature* pAttacker, Creature* pTargetCreature, Damage_t bool bSuccess = false; - // ɷְ, ° ƴ϶... + // 기술이 걸려있고, 현재 마비 상태가 아니라면... if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_CROSS_COUNTER) && !pTargetCreature->isFlag(Effect::EFFECT_CLASS_PARALYZE)) { Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); @@ -152,15 +152,15 @@ bool CheckCrossCounter(Creature* pAttacker, Creature* pTargetCreature, Damage_t Item* pWeapon = pTargetSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (!verifyDistance(pAttacker, pTargetCreature, 1) || - // ߵ ʴ´. by Sequoia 2003.3.25 + // 검을 들고 있지 않으면 발동되지 않는다. by Sequoia 2003.3.25 pWeapon == NULL || pWeapon->getItemClass() != Item::ITEM_CLASS_SWORD) { return false; } - // hitroll ߴٸ... + // hitroll이 성공했다면... if (HitRoll::isSuccess(pTargetSlayer, pAttacker) && canHit(pTargetSlayer, pAttacker, SKILL_CROSS_COUNTER)) { - // counter - // pTargetSlayer , pAttacker ݴϴ ڰ ȴ. + // counter에서는 + // pTargetSlayer가 공격자, pAttacker가 공격당하는 자가 된다. ObjectID_t targetID = pTargetSlayer->getObjectID(); ObjectID_t attackerID = pAttacker->getObjectID(); @@ -172,7 +172,7 @@ bool CheckCrossCounter(Creature* pAttacker, Creature* pTargetCreature, Damage_t SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(SkillLevel); //////////////////////////////////////////////////////////// - // ų ׷̵忡 ٸ . + // 스킬 그레이드에 따라서 다른 기술이 나간다. // SKILL_GRADE_APPRENTICE // SKILL_GRADE_ADEPT // SKILL_GRADE_EXPERT @@ -183,7 +183,7 @@ bool CheckCrossCounter(Creature* pAttacker, Creature* pTargetCreature, Damage_t bool bCriticalHit; - // ⺻ ų Ѵ. + // 기본 데미지에 스킬 데미지를 더한다. Damage_t Damage = computeDamage(pTargetSlayer, pAttacker, SkillLevel / 5, bCriticalHit); if (Grade == SKILL_GRADE_APPRENTICE) { @@ -241,11 +241,11 @@ bool CheckCrossCounter(Creature* pAttacker, Creature* pTargetCreature, Damage_t } else if (pAttacker->isMonster()) { Monster* pMonster = dynamic_cast(pAttacker); - // ũνīͰ ߵǾٴ Ͱ ̹ ̾ νϰ - // ߴٴ ̹Ƿ, addEnemy ʿ . + // 크로스카운터가 발동되었다는 것은 몬스터가 이미 이 슬레이어를 적으로 인식하고 + // 공격을 했다는 말이므로, addEnemy를 해 줄 필요는 없다. // pMonster->addEnemy(pTargetSlayer); - // ʹ ̾. + // 마스터는 딜레이없다. if (!pMonster->isMaster() #ifdef __UNDERWORLD__ && !pMonster->isUnderworld() && pMonster->getMonsterType() != 599 @@ -267,7 +267,7 @@ bool CheckCrossCounter(Creature* pAttacker, Creature* pTargetCreature, Damage_t bSuccess = true; } else { - // CrossCounterϸ Ŷ ?? + // CrossCounter실패하면 실패패킷 보내나?? } } diff --git a/src/server/gameserver/skill/CrossGuard.cpp b/src/server/gameserver/skill/CrossGuard.cpp index c01c0228..5ed87e14 100644 --- a/src/server/gameserver/skill/CrossGuard.cpp +++ b/src/server/gameserver/skill/CrossGuard.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void CrossGuard::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -66,12 +66,12 @@ void CrossGuard::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot, if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bSatisfyRequire) { decreaseMana(pOusters, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectCrossGuard* pEffect = new EffectCrossGuard(pOusters); pEffect->setDeadline(output.Duration); pEffect->setBonus(output.Damage); diff --git a/src/server/gameserver/skill/CureAll.cpp b/src/server/gameserver/skill/CureAll.cpp index e07d9ea6..3cb75887 100644 --- a/src/server/gameserver/skill/CureAll.cpp +++ b/src/server/gameserver/skill/CureAll.cpp @@ -31,7 +31,7 @@ const uint CureAllBloodDrainLevel = 75; ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void CureAll::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -65,8 +65,8 @@ void CureAll::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 - // ̾ ܿ ġ . + // NoSuch제거. by sigi. 2002.5.2 + // 슬레이어 외에는 치료할 수가 없다. if (pTargetCreature == NULL || pTargetCreature->isSlayer() == false) { executeSkillFailException(pSlayer, param.SkillType); return; @@ -84,13 +84,13 @@ void CureAll::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk bool bHPCheck = false; - // ü ų, ¿ Ѵ. + // 체력이 닳거나, 흡혈을 당한 상태여야 한다. Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); Assert(pTargetSlayer != NULL); EffectBloodDrain* pEffectBloodDrain = NULL; - bool bEffected = false; // ƹ ֳ ɷ Ҵ. + bool bEffected = false; // 아무 저주나 걸려 있으면 켠다. if (pTargetSlayer->getHP(ATTR_CURRENT) < pTargetSlayer->getHP(ATTR_MAX)) { bHPCheck = true; @@ -121,7 +121,7 @@ void CureAll::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk EffectParalyze* pEffectParalyze = NULL; EffectSeduction* pEffectSeduction = NULL; - // 迭 ؼ + // 저주 계열 해소 if (pTargetCreature->isEffect(Effect::EFFECT_CLASS_DOOM)) { pEffectDoom = (EffectDoom*)pTargetCreature->findEffect(Effect::EFFECT_CLASS_DOOM); Assert(pEffectDoom != NULL); @@ -155,11 +155,11 @@ void CureAll::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk bHPCheck = true; } - // 迭 ؼ - bool bGreenPoison = false; // GreenPoison ġұ - bool bYellowPoison = false; // YellowPoison ġұ - bool bDarkBluePoison = false; // DarkBluePoison ġұ - bool bGreenStalker = false; // GreenStalker ġұ + // 독 계열 해소 + bool bGreenPoison = false; // GreenPoison을 치료할까의 여부 + bool bYellowPoison = false; // YellowPoison을 치료할까의 여부 + bool bDarkBluePoison = false; // DarkBluePoison을 치료할까의 여부 + bool bGreenStalker = false; // GreenStalker를 치료할까의 여부 EffectPoison* pEffectPoison = NULL; EffectYellowPoisonToCreature* pEffectYellowPoisonToCreature = NULL; @@ -209,21 +209,21 @@ void CureAll::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk uint HealPoint = param.SkillDamage; - // ָ ϰ, - // Ŷ Ʈ ϶ Ѵ. + // 각각의 저주를 삭제하고, + // 패킷에다 이펙트 삭제하라고 더한다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pTargetCreature->getObjectID()); - // ¶ ¸ ش. + // 흡혈당한 상태라면 흡혈 상태를 날려준다. if (pEffectBloodDrain != NULL && pEffectBloodDrain->getLevel() < CureAllBloodDrainLevel) { - // ƸƮ ϱ Ʈ ٿش. + // 흡혈 아르바이트를 방지하기 위한 후유증 이펙트를 붙여준다. if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_AFTERMATH)) { Effect* pEffect = pTargetCreature->findEffect(Effect::EFFECT_CLASS_AFTERMATH); EffectAftermath* pEffectAftermath = dynamic_cast(pEffect); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. } else { EffectAftermath* pEffectAftermath = new EffectAftermath(pTargetCreature); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. pTargetCreature->addEffect(pEffectAftermath); pTargetCreature->setFlag(Effect::EFFECT_CLASS_AFTERMATH); pEffectAftermath->create(pTargetCreature->getName()); @@ -262,8 +262,8 @@ void CureAll::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_SEDUCTION); } - // ġḦ ϰ, - // Ŷ Ʈ ϶ Ѵ. + // 각각의 독마다 치료를 하고, + // 패킷에다 이펙트 삭제하라고 더한다. if (bGreenPoison) { pEffectPoison->setDeadline(0); pTargetCreature->removeFlag(Effect::EFFECT_CLASS_POISON); @@ -289,11 +289,11 @@ void CureAll::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pZone->broadcastPacket(pTargetCreature->getX(), pTargetCreature->getY(), &gcRemoveEffect); } - // ٸ ġѴ. + // 다른 사람을 치료한다. HP_t CurrentHP = pTargetSlayer->getHP(ATTR_CURRENT); HP_t MaxHP = pTargetSlayer->getHP(ATTR_MAX); - // ȸ ġ Ѵ. + // 실제 회복 수치를 계산한다. int RealHealPoint = 0; if (CurrentHP + HealPoint <= MaxHP) { RealHealPoint = max((unsigned int)0, HealPoint); @@ -301,17 +301,17 @@ void CureAll::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk RealHealPoint = max(0, MaxHP - CurrentHP); } - // ġ ÷ش. + // 경험치를 올려준다. shareAttrExp(pSlayer, RealHealPoint, param.STRMultiplier, param.DEXMultiplier, param.INTMultiplier, _GCSkillToObjectOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToObjectOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToObjectOK1); - // HP Ѵ. + // HP를 셋팅한다. CurrentHP = min((int)(MaxHP), (int)(CurrentHP + HealPoint)); pTargetSlayer->setHP(CurrentHP, ATTR_CURRENT); - // ġᰡ Ǿ HP εijѴ. + // 치료가 되었으니 HP를 브로드캐스팅한다. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(TargetObjectID); gcStatusCurrentHP.setCurrentHP(CurrentHP); @@ -375,7 +375,7 @@ void CureAll::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void CureAll::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -419,7 +419,7 @@ void CureAll::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffec EffectBloodDrain* pEffectBloodDrain = NULL; - bool bEffected = false; // ƹ ֳ ɷ Ҵ. + bool bEffected = false; // 아무 저주나 걸려 있으면 켠다. if (pSlayer->getHP(ATTR_CURRENT) < pSlayer->getHP(ATTR_MAX)) { bHPCheck = true; } @@ -443,7 +443,7 @@ void CureAll::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffec EffectParalyze* pEffectParalyze = NULL; EffectSeduction* pEffectSeduction = NULL; - // 迭 ؼ + // 저주 계열 해소 if (pSlayer->isEffect(Effect::EFFECT_CLASS_DOOM)) { pEffectDoom = (EffectDoom*)pSlayer->findEffect(Effect::EFFECT_CLASS_DOOM); Assert(pEffectDoom != NULL); @@ -477,11 +477,11 @@ void CureAll::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffec bHPCheck = true; } - // 迭 ؼ - bool bGreenPoison = false; // GreenPoison ġұ - bool bYellowPoison = false; // YellowPoison ġұ - bool bDarkBluePoison = false; // DarkBluePoison ġұ - bool bGreenStalker = false; // GreenStalker ġұ + // 독 계열 해소 + bool bGreenPoison = false; // GreenPoison을 치료할까의 여부 + bool bYellowPoison = false; // YellowPoison을 치료할까의 여부 + bool bDarkBluePoison = false; // DarkBluePoison을 치료할까의 여부 + bool bGreenStalker = false; // GreenStalker를 치료할까의 여부 EffectPoison* pEffectPoison = NULL; EffectYellowPoisonToCreature* pEffectYellowPoisonToCreature = NULL; @@ -532,16 +532,16 @@ void CureAll::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffec uint HealPoint = param.SkillDamage; - // ¶ ¸ ش. + // 흡혈당한 상태라면 흡혈 상태를 날려준다. if (pEffectBloodDrain != NULL && pEffectBloodDrain->getLevel() < param.Level) { - // ƸƮ ϱ Ʈ ٿش. + // 흡혈 아르바이트를 방지하기 위한 후유증 이펙트를 붙여준다. if (pSlayer->isFlag(Effect::EFFECT_CLASS_AFTERMATH)) { Effect* pEffect = pSlayer->findEffect(Effect::EFFECT_CLASS_AFTERMATH); EffectAftermath* pEffectAftermath = dynamic_cast(pEffect); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. } else { EffectAftermath* pEffectAftermath = new EffectAftermath(pSlayer); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. pSlayer->addEffect(pEffectAftermath); pSlayer->setFlag(Effect::EFFECT_CLASS_AFTERMATH); pEffectAftermath->create(pSlayer->getName()); @@ -563,8 +563,8 @@ void CureAll::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffec pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcRemoveEffect); } - // ָ ϰ, - // Ŷ Ʈ ϶ Ѵ. + // 각각의 저주를 삭제하고, + // 패킷에다 이펙트 삭제하라고 더한다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); @@ -589,8 +589,8 @@ void CureAll::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffec gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_SEDUCTION); } - // ġḦ ϰ, - // Ŷ Ʈ ϶ Ѵ. + // 각각의 독마다 치료를 하고, + // 패킷에다 이펙트 삭제하라고 더한다. if (bGreenPoison) { pEffectPoison->setDeadline(0); pSlayer->removeFlag(Effect::EFFECT_CLASS_POISON); @@ -617,18 +617,18 @@ void CureAll::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffec } - // HP Ѵ. + // HP를 세팅한다. HP_t CurrentHP = pSlayer->getHP(ATTR_CURRENT); HP_t MaxHP = pSlayer->getHP(ATTR_MAX); - // ȸ ġ Ѵ. + // 실제 회복 수치를 계산한다. int RealHealPoint = 0; if (CurrentHP + HealPoint <= MaxHP) { RealHealPoint = max((unsigned int)0, HealPoint); } else { RealHealPoint = max(0, MaxHP - CurrentHP); } - // ġ ÷ش. + // 경험치를 올려준다. shareAttrExp(pSlayer, RealHealPoint, param.STRMultiplier, param.DEXMultiplier, param.INTMultiplier, _GCSkillToSelfOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1); @@ -637,7 +637,7 @@ void CureAll::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffec CurrentHP = min((int)MaxHP, (int)(CurrentHP + HealPoint)); pSlayer->setHP(CurrentHP, ATTR_CURRENT); - // HP εijѴ. + // HP를 브로드캐스팅한다. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pSlayer->getObjectID()); gcStatusCurrentHP.setCurrentHP(CurrentHP); diff --git a/src/server/gameserver/skill/CureCriticalWounds.cpp b/src/server/gameserver/skill/CureCriticalWounds.cpp index 1e448bc7..57e56b44 100644 --- a/src/server/gameserver/skill/CureCriticalWounds.cpp +++ b/src/server/gameserver/skill/CureCriticalWounds.cpp @@ -14,7 +14,7 @@ const uint CriticalBloodDrainLevel = 74; ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void CureCriticalWounds::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -45,7 +45,7 @@ void CureCriticalWounds::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffect if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); @@ -53,13 +53,13 @@ void CureCriticalWounds::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffect increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; input.TargetType = SkillInput::TARGET_OTHER; computeOutput(input, output); - // Ʈ ؼ δ + // 이펙트를 생성해서 붙인다 EffectCureCriticalWounds* pECCW = new EffectCureCriticalWounds(pSlayer); pECCW->setDeadline(output.Duration); pECCW->setPoint(output.Damage); @@ -69,7 +69,7 @@ void CureCriticalWounds::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffect pSlayer->addEffect(pECCW); pSlayer->setFlag(Effect::EFFECT_CLASS_CURE_CRITICAL_WOUNDS); - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); @@ -84,7 +84,7 @@ void CureCriticalWounds::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffect pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(myX, myY, &_GCSkillToSelfOK2, pSlayer); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pSlayer->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_CURE_CRITICAL_WOUNDS); diff --git a/src/server/gameserver/skill/CureLightWounds.cpp b/src/server/gameserver/skill/CureLightWounds.cpp index 5cb4df43..dd386e6a 100644 --- a/src/server/gameserver/skill/CureLightWounds.cpp +++ b/src/server/gameserver/skill/CureLightWounds.cpp @@ -11,7 +11,7 @@ const uint LightBloodDrainLevel = 24; ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void CureLightWounds::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -44,7 +44,7 @@ void CureLightWounds::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillS } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void CureLightWounds::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/CurePoison.cpp b/src/server/gameserver/skill/CurePoison.cpp index 50b1f47b..7e7ad863 100644 --- a/src/server/gameserver/skill/CurePoison.cpp +++ b/src/server/gameserver/skill/CurePoison.cpp @@ -20,7 +20,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void CurePoison::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -41,8 +41,8 @@ void CurePoison::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 - // ̾ ܿ ġ . + // NoSuch제거. by sigi. 2002.5.2 + // 슬레이어 외에는 치료할 수 없다. if (pTargetCreature == NULL || pTargetCreature->isSlayer() == false) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -61,11 +61,11 @@ void CurePoison::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* // by sigi. 2002.12.3 SkillLevel_t SkillLevel = pSlayer->getINT() / 2; // pSkillSlot->getExpLevel(); - bool bGreenPoison = false; // GreenPoison ġұ - bool bYellowPoison = false; // YellowPoison ġұ - bool bDarkBluePoison = false; // DarkBluePoison ġұ - bool bGreenStalker = false; // GreenStalker ġұ - bool bEffected = false; // ƹ ̳ ɷ Ҵ. + bool bGreenPoison = false; // GreenPoison을 치료할까의 여부 + bool bYellowPoison = false; // YellowPoison을 치료할까의 여부 + bool bDarkBluePoison = false; // DarkBluePoison을 치료할까의 여부 + bool bGreenStalker = false; // GreenStalker를 치료할까의 여부 + bool bEffected = false; // 아무 독이나 걸려있으면 켠다. EffectPoison* pEffectPoison = NULL; EffectYellowPoisonToCreature* pEffectYellowPoisonToCreature = NULL; @@ -110,8 +110,8 @@ void CurePoison::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* bool bTimeCheck = verifyRunTime(pSkillSlot); bool bRangeCheck = verifyDistance(pSlayer, pTargetCreature, pSkillInfo->getRange()); - // ְ, ð ư, Ÿ ϸ, - // ϳ ɷ־ Ѵ. + // 마나가 있고, 시간이 됐고, 거리가 적당하며, + // 독이 하나라도 걸려있어야 한다. if (bManaCheck && bTimeCheck && bRangeCheck && bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); @@ -119,8 +119,8 @@ void CurePoison::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* SkillOutput output; computeOutput(input, output); - // ġḦ ϰ, - // Ŷ Ʈ ϶ Ѵ. + // 각각의 독마다 치료를 하고, + // 패킷에다 이펙트 삭제하라고 더한다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pTargetCreature->getObjectID()); @@ -145,7 +145,7 @@ void CurePoison::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_GREEN_STALKER); } - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToObjectOK1); @@ -211,7 +211,7 @@ void CurePoison::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void CurePoison::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -240,11 +240,11 @@ void CurePoison::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEf // SkillLevel_t SkillLevel = pSkillSlot->getExpLevel(); SkillLevel_t SkillLevel = pSlayer->getINT() / 2; // pSkillSlot->getExpLevel(); - bool bGreenPoison = false; // GreenPoison ġұ - bool bYellowPoison = false; // YellowPoison ġұ - bool bDarkBluePoison = false; // DarkBluePoison ġұ - bool bGreenStalker = false; // GreenStalker ġұ - bool bEffected = false; // ƹ ̳ ɷ Ҵ. + bool bGreenPoison = false; // GreenPoison을 치료할까의 여부 + bool bYellowPoison = false; // YellowPoison을 치료할까의 여부 + bool bDarkBluePoison = false; // DarkBluePoison을 치료할까의 여부 + bool bGreenStalker = false; // GreenStalker를 치료할까의 여부 + bool bEffected = false; // 아무 독이나 걸려있으면 켠다. EffectPoison* pEffectPoison = NULL; EffectYellowPoisonToCreature* pEffectYellowPoisonToCreature = NULL; @@ -289,8 +289,8 @@ void CurePoison::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEf bool bTimeCheck = verifyRunTime(pSkillSlot); bool bRangeCheck = checkZoneLevelToUseSkill(pSlayer); - // ְ, ð ư, Ÿ ϸ, - // ϳ ɷ־ Ѵ. + // 마나가 있고, 시간이 됐고, 거리가 적당하며, + // 독이 하나라도 걸려있어야 한다. if (bManaCheck && bTimeCheck && bRangeCheck && bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); @@ -298,8 +298,8 @@ void CurePoison::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEf SkillOutput output; computeOutput(input, output); - // ġḦ ϰ, - // Ŷ Ʈ ϶ Ѵ. + // 각각의 독마다 치료를 하고, + // 패킷에다 이펙트 삭제하라고 더한다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); @@ -324,7 +324,7 @@ void CurePoison::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEf gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_GREEN_STALKER); } - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); @@ -346,7 +346,7 @@ void CurePoison::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEf pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(myX, myY, &_GCSkillToSelfOK2, pSlayer); - // Ǯȴٴ ˷شپ. + // 기술이 풀렸다는 것을 알려준다아. pZone->broadcastPacket(myX, myY, &gcRemoveEffect); pSkillSlot->setRunTime(output.Delay); diff --git a/src/server/gameserver/skill/CureSeriousWounds.cpp b/src/server/gameserver/skill/CureSeriousWounds.cpp index efa00e3f..9554c1b9 100644 --- a/src/server/gameserver/skill/CureSeriousWounds.cpp +++ b/src/server/gameserver/skill/CureSeriousWounds.cpp @@ -11,7 +11,7 @@ const uint SeriousBloodDrainLevel = 49; ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void CureSeriousWounds::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -45,7 +45,7 @@ void CureSeriousWounds::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Skil } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void CureSeriousWounds::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/CutStorm.cpp b/src/server/gameserver/skill/CutStorm.cpp index c466043d..dd0d215b 100644 --- a/src/server/gameserver/skill/CutStorm.cpp +++ b/src/server/gameserver/skill/CutStorm.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void CutStorm::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -27,7 +27,7 @@ void CutStorm::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS Zone* pZone = pSlayer->getZone(); Creature* pTargetCreature = pZone->getCreature(TargetObjectID); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -44,7 +44,7 @@ void CutStorm::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void CutStorm::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -66,7 +66,7 @@ void CutStorm::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* param.STRMultiplier = 8; param.DEXMultiplier = 1; param.INTMultiplier = 1; - // param.Level = 2; // 2 ؾ ϳ? + // param.Level = 2; // 2로 해야 하나? param.bMagicHitRoll = false; param.bMagicDamage = false; param.bAdd = true; diff --git a/src/server/gameserver/skill/DancingSword.cpp b/src/server/gameserver/skill/DancingSword.cpp index d8bc635d..887ab94c 100644 --- a/src/server/gameserver/skill/DancingSword.cpp +++ b/src/server/gameserver/skill/DancingSword.cpp @@ -13,7 +13,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ +// 슬레이어 셀프 ////////////////////////////////////////////////////////////////////////////// void DancingSword::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -32,7 +32,7 @@ void DancingSword::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t C Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 검이 아니라면 기술을 쓸 수 없다. Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL || pWeapon->getItemClass() != Item::ITEM_CLASS_SWORD) { executeSkillFailException(pSlayer, getSkillType()); @@ -69,21 +69,21 @@ void DancingSword::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t C int ToHitBonus = getPercentValue(pSlayer->getToHit(), output.Damage); // int ToHitBonus = output.Damage; - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectDancingSword* pEffect = new EffectDancingSword(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setToHitBonus(ToHitBonus); pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_DANCING_SWORD); - // ̷ Ͽ ٲ ɷġ . + // 이로 인하여 바뀌는 능력치를 보낸다. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); if (bIncreaseDomainExp) { @@ -92,7 +92,7 @@ void DancingSword::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t C // increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); } - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(output.Duration); diff --git a/src/server/gameserver/skill/DarkBluePoison.cpp b/src/server/gameserver/skill/DarkBluePoison.cpp index 85b27be4..de4a7a76 100644 --- a/src/server/gameserver/skill/DarkBluePoison.cpp +++ b/src/server/gameserver/skill/DarkBluePoison.cpp @@ -26,7 +26,7 @@ DarkBluePoison g_DarkBluePoison; ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void DarkBluePoison::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -48,8 +48,8 @@ void DarkBluePoison::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampi Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -66,7 +66,7 @@ void DarkBluePoison::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampi SkillType_t SkillType = pVampireSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // Knowledge of Poison ִٸ hit bonus 10 + // Knowledge of Poison 이 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_POISON)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_POISON); @@ -98,11 +98,11 @@ void DarkBluePoison::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampi Damage_t Damage = computeMagicDamage(pTargetCreature, output.Damage, SkillType, true, pVampire); - // ƿ콺 ð ޴´. + // 아우스터즈는 절반의 시간만 받는다. if (pTargetCreature->isOusters()) output.Duration /= 2; - // Ʈ Ʈ ؼ δ. + // 이펙트 오브젝트를 생성해서 붙인다. EffectDarkBluePoison* pEffectDarkBluePoison = new EffectDarkBluePoison(pTargetCreature); pEffectDarkBluePoison->setDamage(Damage); pEffectDarkBluePoison->setLevel(pSkillInfo->getLevel() / 2); @@ -112,7 +112,7 @@ void DarkBluePoison::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampi pTargetCreature->addEffect(pEffectDarkBluePoison); pTargetCreature->setFlag(Effect::EFFECT_CLASS_DARKBLUE_POISON); - // Ʈ پ, پٰ εijش. + // 이펙트가 붙었으니, 붙었다고 브로드캐스팅해준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_DARKBLUE_POISON); @@ -188,7 +188,7 @@ void DarkBluePoison::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampi } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void DarkBluePoison::execute(Monster* pMonster, Creature* pEnemy) @@ -231,7 +231,7 @@ void DarkBluePoison::execute(Monster* pMonster, Creature* pEnemy) Damage_t Damage = computeMagicDamage(pEnemy, output.Damage, SkillType); - // Ʈ Ʈ ؼ δ. + // 이펙트 오브젝트를 생성해서 붙인다. EffectDarkBluePoison* pEffectDarkBluePoison = new EffectDarkBluePoison(pEnemy); pEffectDarkBluePoison->setDamage(Damage); pEffectDarkBluePoison->setLevel(pSkillInfo->getLevel() / 2); @@ -241,7 +241,7 @@ void DarkBluePoison::execute(Monster* pMonster, Creature* pEnemy) pEnemy->addEffect(pEffectDarkBluePoison); pEnemy->setFlag(Effect::EFFECT_CLASS_DARKBLUE_POISON); - // Ʈ پ, پٰ εijش. + // 이펙트가 붙었으니, 붙었다고 브로드캐스팅해준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pEnemy->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_DARKBLUE_POISON); diff --git a/src/server/gameserver/skill/Darkness.cpp b/src/server/gameserver/skill/Darkness.cpp index 6e3a9fb5..1c316898 100644 --- a/src/server/gameserver/skill/Darkness.cpp +++ b/src/server/gameserver/skill/Darkness.cpp @@ -24,7 +24,7 @@ int normalizeCoord_DARKNESS(int x, int y, int edge) { } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Darkness::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -44,7 +44,7 @@ void Darkness::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pVampire, getSkillType()); return; @@ -61,7 +61,7 @@ void Darkness::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void Darkness::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -94,7 +94,7 @@ void Darkness::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireS ZoneCoord_t myX = pVampire->getX(); ZoneCoord_t myY = pVampire->getY(); - // Knowledge of Innate ִٸ hit bonus 10 + // Knowledge of Innate 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE); @@ -118,12 +118,12 @@ void Darkness::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireS if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bTileCheck && !bSlayerSafeZone) { decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); - // Ʈ ӽð Ѵ. + // 이펙트의 지속시간을 계산한다. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); - // Wisdom of Darkness ִٸ ӽð 30% + // Wisdom of Darkness 이 있다면 지속시간 30% 증가 if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_WISDOM_OF_DARKNESS)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_WISDOM_OF_DARKNESS); Assert(pRankBonus != NULL); @@ -139,7 +139,7 @@ void Darkness::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireS int edge = 1; - // Wide Darkness ִٸ 5*5 . skill type Ѵ. + // Wide Darkness 이 있다면 범위가 5*5 로 수정. skill type 을 수정한다. if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_WIDE_DARKNESS)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_WIDE_DARKNESS); Assert(pRankBonus != NULL); @@ -194,9 +194,9 @@ void Darkness::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireS if (tile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION) != NULL) continue; - // ŸϿ Ʈ ߰ ִٸ... + // 현재 타일에다 이펙트를 추가할 수 있다면... if (tile.canAddEffect()) { - // ӽ ׶ ߰ Ѵ. + // 머시 그라운드 있음 추가 못한당. if (tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL) continue; if (tile.getEffect(Effect::EFFECT_CLASS_DARKNESS_FORBIDDEN) != NULL) @@ -204,21 +204,21 @@ void Darkness::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireS /* if ( tile.getEffect(Effect::EFFECT_CLASS_SUMMON_CLAY) != NULL ) * continue;*/ - // effect . + // 같은 effect가 있으면 지운다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_DARKNESS); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); // fix me } - // Ʈ Ŭ Ѵ. + // 이펙트 클래스를 생성한다. EffectDarkness* pEffect = new EffectDarkness(pZone, tileX, tileY); pEffect->setDeadline(output.Duration); pEffect->setLevel(pVampire->getINT()); pEffect->setDuration(output.Duration); pEffect->setStartTime(); - // Tile ̴ Effect ObjectID Ϲ޾ƾ Ѵ. + // Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); pZone->addEffect(pEffect); @@ -298,8 +298,8 @@ void Darkness::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireS list watcherList = pZone->getWatcherList(myX, myY, pVampire); - // watcherList cList ʰ, caster(pVampire) - // OK4 .. cList ߰Ѵ. + // watcherList에서 cList에 속하지 않고, caster(pVampire)를 볼 수 없는 경우는 + // OK4를 보내고.. cList에 추가한다. for (list::const_iterator itr = watcherList.begin(); itr != watcherList.end(); itr++) { bool bBelong = false; for (list::const_iterator tItr = cList.begin(); tItr != cList.end(); tItr++) @@ -308,9 +308,9 @@ void Darkness::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireS Creature* pWatcher = (*itr); if (bBelong == false && canSee(pWatcher, pVampire) == false) { - // Assert(pWatcher->isPC()); // 翬 PC.. Zone::getWatcherList PC returnѴ + // Assert(pWatcher->isPC()); // 당연 PC다.. Zone::getWatcherList는 PC만 return한다 if (!pWatcher->isPC()) { - // cout << "Darkness : ó Ʈ PC ƴմϴ." << endl; + // cout << "Darkness : 왓처 리스트가 PC가 아닙니다." << endl; GCSkillFailed1 _GCSkillFailed1; _GCSkillFailed1.setSkillType(getSkillType()); pVampire->getPlayer()->sendPacket(&_GCSkillFailed1); @@ -357,7 +357,7 @@ void Darkness::execute(Monster* pMonster, Creature* pEnemy) } ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Darkness::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -394,7 +394,7 @@ void Darkness::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) bTileCheck = true; if (bRangeCheck && bHitRoll && bTileCheck) { - // Ʈ ӽð Ѵ. + // 이펙트의 지속시간을 계산한다. SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); @@ -422,29 +422,29 @@ void Darkness::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) } } - // ŸϿ Ʈ ߰ ִٸ... + // 현재 타일에다 이펙트를 추가할 수 있다면... if (tile.canAddEffect()) { - // ӽ ׶ ߰ Ѵ. + // 머시 그라운드 있음 추가 못한당. if (tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL) continue; if (tile.getEffect(Effect::EFFECT_CLASS_SUMMON_CLAY) != NULL) continue; - // effect . + // 같은 effect가 있으면 지운다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_DARKNESS); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); // fix me } - // Ʈ Ŭ Ѵ. + // 이펙트 클래스를 생성한다. EffectDarkness* pEffect = new EffectDarkness(pZone, tileX, tileY); pEffect->setDeadline(output.Duration); pEffect->setLevel(pMonster->getINT()); pEffect->setDuration(output.Duration); pEffect->setStartTime(); - // Tile ̴ Effect ObjectID Ϲ޾ƾ Ѵ. + // Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); @@ -516,8 +516,8 @@ void Darkness::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) list watcherList = pZone->getWatcherList(myX, myY, pMonster); - // watcherList cList ʰ, caster(pMonster) - // OK4 .. cList ߰Ѵ. + // watcherList에서 cList에 속하지 않고, caster(pMonster)를 볼 수 없는 경우는 + // OK4를 보내고.. cList에 추가한다. for (list::const_iterator itr = watcherList.begin(); itr != watcherList.end(); itr++) { bool bBelong = false; for (list::const_iterator tItr = cList.begin(); tItr != cList.end(); tItr++) @@ -526,7 +526,7 @@ void Darkness::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) Creature* pWatcher = (*itr); if (bBelong == false && canSee(pWatcher, pMonster) == false) { - // Assert(pWatcher->isPC()); // 翬 PC.. Zone::getWatcherList PC returnѴ + // Assert(pWatcher->isPC()); // 당연 PC다.. Zone::getWatcherList는 PC만 return한다 if (!pWatcher->isPC()) { // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; diff --git a/src/server/gameserver/skill/DeadlyClaw.cpp b/src/server/gameserver/skill/DeadlyClaw.cpp index f4a4fedc..efbc8cad 100644 --- a/src/server/gameserver/skill/DeadlyClaw.cpp +++ b/src/server/gameserver/skill/DeadlyClaw.cpp @@ -10,8 +10,8 @@ #include "SimpleTileMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// DeadlyClaw::DeadlyClaw() throw() { __BEGIN_TRY @@ -31,7 +31,7 @@ DeadlyClaw::DeadlyClaw() throw() { ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void DeadlyClaw::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -51,7 +51,7 @@ void DeadlyClaw::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pVampire, getSkillType()); @@ -70,7 +70,7 @@ void DeadlyClaw::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void DeadlyClaw::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -102,7 +102,7 @@ void DeadlyClaw::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir param.addMask(m_pDeadlyClawMask[i].x, m_pDeadlyClawMask[i].y, 100); } - // Knowledge of Blood ִٸ hit bonus 10 + // Knowledge of Blood 가 있다면 hit bonus 10 int HitBonus = 0; g_SimpleTileMeleeSkill.execute(pVampire, X, Y, pVampireSkillSlot, param, result, CEffectID); @@ -112,7 +112,7 @@ void DeadlyClaw::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void DeadlyClaw::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) diff --git a/src/server/gameserver/skill/Death.cpp b/src/server/gameserver/skill/Death.cpp index cb2debff..0b7a391e 100644 --- a/src/server/gameserver/skill/Death.cpp +++ b/src/server/gameserver/skill/Death.cpp @@ -20,7 +20,7 @@ #include "Reflection.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Death::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -41,9 +41,9 @@ void Death::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSl Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // 鿪. by sigi. 2002.9.13 - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수 없다. + // 저주 면역. by sigi. 2002.9.13 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_CURSE) || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); @@ -61,7 +61,7 @@ void Death::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSl SkillType_t SkillType = pSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // Knowledge of Curse ִٸ hit bonus 10 + // Knowledge of Curse 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_CURSE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_CURSE); @@ -95,7 +95,7 @@ void Death::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSl SkillOutput output; computeOutput(input, output); - // pTargetCreature ָ ݻϴ + // pTargetCreature가 저주마법을 반사하는 경우 if (CheckReflection(pVampire, pTargetCreature, getSkillType())) { pTargetCreature = (Creature*)pVampire; TargetObjectID = pVampire->getObjectID(); @@ -110,7 +110,7 @@ void Death::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSl if (output.Duration < 20) output.Duration = 20; - // Ʈ Ʈ δ. + // 이펙트 오브젝트를 생성해 붙인다. EffectDeath* pEffect = new EffectDeath(pTargetCreature); pEffect->setDeadline(output.Duration); pEffect->setLevel(pSkillInfo->getLevel() / 2); @@ -118,7 +118,7 @@ void Death::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSl pTargetCreature->addEffect(pEffect); pTargetCreature->setFlag(Effect::EFFECT_CLASS_DEATH); - // ɷġ ؼ ش. + // 능력치를 계산해서 보내준다. if (pTargetCreature->isSlayer()) { Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); @@ -189,10 +189,10 @@ void Death::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSl _GCSkillToObjectOK6.setSkillType(SkillType); _GCSkillToObjectOK6.setDuration(output.Duration); - if (bCanSeeCaster) // 10 ġ. + if (bCanSeeCaster) // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); - } else // 10 ġ. + } else // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK6, &_GCSkillToObjectOK1); } @@ -230,7 +230,7 @@ void Death::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSl gcAddEffect.setDuration(output.Duration); pZone->broadcastPacket(targetX, targetY, &gcAddEffect); - // cout << pTargetCreature->getName() << " Death " << output.Duration << " duration Ǵ." << + // cout << pTargetCreature->getName() << "에게 Death를 " << output.Duration << " duration 동안 건다." << // endl; pSkillSlot->setRunTime(output.Delay); @@ -248,7 +248,7 @@ void Death::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSl ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Death::execute(Monster* pMonster, Creature* pEnemy) @@ -275,7 +275,7 @@ void Death::execute(Monster* pMonster, Creature* pEnemy) if (pMonster->isMaster()) { int x = pMonster->getX(); int y = pMonster->getY(); - int Splash = 3 + rand() % 5; // 3~7 + int Splash = 3 + rand() % 5; // 3~7 마리 int range = 2; // 5x5 list creatureList; getSplashVictims(pMonster->getZone(), x, y, Creature::CREATURE_CLASS_MAX, creatureList, Splash, range); @@ -336,7 +336,7 @@ void Death::executeMonster(Zone* pZone, Monster* pMonster, Creature* pEnemy) SkillOutput output; computeOutput(input, output); - // pTargetCreature ָ ݻϴ + // pTargetCreature가 저주마법을 반사하는 경우 if (CheckReflection(pMonster, pEnemy, getSkillType())) { pEnemy = (Creature*)pMonster; } @@ -350,7 +350,7 @@ void Death::executeMonster(Zone* pZone, Monster* pMonster, Creature* pEnemy) if (output.Duration < 20) output.Duration = 20; - // Ʈ Ʈ δ. + // 이펙트 오브젝트를 생성해 붙인다. EffectDeath* pEffect = new EffectDeath(pEnemy); pEffect->setDeadline(output.Duration); pEffect->setLevel(pSkillInfo->getLevel() / 2); @@ -358,7 +358,7 @@ void Death::executeMonster(Zone* pZone, Monster* pMonster, Creature* pEnemy) pEnemy->setFlag(Effect::EFFECT_CLASS_DEATH); pEnemy->addEffect(pEffect); - // ɷġ ؼ ش. + // 능력치를 계산해서 보내준다. if (pEnemy->isSlayer()) { Slayer* pTargetSlayer = dynamic_cast(pEnemy); diff --git a/src/server/gameserver/skill/DeleoEfficio.cpp b/src/server/gameserver/skill/DeleoEfficio.cpp index 77224333..f93a37c7 100644 --- a/src/server/gameserver/skill/DeleoEfficio.cpp +++ b/src/server/gameserver/skill/DeleoEfficio.cpp @@ -15,7 +15,7 @@ #include "GCSkillToObjectOK6.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void DeleoEfficio::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -45,9 +45,9 @@ void DeleoEfficio::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ousters Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // 鿪. by sigi. 2002.9.13 - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수 없다. + // 저주 면역. by sigi. 2002.9.13 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; diff --git a/src/server/gameserver/skill/DenialMagic.cpp b/src/server/gameserver/skill/DenialMagic.cpp index 5b2ad416..51456d5c 100644 --- a/src/server/gameserver/skill/DenialMagic.cpp +++ b/src/server/gameserver/skill/DenialMagic.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void DenialMagic::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -49,18 +49,18 @@ void DenialMagic::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectDenialMagic* pEffect = new EffectDenialMagic(pSlayer); pEffect->setDeadline(output.Duration); pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_DENIAL_MAGIC); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); diff --git a/src/server/gameserver/skill/Destinies.cpp b/src/server/gameserver/skill/Destinies.cpp index 4134f547..2ed6e76b 100644 --- a/src/server/gameserver/skill/Destinies.cpp +++ b/src/server/gameserver/skill/Destinies.cpp @@ -13,7 +13,7 @@ #include "ZoneUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Destinies::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -44,7 +44,7 @@ void Destinies::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSki g_SimpleMissileSkill.execute(pOusters, TargetObjectID, pOustersSkillSlot, param, result, CEffectID); if (result.bSuccess) { - cout << "Destinies " << endl; + cout << "Destinies 성공" << endl; if (result.pTargetCreature->isOusters()) return; diff --git a/src/server/gameserver/skill/DestructionSpear.cpp b/src/server/gameserver/skill/DestructionSpear.cpp index 02fb3fbf..44bd6f41 100644 --- a/src/server/gameserver/skill/DestructionSpear.cpp +++ b/src/server/gameserver/skill/DestructionSpear.cpp @@ -14,7 +14,7 @@ #include "SimpleTileMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void DestructionSpear::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -32,7 +32,7 @@ void DestructionSpear::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ous Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pOusters, getSkillType()); diff --git a/src/server/gameserver/skill/DetectHidden.cpp b/src/server/gameserver/skill/DetectHidden.cpp index 9e738593..de44a566 100644 --- a/src/server/gameserver/skill/DetectHidden.cpp +++ b/src/server/gameserver/skill/DetectHidden.cpp @@ -13,7 +13,7 @@ #include "Party.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void DetectHidden::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -49,21 +49,21 @@ void DetectHidden::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t C if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // Ǵ ð õ ޶. + // 기술이 유지되는 시간은 숙련도에 따라서 달라진다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ ؼ δ. + // 이펙트 오브젝트를 생성해서 붙인다. EffectDetectHidden* pEffectDetectHidden = new EffectDetectHidden(pSlayer); pEffectDetectHidden->setDeadline(output.Duration); pSlayer->addEffect(pEffectDetectHidden); pSlayer->setFlag(Effect::EFFECT_CLASS_DETECT_HIDDEN); - // Ʈ ν, ̴ δ. + // 이 이펙트가 붙음으로써, 안 보이던 것이 보인다. pZone->updateHiddenScan(pSlayer); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1) * 2; shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); @@ -82,7 +82,7 @@ void DetectHidden::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t C pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCSkillToSelfOK2, pSlayer); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pSlayer->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_DETECT_HIDDEN); diff --git a/src/server/gameserver/skill/DetectInvisibility.cpp b/src/server/gameserver/skill/DetectInvisibility.cpp index bc5f7fee..c49fc15c 100644 --- a/src/server/gameserver/skill/DetectInvisibility.cpp +++ b/src/server/gameserver/skill/DetectInvisibility.cpp @@ -13,7 +13,7 @@ #include "Party.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void DetectInvisibility::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -49,21 +49,21 @@ void DetectInvisibility::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffect if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // Ǵ ð õ ޶. + // 기술이 유지되는 시간은 숙련도에 따라서 달라진다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ ؼ δ. + // 이펙트 오브젝트를 생성해서 붙인다. EffectDetectInvisibility* pEffectDetectInvisibility = new EffectDetectInvisibility(pSlayer); pEffectDetectInvisibility->setDeadline(output.Duration); pSlayer->addEffect(pEffectDetectInvisibility); pSlayer->setFlag(Effect::EFFECT_CLASS_DETECT_INVISIBILITY); - // Ʈ ν, ̴ δ. + // 이 이펙트가 붙음으로써, 안 보이던 것이 보인다. pZone->updateInvisibleScan(pSlayer); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1) * 2; shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); @@ -82,7 +82,7 @@ void DetectInvisibility::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffect pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCSkillToSelfOK2, pSlayer); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pSlayer->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_DETECT_INVISIBILITY); diff --git a/src/server/gameserver/skill/DisarmMine.cpp b/src/server/gameserver/skill/DisarmMine.cpp index 92096fdc..d046aea2 100644 --- a/src/server/gameserver/skill/DisarmMine.cpp +++ b/src/server/gameserver/skill/DisarmMine.cpp @@ -55,7 +55,7 @@ void DisarmMine::execute( Slayer * pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill //Assert( pSkillSlot != NULL ); if (pSkillSlot == NULL) { - cout << "DisarmMine : ų Դϴ." << endl; + cout << "DisarmMine : 스킬 슬랏이 널입니다." << endl; GCSkillFailed1 _GCSkillFailed1; pSlayer->getPlayer()->sendPacket( &_GCSkillFailed1); return; @@ -65,7 +65,7 @@ void DisarmMine::execute( Slayer * pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill SkillInfo * pSkillInfo = g_pSkillInfoManager->getSkillInfo( SkillType ); SkillLevel_t SkillLevel = pSkillSlot->getExpLevel(); - // ߷. + // 명중률. ToHit_t ToHit = pSlayer->getToHit(); int RemainMP = (int)pSlayer->getMP( ATTR_CURRENT) - (int)pSkillInfo->getConsumeMP(); @@ -78,7 +78,7 @@ void DisarmMine::execute( Slayer * pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill } - // Installed mine ã´. + // Installed mine을 찾는다. Mine* pMine = NULL; bool bInstallAction = false; // install or disarm Item* pItem = pZone->getTile( X, Y).getItem(); @@ -86,9 +86,9 @@ void DisarmMine::execute( Slayer * pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill { if( pItem->isFlag( Effect::EFFECT_CLASS_INSTALL)) { - if( pSlayer->isFlag( Effect::EFFECT_CLASS_DETECT_MINE)) // ִ» Ȯ. + if( pSlayer->isFlag( Effect::EFFECT_CLASS_DETECT_MINE)) // 현재 볼 수 있는상태인지 확인. { - bInstallAction = false;// disarm̴ + bInstallAction = false;// disarm이닷 pMine = dynamic_cast(pItem); } } @@ -101,7 +101,7 @@ void DisarmMine::execute( Slayer * pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill ZoneCoord_t slayerX = pSlayer->getX(), slayerY = pSlayer->getY(); - // и . + // 기술의 성패를 따진다. if ( pMine && bModifyMP && (ToHit + SkillLevel) > Random(0, 100) ) { Range_t Range = 1; @@ -113,13 +113,13 @@ void DisarmMine::execute( Slayer * pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill { pMine->setDir( calcDirection( slayerX, slayerY, X, Y)); pMine->setFlag( Effect::EFFECT_CLASS_INSTALL); - // mine ڵ鿡Դ + // mine을 볼 수 없게 된 자들에게는 삭제 addInstalledMine( pZone, pMine, X, Y); } else { - // Ѵ. + // 삭제한다. pZone->deleteItem( pMine, X, Y ); GCDeleteObject gcDeleteObject; gcDeleteObject.setObjectID( pMine->getObjectID() ); diff --git a/src/server/gameserver/skill/DistanceBlitz.cpp b/src/server/gameserver/skill/DistanceBlitz.cpp index 90eb5a86..f1edf94a 100644 --- a/src/server/gameserver/skill/DistanceBlitz.cpp +++ b/src/server/gameserver/skill/DistanceBlitz.cpp @@ -10,7 +10,7 @@ #include "SimpleTileMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void DistanceBlitz::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -30,7 +30,7 @@ void DistanceBlitz::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ouster Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pOusters, pTargetCreature)) { executeSkillFailException(pOusters, getSkillType()); return; diff --git a/src/server/gameserver/skill/DivineGuidance.cpp b/src/server/gameserver/skill/DivineGuidance.cpp index 0634c2c8..f31bcbd1 100644 --- a/src/server/gameserver/skill/DivineGuidance.cpp +++ b/src/server/gameserver/skill/DivineGuidance.cpp @@ -15,7 +15,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void DivineGuidance::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -36,14 +36,14 @@ void DivineGuidance::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSl Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature)) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; return; } - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; if (pTargetCreature->isPC()) { @@ -72,11 +72,11 @@ void DivineGuidance::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSl bool bPK = verifyPK(pSlayer, pTargetCreature); if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bPK) { - // δ. + // 마나를 줄인다. decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); if (!pTargetCreature->isSlayer()) { - // ġ ÷ش. + // 경험치를 올려준다. // SkillGrade Grade = // g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = // 10* (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToObjectOK1); @@ -89,7 +89,7 @@ void DivineGuidance::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSl increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToObjectOK1); } - // Ʈ ؼ δ. + // 이펙트를 생성해서 붙인다. EffectDivineGuidance* pEffect = new EffectDivineGuidance(pTargetCreature); Assert(pEffect != NULL); pEffect->setDeadline(output.Duration); @@ -101,7 +101,7 @@ void DivineGuidance::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSl pTargetCreature->addEffect(pEffect); pTargetCreature->setFlag(Effect::EFFECT_CLASS_DIVINE_GUIDANCE); - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); @@ -135,7 +135,7 @@ void DivineGuidance::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSl pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCSkillToObjectOK5, cList); - // // Ʈ پٰ ˷ش. + // // 이펙트가 붙었다고 알려준다. // GCAddEffect gcAddEffect; // gcAddEffect.setObjectID(pTargetCreature->getObjectID()); // gcAddEffect.setEffectID(Effect::EFFECT_CLASS_DIVINE_GUIDANCE); diff --git a/src/server/gameserver/skill/DivineSpirits.cpp b/src/server/gameserver/skill/DivineSpirits.cpp index 3a35f765..258b0823 100644 --- a/src/server/gameserver/skill/DivineSpirits.cpp +++ b/src/server/gameserver/skill/DivineSpirits.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void DivineSpirits::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -50,12 +50,12 @@ void DivineSpirits::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSl if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bSatisfyRequire) { decreaseMana(pOusters, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectDivineSpirits* pEffect = new EffectDivineSpirits(pOusters); pEffect->setDeadline(output.Duration); pEffect->setBonus(output.Damage); diff --git a/src/server/gameserver/skill/Doom.cpp b/src/server/gameserver/skill/Doom.cpp index 3e0b5002..bbae9f10 100644 --- a/src/server/gameserver/skill/Doom.cpp +++ b/src/server/gameserver/skill/Doom.cpp @@ -20,7 +20,7 @@ #include "Reflection.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Doom::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -41,9 +41,9 @@ void Doom::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlo Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // 鿪. by sigi. 2002.9.13 - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수 없다. + // 저주 면역. by sigi. 2002.9.13 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_CURSE) || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); @@ -61,7 +61,7 @@ void Doom::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlo SkillType_t SkillType = pSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // Knowledge of Curse ִٸ hit bonus 10 + // Knowledge of Curse 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_CURSE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_CURSE); @@ -95,13 +95,13 @@ void Doom::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlo SkillOutput output; computeOutput(input, output); - // pTargetCreature ָ ݻϴ + // pTargetCreature가 저주마법을 반사하는 경우 if (CheckReflection(pVampire, pTargetCreature, getSkillType())) { pTargetCreature = (Creature*)pVampire; TargetObjectID = pVampire->getObjectID(); } - // Ʈ Ʈ δ. + // 이펙트 오브젝트를 생성해 붙인다. EffectDoom* pEffect = new EffectDoom(pTargetCreature); pEffect->setDeadline(output.Duration); pEffect->setLevel(pSkillInfo->getLevel() / 2); @@ -110,7 +110,7 @@ void Doom::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlo pTargetCreature->addEffect(pEffect); pTargetCreature->setFlag(Effect::EFFECT_CLASS_DOOM); - // ɷġ ؼ ش. + // 능력치를 계산해서 보내준다. if (pTargetCreature->isSlayer()) { Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); @@ -179,10 +179,10 @@ void Doom::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlo _GCSkillToObjectOK6.setSkillType(SkillType); _GCSkillToObjectOK6.setDuration(output.Duration); - if (bCanSeeCaster) // 10 ġ. + if (bCanSeeCaster) // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); - } else // 10 ġ. + } else // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK6, &_GCSkillToObjectOK1); } @@ -235,7 +235,7 @@ void Doom::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlo ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Doom::execute(Monster* pMonster, Creature* pEnemy) @@ -262,7 +262,7 @@ void Doom::execute(Monster* pMonster, Creature* pEnemy) if (pMonster->isMaster()) { int x = pMonster->getX(); int y = pMonster->getY(); - int Splash = 3 + rand() % 5; // 3~7 + int Splash = 3 + rand() % 5; // 3~7 마리 int range = 2; // 5x5 list creatureList; getSplashVictims(pZone, x, y, Creature::CREATURE_CLASS_MAX, creatureList, Splash, range); @@ -324,13 +324,13 @@ void Doom::executeMonster(Zone* pZone, Monster* pMonster, Creature* pEnemy) SkillOutput output; computeOutput(input, output); - // pTargetCreature ָ ݻϴ + // pTargetCreature가 저주마법을 반사하는 경우 if (CheckReflection(pMonster, pEnemy, getSkillType())) { pEnemy = (Creature*)pMonster; } - // Ʈ Ʈ δ. + // 이펙트 오브젝트를 생성해 붙인다. EffectDoom* pEffect = new EffectDoom(pEnemy); pEffect->setDeadline(output.Duration); pEffect->setLevel(pSkillInfo->getLevel() / 2); @@ -339,7 +339,7 @@ void Doom::executeMonster(Zone* pZone, Monster* pMonster, Creature* pEnemy) pEnemy->setFlag(Effect::EFFECT_CLASS_DOOM); pEnemy->addEffect(pEffect); - // ɷġ ؼ ش. + // 능력치를 계산해서 보내준다. if (pEnemy->isSlayer()) { Slayer* pTargetSlayer = dynamic_cast(pEnemy); diff --git a/src/server/gameserver/skill/DoubleImpact.cpp b/src/server/gameserver/skill/DoubleImpact.cpp index 3b16bc60..d552056f 100644 --- a/src/server/gameserver/skill/DoubleImpact.cpp +++ b/src/server/gameserver/skill/DoubleImpact.cpp @@ -9,7 +9,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void DoubleImpact::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/DoubleShot.cpp b/src/server/gameserver/skill/DoubleShot.cpp index d05a38b6..75d0bc6a 100644 --- a/src/server/gameserver/skill/DoubleShot.cpp +++ b/src/server/gameserver/skill/DoubleShot.cpp @@ -14,7 +14,7 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ +// 슬레이어 오브젝트 ////////////////////////////////////////////////////////////////////////////// void DoubleShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -35,7 +35,7 @@ void DoubleShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -50,9 +50,9 @@ void DoubleShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* GCAttackArmsOK4 _GCAttackArmsOK4; GCAttackArmsOK5 _GCAttackArmsOK5; - // ִ Ⱑ ų, 迭 Ⱑ ƴ϶ . - // 迭 ߿ SG SR DoubleShot . - // SR, SG ִ. + // 들고 있는 무기가 없거나, 총 계열 무기가 아니라면 기술을 쓸 수 없다. + // 총 계열 무기 중에서도 SG나 SR은 DoubleShot를 쓸 수가 없다. + // SR, SG 도 이제 쓸수 있다. // 2003.1.14 by bezz Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL || isArmsWeapon(pWeapon) == false) @@ -73,7 +73,7 @@ void DoubleShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* SkillOutput output; computeOutput(input, output); - // Ƽ Ѵ. + // 페널티 값을 계산한다. int ToHitPenalty = getPercentValue(pSlayer->getToHit(), output.ToHit); int RequiredMP = (int)pSkillInfo->getConsumeMP(); @@ -84,12 +84,12 @@ void DoubleShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* bool bHitRoll = HitRoll::isSuccess(pSlayer, pTargetCreature, ToHitPenalty); bool bPK = verifyPK(pSlayer, pTargetCreature); - // Ѿ ڴ ߸. + // 총알 숫자는 무조건 떨어뜨린다. Bullet_t RemainBullet = 0; if (bBulletCheck) { - // Ѿ ڸ ߸, ϰ, Ѿ ڸ ޾ƿ´. + // 총알 숫자를 떨어뜨리고, 저장하고, 남은 총알 숫자를 받아온다. decreaseBullet(pWeapon); - // ѹ߾ ʿ . by sigi. 2002.5.9 + // 한발쓸때마다 저장할 필요 없다. by sigi. 2002.5.9 // pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); RemainBullet = getRemainBullet(pWeapon); } @@ -102,31 +102,31 @@ void DoubleShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* bool bCriticalHit = false; - // ϰ, quickfire Ƽ Ѵ. - // output.Damage ̱ , % ϸ ᱹ ȴ. + // 데미지를 계산하고, quickfire 페널티를 가한다. + // output.Damage가 음수이기 때문에, %값을 구해 더하면 결국 빼는 것이 된다. int Damage = computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); Damage += getPercentValue(Damage, output.Damage); Damage = max(0, Damage); // cout << "DoubleShotDamage:" << Damage << endl; - // Ѵ. + // 데미지를 세팅한다. setDamage(pTargetCreature, Damage, pSlayer, SkillType, &_GCAttackArmsOK2, &_GCAttackArmsOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCAttackArmsOK2, &_GCAttackArmsOK1); - // ڿ Ʈ. - // ؿ ִ Ű. by sigi. 2002.5.13 + // 공격자와 상대의 아이템 내구성 떨어트림. + // 밑에 있던걸 이쪽으로 옮겼다. by sigi. 2002.5.13 decreaseDurability(pSlayer, pTargetCreature, NULL, &_GCAttackArmsOK1, &_GCAttackArmsOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } /* - // 80% Ȯθ ɷġ Ѵ. - // ̾ ƴ 쿡 ġ Ѵ. + // 80% 확률로만 능력치가 상승한다. + // 상대방이 슬레이어가 아닐 경우에만 경험치가 상승한다. if (Random(1, 100) < 80 && !pTargetCreature->isSlayer()) { */ diff --git a/src/server/gameserver/skill/DragonTornado.cpp b/src/server/gameserver/skill/DragonTornado.cpp index a5d6af91..d013c11b 100644 --- a/src/server/gameserver/skill/DragonTornado.cpp +++ b/src/server/gameserver/skill/DragonTornado.cpp @@ -11,7 +11,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void DragonTornado::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -50,12 +50,12 @@ void DragonTornado::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo Creature* pCreature = pZone->getCreature(TargetObjectID); if (pCreature != NULL) { - // 츸 delay ߰Ѵ. - // player client óϰ Ǿִ. + // 몬스터인 경우만 delay를 추가한다. + // player들은 client에서 처리하게 되어있다. if (pCreature->isMonster()) { Monster* pMonster = dynamic_cast(pCreature); - // delay ( + 1 ) + // delay설정 ( + 1초 ) if (!pMonster->isMaster()) { Timeval delay; delay.tv_sec = 1; @@ -87,7 +87,7 @@ void DragonTornado::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo } } - // 뿡 Ʈ ٿش. + // 상대에게 데미지를 준 다음 이펙트를 붙여준다. // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; diff --git a/src/server/gameserver/skill/DuckingWallop.cpp b/src/server/gameserver/skill/DuckingWallop.cpp index 07510d88..23a4dcd1 100644 --- a/src/server/gameserver/skill/DuckingWallop.cpp +++ b/src/server/gameserver/skill/DuckingWallop.cpp @@ -19,8 +19,8 @@ ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// DuckingWallop::DuckingWallop() throw() { __BEGIN_TRY @@ -81,7 +81,7 @@ DuckingWallop::DuckingWallop() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void DuckingWallop::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -101,7 +101,7 @@ void DuckingWallop::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ouster Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pOusters, getSkillType()); @@ -120,7 +120,7 @@ void DuckingWallop::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ouster } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void DuckingWallop::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -131,7 +131,7 @@ void DuckingWallop::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ous // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << "begin " << endl; SkillType_t SkillType = getSkillType(); - // Knowledge of Blood ִٸ hit bonus 10 + // Knowledge of Blood 가 있다면 hit bonus 10 // int HitBonus = 0; if (pOusters->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD)) { RankBonus* pRankBonus = pOusters->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_BLOOD); @@ -147,7 +147,7 @@ void DuckingWallop::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ous Dir_t dir = getDirectionToPosition(pOusters->getX(), pOusters->getY(), X, Y); - // knockbackų Ȯ + // 강제로 knockback시킬 확률 // bool bForceKnockback = rand()%100 < output.ToHit; Player* pPlayer = pOusters->getPlayer(); @@ -184,23 +184,23 @@ void DuckingWallop::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ous if (bManaCheck && bTimeCheck && bRangeCheck && bPassLine && pZone->moveFastPC(pOusters, myX, myY, TargetX, TargetY, getSkillType())) { - // ߸. + // 마나를 떨어뜨린다. decreaseMana(pOusters, RequiredMP, _GCSkillToTileOK1); - // ǥ Ѵ. + // 좌표와 방향을 구한다. // Dir_t dir = calcDirection(myX, myY, X, Y); list cList; - // knockback recursive ϰ Դ 찡 ִ. - // ׷ ʿ ִ ũ üũѴ. + // knockback 때문에 recursive 하게 데미지를 먹는 경우가 있다. + // 그래서 제일 먼쪽에 있는 마스크부터 체크한다. for (int i = 17; i >= 0; i--) { int tileX = myX + m_pDuckingWallopMask[dir][i].x; int tileY = myY + m_pDuckingWallopMask[dir][i].y; - // Ÿ ̰, 밡 ƴ϶ ɼ ִ. + // 현재 타일이 존 내부이고, 안전지대가 아니라면 맞을 가능성이 있다. if (rect.ptInRect(tileX, tileY)) { - // Ÿ ޾ƿ´. + // 타일을 받아온다. Tile& tile = pZone->getTile(tileX, tileY); list targetList; @@ -246,7 +246,7 @@ void DuckingWallop::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ous _GCSkillToTileOK2.addCListElement(targetObjectID); _GCSkillToTileOK5.addCListElement(targetObjectID); - // ϴ ´ Ŷ · ä, ش. + // 일단 맞는 놈이 받을 패킷은 널 상태로 한 채로, 데미지를 준다. setDamage(pTargetCreature, Damage, pOusters, SkillType, NULL, &_GCSkillToTileOK1); computeAlignmentChange(pTargetCreature, Damage, pOusters, NULL, &_GCSkillToTileOK1); @@ -263,7 +263,7 @@ void DuckingWallop::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ous } - // ߸. + // 공격자의 아이템 내구성을 떨어뜨린다. decreaseDurability(pOusters, NULL, pSkillInfo, &_GCSkillToTileOK1, NULL); _GCSkillToTileOK1.setSkillType(SkillType); @@ -289,7 +289,7 @@ void DuckingWallop::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ous pPlayer->sendPacket(&_GCSkillToTileOK1); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; Assert(pTargetCreature != NULL); @@ -297,7 +297,7 @@ void DuckingWallop::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ous if (pTargetCreature->isPC()) { _GCSkillToTileOK2.clearList(); - // HP Ŷ Ѵ. + // HP의 변경사항을 패킷에다 기록한다. HP_t targetHP = 0; if (pTargetCreature->isSlayer()) { targetHP = (dynamic_cast(pTargetCreature))->getHP(ATTR_CURRENT); @@ -309,13 +309,13 @@ void DuckingWallop::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ous _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // ߸. + // 아이템의 내구력을 떨어뜨린다. decreaseDurability(NULL, pTargetCreature, pSkillInfo, NULL, &_GCSkillToTileOK2); - // Ŷ ش. + // 패킷을 보내준다. pTargetCreature->getPlayer()->sendPacket(&_GCSkillToTileOK2); } else if (pTargetCreature->isMonster()) { - // νѴ. + // 당근 적으로 인식한다. Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pOusters); } diff --git a/src/server/gameserver/skill/DummyDrake.cpp b/src/server/gameserver/skill/DummyDrake.cpp index e4d04b01..af348219 100644 --- a/src/server/gameserver/skill/DummyDrake.cpp +++ b/src/server/gameserver/skill/DummyDrake.cpp @@ -16,7 +16,7 @@ #include "GCSkillToObjectOK6.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void DummyDrake::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -36,8 +36,8 @@ void DummyDrake::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pOusters, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType(), Grade); return; @@ -68,7 +68,7 @@ void DummyDrake::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSk SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(getSkillType()); int RequiredMP = (int)pSkillInfo->getConsumeMP() + pOustersSkillSlot->getExpLevel() / 3; - // MP + // 헌뇜杰唐MP // RequiredMP = pOusters->getMP(); bool bManaCheck = hasEnoughMana(pOusters, RequiredMP); diff --git a/src/server/gameserver/skill/DuplicateSelf.cpp b/src/server/gameserver/skill/DuplicateSelf.cpp index 820d38d0..45fce1ed 100644 --- a/src/server/gameserver/skill/DuplicateSelf.cpp +++ b/src/server/gameserver/skill/DuplicateSelf.cpp @@ -17,21 +17,21 @@ ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// DuplicateSelf::DuplicateSelf() throw() { __BEGIN_TRY - // .. Ϲ ̺ .. -_-; - m_DuplicateMonsterTypes[432] = 435; // 丮 н - m_DuplicateMonsterTypes[434] = 436; // н + // 머.. 답답하믄 테이블로 빼든지.. -_-; + m_DuplicateMonsterTypes[432] = 435; // 바토리 분신 + m_DuplicateMonsterTypes[434] = 436; // 테페즈 분신 __END_CATCH } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 뱀파이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// /* void DuplicateSelf::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -74,7 +74,7 @@ void DuplicateSelf::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEf { decreaseMana(pVampire, RequiredMP, _GCSkillToSelfOK1); - // ̾ ϱ Ŷ . + // 뱀파이어를 땅 위에서 삭제하기 이전에 기술 패킷들을 날린다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(0); @@ -86,12 +86,12 @@ void DuplicateSelf::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEf pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(x, y, &_GCSkillToSelfOK2, pVampire); - // ִ ̾ ϶ ˸. + // 땅 위에 나와있는 뱀파이어 삭제하라고 알린다. GCDeleteObject gcDO; gcDO.setObjectID(pVampire->getObjectID()); pZone->broadcastPacket(x, y, &gcDO, pVampire); - // ӿٰ ̾ ߰Ѵ. + // 땅 속에다가 뱀파이어를 추가한다. addBurrowingCreature(pZone, pVampire, x, y); pSkillSlot->setRunTime(); @@ -114,7 +114,7 @@ void DuplicateSelf::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEf */ ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void DuplicateSelf::execute(Monster* pMonster) @@ -128,7 +128,7 @@ void DuplicateSelf::execute(Monster* pMonster) unordered_map::const_iterator itr = m_DuplicateMonsterTypes.find(MType); - // н MonsterType н .. + // 분신할 MonsterType이 없으면 분신 모하지.. if (itr == m_DuplicateMonsterTypes.end()) { // cout <<"DuplicateSelf::noMonsterType: " << (int)MType << endl; return; @@ -172,12 +172,12 @@ void DuplicateSelf::execute(Monster* pMonster) pZone->broadcastPacket(x, y, &_GCSkillToTileOK5); //-------------------------------------------------------- - // knockbackǴ¸´ ֵ üũش. + // 주위에 knockback되는맞는 애들을 체크해준다. //-------------------------------------------------------- // SkillInput input(pMonster); // SkillOutput output; // computeOutput(input, output); - // ͸ ߰Ѵ. + // 몬스터를 존에 추가한다. SUMMON_INFO summonInfo; summonInfo.scanEnemy = true; summonInfo.hasItem = false; @@ -202,7 +202,7 @@ void DuplicateSelf::execute(Monster* pMonster) } } - // ܻ ش. + // 잔상을 보여준다. list::const_iterator iMonster = summonedMonsters.begin(); for (; iMonster != summonedMonsters.end(); iMonster++) { @@ -215,8 +215,8 @@ void DuplicateSelf::execute(Monster* pMonster) pZone->broadcastPacket(x, y, &gcFakeMove); } - // ͵ 򰡷 ̵غ. - // 50 õ.. + // 괜히 몬스터도 어딘가로 이동해본다. + // 50번 시도.. for (int i = 0; i < 50; i++) { int X = max(0, min((int)pZone->getWidth() - 1, (x - 8 + rand() % 11))); int Y = max(0, min((int)pZone->getHeight() - 1, (y - 8 + rand() % 11))); diff --git a/src/server/gameserver/skill/DuplicateSelf.h b/src/server/gameserver/skill/DuplicateSelf.h index 137a2eb2..b8cb7147 100644 --- a/src/server/gameserver/skill/DuplicateSelf.h +++ b/src/server/gameserver/skill/DuplicateSelf.h @@ -33,7 +33,7 @@ class DuplicateSelf : public SkillHandler { void computeOutput(const SkillInput& input, SkillOutput& output); private: - // [MType] = нMType + // [원래MType] = 분신MType unordered_map m_DuplicateMonsterTypes; }; diff --git a/src/server/gameserver/skill/Earthquake.cpp b/src/server/gameserver/skill/Earthquake.cpp index 67c98aff..b6d70c7f 100644 --- a/src/server/gameserver/skill/Earthquake.cpp +++ b/src/server/gameserver/skill/Earthquake.cpp @@ -9,7 +9,7 @@ #include "SimpleLinearMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Earthquake::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -25,7 +25,7 @@ void Earthquake::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Zone* pZone = pSlayer->getZone(); Creature* pTargetCreature = pZone->getCreature(TargetObjectID); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -42,7 +42,7 @@ void Earthquake::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Earthquake::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/EarthsTeeth.cpp b/src/server/gameserver/skill/EarthsTeeth.cpp index 33e718a4..92fdd289 100644 --- a/src/server/gameserver/skill/EarthsTeeth.cpp +++ b/src/server/gameserver/skill/EarthsTeeth.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void EarthsTeeth::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/EatCorpse.cpp b/src/server/gameserver/skill/EatCorpse.cpp index ae62e13a..ce0f69d3 100644 --- a/src/server/gameserver/skill/EatCorpse.cpp +++ b/src/server/gameserver/skill/EatCorpse.cpp @@ -22,7 +22,7 @@ #include "VampireCorpse.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void EatCorpse::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -68,9 +68,9 @@ void EatCorpse::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire MonsterCorpse* pCorpse = dynamic_cast(pItem); Assert(pCorpse != NULL); - // ƴϾ Ѵ. - // ũ Ʈ ƴϾ Ѵ. - // ƴϾ Ѵ. + // 성물보관함이 아니어야 한다. + // 크리스마스 트리가 아니어야 한다. + // 성단이 아니어야 한다. if (!pCorpse->isFlag(Effect::EFFECT_CLASS_SLAYER_RELIC_TABLE) && !pCorpse->isFlag(Effect::EFFECT_CLASS_VAMPIRE_RELIC_TABLE) && pCorpse->getMonsterType() != 482 && pCorpse->getMonsterType() != 650 && pCorpse->getTreasureCount() < 200 && !pCorpse->isShrine()) { @@ -82,14 +82,14 @@ void EatCorpse::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire Corpse* pCorpse = dynamic_cast(pItem); Assert(pCorpse != NULL); - // ̾ ṵ̈, Evil ̶ ü Դ ƴ϶, Ѵ. + // 뱀파이어 시체이고, 성향이 Evil 이라면 시체를 먹는 것이 아니라, 아이템을 루팅 한다. if (pCorpse->getItemType() == VAMPIRE_CORPSE) { PCVampireInfo3& rPCVampireInfo3 = dynamic_cast(pCorpse)->getVampireInfo(); if (g_pAlignmentManager->getAlignmentType(rPCVampireInfo3.getAlignment()) < NEUTRAL) { ItemNum_t ItemCount = pCorpse->getTreasureCount(); - // ü ȿ ִ . + // 시체 안에 들어있는 아이템을 모조리 다 뺀다. for (int i = 0; i < ItemCount; i++) { Item* pTreasure = pCorpse->getTreasure(); if (pTreasure != NULL) { @@ -117,7 +117,7 @@ void EatCorpse::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire int RemainMP = max((int)pVampire->getHP(ATTR_MAX), (int)pVampire->getHP(ATTR_CURRENT) + 10); pVampire->setHP(RemainMP, ATTR_CURRENT); - Range_t Range = 1; // ׻ 1̴. + Range_t Range = 1; // 항상 1이다. ZoneCoord_t myX = pVampire->getX(); ZoneCoord_t myY = pVampire->getY(); @@ -160,14 +160,14 @@ void EatCorpse::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampire pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); - // ۾ ü Ѵ. - // Ŷ . + // 모든 정리작업이 끝이 났으면 시체를 삭제한다. + // 사라지는 패킷을 날린다. GCDeleteObject gcDO; gcDO.setObjectID(pCorpse->getObjectID()); pZone->broadcastPacket(X, Y, &gcDO); - // . + // 존에서 지운다. pZone->deleteItem(pCorpse, X, Y); - // ȿ ͸ Ƿ ͸ Ѵ. + // 존안에서 실제적으로 포인터를 없애지는 않으므로 포인터를 삭제 시켜 줘야 한다. SAFE_DELETE(pCorpse); } else { executeSkillFailException(pVampire, getSkillType()); diff --git a/src/server/gameserver/skill/EffectAberration.cpp b/src/server/gameserver/skill/EffectAberration.cpp index 03ed17fc..56147fd1 100644 --- a/src/server/gameserver/skill/EffectAberration.cpp +++ b/src/server/gameserver/skill/EffectAberration.cpp @@ -60,8 +60,8 @@ void EffectAberration::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_ABERRATION); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/skill/EffectAberration.h b/src/server/gameserver/skill/EffectAberration.h index 43c46b8f..10bc63cf 100644 --- a/src/server/gameserver/skill/EffectAberration.h +++ b/src/server/gameserver/skill/EffectAberration.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectAberration.h // Written by : -// Description : Aberration ϰ effect +// Description : Aberration에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_ABERRATION__ diff --git a/src/server/gameserver/skill/EffectAcidEruption.cpp b/src/server/gameserver/skill/EffectAcidEruption.cpp index 248b0c13..dca0763c 100644 --- a/src/server/gameserver/skill/EffectAcidEruption.cpp +++ b/src/server/gameserver/skill/EffectAcidEruption.cpp @@ -111,7 +111,7 @@ void EffectAcidEruption::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_ACID_ERUPTION); diff --git a/src/server/gameserver/skill/EffectAcidStorm.cpp b/src/server/gameserver/skill/EffectAcidStorm.cpp index b94d6ed0..fa5c2a34 100644 --- a/src/server/gameserver/skill/EffectAcidStorm.cpp +++ b/src/server/gameserver/skill/EffectAcidStorm.cpp @@ -37,7 +37,7 @@ bool EffectAcidStorm::affectCreature(Creature* pTargetCreature, bool bAffectByMo Assert(pTargetCreature != NULL); - // 뿡 ̹ poison Ʈ ɷ ִ 쿡 ɸ ʴ´. + // 상대에게 이미 poison 이펙트가 걸려져 있는 경우에는 걸리지 않는다. if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_STORM_ACID)) { // cout << "EffectAcidStorm " << "affectCreature End(Already Effected) " << endl; return false; @@ -46,23 +46,23 @@ bool EffectAcidStorm::affectCreature(Creature* pTargetCreature, bool bAffectByMo Zone* pZone = pTargetCreature->getZone(); Creature* pAttacker = pZone->getCreature(m_UserObjectID); - // 濡 ĥ Ѵ. + // 상대방에게 미칠 독 데미지를 계산한다. int StormDamage = computeMagicDamage(pTargetCreature, m_Damage, SKILL_ACID_STORM, m_bVampire, pAttacker); if (StormDamage > 0) { // cout << "EffectAcidStorm(Damage:" << StormDamage << ") Affected" << endl; - // Ʈ ؼ, Ÿ ũĿ ̰, ÷׸ ش. + // 포이즌 이펙트를 생성해서, 타겟 크리쳐에 붙이고, 플래그를 켜준다. EffectStormAcid* pEffectStormAcid = new EffectStormAcid(pTargetCreature); pEffectStormAcid->setLevel(m_Level); pEffectStormAcid->setPoint(StormDamage / 3); - pEffectStormAcid->setDeadline(16); // ̺κ ٲ Ѵ. - pEffectStormAcid->setTick(5); // ̺κе ٲ Ѵ. + pEffectStormAcid->setDeadline(16); // 이부분 바꿔야 한다. + pEffectStormAcid->setTick(5); // 이부분도 바꿔야 한다. pEffectStormAcid->setUserObjectID(m_UserObjectID); pEffectStormAcid->affect(pTargetCreature); pTargetCreature->addEffect(pEffectStormAcid); pTargetCreature->setFlag(Effect::EFFECT_CLASS_STORM_ACID); - // Ʈ پٰ ֺ ˷ش. + // 이펙트가 붙었다고 주변에 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_STORM_ACID); diff --git a/src/server/gameserver/skill/EffectAcidStorm.h b/src/server/gameserver/skill/EffectAcidStorm.h index b177a5d1..64e6cfa0 100644 --- a/src/server/gameserver/skill/EffectAcidStorm.h +++ b/src/server/gameserver/skill/EffectAcidStorm.h @@ -66,7 +66,7 @@ class EffectAcidStorm : public Effect { Turn_t m_Tick; // EffectAcidStorm turn; int m_Level; // EffectAcidStorm level; Duration_t m_Duration; // EffectAcidStorm Duration; - Duration_t m_StormDuration; // AcidStorm Effect ð + Duration_t m_StormDuration; // AcidStorm Effect 지속 시간 ObjectID_t m_UserObjectID; bool m_bVampire; }; diff --git a/src/server/gameserver/skill/EffectAcidSwamp.cpp b/src/server/gameserver/skill/EffectAcidSwamp.cpp index b72d6571..45f0aa0f 100644 --- a/src/server/gameserver/skill/EffectAcidSwamp.cpp +++ b/src/server/gameserver/skill/EffectAcidSwamp.cpp @@ -46,8 +46,8 @@ void EffectAcidSwamp::affect() Assert(m_pZone != NULL); - // Ʈ ڸ ´. - // Ƿ NULL ִ. + // 이펙트 사용자를 가져온다. + // 존에 없을 수 있으므로 NULL 이 될 수 있다. Creature* pCastCreature = m_pZone->getCreature(m_UserObjectID); if (pCastCreature == NULL && !isForce()) { @@ -56,10 +56,10 @@ void EffectAcidSwamp::affect() return; } - // Ʈ پִ Ÿ ޾ƿ´. + // 현재 이펙트가 붙어있는 타일을 받아온다. Tile& tile = m_pZone->getTile(m_X, m_Y); - // Ÿ ȿ ϴ Ʈ ˻Ѵ. + // 타일 안에 존재하는 오브젝트들을 검색한다. const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { @@ -72,15 +72,15 @@ void EffectAcidSwamp::affect() Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // üũ. by sigi. 2002.9.5 - // 鿪. by sigi. 2002.9.13 + // 무적상태 체크. by sigi. 2002.9.5 + // 산 면역. by sigi. 2002.9.13 if (!canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_ACID) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { continue; } // 2003.1.10 by Sequoia - // üũ + // 안전지대 체크 if (!checkZoneLevelToHitTarget(pCreature)) continue; @@ -125,7 +125,7 @@ void EffectAcidSwamp::affect() bool modifiedAttacker = false; - // ׾ ġش. ..... + // 죽었으면 경험치준다. 음..... if (pCastCreature != NULL) { if (pCreature->isDead() && pCastCreature->isVampire()) { int exp = computeCreatureExp(pCreature, KILL_EXP); @@ -137,7 +137,7 @@ void EffectAcidSwamp::affect() } } - // ϱ + // 성향 계산하기 if (pCastCreature != NULL && pCastCreature->isPC() && pCreature->isPC() && (pCreature->getObjectID() == m_TargetObjectID[0] || pCreature->getObjectID() == m_TargetObjectID[1])) { @@ -262,7 +262,7 @@ void EffectAcidSwampLoader::load(Zone* pZone) pEffect->setNextTime(0); pEffect->setLevel(100); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->registerObject(pEffect); pZone->addEffect(pEffect); tile.addEffect(pEffect); diff --git a/src/server/gameserver/skill/EffectAcidSwamp.h b/src/server/gameserver/skill/EffectAcidSwamp.h index e8e224ff..0a07af5c 100644 --- a/src/server/gameserver/skill/EffectAcidSwamp.h +++ b/src/server/gameserver/skill/EffectAcidSwamp.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectAcidSwamp.h // Written by : elca@ewestsoft.com -// Description : AcidSwamp Effect óֱ Ŭ̴. +// Description : 성직마법 AcidSwamp의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_ACID_SWAMP__ diff --git a/src/server/gameserver/skill/EffectActivation.cpp b/src/server/gameserver/skill/EffectActivation.cpp index 51debfa1..d4d87bd5 100644 --- a/src/server/gameserver/skill/EffectActivation.cpp +++ b/src/server/gameserver/skill/EffectActivation.cpp @@ -16,7 +16,7 @@ EffectActivation::EffectActivation(Creature* pCreature) { __BEGIN_TRY - // Ʈ ̾ ִ. + // 디텍트 히든은 슬레이어만이 쓸 수 있다. Assert(pCreature != NULL); Assert(pCreature->isSlayer()); @@ -55,13 +55,13 @@ void EffectActivation::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isSlayer()); - // ÷׸ Ѵ. + // 플래그를 제거한다. pCreature->removeFlag(Effect::EFFECT_CLASS_ACTIVATION); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_ACTIVATION); diff --git a/src/server/gameserver/skill/EffectAirShield.cpp b/src/server/gameserver/skill/EffectAirShield.cpp index 7f06b180..84d5e10a 100644 --- a/src/server/gameserver/skill/EffectAirShield.cpp +++ b/src/server/gameserver/skill/EffectAirShield.cpp @@ -56,13 +56,13 @@ void EffectAirShield::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isSlayer()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_AIR_SHIELD_1); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(m_ClientEffectClass); diff --git a/src/server/gameserver/skill/EffectAirShield.h b/src/server/gameserver/skill/EffectAirShield.h index 7d881c2f..33d3ca2f 100644 --- a/src/server/gameserver/skill/EffectAirShield.h +++ b/src/server/gameserver/skill/EffectAirShield.h @@ -58,9 +58,9 @@ class EffectAirShield : public Effect { } private: - Level_t m_Level; // ų - EffectClass m_ClientEffectClass; // Ŭ̾Ʈ ٶ Ʈ Ŭ ̵ - Damage_t m_Damage; // ִ + Level_t m_Level; // 스킬 레벨 + EffectClass m_ClientEffectClass; // 클라이언트에 보내줄때 쓰는 이펙트 클래스 아이디 + Damage_t m_Damage; // 때린놈한테 주는 데미지 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/skill/EffectArmageddon.cpp b/src/server/gameserver/skill/EffectArmageddon.cpp index 554126f4..cd2ba73c 100644 --- a/src/server/gameserver/skill/EffectArmageddon.cpp +++ b/src/server/gameserver/skill/EffectArmageddon.cpp @@ -56,8 +56,8 @@ void EffectArmageddon::affect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ũĸ ´. - // !! ̹ Ƿ NULL ִ. + // 이펙트를 건 크리쳐를 가져온다. + // !! 이미 존을 떠났을 수도 있으므로 NULL 이 될 수 있다. // by bezz. 2003.1.4 // Creature* pCastCreature = pZone->getCreature( m_UserObjectID ); @@ -71,7 +71,7 @@ void EffectArmageddon::affect(Creature* pCreature) // cout << "EffectArmageddon affect damage :" << m_Damage << endl; - // ִ° Ƴ. by Sequoia + // 매초 데미지 주는거 잠시 막아놓음. by Sequoia /*if ( pCreature->isSlayer() ) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -111,13 +111,13 @@ void EffectArmageddon::unaffect(Creature* pCreature) // cout << "EffectArmageddon unaffect.." << endl; - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_ARMAGEDDON); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_ARMAGEDDON); @@ -161,7 +161,7 @@ void EffectArmageddon::decreaseHP(Damage_t damage) throw() { HP_t RemainHP = max(0, m_HP - damage); setHP(RemainHP); - // HP 0 EffectManager::heartbeat() Ʈ ش. + // 남은 HP가 0일 경우 다음 EffectManager::heartbeat() 에서 이펙트를 날려준다. if (RemainHP == 0) setDeadline(0); } diff --git a/src/server/gameserver/skill/EffectArmageddon.h b/src/server/gameserver/skill/EffectArmageddon.h index ade5d21a..a715effa 100644 --- a/src/server/gameserver/skill/EffectArmageddon.h +++ b/src/server/gameserver/skill/EffectArmageddon.h @@ -68,12 +68,12 @@ class EffectArmageddon : public Effect { } private: - ObjectID_t m_UserObjectID; // Object ID - // string m_CasterName; // - // int m_PartyID; // ƼID + ObjectID_t m_UserObjectID; // 시전자 Object ID + // string m_CasterName; // 시전자 + // int m_PartyID; // 파티ID - HP_t m_HP; // ü - Damage_t m_Damage; // + HP_t m_HP; // 체력 + Damage_t m_Damage; // 데미지 Turn_t m_Delay; // Tick }; diff --git a/src/server/gameserver/skill/EffectAuraShield.cpp b/src/server/gameserver/skill/EffectAuraShield.cpp index 209fb56a..05726e44 100644 --- a/src/server/gameserver/skill/EffectAuraShield.cpp +++ b/src/server/gameserver/skill/EffectAuraShield.cpp @@ -56,13 +56,13 @@ void EffectAuraShield::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isSlayer()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_AURA_SHIELD); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_AURA_SHIELD); diff --git a/src/server/gameserver/skill/EffectBerserker.cpp b/src/server/gameserver/skill/EffectBerserker.cpp index bec94e6a..7af143d6 100644 --- a/src/server/gameserver/skill/EffectBerserker.cpp +++ b/src/server/gameserver/skill/EffectBerserker.cpp @@ -76,7 +76,7 @@ void EffectBerserker::unaffect(Creature* pCreature) pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_BERSERKER); diff --git a/src/server/gameserver/skill/EffectBlazeWalk.cpp b/src/server/gameserver/skill/EffectBlazeWalk.cpp index 3349fdcc..c1a51151 100644 --- a/src/server/gameserver/skill/EffectBlazeWalk.cpp +++ b/src/server/gameserver/skill/EffectBlazeWalk.cpp @@ -67,7 +67,7 @@ void EffectBlazeWalk::affect(Creature* pCreature) if (!(pZone->getZoneLevel() & COMPLETE_SAFE_ZONE) && !pCreature->isDead() && !pCreature->isFlag(Effect::EFFECT_CLASS_COMA) - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 && canAttack(pAttacker, pCreature)) { GCModifyInformation gcMI, gcAttackerMI; setDamage(pCreature, m_Point, pAttacker, m_SkillType, &gcMI, &gcAttackerMI); diff --git a/src/server/gameserver/skill/EffectBless.cpp b/src/server/gameserver/skill/EffectBless.cpp index 5afb80ab..1e566294 100644 --- a/src/server/gameserver/skill/EffectBless.cpp +++ b/src/server/gameserver/skill/EffectBless.cpp @@ -76,7 +76,7 @@ void EffectBless::unaffect(Creature* pCreature) // cout << "EffectBless" << "unaffect BEGIN" << endl; Assert(pCreature != NULL); - Assert(pCreature->isSlayer()); // ̾ ɸ ʴ´. + Assert(pCreature->isSlayer()); // 슬레이어말고는 걸리지 않는다. pCreature->removeFlag(Effect::EFFECT_CLASS_BLESS); diff --git a/src/server/gameserver/skill/EffectBlindness.cpp b/src/server/gameserver/skill/EffectBlindness.cpp index 02e8e8f4..d55dcc7d 100644 --- a/src/server/gameserver/skill/EffectBlindness.cpp +++ b/src/server/gameserver/skill/EffectBlindness.cpp @@ -75,7 +75,7 @@ void EffectBlindness::unaffect(Creature* pCreature) { Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(getSendEffectClass()); diff --git a/src/server/gameserver/skill/EffectBlockHead.cpp b/src/server/gameserver/skill/EffectBlockHead.cpp index 924952cc..9976481f 100644 --- a/src/server/gameserver/skill/EffectBlockHead.cpp +++ b/src/server/gameserver/skill/EffectBlockHead.cpp @@ -36,7 +36,7 @@ void EffectBlockHead::unaffect(Creature* pCreature) Assert(pCreature != NULL); // Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_BLOCK_HEAD); Zone* pZone = pCreature->getZone(); @@ -45,7 +45,7 @@ void EffectBlockHead::unaffect(Creature* pCreature) // Ousters* pTargetOusters = dynamic_cast(pCreature); // Assert( pTargetOusters != NULL ); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_BLOCK_HEAD); diff --git a/src/server/gameserver/skill/EffectBloodCurse.cpp b/src/server/gameserver/skill/EffectBloodCurse.cpp index 92b4c083..61c8e5f7 100644 --- a/src/server/gameserver/skill/EffectBloodCurse.cpp +++ b/src/server/gameserver/skill/EffectBloodCurse.cpp @@ -46,8 +46,8 @@ void EffectBloodCurse::affect() Assert(m_pZone != NULL); - // Ʈ ũĸ ´. - // !! Ƿ NULL ִ. + // 이펙트를 건 크리쳐를 가져온다. + // !! 존을 떠났을 수도 있으므로 NULL 이 될 수 있다. Creature* pCastCreature = m_pZone->getCreature(m_UserObjectID); if (m_bPlayer) { // pCastCreature = m_pZone->getCreature( m_UserObjectID ); @@ -61,8 +61,8 @@ void EffectBloodCurse::affect() VSRect rect(0, 0, m_pZone->getWidth() - 1, m_pZone->getHeight() - 1); - // Ʈ پִ Ÿ ޾ƿ´. - // ߽Ÿ + ÷ Ÿ + // 현재 이펙트가 붙어있는 타일을 받아온다. + // 중심타일 + 스플래쉬 타일 for (int x = -2; x <= 2; x++) { for (int y = -2; y <= 2; y++) { int X = m_X + x; @@ -75,7 +75,7 @@ void EffectBloodCurse::affect() int Damage = 0; int splash = max(abs(x), abs(y)); - //  100% + // 가운데는 100% // if ( m_bPlayer ) // { /* if ( splash == 0 ) @@ -97,12 +97,12 @@ void EffectBloodCurse::affect() // } // else // { - // // 50% damage + // // 주위에는 50% damage // if ( splash != 0 ) Damage = m_Damage >> splash; // else Damage = m_Damage; // } - // Ÿ ȿ ϴ Ʈ ˻Ѵ. + // 타일 안에 존재하는 오브젝트들을 검색한다. const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { @@ -115,8 +115,8 @@ void EffectBloodCurse::affect() Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // ڽ ʴ´ - // üũ. by sigi. 2002.9.5 + // 자신은 맞지 않는다 + // 무적상태 체크. by sigi. 2002.9.5 if (pCreature->getObjectID() == m_UserObjectID || !canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || !checkZoneLevelToHitTarget(pCreature)) { continue; @@ -143,7 +143,7 @@ void EffectBloodCurse::affect() pPlayer->sendPacket(&gcMI);*/ } else if (pCreature->isVampire()) { - // ̾ ̾ ߽ Ÿ ϰ ʴ´. + // 뱀파이어가 사용했을 경우 뱀파이어는 중심 타일을 제외하고는 맞지 않는다. if (m_bPlayer) // && splash != 0 ) continue; @@ -173,7 +173,7 @@ void EffectBloodCurse::affect() pMonster->addEnemy(pCastCreature); } - // 밡 ׾ٸ ġ ÷ش. + // 상대가 죽었다면 경험치를 올려준다. if (pCreature->isDead()) { if (pCastCreature != NULL && pCastCreature->isVampire()) { Vampire* pVampire = dynamic_cast(pCastCreature); @@ -188,9 +188,9 @@ void EffectBloodCurse::affect() } } - // user״ ´ ش. + // user한테는 맞는 모습을 보여준다. if (pCreature->isPC()) { - gcSkillToObjectOK2.setObjectID(1); // ǹ . + gcSkillToObjectOK2.setObjectID(1); // 의미 없다. gcSkillToObjectOK2.setSkillType(SKILL_ATTACK_MELEE); gcSkillToObjectOK2.setDuration(0); pCreature->getPlayer()->sendPacket(&gcSkillToObjectOK2); diff --git a/src/server/gameserver/skill/EffectBloodCurse.h b/src/server/gameserver/skill/EffectBloodCurse.h index 58fbd4c1..b683b960 100644 --- a/src/server/gameserver/skill/EffectBloodCurse.h +++ b/src/server/gameserver/skill/EffectBloodCurse.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectBloodCurse.h // Written by : elca@ewestsoft.com -// Description : BloodCurse Effect óֱ Ŭ̴. +// Description : 성직마법 BloodCurse의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_BLOOD_CURSE__ @@ -65,7 +65,7 @@ class EffectBloodCurse : public Effect { Turn_t m_Delay; // string m_CasterName; ObjectID_t m_UserObjectID; - bool m_bPlayer; // ΰ? + bool m_bPlayer; // 유저가 사용한 기술인가? uint m_SplashRatio[3]; }; diff --git a/src/server/gameserver/skill/EffectBloodDrain.cpp b/src/server/gameserver/skill/EffectBloodDrain.cpp index 36ac2f96..213061fc 100644 --- a/src/server/gameserver/skill/EffectBloodDrain.cpp +++ b/src/server/gameserver/skill/EffectBloodDrain.cpp @@ -67,8 +67,8 @@ void EffectBloodDrain::unaffect(Creature* pFromCreature) Assert(pPlayer != NULL); - // GamePlayer Event ٿ heartbeat ش. - // ȭ ? -_-; ̾׷ 㸸 -_-; + // GamePlayer에 Event를 붙여서 heartbeat를 다 수행한후 지워준다. + // 동기화 문제가 없을까? -_-; 다이어그램 상으론 문제가 없쥐만 -_-; GamePlayer* pGamePlayer = dynamic_cast(pPlayer); pGamePlayer->deleteEvent(Event::EVENT_CLASS_REGENERATION); @@ -87,7 +87,7 @@ void EffectBloodDrain::unaffect(Creature* pFromCreature) destroy(pFromCreature->getName()); } else { - // þ . + // 시야 복구. Assert(pFromCreature->isOusters()); Player* pPlayer = pFromCreature->getPlayer(); @@ -111,7 +111,7 @@ void EffectBloodDrain::unaffect(Creature* pFromCreature) pFromCreature->getPlayer()->sendPacket(&gcChangeDarkLight); } - // DB Ӵ. + // DB에서 지워뿐다. destroy(pFromCreature->getName()); } diff --git a/src/server/gameserver/skill/EffectBloodySnake.cpp b/src/server/gameserver/skill/EffectBloodySnake.cpp index d590c77a..03c166e0 100644 --- a/src/server/gameserver/skill/EffectBloodySnake.cpp +++ b/src/server/gameserver/skill/EffectBloodySnake.cpp @@ -58,15 +58,15 @@ void EffectBloodySnake::affect() Assert(m_pZone != NULL); - // ų ڸ ´. - // !! ̹ Ƿ NULL ִ. + // 스킬 사용자를 가져온다. + // !! 이미 존을 떠났을 수도 있으므로 NULL 이 될 수 있다. // by bezz. 2003.1.4 Creature* pCastCreature = m_pZone->getCreature(m_CasterID); - // Ʈ پִ Ÿ ޾ƿ´. + // 현재 이펙트가 붙어있는 타일을 받아온다. Tile& tile = m_pZone->getTile(m_X, m_Y); - // Ÿ ȿ ϴ Ʈ ˻Ѵ. + // 타일 안에 존재하는 오브젝트들을 검색한다. const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { @@ -79,14 +79,14 @@ void EffectBloodySnake::affect() Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // üũ. by sigi. 2002.9.5 - // 鿪. by sigi. 2002.9.13 - // ڱ ڽ̸ ´´. + // 무적상태 체크. by sigi. 2002.9.5 + // 산 면역. by sigi. 2002.9.13 + // 자기 자신이면 안 맞는다. if (!canAttack(pCastCreature, pCreature) || pCreature->getObjectID() == m_CasterID) { continue; } - // (--;)̸ ´´. + // 같은 조직(--;)이면 안 맞는다. if (m_CreatureClass == pCreature->getCreatureClass()) { if (m_CreatureClass == Creature::CREATURE_CLASS_MONSTER) { Creature* pAttacker = m_pZone->getCreature(m_CasterID); @@ -114,14 +114,14 @@ void EffectBloodySnake::affect() Assert(pPlayer != NULL); pPlayer->sendPacket(&gcMI); - // knockbacküũ - bool bKnockback = rand() % 100 < 20; // 20% Ȯ knockback + // knockback체크 + bool bKnockback = rand() % 100 < 20; // 20%의 확률로 knockback if (bKnockback) { int x = pCreature->getX() + rand() % 3 - 1; int y = pCreature->getY() + rand() % 3 - 1; knockbackCreature(m_pZone, pCreature, x, y); - // Tile oList ٲ ϹǷ üũ ʴ´. - // ŸϿ ϳ knockbackǸ ڿ üũ ֵ ¾Ƶ ~ + // Tile의 oList를 바뀌게 하므로 더 체크하지 않는다. + // 한 타일에서 하나가 knockback되면 뒤에 체크할 애들은 안 맞아도 관계없지~ break; } } else if (pCreature->isVampire()) { @@ -134,14 +134,14 @@ void EffectBloodySnake::affect() Assert(pPlayer != NULL); pPlayer->sendPacket(&gcMI); - // knockbacküũ - bool bKnockback = rand() % 100 < 20; // 20% Ȯ knockback + // knockback체크 + bool bKnockback = rand() % 100 < 20; // 20%의 확률로 knockback if (bKnockback) { int x = pCreature->getX() + rand() % 3 - 1; int y = pCreature->getY() + rand() % 3 - 1; knockbackCreature(m_pZone, pCreature, x, y); - // Tile oList ٲ ϹǷ üũ ʴ´. - // ŸϿ ϳ knockbackǸ ڿ üũ ֵ ¾Ƶ ~ + // Tile의 oList를 바뀌게 하므로 더 체크하지 않는다. + // 한 타일에서 하나가 knockback되면 뒤에 체크할 애들은 안 맞아도 관계없지~ break; } } else if (pCreature->isOusters()) { @@ -154,14 +154,14 @@ void EffectBloodySnake::affect() Assert(pPlayer != NULL); pPlayer->sendPacket(&gcMI); - // knockbacküũ - bool bKnockback = rand() % 100 < 20; // 20% Ȯ knockback + // knockback체크 + bool bKnockback = rand() % 100 < 20; // 20%의 확률로 knockback if (bKnockback) { int x = pCreature->getX() + rand() % 3 - 1; int y = pCreature->getY() + rand() % 3 - 1; knockbackCreature(m_pZone, pCreature, x, y); - // Tile oList ٲ ϹǷ üũ ʴ´. - // ŸϿ ϳ knockbackǸ ڿ üũ ֵ ¾Ƶ ~ + // Tile의 oList를 바뀌게 하므로 더 체크하지 않는다. + // 한 타일에서 하나가 knockback되면 뒤에 체크할 애들은 안 맞아도 관계없지~ break; } } else if (pCreature->isMonster()) { @@ -169,20 +169,20 @@ void EffectBloodySnake::affect() ::setDamage(pMonster, Damage, pCastCreature, SKILL_BLOODY_SNAKE); - // knockbacküũ - bool bKnockback = rand() % 100 < 20; // 20% Ȯ knockback + // knockback체크 + bool bKnockback = rand() % 100 < 20; // 20%의 확률로 knockback if (bKnockback) { int x = pCreature->getX() + rand() % 3 - 1; int y = pCreature->getY() + rand() % 3 - 1; knockbackCreature(m_pZone, pCreature, x, y); - // Tile oList ٲ ϹǷ üũ ʴ´. - // ŸϿ ϳ knockbackǸ ڿ üũ ֵ ¾Ƶ ~ + // Tile의 oList를 바뀌게 하므로 더 체크하지 않는다. + // 한 타일에서 하나가 knockback되면 뒤에 체크할 애들은 안 맞아도 관계없지~ break; } } - // m_CasterName pCreature KillCount ó + // m_CasterName이 pCreature를 죽인 경우의 KillCount 처리 // by sigi. 2002.8.31 /* if (pCreature->isDead()) { @@ -197,7 +197,7 @@ void EffectBloodySnake::affect() } } - // ̵ ǥ + // 다음 이동 좌표 계산 POINT pt = getNextPosition(); /* @@ -207,23 +207,23 @@ void EffectBloodySnake::affect() << pt.x << ", " << pt.y << ")" << endl; */ - // ̵ ŸϿ ߰Ѵ. + // 다음 이동할 타일에 추가한다. VSRect rect(0, 0, m_pZone->getWidth() - 1, m_pZone->getHeight() - 1); if (rect.ptInRect(pt.x, pt.y)) { Tile& newTile = m_pZone->getTile(pt.x, pt.y); if ((!newTile.isGroundBlocked() || newTile.hasCreature(Creature::MOVE_MODE_WALKING)) && newTile.canAddEffect()) { - // effect . + // 같은 effect가 있으면 지운다. Effect* pOldEffect = newTile.getEffect(Effect::EFFECT_CLASS_BLOODY_SNAKE); if (pOldEffect != NULL && pOldEffect != this) { ObjectID_t effectID = pOldEffect->getObjectID(); m_pZone->deleteEffect(effectID); // fix me } - // ŸϿ + // 기존 타일에서 지우고 tile.deleteEffect(m_ObjectID); - // ŸϿ ߰Ѵ. + // 새 타일에 추가한다. newTile.addEffect(this); m_X = pt.x; diff --git a/src/server/gameserver/skill/EffectBloodySnake.h b/src/server/gameserver/skill/EffectBloodySnake.h index a17d1139..cb1e8034 100644 --- a/src/server/gameserver/skill/EffectBloodySnake.h +++ b/src/server/gameserver/skill/EffectBloodySnake.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectBloodySnake.h // Written by : elca@ewestsoft.com -// Description : BloodySnake Effect óֱ Ŭ̴. +// Description : 성직마법 BloodySnake의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_BLOODY_SNAKE__ diff --git a/src/server/gameserver/skill/EffectBloodyStorm.cpp b/src/server/gameserver/skill/EffectBloodyStorm.cpp index 2cc2977f..059b65c4 100644 --- a/src/server/gameserver/skill/EffectBloodyStorm.cpp +++ b/src/server/gameserver/skill/EffectBloodyStorm.cpp @@ -37,7 +37,7 @@ bool EffectBloodyStorm::affectCreature(Creature* pTargetCreature, bool bAffectBy Assert(pTargetCreature != NULL); - // 뿡 ̹ poison Ʈ ɷ ִ 쿡 ɸ ʴ´. + // 상대에게 이미 poison 이펙트가 걸려져 있는 경우에는 걸리지 않는다. if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_STORM_BLOODY)) { // cout << "EffectBloodyStorm " << "affectCreature End " << endl; return false; @@ -46,22 +46,22 @@ bool EffectBloodyStorm::affectCreature(Creature* pTargetCreature, bool bAffectBy Zone* pZone = pTargetCreature->getZone(); Creature* pAttacker = pZone->getCreature(m_UserObjectID); - // 濡 ĥ Ѵ. + // 상대방에게 미칠 독 데미지를 계산한다. int StormDamage = computeMagicDamage(pTargetCreature, m_Damage, SKILL_BLOODY_STORM, m_bVampire, pAttacker); if (StormDamage > 0) { - // Ʈ ؼ, Ÿ ũĿ ̰, ÷׸ ش. + // 포이즌 이펙트를 생성해서, 타겟 크리쳐에 붙이고, 플래그를 켜준다. EffectStormBloody* pEffectStormBloody = new EffectStormBloody(pTargetCreature); pEffectStormBloody->setLevel(m_Level); pEffectStormBloody->setPoint(StormDamage / 3); - pEffectStormBloody->setDeadline(16); // ̺κ ٲ Ѵ. - pEffectStormBloody->setTick(5); // ̺κе ٲ Ѵ. + pEffectStormBloody->setDeadline(16); // 이부분 바꿔야 한다. + pEffectStormBloody->setTick(5); // 이부분도 바꿔야 한다. pEffectStormBloody->setUserObjectID(m_UserObjectID); pEffectStormBloody->affect(pTargetCreature); pTargetCreature->addEffect(pEffectStormBloody); pTargetCreature->setFlag(Effect::EFFECT_CLASS_STORM_BLOODY); - // Ʈ پٰ ֺ ˷ش. + // 이펙트가 붙었다고 주변에 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_STORM_BLOODY); diff --git a/src/server/gameserver/skill/EffectBloodyStorm.h b/src/server/gameserver/skill/EffectBloodyStorm.h index 28f7c015..fc43e61b 100644 --- a/src/server/gameserver/skill/EffectBloodyStorm.h +++ b/src/server/gameserver/skill/EffectBloodyStorm.h @@ -67,7 +67,7 @@ class EffectBloodyStorm : public Effect { int m_Level; // EffectBloodyStorm level; bool m_bVampire; Duration_t m_Duration; // EffectBloodyStorm Duration; - Duration_t m_StormDuration; // BloodyStorm Effect ð + Duration_t m_StormDuration; // BloodyStorm Effect 지속 시간 ObjectID_t m_UserObjectID; }; diff --git a/src/server/gameserver/skill/EffectBloodyWall.cpp b/src/server/gameserver/skill/EffectBloodyWall.cpp index 3505e9ce..28c3148f 100644 --- a/src/server/gameserver/skill/EffectBloodyWall.cpp +++ b/src/server/gameserver/skill/EffectBloodyWall.cpp @@ -49,15 +49,15 @@ void EffectBloodyWall::affect() Assert(m_pZone != NULL); - // Ʈ ũĸ ´. - // !! ̹ Ƿ NULL ִ. + // 이펙트를 사용한 크리쳐를 가져온다. + // !! 이미 존을 나갔을 수도 있으므로 NULL이 될 수 있다. // by bezz. 2003.1.4 Creature* pCastCreature = m_pZone->getCreature(m_CasterID); - // Ʈ پִ Ÿ ޾ƿ´. + // 현재 이펙트가 붙어있는 타일을 받아온다. Tile& tile = m_pZone->getTile(m_X, m_Y); - // Ÿ ȿ ϴ Ʈ ˻Ѵ. + // 타일 안에 존재하는 오브젝트들을 검색한다. const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { @@ -70,19 +70,19 @@ void EffectBloodyWall::affect() Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // üũ. by sigi. 2002.9.5 - // 鿪. by sigi. 2002.9.13 - // ڱ ڽ̸ ´´. - // üũ + // 무적상태 체크. by sigi. 2002.9.5 + // 산 면역. by sigi. 2002.9.13 + // 자기 자신이면 안 맞는다. + // 안전지대 체크 // 2003.1.10 by bezz, Sequoia if (!canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || pCreature->getObjectID() == m_CasterID || !checkZoneLevelToHitTarget(pCreature)) { continue; } - // (--;)̸ ´´. + // 같은 조직(--;)이면 안 맞는다. if (m_CreatureClass == pCreature->getCreatureClass() && !isForce()) { - // vampire ´´. + // vampire 끼리는 안 맞는다. if (m_CreatureClass == Creature::CREATURE_CLASS_VAMPIRE) { continue; // by sigi. 2003.1.14 } else if (m_CreatureClass == Creature::CREATURE_CLASS_MONSTER) { @@ -111,14 +111,14 @@ void EffectBloodyWall::affect() Assert(pPlayer != NULL); pPlayer->sendPacket(&gcMI); - // knockbacküũ - bool bKnockback = rand() % 100 < 50; // 20% Ȯ knockback + // knockback체크 + bool bKnockback = rand() % 100 < 50; // 20%의 확률로 knockback if (bKnockback) { int x = pCreature->getX() + rand() % 3 - 1; int y = pCreature->getY() + rand() % 3 - 1; knockbackCreature(m_pZone, pCreature, x, y); - // Tile oList ٲ ϹǷ üũ ʴ´. - // ŸϿ ϳ knockbackǸ ڿ üũ ֵ ¾Ƶ ~ + // Tile의 oList를 바뀌게 하므로 더 체크하지 않는다. + // 한 타일에서 하나가 knockback되면 뒤에 체크할 애들은 안 맞아도 관계없지~ break; } } else if (pCreature->isVampire()) { @@ -131,14 +131,14 @@ void EffectBloodyWall::affect() Assert(pPlayer != NULL); pPlayer->sendPacket(&gcMI); - // knockbacküũ - bool bKnockback = rand() % 100 < 50; // 20% Ȯ knockback + // knockback체크 + bool bKnockback = rand() % 100 < 50; // 20%의 확률로 knockback if (bKnockback) { int x = pCreature->getX() + rand() % 3 - 1; int y = pCreature->getY() + rand() % 3 - 1; knockbackCreature(m_pZone, pCreature, x, y); - // Tile oList ٲ ϹǷ üũ ʴ´. - // ŸϿ ϳ knockbackǸ ڿ üũ ֵ ¾Ƶ ~ + // Tile의 oList를 바뀌게 하므로 더 체크하지 않는다. + // 한 타일에서 하나가 knockback되면 뒤에 체크할 애들은 안 맞아도 관계없지~ break; } } else if (pCreature->isOusters()) { @@ -151,14 +151,14 @@ void EffectBloodyWall::affect() Assert(pPlayer != NULL); pPlayer->sendPacket(&gcMI); - // knockbacküũ - bool bKnockback = rand() % 100 < 50; // 20% Ȯ knockback + // knockback체크 + bool bKnockback = rand() % 100 < 50; // 20%의 확률로 knockback if (bKnockback) { int x = pCreature->getX() + rand() % 3 - 1; int y = pCreature->getY() + rand() % 3 - 1; knockbackCreature(m_pZone, pCreature, x, y); - // Tile oList ٲ ϹǷ üũ ʴ´. - // ŸϿ ϳ knockbackǸ ڿ üũ ֵ ¾Ƶ ~ + // Tile의 oList를 바뀌게 하므로 더 체크하지 않는다. + // 한 타일에서 하나가 knockback되면 뒤에 체크할 애들은 안 맞아도 관계없지~ break; } } else if (pCreature->isMonster()) { @@ -170,19 +170,19 @@ void EffectBloodyWall::affect() pMonster->addEnemy(pCastCreature); } - // knockbacküũ - bool bKnockback = rand() % 100 < 50; // 20% Ȯ knockback + // knockback체크 + bool bKnockback = rand() % 100 < 50; // 20%의 확률로 knockback if (bKnockback) { int x = pCreature->getX() + rand() % 3 - 1; int y = pCreature->getY() + rand() % 3 - 1; knockbackCreature(m_pZone, pCreature, x, y); - // Tile oList ٲ ϹǷ üũ ʴ´. - // ŸϿ ϳ knockbackǸ ڿ üũ ֵ ¾Ƶ ~ + // Tile의 oList를 바뀌게 하므로 더 체크하지 않는다. + // 한 타일에서 하나가 knockback되면 뒤에 체크할 애들은 안 맞아도 관계없지~ break; } } - // 밡 ׾ٸ ġ ÷ش. + // 상대가 죽었다면 경험치를 올려준다. if (pCreature->isDead()) { if (pCastCreature != NULL && pCastCreature->isVampire()) { Vampire* pVampire = dynamic_cast(pCastCreature); @@ -196,9 +196,9 @@ void EffectBloodyWall::affect() } } - // m_CasterName pCreature KillCount ó + // m_CasterName이 pCreature를 죽인 경우의 KillCount 처리 // by sigi. 2002.8.31 - // setDamage ȣϿ ذѴ. ּó + // setDamage 를 호출하여 해결한다. 주석처리 // by bezz. 2003.1.3 /* if (pCreature->isDead()) { @@ -327,7 +327,7 @@ WHERE ZoneID = %d AND EffectID = %d", pZone->getZoneID(), (int)Effect::EFFECT_CL pEffect->setTick( value2 ); pEffect->setLevel( 300 ); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->registerObject(pEffect); pZone->addEffect(pEffect); tile.addEffect(pEffect); diff --git a/src/server/gameserver/skill/EffectBloodyWall.h b/src/server/gameserver/skill/EffectBloodyWall.h index 41043991..5bc6f155 100644 --- a/src/server/gameserver/skill/EffectBloodyWall.h +++ b/src/server/gameserver/skill/EffectBloodyWall.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectBloodyWall.h // Written by : elca@ewestsoft.com -// Description : BloodyWall Effect óֱ Ŭ̴. +// Description : 성직마법 BloodyWall의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_BLOODY_WALL__ diff --git a/src/server/gameserver/skill/EffectBloodyWallBlocked.cpp b/src/server/gameserver/skill/EffectBloodyWallBlocked.cpp index 64e79c87..e96f41ca 100644 --- a/src/server/gameserver/skill/EffectBloodyWallBlocked.cpp +++ b/src/server/gameserver/skill/EffectBloodyWallBlocked.cpp @@ -41,13 +41,13 @@ void EffectBloodyWallBlocked::affect() Assert(m_pZone != NULL); - // Ʈ پִ Ÿ ޾ƿ´. + // 현재 이펙트가 붙어있는 타일을 받아온다. Tile& tile = m_pZone->getTile(m_X, m_Y); HP_t CurrentHP = 0; HP_t RemainHP = 0; - // Ÿ ȿ ϴ Ʈ ˻Ѵ. + // 타일 안에 존재하는 오브젝트들을 검색한다. const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { @@ -60,8 +60,8 @@ void EffectBloodyWallBlocked::affect() Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // üũ. by sigi. 2002.9.5 - // 鿪. by sigi. 2002.9.13 + // 무적상태 체크. by sigi. 2002.9.5 + // 산 면역. by sigi. 2002.9.13 if (!canAttack(NULL, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_BLOOD_DRAIN) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || pCreature->isDead()) { continue; @@ -85,7 +85,7 @@ void EffectBloodyWallBlocked::affect() Assert(pPlayer != NULL); pPlayer->sendPacket(&gcMI); - // HP εijش. + // 변한 HP를 브로드캐스팅해준다. GCStatusCurrentHP pkt; pkt.setObjectID(pSlayer->getObjectID()); pkt.setCurrentHP(RemainHP); @@ -107,7 +107,7 @@ void EffectBloodyWallBlocked::affect() Assert(pPlayer != NULL); pPlayer->sendPacket(&gcMI); - // HP εijش. + // 변한 HP를 브로드캐스팅해준다. GCStatusCurrentHP pkt; pkt.setObjectID(pVampire->getObjectID()); pkt.setCurrentHP(RemainHP); @@ -129,7 +129,7 @@ void EffectBloodyWallBlocked::affect() Assert(pPlayer != NULL); pPlayer->sendPacket(&gcMI); - // HP εijش. + // 변한 HP를 브로드캐스팅해준다. GCStatusCurrentHP pkt; pkt.setObjectID(pOusters->getObjectID()); pkt.setCurrentHP(RemainHP); @@ -143,14 +143,14 @@ void EffectBloodyWallBlocked::affect() pMonster->setHP(RemainHP, ATTR_CURRENT); if (m_CasterName != "") { - // ߰ ش. - // ´ ̰, ڰ ̶, - // ϴ 켱 ̺ ־ Ѵ. + // 시전자의 데미지를 추가해 준다. + // 맞는 놈이 몬스터이고, 공격자가 사람이라면, + // 데미지에 따라서 변하는 우선권 테이블을 갱신해 주어야 한다. pMonster->addPrecedence(m_CasterName, m_PartyID, AcidDamage); pMonster->setLastHitCreatureClass(Creature::CREATURE_CLASS_VAMPIRE); } - // HP εijش. + // 변한 HP를 브로드캐스팅해준다. GCStatusCurrentHP pkt; pkt.setObjectID(pMonster->getObjectID()); pkt.setCurrentHP(RemainHP); @@ -158,7 +158,7 @@ void EffectBloodyWallBlocked::affect() } - // m_CasterName pCreature KillCount ó + // m_CasterName이 pCreature를 죽인 경우의 KillCount 처리 // by sigi. 2002.8.31 if (pCreature->isDead()) { Creature* pAttacker = m_pZone->getCreature(m_CasterName); @@ -171,7 +171,7 @@ void EffectBloodyWallBlocked::affect() } } - // ѹ.. + // 한번만.. // setNextTime(m_Tick); // cout << "EffectBloodyWallBlocked" << "affect END" << endl; diff --git a/src/server/gameserver/skill/EffectBloodyWallBlocked.h b/src/server/gameserver/skill/EffectBloodyWallBlocked.h index ebc0115b..c40ee6b9 100644 --- a/src/server/gameserver/skill/EffectBloodyWallBlocked.h +++ b/src/server/gameserver/skill/EffectBloodyWallBlocked.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectBloodyWallBlocked.h // Written by : elca@ewestsoft.com -// Description : BloodyWallBlocked Effect óֱ Ŭ̴. +// Description : 성직마법 BloodyWallBlocked의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_BLOODY_WALL_BLOCKED__ diff --git a/src/server/gameserver/skill/EffectBlunting.cpp b/src/server/gameserver/skill/EffectBlunting.cpp index 2acc03ab..9e914c3d 100644 --- a/src/server/gameserver/skill/EffectBlunting.cpp +++ b/src/server/gameserver/skill/EffectBlunting.cpp @@ -61,8 +61,8 @@ void EffectBlunting::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_BLUNTING); if (pCreature->isVampire()) { diff --git a/src/server/gameserver/skill/EffectBlunting.h b/src/server/gameserver/skill/EffectBlunting.h index 8e9f3bbd..34781347 100644 --- a/src/server/gameserver/skill/EffectBlunting.h +++ b/src/server/gameserver/skill/EffectBlunting.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectBlunting.h // Written by : -// Description : Blunting ϰ effect +// Description : Blunting에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_BLUNTING__ diff --git a/src/server/gameserver/skill/EffectBombCrashWalk.h b/src/server/gameserver/skill/EffectBombCrashWalk.h index f74ce7e3..7a69c7e6 100644 --- a/src/server/gameserver/skill/EffectBombCrashWalk.h +++ b/src/server/gameserver/skill/EffectBombCrashWalk.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectBombCrashWalk.h // Written by : elca@ewestsoft.com -// Description : BombCrashWalk Effect óֱ Ŭ̴. +// Description : 성직마법 BombCrashWalk의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_BOMB_CRASH_WALK__ @@ -79,9 +79,9 @@ class EffectBombCrashWalk : public Effect { int m_Damage; ObjectID_t m_UserObjectID; SkillType_t m_SkillType; - int m_StormTime; // ϴ°? - Turn_t m_Tick; // °? - bool m_bLarge; // true 5x5 false 3x3 + int m_StormTime; // 데미지를 몇 번 가하는가? + Turn_t m_Tick; // 몇 턴 간격으로 떨어지는가? + bool m_bLarge; // true 면 5x5 false면 3x3 }; #endif // __EFFECT_BOMB_CRASH_WALK__ diff --git a/src/server/gameserver/skill/EffectBombCrashWalkToEnemy.cpp b/src/server/gameserver/skill/EffectBombCrashWalkToEnemy.cpp index a41b5d4d..6881dbe4 100644 --- a/src/server/gameserver/skill/EffectBombCrashWalkToEnemy.cpp +++ b/src/server/gameserver/skill/EffectBombCrashWalkToEnemy.cpp @@ -65,7 +65,7 @@ void EffectBombCrashWalkToEnemy::affect(Creature* pCreature) if (!(pZone->getZoneLevel() & COMPLETE_SAFE_ZONE) && !pCreature->isDead() && !pCreature->isFlag(Effect::EFFECT_CLASS_COMA) - // üũ. by sigi. 2002.9.5 + // ¹«Àû»óÅ üũ. by sigi. 2002.9.5 && canAttack(pAttacker, pCreature)) { GCModifyInformation gcMI, gcAttackerMI; setDamage(pCreature, m_Point, pAttacker, SKILL_DIVINE_GUIDANCE, &gcMI, &gcAttackerMI); @@ -89,7 +89,7 @@ void EffectBombCrashWalkToEnemy::affect(Creature* pCreature) } } } - // ɫ ȥЧ + // Èç¹û½ÇÉ«ËÀÍö È¥³ýЧ¹û if (pCreature->isDead()) { setDeadline(0); setNextTime(0); diff --git a/src/server/gameserver/skill/EffectBrambleHalo.cpp b/src/server/gameserver/skill/EffectBrambleHalo.cpp index 79366bab..aff9461e 100644 --- a/src/server/gameserver/skill/EffectBrambleHalo.cpp +++ b/src/server/gameserver/skill/EffectBrambleHalo.cpp @@ -98,15 +98,15 @@ void EffectBrambleHalo::affect(Creature* pCastCreature) if (!rect.ptInRect(X, Y)) continue; - // ŸϾȿ ϴ Ʈ ´. + // 타일안에 존재하는 오브젝트를 가져온다. Tile& tile = pZone->getTile(X, Y); if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) { Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_WALKING); Assert(pCreature != NULL); - // ڽ ʴ´. ´´. ̾ ´. - // üũ + // 자신은 맞지 않는다. 무적도 안 맞는다. 슬레이어도 안 맞느다. + // 안전지대 체크 // 2003.1.10 by bezz, Sequoia if (pCreature == m_pTarget || !canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || pCreature->isSlayer() || pCreature->isNPC() || @@ -128,9 +128,9 @@ void EffectBrambleHalo::affect(Creature* pCastCreature) pCreature->getPlayer()->sendPacket(&gcMI); - // ´ ش. + // 맞는 동작을 보여준다. GCSkillToObjectOK2 gcSkillToObjectOK2; - gcSkillToObjectOK2.setObjectID(1); // ǹ . + gcSkillToObjectOK2.setObjectID(1); // 의미 없다. gcSkillToObjectOK2.setSkillType(SKILL_ATTACK_MELEE); gcSkillToObjectOK2.setDuration(0); pCreature->getPlayer()->sendPacket(&gcSkillToObjectOK2); @@ -188,7 +188,7 @@ void EffectBrambleHalo::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Effect ְ ˸. + // Effect를 없애고 알린다. pCreature->removeFlag(Effect::EFFECT_CLASS_Bramble_Halo); GCRemoveEffect gcRemoveEffect; diff --git a/src/server/gameserver/skill/EffectBurningSolCharging.cpp b/src/server/gameserver/skill/EffectBurningSolCharging.cpp index dc220f62..256c7d94 100644 --- a/src/server/gameserver/skill/EffectBurningSolCharging.cpp +++ b/src/server/gameserver/skill/EffectBurningSolCharging.cpp @@ -55,7 +55,7 @@ void EffectBurningSolCharging::affect(Creature* pCreature) // cout << "upgrade burning sol..." << m_Level << endl; - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(getSendEffectClass()); @@ -96,13 +96,13 @@ void EffectBurningSolCharging::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_BURNING_SOL_CHARGE_1); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(getSendEffectClass()); diff --git a/src/server/gameserver/skill/EffectBurningSolCharging.h b/src/server/gameserver/skill/EffectBurningSolCharging.h index bd17c245..22edf6cd 100644 --- a/src/server/gameserver/skill/EffectBurningSolCharging.h +++ b/src/server/gameserver/skill/EffectBurningSolCharging.h @@ -42,7 +42,7 @@ class EffectBurningSolCharging : public Effect { } private: - Level_t m_Level; // ų + Level_t m_Level; // 스킬 레벨 }; #endif // __EFFECT_BURNING_SOL_CHARGE__ diff --git a/src/server/gameserver/skill/EffectCannonade.cpp b/src/server/gameserver/skill/EffectCannonade.cpp index c2df6be9..52086fc2 100644 --- a/src/server/gameserver/skill/EffectCannonade.cpp +++ b/src/server/gameserver/skill/EffectCannonade.cpp @@ -54,7 +54,7 @@ void EffectCannonade::unaffect(Creature* pCastCreature) Assert(pCastCreature != NULL); - VSRect rect(0, 0, m_pZone->getWidth() - 1, m_pZone->getHeight() - 1); // -1 ߰ by sigi. 2003.1.10 + VSRect rect(0, 0, m_pZone->getWidth() - 1, m_pZone->getHeight() - 1); // -1 추가 by sigi. 2003.1.10 bool bHit = false; @@ -69,7 +69,7 @@ void EffectCannonade::unaffect(Creature* pCastCreature) if (!rect.ptInRect(X, Y)) continue; - // ŸϾȿ ϴ Ʈ ´. + // 타일안에 존재하는 오브젝트를 가져온다. Tile& tile = m_pZone->getTile(X, Y); const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); @@ -84,7 +84,7 @@ void EffectCannonade::unaffect(Creature* pCastCreature) Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // ڽ ʴ´. ´´. ̾ ʴ´. + // 자신은 맞지 않는다. 무적도 안 맞는다. 슬레이어는 맞지 않는다. if (pCreature == m_pTarget || !canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { continue; @@ -102,7 +102,7 @@ void EffectCannonade::unaffect(Creature* pCastCreature) bool bHitRoll = HitRoll::isSuccess(pCastCreature, pCreature); if (bPK && bZoneLevelCheck && bHitRoll) { - // ų ʽ Ѵ. + // 원래 데미지와 스킬 데미지 보너스를 더한 최종 데미지를 구한다. Damage_t FinalDamage = 0; FinalDamage = computeDamage(pCastCreature, pCreature); FinalDamage += Damage; @@ -112,12 +112,12 @@ void EffectCannonade::unaffect(Creature* pCastCreature) GCModifyInformation gcMI; ::setDamage(pCreature, FinalDamage, pCastCreature, SKILL_CANNONADE, - &gcMI); // ::߰ by Sequoia + &gcMI); // ::추가 by Sequoia pCreature->getPlayer()->sendPacket(&gcMI); - // ´ ش. - gcSkillToObjectOK2.setObjectID(1); // ǹ . + // 맞는 동작을 보여준다. + gcSkillToObjectOK2.setObjectID(1); // 의미 없다. gcSkillToObjectOK2.setSkillType(SKILL_ATTACK_MELEE); gcSkillToObjectOK2.setDuration(0); pCreature->getPlayer()->sendPacket(&gcSkillToObjectOK2); @@ -126,7 +126,7 @@ void EffectCannonade::unaffect(Creature* pCastCreature) } else if (pCreature->isMonster()) { Monster* pMonster = dynamic_cast(pCreature); - ::setDamage(pMonster, FinalDamage, pCastCreature, SKILL_CANNONADE); // ::߰ by Sequoia + ::setDamage(pMonster, FinalDamage, pCastCreature, SKILL_CANNONADE); // ::추가 by Sequoia pMonster->addEnemy(pCastCreature); bHit = true; diff --git a/src/server/gameserver/skill/EffectChargingPower.cpp b/src/server/gameserver/skill/EffectChargingPower.cpp index 31144ac9..b3d9d167 100644 --- a/src/server/gameserver/skill/EffectChargingPower.cpp +++ b/src/server/gameserver/skill/EffectChargingPower.cpp @@ -71,7 +71,7 @@ void EffectChargingPower::unaffect(Creature* pCreature) Zone* pZone = pSlayer->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_CHARGING_POWER); diff --git a/src/server/gameserver/skill/EffectConcealment.cpp b/src/server/gameserver/skill/EffectConcealment.cpp index 759b6248..6524a21f 100644 --- a/src/server/gameserver/skill/EffectConcealment.cpp +++ b/src/server/gameserver/skill/EffectConcealment.cpp @@ -38,7 +38,7 @@ void EffectConcealment::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isSlayer()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_CONCEALMENT); Zone* pZone = pCreature->getZone(); @@ -54,7 +54,7 @@ void EffectConcealment::unaffect(Creature* pCreature) pTargetSlayer->sendRealWearingInfo(); pTargetSlayer->sendModifyInfo(prev); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_CONCEALMENT); diff --git a/src/server/gameserver/skill/EffectContinualBloodyWall.cpp b/src/server/gameserver/skill/EffectContinualBloodyWall.cpp index 0f08312f..6348ade5 100644 --- a/src/server/gameserver/skill/EffectContinualBloodyWall.cpp +++ b/src/server/gameserver/skill/EffectContinualBloodyWall.cpp @@ -31,9 +31,9 @@ EffectContinualBloodyWall::EffectContinualBloodyWall(Zone* pZone) m_Duration = 10; m_Damage = 1000; - setNextTime(10); // 1 + setNextTime(10); // 1초 후 시작 - // Effect̴. by sigi. 2002.11.14 + // 서버 전용 Effect이다. by sigi. 2002.11.14 m_bBroadcastingEffect = false; __END_CATCH @@ -143,7 +143,7 @@ void EffectContinualBloodyWallLoader::load(Zone* pZone) pEffect->setDuration(value2); pEffect->setDamage(value3); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->registerObject(pEffect); pZone->addEffect(pEffect); } diff --git a/src/server/gameserver/skill/EffectContinualBloodyWall.h b/src/server/gameserver/skill/EffectContinualBloodyWall.h index ac979d49..ac7143bc 100644 --- a/src/server/gameserver/skill/EffectContinualBloodyWall.h +++ b/src/server/gameserver/skill/EffectContinualBloodyWall.h @@ -26,7 +26,7 @@ class EffectContinualBloodyWall : public Effect { return EFFECT_CLASS_CONTINUAL_BLOODY_WALL; } - // OBJECT_PRIORITY_NONE , ŸϿ  ȵȴٴ ̴. + // OBJECT_PRIORITY_NONE 라는 뜻은, 타일에 들어가서는 안된다는 뜻이다. // virtual ObjectPriority getObjectPriority() const throw() { return OBJECT_PRIORITY_NONE; } virtual void affect(); diff --git a/src/server/gameserver/skill/EffectCrossCounter.cpp b/src/server/gameserver/skill/EffectCrossCounter.cpp index 8e36dcc6..c600d623 100644 --- a/src/server/gameserver/skill/EffectCrossCounter.cpp +++ b/src/server/gameserver/skill/EffectCrossCounter.cpp @@ -57,7 +57,7 @@ void EffectCrossCounter::unaffect(Creature* pCreature) Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_CROSS_COUNTER); diff --git a/src/server/gameserver/skill/EffectCrossGuard.cpp b/src/server/gameserver/skill/EffectCrossGuard.cpp index 92734a1b..f184850e 100644 --- a/src/server/gameserver/skill/EffectCrossGuard.cpp +++ b/src/server/gameserver/skill/EffectCrossGuard.cpp @@ -36,7 +36,7 @@ void EffectCrossGuard::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_CROSS_GUARD); Zone* pZone = pCreature->getZone(); @@ -52,7 +52,7 @@ void EffectCrossGuard::unaffect(Creature* pCreature) pTargetOusters->sendRealWearingInfo(); pTargetOusters->sendModifyInfo(prev); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_CROSS_GUARD); diff --git a/src/server/gameserver/skill/EffectCureCriticalWounds.cpp b/src/server/gameserver/skill/EffectCureCriticalWounds.cpp index 0a4e72e5..fe2e96d0 100644 --- a/src/server/gameserver/skill/EffectCureCriticalWounds.cpp +++ b/src/server/gameserver/skill/EffectCureCriticalWounds.cpp @@ -93,14 +93,14 @@ void EffectCureCriticalWounds::affect(Creature* pCreature) Assert(pEffectBloodDrain != NULL); if (pEffectBloodDrain->getLevel() < CriticalBloodDrainLevel) { - // ƸƮ ϱ Ʈ ٿش. + // 흡혈 아르바이트를 방지하기 위한 후유증 이펙트를 붙여준다. if (pSlayer->isFlag(Effect::EFFECT_CLASS_AFTERMATH)) { Effect* pEffect = pSlayer->findEffect(Effect::EFFECT_CLASS_AFTERMATH); EffectAftermath* pEffectAftermath = dynamic_cast(pEffect); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. } else { EffectAftermath* pEffectAftermath = new EffectAftermath(pSlayer); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. pSlayer->addEffect(pEffectAftermath); pSlayer->setFlag(Effect::EFFECT_CLASS_AFTERMATH); pEffectAftermath->create(pSlayer->getName()); @@ -167,7 +167,7 @@ void EffectCureCriticalWounds::affect(Creature* pCreature) Slayer* pCastSlayer = dynamic_cast(pCreature); GCModifyInformation gcMI; SkillDomainType_t DomainType = pSkillInfo->getDomainType(); - // ġ ÷ش. + // 경험치를 올려준다. shareAttrExp(pCastSlayer, ExpUp, 1, 1, 8, gcMI); increaseDomainExp(pCastSlayer, DomainType, ExpUp, gcMI); increaseSkillExp(pCastSlayer, DomainType, pSkillSlot, pSkillInfo, gcMI); diff --git a/src/server/gameserver/skill/EffectCureCriticalWounds.h b/src/server/gameserver/skill/EffectCureCriticalWounds.h index e04fa04c..2546b347 100644 --- a/src/server/gameserver/skill/EffectCureCriticalWounds.h +++ b/src/server/gameserver/skill/EffectCureCriticalWounds.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectCureCriticalWounds.h // Written by : elca@ewestsoft.com -// Description : CureCriticalWounds Effect óֱ Ŭ̴. +// Description : 성직마법 CureCriticalWounds의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_CURE_CRITICAL_WOUNDS__ diff --git a/src/server/gameserver/skill/EffectDancingSword.cpp b/src/server/gameserver/skill/EffectDancingSword.cpp index db22368b..46536d0f 100644 --- a/src/server/gameserver/skill/EffectDancingSword.cpp +++ b/src/server/gameserver/skill/EffectDancingSword.cpp @@ -68,7 +68,7 @@ void EffectDancingSword::unaffect(Creature* pCreature) Zone* pZone = pSlayer->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_DANCING_SWORD); diff --git a/src/server/gameserver/skill/EffectDarkBluePoison.cpp b/src/server/gameserver/skill/EffectDarkBluePoison.cpp index 94880972..b5e823ba 100644 --- a/src/server/gameserver/skill/EffectDarkBluePoison.cpp +++ b/src/server/gameserver/skill/EffectDarkBluePoison.cpp @@ -56,7 +56,7 @@ void EffectDarkBluePoison::affect(Creature* pCreature) Assert(pCreature != NULL); if (canAttack(NULL, pCreature)) { - // ̾ 쿡 Ѵ. + // 슬레이어일 경우에만 독 데미지가 존재한다. if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); Assert(pSlayer != NULL); @@ -80,7 +80,7 @@ void EffectDarkBluePoison::affect(Creature* pCreature) // int PoisonDamage = computeMagicDamage(pOusters, m_Damage, SKILL_DARKBLUE_POISON); - // ƿ콺 1/2 δ. + // 아우스터즈는 1/2만 깎인다. MP_t CurrentMP = pOusters->getMP(ATTR_CURRENT); MP_t RemainMP = max(0, (int)CurrentMP - (m_Damage / 2)); @@ -123,7 +123,7 @@ void EffectDarkBluePoison::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ũĿԼ ÷׸ Ѵ. + // 크리쳐에게서 플래그를 제거한다. pCreature->removeFlag(Effect::EFFECT_CLASS_DARKBLUE_POISON); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/skill/EffectDarkness.cpp b/src/server/gameserver/skill/EffectDarkness.cpp index 70ec33d9..0c6311d7 100644 --- a/src/server/gameserver/skill/EffectDarkness.cpp +++ b/src/server/gameserver/skill/EffectDarkness.cpp @@ -28,10 +28,10 @@ EffectDarkness::EffectDarkness(Zone* pZone, ZoneCoord_t ZoneX, ZoneCoord_t ZoneY ////////////////////////////////////////////////////////////////////////////// // EffectDarkness::affectCreature() -// bAffectByMove false ڸ ϴ ̹Ƿ.. -// ܺ SkillOK modify info . GCModifyInformation -// ʿ䰡 . -// pTarget þ߰ true return +// bAffectByMove가 false면 제자리에서 당하는 것이므로.. +// 외부의 SkillOK에서 modify info를 보낸다. 따라서 GCModifyInformation을 +// 보낼 필요가 없다. +// pTarget의 시야가 변한 경우 true를 return ////////////////////////////////////////////////////////////////////////////// bool EffectDarkness::affectObject(Object* pTarget, bool bAffectByMove) @@ -41,11 +41,11 @@ bool EffectDarkness::affectObject(Object* pTarget, bool bAffectByMove) bool bAffected = false; if (pTarget->getObjectClass() == Object::OBJECT_CLASS_CREATURE) { Creature* pTargetCreature = dynamic_cast(pTarget); - // ̹ ɷִ 쿡 ٽ ʴ´. + // 이미 걸려있는 경우에는 다시 걸지 않는다. if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_DARKNESS)) { return false; } - // ̾ 쿡 ɸ. + // 슬레이어일 경우에만 걸린다. if (pTargetCreature->isSlayer() || pTargetCreature->isOusters()) { bAffected = true; pTargetCreature->setFlag(Effect::EFFECT_CLASS_DARKNESS); diff --git a/src/server/gameserver/skill/EffectDarkness.h b/src/server/gameserver/skill/EffectDarkness.h index 310e13cf..0149b8d4 100644 --- a/src/server/gameserver/skill/EffectDarkness.h +++ b/src/server/gameserver/skill/EffectDarkness.h @@ -73,7 +73,7 @@ class EffectDarkness : public Effect { private: Attr_t m_Level; Duration_t m_Duration; - Timeval m_StartTime; // ۵ ð. + Timeval m_StartTime; // 기술이 시작된 시간. }; class EffectDarknessLoader : public EffectLoader { diff --git a/src/server/gameserver/skill/EffectDeath.cpp b/src/server/gameserver/skill/EffectDeath.cpp index 265e92f9..9c10475a 100644 --- a/src/server/gameserver/skill/EffectDeath.cpp +++ b/src/server/gameserver/skill/EffectDeath.cpp @@ -61,8 +61,8 @@ void EffectDeath::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_DEATH); if (pCreature->isVampire()) { diff --git a/src/server/gameserver/skill/EffectDeath.h b/src/server/gameserver/skill/EffectDeath.h index 00e1e9e6..c60c005f 100644 --- a/src/server/gameserver/skill/EffectDeath.h +++ b/src/server/gameserver/skill/EffectDeath.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectDeath.h // Written by : -// Description : Death ϰ effect +// Description : Death에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_DEATH__ diff --git a/src/server/gameserver/skill/EffectDecreaseHP.cpp b/src/server/gameserver/skill/EffectDecreaseHP.cpp index a61dd05b..a68a8888 100644 --- a/src/server/gameserver/skill/EffectDecreaseHP.cpp +++ b/src/server/gameserver/skill/EffectDecreaseHP.cpp @@ -87,7 +87,7 @@ void EffectDecreaseHP::unaffect(Creature* pCreature) if (!(pZone->getZoneLevel() & COMPLETE_SAFE_ZONE) && !pCreature->isDead() && !pCreature->isFlag(Effect::EFFECT_CLASS_COMA) - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 && canAttack(NULL, pCreature)) { if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -103,7 +103,7 @@ void EffectDecreaseHP::unaffect(Creature* pCreature) gcMI.addShortData(MODIFY_CURRENT_HP, RemainHP); pSlayer->getPlayer()->sendPacket(&gcMI); - // HP εijش. + // 변한 HP를 브로드캐스팅해준다. GCStatusCurrentHP pkt; pkt.setObjectID(pSlayer->getObjectID()); pkt.setCurrentHP(RemainHP); @@ -123,7 +123,7 @@ void EffectDecreaseHP::unaffect(Creature* pCreature) gcMI.addShortData(MODIFY_CURRENT_HP, RemainHP); pVampire->getPlayer()->sendPacket(&gcMI); - // () ϴ 쿡 ٲ by sigi. 2002.12.27 + // 공격(흡혈) 당하는 경우에는 공격자의 성향이 바뀜 by sigi. 2002.12.27 Creature* pAttacker = pZone->getCreature(m_UserObjectID); if (pAttacker != NULL && pAttacker->isVampire()) { Vampire* pAttackVampire = dynamic_cast(pAttacker); @@ -131,13 +131,13 @@ void EffectDecreaseHP::unaffect(Creature* pCreature) GCModifyInformation gcAttackerMI; computeAlignmentChange(pVampire, decreaseHP, pAttackVampire, NULL, &gcAttackerMI); - // ִٸ ش. + // 뭔가 변한 정보가 있다면 보내준다. if (gcAttackerMI.getShortCount() + gcAttackerMI.getLongCount() > 0) { pAttackVampire->getPlayer()->sendPacket(&gcAttackerMI); } } - // HP εijش. + // 변한 HP를 브로드캐스팅해준다. GCStatusCurrentHP pkt; pkt.setObjectID(pVampire->getObjectID()); pkt.setCurrentHP(RemainHP); @@ -157,7 +157,7 @@ void EffectDecreaseHP::unaffect(Creature* pCreature) gcMI.addShortData(MODIFY_CURRENT_HP, RemainHP); pOusters->getPlayer()->sendPacket(&gcMI); - // () ϴ 쿡 ٲ by sigi. 2002.12.27 + // 공격(흡혈) 당하는 경우에는 공격자의 성향이 바뀜 by sigi. 2002.12.27 Creature* pAttacker = pZone->getCreature(m_UserObjectID); if (pAttacker != NULL && pAttacker->isOusters()) { Ousters* pAttackOusters = dynamic_cast(pAttacker); @@ -165,13 +165,13 @@ void EffectDecreaseHP::unaffect(Creature* pCreature) GCModifyInformation gcAttackerMI; computeAlignmentChange(pOusters, decreaseHP, pAttackOusters, NULL, &gcAttackerMI); - // ִٸ ش. + // 뭔가 변한 정보가 있다면 보내준다. if (gcAttackerMI.getShortCount() + gcAttackerMI.getLongCount() > 0) { pAttackOusters->getPlayer()->sendPacket(&gcAttackerMI); } } - // HP εijش. + // 변한 HP를 브로드캐스팅해준다. GCStatusCurrentHP pkt; pkt.setObjectID(pOusters->getObjectID()); pkt.setCurrentHP(RemainHP); @@ -187,7 +187,7 @@ void EffectDecreaseHP::unaffect(Creature* pCreature) pMonster->setHP(RemainHP, ATTR_CURRENT); - // HP εijش. + // 변한 HP를 브로드캐스팅해준다. GCStatusCurrentHP pkt; pkt.setObjectID(pMonster->getObjectID()); pkt.setCurrentHP(RemainHP); @@ -209,7 +209,7 @@ void EffectDecreaseHP::unaffect(Creature* pCreature) } - // m_CasterName pCreature KillCount ó + // m_CasterName이 pCreature를 죽인 경우의 KillCount 처리 // by sigi. 2002.9.9 if (pCreature->isDead()) { Creature* pAttacker = pZone->getCreature(m_UserObjectID); @@ -217,7 +217,7 @@ void EffectDecreaseHP::unaffect(Creature* pCreature) if (pAttacker != NULL) { if (pAttacker->isVampire()) { Vampire* pVampire = dynamic_cast(pAttacker); - // ϶ ġ ش. + // 죽일때 경험치를 준다. GCModifyInformation mi; int exp = computeCreatureExp(pCreature, KILL_EXP); diff --git a/src/server/gameserver/skill/EffectDenialMagic.cpp b/src/server/gameserver/skill/EffectDenialMagic.cpp index d30fdf6c..ed66b65e 100644 --- a/src/server/gameserver/skill/EffectDenialMagic.cpp +++ b/src/server/gameserver/skill/EffectDenialMagic.cpp @@ -56,13 +56,13 @@ void EffectDenialMagic::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isSlayer()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_DENIAL_MAGIC); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_DENIAL_MAGIC); diff --git a/src/server/gameserver/skill/EffectDestinies.h b/src/server/gameserver/skill/EffectDestinies.h index 9ed637e6..1b2623cc 100644 --- a/src/server/gameserver/skill/EffectDestinies.h +++ b/src/server/gameserver/skill/EffectDestinies.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectDestinies.h // Written by : elca@ewestsoft.com -// Description : Destinies Effect óֱ Ŭ̴. +// Description : 성직마법 Destinies의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_DESTINIES__ diff --git a/src/server/gameserver/skill/EffectDestructionSpear.cpp b/src/server/gameserver/skill/EffectDestructionSpear.cpp index e07b06b0..5c8e28be 100644 --- a/src/server/gameserver/skill/EffectDestructionSpear.cpp +++ b/src/server/gameserver/skill/EffectDestructionSpear.cpp @@ -94,7 +94,7 @@ void EffectDestructionSpear::unaffect(Creature* pCreature) { Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(getSendEffectClass()); diff --git a/src/server/gameserver/skill/EffectDetectHidden.cpp b/src/server/gameserver/skill/EffectDetectHidden.cpp index 592aea44..346d4db7 100644 --- a/src/server/gameserver/skill/EffectDetectHidden.cpp +++ b/src/server/gameserver/skill/EffectDetectHidden.cpp @@ -16,7 +16,7 @@ EffectDetectHidden::EffectDetectHidden(Creature* pCreature) { __BEGIN_TRY - // Ʈ ̾ ִ. + // 디텍트 히든은 슬레이어만이 쓸 수 있다. Assert(pCreature != NULL); Assert(pCreature->isSlayer()); @@ -55,15 +55,15 @@ void EffectDetectHidden::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isSlayer()); - // ÷׸ Ѵ. + // 플래그를 제거한다. pCreature->removeFlag(Effect::EFFECT_CLASS_DETECT_HIDDEN); - // ִ ũĵ Ѵ. + // 마법의 힘으로 보고 있던 크리쳐들을 삭제한다. Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); pZone->updateHiddenScan(pCreature); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_DETECT_HIDDEN); diff --git a/src/server/gameserver/skill/EffectDetectInvisibility.cpp b/src/server/gameserver/skill/EffectDetectInvisibility.cpp index 5a284e90..0fbede9d 100644 --- a/src/server/gameserver/skill/EffectDetectInvisibility.cpp +++ b/src/server/gameserver/skill/EffectDetectInvisibility.cpp @@ -18,7 +18,7 @@ EffectDetectInvisibility::EffectDetectInvisibility(Creature* pCreature) { __BEGIN_TRY - // Ʈ κƼ ̾ ִ. + // 디텍트 인비저빌러티는 슬레이어만이 쓸 수 있다. Assert(pCreature != NULL); Assert(pCreature->isSlayer()); @@ -57,15 +57,15 @@ void EffectDetectInvisibility::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isSlayer()); - // ÷׸ Ѵ. + // 플래그를 제거한다. pCreature->removeFlag(Effect::EFFECT_CLASS_DETECT_INVISIBILITY); - // ִ ũĵ Ѵ. + // 마법의 힘으로 보고 있던 크리쳐들을 삭제한다. Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); pZone->updateInvisibleScan(pCreature); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_DETECT_INVISIBILITY); diff --git a/src/server/gameserver/skill/EffectDetectMine.cpp b/src/server/gameserver/skill/EffectDetectMine.cpp index 3dab3349..9fa30d78 100644 --- a/src/server/gameserver/skill/EffectDetectMine.cpp +++ b/src/server/gameserver/skill/EffectDetectMine.cpp @@ -44,7 +44,7 @@ void EffectDetectMine::unaffect(Creature* pCreature) Assert(pCreature != NULL); pCreature->removeFlag(Effect::EFFECT_CLASS_REVEALER); - // detect hidden ־ hidden creature ؾѴ. + // detect hidden의 힘으로 볼수 있었던 hidden creature를 삭제해야한다. Zone* pZone = pCreature->getZone(); pZone->updateMineScan(pCreature); diff --git a/src/server/gameserver/skill/EffectDivineGuidance.cpp b/src/server/gameserver/skill/EffectDivineGuidance.cpp index 1534c1a4..5fab2117 100644 --- a/src/server/gameserver/skill/EffectDivineGuidance.cpp +++ b/src/server/gameserver/skill/EffectDivineGuidance.cpp @@ -65,7 +65,7 @@ void EffectDivineGuidance::affect(Creature* pCreature) if (!(pZone->getZoneLevel() & COMPLETE_SAFE_ZONE) && !pCreature->isDead() && !pCreature->isFlag(Effect::EFFECT_CLASS_COMA) - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 && canAttack(pAttacker, pCreature)) { GCModifyInformation gcMI, gcAttackerMI; setDamage(pCreature, m_Point, pAttacker, SKILL_DIVINE_GUIDANCE, &gcMI, &gcAttackerMI); diff --git a/src/server/gameserver/skill/EffectDivineSpirits.cpp b/src/server/gameserver/skill/EffectDivineSpirits.cpp index 83043a5d..1ab20ad7 100644 --- a/src/server/gameserver/skill/EffectDivineSpirits.cpp +++ b/src/server/gameserver/skill/EffectDivineSpirits.cpp @@ -36,7 +36,7 @@ void EffectDivineSpirits::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_DIVINE_SPIRITS); Zone* pZone = pCreature->getZone(); @@ -52,7 +52,7 @@ void EffectDivineSpirits::unaffect(Creature* pCreature) // pTargetOusters->sendRealWearingInfo(); // pTargetOusters->sendModifyInfo(prev); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_DIVINE_SPIRITS); diff --git a/src/server/gameserver/skill/EffectDoom.cpp b/src/server/gameserver/skill/EffectDoom.cpp index 91b32946..dad5f5e7 100644 --- a/src/server/gameserver/skill/EffectDoom.cpp +++ b/src/server/gameserver/skill/EffectDoom.cpp @@ -61,8 +61,8 @@ void EffectDoom::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_DOOM); if (pCreature->isVampire()) { diff --git a/src/server/gameserver/skill/EffectDoom.h b/src/server/gameserver/skill/EffectDoom.h index ea9f70d7..ef1d716f 100644 --- a/src/server/gameserver/skill/EffectDoom.h +++ b/src/server/gameserver/skill/EffectDoom.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectDoom.h // Written by : -// Description : Doom ϰ effect +// Description : Doom에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_DOOM__ diff --git a/src/server/gameserver/skill/EffectDragonTornado.cpp b/src/server/gameserver/skill/EffectDragonTornado.cpp index 1ebcb37a..550a7ddd 100644 --- a/src/server/gameserver/skill/EffectDragonTornado.cpp +++ b/src/server/gameserver/skill/EffectDragonTornado.cpp @@ -127,8 +127,8 @@ void EffectDragonTornado::affect(Creature* pCreature) if (pCastCreature == NULL) return; - // ڽ ʴ´ - // üũ. by sigi. 2002.9.5 + // 자신은 맞지 않는다 + // 무적상태 체크. by sigi. 2002.9.5 if (pCreature->getObjectID() == m_UserOID || !canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || !checkZoneLevelToHitTarget(pCreature) || pCreature->isSlayer()) { @@ -165,7 +165,7 @@ void EffectDragonTornado::affect(Creature* pCreature) pPlayer->sendPacket(&gcMI);*/ } else if (pCreature->isVampire()) { - // ̾ ̾ ߽ Ÿ ϰ ʴ´. + // 뱀파이어가 사용했을 경우 뱀파이어는 중심 타일을 제외하고는 맞지 않는다. Vampire* pVampire = dynamic_cast(pCreature); ::setDamage(pVampire, m_Damage, pCastCreature, SKILL_DRAGON_TORNADO, &gcSkillToObjectOK6, &gcAttackerMI); @@ -189,7 +189,7 @@ void EffectDragonTornado::affect(Creature* pCreature) if (pCastCreature != NULL) pMonster->addEnemy(pCastCreature); - // delay ( + 1 ) + // delay설정 ( + 1초 ) if (!pMonster->isMaster() && isStun) { Timeval delay; delay.tv_sec = 1; @@ -200,7 +200,7 @@ void EffectDragonTornado::affect(Creature* pCreature) SkillType_t skillType = (isStun) ? SKILL_DRAGON_TORNADO : SKILL_ATTACK_MELEE; - // user״ ´ ش. + // user한테는 맞는 모습을 보여준다. if (pCreature->isPC()) { gcSkillToObjectOK6.setSkillType(skillType); gcSkillToObjectOK6.setDuration(0); diff --git a/src/server/gameserver/skill/EffectDragonTornado.h b/src/server/gameserver/skill/EffectDragonTornado.h index 79cb5878..3190f11c 100644 --- a/src/server/gameserver/skill/EffectDragonTornado.h +++ b/src/server/gameserver/skill/EffectDragonTornado.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectDragonTornado.h // Written by : elca@ewestsoft.com -// Description : DragonTornado Effect óֱ Ŭ̴. +// Description : 성직마법 DragonTornado의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_DRAGON_TORNADO__ diff --git a/src/server/gameserver/skill/EffectDummyDrake.cpp b/src/server/gameserver/skill/EffectDummyDrake.cpp index 38eb79d3..120194aa 100644 --- a/src/server/gameserver/skill/EffectDummyDrake.cpp +++ b/src/server/gameserver/skill/EffectDummyDrake.cpp @@ -165,9 +165,9 @@ void EffectDummyDrake::unaffect() // cout << "EffectDummyDrake" << "unaffect BEGIN" << endl; Creature* pCreature = dynamic_cast(m_pTarget); - // ȡ5*5Χڶ,˺ + // ¶ÁÈ¡5*5·¶Î§ÄÚ¶ÔÏó,²¢´´½¨É˺¦ // Creature* pCreature = dynamic_cast(m_pTarget); - // Ŀ˺ + // ´´½¨Ä¿±êÉ˺¦ affect(pCreature); int cx = pCreature->getX(); @@ -196,7 +196,7 @@ void EffectDummyDrake::unaffect() continue; if (pTargetCreature->isFlag(getEffectClass())) continue; - // ˺ + // ´´½¨É˺¦ affect(pTargetCreature); // EffectDummyDrake* pEffect = new EffectDummyDrake( pTargetCreature ); // pEffect->setUserOID( m_UserOID ); diff --git a/src/server/gameserver/skill/EffectDummyDrake.h b/src/server/gameserver/skill/EffectDummyDrake.h index 8b13a3c4..b86e9f5a 100644 --- a/src/server/gameserver/skill/EffectDummyDrake.h +++ b/src/server/gameserver/skill/EffectDummyDrake.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectDummyDrake.h // Written by : elca@ewestsoft.com -// Description : DummyDrake Effect óֱ Ŭ̴. +// Description : 성직마법 DummyDrake의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_DUMMY_DRAKE__ diff --git a/src/server/gameserver/skill/EffectEnergyDrop.cpp b/src/server/gameserver/skill/EffectEnergyDrop.cpp index 48607a46..5f6b7c6f 100644 --- a/src/server/gameserver/skill/EffectEnergyDrop.cpp +++ b/src/server/gameserver/skill/EffectEnergyDrop.cpp @@ -2,16 +2,16 @@ // Project : DARKEDEN // Module : Skill - Effect // File Name : EffectEnergyDrop.cpp -// Writer : ȫâ +// Writer : 장홍창 // Date : 2002.3.28 // Description : -// ش Effect Energy Drop Effect ϱ -// Effect̴. +// 해당 Effect는 Energy Drop이 땅으로 떨어질때의 Effect를 구현하기 +// 위한 Effect이다. // // History // DATE WRITER DESCRIPTION // =========== =========== ===================================================== -// 2002.3.28 ȫâ source file ۼ +// 2002.3.28 장홍창 source file 작성 // #include "EffectEnergyDrop.h" @@ -52,13 +52,13 @@ bool EffectEnergyDrop::affectCreature(Creature* pTargetCreature, bool bAffectByM Assert(pTargetCreature != NULL); - // 뿡 ̹ poison Ʈ ɷ ִ 쿡 ɸ ʴ´. + // 상대에게 이미 poison 이펙트가 걸려져 있는 경우에는 걸리지 않는다. if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_ENERGY_DROP_TO_CREATURE)) { // cout << "EffectEnergyDrop " << "affectCreature End(Already Effected) " << endl; return false; } - // üũ + // 안전지대 체크 // 2003.1.10 by bezz, Sequoia if (!checkZoneLevelToHitTarget(pTargetCreature)) { return false; @@ -66,42 +66,42 @@ bool EffectEnergyDrop::affectCreature(Creature* pTargetCreature, bool bAffectByM Zone* pZone = pTargetCreature->getZone(); - // 濡 ĥ Ѵ. + // 상대방에게 미칠 독 데미지를 계산한다. int DropDamage = computeMagicDamage(pTargetCreature, m_Damage, SKILL_ENERGY_DROP); // cout << "EffectEnergyDrop(Damage:" << DropDamage << ") Affected" << endl; if (DropDamage > 0) { - // Ʈ ؼ, Ÿ ũĿ ̰, ÷׸ ش. - - // EnergyDrop Effect  ʴ´. ٸ Effeect - // ö󰥼 Duration ϰ ǰ ̿ Effect ̰ - // , --Drop, --Storm ϴ Ǹ ش - // ϰ ǰ, ð ִ ƴ϶ - // 3ؼ ְ ȴ. ִ Լ ߵ ܰ - // Deadline tick ؼ Ƿ Ͽ. - // 1.6 ȿ 0.5 ְ Ǹ, 3 ְ ȴ. - // ⼭ ϵڵ Ǿ ִµ, ̴ ٸ üǾ . - // EffectEnergyDrop Class member variable + // 포이즌 이펙트를 생성해서, 타겟 크리쳐에 붙이고, 플래그를 켜준다. + + // 현제는 EnergyDrop Effect를 지속적으로 운영하지 않는다. 다른 Effeect기술의 + // 경우 시전자의 레벨이 올라갈수록 Duration이 증가하게 되고 이에 대한 Effect를 붙이게 + // 되지만, --Drop, --Storm류의 기술은 일단 성공이 되면 해당 구역의 모든 사람이 + // 기술을 당하게 되고, 각각 시간으로 데미지를 주는 것이 아니라 일정량의 데미지를 + // 3등분해서 주게 된다. 몇번의 데미지를 주는 함수는 아직 개발되지 않은 단계라서 + // Deadline과 tick을 사용해서 임의로 구현을 하였다. + // 1.6초 동안에 0.5초 간격으로 데미지를 주게 되면, 3번의 데미지를 줄 수 있게 된다. + // 여기서는 하드코딩이 되어 있는데, 이는 다른 방법으로 교체되어야 할 거 같다. + // EffectEnergyDrop Class에 member variable로 // m_Tick // m_Count - // ξ ̸ deadline ؼ Ѵٸ ̴. + // 를 두어서 이를 바탕으로 deadline을 계산해서 적용한다면 더욱 더 편할 것이다. EffectEnergyDropToCreature* pEffectEnergyDropToCreature = new EffectEnergyDropToCreature(pTargetCreature); - // 켱 ý Ͽ ̸ Ƽ ̵ ִ´. + // 우선권 시스템을 위하여 이름과 파티 아이디를 넣는다. // pEffectEnergyDropToCreature->setCasterName(m_CasterName); // pEffectEnergyDropToCreature->setPartyID(m_PartyID); pEffectEnergyDropToCreature->setUserObjectID(m_UserObjectID); pEffectEnergyDropToCreature->setLevel(m_Level); pEffectEnergyDropToCreature->setPoint(DropDamage / 3); - pEffectEnergyDropToCreature->setDeadline(16); // ̺κ ٲ Ѵ. - pEffectEnergyDropToCreature->setTick(5); // ̺κе ٲ Ѵ. + pEffectEnergyDropToCreature->setDeadline(16); // 이부분 바꿔야 한다. + pEffectEnergyDropToCreature->setTick(5); // 이부분도 바꿔야 한다. pEffectEnergyDropToCreature->affect(pTargetCreature); pTargetCreature->addEffect(pEffectEnergyDropToCreature); pTargetCreature->setFlag(Effect::EFFECT_CLASS_ENERGY_DROP_TO_CREATURE); - // Ʈ پٰ ֺ ˷ش. + // 이펙트가 붙었다고 주변에 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_ENERGY_DROP_TO_CREATURE); diff --git a/src/server/gameserver/skill/EffectEnergyDrop.h b/src/server/gameserver/skill/EffectEnergyDrop.h index a52b52e0..526ed97e 100644 --- a/src/server/gameserver/skill/EffectEnergyDrop.h +++ b/src/server/gameserver/skill/EffectEnergyDrop.h @@ -2,16 +2,16 @@ // Project : DARKEDEN // Module : Skill - Effect // File Name : EffectEnergyDrop.h -// Writer : ȫâ +// Writer : 장홍창 // Date : 2002.3.28 // Description : -// ش Effect Energy Drop Effect ϱ -// Effect̴. +// 해당 Effect는 Energy Drop이 땅으로 떨어질때의 Effect를 구현하기 +// 위한 Effect이다. // // History // DATE WRITER DESCRIPTION // =========== =========== ===================================================== -// 2002.3.28 ȫâ header file ۼ +// 2002.3.28 장홍창 header file 작성 // // @@ -85,7 +85,7 @@ class EffectEnergyDrop : public Effect { Turn_t m_Tick; // EffectEnergyDrop turn; int m_Level; // EffectEnergyDrop level; Duration_t m_Duration; // EffectEnergyDrop Duration; - Duration_t m_StormDuration; // EnergyDrop Effect ð + Duration_t m_StormDuration; // EnergyDrop Effect 지속 시간 }; class EffectEnergyDropLoader : public EffectLoader { diff --git a/src/server/gameserver/skill/EffectEnergyDropToCreature.cpp b/src/server/gameserver/skill/EffectEnergyDropToCreature.cpp index 3b05e423..9f7c6e6a 100644 --- a/src/server/gameserver/skill/EffectEnergyDropToCreature.cpp +++ b/src/server/gameserver/skill/EffectEnergyDropToCreature.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectEnergyDropToCreature.cpp -// Written by : ȫâ +// Written by : 장홍창 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -61,18 +61,18 @@ void EffectEnergyDropToCreature::affect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ڸ ´. - // !! ̹ Ƿ NULL ִ. + // 이펙트 사용자를 가져온다. + // !! 이미 존을 나갔을 수 있으므로 NULL 이 될 수 있다. // by bezz. 2003.1.4 Creature* pCastCreature = pZone->getCreature(m_UserObjectID); - // EffectEnergyDropToCreature AcidStorm, PoisonStorm, BloodyStorm ٴ´. - // ̴ 3 ְ . + // EffectEnergyDropToCreature은 AcidStorm, PoisonStorm, BloodyStorm위를 지나갈때 붙는다. + // 이는 3번의 연속 데미지를 주고 사라진다. Damage_t DropDamage = m_Point; if (!(pZone->getZoneLevel() & COMPLETE_SAFE_ZONE) - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 && canAttack(pCastCreature, pCreature) && !pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -101,10 +101,10 @@ void EffectEnergyDropToCreature::affect(Creature* pCreature) setDamage(pMonster, DropDamage, pCastCreature, SKILL_ENERGY_DROP); } - // m_CasterName pCreature KillCount ó + // m_CasterName이 pCreature를 죽인 경우의 KillCount 처리 // by sigi. 2002.9.9 - // set damage ҷ óѴ. - // by bezz. 2002.12.31 ٽ ּ ó + // set damage를 불러서 처리한다. + // by bezz. 2002.12.31 다시 주석 처리 /* if (pCreature->isDead()) { Creature* pAttacker = pZone->getCreature( m_CasterName ); @@ -146,7 +146,7 @@ void EffectEnergyDropToCreature::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_ENERGY_DROP_TO_CREATURE); diff --git a/src/server/gameserver/skill/EffectEnergyDropToCreature.h b/src/server/gameserver/skill/EffectEnergyDropToCreature.h index 273c541d..8a8f73e2 100644 --- a/src/server/gameserver/skill/EffectEnergyDropToCreature.h +++ b/src/server/gameserver/skill/EffectEnergyDropToCreature.h @@ -1,20 +1,20 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectEnergyDropToCreature.h -// Written by : ȫâ +// Written by : 장홍창 // Date : 2002. 3. 28 // -// Description : EffectEnergyDropToCreature 濡 3 Ÿ -// ִ Ʈ̴. -// Effect ø Tick deadline ؼ -// ֵ Ǿ ٸ Effect -// ״ ͼ ִ. -// EffectEnergyDropToCreature EffectPoison · -// Ǿ ִ. +// Description : EffectEnergyDropToCreature는 상대방에게 3번의 연속 타격을 +// 주는 이펙트이다. +// Effect 시리즈는 Tick과 deadline을 사용해서 임의의 동작을 +// 할 수 있도록 구현되었기 때문에 다른 기술의 Effect +// 글 그대로 가져와서 사용할 수 있다. +// 실제 EffectEnergyDropToCreature도 EffectPoison과 같은 형태로 +// 되어 있다. // -// EffectEnergyDropToCreature DZ ؼ -// Effect.h Ͽ +// EffectEnergyDropToCreature가 사용되기 위해서는 +// Effect.h 파일에 // EFFECT_CLASS_ENERGY_DROP_TO_CREATURE -// ǵǾ ־ Ѵ. +// 가 정의되어 있어야 한다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_ENERGY_DROP_TO_CREATURE__ diff --git a/src/server/gameserver/skill/EffectEternity.cpp b/src/server/gameserver/skill/EffectEternity.cpp index ed92b7bb..79e842b6 100644 --- a/src/server/gameserver/skill/EffectEternity.cpp +++ b/src/server/gameserver/skill/EffectEternity.cpp @@ -72,7 +72,7 @@ void EffectEternity::unaffect(Creature* pCreature) if (!pSlayer->isFlag(Effect::EFFECT_CLASS_COMA)) return; - // ŸϿٰ Ʈ ٿش. + // 타일에다가 이펙트를 붙여준다. GCAddEffectToTile gcAddEffect; gcAddEffect.setEffectID(Effect::EFFECT_CLASS_ETERNITY); gcAddEffect.setXY(pSlayer->getX(), pSlayer->getY()); @@ -88,7 +88,7 @@ void EffectEternity::unaffect(Creature* pCreature) pSlayer->setHP(NewHP); - // ڸ Ʈ ưٰ ˷ش. + // 코마 이펙트가 날아갔다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); gcRemoveEffect.addEffectList((EffectID_t)Effect::EFFECT_CLASS_COMA); @@ -99,7 +99,7 @@ void EffectEternity::unaffect(Creature* pCreature) gcHP.setCurrentHP(pSlayer->getHP()); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcHP); - // Ʈ ٽ ش. + // 이펙트들을 다시 보내준다. pSlayer->getEffectManager()->sendEffectInfo(pSlayer, pZone, pSlayer->getX(), pSlayer->getY()); addSimpleCreatureEffect(pSlayer, Effect::EFFECT_CLASS_NO_DAMAGE, 30, false); diff --git a/src/server/gameserver/skill/EffectEvade.cpp b/src/server/gameserver/skill/EffectEvade.cpp index 2b197b57..939be11b 100644 --- a/src/server/gameserver/skill/EffectEvade.cpp +++ b/src/server/gameserver/skill/EffectEvade.cpp @@ -36,7 +36,7 @@ void EffectEvade::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_EVADE); Zone* pZone = pCreature->getZone(); @@ -52,7 +52,7 @@ void EffectEvade::unaffect(Creature* pCreature) pTargetOusters->sendRealWearingInfo(); pTargetOusters->sendModifyInfo(prev); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_EVADE); diff --git a/src/server/gameserver/skill/EffectExpansion.cpp b/src/server/gameserver/skill/EffectExpansion.cpp index a91169c6..9d49a1fa 100644 --- a/src/server/gameserver/skill/EffectExpansion.cpp +++ b/src/server/gameserver/skill/EffectExpansion.cpp @@ -90,13 +90,13 @@ void EffectExpansion::unaffect(Creature* pCreature) pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_EXPANSION); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcRemoveEffect); - // ִ ü ִ üº ũٸ, ٿ Ѵ. + // 현재 남아있는 체력이 최대 체력보다 크다면, 줄여야 한다. if (pSlayer->getHP(ATTR_CURRENT) > pSlayer->getHP(ATTR_MAX)) { pSlayer->setHP(pSlayer->getHP(ATTR_MAX), ATTR_CURRENT); } diff --git a/src/server/gameserver/skill/EffectExtreme.cpp b/src/server/gameserver/skill/EffectExtreme.cpp index 48b34a5e..e7c08df7 100644 --- a/src/server/gameserver/skill/EffectExtreme.cpp +++ b/src/server/gameserver/skill/EffectExtreme.cpp @@ -70,7 +70,7 @@ void EffectExtreme::unaffect(Creature* pCreature) Zone* pZone = pVampire->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pVampire->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_EXTREME); diff --git a/src/server/gameserver/skill/EffectFadeOut.cpp b/src/server/gameserver/skill/EffectFadeOut.cpp index 0ccb3ca1..24f21500 100644 --- a/src/server/gameserver/skill/EffectFadeOut.cpp +++ b/src/server/gameserver/skill/EffectFadeOut.cpp @@ -2,8 +2,8 @@ // Filename : EffectFadeOut.cpp // Written by : elca // Description : -// α Sniping Ǵ ̾ Invisibility ؼ -// ִ( ִ) ũĿ ٴ Ʈ̴. +// 군인기술 Sniping 또는 뱀파이어 기술 Invisibility로 인해서 +// 현재 점점 희미해져가고 있는(사라지고 있는) 크리쳐에 붙는 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #include "EffectFadeOut.h" @@ -64,9 +64,9 @@ void EffectFadeOut::unaffect(Creature* pCreature) ZoneCoord_t y = pCreature->getY(); pCreature->removeFlag(Effect::EFFECT_CLASS_FADE_OUT); - // α Sniping ̶... + // 군인기술 Sniping에 의한 것이라면... if (m_isSniping) { - // ̾ شȴ. + // 슬레이어만이 해당된다. Assert(pCreature->isSlayer()); Assert(pCreature->isFlag(Effect::EFFECT_CLASS_SNIPING_MODE) == false); Assert(pCreature->findEffect(Effect::EFFECT_CLASS_SNIPING_MODE) == NULL); @@ -78,7 +78,7 @@ void EffectFadeOut::unaffect(Creature* pCreature) pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_SNIPING_MODE); - // Ʈ ٿ, ɷġ Ѵ. + // 이펙트를 붙였으니, 능력치를 재계산한다. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); @@ -87,16 +87,16 @@ void EffectFadeOut::unaffect(Creature* pCreature) addSnipingModeCreature(pZone, pCreature, x, y); } - // ̾ Invisibility ̶... + // 뱀파이어 기술 Invisibility에 의한 것이라면... else { - // ̾ ͸ شȴ. + // 뱀파이어나 몬스터만이 해당된다. Assert(pCreature->isVampire() || pCreature->isMonster()); Assert(pCreature->isFlag(Effect::EFFECT_CLASS_INVISIBILITY) == false); Assert(pCreature->findEffect(Effect::EFFECT_CLASS_INVISIBILITY) == NULL); EffectInvisibility* pEffect = new EffectInvisibility(pCreature); pEffect->setNextTime(10); - pEffect->setDeadline(99999999); // ̴. + pEffect->setDeadline(99999999); // 무한이다. pCreature->addEffect(pEffect); addInvisibleCreature(pZone, pCreature, x, y); diff --git a/src/server/gameserver/skill/EffectFadeOut.h b/src/server/gameserver/skill/EffectFadeOut.h index 5ba85c6b..6a5cb70f 100644 --- a/src/server/gameserver/skill/EffectFadeOut.h +++ b/src/server/gameserver/skill/EffectFadeOut.h @@ -2,8 +2,8 @@ // Filename : EffectFadeOut.h // Written by : elca@ewestsoft.com // Description : -// α Sniping Ǵ ̾ Invisibility ؼ -// ִ( ִ) ũĿ ٴ Ʈ̴. +// 군인기술 Sniping 또는 뱀파이어 기술 Invisibility로 인해서 +// 현재 점점 희미해져가고 있는(사라지고 있는) 크리쳐에 붙는 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_FADE_OUT__ diff --git a/src/server/gameserver/skill/EffectFierceFlame.h b/src/server/gameserver/skill/EffectFierceFlame.h index d0250376..236f43d5 100644 --- a/src/server/gameserver/skill/EffectFierceFlame.h +++ b/src/server/gameserver/skill/EffectFierceFlame.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectFierceFlame.h // Written by : elca@ewestsoft.com -// Description : FierceFlame Effect óֱ Ŭ̴. +// Description : 성직마법 FierceFlame의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_FIRECE_FLAME__ diff --git a/src/server/gameserver/skill/EffectFireMeteor.cpp b/src/server/gameserver/skill/EffectFireMeteor.cpp index 090f573e..290111c0 100644 --- a/src/server/gameserver/skill/EffectFireMeteor.cpp +++ b/src/server/gameserver/skill/EffectFireMeteor.cpp @@ -111,7 +111,7 @@ void EffectFireMeteor::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_Fire_Meteor); diff --git a/src/server/gameserver/skill/EffectFlare.cpp b/src/server/gameserver/skill/EffectFlare.cpp index 30901295..1b1337f4 100644 --- a/src/server/gameserver/skill/EffectFlare.cpp +++ b/src/server/gameserver/skill/EffectFlare.cpp @@ -46,8 +46,8 @@ void EffectFlare::affect(Creature* pCreature) __BEGIN_TRY Assert(pCreature != NULL); - Assert(!pCreature->isSlayer()); // ̾ ɸ ʴ´. - Assert(!pCreature->isNPC()); // NPC ɸ ʴ´. + Assert(!pCreature->isSlayer()); // 슬레이어는 걸리지 않는다. + Assert(!pCreature->isNPC()); // NPC도 걸리지 않는다. Sight_t OldSight = pCreature->getSight(); pCreature->setSight(pCreature->getEffectedSight()); @@ -111,14 +111,14 @@ void EffectFlare::unaffect(Creature* pCreature) } else if (pCreature->isMonster()) { Monster* pMonster = dynamic_cast(pCreature); - // þ߸ ش. + // 시야를 새로 세팅해준다. const MonsterInfo* pMonsterInfo = g_pMonsterInfoManager->getMonsterInfo(pMonster->getMonsterType()); pMonster->setSight(pMonsterInfo->getSight()); - // þ߸ ˻ؾ ϴµ... + // 시야를 새로 세팅했으니 주위의 적을 검색해야 하는데... } - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_FLARE); diff --git a/src/server/gameserver/skill/EffectFrozenArmor.cpp b/src/server/gameserver/skill/EffectFrozenArmor.cpp index 2b3c294b..2a877915 100644 --- a/src/server/gameserver/skill/EffectFrozenArmor.cpp +++ b/src/server/gameserver/skill/EffectFrozenArmor.cpp @@ -36,7 +36,7 @@ void EffectFrozenArmor::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_FROZEN_ARMOR); Zone* pZone = pCreature->getZone(); @@ -45,7 +45,7 @@ void EffectFrozenArmor::unaffect(Creature* pCreature) Ousters* pTargetOusters = dynamic_cast(pCreature); Assert(pTargetOusters != NULL); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_FROZEN_ARMOR); diff --git a/src/server/gameserver/skill/EffectFuryOfGnome.h b/src/server/gameserver/skill/EffectFuryOfGnome.h index c9aafcb9..79ba8a2e 100644 --- a/src/server/gameserver/skill/EffectFuryOfGnome.h +++ b/src/server/gameserver/skill/EffectFuryOfGnome.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectFuryOfGnome.h // Written by : elca@ewestsoft.com -// Description : FuryOfGnome Effect óֱ Ŭ̴. +// Description : 성직마법 FuryOfGnome의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_FURY_OF_GNOME__ diff --git a/src/server/gameserver/skill/EffectFuryOfGnomeMark.h b/src/server/gameserver/skill/EffectFuryOfGnomeMark.h index 3c6e0eb8..6f85e549 100644 --- a/src/server/gameserver/skill/EffectFuryOfGnomeMark.h +++ b/src/server/gameserver/skill/EffectFuryOfGnomeMark.h @@ -2,7 +2,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectFuryOfGnomeMark.h // Written by : elca@ewestsoft.com -// Description : FuryOfGnomeMark Effect óֱ Ŭ̴. +// Description : 성직마법 FuryOfGnomeMark의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_FURY_OF_GNOME_MARK__ diff --git a/src/server/gameserver/skill/EffectGhostBlade.cpp b/src/server/gameserver/skill/EffectGhostBlade.cpp index b4e4243e..bbf21368 100644 --- a/src/server/gameserver/skill/EffectGhostBlade.cpp +++ b/src/server/gameserver/skill/EffectGhostBlade.cpp @@ -80,7 +80,7 @@ void EffectGhostBlade::unaffect(Creature* pCreature) pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_GHOST_BLADE); diff --git a/src/server/gameserver/skill/EffectGnomesWhisper.cpp b/src/server/gameserver/skill/EffectGnomesWhisper.cpp index 817f9cae..d5829c94 100644 --- a/src/server/gameserver/skill/EffectGnomesWhisper.cpp +++ b/src/server/gameserver/skill/EffectGnomesWhisper.cpp @@ -36,7 +36,7 @@ void EffectGnomesWhisper::unaffect(Creature* pCreature) Assert(pCreature != NULL); // Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_GNOMES_WHISPER); Zone* pZone = pCreature->getZone(); @@ -47,7 +47,7 @@ void EffectGnomesWhisper::unaffect(Creature* pCreature) // Ousters* pTargetOusters = dynamic_cast(pCreature); // Assert( pTargetOusters != NULL ); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_GNOMES_WHISPER); diff --git a/src/server/gameserver/skill/EffectGrayDarkness.cpp b/src/server/gameserver/skill/EffectGrayDarkness.cpp index 8aec2604..28f1b60e 100644 --- a/src/server/gameserver/skill/EffectGrayDarkness.cpp +++ b/src/server/gameserver/skill/EffectGrayDarkness.cpp @@ -28,10 +28,10 @@ EffectGrayDarkness::EffectGrayDarkness(Zone* pZone, ZoneCoord_t ZoneX, ZoneCoord ////////////////////////////////////////////////////////////////////////////// // EffectGrayDarkness::affectCreature() -// bAffectByMove false ڸ ϴ ̹Ƿ.. -// ܺ SkillOK modify info . GCModifyInformation -// ʿ䰡 . -// pTarget þ߰ true return +// bAffectByMove가 false면 제자리에서 당하는 것이므로.. +// 외부의 SkillOK에서 modify info를 보낸다. 따라서 GCModifyInformation을 +// 보낼 필요가 없다. +// pTarget의 시야가 변한 경우 true를 return ////////////////////////////////////////////////////////////////////////////// /*bool EffectGrayDarkness::affectObject(Object* pTarget, bool bAffectByMove) @@ -42,12 +42,12 @@ EffectGrayDarkness::EffectGrayDarkness(Zone* pZone, ZoneCoord_t ZoneX, ZoneCoord if (pTarget->getObjectClass() == Object::OBJECT_CLASS_CREATURE) { Creature* pTargetCreature = dynamic_cast(pTarget); - // ̹ ɷִ 쿡 ٽ ʴ´. + // 이미 걸려있는 경우에는 다시 걸지 않는다. if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_GRAY_DARKNESS)) { return false; } - // ̾ 쿡 ɸ. + // 슬레이어일 경우에만 걸린다. if (pTargetCreature->isSlayer()||pTargetCreature->isOusters()) { bAffected = true; diff --git a/src/server/gameserver/skill/EffectGrayDarkness.h b/src/server/gameserver/skill/EffectGrayDarkness.h index 9dc8201b..4cac918d 100644 --- a/src/server/gameserver/skill/EffectGrayDarkness.h +++ b/src/server/gameserver/skill/EffectGrayDarkness.h @@ -73,7 +73,7 @@ class EffectGrayDarkness : public Effect { private: Attr_t m_Level; Duration_t m_Duration; - Timeval m_StartTime; // ۵ ð. + Timeval m_StartTime; // 기술이 시작된 시간. }; /*class EffectGrayDarknessLoader : public EffectLoader diff --git a/src/server/gameserver/skill/EffectGreenPoison.cpp b/src/server/gameserver/skill/EffectGreenPoison.cpp index 9e9e7660..dc4f9284 100644 --- a/src/server/gameserver/skill/EffectGreenPoison.cpp +++ b/src/server/gameserver/skill/EffectGreenPoison.cpp @@ -40,13 +40,13 @@ bool EffectGreenPoison::affectCreature(Creature* pTargetCreature, bool bAffectBy Assert(pTargetCreature != NULL); - // 뿡 ̹ poison Ʈ ɷ ִ 쿡 ɸ ʴ´. + // 상대에게 이미 poison 이펙트가 걸려져 있는 경우에는 걸리지 않는다. if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_POISON)) { // cout << "EffectGreenPoison " << "affectCreature End " << endl; return false; } - // üũѴ. + // 안전지대인지 체크한다. // 2003.1.10 by bezz.Sequoia if (!checkZoneLevelToHitTarget(pTargetCreature)) { return false; @@ -55,22 +55,22 @@ bool EffectGreenPoison::affectCreature(Creature* pTargetCreature, bool bAffectBy Zone* pZone = pTargetCreature->getZone(); Creature* pAttacker = pZone->getCreature(m_UserObjectID); - // 濡 ĥ Ѵ. + // 상대방에게 미칠 독 데미지를 계산한다. int PoisonDamage = computeMagicDamage(pTargetCreature, m_Damage, SKILL_GREEN_POISON, m_bVampire, pAttacker); if (PoisonDamage > 0) { - // Ʈ ؼ, Ÿ ũĿ ̰, ÷׸ ش. + // 포이즌 이펙트를 생성해서, 타겟 크리쳐에 붙이고, 플래그를 켜준다. EffectPoison* pEffectPoison = new EffectPoison(pTargetCreature); pEffectPoison->setLevel(m_Level); pEffectPoison->setPoint(PoisonDamage); - pEffectPoison->setDeadline(m_Duration); // ̺κ ٲ Ѵ. - pEffectPoison->setTick(50); // ̺κе ٲ Ѵ. + pEffectPoison->setDeadline(m_Duration); // 이부분 바꿔야 한다. + pEffectPoison->setTick(50); // 이부분도 바꿔야 한다. pEffectPoison->setUserObjectID(m_UserObjectID); pEffectPoison->affect(pTargetCreature); pTargetCreature->addEffect(pEffectPoison); pTargetCreature->setFlag(Effect::EFFECT_CLASS_POISON); - // Ʈ پٰ ֺ ˷ش. + // 이펙트가 붙었다고 주변에 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_POISON); @@ -177,7 +177,7 @@ void EffectGreenPoisonLoader::load(Zone* pZone) pEffect->setNextTime(value2); pEffect->setDamage(value3); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->registerObject(pEffect); pZone->addEffect(pEffect); tile.addEffect(pEffect); diff --git a/src/server/gameserver/skill/EffectGreenPoison.h b/src/server/gameserver/skill/EffectGreenPoison.h index e29ebe8c..387169e7 100644 --- a/src/server/gameserver/skill/EffectGreenPoison.h +++ b/src/server/gameserver/skill/EffectGreenPoison.h @@ -66,9 +66,9 @@ class EffectGreenPoison : public Effect { bool affectCreature(Creature* pCreature, bool bAffectByMove); private: - int m_Level; // MagicLevel - Damage_t m_Damage; // - Duration_t m_Duration; // ð + int m_Level; // 마법의 MagicLevel + Damage_t m_Damage; // 마법의 데미지 + Duration_t m_Duration; // 마법의 지속 시간 ObjectID_t m_UserObjectID; bool m_bVampire; }; diff --git a/src/server/gameserver/skill/EffectGreenStalker.cpp b/src/server/gameserver/skill/EffectGreenStalker.cpp index df1c1fb1..402602b8 100644 --- a/src/server/gameserver/skill/EffectGreenStalker.cpp +++ b/src/server/gameserver/skill/EffectGreenStalker.cpp @@ -62,8 +62,8 @@ void EffectGreenStalker::affect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // ڸ ´. - // !! ̹ Ƿ NULL ִ. + // 기술 사용자를 가져온다. + // !! 이미 존을 나갔을 수 있으므로 NULL 이 될 수 있다. // by bezz. 2003.1.4 Creature* pCastCreature = pZone->getCreature(m_UserObjectID); @@ -75,9 +75,9 @@ void EffectGreenStalker::affect(Creature* pCreature) int PoisonDamage = computeMagicDamage(pCreature, m_Damage, SKILL_GREEN_STALKER, m_bVampire, pCastCreature); - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 if (canAttack(pCastCreature, pCreature) && !pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { - // ̾ 쿡 Ѵ. + // 슬레이어일 경우에만 독 데미지가 존재한다. if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); Assert(pSlayer != NULL); @@ -115,7 +115,7 @@ void EffectGreenStalker::affect(Creature* pCreature) ::setDamage(pMonster, PoisonDamage, pCastCreature, SKILL_GREEN_STALKER); } - // m_CasterName pCreature KillCount ó + // m_CasterName이 pCreature를 죽인 경우의 KillCount 처리 // by sigi. 2002.9.9 /* if (pCreature->isDead()) { @@ -156,13 +156,13 @@ void EffectGreenStalker::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ũĿԼ ÷׸ Ѵ. + // 크리쳐에게서 플래그를 제거한다. pCreature->removeFlag(Effect::EFFECT_CLASS_GREEN_STALKER); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 존에서 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_GREEN_STALKER); diff --git a/src/server/gameserver/skill/EffectGroundAttack.cpp b/src/server/gameserver/skill/EffectGroundAttack.cpp index 2925086a..fe56e057 100644 --- a/src/server/gameserver/skill/EffectGroundAttack.cpp +++ b/src/server/gameserver/skill/EffectGroundAttack.cpp @@ -78,8 +78,8 @@ void EffectGroundAttack::unaffect() // cout << "EffectGroundAttack" << "unaffect BEGIN" << endl; Assert(m_pZone != NULL); - // ڸ ´. - // !! ̹ Ƿ NULL մ. + // 시전자를 가져온다. + // !! 이미 존을 나갔을 수 있으므로 NULL이 될 수 잇다. // by bezz. 2003.1.4 Creature* pCastCreature = m_pZone->getCreature(m_UserObjectID); @@ -90,8 +90,8 @@ void EffectGroundAttack::unaffect() VSRect rect(0, 0, m_pZone->getWidth() - 1, m_pZone->getHeight() - 1); - // Ʈ پִ Ÿ ޾ƿ´. - // ߽Ÿ + ÷ Ÿ + // 현재 이펙트가 붙어있는 타일을 받아온다. + // 중심타일 + 스플래쉬 타일 for (int x = -1; x <= 1; x++) { for (int y = -1; y <= 1; y++) { int X = m_X + x; @@ -101,12 +101,12 @@ void EffectGroundAttack::unaffect() continue; Tile& tile = m_pZone->getTile(X, Y); - //  100% - // 50% damage + // 가운데는 100% + // 주위에는 50% damage bool bCenterEffect = (x == 0 && y == 0); int DamagePercent = (bCenterEffect ? m_DamagePercent : (m_DamagePercent >> 1)); - // Ÿ ȿ ϴ Ʈ ˻Ѵ. + // 타일 안에 존재하는 오브젝트들을 검색한다. const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { @@ -119,7 +119,7 @@ void EffectGroundAttack::unaffect() Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 if (!canAttack(pCastCreature, pCreature)) { continue; } @@ -169,10 +169,10 @@ void EffectGroundAttack::unaffect() ::setDamage(pMonster, Damage, pCastCreature, SKILL_GROUND_ATTACK); } - // user״ ´ ش. + // user한테는 맞는 모습을 보여준다. if (pCreature->isPC()) { GCSkillToObjectOK2 gcSkillToObjectOK2; - gcSkillToObjectOK2.setObjectID(1); // ǹ . + gcSkillToObjectOK2.setObjectID(1); // 의미 없다. gcSkillToObjectOK2.setSkillType(SKILL_ATTACK_MELEE); gcSkillToObjectOK2.setDuration(0); pCreature->getPlayer()->sendPacket(&gcSkillToObjectOK2); @@ -184,7 +184,7 @@ void EffectGroundAttack::unaffect() gcSkillToObjectOK4.setDuration(0); m_pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcSkillToObjectOK4, pCreature); - // m_CasterName pCreature KillCount ó + // m_CasterName이 pCreature를 죽인 경우의 KillCount 처리 // by sigi. 2002.8.31 /* if (pCreature->isDead()) { diff --git a/src/server/gameserver/skill/EffectGroundAttack.h b/src/server/gameserver/skill/EffectGroundAttack.h index 3bb56b52..faee1e79 100644 --- a/src/server/gameserver/skill/EffectGroundAttack.h +++ b/src/server/gameserver/skill/EffectGroundAttack.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectGroundAttack.h // Written by : elca@ewestsoft.com -// Description : GroundAttack Effect óֱ Ŭ̴. +// Description : 성직마법 GroundAttack의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_GROUND_ATTACK__ diff --git a/src/server/gameserver/skill/EffectGroundBless.cpp b/src/server/gameserver/skill/EffectGroundBless.cpp index de130bc5..e244b73f 100644 --- a/src/server/gameserver/skill/EffectGroundBless.cpp +++ b/src/server/gameserver/skill/EffectGroundBless.cpp @@ -36,7 +36,7 @@ void EffectGroundBless::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_GROUND_BLESS); Zone* pZone = pCreature->getZone(); @@ -47,7 +47,7 @@ void EffectGroundBless::unaffect(Creature* pCreature) pTargetOusters->initAllStatAndSend(); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_GROUND_BLESS); diff --git a/src/server/gameserver/skill/EffectGunShotGuidanceAim.cpp b/src/server/gameserver/skill/EffectGunShotGuidanceAim.cpp index 2b7be078..ea7064a3 100644 --- a/src/server/gameserver/skill/EffectGunShotGuidanceAim.cpp +++ b/src/server/gameserver/skill/EffectGunShotGuidanceAim.cpp @@ -58,11 +58,11 @@ void EffectGunShotGuidanceAim::unaffect(Creature* pCastCreature) Assert(pCastCreature != NULL); - // Ʈ ÷װ ٸ ׾ٰų ϴ transport ʰڴٴ° ǹѴ. + // 이펙트 플레그가 없다면 죽었다거나 하는 문제로 transport 하지 않겠다는걸 의미한다. if (!pCastCreature->isFlag(Effect::EFFECT_CLASS_GUN_SHOT_GUIDANCE_AIM)) return; - // Effect ְ ˸. + // Effect를 없애고 알린다. pCastCreature->removeFlag(Effect::EFFECT_CLASS_GUN_SHOT_GUIDANCE_AIM); GCRemoveEffect gcRemoveEffect; @@ -71,7 +71,7 @@ void EffectGunShotGuidanceAim::unaffect(Creature* pCastCreature) m_pZone->broadcastPacket(pCastCreature->getX(), pCastCreature->getY(), &gcRemoveEffect); - VSRect rect(0, 0, m_pZone->getWidth() - 1, m_pZone->getHeight() - 1); // -1 ߰ by sigi. 2003.1.10 + VSRect rect(0, 0, m_pZone->getWidth() - 1, m_pZone->getHeight() - 1); // -1 추가 by sigi. 2003.1.10 bool bHit = false; Damage_t maxDamage = 0; @@ -90,7 +90,7 @@ void EffectGunShotGuidanceAim::unaffect(Creature* pCastCreature) if (!rect.ptInRect(X, Y)) continue; - // ŸϾȿ ϴ Ʈ ´. + // 타일안에 존재하는 오브젝트를 가져온다. Tile& tile = m_pZone->getTile(X, Y); const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); @@ -106,7 +106,7 @@ void EffectGunShotGuidanceAim::unaffect(Creature* pCastCreature) Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // ڽ ʴ´. ´´. ̾ ʴ´. + // 자신은 맞지 않는다. 무적도 안 맞는다. 슬레이어는 맞지 않는다. if (pCreature == m_pTarget || !canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { continue; @@ -134,7 +134,7 @@ void EffectGunShotGuidanceAim::unaffect(Creature* pCastCreature) bool bHitRoll = HitRoll::isSuccess(pCastCreature, pCreature, bonus); if (bPK && bZoneLevelCheck && bHitRoll) { - // ų ʽ Ѵ. + // 원래 데미지와 스킬 데미지 보너스를 더한 최종 데미지를 구한다. Damage_t FinalDamage = 0; FinalDamage = computeDamage(pCastCreature, pCreature); FinalDamage += Damage; @@ -144,12 +144,12 @@ void EffectGunShotGuidanceAim::unaffect(Creature* pCastCreature) GCModifyInformation gcMI; ::setDamage(pCreature, FinalDamage, pCastCreature, SKILL_GUN_SHOT_GUIDANCE, - &gcMI); // ::߰ by Sequoia + &gcMI); // ::추가 by Sequoia pCreature->getPlayer()->sendPacket(&gcMI); - // ´ ش. - gcSkillToObjectOK2.setObjectID(1); // ǹ . + // 맞는 동작을 보여준다. + gcSkillToObjectOK2.setObjectID(1); // 의미 없다. gcSkillToObjectOK2.setSkillType(SKILL_ATTACK_MELEE); gcSkillToObjectOK2.setDuration(0); pCreature->getPlayer()->sendPacket(&gcSkillToObjectOK2); @@ -159,7 +159,7 @@ void EffectGunShotGuidanceAim::unaffect(Creature* pCastCreature) Monster* pMonster = dynamic_cast(pCreature); ::setDamage(pMonster, FinalDamage, pCastCreature, - SKILL_GUN_SHOT_GUIDANCE); // ::߰ by Sequoia + SKILL_GUN_SHOT_GUIDANCE); // ::추가 by Sequoia pMonster->addEnemy(pCastCreature); bHit = true; @@ -203,12 +203,12 @@ void EffectGunShotGuidanceAim::unaffect(Creature* pCastCreature) } } - // Ʈ ֵ Ѵ. + // 포격 이펙트를 보여주도록 한다. GCAddEffectToTile gcAddEffectToTile; gcAddEffectToTile.setObjectID(pCastCreature->getObjectID()); gcAddEffectToTile.setEffectID(Effect::EFFECT_CLASS_GUN_SHOT_GUIDANCE_FIRE); gcAddEffectToTile.setXY(m_X, m_Y); - gcAddEffectToTile.setDuration(10); // ǹ̾. 1 + gcAddEffectToTile.setDuration(10); // 별 의미없다. 걍 1초 m_pZone->broadcastPacket(m_X, m_Y, &gcAddEffectToTile); @@ -229,8 +229,8 @@ void EffectGunShotGuidanceAim::unaffect() if (m_pZone != NULL && m_pZone == pCreature->getZone()) { unaffect(pCreature); } else { - // ׾ų ̵ߴٴ ǹ̹Ƿ Ʈ ְ εijѴ. - // Effect ְ ˸. + // 조준 도중 죽었거나 이동했다는 의미이므로 이펙트를 없애고 브로드캐스팅한다. + // Effect를 없애고 알린다. Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); diff --git a/src/server/gameserver/skill/EffectHallucination.cpp b/src/server/gameserver/skill/EffectHallucination.cpp index fbc412d1..c61b68a0 100644 --- a/src/server/gameserver/skill/EffectHallucination.cpp +++ b/src/server/gameserver/skill/EffectHallucination.cpp @@ -60,8 +60,8 @@ void EffectHallucination::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_HALLUCINATION); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/skill/EffectHallucination.h b/src/server/gameserver/skill/EffectHallucination.h index f7b58c1a..93ac2a79 100644 --- a/src/server/gameserver/skill/EffectHallucination.h +++ b/src/server/gameserver/skill/EffectHallucination.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectHallucination.h // Written by : -// Description : Hallucination ϰ effect +// Description : Hallucination에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_HALLUCINATION__ diff --git a/src/server/gameserver/skill/EffectHalo.h b/src/server/gameserver/skill/EffectHalo.h index c523ef56..2bbb4516 100644 --- a/src/server/gameserver/skill/EffectHalo.h +++ b/src/server/gameserver/skill/EffectHalo.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectHalo.h // Written by : elca@ewestsoft.com -// Description : Halo Effect óֱ Ŭ̴. +// Description : 성직마법 Halo의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_HALO__ diff --git a/src/server/gameserver/skill/EffectHandsOfFire.cpp b/src/server/gameserver/skill/EffectHandsOfFire.cpp index f6ab63d2..9567170a 100644 --- a/src/server/gameserver/skill/EffectHandsOfFire.cpp +++ b/src/server/gameserver/skill/EffectHandsOfFire.cpp @@ -36,7 +36,7 @@ void EffectHandsOfFire::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_HANDS_OF_FIRE); Zone* pZone = pCreature->getZone(); @@ -52,7 +52,7 @@ void EffectHandsOfFire::unaffect(Creature* pCreature) // pTargetOusters->sendRealWearingInfo(); // pTargetOusters->sendModifyInfo(prev); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_HANDS_OF_FIRE); diff --git a/src/server/gameserver/skill/EffectHarpoonBomb.cpp b/src/server/gameserver/skill/EffectHarpoonBomb.cpp index e1b4a6c4..b5e05bd4 100644 --- a/src/server/gameserver/skill/EffectHarpoonBomb.cpp +++ b/src/server/gameserver/skill/EffectHarpoonBomb.cpp @@ -76,8 +76,8 @@ void EffectHarpoonBomb::crash(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y) { Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // ڽ ʴ´ - // üũ. by sigi. 2002.9.5 + // ÀÚ½ÅÀº ¸ÂÁö ¾Ê´Â´Ù + // ¹«Àû»óÅ üũ. by sigi. 2002.9.5 if (pCreature->getObjectID() == m_UserObjectID || !canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || !checkZoneLevelToHitTarget(pCreature) || pCreature->isDead() || pCreature->isSlayer()) { @@ -131,9 +131,9 @@ void EffectHarpoonBomb::crash(Zone* pZone, ZoneCoord_t X, ZoneCoord_t Y) { pMonster->addEnemy(pCastCreature); } - // user״ ´ ش. + // userÇÑÅ×´Â ¸Â´Â ¸ð½ÀÀ» º¸¿©ÁØ´Ù. if (pCreature->isPC()) { - gcSkillToObjectOK2.setObjectID(1); // ǹ . + gcSkillToObjectOK2.setObjectID(1); // ÀÇ¹Ì ¾ø´Ù. gcSkillToObjectOK2.setSkillType(SKILL_ATTACK_MELEE); gcSkillToObjectOK2.setDuration(0); pCreature->getPlayer()->sendPacket(&gcSkillToObjectOK2); @@ -214,7 +214,7 @@ void EffectHarpoonBomb::affect() } else if (pObject->getObjectClass() == Object::OBJECT_CLASS_ITEM) { Item* pTargetItem = dynamic_cast(pObject); if (pTargetItem->getItemClass() == Item::ITEM_CLASS_CORPSE) { - // add by coffee 2006-12.29 ǹըʥ + // add by coffee 2006-12.29 ÐÞÕýǹÊÖըʥµ®Ê÷ºÍÖØÉúËþ // if( pMonster->getMonsterType() == 482 || pMonster->getMonsterType() == 673 ) continue; /* //cout << "Test2 " << endl; diff --git a/src/server/gameserver/skill/EffectHeartCatalyst.cpp b/src/server/gameserver/skill/EffectHeartCatalyst.cpp index 353cfeab..672a7391 100644 --- a/src/server/gameserver/skill/EffectHeartCatalyst.cpp +++ b/src/server/gameserver/skill/EffectHeartCatalyst.cpp @@ -19,7 +19,7 @@ EffectHeartCatalyst::EffectHeartCatalyst(Creature* pCreature) __BEGIN_TRY setTarget(pCreature); - // ѹ θ Ǵ°. ǹ̾. + // 한번 부를때마다 반전되는거. 의미없다. m_GiveExp = true; __END_CATCH @@ -115,7 +115,7 @@ void EffectHeartCatalyst::unaffect(Creature* pCreature) Zone* pZone = pSlayer->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_HEART_CATALYST); diff --git a/src/server/gameserver/skill/EffectHeavenGround.cpp b/src/server/gameserver/skill/EffectHeavenGround.cpp index 2f94cd05..f1510a99 100644 --- a/src/server/gameserver/skill/EffectHeavenGround.cpp +++ b/src/server/gameserver/skill/EffectHeavenGround.cpp @@ -43,7 +43,7 @@ void EffectHeavenGround::affect() Assert(m_pZone != NULL); // cout << "UserObejctID:" << (int)m_UserObjectID << endl; - // ȡʹüܵ + // »ñȡʹÓü¼ÄܵÄÈËÎï Creature* pCastCreature = m_pZone->getCreature(m_UserObjectID); if (pCastCreature == NULL) { @@ -53,10 +53,10 @@ void EffectHeavenGround::affect() } // Slayer* pSlayer = dynamic_cast(pSlayer); - // ȡͼ + // È¡³öµØÍ¼ Tile& tile = m_pZone->getTile(m_X, m_Y); - // ȡͼƷ + // »ñÈ¡µØÍ¼ÎïÆ·Á´±í const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { @@ -69,22 +69,22 @@ void EffectHeavenGround::affect() Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // ⵱ǰǷɹ + // ¼ì²âµ±Ç°¶ÔÏóÊÇ·ñ¿É¹¥»÷ if (!canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_ACID) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { continue; } - // ͼȼ + // ¼ì²âµØÍ¼µÈ¼¶ if (!checkZoneLevelToHitTarget(pCreature)) continue; - // ˺ + // ´´½¨É˺¦ int AcidDamage = computeMagicDamage(pCreature, m_Damage, SKILL_HEAVEN_GROUND, m_bSlayer, pCastCreature); - // еIJ + // ¿ÕÖеIJ»¹¥»÷ if (pCreature->getMoveMode() != Creature::MOVE_MODE_FLYING) { GCModifyInformation gcAttackerMI; GCModifyInformation gcDefenderMI; - // ,򲻻˺ + // Èç¹ûÊÇÈËÀà,Ôò²»»áÔì³ÉÉ˺¦ if (pCreature->isSlayer()) { continue; // setNextTime(m_Tick); @@ -115,7 +115,7 @@ void EffectHeavenGround::affect() bool modifiedAttacker = false; - // ׾ ġش. ..... + // Á×¾úÀ¸¸é °æÇèÄ¡ÁØ´Ù. À½..... // if ( pCastCreature != NULL ) // { // if (pCreature->isDead() && pCastCreature->isVampire()) @@ -124,7 +124,7 @@ void EffectHeavenGround::affect() // &gcAttackerMI); // //decreaseDurability(pSlayer, pCreature, NULL, &gcAttackerMI, &gcDefenderMI); // - // // Ÿ ̾ ƴ 쿡 ġ ÷ش. + // // Ÿ°ÙÀÌ ½½·¹À̾ ¾Æ´Ñ °æ¿ì¿¡¸¸ °æÇèÄ¡¸¦ ¿Ã·ÁÁØ´Ù. // if (!pCreature->isSlayer()) // { // // //shareAttrExp(pSlayer, AcidDamage , 1, 1, 8, _GCSkillToObjectOK1); @@ -138,7 +138,7 @@ void EffectHeavenGround::affect() // } // } - // ϱ + // ¼ºÇâ °è»êÇϱâ if (pCastCreature != NULL && pCastCreature->isPC() && pCreature->isPC()) { computeAlignmentChange(pCreature, AcidDamage, pCastCreature, &gcDefenderMI, &gcAttackerMI); modifiedAttacker = true; diff --git a/src/server/gameserver/skill/EffectHeavenGround.h b/src/server/gameserver/skill/EffectHeavenGround.h index 6b84829f..d94519df 100644 --- a/src/server/gameserver/skill/EffectHeavenGround.h +++ b/src/server/gameserver/skill/EffectHeavenGround.h @@ -70,7 +70,7 @@ class EffectHeavenGround : public Effect { Turn_t m_Tick; // EffectAcidStorm turn; int m_Level; // EffectAcidStorm level; Duration_t m_Duration; // EffectAcidStorm Duration; - Duration_t m_StormDuration; // AcidStorm Effect ð + Duration_t m_StormDuration; // AcidStorm Effect 지속 시간 ObjectID_t m_UserObjectID; bool m_bSlayer; }; diff --git a/src/server/gameserver/skill/EffectHellFire.cpp b/src/server/gameserver/skill/EffectHellFire.cpp index 4c729878..72fbba35 100644 --- a/src/server/gameserver/skill/EffectHellFire.cpp +++ b/src/server/gameserver/skill/EffectHellFire.cpp @@ -46,15 +46,15 @@ void EffectHellFire::affect() Assert(m_pZone != NULL); - // Ʈ ũĸ ´. - // !! ̹ Ƿ NULL ִ. + // 이펙트를 사용한 크리쳐를 가져온다. + // !! 이미 존을 나갔을 수도 있으므로 NULL이 될 수 있다. // by bezz. 2003.1.4 Creature* pCastCreature = m_pZone->getCreature(m_CasterID); - // Ʈ پִ Ÿ ޾ƿ´. + // 현재 이펙트가 붙어있는 타일을 받아온다. Tile& tile = m_pZone->getTile(m_X, m_Y); - // Ÿ ȿ ϴ Ʈ ˻Ѵ. + // 타일 안에 존재하는 오브젝트들을 검색한다. const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { @@ -67,24 +67,24 @@ void EffectHellFire::affect() Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // üũ. by sigi. 2002.9.5 - // 鿪. by sigi. 2002.9.13 - // ڱ ڽ̸ ´´. - // üũ + // 무적상태 체크. by sigi. 2002.9.5 + // 산 면역. by sigi. 2002.9.13 + // 자기 자신이면 안 맞는다. + // 안전지대 체크 // 2003.1.10 by bezz, Sequoia if (!canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || pCreature->getObjectID() == m_CasterID || !checkZoneLevelToHitTarget(pCreature)) { continue; } - // (--;)̸ ´´. + // 같은 조직(--;)이면 안 맞는다. if (pCreature->isOusters() && !isForce()) { continue; } if (pCreature->getMoveMode() != Creature::MOVE_MODE_FLYING && !pCreature->isFlag(Effect::EFFECT_CLASS_HELLFIRE_TO_ENEMY)) { - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectHellFireToEnemy* pEffect = new EffectHellFireToEnemy(pCreature); pEffect->setCasterOID(m_CasterID); pEffect->setDeadline(m_Duration); diff --git a/src/server/gameserver/skill/EffectHellFireToEnemy.cpp b/src/server/gameserver/skill/EffectHellFireToEnemy.cpp index bb7c0a63..b80c4661 100644 --- a/src/server/gameserver/skill/EffectHellFireToEnemy.cpp +++ b/src/server/gameserver/skill/EffectHellFireToEnemy.cpp @@ -95,7 +95,7 @@ void EffectHellFireToEnemy::unaffect(Creature* pCreature) Assert(pCreature != NULL); // Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_HELLFIRE_TO_ENEMY); Zone* pZone = pCreature->getZone(); @@ -104,7 +104,7 @@ void EffectHellFireToEnemy::unaffect(Creature* pCreature) // Ousters* pTargetOusters = dynamic_cast(pCreature); // Assert( pTargetOusters != NULL ); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_HELLFIRE_TO_ENEMY); diff --git a/src/server/gameserver/skill/EffectHeterChakram.cpp b/src/server/gameserver/skill/EffectHeterChakram.cpp index 228ebfd6..26a6b08c 100644 --- a/src/server/gameserver/skill/EffectHeterChakram.cpp +++ b/src/server/gameserver/skill/EffectHeterChakram.cpp @@ -27,7 +27,7 @@ EffectHeterChakram::EffectHeterChakram(Creature* pCreature) m_UserOID = 0; m_Damage = 0; m_Duration = 0; - // m_AttackNum = 0; // ܵ + // m_AttackNum = 0; // Êܵ½¹¥»÷´ÎÊý // m_TrageSaveHP =0; __END_CATCH @@ -67,11 +67,11 @@ void EffectHeterChakram::affect() // } // if ( CurrentHP < m_TrageSaveHP) // { - // // + // // Ôö¼ÓÆäËü¹¥»÷´ÎÊý // m_AttackNum++; // //m_TrageSaveHP = CurrentHP; // } - // ˺ + // ´´½¨É˺¦ affect(pCreature); // if (pCreature->isDead()) // { @@ -80,7 +80,7 @@ void EffectHeterChakram::affect() // if (pCreature->isSlayer()) CurrentHP = pSlayer->getHP(); // if (pCreature->isVampire()) CurrentHP = pVampire->getHP(); // if (pCreature->isMonster()) CurrentHP = pMonsterAttacker->getHP(); - // // ¼ǰHP + // // ¼Ç¼µ±Ç°HP // m_TrageSaveHP = CurrentHP; // if (m_AttackNum >=5) // { @@ -224,11 +224,11 @@ void EffectHeterChakram::unaffect() // // } - // Ŀ˺ + // ´´½¨Ä¿±êÉ˺¦ affect(pCreature); // Creature* pCreature = m_pZone->getCreature(m_pTarget); - // ȡ5*5Χڶ,˺ + // ¶ÁÈ¡5*5·¶Î§ÄÚ¶ÔÏó,²¢´´½¨É˺¦ // Creature* pCreature = dynamic_cast(m_pTarget); @@ -257,7 +257,7 @@ void EffectHeterChakram::unaffect() if (pTargetCreature == NULL || pTargetCreature->isOusters() || pTargetCreature == pCreature) continue; // if ( pTargetCreature->isFlag( getEffectClass() ) ) continue; - // ˺ + // ´´½¨É˺¦ affect(pTargetCreature); // EffectHeterChakram* pEffect = new EffectHeterChakram( pTargetCreature ); // pEffect->setUserOID( m_UserOID ); diff --git a/src/server/gameserver/skill/EffectHeterChakram.h b/src/server/gameserver/skill/EffectHeterChakram.h index 7a6d1eaa..67077880 100644 --- a/src/server/gameserver/skill/EffectHeterChakram.h +++ b/src/server/gameserver/skill/EffectHeterChakram.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectHeterChakram.h // Written by : elca@ewestsoft.com -// Description : HeterChakram Effect óֱ Ŭ̴. +// Description : 성직마법 HeterChakram의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_HETER_CHAKRAM__ diff --git a/src/server/gameserver/skill/EffectHideSight.cpp b/src/server/gameserver/skill/EffectHideSight.cpp index d0faa88a..0d9fa9e9 100644 --- a/src/server/gameserver/skill/EffectHideSight.cpp +++ b/src/server/gameserver/skill/EffectHideSight.cpp @@ -36,7 +36,7 @@ void EffectHideSight::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_HIDE_SIGHT); Zone* pZone = pCreature->getZone(); @@ -52,7 +52,7 @@ void EffectHideSight::unaffect(Creature* pCreature) pTargetOusters->sendRealWearingInfo(); pTargetOusters->sendModifyInfo(prev); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_HIDE_SIGHT); diff --git a/src/server/gameserver/skill/EffectHolyArmor.cpp b/src/server/gameserver/skill/EffectHolyArmor.cpp index 0acce80a..7cd55e21 100644 --- a/src/server/gameserver/skill/EffectHolyArmor.cpp +++ b/src/server/gameserver/skill/EffectHolyArmor.cpp @@ -68,7 +68,7 @@ void EffectHolyArmor::unaffect(Creature* pCreature) Zone* pZone = pSlayer->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_HOLY_ARMOR); diff --git a/src/server/gameserver/skill/EffectHowl.cpp b/src/server/gameserver/skill/EffectHowl.cpp index 1d97c4e2..319b7c83 100644 --- a/src/server/gameserver/skill/EffectHowl.cpp +++ b/src/server/gameserver/skill/EffectHowl.cpp @@ -70,7 +70,7 @@ void EffectHowl::unaffect(Creature* pCreature) Zone* pZone = pVampire->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pVampire->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_HOWL); diff --git a/src/server/gameserver/skill/EffectHydroConvergence.cpp b/src/server/gameserver/skill/EffectHydroConvergence.cpp index 6526a7ba..95827751 100644 --- a/src/server/gameserver/skill/EffectHydroConvergence.cpp +++ b/src/server/gameserver/skill/EffectHydroConvergence.cpp @@ -27,7 +27,7 @@ EffectHydroConvergence::EffectHydroConvergence(Creature* pCreature) m_UserOID = 0; m_Damage = 0; m_Duration = 0; - m_AttackNum = 0; // ܵ + m_AttackNum = 0; // Êܵ½¹¥»÷´ÎÊý m_TrageSaveHP = 0; if (!pCreature->isDead() && !pCreature->isOusters()) { if (pCreature->isSlayer()) { @@ -74,11 +74,11 @@ void EffectHydroConvergence::affect() CurrentHP = pMonsterAttacker->getHP(); } if (CurrentHP < m_TrageSaveHP) { - // + // Ôö¼ÓÆäËü¹¥»÷´ÎÊý m_AttackNum++; // m_TrageSaveHP = CurrentHP; } - // ˺ + // ´´½¨É˺¦ affect(pCreature); if (pCreature->isSlayer()) CurrentHP = pSlayer->getHP(); @@ -86,7 +86,7 @@ void EffectHydroConvergence::affect() CurrentHP = pVampire->getHP(); if (pCreature->isMonster()) CurrentHP = pMonsterAttacker->getHP(); - // ¼ǰHP + // ¼Ç¼µ±Ç°HP m_TrageSaveHP = CurrentHP; if (m_AttackNum >= 5) { setDuration(0); @@ -220,9 +220,9 @@ void EffectHydroConvergence::unaffect() // cout << "EffectHydroConvergence" << "unaffect BEGIN" << endl; Creature* pCreature = dynamic_cast(m_pTarget); - // ȡ5*5Χڶ,˺ + // ¶ÁÈ¡5*5·¶Î§ÄÚ¶ÔÏó,²¢´´½¨É˺¦ // Creature* pCreature = dynamic_cast(m_pTarget); - // Ŀ˺ + // ´´½¨Ä¿±êÉ˺¦ affect(pCreature); int cx = pCreature->getX(); @@ -251,7 +251,7 @@ void EffectHydroConvergence::unaffect() continue; if (pTargetCreature->isFlag(getEffectClass())) continue; - // ˺ + // ´´½¨É˺¦ affect(pTargetCreature); // EffectHydroConvergence* pEffect = new EffectHydroConvergence( pTargetCreature ); // pEffect->setUserOID( m_UserOID ); diff --git a/src/server/gameserver/skill/EffectHydroConvergence.h b/src/server/gameserver/skill/EffectHydroConvergence.h index f24b5dd3..0a43348f 100644 --- a/src/server/gameserver/skill/EffectHydroConvergence.h +++ b/src/server/gameserver/skill/EffectHydroConvergence.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectHydroConvergence.h // Written by : elca@ewestsoft.com -// Description : HydroConvergence Effect óֱ Ŭ̴. +// Description : 성직마법 HydroConvergence의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_HYDRO_CONVERGENCE__ diff --git a/src/server/gameserver/skill/EffectHymn.cpp b/src/server/gameserver/skill/EffectHymn.cpp index 24cc7852..48b3a165 100644 --- a/src/server/gameserver/skill/EffectHymn.cpp +++ b/src/server/gameserver/skill/EffectHymn.cpp @@ -61,8 +61,8 @@ void EffectHymn::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_HYMN); if (pCreature->isSlayer()) { diff --git a/src/server/gameserver/skill/EffectHymn.h b/src/server/gameserver/skill/EffectHymn.h index 0f93c17e..4ab0bcbc 100644 --- a/src/server/gameserver/skill/EffectHymn.h +++ b/src/server/gameserver/skill/EffectHymn.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectHymn.h // Written by : -// Description : Doom ϰ effect +// Description : Doom에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_HYMN__ diff --git a/src/server/gameserver/skill/EffectIceField.cpp b/src/server/gameserver/skill/EffectIceField.cpp index 4a6f684d..0bc73a00 100644 --- a/src/server/gameserver/skill/EffectIceField.cpp +++ b/src/server/gameserver/skill/EffectIceField.cpp @@ -46,15 +46,15 @@ void EffectIceField::affect() Assert(m_pZone != NULL); - // Ʈ ũĸ ´. - // !! ̹ Ƿ NULL ִ. + // 이펙트를 사용한 크리쳐를 가져온다. + // !! 이미 존을 나갔을 수도 있으므로 NULL이 될 수 있다. // by bezz. 2003.1.4 Creature* pCastCreature = m_pZone->getCreature(m_CasterID); - // Ʈ پִ Ÿ ޾ƿ´. + // 현재 이펙트가 붙어있는 타일을 받아온다. Tile& tile = m_pZone->getTile(m_X, m_Y); - // Ÿ ȿ ϴ Ʈ ˻Ѵ. + // 타일 안에 존재하는 오브젝트들을 검색한다. const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { @@ -67,29 +67,29 @@ void EffectIceField::affect() Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // üũ. by sigi. 2002.9.5 - // 鿪. by sigi. 2002.9.13 - // ڱ ڽ̸ ´´. - // üũ + // 무적상태 체크. by sigi. 2002.9.5 + // 산 면역. by sigi. 2002.9.13 + // 자기 자신이면 안 맞는다. + // 안전지대 체크 // 2003.1.10 by bezz, Sequoia if (!canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || pCreature->getObjectID() == m_CasterID || !checkZoneLevelToHitTarget(pCreature)) { continue; } - // (--;)̸ ´´. + // 같은 조직(--;)이면 안 맞는다. if (pCreature->isOusters() && !isForce()) { continue; } - // ƴϸ Ͱ ´´. + // 유저가 쓴게 아니면 몬스터가 안 맞는다. if (pCreature->isMonster() && isForce()) { continue; } if (pCreature->getMoveMode() != Creature::MOVE_MODE_FLYING && !pCreature->isFlag(Effect::EFFECT_CLASS_ICE_FIELD_TO_CREATURE)) { - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectIceFieldToCreature* pEffect = new EffectIceFieldToCreature(pCreature); pEffect->setDeadline(m_Duration); pCreature->addEffect(pEffect); @@ -200,7 +200,7 @@ void EffectIceFieldLoader::load(Zone* pZone) pEffect->setTick(10); pEffect->setForce(true); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->registerObject(pEffect); pZone->addEffect(pEffect); tile.addEffect(pEffect); diff --git a/src/server/gameserver/skill/EffectIceField.h b/src/server/gameserver/skill/EffectIceField.h index 5c9f9245..352dde39 100644 --- a/src/server/gameserver/skill/EffectIceField.h +++ b/src/server/gameserver/skill/EffectIceField.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectIceField.h // Written by : elca@ewestsoft.com -// Description : IceField Effect óֱ Ŭ̴. +// Description : 성직마법 IceField의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_ICE_FIELD__ diff --git a/src/server/gameserver/skill/EffectIceFieldToCreature.cpp b/src/server/gameserver/skill/EffectIceFieldToCreature.cpp index 7555c3db..01ccaeb8 100644 --- a/src/server/gameserver/skill/EffectIceFieldToCreature.cpp +++ b/src/server/gameserver/skill/EffectIceFieldToCreature.cpp @@ -37,7 +37,7 @@ void EffectIceFieldToCreature::unaffect(Creature* pCreature) Assert(pCreature != NULL); // Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_ICE_FIELD_TO_CREATURE); Zone* pZone = pCreature->getZone(); @@ -46,7 +46,7 @@ void EffectIceFieldToCreature::unaffect(Creature* pCreature) // Ousters* pTargetOusters = dynamic_cast(pCreature); // Assert( pTargetOusters != NULL ); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(getSendEffectClass()); diff --git a/src/server/gameserver/skill/EffectIceHail.cpp b/src/server/gameserver/skill/EffectIceHail.cpp index d7c48269..298ba976 100644 --- a/src/server/gameserver/skill/EffectIceHail.cpp +++ b/src/server/gameserver/skill/EffectIceHail.cpp @@ -45,7 +45,7 @@ void EffectIceHail::affect() Assert(m_pZone != NULL); - // ڸ ´. + // 시전자를 가져온다. Creature* pCastCreature = m_pZone->getCreature(m_CasterID); if (pCastCreature == NULL) return; @@ -58,7 +58,7 @@ void EffectIceHail::affect() forward_list::const_iterator itr = rList.begin(); forward_list::const_iterator endItr = rList.end(); - // cout << "?" << endl; + // cout << "아프냐?" << endl; for (; itr != endItr; ++itr) { Object* pObject = *itr; @@ -113,7 +113,7 @@ void EffectIceHail::affect() gcHP.setCurrentHP(finalHP); m_pZone->broadcastPacket(m_X, m_Y, &gcHP); - // cout << "" << endl; + // cout << "아프다" << endl; } } } diff --git a/src/server/gameserver/skill/EffectIceHail.h b/src/server/gameserver/skill/EffectIceHail.h index b6451eb1..eed4aa1b 100644 --- a/src/server/gameserver/skill/EffectIceHail.h +++ b/src/server/gameserver/skill/EffectIceHail.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectIceHail.h // Written by : elca@ewestsoft.com -// Description : IceHail Effect óֱ Ŭ̴. +// Description : 성직마법 IceHail의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_ICE_HAIL__ diff --git a/src/server/gameserver/skill/EffectIceHailToTile.cpp b/src/server/gameserver/skill/EffectIceHailToTile.cpp index 4548b08a..25b4b143 100644 --- a/src/server/gameserver/skill/EffectIceHailToTile.cpp +++ b/src/server/gameserver/skill/EffectIceHailToTile.cpp @@ -15,7 +15,7 @@ void EffectIceHailToTile::affect() { forward_list::const_iterator itr = rList.begin(); forward_list::const_iterator endItr = rList.end(); - // cout << "?" << endl; + // cout << "아프냐?" << endl; for (; itr != endItr; ++itr) { Object* pObject = *itr; @@ -59,7 +59,7 @@ void EffectIceHailToTile::affect() { gcHP.setCurrentHP(finalHP); m_pZone->broadcastPacket(m_X, m_Y, &gcHP); - // cout << "" << endl; + // cout << "아프다" << endl; } EffectWithWarning::affect(); diff --git a/src/server/gameserver/skill/EffectIceHorizon.cpp b/src/server/gameserver/skill/EffectIceHorizon.cpp index d4eb3388..6a61db72 100644 --- a/src/server/gameserver/skill/EffectIceHorizon.cpp +++ b/src/server/gameserver/skill/EffectIceHorizon.cpp @@ -44,15 +44,15 @@ void EffectIceHorizon::affect() Assert(m_pZone != NULL); - // Ʈ ũĸ ´. - // !! ̹ Ƿ NULL ִ. + // 이펙트를 사용한 크리쳐를 가져온다. + // !! 이미 존을 나갔을 수도 있으므로 NULL이 될 수 있다. // by bezz. 2003.1.4 // Creature* pCastCreature = m_pZone->getCreature( m_CasterID ); - // Ʈ پִ Ÿ ޾ƿ´. + // 현재 이펙트가 붙어있는 타일을 받아온다. Tile& tile = m_pZone->getTile(m_X, m_Y); - // Ÿ ȿ ϴ Ʈ ˻Ѵ. + // 타일 안에 존재하는 오브젝트들을 검색한다. const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { diff --git a/src/server/gameserver/skill/EffectIceHorizon.h b/src/server/gameserver/skill/EffectIceHorizon.h index be958e13..b7b307db 100644 --- a/src/server/gameserver/skill/EffectIceHorizon.h +++ b/src/server/gameserver/skill/EffectIceHorizon.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectIceHorizon.h // Written by : elca@ewestsoft.com -// Description : IceHorizon Effect óֱ Ŭ̴. +// Description : 성직마법 IceHorizon의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_ICE_HORIZON__ diff --git a/src/server/gameserver/skill/EffectIceOfSoulStone.cpp b/src/server/gameserver/skill/EffectIceOfSoulStone.cpp index 87356d24..c2e501de 100644 --- a/src/server/gameserver/skill/EffectIceOfSoulStone.cpp +++ b/src/server/gameserver/skill/EffectIceOfSoulStone.cpp @@ -36,7 +36,7 @@ void EffectIceOfSoulStone::unaffect(Creature* pCreature) Assert(pCreature != NULL); // Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_ICE_OF_SOUL_STONE); Zone* pZone = pCreature->getZone(); @@ -45,7 +45,7 @@ void EffectIceOfSoulStone::unaffect(Creature* pCreature) // Ousters* pTargetOusters = dynamic_cast(pCreature); // Assert( pTargetOusters != NULL ); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_ICE_OF_SOUL_STONE); diff --git a/src/server/gameserver/skill/EffectInstallTurret.cpp b/src/server/gameserver/skill/EffectInstallTurret.cpp index 0eeb9860..32ce9452 100644 --- a/src/server/gameserver/skill/EffectInstallTurret.cpp +++ b/src/server/gameserver/skill/EffectInstallTurret.cpp @@ -67,7 +67,7 @@ void EffectInstallTurret::unaffect(Creature* pCreature) // cout << "EffectInstallTurret" << "unaffect BEGIN" << endl; Assert(pCreature != NULL); - Assert(pCreature->isSlayer()); // ̾ ɸ ʴ´. + Assert(pCreature->isSlayer()); // 슬레이어말고는 걸리지 않는다. pCreature->removeFlag(Effect::EFFECT_CLASS_INSTALL_TURRET); diff --git a/src/server/gameserver/skill/EffectInvisibility.cpp b/src/server/gameserver/skill/EffectInvisibility.cpp index 73b9abbc..4b2acae1 100644 --- a/src/server/gameserver/skill/EffectInvisibility.cpp +++ b/src/server/gameserver/skill/EffectInvisibility.cpp @@ -96,7 +96,7 @@ void EffectInvisibility::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone); - // true ο effectManager effect Ѵ. + // true면 내부에서 effectManager의 effect를 삭제한다. addVisibleCreature(pZone, pCreature, false); // cout << "EffectInvisibility " << "unaffect END" << endl; diff --git a/src/server/gameserver/skill/EffectJabbingVein.cpp b/src/server/gameserver/skill/EffectJabbingVein.cpp index 07c33612..21f9b992 100644 --- a/src/server/gameserver/skill/EffectJabbingVein.cpp +++ b/src/server/gameserver/skill/EffectJabbingVein.cpp @@ -36,7 +36,7 @@ void EffectJabbingVein::unaffect(Creature* pCreature) Assert(pCreature != NULL); // Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_JABBING_VEIN); Zone* pZone = pCreature->getZone(); @@ -45,7 +45,7 @@ void EffectJabbingVein::unaffect(Creature* pCreature) // Ousters* pTargetOusters = dynamic_cast(pCreature); // Assert( pTargetOusters != NULL ); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_JABBING_VEIN); diff --git a/src/server/gameserver/skill/EffectLight.cpp b/src/server/gameserver/skill/EffectLight.cpp index 597ace7e..b3fca549 100644 --- a/src/server/gameserver/skill/EffectLight.cpp +++ b/src/server/gameserver/skill/EffectLight.cpp @@ -77,7 +77,7 @@ void EffectLight::unaffect(Creature* pCreature) pPlayer->sendPacket(&_GCModifyInformation); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_LIGHT); @@ -207,7 +207,7 @@ void EffectLightLoader::load(Creature* pCreature) __BEGIN_TRY if (pCreature == NULL) { - // cout << "EffectLightLoader : ũİ Դϴ." << endl; + // cout << "EffectLightLoader : 크리쳐가 널입니다." << endl; return; } diff --git a/src/server/gameserver/skill/EffectLightness.cpp b/src/server/gameserver/skill/EffectLightness.cpp index f5a67978..81db8e97 100644 --- a/src/server/gameserver/skill/EffectLightness.cpp +++ b/src/server/gameserver/skill/EffectLightness.cpp @@ -2,7 +2,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectLightness.cpp // Written by : excel96 -// Description : Lightness ؼ Ǵ 꼺 ȭ Ʈ̴. +// Description : Lightness에 의해서 생성되는 산성 데미지 약화 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #include "EffectLightness.h" @@ -49,7 +49,7 @@ void EffectLightness::unaffect() Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_LIGHTNESS); diff --git a/src/server/gameserver/skill/EffectLightness.h b/src/server/gameserver/skill/EffectLightness.h index 350488e2..ef72904b 100644 --- a/src/server/gameserver/skill/EffectLightness.h +++ b/src/server/gameserver/skill/EffectLightness.h @@ -2,7 +2,7 @@ // Filename : EffectLightness.h // Written by : excel96 // Description : -// Lightness ؼ Ǵ 꼺 ȭ Ʈ̴. +// Lightness에 의해서 생성되는 산성 데미지 약화 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_LIGHTNESS__ diff --git a/src/server/gameserver/skill/EffectMagnumSpear.cpp b/src/server/gameserver/skill/EffectMagnumSpear.cpp index 91a04042..4c45d1a2 100644 --- a/src/server/gameserver/skill/EffectMagnumSpear.cpp +++ b/src/server/gameserver/skill/EffectMagnumSpear.cpp @@ -111,7 +111,7 @@ void EffectMagnumSpear::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_MAGNUM_SPEAR); diff --git a/src/server/gameserver/skill/EffectMephisto.cpp b/src/server/gameserver/skill/EffectMephisto.cpp index 6bf0f754..084a5dd7 100644 --- a/src/server/gameserver/skill/EffectMephisto.cpp +++ b/src/server/gameserver/skill/EffectMephisto.cpp @@ -70,7 +70,7 @@ void EffectMephisto::unaffect(Creature* pCreature) Zone* pZone = pVampire->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pVampire->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_MEPHISTO); diff --git a/src/server/gameserver/skill/EffectMeteorStrike.cpp b/src/server/gameserver/skill/EffectMeteorStrike.cpp index 66a6e463..26a60835 100644 --- a/src/server/gameserver/skill/EffectMeteorStrike.cpp +++ b/src/server/gameserver/skill/EffectMeteorStrike.cpp @@ -46,8 +46,8 @@ void EffectMeteorStrike::affect() Assert(m_pZone != NULL); - // Ʈ ũĸ ´. - // !! Ƿ NULL ִ. + // 이펙트를 건 크리쳐를 가져온다. + // !! 존을 떠났을 수도 있으므로 NULL 이 될 수 있다. Creature* pCastCreature = m_pZone->getCreature(m_UserObjectID); if (m_bPlayer) { // pCastCreature = m_pZone->getCreature( m_UserObjectID ); @@ -61,8 +61,8 @@ void EffectMeteorStrike::affect() VSRect rect(0, 0, m_pZone->getWidth() - 1, m_pZone->getHeight() - 1); - // Ʈ پִ Ÿ ޾ƿ´. - // ߽Ÿ + ÷ Ÿ + // 현재 이펙트가 붙어있는 타일을 받아온다. + // 중심타일 + 스플래쉬 타일 for (int x = -2; x <= 2; x++) { for (int y = -2; y <= 2; y++) { int X = m_X + x; @@ -75,7 +75,7 @@ void EffectMeteorStrike::affect() int Damage = 0; int splash = max(abs(x), abs(y)); - //  100% + // 가운데는 100% // if ( m_bPlayer ) // { /* if ( splash == 0 ) @@ -97,12 +97,12 @@ void EffectMeteorStrike::affect() // } // else // { - // // 50% damage + // // 주위에는 50% damage // if ( splash != 0 ) Damage = m_Damage >> splash; // else Damage = m_Damage; // } - // Ÿ ȿ ϴ Ʈ ˻Ѵ. + // 타일 안에 존재하는 오브젝트들을 검색한다. const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { @@ -115,8 +115,8 @@ void EffectMeteorStrike::affect() Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // ڽ ʴ´ - // üũ. by sigi. 2002.9.5 + // 자신은 맞지 않는다 + // 무적상태 체크. by sigi. 2002.9.5 if (pCreature->getObjectID() == m_UserObjectID || !canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || !checkZoneLevelToHitTarget(pCreature)) { continue; @@ -143,7 +143,7 @@ void EffectMeteorStrike::affect() pPlayer->sendPacket(&gcMI);*/ } else if (pCreature->isVampire()) { - // ̾ ̾ ߽ Ÿ ϰ ʴ´. + // 뱀파이어가 사용했을 경우 뱀파이어는 중심 타일을 제외하고는 맞지 않는다. if (m_bPlayer) // && splash != 0 ) continue; @@ -173,7 +173,7 @@ void EffectMeteorStrike::affect() pMonster->addEnemy(pCastCreature); } - // 밡 ׾ٸ ġ ÷ش. + // 상대가 죽었다면 경험치를 올려준다. if (pCreature->isDead()) { if (pCastCreature != NULL && pCastCreature->isVampire()) { Vampire* pVampire = dynamic_cast(pCastCreature); @@ -188,9 +188,9 @@ void EffectMeteorStrike::affect() } } - // user״ ´ ش. + // user한테는 맞는 모습을 보여준다. if (pCreature->isPC()) { - gcSkillToObjectOK2.setObjectID(1); // ǹ . + gcSkillToObjectOK2.setObjectID(1); // 의미 없다. gcSkillToObjectOK2.setSkillType(SKILL_ATTACK_MELEE); gcSkillToObjectOK2.setDuration(0); pCreature->getPlayer()->sendPacket(&gcSkillToObjectOK2); diff --git a/src/server/gameserver/skill/EffectMeteorStrike.h b/src/server/gameserver/skill/EffectMeteorStrike.h index 2289b86b..6e125f6c 100644 --- a/src/server/gameserver/skill/EffectMeteorStrike.h +++ b/src/server/gameserver/skill/EffectMeteorStrike.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectMeteorStrike.h // Written by : elca@ewestsoft.com -// Description : MeteorStrike Effect óֱ Ŭ̴. +// Description : 성직마법 MeteorStrike의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_METEOR_STRIKE__ @@ -65,7 +65,7 @@ class EffectMeteorStrike : public Effect { Turn_t m_Delay; // string m_CasterName; ObjectID_t m_UserObjectID; - bool m_bPlayer; // ΰ? + bool m_bPlayer; // 유저가 사용한 기술인가? uint m_SplashRatio[3]; }; diff --git a/src/server/gameserver/skill/EffectMindControl.cpp b/src/server/gameserver/skill/EffectMindControl.cpp index f073f1df..5116add9 100644 --- a/src/server/gameserver/skill/EffectMindControl.cpp +++ b/src/server/gameserver/skill/EffectMindControl.cpp @@ -75,7 +75,7 @@ void EffectMindControl::unaffect(Creature* pCreature) // cout << "EffectMindControl" << "unaffect BEGIN" << endl; Assert(pCreature != NULL); - Assert(pCreature->isSlayer()); // ̾ ɸ ʴ´. + Assert(pCreature->isSlayer()); // 슬레이어말고는 걸리지 않는다. pCreature->removeFlag(Effect::EFFECT_CLASS_MIND_CONTROL); diff --git a/src/server/gameserver/skill/EffectMiracleShield.cpp b/src/server/gameserver/skill/EffectMiracleShield.cpp index 2edb33af..0da64ec9 100644 --- a/src/server/gameserver/skill/EffectMiracleShield.cpp +++ b/src/server/gameserver/skill/EffectMiracleShield.cpp @@ -80,7 +80,7 @@ void EffectMiracleShield::unaffect(Creature* pCreature) pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_MIRACLE_SHIELD); diff --git a/src/server/gameserver/skill/EffectObservingEye.cpp b/src/server/gameserver/skill/EffectObservingEye.cpp index df850f82..4616c097 100644 --- a/src/server/gameserver/skill/EffectObservingEye.cpp +++ b/src/server/gameserver/skill/EffectObservingEye.cpp @@ -76,7 +76,7 @@ void EffectObservingEye::unaffect(Creature* pCreature) // cout << "EffectObservingEye" << "unaffect BEGIN" << endl; Assert(pCreature != NULL); - Assert(pCreature->isSlayer()); // ̾ ɸ ʴ´. + Assert(pCreature->isSlayer()); // 슬레이어말고는 걸리지 않는다. pCreature->removeFlag(Effect::EFFECT_CLASS_OBSERVING_EYE); @@ -96,7 +96,7 @@ void EffectObservingEye::unaffect(Creature* pCreature) gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_OBSERVING_EYE); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcRemoveEffect); - // Ʈ ־ ũĵ Ѵ. + // 이 이펙트로 보고 있었던 크리쳐들을 삭제한다. pZone->updateInvisibleScan(pCreature); GCOtherModifyInfo gcOtherModifyInfo; @@ -138,7 +138,7 @@ bool EffectObservingEye::canSeeInvisibility(Creature* pTarget) const level = pMonster->getLevel(); } else { - // ̾ Ͱ ƴϸ ɷ Ѵ. + // 뱀파이어나 몬스터가 아니면 못본걸로 한다. return false; } diff --git a/src/server/gameserver/skill/EffectPassingHeal.cpp b/src/server/gameserver/skill/EffectPassingHeal.cpp index ad3ab5cb..c7ca4a59 100644 --- a/src/server/gameserver/skill/EffectPassingHeal.cpp +++ b/src/server/gameserver/skill/EffectPassingHeal.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectPassingHeal.cpp // Written by : excel96 -// Description : PassingHeal ؼ Ǵ 꼺 ȭ Ʈ̴. +// Description : PassingHeal에 의해서 생성되는 산성 데미지 약화 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #include "EffectPassingHeal.h" @@ -98,7 +98,7 @@ void EffectPassingHeal::affect(Creature* pTargetCreature) EffectParalyze* pEffectParalyze = NULL; EffectSeduction* pEffectSeduction = NULL; - // 迭 ؼ + // 저주 계열 해소 if (pTargetCreature->isEffect(Effect::EFFECT_CLASS_DOOM)) { pEffectDoom = dynamic_cast(pTargetCreature->findEffect(Effect::EFFECT_CLASS_DOOM)); Assert(pEffectDoom != NULL); @@ -124,11 +124,11 @@ void EffectPassingHeal::affect(Creature* pTargetCreature) bSeduction = HitRoll::isSuccessRemoveCurse(50, 100, 30, pEffectSeduction->getLevel(), 10); } - // 迭 ؼ - bool bGreenPoison = false; // GreenPoison ġұ - bool bYellowPoison = false; // YellowPoison ġұ - bool bDarkBluePoison = false; // DarkBluePoison ġұ - bool bGreenStalker = false; // GreenStalker ġұ + // 독 계열 해소 + bool bGreenPoison = false; // GreenPoison을 치료할까의 여부 + bool bYellowPoison = false; // YellowPoison을 치료할까의 여부 + bool bDarkBluePoison = false; // DarkBluePoison을 치료할까의 여부 + bool bGreenStalker = false; // GreenStalker를 치료할까의 여부 EffectPoison* pEffectPoison = NULL; EffectYellowPoisonToCreature* pEffectYellowPoisonToCreature = NULL; @@ -168,18 +168,18 @@ void EffectPassingHeal::affect(Creature* pTargetCreature) int cureCount = 0; - // ¶ ¸ ش. + // 흡혈당한 상태라면 흡혈 상태를 날려준다. if (cureCount < m_CureCount && pEffectBloodDrain != NULL && pEffectBloodDrain->getLevel() < 150 && pTargetCreature->isSlayer()) { Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); - // ƸƮ ϱ Ʈ ٿش. + // 흡혈 아르바이트를 방지하기 위한 후유증 이펙트를 붙여준다. if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_AFTERMATH)) { Effect* pEffect = pTargetCreature->findEffect(Effect::EFFECT_CLASS_AFTERMATH); EffectAftermath* pEffectAftermath = dynamic_cast(pEffect); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. } else { EffectAftermath* pEffectAftermath = new EffectAftermath(pTargetCreature); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. pTargetCreature->addEffect(pEffectAftermath); pTargetCreature->setFlag(Effect::EFFECT_CLASS_AFTERMATH); pEffectAftermath->create(pTargetCreature->getName()); @@ -223,8 +223,8 @@ void EffectPassingHeal::affect(Creature* pTargetCreature) ++cureCount; } - // ġḦ ϰ, - // Ŷ Ʈ ϶ Ѵ. + // 각각의 독마다 치료를 하고, + // 패킷에다 이펙트 삭제하라고 더한다. if (cureCount < m_CureCount && bGreenPoison) { pEffectPoison->setDeadline(0); pTargetCreature->removeFlag(Effect::EFFECT_CLASS_POISON); @@ -360,7 +360,7 @@ void EffectPassingHeal::unaffect() Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_PASSING_HEAL); diff --git a/src/server/gameserver/skill/EffectPassingHeal.h b/src/server/gameserver/skill/EffectPassingHeal.h index 25312c5b..1cef8317 100644 --- a/src/server/gameserver/skill/EffectPassingHeal.h +++ b/src/server/gameserver/skill/EffectPassingHeal.h @@ -2,7 +2,7 @@ // Filename : EffectPassingHeal.h // Written by : excel96 // Description : -// PassingHeal ؼ Ǵ 꼺 ȭ Ʈ̴. +// PassingHeal에 의해서 생성되는 산성 데미지 약화 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_PASSING_HEAL__ diff --git a/src/server/gameserver/skill/EffectPeace.cpp b/src/server/gameserver/skill/EffectPeace.cpp index 23e3672d..d84c9c42 100644 --- a/src/server/gameserver/skill/EffectPeace.cpp +++ b/src/server/gameserver/skill/EffectPeace.cpp @@ -47,8 +47,8 @@ void EffectPeace::affect(Creature* pCreature) __BEGIN_TRY Assert(pCreature != NULL); - Assert(!pCreature->isSlayer()); // ̾ ɸ ʴ´. - Assert(!pCreature->isNPC()); // NPC ɸ ʴ´. + Assert(!pCreature->isSlayer()); // 슬레이어는 걸리지 않는다. + Assert(!pCreature->isNPC()); // NPC도 걸리지 않는다. if (pCreature->isMonster()) { Monster* pMonster = dynamic_cast(pCreature); @@ -74,7 +74,7 @@ void EffectPeace::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_PEACE); diff --git a/src/server/gameserver/skill/EffectPeace.h b/src/server/gameserver/skill/EffectPeace.h index f4830c16..549c2eef 100644 --- a/src/server/gameserver/skill/EffectPeace.h +++ b/src/server/gameserver/skill/EffectPeace.h @@ -16,7 +16,7 @@ class EffectPeace : public Effect { public: - // pCreature() pPeaceCreature peace¸ Ѵ. + // pCreature(나)가 pPeaceCreature한테 peace상태를 유지한다. EffectPeace(Creature* pCreature, ObjectID_t PeaceCreatureID); public: diff --git a/src/server/gameserver/skill/EffectPenetrateWheel.h b/src/server/gameserver/skill/EffectPenetrateWheel.h index 54f35e04..ae508742 100644 --- a/src/server/gameserver/skill/EffectPenetrateWheel.h +++ b/src/server/gameserver/skill/EffectPenetrateWheel.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectPenetrateWheel.h // Written by : rallser -// Description : PenetrateWheel Effect óֱ Ŭ̴. +// Description : 성직마법PenetrateWheel의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_Penetrate_Wheel__ diff --git a/src/server/gameserver/skill/EffectPlasmaRocketLauncher.cpp b/src/server/gameserver/skill/EffectPlasmaRocketLauncher.cpp index 5e039204..fe5c1b5d 100644 --- a/src/server/gameserver/skill/EffectPlasmaRocketLauncher.cpp +++ b/src/server/gameserver/skill/EffectPlasmaRocketLauncher.cpp @@ -93,7 +93,7 @@ void EffectPlasmaRocketLauncher::affect(Creature* pCreature) if (!(pZone->getZoneLevel() & COMPLETE_SAFE_ZONE) && !pCreature2->isDead() && !pCreature2->isFlag(Effect::EFFECT_CLASS_COMA) - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 && canAttack(pAttacker, pCreature2)) { GCModifyInformation gcMI, gcAttackerMI; setDamage(pCreature2, m_Point, pAttacker, SKILL_PLASMA_ROCKET_LAUNCHER, &gcMI, &gcAttackerMI); diff --git a/src/server/gameserver/skill/EffectPoison.cpp b/src/server/gameserver/skill/EffectPoison.cpp index bfc8d6d2..7cc69682 100644 --- a/src/server/gameserver/skill/EffectPoison.cpp +++ b/src/server/gameserver/skill/EffectPoison.cpp @@ -61,21 +61,21 @@ void EffectPoison::affect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // ų ڸ ´. - // !! ̹ Ƿ NULL ִ. + // 스킬 사용자를 가져온다. + // !! 이미 존을 나갔을 수 있으므로 NULL이 될 수 있다. // by bezz. 2003.1.4 Creature* pCastCreature = pZone->getCreature(m_UserObjectID); - // EffectPoison ũĿ ɸ Ǵ 쿡 μ - // GreenPoison Ÿ - // EffectGreenPoison ÷̾ ̴. - // EffectGreenPoison ο ؼ - // EffectPoison ̹Ƿ, ο ѹ ϸ ȵȴ. + // EffectPoison이 크리쳐에게 걸리게 되는 경우에는 현재로서는 + // GreenPoison에 의해 타일 위에 생긴 + // EffectGreenPoison 위를 플레이어가 지나갈 때 뿐이다. + // EffectGreenPoison 내부에서 저항을 고려해서 데미지를 세팅한 다음 + // EffectPoison을 붙이므로, 내부에서 한번 더 계산하면 안된다. // Damage_t PoisonDamage = computeMagicDamage(pCreature, m_Point, MAGIC_DOMAIN_POISON, m_Level); Damage_t PoisonDamage = m_Point; if (!(pZone->getZoneLevel() & COMPLETE_SAFE_ZONE) - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 && canAttack(pCastCreature, pCreature)) { if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -101,7 +101,7 @@ void EffectPoison::affect(Creature* pCreature) ::setDamage(pMonster, PoisonDamage, pCastCreature, SKILL_GREEN_POISON); } - // m_CasterName pCreature KillCount ó + // m_CasterName이 pCreature를 죽인 경우의 KillCount 처리 // by sigi. 2002.9.9 /* if (pCreature->isDead()) { @@ -144,7 +144,7 @@ void EffectPoison::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_POISON); diff --git a/src/server/gameserver/skill/EffectPoisonMesh.cpp b/src/server/gameserver/skill/EffectPoisonMesh.cpp index b869fb68..75328629 100644 --- a/src/server/gameserver/skill/EffectPoisonMesh.cpp +++ b/src/server/gameserver/skill/EffectPoisonMesh.cpp @@ -70,7 +70,7 @@ void EffectPoisonMesh::unaffect(Creature* pCreature) { Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(getSendEffectClass()); diff --git a/src/server/gameserver/skill/EffectPoisonStorm.cpp b/src/server/gameserver/skill/EffectPoisonStorm.cpp index 88d10a23..42dab77f 100644 --- a/src/server/gameserver/skill/EffectPoisonStorm.cpp +++ b/src/server/gameserver/skill/EffectPoisonStorm.cpp @@ -36,7 +36,7 @@ bool EffectPoisonStorm::affectCreature(Creature* pTargetCreature, bool bAffectBy Assert(pTargetCreature != NULL); - // 뿡 ̹ poison Ʈ ɷ ִ 쿡 ɸ ʴ´. + // 상대에게 이미 poison 이펙트가 걸려져 있는 경우에는 걸리지 않는다. if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_STORM_POSION)) { // cout << "EffectPoisonStorm " << "affectCreature End " << endl; return false; @@ -45,22 +45,22 @@ bool EffectPoisonStorm::affectCreature(Creature* pTargetCreature, bool bAffectBy Zone* pZone = pTargetCreature->getZone(); Creature* pAttacker = pZone->getCreature(m_UserObjectID); - // 濡 ĥ Ѵ. + // 상대방에게 미칠 독 데미지를 계산한다. int StormDamage = computeMagicDamage(pTargetCreature, m_Damage, SKILL_POISON_STORM, m_bVampire, pAttacker); if (StormDamage > 0) { - // Ʈ ؼ, Ÿ ũĿ ̰, ÷׸ ش. + // 포이즌 이펙트를 생성해서, 타겟 크리쳐에 붙이고, 플래그를 켜준다. EffectStormPoison* pEffectStormPoison = new EffectStormPoison(pTargetCreature); pEffectStormPoison->setLevel(m_Level); pEffectStormPoison->setPoint(StormDamage / 3); - pEffectStormPoison->setDeadline(16); // ̺κ ٲ Ѵ. - pEffectStormPoison->setTick(5); // ̺κе ٲ Ѵ. + pEffectStormPoison->setDeadline(16); // 이부분 바꿔야 한다. + pEffectStormPoison->setTick(5); // 이부분도 바꿔야 한다. pEffectStormPoison->setUserObjectID(m_UserObjectID); pEffectStormPoison->affect(pTargetCreature); pTargetCreature->addEffect(pEffectStormPoison); pTargetCreature->setFlag(Effect::EFFECT_CLASS_STORM_POSION); - // Ʈ پٰ ֺ ˷ش. + // 이펙트가 붙었다고 주변에 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_STORM_POSION); diff --git a/src/server/gameserver/skill/EffectPoisonStorm.h b/src/server/gameserver/skill/EffectPoisonStorm.h index de4c6955..c01dd5c3 100644 --- a/src/server/gameserver/skill/EffectPoisonStorm.h +++ b/src/server/gameserver/skill/EffectPoisonStorm.h @@ -66,7 +66,7 @@ class EffectPoisonStorm : public Effect { Turn_t m_Tick; // EffectPoisonStorm turn; int m_Level; // EffectPoisonStorm level; Duration_t m_Duration; // EffectPoisonStorm Duration; - Duration_t m_StormDuration; // PoisonStorm Effect ð + Duration_t m_StormDuration; // PoisonStorm Effect 지속 시간 ObjectID_t m_UserObjectID; bool m_bVampire; }; diff --git a/src/server/gameserver/skill/EffectProminence.cpp b/src/server/gameserver/skill/EffectProminence.cpp index d542ae21..3baaeab6 100644 --- a/src/server/gameserver/skill/EffectProminence.cpp +++ b/src/server/gameserver/skill/EffectProminence.cpp @@ -45,8 +45,8 @@ void EffectProminence::affect() Assert(m_pZone != NULL); - // Ʈ ڸ ´. - // Ƿ NULL ִ. + // 이펙트 사용자를 가져온다. + // 존에 없을 수 있으므로 NULL 이 될 수 있다. Creature* pCastCreature = m_pZone->getCreature(m_UserObjectID); if (pCastCreature == NULL && !isForce()) { @@ -55,10 +55,10 @@ void EffectProminence::affect() return; } - // Ʈ پִ Ÿ ޾ƿ´. + // 현재 이펙트가 붙어있는 타일을 받아온다. Tile& tile = m_pZone->getTile(m_X, m_Y); - // Ÿ ȿ ϴ Ʈ ˻Ѵ. + // 타일 안에 존재하는 오브젝트들을 검색한다. const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { @@ -71,8 +71,8 @@ void EffectProminence::affect() Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // üũ. by sigi. 2002.9.5 - // 鿪. by sigi. 2002.9.13 + // 무적상태 체크. by sigi. 2002.9.5 + // 산 면역. by sigi. 2002.9.13 if (pCastCreature != NULL && (!canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || !canHit(pCastCreature, pCreature, SKILL_PROMINENCE, getLevel()))) { @@ -80,7 +80,7 @@ void EffectProminence::affect() } // 2003.1.10 by Sequoia - // üũ + // 안전지대 체크 if (!checkZoneLevelToHitTarget(pCreature)) continue; @@ -120,9 +120,9 @@ void EffectProminence::affect() Assert(pPlayer != NULL); pPlayer->sendPacket(&gcDefenderMI); } else - continue; // ƿ콺 NPC ... -_- + continue; // 아우스터즈나 NPC 상대로... -_- - // ׾ ġش. ..... + // 죽었으면 경험치준다. 음..... if (pCastCreature != NULL) { if (pCreature->isDead() && pCastCreature->isOusters()) { Ousters* pCastOusters = dynamic_cast(pCastCreature); @@ -134,7 +134,7 @@ void EffectProminence::affect() } } - // ϱ + // 성향 계산하기 /* if ( pCastCreature != NULL && pCastCreature->isPC() && pCreature->isPC() @@ -227,7 +227,7 @@ void EffectProminenceLoader::load(Zone* pZone) pEffect->setForce(true); pEffect->setSendEffectClass(Effect::EFFECT_CLASS_PROMINENCE_3); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->registerObject(pEffect); pZone->addEffect(pEffect); tile.addEffect(pEffect); diff --git a/src/server/gameserver/skill/EffectProminence.h b/src/server/gameserver/skill/EffectProminence.h index 1625ff0f..c04160ec 100644 --- a/src/server/gameserver/skill/EffectProminence.h +++ b/src/server/gameserver/skill/EffectProminence.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectProminence.h // Written by : elca@ewestsoft.com -// Description : Prominence Effect óֱ Ŭ̴. +// Description : 성직마법 Prominence의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_PROMINENCE__ diff --git a/src/server/gameserver/skill/EffectProtectionFromAcid.cpp b/src/server/gameserver/skill/EffectProtectionFromAcid.cpp index 3acae649..68f75cec 100644 --- a/src/server/gameserver/skill/EffectProtectionFromAcid.cpp +++ b/src/server/gameserver/skill/EffectProtectionFromAcid.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectProtectionFromAcid.cpp // Written by : excel96 -// Description : ProtectionFromAcid ؼ Ǵ 꼺 ȭ Ʈ̴. +// Description : ProtectionFromAcid에 의해서 생성되는 산성 데미지 약화 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #include "EffectProtectionFromAcid.h" @@ -73,7 +73,7 @@ void EffectProtectionFromAcid::unaffect() Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_PROTECTION_FROM_ACID); diff --git a/src/server/gameserver/skill/EffectProtectionFromAcid.h b/src/server/gameserver/skill/EffectProtectionFromAcid.h index fa4320a6..fb0c05cb 100644 --- a/src/server/gameserver/skill/EffectProtectionFromAcid.h +++ b/src/server/gameserver/skill/EffectProtectionFromAcid.h @@ -2,7 +2,7 @@ // Filename : EffectProtectionFromAcid.h // Written by : excel96 // Description : -// ProtectionFromAcid ؼ Ǵ 꼺 ȭ Ʈ̴. +// ProtectionFromAcid에 의해서 생성되는 산성 데미지 약화 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_PROTECTION_FROM_ACID__ diff --git a/src/server/gameserver/skill/EffectProtectionFromBlood.cpp b/src/server/gameserver/skill/EffectProtectionFromBlood.cpp index c91f30da..71c25c07 100644 --- a/src/server/gameserver/skill/EffectProtectionFromBlood.cpp +++ b/src/server/gameserver/skill/EffectProtectionFromBlood.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectProtectionFromBlood.cpp // Written by : excel96 -// Description : ProtectionFromBlood ؼ Ǵ 꼺 ȭ Ʈ̴. +// Description : ProtectionFromBlood에 의해서 생성되는 산성 데미지 약화 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #include "EffectProtectionFromBlood.h" @@ -73,7 +73,7 @@ void EffectProtectionFromBlood::unaffect() Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_PROTECTION_FROM_BLOOD); diff --git a/src/server/gameserver/skill/EffectProtectionFromBlood.h b/src/server/gameserver/skill/EffectProtectionFromBlood.h index 1793b0ec..ff053538 100644 --- a/src/server/gameserver/skill/EffectProtectionFromBlood.h +++ b/src/server/gameserver/skill/EffectProtectionFromBlood.h @@ -2,7 +2,7 @@ // Filename : EffectProtectionFromBlood.h // Written by : excel96 // Description : -// ProtectionFromBlood ؼ Ǵ 꼺 ȭ Ʈ̴. +// ProtectionFromBlood에 의해서 생성되는 산성 데미지 약화 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_PROTECTION_FROM_BLOOD__ diff --git a/src/server/gameserver/skill/EffectProtectionFromCurse.cpp b/src/server/gameserver/skill/EffectProtectionFromCurse.cpp index 5469a9f1..7a4c36e4 100644 --- a/src/server/gameserver/skill/EffectProtectionFromCurse.cpp +++ b/src/server/gameserver/skill/EffectProtectionFromCurse.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectProtectionFromCurse.cpp // Written by : excel96 -// Description : ProtectionFromCurse ؼ Ǵ 꼺 ȭ Ʈ̴. +// Description : ProtectionFromCurse에 의해서 생성되는 산성 데미지 약화 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #include "EffectProtectionFromCurse.h" @@ -73,7 +73,7 @@ void EffectProtectionFromCurse::unaffect() Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_PROTECTION_FROM_CURSE); diff --git a/src/server/gameserver/skill/EffectProtectionFromCurse.h b/src/server/gameserver/skill/EffectProtectionFromCurse.h index d49ac879..7746f51f 100644 --- a/src/server/gameserver/skill/EffectProtectionFromCurse.h +++ b/src/server/gameserver/skill/EffectProtectionFromCurse.h @@ -2,7 +2,7 @@ // Filename : EffectProtectionFromCurse.h // Written by : excel96 // Description : -// ProtectionFromCurse ؼ Ǵ 꼺 ȭ Ʈ̴. +// ProtectionFromCurse에 의해서 생성되는 산성 데미지 약화 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_PROTECTION_FROM_CURSE__ diff --git a/src/server/gameserver/skill/EffectProtectionFromPoison.cpp b/src/server/gameserver/skill/EffectProtectionFromPoison.cpp index 90227f51..5cbb7330 100644 --- a/src/server/gameserver/skill/EffectProtectionFromPoison.cpp +++ b/src/server/gameserver/skill/EffectProtectionFromPoison.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectProtectionFromPoison.cpp // Written by : excel96 -// Description : ProtectionFromPoison ؼ Ǵ 꼺 ȭ Ʈ̴. +// Description : ProtectionFromPoison에 의해서 생성되는 산성 데미지 약화 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #include "EffectProtectionFromPoison.h" @@ -73,7 +73,7 @@ void EffectProtectionFromPoison::unaffect() Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_PROTECTION_FROM_POISON); diff --git a/src/server/gameserver/skill/EffectProtectionFromPoison.h b/src/server/gameserver/skill/EffectProtectionFromPoison.h index cbab5e4a..21c8793a 100644 --- a/src/server/gameserver/skill/EffectProtectionFromPoison.h +++ b/src/server/gameserver/skill/EffectProtectionFromPoison.h @@ -2,7 +2,7 @@ // Filename : EffectProtectionFromPoison.h // Written by : excel96 // Description : -// ProtectionFromPoison ؼ Ǵ ȭ Ʈ̴. +// ProtectionFromPoison에 의해서 생성되는 독데미지 약화 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_PROTECTION_FROM_POISON__ diff --git a/src/server/gameserver/skill/EffectRapidFreeze.cpp b/src/server/gameserver/skill/EffectRapidFreeze.cpp index 06405e3d..51d16d82 100644 --- a/src/server/gameserver/skill/EffectRapidFreeze.cpp +++ b/src/server/gameserver/skill/EffectRapidFreeze.cpp @@ -44,7 +44,7 @@ void EffectRapidFreeze::checkPosition() { if (!isValidZoneCoord(m_pZone, tx, ty)) continue; Tile& tile = m_pZone->getTile(tx, ty); - // Ÿ ȿ ϴ Ʈ ˻Ѵ. + // 타일 안에 존재하는 오브젝트들을 검색한다. const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { @@ -78,8 +78,8 @@ void EffectRapidFreeze::affect() Assert(m_pZone != NULL); - // Ʈ ڸ ´. - // Ƿ NULL ִ. + // 이펙트 사용자를 가져온다. + // 존에 없을 수 있으므로 NULL 이 될 수 있다. Creature* pCastCreature = m_pZone->getCreature(m_UserObjectID); for (int i = -2; i <= 2; ++i) @@ -90,10 +90,10 @@ void EffectRapidFreeze::affect() if (!isValidZoneCoord(m_pZone, tx, ty)) continue; - // Ʈ پִ Ÿ ޾ƿ´. + // 현재 이펙트가 붙어있는 타일을 받아온다. Tile& tile = m_pZone->getTile(tx, ty); - // Ÿ ȿ ϴ Ʈ ˻Ѵ. + // 타일 안에 존재하는 오브젝트들을 검색한다. const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { @@ -106,8 +106,8 @@ void EffectRapidFreeze::affect() Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // üũ. by sigi. 2002.9.5 - // 鿪. by sigi. 2002.9.13 + // 무적상태 체크. by sigi. 2002.9.5 + // 산 면역. by sigi. 2002.9.13 if (pCastCreature != NULL && (!canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || !canHit(pCastCreature, pCreature, SKILL_Rapid_Freeze))) { @@ -115,7 +115,7 @@ void EffectRapidFreeze::affect() } // 2003.1.10 by Sequoia - // üũ + // 안전지대 체크 if (!checkZoneLevelToHitTarget(pCreature)) continue; @@ -165,9 +165,9 @@ void EffectRapidFreeze::affect() ::setDamage(pMonster, damage, pCastCreature, SKILL_Rapid_Freeze, NULL, &gcAttackerMI, true, false); } else - continue; // ƿ콺 NPC ... -_- + continue; // 아우스터즈나 NPC 상대로... -_- - // ׾ ġش. ..... + // 죽었으면 경험치준다. 음..... if (pCastCreature != NULL) { if (pCreature->isDead() && pCastCreature->isOusters()) { Ousters* pCastOusters = dynamic_cast(pCastCreature); @@ -179,7 +179,7 @@ void EffectRapidFreeze::affect() } } - // ϱ + // 성향 계산하기 /* if ( pCastCreature != NULL && pCastCreature->isPC() && pCreature->isPC() diff --git a/src/server/gameserver/skill/EffectReactiveArmor.cpp b/src/server/gameserver/skill/EffectReactiveArmor.cpp index e9999ca7..446dbc9b 100644 --- a/src/server/gameserver/skill/EffectReactiveArmor.cpp +++ b/src/server/gameserver/skill/EffectReactiveArmor.cpp @@ -37,7 +37,7 @@ void EffectReactiveArmor::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_REACTIVE_ARMOR); Zone* pZone = pCreature->getZone(); @@ -48,7 +48,7 @@ void EffectReactiveArmor::unaffect(Creature* pCreature) pTargetOusters->initAllStatAndSend(); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_REACTIVE_ARMOR); diff --git a/src/server/gameserver/skill/EffectRediance.cpp b/src/server/gameserver/skill/EffectRediance.cpp index 0f7a3364..58780a9e 100644 --- a/src/server/gameserver/skill/EffectRediance.cpp +++ b/src/server/gameserver/skill/EffectRediance.cpp @@ -18,7 +18,7 @@ EffectRediance::EffectRediance(Creature* pCreature) __BEGIN_TRY setTarget(pCreature); - // ѹ θ Ǵ°. ǹ̾. + // 한번 부를때마다 반전되는거. 의미없다. m_GiveExp = true; __END_CATCH @@ -70,7 +70,7 @@ void EffectRediance::unaffect(Creature* pCreature) Zone* pZone = pSlayer->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_REDIANCE); diff --git a/src/server/gameserver/skill/EffectReflection.cpp b/src/server/gameserver/skill/EffectReflection.cpp index e3ada8b6..0e6841d8 100644 --- a/src/server/gameserver/skill/EffectReflection.cpp +++ b/src/server/gameserver/skill/EffectReflection.cpp @@ -56,13 +56,13 @@ void EffectReflection::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isSlayer()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_REFLECTION); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_REFLECTION); diff --git a/src/server/gameserver/skill/EffectRegeneration.cpp b/src/server/gameserver/skill/EffectRegeneration.cpp index ab5db542..5e747d49 100644 --- a/src/server/gameserver/skill/EffectRegeneration.cpp +++ b/src/server/gameserver/skill/EffectRegeneration.cpp @@ -71,7 +71,7 @@ void EffectRegeneration::affect(Zone* pZone, ZoneCoord_t Cx, ZoneCoord_t Cy) if (!rect.ptInRect(X, Y)) continue; - // ŸϾȿ ϴ Ʈ ´. + // 타일안에 존재하는 오브젝트를 가져온다. Tile& tile = pZone->getTile(X, Y); const forward_list& oList = tile.getObjectList(); @@ -81,7 +81,7 @@ void EffectRegeneration::affect(Zone* pZone, ZoneCoord_t Cx, ZoneCoord_t Cy) Creature* pCreature = dynamic_cast(pTargetObject); Assert(pCreature != NULL); - // ڸ ɷְų ִ ġ ش. + // 코마가 걸려있거나 죽은 애는 치료 안해준다. // 2003. 3. 11. Sequoia if (pCreature->isSlayer() && !pCreature->isFlag(Effect::EFFECT_CLASS_COMA) && !pCreature->isDead()) { diff --git a/src/server/gameserver/skill/EffectReloadTimer.cpp b/src/server/gameserver/skill/EffectReloadTimer.cpp index f308e27e..3795794c 100644 --- a/src/server/gameserver/skill/EffectReloadTimer.cpp +++ b/src/server/gameserver/skill/EffectReloadTimer.cpp @@ -89,19 +89,19 @@ void EffectReloadTimer::unaffect(Creature* pCreature) Inventory* pInventory = NULL; bool bSuccess = false; - // ϴ ϵ ϵ ÷״ ŽŲ. + // 일단 성공하든 실패하든 플래그는 제거시킨다. pSlayer->removeFlag(Effect::EFFECT_CLASS_RELOAD_TIMER); if (pArmsItem != NULL) { if (isArmsWeapon(pArmsItem)) { if (m_bFromInventory) { - // κ丮 εϴ , - // κ丮 ο ã´. + // 인벤토리에서 직접 리로드하는 경우라면, + // 인벤토리 내부에서 아이템을 찾는다. pInventory = pSlayer->getInventory(); pItem = pInventory->getItem(m_invenX, m_invenY); } else { - // Ʈ εϴ - // Ʈ ο ã´. + // 벨트에서 리로드하는 경우라면 + // 벨트 내부에서 아이템을 찾는다. if (pSlayer->isWear(Slayer::WEAR_BELT)) { pBelt = pSlayer->getWearItem(Slayer::WEAR_BELT); pInventory = ((Belt*)pBelt)->getInventory(); @@ -110,37 +110,37 @@ void EffectReloadTimer::unaffect(Creature* pCreature) } if (pItem == NULL || pInventory == NULL) { - // cout << "EffectReloadTimer : ̰ų, κ丮 Դϴ." << endl; + // cout << "EffectReloadTimer : 아이템이 널이거나, 인벤토리가 널입니다." << endl; // cout << "EffectReloadTimer " << "unaffect END" << endl; return; } ObjectID_t ItemObjectID = pItem->getObjectID(); - // ִ ObjectID ġϴ üũѴ. + // 아이템이 있는지 그 아이템의 ObjectID가 일치하는지 체크한다. if (ItemObjectID == m_ObjectID && pItem->getItemClass() == Item::ITEM_CLASS_MAGAZINE) { BulletNum = reloadArmsItem(pArmsItem, pItem); - // ε尡 Ǿٸ ش. + // 리로드가 정상적으로 되었다면 저장해 준다. if (BulletNum != 0) { // pArmsItem->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); - // ȭ + // 아이템 저장 최적화 // by sigi. 2002.5.16 // Gun* pGun = dynamic_cast(pArmsItem); char pField[80]; sprintf(pField, "BulletCount=%d, Silver=%d", pArmsItem->getBulletCount(), pArmsItem->getSilver()); pArmsItem->tinysave(pField); - // źâ 2 ̶̻... + // 탄창의 갯수가 2개 이상이라면... if (pItem->getNum() > 1) { - // ̰, - // κ丮 Ը δ. + // 아이템의 갯수를 줄이고, + // 인벤토리 내부의 총 갯수 및 무게를 줄인다. pItem->setNum(pItem->getNum() - 1); pInventory->decreaseItemNum(); pInventory->decreaseWeight(pItem->getWeight()); - // پ Ѵ. + // 줄어든 아이템의 갯수를 저장한다. if (m_bFromInventory) { // pItem->save(pSlayer->getName(), STORAGE_INVENTORY, 0, m_invenX, m_invenY); // by sigi. 2002.5.16 @@ -153,7 +153,7 @@ void EffectReloadTimer::unaffect(Creature* pCreature) pItem->tinysave(pField); } } - // źâ 1 Ѵ. + // 탄창의 갯수가 1개라면 삭제해줘야 한다. else { if (m_bFromInventory) pInventory->deleteItem(m_invenX, m_invenY); diff --git a/src/server/gameserver/skill/EffectReloadTimer.h b/src/server/gameserver/skill/EffectReloadTimer.h index 826efe81..10b520ad 100644 --- a/src/server/gameserver/skill/EffectReloadTimer.h +++ b/src/server/gameserver/skill/EffectReloadTimer.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectReloadTimer.h // Written by : crazydog -// Description : źâ reload dealy effect +// Description : 탄창 reload dealy를 위한 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_RELOAD_TIMER__ @@ -50,11 +50,11 @@ class EffectReloadTimer : public Effect { } private: - CoordInven_t m_invenX; // κ丮 ε ǥ - CoordInven_t m_invenY; // κ丮 ε ǥ - ObjectID_t m_ObjectID; // źâ object id - SlotID_t m_SlotID; // Ʈ ε Ʈ slot id - bool m_bFromInventory; // κ丮 εϴ°? + CoordInven_t m_invenX; // 인벤토리에서 리로드할 때의 좌표 + CoordInven_t m_invenY; // 인벤토리에서 리로드할 때의 좌표 + ObjectID_t m_ObjectID; // 탄창 object id + SlotID_t m_SlotID; // 벨트에서 리로드할 때의 벨트 slot id + bool m_bFromInventory; // 인벤토리에서 직접 리로드하는가? }; diff --git a/src/server/gameserver/skill/EffectReputoFactum.cpp b/src/server/gameserver/skill/EffectReputoFactum.cpp index 92b78ee2..e33e22bf 100644 --- a/src/server/gameserver/skill/EffectReputoFactum.cpp +++ b/src/server/gameserver/skill/EffectReputoFactum.cpp @@ -57,8 +57,8 @@ void EffectReputoFactum::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_REPUTO_FACTUM); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); diff --git a/src/server/gameserver/skill/EffectReputoFactum.h b/src/server/gameserver/skill/EffectReputoFactum.h index f7544d3f..dccbf134 100644 --- a/src/server/gameserver/skill/EffectReputoFactum.h +++ b/src/server/gameserver/skill/EffectReputoFactum.h @@ -2,7 +2,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectReputoFactum.h // Written by : -// Description : ReputoFactum ϰ effect +// Description : ReputoFactum에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_REPUTO_FACTUM__ diff --git a/src/server/gameserver/skill/EffectRequital.cpp b/src/server/gameserver/skill/EffectRequital.cpp index a2aa9532..3f429b76 100644 --- a/src/server/gameserver/skill/EffectRequital.cpp +++ b/src/server/gameserver/skill/EffectRequital.cpp @@ -38,13 +38,13 @@ void EffectRequital::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isSlayer()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_REQUITAL); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_REQUITAL); diff --git a/src/server/gameserver/skill/EffectRestore.cpp b/src/server/gameserver/skill/EffectRestore.cpp index 0ead9870..6880bc59 100644 --- a/src/server/gameserver/skill/EffectRestore.cpp +++ b/src/server/gameserver/skill/EffectRestore.cpp @@ -18,7 +18,7 @@ EffectRestore::EffectRestore(Creature* pCreature) { __BEGIN_TRY - // Effect̴. by sigi. 2002.11.14 + // 서버 전용 Effect이다. by sigi. 2002.11.14 m_bBroadcastingEffect = false; setTarget(pCreature); diff --git a/src/server/gameserver/skill/EffectRevealer.cpp b/src/server/gameserver/skill/EffectRevealer.cpp index d6953a17..e9a50ebc 100644 --- a/src/server/gameserver/skill/EffectRevealer.cpp +++ b/src/server/gameserver/skill/EffectRevealer.cpp @@ -18,7 +18,7 @@ EffectRevealer::EffectRevealer(Creature* pCreature) { __BEGIN_TRY - // Ʈ ̾ ִ. + // 디텍트 히든은 슬레이어만이 쓸 수 있다. Assert(pCreature != NULL); Assert(pCreature->isSlayer()); @@ -57,17 +57,17 @@ void EffectRevealer::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isSlayer()); - // ÷׸ Ѵ. + // 플래그를 제거한다. pCreature->removeFlag(Effect::EFFECT_CLASS_REVEALER); - // ִ ũĵ Ѵ. + // 마법의 힘으로 보고 있던 크리쳐들을 삭제한다. Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); pZone->updateMineScan(pCreature); - // hidden . + // 이제 hidden도 본다. pZone->updateHiddenScan(pCreature); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_REVEALER); @@ -130,7 +130,7 @@ bool EffectRevealer::canSeeHide(Creature* pTarget) const level = pMonster->getLevel(); } else { - throw Error("̾ Ͱ ƴѵ ̵ϰ ִ"); + throw Error("뱀파이어나 몬스터가 아닌데 하이드하고 있다"); } if (m_SkillLevel >= 25 && m_SkillLevel > level) @@ -180,7 +180,7 @@ bool EffectRevealer::canSeeInvisibility(Creature* pTarget) const level = pMonster->getLevel(); } else { - throw Error("̾ Ͱ ƴѵ κƼ ִ."); + throw Error("뱀파이어나 몬스터가 아닌데 인비지빌리티를 쓰고 있다."); } if (m_SkillLevel >= 65 && (m_SkillLevel - 20) >= level) diff --git a/src/server/gameserver/skill/EffectRevealer.h b/src/server/gameserver/skill/EffectRevealer.h index 71113432..b7d09065 100644 --- a/src/server/gameserver/skill/EffectRevealer.h +++ b/src/server/gameserver/skill/EffectRevealer.h @@ -37,7 +37,7 @@ class EffectRevealer : public Effect { string toString() const throw(); - // ִ + // 볼 수 있는 레벨 계산 public: void setSkillLevel(ExpLevel_t level) throw() { m_SkillLevel = level; diff --git a/src/server/gameserver/skill/EffectRingOfFlare.cpp b/src/server/gameserver/skill/EffectRingOfFlare.cpp index 4e7a5770..38c24114 100644 --- a/src/server/gameserver/skill/EffectRingOfFlare.cpp +++ b/src/server/gameserver/skill/EffectRingOfFlare.cpp @@ -52,7 +52,7 @@ void EffectRingOfFlare::affect() Item* pWeapon = pOusters->getWearItem(Ousters::WEAR_RIGHTHAND); if (pWeapon == NULL || pWeapon->getItemClass() != Item::ITEM_CLASS_OUSTERS_WRISTLET || !pOusters->isRealWearingEx(Ousters::WEAR_RIGHTHAND)) { - // ߰ Ʋ Ʈ . + // 중간에 리스틀릿을 빼버리면 이펙트도 사라진다. setDeadline(0); return; } @@ -79,7 +79,7 @@ void EffectRingOfFlare::affect() if (!rect.ptInRect(X, Y)) continue; - // ŸϾȿ ϴ Ʈ ´. + // 타일안에 존재하는 오브젝트를 가져온다. Tile& tile = pZone->getTile(X, Y); if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) { @@ -88,8 +88,8 @@ void EffectRingOfFlare::affect() GCModifyInformation gcAttackerMI; - // ڽ ʴ´. ´´. ̾ ´. - // üũ + // 자신은 맞지 않는다. 무적도 안 맞는다. 슬레이어도 안 맞느다. + // 안전지대 체크 // 2003.1.10 by bezz, Sequoia if (pCreature == m_pTarget || !canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || pCreature->isOusters() || @@ -98,16 +98,16 @@ void EffectRingOfFlare::affect() } if (pCreature->isPC()) { - // cout << pCreature->getName() << " RingOfFlare " << m_Damage << "ŭ ϴ." << + // cout << pCreature->getName() << "을 RingOfFlare로 " << m_Damage << "만큼의 데미지를 줬습니다." << // endl; GCModifyInformation gcMI; ::setDamage(pCreature, m_Damage, pCastCreature, SKILL_RING_OF_FLARE, &gcMI, &gcAttackerMI); pCreature->getPlayer()->sendPacket(&gcMI); - // ´ ش. + // 맞는 동작을 보여준다. GCSkillToObjectOK2 gcSkillToObjectOK2; - gcSkillToObjectOK2.setObjectID(1); // ǹ . + gcSkillToObjectOK2.setObjectID(1); // 의미 없다. gcSkillToObjectOK2.setSkillType(SKILL_ATTACK_MELEE); gcSkillToObjectOK2.setDuration(0); pCreature->getPlayer()->sendPacket(&gcSkillToObjectOK2); @@ -127,7 +127,7 @@ void EffectRingOfFlare::affect() pZone->broadcastPacket(X, Y, &gcSkillToObjectOK4, pCreature); - // ׾ ġش. ..... + // 죽었으면 경험치준다. 음..... if (pCastCreature != NULL) { if (pCreature->isDead() && pCastCreature->isOusters()) { Ousters* pCastOusters = dynamic_cast(pCastCreature); @@ -161,7 +161,7 @@ void EffectRingOfFlare::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_RING_OF_FLARE); Zone* pZone = pCreature->getZone(); @@ -170,7 +170,7 @@ void EffectRingOfFlare::unaffect(Creature* pCreature) Ousters* pTargetOusters = dynamic_cast(pCreature); Assert(pTargetOusters != NULL); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(getSendEffectClass()); diff --git a/src/server/gameserver/skill/EffectSacrifice.cpp b/src/server/gameserver/skill/EffectSacrifice.cpp index 1c1140c0..10af108b 100644 --- a/src/server/gameserver/skill/EffectSacrifice.cpp +++ b/src/server/gameserver/skill/EffectSacrifice.cpp @@ -72,7 +72,7 @@ void EffectSacrifice::unaffect(Creature* pCreature) pCreature->removeFlag(Effect::EFFECT_CLASS_SACRIFICE); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_SACRIFICE); diff --git a/src/server/gameserver/skill/EffectSanctuary.cpp b/src/server/gameserver/skill/EffectSanctuary.cpp index 05081c4e..1630ed6a 100644 --- a/src/server/gameserver/skill/EffectSanctuary.cpp +++ b/src/server/gameserver/skill/EffectSanctuary.cpp @@ -31,10 +31,10 @@ EffectSanctuary::EffectSanctuary(Zone* pZone, ZoneCoord_t ZoneX, ZoneCoord_t Zon ////////////////////////////////////////////////////////////////////////////// // EffectSanctuary::affectCreature() -// bAffectByMove false ڸ ϴ ̹Ƿ.. -// ܺ SkillOK modify info . GCModifyInformation -// ʿ䰡 . -// pTarget þ߰ true return +// bAffectByMove가 false면 제자리에서 당하는 것이므로.. +// 외부의 SkillOK에서 modify info를 보낸다. 따라서 GCModifyInformation을 +// 보낼 필요가 없다. +// pTarget의 시야가 변한 경우 true를 return ////////////////////////////////////////////////////////////////////////////// bool EffectSanctuary::affectObject(Object* pTarget, bool bAffectByMove) @@ -44,7 +44,7 @@ bool EffectSanctuary::affectObject(Object* pTarget, bool bAffectByMove) // if (pTarget->getObjectClass() == Object::OBJECT_CLASS_CREATURE) // { // Creature* pTargetCreature = dynamic_cast(pTarget); - // // ̹ ɷִ 쿡 ٽ ʴ´. + // // 이미 걸려있는 경우에는 다시 걸지 않는다. // if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_SANCTUARY)) // { // return false; diff --git a/src/server/gameserver/skill/EffectSanctuary.h b/src/server/gameserver/skill/EffectSanctuary.h index f3340971..d4bb809e 100644 --- a/src/server/gameserver/skill/EffectSanctuary.h +++ b/src/server/gameserver/skill/EffectSanctuary.h @@ -85,13 +85,13 @@ class EffectSanctuary : public Effect { void unaffectObject(Object*, bool bUnaffectByMove); private: - // effect ߽ǥ + // effect의 중심좌표 ZoneCoord_t m_CenterX; ZoneCoord_t m_CenterY; Attr_t m_Level; Duration_t m_Duration; - Timeval m_StartTime; // ۵ ð. + Timeval m_StartTime; // 기술이 시작된 시간. }; #endif // __EFFECT_SANCTUARY__ diff --git a/src/server/gameserver/skill/EffectSatelliteBombAim.cpp b/src/server/gameserver/skill/EffectSatelliteBombAim.cpp index 0e75a953..10be8e18 100644 --- a/src/server/gameserver/skill/EffectSatelliteBombAim.cpp +++ b/src/server/gameserver/skill/EffectSatelliteBombAim.cpp @@ -58,11 +58,11 @@ void EffectSatelliteBombAim::unaffect(Creature* pCastCreature) Assert(pCastCreature != NULL); - // Ʈ ÷װ ٸ ׾ٰų ϴ transport ʰڴٴ° ǹѴ. + // 이펙트 플레그가 없다면 죽었다거나 하는 문제로 transport 하지 않겠다는걸 의미한다. if (!pCastCreature->isFlag(Effect::EFFECT_CLASS_SKILL_SATELLITE_BOMB_AIM)) return; - // Effect ְ ˸. + // Effect를 없애고 알린다. pCastCreature->removeFlag(Effect::EFFECT_CLASS_SKILL_SATELLITE_BOMB_AIM); GCRemoveEffect gcRemoveEffect; @@ -71,7 +71,7 @@ void EffectSatelliteBombAim::unaffect(Creature* pCastCreature) m_pZone->broadcastPacket(pCastCreature->getX(), pCastCreature->getY(), &gcRemoveEffect); - VSRect rect(0, 0, m_pZone->getWidth() - 1, m_pZone->getHeight() - 1); // -1 ߰ by sigi. 2003.1.10 + VSRect rect(0, 0, m_pZone->getWidth() - 1, m_pZone->getHeight() - 1); // -1 추가 by sigi. 2003.1.10 bool bHit = false; Damage_t maxDamage = 0; @@ -90,7 +90,7 @@ void EffectSatelliteBombAim::unaffect(Creature* pCastCreature) if (!rect.ptInRect(X, Y)) continue; - // ŸϾȿ ϴ Ʈ ´. + // 타일안에 존재하는 오브젝트를 가져온다. Tile& tile = m_pZone->getTile(X, Y); const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); @@ -106,7 +106,7 @@ void EffectSatelliteBombAim::unaffect(Creature* pCastCreature) Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // ڽ ʴ´. ´´. ̾ ʴ´. + // 자신은 맞지 않는다. 무적도 안 맞는다. 슬레이어는 맞지 않는다. if (pCreature == m_pTarget || !canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { continue; @@ -134,7 +134,7 @@ void EffectSatelliteBombAim::unaffect(Creature* pCastCreature) bool bHitRoll = HitRoll::isSuccess(pCastCreature, pCreature, bonus); if (bPK && bZoneLevelCheck && bHitRoll) { - // ų ʽ Ѵ. + // 원래 데미지와 스킬 데미지 보너스를 더한 최종 데미지를 구한다. Damage_t FinalDamage = 0; FinalDamage = computeDamage(pCastCreature, pCreature); FinalDamage += Damage; @@ -144,12 +144,12 @@ void EffectSatelliteBombAim::unaffect(Creature* pCastCreature) GCModifyInformation gcMI; ::setDamage(pCreature, FinalDamage, pCastCreature, SKILL_SATELLITE_BOMB, - &gcMI); // ::߰ by Sequoia + &gcMI); // ::추가 by Sequoia pCreature->getPlayer()->sendPacket(&gcMI); - // ´ ش. - gcSkillToObjectOK2.setObjectID(1); // ǹ . + // 맞는 동작을 보여준다. + gcSkillToObjectOK2.setObjectID(1); // 의미 없다. gcSkillToObjectOK2.setSkillType(SKILL_ATTACK_MELEE); gcSkillToObjectOK2.setDuration(0); pCreature->getPlayer()->sendPacket(&gcSkillToObjectOK2); @@ -159,7 +159,7 @@ void EffectSatelliteBombAim::unaffect(Creature* pCastCreature) Monster* pMonster = dynamic_cast(pCreature); ::setDamage(pMonster, FinalDamage, pCastCreature, - SKILL_SATELLITE_BOMB); // ::߰ by Sequoia + SKILL_SATELLITE_BOMB); // ::추가 by Sequoia pMonster->addEnemy(pCastCreature); bHit = true; @@ -203,12 +203,12 @@ void EffectSatelliteBombAim::unaffect(Creature* pCastCreature) } } - // Ʈ ֵ Ѵ. + // 포격 이펙트를 보여주도록 한다. GCAddEffectToTile gcAddEffectToTile; gcAddEffectToTile.setObjectID(pCastCreature->getObjectID()); gcAddEffectToTile.setEffectID(Effect::EFFECT_CLASS_SKILL_SATELLITE_BOMB_FIRE); gcAddEffectToTile.setXY(m_X, m_Y); - gcAddEffectToTile.setDuration(10); // ǹ̾. 1 + gcAddEffectToTile.setDuration(10); // 별 의미없다. 걍 1초 m_pZone->broadcastPacket(m_X, m_Y, &gcAddEffectToTile); @@ -229,8 +229,8 @@ void EffectSatelliteBombAim::unaffect() if (m_pZone != NULL && m_pZone == pCreature->getZone()) { unaffect(pCreature); } else { - // ׾ų ̵ߴٴ ǹ̹Ƿ Ʈ ְ εijѴ. - // Effect ְ ˸. + // 조준 도중 죽었거나 이동했다는 의미이므로 이펙트를 없애고 브로드캐스팅한다. + // Effect를 없애고 알린다. Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); diff --git a/src/server/gameserver/skill/EffectSeduction.cpp b/src/server/gameserver/skill/EffectSeduction.cpp index d80abe4a..f556b533 100644 --- a/src/server/gameserver/skill/EffectSeduction.cpp +++ b/src/server/gameserver/skill/EffectSeduction.cpp @@ -59,8 +59,8 @@ void EffectSeduction::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_SEDUCTION); if (pCreature->isSlayer()) { diff --git a/src/server/gameserver/skill/EffectShadowOfStorm.cpp b/src/server/gameserver/skill/EffectShadowOfStorm.cpp index 28460ed5..089673eb 100644 --- a/src/server/gameserver/skill/EffectShadowOfStorm.cpp +++ b/src/server/gameserver/skill/EffectShadowOfStorm.cpp @@ -44,7 +44,7 @@ void EffectShadowOfStorm::checkPosition() { if (!isValidZoneCoord(m_pZone, tx, ty)) continue; Tile& tile = m_pZone->getTile(tx, ty); - // Ÿ ȿ ϴ Ʈ ˻Ѵ. + // 타일 안에 존재하는 오브젝트들을 검색한다. const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { @@ -78,8 +78,8 @@ void EffectShadowOfStorm::affect() Assert(m_pZone != NULL); - // Ʈ ڸ ´. - // Ƿ NULL ִ. + // 이펙트 사용자를 가져온다. + // 존에 없을 수 있으므로 NULL 이 될 수 있다. Creature* pCastCreature = m_pZone->getCreature(m_UserObjectID); for (int i = -2; i <= 2; ++i) @@ -90,10 +90,10 @@ void EffectShadowOfStorm::affect() if (!isValidZoneCoord(m_pZone, tx, ty)) continue; - // Ʈ پִ Ÿ ޾ƿ´. + // 현재 이펙트가 붙어있는 타일을 받아온다. Tile& tile = m_pZone->getTile(tx, ty); - // Ÿ ȿ ϴ Ʈ ˻Ѵ. + // 타일 안에 존재하는 오브젝트들을 검색한다. const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { @@ -106,8 +106,8 @@ void EffectShadowOfStorm::affect() Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // üũ. by sigi. 2002.9.5 - // 鿪. by sigi. 2002.9.13 + // 무적상태 체크. by sigi. 2002.9.5 + // 산 면역. by sigi. 2002.9.13 if (pCastCreature != NULL && (!canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || !canHit(pCastCreature, pCreature, SKILL_SHADOW_OF_STORM))) { @@ -115,7 +115,7 @@ void EffectShadowOfStorm::affect() } // 2003.1.10 by Sequoia - // üũ + // 안전지대 체크 if (!checkZoneLevelToHitTarget(pCreature)) continue; @@ -165,9 +165,9 @@ void EffectShadowOfStorm::affect() ::setDamage(pMonster, damage, pCastCreature, SKILL_SHADOW_OF_STORM, NULL, &gcAttackerMI, true, false); } else - continue; // ƿ콺 NPC ... -_- + continue; // 아우스터즈나 NPC 상대로... -_- - // ׾ ġش. ..... + // 죽었으면 경험치준다. 음..... if (pCastCreature != NULL) { if (pCreature->isDead() && pCastCreature->isOusters()) { Ousters* pCastOusters = dynamic_cast(pCastCreature); @@ -179,7 +179,7 @@ void EffectShadowOfStorm::affect() } } - // ϱ + // 성향 계산하기 /* if ( pCastCreature != NULL && pCastCreature->isPC() && pCreature->isPC() diff --git a/src/server/gameserver/skill/EffectShadowOfStorm.h b/src/server/gameserver/skill/EffectShadowOfStorm.h index ead05482..26a9f8cd 100644 --- a/src/server/gameserver/skill/EffectShadowOfStorm.h +++ b/src/server/gameserver/skill/EffectShadowOfStorm.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectShadowOfStorm.h // Written by : elca@ewestsoft.com -// Description : ShadowOfStorm Effect óֱ Ŭ̴. +// Description : 성직마법 ShadowOfStorm의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_SHADOW_OF_STORM__ diff --git a/src/server/gameserver/skill/EffectSharpChakram.cpp b/src/server/gameserver/skill/EffectSharpChakram.cpp index ca2e122a..271c9eee 100644 --- a/src/server/gameserver/skill/EffectSharpChakram.cpp +++ b/src/server/gameserver/skill/EffectSharpChakram.cpp @@ -36,7 +36,7 @@ void EffectSharpChakram::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_SHARP_CHAKRAM); Zone* pZone = pCreature->getZone(); @@ -47,7 +47,7 @@ void EffectSharpChakram::unaffect(Creature* pCreature) pTargetOusters->initAllStatAndSend(); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_SHARP_CHAKRAM); diff --git a/src/server/gameserver/skill/EffectSharpHail.cpp b/src/server/gameserver/skill/EffectSharpHail.cpp index 34e0ff29..3e1f5539 100644 --- a/src/server/gameserver/skill/EffectSharpHail.cpp +++ b/src/server/gameserver/skill/EffectSharpHail.cpp @@ -45,8 +45,8 @@ void EffectSharpHail::affect() Assert(m_pZone != NULL); - // Ʈ ڸ ´. - // Ƿ NULL ִ. + // 이펙트 사용자를 가져온다. + // 존에 없을 수 있으므로 NULL 이 될 수 있다. Creature* pCastCreature = m_pZone->getCreature(m_UserObjectID); if (pCastCreature == NULL && !isForce()) { @@ -55,10 +55,10 @@ void EffectSharpHail::affect() return; } - // Ʈ پִ Ÿ ޾ƿ´. + // 현재 이펙트가 붙어있는 타일을 받아온다. Tile& tile = m_pZone->getTile(m_X, m_Y); - // Ÿ ȿ ϴ Ʈ ˻Ѵ. + // 타일 안에 존재하는 오브젝트들을 검색한다. const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { @@ -71,8 +71,8 @@ void EffectSharpHail::affect() Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // üũ. by sigi. 2002.9.5 - // 鿪. by sigi. 2002.9.13 + // 무적상태 체크. by sigi. 2002.9.5 + // 산 면역. by sigi. 2002.9.13 if (pCastCreature != NULL && (!canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || !canHit(pCastCreature, pCreature, SKILL_SHARP_HAIL, getLevel()))) { @@ -80,7 +80,7 @@ void EffectSharpHail::affect() } // 2003.1.10 by Sequoia - // üũ + // 안전지대 체크 if (!checkZoneLevelToHitTarget(pCreature)) continue; if (pCastCreature != NULL && !HitRoll::isSuccess(pCastCreature, pCreature)) @@ -122,9 +122,9 @@ void EffectSharpHail::affect() Assert(pPlayer != NULL); pPlayer->sendPacket(&gcDefenderMI); } else - continue; // ƿ콺 NPC ... -_- + continue; // 아우스터즈나 NPC 상대로... -_- - // ׾ ġش. ..... + // 죽었으면 경험치준다. 음..... if (pCastCreature != NULL) { if (pCreature->isDead() && pCastCreature->isOusters()) { Ousters* pCastOusters = dynamic_cast(pCastCreature); diff --git a/src/server/gameserver/skill/EffectSharpHail.h b/src/server/gameserver/skill/EffectSharpHail.h index a48b4e3f..8895f98a 100644 --- a/src/server/gameserver/skill/EffectSharpHail.h +++ b/src/server/gameserver/skill/EffectSharpHail.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectSharpHail.h // Written by : elca@ewestsoft.com -// Description : SharpHail Effect óֱ Ŭ̴. +// Description : 성직마법 SharpHail의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_SHARP_HAIL__ diff --git a/src/server/gameserver/skill/EffectSharpShield.cpp b/src/server/gameserver/skill/EffectSharpShield.cpp index 00de3ba7..ca5ba6c9 100644 --- a/src/server/gameserver/skill/EffectSharpShield.cpp +++ b/src/server/gameserver/skill/EffectSharpShield.cpp @@ -56,13 +56,13 @@ void EffectSharpShield::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isSlayer()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_SHARP_SHIELD_1); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(m_ClientEffectClass); diff --git a/src/server/gameserver/skill/EffectSharpShield.h b/src/server/gameserver/skill/EffectSharpShield.h index e7ca5a9f..cdb039bf 100644 --- a/src/server/gameserver/skill/EffectSharpShield.h +++ b/src/server/gameserver/skill/EffectSharpShield.h @@ -55,8 +55,8 @@ class EffectSharpShield : public Effect { } private: - EffectClass m_ClientEffectClass; // Ŭ̾Ʈ ٶ Ʈ Ŭ ̵ - Damage_t m_Damage; // ִ + EffectClass m_ClientEffectClass; // 클라이언트에 보내줄때 쓰는 이펙트 클래스 아이디 + Damage_t m_Damage; // 때린놈한테 주는 데미지 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/skill/EffectSnipingMode.cpp b/src/server/gameserver/skill/EffectSnipingMode.cpp index 734f40b1..4ef4cc6e 100644 --- a/src/server/gameserver/skill/EffectSnipingMode.cpp +++ b/src/server/gameserver/skill/EffectSnipingMode.cpp @@ -52,12 +52,12 @@ void EffectSnipingMode::unaffect(Creature* pCreature) // cout << "EffectSnipingMode " << "unaffect BEGIN" << endl; Assert(pCreature != NULL); - Assert(pCreature->isSlayer()); // ̾ ɸ ʴ´. + Assert(pCreature->isSlayer()); // 슬레이어말고는 걸리지 않는다. Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // addUnSnipingModeCreature() ο ÷׸ Ƿ... + // addUnSnipingModeCreature() 내부에서 플래그를 끄므로... // pCreature->removeFlag(Effect::EFFECT_CLASS_SNIPING_MODE); addUnSnipingModeCreature(pZone, pCreature, false); diff --git a/src/server/gameserver/skill/EffectSoulChain.cpp b/src/server/gameserver/skill/EffectSoulChain.cpp index 568e6938..2dbecb92 100644 --- a/src/server/gameserver/skill/EffectSoulChain.cpp +++ b/src/server/gameserver/skill/EffectSoulChain.cpp @@ -2,8 +2,8 @@ // Filename : EffectSoulChain.cpp // Written by : elca // Description : -// α Sniping Ǵ ̾ Invisibility ؼ -// ִ( ִ) ũĿ ٴ Ʈ̴. +// 군인기술 Sniping 또는 뱀파이어 기술 Invisibility로 인해서 +// 현재 점점 희미해져가고 있는(사라지고 있는) 크리쳐에 붙는 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #include "EffectSoulChain.h" @@ -55,7 +55,7 @@ void EffectSoulChain::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // Ʈ ÷װ ٸ ׾ٰų ϴ transport ʰڴٴ° ǹѴ. + // 이펙트 플레그가 없다면 죽었다거나 하는 문제로 transport 하지 않겠다는걸 의미한다. if (!pCreature->isFlag(Effect::EFFECT_CLASS_SOUL_CHAIN)) return; @@ -75,13 +75,13 @@ void EffectSoulChain::unaffect(Creature* pCreature) ZoneCoord_t y = pCreature->getY(); pCreature->removeFlag(Effect::EFFECT_CLASS_SOUL_CHAIN); - // Effect ˸. + // Effect 가 없어졌음을 알린다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_SOUL_CHAIN); pZone->broadcastPacket(x, y, &gcRemoveEffect); - // Target üũؼ ϸ Ѵ. + // Target 을 체크해서 전송이 가능하면 전송한다. bool bValid = false; if (pPC->hasRelicItem() || pPC->isFlag(Effect::EFFECT_CLASS_HAS_FLAG) || @@ -95,15 +95,15 @@ void EffectSoulChain::unaffect(Creature* pCreature) if (pTargetCreature != NULL) { Zone* pTargetZone = pTargetCreature->getZone(); if (pTargetZone != NULL) { - // δ ̵ . + // 마스터 레어로는 이동할 수 없다. if (!pTargetZone->isMasterLair() && !GDRLairManager::Instance().isGDRLairZone(pTargetZone->getZoneID())) { - // ̿ Ѱ? + // 유료 서비스 이용이 가능한가? if (pGamePlayer->loginPayPlay(pGamePlayer->getSocket()->getHost(), pGamePlayer->getID()) || pGamePlayer->isFamilyFreePass() || !(g_pZoneInfoManager->getZoneInfo(pTargetZone->getZoneID())->isPayPlay())) { - // ɺ, ÿܰ, ̺Ʈ, ̺ƮOX δ . - // ׸޸ ε . + // 야전사령부, 시외곽지역, 이벤트경기장, 이벤트OX 존으로는 갈 수 없다. + // 테메리에 성지로도 갈 수 없다. if (pTargetZone->getZoneID() != 2101 && pTargetZone->getZoneID() != 2102 && pTargetZone->getZoneID() != 1005 && pTargetZone->getZoneID() != 1006 && pTargetZone->getZoneID() != 1122 && pTargetZone->getZoneID() != 1131 && diff --git a/src/server/gameserver/skill/EffectSoulChain.h b/src/server/gameserver/skill/EffectSoulChain.h index 861aa38d..c3bcb4a5 100644 --- a/src/server/gameserver/skill/EffectSoulChain.h +++ b/src/server/gameserver/skill/EffectSoulChain.h @@ -2,8 +2,8 @@ // Filename : EffectSoulChain.h // Written by : elca@ewestsoft.com // Description : -// α Sniping Ǵ ̾ Invisibility ؼ -// ִ( ִ) ũĿ ٴ Ʈ̴. +// 군인기술 Sniping 또는 뱀파이어 기술 Invisibility로 인해서 +// 현재 점점 희미해져가고 있는(사라지고 있는) 크리쳐에 붙는 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_SOUL_CHAIN__ @@ -57,9 +57,9 @@ class EffectSoulChain : public Effect { } private: - ObjectID_t m_OwnerOID; // Ʈ ɸ OwnerID + ObjectID_t m_OwnerOID; // 이펙트 걸린 놈의 OwnerID - Zone* m_pZone; // Zone + Zone* m_pZone; // Zone 포인터 Duration_t m_Duration; diff --git a/src/server/gameserver/skill/EffectSpiritGuard.cpp b/src/server/gameserver/skill/EffectSpiritGuard.cpp index 4d752d4e..9dff5348 100644 --- a/src/server/gameserver/skill/EffectSpiritGuard.cpp +++ b/src/server/gameserver/skill/EffectSpiritGuard.cpp @@ -98,15 +98,15 @@ void EffectSpiritGuard::affect(Creature* pCastCreature) if (!rect.ptInRect(X, Y)) continue; - // ŸϾȿ ϴ Ʈ ´. + // 타일안에 존재하는 오브젝트를 가져온다. Tile& tile = pZone->getTile(X, Y); if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) { Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_WALKING); Assert(pCreature != NULL); - // ڽ ʴ´. ´´. ̾ ´. - // üũ + // 자신은 맞지 않는다. 무적도 안 맞는다. 슬레이어도 안 맞느다. + // 안전지대 체크 // 2003.1.10 by bezz, Sequoia if (pCreature == m_pTarget || !canAttack(pCastCreature, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || pCreature->isSlayer() || pCreature->isNPC() || @@ -128,9 +128,9 @@ void EffectSpiritGuard::affect(Creature* pCastCreature) pCreature->getPlayer()->sendPacket(&gcMI); - // ´ ش. + // 맞는 동작을 보여준다. GCSkillToObjectOK2 gcSkillToObjectOK2; - gcSkillToObjectOK2.setObjectID(1); // ǹ . + gcSkillToObjectOK2.setObjectID(1); // 의미 없다. gcSkillToObjectOK2.setSkillType(SKILL_ATTACK_MELEE); gcSkillToObjectOK2.setDuration(0); pCreature->getPlayer()->sendPacket(&gcSkillToObjectOK2); @@ -188,7 +188,7 @@ void EffectSpiritGuard::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Effect ְ ˸. + // Effect를 없애고 알린다. pCreature->removeFlag(Effect::EFFECT_CLASS_SPIRIT_GUARD_1); GCRemoveEffect gcRemoveEffect; diff --git a/src/server/gameserver/skill/EffectStoneSkin.cpp b/src/server/gameserver/skill/EffectStoneSkin.cpp index f48a5412..36188768 100644 --- a/src/server/gameserver/skill/EffectStoneSkin.cpp +++ b/src/server/gameserver/skill/EffectStoneSkin.cpp @@ -70,7 +70,7 @@ void EffectStoneSkin::unaffect(Creature* pCreature) Zone* pZone = pVampire->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pVampire->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_STONE_SKIN); diff --git a/src/server/gameserver/skill/EffectStorm.cpp b/src/server/gameserver/skill/EffectStorm.cpp index 9497d8ff..883af25a 100644 --- a/src/server/gameserver/skill/EffectStorm.cpp +++ b/src/server/gameserver/skill/EffectStorm.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectStorm.cpp -// Written by : ȫâ +// Written by : 장홍창 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -60,13 +60,13 @@ void EffectStorm::affect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // EffectStorm AcidStorm, PoisonStorm, BloodyStorm ٴ´. - // ̴ 3 ְ . + // EffectStorm은 AcidStorm, PoisonStorm, BloodyStorm위를 지나갈때 붙는다. + // 이는 3번의 연속 데미지를 주고 사라진다. Damage_t StormDamage = m_Point; if (!(pZone->getZoneLevel() & COMPLETE_SAFE_ZONE) - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 && canAttack(NULL, pCreature) && !pCreature->isFlag(Effect::EFFECT_CLASS_COMA) && !pCreature->isDead()) { if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -82,7 +82,7 @@ void EffectStorm::affect(Creature* pCreature) gcMI.addShortData(MODIFY_CURRENT_HP, RemainHP); pSlayer->getPlayer()->sendPacket(&gcMI); - // HP εijش. + // 변한 HP를 브로드캐스팅해준다. GCStatusCurrentHP pkt; pkt.setObjectID(pSlayer->getObjectID()); pkt.setCurrentHP(RemainHP); @@ -102,7 +102,7 @@ void EffectStorm::affect(Creature* pCreature) gcMI.addShortData(MODIFY_CURRENT_HP, RemainHP); pVampire->getPlayer()->sendPacket(&gcMI); - // HP εijش. + // 변한 HP를 브로드캐스팅해준다. GCStatusCurrentHP pkt; pkt.setObjectID(pVampire->getObjectID()); pkt.setCurrentHP(RemainHP); @@ -122,7 +122,7 @@ void EffectStorm::affect(Creature* pCreature) gcMI.addShortData(MODIFY_CURRENT_HP, RemainHP); pOusters->getPlayer()->sendPacket(&gcMI); - // HP εijش. + // 변한 HP를 브로드캐스팅해준다. GCStatusCurrentHP pkt; pkt.setObjectID(pOusters->getObjectID()); pkt.setCurrentHP(RemainHP); @@ -138,7 +138,7 @@ void EffectStorm::affect(Creature* pCreature) pMonster->setHP(RemainHP, ATTR_CURRENT); - // HP εijش. + // 변한 HP를 브로드캐스팅해준다. GCStatusCurrentHP pkt; pkt.setObjectID(pMonster->getObjectID()); pkt.setCurrentHP(RemainHP); @@ -147,7 +147,7 @@ void EffectStorm::affect(Creature* pCreature) } - // m_CasterName pCreature KillCount ó + // m_CasterName이 pCreature를 죽인 경우의 KillCount 처리 // by sigi. 2002.9.9 if (pCreature->isDead()) { Creature* pAttacker = pZone->getCreature(m_CasterName); @@ -188,7 +188,7 @@ void EffectStorm::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_STORM); diff --git a/src/server/gameserver/skill/EffectStormAcid.cpp b/src/server/gameserver/skill/EffectStormAcid.cpp index e007cfd9..00476d8d 100644 --- a/src/server/gameserver/skill/EffectStormAcid.cpp +++ b/src/server/gameserver/skill/EffectStormAcid.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectStormAcid.cpp -// Written by : ȫâ +// Written by : 장홍창 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -61,22 +61,22 @@ void EffectStormAcid::affect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // ڸ ´. - // !! ̹ Ƿ NULL ִ. + // 사용자를 가져온다. + // !! 이미 존을 나갔을 수 있으므로 NULL이 될 수 있다. // by bezz. 2003.3.13 Creature* pCastCreature = pZone->getCreature(m_UserObjectID); - // ijͰ Ѵ. + // 캐스터가 없으면 무시한다. if (pCastCreature == NULL) return; - // EffectStormAcid AcidStorm, PoisonStorm, BloodyStorm ٴ´. - // ̴ 3 ְ . + // EffectStormAcid은 AcidStorm, PoisonStorm, BloodyStorm위를 지나갈때 붙는다. + // 이는 3번의 연속 데미지를 주고 사라진다. Damage_t StormDamage = m_Point; GCModifyInformation GCAttackerMI; if (!(pZone->getZoneLevel() & COMPLETE_SAFE_ZONE) - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 && canAttack(pCastCreature, pCreature) && !pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -112,9 +112,9 @@ void EffectStormAcid::affect(Creature* pCreature) pVampire->getPlayer()->sendPacket(&GCAttackerMI); } - // m_CasterName pCreature KillCount ó + // m_CasterName이 pCreature를 죽인 경우의 KillCount 처리 // by sigi. 2002.9.9 - // setDamage ҷ óѴ. ּó + // setDamage 를 불러서 처리한다. 주석처리 // by bezz. 2002.12.31 /* if (pCreature->isDead()) { @@ -157,7 +157,7 @@ void EffectStormAcid::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_STORM_ACID); diff --git a/src/server/gameserver/skill/EffectStormBloody.cpp b/src/server/gameserver/skill/EffectStormBloody.cpp index e3428a5f..c35e832b 100644 --- a/src/server/gameserver/skill/EffectStormBloody.cpp +++ b/src/server/gameserver/skill/EffectStormBloody.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectStormBloody.cpp -// Written by : ȫâ +// Written by : 장홍창 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -61,22 +61,22 @@ void EffectStormBloody::affect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // ڸ ´. - // !! ̹ Ƿ NULL ִ. + // 사용자를 가져온다. + // !! 이미 존을 나갔을 수 있으므로 NULL이 될 수 있다. // by bezz. 2003.3.13 Creature* pCastCreature = pZone->getCreature(m_UserObjectID); - // ijͰ Ѵ. + // 캐스터가 없으면 무시한다. if (pCastCreature == NULL) return; - // EffectStormBloody AcidStorm, PoisonStorm, BloodyStorm ٴ´. - // ̴ 3 ְ . + // EffectStormBloody은 AcidStorm, PoisonStorm, BloodyStorm위를 지나갈때 붙는다. + // 이는 3번의 연속 데미지를 주고 사라진다. Damage_t StormDamage = m_Point; GCModifyInformation GCAttackerMI; if (!(pZone->getZoneLevel() & COMPLETE_SAFE_ZONE) - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 && canAttack(pCastCreature, pCreature)) { if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -112,9 +112,9 @@ void EffectStormBloody::affect(Creature* pCreature) pVampire->getPlayer()->sendPacket(&GCAttackerMI); } - // m_CasterName pCreature KillCount ó + // m_CasterName이 pCreature를 죽인 경우의 KillCount 처리 // by sigi. 2002.9.9 - // setDamage ҷ óѴ. ּó + // setDamage 를 불러서 처리한다. 주석처리 // by bezz. 2002.12.31 /* if (pCreature->isDead()) { @@ -157,7 +157,7 @@ void EffectStormBloody::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_STORM_BLOODY); diff --git a/src/server/gameserver/skill/EffectStormPoison.cpp b/src/server/gameserver/skill/EffectStormPoison.cpp index d309a943..0789c9af 100644 --- a/src/server/gameserver/skill/EffectStormPoison.cpp +++ b/src/server/gameserver/skill/EffectStormPoison.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectStormPoison.cpp -// Written by : ȫâ +// Written by : 장홍창 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -61,22 +61,22 @@ void EffectStormPoison::affect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // ڸ ´. - // !! ̹ Ƿ NULL ִ. + // 사용자를 가져온다. + // !! 이미 존을 나갔을 수 있으므로 NULL이 될 수 있다. // by bezz. 2003.3.13 Creature* pCastCreature = pZone->getCreature(m_UserObjectID); - // ijͰ Ѵ. + // 캐스터가 없으면 무시한다. if (pCastCreature == NULL) return; - // EffectStormPoison AcidStorm, PoisonStorm, BloodyStorm ٴ´. - // ̴ 3 ְ . + // EffectStormPoison은 AcidStorm, PoisonStorm, BloodyStorm위를 지나갈때 붙는다. + // 이는 3번의 연속 데미지를 주고 사라진다. Damage_t StormDamage = m_Point; GCModifyInformation GCAttackerMI; if (!(pZone->getZoneLevel() & COMPLETE_SAFE_ZONE) - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 && canAttack(pCastCreature, pCreature)) { if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -112,9 +112,9 @@ void EffectStormPoison::affect(Creature* pCreature) pVampire->getPlayer()->sendPacket(&GCAttackerMI); } - // m_CasterName pCreature KillCount ó + // m_CasterName이 pCreature를 죽인 경우의 KillCount 처리 // by sigi. 2002.9.9 - // set damage ҷ óѴ. ּ ó + // set damage 를 불러서 처리한다. 주석 처리 // by bezz. 2002.12.31 /* if (pCreature->isDead()) { @@ -157,7 +157,7 @@ void EffectStormPoison::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_STORM_POSION); diff --git a/src/server/gameserver/skill/EffectStriking.cpp b/src/server/gameserver/skill/EffectStriking.cpp index 162bc098..058bea6b 100644 --- a/src/server/gameserver/skill/EffectStriking.cpp +++ b/src/server/gameserver/skill/EffectStriking.cpp @@ -59,10 +59,10 @@ void EffectStriking::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isSlayer()); - // ÷׸ . + // 먼저 플래그를 날린다. pCreature->removeFlag(Effect::EFFECT_CLASS_STRIKING); - // ɷġ ؼ ش. + // 능력치를 새로 계산해서 보내준다. Slayer* pSlayer = dynamic_cast(pCreature); SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); @@ -70,7 +70,7 @@ void EffectStriking::unaffect(Creature* pCreature) pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); - // Ʈ ٰ ˸. + // 이펙트가 사라졌다고 주위에 알린다. Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); GCRemoveEffect gcRemoveEffect; diff --git a/src/server/gameserver/skill/EffectStriking.old.cpp b/src/server/gameserver/skill/EffectStriking.old.cpp index 669a1cfd..d7cf91ae 100644 --- a/src/server/gameserver/skill/EffectStriking.old.cpp +++ b/src/server/gameserver/skill/EffectStriking.old.cpp @@ -68,7 +68,7 @@ void EffectStriking::unaffect(Item* pItem) int damage = 0; - // ȭ damage ǵ. + // 변화된 damage를 되돌린다. if (pItem->getItemClass() == Item::ITEM_CLASS_SWORD) { Sword* pI = dynamic_cast(pItem); pI->setBonusDamage(pI->getBonusDamage() - m_incDamage); diff --git a/src/server/gameserver/skill/EffectSummonCasket.cpp b/src/server/gameserver/skill/EffectSummonCasket.cpp index b1e2572e..9e1e6a0c 100644 --- a/src/server/gameserver/skill/EffectSummonCasket.cpp +++ b/src/server/gameserver/skill/EffectSummonCasket.cpp @@ -83,10 +83,10 @@ void EffectSummonCasket::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // ǵ, ÷׸ Ѵ. + // 원래 모습으로 되돌리고, 플래그를 제거한다. pCreature->removeFlag(Effect::EFFECT_CLASS_CASKET); - // ɷġ ǵ. + // 능력치를 원래대로 되돌린다. if (pCreature->isVampire()) { Vampire* pTargetVampire = dynamic_cast(pCreature); VAMPIRE_RECORD prev; diff --git a/src/server/gameserver/skill/EffectSummonCasket.h b/src/server/gameserver/skill/EffectSummonCasket.h index 63685a68..a6018ebb 100644 --- a/src/server/gameserver/skill/EffectSummonCasket.h +++ b/src/server/gameserver/skill/EffectSummonCasket.h @@ -42,7 +42,7 @@ class EffectSummonCasket : public Effect { } private: - int m_Type; // casket + int m_Type; // casket 종류 }; #endif // __EFFECT_SUMMON_CASKET__ diff --git a/src/server/gameserver/skill/EffectSummonFireElemental.cpp b/src/server/gameserver/skill/EffectSummonFireElemental.cpp index 5bc05bb0..a8d2fa45 100644 --- a/src/server/gameserver/skill/EffectSummonFireElemental.cpp +++ b/src/server/gameserver/skill/EffectSummonFireElemental.cpp @@ -55,7 +55,7 @@ void EffectSummonFireElemental::affect() Item* pWeapon = pOusters->getWearItem(Ousters::WEAR_RIGHTHAND); if (pWeapon == NULL || pWeapon->getItemClass() != Item::ITEM_CLASS_OUSTERS_WRISTLET || !pOusters->isRealWearingEx(Ousters::WEAR_RIGHTHAND)) { - // ߰ Ʋ Ʈ . + // 중간에 리스틀릿을 빼버리면 이펙트도 사라진다. setDeadline(0); return; } @@ -138,7 +138,7 @@ void EffectSummonFireElemental::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_FIRE_ELEMENTAL); Zone* pZone = pCreature->getZone(); @@ -147,7 +147,7 @@ void EffectSummonFireElemental::unaffect(Creature* pCreature) Ousters* pTargetOusters = dynamic_cast(pCreature); Assert(pTargetOusters != NULL); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_FIRE_ELEMENTAL); diff --git a/src/server/gameserver/skill/EffectSummonSylph.cpp b/src/server/gameserver/skill/EffectSummonSylph.cpp index e62a32c3..a6b2ceed 100644 --- a/src/server/gameserver/skill/EffectSummonSylph.cpp +++ b/src/server/gameserver/skill/EffectSummonSylph.cpp @@ -36,7 +36,7 @@ void EffectSummonSylph::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_SUMMON_SYLPH); Zone* pZone = pCreature->getZone(); @@ -52,7 +52,7 @@ void EffectSummonSylph::unaffect(Creature* pCreature) pTargetOusters->sendRealWearingInfo(); pTargetOusters->sendModifyInfo(prev); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(getSendEffectClass()); diff --git a/src/server/gameserver/skill/EffectSummonWaterElemental.cpp b/src/server/gameserver/skill/EffectSummonWaterElemental.cpp index fb549b20..1052100f 100644 --- a/src/server/gameserver/skill/EffectSummonWaterElemental.cpp +++ b/src/server/gameserver/skill/EffectSummonWaterElemental.cpp @@ -55,7 +55,7 @@ void EffectSummonWaterElemental::affect() Item* pWeapon = pOusters->getWearItem(Ousters::WEAR_RIGHTHAND); if (pWeapon == NULL || pWeapon->getItemClass() != Item::ITEM_CLASS_OUSTERS_WRISTLET || !pOusters->isRealWearingEx(Ousters::WEAR_RIGHTHAND)) { - // ߰ Ʋ Ʈ . + // 중간에 리스틀릿을 빼버리면 이펙트도 사라진다. setDeadline(0); return; } @@ -78,8 +78,8 @@ void EffectSummonWaterElemental::affect() int PartyID = pOusters->getPartyID(); if (PartyID != 0) { - // Ƽ ԵǾ ִٸ Ƽ Ŵ - // Ƽ ġ Ѵ. + // 파티에 가입되어 있다면 로컬 파티 매니저를 통해 + // 주위의 파티원들과 경험치를 공유한다. LocalPartyManager* pLPM = pOusters->getLocalPartyManager(); Assert(pLPM != NULL); healed = pLPM->shareWaterElementalHeal(PartyID, pOusters, HealPoint); @@ -140,7 +140,7 @@ void EffectSummonWaterElemental::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_WATER_ELEMENTAL); Zone* pZone = pCreature->getZone(); @@ -149,7 +149,7 @@ void EffectSummonWaterElemental::unaffect(Creature* pCreature) Ousters* pTargetOusters = dynamic_cast(pCreature); Assert(pTargetOusters != NULL); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_WATER_ELEMENTAL); diff --git a/src/server/gameserver/skill/EffectTendril.cpp b/src/server/gameserver/skill/EffectTendril.cpp index 345007e7..79673e17 100644 --- a/src/server/gameserver/skill/EffectTendril.cpp +++ b/src/server/gameserver/skill/EffectTendril.cpp @@ -57,8 +57,8 @@ void EffectTendril::unaffect(Creature* pCreature) Assert(pCreature != NULL); - // ɷġ ǵ ؼ ÷׸ , - // initAllStat ҷ Ѵ. + // 능력치를 정상적으로 되돌리기 위해서는 플래그를 끄고, + // initAllStat을 불러야 한다. pCreature->removeFlag(Effect::EFFECT_CLASS_TENDRIL); pCreature->removeFlag(Effect::EFFECT_CLASS_NO_DAMAGE); Zone* pZone = pCreature->getZone(); diff --git a/src/server/gameserver/skill/EffectTendril.h b/src/server/gameserver/skill/EffectTendril.h index 41e5f673..2241dfe7 100644 --- a/src/server/gameserver/skill/EffectTendril.h +++ b/src/server/gameserver/skill/EffectTendril.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectTendril.h // Written by : -// Description : Tendril ϰ effect +// Description : Tendril에 의한 방어력 하강 effect ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_TENDRIL__ diff --git a/src/server/gameserver/skill/EffectTileStorm.h b/src/server/gameserver/skill/EffectTileStorm.h index e5ee0729..849735cc 100644 --- a/src/server/gameserver/skill/EffectTileStorm.h +++ b/src/server/gameserver/skill/EffectTileStorm.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectTileStorm.h // Written by : elca@ewestsoft.com -// Description : TileStorm Effect óֱ Ŭ̴. +// Description : 성직마법 TileStorm의 Effect를 처리해주기 위한 클래스이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_TILE_STORM__ @@ -79,9 +79,9 @@ class EffectTileStorm : public Effect { int m_Damage; ObjectID_t m_UserObjectID; SkillType_t m_SkillType; - int m_StormTime; // ϴ°? - Turn_t m_Tick; // °? - bool m_bLarge; // true 5x5 false 3x3 + int m_StormTime; // 데미지를 몇 번 가하는가? + Turn_t m_Tick; // 몇 턴 간격으로 떨어지는가? + bool m_bLarge; // true 면 5x5 false면 3x3 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/skill/EffectTransformToBat.cpp b/src/server/gameserver/skill/EffectTransformToBat.cpp index 1d3c34f2..32d760fd 100644 --- a/src/server/gameserver/skill/EffectTransformToBat.cpp +++ b/src/server/gameserver/skill/EffectTransformToBat.cpp @@ -85,11 +85,11 @@ void EffectTransformToBat::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // ǵ, ÷׸ Ѵ. + // 원래 모습으로 되돌리고, 플래그를 제거한다. addUntransformCreature(pZone, pCreature, false); pCreature->removeFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT); - // ɷġ ǵ. + // 능력치를 원래대로 되돌린다. if (pCreature->isVampire()) { Vampire* pVampire = dynamic_cast(pCreature); VAMPIRE_RECORD prev; diff --git a/src/server/gameserver/skill/EffectTransformToWerwolf.cpp b/src/server/gameserver/skill/EffectTransformToWerwolf.cpp index d40e0f4c..4b89eff7 100644 --- a/src/server/gameserver/skill/EffectTransformToWerwolf.cpp +++ b/src/server/gameserver/skill/EffectTransformToWerwolf.cpp @@ -87,11 +87,11 @@ void EffectTransformToWerwolf::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // ǵ, ÷׸ Ѵ. + // 원래 모습으로 되돌리고, 플래그를 제거한다. addUntransformCreature(pZone, pCreature, false); pCreature->removeFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WERWOLF); - // ɷġ ǵ. + // 능력치를 원래대로 되돌린다. if (pCreature->isVampire()) { Vampire* pTargetVampire = dynamic_cast(pCreature); VAMPIRE_RECORD prev; diff --git a/src/server/gameserver/skill/EffectTransformToWolf.cpp b/src/server/gameserver/skill/EffectTransformToWolf.cpp index 1104dedb..01c62437 100644 --- a/src/server/gameserver/skill/EffectTransformToWolf.cpp +++ b/src/server/gameserver/skill/EffectTransformToWolf.cpp @@ -87,11 +87,11 @@ void EffectTransformToWolf::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // ǵ, ÷׸ Ѵ. + // 원래 모습으로 되돌리고, 플래그를 제거한다. addUntransformCreature(pZone, pCreature, false); pCreature->removeFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF); - // ɷġ ǵ. + // 능력치를 원래대로 되돌린다. if (pCreature->isVampire()) { Vampire* pTargetVampire = dynamic_cast(pCreature); VAMPIRE_RECORD prev; diff --git a/src/server/gameserver/skill/EffectTrapInstalled.cpp b/src/server/gameserver/skill/EffectTrapInstalled.cpp index c897b04f..2dcd893d 100644 --- a/src/server/gameserver/skill/EffectTrapInstalled.cpp +++ b/src/server/gameserver/skill/EffectTrapInstalled.cpp @@ -81,7 +81,7 @@ void EffectTrapInstalled::affect(Creature* pCreature) SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pCastSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); - // ɸ ġ ֱ + // 걸릴때 경험치 주기 shareAttrExp(pCastSlayer, ExpUp, 1, 8, 1, gcAttackerMI); increaseDomainExp(pCastSlayer, DomainType, pSkillInfo->getPoint(), gcAttackerMI); increaseSkillExp(pCastSlayer, DomainType, pSkillSlot, pSkillInfo, gcAttackerMI); diff --git a/src/server/gameserver/skill/EffectTrapTriggered.cpp b/src/server/gameserver/skill/EffectTrapTriggered.cpp index d36b9832..b3ecec7f 100644 --- a/src/server/gameserver/skill/EffectTrapTriggered.cpp +++ b/src/server/gameserver/skill/EffectTrapTriggered.cpp @@ -60,7 +60,7 @@ void EffectTrapTriggered::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_TRAPPED); diff --git a/src/server/gameserver/skill/EffectTyphoon.cpp b/src/server/gameserver/skill/EffectTyphoon.cpp index ae8991d5..e42535eb 100644 --- a/src/server/gameserver/skill/EffectTyphoon.cpp +++ b/src/server/gameserver/skill/EffectTyphoon.cpp @@ -69,7 +69,7 @@ void EffectTyphoon::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. pCreature->removeFlag(Effect::EFFECT_CLASS_TYPHOON); GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); diff --git a/src/server/gameserver/skill/EffectVampirePortal.cpp b/src/server/gameserver/skill/EffectVampirePortal.cpp index 56247bc6..35715a8b 100644 --- a/src/server/gameserver/skill/EffectVampirePortal.cpp +++ b/src/server/gameserver/skill/EffectVampirePortal.cpp @@ -59,11 +59,11 @@ void EffectVampirePortal::unaffect() // cout << "EffectVampirePortal::unaffect() begin" << endl; - // ŸϿ Ʈ ϰ... + // 타일에서 이펙트를 삭제하고... Tile& tile = m_pZone->getTile(m_X, m_Y); tile.deleteEffect(m_ObjectID); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCDeleteEffectFromTile gcDeleteEffectFromTile; gcDeleteEffectFromTile.setEffectID(Effect::EFFECT_CLASS_VAMPIRE_PORTAL); gcDeleteEffectFromTile.setObjectID(m_ObjectID); diff --git a/src/server/gameserver/skill/EffectVampirePortal.h b/src/server/gameserver/skill/EffectVampirePortal.h index 0eff3852..0f8b2437 100644 --- a/src/server/gameserver/skill/EffectVampirePortal.h +++ b/src/server/gameserver/skill/EffectVampirePortal.h @@ -2,8 +2,8 @@ // Filename : EffectVampirePortal.h // Written by : excel96 // Description : -// ̾ Ż , Ż ǥ ÿ -// ŸϿ ̾ Ż Ʈ̴. +// 뱀파이어가 포탈을 열 경우, 포탈을 연 곳과 목표 지점에 동시에 생기는 +// 타일에 붙은 뱀파이어 포탈 이펙트이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __EFFECT_VAMPIRE_PORTAL__ @@ -75,10 +75,10 @@ class EffectVampirePortal : public Effect { } private: - string m_OwnerID; // Ż - ZONE_COORD m_ZoneCoord; // Ż ǥ ID ǥ - Duration_t m_Duration; // ð - int m_Count; // Ż ִ ִ Ƚ + string m_OwnerID; // 이 포탈의 주인 + ZONE_COORD m_ZoneCoord; // 포탈의 목표 존 ID 및 좌표 + Duration_t m_Duration; // 마법의 지속 시간 + int m_Count; // 이 포탈을 사용할 수 있는 최대 횟수 }; #endif // __EFFECT_VAMPIRE_PORTAL__ diff --git a/src/server/gameserver/skill/EffectVigorDrop.cpp b/src/server/gameserver/skill/EffectVigorDrop.cpp index a6e7c005..6f02f727 100644 --- a/src/server/gameserver/skill/EffectVigorDrop.cpp +++ b/src/server/gameserver/skill/EffectVigorDrop.cpp @@ -2,16 +2,16 @@ // Project : DARKEDEN // Module : Skill - Effect // File Name : EffectVigorDrop.cpp -// Writer : ȫâ +// Writer : 장홍창 // Date : 2002.3.28 // Description : -// ش Effect Vigor Drop Effect ϱ -// Effect̴. +// 해당 Effect는 Vigor Drop이 땅으로 떨어질때의 Effect를 구현하기 +// 위한 Effect이다. // // History // DATE WRITER DESCRIPTION // =========== =========== ===================================================== -// 2002.3.28 ȫâ source file ۼ +// 2002.3.28 장홍창 source file 작성 // #include "EffectVigorDrop.h" @@ -52,13 +52,13 @@ bool EffectVigorDrop::affectCreature(Creature* pTargetCreature, bool bAffectByMo Assert(pTargetCreature != NULL); - // 뿡 ̹ poison Ʈ ɷ ִ 쿡 ɸ ʴ´. + // 상대에게 이미 poison 이펙트가 걸려져 있는 경우에는 걸리지 않는다. if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_VIGOR_DROP_TO_CREATURE)) { // cout << "EffectVigorDrop " << "affectCreature End(Already Effected) " << endl; return false; } - // üũ + // 안전지대 체크 // 2003.1.10 by bezz, Sequoia if (!checkZoneLevelToHitTarget(pTargetCreature)) { return false; @@ -66,42 +66,42 @@ bool EffectVigorDrop::affectCreature(Creature* pTargetCreature, bool bAffectByMo Zone* pZone = pTargetCreature->getZone(); - // 濡 ĥ Ѵ. + // 상대방에게 미칠 독 데미지를 계산한다. int DropDamage = computeMagicDamage(pTargetCreature, m_Damage, SKILL_VIGOR_DROP); if (DropDamage > 0) { // cout << "EffectVigorDrop(Damage:" << DropDamage << ") Affected" << endl; - // Ʈ ؼ, Ÿ ũĿ ̰, ÷׸ ش. - - // VigorDrop Effect  ʴ´. ٸ Effeect - // ö󰥼 Duration ϰ ǰ ̿ Effect ̰ - // , --Drop, --Storm ϴ Ǹ ش - // ϰ ǰ, ð ִ ƴ϶ - // 3ؼ ְ ȴ. ִ Լ ߵ ܰ - // Deadline tick ؼ Ƿ Ͽ. - // 1.6 ȿ 0.5 ְ Ǹ, 3 ְ ȴ. - // ⼭ ϵڵ Ǿ ִµ, ̴ ٸ üǾ . - // EffectVigorDrop Class member variable + // 포이즌 이펙트를 생성해서, 타겟 크리쳐에 붙이고, 플래그를 켜준다. + + // 현제는 VigorDrop Effect를 지속적으로 운영하지 않는다. 다른 Effeect기술의 + // 경우 시전자의 레벨이 올라갈수록 Duration이 증가하게 되고 이에 대한 Effect를 붙이게 + // 되지만, --Drop, --Storm류의 기술은 일단 성공이 되면 해당 구역의 모든 사람이 + // 기술을 당하게 되고, 각각 시간으로 데미지를 주는 것이 아니라 일정량의 데미지를 + // 3등분해서 주게 된다. 몇번의 데미지를 주는 함수는 아직 개발되지 않은 단계라서 + // Deadline과 tick을 사용해서 임의로 구현을 하였다. + // 1.6초 동안에 0.5초 간격으로 데미지를 주게 되면, 3번의 데미지를 줄 수 있게 된다. + // 여기서는 하드코딩이 되어 있는데, 이는 다른 방법으로 교체되어야 할 거 같다. + // EffectVigorDrop Class에 member variable로 // m_Tick // m_Count - // ξ ̸ deadline ؼ Ѵٸ ̴. + // 를 두어서 이를 바탕으로 deadline을 계산해서 적용한다면 더욱 더 편할 것이다. EffectVigorDropToCreature* pEffectVigorDropToCreature = new EffectVigorDropToCreature(pTargetCreature); - // 켱 ý Ͽ ̸ Ƽ ̵ ִ´. + // 우선권 시스템을 위하여 이름과 파티 아이디를 넣는다. // pEffectVigorDropToCreature->setCasterName(m_CasterName); // pEffectVigorDropToCreature->setPartyID(m_PartyID); pEffectVigorDropToCreature->setUserObjectID(m_UserObjectID); pEffectVigorDropToCreature->setLevel(m_Level); pEffectVigorDropToCreature->setPoint(DropDamage / 3); - pEffectVigorDropToCreature->setDeadline(16); // ̺κ ٲ Ѵ. - pEffectVigorDropToCreature->setTick(5); // ̺κе ٲ Ѵ. + pEffectVigorDropToCreature->setDeadline(16); // 이부분 바꿔야 한다. + pEffectVigorDropToCreature->setTick(5); // 이부분도 바꿔야 한다. pEffectVigorDropToCreature->affect(pTargetCreature); pTargetCreature->addEffect(pEffectVigorDropToCreature); pTargetCreature->setFlag(Effect::EFFECT_CLASS_VIGOR_DROP_TO_CREATURE); - // Ʈ پٰ ֺ ˷ش. + // 이펙트가 붙었다고 주변에 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_VIGOR_DROP_TO_CREATURE); diff --git a/src/server/gameserver/skill/EffectVigorDrop.h b/src/server/gameserver/skill/EffectVigorDrop.h index d1265307..f5f95c8c 100644 --- a/src/server/gameserver/skill/EffectVigorDrop.h +++ b/src/server/gameserver/skill/EffectVigorDrop.h @@ -2,16 +2,16 @@ // Project : DARKEDEN // Module : Skill - Effect // File Name : EffectVigorDrop.h -// Writer : ȫâ +// Writer : 장홍창 // Date : 2002.3.28 // Description : -// ش Effect Vigor Drop Effect ϱ -// Effect̴. +// 해당 Effect는 Vigor Drop이 땅으로 떨어질때의 Effect를 구현하기 +// 위한 Effect이다. // // History // DATE WRITER DESCRIPTION // =========== =========== ===================================================== -// 2002.3.28 ȫâ header file ۼ +// 2002.3.28 장홍창 header file 작성 // // @@ -85,7 +85,7 @@ class EffectVigorDrop : public Effect { Turn_t m_Tick; // EffectVigorDrop turn; int m_Level; // EffectVigorDrop level; Duration_t m_Duration; // EffectVigorDrop Duration; - Duration_t m_StormDuration; // VigorDrop Effect ð + Duration_t m_StormDuration; // VigorDrop Effect 지속 시간 }; class EffectVigorDropLoader : public EffectLoader { diff --git a/src/server/gameserver/skill/EffectVigorDropToCreature.cpp b/src/server/gameserver/skill/EffectVigorDropToCreature.cpp index 94be9bdd..c1fa5c8a 100644 --- a/src/server/gameserver/skill/EffectVigorDropToCreature.cpp +++ b/src/server/gameserver/skill/EffectVigorDropToCreature.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : EffectVigorDropToCreature.cpp -// Written by : ȫâ +// Written by : 장홍창 // Description : ////////////////////////////////////////////////////////////////////////////// @@ -60,18 +60,18 @@ void EffectVigorDropToCreature::affect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // ų ڸ ´. - // !! ̹ Ƿ NULL ִ. + // 스킬 사용자를 가져온다. + // !! 이미 존을 나갔을 수 있으므로 NULL이 될 수 있다. // by bezz. 2003.1.4 Creature* pCastCreature = pZone->getCreature(m_UserObjectID); - // EffectVigorDropToCreature AcidStorm, PoisonStorm, BloodyStorm ٴ´. - // ̴ 3 ְ . + // EffectVigorDropToCreature은 AcidStorm, PoisonStorm, BloodyStorm위를 지나갈때 붙는다. + // 이는 3번의 연속 데미지를 주고 사라진다. Damage_t DropDamage = m_Point; if (!(pZone->getZoneLevel() & COMPLETE_SAFE_ZONE) - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 && canAttack(pCastCreature, pCreature) && !pCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -100,9 +100,9 @@ void EffectVigorDropToCreature::affect(Creature* pCreature) setDamage(pMonster, DropDamage, pCastCreature, SKILL_VIGOR_DROP); } - // m_CasterName pCreature KillCount ó + // m_CasterName이 pCreature를 죽인 경우의 KillCount 처리 // by sigi. 2002.9.9 - // setDamage ҷ óѴ. ּó + // setDamage 를 불러서 처리한다. 주석처리 // by bezz. 2002.12.31 /* if (pCreature->isDead()) { @@ -145,7 +145,7 @@ void EffectVigorDropToCreature::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_VIGOR_DROP_TO_CREATURE); diff --git a/src/server/gameserver/skill/EffectWaterBarrier.cpp b/src/server/gameserver/skill/EffectWaterBarrier.cpp index d2a354cb..3aefc608 100644 --- a/src/server/gameserver/skill/EffectWaterBarrier.cpp +++ b/src/server/gameserver/skill/EffectWaterBarrier.cpp @@ -36,7 +36,7 @@ void EffectWaterBarrier::unaffect(Creature* pCreature) Assert(pCreature != NULL); Assert(pCreature->isOusters()); - // ÷׸ . + // 플래그를 끈다. pCreature->removeFlag(Effect::EFFECT_CLASS_WATER_BARRIER); Zone* pZone = pCreature->getZone(); @@ -45,7 +45,7 @@ void EffectWaterBarrier::unaffect(Creature* pCreature) Ousters* pTargetOusters = dynamic_cast(pCreature); Assert(pTargetOusters != NULL); - // Ʈ ϶ ˷ش. + // 이펙트를 삭제하라고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_WATER_BARRIER); diff --git a/src/server/gameserver/skill/EffectWhitsuntide.cpp b/src/server/gameserver/skill/EffectWhitsuntide.cpp index 481dbae8..9306a728 100644 --- a/src/server/gameserver/skill/EffectWhitsuntide.cpp +++ b/src/server/gameserver/skill/EffectWhitsuntide.cpp @@ -58,7 +58,7 @@ void EffectWhitsuntide::unaffect(Creature* pCreature) // cout << "EffectWhitsuntide" << "unaffect BEGIN" << endl; Assert(pCreature != NULL); - Assert(pCreature->isSlayer()); // ̾ ɸ ʴ´. + Assert(pCreature->isSlayer()); // 슬레이어말고는 걸리지 않는다. pCreature->removeFlag(Effect::EFFECT_CLASS_WHITSUNTIDE); diff --git a/src/server/gameserver/skill/EffectWillOfLife.cpp b/src/server/gameserver/skill/EffectWillOfLife.cpp index 933d4639..f9664503 100644 --- a/src/server/gameserver/skill/EffectWillOfLife.cpp +++ b/src/server/gameserver/skill/EffectWillOfLife.cpp @@ -95,7 +95,7 @@ void EffectWillOfLife::unaffect(Creature* pCreature) Vampire* pVampire = dynamic_cast(pCreature); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pVampire->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_WILL_OF_LIFE); diff --git a/src/server/gameserver/skill/EffectXRLMissile.cpp b/src/server/gameserver/skill/EffectXRLMissile.cpp index 7458c258..522fe2d3 100644 --- a/src/server/gameserver/skill/EffectXRLMissile.cpp +++ b/src/server/gameserver/skill/EffectXRLMissile.cpp @@ -93,7 +93,7 @@ void EffectXRLMissile::affect(Creature* pCreature) if (!(pZone->getZoneLevel() & COMPLETE_SAFE_ZONE) && !pCreature2->isDead() && !pCreature2->isFlag(Effect::EFFECT_CLASS_COMA) - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 && canAttack(pAttacker, pCreature2)) { GCModifyInformation gcMI, gcAttackerMI; setDamage(pCreature2, m_Point, pAttacker, SKILL_XRL_Missile, &gcMI, &gcAttackerMI); diff --git a/src/server/gameserver/skill/EffectYellowPoison.cpp b/src/server/gameserver/skill/EffectYellowPoison.cpp index c9bf599f..198f605e 100644 --- a/src/server/gameserver/skill/EffectYellowPoison.cpp +++ b/src/server/gameserver/skill/EffectYellowPoison.cpp @@ -54,13 +54,13 @@ bool EffectYellowPoison::affectCreature(Creature* pTargetCreature, bool bAffectB Assert(pTargetCreature != NULL); - // ̾ ƴϰ ƿ콺 ƴϸ ɸ. + // 슬레이어도 아니고 아우스터즈도 아니면 안 걸린다. if (!pTargetCreature->isSlayer() && !pTargetCreature->isOusters() && !isForce()) return false; if (pTargetCreature->getCompetence() != 3) return false; - // üũѴ. + // 안전지대인지 체크한다. // 2003.1.10 by bezz.Sequoia if (!checkZoneLevelToHitTarget(pTargetCreature)) { return false; @@ -69,10 +69,10 @@ bool EffectYellowPoison::affectCreature(Creature* pTargetCreature, bool bAffectB Player* pPlayer = pTargetCreature->getPlayer(); Assert(pPlayer != NULL); - // poison ׷¿ ɸ ɸ ִ... + // 상대방의 poison 저항력에 따라 걸릴 수도 안 걸릴 수도 있다... Resist_t resist = pTargetCreature->getResist(MAGIC_DOMAIN_POISON); - // poison ׷¿ ؼ ɸ ʾҴ. + // poison 저항력에 의해서 걸리지 않았다. if (m_bVampire) { if (!HitRoll::isSuccessVampireCurse(m_Level, resist)) return false; @@ -81,14 +81,14 @@ bool EffectYellowPoison::affectCreature(Creature* pTargetCreature, bool bAffectB return false; } - // ߺŰ ʴ´. ABCD 2001/03/21 - // ߺų OldSight ܼ Sight 3 Ǵ װ ־ - // . + // 중복시키지 않는다. ABCD 2001/03/21 + // 중복시킬때 OldSight을 얻는 과정에서 문제가 생겨서 Sight가 3으로 고착되는 버그가 있었던 + // 것 같다. if (!pTargetCreature->isFlag(Effect::EFFECT_CLASS_YELLOW_POISON_TO_CREATURE)) { Zone* pZone = pTargetCreature->getZone(); - // ÷װ Ƿ, Ʈ , Ȥó ؼ - // ̹ ɷ ִ Ʈ ִٸ ̹ ɷ ִ ش. + // 플래그가 켜져있지 않으므로, 이펙트도 없겠지만, 혹시나 해서 + // 이미 걸려 있는 같은 이펙트가 있다면 이미 걸려 있던 것을 지워준다. if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_YELLOW_POISON_TO_CREATURE)) { pTargetCreature->deleteEffect(Effect::EFFECT_CLASS_YELLOW_POISON_TO_CREATURE); } @@ -96,22 +96,22 @@ bool EffectYellowPoison::affectCreature(Creature* pTargetCreature, bool bAffectB Sight_t CurrentSight = pTargetCreature->getSight(); Sight_t oldSight = CurrentSight; - // Ʈ ϰ, Ķ͸ ش. + // 이펙트를 생성하고, 파라미터를 지정해 준다. EffectYellowPoisonToCreature* pEffect = new EffectYellowPoisonToCreature(pTargetCreature); pEffect->setDeadline(m_Duration); pEffect->setOldSight(CurrentSight); pEffect->setLevel(m_Level); - // Creature Effect Flag On Ų. + // Creature에 Effect Flag를 On 시킨다. pTargetCreature->setFlag(Effect::EFFECT_CLASS_YELLOW_POISON_TO_CREATURE); pTargetCreature->addEffect(pEffect); - // DB Effect Ѵ. + // DB에 Effect를 생성한다. // pEffect->create(pTargetCreature->getName()); - // κп üũؼ, , - // GCChangeDarkLight ũ 0 ؼ ־, - // ʿ䰡 ڵ Ƽ ȴ. -- 輺 + // 원래 이 부분에 존 레벨을 체크해서, 안전지대일 경우, + // GCChangeDarkLight에다 다크레벨을 0으로 해서 보내주었으나, + // 필요가 없는 코드인 것 같아서 빼버렸다. -- 김성민 GCChangeDarkLight gcChangeDarkLight; gcChangeDarkLight.setDarkLevel(15); gcChangeDarkLight.setLightLevel(1); @@ -120,7 +120,7 @@ bool EffectYellowPoison::affectCreature(Creature* pTargetCreature, bool bAffectB pTargetCreature->setSight(pTargetCreature->getEffectedSight()); GCModifyInformation gcMI; - // þ߰ Ƿ.. þ update.. + // 시야가 변했으므로.. 시야 update.. if (oldSight != pTargetCreature->getSight()) { pZone->updateScan(pTargetCreature, oldSight, pTargetCreature->getSight()); gcMI.addShortData(MODIFY_VISION, pTargetCreature->getSight()); @@ -233,7 +233,7 @@ void EffectYellowPoisonLoader::load(Zone* pZone) pEffect->setDuration(value1); pEffect->setLevel(100); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->registerObject(pEffect); pZone->addEffect(pEffect); tile.addEffect(pEffect); diff --git a/src/server/gameserver/skill/EffectYellowPoisonToCreature.cpp b/src/server/gameserver/skill/EffectYellowPoisonToCreature.cpp index ee7a7dde..b0a68ab3 100644 --- a/src/server/gameserver/skill/EffectYellowPoisonToCreature.cpp +++ b/src/server/gameserver/skill/EffectYellowPoisonToCreature.cpp @@ -57,12 +57,12 @@ void EffectYellowPoisonToCreature::unaffect(Creature* pCreature) Zone* pZone = pCreature->getZone(); Player* pPlayer = pCreature->getPlayer(); - // Light Ͽ þ߰ Ƿ.. - // OldSight Sight ο Setting ʴ´. + // Light등의 마법으로 인하여 시야가 밝아져 있을 수 있으므로.. + // OldSight가 현재의 Sight보다 어두우면 Setting 하지 않는다. Sight_t NewSight = 13; pCreature->setSight(NewSight); - // Ŭ̾Ʈ Vision Ѵ. + // 클라이언트에 Vision 정보를 전송한다. GCModifyInformation _GCModifyInformation; _GCModifyInformation.addShortData(MODIFY_VISION, NewSight); pPlayer->sendPacket(&_GCModifyInformation); @@ -72,7 +72,7 @@ void EffectYellowPoisonToCreature::unaffect(Creature* pCreature) pZone->updateScan(pCreature, YELLOW_POISON_SIGHT, NewSight); - // Yellow Poison ȿ Ǯ Update Scan ش. + // Yellow Poison의 효과가 풀릴때 Update Scan은 물론 밝기의 조절까지 해준다. // DarkLightInfo* pDIInfo = g_pDarkLightInfoManager->getCurrentDarkLightInfo( pZone ); // DarkLevel_t darkLevel = pDIInfo->getDarkLevel(); // LightLevel_t lightLevel = pDIInfo->getLightLevel(); @@ -88,7 +88,7 @@ void EffectYellowPoisonToCreature::unaffect(Creature* pCreature) { pZone->updateScan(pSlayer, YELLOW_POISON_SIGHT, NewSight); - // Yellow Poison ȿ Ǯ Update Scan ش. + // Yellow Poison의 효과가 풀릴때 Update Scan은 물론 밝기의 조절까지 해준다. DarkLightInfo* pDIInfo = g_pDarkLightInfoManager->getCurrentDarkLightInfo(); DarkLevel_t darkLevel = pDIInfo->getDarkLevel(); LightLevel_t lightLevel = pDIInfo->getLightLevel(); @@ -101,10 +101,10 @@ void EffectYellowPoisonToCreature::unaffect(Creature* pCreature) } */ - // Ǯ Sight ش. + // 풀릴때 Sight를 저장해준다. // pSlayer->tinysave("Sight = 13"); - // Ʈ ٰ ˷ش. + // 이펙트가 사라졌다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pCreature->getObjectID()); gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_YELLOW_POISON_TO_CREATURE); @@ -253,7 +253,7 @@ void EffectYellowPoisonToCreatureLoader::load(Creature* pCreature) // Assert(pCreature != NULL); if (pCreature == NULL) { - // cout << "EffectYellowPoisonToCreatureLoader : ũİ Դϴ." << endl; + // cout << "EffectYellowPoisonToCreatureLoader : 크리쳐가 널입니다." << endl; return; } diff --git a/src/server/gameserver/skill/EmissionWater.cpp b/src/server/gameserver/skill/EmissionWater.cpp index ba684952..6af68cb9 100644 --- a/src/server/gameserver/skill/EmissionWater.cpp +++ b/src/server/gameserver/skill/EmissionWater.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void EmissionWater::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/EnergyDrop.cpp b/src/server/gameserver/skill/EnergyDrop.cpp index 348d323b..3971d0cd 100644 --- a/src/server/gameserver/skill/EnergyDrop.cpp +++ b/src/server/gameserver/skill/EnergyDrop.cpp @@ -2,23 +2,23 @@ // Project : DARKEDEN // Module : Skill - Effect // File Name : EffectEnergyDrop.h -// Writer : ȫâ +// Writer : 장홍창 // Date : 2002.3.28 // Description : -// Energy Drop --storm Ǵ -// Slayer ̴. -// ϰ Ǹ, ߽ 3x3 -// EffectEnergyDrop Effect ٰ ȴ. EffectEnergyDrop Effect -// ϴ ƴ϶. -// ش Creature EffectEnergyDropToCreature Effect -// ̰ . EffectEnergyDropToCreature EnergyDrop -// ü 1/3 شϴ Damage 3 ش -// Creature ϰ . +// Energy Drop은 --storm류의 기술과 동일한 방식으로 구현되는 +// Slayer의 기술이다. +// 기술을 사용하게 되면, 기술 시전 지역을 중심으로 3x3의 영역에 +// EffectEnergyDrop Effect가 붙게 된다. EffectEnergyDrop Effect +// 는 독자적으로 데미지를 가하는 기술이 아니라. +// 해당 지역의 Creature에게 EffectEnergyDropToCreature Effect를 +// 붙이고 사라진다. EffectEnergyDropToCreature는 EnergyDrop의 +// 전체 데미지의 1/3에 해당하는 Damage를 3번 연속으로 해당 +// Creature에게 가하고 사라진다. // // History // DATE WRITER DESCRIPTION // =========== =========== ===================================================== -// 2002.3.28 ȫâ header file ۼ +// 2002.3.28 장홍창 header file 작성 // // //////////////////////////////////////////////////////////////////////////////// @@ -37,7 +37,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void EnergyDrop::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -57,7 +57,7 @@ void EnergyDrop::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); @@ -76,8 +76,8 @@ void EnergyDrop::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 -// ̾ Energy Drop Skill Tile ϴ Handler +// 뱀파이어 타일 핸들러 +// 뱀파이어가 Energy Drop Skill을 Tile에 사용했을때 사용하는 Handler ////////////////////////////////////////////////////////////////////////////// void EnergyDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -136,7 +136,7 @@ void EnergyDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo SkillOutput output; computeOutput(input, output); - // Holy Smashing ִٸ 10% + // Holy Smashing 이 있다면 데미지 10% 증가 if (pSlayer->hasRankBonus(RankBonus::RANK_BONUS_HOLY_SMASHING)) { RankBonus* pRankBonus = pSlayer->getRankBonus(RankBonus::RANK_BONUS_HOLY_SMASHING); Assert(pRankBonus != NULL); @@ -146,7 +146,7 @@ void EnergyDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo Range_t Range = 3; - // Ʈ ŸϿ ִٸ Ѵ. + // 기존에 같은 이펙트가 타일에 있다면 지우고 새로 설정한다. Tile& tile = pZone->getTile(X, Y); Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_ENERGY_DROP); if (pOldEffect != NULL) { @@ -154,7 +154,7 @@ void EnergyDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo pZone->deleteEffect(effectID); } - // Ʈ Ʈ ؼ ŸϿ δ. + // 이펙트 오브젝트를 생성해서 타일에 붙인다. // cout << "make EffectObject to Tile" << X << " " << Y << endl; pEffect = new EffectEnergyDrop(pZone, X, Y); @@ -175,7 +175,7 @@ void EnergyDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo // // pZone->addEffect(pEffect); // tile.addEffect(pEffect); - // Ʈ Ʈ ؼ ŸϿ δ. + // 이펙트 오브젝트를 생성해서 타일에 붙인다. pEffect2 = new EffectEnergyDrop(pZone, X, Y); pEffect2->setUserObjectID(pSlayer->getObjectID()); pEffect2->setDeadline(output.Duration); @@ -184,9 +184,9 @@ void EnergyDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo pEffect2->setDamage(output.Damage * 30 / 100); pEffect2->setLevel(pSkillInfo->getLevel() / 2); - // Ʈ Creature effect ٿش. - // Slayer SlayerԴ - // ش ʴ´. + // 이펙트 범위내의 모든 Creature에게 effect를 붙여준다. + // Slayer가 기술을 사용한 경우 같은 Slayer에게는 + // 해당하지 않는다. bool bEffected = false; bool bHit = false; @@ -244,7 +244,7 @@ void EnergyDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo cList.push_back(pTargetCreature); if (bCanSee) { - // + // 공격을 당한 사람에게 _GCSkillToTileOK2.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK2.setSkillType(SkillType); _GCSkillToTileOK2.setX(X); @@ -268,7 +268,7 @@ void EnergyDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pSlayer); - // ְ ̾ Ѵ. by sigi. 2002.6.21 + // 마지막 때린 애가 슬레이어라고 설정한다. by sigi. 2002.6.21 pMonster->setLastHitCreatureClass(Creature::CREATURE_CLASS_SLAYER); } else { // cout << "EnergyDrop to Monster Falis" << endl; @@ -285,7 +285,7 @@ void EnergyDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToTileOK1); } - // 鿡 + // 기술을 사용한 사람들에게 _GCSkillToTileOK1.setSkillType(SkillType); _GCSkillToTileOK1.setCEffectID(CEffectID); _GCSkillToTileOK1.setX(X); @@ -293,21 +293,21 @@ void EnergyDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo _GCSkillToTileOK1.setDuration(output.Duration); _GCSkillToTileOK1.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(X); _GCSkillToTileOK3.setY(Y); //_GCSkillToTileOK3.setDuration(output.Duration); //_GCSkillToTileOK3.setRange(Range); - // ִ 鿡 + // 기술을 당한 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람과 당한 사람을 모두 볼 수 있는 사람들에게 _GCSkillToTileOK5.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); @@ -315,21 +315,21 @@ void EnergyDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); - // packet + // 기술을 사용한 사람에게 packet 전달 pPlayer->sendPacket(&_GCSkillToTileOK1); - // ִ 鿡 broadcasing - // broadcasting 5OK Ѵ. - // ⿡ ϵ broadcasting ܵȴ. + // 기술을 쓸 사람과 당한 사람을 모두 볼 수 있는 사람들에게 broadcasing + // broadcasting후 5번OK를 받은 사람을 기록한다. + // 여기에 기록된 사람은 차후 broadcasting에서 제외된다. cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); - // ִ 鿡 broadcasting + // 기술을 쓴 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); - // ִ 鿡 broadcasting + // 기술을 당한 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); - // delay setting + // 기술 delay setting pSkillSlot->setRunTime(output.Delay); } else { @@ -350,7 +350,7 @@ void EnergyDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void EnergyDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -401,7 +401,7 @@ void EnergyDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) Range_t Range = 3; - // Ʈ ŸϿ ִٸ Ѵ. + // 기존에 같은 이펙트가 타일에 있다면 지우고 새로 설정한다. Tile& tile = pZone->getTile(X, Y); Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_ENERGY_DROP); if (pOldEffect != NULL) { @@ -409,7 +409,7 @@ void EnergyDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pZone->deleteEffect(effectID); } - // Ʈ Ʈ ؼ ŸϿ δ. + // 이펙트 오브젝트를 생성해서 타일에 붙인다. pEffect = new EffectEnergyDrop(pZone, X, Y); pEffect->setDeadline(output.Duration); pEffect->setNextTime(0); @@ -426,7 +426,7 @@ void EnergyDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) // pZone->addEffect(pEffect); // tile.addEffect(pEffect); - // Ʈ Ʈ ؼ ŸϿ δ. + // 이펙트 오브젝트를 생성해서 타일에 붙인다. pEffect2 = new EffectEnergyDrop(pZone, X, Y); pEffect2->setDeadline(output.Duration); pEffect2->setNextTime(0); @@ -435,9 +435,9 @@ void EnergyDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pEffect2->setLevel(pSkillInfo->getLevel() / 2); - // Ʈ Creature effect ٿش. - // Slayer SlayerԴ - // ش ʴ´. + // 이펙트 범위내의 모든 Creature에게 effect를 붙여준다. + // Slayer가 기술을 사용한 경우 같은 Slayer에게는 + // 해당하지 않는다. bool bEffected = false; Creature* pTargetCreature; @@ -486,7 +486,7 @@ void EnergyDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) cList.push_back(pTargetCreature); if (bCanSee) { - // + // 공격을 당한 사람에게 _GCSkillToTileOK2.setObjectID(pMonster->getObjectID()); _GCSkillToTileOK2.setSkillType(SkillType); _GCSkillToTileOK2.setX(X); @@ -500,21 +500,21 @@ void EnergyDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) } // if(pTargetCreature!= NULL) } - // ִ 鿡 + // 기술을 쓴 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(myX); _GCSkillToTileOK3.setY(myY); //_GCSkillToTileOK3.setDuration(output.Duration); //_GCSkillToTileOK3.setRange(Range); - // ִ 鿡 + // 기술을 당한 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람과 당한 사람을 모두 볼 수 있는 사람들에게 _GCSkillToTileOK5.setObjectID(pMonster->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); @@ -522,13 +522,13 @@ void EnergyDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); - // ִ 鿡 broadcasing + // 기술을 쓸 사람과 당한 사람을 모두 볼 수 있는 사람들에게 broadcasing cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); - // ִ 鿡 broadcasting + // 기술을 쓴 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); - // ִ 鿡 broadcasting + // 기술을 당한 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); diff --git a/src/server/gameserver/skill/Eternity.cpp b/src/server/gameserver/skill/Eternity.cpp index a3e680be..43c4f585 100644 --- a/src/server/gameserver/skill/Eternity.cpp +++ b/src/server/gameserver/skill/Eternity.cpp @@ -11,7 +11,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ +// 슬레이어 셀프 ////////////////////////////////////////////////////////////////////////////// void Eternity::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -64,7 +64,7 @@ void Eternity::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffe decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectEternity* pEffect = new EffectEternity(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setHPPenalty(output.Damage); @@ -75,16 +75,16 @@ void Eternity::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffe pZone->registerObject(pEffect); pZone->addEffect(pEffect); - pComa->setDeadline(output.Duration + 10); // 11. ų ߵ Ȱġ ƨ° + pComa->setDeadline(output.Duration + 10); // 11초. 스킬 발동 전에 부활위치로 튕기는거 방지 - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(output.Duration); @@ -100,7 +100,7 @@ void Eternity::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffe executeSkillFailNormal(pSlayer, getSkillType(), NULL); } - pSkillSlot->setRunTime(20); // 2 + pSkillSlot->setRunTime(20); // 2초 } catch (Throwable& t) { executeSkillFailException(pSlayer, getSkillType()); // cout << t.toString() << endl; diff --git a/src/server/gameserver/skill/Evade.cpp b/src/server/gameserver/skill/Evade.cpp index ca5a0b5c..eebff8cb 100644 --- a/src/server/gameserver/skill/Evade.cpp +++ b/src/server/gameserver/skill/Evade.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Evade::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -57,12 +57,12 @@ void Evade::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot, CEff if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bSatisfyRequire) { decreaseMana(pOusters, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectEvade* pEffect = new EffectEvade(pOusters); pEffect->setDeadline(output.Duration); pEffect->setBonus(output.Damage); diff --git a/src/server/gameserver/skill/Expansion.cpp b/src/server/gameserver/skill/Expansion.cpp index b9a8c037..2754a73b 100644 --- a/src/server/gameserver/skill/Expansion.cpp +++ b/src/server/gameserver/skill/Expansion.cpp @@ -13,7 +13,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Expansion::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -32,7 +32,7 @@ void Expansion::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEff Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 도가 아니라면 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_SWORD) { executeSkillFailException(pSlayer, getSkillType()); @@ -66,17 +66,17 @@ void Expansion::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEff SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectExpansion* pEffect = new EffectExpansion(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setHPBonus(output.Damage); pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_EXPANSION); - // Ʈ Ų. + // 이펙트를 적용시킨다. pEffect->affect(pSlayer); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); if (bIncreaseDomainExp) { diff --git a/src/server/gameserver/skill/ExplosionWater.cpp b/src/server/gameserver/skill/ExplosionWater.cpp index daa02f6e..91e4d948 100644 --- a/src/server/gameserver/skill/ExplosionWater.cpp +++ b/src/server/gameserver/skill/ExplosionWater.cpp @@ -16,7 +16,7 @@ #include "GCSkillToObjectOK6.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ExplosionWater::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -36,8 +36,8 @@ void ExplosionWater::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ouste Creature* pTargetCreature = pZone->getCreature(TargetObjectID); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pOusters, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType(), Grade); return; diff --git a/src/server/gameserver/skill/Extreme.cpp b/src/server/gameserver/skill/Extreme.cpp index 4e953821..32747abd 100644 --- a/src/server/gameserver/skill/Extreme.cpp +++ b/src/server/gameserver/skill/Extreme.cpp @@ -18,7 +18,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Extreme::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -43,7 +43,7 @@ void Extreme::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, CE SkillType_t SkillType = pVampireSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // Knowledge of Innate ִٸ hit bonus 10 + // Knowledge of Innate 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE); @@ -62,26 +62,26 @@ void Extreme::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, CE if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pVampire, RequiredMP, _GCSkillToSelfOK1); - // ų ʽ ޶. + // 스킬 레벨에 따라 데미지 보너스가 달라진다. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectExtreme* pEffect = new EffectExtreme(pVampire); pEffect->setDeadline(output.Duration); pEffect->setDamageBonus(output.Damage); pVampire->addEffect(pEffect); pVampire->setFlag(Effect::EFFECT_CLASS_EXTREME); - // ̷ Ͽ ٲ ɷġ . + // 이로 인하여 바뀌는 능력치를 보낸다. VAMPIRE_RECORD prev; pVampire->getVampireRecord(prev); pVampire->initAllStat(); pVampire->sendRealWearingInfo(); pVampire->sendModifyInfo(prev); - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(output.Duration); @@ -94,7 +94,7 @@ void Extreme::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, CE pZone->broadcastPacket(pVampire->getX(), pVampire->getY(), &_GCSkillToSelfOK2, pVampire); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pVampire->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_EXTREME); @@ -136,7 +136,7 @@ void Extreme::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkill Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pVampire, getSkillType()); return; @@ -167,26 +167,26 @@ void Extreme::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkill decreaseMana(pVampire, RequiredMP, _GCSkillToObjectOK1); - // ų ʽ ޶. + // 스킬 레벨에 따라 데미지 보너스가 달라진다. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectExtreme* pEffect = new EffectExtreme(pTargetVampire); pEffect->setDeadline(output.Duration); pEffect->setDamageBonus(output.Damage); pTargetVampire->addEffect(pEffect); pTargetVampire->setFlag(Effect::EFFECT_CLASS_EXTREME); - // ̷ Ͽ ٲ ɷġ . + // 이로 인하여 바뀌는 능력치를 보낸다. VAMPIRE_RECORD prev; pTargetVampire->getVampireRecord(prev); pTargetVampire->initAllStat(); pTargetVampire->sendRealWearingInfo(); pTargetVampire->sendModifyInfo(prev); - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setDuration(output.Duration); @@ -216,7 +216,7 @@ void Extreme::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkill cList.push_back(pVampire); pZone->broadcastPacket(myX, myY, &_GCSkillToObjectOK3, cList); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetVampire->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_EXTREME); @@ -274,7 +274,7 @@ void Extreme::execute(Vampire* pVampire) if (!rect.ptInRect(tileX, tileY)) continue; - // Ÿ ! ̾ ִ ! + // 타일 위에! 뱀파이어가 있는지 본다! Tile& tile = pZone->getTile(tileX, tileY); Creature* pTargetCreature = NULL; if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) @@ -288,19 +288,19 @@ void Extreme::execute(Vampire* pVampire) Vampire* pTargetVampire = dynamic_cast(pTargetCreature); - // ų ʽ ޶. + // 스킬 레벨에 따라 데미지 보너스가 달라진다. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectExtreme* pEffect = new EffectExtreme(pTargetVampire); pEffect->setDeadline(output.Duration); pEffect->setDamageBonus(output.Damage); pTargetVampire->addEffect(pEffect); pTargetVampire->setFlag(Effect::EFFECT_CLASS_EXTREME); - // ̷ Ͽ ٲ ɷġ . + // 이로 인하여 바뀌는 능력치를 보낸다. VAMPIRE_RECORD prev; pTargetVampire->getVampireRecord(prev); pTargetVampire->initAllStat(); @@ -325,7 +325,7 @@ void Extreme::execute(Vampire* pVampire) } */ - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetVampire->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_EXTREME); diff --git a/src/server/gameserver/skill/FatalSnick.cpp b/src/server/gameserver/skill/FatalSnick.cpp index 8ae76798..629c9d49 100644 --- a/src/server/gameserver/skill/FatalSnick.cpp +++ b/src/server/gameserver/skill/FatalSnick.cpp @@ -10,7 +10,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void FatalSnick::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/FeldwebelFire.cpp b/src/server/gameserver/skill/FeldwebelFire.cpp index 0f536180..05c7aebc 100644 --- a/src/server/gameserver/skill/FeldwebelFire.cpp +++ b/src/server/gameserver/skill/FeldwebelFire.cpp @@ -10,7 +10,7 @@ #include "SkillUtil.h" ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void FeldwebelFire::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/FierceFlame.cpp b/src/server/gameserver/skill/FierceFlame.cpp index e271eba2..4cbc4e4e 100644 --- a/src/server/gameserver/skill/FierceFlame.cpp +++ b/src/server/gameserver/skill/FierceFlame.cpp @@ -16,7 +16,7 @@ #include "GCSkillToObjectOK6.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void FierceFlame::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -36,8 +36,8 @@ void FierceFlame::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pOusters, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType(), Grade); return; diff --git a/src/server/gameserver/skill/FireMeteor.cpp b/src/server/gameserver/skill/FireMeteor.cpp index e33944c2..1009e6d9 100644 --- a/src/server/gameserver/skill/FireMeteor.cpp +++ b/src/server/gameserver/skill/FireMeteor.cpp @@ -12,7 +12,7 @@ #include "SkillUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ¾Æ¿ì½ºÅÍÁî ¿ÀºêÁ§Æ® Çڵ鷯 +// ¾Æ¿ì½ºÅÍÁî ¿ÀºêÁ§Æ® Çڵ鷯 ////////////////////////////////////////////////////////////////////////////// void FireMeteor::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) { @@ -30,7 +30,7 @@ void FireMeteor::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuchÁ¦°Å. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pOusters, pTargetCreature)) { executeSkillFailException(pOusters, getSkillType()); return; diff --git a/src/server/gameserver/skill/FirePiercing.cpp b/src/server/gameserver/skill/FirePiercing.cpp index a25ef1c0..5adb56eb 100644 --- a/src/server/gameserver/skill/FirePiercing.cpp +++ b/src/server/gameserver/skill/FirePiercing.cpp @@ -15,7 +15,7 @@ #include "ZoneUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void FirePiercing::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -44,8 +44,8 @@ void FirePiercing::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ousters // Assert(pTargetCreature != NULL); - // NPC . - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || !canAttack(pOusters, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType(), Grade); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -64,7 +64,7 @@ void FirePiercing::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ousters } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ÿ ڵ鷯 +// 아우스터즈 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void FirePiercing::execute(Ousters* pOusters, ZoneCoord_t tX, ZoneCoord_t tY, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -118,7 +118,7 @@ void FirePiercing::execute(Ousters* pOusters, ZoneCoord_t tX, ZoneCoord_t tY, Ou SkillType_t SkillType = pOustersSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); @@ -156,7 +156,7 @@ void FirePiercing::execute(Ousters* pOusters, ZoneCoord_t tX, ZoneCoord_t tY, Ou Tile& tile = pZone->getTile(oX, oY); - // Ÿ ȿ ϴ Ʈ ˻Ѵ. + // 타일 안에 존재하는 오브젝트들을 검색한다. const forward_list& oList = tile.getObjectList(); forward_list::const_iterator itr = oList.begin(); for (; itr != oList.end(); itr++) { @@ -169,8 +169,8 @@ void FirePiercing::execute(Ousters* pOusters, ZoneCoord_t tX, ZoneCoord_t tY, Ou Creature* pCreature = dynamic_cast(pObject); Assert(pCreature != NULL); - // üũ. by sigi. 2002.9.5 - // 鿪. by sigi. 2002.9.13 + // 무적상태 체크. by sigi. 2002.9.5 + // 산 면역. by sigi. 2002.9.13 if (pCreature->getObjectID() == pOusters->getObjectID() || !canAttack(pOusters, pCreature) || pCreature->isFlag(Effect::EFFECT_CLASS_COMA) || !canHit(pOusters, pCreature, SKILL_FIRE_PIERCING, pOustersSkillSlot->getExpLevel())) { @@ -178,7 +178,7 @@ void FirePiercing::execute(Ousters* pOusters, ZoneCoord_t tX, ZoneCoord_t tY, Ou } // 2003.1.10 by Sequoia - // üũ + // 안전지대 체크 if (!checkZoneLevelToHitTarget(pCreature)) continue; @@ -207,9 +207,9 @@ void FirePiercing::execute(Ousters* pOusters, ZoneCoord_t tX, ZoneCoord_t tY, Ou ::setDamage(pMonster, Damage, pOusters, SKILL_FIRE_PIERCING, NULL, &_GCSkillToTileOK1); } else - continue; // ƿ콺 NPC ... -_- + continue; // 아우스터즈나 NPC 상대로... -_- - // ׾ ġش. ..... + // 죽었으면 경험치준다. 음..... if (pOusters != NULL) { if (pCreature->isDead() && pOusters->isOusters()) { Ousters* pCastOusters = dynamic_cast(pOusters); @@ -238,7 +238,7 @@ void FirePiercing::execute(Ousters* pOusters, ZoneCoord_t tX, ZoneCoord_t tY, Ou } if (bCritical) { - cout << "ũƼ ߵ" << endl; + cout << "크리티컬 발동" << endl; list::iterator itr = cList.begin(); list::iterator endItr = cList.end(); @@ -246,7 +246,7 @@ void FirePiercing::execute(Ousters* pOusters, ZoneCoord_t tX, ZoneCoord_t tY, Ou for (; itr != endItr; ++itr) { Creature* pTargetCreature = *itr; if (pTargetCreature != NULL) { - cout << pTargetCreature->getName() << " ~" << endl; + cout << pTargetCreature->getName() << " 낙백~" << endl; knockbackCreature(pZone, pTargetCreature, pOusters->getX(), pOusters->getY()); } } diff --git a/src/server/gameserver/skill/Flare.cpp b/src/server/gameserver/skill/Flare.cpp index 38a8b302..dd7264f3 100644 --- a/src/server/gameserver/skill/Flare.cpp +++ b/src/server/gameserver/skill/Flare.cpp @@ -36,8 +36,8 @@ void Flare::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkil Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC̰ų, ̾Դ Flare . - // NoSuch. by sigi. 2002.5.2 + // NPC이거나, 슬레이어에게는 Flare를 쓸 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isNPC() || pTargetCreature->isSlayer()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -67,32 +67,32 @@ void Flare::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkil pTargetCreature->getCompetence() == 3) { decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectFlare* pEffect = new EffectFlare(pTargetCreature); // pEffect->setOldSight(13); pEffect->setOldSight(pTargetCreature->getSight()); - // Ҷ levelüũϱ ޼.by sigi. 2002.6.21 + // 제거할때 level체크하기 위햇서.by sigi. 2002.6.21 pEffect->setLevel(pSkillInfo->getLevel()); pEffect->setDeadline(output.Duration); pTargetCreature->setFlag(Effect::EFFECT_CLASS_FLARE); pTargetCreature->addEffect(pEffect); - // Ʈ Ų. + // 이펙트를 적용시킨다. pEffect->affect(pTargetCreature); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToObjectOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToObjectOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToObjectOK1); - // Ŷ غѴ. + // 패킷을 준비한다. ZoneCoord_t targetX = pTargetCreature->getX(); ZoneCoord_t targetY = pTargetCreature->getY(); ZoneCoord_t myX = pSlayer->getX(); diff --git a/src/server/gameserver/skill/FlashSliding.cpp b/src/server/gameserver/skill/FlashSliding.cpp index 5f08c366..e928328c 100644 --- a/src/server/gameserver/skill/FlashSliding.cpp +++ b/src/server/gameserver/skill/FlashSliding.cpp @@ -11,7 +11,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void FlashSliding::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -32,8 +32,8 @@ void FlashSliding::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 - // NPC . + // NoSuch제거. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. if (pTargetCreature == NULL || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -42,7 +42,7 @@ void FlashSliding::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot bool bIncreaseDomainExp = pSlayer->isRealWearingEx(Slayer::WEAR_RIGHTHAND); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 검이 아니라면 기술을 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL) { executeSkillFailException(pSlayer, getSkillType()); @@ -69,7 +69,7 @@ void FlashSliding::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot pSlayer->isFlag(Effect::EFFECT_CLASS_HAS_SWEEPER); if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bCanHit && bPK && !bEffected) { - // PC ش. + // 빠르게 PC를 움직여준다. if (pZone->moveFastPC(pSlayer, pSlayer->getX(), pSlayer->getY(), pTargetCreature->getX(), pTargetCreature->getY(), getSkillType())) { decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); @@ -80,13 +80,13 @@ void FlashSliding::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot bool bCriticalHit = false; - // ش. (ų .) + // 데미지를 준다. (스킬 데미지는 없다.) Damage_t Damage = computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); setDamage(pTargetCreature, Damage, pSlayer, SkillType, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); decreaseDurability(pSlayer, pTargetCreature, pSkillInfo, &_GCSkillToObjectOK1, &_GCSkillToObjectOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } @@ -101,7 +101,7 @@ void FlashSliding::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot increaseAlignment(pSlayer, pTargetCreature, _GCSkillToObjectOK1); } - // Ŷ غϰ . + // 패킷을 준비하고 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); diff --git a/src/server/gameserver/skill/Flourish.cpp b/src/server/gameserver/skill/Flourish.cpp index 373954f2..c60c45e4 100644 --- a/src/server/gameserver/skill/Flourish.cpp +++ b/src/server/gameserver/skill/Flourish.cpp @@ -10,7 +10,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Flourish::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/FrozenArmor.cpp b/src/server/gameserver/skill/FrozenArmor.cpp index a78d9429..f0b808a5 100644 --- a/src/server/gameserver/skill/FrozenArmor.cpp +++ b/src/server/gameserver/skill/FrozenArmor.cpp @@ -18,7 +18,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void FrozenArmor::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -63,12 +63,12 @@ void FrozenArmor::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bSatisfyRequire) { decreaseMana(pOusters, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectFrozenArmor* pEffect = new EffectFrozenArmor(pOusters); pEffect->setDeadline(output.Duration); pEffect->setBonus(output.Damage); @@ -131,9 +131,9 @@ void FrozenArmor::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // 鿪. by sigi. 2002.9.13 - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수 없다. + // 저주 면역. by sigi. 2002.9.13 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !pTargetCreature->isOusters()) { executeSkillFailException(pOusters, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -172,7 +172,7 @@ void FrozenArmor::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersS bool bCanSeeCaster = canSee(pTargetCreature, pOusters); - // Ʈ Ʈ δ. + // 이펙트 오브젝트를 생성해 붙인다. EffectFrozenArmor* pEffect = new EffectFrozenArmor(pTargetCreature); pEffect->setDeadline(output.Duration); pEffect->setBonus(output.Damage); diff --git a/src/server/gameserver/skill/FuryOfGnome.cpp b/src/server/gameserver/skill/FuryOfGnome.cpp index 469badb1..9a700b37 100644 --- a/src/server/gameserver/skill/FuryOfGnome.cpp +++ b/src/server/gameserver/skill/FuryOfGnome.cpp @@ -16,7 +16,7 @@ #include "SimpleTileMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void FuryOfGnome::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -34,7 +34,7 @@ void FuryOfGnome::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pOusters, getSkillType()); @@ -148,20 +148,20 @@ void FuryOfGnome::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouste if (tile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION)) continue; - // ŸϿ Ʈ ߰ ִٸ... + // 현재 타일에다 이펙트를 추가할 수 있다면... if (tile.canAddEffect()) { - // effect . + // 같은 effect가 있으면 지운다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_FURY_OF_GNOME); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); // fix me } - // Ʈ Ŭ Ѵ. + // 이펙트 클래스를 생성한다. EffectFuryOfGnome* pEffect = new EffectFuryOfGnome(pZone, targetX, targetY); pEffect->setDeadline(output.Duration); - // Tile ̴ Effect ObjectID Ϲ޾ƾ Ѵ. + // Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); pZone->addEffect(pEffect); diff --git a/src/server/gameserver/skill/GammaChop.cpp b/src/server/gameserver/skill/GammaChop.cpp index 545a9de5..bf48bca1 100644 --- a/src/server/gameserver/skill/GammaChop.cpp +++ b/src/server/gameserver/skill/GammaChop.cpp @@ -10,7 +10,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void GammaChop::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/GhostBlade.cpp b/src/server/gameserver/skill/GhostBlade.cpp index e40d76f7..e824a000 100644 --- a/src/server/gameserver/skill/GhostBlade.cpp +++ b/src/server/gameserver/skill/GhostBlade.cpp @@ -13,7 +13,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void GhostBlade::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -32,7 +32,7 @@ void GhostBlade::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEf Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 도가 아니라면 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_BLADE) { executeSkillFailException(pSlayer, getSkillType()); @@ -69,21 +69,21 @@ void GhostBlade::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEf int ToHitBonus = getPercentValue(pSlayer->getToHit(), output.Damage); // int ToHitBonus = output.Damage; - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectGhostBlade* pEffect = new EffectGhostBlade(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setToHitBonus(ToHitBonus); pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_GHOST_BLADE); - // ̷ Ͽ ٲ ɷġ . + // 이로 인하여 바뀌는 능력치를 보낸다. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); if (bIncreaseDomainExp) { diff --git a/src/server/gameserver/skill/Glacier1.cpp b/src/server/gameserver/skill/Glacier1.cpp index 3d045852..ea20d770 100644 --- a/src/server/gameserver/skill/Glacier1.cpp +++ b/src/server/gameserver/skill/Glacier1.cpp @@ -17,7 +17,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void Glacier1::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -46,7 +46,7 @@ void Glacier1::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) ZoneCoord_t myY = pMonster->getY(); if (bHitRoll) { - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); diff --git a/src/server/gameserver/skill/Glacier2.cpp b/src/server/gameserver/skill/Glacier2.cpp index 4d696e2a..59683a0a 100644 --- a/src/server/gameserver/skill/Glacier2.cpp +++ b/src/server/gameserver/skill/Glacier2.cpp @@ -16,7 +16,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void Glacier2::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -45,7 +45,7 @@ void Glacier2::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) ZoneCoord_t myY = pMonster->getY(); if (bHitRoll) { - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); diff --git a/src/server/gameserver/skill/GnomesWhisper.cpp b/src/server/gameserver/skill/GnomesWhisper.cpp index 97ebaf17..7eb2b110 100644 --- a/src/server/gameserver/skill/GnomesWhisper.cpp +++ b/src/server/gameserver/skill/GnomesWhisper.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void GnomesWhisper::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -46,7 +46,7 @@ void GnomesWhisper::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSl // SkillDomainType_t DomainType = pSkillInfo->getDomainType(); // SkillLevel_t SkillLevel = pOustersSkillSlot->getExpLevel(); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); @@ -62,7 +62,7 @@ void GnomesWhisper::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSl if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bSatisfyRequire) { decreaseMana(pOusters, RequiredMP, _GCSkillToSelfOK1); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectGnomesWhisper* pEffect = new EffectGnomesWhisper(pOusters); pEffect->setDeadline(output.Duration); pEffect->setLevel(input.SkillLevel); diff --git a/src/server/gameserver/skill/GoreGlandFire.cpp b/src/server/gameserver/skill/GoreGlandFire.cpp index 5a4dbf8e..bc62cbf1 100644 --- a/src/server/gameserver/skill/GoreGlandFire.cpp +++ b/src/server/gameserver/skill/GoreGlandFire.cpp @@ -10,8 +10,8 @@ #include "SimpleTileMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// GoreGlandFire::GoreGlandFire() throw() { __BEGIN_TRY @@ -31,7 +31,7 @@ GoreGlandFire::GoreGlandFire() throw() { ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void GoreGlandFire::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) diff --git a/src/server/gameserver/skill/GrayDarkness.cpp b/src/server/gameserver/skill/GrayDarkness.cpp index 084a6ef5..0cafd23b 100644 --- a/src/server/gameserver/skill/GrayDarkness.cpp +++ b/src/server/gameserver/skill/GrayDarkness.cpp @@ -24,7 +24,7 @@ int normalizeCoord_GRAY_DARKNESS(int x, int y, int edge) { } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void GrayDarkness::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -44,7 +44,7 @@ void GrayDarkness::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pVampire, getSkillType()); return; @@ -61,7 +61,7 @@ void GrayDarkness::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void GrayDarkness::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -94,7 +94,7 @@ void GrayDarkness::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp ZoneCoord_t myX = pVampire->getX(); ZoneCoord_t myY = pVampire->getY(); - // Knowledge of Innate ִٸ hit bonus 10 + // Knowledge of Innate 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE); @@ -131,12 +131,12 @@ void GrayDarkness::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bTileCheck && !bSlayerSafeZone) { decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); - // Ʈ ӽð Ѵ. + // 이펙트의 지속시간을 계산한다. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); - /* // Wisdom of GrayDarkness ִٸ ӽð 30% + /* // Wisdom of GrayDarkness 이 있다면 지속시간 30% 증가 if ( pVampire->hasRankBonus( RankBonus::RANK_BONUS_WISDOM_OF_GRAY_DARKNESS ) ) { RankBonus* pRankBonus = pVampire->getRankBonus( @@ -153,7 +153,7 @@ void GrayDarkness::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp int edge = 1; - // Wide GrayDarkness ִٸ 5*5 . skill type Ѵ. + // Wide GrayDarkness 이 있다면 범위가 5*5 로 수정. skill type 을 수정한다. /* if ( pVampire->hasRankBonus( RankBonus::RANK_BONUS_WIDE_GRAY_DARKNESS ) ) { RankBonus* pRankBonus = pVampire->getRankBonus( RankBonus::RANK_BONUS_WIDE_GRAY_DARKNESS ); @@ -196,27 +196,27 @@ void GrayDarkness::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp if (tile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION) != NULL) continue; - // ŸϿ Ʈ ߰ ִٸ... + // 현재 타일에다 이펙트를 추가할 수 있다면... if (tile.canAddEffect()) { - // ӽ ׶ ߰ Ѵ. + // 머시 그라운드 있음 추가 못한당. if (tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL) continue; - // effect . + // 같은 effect가 있으면 지운다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_GRAY_DARKNESS); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); // fix me } - // Ʈ Ŭ Ѵ. + // 이펙트 클래스를 생성한다. EffectGrayDarkness* pEffect = new EffectGrayDarkness(pZone, tileX, tileY); pEffect->setDeadline(output.Duration); pEffect->setLevel(pVampire->getINT()); pEffect->setDuration(output.Duration); // pEffect->setStartTime(); - // Tile ̴ Effect ObjectID Ϲ޾ƾ Ѵ. + // Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); pZone->addEffect(pEffect); @@ -296,8 +296,8 @@ void GrayDarkness::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp list watcherList = pZone->getWatcherList(myX, myY, pVampire); - // watcherList cList ʰ, caster(pVampire) - // OK4 .. cList ߰Ѵ. + // watcherList에서 cList에 속하지 않고, caster(pVampire)를 볼 수 없는 경우는 + // OK4를 보내고.. cList에 추가한다. for (list::const_iterator itr = watcherList.begin(); itr != watcherList.end(); itr++) { bool bBelong = false; for (list::const_iterator tItr = cList.begin(); tItr != cList.end(); tItr++) @@ -306,9 +306,9 @@ void GrayDarkness::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp Creature* pWatcher = (*itr); if (bBelong == false && canSee(pWatcher, pVampire) == false) { - // Assert(pWatcher->isPC()); // 翬 PC.. Zone::getWatcherList PC returnѴ + // Assert(pWatcher->isPC()); // 당연 PC다.. Zone::getWatcherList는 PC만 return한다 if (!pWatcher->isPC()) { - // cout << "GrayDarkness : ó Ʈ PC ƴմϴ." << endl; + // cout << "GrayDarkness : 왓처 리스트가 PC가 아닙니다." << endl; GCSkillFailed1 _GCSkillFailed1; _GCSkillFailed1.setSkillType(getSkillType()); pVampire->getPlayer()->sendPacket(&_GCSkillFailed1); @@ -355,7 +355,7 @@ void GrayDarkness::execute(Monster* pMonster, Creature* pEnemy) } ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void GrayDarkness::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -392,7 +392,7 @@ void GrayDarkness::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) bTileCheck = true; if (bRangeCheck && bHitRoll && bTileCheck) { - // Ʈ ӽð Ѵ. + // 이펙트의 지속시간을 계산한다. SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); @@ -420,27 +420,27 @@ void GrayDarkness::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) } } - // ŸϿ Ʈ ߰ ִٸ... + // 현재 타일에다 이펙트를 추가할 수 있다면... if (tile.canAddEffect()) { - // ӽ ׶ ߰ Ѵ. + // 머시 그라운드 있음 추가 못한당. if (tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL) continue; - // effect . + // 같은 effect가 있으면 지운다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_GRAY_DARKNESS); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); // fix me } - // Ʈ Ŭ Ѵ. + // 이펙트 클래스를 생성한다. EffectGrayDarkness* pEffect = new EffectGrayDarkness(pZone, tileX, tileY); pEffect->setDeadline(output.Duration); pEffect->setLevel(pMonster->getINT()); pEffect->setDuration(output.Duration); // pEffect->setStartTime(); - // Tile ̴ Effect ObjectID Ϲ޾ƾ Ѵ. + // Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); @@ -512,8 +512,8 @@ void GrayDarkness::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) list watcherList = pZone->getWatcherList(myX, myY, pMonster); - // watcherList cList ʰ, caster(pMonster) - // OK4 .. cList ߰Ѵ. + // watcherList에서 cList에 속하지 않고, caster(pMonster)를 볼 수 없는 경우는 + // OK4를 보내고.. cList에 추가한다. for (list::const_iterator itr = watcherList.begin(); itr != watcherList.end(); itr++) { bool bBelong = false; for (list::const_iterator tItr = cList.begin(); tItr != cList.end(); tItr++) @@ -522,7 +522,7 @@ void GrayDarkness::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) Creature* pWatcher = (*itr); if (bBelong == false && canSee(pWatcher, pMonster) == false) { - // Assert(pWatcher->isPC()); // 翬 PC.. Zone::getWatcherList PC returnѴ + // Assert(pWatcher->isPC()); // 당연 PC다.. Zone::getWatcherList는 PC만 return한다 if (!pWatcher->isPC()) { // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; diff --git a/src/server/gameserver/skill/GreatHeal.cpp b/src/server/gameserver/skill/GreatHeal.cpp index 8269f640..aa49337b 100644 --- a/src/server/gameserver/skill/GreatHeal.cpp +++ b/src/server/gameserver/skill/GreatHeal.cpp @@ -11,7 +11,7 @@ const uint LightBloodDrainLevel = 10000; ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void GreatHeal::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -44,7 +44,7 @@ void GreatHeal::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void GreatHeal::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/GreenPoison.cpp b/src/server/gameserver/skill/GreenPoison.cpp index c3ff6475..5ee06c57 100644 --- a/src/server/gameserver/skill/GreenPoison.cpp +++ b/src/server/gameserver/skill/GreenPoison.cpp @@ -17,7 +17,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void GreenPoison::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -37,8 +37,8 @@ void GreenPoison::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -56,7 +56,7 @@ void GreenPoison::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void GreenPoison::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -86,7 +86,7 @@ void GreenPoison::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi SkillType_t SkillType = pVampireSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // Knowledge of Poison ִٸ hit bonus 10 + // Knowledge of Poison 이 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_POISON)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_POISON); @@ -116,21 +116,21 @@ void GreenPoison::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); Tile& tile = pZone->getTile(X, Y); - Range_t Range = 1; // ׻ 1̴. + Range_t Range = 1; // 항상 1이다. - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_GREEN_POISON); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); } - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectGreenPoison* pEffect = new EffectGreenPoison(pZone, X, Y); pEffect->setUserObjectID(pVampire->getObjectID()); pEffect->setDeadline(output.Duration); @@ -139,15 +139,15 @@ void GreenPoison::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi pEffect->setLevel(pSkillInfo->getLevel() / 2); pEffect->setVampire(); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); - // Ÿ ũİ ִٸ ٷ ֵ Ѵ. + // 타일 위에 크리쳐가 있다면 바로 영향을 주도록 한다. bool bEffected = false; Creature* pTargetCreature = NULL; @@ -157,10 +157,10 @@ void GreenPoison::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi ZoneCoord_t myX = pVampire->getX(); ZoneCoord_t myY = pVampire->getY(); - // ũİ ߵ ְ ϶ ȹȿ , - // ̾ ͵ ߵ ֵ Ѵ. - // ̷ Ǹ Ͱ ׸ ؼ ٸ Ͱ ߵǴ - // ߻ϰ Ǵµ... + // 모든 크리쳐가 독에 중독될 수 있게 하라는 기획안에 따라, + // 뱀파이어 및 몬스터도 독에 중독될 수 있도록 변경한다. + // 하지만 이렇게 되면 몬스터가 쓰는 그린 포이즌에 의해서 다른 몬스터가 중독되는 + // 현상이 발생하게 되는데... // if (pTargetCreature != NULL && pTargetCreature->isSlayer()) if (pTargetCreature != NULL) { if (pEffect->affectCreature(pTargetCreature, false) == true) { @@ -248,7 +248,7 @@ void GreenPoison::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void GreenPoison::execute(Monster* pMonster, Creature* pEnemy) @@ -268,7 +268,7 @@ void GreenPoison::execute(Monster* pMonster, Creature* pEnemy) } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void GreenPoison::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -316,36 +316,36 @@ void GreenPoison::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) if (bRangeCheck && bHitRoll && bTileCheck) { Tile& tile = pZone->getTile(X, Y); - Range_t Range = 1; // ׻ 1̴. + Range_t Range = 1; // 항상 1이다. - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_GREEN_POISON); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); } - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectGreenPoison* pEffect = new EffectGreenPoison(pZone, X, Y); pEffect->setDeadline(output.Duration); pEffect->setDuration(output.Duration); pEffect->setDamage(output.Damage); pEffect->setLevel(pSkillInfo->getLevel() / 2); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); - // Ÿ ũİ ִٸ ٷ ֵ Ѵ. + // 타일 위에 크리쳐가 있다면 바로 영향을 주도록 한다. bool bEffected = false; Creature* pTargetCreature = NULL; @@ -355,10 +355,10 @@ void GreenPoison::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) ZoneCoord_t myX = pMonster->getX(); ZoneCoord_t myY = pMonster->getY(); - // ũİ ߵ ְ ϶ ȹȿ , - // ̾ ͵ ߵ ֵ Ѵ. - // ̷ Ǹ Ͱ ׸ ؼ ٸ Ͱ ߵǴ - // ߻ϰ Ǵµ... + // 모든 크리쳐가 독에 중독될 수 있게 하라는 기획안에 따라, + // 뱀파이어 및 몬스터도 독에 중독될 수 있도록 변경한다. + // 하지만 이렇게 되면 몬스터가 쓰는 그린 포이즌에 의해서 다른 몬스터가 중독되는 + // 현상이 발생하게 되는데... // if (pTargetCreature != NULL && pTargetCreature->isSlayer()) if (pTargetCreature != NULL) { if (pEffect->affectCreature(pTargetCreature, false) == true) { @@ -434,7 +434,7 @@ void GreenPoison::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) } ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void GreenPoison::execute(Monster* pMonster) @@ -461,7 +461,7 @@ void GreenPoison::execute(Monster* pMonster) ZoneCoord_t X = pMonster->getX(); ZoneCoord_t Y = pMonster->getY(); - // ü ִ ŸϿ ֺ Ÿ ϳ Ѹ. + // 몬스터의 시체가 있는 타일와 그 주변 타일 중 랜덤으로 하나에 뿌린다. int dir = rand() % 8; list ptList; ptList.push_back(POINT(X, Y)); @@ -484,30 +484,30 @@ void GreenPoison::execute(Monster* pMonster) if (bTileCheck) { Tile& tile = pZone->getTile(tileX, tileY); - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_GREEN_POISON); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); } - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectGreenPoison* pEffect = new EffectGreenPoison(pZone, tileX, tileY); pEffect->setDeadline(output.Duration); pEffect->setDuration(output.Duration); pEffect->setDamage(output.Damage); pEffect->setLevel(pSkillInfo->getLevel() / 2); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& OR = pZone->getObjectRegistry(); OR.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); @@ -517,11 +517,11 @@ void GreenPoison::execute(Monster* pMonster) gcAddEffectToTile.setXY(tileX, tileY); gcAddEffectToTile.setDuration(output.Duration); - // list POINT ΰ  Ƿ, ι εij ϰ ȴ. - // κ Ŷ Ʈ Լ ڷ ޴ εij - // Լ  ѹ - // ̴. - // 2002-01-23 輺 + // list에 POINT가 두개 들어가 있으므로, 두번 브로드캐스팅을 하게 된다. + // 이 부분은 패킷의 리스트를 함수의 인자로 받는 브로드캐스팅 + // 함수를 만들어서 한번에 끝내는 것이 서버의 기능 향상에 도움이 + // 될 것이다. + // 2002-01-23 김성민 pZone->broadcastPacket(tileX, tileY, &gcAddEffectToTile); } } diff --git a/src/server/gameserver/skill/GreenStalker.cpp b/src/server/gameserver/skill/GreenStalker.cpp index 70e54dcf..2fdab461 100644 --- a/src/server/gameserver/skill/GreenStalker.cpp +++ b/src/server/gameserver/skill/GreenStalker.cpp @@ -27,7 +27,7 @@ GreenStalker g_GreenStalker; ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void GreenStalker::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -49,8 +49,8 @@ void GreenStalker::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -67,7 +67,7 @@ void GreenStalker::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire SkillType_t SkillType = pVampireSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // Knowledge of Poison ִٸ hit bonus 10 + // Knowledge of Poison 이 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_POISON)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_POISON); @@ -98,7 +98,7 @@ void GreenStalker::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ ؼ δ. + // 이펙트 오브젝트를 생성해서 붙인다. EffectGreenStalker* pEffectGreenStalker = new EffectGreenStalker(pTargetCreature); pEffectGreenStalker->setDamage(output.Damage); pEffectGreenStalker->setLevel(pSkillInfo->getLevel() / 2); @@ -111,7 +111,7 @@ void GreenStalker::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire pTargetCreature->addEffect(pEffectGreenStalker); pTargetCreature->setFlag(Effect::EFFECT_CLASS_GREEN_STALKER); - // Ʈ پ, پٰ εijش. + // 이펙트가 붙었으니, 붙었다고 브로드캐스팅해준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_GREEN_STALKER); @@ -186,7 +186,7 @@ void GreenStalker::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void GreenStalker::execute(Monster* pMonster, Creature* pEnemy) @@ -228,7 +228,7 @@ void GreenStalker::execute(Monster* pMonster, Creature* pEnemy) SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ ؼ δ. + // 이펙트 오브젝트를 생성해서 붙인다. EffectGreenStalker* pEffectGreenStalker = new EffectGreenStalker(pEnemy); pEffectGreenStalker->setDamage(output.Damage); pEffectGreenStalker->setLevel(pSkillInfo->getLevel() / 2); @@ -239,7 +239,7 @@ void GreenStalker::execute(Monster* pMonster, Creature* pEnemy) pEnemy->addEffect(pEffectGreenStalker); pEnemy->setFlag(Effect::EFFECT_CLASS_GREEN_STALKER); - // Ʈ پ, پٰ εijش. + // 이펙트가 붙었으니, 붙었다고 브로드캐스팅해준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pEnemy->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_GREEN_STALKER); diff --git a/src/server/gameserver/skill/GrenadeAttack.cpp b/src/server/gameserver/skill/GrenadeAttack.cpp index 57c18556..2dd7d7f0 100644 --- a/src/server/gameserver/skill/GrenadeAttack.cpp +++ b/src/server/gameserver/skill/GrenadeAttack.cpp @@ -16,7 +16,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void GrenadeAttack::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -51,30 +51,30 @@ void GrenadeAttack::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) if (bRangeCheck && bHitRoll && bTileCheck) { Tile& tile = pZone->getTile(X, Y); - Range_t Range = 1; // ׻ 1̴. + Range_t Range = 1; // 항상 1이다. - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); input.SkillLevel = pMonster->getLevel(); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectMeteorStrike* pEffect = new EffectMeteorStrike(pZone, X, Y); pEffect->setNextTime(output.Duration); pEffect->setUserObjectID(pMonster->getObjectID()); pEffect->setDamage(output.Damage); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); - // Ÿ ũİ ִٸ ٷ ֵ Ѵ. + // 타일 위에 크리쳐가 있다면 바로 영향을 주도록 한다. // Creature* pTargetCreature = NULL; // if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) diff --git a/src/server/gameserver/skill/GroundAttack.cpp b/src/server/gameserver/skill/GroundAttack.cpp index 0ef09323..1a783df2 100644 --- a/src/server/gameserver/skill/GroundAttack.cpp +++ b/src/server/gameserver/skill/GroundAttack.cpp @@ -16,7 +16,7 @@ #include "GCSkillToTileOK6.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void GroundAttack::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -36,8 +36,8 @@ void GroundAttack::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -56,7 +56,7 @@ void GroundAttack::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void GroundAttack::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -101,9 +101,9 @@ void GroundAttack::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); Tile& tile = pZone->getTile(X, Y); - Range_t Range = 1; // ׻ 1̴. + Range_t Range = 1; // 항상 1이다. - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_GROUND_ATTACK); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); @@ -112,31 +112,31 @@ void GroundAttack::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp checkMine(pZone, X, Y); - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectGroundAttack* pEffect = new EffectGroundAttack(pZone, X, Y); pEffect->setDamagePercent(output.Damage); pEffect->setDeadline(output.Duration); // pEffect->setNextTime(0); // pEffect->setTick(output.Tick); - // 켱 ý Ͽ ̸ Ƽ ̵ ִ´. + // 우선권 시스템을 위하여 이름과 파티 아이디를 넣는다. // pEffect->setCasterName(pVampire->getName()); pEffect->setUserObjectID(pVampire->getObjectID()); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); - // Ÿ ũİ ִٸ ٷ ֵ Ѵ. + // 타일 위에 크리쳐가 있다면 바로 영향을 주도록 한다. bool bEffected = false; Creature* pTargetCreature = NULL; @@ -241,7 +241,7 @@ void GroundAttack::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void GroundAttack::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -280,21 +280,21 @@ void GroundAttack::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) } Tile& tile = pZone->getTile(X, Y); - Range_t Range = 1; // ׻ 1̴. + Range_t Range = 1; // 항상 1이다. - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_GROUND_ATTACK); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); } - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectGroundAttack* pEffect = new EffectGroundAttack(pZone, X, Y); pEffect->setDeadline(output.Duration); // pEffect->setNextTime(0); @@ -302,15 +302,15 @@ void GroundAttack::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pEffect->setDamagePercent(output.Damage); // pEffect->setLevel(pSkillInfo->getLevel()/2); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); - // Ÿ ũİ ִٸ ٷ ֵ Ѵ. + // 타일 위에 크리쳐가 있다면 바로 영향을 주도록 한다. bool bEffected = false; Creature* pTargetCreature = NULL; diff --git a/src/server/gameserver/skill/GroundBless.cpp b/src/server/gameserver/skill/GroundBless.cpp index ed17d0bc..fa8d1be7 100644 --- a/src/server/gameserver/skill/GroundBless.cpp +++ b/src/server/gameserver/skill/GroundBless.cpp @@ -18,7 +18,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void GroundBless::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -63,7 +63,7 @@ void GroundBless::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bSatisfyRequire) { decreaseMana(pOusters, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; @@ -73,7 +73,7 @@ void GroundBless::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectGroundBless* pEffect = new EffectGroundBless(pOusters); pEffect->setDeadline(output.Duration); pEffect->setBonus(output.Damage); @@ -137,9 +137,9 @@ void GroundBless::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // 鿪. by sigi. 2002.9.13 - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수 없다. + // 저주 면역. by sigi. 2002.9.13 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !pTargetCreature->isOusters()) { executeSkillFailException(pOusters, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -178,7 +178,7 @@ void GroundBless::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersS bool bCanSeeCaster = canSee(pTargetCreature, pOusters); - // Ʈ Ʈ δ. + // 이펙트 오브젝트를 생성해 붙인다. EffectGroundBless* pEffect = new EffectGroundBless(pTargetCreature); pEffect->setDeadline(output.Duration); pEffect->setBonus(output.Damage); diff --git a/src/server/gameserver/skill/GunShotGuidance.cpp b/src/server/gameserver/skill/GunShotGuidance.cpp index e054ebbc..61adbfd6 100644 --- a/src/server/gameserver/skill/GunShotGuidance.cpp +++ b/src/server/gameserver/skill/GunShotGuidance.cpp @@ -19,7 +19,7 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void GunShotGuidance::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -36,8 +36,8 @@ void GunShotGuidance::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -55,7 +55,7 @@ void GunShotGuidance::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillS } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 슬레이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void GunShotGuidance::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -70,7 +70,7 @@ void GunShotGuidance::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Ski Assert(pPlayer != NULL); Assert(pZone != NULL); - // ִ ȮѴ. + // 총을 들고 있는지 확인한다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || isArmsWeapon(pItem) == false) { executeSkillFailException(pSlayer, getSkillType()); @@ -104,21 +104,21 @@ void GunShotGuidance::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Ski if (bManaCheck && bTimeCheck && bRangeCheck && !bEffected && bTileCheck) { decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1); - // ð Ѵ. - SkillInput input(pSlayer, pSkillSlot); // pSkillSlot ߰ by Sequoia 2002.12.28 + // 데미지와 지속 시간을 계산한다. + SkillInput input(pSlayer, pSkillSlot); // pSkillSlot 추가 by Sequoia 2002.12.28 SkillOutput output; computeOutput(input, output); Tile& tile = pZone->getTile(X, Y); - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_GUN_SHOT_GUIDANCE_POINT); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); } - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectGunShotGuidanceAim* pEffect = new EffectGunShotGuidanceAim(pSlayer, pZone, X, Y); pEffect->setDamage(output.Damage); pEffect->setDeadline(output.Duration); @@ -164,7 +164,7 @@ void GunShotGuidance::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Ski pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); - // GunShotGuidanceAim Ʈ εij Ѵ. + // GunShotGuidanceAim 이펙트를 브로드캐스팅 한다. GCAddEffect gcAddAimEffect; gcAddAimEffect.setObjectID(pSlayer->getObjectID()); gcAddAimEffect.setEffectID(Effect::EFFECT_CLASS_GUN_SHOT_GUIDANCE_AIM); @@ -172,7 +172,7 @@ void GunShotGuidance::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Ski pZone->broadcastPacket(myX, myY, &gcAddAimEffect); /////////////////////////////////////////////////////////////////// - // GunShotGuidancePoint Ʈ  ̰ εij Ѵ. + // GunShotGuidancePoint 이펙트를 만들어서 붙이고 브로드캐스팅 한다. /////////////////////////////////////////////////////////////////// EffectGunShotGuidancePoint* pPointEffect = new EffectGunShotGuidancePoint(pZone, X, Y); pPointEffect->setDeadline(output.Duration); @@ -231,19 +231,19 @@ void GunShotGuidance::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) { ZoneCoord_t myX = pMonster->getX(); ZoneCoord_t myY = pMonster->getY(); - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_GUN_SHOT_GUIDANCE_POINT); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); } - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectGunShotGuidanceAim* pEffect = new EffectGunShotGuidanceAim(pMonster, pZone, X, Y); pEffect->setDeadline(output.Duration); pEffect->setDamage(output.Damage); @@ -277,7 +277,7 @@ void GunShotGuidance::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) { pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); - // GunShotGuidanceAim Ʈ εij Ѵ. + // GunShotGuidanceAim 이펙트를 브로드캐스팅 한다. GCAddEffect gcAddAimEffect; gcAddAimEffect.setObjectID(pMonster->getObjectID()); gcAddAimEffect.setEffectID(Effect::EFFECT_CLASS_GUN_SHOT_GUIDANCE_AIM); diff --git a/src/server/gameserver/skill/Hallucination.cpp b/src/server/gameserver/skill/Hallucination.cpp index c533391d..13deffe0 100644 --- a/src/server/gameserver/skill/Hallucination.cpp +++ b/src/server/gameserver/skill/Hallucination.cpp @@ -19,7 +19,7 @@ #include "Reflection.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Hallucination::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -41,8 +41,8 @@ void Hallucination::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampir Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_HALLUCINATION) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); @@ -85,13 +85,13 @@ void Hallucination::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampir SkillOutput output; computeOutput(input, output); - // pTargetCreature ָ ݻϴ + // pTargetCreature가 저주마법을 반사하는 경우 if (CheckReflection(pVampire, pTargetCreature, getSkillType())) { pTargetCreature = (Creature*)pVampire; TargetObjectID = pVampire->getObjectID(); } - // Ʈ Ʈ δ. + // 이펙트 오브젝트를 생성해 붙인다. EffectHallucination* pEffect = new EffectHallucination(pTargetCreature); pEffect->setDeadline(output.Duration); pEffect->setLevel(pSkillInfo->getLevel() / 2); @@ -124,10 +124,10 @@ void Hallucination::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampir _GCSkillToObjectOK6.setSkillType(SkillType); _GCSkillToObjectOK6.setDuration(output.Duration); - if (bCanSeeCaster) // 10 ġ. + if (bCanSeeCaster) // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); - } else // 10 ġ. + } else // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK6, &_GCSkillToObjectOK1); } @@ -180,7 +180,7 @@ void Hallucination::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampir ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Hallucination::execute(Monster* pMonster, Creature* pEnemy) @@ -207,7 +207,7 @@ void Hallucination::execute(Monster* pMonster, Creature* pEnemy) if (pMonster->isMaster()) { int x = pMonster->getX(); int y = pMonster->getY(); - int Splash = 3 + rand() % 5; // 3~7 + int Splash = 3 + rand() % 5; // 3~7 마리 int range = 2; // 5x5 list creatureList; getSplashVictims(pMonster->getZone(), x, y, Creature::CREATURE_CLASS_MAX, creatureList, Splash, range); @@ -270,13 +270,13 @@ void Hallucination::executeMonster(Zone* pZone, Monster* pMonster, Creature* pEn SkillOutput output; computeOutput(input, output); - // pTargetCreature ָ ݻϴ + // pTargetCreature가 저주마법을 반사하는 경우 if (CheckReflection(pMonster, pEnemy, getSkillType())) { pEnemy = (Creature*)pMonster; } - // Ʈ Ʈ δ. + // 이펙트 오브젝트를 생성해 붙인다. EffectHallucination* pEffect = new EffectHallucination(pEnemy); pEffect->setDeadline(output.Duration); pEffect->setLevel(pSkillInfo->getLevel() / 2); diff --git a/src/server/gameserver/skill/Halo.cpp b/src/server/gameserver/skill/Halo.cpp index 9344fd3a..75f6a64e 100644 --- a/src/server/gameserver/skill/Halo.cpp +++ b/src/server/gameserver/skill/Halo.cpp @@ -18,15 +18,15 @@ static BYTE getDirection_Halo(int originX, int originY, int destX, int destY) { int stepX = destX - originX, stepY = destY - originY; - // 0 check - float k = (stepX == 0) ? 0 : (float)(stepY) / stepX; // + // 0일 때 check + float k = (stepX == 0) ? 0 : (float)(stepY) / stepX; // 기울기 //-------------------------------------------------- - // ؾ Ѵ. + // 방향을 정해야 한다. //-------------------------------------------------- if (stepY == 0) { - // X + // X축 // - -;; if (stepX == 0) return DOWN; @@ -34,13 +34,13 @@ static BYTE getDirection_Halo(int originX, int originY, int destX, int destY) { return RIGHT; else return LEFT; - } else if (stepY < 0) // UP + } else if (stepY < 0) // UP쪽으로 { - // y + // y축 위 if (stepX == 0) { return UP; } - // 1и + // 1사분면 else if (stepX > 0) { if (k < -HALO_BASIS_DIRECTION_HIGH) return UP; @@ -49,7 +49,7 @@ static BYTE getDirection_Halo(int originX, int originY, int destX, int destY) { else return RIGHT; } - // 2и + // 2사분면 else { if (k > HALO_BASIS_DIRECTION_HIGH) return UP; @@ -59,13 +59,13 @@ static BYTE getDirection_Halo(int originX, int originY, int destX, int destY) { return LEFT; } } - // Ʒ + // 아래쪽 else { - // y Ʒ + // y축 아래 if (stepX == 0) { return DOWN; } - // 4и + // 4사분면 else if (stepX > 0) { if (k > HALO_BASIS_DIRECTION_HIGH) return DOWN; @@ -74,7 +74,7 @@ static BYTE getDirection_Halo(int originX, int originY, int destX, int destY) { else return RIGHT; } - // 3и + // 3사분면 else { if (k < -HALO_BASIS_DIRECTION_HIGH) return DOWN; @@ -88,7 +88,7 @@ static BYTE getDirection_Halo(int originX, int originY, int destX, int destY) { ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Halo::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -119,7 +119,7 @@ void Halo::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlo g_SimpleMissileSkill.execute(pOusters, TargetObjectID, pOustersSkillSlot, param, result, CEffectID); if (result.bSuccess) { - cout << "Halo " << endl; + cout << "Halo 성공" << endl; Dir_t dir = getDirection_Halo(pOusters->getX(), pOusters->getY(), result.pTargetCreature->getX(), result.pTargetCreature->getY()); diff --git a/src/server/gameserver/skill/HandsOfFire.cpp b/src/server/gameserver/skill/HandsOfFire.cpp index 2deeac58..a6e91175 100644 --- a/src/server/gameserver/skill/HandsOfFire.cpp +++ b/src/server/gameserver/skill/HandsOfFire.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void HandsOfFire::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -57,12 +57,12 @@ void HandsOfFire::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bSatisfyRequire) { decreaseMana(pOusters, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectHandsOfFire* pEffect = new EffectHandsOfFire(pOusters); pEffect->setDeadline(output.Duration); pEffect->setBonus(output.Damage); diff --git a/src/server/gameserver/skill/HandsOfNizie.cpp b/src/server/gameserver/skill/HandsOfNizie.cpp index 092e2e49..cbf56684 100644 --- a/src/server/gameserver/skill/HandsOfNizie.cpp +++ b/src/server/gameserver/skill/HandsOfNizie.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void HandsOfNizie::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/HandsOfWisdom.cpp b/src/server/gameserver/skill/HandsOfWisdom.cpp index 6e3dd075..2516f866 100644 --- a/src/server/gameserver/skill/HandsOfWisdom.cpp +++ b/src/server/gameserver/skill/HandsOfWisdom.cpp @@ -10,7 +10,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void HandsOfWisdom::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -38,7 +38,7 @@ void HandsOfWisdom::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampir SIMPLE_SKILL_OUTPUT result; - // Tiger Nail ִٸ 10% + // Tiger Nail 이 있다면 데미지 10% 증가 if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_TIGER_NAIL)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_TIGER_NAIL); Assert(pRankBonus != NULL); @@ -46,7 +46,7 @@ void HandsOfWisdom::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampir param.SkillDamage += getPercentValue(param.SkillDamage, pRankBonus->getPoint()); } - // Knowledge of Innate ִٸ hit bonus ִ. + // Knowledge of Innate 가 있다면 hit bonus 가 있다. int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE); @@ -63,7 +63,7 @@ void HandsOfWisdom::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampir } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void HandsOfWisdom::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/HarpoonBomb.cpp b/src/server/gameserver/skill/HarpoonBomb.cpp index dca49fe7..53378b0d 100644 --- a/src/server/gameserver/skill/HarpoonBomb.cpp +++ b/src/server/gameserver/skill/HarpoonBomb.cpp @@ -16,7 +16,7 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ +// 슬레이어 오브젝트 ////////////////////////////////////////////////////////////////////////////// void HarpoonBomb::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,7 +37,7 @@ void HarpoonBomb::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC() || pTargetCreature->isDead()) { executeSkillFailException(pSlayer, getSkillType()); @@ -51,9 +51,9 @@ void HarpoonBomb::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* GCAttackArmsOK4 _GCAttackArmsOK4; GCAttackArmsOK5 _GCAttackArmsOK5; - // ִ Ⱑ ų, 迭 Ⱑ ƴ϶ . - // 迭 ߿ SG SR HarpoonBomb . - // SG, SR ִ. + // 들고 있는 무기가 없거나, 총 계열 무기가 아니라면 기술을 쓸 수 없다. + // 총 계열 무기 중에서도 SG나 SR은 HarpoonBomb를 쓸 수가 없다. + // SG, SR 도 이제 쓸 수 있다. // 2003. 1. 14 by bezz Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL || isArmsWeapon(pWeapon) == false) @@ -76,7 +76,7 @@ void HarpoonBomb::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* SkillOutput output; computeOutput(input, output); - // Ƽ Ѵ. + // 페널티 값을 계산한다. int RequiredMP = (int)pSkillInfo->getConsumeMP(); bool bManaCheck = hasEnoughMana(pSlayer, RequiredMP); bool bTimeCheck = verifyRunTime(pSkillSlot); @@ -85,12 +85,12 @@ void HarpoonBomb::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* bool bHitRoll = HitRoll::isSuccess(pSlayer, pTargetCreature); bool bPK = verifyPK(pSlayer, pTargetCreature); - // Ѿ ڴ ߸. + // 총알 숫자는 무조건 떨어뜨린다. Bullet_t RemainBullet = 0; if (bBulletCheck) { - // Ѿ ڸ ߸, ϰ, Ѿ ڸ ޾ƿ´. + // 총알 숫자를 떨어뜨리고, 저장하고, 남은 총알 숫자를 받아온다. decreaseBullet(pWeapon); - // ѹ߾ ʿ . by sigi. 2002.5.9 + // 한발쓸때마다 저장할 필요 없다. by sigi. 2002.5.9 // pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); RemainBullet = getRemainBullet(pWeapon); } @@ -104,19 +104,19 @@ void HarpoonBomb::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* bool bCriticalHit = false; - // ϰ, quickfire Ƽ Ѵ. - // output.Damage ̱ , % ϸ ᱹ ȴ. + // 데미지를 계산하고, quickfire 페널티를 가한다. + // output.Damage가 음수이기 때문에, %값을 구해 더하면 결국 빼는 것이 된다. int Damage = computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); Damage += getPercentValue(Damage, output.Damage); Damage = max(0, Damage); // cout << "HarpoonBombDamage:" << Damage << endl; - // Ѵ. + // 데미지를 세팅한다. setDamage(pTargetCreature, Damage, pSlayer, SkillType, &_GCAttackArmsOK2, &_GCAttackArmsOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCAttackArmsOK2, &_GCAttackArmsOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } @@ -146,8 +146,8 @@ void HarpoonBomb::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* } /* - // 80% Ȯθ ɷġ Ѵ. - // ̾ ƴ 쿡 ġ Ѵ. + // 80% 확률로만 능력치가 상승한다. + // 상대방이 슬레이어가 아닐 경우에만 경험치가 상승한다. if (Random(1, 100) < 80 && !pTargetCreature->isSlayer()) { */ @@ -175,7 +175,7 @@ void HarpoonBomb::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pMonster->addEnemy(pSlayer); } - // ڿ Ʈ. + // 공격자와 상대의 아이템 내구성 떨어트림. decreaseDurability(pSlayer, pTargetCreature, NULL, &_GCAttackArmsOK1, &_GCAttackArmsOK2); ZoneCoord_t targetX = pTargetCreature->getX(); diff --git a/src/server/gameserver/skill/HeadShot.cpp b/src/server/gameserver/skill/HeadShot.cpp index 87e59c03..1cb0b8ad 100644 --- a/src/server/gameserver/skill/HeadShot.cpp +++ b/src/server/gameserver/skill/HeadShot.cpp @@ -19,7 +19,7 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void HeadShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -42,8 +42,8 @@ void HeadShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -58,10 +58,10 @@ void HeadShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS GCSkillToObjectOK4 _GCSkillToObjectOK4; GCSkillToObjectOK5 _GCSkillToObjectOK5; - // ϰ ִ Ⱑ ̰ų, ƴϰų, SR̶ . + // 무장하고 있는 무기가 널이거나, 총이 아니거나, SR이라면 이 기술을 쓸 수 없다. Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL || !isArmsWeapon(pWeapon)) - // SR 밡ϰ Ѵ. by sigi. 2002.12.3 + // SR도 사용가능하게 한다. by sigi. 2002.12.3 //|| pWeapon->getItemClass() == Item::ITEM_CLASS_SR) { executeSkillFailException(pSlayer, getSkillType()); @@ -77,19 +77,19 @@ void HeadShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS int RequiredMP = (int)pSkillInfo->getConsumeMP(); bool bManaCheck = hasEnoughMana(pSlayer, RequiredMP); bool bTimeCheck = verifyRunTime(pSkillSlot); - bool bRangeCheck = verifyDistance(pSlayer, pTargetCreature, pSkillInfo->getRange()); // Ÿ 3 + bool bRangeCheck = verifyDistance(pSlayer, pTargetCreature, pSkillInfo->getRange()); // 사정거리 3으로 고정 bool bBulletCheck = (getRemainBullet(pWeapon) > 0) ? true : false; - // Ѿ ڴ ߸. + // 총알 숫자는 무조건 떨어뜨린다. Bullet_t RemainBullet = 0; if (bBulletCheck) { decreaseBullet(pWeapon); - // ѹ߾ ʿ . by sigi. 2002.5.9 + // 한발쓸때마다 저장할 필요 없다. by sigi. 2002.5.9 // pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); RemainBullet = getRemainBullet(pWeapon); } - // , ʽ, ǥ Ѵ. + // 데미지, 투힛 보너스, 좌표와 방향을 구한다. int ToHitBonus = 0; int DamageBonus = 0; ZoneCoord_t myX = pSlayer->getX(); @@ -100,14 +100,14 @@ void HeadShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS int Splash = computeArmsWeaponSplashSize(pWeapon, myX, myY, targetX, targetY); - // Ÿ ʽ Ѵ. + // 거리에 따른 데미지 보너스를 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; input.Range = getDistance(pSlayer->getX(), pSlayer->getY(), pTargetCreature->getX(), pTargetCreature->getY()); computeOutput(input, output); //////////////////////////////////////////////////////////////////////////////// - // SG ƴ ٸ + // SG가 아닌 다른 총일 경우 //////////////////////////////////////////////////////////////////////////////// if (Splash == 0) { ToHitBonus = computeArmsWeaponToHitBonus(pWeapon, myX, myY, targetX, targetY); @@ -126,13 +126,13 @@ void HeadShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS setDamage(pTargetCreature, Damage, pSlayer, SkillType, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } if (!pTargetCreature->isSlayer()) { - // ġ ÷ش. + // 경험치를 올려준다. if (bIncreaseDomainExp) { shareAttrExp(pSlayer, Damage, 1, 8, 1, _GCSkillToObjectOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToObjectOK1, @@ -142,10 +142,10 @@ void HeadShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS increaseAlignment(pSlayer, pTargetCreature, _GCSkillToObjectOK1); } - // Ѿ ߸, ̺ϰ, Ѿ ް, ߸. + // 총알 수를 떨어뜨리고, 세이브하고, 남은 총알을 받고, 내구력을 떨어뜨린다. decreaseDurability(pSlayer, pTargetCreature, pSkillInfo, &_GCSkillToObjectOK1, &_GCSkillToObjectOK2); - // ִٸ, Ѿ ڸ ߸, Ŭ̾Ʈ ˷ش. + // 총이 아직까지 남아있다면, 총알 숫자를 떨어뜨리라고, 클라이언트에게 알려준다. if (pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND) != NULL) _GCSkillToObjectOK1.addShortData(MODIFY_BULLET, RemainBullet); @@ -201,7 +201,7 @@ void HeadShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS } } //////////////////////////////////////////////////////////////////////////////// - // SG 弦 ... + // SG일 경우 헤드샷 말고도 데미지가... //////////////////////////////////////////////////////////////////////////////// else { if (bManaCheck && bTimeCheck && bRangeCheck && bBulletCheck) { @@ -213,8 +213,8 @@ void HeadShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1); - Damage_t Damage = 0; // ϱ - bool bHit = false; // ̶ ¾Ҵ° ϱ + Damage_t Damage = 0; // 마지막으로 입힌 데미지를 저장하기 위한 변수 + bool bHit = false; // 한 명이라도 맞았는가를 저장하기 위한 변수 Level_t maxEnemyLevel = 0; uint EnemyNum = 0; @@ -242,8 +242,8 @@ void HeadShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS Damage = computeDamage(pSlayer, pEnemy, SkillLevel / 5, bCriticalHit) + output.Damage + DamageBonus; - // Ÿ ϰ, ÷ Դµ, - // ÷ Ϲ 50%̴. + // 메인 타겟을 제외하고는, 스플래시 데미지를 입는데, + // 스플래시 데미지는 일반 데미지의 50%이다. if (pTargetCreature != pEnemy) { Damage = Damage / 2; } @@ -259,12 +259,12 @@ void HeadShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS increaseAlignment(pSlayer, pEnemy, _GCSkillToTileOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pEnemy, myX, myY); } - // ̾ ƴ 쿡 hit ɷ Ѵ. + // 슬레이어가 아닌 경우에만 hit한 걸로 간주한다. if (!pEnemy->isSlayer()) { bHit = true; if (maxEnemyLevel < pEnemy->getLevel()) @@ -274,7 +274,7 @@ void HeadShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS } } - // ϳ ¾ 쿡 ġ ÷ش. + // 하나라도 맞았을 경우에만 경험치를 올려준다. if (bHit) { shareAttrExp(pSlayer, Damage, 1, 8, 1, _GCSkillToTileOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToTileOK1, maxEnemyLevel, @@ -283,7 +283,7 @@ void HeadShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS increaseAlignment(pSlayer, pTargetCreature, _GCSkillToTileOK1); } - // Ѿ ڸ ̰, Ѿ ڸ ϰ, Ѿ ڸ ߸. + // 총알 숫자를 줄이고, 총알 숫자를 저장하고, 남은 총알 숫자를 받은 다음에 내구력을 떨어뜨린다. _GCSkillToTileOK1.addShortData(MODIFY_BULLET, RemainBullet); decreaseDurability(pSlayer, NULL, pSkillInfo, &_GCSkillToTileOK1, NULL); @@ -322,7 +322,7 @@ void HeadShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS pPlayer->sendPacket(&_GCSkillToTileOK1); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pVictim = *itr; Assert(pVictim != NULL); diff --git a/src/server/gameserver/skill/HeartCatalyst.cpp b/src/server/gameserver/skill/HeartCatalyst.cpp index eb4ebe33..ac826d6b 100644 --- a/src/server/gameserver/skill/HeartCatalyst.cpp +++ b/src/server/gameserver/skill/HeartCatalyst.cpp @@ -14,7 +14,7 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ +// 슬레이어 셀프 ////////////////////////////////////////////////////////////////////////////// void HeartCatalyst::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -33,7 +33,7 @@ void HeartCatalyst::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 검이 아니라면 기술을 쓸 수 없다. Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL || !isArmsWeapon(pWeapon)) { executeSkillFailException(pSlayer, getSkillType()); @@ -67,7 +67,7 @@ void HeartCatalyst::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectHeartCatalyst* pEffect = new EffectHeartCatalyst(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setHealPoint(output.Damage); @@ -76,14 +76,14 @@ void HeartCatalyst::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_HEART_CATALYST); - // ̷ Ͽ ٲ ɷġ . + // 이로 인하여 바뀌는 능력치를 보낸다. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); if (bIncreaseDomainExp) { @@ -92,7 +92,7 @@ void HeartCatalyst::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t // increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); } - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(output.Duration); diff --git a/src/server/gameserver/skill/HeavenGround.cpp b/src/server/gameserver/skill/HeavenGround.cpp index 05bd629a..b2d26be9 100644 --- a/src/server/gameserver/skill/HeavenGround.cpp +++ b/src/server/gameserver/skill/HeavenGround.cpp @@ -1,6 +1,6 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : HeavenGround.cpp -// SkillName : ҽ +// SkillName : ÌìÉñ½µÁÙ ÈËÀàÒ½Éú¼¼ÄÜ // Written by : // Description : ////////////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ #include "GCSkillToTileOK6.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// ½½·¹ÀÌ¾î ¿ÀºêÁ§Æ® Çڵ鷯 ////////////////////////////////////////////////////////////////////////////// void HeavenGround::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -38,7 +38,7 @@ void HeavenGround::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuchÁ¦°Å. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -55,7 +55,7 @@ void HeavenGround::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// ½½·¹À̾î ŸÀÏ Çڵ鷯 ////////////////////////////////////////////////////////////////////////////// void HeavenGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -100,9 +100,9 @@ void HeavenGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS bool bUseSkill = false; /* - // ȡǰʹüܽɫʹõ + // È¡³öµ±Ç°Ê¹Óü¼ÄܽÇÉ«ËùʹÓõÄÎäÆ÷ Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); - //ûʹü + //ûÓÐÎäÆ÷²»ÄÜʹÓü¼ÄÜ if (pWeapon != NULL) { Silver_t silverDamage= pWeapon->getSilver(); @@ -116,7 +116,7 @@ void HeavenGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS */ bUseSkill = true; if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bTileCheck && bUseSkill) { - // Ʈ ӽð Ѵ. + // ÀÌÆåÆ®ÀÇ Áö¼Ó½Ã°£À» °è»êÇÑ´Ù. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); @@ -126,12 +126,12 @@ void HeavenGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS int oX, oY; list cList; - // 5 * 5 Χ + // 5 * 5 ·¶Î§ for (oY = -2; oY <= 2; oY++) for (oX = -2; oX <= 2; oX++) { int tileX = X + oX; int tileY = Y + oY; - // ǷڵͼС + // ¼ì²âÊÇ·ñ´óÓÚµØÍ¼´óС // cout << "HeavenGround setup1" << endl; if (rect.ptInRect(tileX, tileY)) { // cout << "HeavenGround setup2" << endl; @@ -140,7 +140,7 @@ void HeavenGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS if (tile.canAddEffect()) { // cout << "HeavenGround setup3" << endl; if (tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL || - tile.getEffect(Effect::EFFECT_CLASS_SUMMON_CLAY) != NULL) // ʴȴ slayer + tile.getEffect(Effect::EFFECT_CLASS_SUMMON_CLAY) != NULL) // ÈÊ´È´óµØ slayer { // cout << "HeavenGround setup4" << endl; executeSkillFailNormal(pSlayer, getSkillType(), NULL); @@ -153,16 +153,16 @@ void HeavenGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS pZone->deleteEffect(effectID); // fix me } - // ȥǰڵ˺Ч + // È¥³ýµ±Ç°½Úµã´øÓÐÉ˺¦µÄЧ¹û /* - case 0: e = Effect::EFFECT_CLASS_PROMINENCE; break; // Oust - case 1: e = Effect::EFFECT_CLASS_ACID_SWAMP; break; // vamp - case 2: e = Effect::EFFECT_CLASS_BLOODY_WALL; break; // Ѫǽ vamp - case 3: e = Effect::EFFECT_CLASS_GREEN_POISON; break; // ӫ֮ vamp - case 4: e = Effect::EFFECT_CLASS_HELLFIRE; break; // oust + case 0: e = Effect::EFFECT_CLASS_PROMINENCE; break; // µØÓü»ðº£ Oust + case 1: e = Effect::EFFECT_CLASS_ACID_SWAMP; break; // ËáÐÔÕÓÔó vamp + case 2: e = Effect::EFFECT_CLASS_BLOODY_WALL; break; // Ѫǽ vamp + case 3: e = Effect::EFFECT_CLASS_GREEN_POISON; break; // Ó«ÂÌÖ®¶¾ vamp + case 4: e = Effect::EFFECT_CLASS_HELLFIRE; break; // µØÓü»ð oust */ Effect* pDeleteEffect = NULL; - // Oust + // µØÓü»ðº£ Oust pDeleteEffect = tile.getEffect(Effect::EFFECT_CLASS_PROMINENCE); if (pDeleteEffect != NULL) { ObjectID_t effectObjectID = pDeleteEffect->getObjectID(); @@ -176,7 +176,7 @@ void HeavenGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS pZone->broadcastPacket(tileX, tileY, &gcDeleteEffectFromTile); // cout << "DeleteEffect[" << Effect::EFFECT_CLASS_PROMINENCE << "]" << endl; } - // vamp + // ËáÐÔÕÓÔó vamp pDeleteEffect = tile.getEffect(Effect::EFFECT_CLASS_ACID_SWAMP); if (pDeleteEffect != NULL) { ObjectID_t effectObjectID = pDeleteEffect->getObjectID(); @@ -190,7 +190,7 @@ void HeavenGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS pDeleteEffect->setDeadline(1); cout << "DeleteEffect[" << "Effect::EFFECT_CLASS_ACID_SWAMP" << "]" << endl; } - // Ѫǽ vamp + // Ѫǽ vamp pDeleteEffect = tile.getEffect(Effect::EFFECT_CLASS_BLOODY_WALL); if (pDeleteEffect != NULL) { ObjectID_t effectObjectID = pDeleteEffect->getObjectID(); @@ -203,7 +203,7 @@ void HeavenGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS pZone->broadcastPacket(tileX, tileY, &gcDeleteEffectFromTile); // cout << "DeleteEffect[" << (int)Effect::EFFECT_CLASS_BLOODY_WALL << "]" << endl; } - // ӫ֮ vamp + // Ó«ÂÌÖ®¶¾ vamp pDeleteEffect = tile.getEffect(Effect::EFFECT_CLASS_GREEN_POISON); if (pDeleteEffect != NULL) { ObjectID_t effectObjectID = pDeleteEffect->getObjectID(); @@ -216,7 +216,7 @@ void HeavenGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS pZone->broadcastPacket(tileX, tileY, &gcDeleteEffectFromTile); // cout << "DeleteEffect[" << (int)Effect::EFFECT_CLASS_GREEN_POISON << "]" << endl; } - // oust + // µØÓü»ð oust pDeleteEffect = tile.getEffect(Effect::EFFECT_CLASS_HELLFIRE); if (pDeleteEffect != NULL) { ObjectID_t effectObjectID = pDeleteEffect->getObjectID(); @@ -238,7 +238,7 @@ void HeavenGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS } } - // ϸ ٸ ǹǷ ⼭ ٿش. + // ½ÇÆÐÇÏ¸é ¸¶³ª°¡ ÁÙ¸é ¾È µÇ¹Ç·Î ¿©±â¼­ ÁÙ¿©ÁØ´Ù. decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1); for (oY = -2; oY <= 2; oY++) @@ -248,12 +248,12 @@ void HeavenGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS if (rect.ptInRect(tileX, tileY)) { Tile& tile = pZone->getTile(tileX, tileY); - // ŸϿ Ʈ ߰ ִٸ... - // if (tile.canAddEffect()) // üũߴ. + // ÇöÀç ŸÀÏ¿¡´Ù ÀÌÆåÆ®¸¦ Ãß°¡ÇÒ ¼ö ÀÖ´Ù¸é... + // if (tile.canAddEffect()) // À§¿¡¼­ üũÇß´Ù. { - // Ʈ Ŭ Ѵ. + // ÀÌÆåÆ® Ŭ·¡½º¸¦ »ý¼ºÇÑ´Ù. EffectHeavenGround* pEffect = new EffectHeavenGround(pZone, tileX, tileY); - // Ч˺ + // ÉèÖÃЧ¹ûÉ˺¦ pEffect->setUserObjectID(pSlayer->getObjectID()); pEffect->setDamage(output.Damage); pEffect->setTick(output.Tick); @@ -262,7 +262,7 @@ void HeavenGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS pEffect->setLevel(pSkillInfo->getLevel() / 2); pEffect->setDeadline(output.Duration); - // עἼЧ + // ×¢²á¼¼ÄÜЧ¹û pZone->registerObject(pEffect); pZone->addEffect(pEffect); tile.addEffect(pEffect); @@ -348,8 +348,8 @@ void HeavenGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS list watcherList = pZone->getWatcherList(myX, myY, pSlayer); - // watcherList cList ʰ, caster(pSlayer) - // OK4 .. cList ߰Ѵ. + // watcherList¿¡¼­ cList¿¡ ¼ÓÇÏÁö ¾Ê°í, caster(pSlayer)¸¦ º¼ ¼ö ¾ø´Â °æ¿ì´Â + // OK4¸¦ º¸³»°í.. cList¿¡ Ãß°¡ÇÑ´Ù. for (list::const_iterator itr = watcherList.begin(); itr != watcherList.end(); itr++) { bool bBelong = false; for (list::const_iterator tItr = cList.begin(); tItr != cList.end(); tItr++) @@ -358,9 +358,9 @@ void HeavenGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS Creature* pWatcher = (*itr); if (bBelong == false && canSee(pWatcher, pSlayer) == false) { - // Assert(pWatcher->isPC()); // 翬 PC.. Zone::getWatcherList PC returnѴ + // Assert(pWatcher->isPC()); // ´ç¿¬ PC´Ù.. Zone::getWatcherList´Â PC¸¸ returnÇÑ´Ù if (!pWatcher->isPC()) { - // cout << "HeavenGround : ó Ʈ PC ƴմϴ." << endl; + // cout << "HeavenGround : ¿Óó ¸®½ºÆ®°¡ PC°¡ ¾Æ´Õ´Ï´Ù." << endl; GCSkillFailed1 _GCSkillFailed1; _GCSkillFailed1.setSkillType(getSkillType()); pSlayer->getPlayer()->sendPacket(&_GCSkillFailed1); diff --git a/src/server/gameserver/skill/HellFire.cpp b/src/server/gameserver/skill/HellFire.cpp index 8c098ebc..dec90ade 100644 --- a/src/server/gameserver/skill/HellFire.cpp +++ b/src/server/gameserver/skill/HellFire.cpp @@ -47,7 +47,7 @@ HellFire::HellFire() throw() { }; ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void HellFire::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -67,7 +67,7 @@ void HellFire::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkil Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pOusters, pTargetCreature)) { executeSkillFailException(pOusters, getSkillType()); return; @@ -84,7 +84,7 @@ void HellFire::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkil } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ÿ ڵ鷯 +// 아우스터즈 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void HellFire::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -124,7 +124,7 @@ void HellFire::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersS ZoneCoord_t myX = pOusters->getX(); ZoneCoord_t myY = pOusters->getY(); - // Ʈ ӽð Ѵ. + // 이펙트의 지속시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); @@ -170,16 +170,16 @@ void HellFire::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersS if (tile.getEffect(Effect::EFFECT_CLASS_HEAVEN_GROUND)) continue; - // ŸϿ Ʈ ߰ ִٸ... + // 현재 타일에다 이펙트를 추가할 수 있다면... if (tile.canAddEffect()) { - // effect . + // 같은 effect가 있으면 지운다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_HELLFIRE); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); // fix me } - // Ʈ Ŭ Ѵ. + // 이펙트 클래스를 생성한다. EffectHellFire* pEffect = new EffectHellFire(pZone, tileX, tileY); pEffect->setCasterName(pOusters->getName()); pEffect->setCasterID(pOusters->getObjectID()); @@ -189,7 +189,7 @@ void HellFire::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersS pEffect->setNextTime(0); pEffect->setTick(output.Tick); - // Tile ̴ Effect ObjectID Ϲ޾ƾ Ѵ. + // Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); pZone->addEffect(pEffect); @@ -283,8 +283,8 @@ void HellFire::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersS list watcherList = pZone->getWatcherList(myX, myY, pOusters); - // watcherList cList ʰ, caster(pOusters) - // OK4 .. cList ߰Ѵ. + // watcherList에서 cList에 속하지 않고, caster(pOusters)를 볼 수 없는 경우는 + // OK4를 보내고.. cList에 추가한다. for (list::const_iterator itr = watcherList.begin(); itr != watcherList.end(); itr++) { bool bBelong = false; for (list::const_iterator tItr = cList.begin(); tItr != cList.end(); tItr++) @@ -293,9 +293,9 @@ void HellFire::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersS Creature* pWatcher = (*itr); if (bBelong == false && canSee(pWatcher, pOusters) == false) { - // Assert(pWatcher->isPC()); // 翬 PC.. Zone::getWatcherList PC returnѴ + // Assert(pWatcher->isPC()); // 당연 PC다.. Zone::getWatcherList는 PC만 return한다 if (!pWatcher->isPC()) { - // cout << "HellFire : ó Ʈ PC ƴմϴ." << endl; + // cout << "HellFire : 왓처 리스트가 PC가 아닙니다." << endl; // GCSkillFailed1 _GCSkillFailed1; // _GCSkillFailed1.setSkillType(getSkillType()); // pOusters->getPlayer()->sendPacket(&_GCSkillFailed1); diff --git a/src/server/gameserver/skill/HellFire.h b/src/server/gameserver/skill/HellFire.h index ed0b7e9d..4539c3b2 100644 --- a/src/server/gameserver/skill/HellFire.h +++ b/src/server/gameserver/skill/HellFire.h @@ -33,7 +33,7 @@ class HellFire : public SkillHandler { void computeOutput(const SkillInput& input, SkillOutput& output); private: - POINT m_HellFireMask[4][9]; // 4ܰ, 9 + POINT m_HellFireMask[4][9]; // 4단계, 9개씩 int m_MaskNum[4]; }; diff --git a/src/server/gameserver/skill/HeterChakram.cpp b/src/server/gameserver/skill/HeterChakram.cpp index 07d72c49..71f7ff3a 100644 --- a/src/server/gameserver/skill/HeterChakram.cpp +++ b/src/server/gameserver/skill/HeterChakram.cpp @@ -16,7 +16,7 @@ #include "GCSkillToObjectOK6.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void HeterChakram::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -36,8 +36,8 @@ void HeterChakram::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ousters Creature* pTargetCreature = pZone->getCreature(TargetObjectID); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pOusters, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType(), Grade); return; @@ -58,7 +58,7 @@ void HeterChakram::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ousters GCSkillToObjectOK5 _GCSkillToObjectOK5; GCSkillToObjectOK6 _GCSkillToObjectOK6; - // Ϸ + // 쇱꿎嶠포북랬昑 Item* pItem = pOusters->getWearItem(Ousters::WEAR_RIGHTHAND); if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_OUSTERS_CHAKRAM || !pOusters->isRealWearingEx(Ousters::WEAR_RIGHTHAND)) { @@ -69,7 +69,7 @@ void HeterChakram::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ousters SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(getSkillType()); int RequiredMP = (int)pSkillInfo->getConsumeMP() + pOustersSkillSlot->getExpLevel() / 3; - // MP + // 헌뇜杰唐MP // RequiredMP = pOusters->getMP(); bool bManaCheck = hasEnoughMana(pOusters, RequiredMP); diff --git a/src/server/gameserver/skill/Hide.cpp b/src/server/gameserver/skill/Hide.cpp index cedad5cf..9e697322 100644 --- a/src/server/gameserver/skill/Hide.cpp +++ b/src/server/gameserver/skill/Hide.cpp @@ -13,7 +13,7 @@ #include "ZoneUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 뱀파이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Hide::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -41,7 +41,7 @@ void Hide::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEffectID_t ZoneCoord_t x = pVampire->getX(); ZoneCoord_t y = pVampire->getY(); - // Knowledge of Innate ִٸ hit bonus 10 + // Knowledge of Innate 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE); @@ -66,7 +66,7 @@ void Hide::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEffectID_t if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bTileCheck && bMoveModeCheck && !bEffected) { decreaseMana(pVampire, RequiredMP, _GCSkillToSelfOK1); - // ̾ ϱ Ŷ . + // 뱀파이어를 땅 위에서 삭제하기 이전에 기술 패킷들을 날린다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(0); @@ -78,12 +78,12 @@ void Hide::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEffectID_t pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(x, y, &_GCSkillToSelfOK3, pVampire); - // ִ ̾ ϶ ˸. + // 땅 위에 나와있는 뱀파이어 삭제하라고 알린다. GCDeleteObject gcDO; gcDO.setObjectID(pVampire->getObjectID()); pZone->broadcastPacket(x, y, &gcDO, pVampire); - // ӿٰ ̾ ߰Ѵ. + // 땅 속에다가 뱀파이어를 추가한다. addBurrowingCreature(pZone, pVampire, x, y); pSkillSlot->setRunTime(); @@ -100,7 +100,7 @@ void Hide::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEffectID_t } ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Hide::execute(Monster* pMonster) @@ -138,19 +138,19 @@ void Hide::execute(Monster* pMonster) bool bEffected = pMonster->isFlag(Effect::EFFECT_CLASS_HIDE); if (bRangeCheck && bHitRoll && bTileCheck && bMoveModeCheck && !bEffected) { - // ͸ ϱ Ŷ . + // 몬스터를 땅 위에서 삭제하기 이전에 기술 패킷들을 날린다. _GCSkillToSelfOK3.setXY(x, y); _GCSkillToSelfOK3.setDuration(0); _GCSkillToSelfOK3.setSkillType(SkillType); pZone->broadcastPacket(x, y, &_GCSkillToSelfOK3); - // ִ ϶ ˸. + // 땅 위에 나와있는 몬스터 삭제하라고 알린다. GCDeleteObject gcDO; gcDO.setObjectID(pMonster->getObjectID()); pZone->broadcastPacket(x, y, &gcDO); - // ӿٰ ͸ ߰Ѵ. + // 땅 속에다가 몬스터를 추가한다. addBurrowingCreature(pZone, pMonster, x, y); } else { executeSkillFailNormal(pMonster, getSkillType(), NULL); diff --git a/src/server/gameserver/skill/HitConvert.cpp b/src/server/gameserver/skill/HitConvert.cpp index 536ad471..9684e5af 100644 --- a/src/server/gameserver/skill/HitConvert.cpp +++ b/src/server/gameserver/skill/HitConvert.cpp @@ -12,7 +12,7 @@ #include "SkillUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void HitConvert::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -52,7 +52,7 @@ void HitConvert::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Creature* pTargetCreature = pSlayer->getZone()->getCreature(TargetObjectID); bool bRangeCheck = pTargetCreature != NULL && verifyDistance(pSlayer, pTargetCreature, output.Range); - // ȿ Max Range üũѴ. -_-; + // 저 안에서는 Max Range 만 체크한다. -_-; if (!bRangeCheck) { executeSkillFailNormal(pSlayer, param.SkillType, pTargetCreature); return; @@ -68,7 +68,7 @@ void HitConvert::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayer)" << endl; - // knockback Ų. + // knockback 시킨다. if (result.bSuccess) { int dist = 1 + pSkillSlot->getExpLevel() / 100; for (int i = 0; i < dist; ++i) { diff --git a/src/server/gameserver/skill/HitRoll.cpp b/src/server/gameserver/skill/HitRoll.cpp index c9514afa..bd9b54e7 100644 --- a/src/server/gameserver/skill/HitRoll.cpp +++ b/src/server/gameserver/skill/HitRoll.cpp @@ -21,7 +21,7 @@ #include "EffectPrecedence.h" ////////////////////////////////////////////////////////////////////////////// -// Ϲ hitroll Լ +// 일반 공격 hitroll 함수 ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus) { Assert(pAttacker != NULL); @@ -30,7 +30,7 @@ bool HitRoll::isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus Zone* pZone = pAttacker->getZone(); Assert(pZone != NULL); - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 if (pDefender->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE)) { return false; } @@ -42,7 +42,7 @@ bool HitRoll::isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus bool isMonster = false; - // Ѵ. + // 공격자의 투힛을 계산한다. if (pAttacker->isSlayer()) { Slayer* pSlayerAttacker = dynamic_cast(pAttacker); Assert(pSlayerAttacker != NULL); @@ -57,8 +57,8 @@ bool HitRoll::isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus ToHit = pVampireAttacker->getToHit(); ToHit = (ToHit_t)getPercentValue(ToHit, VampireTimebandFactor[timeband]); - // ȭ ϰ ȴٸ.. -_-; - // Creatureٰ Penalty member ִ° ̴. + // 언젠가 최적화를 하게 된다면.. -_-; + // Creature에다가 Penalty관련 member들을 넣는게 나을 것이다. if (pAttacker->isFlag(Effect::EFFECT_CLASS_HYMN)) { EffectHymn* pHymn = dynamic_cast(pAttacker->getEffectManager()->findEffect(Effect::EFFECT_CLASS_HYMN)); @@ -78,8 +78,8 @@ bool HitRoll::isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus ToHit = (ToHit_t)getPercentValue(ToHit, MonsterTimebandFactor[timeband]); isMonster = true; - // ȭ ϰ ȴٸ.. -_-; - // Creatureٰ Penalty member ִ° ̴. + // 언젠가 최적화를 하게 된다면.. -_-; + // Creature에다가 Penalty관련 member들을 넣는게 나을 것이다. if (pAttacker->isFlag(Effect::EFFECT_CLASS_HYMN)) { EffectHymn* pHymn = dynamic_cast(pAttacker->getEffectManager()->findEffect(Effect::EFFECT_CLASS_HYMN)); @@ -88,13 +88,13 @@ bool HitRoll::isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus } } else { - // ũ Ŭ Slayer, Vampire, Monster, NPC ε... - // ̱ Դٴ ڰ NPC . - // NPC AI ̹Ƿ, ̴. + // 현재 크리쳐의 클래스는 Slayer, Vampire, Monster, NPC 뿐인데... + // 이까지 왔다는 말은 공격자가 NPC라는 말이지. + // NPC AI는 구현되지 않은 상태이므로, 무조건 리턴이다. return false; } - // 潺 ش. + // 방어자의 디펜스를 계산해 준다. if (pDefender->isSlayer()) { Slayer* pSlayerDefender = dynamic_cast(pDefender); Defense = pSlayerDefender->getDefense(); @@ -115,9 +115,9 @@ bool HitRoll::isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus isMonster = true; #endif } else { - // ũ Ŭ Slayer, Vampire, Monster, NPC ε... - // ̱ Դٴ ڰ NPC . - // NPC AI ̹Ƿ, ̴. + // 현재 크리쳐의 클래스는 Slayer, Vampire, Monster, NPC 뿐인데... + // 이까지 왔다는 말은 방어자가 NPC라는 말이지. + // NPC AI는 구현되지 않은 상태이므로, 무조건 리턴이다. return false; } @@ -125,7 +125,7 @@ bool HitRoll::isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus int Result = 0; if (ToHit >= Defense) { - // 潺 쿡 Ȯ .... + // 투힛이 디펜스보다 높은 경우에는 맞출 확률이 꽤...높다. #ifdef __CHINA_SERVER__ Result = min(90, (int)(((ToHit - Defense) / 1.5) + 60) + ToHitBonus); #else @@ -136,7 +136,7 @@ bool HitRoll::isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus } #endif } else { - // 潺 쿡 Ȯ . + // 투힛이 디펜스보다 낮은 경우에는 맞출 확률이 많이 떨어진다. #ifdef __CHINA_SERVER__ if (isMonster) { Result = max(10, (int)(60 - ((Defense - ToHit) / 1.5) + ToHitBonus)); @@ -161,7 +161,7 @@ bool HitRoll::isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus } ////////////////////////////////////////////////////////////////////////////// -// Ϲ hitroll Լ +// 일반 공격 hitroll 함수 ////////////////////////////////////////////////////////////////////////////// /*bool HitRoll::isSuccess(ToHit_t ToHit, Creature* pDefender, int ToHitBonus) { @@ -170,7 +170,7 @@ bool HitRoll::isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus Zone* pZone = pDefender->getZone(); Assert( pZone != NULL ); - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 if (pDefender->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE)) { return false; @@ -180,7 +180,7 @@ bool HitRoll::isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus Defense_t Defense = 0; uint timeband = pZone->getTimeband(); - // 潺 ش. + // 방어자의 디펜스를 계산해 준다. if (pDefender->isSlayer()) { Slayer* pSlayerDefender = dynamic_cast(pDefender); @@ -205,9 +205,9 @@ bool HitRoll::isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus } else { - // ũ Ŭ Slayer, Vampire, Monster, NPC ε... - // ̱ Դٴ ڰ NPC . - // NPC AI ̹Ƿ, ̴. + // 현재 크리쳐의 클래스는 Slayer, Vampire, Monster, NPC 뿐인데... + // 이까지 왔다는 말은 방어자가 NPC라는 말이지. + // NPC AI는 구현되지 않은 상태이므로, 무조건 리턴이다. return false; } @@ -216,7 +216,7 @@ bool HitRoll::isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus if (ToHit >= Defense) { - // 潺 쿡 Ȯ .... + // 투힛이 디펜스보다 높은 경우에는 맞출 확률이 꽤...높다. #ifdef __CHINA_SERVER__ Result = min(90, (int)(((ToHit - Defense) / 1.5) + 60) + ToHitBonus); #else @@ -225,7 +225,7 @@ bool HitRoll::isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus } else { - // 潺 쿡 Ȯ . + // 투힛이 디펜스보다 낮은 경우에는 맞출 확률이 많이 떨어진다. #ifdef __CHINA_SERVER__ Result = max(20, (int)(60 - ((Defense - ToHit) / 1.5) + ToHitBonus)); #else @@ -240,7 +240,7 @@ bool HitRoll::isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus ////////////////////////////////////////////////////////////////////////////// -// ̾ hitroll Լ +// 슬레이어용 마법 hitroll 함수 ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isSuccessMagic(Slayer* pSlayer, SkillInfo* pSkillInfo, SkillSlot* pSkillSlot) { Assert(pSlayer != NULL); @@ -256,7 +256,7 @@ bool HitRoll::isSuccessMagic(Slayer* pSlayer, SkillInfo* pSkillInfo, SkillSlot* (int)(60 - pSkillInfo->getLevel() / 3 + (int)((pSlayer->getINT() + pSkillSlot->getExpLevel()) / 2.5)); #endif - // ̾ ų ּ Ȯ 50%̴. + // 슬레이어 셀프 스킬일 경우 최소 확률이 50%이다. if (isSlayerSelfSkill(pSkillSlot->getSkillType())) SuccessRatio = max(50, SuccessRatio); @@ -268,7 +268,7 @@ bool HitRoll::isSuccessMagic(Slayer* pSlayer, SkillInfo* pSkillInfo, SkillSlot* ////////////////////////////////////////////////////////////////////////////// -// ̾ hitroll Լ +// 뱀파이어용 마법 hitroll 함수 ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isSuccessMagic(Vampire* pVampire, SkillInfo* pSkillInfo, VampireSkillSlot* pVampireSkillSlot, int BonusPoint) { @@ -294,7 +294,7 @@ bool HitRoll::isSuccessMagic(Vampire* pVampire, SkillInfo* pSkillInfo, VampireSk ////////////////////////////////////////////////////////////////////////////// -// ƿ콺ͽ hitroll Լ +// 아우스터스용 마법 hitroll 함수 ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isSuccessMagic(Ousters* pOusters, SkillInfo* pSkillInfo, OustersSkillSlot* pOustersSkillSlot, int BonusPoint) { @@ -322,7 +322,7 @@ bool HitRoll::isSuccessMagic(Ousters* pOusters, SkillInfo* pSkillInfo, OustersSk ////////////////////////////////////////////////////////////////////////////// -// Ϳ Ϲ Լ +// 몬스터용 일반 마법 명중 굴림 함수 ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isSuccessMagic(Monster* pMonster, SkillInfo* pSkillInfo) { Assert(pMonster != NULL); @@ -336,10 +336,10 @@ bool HitRoll::isSuccessMagic(Monster* pMonster, SkillInfo* pSkillInfo) { } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ϳ Լ +// 뱀파이어 및 몬스터용 흡혈 명중 굴림 함수 ////////////////////////////////////////////////////////////////////////////// -// multiplier 3̴. .. 33%ϰ ɼġε.. -// 쿡 multiplier 2 ؼ.. 50% ϰ ɼġ +// multiplier는 보통은 3이다. 즉.. 33%이하가 흡혈 가능수치인데.. +// 마스터인 경우에는 multiplier를 2로 해서.. 50% 이하가 흡혈 가능수치로 사용 // by sigi. 2002.9.16 ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isSuccessBloodDrain(Creature* pAttacker, Creature* pDefender, int multiplier) { @@ -349,13 +349,13 @@ bool HitRoll::isSuccessBloodDrain(Creature* pAttacker, Creature* pDefender, int Zone* pZone = pAttacker->getZone(); Assert(pZone != NULL); - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 if (pDefender->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE)) { return false; } - const int normalMultiplier = 3; // master flag parameter ް ̰ Ѵ. - -; + const int normalMultiplier = 3; // master flag를 parameter로 받고 이건 빼야한다. - -; bool bHPCheck = false; bool bEffected = false; uint timeband = pZone->getTimeband(); @@ -366,8 +366,8 @@ bool HitRoll::isSuccessBloodDrain(Creature* pAttacker, Creature* pDefender, int int OtherLevel = 0; int ratio = 0; - // Ÿ Ǹ ִ , - // 潺 , Ѵ. + // 타겟이 피를 빨 수 있는 상태인지, + // 디펜스가 얼마인지, 레벨이 얼마인지를 계산한다. if (pDefender->isSlayer()) { Slayer* pTargetSlayer = dynamic_cast(pDefender); int MaxHP = pTargetSlayer->getHP(ATTR_MAX); @@ -386,8 +386,8 @@ bool HitRoll::isSuccessBloodDrain(Creature* pAttacker, Creature* pDefender, int OtherLevel = (int)(OtherLevel / 350); - // ü 1/3 Ѱų, - // ̹ ¶ . + // 체력이 아직 1/3이 넘거나, + // 이미 흡혈을 당한 상태라면 흡혈을 할 수 없다. if (!bHPCheck || bEffected) return false; } else if (pDefender->isVampire()) { @@ -403,8 +403,8 @@ bool HitRoll::isSuccessBloodDrain(Creature* pAttacker, Creature* pDefender, int Defense = (Defense_t)getPercentValue(Defense, VampireTimebandFactor[timeband]); - // ü 1/3 Ѱų, - // ̹ ¶ . + // 체력이 아직 1/3이 넘거나, + // 이미 흡혈을 당한 상태라면 흡혈을 할 수 없다. if (!bHPCheck || bEffected) return false; } else if (pDefender->isOusters()) { @@ -418,8 +418,8 @@ bool HitRoll::isSuccessBloodDrain(Creature* pAttacker, Creature* pDefender, int Defense = pTargetOusters->getDefense() + pTargetOusters->getLevel() / 5; OtherLevel = pTargetOusters->getLevel(); - // ü 1/3 Ѱų, - // ̹ ¶ . + // 체력이 아직 1/3이 넘거나, + // 이미 흡혈을 당한 상태라면 흡혈을 할 수 없다. if (!bHPCheck || bEffected) return false; } else if (pDefender->isMonster()) { @@ -435,22 +435,22 @@ bool HitRoll::isSuccessBloodDrain(Creature* pAttacker, Creature* pDefender, int Defense = (Defense_t)getPercentValue(Defense, MonsterTimebandFactor[timeband]); - // ü 1/3 Ѱų, - // ̹ ¶ . + // 체력이 아직 1/3이 넘거나, + // 이미 흡혈을 당한 상태라면 흡혈을 할 수 없다. if (!bHPCheck || bEffected) return false; - // 켱 ̹ õǾ ִ Ͷ... - // ִ 켱 ̰ų, 켱 Ƽ ڿ Ѵ. + // 만일 우선권이 이미 세팅되어 있는 몬스터라면... + // 흡혈할 수 있는 조건은 우선권을 가진 자이거나, 우선권을 가진 파티에 속한 자여야 한다. if (pTargetMonster->isFlag(Effect::EFFECT_CLASS_PRECEDENCE)) { EffectPrecedence* pEffectPrecedence = dynamic_cast(pTargetMonster->findEffect(Effect::EFFECT_CLASS_PRECEDENCE)); Assert(pEffectPrecedence != NULL); - // 켱 ڰ ƴ϶... + // 우선권을 가진 자가 아니라면... if (pAttacker->getName() != pEffectPrecedence->getHostName()) { - // ƹ Ƽ ԵǾ ʰų, - // Ƽ ԵǾ ִµ, ȣƮ Ƽ ID ƴ϶, . + // 아무 파티에도 가입되어 있지 않거나, + // 파티에 가입되어 있는데, 호스트 파티 ID가 아니라면, 흡혈할 수 없다. if (pAttacker->getPartyID() == 0 || pAttacker->getPartyID() != pEffectPrecedence->getHostPartyID()) { return false; } @@ -459,7 +459,7 @@ bool HitRoll::isSuccessBloodDrain(Creature* pAttacker, Creature* pDefender, int } else Assert(false); - // Ѵ. + // 공격자의 투힛 및 레벨을 계산한다. if (pAttacker->isVampire()) { Vampire* pVampire = dynamic_cast(pAttacker); @@ -476,37 +476,37 @@ bool HitRoll::isSuccessBloodDrain(Creature* pAttacker, Creature* pDefender, int ToHit = (ToHit_t)getPercentValue(ToHit, MonsterTimebandFactor[timeband]); } - // cout << pAttacker->getName() << " : " << ToHit << endl; - // cout << pDefender->getName() << " : " << Defense << endl; + // cout << pAttacker->getName() << "의 투힛 : " << ToHit << endl; + // cout << pDefender->getName() << "의 디펜 : " << Defense << endl; if (ToHit >= Defense) { - // 潺 쿡 Ȯ .... + // 투힛이 디펜스보다 높은 경우에는 맞출 확률이 꽤...높다. ratio = min(90, (ToHit - Defense) / 2 + 70); } else { - // 潺 쿡 Ȯ . + // 투힛이 디펜스보다 낮은 경우에는 맞출 확률이 많이 떨어진다. ratio = max(10, 70 - (Defense - ToHit) / 2); } if ((rand() % 100) < ratio) { - // cout << " " << endl; + // cout << "흡혈 성공" << endl; return true; } - // cout << " " << endl; + // cout << "흡혈 실패" << endl; return false; } ////////////////////////////////////////////////////////////////////////////// -// Ʈ Լ +// 저주 마법 히트롤 함수 ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isSuccessCurse(int MagicLevel, Resist_t resist) { - // MagicLevel ̾ ʿ ̴. - // ϼ MagicLevel . + // MagicLevel은 뱀파이어가 그 마법을 배우는 데 필요한 레벨이다. + // 즉 높은 레벨의 저주 마법일수록 MagicLevel이 높아진다. // - // MagicLevel 30̰, 20̶... - // curse_prob = 110̰, ִ ׻ ϰ ȴ. - // MagicLevel 30̰, 100̶... - // curse_prob = 30̰, 70% Ȯ ϰ ȴ. + // MagicLevel이 30이고, 저항이 20이라면... + // curse_prob = 110이고, 저주는 항상 성공하게 된다. + // MagicLevel이 30이고, 저항이 100이라면... + // curse_prob = 30이고, 마법은 70% 확률로 실패하게 된다. #ifdef __CHINA_SERVER__ int prob_penalty = (int)(MagicLevel - resist); int curse_prob = 65 + prob_penalty; @@ -517,46 +517,46 @@ bool HitRoll::isSuccessCurse(int MagicLevel, Resist_t resist) { #endif int randomValue = rand() % 100; - // , . ɷȴ. + // 아, 씨바. 저주 걸렸다. if (randomValue < curse_prob) return true; - // ׷¿ ؼ ɸ ʾҴ. ƽθ... + // 저항력에 의해서 걸리지 않았다. 아싸리... return false; } ////////////////////////////////////////////////////////////////////////////// -// Ʈ Լ - ̾ ָ ɶ +// 저주 마법 히트롤 함수 - 뱀파이어가 저주를 걸때 ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isSuccessVampireCurse(int MagicLevel, Resist_t resist) { - // MagicLevel ̾ ʿ 2 - // ̴. ϼ MagicLevel . + // MagicLevel은 뱀파이어가 그 마법을 배우는 데 필요한 레벨을 2로 나눈 + // 것이다. 즉 높은 레벨의 저주 마법일수록 MagicLevel이 높아진다. // - // MagicLevel 30̰, 20̶... - // curse_prob = 110̰, ִ ׻ ϰ ȴ. - // MagicLevel 30̰, 100̶... - // curse_prob = 30̰, 70% Ȯ ϰ ȴ. + // MagicLevel이 30이고, 저항이 20이라면... + // curse_prob = 110이고, 저주는 항상 성공하게 된다. + // MagicLevel이 30이고, 저항이 100이라면... + // curse_prob = 30이고, 마법은 70% 확률로 실패하게 된다. int prob_penalty = (int)((int)(MagicLevel / 1.5) - resist); int curse_prob = 75 + prob_penalty; curse_prob = max(5, curse_prob); int randomValue = rand() % 100; - // , . ɷȴ. + // 아, 씨바. 저주 걸렸다. if (randomValue < curse_prob) return true; - // ׷¿ ؼ ɸ ʾҴ. ƽθ... + // 저항력에 의해서 걸리지 않았다. 아싸리... return false; } ////////////////////////////////////////////////////////////////////////////// -// CurePoison ߱ Լ +// CurePoison 명중굴림 함수 ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isSuccessCurePoison(int Base, int SkillLevel, int Difficulty, int MagicLevel, int MinRatio) { int ratio = Base + SkillLevel - Difficulty - MagicLevel; - // ּȮ ־. by Sequoia 2003. 3. 20 + // 최소확률을 집어넣었다. by Sequoia 2003. 3. 20 ratio = max(MinRatio, ratio); if (rand() % 100 < ratio) @@ -565,12 +565,12 @@ bool HitRoll::isSuccessCurePoison(int Base, int SkillLevel, int Difficulty, int } ////////////////////////////////////////////////////////////////////////////// -// Flare ߱ Լ +// Flare 명중굴림 함수 ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isSuccessFlare(Creature* pTargetCreature, int SkillLevel) { Assert(pTargetCreature != NULL); - // üũ. by sigi. 2002.9.5 + // 무적상태 체크. by sigi. 2002.9.5 if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE)) return false; @@ -602,12 +602,12 @@ bool HitRoll::isSuccessFlare(Creature* pTargetCreature, int SkillLevel) { } ////////////////////////////////////////////////////////////////////////////// -// RemoveCurse ߱ Լ +// RemoveCurse 명중굴림 함수 ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isSuccessRemoveCurse(int Base, int SkillLevel, int Difficulty, int MagicLevel, int MinRatio /* = 0 */) { int ratio = Base + SkillLevel - Difficulty - MagicLevel; - // ּȮ ־. by Sequoia 2003. 3. 20 + // 최소확률을 집어넣었다. by Sequoia 2003. 3. 20 ratio = max(MinRatio, ratio); if (rand() % 100 < ratio) @@ -616,13 +616,13 @@ bool HitRoll::isSuccessRemoveCurse(int Base, int SkillLevel, int Difficulty, int } ////////////////////////////////////////////////////////////////////////////// -// Rebuke ߱ Լ +// Rebuke 명중굴림 함수 ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isSuccessRebuke(Slayer* pSlayer, SkillSlot* pSkillSlot, Creature* pDefender) { if (pDefender->isSlayer()) return false; - // 80 ̻ ̾ ʴ´. + // 80레벨 이상의 뱀파이어는 잠들지 않는다. if (pDefender->isVampire()) { Vampire* pVampire = dynamic_cast(pDefender); if (pVampire->getLevel() >= 80) @@ -633,7 +633,7 @@ bool HitRoll::isSuccessRebuke(Slayer* pSlayer, SkillSlot* pSkillSlot, Creature* return false; } - // (丮, ) ʴ´. + // 마스터 (바토리, 테페즈)는 잠들지 않는다. if (pDefender->isMonster()) { Monster* pMonster = dynamic_cast(pDefender); if (pMonster->isMaster() @@ -655,7 +655,7 @@ bool HitRoll::isSuccessRebuke(Slayer* pSlayer, SkillSlot* pSkillSlot, Creature* } ////////////////////////////////////////////////////////////////////////////// -// Magic Elusion ߱ Լ +// Magic Elusion 명중굴림 함수 ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isSuccessMagicElusion(Slayer* pSlayer) { Attr_t SUM = pSlayer->getTotalAttr(ATTR_CURRENT); @@ -665,7 +665,7 @@ bool HitRoll::isSuccessMagicElusion(Slayer* pSlayer) { } ////////////////////////////////////////////////////////////////////////////// -// Posion Mesh ߱ Լ +// Posion Mesh 명중굴림 함수 ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isSuccessPoisonMesh(Vampire* pVampire) { int Ratio = 30 + (pVampire->getLevel() / 5); @@ -674,7 +674,7 @@ bool HitRoll::isSuccessPoisonMesh(Vampire* pVampire) { } ////////////////////////////////////////////////////////////////////////////// -// Illusion Of Avenge ߱ Լ +// Illusion Of Avenge 명중굴림 함수 ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isSuccessIllusionOfAvenge(Slayer* pSlayer) { Attr_t SUM = pSlayer->getTotalAttr(ATTR_CURRENT); @@ -684,7 +684,7 @@ bool HitRoll::isSuccessIllusionOfAvenge(Slayer* pSlayer) { } ////////////////////////////////////////////////////////////////////////////// -// Will Of Life ߱ Լ +// Will Of Life 명중굴림 함수 ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isSuccessWillOfLife(Vampire* pVampire) { int Ratio = 50 + pVampire->getLevel() / 5; @@ -694,7 +694,7 @@ bool HitRoll::isSuccessWillOfLife(Vampire* pVampire) { ////////////////////////////////////////////////////////////////////////////// -// ũƼ Ʈ Ѵ. +// 크리티컬 히트 롤을 수행한다. ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isCriticalHit(Creature* pCreature, int CriticalBonus) { Assert(pCreature != NULL); @@ -708,7 +708,7 @@ bool HitRoll::isCriticalHit(Creature* pCreature, int CriticalBonus) { } ////////////////////////////////////////////////////////////////////////////// -// ̾ ųΰ üũϴ Լ +// 슬레이어 셀프 스킬인가를 체크하는 함수 ////////////////////////////////////////////////////////////////////////////// bool HitRoll::isSlayerSelfSkill(SkillType_t skillType) { switch (skillType) { diff --git a/src/server/gameserver/skill/HitRoll.h b/src/server/gameserver/skill/HitRoll.h index a1cb2409..61ce33f2 100644 --- a/src/server/gameserver/skill/HitRoll.h +++ b/src/server/gameserver/skill/HitRoll.h @@ -24,71 +24,71 @@ class OustersSkillSlot; ////////////////////////////////////////////////////////////////////////////// // class HitRoll -// ߱ Լ ϳ ӽ̽ Ŭ̴. +// 각종 명중굴림 함수를 하나의 네임스페이스로 묶기 위해 만들어진 클래스이다. ////////////////////////////////////////////////////////////////////////////// class HitRoll { public: - // Ϲ ߱ Լ + // 일반 공격 명중굴림 함수 static bool isSuccess(Creature* pAttacker, Creature* pDefender, int ToHitBonus = 0); // static bool isSuccess(ToHit_t ToHit, Creature* pDefender, int ToHitBonus = 0); - // ̾ ߱ Լ + // 슬레이어용 마법 명중굴림 함수 static bool isSuccessMagic(Slayer* pSlayer, SkillInfo* pSkillInfo, SkillSlot* pSkillSlot); - // ̾ ߱ Լ + // 뱀파이어용 마법 명중굴림 함수 static bool isSuccessMagic(Vampire* pVampire, SkillInfo* pSkillInfo, VampireSkillSlot* pVampireSkillSlot, int BonusPoint = 0); - // ƿ콺ͽ ߱ Լ + // 아우스터스용 마법 명중굴림 함수 static bool isSuccessMagic(Ousters* pOusters, SkillInfo* pSkillInfo, OustersSkillSlot* pOustersSkillSlot, int BonusPoint = 0); - // Ϳ ߱ Լ + // 몬스터용 마법 명중굴림 함수 static bool isSuccessMagic(Monster* pMonster, SkillInfo* pSkillInfo); - // ̾ Ϳ ߱ Լ + // 뱀파이어 및 몬스터용 흡혈 명중굴림 함수 static bool isSuccessBloodDrain(Creature* pAttacker, Creature* pDefender, int multiplier = 3); - // 迭 ߱ Լ + // 저주 계열 마법 명중굴림 함수 static bool isSuccessCurse(int MagicLevel, Resist_t resist); static bool isSuccessVampireCurse(int MagicLevel, Resist_t resist); - // CurePoison ߱ Լ + // CurePoison 명중굴림 함수 static bool isSuccessCurePoison(int Base, int SkillLevel, int Difficulty, int MagicLevel, int MinRatio = 0); - // Flare ߱ Լ + // Flare 명중굴림 함수 static bool isSuccessFlare(Creature* pTargetCreature, int SkillLevel); - // RemoveCurse ߱ Լ + // RemoveCurse 명중굴림 함수 static bool isSuccessRemoveCurse(int Base, int SkillLevel, int Difficulty, int MagicLevel, int MinRatio = 0); - // Rebuke ߱ Լ + // Rebuke 명중굴림 함수 static bool isSuccessRebuke(Slayer* pSlayer, SkillSlot* pSkillSlot, Creature* pDefender); - // Magic Elusion ߱ Լ + // Magic Elusion 명중굴림 함수 static bool isSuccessMagicElusion(Slayer* pSlayer); - // Poison Mesh ߱ Լ + // Poison Mesh 명중굴림 함수 static bool isSuccessPoisonMesh(Vampire* pVampire); - // Illusion Of Avenge ߱ Լ + // Illusion Of Avenge 명중굴림 함수 static bool isSuccessIllusionOfAvenge(Slayer* pSlayer); - // Will Of Life ߱ Լ + // Will Of Life 명중굴림 함수 static bool isSuccessWillOfLife(Vampire* pVampire); - // ũƼ Ʈ Ѵ. + // 크리티컬 히트 롤을 수행한다. static bool isCriticalHit(Creature* pCreature, int CriticalBonus = 0); - // ̾ ųΰ üũϴ Լ + // 슬레이어 셀프 스킬인가를 체크하는 함수 static bool isSlayerSelfSkill(SkillType_t skillType); static bool isOustersSelfSkill(SkillType_t skillType); - // ҷ + // 할루 성공률 static bool isSuccessHallucination(Vampire* pAttacker, Creature* pTarget); - // 齺 + // 백스탭 성공률 static bool isSuccessBackStab(Ousters* pAttacker); }; diff --git a/src/server/gameserver/skill/HolyArmor.cpp b/src/server/gameserver/skill/HolyArmor.cpp index 732f833d..955d35dd 100644 --- a/src/server/gameserver/skill/HolyArmor.cpp +++ b/src/server/gameserver/skill/HolyArmor.cpp @@ -13,7 +13,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ +// 슬레이어 셀프 ////////////////////////////////////////////////////////////////////////////// void HolyArmor::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -32,7 +32,7 @@ void HolyArmor::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEff Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 검이 아니라면 기술을 쓸 수 없다. /* Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL || pWeapon->getItemClass() != Item::ITEM_CLASS_SWORD) { @@ -68,21 +68,21 @@ void HolyArmor::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEff SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectHolyArmor* pEffect = new EffectHolyArmor(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setDefBonus(output.Damage); pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_HOLY_ARMOR); - // ̷ Ͽ ٲ ɷġ . + // 이로 인하여 바뀌는 능력치를 보낸다. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); @@ -90,7 +90,7 @@ void HolyArmor::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEff increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(output.Duration); diff --git a/src/server/gameserver/skill/HolyArrow.cpp b/src/server/gameserver/skill/HolyArrow.cpp index d8aeb1f8..1ad45c07 100644 --- a/src/server/gameserver/skill/HolyArrow.cpp +++ b/src/server/gameserver/skill/HolyArrow.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void HolyArrow::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,7 +37,7 @@ void HolyArrow::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p SIMPLE_SKILL_OUTPUT result; - // Soul Smashing ִٸ 10% + // Soul Smashing 이 있다면 데미지 10% 증가 if (pSlayer->hasRankBonus(RankBonus::RANK_BONUS_SOUL_SMASHING)) { RankBonus* pRankBonus = pSlayer->getRankBonus(RankBonus::RANK_BONUS_SOUL_SMASHING); Assert(pRankBonus != NULL); diff --git a/src/server/gameserver/skill/HolyBlast.cpp b/src/server/gameserver/skill/HolyBlast.cpp index 7ab37ff1..e0558ef9 100644 --- a/src/server/gameserver/skill/HolyBlast.cpp +++ b/src/server/gameserver/skill/HolyBlast.cpp @@ -22,7 +22,7 @@ ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void HolyBlast::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -55,7 +55,7 @@ void HolyBlast::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void HolyBlast::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -129,8 +129,8 @@ void HolyBlast::execute(Slayer* pSlayer, int X, int Y, SkillSlot* pSkillSlot, co Assert(pPlayer != NULL); Assert(pZone != NULL); - // Ư Ⱑ ־ ִ ̶... - // 迭 ⸦ ִ üũؼ ƴ϶ д. + // 만일 이 기술이 특별한 무기가 있어야 시전할 수 있는 기술이라면... + // 그 계열의 무기를 들고 있는지를 체크해서 아니라면 실패다. if (param.ItemClass != Item::ITEM_CLASS_MAX) { Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || pItem->getItemClass() != param.ItemClass) { @@ -161,18 +161,18 @@ void HolyBlast::execute(Slayer* pSlayer, int X, int Y, SkillSlot* pSkillSlot, co bool bRangeCheck = verifyDistance(pSlayer, X, Y, pSkillInfo->getRange()); if (bManaCheck && bTimeCheck && bRangeCheck) { - // ߸. + // 마나를 떨어뜨린다. decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1); - // ǥ Ѵ. + // 좌표와 방향을 구한다. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); Dir_t dir = calcDirection(myX, myY, X, Y); Damage_t Damage = 0; Damage_t MaxDamage = 0; Damage_t TotalDamage = 0; - // SkillFomula ° damage. - -; - // ׷ ӽ÷... + // SkillFomula에서 구해지는건 공격damage다. - -; + // 그래서 임시로... uint HealPoint = 30 + param.Level / 8; // param.SkillDamage; uint RealHealPoint = 0; bool bCriticalHit = false; @@ -192,20 +192,20 @@ void HolyBlast::execute(Slayer* pSlayer, int X, int Y, SkillSlot* pSkillSlot, co Creature* pTargetCreature = (*itr); Assert(pTargetCreature != NULL); - if (pTargetCreature != pSlayer) // ƴ + if (pTargetCreature != pSlayer) // 본인이 아닌 경우 { bool bSameRaceCheck = pTargetCreature->isSlayer(); bool bZoneLevelCheck = checkZoneLevelToHitTarget(pTargetCreature); - // ̸ ġѴ. + // 같은 종족이면 치료한다. if (bSameRaceCheck && bZoneLevelCheck) { - // ִ cList ߰ ʴ´. - // cList ´ ִ ־ְ - // ׵ CURE_EFFECT ش. + // 힐받은 애는 cList에 추가하지 않는다. + // cList에는 맞는 애덜만 넣어주고 + // 얘네들은 CURE_EFFECT를 보여준다. EffectBloodDrain* pEffectBloodDrain = NULL; - bool bHPCheck = false; // ũĸ üũҶ ؾ ? 2002.05.31 by bezz + bool bHPCheck = false; // 크리쳐를 체크할때 마다 새로 세팅해야하지 않을까? 2002.05.31 by bezz if (!pTargetCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); @@ -232,7 +232,7 @@ void HolyBlast::execute(Slayer* pSlayer, int X, int Y, SkillSlot* pSkillSlot, co bool bHitRoll = HitRoll::isSuccessMagic(pSlayer, pSkillInfo, pSkillSlot); if (bHitRoll && bHPCheck && pTargetCreature->isAlive()) { - // ȿ broadcast + // 힐 효과 broadcast _GCSkillToSelfOK1.setSkillType(SKILL_CURE_EFFECT); _GCSkillToSelfOK1.setDuration(0); pTargetSlayer->getPlayer()->sendPacket(&_GCSkillToSelfOK1); @@ -244,16 +244,16 @@ void HolyBlast::execute(Slayer* pSlayer, int X, int Y, SkillSlot* pSkillSlot, co pTargetSlayer); - // ¶ ¸ ش. + // 흡혈당한 상태라면 흡혈 상태를 날려준다. if (pEffectBloodDrain != NULL && pEffectBloodDrain->getLevel() < param.Level) { - // ƸƮ ϱ Ʈ ٿش. + // 흡혈 아르바이트를 방지하기 위한 후유증 이펙트를 붙여준다. if (pTargetSlayer->isFlag(Effect::EFFECT_CLASS_AFTERMATH)) { Effect* pEffect = pTargetSlayer->findEffect(Effect::EFFECT_CLASS_AFTERMATH); EffectAftermath* pEffectAftermath = dynamic_cast(pEffect); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. } else { EffectAftermath* pEffectAftermath = new EffectAftermath(pTargetSlayer); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. pTargetSlayer->addEffect(pEffectAftermath); pTargetSlayer->setFlag(Effect::EFFECT_CLASS_AFTERMATH); pEffectAftermath->create(pTargetSlayer->getName()); @@ -281,11 +281,11 @@ void HolyBlast::execute(Slayer* pSlayer, int X, int Y, SkillSlot* pSkillSlot, co &gcRemoveEffect); } - // HP Ѵ. + // HP를 세팅한다. HP_t CurrentHP = pTargetSlayer->getHP(ATTR_CURRENT); HP_t MaxHP = pTargetSlayer->getHP(ATTR_MAX); - // ȸ ġ Ѵ. + // 실제 회복 수치를 계산한다. if (CurrentHP + HealPoint <= MaxHP) { RealHealPoint = max(0, (int)HealPoint); } else { @@ -299,7 +299,7 @@ void HolyBlast::execute(Slayer* pSlayer, int X, int Y, SkillSlot* pSkillSlot, co } } - // ٸ ̸ Ѵ. + // 다른 종족이면 공격한다. else { bool bPK = verifyPK(pSlayer, pTargetCreature); bool bRaceCheck = pTargetCreature->isVampire() || pTargetCreature->isMonster(); @@ -322,10 +322,10 @@ void HolyBlast::execute(Slayer* pSlayer, int X, int Y, SkillSlot* pSkillSlot, co MaxDamage = max(Damage, MaxDamage); TotalDamage += Damage; - // Ƽ ⺻ 100̴. + // 페널티는 기본적으로 100이다. Damage = getPercentValue(Damage, 100); // penalty); - // ֵ + // 맞은 애들 지정 ObjectID_t targetObjectID = pTargetCreature->getObjectID(); cList.push_back(pTargetCreature); @@ -333,7 +333,7 @@ void HolyBlast::execute(Slayer* pSlayer, int X, int Y, SkillSlot* pSkillSlot, co _GCSkillToTileOK2.addCListElement(targetObjectID); _GCSkillToTileOK5.addCListElement(targetObjectID); - // ϴ ´ Ŷ · ä, ش. + // 일단 맞는 놈이 받을 패킷은 널 상태로 한 채로, 데미지를 준다. setDamage(pTargetCreature, Damage, pSlayer, param.SkillType, NULL, &_GCSkillToTileOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, NULL, &_GCSkillToTileOK1); @@ -362,7 +362,7 @@ void HolyBlast::execute(Slayer* pSlayer, int X, int Y, SkillSlot* pSkillSlot, co } } - // ߸. + // 공격자의 아이템 내구성을 떨어뜨린다. decreaseDurability(pSlayer, NULL, pSkillInfo, &_GCSkillToTileOK1, NULL); _GCSkillToTileOK1.setSkillType(param.SkillType); @@ -388,7 +388,7 @@ void HolyBlast::execute(Slayer* pSlayer, int X, int Y, SkillSlot* pSkillSlot, co pPlayer->sendPacket(&_GCSkillToTileOK1); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; Assert(pTargetCreature != NULL); @@ -396,7 +396,7 @@ void HolyBlast::execute(Slayer* pSlayer, int X, int Y, SkillSlot* pSkillSlot, co if (pTargetCreature->isPC()) { _GCSkillToTileOK2.clearList(); - // HP Ŷ Ѵ. + // HP의 변경사항을 패킷에다 기록한다. HP_t targetHP = 0; if (pTargetCreature->isSlayer()) { targetHP = (dynamic_cast(pTargetCreature))->getHP(ATTR_CURRENT); @@ -408,13 +408,13 @@ void HolyBlast::execute(Slayer* pSlayer, int X, int Y, SkillSlot* pSkillSlot, co _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // ߸. + // 아이템의 내구력을 떨어뜨린다. decreaseDurability(NULL, pTargetCreature, pSkillInfo, NULL, &_GCSkillToTileOK2); - // Ŷ ش. + // 패킷을 보내준다. pTargetCreature->getPlayer()->sendPacket(&_GCSkillToTileOK2); } else if (pTargetCreature->isMonster()) { - // νѴ. + // 당근 적으로 인식한다. Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pSlayer); } diff --git a/src/server/gameserver/skill/Howl.cpp b/src/server/gameserver/skill/Howl.cpp index dd21f4f2..3c691920 100644 --- a/src/server/gameserver/skill/Howl.cpp +++ b/src/server/gameserver/skill/Howl.cpp @@ -24,8 +24,8 @@ void Howl::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, CEffe Assert(pVampire != NULL); - // Ŷ ڵ鷯 ϴ ڵ鷯̱ - // ų ڵ鷯 ̴. + // 패킷 핸들러에서 직접 수행하는 기술 핸들러이기 때문에 + // 스킬 핸들러가 널이다. // Assert(pSkillSlot != NULL); try { diff --git a/src/server/gameserver/skill/HurricaneCombo.cpp b/src/server/gameserver/skill/HurricaneCombo.cpp index a292beeb..7780ac11 100644 --- a/src/server/gameserver/skill/HurricaneCombo.cpp +++ b/src/server/gameserver/skill/HurricaneCombo.cpp @@ -9,7 +9,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void HurricaneCombo::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/HydroConvergence.cpp b/src/server/gameserver/skill/HydroConvergence.cpp index b4e0d2e8..3a815f55 100644 --- a/src/server/gameserver/skill/HydroConvergence.cpp +++ b/src/server/gameserver/skill/HydroConvergence.cpp @@ -16,7 +16,7 @@ #include "GCSkillToObjectOK6.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void HydroConvergence::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -36,8 +36,8 @@ void HydroConvergence::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ous Creature* pTargetCreature = pZone->getCreature(TargetObjectID); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pOusters, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType(), Grade); return; @@ -68,7 +68,7 @@ void HydroConvergence::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ous SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(getSkillType()); int RequiredMP = (int)pSkillInfo->getConsumeMP() + pOustersSkillSlot->getExpLevel() / 3; - // MP + // 헌뇜杰唐MP // RequiredMP = pOusters->getMP(); bool bManaCheck = hasEnoughMana(pOusters, RequiredMP); diff --git a/src/server/gameserver/skill/Hymn.cpp b/src/server/gameserver/skill/Hymn.cpp index 59b69bd4..d2fdba60 100644 --- a/src/server/gameserver/skill/Hymn.cpp +++ b/src/server/gameserver/skill/Hymn.cpp @@ -18,7 +18,7 @@ #include "GCSkillToObjectOK6.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Hymn::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -39,8 +39,8 @@ void Hymn::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkill Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -82,7 +82,7 @@ void Hymn::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkill SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ δ. + // 이펙트 오브젝트를 생성해 붙인다. EffectHymn* pEffect = new EffectHymn(pTargetCreature); pEffect->setDeadline(output.Duration); pEffect->setLevel(pSkillInfo->getLevel() / 2); @@ -91,7 +91,7 @@ void Hymn::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkill pTargetCreature->addEffect(pEffect); pTargetCreature->setFlag(Effect::EFFECT_CLASS_HYMN); - // ɷġ ؼ ش. + // 능력치를 계산해서 보내준다. if (pTargetCreature->isVampire()) { Vampire* pTargetVampire = dynamic_cast(pTargetCreature); VAMPIRE_RECORD prev; @@ -163,10 +163,10 @@ void Hymn::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkill _GCSkillToObjectOK6.setSkillType(SkillType); _GCSkillToObjectOK6.setDuration(output.Duration); - if (bCanSeeCaster) // 10 ġ. + if (bCanSeeCaster) // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pSlayer, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); - } else // 10 ġ. + } else // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pSlayer, &_GCSkillToObjectOK6, &_GCSkillToObjectOK1); } diff --git a/src/server/gameserver/skill/IceAuger.cpp b/src/server/gameserver/skill/IceAuger.cpp index f6635ee9..215fcebf 100644 --- a/src/server/gameserver/skill/IceAuger.cpp +++ b/src/server/gameserver/skill/IceAuger.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void IceAuger::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/IceField.cpp b/src/server/gameserver/skill/IceField.cpp index c238ad58..49a95def 100644 --- a/src/server/gameserver/skill/IceField.cpp +++ b/src/server/gameserver/skill/IceField.cpp @@ -47,7 +47,7 @@ IceField::IceField() throw() { }; ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void IceField::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -67,7 +67,7 @@ void IceField::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkil Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pOusters, pTargetCreature)) { executeSkillFailException(pOusters, getSkillType()); return; @@ -84,7 +84,7 @@ void IceField::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkil } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void IceField::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -124,7 +124,7 @@ void IceField::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersS ZoneCoord_t myX = pOusters->getX(); ZoneCoord_t myY = pOusters->getY(); - // Ʈ ӽð Ѵ. + // 이펙트의 지속시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); @@ -168,16 +168,16 @@ void IceField::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersS if (tile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION)) continue; - // ŸϿ Ʈ ߰ ִٸ... + // 현재 타일에다 이펙트를 추가할 수 있다면... if (tile.canAddEffect()) { - // effect . + // 같은 effect가 있으면 지운다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_ICE_FIELD); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); // fix me } - // Ʈ Ŭ Ѵ. + // 이펙트 클래스를 생성한다. EffectIceField* pEffect = new EffectIceField(pZone, tileX, tileY); pEffect->setCasterName(pOusters->getName()); pEffect->setCasterID(pOusters->getObjectID()); @@ -186,7 +186,7 @@ void IceField::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersS pEffect->setNextTime(0); pEffect->setTick(output.Tick); - // Tile ̴ Effect ObjectID Ϲ޾ƾ Ѵ. + // Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); pZone->addEffect(pEffect); @@ -268,8 +268,8 @@ void IceField::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersS list watcherList = pZone->getWatcherList(myX, myY, pOusters); - // watcherList cList ʰ, caster(pOusters) - // OK4 .. cList ߰Ѵ. + // watcherList에서 cList에 속하지 않고, caster(pOusters)를 볼 수 없는 경우는 + // OK4를 보내고.. cList에 추가한다. for (list::const_iterator itr = watcherList.begin(); itr != watcherList.end(); itr++) { bool bBelong = false; for (list::const_iterator tItr = cList.begin(); tItr != cList.end(); tItr++) @@ -278,9 +278,9 @@ void IceField::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersS Creature* pWatcher = (*itr); if (bBelong == false && canSee(pWatcher, pOusters) == false) { - // Assert(pWatcher->isPC()); // 翬 PC.. Zone::getWatcherList PC returnѴ + // Assert(pWatcher->isPC()); // 당연 PC다.. Zone::getWatcherList는 PC만 return한다 if (!pWatcher->isPC()) { - // cout << "IceField : ó Ʈ PC ƴմϴ." << endl; + // cout << "IceField : 왓처 리스트가 PC가 아닙니다." << endl; // GCSkillFailed1 _GCSkillFailed1; // _GCSkillFailed1.setSkillType(getSkillType()); // pOusters->getPlayer()->sendPacket(&_GCSkillFailed1); diff --git a/src/server/gameserver/skill/IceField.h b/src/server/gameserver/skill/IceField.h index 2e88a19c..fe001d4f 100644 --- a/src/server/gameserver/skill/IceField.h +++ b/src/server/gameserver/skill/IceField.h @@ -33,7 +33,7 @@ class IceField : public SkillHandler { void computeOutput(const SkillInput& input, SkillOutput& output); private: - POINT m_IceFieldMask[4][9]; // 4ܰ, 9 + POINT m_IceFieldMask[4][9]; // 4단계, 9개씩 int m_MaskNum[4]; }; diff --git a/src/server/gameserver/skill/IceHail.cpp b/src/server/gameserver/skill/IceHail.cpp index afd966db..055c5352 100644 --- a/src/server/gameserver/skill/IceHail.cpp +++ b/src/server/gameserver/skill/IceHail.cpp @@ -18,7 +18,7 @@ #include "ZoneUtil.h" ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void IceHail::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -47,7 +47,7 @@ void IceHail::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) Tile& tile = pZone->getTile(X, Y); if (tile.canAddEffect()) bTileCheck = true; - // ӽ ׶ ߰ Ѵ. + // 머시 그라운드 있음 추가 못한당. // if ( tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL ) bTileCheck=false; } @@ -57,12 +57,12 @@ void IceHail::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) ZoneCoord_t myY = pMonster->getY(); if (bHitRoll && bTileCheck) { - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectIceHail* pEffect = new EffectIceHail(pZone, X, Y); pEffect->setDeadline(output.Duration); pEffect->setDamage(output.Damage); @@ -71,11 +71,11 @@ void IceHail::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pEffect->setRange(2); pEffect->setCasterID(pMonster->getObjectID()); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); pZone->getTile(X, Y).addEffect(pEffect); diff --git a/src/server/gameserver/skill/IceHorizon.cpp b/src/server/gameserver/skill/IceHorizon.cpp index 8e79bc1d..b497a8df 100644 --- a/src/server/gameserver/skill/IceHorizon.cpp +++ b/src/server/gameserver/skill/IceHorizon.cpp @@ -23,7 +23,7 @@ IceHorizon::IceHorizon() throw() { }; ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void IceHorizon::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -43,7 +43,7 @@ void IceHorizon::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pOusters, pTargetCreature)) { executeSkillFailException(pOusters, getSkillType()); return; @@ -60,7 +60,7 @@ void IceHorizon::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSk } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void IceHorizon::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -100,7 +100,7 @@ void IceHorizon::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster ZoneCoord_t myX = pOusters->getX(); ZoneCoord_t myY = pOusters->getY(); - // Ʈ ӽð Ѵ. + // 이펙트의 지속시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); @@ -133,16 +133,16 @@ void IceHorizon::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster if (tile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION)) continue; - // ŸϿ Ʈ ߰ ִٸ... + // 현재 타일에다 이펙트를 추가할 수 있다면... if (tile.canAddEffect()) { - // effect . + // 같은 effect가 있으면 지운다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_ICE_HORIZON); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); // fix me } - // Ʈ Ŭ Ѵ. + // 이펙트 클래스를 생성한다. EffectIceHorizon* pEffect = new EffectIceHorizon(pZone, tileX, tileY); pEffect->setCasterName(pOusters->getName()); pEffect->setCasterID(pOusters->getObjectID()); @@ -154,7 +154,7 @@ void IceHorizon::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster if (i != 0 || j != 0) pEffect->setBroadcastingEffect(false); - // Tile ̴ Effect ObjectID Ϲ޾ƾ Ѵ. + // Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); pZone->addEffect(pEffect); @@ -231,8 +231,8 @@ void IceHorizon::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster list watcherList = pZone->getWatcherList(myX, myY, pOusters); - // watcherList cList ʰ, caster(pOusters) - // OK4 .. cList ߰Ѵ. + // watcherList에서 cList에 속하지 않고, caster(pOusters)를 볼 수 없는 경우는 + // OK4를 보내고.. cList에 추가한다. for (list::const_iterator itr = watcherList.begin(); itr != watcherList.end(); itr++) { bool bBelong = false; for (list::const_iterator tItr = cList.begin(); tItr != cList.end(); tItr++) @@ -241,9 +241,9 @@ void IceHorizon::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster Creature* pWatcher = (*itr); if (bBelong == false && canSee(pWatcher, pOusters) == false) { - // Assert(pWatcher->isPC()); // 翬 PC.. Zone::getWatcherList PC returnѴ + // Assert(pWatcher->isPC()); // 당연 PC다.. Zone::getWatcherList는 PC만 return한다 if (!pWatcher->isPC()) { - // cout << "IceHorizon : ó Ʈ PC ƴմϴ." << endl; + // cout << "IceHorizon : 왓처 리스트가 PC가 아닙니다." << endl; // GCSkillFailed1 _GCSkillFailed1; // _GCSkillFailed1.setSkillType(getSkillType()); // pOusters->getPlayer()->sendPacket(&_GCSkillFailed1); diff --git a/src/server/gameserver/skill/IceLance.cpp b/src/server/gameserver/skill/IceLance.cpp index a5fd4962..92f808c6 100644 --- a/src/server/gameserver/skill/IceLance.cpp +++ b/src/server/gameserver/skill/IceLance.cpp @@ -10,7 +10,7 @@ #include "SimpleTileMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void IceLance::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -28,7 +28,7 @@ void IceLance::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkil Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pOusters, getSkillType()); diff --git a/src/server/gameserver/skill/IceWave.cpp b/src/server/gameserver/skill/IceWave.cpp index 68e8b4f3..24d85ac9 100644 --- a/src/server/gameserver/skill/IceWave.cpp +++ b/src/server/gameserver/skill/IceWave.cpp @@ -13,8 +13,8 @@ ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// IceWave::IceWave() throw() { __BEGIN_TRY @@ -46,7 +46,7 @@ IceWave::IceWave() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void IceWave::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -90,7 +90,7 @@ void IceWave::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) if (bRangeCheck && bMoveModeCheck) { //-------------------------------------------------------- - // knockbackǴ¸´ ֵ üũش. + // 주위에 knockback되는맞는 애들을 체크해준다. //-------------------------------------------------------- SkillInput input(pMonster); SkillOutput output; @@ -130,7 +130,7 @@ void IceWave::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) param.addMask(m_pIceWaveMask[i].x, m_pIceWaveMask[i].y, 100); } - // ´ ֵ knockback Ų. + // 강제로 맞는 애들을 knockback 시킨다. bool bForceKnockback = false; g_SimpleTileMeleeSkill.execute(pMonster, x, y, param, result, 0, bForceKnockback); } else { diff --git a/src/server/gameserver/skill/Illendue.cpp b/src/server/gameserver/skill/Illendue.cpp index 8f622acd..838561e0 100644 --- a/src/server/gameserver/skill/Illendue.cpp +++ b/src/server/gameserver/skill/Illendue.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Illendue::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,7 +37,7 @@ void Illendue::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS SIMPLE_SKILL_OUTPUT result; - // Holy Smashing ִٸ + // Holy Smashing 이 있다면 데미지 증가 if (pSlayer->hasRankBonus(RankBonus::RANK_BONUS_SOUL_SMASHING)) { RankBonus* pRankBonus = pSlayer->getRankBonus(RankBonus::RANK_BONUS_SOUL_SMASHING); Assert(pRankBonus != NULL); diff --git a/src/server/gameserver/skill/IllusionInversion.cpp b/src/server/gameserver/skill/IllusionInversion.cpp index 49e49131..892f6789 100644 --- a/src/server/gameserver/skill/IllusionInversion.cpp +++ b/src/server/gameserver/skill/IllusionInversion.cpp @@ -17,7 +17,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// ½½·¹ÀÌ¾î ¿ÀºêÁ§Æ® Çڵ鷯 ////////////////////////////////////////////////////////////////////////////// void IllusionInversion::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -45,7 +45,7 @@ void IllusionInversion::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Skil SIMPLE_SKILL_OUTPUT result; - // Holy Smashing ִٸ + // Holy Smashing ÀÌ ÀÖ´Ù¸é µ¥¹ÌÁö Áõ°¡ if (pSlayer->hasRankBonus(RankBonus::RANK_BONUS_SOUL_SMASHING)) { RankBonus* pRankBonus = pSlayer->getRankBonus(RankBonus::RANK_BONUS_SOUL_SMASHING); Assert(pRankBonus != NULL); @@ -85,15 +85,15 @@ void IllusionInversion::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Skil Damage_t Damage = 0; if (param.bAdd) { - // Ķͷ ޵ , - // Ϲ , ؾ Ѵ. - // Ķͷ ޵ ̴ , - // κб Ƿ, κб 0 ޵ȴ. + // ÆÄ¶ó¹ÌÅÍ·Î Àü´ÞµÈ µ¥¹ÌÁö °ªÀÌ ´õÇØÁö´Â µ¥¹ÌÁö¶ó¸é, + // ÀÏ¹Ý µ¥¹ÌÁö¸¦ °è»ê ÈÄ, µ¥¹ÌÁö¸¦ ´õÇØ¾ß ÇÑ´Ù. + // ÆÄ¶ó¹ÌÅÍ·Î Àü´ÞµÈ µ¥¹ÌÁö °ªÀÌ Á÷Á¢ÀûÀ¸·Î ¾²ÀÌ´Â µ¥¹ÌÁö¶ó¸é, + // ÀÌ ºÎºÐ±îÁö µé¾î¿ÀÁö ¾ÊÀ¸¹Ç·Î, ¹ØÀÇ ºÎºÐ±îÁö 0À¸·Î Àü´ÞµÈ´Ù. Damage += computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); } if (param.bMagicDamage) { - // ų , Լ ̿ ش. + // ¸¸ÀÏ ½ºÅ³ µ¥¹ÌÁö°¡ ¸¶¹ý µ¥¹ÌÁö¶ó¸é, ¸¶¹ý µ¥¹ÌÁö °è»ê ÇÔ¼ö¸¦ ÀÌ¿ëÇØ °è»êÀ» ÇØÁØ´Ù. Damage += computeMagicDamage(pTargetCreature, param.SkillDamage, param.SkillType); } else { Damage += param.SkillDamage; @@ -113,9 +113,9 @@ void IllusionInversion::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Skil bool bUseSkill = false; /* - // ȡǰʹüܽɫʹõ + // È¡³öµ±Ç°Ê¹Óü¼ÄܽÇÉ«ËùʹÓõÄÎäÆ÷ Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); - //ûʹü + //ûÓÐÎäÆ÷²»ÄÜʹÓü¼ÄÜ if (pWeapon != NULL) { Silver_t silverDamage= pWeapon->getSilver(); @@ -139,12 +139,12 @@ void IllusionInversion::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Skil if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bPK && bUseSkill) { decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); - // ϰ, ߸. + // µ¥¹ÌÁö¸¦ °¡Çϰí, ³»±¸µµ¸¦ ¶³¾î¶ß¸°´Ù. setDamage(pTargetCreature, Damage, pSlayer, param.SkillType, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); decreaseDurability(pSlayer, pTargetCreature, NULL, &_GCSkillToObjectOK1, &_GCSkillToObjectOK2); - // Ÿ ̾ ƴ 쿡 ġ ÷ش. + // Ÿ°ÙÀÌ ½½·¹À̾ ¾Æ´Ñ °æ¿ì¿¡¸¸ °æÇèÄ¡¸¦ ¿Ã·ÁÁØ´Ù. if (!pTargetCreature->isSlayer()) { shareAttrExp(pSlayer, Damage, param.STRMultiplier, param.DEXMultiplier, param.INTMultiplier, _GCSkillToObjectOK1); @@ -153,7 +153,7 @@ void IllusionInversion::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Skil increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToObjectOK1); increaseAlignment(pSlayer, pTargetCreature, _GCSkillToObjectOK1); } - // ȡĿHP + // ÎüȡĿ±êHP HP_t HealPoint = Damage; HP_t CurrentHP = pSlayer->getHP(); HP_t MaxHP = pSlayer->getHP(ATTR_MAX); @@ -218,14 +218,14 @@ void IllusionInversion::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Skil } /* g_SimpleMissileSkill.execute(pSlayer, TargetObjectID, pSkillSlot, param, result); - // ȡ˺ֵ + // È¡³öÉ˺¦Öµ Zone* pZone = pSlayer->getZone(); Player* pPlayer = pSlayer->getPlayer(); Assert(pPlayer != NULL); Assert(pZone != NULL); Creature* pTargetCreature = pZone->getCreature(TargetObjectID); - if (pTargetCreature==NULL // NoSuch . by sigi. 2002.5.2 + if (pTargetCreature==NULL // NoSuch Á¦°Å. by sigi. 2002.5.2 || pTargetCreature->isNPC() || !canAttack( pSlayer, pTargetCreature ) || pTargetCreature->isDead() @@ -237,7 +237,7 @@ void IllusionInversion::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Skil int targetLevel = 0; int targetMaxHP = 0; Exp_t Exp = output.Damage; - cout << "ʹü:ֲþ,˺:"<< (int)output.Damage << endl; + cout << "ʹÓü¼ÄÜ:¿Ö²À»Ã¾õ,Ôì³ÉÉ˺¦:"<< (int)output.Damage << endl; // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayer)" << endl; */ __END_CATCH diff --git a/src/server/gameserver/skill/IllusionOfAvenge.cpp b/src/server/gameserver/skill/IllusionOfAvenge.cpp index 48c1a0bb..904d9046 100644 --- a/src/server/gameserver/skill/IllusionOfAvenge.cpp +++ b/src/server/gameserver/skill/IllusionOfAvenge.cpp @@ -15,7 +15,7 @@ #include "SkillUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void IllusionOfAvenge::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -77,7 +77,7 @@ void IllusionOfAvenge::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID Tile& tile = pZone->getTile(tileX, tileY); - // ŸϿ ִ ũó Ʈ . + // 타일에 있는 크리처들을 리스트로 만든다. list targetList; if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) { Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_WALKING); @@ -105,15 +105,15 @@ void IllusionOfAvenge::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID Vampire* pVampire = dynamic_cast(pTargetCreature); - // Ų. + // 데미지를 적용시킨다. GCModifyInformation gcMI; ::setDamage(pVampire, output.Damage, pSlayer, pSkillSlot->getSkillType(), &gcMI); - // HP ߴٰ ڿ . + // HP 가 변했다고 당사자에게 보낸다. pTargetPlayer->sendPacket(&gcMI); GCSkillToObjectOK2 gcSkillToObjectOK2; - gcSkillToObjectOK2.setObjectID(1); // ǹ . + gcSkillToObjectOK2.setObjectID(1); // 의미 없다. gcSkillToObjectOK2.setSkillType(SKILL_ATTACK_MELEE); gcSkillToObjectOK2.setDuration(14); } else if (pTargetCreature->isMonster()) { @@ -130,7 +130,7 @@ void IllusionOfAvenge::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID pZone->broadcastPacket(pTargetCreature->getX(), pTargetCreature->getY(), &gcSkillToObjectOK4); - // ø. + // 성향을 올린다. increaseAlignment(pSlayer, pTargetCreature, _GCSkillToSelfOK1); } } @@ -144,7 +144,7 @@ void IllusionOfAvenge::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); }*/ - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(14); @@ -153,14 +153,14 @@ void IllusionOfAvenge::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID _GCSkillToSelfOK2.setSkillType(SkillType); _GCSkillToSelfOK2.setDuration(14); - // packet + // 기술을 사용한 사람에게 packet 전달 pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(X, Y, &_GCSkillToSelfOK2, pSlayer); } else { executeSkillFailNormal(pSlayer, getSkillType(), NULL); } - // delay setting + // 기술 delay setting if (bTimeCheck) pSkillSlot->setRunTime(output.Delay); } catch (Throwable& t) { diff --git a/src/server/gameserver/skill/InfinityThunderbolt.cpp b/src/server/gameserver/skill/InfinityThunderbolt.cpp index f353abbe..5efb8be3 100644 --- a/src/server/gameserver/skill/InfinityThunderbolt.cpp +++ b/src/server/gameserver/skill/InfinityThunderbolt.cpp @@ -24,7 +24,7 @@ void InfinityThunderbolt::execute(Slayer* pSlayer, ObjectID_t targetObjectID, Sk Creature* pTargetCreature = pZone->getCreature(targetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -70,7 +70,7 @@ void InfinityThunderbolt::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SIMPLE_SKILL_OUTPUT result; - // ǥġ+4 + // 목표위치+4방향 /* param.addMask( 0 + dir_advance[dir][0], 0 + dir_advance[dir][1], 100); param.addMask(-1 + dir_advance[dir][0], -1 + dir_advance[dir][1], 100); param.addMask( 0 + dir_advance[dir][0], -1 + dir_advance[dir][1], 100); diff --git a/src/server/gameserver/skill/InstallMine.cpp b/src/server/gameserver/skill/InstallMine.cpp index 05a00fdf..3020e887 100644 --- a/src/server/gameserver/skill/InstallMine.cpp +++ b/src/server/gameserver/skill/InstallMine.cpp @@ -45,7 +45,7 @@ void InstallMine::execute(Slayer* pSlayer, ObjectID_t, CoordInven_t X, CoordInve SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); SkillLevel_t SkillLevel = pSkillSlot->getExpLevel(); - // ߷. + // 명중률. // ToHit_t ToHit = pSlayer->getToHit(); int RequiredMP = (int)pSkillInfo->getConsumeMP(); @@ -61,7 +61,7 @@ void InstallMine::execute(Slayer* pSlayer, ObjectID_t, CoordInven_t X, CoordInve Assert(pInventory != NULL); if (bManaCheck && bTimeCheck && bRangeCheck) { - // mine ã´. + // mine을 찾는다. Item* pItem = pInventory->getItem(X, Y); if (pItem != NULL && pItem->getItemClass() == Item::ITEM_CLASS_MINE) { bInstallAction = true; @@ -70,7 +70,7 @@ void InstallMine::execute(Slayer* pSlayer, ObjectID_t, CoordInven_t X, CoordInve } - // и . + // 기술의 성패를 따진다. if (bInstallAction) { // Range_t Range = 1; @@ -96,8 +96,8 @@ void InstallMine::execute(Slayer* pSlayer, ObjectID_t, CoordInven_t X, CoordInve pInstallMine->setInstallerPartyID(pSlayer->getPartyID()); pInstallMine->setFlag(Effect::EFFECT_CLASS_INSTALL); - // ° 3ΰ ڵ µ.. - // 10 . by sigi. 2002.11.3 + // 아이템 사라지는게 3분인거 때문에 지뢰도 사라졌는데.. + // 10분으로 고정. by sigi. 2002.11.3 TPOINT pt = pZone->addItem(pInstallMine, slayerX, slayerY, true, 6000); // EXP up @@ -129,7 +129,7 @@ void InstallMine::execute(Slayer* pSlayer, ObjectID_t, CoordInven_t X, CoordInve pPlayer->sendPacket(&_GCSkillToInventoryOK1); - // mine ڵ鿡Դ + // mine을 볼 수 없게 된 자들에게는 삭제 addInstalledMine(pZone, pInstallMine, pt.x, pt.y); // pZone->broadcastPacket( slayerX, slayerY, &_GCSkillToInventoryOK5, pSlayer); @@ -173,7 +173,7 @@ void InstallMine::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl SkillInfo * pSkillInfo = g_pSkillInfoManager->getSkillInfo( SkillType ); SkillLevel_t SkillLevel = pSkillSlot->getExpLevel(); - // ߷. + // 명중률. ToHit_t ToHit = pSlayer->getToHit(); int RemainMP = (int)pSlayer->getMP( ATTR_CURRENT) - (int)pSkillInfo->getConsumeMP(); @@ -186,7 +186,7 @@ void InstallMine::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl } - // Installed mine ã´. + // Installed mine을 찾는다. Mine* pMine = NULL; bool bInstallAction = false; // install or disarm Item* pItem = pZone->getTile( X, Y).getItem(); @@ -194,9 +194,9 @@ void InstallMine::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl { if( pItem->isFlag( Effect::EFFECT_CLASS_INSTALL)) { - if( pSlayer->isFlag( Effect::EFFECT_CLASS_DETECT_MINE)) // ִ» Ȯ. + if( pSlayer->isFlag( Effect::EFFECT_CLASS_DETECT_MINE)) // 현재 볼 수 있는상태인지 확인. { - bInstallAction = false;// disarm̴ + bInstallAction = false;// disarm이닷 pMine = dynamic_cast(pItem); } } @@ -209,7 +209,7 @@ void InstallMine::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl ZoneCoord_t slayerX = pSlayer->getX(), slayerY = pSlayer->getY(); - // и . + // 기술의 성패를 따진다. if ( pMine && bModifyMP && (ToHit + SkillLevel) > Random(0, 100) ) { Range_t Range = 1; @@ -221,13 +221,13 @@ void InstallMine::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl { pMine->setDir( calcDirection( slayerX, slayerY, X, Y)); pMine->setFlag( Effect::EFFECT_CLASS_INSTALL); - // mine ڵ鿡Դ + // mine을 볼 수 없게 된 자들에게는 삭제 addInstalledMine( pZone, pMine, X, Y); } else { - // Ѵ. + // 삭제한다. pZone->deleteItem( pMine, X, Y ); GCDeleteObject gcDeleteObject; gcDeleteObject.setObjectID( pMine->getObjectID() ); diff --git a/src/server/gameserver/skill/InstallMine.h b/src/server/gameserver/skill/InstallMine.h index 3f104457..58f25bed 100644 --- a/src/server/gameserver/skill/InstallMine.h +++ b/src/server/gameserver/skill/InstallMine.h @@ -26,7 +26,7 @@ class InstallMine : public SkillHandler { return SKILL_INSTALL_MINE; } - // κ丮 ̴. + // 인벤토리용 기술이다. void execute(Slayer* pSlayer, ObjectID_t, CoordInven_t X, CoordInven_t Y, CoordInven_t TargetX, CoordInven_t TargetY, SkillSlot* pSkillSlot); diff --git a/src/server/gameserver/skill/InstallTrap.cpp b/src/server/gameserver/skill/InstallTrap.cpp index ce5e61e8..f5d6ce72 100644 --- a/src/server/gameserver/skill/InstallTrap.cpp +++ b/src/server/gameserver/skill/InstallTrap.cpp @@ -16,7 +16,7 @@ #include "Zone.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ +// 슬레이어 셀프 ////////////////////////////////////////////////////////////////////////////// void InstallTrap::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -35,7 +35,7 @@ void InstallTrap::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 검이 아니라면 기술을 쓸 수 없다. Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL || !isArmsWeapon(pWeapon)) { executeSkillFailException(pSlayer, getSkillType()); @@ -71,7 +71,7 @@ void InstallTrap::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectTrapInstalled* pEffect = new EffectTrapInstalled(pZone, X, Y); pEffect->setDeadline(output.Duration); pEffect->setUserOID(pSlayer->getObjectID()); @@ -81,7 +81,7 @@ void InstallTrap::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE pZone->addEffect(pEffect); rTile.addEffect(pEffect); - // ġ ø. + // 경험치를 올린다. /* SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10*(Grade+1); if ( bIncreaseDomainExp ) @@ -91,7 +91,7 @@ void InstallTrap::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); }*/ - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(output.Duration); diff --git a/src/server/gameserver/skill/InstallTurret.cpp b/src/server/gameserver/skill/InstallTurret.cpp index 12912700..cb19c31d 100644 --- a/src/server/gameserver/skill/InstallTurret.cpp +++ b/src/server/gameserver/skill/InstallTurret.cpp @@ -16,7 +16,7 @@ #include "Zone.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ +// 슬레이어 셀프 ////////////////////////////////////////////////////////////////////////////// void InstallTurret::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -93,7 +93,7 @@ void InstallTurret::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t pSlayer->sendRealWearingInfo(); pSlayer->addModifyInfo(prev, _GCSkillToSelfOK1); - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(output.Duration); diff --git a/src/server/gameserver/skill/IntimateGrail.cpp b/src/server/gameserver/skill/IntimateGrail.cpp index 1b7e7751..9e0fe099 100644 --- a/src/server/gameserver/skill/IntimateGrail.cpp +++ b/src/server/gameserver/skill/IntimateGrail.cpp @@ -19,7 +19,7 @@ #include "PacketUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void IntimateGrail::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -40,7 +40,7 @@ void IntimateGrail::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - if (pTargetCreature == NULL) // NoSuch . by sigi. 2002.5.2 + if (pTargetCreature == NULL) // NoSuch 제거. by sigi. 2002.5.2 { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayerobject)" << endl; @@ -67,7 +67,7 @@ void IntimateGrail::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); - // ȿġ ӽð Ѵ. + // 기술의 효과치 및 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); if (pTargetCreature->getCreatureClass() == Creature::CREATURE_CLASS_SLAYER) input.TargetType = SkillInput::TARGET_SELF; @@ -76,14 +76,14 @@ void IntimateGrail::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo SkillOutput output; computeOutput(input, output); - // Ʈ δ. + // 이펙트를 만들어 붙인다. EffectIntimateGrail* pEffect = new EffectIntimateGrail(pTargetCreature); pEffect->setSkillLevel(input.SkillLevel); pEffect->setDeadline(output.Duration); pTargetCreature->setFlag(Effect::EFFECT_CLASS_INTIMATE_GRAIL); pTargetCreature->addEffect(pEffect); - // Ʈ ٿ, ɷġ Ѵ. + // 이펙트를 붙였으니, 능력치를 재계산한다. /* SLAYER_RECORD prev; pTargetSlayer->getSlayerRecord(prev); pTargetSlayer->initAllStat(); @@ -95,7 +95,7 @@ void IntimateGrail::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo pTargetPC->initAllStatAndSend(); } - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToObjectOK1); @@ -174,7 +174,7 @@ void IntimateGrail::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void IntimateGrail::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -217,21 +217,21 @@ void IntimateGrail::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t SkillOutput output; computeOutput(input, output); - // Ʈ δ. + // 이펙트를 만들어 붙인다. EffectIntimateGrail* pEffect = new EffectIntimateGrail(pSlayer); pEffect->setSkillLevel(input.SkillLevel); pEffect->setDeadline(output.Duration); pSlayer->setFlag(Effect::EFFECT_CLASS_INTIMATE_GRAIL); pSlayer->addEffect(pEffect); - // Ʈ ٿ, ɷġ Ѵ. + // 이펙트를 붙였으니, 능력치를 재계산한다. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->addModifyInfo(prev, _GCSkillToSelfOK1); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); diff --git a/src/server/gameserver/skill/Invisibility.cpp b/src/server/gameserver/skill/Invisibility.cpp index 43538f2b..4e0111db 100644 --- a/src/server/gameserver/skill/Invisibility.cpp +++ b/src/server/gameserver/skill/Invisibility.cpp @@ -14,7 +14,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ +// 뱀파이어 셀프 ////////////////////////////////////////////////////////////////////////////// void Invisibility::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -42,7 +42,7 @@ void Invisibility::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEff ZoneCoord_t x = pVampire->getX(); ZoneCoord_t y = pVampire->getY(); - // Knowledge of Innate ִٸ hit bonus 10 + // Knowledge of Innate 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE); @@ -71,9 +71,9 @@ void Invisibility::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEff SkillOutput output; computeOutput(input, output); - // Ʈ ؼ δ. - // Ʈ ο. - // (ѹ ''ϰ ƴ϶ ̴ Ʈ.) + // 점점 사라지는 이펙트를 생성해서 붙인다. + // 실제로 사라지는 것은 이 이펙트 내부에서다. + // (한번에 '팍'하고 사라지는 게 아니라서 붙이는 이펙트다.) EffectFadeOut* pEffect = new EffectFadeOut(pVampire); pEffect->setDuration(output.Duration); pEffect->setDeadline(40); @@ -108,7 +108,7 @@ void Invisibility::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEff } ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Invisibility::execute(Monster* pMonster) @@ -147,9 +147,9 @@ void Invisibility::execute(Monster* pMonster) SkillOutput output; computeOutput(input, output); - // Ʈ ؼ δ. - // Ʈ ο. - // (ѹ ''ϰ ƴ϶ ̴ Ʈ.) + // 점점 사라지는 이펙트를 생성해서 붙인다. + // 실제로 사라지는 것은 이 이펙트 내부에서다. + // (한번에 '팍'하고 사라지는 게 아니라서 붙이는 이펙트다.) EffectFadeOut* pEffect = new EffectFadeOut(pMonster); pEffect->setDuration(output.Duration); pEffect->setDeadline(40); diff --git a/src/server/gameserver/skill/JabbingVein.cpp b/src/server/gameserver/skill/JabbingVein.cpp index 4a06dc1f..ddd294ca 100644 --- a/src/server/gameserver/skill/JabbingVein.cpp +++ b/src/server/gameserver/skill/JabbingVein.cpp @@ -16,7 +16,7 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ +// 슬레이어 오브젝트 ////////////////////////////////////////////////////////////////////////////// void JabbingVein::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,7 +37,7 @@ void JabbingVein::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -50,9 +50,9 @@ void JabbingVein::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* GCAttackArmsOK4 _GCAttackArmsOK4; GCAttackArmsOK5 _GCAttackArmsOK5; - // ִ Ⱑ ų, 迭 Ⱑ ƴ϶ . - // 迭 ߿ SG SR JabbingVein . - // SG, SR ִ. + // 들고 있는 무기가 없거나, 총 계열 무기가 아니라면 기술을 쓸 수 없다. + // 총 계열 무기 중에서도 SG나 SR은 JabbingVein를 쓸 수가 없다. + // SG, SR 도 이제 쓸 수 있다. // 2003. 1. 14 by bezz Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL || isArmsWeapon(pWeapon) == false) @@ -82,7 +82,7 @@ void JabbingVein::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* computeOutput(input, output); - // Ƽ Ѵ. + // 페널티 값을 계산한다. int ToHitPenalty = getPercentValue(pSlayer->getToHit(), output.ToHit); int RequiredMP = (int)pSkillInfo->getConsumeMP(); @@ -93,12 +93,12 @@ void JabbingVein::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* bool bHitRoll = HitRoll::isSuccess(pSlayer, pTargetCreature, ToHitPenalty); bool bPK = verifyPK(pSlayer, pTargetCreature); - // Ѿ ڴ ߸. + // 총알 숫자는 무조건 떨어뜨린다. Bullet_t RemainBullet = 0; if (bBulletCheck) { - // Ѿ ڸ ߸, ϰ, Ѿ ڸ ޾ƿ´. + // 총알 숫자를 떨어뜨리고, 저장하고, 남은 총알 숫자를 받아온다. decreaseBullet(pWeapon); - // ѹ߾ ʿ . by sigi. 2002.5.9 + // 한발쓸때마다 저장할 필요 없다. by sigi. 2002.5.9 // pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); RemainBullet = getRemainBullet(pWeapon); } @@ -112,15 +112,15 @@ void JabbingVein::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* bool bCriticalHit = false; - // ϰ, quickfire Ƽ Ѵ. - // output.Damage ̱ , % ϸ ᱹ ȴ. + // 데미지를 계산하고, quickfire 페널티를 가한다. + // output.Damage가 음수이기 때문에, %값을 구해 더하면 결국 빼는 것이 된다. int Damage = computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); Damage += getPercentValue(Damage, output.Damage); Damage = max(0, Damage); // cout << "JabbingVeinDamage:" << Damage << endl; - // Ѵ. + // 데미지를 세팅한다. setDamage(pTargetCreature, Damage, pSlayer, SkillType, &_GCAttackArmsOK2, &_GCAttackArmsOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCAttackArmsOK2, &_GCAttackArmsOK1); @@ -146,7 +146,7 @@ void JabbingVein::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pZone->broadcastPacket(pTargetCreature->getX(), pTargetCreature->getY(), &gcAddEffect); } - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } @@ -175,7 +175,7 @@ void JabbingVein::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pMonster->addEnemy(pSlayer); } - // ڿ Ʈ. + // 공격자와 상대의 아이템 내구성 떨어트림. decreaseDurability(pSlayer, pTargetCreature, NULL, &_GCAttackArmsOK1, &_GCAttackArmsOK2); ZoneCoord_t targetX = pTargetCreature->getX(); @@ -236,7 +236,7 @@ void JabbingVein::execute(Monster* pMonster, Creature* pEnemy) Zone* pZone = pMonster->getZone(); Assert(pZone != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pEnemy == NULL || pEnemy->isNPC()) { // cout << "WrongEnemy" << endl; executeSkillFailNormalWithGun(pMonster, getSkillType(), pEnemy, RemainBullet); @@ -255,7 +255,7 @@ void JabbingVein::execute(Monster* pMonster, Creature* pEnemy) SkillOutput output; computeOutput(input, output); - // Ƽ Ѵ. + // 페널티 값을 계산한다. int ToHitPenalty = getPercentValue(pMonster->getToHit(), output.ToHit); bool bRangeCheck = verifyDistance(pMonster, pEnemy, pSkillInfo->getRange()); @@ -268,15 +268,15 @@ void JabbingVein::execute(Monster* pMonster, Creature* pEnemy) bool bCriticalHit = false; - // ϰ, quickfire Ƽ Ѵ. - // output.Damage ̱ , % ϸ ᱹ ȴ. + // 데미지를 계산하고, quickfire 페널티를 가한다. + // output.Damage가 음수이기 때문에, %값을 구해 더하면 결국 빼는 것이 된다. int Damage = computeDamage(pMonster, pEnemy, 0, bCriticalHit); Damage += getPercentValue(Damage, output.Damage); Damage = max(0, Damage); // cout << "JabbingVeinDamage:" << Damage << endl; - // Ѵ. + // 데미지를 세팅한다. setDamage(pEnemy, Damage, pMonster, SkillType, &_GCAttackArmsOK2); // computeAlignmentChange(pEnemy, Damage, pMonster, &_GCAttackArmsOK2, &_GCAttackArmsOK1); @@ -294,7 +294,7 @@ void JabbingVein::execute(Monster* pMonster, Creature* pEnemy) pZone->broadcastPacket(pEnemy->getX(), pEnemy->getY(), &gcAddEffect); } - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pEnemy, pMonster->getX(), pMonster->getY()); } @@ -310,7 +310,7 @@ void JabbingVein::execute(Monster* pMonster, Creature* pEnemy) pOtherMonster->addEnemy(pMonster); } - // ڿ Ʈ. + // 공격자와 상대의 아이템 내구성 떨어트림. decreaseDurability(pMonster, pEnemy, NULL, NULL, &_GCAttackArmsOK2); ZoneCoord_t targetX = pEnemy->getX(); diff --git a/src/server/gameserver/skill/KasasArrow.cpp b/src/server/gameserver/skill/KasasArrow.cpp index 631adbb1..5e733b45 100644 --- a/src/server/gameserver/skill/KasasArrow.cpp +++ b/src/server/gameserver/skill/KasasArrow.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void KasasArrow::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/LandMineExplosion.cpp b/src/server/gameserver/skill/LandMineExplosion.cpp index 86251ac6..a0d0f943 100644 --- a/src/server/gameserver/skill/LandMineExplosion.cpp +++ b/src/server/gameserver/skill/LandMineExplosion.cpp @@ -11,8 +11,8 @@ ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// LandMineExplosion::LandMineExplosion() throw() { __BEGIN_TRY @@ -26,7 +26,7 @@ LandMineExplosion::LandMineExplosion() throw() { m_pLandMineExplosionMask[index++].set(i, j); } - // 8Ÿ + // 주위 8타일 /* m_pLandMineExplosionMask[0].set(1, 1); m_pLandMineExplosionMask[1].set(-1, -1); m_pLandMineExplosionMask[2].set(0, -1); @@ -40,7 +40,7 @@ LandMineExplosion::LandMineExplosion() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void LandMineExplosion::execute(Monster* pMonster) @@ -64,7 +64,7 @@ void LandMineExplosion::execute(Monster* pMonster) if (bRangeCheck) { //-------------------------------------------------------- - // knockbackǴ¸´ ֵ üũش. + // 주위에 knockback되는맞는 애들을 체크해준다. //-------------------------------------------------------- SkillInput input(pMonster); SkillOutput output; @@ -88,7 +88,7 @@ void LandMineExplosion::execute(Monster* pMonster) param.addMask(m_pLandMineExplosionMask[i].x, m_pLandMineExplosionMask[i].y, 100); } - // ´ ֵ knockback Ų. + // 강제로 맞는 애들을 knockback 시킨다. // bool bForceKnockback = true; g_SimpleTileMeleeSkill.execute(pMonster, x, y, param, result, 0, false); diff --git a/src/server/gameserver/skill/LarSlash.cpp b/src/server/gameserver/skill/LarSlash.cpp index 66e24f79..88503d8d 100644 --- a/src/server/gameserver/skill/LarSlash.cpp +++ b/src/server/gameserver/skill/LarSlash.cpp @@ -12,7 +12,7 @@ #include "GCSkillToObjectOK5.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void LarSlash::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -33,15 +33,15 @@ void LarSlash::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; } - // ϰ ִ Ⱑ ̰ų, SWORD ƴ϶ . + // 무장하고 있는 무기가 널이거나, SWORD가 아니라면 쓸 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_SWORD) { executeSkillFailException(pSlayer, getSkillType()); @@ -62,7 +62,7 @@ void LarSlash::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS bool bCriticalHit = false; - // ⺻ ų Ѵ. + // 기본 데미지에 스킬 데미지를 더한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); @@ -78,8 +78,8 @@ void LarSlash::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS bool bCanHit = canHit(pSlayer, pTargetCreature, SkillType); bool bPK = verifyPK(pSlayer, pTargetCreature); - // ־ ϰ, ð Ÿ üũ ϰ, - // hitroll ϰ, ũν īͰ ɷ ʴٸ, ̴. + // 마나가 있어야 하고, 시간과 거리 체크에 성공하고, + // hitroll에 성공하고, 크로스 카운터가 걸려있지 않다면, 성공이다. if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bCanHit && bPK) { CheckCrossCounter(pSlayer, pTargetCreature, Damage, pSkillInfo->getRange()); @@ -87,17 +87,17 @@ void LarSlash::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS // Exp_t Point = pSkillInfo->getPoint(); - // ְ, ߸. + // 데미지를 주고, 내구도를 떨어뜨린다. setDamage(pTargetCreature, Damage, pSlayer, SkillType, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); decreaseDurability(pSlayer, pTargetCreature, pSkillInfo, &_GCSkillToObjectOK1, &_GCSkillToObjectOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } - // Ÿ ̾ ƴ 쿡 ġ ÷ش. + // 타겟이 슬레이어가 아닌 경우에만 경험치를 올려준다. if (!pTargetCreature->isSlayer()) { if (bIncreaseExp) { shareAttrExp(pSlayer, Damage, 8, 1, 1, _GCSkillToObjectOK1); @@ -108,7 +108,7 @@ void LarSlash::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS increaseAlignment(pSlayer, pTargetCreature, _GCSkillToObjectOK1); } - // Ŷ غϰ, . + // 패킷을 준비하고, 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); diff --git a/src/server/gameserver/skill/Liberty.cpp b/src/server/gameserver/skill/Liberty.cpp index 0fb631aa..924fe95a 100644 --- a/src/server/gameserver/skill/Liberty.cpp +++ b/src/server/gameserver/skill/Liberty.cpp @@ -15,7 +15,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Liberty::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -44,7 +44,7 @@ void Liberty::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkill Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !pTargetCreature->isOusters()) { executeSkillFailException(pOusters, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -86,10 +86,10 @@ void Liberty::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkill bool bHitRoll2 = (rand() % 100) < Ratio; if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bHitRoll2 && bSatisfyRequire && bHPCheck) { - // δ. + // 마나를 줄인다. decreaseMana(pOusters, RequiredMP, _GCSkillToObjectOK1); - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; input.TargetType = SkillInput::TARGET_OTHER; @@ -97,7 +97,7 @@ void Liberty::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkill pEffect->setDeadline(0); - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); diff --git a/src/server/gameserver/skill/Light.cpp b/src/server/gameserver/skill/Light.cpp index 712e2afa..180d3ce0 100644 --- a/src/server/gameserver/skill/Light.cpp +++ b/src/server/gameserver/skill/Light.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Light::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -48,7 +48,7 @@ void Light::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectI if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // Ǵ ð õ ޶. + // 기술이 유지되는 시간은 숙련도에 따라서 달라진다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); @@ -56,14 +56,14 @@ void Light::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectI Sight_t CurrentSight = pSlayer->getSight(); Sight_t oldSight = CurrentSight; - // Ȥö Ʈ ִٸ Ѵ. + // 혹시라도 옛날 이펙트가 남아있다면 삭제한다. if (pSlayer->isEffect(Effect::EFFECT_CLASS_LIGHT)) { EffectLight* pOldEffectLight = (EffectLight*)pSlayer->findEffect(Effect::EFFECT_CLASS_LIGHT); CurrentSight = pOldEffectLight->getOldSight(); pSlayer->deleteEffect(Effect::EFFECT_CLASS_LIGHT); } - // Ʈ δ. + // 이펙트를 만들어 붙인다. EffectLight* pEffectLight = new EffectLight(pSlayer); pEffectLight->setDeadline(output.Duration); pEffectLight->setOldSight(CurrentSight); @@ -72,12 +72,12 @@ void Light::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectI // pEffectLight->create(pSlayer->getName()); - // þó.. + // 시야처리.. Sight_t MinSight = pSkillInfo->getMinDamage(); Sight_t MaxSight = pSkillInfo->getMaxDamage(); Sight_t NewSight = MinSight + (MaxSight - MinSight) * SkillLevel / 100; - // þ 濡 Ʈ Ŷ . + // 시야 변경에 따른 오브젝트 가감 패킷을 보낸다. pZone->updateScan(pSlayer, oldSight, NewSight); pSlayer->setSight(NewSight); @@ -107,7 +107,7 @@ void Light::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectI pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCSkillToSelfOK2, pSlayer); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pSlayer->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_LIGHT); diff --git a/src/server/gameserver/skill/LightBall.cpp b/src/server/gameserver/skill/LightBall.cpp index 66a7c261..1b0ae438 100644 --- a/src/server/gameserver/skill/LightBall.cpp +++ b/src/server/gameserver/skill/LightBall.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void LightBall::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,7 +37,7 @@ void LightBall::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p SIMPLE_SKILL_OUTPUT result; - // Holy Smashing ִٸ + // Holy Smashing 이 있다면 데미지 증가 if (pSlayer->hasRankBonus(RankBonus::RANK_BONUS_HOLY_SMASHING)) { RankBonus* pRankBonus = pSlayer->getRankBonus(RankBonus::RANK_BONUS_HOLY_SMASHING); Assert(pRankBonus != NULL); diff --git a/src/server/gameserver/skill/Lightness.cpp b/src/server/gameserver/skill/Lightness.cpp index 20ef8c69..d4a0643e 100644 --- a/src/server/gameserver/skill/Lightness.cpp +++ b/src/server/gameserver/skill/Lightness.cpp @@ -15,7 +15,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Lightness::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -36,7 +36,7 @@ void Lightness::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !pTargetCreature->isSlayer()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -59,23 +59,23 @@ void Lightness::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p bool bEffected = pTargetCreature->isFlag(Effect::EFFECT_CLASS_LIGHTNESS); if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { - // δ. + // 마나를 줄인다. decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToObjectOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToObjectOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToObjectOK1); - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; input.TargetType = SkillInput::TARGET_OTHER; computeOutput(input, output); - // Ʈ ؼ δ. + // 이펙트를 생성해서 붙인다. EffectLightness* pLightness = new EffectLightness(pTargetCreature); Assert(pLightness != NULL); pLightness->setDeadline(output.Duration); @@ -91,7 +91,7 @@ void Lightness::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p _GCSkillToObjectOK2.addShortData(MODIFY_VISION, newSight); } - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); @@ -121,7 +121,7 @@ void Lightness::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCSkillToObjectOK5, cList); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_LIGHTNESS); @@ -142,7 +142,7 @@ void Lightness::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Lightness::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -175,20 +175,20 @@ void Lightness::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEff if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; input.TargetType = SkillInput::TARGET_SELF; computeOutput(input, output); - // Ʈ ؼ δ + // 이펙트를 생성해서 붙인다 EffectLightness* pLightness = new EffectLightness(pSlayer); pLightness->setDeadline(output.Duration); pSlayer->addEffect(pLightness); @@ -203,7 +203,7 @@ void Lightness::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEff _GCSkillToSelfOK1.addShortData(MODIFY_VISION, newSight); } - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); @@ -218,7 +218,7 @@ void Lightness::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEff pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(myX, myY, &_GCSkillToSelfOK2, pSlayer); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pSlayer->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_LIGHTNESS); diff --git a/src/server/gameserver/skill/LightningHand.cpp b/src/server/gameserver/skill/LightningHand.cpp index 612cef23..2b28eddf 100644 --- a/src/server/gameserver/skill/LightningHand.cpp +++ b/src/server/gameserver/skill/LightningHand.cpp @@ -12,7 +12,7 @@ #include "GCSkillToObjectOK5.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void LightningHand::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -33,15 +33,15 @@ void LightningHand::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; } - // ϰ ִ Ⱑ ̰ų, SWORD ƴ϶ . + // 무장하고 있는 무기가 널이거나, SWORD가 아니라면 쓸 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_SWORD) { executeSkillFailException(pSlayer, getSkillType()); @@ -62,7 +62,7 @@ void LightningHand::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo bool bCriticalHit = false; - // ⺻ ų Ѵ. + // 기본 데미지에 스킬 데미지를 더한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); @@ -78,8 +78,8 @@ void LightningHand::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo bool bCanHit = canHit(pSlayer, pTargetCreature, SkillType) && canAttack(pSlayer, pTargetCreature); bool bPK = verifyPK(pSlayer, pTargetCreature); - // ־ ϰ, ð Ÿ üũ ϰ, - // hitroll ϰ, ũν īͰ ɷ ʴٸ, ̴. + // 마나가 있어야 하고, 시간과 거리 체크에 성공하고, + // hitroll에 성공하고, 크로스 카운터가 걸려있지 않다면, 성공이다. if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bCanHit && bPK) { CheckCrossCounter(pSlayer, pTargetCreature, Damage, pSkillInfo->getRange()); @@ -87,17 +87,17 @@ void LightningHand::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo // Exp_t Point = pSkillInfo->getPoint(); - // ְ, ߸. + // 데미지를 주고, 내구도를 떨어뜨린다. setDamage(pTargetCreature, Damage, pSlayer, SkillType, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); decreaseDurability(pSlayer, pTargetCreature, pSkillInfo, &_GCSkillToObjectOK1, &_GCSkillToObjectOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } - // Ÿ ̾ ƴ 쿡 ġ ÷ش. + // 타겟이 슬레이어가 아닌 경우에만 경험치를 올려준다. if (!pTargetCreature->isSlayer()) { if (bIncreaseExp) { shareAttrExp(pSlayer, Damage, 8, 1, 1, _GCSkillToObjectOK1); @@ -108,7 +108,7 @@ void LightningHand::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo increaseAlignment(pSlayer, pTargetCreature, _GCSkillToObjectOK1); } - // Ŷ غϰ, . + // 패킷을 준비하고, 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); diff --git a/src/server/gameserver/skill/MagicElusion.cpp b/src/server/gameserver/skill/MagicElusion.cpp index df03bfb1..57942337 100644 --- a/src/server/gameserver/skill/MagicElusion.cpp +++ b/src/server/gameserver/skill/MagicElusion.cpp @@ -21,7 +21,7 @@ #include "Slayer.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 슬레이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void MagicElusion::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -64,7 +64,7 @@ void MagicElusion::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS if (rect.ptInRect(X, Y)) bTileCheck = true; - // Ʈ ӽð Ѵ. + // 이펙트의 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); @@ -81,7 +81,7 @@ void MagicElusion::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS ObjectRegistry& objectregister = pZone->getObjectRegistry(); - // ϴ ̹ sanctuary ִ ˻Ѵ. + // 일단 이미 sanctuary가 있는지 검색한다. for (oY = -1; oY <= 1; oY++) for (oX = -1; oX <= 1; oX++) { int tileX = X + oX; @@ -92,8 +92,8 @@ void MagicElusion::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS if (tile.canAddEffect()) { Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_MAGIC_ELUSION); - // ̹ ִٸ - // д. + // 이미 있다면 + // 기술 실패다. if (pOldEffect != NULL) { executeSkillFailNormal(pSlayer, getSkillType(), NULL); @@ -113,11 +113,11 @@ void MagicElusion::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS if (rect.ptInRect(tileX, tileY)) { Tile& tile = pZone->getTile(tileX, tileY); - // Ʈ Ŭ Ѵ. + // 이펙트 클래스를 생성한다. EffectMagicElusion* pEffect = new EffectMagicElusion(pZone, tileX, tileY); pEffect->setDeadline(output.Duration); - // Tile ̴ Effect ObjectID Ϲ޾ƾ Ѵ. + // Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다. objectregister.registerObject(pEffect); pZone->addEffect(pEffect); tile.addEffect(pEffect); @@ -132,7 +132,7 @@ void MagicElusion::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS pZone->broadcastPacket(X, Y, &gcAddEffectToTile, pSlayer); } else { - //  Ʈ ƴϸ εij ʴ´. + // 가운데 이펙트가 아니면 브로드캐스팅해주지 않는다. pEffect->setBroadcastingEffect(false); } @@ -213,8 +213,8 @@ void MagicElusion::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS list watcherList = pZone->getWatcherList(myX, myY, pSlayer); - // watcherList cList ʰ, caster(pSlayer) - // OK4 .. cList ߰Ѵ. + // watcherList에서 cList에 속하지 않고, caster(pSlayer)를 볼 수 없는 경우는 + // OK4를 보내고.. cList에 추가한다. for (list::const_iterator itr = watcherList.begin(); itr != watcherList.end(); itr++) { bool bBelong = false; for (list::const_iterator tItr = cList.begin(); tItr != cList.end(); tItr++) @@ -223,7 +223,7 @@ void MagicElusion::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS Creature* pWatcher = (*itr); if (bBelong == false && canSee(pWatcher, pSlayer) == false) { - // Assert(pWatcher->isPC()); // 翬 PC.. Zone::getWatcherList PC returnѴ + // Assert(pWatcher->isPC()); // 당연 PC다.. Zone::getWatcherList는 PC만 return한다 if (pWatcher->isPC()) { pWatcher->getPlayer()->sendPacket(&_GCSkillToTileOK4); cList.push_back(*itr); @@ -253,7 +253,7 @@ void MagicElusion::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void MagicElusion::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/MagnumSpear.cpp b/src/server/gameserver/skill/MagnumSpear.cpp index c50210b1..dea58538 100644 --- a/src/server/gameserver/skill/MagnumSpear.cpp +++ b/src/server/gameserver/skill/MagnumSpear.cpp @@ -17,7 +17,7 @@ #include "SkillUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void MagnumSpear::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -44,7 +44,7 @@ void MagnumSpear::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); SkillType_t SkillType = pOustersSkillSlot->getSkillType(); - // NPC . + // NPC는 공격할 수가 없다. if (pTargetCreature == NULL || !canAttack(pOusters, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, SkillType); return; diff --git a/src/server/gameserver/skill/MentalSword.cpp b/src/server/gameserver/skill/MentalSword.cpp index df499511..4410520b 100644 --- a/src/server/gameserver/skill/MentalSword.cpp +++ b/src/server/gameserver/skill/MentalSword.cpp @@ -9,7 +9,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void MentalSword::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/Mephisto.cpp b/src/server/gameserver/skill/Mephisto.cpp index 93c97a45..603ab3aa 100644 --- a/src/server/gameserver/skill/Mephisto.cpp +++ b/src/server/gameserver/skill/Mephisto.cpp @@ -18,7 +18,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Mephisto::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -43,7 +43,7 @@ void Mephisto::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, C SkillType_t SkillType = pVampireSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // Knowledge of Curse ִٸ hit bonus 10 + // Knowledge of Curse 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_CURSE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_CURSE); @@ -62,28 +62,28 @@ void Mephisto::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, C if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pVampire, RequiredMP, _GCSkillToSelfOK1); - // ų ʽ ޶. + // 스킬 레벨에 따라 데미지 보너스가 달라진다. SkillInput input(pVampire); SkillOutput output; input.SkillLevel = pVampire->getSTR() + pVampire->getDEX() + pVampire->getINT(); input.DomainLevel = pVampire->getLevel(); computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectMephisto* pEffect = new EffectMephisto(pVampire); pEffect->setDeadline(output.Duration); pEffect->setBonus(output.Damage); pVampire->addEffect(pEffect); pVampire->setFlag(Effect::EFFECT_CLASS_MEPHISTO); - // ̷ Ͽ ٲ ɷġ . + // 이로 인하여 바뀌는 능력치를 보낸다. VAMPIRE_RECORD prev; pVampire->getVampireRecord(prev); pVampire->initAllStat(); pVampire->sendRealWearingInfo(); pVampire->sendModifyInfo(prev); - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(output.Duration); @@ -96,7 +96,7 @@ void Mephisto::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, C pZone->broadcastPacket(pVampire->getX(), pVampire->getY(), &_GCSkillToSelfOK2, pVampire); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pVampire->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_MEPHISTO); @@ -138,7 +138,7 @@ void Mephisto::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pVampire, getSkillType()); return; @@ -169,28 +169,28 @@ void Mephisto::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil decreaseMana(pVampire, RequiredMP, _GCSkillToObjectOK1); - // ų ʽ ޶. + // 스킬 레벨에 따라 데미지 보너스가 달라진다. SkillInput input(pVampire); SkillOutput output; input.SkillLevel = pVampire->getSTR() + pVampire->getDEX() + pVampire->getINT(); input.DomainLevel = pVampire->getLevel(); computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectMephisto* pEffect = new EffectMephisto(pTargetVampire); pEffect->setDeadline(output.Duration); pEffect->setBonus(output.Damage); pTargetVampire->addEffect(pEffect); pTargetVampire->setFlag(Effect::EFFECT_CLASS_MEPHISTO); - // ̷ Ͽ ٲ ɷġ . + // 이로 인하여 바뀌는 능력치를 보낸다. VAMPIRE_RECORD prev; pTargetVampire->getVampireRecord(prev); pTargetVampire->initAllStat(); pTargetVampire->sendRealWearingInfo(); pTargetVampire->sendModifyInfo(prev); - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setDuration(output.Duration); @@ -221,7 +221,7 @@ void Mephisto::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil cList.push_back(pVampire); pZone->broadcastPacket(myX, myY, &_GCSkillToObjectOK3, cList); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetVampire->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_MEPHISTO); @@ -279,7 +279,7 @@ void Mephisto::execute(Vampire* pVampire) if (!rect.ptInRect(tileX, tileY)) continue; - // Ÿ ! ̾ ִ ! + // 타일 위에! 뱀파이어가 있는지 본다! Tile& tile = pZone->getTile(tileX, tileY); Creature* pTargetCreature = NULL; if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) @@ -293,21 +293,21 @@ void Mephisto::execute(Vampire* pVampire) Vampire* pTargetVampire = dynamic_cast(pTargetCreature); - // ų ʽ ޶. + // 스킬 레벨에 따라 데미지 보너스가 달라진다. SkillInput input(pVampire); SkillOutput output; input.SkillLevel = pVampire->getSTR() + pVampire->getDEX() + pVampire->getINT(); input.DomainLevel = pVampire->getLevel(); computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectMephisto* pEffect = new EffectMephisto(pTargetVampire); pEffect->setDeadline(output.Duration); pEffect->setBonus(output.Damage); pTargetVampire->addEffect(pEffect); pTargetVampire->setFlag(Effect::EFFECT_CLASS_MEPHISTO); - // ̷ Ͽ ٲ ɷġ . + // 이로 인하여 바뀌는 능력치를 보낸다. VAMPIRE_RECORD prev; pTargetVampire->getVampireRecord(prev); pTargetVampire->initAllStat(); @@ -323,7 +323,7 @@ void Mephisto::execute(Vampire* pVampire) Assert(false); } - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetVampire->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_MEPHISTO); diff --git a/src/server/gameserver/skill/MercyGround.cpp b/src/server/gameserver/skill/MercyGround.cpp index 7c4249c4..24355eac 100644 --- a/src/server/gameserver/skill/MercyGround.cpp +++ b/src/server/gameserver/skill/MercyGround.cpp @@ -17,7 +17,7 @@ #include "GCSkillToTileOK6.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void MercyGround::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -36,7 +36,7 @@ void MercyGround::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -53,7 +53,7 @@ void MercyGround::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 슬레이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void MercyGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -97,7 +97,7 @@ void MercyGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl bTileCheck = true; if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bTileCheck) { - // Ʈ ӽð Ѵ. + // 이펙트의 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); @@ -133,7 +133,7 @@ void MercyGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl } } - // ϸ ٸ ǹǷ ⼭ ٿش. + // 실패하면 마나가 줄면 안 되므로 여기서 줄여준다. decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1); for (oY = -1; oY <= 1; oY++) @@ -143,14 +143,14 @@ void MercyGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl if (rect.ptInRect(tileX, tileY)) { Tile& tile = pZone->getTile(tileX, tileY); - // ŸϿ Ʈ ߰ ִٸ... - // if (tile.canAddEffect()) // üũߴ. + // 현재 타일에다 이펙트를 추가할 수 있다면... + // if (tile.canAddEffect()) // 위에서 체크했다. { - // Ʈ Ŭ Ѵ. + // 이펙트 클래스를 생성한다. EffectMercyGround* pEffect = new EffectMercyGround(pZone, tileX, tileY); pEffect->setDeadline(output.Duration); - // Tile ̴ Effect ObjectID Ϲ޾ƾ Ѵ. + // Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다. pZone->registerObject(pEffect); pZone->addEffect(pEffect); tile.addEffect(pEffect); @@ -236,8 +236,8 @@ void MercyGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl list watcherList = pZone->getWatcherList(myX, myY, pSlayer); - // watcherList cList ʰ, caster(pSlayer) - // OK4 .. cList ߰Ѵ. + // watcherList에서 cList에 속하지 않고, caster(pSlayer)를 볼 수 없는 경우는 + // OK4를 보내고.. cList에 추가한다. for (list::const_iterator itr = watcherList.begin(); itr != watcherList.end(); itr++) { bool bBelong = false; for (list::const_iterator tItr = cList.begin(); tItr != cList.end(); tItr++) @@ -246,9 +246,9 @@ void MercyGround::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl Creature* pWatcher = (*itr); if (bBelong == false && canSee(pWatcher, pSlayer) == false) { - // Assert(pWatcher->isPC()); // 翬 PC.. Zone::getWatcherList PC returnѴ + // Assert(pWatcher->isPC()); // 당연 PC다.. Zone::getWatcherList는 PC만 return한다 if (!pWatcher->isPC()) { - // cout << "MercyGround : ó Ʈ PC ƴմϴ." << endl; + // cout << "MercyGround : 왓처 리스트가 PC가 아닙니다." << endl; GCSkillFailed1 _GCSkillFailed1; _GCSkillFailed1.setSkillType(getSkillType()); pSlayer->getPlayer()->sendPacket(&_GCSkillFailed1); diff --git a/src/server/gameserver/skill/MeteorStorm.cpp b/src/server/gameserver/skill/MeteorStorm.cpp index 16ece5b7..93861697 100644 --- a/src/server/gameserver/skill/MeteorStorm.cpp +++ b/src/server/gameserver/skill/MeteorStorm.cpp @@ -10,7 +10,7 @@ #include "SimpleTileMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void MeteorStorm::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -30,7 +30,7 @@ void MeteorStorm::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pOusters, pTargetCreature)) { executeSkillFailException(pOusters, getSkillType()); return; diff --git a/src/server/gameserver/skill/MeteorStrike.cpp b/src/server/gameserver/skill/MeteorStrike.cpp index 373df828..6684c9d9 100644 --- a/src/server/gameserver/skill/MeteorStrike.cpp +++ b/src/server/gameserver/skill/MeteorStrike.cpp @@ -17,7 +17,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void MeteorStrike::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -37,8 +37,8 @@ void MeteorStrike::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -57,7 +57,7 @@ void MeteorStrike::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void MeteorStrike::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -84,7 +84,7 @@ void MeteorStrike::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp SkillType_t SkillType = pVampireSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // Knowledge of Innate ִٸ hit bonus 10 + // Knowledge of Innate 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE); @@ -111,9 +111,9 @@ void MeteorStrike::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); Tile& tile = pZone->getTile(X, Y); - Range_t Range = 1; // ׻ 1̴. + Range_t Range = 1; // 항상 1이다. - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_METEOR_STRIKE); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); @@ -122,12 +122,12 @@ void MeteorStrike::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp checkMine(pZone, X, Y); - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectMeteorStrike* pEffect = new EffectMeteorStrike(pZone, X, Y, true); pEffect->setUserObjectID(pVampire->getObjectID()); pEffect->setDamage(output.Damage); @@ -135,18 +135,18 @@ void MeteorStrike::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp // pEffect->setNextTime(0); // pEffect->setTick(output.Tick); - // 켱 ý Ͽ ̸ Ƽ ̵ ִ´. + // 우선권 시스템을 위하여 이름과 파티 아이디를 넣는다. // pEffect->setCasterName(pVampire->getName()); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); - // Ÿ ũİ ִٸ ٷ ֵ Ѵ. + // 타일 위에 크리쳐가 있다면 바로 영향을 주도록 한다. bool bEffected = false; Creature* pTargetCreature = NULL; @@ -251,7 +251,7 @@ void MeteorStrike::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void MeteorStrike::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -290,22 +290,22 @@ void MeteorStrike::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) } Tile& tile = pZone->getTile(X, Y); - Range_t Range = 1; // ׻ 1̴. + Range_t Range = 1; // 항상 1이다. - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_METEOR_STRIKE); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); } - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); input.SkillLevel = pMonster->getLevel(); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectMeteorStrike* pEffect = new EffectMeteorStrike(pZone, X, Y); pEffect->setNextTime(output.Duration); pEffect->setUserObjectID(pMonster->getObjectID()); @@ -314,15 +314,15 @@ void MeteorStrike::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pEffect->setDamage(output.Damage); // pEffect->setLevel(pSkillInfo->getLevel()/2); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); - // Ÿ ũİ ִٸ ٷ ֵ Ѵ. + // 타일 위에 크리쳐가 있다면 바로 영향을 주도록 한다. bool bEffected = false; Creature* pTargetCreature = NULL; diff --git a/src/server/gameserver/skill/MindControl.cpp b/src/server/gameserver/skill/MindControl.cpp index ba5a67c1..e689488f 100644 --- a/src/server/gameserver/skill/MindControl.cpp +++ b/src/server/gameserver/skill/MindControl.cpp @@ -18,7 +18,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void MindControl::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -60,7 +60,7 @@ void MindControl::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE SkillOutput output; computeOutput(input, output); - // Ʈ δ. + // 이펙트를 만들어 붙인다. EffectMindControl* pEffect = new EffectMindControl(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setDefenseBonus(output.Damage); @@ -68,14 +68,14 @@ void MindControl::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE pSlayer->setFlag(Effect::EFFECT_CLASS_MIND_CONTROL); pSlayer->addEffect(pEffect); - // Ʈ ٿ, ɷġ Ѵ. + // 이펙트를 붙였으니, 능력치를 재계산한다. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->addModifyInfo(prev, _GCSkillToSelfOK1); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 8, 1, _GCSkillToSelfOK1); diff --git a/src/server/gameserver/skill/MiracleShield.cpp b/src/server/gameserver/skill/MiracleShield.cpp index 130e89b8..81a3fd88 100644 --- a/src/server/gameserver/skill/MiracleShield.cpp +++ b/src/server/gameserver/skill/MiracleShield.cpp @@ -13,7 +13,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void MiracleShield::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -32,7 +32,7 @@ void MiracleShield::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 도가 아니라면 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_SWORD) { executeSkillFailException(pSlayer, getSkillType()); @@ -64,7 +64,7 @@ void MiracleShield::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectMiracleShield* pEffect = new EffectMiracleShield(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setDefenseBonus(output.Damage); @@ -72,14 +72,14 @@ void MiracleShield::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_MIRACLE_SHIELD); - // ̷ Ͽ ٲ ɷġ . + // 이로 인하여 바뀌는 능력치를 보낸다. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 8, 1, 1, _GCSkillToSelfOK1); diff --git a/src/server/gameserver/skill/MoleShot.cpp b/src/server/gameserver/skill/MoleShot.cpp index 45a2c983..b3f913c6 100644 --- a/src/server/gameserver/skill/MoleShot.cpp +++ b/src/server/gameserver/skill/MoleShot.cpp @@ -16,12 +16,12 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// - ũ ʱȭѴ. +// 생성자 - 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// MoleShot::MoleShot() throw() { __BEGIN_TRY - // SG ũ ׻ + ̴. + // SG 마스크는 방향과는 관계없이 항상 + 모양이다. m_pSGMask[0].set(-1, -1); m_pSGMask[1].set(0, -1); m_pSGMask[2].set(1, -1); @@ -32,17 +32,17 @@ MoleShot::MoleShot() throw() { m_pSGMask[7].set(0, 1); m_pSGMask[8].set(1, 1); - // AR ũ ʱȭŲ. - // SwordWave , SwordWave - // ũ ̿ ˻. MoleShot Ÿ ũ - // ̿ ˻Ѵٴ ؾ Ѵ. + // AR 마스크를 초기화시킨다. + // SwordWave와 비슷하지만, SwordWave는 시전자 주위를 + // 마스크를 이용해 검사하지만. MoleShot은 타겟의 주위를 마스크를 + // 이용해 검사한다는 것을 생각해야 한다. // // (-1,-1)(0,-1)(1,-1) // (-1, 0)(0, 0)(1, 0) // (-1, 1)(0, 1)(1, 1) // - // ⿡ Ÿ ̳ĸ - // ϸ ũ ϱ . + // 각 방향에 따라 어느 타일이 명중 대상이냐를 + // 생각하면 마스크를 이해하기 쉽다. m_pARMask[LEFT][0].set(0, -1); m_pARMask[LEFT][1].set(0, 0); @@ -80,7 +80,7 @@ MoleShot::MoleShot() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void MoleShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -99,17 +99,17 @@ void MoleShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; } - // ų, 迭 Ⱑ ƴϰų, SR̶ - // . + // 아이템이 없거나, 총 계열의 무기가 아니거나, SR이라면 + // 이 기술을 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || !isArmsWeapon(pItem)) - // SR ϰ . by sigi. 2002.12.3 + // SR도 사용 가능하게 수정. by sigi. 2002.12.3 // || pItem->getItemClass() == Item::ITEM_CLASS_SR) { executeSkillFailException(pSlayer, getSkillType()); @@ -121,7 +121,7 @@ void MoleShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS SGexecute(pSlayer, pTargetCreature->getX(), pTargetCreature->getY(), pSkillSlot, CEffectID); } else if (IClass == Item::ITEM_CLASS_AR || IClass == Item::ITEM_CLASS_SMG - // SR ϰ . by sigi. 2002.12.3 + // SR도 사용 가능하게 수정. by sigi. 2002.12.3 || IClass == Item::ITEM_CLASS_SR) { ARSMGexecute(pSlayer, pTargetCreature->getX(), pTargetCreature->getY(), pSkillSlot, CEffectID); } @@ -135,7 +135,7 @@ void MoleShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void MoleShot::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -149,11 +149,11 @@ void MoleShot::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* Zone* pZone = pSlayer->getZone(); Assert(pZone != NULL); - // ų, 迭 Ⱑ ƴϰų, SR̶ - // . + // 아이템이 없거나, 총 계열의 무기가 아니거나, SR이라면 + // 이 기술을 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || !isArmsWeapon(pItem)) - // SR ϰ . by sigi. 2002.12.3 + // SR도 사용 가능하게 수정. by sigi. 2002.12.3 //|| pItem->getItemClass() == Item::ITEM_CLASS_SR) { executeSkillFailException(pSlayer, getSkillType()); @@ -165,7 +165,7 @@ void MoleShot::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* SGexecute(pSlayer, X, Y, pSkillSlot, CEffectID); } else if (IClass == Item::ITEM_CLASS_AR || IClass == Item::ITEM_CLASS_SMG - // SR ϰ . by sigi. 2002.12.3 + // SR도 사용 가능하게 수정. by sigi. 2002.12.3 || IClass == Item::ITEM_CLASS_SR) { ARSMGexecute(pSlayer, X, Y, pSkillSlot, CEffectID); } @@ -177,7 +177,7 @@ void MoleShot::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 - SG +// 슬레이어 타일 핸들러 - SG를 들고 있을 경우 ////////////////////////////////////////////////////////////////////////////// void MoleShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -216,16 +216,16 @@ void MoleShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo bool bRangeCheck = verifyDistance(pSlayer, X, Y, pWeapon->getRange()); bool bBulletCheck = (getRemainBullet(pWeapon) > 0) ? true : false; - // Ѿ ߸. + // 총알 수는 무조건 떨어뜨린다. Bullet_t RemainBullet = 0; if (bBulletCheck) { decreaseBullet(pWeapon); - // ѹ߾ ʿ . by sigi. 2002.5.9 + // 한발쓸때마다 저장할 필요 없다. by sigi. 2002.5.9 // pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); RemainBullet = getRemainBullet(pWeapon); } - // , ʽ, ǥ Ѵ. + // 데미지, 투힛 보너스, 좌표와 방향을 구한다. int ToHitBonus = 0; int DamageBonus = 0; int ToHitPenalty = 0; @@ -233,10 +233,10 @@ void MoleShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); Dir_t dir = calcDirection(myX, myY, X, Y); - bool bHit = false; // ѹ̶ ¾Ҵ° ϱ - Damage_t Damage = 0; // ϱ + bool bHit = false; // 한번이라도 맞았는가를 저장하기 위한 변수 + Damage_t Damage = 0; // 마지막으로 입힌 데미지를 저장하기 위한 변수 - // SG 쿡 4 ؼ 9 splash . + // SG일 경우에는 4부터 시작해서 9까지의 splash 데미지를 입힌다. int Splash = 3 + pSkillSlot->getExpLevel() / 10 + 1; if (bManaCheck && bTimeCheck && bRangeCheck && bBulletCheck) { @@ -246,7 +246,7 @@ void MoleShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo SkillOutput output; computeOutput(input, output); - // output.ToHit ̱ , % ƿ´. + // output.ToHit값이 음수이기 때문에, %값이 음수로 돌아온다. ToHitPenalty = getPercentValue(pSlayer->getToHit(), output.ToHit); list cList; @@ -279,19 +279,19 @@ void MoleShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo if (!bInvokerCheck && !bRaceCheck && bHitRoll && bPK && bZoneLevelCheck) { bool bCriticalHit = false; - // ؼ Ƽ Ѵ. - // ʽ Ƽ Ƽ ִ. + // 데미지를 계산해서 페널티를 가한다. + // 보너스는 멀티샷 페널티 때문에 음수가 될 수도 있다. Damage = computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); DamagePenalty = getPercentValue(Damage, output.Damage); Damage = max(0, Damage + DamagePenalty + DamageBonus); - // Ÿ ϰ, ÷ Դµ, - // ÷ Ϲ 50%. + // 메인 타겟을 제외하고는, 스플래시 데미지를 입는데, + // 스플래시 데미지는 일반 데미지의 50%다. if (pTargetCreature->getX() != X || pTargetCreature->getY() != Y) { Damage = Damage / 2; } - // ҵ̺ʹ ޸ ũν ī üũ ʴ´. + // 소드웨이브와는 달리 크로스 카운터 체크는 하지 않는다. ObjectID_t targetObjectID = pTargetCreature->getObjectID(); cList.push_back(pTargetCreature); _GCSkillToTileOK1.addCListElement(targetObjectID); @@ -303,12 +303,12 @@ void MoleShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo increaseAlignment(pSlayer, pTargetCreature, _GCSkillToTileOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, myX, myY); } - // ̾ ƴ 쿡 hit ɷ Ѵ. + // 슬레이어 아닌 경우에만 hit한 걸로 간주한다. if (!pTargetCreature->isSlayer()) { bHit = true; @@ -330,7 +330,7 @@ void MoleShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo _GCSkillToTileOK1.addShortData(MODIFY_BULLET, RemainBullet); - // Ѿ ڸ ̰, Ѿ ڸ ϰ, Ѿ ڸ ߸. + // 총알 숫자를 줄이고, 총알 숫자를 저장하고, 남은 총알 숫자를 받은 다음에 내구력을 떨어뜨린다. decreaseDurability(pSlayer, NULL, pSkillInfo, &_GCSkillToTileOK1, NULL); _GCSkillToTileOK1.setSkillType(getSkillType()); @@ -367,7 +367,7 @@ void MoleShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo pPlayer->sendPacket(&_GCSkillToTileOK1); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; Assert(pTargetCreature != NULL); @@ -386,15 +386,15 @@ void MoleShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // ߸. + // 아이템의 내구력을 떨어뜨린다. decreaseDurability(NULL, pTargetCreature, pSkillInfo, NULL, &_GCSkillToTileOK2); - // Ŷ ش. + // 패킷을 보내준다. Player* pPlayer = pTargetCreature->getPlayer(); Assert(pPlayer != NULL); pPlayer->sendPacket(&_GCSkillToTileOK2); } else if (pTargetCreature->isMonster()) { - // νѴ. + // 당근 적으로 인식한다. Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pSlayer); } @@ -421,7 +421,7 @@ void MoleShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 - AR̳ SMG +// 슬레이어 타일 핸들러 - AR이나 SMG를 들고 있을 경우 ////////////////////////////////////////////////////////////////////////////// void MoleShot::ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -460,16 +460,16 @@ void MoleShot::ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill bool bRangeCheck = verifyDistance(pSlayer, X, Y, pWeapon->getRange()); bool bBulletCheck = (getRemainBullet(pWeapon) > 0) ? true : false; - // Ѿ ڴ ߸. + // 총알 숫자는 무조건 떨어뜨린다. Bullet_t RemainBullet = 0; if (bBulletCheck) { decreaseBullet(pWeapon); - // ѹ߾ ʿ . by sigi. 2002.5.9 + // 한발쓸때마다 저장할 필요 없다. by sigi. 2002.5.9 // pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); RemainBullet = getRemainBullet(pWeapon); } - // , ʽ, ǥ Ѵ. + // 데미지, 투힛 보너스, 좌표와 방향을 구한다. int ToHitBonus = 0; int DamageBonus = 0; int ToHitPenalty = 0; @@ -477,10 +477,10 @@ void MoleShot::ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); Dir_t dir = calcDirection(myX, myY, X, Y); - bool bHit = false; // ѹ̶ ¾Ҵ° ϱ - Damage_t Damage = 0; // ϱ + bool bHit = false; // 한번이라도 맞았는가를 저장하기 위한 변수 + Damage_t Damage = 0; // 마지막으로 입힌 데미지를 저장하기 위한 변수 - // AR̳ SMG 쿡 2 ؼ 4 splash . + // AR이나 SMG일 경우에는 2부터 시작해서 4까지의 splash 데미지를 입힌다. int Splash = 1 + pSkillSlot->getExpLevel() / 30 + 1; if (bManaCheck && bTimeCheck && bRangeCheck && bBulletCheck) { @@ -490,7 +490,7 @@ void MoleShot::ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill SkillOutput output; computeOutput(input, output); - // ƿ´. + // 음수 값이 돌아온다. ToHitPenalty = getPercentValue(pSlayer->getToHit(), output.ToHit); list cList; @@ -524,19 +524,19 @@ void MoleShot::ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill if (!bInvokerCheck && !bRaceCheck && bHitRoll && bPK && bZoneLevelCheck) { bool bCriticalHit = false; - // ؼ Ƽ Ѵ. - // ʽ Ƽ Ƽ ִ. + // 데미지를 계산해서 페널티를 가한다. + // 보너스는 멀티샷 페널티 때문에 음수가 될 수도 있다. Damage = computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); DamagePenalty = getPercentValue(Damage, output.Damage); Damage = max(0, Damage + DamagePenalty + DamageBonus); - // Ÿ ϰ, ÷ Դµ, - // ÷ Ϲ 50%. + // 메인 타겟을 제외하고는, 스플래시 데미지를 입는데, + // 스플래시 데미지는 일반 데미지의 50%다. if (pTargetCreature->getX() != X || pTargetCreature->getY() != Y) { Damage = Damage / 2; } - // ҵ̺ʹ ޸ ũν ī üũ ʴ´. + // 소드웨이브와는 달리 크로스 카운터 체크는 하지 않는다. ObjectID_t targetObjectID = pTargetCreature->getObjectID(); cList.push_back(pTargetCreature); _GCSkillToTileOK1.addCListElement(targetObjectID); @@ -546,12 +546,12 @@ void MoleShot::ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill setDamage(pTargetCreature, Damage, pSlayer, getSkillType(), NULL, &_GCSkillToTileOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, NULL, &_GCSkillToTileOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } - // ̾ ƴ 쿡 ɷ Ѵ. + // 슬레이어가 아닐 경우에만 맞춘 걸로 간주한다. if (!pTargetCreature->isSlayer()) { bHit = true; if (maxEnemyLevel < pTargetCreature->getLevel()) @@ -608,7 +608,7 @@ void MoleShot::ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill pPlayer->sendPacket(&_GCSkillToTileOK1); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; Assert(pTargetCreature != NULL); @@ -625,15 +625,15 @@ void MoleShot::ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // ߸. + // 아이템의 내구력을 떨어뜨린다. decreaseDurability(NULL, pTargetCreature, pSkillInfo, NULL, &_GCSkillToTileOK2); - // Ŷ ش. + // 패킷을 보내준다. Player* pPlayer = pTargetCreature->getPlayer(); Assert(pPlayer != NULL); pPlayer->sendPacket(&_GCSkillToTileOK2); } else if (pTargetCreature->isMonster()) { - // νѴ. + // 당근 적으로 인식한다. Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pSlayer); } diff --git a/src/server/gameserver/skill/MoleShot.h b/src/server/gameserver/skill/MoleShot.h index ce465c45..c5f210ae 100644 --- a/src/server/gameserver/skill/MoleShot.h +++ b/src/server/gameserver/skill/MoleShot.h @@ -36,8 +36,8 @@ class MoleShot : public SkillHandler { void ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID); protected: - POINT m_pSGMask[8]; // SG ũ 谡 . - POINT m_pARMask[8][3]; // AR, SMGũ 谡 ִ. + POINT m_pSGMask[8]; // SG 마스크는 방향과는 관계가 없다. + POINT m_pARMask[8][3]; // AR, SMG마스크는 방향과 관계가 있다. }; // global variable declaration diff --git a/src/server/gameserver/skill/MonsterRangeSkill.cpp b/src/server/gameserver/skill/MonsterRangeSkill.cpp index 465483d9..1eeee791 100644 --- a/src/server/gameserver/skill/MonsterRangeSkill.cpp +++ b/src/server/gameserver/skill/MonsterRangeSkill.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void MonsterRangeSkill::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/MoonlightSever.cpp b/src/server/gameserver/skill/MoonlightSever.cpp index 31b639ff..40eb3dd5 100644 --- a/src/server/gameserver/skill/MoonlightSever.cpp +++ b/src/server/gameserver/skill/MoonlightSever.cpp @@ -9,7 +9,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void MoonlightSever::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/MultiAmputate.cpp b/src/server/gameserver/skill/MultiAmputate.cpp index 72318a4f..39aab0c9 100644 --- a/src/server/gameserver/skill/MultiAmputate.cpp +++ b/src/server/gameserver/skill/MultiAmputate.cpp @@ -13,7 +13,7 @@ #include "SkillUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void MultiAmputate::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -43,7 +43,7 @@ void MultiAmputate::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo Creature* pTargetCreature = pSlayer->getZone()->getCreature(TargetObjectID); bool bRangeCheck = pTargetCreature != NULL && verifyDistance(pSlayer, pTargetCreature, output.Range); - // ȿ Max Range üũѴ. -_-; + // 저 안에서는 Max Range 만 체크한다. -_-; if (!bRangeCheck) { executeSkillFailNormal(pSlayer, param.SkillType, pTargetCreature); return; diff --git a/src/server/gameserver/skill/MultiShot.cpp b/src/server/gameserver/skill/MultiShot.cpp index 53a8f9a0..474dd63a 100644 --- a/src/server/gameserver/skill/MultiShot.cpp +++ b/src/server/gameserver/skill/MultiShot.cpp @@ -16,12 +16,12 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// - ũ ʱȭѴ. +// 생성자 - 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// MultiShot::MultiShot() throw() { __BEGIN_TRY - // SG ũ ׻ + ̴. + // SG 마스크는 방향과는 관계없이 항상 + 모양이다. m_pSGMask[0].set(-1, -1); m_pSGMask[1].set(0, -1); m_pSGMask[2].set(1, -1); @@ -32,17 +32,17 @@ MultiShot::MultiShot() throw() { m_pSGMask[7].set(0, 1); m_pSGMask[8].set(1, 1); - // AR ũ ʱȭŲ. - // SwordWave , SwordWave - // ũ ̿ ˻. MultiShot Ÿ ũ - // ̿ ˻Ѵٴ ؾ Ѵ. + // AR 마스크를 초기화시킨다. + // SwordWave와 비슷하지만, SwordWave는 시전자 주위를 + // 마스크를 이용해 검사하지만. MultiShot은 타겟의 주위를 마스크를 + // 이용해 검사한다는 것을 생각해야 한다. // // (-1,-1)(0,-1)(1,-1) // (-1, 0)(0, 0)(1, 0) // (-1, 1)(0, 1)(1, 1) // - // ⿡ Ÿ ̳ĸ - // ϸ ũ ϱ . + // 각 방향에 따라 어느 타일이 명중 대상이냐를 + // 생각하면 마스크를 이해하기 쉽다. m_pARMask[LEFT][0].set(0, -1); m_pARMask[LEFT][1].set(0, 0); @@ -80,7 +80,7 @@ MultiShot::MultiShot() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void MultiShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -99,17 +99,17 @@ void MultiShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; } - // ų, 迭 Ⱑ ƴϰų, SR̶ - // . + // 아이템이 없거나, 총 계열의 무기가 아니거나, SR이라면 + // 이 기술을 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || !isArmsWeapon(pItem)) - // SR ϰ . by sigi. 2002.12.3 + // SR도 사용 가능하게 수정. by sigi. 2002.12.3 // || pItem->getItemClass() == Item::ITEM_CLASS_SR) { executeSkillFailException(pSlayer, getSkillType()); @@ -121,7 +121,7 @@ void MultiShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p SGexecute(pSlayer, pTargetCreature->getX(), pTargetCreature->getY(), pSkillSlot, CEffectID); } else if (IClass == Item::ITEM_CLASS_AR || IClass == Item::ITEM_CLASS_SMG - // SR ϰ . by sigi. 2002.12.3 + // SR도 사용 가능하게 수정. by sigi. 2002.12.3 || IClass == Item::ITEM_CLASS_SR) { ARSMGexecute(pSlayer, pTargetCreature->getX(), pTargetCreature->getY(), pSkillSlot, CEffectID); } @@ -135,7 +135,7 @@ void MultiShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void MultiShot::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -149,11 +149,11 @@ void MultiShot::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot Zone* pZone = pSlayer->getZone(); Assert(pZone != NULL); - // ų, 迭 Ⱑ ƴϰų, SR̶ - // . + // 아이템이 없거나, 총 계열의 무기가 아니거나, SR이라면 + // 이 기술을 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || !isArmsWeapon(pItem)) - // SR ϰ . by sigi. 2002.12.3 + // SR도 사용 가능하게 수정. by sigi. 2002.12.3 //|| pItem->getItemClass() == Item::ITEM_CLASS_SR) { executeSkillFailException(pSlayer, getSkillType()); @@ -165,7 +165,7 @@ void MultiShot::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot SGexecute(pSlayer, X, Y, pSkillSlot, CEffectID); } else if (IClass == Item::ITEM_CLASS_AR || IClass == Item::ITEM_CLASS_SMG - // SR ϰ . by sigi. 2002.12.3 + // SR도 사용 가능하게 수정. by sigi. 2002.12.3 || IClass == Item::ITEM_CLASS_SR) { ARSMGexecute(pSlayer, X, Y, pSkillSlot, CEffectID); } @@ -177,7 +177,7 @@ void MultiShot::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 - SG +// 슬레이어 타일 핸들러 - SG를 들고 있을 경우 ////////////////////////////////////////////////////////////////////////////// void MultiShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -216,16 +216,16 @@ void MultiShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl bool bRangeCheck = verifyDistance(pSlayer, X, Y, pWeapon->getRange()); bool bBulletCheck = (getRemainBullet(pWeapon) > 0) ? true : false; - // Ѿ ߸. + // 총알 수는 무조건 떨어뜨린다. Bullet_t RemainBullet = 0; if (bBulletCheck) { decreaseBullet(pWeapon); - // ѹ߾ ʿ . by sigi. 2002.5.9 + // 한발쓸때마다 저장할 필요 없다. by sigi. 2002.5.9 // pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); RemainBullet = getRemainBullet(pWeapon); } - // , ʽ, ǥ Ѵ. + // 데미지, 투힛 보너스, 좌표와 방향을 구한다. int ToHitBonus = 0; int DamageBonus = 0; int ToHitPenalty = 0; @@ -233,10 +233,10 @@ void MultiShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); Dir_t dir = calcDirection(myX, myY, X, Y); - bool bHit = false; // ѹ̶ ¾Ҵ° ϱ - Damage_t Damage = 0; // ϱ + bool bHit = false; // 한번이라도 맞았는가를 저장하기 위한 변수 + Damage_t Damage = 0; // 마지막으로 입힌 데미지를 저장하기 위한 변수 - // SG 쿡 4 ؼ 9 splash . + // SG일 경우에는 4부터 시작해서 9까지의 splash 데미지를 입힌다. int Splash = 3 + pSkillSlot->getExpLevel() / 10 + 1; if (bManaCheck && bTimeCheck && bRangeCheck && bBulletCheck) { @@ -246,7 +246,7 @@ void MultiShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl SkillOutput output; computeOutput(input, output); - // output.ToHit ̱ , % ƿ´. + // output.ToHit값이 음수이기 때문에, %값이 음수로 돌아온다. ToHitPenalty = getPercentValue(pSlayer->getToHit(), output.ToHit); list cList; @@ -279,19 +279,19 @@ void MultiShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl if (!bInvokerCheck && !bRaceCheck && bHitRoll && bPK && bZoneLevelCheck) { bool bCriticalHit = false; - // ؼ Ƽ Ѵ. - // ʽ Ƽ Ƽ ִ. + // 데미지를 계산해서 페널티를 가한다. + // 보너스는 멀티샷 페널티 때문에 음수가 될 수도 있다. Damage = computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); DamagePenalty = getPercentValue(Damage, output.Damage); Damage = max(0, Damage + DamagePenalty + DamageBonus); - // Ÿ ϰ, ÷ Դµ, - // ÷ Ϲ 50%. + // 메인 타겟을 제외하고는, 스플래시 데미지를 입는데, + // 스플래시 데미지는 일반 데미지의 50%다. if (pTargetCreature->getX() != X || pTargetCreature->getY() != Y) { Damage = Damage / 2; } - // ҵ̺ʹ ޸ ũν ī üũ ʴ´. + // 소드웨이브와는 달리 크로스 카운터 체크는 하지 않는다. ObjectID_t targetObjectID = pTargetCreature->getObjectID(); cList.push_back(pTargetCreature); _GCSkillToTileOK1.addCListElement(targetObjectID); @@ -303,12 +303,12 @@ void MultiShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl increaseAlignment(pSlayer, pTargetCreature, _GCSkillToTileOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, myX, myY); } - // ̾ ƴ 쿡 hit ɷ Ѵ. + // 슬레이어 아닌 경우에만 hit한 걸로 간주한다. if (!pTargetCreature->isSlayer()) { bHit = true; if (maxEnemyLevel < pTargetCreature->getLevel()) @@ -329,7 +329,7 @@ void MultiShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl _GCSkillToTileOK1.addShortData(MODIFY_BULLET, RemainBullet); - // Ѿ ڸ ̰, Ѿ ڸ ϰ, Ѿ ڸ ߸. + // 총알 숫자를 줄이고, 총알 숫자를 저장하고, 남은 총알 숫자를 받은 다음에 내구력을 떨어뜨린다. decreaseDurability(pSlayer, NULL, pSkillInfo, &_GCSkillToTileOK1, NULL); _GCSkillToTileOK1.setSkillType(getSkillType()); @@ -366,7 +366,7 @@ void MultiShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl pPlayer->sendPacket(&_GCSkillToTileOK1); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; Assert(pTargetCreature != NULL); @@ -385,15 +385,15 @@ void MultiShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // ߸. + // 아이템의 내구력을 떨어뜨린다. decreaseDurability(NULL, pTargetCreature, pSkillInfo, NULL, &_GCSkillToTileOK2); - // Ŷ ش. + // 패킷을 보내준다. Player* pPlayer = pTargetCreature->getPlayer(); Assert(pPlayer != NULL); pPlayer->sendPacket(&_GCSkillToTileOK2); } else if (pTargetCreature->isMonster()) { - // νѴ. + // 당근 적으로 인식한다. Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pSlayer); } @@ -420,7 +420,7 @@ void MultiShot::SGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 - AR̳ SMG +// 슬레이어 타일 핸들러 - AR이나 SMG를 들고 있을 경우 ////////////////////////////////////////////////////////////////////////////// void MultiShot::ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -460,16 +460,16 @@ void MultiShot::ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skil bool bRangeCheck = verifyDistance(pSlayer, X, Y, pWeapon->getRange()); bool bBulletCheck = (getRemainBullet(pWeapon) > 0) ? true : false; - // Ѿ ڴ ߸. + // 총알 숫자는 무조건 떨어뜨린다. Bullet_t RemainBullet = 0; if (bBulletCheck) { decreaseBullet(pWeapon); - // ѹ߾ ʿ . by sigi. 2002.5.9 + // 한발쓸때마다 저장할 필요 없다. by sigi. 2002.5.9 // pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); RemainBullet = getRemainBullet(pWeapon); } - // , ʽ, ǥ Ѵ. + // 데미지, 투힛 보너스, 좌표와 방향을 구한다. int ToHitBonus = 0; int DamageBonus = 0; int ToHitPenalty = 0; @@ -477,10 +477,10 @@ void MultiShot::ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skil ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); Dir_t dir = calcDirection(myX, myY, X, Y); - bool bHit = false; // ѹ̶ ¾Ҵ° ϱ - Damage_t Damage = 0; // ϱ + bool bHit = false; // 한번이라도 맞았는가를 저장하기 위한 변수 + Damage_t Damage = 0; // 마지막으로 입힌 데미지를 저장하기 위한 변수 - // AR̳ SMG 쿡 2 ؼ 4 splash . + // AR이나 SMG일 경우에는 2부터 시작해서 4까지의 splash 데미지를 입힌다. int Splash = 1 + pSkillSlot->getExpLevel() / 30 + 1; if (bManaCheck && bTimeCheck && bRangeCheck && bBulletCheck) { @@ -490,7 +490,7 @@ void MultiShot::ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skil SkillOutput output; computeOutput(input, output); - // ƿ´. + // 음수 값이 돌아온다. ToHitPenalty = getPercentValue(pSlayer->getToHit(), output.ToHit); list cList; @@ -523,19 +523,19 @@ void MultiShot::ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skil if (!bInvokerCheck && !bRaceCheck && bHitRoll && bPK && bZoneLevelCheck) { bool bCriticalHit = false; - // ؼ Ƽ Ѵ. - // ʽ Ƽ Ƽ ִ. + // 데미지를 계산해서 페널티를 가한다. + // 보너스는 멀티샷 페널티 때문에 음수가 될 수도 있다. Damage = computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); DamagePenalty = getPercentValue(Damage, output.Damage); Damage = max(0, Damage + DamagePenalty + DamageBonus); - // Ÿ ϰ, ÷ Դµ, - // ÷ Ϲ 50%. + // 메인 타겟을 제외하고는, 스플래시 데미지를 입는데, + // 스플래시 데미지는 일반 데미지의 50%다. if (pTargetCreature->getX() != X || pTargetCreature->getY() != Y) { Damage = Damage / 2; } - // ҵ̺ʹ ޸ ũν ī üũ ʴ´. + // 소드웨이브와는 달리 크로스 카운터 체크는 하지 않는다. ObjectID_t targetObjectID = pTargetCreature->getObjectID(); cList.push_back(pTargetCreature); _GCSkillToTileOK1.addCListElement(targetObjectID); @@ -545,12 +545,12 @@ void MultiShot::ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skil setDamage(pTargetCreature, Damage, pSlayer, getSkillType(), NULL, &_GCSkillToTileOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, NULL, &_GCSkillToTileOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } - // ̾ ƴ 쿡 ɷ Ѵ. + // 슬레이어가 아닐 경우에만 맞춘 걸로 간주한다. if (!pTargetCreature->isSlayer()) { bHit = true; if (maxEnemyLevel < pTargetCreature->getLevel()) @@ -607,7 +607,7 @@ void MultiShot::ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skil pPlayer->sendPacket(&_GCSkillToTileOK1); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; Assert(pTargetCreature != NULL); @@ -626,15 +626,15 @@ void MultiShot::ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skil _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // ߸. + // 아이템의 내구력을 떨어뜨린다. decreaseDurability(NULL, pTargetCreature, pSkillInfo, NULL, &_GCSkillToTileOK2); - // Ŷ ش. + // 패킷을 보내준다. Player* pPlayer = pTargetCreature->getPlayer(); Assert(pPlayer != NULL); pPlayer->sendPacket(&_GCSkillToTileOK2); } else if (pTargetCreature->isMonster()) { - // νѴ. + // 당근 적으로 인식한다. Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pSlayer); } diff --git a/src/server/gameserver/skill/MultiShot.h b/src/server/gameserver/skill/MultiShot.h index 12efa7b2..c9ce8118 100644 --- a/src/server/gameserver/skill/MultiShot.h +++ b/src/server/gameserver/skill/MultiShot.h @@ -36,8 +36,8 @@ class MultiShot : public SkillHandler { void ARSMGexecute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID); protected: - POINT m_pSGMask[8]; // SG ũ 谡 . - POINT m_pARMask[8][3]; // AR, SMGũ 谡 ִ. + POINT m_pSGMask[8]; // SG 마스크는 방향과는 관계가 없다. + POINT m_pARMask[8][3]; // AR, SMG마스크는 방향과 관계가 있다. }; // global variable declaration diff --git a/src/server/gameserver/skill/MultiThrowingAxe.cpp b/src/server/gameserver/skill/MultiThrowingAxe.cpp index 14bb7406..13234c79 100644 --- a/src/server/gameserver/skill/MultiThrowingAxe.cpp +++ b/src/server/gameserver/skill/MultiThrowingAxe.cpp @@ -17,7 +17,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void MultiThrowingAxe::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -56,23 +56,23 @@ void MultiThrowingAxe::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) ZoneCoord_t tX[3], tY[3]; - // ǥ(3 ) + // 원래 목표(3개중 가운데) X = tX[0] = pMonster->getX() + dirMoveMask[dir].x * 7; Y = tY[0] = pMonster->getY() + dirMoveMask[dir].y * 7; - // ǥ + // 원래 목표의 왼쪽 tX[1] = pMonster->getX() + dirMoveMask[dir2].x * 7; tY[1] = pMonster->getY() + dirMoveMask[dir2].y * 7; - // ǥ + // 원래 목표의 오른쪽 tX[2] = pMonster->getX() + dirMoveMask[dir3].x * 7; tY[2] = pMonster->getY() + dirMoveMask[dir3].y * 7; if (bRangeCheck && bHitRoll && bTileCheck) { - Range_t Range = 1; // ׻ 1̴. + Range_t Range = 1; // 항상 1이다. - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); input.SkillLevel = pMonster->getLevel(); SkillOutput output; @@ -83,7 +83,7 @@ void MultiThrowingAxe::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) continue; Tile& tile = pZone->getTile(tX[i], tY[i]); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectMeteorStrike* pEffect = new EffectMeteorStrike(pZone, tX[i], tY[i]); pEffect->setNextTime(output.Duration); pEffect->setUserObjectID(pMonster->getObjectID()); @@ -95,11 +95,11 @@ void MultiThrowingAxe::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pEffect->setSplashRatio(2, 50); // pEffect->setLevel(pSkillInfo->getLevel()/2); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); } diff --git a/src/server/gameserver/skill/NooseOfWraith.cpp b/src/server/gameserver/skill/NooseOfWraith.cpp index 02b3f296..59c7b7b2 100644 --- a/src/server/gameserver/skill/NooseOfWraith.cpp +++ b/src/server/gameserver/skill/NooseOfWraith.cpp @@ -10,8 +10,8 @@ #include "SimpleTileMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// NooseOfWraith::NooseOfWraith() throw() { __BEGIN_TRY @@ -21,7 +21,7 @@ NooseOfWraith::NooseOfWraith() throw() { ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void NooseOfWraith::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -41,7 +41,7 @@ void NooseOfWraith::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampir Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pVampire, getSkillType()); @@ -60,7 +60,7 @@ void NooseOfWraith::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampir } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void NooseOfWraith::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -101,7 +101,7 @@ void NooseOfWraith::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vam } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void NooseOfWraith::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) diff --git a/src/server/gameserver/skill/NymphRecovery.cpp b/src/server/gameserver/skill/NymphRecovery.cpp index 1b82ef86..8036f580 100644 --- a/src/server/gameserver/skill/NymphRecovery.cpp +++ b/src/server/gameserver/skill/NymphRecovery.cpp @@ -14,7 +14,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void NymphRecovery::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -51,7 +51,7 @@ void NymphRecovery::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ouster Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !pTargetCreature->isOusters()) { executeSkillFailException(pOusters, getSkillType(), Grade); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -78,10 +78,10 @@ void NymphRecovery::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ouster pTargetOusters->getMP(ATTR_MAX) > pTargetOusters->getMP(); if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bSatisfyRequire && bHPCheck) { - // δ. + // 마나를 줄인다. decreaseMana(pOusters, RequiredMP, _GCSkillToObjectOK1); - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; input.TargetType = SkillInput::TARGET_OTHER; @@ -110,7 +110,7 @@ void NymphRecovery::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ouster } } - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); @@ -155,7 +155,7 @@ void NymphRecovery::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ouster } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void NymphRecovery::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -206,7 +206,7 @@ void NymphRecovery::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSl if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bSatisfyRequire && bHPCheck) { decreaseMana(pOusters, RequiredMP, _GCSkillToSelfOK1); - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; input.TargetType = SkillInput::TARGET_SELF; @@ -235,7 +235,7 @@ void NymphRecovery::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSl } } - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. ZoneCoord_t myX = pOusters->getX(); ZoneCoord_t myY = pOusters->getY(); diff --git a/src/server/gameserver/skill/ObservingEye.cpp b/src/server/gameserver/skill/ObservingEye.cpp index 92c405b7..e39d64a4 100644 --- a/src/server/gameserver/skill/ObservingEye.cpp +++ b/src/server/gameserver/skill/ObservingEye.cpp @@ -19,7 +19,7 @@ #include "PacketUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void ObservingEye::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -61,10 +61,10 @@ void ObservingEye::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t C SkillOutput output; computeOutput(input, output); - // Ʈ δ. + // 이펙트를 만들어 붙인다. EffectObservingEye* pEffect = new EffectObservingEye(pSlayer); pEffect->setDeadline(output.Duration); - // output.Damage vision . + // output.Damage를 vision으로 설정하자. pEffect->setDamageBonus(output.Damage * 2 - 1); pEffect->setCriticalHitBonus(output.Damage * 10 - 49); pEffect->setVisionBonus(output.Damage); @@ -73,17 +73,17 @@ void ObservingEye::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t C pSlayer->setFlag(Effect::EFFECT_CLASS_OBSERVING_EYE); pSlayer->addEffect(pEffect); - // Ʈ ν, ̴ δ. + // 이 이펙트가 붙음으로써, 안 보이던 것이 보인다. pZone->updateInvisibleScan(pSlayer); - // Ʈ ٿ, ɷġ Ѵ. + // 이펙트를 붙였으니, 능력치를 재계산한다. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->addModifyInfo(prev, _GCSkillToSelfOK1); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 8, 1, _GCSkillToSelfOK1); diff --git a/src/server/gameserver/skill/OldCureCriticalWounds.cpp b/src/server/gameserver/skill/OldCureCriticalWounds.cpp index 582acb76..eeac5f36 100644 --- a/src/server/gameserver/skill/OldCureCriticalWounds.cpp +++ b/src/server/gameserver/skill/OldCureCriticalWounds.cpp @@ -10,7 +10,7 @@ const uint CriticalBloodDrainLevel = 74; ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void CureCriticalWounds::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -44,7 +44,7 @@ void CureCriticalWounds::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Ski } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void CureCriticalWounds::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/OpenCasket.cpp b/src/server/gameserver/skill/OpenCasket.cpp index 0612adb3..fd0d53d4 100644 --- a/src/server/gameserver/skill/OpenCasket.cpp +++ b/src/server/gameserver/skill/OpenCasket.cpp @@ -16,7 +16,7 @@ #include "HitRoll.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void OpenCasket::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -42,13 +42,13 @@ void OpenCasket::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, SkillType_t SkillType = getSkillType(); // SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // ӿ ִ 츸 ϴ. + // 관 속에 들어있는 경우만 사용 가능하다. bool bEffected = pVampire->isFlag(Effect::EFFECT_CLASS_CASKET); if (bEffected) { // cout << "Open Casket Succeed" << endl; - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectManager* pEffectManager = pVampire->getEffectManager(); Assert(pEffectManager != NULL); @@ -61,7 +61,7 @@ void OpenCasket::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, // pVampire->removeFlag( Effect::EFFECT_CLASS_CASKET ); } - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(0); diff --git a/src/server/gameserver/skill/OustersSkillSlot.cpp b/src/server/gameserver/skill/OustersSkillSlot.cpp index da7edffc..f6fb580f 100644 --- a/src/server/gameserver/skill/OustersSkillSlot.cpp +++ b/src/server/gameserver/skill/OustersSkillSlot.cpp @@ -115,19 +115,19 @@ Turn_t OustersSkillSlot::getRemainTurn(Timeval currentTime) const throw() { } void OustersSkillSlot::setRunTime() throw() { - // ð ޾ƿ´. + // 현재 시간을 받아온다. getCurrentTime(m_runTime); - // ִ ð Ѵ. + // 다음 쓸 수 있는 시간을 세팅한다. m_runTime.tv_sec += m_Interval / 10; m_runTime.tv_usec += (m_Interval % 10) * 100000; } void OustersSkillSlot::setRunTime(Turn_t delay) throw() { - // ð ޾ƿ´. + // 현재 시간을 받아온다. getCurrentTime(m_runTime); - // ִ ð Ѵ. + // 다음 쓸 수 있는 시간을 세팅한다. m_runTime.tv_sec += delay / 10; m_runTime.tv_usec += (delay % 10) * 100000; @@ -149,7 +149,7 @@ void OustersSkillSlot::setRunTime(Turn_t delay) throw() { case SKILL_HOWL: break; default: - save(m_Name); // ޸ ̸ ̺Ѵ. + save(m_Name); // 달리진 딜레이를 세이브한다. break; } } diff --git a/src/server/gameserver/skill/OustersSkillSlot.h b/src/server/gameserver/skill/OustersSkillSlot.h index 96bdbb32..61d239a2 100644 --- a/src/server/gameserver/skill/OustersSkillSlot.h +++ b/src/server/gameserver/skill/OustersSkillSlot.h @@ -69,16 +69,16 @@ class OustersSkillSlot { m_Name = Name; } - // ij Ҷ ð + // 다음 캐스팅이 가능할때까지 남은 시간 Turn_t getRemainTurn(Timeval currentTime) const throw(); private: string m_Name; - SkillType_t m_SkillType; // , - ExpLevel_t m_ExpLevel; // ų - Turn_t m_Interval; // , , - Turn_t m_CastingTime; // ij Ÿ... 0.1 - Timeval m_runTime; // ִ ð + SkillType_t m_SkillType; // 마법, 기술의 종류 + ExpLevel_t m_ExpLevel; // 스킬 레벨 + Turn_t m_Interval; // 마법, 기술의 딜레이, 초 단위 + Turn_t m_CastingTime; // 캐스팅 타임... 0.1초 단위 + Timeval m_runTime; // 다음에 쓸 수 있는 시간 }; #endif // __OUSTERS_SKILL_SLOT_H__ diff --git a/src/server/gameserver/skill/Paralyze.cpp b/src/server/gameserver/skill/Paralyze.cpp index e139db8f..6cd295c1 100644 --- a/src/server/gameserver/skill/Paralyze.cpp +++ b/src/server/gameserver/skill/Paralyze.cpp @@ -25,7 +25,7 @@ #include "Vampire.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Paralyze::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -47,9 +47,9 @@ void Paralyze::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil Creature* pTargetCreature = pZone->getCreature(TargetObjectID); SkillType_t SkillType = pVampireSkillSlot->getSkillType(); - // NPC . - // 鿪̰ų. by sigi. 2002.9.13 - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // 면역이거나. by sigi. 2002.9.13 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_PARALYZE) || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); @@ -66,7 +66,7 @@ void Paralyze::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // Knowledge of Curse ִٸ hit bonus 10 + // Knowledge of Curse 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_CURSE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_CURSE); @@ -105,7 +105,7 @@ void Paralyze::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil SkillOutput output; computeOutput(input, output); - // Wisdom of Silence ִٸ ӽð 20% + // Wisdom of Silence 이 있다면 지속시간 20% 증가 if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_WISDOM_OF_SILENCE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_WISDOM_OF_SILENCE); Assert(pRankBonus != NULL); @@ -113,7 +113,7 @@ void Paralyze::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil output.Duration += getPercentValue(output.Duration, pRankBonus->getPoint()); } - // pTargetCreature ָ ݻϴ + // pTargetCreature가 저주마법을 반사하는 경우 if (CheckReflection(pVampire, pTargetCreature, getSkillType())) { pTargetCreature = (Creature*)pVampire; TargetObjectID = pVampire->getObjectID(); @@ -127,7 +127,7 @@ void Paralyze::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil if (output.Duration < 20) output.Duration = 20; - // Ʈ Ʈ ؼ δ. + // 이펙트 오브젝트를 생성해서 붙인다. EffectParalyze* pEffectParalyze = new EffectParalyze(pTargetCreature); pEffectParalyze->setLevel(pSkillInfo->getLevel() / 2); // pEffectParalyze->setDefensePenalty(output.Damage); @@ -141,8 +141,8 @@ void Paralyze::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil pEffect->setDeadline(0); } - // ֿ ɸ 潺 . - // 潺 Ƽ . 2002.05.09 - by bezz + // 저주에 걸리면 디펜스가 떨어진다. + // 디펜스 페널티가 없어짐. 2002.05.09 - by bezz /* if (pTargetCreature->isSlayer()) { Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); @@ -166,7 +166,7 @@ void Paralyze::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil } else Assert(false); */ - // Ʈ پٴ εijش. + // 이펙트가 붙었다는 것을 브로드캐스팅해준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_PARALYZE); @@ -198,10 +198,10 @@ void Paralyze::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil _GCSkillToObjectOK6.setSkillType(SkillType); _GCSkillToObjectOK6.setDuration(output.Duration); - if (bCanSeeCaster) // 10 ġ. + if (bCanSeeCaster) // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); - } else // 10 ġ. + } else // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK6, &_GCSkillToObjectOK1); } @@ -244,7 +244,7 @@ void Paralyze::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Paralyze::execute(Monster* pMonster, Creature* pEnemy) @@ -272,7 +272,7 @@ void Paralyze::execute(Monster* pMonster, Creature* pEnemy) if (pMonster->isMaster()) { int x = pMonster->getX(); int y = pMonster->getY(); - int Splash = 3 + rand() % 5; // 3~7 + int Splash = 3 + rand() % 5; // 3~7 마리 int range = 2; // 5x5 list creatureList; getSplashVictims(pMonster->getZone(), x, y, Creature::CREATURE_CLASS_MAX, creatureList, Splash, range); @@ -334,7 +334,7 @@ void Paralyze::executeMonster(Zone* pZone, Monster* pMonster, Creature* pEnemy) SkillOutput output; computeOutput(input, output); - // pTargetCreature ָ ݻϴ + // pTargetCreature가 저주마법을 반사하는 경우 if (CheckReflection(pMonster, pEnemy, getSkillType())) { pEnemy = (Creature*)pMonster; } @@ -347,7 +347,7 @@ void Paralyze::executeMonster(Zone* pZone, Monster* pMonster, Creature* pEnemy) if (output.Duration < 20) output.Duration = 20; - // Ʈ Ʈ ؼ δ. + // 이펙트 오브젝트를 생성해서 붙인다. EffectParalyze* pEffectParalyze = new EffectParalyze(pEnemy); pEffectParalyze->setLevel(pSkillInfo->getLevel() / 2); // pEffectParalyze->setDefensePenalty(output.Damage); @@ -355,7 +355,7 @@ void Paralyze::executeMonster(Zone* pZone, Monster* pMonster, Creature* pEnemy) pEnemy->addEffect(pEffectParalyze); pEnemy->setFlag(Effect::EFFECT_CLASS_PARALYZE); - // ֿ ɸ 潺 . + // 저주에 걸리면 디펜스가 떨어진다. if (pEnemy->isSlayer()) { Slayer* pTargetSlayer = dynamic_cast(pEnemy); SLAYER_RECORD prev; @@ -380,7 +380,7 @@ void Paralyze::executeMonster(Zone* pZone, Monster* pMonster, Creature* pEnemy) } else Assert(false); - // Ʈ پٴ εijش. + // 이펙트가 붙었다는 것을 브로드캐스팅해준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pEnemy->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_PARALYZE); diff --git a/src/server/gameserver/skill/PassingHeal.cpp b/src/server/gameserver/skill/PassingHeal.cpp index 03261a71..e28c586f 100644 --- a/src/server/gameserver/skill/PassingHeal.cpp +++ b/src/server/gameserver/skill/PassingHeal.cpp @@ -15,7 +15,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void PassingHeal::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -36,7 +36,7 @@ void PassingHeal::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !pTargetCreature->isSlayer()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -59,20 +59,20 @@ void PassingHeal::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* bool bEffected = pTargetCreature->isFlag(Effect::EFFECT_CLASS_PASSING_HEAL); if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { - // δ. + // 마나를 줄인다. decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToObjectOK1); - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; input.TargetType = SkillInput::TARGET_OTHER; computeOutput(input, output); - // Ʈ ؼ δ. + // 이펙트를 생성해서 붙인다. EffectPassingHeal* pPassingHeal = new EffectPassingHeal(pTargetCreature); Assert(pPassingHeal != NULL); pPassingHeal->setNextTime(output.Duration); @@ -82,7 +82,7 @@ void PassingHeal::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pTargetCreature->addEffect(pPassingHeal); pTargetCreature->setFlag(Effect::EFFECT_CLASS_PASSING_HEAL); - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); @@ -112,7 +112,7 @@ void PassingHeal::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCSkillToObjectOK5, cList); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_PASSING_HEAL); @@ -133,7 +133,7 @@ void PassingHeal::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void PassingHeal::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -166,18 +166,18 @@ void PassingHeal::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; input.TargetType = SkillInput::TARGET_SELF; computeOutput(input, output); - // Ʈ ؼ δ + // 이펙트를 생성해서 붙인다 EffectPassingHeal* pPassingHeal = new EffectPassingHeal(pSlayer); pPassingHeal->setBroadcastingEffect(false); pPassingHeal->setNextTime(5); @@ -187,7 +187,7 @@ void PassingHeal::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE pSlayer->addEffect(pPassingHeal); pSlayer->setFlag(Effect::EFFECT_CLASS_PASSING_HEAL); - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); @@ -202,7 +202,7 @@ void PassingHeal::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(myX, myY, &_GCSkillToSelfOK2, pSlayer); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pSlayer->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_PASSING_HEAL); diff --git a/src/server/gameserver/skill/Peace.cpp b/src/server/gameserver/skill/Peace.cpp index 8f6c7c61..f4b381cf 100644 --- a/src/server/gameserver/skill/Peace.cpp +++ b/src/server/gameserver/skill/Peace.cpp @@ -17,7 +17,7 @@ ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Peace::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -49,7 +49,7 @@ void Peace::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkil } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Peace::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -156,33 +156,33 @@ void Peace::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pS Creature* pTargetCreature = (*itr); Assert(pTargetCreature != NULL); - // 츸 üũѴ. - // ̾ ʹ ߿ ܽѾѴ. + // 몬스터인 경우만 체크한다. + // 뱀파이어 마스터는 나중에 제외시켜야한다. if (pTargetCreature->isMonster()) { Monster* pMonster = dynamic_cast(pTargetCreature); Assert(pMonster != NULL); - // ְ, ̹ Peace ɸ 찡 ƴ 쿡 Ǵ. + // 살아있고, 이미 Peace에 걸린 경우가 아닌 경우에 마법 건다. if (pMonster->isAlive() && !pMonster->isFlag(Effect::EFFECT_CLASS_PEACE)) { bool bHitRoll = HitRoll::isSuccessMagic(pSlayer, pSkillInfo, pSkillSlot); if (bHitRoll) { - // pMonster pSlayer ʴ Effect + // pMonster가 pSlayer를 먼저 공격하지 않는 Effect EffectPeace* pEffectPeace = new EffectPeace(pMonster, pSlayer->getObjectID()); - // pEffectAftermath->setDeadline(150+pSlayer->getINT()); // (15+INT/10)*10 - pEffectPeace->setDeadline(duration); // 150+pSlayer->getINT()); // (15+INT/10)*10 + // pEffectAftermath->setDeadline(150+pSlayer->getINT()); // (15+INT/10)초*10 + pEffectPeace->setDeadline(duration); // 150+pSlayer->getINT()); // (15+INT/10)초*10 pMonster->addEffect(pEffectPeace); pMonster->setFlag(Effect::EFFECT_CLASS_PEACE); - // ̹ ִ .. + // 이미 때리고 있는 경우라면 제거.. pMonster->deleteEnemy(pSlayer->getObjectID()); - // cout << pMonster->getName().c_str() << " Peace ɾ." << endl; + // cout << pMonster->getName().c_str() << "에게 Peace 걸었다." << endl; // cList.push_back(pMonster); bSuccess = true; - // Ÿ list Ŷ ߰Ѵ. + // 타겟 list를 패킷에 추가한다. _GCSkillToTileOK1.addCListElement(pMonster->getObjectID()); _GCSkillToTileOK2.addCListElement(pMonster->getObjectID()); @@ -198,10 +198,10 @@ void Peace::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pS } if (bSuccess) { - // ؾ ߸. + // 성공해야 마나를 떨어뜨린다. decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1); - // ġ ÷ش. (ϴ detect hidden ܾ. -_-;) + // 경험치를 올려준다. (일단 detect hidden에서 긁었다. -_-;) SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1) * 2; @@ -252,8 +252,8 @@ void Peace::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pS // cList.push_back(pSlayer); - // ޴ 鿡 Ŷ Ѵ. - // Ͷ - -; + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. + // 몬스터라서 없다 - -; /* for(list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { @@ -276,12 +276,12 @@ void Peace::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pS _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // Ŷ ش. + // 패킷을 보내준다. Player* pPlayer = pTargetCreature->getPlayer(); Assert(pPlayer != NULL); pPlayer->sendPacket(&_GCSkillToTileOK2); - // HP εijѴ. + // HP를 브로드캐스팅한다. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pTargetCreature->getObjectID()); gcStatusCurrentHP.setCurrentHP (targetHP); diff --git a/src/server/gameserver/skill/PenetrateWheel.cpp b/src/server/gameserver/skill/PenetrateWheel.cpp index e124b68b..5fed97bb 100644 --- a/src/server/gameserver/skill/PenetrateWheel.cpp +++ b/src/server/gameserver/skill/PenetrateWheel.cpp @@ -19,7 +19,7 @@ #include "SimpleTileMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void PenetrateWheel::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -40,8 +40,8 @@ void PenetrateWheel::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ouste // Assert(pTargetCreature != NULL); - // NPC . - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || !canAttack(pOusters, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType(), 0); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; diff --git a/src/server/gameserver/skill/Piercing.cpp b/src/server/gameserver/skill/Piercing.cpp index 2a8e7335..9e36021a 100644 --- a/src/server/gameserver/skill/Piercing.cpp +++ b/src/server/gameserver/skill/Piercing.cpp @@ -16,7 +16,7 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Piercing::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -32,7 +32,7 @@ void Piercing::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS Zone* pZone = pSlayer->getZone(); Creature* pTargetCreature = pZone->getCreature(TargetObjectID); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -49,7 +49,7 @@ void Piercing::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Piercing::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -68,8 +68,8 @@ void Piercing::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ NULL̰ų, 迭 ƴ϶ . - // 迭 ߿ SG . + // 무장하고 있는 무기가 NULL이거나, 총 계열이 아니라면 사용할 수 없다. + // 총 계열 중에서도 SG는 이 기술을 사용할 수 없다. Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL || !isArmsWeapon(pWeapon) || pWeapon->getItemClass() == Item::ITEM_CLASS_SG) { executeSkillFailException(pSlayer, getSkillType()); @@ -90,11 +90,11 @@ void Piercing::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* SkillDomainType_t DomainType = pSkillInfo->getDomainType(); Level_t SkillLevel = pSkillSlot->getExpLevel(); - // ѿ Ѿ ִٸ... + // 총에 총알이 남아있다면... if (getRemainBullet(pWeapon) > 0) { - // Ѿ ڸ ߸. + // 제일 먼저 총알 숫자를 떨어뜨린다. decreaseBullet(pWeapon); - // ѹ߾ ʿ . by sigi. 2002.5.9 + // 한발쓸때마다 저장할 필요 없다. by sigi. 2002.5.9 // pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); Bullet_t RemainBullet = getRemainBullet(pWeapon); @@ -104,10 +104,10 @@ void Piercing::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* bool bRangeCheck = verifyDistance(pSlayer, X, Y, pWeapon->getRange()); if (bManaCheck && bTimeCheck && bRangeCheck) { - // MP ߸. + // MP를 떨어뜨린다. decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1); - // ǥ Ѵ. + // 좌표와 방향을 구한다. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); Dir_t dir = calcDirection(myX, myY, X, Y); @@ -115,7 +115,7 @@ void Piercing::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* list ptList; getPointsFromLineEx(myX, myY, X, Y, pWeapon->getRange(), ptList); - // , ӽð Ѵ. + // 데미지, 지속시간 등을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); @@ -138,9 +138,9 @@ void Piercing::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* int tileX = (*ptitr).x; int tileY = (*ptitr).y; - // ̰, 밡 ƴ϶ Ȯ ִ. + // 존 내부이고, 안전지대가 아니라면 맞을 확률이 있다. if (rect.ptInRect(tileX, tileY)) { - // Ÿ ޾ƿ´. + // 타일을 받아온다. Tile& tile = pZone->getTile(tileX, tileY); list targetList; @@ -162,7 +162,7 @@ void Piercing::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* Creature* pTargetCreature = (*itr); Assert(pTargetCreature != NULL); - // 迭 ִ. + // 총 계열 기술은 땅 속을 제외한 나머지를 공격할 수가 있다. bool bMoveModeCheck = (pTargetCreature->getMoveMode() == Creature::MOVE_MODE_BURROWING) ? false : true; bool bRaceCheck = pTargetCreature->isNPC() || pTargetCreature->isSlayer(); @@ -174,7 +174,7 @@ void Piercing::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* if (bMoveModeCheck && !bRaceCheck && bHitRoll && bCanHit && bPK && bZoneLevelCheck && !pTargetCreature->isFlag( - Effect::EFFECT_CLASS_COMA)) // ɸ ¾ƾ ȴ. -_-; 2003.3.14 + Effect::EFFECT_CLASS_COMA)) // 죽은 애한테 걸리면 안 맞아야 된다. -_-; 2003.3.14 { bool bCriticalHit = false; @@ -189,18 +189,18 @@ void Piercing::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* _GCSkillToTileOK4.addCListElement(targetObjectID); _GCSkillToTileOK5.addCListElement(targetObjectID); - // ϴ ´ Ŷ · ä, ش. + // 일단 맞는 놈이 받을 패킷은 널 상태로 한 채로, 데미지를 준다. setDamage(pTargetCreature, Damage, pSlayer, SkillType, NULL, &_GCSkillToTileOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, NULL, &_GCSkillToTileOK1); increaseAlignment(pSlayer, pTargetCreature, _GCSkillToTileOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } - // ̾ ƴ 쿡 ɷ Ѵ. + // 슬레이어가 아닐 경우에만 맞춘 걸로 간주한다. if (!pTargetCreature->isSlayer()) { bHit = true; if (maxEnemyLevel < pTargetCreature->getLevel()) @@ -221,7 +221,7 @@ void Piercing::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* } } - // ߸. + // 공격자의 아이템 내구도를 떨어뜨린다. decreaseDurability(pSlayer, NULL, pSkillInfo, &_GCSkillToTileOK1, NULL); _GCSkillToTileOK1.setSkillType(SkillType); @@ -259,7 +259,7 @@ void Piercing::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pPlayer->sendPacket(&_GCSkillToTileOK1); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; Assert(pTargetCreature != NULL); @@ -267,7 +267,7 @@ void Piercing::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* if (pTargetCreature->isPC()) { _GCSkillToTileOK2.clearList(); - // HP Ŷ Ѵ. + // HP의 변경사항을 패킷에다 기록한다. HP_t targetHP = 0; if (pTargetCreature->isSlayer()) targetHP = (dynamic_cast(pTargetCreature))->getHP(ATTR_CURRENT); @@ -277,13 +277,13 @@ void Piercing::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* targetHP = (dynamic_cast(pTargetCreature))->getHP(ATTR_CURRENT); _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // ߸. + // 아이템의 내구력을 떨어뜨린다. decreaseDurability(NULL, pTargetCreature, pSkillInfo, NULL, &_GCSkillToTileOK2); - // Ŷ ش. + // 패킷을 보내준다. pTargetCreature->getPlayer()->sendPacket(&_GCSkillToTileOK2); } else if (pTargetCreature->isMonster()) { - // νѴ. + // 당근 적으로 인식한다. Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pSlayer); } diff --git a/src/server/gameserver/skill/PlasmaRocketLauncher.cpp b/src/server/gameserver/skill/PlasmaRocketLauncher.cpp index 1c5420d2..3fb288a4 100644 --- a/src/server/gameserver/skill/PlasmaRocketLauncher.cpp +++ b/src/server/gameserver/skill/PlasmaRocketLauncher.cpp @@ -16,7 +16,7 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void PlasmaRocketLauncher::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -38,14 +38,14 @@ void PlasmaRocketLauncher::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, S Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature)) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; return; } - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; input.Range = getDistance(pSlayer->getX(), pSlayer->getY(), pTargetCreature->getX(), pTargetCreature->getY()); @@ -65,7 +65,7 @@ void PlasmaRocketLauncher::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, S SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); SkillDomainType_t DomainType = pSkillInfo->getDomainType(); - // Ƽ Ѵ. + // 페널티 값을 계산한다. int ToHitPenalty = getPercentValue(pSlayer->getToHit(), output.ToHit); bool bIncreaseDomainExp = pSlayer->isRealWearingEx(Slayer::WEAR_RIGHTHAND); @@ -85,18 +85,18 @@ void PlasmaRocketLauncher::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, S if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bPK && bBulletCheck) { printf("check OK\n"); - // δ. + // 마나를 줄인다. decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); // Bullet_t RemainBullet = 0; decreaseBullet(pWeapon); - // ѹ߾ ʿ . by sigi. 2002.5.9 + // 한발쓸때마다 저장할 필요 없다. by sigi. 2002.5.9 // pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); // RemainBullet = getRemainBullet(pWeapon); if (!pTargetCreature->isSlayer()) { - // ġ ÷ش. + // 경험치를 올려준다. // SkillGrade Grade = // g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = // 10* (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToObjectOK1); @@ -109,7 +109,7 @@ void PlasmaRocketLauncher::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, S increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToObjectOK1); } - // Ʈ ؼ δ. + // 이펙트를 생성해서 붙인다. EffectPlasmaRocketLauncher* pEffect = new EffectPlasmaRocketLauncher(pTargetCreature); Assert(pEffect != NULL); pEffect->setNextTime(output.Duration); @@ -119,7 +119,7 @@ void PlasmaRocketLauncher::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, S pTargetCreature->addEffect(pEffect); pTargetCreature->setFlag(Effect::EFFECT_CLASS_PLASMA_ROCKET_LAUNCHER); - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); @@ -153,7 +153,7 @@ void PlasmaRocketLauncher::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, S pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCSkillToObjectOK5, cList); - // // Ʈ پٰ ˷ش. + // // 이펙트가 붙었다고 알려준다. // GCAddEffect gcAddEffect; // gcAddEffect.setObjectID(pTargetCreature->getObjectID()); // gcAddEffect.setEffectID(Effect::EFFECT_CLASS_PLASMA_ROCKET_LAUNCHER); diff --git a/src/server/gameserver/skill/PlayingWithFire.cpp b/src/server/gameserver/skill/PlayingWithFire.cpp index b82cc8ed..957af52e 100644 --- a/src/server/gameserver/skill/PlayingWithFire.cpp +++ b/src/server/gameserver/skill/PlayingWithFire.cpp @@ -11,13 +11,13 @@ ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// PlayingWithFire::PlayingWithFire() throw() { __BEGIN_TRY - // 8Ÿ + // 주위 8타일 m_pPlayingWithFireMask[0].set(1, 1); m_pPlayingWithFireMask[1].set(-1, -1); m_pPlayingWithFireMask[2].set(0, -1); @@ -31,7 +31,7 @@ PlayingWithFire::PlayingWithFire() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 뱀파이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// /* void PlayingWithFire::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -74,7 +74,7 @@ void PlayingWithFire::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, C { decreaseMana(pVampire, RequiredMP, _GCSkillToSelfOK1); - // ̾ ϱ Ŷ . + // 뱀파이어를 땅 위에서 삭제하기 이전에 기술 패킷들을 날린다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(0); @@ -86,12 +86,12 @@ void PlayingWithFire::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, C pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(x, y, &_GCSkillToSelfOK2, pVampire); - // ִ ̾ ϶ ˸. + // 땅 위에 나와있는 뱀파이어 삭제하라고 알린다. GCDeleteObject gcDO; gcDO.setObjectID(pVampire->getObjectID()); pZone->broadcastPacket(x, y, &gcDO, pVampire); - // ӿٰ ̾ ߰Ѵ. + // 땅 속에다가 뱀파이어를 추가한다. addBurrowingCreature(pZone, pVampire, x, y); pSkillSlot->setRunTime(); @@ -114,7 +114,7 @@ void PlayingWithFire::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, C */ ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void PlayingWithFire::execute(Monster* pMonster) @@ -147,7 +147,7 @@ void PlayingWithFire::execute(Monster* pMonster) if (bRangeCheck && bMoveModeCheck) { //-------------------------------------------------------- - // Critical Ground ̰ Ѵ. + // Critical Ground 기술을 보이게 한다. //-------------------------------------------------------- //_GCSkillToSelfOK2.setObjectID(pMonster->getObjectID()); //_GCSkillToSelfOK2.setDuration(0); @@ -156,7 +156,7 @@ void PlayingWithFire::execute(Monster* pMonster) //-------------------------------------------------------- - // knockbackǴ¸´ ֵ üũش. + // 주위에 knockback되는맞는 애들을 체크해준다. //-------------------------------------------------------- SkillInput input(pMonster); SkillOutput output; @@ -186,7 +186,7 @@ void PlayingWithFire::execute(Monster* pMonster) param.addMask(i, j, 100); - // ´ ֵ knockback Ų. + // 강제로 맞는 애들을 knockback 시킨다. bool bForceKnockback = true; g_SimpleTileMeleeSkill.execute(pMonster, x, y, param, result, 0, bForceKnockback); } else { diff --git a/src/server/gameserver/skill/PleasureExplosion.cpp b/src/server/gameserver/skill/PleasureExplosion.cpp index 18af7460..415c9068 100644 --- a/src/server/gameserver/skill/PleasureExplosion.cpp +++ b/src/server/gameserver/skill/PleasureExplosion.cpp @@ -17,8 +17,8 @@ #include "Tile.h" ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// PleasureExplosion::PleasureExplosion() throw() { __BEGIN_TRY @@ -27,7 +27,7 @@ PleasureExplosion::PleasureExplosion() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void PleasureExplosion::execute(Monster* pMonster) diff --git a/src/server/gameserver/skill/PoisonMesh.cpp b/src/server/gameserver/skill/PoisonMesh.cpp index 1382b429..c9e2ec42 100644 --- a/src/server/gameserver/skill/PoisonMesh.cpp +++ b/src/server/gameserver/skill/PoisonMesh.cpp @@ -23,7 +23,7 @@ #include "Vampire.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void PoisonMesh::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -45,9 +45,9 @@ void PoisonMesh::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); SkillType_t SkillType = pVampireSkillSlot->getSkillType(); - // NPC . - // 鿪̰ų. by sigi. 2002.9.13 - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // 면역이거나. by sigi. 2002.9.13 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -88,7 +88,7 @@ void PoisonMesh::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk bool bCanSeeCaster = canSee(pTargetCreature, pVampire); - /* // pTargetCreature ָ ݻϴ + /* // pTargetCreature가 저주마법을 반사하는 경우 if (CheckReflection(pVampire, pTargetCreature, getSkillType())) { pTargetCreature = (Creature*)pVampire; @@ -96,7 +96,7 @@ void PoisonMesh::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk } */ - // Ʈ Ʈ ؼ δ. + // 이펙트 오브젝트를 생성해서 붙인다. EffectPoisonMesh* pEffectPoisonMesh = new EffectPoisonMesh(pTargetCreature); pEffectPoisonMesh->setDeadline(output.Duration); pEffectPoisonMesh->setNextTime(0); @@ -105,7 +105,7 @@ void PoisonMesh::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk pTargetCreature->addEffect(pEffectPoisonMesh); pTargetCreature->setFlag(Effect::EFFECT_CLASS_POISON_MESH); - // Ʈ پٴ εijش. + // 이펙트가 붙었다는 것을 브로드캐스팅해준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_POISON_MESH); @@ -137,10 +137,10 @@ void PoisonMesh::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk _GCSkillToObjectOK6.setSkillType(SkillType); _GCSkillToObjectOK6.setDuration(output.Duration); - if (bCanSeeCaster) // 10 ġ. + if (bCanSeeCaster) // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); - } else // 10 ġ. + } else // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK6, &_GCSkillToObjectOK1); } diff --git a/src/server/gameserver/skill/PoisonStorm.cpp b/src/server/gameserver/skill/PoisonStorm.cpp index 3490b27a..016282c4 100644 --- a/src/server/gameserver/skill/PoisonStorm.cpp +++ b/src/server/gameserver/skill/PoisonStorm.cpp @@ -18,7 +18,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void PoisonStorm::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -39,7 +39,7 @@ void PoisonStorm::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); @@ -58,7 +58,7 @@ void PoisonStorm::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void PoisonStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -88,7 +88,7 @@ void PoisonStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi ZoneCoord_t myX = pVampire->getX(); ZoneCoord_t myY = pVampire->getY(); - // Knowledge of Poison ִٸ hit bonus 10 + // Knowledge of Poison 이 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_POISON)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_POISON); @@ -121,7 +121,7 @@ void PoisonStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi SkillOutput output; computeOutput(input, output); - // Disruption Storm ִٸ 20% + // Disruption Storm 이 있다면 데미지 20% 증가 if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_DISRUPTION_STORM)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_DISRUPTION_STORM); Assert(pRankBonus != NULL); @@ -131,7 +131,7 @@ void PoisonStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi Range_t Range = 3; - // Ʈ ŸϿ ִٸ Ѵ. + // 기존에 같은 이펙트가 타일에 있다면 지우고 새로 설정한다. Tile& tile = pZone->getTile(X, Y); Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_POISON_STORM); if (pOldEffect != NULL) { @@ -139,7 +139,7 @@ void PoisonStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi pZone->deleteEffect(effectID); } - // Ʈ Ʈ ؼ ŸϿ δ. + // 이펙트 오브젝트를 생성해서 타일에 붙인다. EffectPoisonStorm* pEffect = new EffectPoisonStorm(pZone, X, Y); pEffect->setDeadline(output.Duration); pEffect->setNextTime(0); @@ -159,9 +159,9 @@ void PoisonStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi tile.addEffect(pEffect); - // Ʈ Creature effect ٿش. - // Vampire VampireԴ - // ش ʴ´. + // 이펙트 범위내의 모든 Creature에게 effect를 붙여준다. + // Vampire가 기술을 사용한 경우 같은 Vampire에게는 + // 해당하지 않는다. bool bEffected = false; Creature* pTargetCreature; @@ -172,7 +172,7 @@ void PoisonStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi int oX, oY; int edge = 1; - // Wide Storm ִٸ 5*5 . skill type Ѵ. + // Wide Storm 이 있다면 범위가 5*5 로 수정. skill type 을 수정한다. if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_WIDE_STORM)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_WIDE_STORM); Assert(pRankBonus != NULL); @@ -188,13 +188,13 @@ void PoisonStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi int tileX = X + oX; int tileY = Y + oY; - // Ʈ ߰Ϸ Zone ʴٸ Ѿ. + // 만약 이펙트를 추가하려는 곳이 Zone에 속해 있지 않다면 넘어간다. if (!rect.ptInRect(tileX, tileY)) continue; Tile& tile = pZone->getTile(tileX, tileY); - // ش ŸϿ Ʈ ߰ ٸ Ѿ. + // 해당 타일에 이펙트를 추가할 수 없다면 넘어간다. if (!tile.canAddEffect()) continue; @@ -221,7 +221,7 @@ void PoisonStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi cList.push_back(pTargetCreature); if (bCanSee) { - // + // 공격을 당한 사람에게 _GCSkillToTileOK2.setObjectID(pVampire->getObjectID()); _GCSkillToTileOK2.setSkillType(SkillType); _GCSkillToTileOK2.setX(X); @@ -236,14 +236,14 @@ void PoisonStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pVampire); - // ְ ̾ Ѵ. by sigi. 2002.6.21 + // 마지막 때린 애가 뱀파이어라고 설정한다. by sigi. 2002.6.21 pMonster->setLastHitCreatureClass(Creature::CREATURE_CLASS_VAMPIRE); } } } // if(pTargetCreature!= NULL) } - // 鿡 + // 기술을 사용한 사람들에게 _GCSkillToTileOK1.setSkillType(SkillType); _GCSkillToTileOK1.setCEffectID(CEffectID); _GCSkillToTileOK1.setX(X); @@ -251,19 +251,19 @@ void PoisonStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi _GCSkillToTileOK1.setDuration(output.Duration); _GCSkillToTileOK1.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(X); _GCSkillToTileOK3.setY(Y); - // ִ 鿡 + // 기술을 당한 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람과 당한 사람을 모두 볼 수 있는 사람들에게 _GCSkillToTileOK5.setObjectID(pVampire->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); @@ -271,19 +271,19 @@ void PoisonStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); - // packet + // 기술을 사용한 사람에게 packet 전달 pPlayer->sendPacket(&_GCSkillToTileOK1); - // ִ 鿡 broadcasing + // 기술을 쓸 사람과 당한 사람을 모두 볼 수 있는 사람들에게 broadcasing cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); - // ִ 鿡 broadcasting + // 기술을 쓴 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); - // ִ 鿡 broadcasting + // 기술을 당한 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); - // delay setting + // 기술 delay setting pVampireSkillSlot->setRunTime(output.Delay); } else { executeSkillFailNormal(pVampire, getSkillType(), NULL); @@ -298,7 +298,7 @@ void PoisonStorm::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampi } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void PoisonStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -345,7 +345,7 @@ void PoisonStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) Range_t Range = 3; - // Ʈ ŸϿ ִٸ Ѵ. + // 기존에 같은 이펙트가 타일에 있다면 지우고 새로 설정한다. Tile& tile = pZone->getTile(X, Y); Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_POISON_STORM); if (pOldEffect != NULL) { @@ -353,7 +353,7 @@ void PoisonStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pZone->deleteEffect(effectID); } - // Ʈ Ʈ ؼ ŸϿ δ. + // 이펙트 오브젝트를 생성해서 타일에 붙인다. EffectPoisonStorm* pEffect = new EffectPoisonStorm(pZone, X, Y); pEffect->setDeadline(output.Duration); pEffect->setNextTime(0); @@ -372,9 +372,9 @@ void PoisonStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) tile.addEffect(pEffect); - // Ʈ Creature effect ٿش. - // Vampire VampireԴ - // ش ʴ´. + // 이펙트 범위내의 모든 Creature에게 effect를 붙여준다. + // Vampire가 기술을 사용한 경우 같은 Vampire에게는 + // 해당하지 않는다. bool bEffected = false; Creature* pTargetCreature; @@ -420,7 +420,7 @@ void PoisonStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) cList.push_back(pTargetCreature); if (bCanSee) { - // + // 공격을 당한 사람에게 _GCSkillToTileOK2.setObjectID(pMonster->getObjectID()); _GCSkillToTileOK2.setSkillType(SkillType); _GCSkillToTileOK2.setX(X); @@ -439,19 +439,19 @@ void PoisonStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) } // if(pTargetCreature!= NULL) } - // ִ 鿡 + // 기술을 쓴 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(myX); _GCSkillToTileOK3.setY(myY); - // ִ 鿡 + // 기술을 당한 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람과 당한 사람을 모두 볼 수 있는 사람들에게 _GCSkillToTileOK5.setObjectID(pMonster->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); @@ -459,13 +459,13 @@ void PoisonStorm::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); - // ִ 鿡 broadcasing + // 기술을 쓸 사람과 당한 사람을 모두 볼 수 있는 사람들에게 broadcasing cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); - // ִ 鿡 broadcasting + // 기술을 쓴 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); - // ִ 鿡 broadcasting + // 기술을 당한 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); } else { diff --git a/src/server/gameserver/skill/PoisonStrike.cpp b/src/server/gameserver/skill/PoisonStrike.cpp index 3299562c..ff61f2a1 100644 --- a/src/server/gameserver/skill/PoisonStrike.cpp +++ b/src/server/gameserver/skill/PoisonStrike.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void PoisonStrike::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -38,7 +38,7 @@ void PoisonStrike::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire SIMPLE_SKILL_OUTPUT result; - // Knowledge of Poison ִٸ hit bonus 10 + // Knowledge of Poison 이 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_POISON)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_POISON); @@ -55,7 +55,7 @@ void PoisonStrike::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void PoisonStrike::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/PoisonousHands.cpp b/src/server/gameserver/skill/PoisonousHands.cpp index bf052589..03ff213e 100644 --- a/src/server/gameserver/skill/PoisonousHands.cpp +++ b/src/server/gameserver/skill/PoisonousHands.cpp @@ -10,7 +10,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void PoisonousHands::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -38,7 +38,7 @@ void PoisonousHands::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampi SIMPLE_SKILL_OUTPUT result; - // Tiger Nail ִٸ 10% + // Tiger Nail 이 있다면 데미지 10% 증가 if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_TIGER_NAIL)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_TIGER_NAIL); Assert(pRankBonus != NULL); @@ -46,7 +46,7 @@ void PoisonousHands::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampi param.SkillDamage += getPercentValue(param.SkillDamage, pRankBonus->getPoint()); } - // Knowledge of Poison ִٸ hit bonus 10 + // Knowledge of Poison 이 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_POISON)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_POISON); @@ -63,7 +63,7 @@ void PoisonousHands::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampi } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void PoisonousHands::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/PotentialExplosion.cpp b/src/server/gameserver/skill/PotentialExplosion.cpp index ebc5bdc0..f03e0dd7 100644 --- a/src/server/gameserver/skill/PotentialExplosion.cpp +++ b/src/server/gameserver/skill/PotentialExplosion.cpp @@ -14,7 +14,7 @@ #include "PacketUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void PotentialExplosion::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -34,7 +34,7 @@ void PotentialExplosion::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffect Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 도가 아니라면 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_BLADE) { executeSkillFailException(pSlayer, getSkillType()); @@ -65,7 +65,7 @@ void PotentialExplosion::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffect SkillOutput output; computeOutput(input, output); - // HP ݺ ణ ö󰣴. + // HP가 반보다 작을 때는 약간 더 올라간다. // by sigi. 2002.12.3 if (pSlayer->getHP(ATTR_CURRENT) < (pSlayer->getHP(ATTR_MAX) / 2)) { // output.Damage += 4; @@ -84,21 +84,21 @@ void PotentialExplosion::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffect pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_POTENTIAL_EXPLOSION); - // ̷ Ͽ ٲ ɷġ . + // 이로 인하여 바뀌는 능력치를 보낸다. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 8, 1, 1, _GCSkillToSelfOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1); // increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); - // Ŷ ش. + // 패킷을 보내준다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(output.Duration); @@ -110,7 +110,7 @@ void PotentialExplosion::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffect pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(X, Y, &_GCSkillToSelfOK2, pSlayer); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pSlayer->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_POTENTIAL_EXPLOSION); diff --git a/src/server/gameserver/skill/PowerOfLand.cpp b/src/server/gameserver/skill/PowerOfLand.cpp index 46d804a1..273d9d11 100644 --- a/src/server/gameserver/skill/PowerOfLand.cpp +++ b/src/server/gameserver/skill/PowerOfLand.cpp @@ -17,7 +17,7 @@ #include "GCSkillToTileOK6.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void PowerOfLand::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,7 +37,7 @@ void PowerOfLand::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); @@ -56,8 +56,8 @@ void PowerOfLand::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 -// ̾ Wide Lightning Skill Tile ϴ Handler +// 슬레이어 타일 핸들러 +// 슬레이어가 Wide Lightning Skill을 Tile에 사용했을때 사용하는 Handler ////////////////////////////////////////////////////////////////////////////// void PowerOfLand::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -91,8 +91,8 @@ void PowerOfLand::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl bool bTimeCheck = verifyRunTime(pSkillSlot); bool bRangeCheck = verifyDistance(pSlayer, X, Y, pSkillInfo->getRange()); - // ϴ ϴ ϰ Ҷ(EffectTileStorm::affect()) - // ũ ٽ ϴ ɷ Ѵ. + // 일단 기술은 성공하는 것으로 하고 데미지를 계산할때(EffectTileStorm::affect()) + // 크리쳐 별로 다신 계산하는 걸로 한다. // 2003.1.8 by bezz // bool bHitRoll = HitRoll::isSuccessMagic(pSlayer, pSkillInfo, pSkillSlot); @@ -128,7 +128,7 @@ void PowerOfLand::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl pZone->addEffect(pEffect); tile.addEffect(pEffect); - // 鿡 + // 기술을 사용한 사람들에게 _GCSkillToTileOK1.setSkillType(SkillType); _GCSkillToTileOK1.setCEffectID(CEffectID); _GCSkillToTileOK1.setX(X); @@ -136,21 +136,21 @@ void PowerOfLand::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl _GCSkillToTileOK1.setDuration(output.Duration); _GCSkillToTileOK1.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK3.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(X); _GCSkillToTileOK3.setY(Y); //_GCSkillToTileOK3.setRange(Range); - // ִ 鿡 + // 기술을 당한 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람과 당한 사람을 모두 볼 수 있는 사람들에게 _GCSkillToTileOK5.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); @@ -158,23 +158,23 @@ void PowerOfLand::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); - // packet + // 기술을 사용한 사람에게 packet 전달 pPlayer->sendPacket(&_GCSkillToTileOK1); - // ִ 鿡 broadcasing - // broadcasting 5OK Ѵ. - // ⿡ ϵ broadcasting ܵȴ. + // 기술을 쓸 사람과 당한 사람을 모두 볼 수 있는 사람들에게 broadcasing + // broadcasting후 5번OK를 받은 사람을 기록한다. + // 여기에 기록된 사람은 차후 broadcasting에서 제외된다. list cList; cList.push_back(pSlayer); cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); - // ִ 鿡 broadcasting + // 기술을 쓴 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); - // ִ 鿡 broadcasting + // 기술을 당한 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); - // delay setting + // 기술 delay setting pSkillSlot->setRunTime(output.Delay); } else { diff --git a/src/server/gameserver/skill/Prominence.cpp b/src/server/gameserver/skill/Prominence.cpp index 6ddf0619..8ffdaeb9 100644 --- a/src/server/gameserver/skill/Prominence.cpp +++ b/src/server/gameserver/skill/Prominence.cpp @@ -17,7 +17,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Prominence::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -46,8 +46,8 @@ void Prominence::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSk // Assert(pTargetCreature != NULL); - // NPC . - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || !canAttack(pOusters, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType(), Grade); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -66,7 +66,7 @@ void Prominence::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSk } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ÿ ڵ鷯 +// 아우스터즈 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void Prominence::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -111,7 +111,7 @@ void Prominence::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster SkillType_t SkillType = pOustersSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); @@ -145,7 +145,7 @@ void Prominence::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster if (!tile.canAddEffect()) continue; - // ӽ ׶ ߰ Ѵ. + // 머시 그라운드 있음 추가 못한당. if (tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL) continue; if (tile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION) != NULL) @@ -156,7 +156,7 @@ void Prominence::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster continue; - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_PROMINENCE); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); @@ -165,7 +165,7 @@ void Prominence::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster checkMine(pZone, oX, oY); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectProminence* pEffect = new EffectProminence(pZone, oX, oY); pEffect->setUserObjectID(pOusters->getObjectID()); pEffect->setDeadline(output.Duration); @@ -182,11 +182,11 @@ void Prominence::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster pEffect->setSendEffectClass(Effect::EFFECT_CLASS_PROMINENCE_3); } - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); diff --git a/src/server/gameserver/skill/ProtectionFromAcid.cpp b/src/server/gameserver/skill/ProtectionFromAcid.cpp index ce291ebd..653c6afc 100644 --- a/src/server/gameserver/skill/ProtectionFromAcid.cpp +++ b/src/server/gameserver/skill/ProtectionFromAcid.cpp @@ -15,7 +15,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ProtectionFromAcid::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,7 +37,7 @@ void ProtectionFromAcid::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Ski Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !pTargetCreature->isSlayer()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -60,23 +60,23 @@ void ProtectionFromAcid::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Ski bool bEffected = pTargetCreature->isFlag(Effect::EFFECT_CLASS_PROTECTION_FROM_ACID); if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { - // δ. + // 마나를 줄인다. decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToObjectOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToObjectOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToObjectOK1); - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; input.TargetType = SkillInput::TARGET_OTHER; computeOutput(input, output); - // Ʈ ؼ δ. + // 이펙트를 생성해서 붙인다. EffectProtectionFromAcid* pEPFP = new EffectProtectionFromAcid(pTargetCreature); Assert(pEPFP != NULL); pEPFP->setDeadline(output.Duration); @@ -95,7 +95,7 @@ void ProtectionFromAcid::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Ski Assert(false); } - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); @@ -125,7 +125,7 @@ void ProtectionFromAcid::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Ski pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCSkillToObjectOK5, cList); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_PROTECTION_FROM_ACID); @@ -146,7 +146,7 @@ void ProtectionFromAcid::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Ski } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void ProtectionFromAcid::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -179,20 +179,20 @@ void ProtectionFromAcid::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffect if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; input.TargetType = SkillInput::TARGET_SELF; computeOutput(input, output); - // Ʈ ؼ δ + // 이펙트를 생성해서 붙인다 EffectProtectionFromAcid* pEPFP = new EffectProtectionFromAcid(pSlayer); pEPFP->setDeadline(output.Duration); pEPFP->setResist(output.Damage); @@ -204,7 +204,7 @@ void ProtectionFromAcid::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffect pSlayer->initAllStat(); pSlayer->addModifyInfo(prev, _GCSkillToSelfOK1); - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); @@ -219,7 +219,7 @@ void ProtectionFromAcid::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffect pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(myX, myY, &_GCSkillToSelfOK2, pSlayer); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pSlayer->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_PROTECTION_FROM_ACID); diff --git a/src/server/gameserver/skill/ProtectionFromBlood.cpp b/src/server/gameserver/skill/ProtectionFromBlood.cpp index 01486de8..7ab01d11 100644 --- a/src/server/gameserver/skill/ProtectionFromBlood.cpp +++ b/src/server/gameserver/skill/ProtectionFromBlood.cpp @@ -15,7 +15,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ProtectionFromBlood::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,7 +37,7 @@ void ProtectionFromBlood::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !pTargetCreature->isSlayer()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -60,23 +60,23 @@ void ProtectionFromBlood::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk bool bEffected = pTargetCreature->isFlag(Effect::EFFECT_CLASS_PROTECTION_FROM_BLOOD); if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { - // δ. + // 마나를 줄인다. decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToObjectOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToObjectOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToObjectOK1); - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; input.TargetType = SkillInput::TARGET_OTHER; computeOutput(input, output); - // Ʈ ؼ δ. + // 이펙트를 생성해서 붙인다. EffectProtectionFromBlood* pEPFP = new EffectProtectionFromBlood(pTargetCreature); Assert(pEPFP != NULL); pEPFP->setDeadline(output.Duration); @@ -95,7 +95,7 @@ void ProtectionFromBlood::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk Assert(false); } - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); @@ -125,7 +125,7 @@ void ProtectionFromBlood::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCSkillToObjectOK5, cList); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_PROTECTION_FROM_BLOOD); @@ -146,7 +146,7 @@ void ProtectionFromBlood::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void ProtectionFromBlood::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -179,20 +179,20 @@ void ProtectionFromBlood::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffec if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; input.TargetType = SkillInput::TARGET_SELF; computeOutput(input, output); - // Ʈ ؼ δ + // 이펙트를 생성해서 붙인다 EffectProtectionFromBlood* pEPFP = new EffectProtectionFromBlood(pSlayer); pEPFP->setDeadline(output.Duration); pEPFP->setResist(output.Damage); @@ -204,7 +204,7 @@ void ProtectionFromBlood::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffec pSlayer->initAllStat(); pSlayer->addModifyInfo(prev, _GCSkillToSelfOK1); - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); @@ -219,7 +219,7 @@ void ProtectionFromBlood::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffec pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(myX, myY, &_GCSkillToSelfOK2, pSlayer); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pSlayer->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_PROTECTION_FROM_BLOOD); diff --git a/src/server/gameserver/skill/ProtectionFromCurse.cpp b/src/server/gameserver/skill/ProtectionFromCurse.cpp index c4385a8b..6a795868 100644 --- a/src/server/gameserver/skill/ProtectionFromCurse.cpp +++ b/src/server/gameserver/skill/ProtectionFromCurse.cpp @@ -15,7 +15,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ProtectionFromCurse::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,8 +37,8 @@ void ProtectionFromCurse::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC한테 써줄 수는 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !pTargetCreature->isSlayer()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -61,23 +61,23 @@ void ProtectionFromCurse::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk bool bEffected = pTargetCreature->isFlag(Effect::EFFECT_CLASS_PROTECTION_FROM_CURSE); if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { - // δ. + // 마나를 줄인다. decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToObjectOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToObjectOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToObjectOK1); - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; input.TargetType = SkillInput::TARGET_OTHER; computeOutput(input, output); - // Ʈ ؼ δ. + // 이펙트를 생성해서 붙인다. EffectProtectionFromCurse* pEPFP = new EffectProtectionFromCurse(pTargetCreature); Assert(pEPFP != NULL); pEPFP->setDeadline(output.Duration); @@ -96,7 +96,7 @@ void ProtectionFromCurse::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk Assert(false); } - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); @@ -126,7 +126,7 @@ void ProtectionFromCurse::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCSkillToObjectOK5, cList); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_PROTECTION_FROM_CURSE); @@ -147,7 +147,7 @@ void ProtectionFromCurse::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void ProtectionFromCurse::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -180,20 +180,20 @@ void ProtectionFromCurse::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffec if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; input.TargetType = SkillInput::TARGET_SELF; computeOutput(input, output); - // Ʈ ؼ δ + // 이펙트를 생성해서 붙인다 EffectProtectionFromCurse* pEPFP = new EffectProtectionFromCurse(pSlayer); pEPFP->setDeadline(output.Duration); pEPFP->setResist(output.Damage); @@ -205,7 +205,7 @@ void ProtectionFromCurse::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffec pSlayer->initAllStat(); pSlayer->addModifyInfo(prev, _GCSkillToSelfOK1); - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); @@ -220,7 +220,7 @@ void ProtectionFromCurse::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffec pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(myX, myY, &_GCSkillToSelfOK2, pSlayer); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pSlayer->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_PROTECTION_FROM_CURSE); diff --git a/src/server/gameserver/skill/ProtectionFromPoison.cpp b/src/server/gameserver/skill/ProtectionFromPoison.cpp index 0dc5f23b..b8ab5289 100644 --- a/src/server/gameserver/skill/ProtectionFromPoison.cpp +++ b/src/server/gameserver/skill/ProtectionFromPoison.cpp @@ -15,7 +15,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ProtectionFromPoison::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,8 +37,8 @@ void ProtectionFromPoison::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, S Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC한테 써줄 수는 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !pTargetCreature->isSlayer()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -61,23 +61,23 @@ void ProtectionFromPoison::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, S bool bEffected = pTargetCreature->isFlag(Effect::EFFECT_CLASS_PROTECTION_FROM_POISON); if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { - // δ. + // 마나를 줄인다. decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToObjectOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToObjectOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToObjectOK1); - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; input.TargetType = SkillInput::TARGET_OTHER; computeOutput(input, output); - // Ʈ ؼ δ. + // 이펙트를 생성해서 붙인다. EffectProtectionFromPoison* pEPFP = new EffectProtectionFromPoison(pTargetCreature); Assert(pEPFP != NULL); pEPFP->setDeadline(output.Duration); @@ -96,7 +96,7 @@ void ProtectionFromPoison::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, S Assert(false); } - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); @@ -126,7 +126,7 @@ void ProtectionFromPoison::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, S pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCSkillToObjectOK5, cList); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_PROTECTION_FROM_POISON); @@ -147,7 +147,7 @@ void ProtectionFromPoison::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, S } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void ProtectionFromPoison::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -180,20 +180,20 @@ void ProtectionFromPoison::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffe if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; input.TargetType = SkillInput::TARGET_OTHER; computeOutput(input, output); - // Ʈ ؼ δ + // 이펙트를 생성해서 붙인다 EffectProtectionFromPoison* pEPFP = new EffectProtectionFromPoison(pSlayer); pEPFP->setDeadline(output.Duration); pEPFP->setResist(output.Damage); @@ -205,7 +205,7 @@ void ProtectionFromPoison::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffe pSlayer->initAllStat(); pSlayer->addModifyInfo(prev, _GCSkillToSelfOK1); - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); @@ -220,7 +220,7 @@ void ProtectionFromPoison::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffe pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(myX, myY, &_GCSkillToSelfOK2, pSlayer); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pSlayer->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_PROTECTION_FROM_POISON); diff --git a/src/server/gameserver/skill/Purify.cpp b/src/server/gameserver/skill/Purify.cpp index c9d79e86..1060a33c 100644 --- a/src/server/gameserver/skill/Purify.cpp +++ b/src/server/gameserver/skill/Purify.cpp @@ -17,7 +17,7 @@ #include "ZoneUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Purify::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -36,7 +36,7 @@ void Purify::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSki Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -54,7 +54,7 @@ void Purify::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSki } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 슬레이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void Purify::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -110,7 +110,7 @@ void Purify::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* p Range_t Range = output.Range; int oX = 0, oY = 0; - list cList; // ϴ е list + list cList; // 당하는 분들 list for (oY = -Range; oY <= Range; oY++) { for (oX = -Range; oX <= Range; oX++) { int tileX = X + oX; @@ -119,7 +119,7 @@ void Purify::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* p if (rect.ptInRect(tileX, tileY)) { Tile& tile = pZone->getTile(tileX, tileY); - // ŸϿ ӿ ִ ũİ Ѵٸ... + // 현재 타일에 땅 속에 있는 크리쳐가 존재한다면... if (tile.hasCreature(Creature::MOVE_MODE_BURROWING)) { Creature* pTargetCreature = tile.getCreature(Creature::MOVE_MODE_BURROWING); Assert(pTargetCreature != NULL); @@ -141,7 +141,7 @@ void Purify::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* p UnBurrow = true; if (UnBurrow) { - // ӿ  Ʈ ߰Ѵ. + // 땅속에서 끄집어내진 놈들 리스트에 추가한다. cList.push_back(pTargetCreature); ObjectID_t targetObjectID = pTargetCreature->getObjectID(); @@ -150,7 +150,7 @@ void Purify::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* p _GCSkillToTileOK2.addCListElement(targetObjectID); _GCSkillToTileOK5.addCListElement(targetObjectID); - // ӿ ִ , ش. + // 땅 속에 들어있는 놈을 꺼내어, 데미지를 준다. addUnburrowCreature(pZone, pTargetCreature, tileX, tileY, pTargetCreature->getDir()); setDamage(pTargetCreature, Damage, pSlayer, SkillType, &_GCSkillToTileOK2, &_GCSkillToTileOK1); @@ -160,7 +160,7 @@ void Purify::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* p } } - // ġ ø. + // 경험치를 올린다. Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToTileOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToTileOK1); @@ -200,7 +200,7 @@ void Purify::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* p _GCSkillToTileOK5.setRange(Range); _GCSkillToTileOK5.setDuration(0); - // ӿ  鿡 ü Ҵٴ ˷Ѵ. + // 땅 속에서 끄집어내진 놈들에게 체력이 닳았다는 것을 알려줘야한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; diff --git a/src/server/gameserver/skill/QuickFire.cpp b/src/server/gameserver/skill/QuickFire.cpp index 12abc8ca..b9199c64 100644 --- a/src/server/gameserver/skill/QuickFire.cpp +++ b/src/server/gameserver/skill/QuickFire.cpp @@ -14,7 +14,7 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ +// 슬레이어 오브젝트 ////////////////////////////////////////////////////////////////////////////// void QuickFire::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -35,7 +35,7 @@ void QuickFire::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -48,9 +48,9 @@ void QuickFire::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p GCAttackArmsOK4 _GCAttackArmsOK4; GCAttackArmsOK5 _GCAttackArmsOK5; - // ִ Ⱑ ų, 迭 Ⱑ ƴ϶ . - // 迭 ߿ SG SR QuickFire . - // SG, SR ִ. + // 들고 있는 무기가 없거나, 총 계열 무기가 아니라면 기술을 쓸 수 없다. + // 총 계열 무기 중에서도 SG나 SR은 QuickFire를 쓸 수가 없다. + // SG, SR 도 이제 쓸 수 있다. // 2003. 1. 14 by bezz Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL || isArmsWeapon(pWeapon) == false) @@ -73,7 +73,7 @@ void QuickFire::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p SkillOutput output; computeOutput(input, output); - // Ƽ Ѵ. + // 페널티 값을 계산한다. int ToHitPenalty = getPercentValue(pSlayer->getToHit(), output.ToHit); int RequiredMP = (int)pSkillInfo->getConsumeMP(); @@ -84,12 +84,12 @@ void QuickFire::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p bool bHitRoll = HitRoll::isSuccess(pSlayer, pTargetCreature, ToHitPenalty); bool bPK = verifyPK(pSlayer, pTargetCreature); - // Ѿ ڴ ߸. + // 총알 숫자는 무조건 떨어뜨린다. Bullet_t RemainBullet = 0; if (bBulletCheck) { - // Ѿ ڸ ߸, ϰ, Ѿ ڸ ޾ƿ´. + // 총알 숫자를 떨어뜨리고, 저장하고, 남은 총알 숫자를 받아온다. decreaseBullet(pWeapon); - // ѹ߾ ʿ . by sigi. 2002.5.9 + // 한발쓸때마다 저장할 필요 없다. by sigi. 2002.5.9 // pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); RemainBullet = getRemainBullet(pWeapon); } @@ -103,26 +103,26 @@ void QuickFire::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p bool bCriticalHit = false; - // ϰ, quickfire Ƽ Ѵ. - // output.Damage ̱ , % ϸ ᱹ ȴ. + // 데미지를 계산하고, quickfire 페널티를 가한다. + // output.Damage가 음수이기 때문에, %값을 구해 더하면 결국 빼는 것이 된다. int Damage = computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); Damage += getPercentValue(Damage, output.Damage); Damage = max(0, Damage); // cout << "QuickFireDamage:" << Damage << endl; - // Ѵ. + // 데미지를 세팅한다. setDamage(pTargetCreature, Damage, pSlayer, SkillType, &_GCAttackArmsOK2, &_GCAttackArmsOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCAttackArmsOK2, &_GCAttackArmsOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } /* - // 80% Ȯθ ɷġ Ѵ. - // ̾ ƴ 쿡 ġ Ѵ. + // 80% 확률로만 능력치가 상승한다. + // 상대방이 슬레이어가 아닐 경우에만 경험치가 상승한다. if (Random(1, 100) < 80 && !pTargetCreature->isSlayer()) { */ @@ -150,7 +150,7 @@ void QuickFire::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p pMonster->addEnemy(pSlayer); } - // ڿ Ʈ. + // 공격자와 상대의 아이템 내구성 떨어트림. decreaseDurability(pSlayer, pTargetCreature, NULL, &_GCAttackArmsOK1, &_GCAttackArmsOK2); ZoneCoord_t targetX = pTargetCreature->getX(); @@ -211,7 +211,7 @@ void QuickFire::execute(Monster* pMonster, Creature* pEnemy) Zone* pZone = pMonster->getZone(); Assert(pZone != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pEnemy == NULL || pEnemy->isNPC()) { // cout << "WrongEnemy" << endl; executeSkillFailNormalWithGun(pMonster, getSkillType(), pEnemy, RemainBullet); @@ -230,7 +230,7 @@ void QuickFire::execute(Monster* pMonster, Creature* pEnemy) SkillOutput output; computeOutput(input, output); - // Ƽ Ѵ. + // 페널티 값을 계산한다. int ToHitPenalty = getPercentValue(pMonster->getToHit(), output.ToHit); bool bRangeCheck = verifyDistance(pMonster, pEnemy, pSkillInfo->getRange()); @@ -243,19 +243,19 @@ void QuickFire::execute(Monster* pMonster, Creature* pEnemy) bool bCriticalHit = false; - // ϰ, quickfire Ƽ Ѵ. - // output.Damage ̱ , % ϸ ᱹ ȴ. + // 데미지를 계산하고, quickfire 페널티를 가한다. + // output.Damage가 음수이기 때문에, %값을 구해 더하면 결국 빼는 것이 된다. int Damage = computeDamage(pMonster, pEnemy, 0, bCriticalHit); Damage += getPercentValue(Damage, output.Damage); Damage = max(0, Damage); // cout << "QuickFireDamage:" << Damage << endl; - // Ѵ. + // 데미지를 세팅한다. setDamage(pEnemy, Damage, pMonster, SkillType, &_GCAttackArmsOK2); // computeAlignmentChange(pEnemy, Damage, pMonster, &_GCAttackArmsOK2, &_GCAttackArmsOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pEnemy, pMonster->getX(), pMonster->getY()); } @@ -272,7 +272,7 @@ void QuickFire::execute(Monster* pMonster, Creature* pEnemy) pOtherMonster->addEnemy(pMonster); } - // ڿ Ʈ. + // 공격자와 상대의 아이템 내구성 떨어트림. decreaseDurability(pMonster, pEnemy, NULL, NULL, &_GCAttackArmsOK2); ZoneCoord_t targetX = pEnemy->getX(); diff --git a/src/server/gameserver/skill/RainbowSlasher.cpp b/src/server/gameserver/skill/RainbowSlasher.cpp index 535b5dc6..28c3b29f 100644 --- a/src/server/gameserver/skill/RainbowSlasher.cpp +++ b/src/server/gameserver/skill/RainbowSlasher.cpp @@ -9,7 +9,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void RainbowSlasher::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/RapidFreeze.cpp b/src/server/gameserver/skill/RapidFreeze.cpp index 63c10a79..838335a8 100644 --- a/src/server/gameserver/skill/RapidFreeze.cpp +++ b/src/server/gameserver/skill/RapidFreeze.cpp @@ -17,7 +17,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void RapidFreeze::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -38,8 +38,8 @@ void RapidFreeze::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersS // Assert(pTargetCreature != NULL); - // NPC . - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || !canAttack(pOusters, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType(), 0); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -58,7 +58,7 @@ void RapidFreeze::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersS } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ÿ ڵ鷯 +// 아우스터즈 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void RapidFreeze::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -95,7 +95,7 @@ void RapidFreeze::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouste SkillType_t SkillType = pOustersSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); @@ -120,7 +120,7 @@ void RapidFreeze::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouste Tile& tile = pZone->getTile(X, Y); - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_Rapid_Freeze); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); @@ -129,7 +129,7 @@ void RapidFreeze::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouste checkMine(pZone, X, Y); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectRapidFreeze* pEffect = new EffectRapidFreeze(pZone, X, Y); pEffect->setUserObjectID(pOusters->getObjectID()); pEffect->setDeadline(output.Duration); @@ -138,11 +138,11 @@ void RapidFreeze::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouste pEffect->setDamage(output.Damage); pEffect->setBroadcastingEffect(false); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); diff --git a/src/server/gameserver/skill/RapidGliding.cpp b/src/server/gameserver/skill/RapidGliding.cpp index 0f3d28bc..066a3364 100644 --- a/src/server/gameserver/skill/RapidGliding.cpp +++ b/src/server/gameserver/skill/RapidGliding.cpp @@ -12,7 +12,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void RapidGliding::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -32,8 +32,8 @@ void RapidGliding::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp SkillType_t SkillType = pVampireSkillSlot->getSkillType(); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 - // NPC . + // NoSuch제거. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. // bool bIncreaseDomainExp = pVampire->isRealWearingEx(Vampire::WEAR_RIGHTHAND); GCSkillToTileOK1 _GCSkillToTileOK1; @@ -59,7 +59,7 @@ void RapidGliding::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp bool bPassLine = isPassLine(pZone, pVampire->getX(), pVampire->getY(), X, Y); if (bManaCheck && bTimeCheck && bRangeCheck && !bEffected && bPassLine) { - // PC ش. + // 빠르게 PC를 움직여준다. if (pZone->moveFastPC(pVampire, pVampire->getX(), pVampire->getY(), X, Y, getSkillType())) { decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); @@ -77,10 +77,10 @@ void RapidGliding::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp _GCSkillToTileOK5.setRange(0); _GCSkillToTileOK5.setDuration(0); - // ڽſ ٲ HP ˷ش. + // 자신에게 바뀐 HP를 알려준다. pPlayer->sendPacket(&_GCSkillToTileOK1); - // HP ٲٰ ˸. + // 주위에 HP가 바꼈다고 알린다. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pVampire->getObjectID()); gcStatusCurrentHP.setCurrentHP(pVampire->getHP()); @@ -104,7 +104,7 @@ void RapidGliding::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp __END_CATCH } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void RapidGliding::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -127,8 +127,8 @@ void RapidGliding::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire // SkillType_t SkillType = pVampireSkillSlot->getSkillType(); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 - // NPC . + // NoSuch제거. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. if (pTargetCreature == NULL) { executeSkillFailException(pVampire, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -154,7 +154,7 @@ void RapidGliding::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire if (bManaCheck && bTimeCheck && bRangeCheck && !bEffected ) { - // PC ش. + // 빠르게 PC를 움직여준다. if (pZone->moveFastPC(pVampire, pVampire->getX(), pVampire->getY(), pTargetCreature->getX(), pTargetCreature->getY())) { @@ -162,10 +162,10 @@ void RapidGliding::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampire decreaseMana(pVampire, RequiredMP, gcMI); - // ڽſ ٲ HP ˷ش. + // 자신에게 바뀐 HP를 알려준다. pPlayer->sendPacket( &gcMI ); - // HP ٲٰ ˸. + // 주위에 HP가 바꼈다고 알린다. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pVampire->getObjectID()); gcStatusCurrentHP.setCurrentHP(pVampire->getHP()); diff --git a/src/server/gameserver/skill/ReactiveArmor.cpp b/src/server/gameserver/skill/ReactiveArmor.cpp index 6297d5d7..bd03a55b 100644 --- a/src/server/gameserver/skill/ReactiveArmor.cpp +++ b/src/server/gameserver/skill/ReactiveArmor.cpp @@ -18,7 +18,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void ReactiveArmor::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -63,7 +63,7 @@ void ReactiveArmor::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSl if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bSatisfyRequire) { decreaseMana(pOusters, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); @@ -78,7 +78,7 @@ void ReactiveArmor::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSl grade = 4; } - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectReactiveArmor* pEffect = new EffectReactiveArmor(pOusters); pEffect->setDeadline(output.Duration); pEffect->setBonus(output.Damage); @@ -145,9 +145,9 @@ void ReactiveArmor::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ouster Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // 鿪. by sigi. 2002.9.13 - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수 없다. + // 저주 면역. by sigi. 2002.9.13 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !pTargetCreature->isOusters()) { executeSkillFailException(pOusters, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -193,7 +193,7 @@ void ReactiveArmor::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ouster damageReduce = 20 + pMastery->getExpLevel(); } - // Ʈ Ʈ δ. + // 이펙트 오브젝트를 생성해 붙인다. EffectReactiveArmor* pEffect = new EffectReactiveArmor(pTargetCreature); pEffect->setDeadline(output.Duration); pEffect->setBonus(output.Damage); diff --git a/src/server/gameserver/skill/Rebuke.cpp b/src/server/gameserver/skill/Rebuke.cpp index 5a280bd0..c98d1124 100644 --- a/src/server/gameserver/skill/Rebuke.cpp +++ b/src/server/gameserver/skill/Rebuke.cpp @@ -13,7 +13,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Rebuke::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -52,7 +52,7 @@ void Rebuke::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffect if (bManaCheck && bTimeCheck && bRangeCheck) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); @@ -93,9 +93,9 @@ void Rebuke::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffect Creature* pTargetCreature = (*itr); Assert(pTargetCreature != NULL); - // üũ + // 안전지대 체크 // 2003.1.10 by bezz, Sequoia - // NPC üũ + // NPC도 체크 // 2003.3.14 by Sequoia if (pTargetCreature->isNPC() || !checkZoneLevelToHitTarget(pTargetCreature) || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isFlag(Effect::EFFECT_CLASS_COMA)) @@ -103,7 +103,7 @@ void Rebuke::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffect if (HitRoll::isSuccessRebuke(pSlayer, pSkillSlot, pTargetCreature)) { HP_t RemainHP = 0; - // ´ ְ HP Ѵ. + // 맞는 넘한테 데미지를 주고 남은 HP 를 구한다. if (pTargetCreature->isVampire()) { GCModifyInformation gcMI; setDamage(pTargetCreature, output.Damage, pSlayer, SkillType, &gcMI); @@ -118,14 +118,14 @@ void Rebuke::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffect RemainHP = pMonster->getHP(ATTR_CURRENT); } - // ̹ SLEEP Ʈ ɷ ɷִ Ʈ Ѵ. + // 이미 SLEEP 이펙트가 걸려있으면 먼저 걸려있던 이펙트를 삭제한다. if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_SLEEP)) { pTargetCreature->deleteEffect(Effect::EFFECT_CLASS_SLEEP); } EffectSleep* pEffect = new EffectSleep(pTargetCreature); - // ´ SLEEP Ʈ ɾش. + // 맞는 넘한테 SLEEP 이펙트를 걸어준다. pEffect->setDeadline(output.Duration); pTargetCreature->addEffect(pEffect); pTargetCreature->setFlag(Effect::EFFECT_CLASS_SLEEP); @@ -138,8 +138,8 @@ void Rebuke::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffect bHit = true; - // ø. - // Ÿ ̸̾ հ ִ. + // 성향을 올린다. + // 타겟이 슬레이어이면 먼가 문제가 있다. if (!pTargetCreature->isSlayer()) { // increaseAlignment( pSlayer, pTargetCreature, &_GCSkillToSelfOK1 ); if (maxEnemyLevel < pTargetCreature->getLevel()) @@ -150,7 +150,7 @@ void Rebuke::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffect } } - // ġ ø. + // 경험치를 올린다. if (bHit) { SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); diff --git a/src/server/gameserver/skill/Rediance.cpp b/src/server/gameserver/skill/Rediance.cpp index edecab83..61637674 100644 --- a/src/server/gameserver/skill/Rediance.cpp +++ b/src/server/gameserver/skill/Rediance.cpp @@ -13,7 +13,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ +// 슬레이어 셀프 ////////////////////////////////////////////////////////////////////////////// void Rediance::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -32,7 +32,7 @@ void Rediance::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffe Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 검이 아니라면 기술을 쓸 수 없다. Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL || pWeapon->getItemClass() != Item::ITEM_CLASS_SWORD) { executeSkillFailException(pSlayer, getSkillType()); @@ -66,21 +66,21 @@ void Rediance::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffe SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectRediance* pEffect = new EffectRediance(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setDexBonus(output.Damage); pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_REDIANCE); - // ̷ Ͽ ٲ ɷġ . + // 이로 인하여 바뀌는 능력치를 보낸다. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->sendModifyInfo(prev); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); if (bIncreaseDomainExp) { @@ -89,7 +89,7 @@ void Rediance::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffe // increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); } - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(output.Duration); diff --git a/src/server/gameserver/skill/Reflection.cpp b/src/server/gameserver/skill/Reflection.cpp index 786b710c..8e9bf956 100644 --- a/src/server/gameserver/skill/Reflection.cpp +++ b/src/server/gameserver/skill/Reflection.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Reflection::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -49,19 +49,19 @@ void Reflection::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEf if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectReflection* pEffect = new EffectReflection(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setLevel(SkillLevel); pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_REFLECTION); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); @@ -99,19 +99,19 @@ void Reflection::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEf } -// Reflection Ǵ°? +// Reflection이 되는가? bool CheckReflection(Creature* pAttacker, Creature* pTargetCreature, SkillType_t SkillType) { __BEGIN_TRY // Assert(pAttacker != NULL); // Assert(pTargetCreature != NULL); - // ̾ ִ. + // 슬레이어만이 이 기술을 쓸 수 있다. if (pAttacker == NULL || pTargetCreature == NULL || pTargetCreature->isSlayer() == false) { return false; } - // ɷְ, ° ƴ϶... + // 기술이 걸려있고, 현재 마비 상태가 아니라면... if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_REFLECTION) && !pTargetCreature->isFlag(Effect::EFFECT_CLASS_PARALYZE)) { Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); @@ -125,24 +125,24 @@ bool CheckReflection(Creature* pAttacker, Creature* pTargetCreature, SkillType_t Assert(pSkillInfo != NULL); Assert(pZone != NULL); - // hitroll ߴٸ... + // hitroll이 성공했다면... // if (HitRoll::isSuccess(pTargetSlayer, pAttacker) && canHit(pTargetSlayer, pAttacker, SKILL_REFLECTION)) int SuccessRate = 30 + pSkillSlot->getExpLevel() / 5; - SuccessRate = min(SuccessRate, 50); // ִ 50% + SuccessRate = min(SuccessRate, 50); // 최대 50% if (rand() % 100 < SuccessRate) { GCSkillToSelfOK1 _GCSkillToSelfOK1; GCSkillToSelfOK2 _GCSkillToSelfOK2; - // ο reflection effect ٿش. + // 본인에게 reflection effect를 붙여준다. if (pTargetCreature->isPC()) { _GCSkillToSelfOK1.setSkillType(SKILL_CURE_EFFECT); _GCSkillToSelfOK1.setDuration(0); pTargetCreature->getPlayer()->sendPacket(&_GCSkillToSelfOK1); } - // ٸ 鿡 reflection effect ش. + // 다른 사람들에게 reflection effect를 보여준다. _GCSkillToSelfOK2.setObjectID(pTargetCreature->getObjectID()); _GCSkillToSelfOK2.setSkillType(SKILL_CURE_EFFECT); _GCSkillToSelfOK2.setDuration(0); diff --git a/src/server/gameserver/skill/RefusalEther.cpp b/src/server/gameserver/skill/RefusalEther.cpp index 03e41f00..bf27511c 100644 --- a/src/server/gameserver/skill/RefusalEther.cpp +++ b/src/server/gameserver/skill/RefusalEther.cpp @@ -22,7 +22,7 @@ RefusalEther::RefusalEther() throw() {}; ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void RefusalEther::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -50,7 +50,7 @@ void RefusalEther::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ousters Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pOusters, getSkillType(), Grade); return; @@ -67,7 +67,7 @@ void RefusalEther::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ousters } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void RefusalEther::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -115,7 +115,7 @@ void RefusalEther::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Oust ZoneCoord_t myX = pOusters->getX(); ZoneCoord_t myY = pOusters->getY(); - // Ʈ ӽð Ѵ. + // 이펙트의 지속시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); diff --git a/src/server/gameserver/skill/Regeneration.cpp b/src/server/gameserver/skill/Regeneration.cpp index 1c1fa1ec..12fbcf24 100644 --- a/src/server/gameserver/skill/Regeneration.cpp +++ b/src/server/gameserver/skill/Regeneration.cpp @@ -16,7 +16,7 @@ #include "GCSkillToTileOK6.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Regeneration::execute(Slayer* pSlayer, ObjectID_t ObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -36,7 +36,7 @@ void Regeneration::execute(Slayer* pSlayer, ObjectID_t ObjectID, SkillSlot* pSki Creature* pTargetCreature = pZone->getCreature(ObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); @@ -101,7 +101,7 @@ void Regeneration::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bTileCheck) { decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1); - // ų Ѵ. + // 스킬 정보를 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); @@ -116,7 +116,7 @@ void Regeneration::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS pZone->deleteEffect(effectID); } - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectRegeneration* pEffect = new EffectRegeneration(pZone, X, Y); pEffect->setDeadline(output.Duration); pEffect->setDamage(output.Damage); @@ -129,7 +129,7 @@ void Regeneration::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS pZone->addEffect(pEffect); tile.addEffect(pEffect); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToTileOK1); diff --git a/src/server/gameserver/skill/RegenerationSkill.cpp b/src/server/gameserver/skill/RegenerationSkill.cpp index 5658ee2b..bbc7a91b 100644 --- a/src/server/gameserver/skill/RegenerationSkill.cpp +++ b/src/server/gameserver/skill/RegenerationSkill.cpp @@ -34,10 +34,10 @@ void RegenerationSkill::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectI try { - // Player ޾ƿ´. + // Player를 받아온다. Player * pPlayer = pSlayer->getPlayer(); - // Zone ޾ƿ´. + // Zone을 받아온다. Zone * pZone = pSlayer->getZone(); Assert(pZone); Assert(pSkillSlot); @@ -53,7 +53,7 @@ void RegenerationSkill::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectI SkillLevel_t SkillLevel = pSkillSlot->getExpLevel(); - // ߷ ޾ƿ´. + // 명중률을 받아온다. ToHit_t ToHit = pSlayer->getINT(ATTR_CURRENT); bool bTargetEffected = false; @@ -71,24 +71,24 @@ void RegenerationSkill::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectI bModifyMP = true; } - // . + // 기술성공률 검증. if (bModifyMP && (ToHit + SkillLevel > Random(0, 100))) { - // Effect Object Ѵ. + // Effect Object를 생성한다. EffectRegeneration * pEffectRegeneration = new EffectRegeneration (pSlayer); - HP_t generationHP = computeSkillDamage(pSkillSlot, pSkillInfo); // Ǵ HP . + HP_t generationHP = computeSkillDamage(pSkillSlot, pSkillInfo); // 재생되는 HP의 총 양. Duration_t Duration = max(1, (int)10); pEffectRegeneration->setDelay(REGENERATION_DELAY); pEffectRegeneration->setDeadline(Duration * 10); pEffectRegeneration->setPoint(generationHP / (Duration*10 / REGENERATION_DELAY)); pEffectRegeneration->affect(pSlayer); - // Creature Effect Flag On Ų. + // Creature에 Effect Flag를 On 시킨다. pSlayer->setFlag(Effect::EFFECT_CLASS_REGENERATION); - // Creature effectManager Effect ߰Ų. + // Creature의 effectManager에 이 Effect를 추가시킨다. pSlayer->addEffect(pEffectRegeneration); _GCSkillToSelfOK1.addShortData(MODIFY_CURRENT_MP , RemainMP); diff --git a/src/server/gameserver/skill/RegenerationSkill.h b/src/server/gameserver/skill/RegenerationSkill.h index 4cca495f..44ff59fe 100644 --- a/src/server/gameserver/skill/RegenerationSkill.h +++ b/src/server/gameserver/skill/RegenerationSkill.h @@ -9,7 +9,7 @@ #include "SkillHandler.h" -#define REGENERATION_DELAY 30 // 3 ȸ.. +#define REGENERATION_DELAY 30 // 3초 마다 회복.. ////////////////////////////////////////////////////////////////////////////// // class Regeneration; diff --git a/src/server/gameserver/skill/RemoveCurse.cpp b/src/server/gameserver/skill/RemoveCurse.cpp index 9c6c903a..da39de9b 100644 --- a/src/server/gameserver/skill/RemoveCurse.cpp +++ b/src/server/gameserver/skill/RemoveCurse.cpp @@ -21,7 +21,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void RemoveCurse::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -42,8 +42,8 @@ void RemoveCurse::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // ̾ ܿ ġ . - // NoSuch. by sigi. 2002.5.2 + // 슬레이어 외에는 치료할 수 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isSlayer() == false) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -68,7 +68,7 @@ void RemoveCurse::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* // by sigi. 2002.12.3 // bool bHallucination = false; bool bDeath = false; - bool bEffected = false; // ƹ ֳ ɷ Ҵ. + bool bEffected = false; // 아무 저주나 걸려 있으면 켠다. EffectDoom* pEffectDoom = NULL; EffectParalyze* pEffectParalyze = NULL; @@ -121,8 +121,8 @@ void RemoveCurse::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* bool bTimeCheck = verifyRunTime(pSkillSlot); bool bRangeCheck = verifyDistance(pSlayer, pTargetCreature, pSkillInfo->getRange()); - // ְ, ð ư, Ÿ ϸ, - // ְ ϳ ɷ־ Ѵ. + // 마나가 있고, 시간이 됐고, 거리가 적당하며, + // 저주가 하나라도 걸려있어야 한다. if (bManaCheck && bTimeCheck && bRangeCheck && bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); @@ -130,8 +130,8 @@ void RemoveCurse::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* SkillOutput output; computeOutput(input, output); - // ָ ϰ, - // Ŷ Ʈ ϶ Ѵ. + // 각각의 저주를 삭제하고, + // 패킷에다 이펙트 삭제하라고 더한다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pTargetCreature->getObjectID()); @@ -163,14 +163,14 @@ void RemoveCurse::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_DEATH); } - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToObjectOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToObjectOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToObjectOK1); - // Ŷ . + // 패킷을 만들어 보낸다. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); ZoneCoord_t targetX = pTargetCreature->getX(); @@ -229,7 +229,7 @@ void RemoveCurse::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void RemoveCurse::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -263,7 +263,7 @@ void RemoveCurse::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE // by sigi. 2002.12.3 // bool bHallucination = false; bool bDeath = false; - bool bEffected = false; // ƹ ̳ ɷ Ҵ. + bool bEffected = false; // 아무 독이나 걸려있으면 켠다. EffectDoom* pEffectDoom = NULL; EffectParalyze* pEffectParalyze = NULL; @@ -316,8 +316,8 @@ void RemoveCurse::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE bool bTimeCheck = verifyRunTime(pSkillSlot); bool bRangeCheck = checkZoneLevelToUseSkill(pSlayer); - // ְ, ð ư, Ÿ ϸ, - // ְ ϳ ɷ־ Ѵ. + // 마나가 있고, 시간이 됐고, 거리가 적당하며, + // 저주가 하나라도 걸려있어야 한다. if (bManaCheck && bTimeCheck && bRangeCheck && bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); @@ -325,8 +325,8 @@ void RemoveCurse::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE SkillOutput output; computeOutput(input, output); - // ָ ϰ, - // Ŷ Ʈ ϶ Ѵ. + // 각각의 저주를 제거하고, + // 패킷에다 이펙트 삭제하라고 더한다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pSlayer->getObjectID()); @@ -358,7 +358,7 @@ void RemoveCurse::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE gcRemoveEffect.addEffectList(Effect::EFFECT_CLASS_DEATH); } - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); @@ -379,7 +379,7 @@ void RemoveCurse::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(myX, myY, &_GCSkillToSelfOK2, pSlayer); - // Ǯȴٴ ˷شپ. + // 기술이 풀렸다는 것을 알려준다아. pZone->broadcastPacket(myX, myY, &gcRemoveEffect); pSkillSlot->setRunTime(output.Delay); diff --git a/src/server/gameserver/skill/ReputoFactum.cpp b/src/server/gameserver/skill/ReputoFactum.cpp index c514c880..1d1f1976 100644 --- a/src/server/gameserver/skill/ReputoFactum.cpp +++ b/src/server/gameserver/skill/ReputoFactum.cpp @@ -20,7 +20,7 @@ #include "Reflection.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ReputoFactum::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -50,9 +50,9 @@ void ReputoFactum::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ousters Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // 鿪. by sigi. 2002.9.13 - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수 없다. + // 저주 면역. by sigi. 2002.9.13 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE) // by sigi. 2002.10.30 || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType()); @@ -101,7 +101,7 @@ void ReputoFactum::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ousters bool bCanSeeCaster = canSee(pTargetCreature, pOusters); - // Ʈ Ʈ δ. + // 이펙트 오브젝트를 생성해 붙인다. EffectReputoFactum* pEffect = new EffectReputoFactum(pTargetCreature); pEffect->setDeadline(output.Duration); pTargetCreature->addEffect(pEffect); diff --git a/src/server/gameserver/skill/Requital.cpp b/src/server/gameserver/skill/Requital.cpp index 2395b3fd..73baaf00 100644 --- a/src/server/gameserver/skill/Requital.cpp +++ b/src/server/gameserver/skill/Requital.cpp @@ -15,7 +15,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Requital::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -49,20 +49,20 @@ void Requital::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffe // cout << "Requital Success" << endl; decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ġ ÷ش. + // 경험치를 올려준다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; input.TargetType = SkillInput::TARGET_SELF; computeOutput(input, output); - // Ʈ ؼ δ + // 이펙트를 생성해서 붙인다 EffectRequital* pRequital = new EffectRequital(pSlayer); pRequital->setDeadline(output.Duration); pRequital->setReflection(output.Damage); @@ -74,7 +74,7 @@ void Requital::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffe pSlayer->initAllStat(); pSlayer->addModifyInfo(prev, _GCSkillToSelfOK1); - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); @@ -89,7 +89,7 @@ void Requital::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffe pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(myX, myY, &_GCSkillToSelfOK2, pSlayer); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pSlayer->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_REQUITAL); diff --git a/src/server/gameserver/skill/Restore.cpp b/src/server/gameserver/skill/Restore.cpp index c79ef4fb..1609ce08 100644 --- a/src/server/gameserver/skill/Restore.cpp +++ b/src/server/gameserver/skill/Restore.cpp @@ -29,7 +29,7 @@ #include "TradeManager.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -49,17 +49,17 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Creature* pFromCreature = pZone->getCreature(TargetObjectID); - // ̾ ǵ帱 ִ. - // NoSuch. by sigi. 2002.5.2 + // 뱀파이어만 건드릴 수가 있다. + // NoSuch제거. by sigi. 2002.5.2 if (pFromCreature == NULL || !pFromCreature->isVampire()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; } - GCSkillToObjectOK1 _GCSkillToObjectOK1; // ų ѿ... - GCMorph1 _GCMorph1; // ڿ.. - GCMorphSlayer2 _GCMorphSlayer2; // ۵鿡.. + GCSkillToObjectOK1 _GCSkillToObjectOK1; // 스킬 쓴 넘에게... + GCMorph1 _GCMorph1; // 변신 당사자에게.. + GCMorphSlayer2 _GCMorphSlayer2; // 변신 구경꾼들에게.. SkillType_t SkillType = pSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); @@ -72,27 +72,27 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk dropFlagToZone(pFromCreature); ////////////////////////////////////////////////////////////////////// - // ؾ Ѵ. + // 각종 존 레벨 정보를 삭제해야 한다. ////////////////////////////////////////////////////////////////////// - // Ƽ ʴ ̶ ش. + // 파티 초대 중이라면 정보를 삭제해 준다. PartyInviteInfoManager* pPIIM = pZone->getPartyInviteInfoManager(); Assert(pPIIM != NULL); pPIIM->cancelInvite(pFromCreature); - // Ƽ ش. + // 파티 관련 정보를 삭제해 준다. int PartyID = pFromCreature->getPartyID(); if (PartyID != 0) { - // ÿ ϰ... + // 먼저 로컬에서 삭제하고... LocalPartyManager* pLPM = pZone->getLocalPartyManager(); Assert(pLPM != NULL); pLPM->deletePartyMember(PartyID, pFromCreature); - // ۷ι ش. + // 글로벌에서도 삭제해 준다. deleteAllPartyInfo(pFromCreature); } - // Ʈ̵ ̾ٸ Ʈ̵ ش. + // 트레이드 중이었다면 트레이드 관련 정보를 삭제해준다. TradeManager* pTM = pZone->getTradeManager(); Assert(pTM != NULL); pTM->cancelTrade(pFromCreature); @@ -103,7 +103,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Slayer* pNewSlayer = new Slayer; Vampire* pVampire = dynamic_cast(pFromCreature); - // DB Ȥ 𸣴 ش. + // DB에서 혹시 남아있을 지 모르는 흡혈 정보를 삭제해준다. Statement* pStmt = NULL; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); @@ -116,13 +116,13 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pNewSlayer->setName(pFromCreature->getName()); - // ũ ÷̾ Ϳ ÷̾ ũ ͸ Ѵ. + // 크리쳐 안의 플레이어 포인터와 플레이어 안의 크리쳐 포인터를 갱신한다. Player* pFromPlayer = pFromCreature->getPlayer(); pNewSlayer->setPlayer(pFromPlayer); GamePlayer* pFromGamePlayer = dynamic_cast(pFromPlayer); pFromGamePlayer->setCreature(pNewSlayer); - // loadϸ load zone objectID Ƿ ٽ Ѵ. by sigi. 2002.6.4 + // load하면 load한 zone에서 objectID를 받으므로 다시 설정한다. by sigi. 2002.6.4 pNewSlayer->load(); pNewSlayer->setZone(pZone); pNewSlayer->setObjectID(pFromCreature->getObjectID()); @@ -134,13 +134,13 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Dir_t dir = pFromCreature->getDir(); Tile& tile = pZone->getTile(x, y); - // pFromCreature , ̾ ü ̹Ƿ, - // PCFinder  ִ ̴. - // ׷Ƿ ̾ ͸ ְ, ο ̾ ͸ Ѵ. + // 곧 pFromCreature 즉, 원래의 뱀파이어 객체는 지워질 것이므로, + // PCFinder에 들어가 있는 값은 쓰레기 값이 될 것이다. + // 그러므로 뱀파이어 포인터를 지워주고, 새로운 슬레이어 포인터를 더한다. g_pPCFinder->deleteCreature(pFromCreature->getName()); g_pPCFinder->addCreature(pNewSlayer); - // Ʈ Ѵ. + // 길드 현재 접속 멤버 리스트에서 삭제한다. if (pVampire->getGuildID() != 0) { Guild* pGuild = g_pGuildManager->getGuild(pVampire->getGuildID()); if (pGuild != NULL) { @@ -154,7 +154,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk g_pSharedServerManager->sendPacket(&gsGuildMemberLogOn); Statement* pStmt = NULL; - // Ʈ Ѵ. + // 디비에 업데이트 한다. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery("UPDATE GuildMember SET LogOn = 0 WHERE Name = '%s'", @@ -166,12 +166,12 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pVampire->getName().c_str()); } - // κ丮 ü. + // 인벤토리 교체. Inventory* pInventory = pVampire->getInventory(); pNewSlayer->setInventory(pInventory); pVampire->setInventory(NULL); - // ü + // 보관함 교체 pNewSlayer->deleteStash(); pNewSlayer->setStash(pVampire->getStash()); pNewSlayer->setStashNum(pVampire->getStashNum()); @@ -179,19 +179,19 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pVampire->setStash(NULL); /* - // ü + // 가비지 교체 while (true) { Item* pGarbage = pVampire->popItemFromGarbage(); - // ̻ ٸ 극ũ... + // 더 이상 없다면 브레이크... if (pGarbage == NULL) break; pNewSlayer->addItemToGarbage(pGarbage); } */ - // ÷ ü + // 플래그 셋 교체 pNewSlayer->deleteFlagSet(); pNewSlayer->setFlagSet(pVampire->getFlagSet()); pVampire->setFlagSet(NULL); @@ -199,24 +199,24 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Item* pItem = NULL; _TPOINT point; - // ԰ ִ ۵ κ丮 Ǵ ٴ ű. + // 입고 있는 아이템들을 인벤토리 또는 바닥으로 옮긴다. for (int part = 0; part < (int)Vampire::VAMPIRE_WEAR_MAX; part++) { pItem = pVampire->getWearItem((Vampire::WearPart)part); if (pItem != NULL) { - //  ϰ... + // 먼저 기어에서 삭제하고... if (isTwohandWeapon(pItem)) { Assert(((Vampire::WearPart)part == Vampire::WEAR_RIGHTHAND) || ((Vampire::WearPart)part == Vampire::WEAR_LEFTHAND)); Assert(pVampire->getWearItem(Vampire::WEAR_RIGHTHAND) == pVampire->getWearItem(Vampire::WEAR_LEFTHAND)); - // . + // 양손 아템. pVampire->deleteWearItem(Vampire::WEAR_RIGHTHAND); pVampire->deleteWearItem(Vampire::WEAR_LEFTHAND); } else { pVampire->deleteWearItem((Vampire::WearPart)part); } - // κ丮 ڸ κ丮 ϰ... + // 인벤토리에 자리가 있으면 인벤토리에 더하고... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); @@ -226,7 +226,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pItem->destroy(); SAFE_DELETE(pItem); } - // ڸ ٴڿ ߸. + // 자리가 없으면 바닥에 떨어뜨린다. else { ZoneCoord_t ZoneX = pVampire->getX(); ZoneCoord_t ZoneY = pVampire->getY(); @@ -238,14 +238,14 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk if (pt.x != -1) { pItem->save("", STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y); - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { char zoneName[15]; sprintf(zoneName, "%4d%3d%3d", pZone->getZoneID(), pt.x, pt.y); remainTraceLog(pItem, pFromCreature->getName(), zoneName, ITEM_LOG_MOVE, DETAIL_DROP); } } else { - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { remainTraceLog(pItem, pFromCreature->getName(), "GOD", ITEM_LOG_DELETE, DETAIL_DROP); } @@ -261,7 +261,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk if (pItem != NULL) { pVampire->deleteItemFromExtraInventorySlot(); - // κ丮 ڸ κ丮 ϰ... + // 인벤토리에 자리가 있으면 인벤토리에 더하고... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); @@ -271,7 +271,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pItem->destroy(); SAFE_DELETE(pItem); } - // ڸ ٴڿ ߸. + // 자리가 없으면 바닥에 떨어뜨린다. else { TPOINT pt; ZoneCoord_t ZoneX = pVampire->getX(); @@ -282,14 +282,14 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk if (pt.x != -1) { pItem->save("", STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y); - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { char zoneName[15]; sprintf(zoneName, "%4d%3d%3d", pZone->getZoneID(), pt.x, pt.y); remainTraceLog(pItem, pFromCreature->getName(), zoneName, ITEM_LOG_MOVE, DETAIL_DROP); } } else { - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { remainTraceLog(pItem, pFromCreature->getName(), "GOD", ITEM_LOG_DELETE, DETAIL_DROP); } @@ -300,20 +300,20 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk } } - // Ʈ ٽ εѴ. + // 퀘스트 아이템 정보를 다시 로드한다. pNewSlayer->loadTimeLimitItem(); - // ̾ ִ ̾ Űش. - // ̾ ִ ̾ Űܰ ʴ´. - // ο ̾ 0 Ѵ. + // 뱀파이어 가지고 있던 돈을 슬레이어로 옮겨준다. + // 뱀파이어가 가지고 있던 돈은 슬레이어로 옮겨가지 않는다. + // 새로운 슬레이어의 돈을 0으로 세팅한다. pNewSlayer->setGoldEx(0); pNewSlayer->setStashGoldEx(0); - // ų Ѵ. + // 스킬 정보를 전송한다. pNewSlayer->sendSlayerSkillInfo(); - // Ÿ ̾ ϰ, ο ̾ Ѵ. + // 타일 및 존에서 기존 뱀파이어를 삭제하고, 새로운 슬레이어를 더한다. tile.deleteCreature(pFromCreature->getObjectID()); pZone->deletePC(pFromCreature); @@ -325,7 +325,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pZone->addPC(pNewSlayer); - // þ update.. + // 시야 update.. pZone->updateHiddenScan(pNewSlayer); _GCMorph1.setPCInfo2(pNewSlayer->getSlayerInfo2()); @@ -360,7 +360,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pSkillSlot->setRunTime(0); EffectRestore* pEffectRestore = new EffectRestore(pNewSlayer); - pEffectRestore->setDeadline(60 * 60 * 24 * 7 * 10); // 7 + pEffectRestore->setDeadline(60 * 60 * 24 * 7 * 10); // 7일 pNewSlayer->addEffect(pEffectRestore); pNewSlayer->setFlag(Effect::EFFECT_CLASS_RESTORE); pEffectRestore->create(pNewSlayer->getName()); @@ -377,7 +377,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk } ////////////////////////////////////////////////////////////////////////////// -// NPC Ʈ ڵ鷯 +// NPC 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Restore::execute(NPC* pNPC, Creature* pFromCreature) @@ -393,14 +393,14 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) Zone* pZone = pNPC->getZone(); Assert(pZone != NULL); - // ̾ ǵ帱 ִ. + // 뱀파이어만 건드릴 수가 있다. if (!pFromCreature->isVampire()) { // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; } - GCMorph1 _GCMorph1; // ڿ.. - GCMorphSlayer2 _GCMorphSlayer2; // ۵鿡.. + GCMorph1 _GCMorph1; // 변신 당사자에게.. + GCMorphSlayer2 _GCMorphSlayer2; // 변신 구경꾼들에게.. // SkillType_t SkillType = SKILL_RESTORE; @@ -410,27 +410,27 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) // if (bRangeCheck && bHitRoll) if (bHitRoll) { ////////////////////////////////////////////////////////////////////// - // ؾ Ѵ. + // 각종 존 레벨 정보를 삭제해야 한다. ////////////////////////////////////////////////////////////////////// - // Ƽ ʴ ̶ ش. + // 파티 초대 중이라면 정보를 삭제해 준다. PartyInviteInfoManager* pPIIM = pZone->getPartyInviteInfoManager(); Assert(pPIIM != NULL); pPIIM->cancelInvite(pFromCreature); - // Ƽ ش. + // 파티 관련 정보를 삭제해 준다. int PartyID = pFromCreature->getPartyID(); if (PartyID != 0) { - // ÿ ϰ... + // 먼저 로컬에서 삭제하고... LocalPartyManager* pLPM = pZone->getLocalPartyManager(); Assert(pLPM != NULL); pLPM->deletePartyMember(PartyID, pFromCreature); - // ۷ι ش. + // 글로벌에서도 삭제해 준다. deleteAllPartyInfo(pFromCreature); } - // Ʈ̵ ̾ٸ Ʈ̵ ش. + // 트레이드 중이었다면 트레이드 관련 정보를 삭제해준다. TradeManager* pTM = pZone->getTradeManager(); Assert(pTM != NULL); pTM->cancelTrade(pFromCreature); @@ -441,7 +441,7 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) Slayer* pNewSlayer = new Slayer; Vampire* pVampire = dynamic_cast(pFromCreature); - // DB Ȥ 𸣴 ش. + // DB에서 혹시 남아있을 지 모르는 흡혈 정보를 삭제해준다. Statement* pStmt = NULL; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); @@ -455,7 +455,7 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) pNewSlayer->setName(pFromCreature->getName()); pNewSlayer->setPlayer(pFromCreature->getPlayer()); pNewSlayer->load(); - // loadϸ load zone objectID Ƿ ٽ Ѵ. by sigi. 2002.6.4 + // load하면 load한 zone에서 objectID를 받으므로 다시 설정한다. by sigi. 2002.6.4 pNewSlayer->setZone(pZone); pNewSlayer->setObjectID(pFromCreature->getObjectID()); // pZone->getObjectRegistry().registerObject(pNewSlayer); @@ -468,19 +468,19 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) pNewSlayer->setXYDir(x, y, dir); - // ũ ÷̾ Ϳ ÷̾ ũ ͸ Ѵ. + // 크리쳐 안의 플레이어 포인터와 플레이어 안의 크리쳐 포인터를 갱신한다. Player* pFromPlayer = pFromCreature->getPlayer(); // pNewSlayer->setPlayer(pFromPlayer); GamePlayer* pFromGamePlayer = dynamic_cast(pFromPlayer); pFromGamePlayer->setCreature(pNewSlayer); - // pFromCreature , ̾ ü ̹Ƿ, - // PCFinder  ִ ̴. - // ׷Ƿ ̾ ͸ ְ, ο ̾ ͸ Ѵ. + // 곧 pFromCreature 즉, 원래의 뱀파이어 객체는 지워질 것이므로, + // PCFinder에 들어가 있는 값은 쓰레기 값이 될 것이다. + // 그러므로 뱀파이어 포인터를 지워주고, 새로운 슬레이어 포인터를 더한다. g_pPCFinder->deleteCreature(pFromCreature->getName()); g_pPCFinder->addCreature(pNewSlayer); - // Ʈ Ѵ. + // 길드 현재 접속 멤버 리스트에서 삭제한다. if (pVampire->getGuildID() != 0) { Guild* pGuild = g_pGuildManager->getGuild(pVampire->getGuildID()); if (pGuild != NULL) @@ -490,19 +490,19 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) pVampire->getName().c_str()); } - // κ丮 ü. + // 인벤토리 교체. Inventory* pInventory = pVampire->getInventory(); pNewSlayer->setInventory(pInventory); pVampire->setInventory(NULL); - // ü + // 보관함 교체 pNewSlayer->deleteStash(); pNewSlayer->setStash(pVampire->getStash()); pNewSlayer->setStashNum(pVampire->getStashNum()); pNewSlayer->setStashStatus(false); pVampire->setStash(NULL); - // ÷ ü + // 플래그 셋 교체 pNewSlayer->deleteFlagSet(); pNewSlayer->setFlagSet(pVampire->getFlagSet()); pVampire->setFlagSet(NULL); @@ -510,24 +510,24 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) Item* pItem = NULL; _TPOINT point; - // ԰ ִ ۵ κ丮 Ǵ ٴ ű. + // 입고 있는 아이템들을 인벤토리 또는 바닥으로 옮긴다. for (int part = 0; part < (int)Vampire::VAMPIRE_WEAR_MAX; part++) { pItem = pVampire->getWearItem((Vampire::WearPart)part); if (pItem != NULL) { - //  ϰ... + // 먼저 기어에서 삭제하고... if (isTwohandWeapon(pItem)) { Assert(((Vampire::WearPart)part == Vampire::WEAR_RIGHTHAND) || ((Vampire::WearPart)part == Vampire::WEAR_LEFTHAND)); Assert(pVampire->getWearItem(Vampire::WEAR_RIGHTHAND) == pVampire->getWearItem(Vampire::WEAR_LEFTHAND)); - // . + // 양손 아템. pVampire->deleteWearItem(Vampire::WEAR_RIGHTHAND); pVampire->deleteWearItem(Vampire::WEAR_LEFTHAND); } else { pVampire->deleteWearItem((Vampire::WearPart)part); } - // κ丮 ڸ κ丮 ϰ... + // 인벤토리에 자리가 있으면 인벤토리에 더하고... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); @@ -537,7 +537,7 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) pItem->destroy(); SAFE_DELETE(pItem); } - // ڸ ٴڿ ߸. + // 자리가 없으면 바닥에 떨어뜨린다. else { ZoneCoord_t ZoneX = pVampire->getX(); ZoneCoord_t ZoneY = pVampire->getY(); @@ -549,14 +549,14 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) if (pt.x != -1) { pItem->save("", STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y); - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { char zoneName[15]; sprintf(zoneName, "%4d%3d%3d", pZone->getZoneID(), pt.x, pt.y); remainTraceLog(pItem, pFromCreature->getName(), zoneName, ITEM_LOG_MOVE, DETAIL_DROP); } } else { - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { remainTraceLog(pItem, pFromCreature->getName(), "GOD", ITEM_LOG_DELETE, DETAIL_DROP); } @@ -572,7 +572,7 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) if (pItem != NULL) { pVampire->deleteItemFromExtraInventorySlot(); - // κ丮 ڸ κ丮 ϰ... + // 인벤토리에 자리가 있으면 인벤토리에 더하고... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); @@ -582,7 +582,7 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) pItem->destroy(); SAFE_DELETE(pItem); } - // ڸ ٴڿ ߸. + // 자리가 없으면 바닥에 떨어뜨린다. else { TPOINT pt; ZoneCoord_t ZoneX = pVampire->getX(); @@ -593,14 +593,14 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) if (pt.x != -1) { pItem->save("", STORAGE_ZONE, pZone->getZoneID(), pt.x, pt.y); - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { char zoneName[15]; sprintf(zoneName, "%4d%3d%3d", pZone->getZoneID(), pt.x, pt.y); remainTraceLog(pItem, pFromCreature->getName(), zoneName, ITEM_LOG_MOVE, DETAIL_DROP); } } else { - // ItemTraceLog + // ItemTraceLog 를 남긴다 if (pItem != NULL && pItem->isTraceItem()) { remainTraceLog(pItem, pFromCreature->getName(), "GOD", ITEM_LOG_DELETE, DETAIL_DROP); } @@ -613,14 +613,14 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) pNewSlayer->loadTimeLimitItem(); - // ̾ ִ ̾ Űش. - // ̾ ʱȭѴ. + // 뱀파이어 가지고 있던 돈을 슬레이어로 옮겨준다. + // 슬레이어돈을 초기화한다. // pNewSlayer->setGoldEx(pVampire->getGold()); pNewSlayer->setGoldEx(0); pNewSlayer->setStashGoldEx(0); - // ų Ѵ. + // 스킬 정보를 전송한다. pNewSlayer->sendSlayerSkillInfo(); _GCMorph1.setPCInfo2(pNewSlayer->getSlayerInfo2()); @@ -634,7 +634,7 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) // pFromGamePlayer->deleteEvent(Event::EVENT_CLASS_REGENERATION); - // Ÿ ̾ ϰ, ο ̾ Ѵ. + // 타일 및 존에서 기존 뱀파이어를 삭제하고, 새로운 슬레이어를 더한다. tile.deleteCreature(pFromCreature->getObjectID()); pZone->deletePC(pFromCreature); @@ -656,11 +656,11 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) SAFE_DELETE(pFromCreature); - // þ update.. + // 시야 update.. pZone->updateHiddenScan(pNewSlayer); EffectRestore* pEffectRestore = new EffectRestore(pNewSlayer); - pEffectRestore->setDeadline(60 * 60 * 24 * 7 * 10); // 7 + pEffectRestore->setDeadline(60 * 60 * 24 * 7 * 10); // 7일 pNewSlayer->addEffect(pEffectRestore); pNewSlayer->setFlag(Effect::EFFECT_CLASS_RESTORE); pEffectRestore->create(pNewSlayer->getName()); diff --git a/src/server/gameserver/skill/Restore2.cpp b/src/server/gameserver/skill/Restore2.cpp index 3715761f..827e9032 100644 --- a/src/server/gameserver/skill/Restore2.cpp +++ b/src/server/gameserver/skill/Restore2.cpp @@ -19,7 +19,7 @@ #include "TradeManager.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -40,17 +40,17 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Creature* pFromCreature = pZone->getCreature(TargetObjectID); - // ̾ ǵ帱 ִ. - // NoSuch. by sigi. 2002.5.2 + // 뱀파이어만 건드릴 수가 있다. + // NoSuch제거. by sigi. 2002.5.2 if (pFromCreature == NULL || !pFromCreature->isVampire()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; } - GCSkillToObjectOK1 _GCSkillToObjectOK1; // ų ѿ... - GCMorph1 _GCMorph1; // ڿ.. - GCMorphSlayer2 _GCMorphSlayer2; // ۵鿡.. + GCSkillToObjectOK1 _GCSkillToObjectOK1; // 스킬 쓴 넘에게... + GCMorph1 _GCMorph1; // 변신 당사자에게.. + GCMorphSlayer2 _GCMorphSlayer2; // 변신 구경꾼들에게.. SkillType_t SkillType = pSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); @@ -60,27 +60,27 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk if (bRangeCheck && bHitRoll) { ////////////////////////////////////////////////////////////////////// - // ؾ Ѵ. + // 각종 존 레벨 정보를 삭제해야 한다. ////////////////////////////////////////////////////////////////////// - // Ƽ ʴ ̶ ش. + // 파티 초대 중이라면 정보를 삭제해 준다. PartyInviteInfoManager* pPIIM = pZone->getPartyInviteInfoManager(); Assert(pPIIM != NULL); pPIIM->cancelInvite(pFromCreature); - // Ƽ ش. + // 파티 관련 정보를 삭제해 준다. int PartyID = pFromCreature->getPartyID(); if (PartyID != 0) { - // ÿ ϰ... + // 먼저 로컬에서 삭제하고... LocalPartyManager* pLPM = pZone->getLocalPartyManager(); Assert(pLPM != NULL); pLPM->deletePartyMember(PartyID, pFromCreature); - // ۷ι ش. + // 글로벌에서도 삭제해 준다. deleteAllPartyInfo(pFromCreature); } - // Ʈ̵ ̾ٸ Ʈ̵ ش. + // 트레이드 중이었다면 트레이드 관련 정보를 삭제해준다. TradeManager* pTM = pZone->getTradeManager(); Assert(pTM != NULL); pTM->cancelTrade(pFromCreature); @@ -91,7 +91,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Slayer* pNewSlayer = new Slayer; Vampire* pVampire = dynamic_cast(pFromCreature); - // DB Ȥ 𸣴 ش. + // DB에서 혹시 남아있을 지 모르는 흡혈 정보를 삭제해준다. Statement* pStmt = NULL; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); @@ -104,7 +104,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pNewSlayer->setName(pFromCreature->getName()); - // ũ ÷̾ Ϳ ÷̾ ũ ͸ Ѵ. + // 크리쳐 안의 플레이어 포인터와 플레이어 안의 크리쳐 포인터를 갱신한다. Player* pFromPlayer = pFromCreature->getPlayer(); pNewSlayer->setPlayer(pFromPlayer); GamePlayer* pFromGamePlayer = dynamic_cast(pFromPlayer); @@ -120,22 +120,22 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Dir_t dir = pFromCreature->getDir(); Tile& tile = pZone->getTile(x, y); - // pFromCreature , ̾ ü ̹Ƿ, - // PCFinder  ִ ̴. - // ׷Ƿ ̾ ͸ ְ, ο ̾ ͸ Ѵ. + // 곧 pFromCreature 즉, 원래의 뱀파이어 객체는 지워질 것이므로, + // PCFinder에 들어가 있는 값은 쓰레기 값이 될 것이다. + // 그러므로 뱀파이어 포인터를 지워주고, 새로운 슬레이어 포인터를 더한다. g_pPCFinder->deleteCreature(pFromCreature->getName()); g_pPCFinder->addCreature(pNewSlayer); - // Ʈ Ѵ. + // 길드 현재 접속 멤버 리스트에서 삭제한다. if (pVampire->getGuildID() != 0) g_pGuildManager->getGuild(pVampire->getGuildID())->deleteCurrentMember(pVampire->getName()); - // κ丮 ü. + // 인벤토리 교체. Inventory* pInventory = pVampire->getInventory(); pNewSlayer->setInventory(pInventory); pVampire->setInventory(NULL); - // ü + // 보관함 교체 pNewSlayer->deleteStash(); pNewSlayer->setStash(pVampire->getStash()); pNewSlayer->setStashNum(pVampire->getStashNum()); @@ -143,19 +143,19 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pVampire->setStash(NULL); /* - // ü + // 가비지 교체 while (true) { Item* pGarbage = pVampire->popItemFromGarbage(); - // ̻ ٸ 극ũ... + // 더 이상 없다면 브레이크... if (pGarbage == NULL) break; pNewSlayer->addItemToGarbage(pGarbage); } */ - // ÷ ü + // 플래그 셋 교체 pNewSlayer->deleteFlagSet(); pNewSlayer->setFlagSet(pVampire->getFlagSet()); pVampire->setFlagSet(NULL); @@ -163,19 +163,19 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Item* pItem = NULL; _TPOINT point; - // ԰ ִ ۵ κ丮 Ǵ ٴ ű. + // 입고 있는 아이템들을 인벤토리 또는 바닥으로 옮긴다. for (int part = 0; part < (int)Vampire::VAMPIRE_WEAR_MAX; part++) { pItem = pVampire->getWearItem((Vampire::WearPart)part); if (pItem != NULL) { - //  ϰ... + // 먼저 기어에서 삭제하고... pVampire->deleteWearItem((Vampire::WearPart)part); - // κ丮 ڸ κ丮 ϰ... + // 인벤토리에 자리가 있으면 인벤토리에 더하고... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); } - // ڸ ٴڿ ߸. + // 자리가 없으면 바닥에 떨어뜨린다. else { ZoneCoord_t ZoneX = pVampire->getX(); ZoneCoord_t ZoneY = pVampire->getY(); @@ -198,12 +198,12 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk if (pItem != NULL) { pVampire->deleteItemFromExtraInventorySlot(); - // κ丮 ڸ κ丮 ϰ... + // 인벤토리에 자리가 있으면 인벤토리에 더하고... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); } - // ڸ ٴڿ ߸. + // 자리가 없으면 바닥에 떨어뜨린다. else { TPOINT pt; ZoneCoord_t ZoneX = pVampire->getX(); @@ -220,10 +220,10 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk } } - // ̾ ִ ̾ Űش. + // 뱀파이어 가지고 있던 돈을 슬레이어로 옮겨준다. pNewSlayer->setGoldEx(pVampire->getGold()); - // ų Ѵ. + // 스킬 정보를 전송한다. pNewSlayer->sendSlayerSkillInfo(); _GCMorph1.setPCInfo2(pNewSlayer->getSlayerInfo2()); @@ -238,7 +238,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pZone->broadcastPacket(x, y, &_GCMorphSlayer2, pNewSlayer); - // Ÿ ̾ ϰ, ο ̾ Ѵ. + // 타일 및 존에서 기존 뱀파이어를 삭제하고, 새로운 슬레이어를 더한다. tile.deleteCreature(pFromCreature->getObjectID()); pZone->deletePC(pFromCreature); @@ -253,7 +253,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pNewSlayer->tinysave("Race='SLAYER'"); SAFE_DELETE(pFromCreature); - // þ update.. + // 시야 update.. pZone->updateHiddenScan(pNewSlayer); _GCSkillToObjectOK1.setSkillType(SkillType); @@ -266,7 +266,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pSkillSlot->setRunTime(0); EffectRestore* pEffectRestore = new EffectRestore(pNewSlayer); - pEffectRestore->setDeadline(60 * 60 * 24 * 7 * 10); // 7 + pEffectRestore->setDeadline(60 * 60 * 24 * 7 * 10); // 7일 pNewSlayer->addEffect(pEffectRestore); pNewSlayer->setFlag(Effect::EFFECT_CLASS_RESTORE); pEffectRestore->create(pNewSlayer->getName()); @@ -283,7 +283,7 @@ void Restore::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk } ////////////////////////////////////////////////////////////////////////////// -// NPC Ʈ ڵ鷯 +// NPC 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Restore::execute(NPC* pNPC, Creature* pFromCreature) @@ -300,14 +300,14 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) Zone* pZone = pNPC->getZone(); Assert(pZone != NULL); - // ̾ ǵ帱 ִ. + // 뱀파이어만 건드릴 수가 있다. if (!pFromCreature->isVampire()) { // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; } - GCMorph1 _GCMorph1; // ڿ.. - GCMorphSlayer2 _GCMorphSlayer2; // ۵鿡.. + GCMorph1 _GCMorph1; // 변신 당사자에게.. + GCMorphSlayer2 _GCMorphSlayer2; // 변신 구경꾼들에게.. SkillType_t SkillType = SKILL_RESTORE; @@ -317,27 +317,27 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) // if (bRangeCheck && bHitRoll) if (bHitRoll) { ////////////////////////////////////////////////////////////////////// - // ؾ Ѵ. + // 각종 존 레벨 정보를 삭제해야 한다. ////////////////////////////////////////////////////////////////////// - // Ƽ ʴ ̶ ش. + // 파티 초대 중이라면 정보를 삭제해 준다. PartyInviteInfoManager* pPIIM = pZone->getPartyInviteInfoManager(); Assert(pPIIM != NULL); pPIIM->cancelInvite(pFromCreature); - // Ƽ ش. + // 파티 관련 정보를 삭제해 준다. int PartyID = pFromCreature->getPartyID(); if (PartyID != 0) { - // ÿ ϰ... + // 먼저 로컬에서 삭제하고... LocalPartyManager* pLPM = pZone->getLocalPartyManager(); Assert(pLPM != NULL); pLPM->deletePartyMember(PartyID, pFromCreature); - // ۷ι ش. + // 글로벌에서도 삭제해 준다. deleteAllPartyInfo(pFromCreature); } - // Ʈ̵ ̾ٸ Ʈ̵ ش. + // 트레이드 중이었다면 트레이드 관련 정보를 삭제해준다. TradeManager* pTM = pZone->getTradeManager(); Assert(pTM != NULL); pTM->cancelTrade(pFromCreature); @@ -348,7 +348,7 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) Slayer* pNewSlayer = new Slayer; Vampire* pVampire = dynamic_cast(pFromCreature); - // DB Ȥ 𸣴 ش. + // DB에서 혹시 남아있을 지 모르는 흡혈 정보를 삭제해준다. Statement* pStmt = NULL; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); @@ -372,35 +372,35 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) pNewSlayer->setXYDir(x, y, dir); - // ũ ÷̾ Ϳ ÷̾ ũ ͸ Ѵ. + // 크리쳐 안의 플레이어 포인터와 플레이어 안의 크리쳐 포인터를 갱신한다. Player* pFromPlayer = pFromCreature->getPlayer(); pNewSlayer->setPlayer(pFromPlayer); GamePlayer* pFromGamePlayer = dynamic_cast(pFromPlayer); pFromGamePlayer->setCreature(pNewSlayer); - // pFromCreature , ̾ ü ̹Ƿ, - // PCFinder  ִ ̴. - // ׷Ƿ ̾ ͸ ְ, ο ̾ ͸ Ѵ. + // 곧 pFromCreature 즉, 원래의 뱀파이어 객체는 지워질 것이므로, + // PCFinder에 들어가 있는 값은 쓰레기 값이 될 것이다. + // 그러므로 뱀파이어 포인터를 지워주고, 새로운 슬레이어 포인터를 더한다. g_pPCFinder->deleteCreature(pFromCreature->getName()); g_pPCFinder->addCreature(pNewSlayer); - // Ʈ Ѵ. + // 길드 현재 접속 멤버 리스트에서 삭제한다. if (pVampire->getGuildID() != 0) g_pGuildManager->getGuild(pVampire->getGuildID())->deleteCurrentMember(pVampire->getName()); - // κ丮 ü. + // 인벤토리 교체. Inventory* pInventory = pVampire->getInventory(); pNewSlayer->setInventory(pInventory); pVampire->setInventory(NULL); - // ü + // 보관함 교체 pNewSlayer->deleteStash(); pNewSlayer->setStash(pVampire->getStash()); pNewSlayer->setStashNum(pVampire->getStashNum()); pNewSlayer->setStashStatus(false); pVampire->setStash(NULL); - // ÷ ü + // 플래그 셋 교체 pNewSlayer->deleteFlagSet(); pNewSlayer->setFlagSet(pVampire->getFlagSet()); pVampire->setFlagSet(NULL); @@ -408,19 +408,19 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) Item* pItem = NULL; _TPOINT point; - // ԰ ִ ۵ κ丮 Ǵ ٴ ű. + // 입고 있는 아이템들을 인벤토리 또는 바닥으로 옮긴다. for (int part = 0; part < (int)Vampire::VAMPIRE_WEAR_MAX; part++) { pItem = pVampire->getWearItem((Vampire::WearPart)part); if (pItem != NULL) { - //  ϰ... + // 먼저 기어에서 삭제하고... pVampire->deleteWearItem((Vampire::WearPart)part); - // κ丮 ڸ κ丮 ϰ... + // 인벤토리에 자리가 있으면 인벤토리에 더하고... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); } - // ڸ ٴڿ ߸. + // 자리가 없으면 바닥에 떨어뜨린다. else { ZoneCoord_t ZoneX = pVampire->getX(); ZoneCoord_t ZoneY = pVampire->getY(); @@ -443,12 +443,12 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) if (pItem != NULL) { pVampire->deleteItemFromExtraInventorySlot(); - // κ丮 ڸ κ丮 ϰ... + // 인벤토리에 자리가 있으면 인벤토리에 더하고... if (pInventory->getEmptySlot(pItem, point)) { pInventory->addItem(point.x, point.y, pItem); pItem->save(pNewSlayer->getName(), STORAGE_INVENTORY, 0, point.x, point.y); } - // ڸ ٴڿ ߸. + // 자리가 없으면 바닥에 떨어뜨린다. else { TPOINT pt; ZoneCoord_t ZoneX = pVampire->getX(); @@ -465,10 +465,10 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) } } - // ̾ ִ ̾ Űش. + // 뱀파이어 가지고 있던 돈을 슬레이어로 옮겨준다. pNewSlayer->setGoldEx(pVampire->getGold()); - // ų Ѵ. + // 스킬 정보를 전송한다. pNewSlayer->sendSlayerSkillInfo(); _GCMorph1.setPCInfo2(pNewSlayer->getSlayerInfo2()); @@ -483,7 +483,7 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) pZone->broadcastPacket(x, y, &_GCMorphSlayer2, pNewSlayer); - // Ÿ ̾ ϰ, ο ̾ Ѵ. + // 타일 및 존에서 기존 뱀파이어를 삭제하고, 새로운 슬레이어를 더한다. tile.deleteCreature(pFromCreature->getObjectID()); pZone->deletePC(pFromCreature); @@ -498,11 +498,11 @@ void Restore::execute(NPC* pNPC, Creature* pFromCreature) pNewSlayer->tinysave("Race='SLAYER'"); SAFE_DELETE(pFromCreature); - // þ update.. + // 시야 update.. pZone->updateHiddenScan(pNewSlayer); EffectRestore* pEffectRestore = new EffectRestore(pNewSlayer); - pEffectRestore->setDeadline(60 * 60 * 24 * 7 * 10); // 7 + pEffectRestore->setDeadline(60 * 60 * 24 * 7 * 10); // 7일 pNewSlayer->addEffect(pEffectRestore); pNewSlayer->setFlag(Effect::EFFECT_CLASS_RESTORE); pEffectRestore->create(pNewSlayer->getName()); diff --git a/src/server/gameserver/skill/Resurrect.cpp b/src/server/gameserver/skill/Resurrect.cpp index 2d0b8b37..a4c217c7 100644 --- a/src/server/gameserver/skill/Resurrect.cpp +++ b/src/server/gameserver/skill/Resurrect.cpp @@ -18,7 +18,7 @@ #include "Properties.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Resurrect::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -39,8 +39,8 @@ void Resurrect::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // ̾ ǻ츱 ִ. - // NoSuch. by sigi. 2002.5.2 + // 슬레이어만을 되살릴 수 있다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !pTargetCreature->isSlayer() || (g_pConfig->hasKey("Hardcore") && g_pConfig->getPropertyInt("Hardcore") != 0)) { executeSkillFailException(pSlayer, getSkillType()); @@ -50,7 +50,7 @@ void Resurrect::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); Assert(pTargetSlayer != NULL); - // Ÿٿ ڸ Ʈ ɷ ʰų, ° ƴ϶ . + // 타겟에게 코마 이펙트가 걸려있지 않거나, 죽은 상태가 아니라면 쓸 수 없다. if (!pTargetSlayer->isFlag(Effect::EFFECT_CLASS_COMA) || !pTargetSlayer->isDead()) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -92,22 +92,22 @@ void Resurrect::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p SkillOutput output; computeOutput(input, output); - // Ÿ Ʈ Ŵ ڸ Ʈ Ѵ. + // 타겟의 이펙트 매니저에서 코마 이펙트를 삭제한다. pTargetCreature->deleteEffect(Effect::EFFECT_CLASS_COMA); pTargetCreature->removeFlag(Effect::EFFECT_CLASS_COMA); - // ڸ Ʈ ưٰ ˷ش. + // 코마 이펙트가 날아갔다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pTargetSlayer->getObjectID()); gcRemoveEffect.addEffectList((EffectID_t)Effect::EFFECT_CLASS_COMA); pZone->broadcastPacket(targetX, targetY, &gcRemoveEffect); - // Ʈ ٽ ش. by sigi. 2002.11.14 + // 이펙트 정보를 다시 보내준다. by sigi. 2002.11.14 pTargetSlayer->getEffectManager()->sendEffectInfo(pTargetSlayer, pZone, pTargetSlayer->getX(), pTargetSlayer->getY()); - // Ȱ Ƹ̵带 ϱ ؼ Aftermath Ʈ δ. - // 2002.11.19 ȫâ + // 부활 아르바이드를 방지하기 위해서 Aftermath 이펙트를 붙인다. + // 2002.11.19 장홍창 if (pTargetSlayer->isFlag(Effect::EFFECT_CLASS_KILL_AFTERMATH)) { Effect* pEffect = pTargetSlayer->findEffect(Effect::EFFECT_CLASS_KILL_AFTERMATH); EffectKillAftermath* pEffectKillAftermath = dynamic_cast(pEffect); @@ -120,18 +120,18 @@ void Resurrect::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p pEffectKillAftermath->create(pTargetSlayer->getName()); } - // ü 10% ä. + // 대상의 체력을 10%만 채운다. HP_t CurrentHP = getPercentValue(pTargetSlayer->getHP(ATTR_MAX), 10); pTargetSlayer->setHP(CurrentHP, ATTR_CURRENT); pTargetSlayer->setMP(0, ATTR_CURRENT); - // ü äٴ ˸. + // 주위에 체력이 채워졌다는 사실을 알린다. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pTargetSlayer->getObjectID()); gcStatusCurrentHP.setCurrentHP(pTargetSlayer->getHP(ATTR_CURRENT)); pZone->broadcastPacket(targetX, targetY, &gcStatusCurrentHP); - // ġ ÷ش. + // 경험치를 올려준다. shareAttrExp(pSlayer, pSkillInfo->getPoint(), 1, 1, 8, _GCSkillToObjectOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToObjectOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToObjectOK1); diff --git a/src/server/gameserver/skill/Revealer.cpp b/src/server/gameserver/skill/Revealer.cpp index 3403354c..7d5f6884 100644 --- a/src/server/gameserver/skill/Revealer.cpp +++ b/src/server/gameserver/skill/Revealer.cpp @@ -13,7 +13,7 @@ #include "Party.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Revealer::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -49,24 +49,24 @@ void Revealer::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffe if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // Ǵ ð õ ޶. + // 기술이 유지되는 시간은 숙련도에 따라서 달라진다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ ؼ δ. + // 이펙트 오브젝트를 생성해서 붙인다. EffectRevealer* pEffectRevealer = new EffectRevealer(pSlayer); pEffectRevealer->setSkillLevel(pSkillSlot->getExpLevel()); pEffectRevealer->setDeadline(output.Duration); pSlayer->addEffect(pEffectRevealer); pSlayer->setFlag(Effect::EFFECT_CLASS_REVEALER); - // Ʈ ν, ̴ δ. + // 이 이펙트가 붙음으로써, 안 보이던 것이 보인다. pZone->updateMineScan(pSlayer); // pZone->updateInvisibleScan( pSlayer ); pZone->updateHiddenScan(pSlayer); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1) * 2; shareAttrExp(pSlayer, ExpUp, 1, 8, 1, _GCSkillToSelfOK1); @@ -85,7 +85,7 @@ void Revealer::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffe pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCSkillToSelfOK2, pSlayer); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pSlayer->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_REVEALER); diff --git a/src/server/gameserver/skill/RingOfFlare.cpp b/src/server/gameserver/skill/RingOfFlare.cpp index 34f35cf1..b58be2f4 100644 --- a/src/server/gameserver/skill/RingOfFlare.cpp +++ b/src/server/gameserver/skill/RingOfFlare.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void RingOfFlare::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -65,14 +65,14 @@ void RingOfFlare::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bSatisfyRequire) { decreaseMana(pOusters, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); - // cout << pOusters->getName() << " RingOfFlare " << output.Damage << "Դϴ." << endl; + // cout << pOusters->getName() << "이 RingOfFlare를 썼고 데미지는 " << output.Damage << "입니다." << endl; - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectRingOfFlare* pEffect = new EffectRingOfFlare(pOusters); pEffect->setDeadline(output.Duration); pEffect->setDamage(output.Damage); diff --git a/src/server/gameserver/skill/RottenApple.cpp b/src/server/gameserver/skill/RottenApple.cpp index ba001f5b..b779d63c 100644 --- a/src/server/gameserver/skill/RottenApple.cpp +++ b/src/server/gameserver/skill/RottenApple.cpp @@ -16,7 +16,7 @@ #include "PacketUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// ½½·¹ÀÌ¾î ¿ÀºêÁ§Æ® Çڵ鷯 ////////////////////////////////////////////////////////////////////////////// void RottenApple::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,7 +37,7 @@ void RottenApple::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - if (pTargetCreature == NULL || pTargetCreature->isSlayer()) // NoSuch . by sigi. 2002.5.2 + if (pTargetCreature == NULL || pTargetCreature->isSlayer()) // NoSuch Á¦°Å. by sigi. 2002.5.2 { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End(slayerobject)" << endl; @@ -93,7 +93,7 @@ void RottenApple::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bCanUse) { decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1); - // ȿġ ӽð Ѵ. + // ±â¼úÀÇ È¿°úÄ¡ ¹× Áö¼Ó½Ã°£À» °è»êÇÑ´Ù. SkillInput input(pSlayer, pSkillSlot); if (pTargetCreature->getCreatureClass() == Creature::CREATURE_CLASS_SLAYER) input.TargetType = SkillInput::TARGET_SELF; @@ -102,7 +102,7 @@ void RottenApple::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* SkillOutput output; computeOutput(input, output); - // ġ ÷ش. + // °æÇèÄ¡¸¦ ¿Ã·ÁÁØ´Ù. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToTileOK1); @@ -144,7 +144,7 @@ void RottenApple::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* currentHP = pOusters->getHP(ATTR_CURRENT); } else if (pCreature->isMonster()) { Monster* pMonster = dynamic_cast(pCreature); - // edit by sonic 2006.11.1 ףɱBOSS(ƻ) + // edit by sonic 2006.11.1 ÐÞÕýÈËÀà×£¸£ÃëɱBOSS¼¼ÄÜ(ÀÃÆ»¹û) if (pMonster->getMonsterType() == 764 || pMonster->getMonsterType() == 765 || pMonster->getMonsterType() == 717 || // pMonster->getMonsterType() == 599 || diff --git a/src/server/gameserver/skill/SMGAttack.cpp b/src/server/gameserver/skill/SMGAttack.cpp index 0e3ad8db..5423974a 100644 --- a/src/server/gameserver/skill/SMGAttack.cpp +++ b/src/server/gameserver/skill/SMGAttack.cpp @@ -10,7 +10,7 @@ #include "SimpleMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void SMGAttack::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/SacredStamp.cpp b/src/server/gameserver/skill/SacredStamp.cpp index d699fd27..6537209e 100644 --- a/src/server/gameserver/skill/SacredStamp.cpp +++ b/src/server/gameserver/skill/SacredStamp.cpp @@ -10,7 +10,7 @@ #include "SimpleTileMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void SacredStamp::execute(Slayer* pSlayer, ObjectID_t targetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) { __BEGIN_TRY @@ -21,7 +21,7 @@ void SacredStamp::execute(Slayer* pSlayer, ObjectID_t targetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(targetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -60,7 +60,7 @@ void SacredStamp::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl SIMPLE_SKILL_OUTPUT result; - // Holy Smashing ִٸ 10% + // Holy Smashing 이 있다면 데미지 10% 증가 if (pSlayer->hasRankBonus(RankBonus::RANK_BONUS_HOLY_SMASHING)) { RankBonus* pRankBonus = pSlayer->getRankBonus(RankBonus::RANK_BONUS_HOLY_SMASHING); Assert(pRankBonus != NULL); diff --git a/src/server/gameserver/skill/Sacrifice.cpp b/src/server/gameserver/skill/Sacrifice.cpp index 563e05de..4b964ca0 100644 --- a/src/server/gameserver/skill/Sacrifice.cpp +++ b/src/server/gameserver/skill/Sacrifice.cpp @@ -13,7 +13,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Sacrifice::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -56,13 +56,13 @@ void Sacrifice::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEff SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectSacrifice* pEffect = new EffectSacrifice(pSlayer); pEffect->setDeadline(output.Duration); pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_SACRIFICE); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); diff --git a/src/server/gameserver/skill/Sanctuary.cpp b/src/server/gameserver/skill/Sanctuary.cpp index 234597e0..8d54acc3 100644 --- a/src/server/gameserver/skill/Sanctuary.cpp +++ b/src/server/gameserver/skill/Sanctuary.cpp @@ -17,7 +17,7 @@ #include "GCSkillToTileOK6.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Sanctuary::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -36,7 +36,7 @@ void Sanctuary::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -53,7 +53,7 @@ void Sanctuary::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 슬레이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void Sanctuary::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -97,7 +97,7 @@ void Sanctuary::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot bTileCheck = true; if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bTileCheck) { - // Ʈ ӽð Ѵ. + // 이펙트의 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); @@ -110,7 +110,7 @@ void Sanctuary::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot ObjectRegistry& objectregister = pZone->getObjectRegistry(); - // ϴ ̹ sanctuary ִ ˻Ѵ. + // 일단 이미 sanctuary가 있는지 검색한다. for (oY = -1; oY <= 1; oY++) for (oX = -1; oX <= 1; oX++) { int tileX = X + oX; @@ -121,8 +121,8 @@ void Sanctuary::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot if (tile.canAddEffect()) { Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_SANCTUARY); - // ̹ ִٸ - // д. + // 이미 있다면 + // 기술 실패다. if (pOldEffect != NULL) { executeSkillFailNormal(pSlayer, getSkillType(), NULL); @@ -135,7 +135,7 @@ void Sanctuary::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot } } - // ϸ ٸ ǹǷ ⼭ ٿش. + // 실패하면 마나가 줄면 안 되므로 여기서 줄여준다. decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1); for (oY = -1; oY <= 1; oY++) @@ -145,11 +145,11 @@ void Sanctuary::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot if (rect.ptInRect(tileX, tileY)) { Tile& tile = pZone->getTile(tileX, tileY); - // ŸϿ Ʈ ߰ ִٸ... - // if (tile.canAddEffect()) // üũߴ. + // 현재 타일에다 이펙트를 추가할 수 있다면... + // if (tile.canAddEffect()) // 위에서 체크했다. { - // effect . - // üũߴ. + // 같은 effect가 있으면 지운다. + // 위에서 체크했다. /* Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_SANCTUARY); if (pOldEffect != NULL) @@ -159,14 +159,14 @@ void Sanctuary::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot } */ - // Ʈ Ŭ Ѵ. + // 이펙트 클래스를 생성한다. EffectSanctuary* pEffect = new EffectSanctuary(pZone, tileX, tileY, X, Y); pEffect->setDeadline(output.Duration); pEffect->setLevel(pSlayer->getINT()); pEffect->setDuration(output.Duration); pEffect->setStartTime(); - // Tile ̴ Effect ObjectID Ϲ޾ƾ Ѵ. + // Tile에 붙이는 Effect는 ObjectID를 등록받아야 한다. objectregister.registerObject(pEffect); pZone->addEffect(pEffect); tile.addEffect(pEffect); @@ -189,7 +189,7 @@ void Sanctuary::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot { // pTargetCreature = dynamic_cast(pTarget); - // Ʈ Ŭ Ѵ. + // 이펙트 클래스를 생성한다. /* EffectSanctuary* pEffect = new EffectSanctuary(pZone , tileX, tileY, X, Y); pEffect->setDeadline(output.Duration); @@ -197,7 +197,7 @@ void Sanctuary::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot pEffect->setDuration(output.Duration); pEffect->setStartTime(); - // ijͿ ٴ´. ̰ ҷ.. + // 캐릭터에 붙는다. 못 움직이게 할려고.. objectregister.registerObject(pEffect); pTargetCreature->getEffectManager()->addEffect(pEffect); pZone->addEffect(pEffect); @@ -219,9 +219,9 @@ void Sanctuary::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot } } - // client effectǴ ð ־ - // Ÿ̹ .. ð Ѵ. -_-; - output.Duration -= 20; // 2 . + // client에서는 effect생성되는 시간이 있어서 + // 타이밍 맞출려면.. 시간을 좀 빼줘야 한다. -_-; + output.Duration -= 20; // 2초 뺀다. _GCSkillToTileOK1.setSkillType(SkillType); _GCSkillToTileOK1.setCEffectID(CEffectID); @@ -288,8 +288,8 @@ void Sanctuary::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot list watcherList = pZone->getWatcherList(myX, myY, pSlayer); - // watcherList cList ʰ, caster(pSlayer) - // OK4 .. cList ߰Ѵ. + // watcherList에서 cList에 속하지 않고, caster(pSlayer)를 볼 수 없는 경우는 + // OK4를 보내고.. cList에 추가한다. for (list::const_iterator itr = watcherList.begin(); itr != watcherList.end(); itr++) { bool bBelong = false; for (list::const_iterator tItr = cList.begin(); tItr != cList.end(); tItr++) @@ -298,9 +298,9 @@ void Sanctuary::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot Creature* pWatcher = (*itr); if (bBelong == false && canSee(pWatcher, pSlayer) == false) { - // Assert(pWatcher->isPC()); // 翬 PC.. Zone::getWatcherList PC returnѴ + // Assert(pWatcher->isPC()); // 당연 PC다.. Zone::getWatcherList는 PC만 return한다 if (!pWatcher->isPC()) { - // cout << "Sanctuary : ó Ʈ PC ƴմϴ." << endl; + // cout << "Sanctuary : 왓처 리스트가 PC가 아닙니다." << endl; GCSkillFailed1 _GCSkillFailed1; _GCSkillFailed1.setSkillType(getSkillType()); pSlayer->getPlayer()->sendPacket(&_GCSkillFailed1); @@ -334,7 +334,7 @@ void Sanctuary::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Sanctuary::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/SatelliteBomb.cpp b/src/server/gameserver/skill/SatelliteBomb.cpp index b88f4bb3..1e18f678 100644 --- a/src/server/gameserver/skill/SatelliteBomb.cpp +++ b/src/server/gameserver/skill/SatelliteBomb.cpp @@ -19,44 +19,44 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// Ǻ 180 +// ÈËÀà ÎÀÐǺä»÷¼¼ÄÜ 180¼¶ ////////////////////////////////////////////////////////////////////////////// void SatelliteBomb::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) { __BEGIN_TRY - // ݰȫ֤ + // Êý¾Ý°²È«ÑéÖ¤ Assert(pSlayer != NULL); Assert(pSkillSlot != NULL); try { - // ȡǰͼ,аȫ֤.ĿIDȡö + // »ñÈ¡µ±Ç°µØÍ¼,²¢½øÐа²È«ÑéÖ¤.¸ù¾ÝÄ¿±êIDÈ¡µÃ¶ÔÏó Zone* pZone = pSlayer->getZone(); Assert(pZone != NULL); Creature* pTargetCreature = pZone->getCreature(TargetObjectID); - // Ŀ깥 + // ¼ì²âÄ¿±ê¹¥»÷¿ÉÄÜÐÔ if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { - // ֪ͨͻʹüʧ + // ֪ͨ¿Í»§¶ËʹÓü¼ÄÜʧ°Ü executeSkillFailException(pSlayer, getSkillType()); return; } - // ʹü + // ʹÓü¼ÄÜ execute(pSlayer, pTargetCreature->getX(), pTargetCreature->getY(), pSkillSlot, CEffectID); } - // + // ´íÎó´¦Àí catch (Throwable& t) { - // ֪ͨͻʹüʧ + // ֪ͨ¿Í»§¶ËʹÓü¼ÄÜʧ°Ü executeSkillFailException(pSlayer, getSkillType()); } __END_CATCH } ////////////////////////////////////////////////////////////////////////////// -// к pSlayer->ʹüܶ X,Y-> pSkillSlot->Ϣ CEffectID->ЧID +// ¼¼ÄÜÔËÐк¯Êý pSlayer->ʹÓü¼ÄܶÔÏó X,Y->×ø±ê pSkillSlot->¼¼ÄÜÐÅÏ¢ CEffectID->Ч¹ûID ////////////////////////////////////////////////////////////////////////////// void SatelliteBomb::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -64,18 +64,18 @@ void SatelliteBomb::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill __BEGIN_TRY try { - // Slayer ȡPlayerָ + // ¸ù¾ÝSlayer È¡µÃPlayer¶ÔÏóÖ¸Õë Player* pPlayer = pSlayer->getPlayer(); - // Slayer ȡõǰͼָ + // ¸ù¾ÝSlayer È¡µÃµ±Ç°µØÍ¼Ö¸Õë Zone* pZone = pSlayer->getZone(); - // + // ´íÎó´¦Àí Assert(pPlayer != NULL); Assert(pZone != NULL); - // Ƿװ + // ¼ì²âÊÇ·ñÓÐ×°±¸ÎäÆ÷ Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || isArmsWeapon(pItem) == false) { - // ֪ͨͻʹüʧ + // ֪ͨ¿Í»§¶ËʹÓü¼ÄÜʧ°Ü executeSkillFailException(pSlayer, getSkillType()); return; } @@ -85,17 +85,17 @@ void SatelliteBomb::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill GCSkillToTileOK4 _GCSkillToTileOK4; GCSkillToTileOK5 _GCSkillToTileOK5; GCSkillToTileOK6 _GCSkillToTileOK6; - // ȡǰʹü + // »ñÈ¡µ±Ç°Ê¹Óü¼ÄÜÀàÐÍ SkillType_t SkillType = pSkillSlot->getSkillType(); - // ȡݿ⵱ǰʹüϢ + // »ñÈ¡Êý¾Ý¿âµ±Ç°Ê¹Óü¼ÄÜÐÅÏ¢ SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // RequiredMP ȡҪĵMPֵ. - // bManaCheck ⵱ǰʹöǷ㹻MPֵ. - // bTimeCheck ⵱ǰʹʱǷ񳬳. - // bRangeCheck ⼼ʹþ. - // bEffected ⵱ǰǷʹ. - // bTileCheck ⵱ǰͼʹÿ + // RequiredMP »ñÈ¡¼¼ÄÜÐèÒªÏûºÄµÄMPÖµ. + // bManaCheck ¼ì²âµ±Ç°Ê¹ÓöÔÏóÊÇ·ñÓÐ×ã¹»µÄMPÖµÏûºÄ. + // bTimeCheck ¼ì²âµ±Ç°¼¼ÄÜʹÓÃʱ¼ä¼ä¸ôÊÇ·ñ³¬³ö. + // bRangeCheck ¼ì²â¼¼ÄÜʹÓþàÀë. + // bEffected ¼ì²âµ±Ç°¼¼ÄÜÊÇ·ñÔÚʹÓÃÖÐ. + // bTileCheck ¼ì²âµ±Ç°µØÍ¼Ê¹ÓÿÉÄÜÐÔ int RequiredMP = pSkillInfo->getConsumeMP(); bool bManaCheck = hasEnoughMana(pSlayer, RequiredMP); bool bTimeCheck = verifyRunTime(pSkillSlot); @@ -111,9 +111,9 @@ void SatelliteBomb::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill } bool bUseSkill = false; /* - // ȡǰʹüܽɫʹõ + // È¡³öµ±Ç°Ê¹Óü¼ÄܽÇÉ«ËùʹÓõÄÎäÆ÷ Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); - //ûʹü + //ûÓÐÎäÆ÷²»ÄÜʹÓü¼ÄÜ if (pWeapon != NULL) { Silver_t silverDamage= pWeapon->getSilver(); @@ -126,30 +126,30 @@ void SatelliteBomb::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill } */ bUseSkill = true; - // ȫͨ,ִмܺ. + // Èç¹ûÈ«²¿¼ì²âͨ¹ý,ÔòÖ´Ðм¼Äܺ¯Êý. if (bManaCheck && bTimeCheck && bRangeCheck && !bEffected && bTileCheck && bUseSkill) { - // ʹýɫMP + // ÉèÖÃʹÓýÇÉ«MP¼õÉÙ decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1); - // ,㼼˺Ϣ. + // ´´½¨¼¼ÄÜÊäÈëÊä³ö±äÁ¿,²¢¼ÆËã¼¼ÄÜÉ˺¦µÈÐÅÏ¢. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); Tile& tile = pZone->getTile(X, Y); - // EFFECT_CLASS_SKILL_SATELLITE_BOMB_POINTЧʹ,ƳЧ. + // Èç¹ûEFFECT_CLASS_SKILL_SATELLITE_BOMB_POINT¼¼ÄÜЧ¹ûÔÚʹÓÃÖÐ,ÒÆ³ýЧ¹û. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_SKILL_SATELLITE_BOMB_POINT); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); } - // ʹýɫЧ + // ´´½¨Ê¹ÓýÇɫЧ¹û EffectSatelliteBombAim* pEffect = new EffectSatelliteBombAim(pSlayer, pZone, X, Y); - // Ч˺ + // ÉèÖÃЧ¹ûÉ˺¦ pEffect->setDamage(output.Damage); - // Чʹʱ + // ÉèÖÃЧ¹ûʹÓÃʱ¼ä pEffect->setDeadline(output.Duration); pSlayer->addEffect(pEffect); @@ -193,7 +193,7 @@ void SatelliteBomb::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); - // SatelliteBombAim Ʈ εij Ѵ. + // SatelliteBombAim ÀÌÆåÆ®¸¦ ºê·Îµåij½ºÆÃ ÇÑ´Ù. GCAddEffect gcAddAimEffect; gcAddAimEffect.setObjectID(pSlayer->getObjectID()); gcAddAimEffect.setEffectID(Effect::EFFECT_CLASS_SKILL_SATELLITE_BOMB_AIM); @@ -201,7 +201,7 @@ void SatelliteBomb::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill pZone->broadcastPacket(myX, myY, &gcAddAimEffect); /////////////////////////////////////////////////////////////////// - // SatelliteBombPoint Ʈ  ̰ εij Ѵ. + // SatelliteBombPoint ÀÌÆåÆ®¸¦ ¸¸µé¾î¼­ ºÙÀÌ°í ºê·Îµåij½ºÆÃ ÇÑ´Ù. /////////////////////////////////////////////////////////////////// EffectSatelliteBombPoint* pPointEffect = new EffectSatelliteBombPoint(pZone, X, Y); pPointEffect->setDeadline(output.Duration); @@ -260,19 +260,19 @@ void SatelliteBomb::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) { ZoneCoord_t myX = pMonster->getX(); ZoneCoord_t myY = pMonster->getY(); - // Ʈ ̹ Ѵٸ Ѵ. + // °°Àº ÀÌÆåÆ®°¡ ÀÌ¹Ì Á¸ÀçÇÑ´Ù¸é »èÁ¦ÇÑ´Ù. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_SKILL_SATELLITE_BOMB_POINT); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); } - // ð Ѵ. + // µ¥¹ÌÁö¿Í Áö¼Ó ½Ã°£À» °è»êÇÑ´Ù. SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // ÀÌÆåÆ® ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÑ´Ù. EffectSatelliteBombAim* pEffect = new EffectSatelliteBombAim(pMonster, pZone, X, Y); pEffect->setDeadline(output.Duration); pEffect->setDamage(output.Damage); @@ -306,7 +306,7 @@ void SatelliteBomb::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) { pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); - // SatelliteBombAim Ʈ εij Ѵ. + // SatelliteBombAim ÀÌÆåÆ®¸¦ ºê·Îµåij½ºÆÃ ÇÑ´Ù. GCAddEffect gcAddAimEffect; gcAddAimEffect.setObjectID(pMonster->getObjectID()); gcAddAimEffect.setEffectID(Effect::EFFECT_CLASS_SKILL_SATELLITE_BOMB_AIM); diff --git a/src/server/gameserver/skill/Seduction.cpp b/src/server/gameserver/skill/Seduction.cpp index 90ae0245..47a6abd5 100644 --- a/src/server/gameserver/skill/Seduction.cpp +++ b/src/server/gameserver/skill/Seduction.cpp @@ -18,7 +18,7 @@ #include "Reflection.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Seduction::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -40,9 +40,9 @@ void Seduction::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSki Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // 鿪. by sigi. 2002.9.13 - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수 없다. + // 저주 면역. by sigi. 2002.9.13 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_CURSE) || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); @@ -60,7 +60,7 @@ void Seduction::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSki SkillType_t SkillType = pSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // Knowledge of Curse ִٸ hit bonus 10 + // Knowledge of Curse 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_CURSE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_CURSE); @@ -94,14 +94,14 @@ void Seduction::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSki SkillOutput output; computeOutput(input, output); - // pTargetCreature ָ ݻϴ + // pTargetCreature가 저주마법을 반사하는 경우 if (CheckReflection(pVampire, pTargetCreature, getSkillType())) { pTargetCreature = (Creature*)pVampire; TargetObjectID = pVampire->getObjectID(); } - // Ʈ Ʈ δ. + // 이펙트 오브젝트를 생성해 붙인다. EffectSeduction* pEffect = new EffectSeduction(pTargetCreature); pEffect->setDeadline(output.Duration); pEffect->setLevel(pSkillInfo->getLevel() / 2); @@ -110,7 +110,7 @@ void Seduction::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSki pTargetCreature->setFlag(Effect::EFFECT_CLASS_SEDUCTION); pTargetCreature->addEffect(pEffect); - // ɷġ ؼ ش. + // 능력치를 계산해서 보내준다. if (pTargetCreature->isSlayer()) { Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); @@ -171,10 +171,10 @@ void Seduction::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSki _GCSkillToObjectOK6.setSkillType(SkillType); _GCSkillToObjectOK6.setDuration(output.Duration); - if (bCanSeeCaster) // 10 ġ. + if (bCanSeeCaster) // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); - } else // 10 ġ. + } else // 10은 땜빵 수치다. { computeAlignmentChange(pTargetCreature, 10, pVampire, &_GCSkillToObjectOK6, &_GCSkillToObjectOK1); } @@ -227,7 +227,7 @@ void Seduction::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSki ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Seduction::execute(Monster* pMonster, Creature* pEnemy) @@ -254,7 +254,7 @@ void Seduction::execute(Monster* pMonster, Creature* pEnemy) if (pMonster->isMaster()) { int x = pMonster->getX(); int y = pMonster->getY(); - int Splash = 3 + rand() % 5; // 3~7 + int Splash = 3 + rand() % 5; // 3~7 마리 int range = 2; // 5x5 list creatureList; getSplashVictims(pMonster->getZone(), x, y, Creature::CREATURE_CLASS_MAX, creatureList, Splash, range); @@ -316,13 +316,13 @@ void Seduction::executeMonster(Zone* pZone, Monster* pMonster, Creature* pEnemy) SkillOutput output; computeOutput(input, output); - // pTargetCreature ָ ݻϴ + // pTargetCreature가 저주마법을 반사하는 경우 if (CheckReflection(pMonster, pEnemy, getSkillType())) { pEnemy = (Creature*)pMonster; } - // Ʈ Ʈ δ. + // 이펙트 오브젝트를 생성해 붙인다. EffectSeduction* pEffect = new EffectSeduction(pEnemy); pEffect->setDeadline(output.Duration); pEffect->setLevel(pSkillInfo->getLevel() / 2); @@ -331,7 +331,7 @@ void Seduction::executeMonster(Zone* pZone, Monster* pMonster, Creature* pEnemy) pEnemy->setFlag(Effect::EFFECT_CLASS_SEDUCTION); pEnemy->addEffect(pEffect); - // ɷġ ؼ ش. + // 능력치를 계산해서 보내준다. if (pEnemy->isSlayer()) { Slayer* pTargetSlayer = dynamic_cast(pEnemy); diff --git a/src/server/gameserver/skill/SelfDestruction.cpp b/src/server/gameserver/skill/SelfDestruction.cpp index ead860bd..b2fe3209 100644 --- a/src/server/gameserver/skill/SelfDestruction.cpp +++ b/src/server/gameserver/skill/SelfDestruction.cpp @@ -12,8 +12,8 @@ ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// SelfDestruction::SelfDestruction() throw() { __BEGIN_TRY @@ -22,7 +22,7 @@ SelfDestruction::SelfDestruction() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void SelfDestruction::execute(Monster* pMonster) @@ -46,7 +46,7 @@ void SelfDestruction::execute(Monster* pMonster) if (bRangeCheck) { //-------------------------------------------------------- - // knockbackǴ¸´ ֵ üũش. + // 주위에 knockback되는맞는 애들을 체크해준다. //-------------------------------------------------------- SkillInput input(pMonster); SkillOutput output; diff --git a/src/server/gameserver/skill/SetAfire.cpp b/src/server/gameserver/skill/SetAfire.cpp index 017ef43f..f9a61c1b 100644 --- a/src/server/gameserver/skill/SetAfire.cpp +++ b/src/server/gameserver/skill/SetAfire.cpp @@ -18,7 +18,7 @@ #include "Zone.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void SetAfire::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -38,8 +38,8 @@ void SetAfire::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); return; @@ -88,10 +88,10 @@ void SetAfire::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil CheckCrossCounter(pVampire, pTargetCreature, Damage); - // ´. + // 마나를 깍는다. decreaseMana(pVampire, RequiredMP, _GCSkillToObjectOK1); - // ϰ, ߸. + // 데미지를 가하고, 아이템 내구도를 떨어뜨린다. // setDamage(pTargetCreature, Damage, pVampire, getSkillType(), &_GCSkillToObjectOK2, //&_GCSkillToObjectOK1); computeAlignmentChange(pTargetCreature, Damage, pVampire, //&_GCSkillToObjectOK2, @@ -99,13 +99,13 @@ void SetAfire::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil //&_GCSkillToObjectOK1, //&_GCSkillToObjectOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. // if (bCriticalHit) // { // knockbackCreature(pZone, pTargetCreature, pVampire->getX(), pVampire->getY()); // } - // ̹ 밡 ׾ٸ ġ ö󰣴. + // 이번 공격으로 상대가 죽었다면 경험치가 올라간다. // if (pTargetCreature->isDead()) // { // int exp = computeCreatureExp(pTargetCreature, KILL_EXP); @@ -124,7 +124,7 @@ void SetAfire::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil increaseAlignment(pVampire, pTargetCreature, _GCSkillToObjectOK1); - // Ŷ . + // 패킷을 보낸다. _GCSkillToObjectOK1.setSkillType(getSkillType()); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); diff --git a/src/server/gameserver/skill/ShadowDancing.cpp b/src/server/gameserver/skill/ShadowDancing.cpp index a4cec713..3241970f 100644 --- a/src/server/gameserver/skill/ShadowDancing.cpp +++ b/src/server/gameserver/skill/ShadowDancing.cpp @@ -9,7 +9,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ShadowDancing::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/ShadowOfStorm.cpp b/src/server/gameserver/skill/ShadowOfStorm.cpp index 4b0c0645..a66cad94 100644 --- a/src/server/gameserver/skill/ShadowOfStorm.cpp +++ b/src/server/gameserver/skill/ShadowOfStorm.cpp @@ -17,7 +17,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ShadowOfStorm::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -38,8 +38,8 @@ void ShadowOfStorm::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ouster // Assert(pTargetCreature != NULL); - // NPC . - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || !canAttack(pOusters, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType(), 0); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -58,7 +58,7 @@ void ShadowOfStorm::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ouster } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ÿ ڵ鷯 +// 아우스터즈 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void ShadowOfStorm::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -95,7 +95,7 @@ void ShadowOfStorm::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ous SkillType_t SkillType = pOustersSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); @@ -120,7 +120,7 @@ void ShadowOfStorm::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ous Tile& tile = pZone->getTile(X, Y); - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_SHADOW_OF_STORM); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); @@ -129,7 +129,7 @@ void ShadowOfStorm::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ous checkMine(pZone, X, Y); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectShadowOfStorm* pEffect = new EffectShadowOfStorm(pZone, X, Y); pEffect->setUserObjectID(pOusters->getObjectID()); pEffect->setDeadline(output.Duration); @@ -138,11 +138,11 @@ void ShadowOfStorm::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ous pEffect->setDamage(output.Damage); pEffect->setBroadcastingEffect(false); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); diff --git a/src/server/gameserver/skill/ShadowWalk.cpp b/src/server/gameserver/skill/ShadowWalk.cpp index 82fae809..c1ce21a3 100644 --- a/src/server/gameserver/skill/ShadowWalk.cpp +++ b/src/server/gameserver/skill/ShadowWalk.cpp @@ -11,7 +11,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ShadowWalk::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -32,15 +32,15 @@ void ShadowWalk::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; return; } - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 도가 아니라면 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_BLADE) { executeSkillFailException(pSlayer, getSkillType()); @@ -68,10 +68,10 @@ void ShadowWalk::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* bool bEffected = pSlayer->hasRelicItem() || pSlayer->isFlag(Effect::EFFECT_CLASS_HAS_FLAG) || pSlayer->isFlag(Effect::EFFECT_CLASS_HAS_SWEEPER); - // if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bCanHit && bPK) // HitRoll ϴ 7% - // ش + // if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bCanHit && bPK) // HitRoll 에 실패하더라도 7%의 + // 데미지를 준다 if (bManaCheck && bTimeCheck && bRangeCheck && bCanHit && bPK && !bEffected) { - // PC ش. + // 빠르게 PC를 움직여준다. if (pZone->moveFastPC(pSlayer, pSlayer->getX(), pSlayer->getY(), pTargetCreature->getX(), pTargetCreature->getY(), getSkillType())) { decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); @@ -82,9 +82,9 @@ void ShadowWalk::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* bool bCriticalHit = false; - // ش. (ų .) + // 데미지를 준다. (스킬 데미지는 없다.) Damage_t Damage = computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); - // HitRoll ߴٸ 7% ش. - by bezz + // HitRoll에 실패했다면 7%의 데미지를 준다. - by bezz if (!bHitRoll) Damage = (Damage_t)getPercentValue(Damage, 7); setDamage(pTargetCreature, Damage, pSlayer, SkillType, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); @@ -92,7 +92,7 @@ void ShadowWalk::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* // Exp_t Point = pSkillInfo->getPoint(); decreaseDurability(pSlayer, pTargetCreature, pSkillInfo, &_GCSkillToObjectOK1, &_GCSkillToObjectOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } @@ -107,7 +107,7 @@ void ShadowWalk::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* increaseAlignment(pSlayer, pTargetCreature, _GCSkillToObjectOK1); } - // Ŷ غϰ . + // 패킷을 준비하고 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); diff --git a/src/server/gameserver/skill/SharpChakram.cpp b/src/server/gameserver/skill/SharpChakram.cpp index a2eddd75..327f21cf 100644 --- a/src/server/gameserver/skill/SharpChakram.cpp +++ b/src/server/gameserver/skill/SharpChakram.cpp @@ -18,7 +18,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void SharpChakram::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -63,12 +63,12 @@ void SharpChakram::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlo if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bSatisfyRequire) { decreaseMana(pOusters, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectSharpChakram* pEffect = new EffectSharpChakram(pOusters); pEffect->setDeadline(output.Duration); pEffect->setBonus(output.Damage); diff --git a/src/server/gameserver/skill/SharpHail.cpp b/src/server/gameserver/skill/SharpHail.cpp index 3cf0276c..3f79d338 100644 --- a/src/server/gameserver/skill/SharpHail.cpp +++ b/src/server/gameserver/skill/SharpHail.cpp @@ -17,7 +17,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void SharpHail::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -43,8 +43,8 @@ void SharpHail::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSki // Assert(pTargetCreature != NULL); - // NPC . - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || !canAttack(pOusters, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType(), 0); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -63,7 +63,7 @@ void SharpHail::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSki } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ÿ ڵ鷯 +// 아우스터즈 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void SharpHail::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -105,7 +105,7 @@ void SharpHail::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ousters SkillType_t SkillType = pOustersSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); @@ -149,7 +149,7 @@ void SharpHail::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ousters if (pTargetCreature) Damage += computeDamage(pOusters, pTargetCreature, 0, bCriticalHit); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectSharpHail* pEffect = new EffectSharpHail(pZone, oX, oY); pEffect->setUserObjectID(pOusters->getObjectID()); pEffect->setDeadline(output.Duration); @@ -166,11 +166,11 @@ void SharpHail::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ousters else pEffect->setSendEffectClass( Effect::EFFECT_CLASS_SHARP_HAIL_3 ); }*/ - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); } diff --git a/src/server/gameserver/skill/SharpRound.cpp b/src/server/gameserver/skill/SharpRound.cpp index 1fe2e4c4..fce6cede 100644 --- a/src/server/gameserver/skill/SharpRound.cpp +++ b/src/server/gameserver/skill/SharpRound.cpp @@ -10,7 +10,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void SharpRound::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/SharpShield.cpp b/src/server/gameserver/skill/SharpShield.cpp index 22a6d6c8..200ec15d 100644 --- a/src/server/gameserver/skill/SharpShield.cpp +++ b/src/server/gameserver/skill/SharpShield.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void SharpShield::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -31,7 +31,7 @@ void SharpShield::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 검이 아니라면 기술을 쓸 수 없다. Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL || pWeapon->getItemClass() != Item::ITEM_CLASS_SWORD) { executeSkillFailException(pSlayer, getSkillType()); @@ -58,12 +58,12 @@ void SharpShield::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectSharpShield* pEffect = new EffectSharpShield(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setLevel(SkillLevel); @@ -71,7 +71,7 @@ void SharpShield::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_SHARP_SHIELD_1); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); if (bIncreaseDomainExp) { diff --git a/src/server/gameserver/skill/ShiftBreak.cpp b/src/server/gameserver/skill/ShiftBreak.cpp index 70cad981..bfc65097 100644 --- a/src/server/gameserver/skill/ShiftBreak.cpp +++ b/src/server/gameserver/skill/ShiftBreak.cpp @@ -13,8 +13,8 @@ #include "ZoneUtil.h" ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// ShiftBreak::ShiftBreak() throw() { __BEGIN_TRY @@ -52,7 +52,7 @@ ShiftBreak::ShiftBreak() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ShiftBreak::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -72,7 +72,7 @@ void ShiftBreak::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pOusters, getSkillType()); return; @@ -166,10 +166,10 @@ void ShiftBreak::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster // if ( input.SkillLevel > 15 ) Ratio += 10; // Ratio = max(10, Ratio); - cout << "ũϽ . Ȯ " << Ratio << endl; + cout << "다크니스 있음. 확률 " << Ratio << endl; if (rand() % 100 < Ratio) { - cout << " " << endl; + cout << "성공 " << endl; pZone->deleteEffect(pEffect->getObjectID()); GCDeleteEffectFromTile gcDeleteEffectFromTile; diff --git a/src/server/gameserver/skill/ShineSword.cpp b/src/server/gameserver/skill/ShineSword.cpp index 5de35dca..4d8cb76f 100644 --- a/src/server/gameserver/skill/ShineSword.cpp +++ b/src/server/gameserver/skill/ShineSword.cpp @@ -9,7 +9,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ShineSword::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/SimpleCureSkill.cpp b/src/server/gameserver/skill/SimpleCureSkill.cpp index 47863c6e..648a6652 100644 --- a/src/server/gameserver/skill/SimpleCureSkill.cpp +++ b/src/server/gameserver/skill/SimpleCureSkill.cpp @@ -69,16 +69,16 @@ void SimpleCureSkill::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, const SIMP uint HealPoint = param.SkillDamage; - // ¶ ¸ ش. + // 흡혈당한 상태라면 흡혈 상태를 날려준다. if (pEffectBloodDrain != NULL && pEffectBloodDrain->getLevel() < param.Level) { - // ƸƮ ϱ Ʈ ٿش. + // 흡혈 아르바이트를 방지하기 위한 후유증 이펙트를 붙여준다. if (pSlayer->isFlag(Effect::EFFECT_CLASS_AFTERMATH)) { Effect* pEffect = pSlayer->findEffect(Effect::EFFECT_CLASS_AFTERMATH); EffectAftermath* pEffectAftermath = dynamic_cast(pEffect); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. } else { EffectAftermath* pEffectAftermath = new EffectAftermath(pSlayer); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. pSlayer->addEffect(pEffectAftermath); pSlayer->setFlag(Effect::EFFECT_CLASS_AFTERMATH); pEffectAftermath->create(pSlayer->getName()); @@ -99,11 +99,11 @@ void SimpleCureSkill::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, const SIMP pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcRemoveEffect); } - // HP Ѵ. + // HP를 세팅한다. HP_t CurrentHP = pSlayer->getHP(ATTR_CURRENT); HP_t MaxHP = pSlayer->getHP(ATTR_MAX); - // ȸ ġ Ѵ. + // 실제 회복 수치를 계산한다. int RealHealPoint = 0; if (CurrentHP + HealPoint <= MaxHP) { RealHealPoint = max((unsigned int)0, HealPoint); @@ -111,7 +111,7 @@ void SimpleCureSkill::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, const SIMP RealHealPoint = max(0, MaxHP - CurrentHP); } - // ġ ÷ش. + // 경험치를 올려준다. shareAttrExp(pSlayer, RealHealPoint, param.STRMultiplier, param.DEXMultiplier, param.INTMultiplier, _GCSkillToSelfOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1); @@ -120,7 +120,7 @@ void SimpleCureSkill::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, const SIMP CurrentHP = min((int)MaxHP, (int)(CurrentHP + HealPoint)); pSlayer->setHP(CurrentHP, ATTR_CURRENT); - // HP εijѴ. + // HP를 브로드캐스팅한다. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pSlayer->getObjectID()); gcStatusCurrentHP.setCurrentHP(CurrentHP); @@ -173,8 +173,8 @@ void SimpleCureSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // ̾ ܿ ġ . - // NoSuch. by sigi. 2002.5.2 + // 슬레이어 외에는 치료할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isSlayer() == false) { executeSkillFailException(pSlayer, param.SkillType); return; @@ -191,7 +191,7 @@ void SimpleCureSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillS bool bHPCheck = false; - // ü ų, ¿ Ѵ. + // 체력이 닳거나, 흡혈을 당한 상태여야 한다. Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); Assert(pTargetSlayer != NULL); @@ -220,16 +220,16 @@ void SimpleCureSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillS uint HealPoint = param.SkillDamage; - // ¶ ¸ ش. + // 흡혈당한 상태라면 흡혈 상태를 날려준다. if (pEffectBloodDrain != NULL && pEffectBloodDrain->getLevel() < param.Level) { - // ƸƮ ϱ Ʈ ٿش. + // 흡혈 아르바이트를 방지하기 위한 후유증 이펙트를 붙여준다. if (pTargetSlayer->isFlag(Effect::EFFECT_CLASS_AFTERMATH)) { Effect* pEffect = pTargetSlayer->findEffect(Effect::EFFECT_CLASS_AFTERMATH); EffectAftermath* pEffectAftermath = dynamic_cast(pEffect); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. } else { EffectAftermath* pEffectAftermath = new EffectAftermath(pTargetSlayer); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. pTargetSlayer->addEffect(pEffectAftermath); pTargetSlayer->setFlag(Effect::EFFECT_CLASS_AFTERMATH); pEffectAftermath->create(pTargetSlayer->getName()); @@ -251,11 +251,11 @@ void SimpleCureSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillS pZone->broadcastPacket(pTargetSlayer->getX(), pTargetSlayer->getY(), &gcRemoveEffect); } - // ٸ ġѴ. + // 다른 사람을 치료한다. HP_t CurrentHP = pTargetSlayer->getHP(ATTR_CURRENT); HP_t MaxHP = pTargetSlayer->getHP(ATTR_MAX); - // ȸ ġ Ѵ. + // 실제 회복 수치를 계산한다. // int RealHealPoint = 0; // if( CurrentHP + HealPoint <= MaxHP ) { // RealHealPoint = max( (unsigned int)0, HealPoint ); @@ -263,7 +263,7 @@ void SimpleCureSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillS // RealHealPoint = max( 0, MaxHP - CurrentHP ); // } - // ġ ÷ش. + // 경험치를 올려준다. shareAttrExp(pSlayer, HealPoint, param.STRMultiplier, param.DEXMultiplier, param.INTMultiplier, _GCSkillToObjectOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToObjectOK1); @@ -272,7 +272,7 @@ void SimpleCureSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillS CurrentHP = min((int)(MaxHP), (int)(CurrentHP + HealPoint)); pTargetSlayer->setHP(CurrentHP, ATTR_CURRENT); - // ġᰡ Ǿ HP εijѴ. + // 치료가 되었으니 HP를 브로드캐스팅한다. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(TargetObjectID); gcStatusCurrentHP.setCurrentHP(CurrentHP); diff --git a/src/server/gameserver/skill/SimpleLinearMeleeSkill.cpp b/src/server/gameserver/skill/SimpleLinearMeleeSkill.cpp index f8604276..a86e48b2 100644 --- a/src/server/gameserver/skill/SimpleLinearMeleeSkill.cpp +++ b/src/server/gameserver/skill/SimpleLinearMeleeSkill.cpp @@ -34,8 +34,8 @@ void SimpleLinearMeleeSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p Assert(pPlayer != NULL); Assert(pZone != NULL); - // Ư Ⱑ ־ ִ ̶... - // 迭 ⸦ ִ üũؼ ƴ϶ д. + // 만일 이 기술이 특별한 무기가 있어야 시전할 수 있는 기술이라면... + // 그 계열의 무기를 들고 있는지를 체크해서 아니라면 실패다. bool bIncreaseExp = true; if (param.ItemClass != Item::ITEM_CLASS_MAX) { Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); @@ -63,10 +63,10 @@ void SimpleLinearMeleeSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p bool bRangeCheck = verifyDistance(pSlayer, X, Y, pSkillInfo->getRange()); if (bManaCheck && bTimeCheck && bRangeCheck) { - // MP ߸. + // MP를 떨어뜨린다. decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1); - // ǥ Ѵ. + // 좌표와 방향을 구한다. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); Dir_t dir = calcDirection(myX, myY, X, Y); @@ -91,9 +91,9 @@ void SimpleLinearMeleeSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p int tileX = (*ptitr).x; int tileY = (*ptitr).y; - // ̰, 밡 ƴ϶ Ȯ ִ. + // 존 내부이고, 안전지대가 아니라면 맞을 확률이 있다. if (rect.ptInRect(tileX, tileY)) { - // Ÿ ޾ƿ´. + // 타일을 받아온다. Tile& tile = pZone->getTile(tileX, tileY); list targetList; @@ -145,7 +145,7 @@ void SimpleLinearMeleeSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p bHitRoll = HitRoll::isSuccess(pSlayer, pTargetCreature, SkillLevel / 2); } - // 迭 ʴ 7% - by bezz + // 도 계열의 기술은 맞지 않더라도 7%의 데미지를 가진다 - by bezz if (param.ItemClass == Item::ITEM_CLASS_BLADE && !bHitRoll) { bHitRoll = true; bSetMinDamage = true; @@ -170,7 +170,7 @@ void SimpleLinearMeleeSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p Damage += param.SkillDamage; } - // HitRoll 迭 7% Ѵ - by bezz + // HitRoll 에서 실패한 도 계열의 기술의 경우 7%의 데미지를 갖도록 한다 - by bezz if (bSetMinDamage) { Damage = getPercentValue(Damage, 7); } @@ -184,18 +184,18 @@ void SimpleLinearMeleeSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p _GCSkillToTileOK2.addCListElement(targetObjectID); _GCSkillToTileOK5.addCListElement(targetObjectID); - // ϴ ´ Ŷ · ä, ش. + // 일단 맞는 놈이 받을 패킷은 널 상태로 한 채로, 데미지를 준다. setDamage(pTargetCreature, Damage, pSlayer, param.SkillType, NULL, &_GCSkillToTileOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, NULL, &_GCSkillToTileOK1); increaseAlignment(pSlayer, pTargetCreature, _GCSkillToTileOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } - // Ÿ ̾ ƴ 쿡 ɷ Ѵ. + // 타겟이 슬레이어가 아닌 경우에만 맞춘 걸로 간주한다. if (!pTargetCreature->isSlayer()) { bHit = true; if (maxEnemyLevel < pTargetCreature->getLevel()) @@ -253,7 +253,7 @@ void SimpleLinearMeleeSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p pPlayer->sendPacket(&_GCSkillToTileOK1); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; Assert(pTargetCreature != NULL); @@ -261,7 +261,7 @@ void SimpleLinearMeleeSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p if (pTargetCreature->isPC()) { _GCSkillToTileOK2.clearList(); - // HP Ŷ Ѵ. + // HP의 변경사항을 패킷에다 기록한다. HP_t targetHP = 0; if (pTargetCreature->isSlayer()) { targetHP = (dynamic_cast(pTargetCreature))->getHP(ATTR_CURRENT); @@ -272,13 +272,13 @@ void SimpleLinearMeleeSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p } _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // ߸. + // 아이템의 내구력을 떨어뜨린다. decreaseDurability(NULL, pTargetCreature, pSkillInfo, NULL, &_GCSkillToTileOK2); - // Ŷ ش. + // 패킷을 보내준다. pTargetCreature->getPlayer()->sendPacket(&_GCSkillToTileOK2); } else if (pTargetCreature->isMonster()) { - // νѴ. + // 당근 적으로 인식한다. Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pSlayer); } diff --git a/src/server/gameserver/skill/SimpleMeleeSkill.cpp b/src/server/gameserver/skill/SimpleMeleeSkill.cpp index bd7e5fad..981ff1ff 100644 --- a/src/server/gameserver/skill/SimpleMeleeSkill.cpp +++ b/src/server/gameserver/skill/SimpleMeleeSkill.cpp @@ -35,8 +35,8 @@ void SimpleMeleeSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Skill Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, param.SkillType); return; @@ -44,8 +44,8 @@ void SimpleMeleeSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Skill result.pTargetCreature = pTargetCreature; - // Ư Ⱑ ־߸ ִ ̶... - // Կ ⸦ ִ üũؼ ƴ϶ д. + // 만일 이 기술이 특별한 무기가 있어야만 시전할 수 있는 기술이라면... + // 그 게열의 무기를 들고 있는지를 체크해서 아니라면 실패다. bool bIncreaseDomainExp = true; if (param.ItemClass != Item::ITEM_CLASS_MAX) { Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); @@ -68,15 +68,15 @@ void SimpleMeleeSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Skill Damage_t Damage = 0; if (param.bAdd) { - // Ķͷ ޵ , - // Ϲ , ؾ Ѵ. - // Ķͷ ޵ ̴ , - // κб Ƿ, κб 0 ޵ȴ. + // 파라미터로 전달된 데미지 값이 더해지는 데미지라면, + // 일반 데미지를 계산 후, 데미지를 더해야 한다. + // 파라미터로 전달된 데미지 값이 직접적으로 쓰이는 데미지라면, + // 이 부분까지 들어오지 않으므로, 밑의 부분까지 0으로 전달된다. Damage += computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); } if (param.bMagicDamage) { - // ų , Լ ̿ ش. + // 만일 스킬 데미지가 마법 데미지라면, 마법 데미지 계산 함수를 이용해 계산을 해준다. Damage += computeMagicDamage(pTargetCreature, param.SkillDamage, param.SkillType); } else { Damage += param.SkillDamage; @@ -96,30 +96,30 @@ void SimpleMeleeSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Skill bHitRoll = HitRoll::isSuccess(pSlayer, pTargetCreature, SkillLevel / 2); } - // 迭 ʴ 7% - by bezz + // 도 계열의 기술은 맞지 않더라도 7%의 데미지를 가진다 - by bezz if (param.ItemClass == Item::ITEM_CLASS_BLADE && !bHitRoll) { Damage = getPercentValue(Damage, 7); bHitRoll = true; } - // ־ ϰ, ð Ÿ üũ ϰ, - // hitroll ϰ, ũν īͰ ɷ ʴٸ, ̴. + // 마나가 있어야 하고, 시간과 거리 체크에 성공하고, + // hitroll에 성공하고, 크로스 카운터가 걸려있지 않다면, 성공이다. if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bCanHit && bPK) { CheckCrossCounter(pSlayer, pTargetCreature, Damage, pSkillInfo->getRange()); decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); - // ְ, ߸. + // 데미지를 주고, 내구도를 떨어뜨린다. setDamage(pTargetCreature, Damage, pSlayer, param.SkillType, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); decreaseDurability(pSlayer, pTargetCreature, pSkillInfo, &_GCSkillToObjectOK1, &_GCSkillToObjectOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } - // ̾ ƴ 쿡 ġ ö󰣴. + // 슬레이어가 아닌 경우에만 경험치가 올라간다. if (!pTargetCreature->isSlayer()) { if (bIncreaseDomainExp) { shareAttrExp(pSlayer, Damage, param.STRMultiplier, param.DEXMultiplier, param.INTMultiplier, @@ -132,7 +132,7 @@ void SimpleMeleeSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Skill increaseAlignment(pSlayer, pTargetCreature, _GCSkillToObjectOK1); } - // Ŷ غϰ, . + // 패킷을 준비하고, 보낸다. _GCSkillToObjectOK1.setSkillType(param.SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); @@ -184,12 +184,12 @@ void SimpleMeleeSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Skill } if ((rand() % 100) < Ratio) { - // ػѵ! + // 스턴 당해뿌따! _GCSkillToObjectOK1.setGrade(1); _GCSkillToObjectOK2.setGrade(1); _GCSkillToObjectOK5.setGrade(1); } - } else // + } else // 몬스터일 경우 { _GCSkillToObjectOK1.setGrade(1); _GCSkillToObjectOK2.setGrade(1); @@ -246,8 +246,8 @@ void SimpleMeleeSkill::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vam Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, param.SkillType); return; @@ -264,15 +264,15 @@ void SimpleMeleeSkill::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vam Damage_t Damage = 0; if (param.bAdd) { - // Ķͷ ޵ , - // Ϲ , ؾ Ѵ. - // Ķͷ ޵ ̴ , - // κб Ƿ, κб 0 ޵ȴ. + // 파라미터로 전달된 데미지 값이 더해지는 데미지라면, + // 일반 데미지를 계산 후, 데미지를 더해야 한다. + // 파라미터로 전달된 데미지 값이 직접적으로 쓰이는 데미지라면, + // 이 부분까지 들어오지 않으므로, 밑의 부분까지 0으로 전달된다. Damage += computeDamage(pVampire, pTargetCreature, 0, bCriticalHit); } if (param.bMagicDamage) { - // ų , Լ ̿ ش. + // 만일 스킬 데미지가 마법 데미지라면, 마법 데미지 계산 함수를 이용해 계산을 해준다. Damage += computeMagicDamage(pTargetCreature, param.SkillDamage, param.SkillType, true, pVampire); } else { Damage += param.SkillDamage; @@ -295,20 +295,20 @@ void SimpleMeleeSkill::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vam if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bCanHit && bPK) { CheckCrossCounter(pVampire, pTargetCreature, Damage); - // ´. + // 마나를 깍는다. decreaseMana(pVampire, RequiredMP, _GCSkillToObjectOK1); - // ϰ, ߸. + // 데미지를 가하고, 아이템 내구도를 떨어뜨린다. setDamage(pTargetCreature, Damage, pVampire, param.SkillType, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); computeAlignmentChange(pTargetCreature, Damage, pVampire, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); decreaseDurability(pVampire, pTargetCreature, pSkillInfo, &_GCSkillToObjectOK1, &_GCSkillToObjectOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pVampire->getX(), pVampire->getY()); } - // ̹ 밡 ׾ٸ ġ ö󰣴. + // 이번 공격으로 상대가 죽었다면 경험치가 올라간다. if (pTargetCreature->isDead()) { int exp = computeCreatureExp(pTargetCreature, KILL_EXP); shareVampExp(pVampire, exp, _GCSkillToObjectOK1); @@ -316,7 +316,7 @@ void SimpleMeleeSkill::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vam increaseAlignment(pVampire, pTargetCreature, _GCSkillToObjectOK1); - // Ŷ . + // 패킷을 보낸다. _GCSkillToObjectOK1.setSkillType(param.SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); @@ -382,8 +382,8 @@ void SimpleMeleeSkill::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ous Creature* pTargetCreature = pZone->getCreature(TargetObjectID); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pOusters, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, param.SkillType, param.Grade); return; @@ -409,15 +409,15 @@ void SimpleMeleeSkill::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ous Damage_t Damage = 0; if (param.bAdd) { - // Ķͷ ޵ , - // Ϲ , ؾ Ѵ. - // Ķͷ ޵ ̴ , - // κб Ƿ, κб 0 ޵ȴ. + // 파라미터로 전달된 데미지 값이 더해지는 데미지라면, + // 일반 데미지를 계산 후, 데미지를 더해야 한다. + // 파라미터로 전달된 데미지 값이 직접적으로 쓰이는 데미지라면, + // 이 부분까지 들어오지 않으므로, 밑의 부분까지 0으로 전달된다. Damage += computeDamage(pOusters, pTargetCreature, 0, bCriticalHit); } if (param.bMagicDamage) { - // ų , Լ ̿ ش. + // 만일 스킬 데미지가 마법 데미지라면, 마법 데미지 계산 함수를 이용해 계산을 해준다. // Damage += computeMagicDamage(pTargetCreature, param.SkillDamage, param.SkillType, true); Damage += computeOustersMagicDamage(pOusters, pTargetCreature, param.SkillDamage, param.SkillType); } else { @@ -454,20 +454,20 @@ void SimpleMeleeSkill::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ous Damage += computeElementalCombatSkill(pOusters, pTargetCreature, _GCSkillToObjectOK1); CheckCrossCounter(pOusters, pTargetCreature, Damage); - // ´. + // 마나를 깍는다. decreaseMana(pOusters, RequiredMP, _GCSkillToObjectOK1); - // ϰ, ߸. + // 데미지를 가하고, 아이템 내구도를 떨어뜨린다. setDamage(pTargetCreature, Damage, pOusters, param.SkillType, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); computeAlignmentChange(pTargetCreature, Damage, pOusters, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); decreaseDurability(pOusters, pTargetCreature, pSkillInfo, &_GCSkillToObjectOK1, &_GCSkillToObjectOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pOusters->getX(), pOusters->getY()); } - // ̹ 밡 ׾ٸ ġ ö󰣴. + // 이번 공격으로 상대가 죽었다면 경험치가 올라간다. if (pTargetCreature->isDead()) { int exp = computeCreatureExp(pTargetCreature, 100, pOusters); shareOustersExp(pOusters, exp, _GCSkillToObjectOK1); @@ -475,7 +475,7 @@ void SimpleMeleeSkill::execute(Ousters* pOusters, ObjectID_t TargetObjectID, Ous increaseAlignment(pOusters, pTargetCreature, _GCSkillToObjectOK1); - // Ŷ . + // 패킷을 보낸다. _GCSkillToObjectOK1.setSkillType(param.SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); @@ -555,15 +555,15 @@ void SimpleMeleeSkill::execute(Monster* pMonster, Creature* pEnemy, const SIMPLE Damage_t Damage = 0; if (param.bAdd) { - // Ķͷ ޵ , - // Ϲ , ؾ Ѵ. - // Ķͷ ޵ ̴ , - // κб Ƿ, κб 0 ޵ȴ. + // 파라미터로 전달된 데미지 값이 더해지는 데미지라면, + // 일반 데미지를 계산 후, 데미지를 더해야 한다. + // 파라미터로 전달된 데미지 값이 직접적으로 쓰이는 데미지라면, + // 이 부분까지 들어오지 않으므로, 밑의 부분까지 0으로 전달된다. Damage += computeDamage(pMonster, pEnemy, 0, bCriticalHit); } if (param.bMagicDamage) { - // ų , Լ ̿ ش. + // 만일 스킬 데미지가 마법 데미지라면, 마법 데미지 계산 함수를 이용해 계산을 해준다. Damage += computeMagicDamage(pEnemy, param.SkillDamage, param.SkillType); } else { Damage += param.SkillDamage; @@ -579,20 +579,20 @@ void SimpleMeleeSkill::execute(Monster* pMonster, Creature* pEnemy, const SIMPLE bHitRoll = HitRoll::isSuccess(pMonster, pEnemy); } - // . + // 기술성공률 검증. if (bRangeCheck && bHitRoll && bCanHit) { CheckCrossCounter(pMonster, pEnemy, Damage); - // ϰ, ߸. + // 데미지를 가하고, 아이템 내구도를 떨어뜨린다. setDamage(pEnemy, Damage, pMonster, param.SkillType, &_GCSkillToObjectOK2); decreaseDurability(pMonster, pEnemy, pSkillInfo, NULL, &_GCSkillToObjectOK2); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pEnemy, pMonster->getX(), pMonster->getY()); } - // Ŷ . + // 패킷을 보낸다. _GCSkillToObjectOK2.setObjectID(pMonster->getObjectID()); _GCSkillToObjectOK2.setSkillType(param.SkillType); _GCSkillToObjectOK2.setDuration(0); diff --git a/src/server/gameserver/skill/SimpleMissileSkill.cpp b/src/server/gameserver/skill/SimpleMissileSkill.cpp index 50703ef6..ad9aac1d 100644 --- a/src/server/gameserver/skill/SimpleMissileSkill.cpp +++ b/src/server/gameserver/skill/SimpleMissileSkill.cpp @@ -38,8 +38,8 @@ void SimpleMissileSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Ski // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, param.SkillType); return; @@ -60,15 +60,15 @@ void SimpleMissileSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Ski Damage_t Damage = 0; if (param.bAdd) { - // Ķͷ ޵ , - // Ϲ , ؾ Ѵ. - // Ķͷ ޵ ̴ , - // κб Ƿ, κб 0 ޵ȴ. + // 파라미터로 전달된 데미지 값이 더해지는 데미지라면, + // 일반 데미지를 계산 후, 데미지를 더해야 한다. + // 파라미터로 전달된 데미지 값이 직접적으로 쓰이는 데미지라면, + // 이 부분까지 들어오지 않으므로, 밑의 부분까지 0으로 전달된다. Damage += computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); } if (param.bMagicDamage) { - // ų , Լ ̿ ش. + // 만일 스킬 데미지가 마법 데미지라면, 마법 데미지 계산 함수를 이용해 계산을 해준다. Damage += computeMagicDamage(pTargetCreature, param.SkillDamage, param.SkillType); } else { Damage += param.SkillDamage; @@ -95,12 +95,12 @@ void SimpleMissileSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Ski if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bPK) { decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); - // ϰ, ߸. + // 데미지를 가하고, 내구도를 떨어뜨린다. setDamage(pTargetCreature, Damage, pSlayer, param.SkillType, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); decreaseDurability(pSlayer, pTargetCreature, NULL, &_GCSkillToObjectOK1, &_GCSkillToObjectOK2); - // Ÿ ̾ ƴ 쿡 ġ ÷ش. + // 타겟이 슬레이어가 아닌 경우에만 경험치를 올려준다. if (!pTargetCreature->isSlayer()) { shareAttrExp(pSlayer, Damage, param.STRMultiplier, param.DEXMultiplier, param.INTMultiplier, _GCSkillToObjectOK1); @@ -184,8 +184,8 @@ void SimpleMissileSkill::execute(Vampire* pVampire, ObjectID_t TargetObjectID, V Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, param.SkillType); return; @@ -205,15 +205,15 @@ void SimpleMissileSkill::execute(Vampire* pVampire, ObjectID_t TargetObjectID, V Damage_t Damage = 0; if (param.bAdd) { - // Ķͷ ޵ , - // Ϲ , ؾ Ѵ. - // Ķͷ ޵ ̴ , - // κб Ƿ, κб 0 ޵ȴ. + // 파라미터로 전달된 데미지 값이 더해지는 데미지라면, + // 일반 데미지를 계산 후, 데미지를 더해야 한다. + // 파라미터로 전달된 데미지 값이 직접적으로 쓰이는 데미지라면, + // 이 부분까지 들어오지 않으므로, 밑의 부분까지 0으로 전달된다. Damage += computeDamage(pVampire, pTargetCreature, 0, bCriticalHit); } if (param.bMagicDamage) { - // ų , Լ ̿ ش. + // 만일 스킬 데미지가 마법 데미지라면, 마법 데미지 계산 함수를 이용해 계산을 해준다. Damage += computeMagicDamage(pTargetCreature, param.SkillDamage, param.SkillType, true, pVampire); } else { Damage += param.SkillDamage; @@ -243,7 +243,7 @@ void SimpleMissileSkill::execute(Vampire* pVampire, ObjectID_t TargetObjectID, V bool bCanSeeCaster = canSee(pTargetCreature, pVampire); - // ϰ, ߸. + // 데미지를 가하고, 아이템 내구도를 떨어뜨린다. if (bCanSeeCaster) { setDamage(pTargetCreature, Damage, pVampire, param.SkillType, &_GCSkillToObjectOK2, &_GCSkillToObjectOK1); @@ -256,7 +256,7 @@ void SimpleMissileSkill::execute(Vampire* pVampire, ObjectID_t TargetObjectID, V decreaseDurability(pVampire, pTargetCreature, pSkillInfo, &_GCSkillToObjectOK1, &_GCSkillToObjectOK6); } - // 밡 ׾ٸ ġ ÷ش. + // 상대가 죽었다면 경험치를 좀 올려준다. if (pTargetCreature->isDead()) { int exp = computeCreatureExp(pTargetCreature, KILL_EXP); shareVampExp(pVampire, exp, _GCSkillToObjectOK1); @@ -343,8 +343,8 @@ void SimpleMissileSkill::execute(Ousters* pOusters, ObjectID_t TargetObjectID, O Creature* pTargetCreature = pZone->getCreature(TargetObjectID); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pOusters, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, param.SkillType, param.Grade); return; @@ -373,15 +373,15 @@ void SimpleMissileSkill::execute(Ousters* pOusters, ObjectID_t TargetObjectID, O Damage_t Damage = 0; if (param.bAdd) { - // Ķͷ ޵ , - // Ϲ , ؾ Ѵ. - // Ķͷ ޵ ̴ , - // κб Ƿ, κб 0 ޵ȴ. + // 파라미터로 전달된 데미지 값이 더해지는 데미지라면, + // 일반 데미지를 계산 후, 데미지를 더해야 한다. + // 파라미터로 전달된 데미지 값이 직접적으로 쓰이는 데미지라면, + // 이 부분까지 들어오지 않으므로, 밑의 부분까지 0으로 전달된다. Damage += computeDamage(pOusters, pTargetCreature, 0, bCriticalHit); } if (param.bMagicDamage) { - // ų , Լ ̿ ش. + // 만일 스킬 데미지가 마법 데미지라면, 마법 데미지 계산 함수를 이용해 계산을 해준다. // Damage += computeMagicDamage(pTargetCreature, param.SkillDamage, param.SkillType, true); Damage += computeOustersMagicDamage(pOusters, pTargetCreature, param.SkillDamage, param.SkillType); } else { @@ -534,15 +534,15 @@ void SimpleMissileSkill::execute(Monster* pMonster, Creature* pEnemy, const SIMP Damage_t Damage = 0; if (param.bAdd) { - // Ķͷ ޵ , - // Ϲ , ؾ Ѵ. - // Ķͷ ޵ ̴ , - // κб Ƿ, κб 0 ޵ȴ. + // 파라미터로 전달된 데미지 값이 더해지는 데미지라면, + // 일반 데미지를 계산 후, 데미지를 더해야 한다. + // 파라미터로 전달된 데미지 값이 직접적으로 쓰이는 데미지라면, + // 이 부분까지 들어오지 않으므로, 밑의 부분까지 0으로 전달된다. Damage += computeDamage(pMonster, pEnemy, 0, bCriticalHit); } if (param.bMagicDamage) { - // ų , Լ ̿ ش. + // 만일 스킬 데미지가 마법 데미지라면, 마법 데미지 계산 함수를 이용해 계산을 해준다. Damage += computeMagicDamage(pEnemy, param.SkillDamage, param.SkillType); } else { Damage += param.SkillDamage; @@ -563,11 +563,11 @@ void SimpleMissileSkill::execute(Monster* pMonster, Creature* pEnemy, const SIMP Coord_t targetX = pEnemy->getX(); Coord_t targetY = pEnemy->getY(); - // ݼ . + // 공격성공률 검증. if (bRangeCheck && bHitRoll && bCanHit) { bool bCanSeeCaster = canSee(pEnemy, pMonster); - // ϰ, ߸. + // 데미지를 가하고, 아이템 내구도를 떨어뜨린다. if (bCanSeeCaster) { setDamage(pEnemy, Damage, pMonster, param.SkillType, &_GCSkillToObjectOK2); decreaseDurability(pMonster, pEnemy, pSkillInfo, NULL, &_GCSkillToObjectOK2); diff --git a/src/server/gameserver/skill/SimpleSkill.h b/src/server/gameserver/skill/SimpleSkill.h index 97fa3a01..921b925a 100644 --- a/src/server/gameserver/skill/SimpleSkill.h +++ b/src/server/gameserver/skill/SimpleSkill.h @@ -27,9 +27,9 @@ class TILE_MASK { } public: - int x; // ߽ Ǵ ǥκ x offset - int y; // ߽ Ǵ ǥκ y offset - int penalty; // Ƽ + int x; // 중심이 되는 좌표로부터의 x offset + int y; // 중심이 되는 좌표로부터의 y offset + int penalty; // 데미지 계산시 가할 페널티 }; ////////////////////////////////////////////////////////////////////////////// @@ -65,20 +65,20 @@ class SIMPLE_SKILL_INPUT { } public: - SkillType_t SkillType; // ų Ÿ - Damage_t SkillDamage; // ų ȿġ - Turn_t Delay; // ų - Item::ItemClass ItemClass; // ϱ ʿ - int STRMultiplier; // ̾ ɷġ ġ ġ - int DEXMultiplier; // ̾ ɷġ ġ ġ - int INTMultiplier; // ̾ ɷġ ġ ġ - int Level; // ̴ - bool bMagicHitRoll; // ߷ ΰ, Ϲ ΰ... - bool bMagicDamage; // ų ΰ... - bool bAdd; // SkillDamage ؾ ϳ, ׳ ϳ... - list MaskList; // Ÿ ų , ũ Ʈ - bool bExpForTotalDamage; // ü damage ؼ ġ ÷ش. - BYTE Grade; // ų + SkillType_t SkillType; // 스킬 타입 + Damage_t SkillDamage; // 스킬의 효과치 + Turn_t Delay; // 스킬의 딜레이 + Item::ItemClass ItemClass; // 기술을 사용하기 위해 필요한 아이템 + int STRMultiplier; // 슬레이어 능력치 경험치 증폭치 + int DEXMultiplier; // 슬레이어 능력치 경험치 증폭치 + int INTMultiplier; // 슬레이어 능력치 경험치 증폭치 + int Level; // 여러 가지 목적으로 쓰이는 레벨 + bool bMagicHitRoll; // 마법 명중률 굴림인가, 일반 공격 굴림인가... + bool bMagicDamage; // 스킬의 데미지가 마법 데미지인가... + bool bAdd; // SkillDamage를 더해야 하나, 그냥 써야 하나... + list MaskList; // 타일 스킬일 경우, 마스크 리스트 + bool bExpForTotalDamage; // 전체 damage에 대해서 경험치를 올려준다. + BYTE Grade; // 스킬 등급 }; ////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/gameserver/skill/SimpleTileCureSkill.cpp b/src/server/gameserver/skill/SimpleTileCureSkill.cpp index 988ea7a0..60f4ecfe 100644 --- a/src/server/gameserver/skill/SimpleTileCureSkill.cpp +++ b/src/server/gameserver/skill/SimpleTileCureSkill.cpp @@ -86,7 +86,7 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, const EffectBloodDrain* pEffectBloodDrain = NULL; - bHPCheck = false; // ũĸ üũҶ ؾ ? 2002.05.31 by bezz + bHPCheck = false; // 크리쳐를 체크할때 마다 새로 세팅해야하지 않을까? 2002.05.31 by bezz if (pTargetCreature->isSlayer() && !pTargetCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { HP_t CurrentHP = dynamic_cast(pTargetCreature)->getHP(ATTR_CURRENT); @@ -112,7 +112,7 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, const if (bHitRoll && bHPCheck && pTargetCreature->isAlive()) { Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); - // ȿ broadcast + // 힐 효과 broadcast // by sigi. 2002.6.1 ///* _GCSkillToSelfOK1.setSkillType(SKILL_CURE_EFFECT); @@ -127,16 +127,16 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, const //*/ - // ¶ ¸ ش. + // 흡혈당한 상태라면 흡혈 상태를 날려준다. if (pEffectBloodDrain != NULL && pEffectBloodDrain->getLevel() < param.Level) { - // ƸƮ ϱ Ʈ ٿش. + // 흡혈 아르바이트를 방지하기 위한 후유증 이펙트를 붙여준다. if (pTargetSlayer->isFlag(Effect::EFFECT_CLASS_AFTERMATH)) { Effect* pEffect = pTargetSlayer->findEffect(Effect::EFFECT_CLASS_AFTERMATH); EffectAftermath* pEffectAftermath = dynamic_cast(pEffect); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. } else { EffectAftermath* pEffectAftermath = new EffectAftermath(pTargetSlayer); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. pTargetSlayer->addEffect(pEffectAftermath); pTargetSlayer->setFlag(Effect::EFFECT_CLASS_AFTERMATH); pEffectAftermath->create(pTargetSlayer->getName()); @@ -162,11 +162,11 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, const pZone->broadcastPacket(pTargetSlayer->getX(), pTargetSlayer->getY(), &gcRemoveEffect); } - // HP Ѵ. + // HP를 세팅한다. HP_t CurrentHP = pTargetSlayer->getHP(ATTR_CURRENT); HP_t MaxHP = pTargetSlayer->getHP(ATTR_MAX); - // ȸ ġ Ѵ. + // 실제 회복 수치를 계산한다. if (CurrentHP + HealPoint <= MaxHP) { RealHealPoint = max((unsigned int)0, HealPoint); } else { @@ -183,7 +183,7 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, const } if (bheal) { - // ġ ÷ش. + // 경험치를 올려준다. shareAttrExp(pSlayer, RealHealPoint, param.STRMultiplier, param.DEXMultiplier, param.INTMultiplier, _GCSkillToTileOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToTileOK1); @@ -228,7 +228,7 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, const // cout << "Healed Creature Size : " << (int)cList.size() << endl; cList.push_back(pSlayer); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; Assert(pTargetCreature != NULL); @@ -247,12 +247,12 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, const _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // Ŷ ش. + // 패킷을 보내준다. Player* pPlayer = pTargetCreature->getPlayer(); Assert(pPlayer != NULL); pPlayer->sendPacket(&_GCSkillToTileOK2); - // HP εijѴ. + // HP를 브로드캐스팅한다. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pTargetCreature->getObjectID()); gcStatusCurrentHP.setCurrentHP(targetHP); @@ -294,7 +294,7 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, param.SkillType); return; @@ -342,7 +342,7 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk EffectBloodDrain* pEffectBloodDrain = NULL; bool bSlayer = false; - bHPCheck = false; // ũĸ üũҶ ؾ ? 2002.05.31 by bezz + bHPCheck = false; // 크리쳐를 체크할때 마다 새로 세팅해야하지 않을까? 2002.05.31 by bezz if (pTargetCreature->isSlayer() && !pTargetCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { HP_t CurrentHP = dynamic_cast(pTargetCreature)->getHP(ATTR_CURRENT); @@ -371,16 +371,16 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); Assert(pTargetSlayer != NULL); - // ¶ ¸ ش. + // 흡혈당한 상태라면 흡혈 상태를 날려준다. if (pEffectBloodDrain != NULL && pEffectBloodDrain->getLevel() < param.Level) { - // ƸƮ ϱ Ʈ ٿش. + // 흡혈 아르바이트를 방지하기 위한 후유증 이펙트를 붙여준다. if (pTargetSlayer->isFlag(Effect::EFFECT_CLASS_AFTERMATH)) { Effect* pEffect = pTargetSlayer->findEffect(Effect::EFFECT_CLASS_AFTERMATH); EffectAftermath* pEffectAftermath = dynamic_cast(pEffect); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. } else { EffectAftermath* pEffectAftermath = new EffectAftermath(pTargetSlayer); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. pTargetSlayer->addEffect(pEffectAftermath); pTargetSlayer->setFlag(Effect::EFFECT_CLASS_AFTERMATH); pEffectAftermath->create(pTargetSlayer->getName()); @@ -406,11 +406,11 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk pZone->broadcastPacket(pTargetSlayer->getX(), pTargetSlayer->getY(), &gcRemoveEffect); } - // HP Ѵ. + // HP를 세팅한다. HP_t CurrentHP = pTargetSlayer->getHP(ATTR_CURRENT); HP_t MaxHP = pTargetSlayer->getHP(ATTR_MAX); - // ȸ ġ Ѵ. + // 실제 회복 수치를 계산한다. if (CurrentHP + HealPoint <= MaxHP) { RealHealPoint = max((unsigned int)0, HealPoint); } else { @@ -426,7 +426,7 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk } if (bheal) { - // ġ ÷ش. + // 경험치를 올려준다. shareAttrExp(pSlayer, RealHealPoint, param.STRMultiplier, param.DEXMultiplier, param.INTMultiplier, _GCSkillToTileOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToTileOK1); @@ -471,7 +471,7 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk // cout << "Healed Creature Size : " << (int)cList.size() << endl; cList.push_back(pSlayer); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; Assert(pTargetCreature != NULL); @@ -490,12 +490,12 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, Sk _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // Ŷ ش. + // 패킷을 보내준다. Player* pPlayer = pTargetCreature->getPlayer(); Assert(pPlayer != NULL); pPlayer->sendPacket(&_GCSkillToTileOK2); - // HP εijѴ. + // HP를 브로드캐스팅한다. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pTargetCreature->getObjectID()); gcStatusCurrentHP.setCurrentHP(targetHP); @@ -574,7 +574,7 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, EffectBloodDrain* pEffectBloodDrain = NULL; bool bSlayer = false; - bHPCheck = false; // ũĸ üũҶ ؾ ? 2002.05.31 by bezz + bHPCheck = false; // 크리쳐를 체크할때 마다 새로 세팅해야하지 않을까? 2002.05.31 by bezz if (pTargetCreature->isSlayer() && !pTargetCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { HP_t CurrentHP = dynamic_cast(pTargetCreature)->getHP(ATTR_CURRENT); HP_t MaxHP = dynamic_cast(pTargetCreature)->getHP(ATTR_MAX); @@ -602,16 +602,16 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Slayer* pTargetSlayer = dynamic_cast(pTargetCreature); Assert(pTargetSlayer != NULL); - // ¶ ¸ ش. + // 흡혈당한 상태라면 흡혈 상태를 날려준다. if (pEffectBloodDrain != NULL && pEffectBloodDrain->getLevel() < param.Level) { - // ƸƮ ϱ Ʈ ٿش. + // 흡혈 아르바이트를 방지하기 위한 후유증 이펙트를 붙여준다. if (pTargetSlayer->isFlag(Effect::EFFECT_CLASS_AFTERMATH)) { Effect* pEffect = pTargetSlayer->findEffect(Effect::EFFECT_CLASS_AFTERMATH); EffectAftermath* pEffectAftermath = dynamic_cast(pEffect); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. } else { EffectAftermath* pEffectAftermath = new EffectAftermath(pTargetSlayer); - pEffectAftermath->setDeadline(5 * 600); // 5 ӵȴ. + pEffectAftermath->setDeadline(5 * 600); // 5분 동안 지속된다. pTargetSlayer->addEffect(pEffectAftermath); pTargetSlayer->setFlag(Effect::EFFECT_CLASS_AFTERMATH); pEffectAftermath->create(pTargetSlayer->getName()); @@ -638,11 +638,11 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, pZone->broadcastPacket(pTargetSlayer->getX(), pTargetSlayer->getY(), &gcRemoveEffect); } - // HP Ѵ. + // HP를 세팅한다. HP_t CurrentHP = pTargetSlayer->getHP(ATTR_CURRENT); HP_t MaxHP = pTargetSlayer->getHP(ATTR_MAX); - // ȸ ġ Ѵ. + // 실제 회복 수치를 계산한다. if (CurrentHP + HealPoint <= MaxHP) { RealHealPoint = max((unsigned int)0, HealPoint); } else { @@ -658,7 +658,7 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, } if (bheal) { - // ġ ÷ش. + // 경험치를 올려준다. shareAttrExp(pSlayer, RealHealPoint, param.STRMultiplier, param.DEXMultiplier, param.INTMultiplier, _GCSkillToTileOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToTileOK1); @@ -703,7 +703,7 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, // cout << "Healed Creature Size : " << (int)cList.size() << endl; cList.push_back(pSlayer); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; Assert(pTargetCreature != NULL); @@ -722,12 +722,12 @@ void SimpleTileCureSkill::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // Ŷ ش. + // 패킷을 보내준다. Player* pPlayer = pTargetCreature->getPlayer(); Assert(pPlayer != NULL); pPlayer->sendPacket(&_GCSkillToTileOK2); - // HP εijѴ. + // HP를 브로드캐스팅한다. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pTargetCreature->getObjectID()); gcStatusCurrentHP.setCurrentHP(targetHP); diff --git a/src/server/gameserver/skill/SimpleTileMissileSkill.cpp b/src/server/gameserver/skill/SimpleTileMissileSkill.cpp index 54146afe..0f71c302 100644 --- a/src/server/gameserver/skill/SimpleTileMissileSkill.cpp +++ b/src/server/gameserver/skill/SimpleTileMissileSkill.cpp @@ -31,8 +31,8 @@ void SimpleTileMissileSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p Assert(pPlayer != NULL); Assert(pZone != NULL); - // Ư Ⱑ ־ ִ ̶... - // 迭 ⸦ ִ üũؼ ƴ϶ д. + // 만일 이 기술이 특별한 무기가 있어야 시전할 수 있는 기술이라면... + // 그 계열의 무기를 들고 있는지를 체크해서 아니라면 실패다. bool bIncreaseExp = true; if (param.ItemClass != Item::ITEM_CLASS_MAX) { @@ -62,10 +62,10 @@ void SimpleTileMissileSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p bool bRangeCheck = verifyDistance(pSlayer, X, Y, pSkillInfo->getRange()); if (bManaCheck && bTimeCheck && bRangeCheck) { - // ߸. + // 마나를 떨어뜨린다. decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1); - // ǥ Ѵ. + // 좌표와 방향을 구한다. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); Dir_t dir = calcDirection(myX, myY, X, Y); @@ -90,9 +90,9 @@ void SimpleTileMissileSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p int tileY = Y + mask.y; int penalty = mask.penalty; - // Ÿ ̰, 밡 ƴ϶ ɼ ִ. + // 현재 타일이 존 내부이고, 안전지대가 아니라면 맞을 가능성이 있다. if (rect.ptInRect(tileX, tileY)) { - // Ÿ ޾ƿ´. + // 타일을 받아온다. Tile& tile = pZone->getTile(tileX, tileY); list targetList; @@ -156,7 +156,7 @@ void SimpleTileMissileSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p MaxDamage = max(Damage, MaxDamage); TotalDamage += Damage; - // Ƽ ⺻ 100̴. + // 페널티는 기본적으로 100이다. Damage = getPercentValue(Damage, penalty); ObjectID_t targetObjectID = pTargetCreature->getObjectID(); @@ -166,18 +166,18 @@ void SimpleTileMissileSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p _GCSkillToTileOK2.addCListElement(targetObjectID); _GCSkillToTileOK5.addCListElement(targetObjectID); - // ϴ ´ Ŷ · ä, ش. + // 일단 맞는 놈이 받을 패킷은 널 상태로 한 채로, 데미지를 준다. setDamage(pTargetCreature, Damage, pSlayer, param.SkillType, NULL, &_GCSkillToTileOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, NULL, &_GCSkillToTileOK1); increaseAlignment(pSlayer, pTargetCreature, _GCSkillToTileOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit || bForceKnockback) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } - // Ÿ ̾ ƴ 쿡 ɷ Ѵ. + // 타겟이 슬레이어가 아닐 경우에만 맞춘 걸로 간주한다. if (!pTargetCreature->isSlayer()) { bHit = true; if (maxEnemyLevel < pTargetCreature->getLevel()) @@ -207,7 +207,7 @@ void SimpleTileMissileSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p } } - // ߸. + // 공격자의 아이템 내구성을 떨어뜨린다. if (pSkillInfo->getDomainType() != SKILL_DOMAIN_GUN) { decreaseDurability(pSlayer, NULL, pSkillInfo, &_GCSkillToTileOK1, NULL); } else { @@ -240,7 +240,7 @@ void SimpleTileMissileSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p pPlayer->sendPacket(&_GCSkillToTileOK1); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; Assert(pTargetCreature != NULL); @@ -248,7 +248,7 @@ void SimpleTileMissileSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p if (pTargetCreature->isPC()) { _GCSkillToTileOK2.clearList(); - // HP Ŷ Ѵ. + // HP의 변경사항을 패킷에다 기록한다. HP_t targetHP = 0; if (pTargetCreature->isSlayer()) { targetHP = (dynamic_cast(pTargetCreature))->getHP(ATTR_CURRENT); @@ -260,7 +260,7 @@ void SimpleTileMissileSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // ߸. + // 아이템의 내구력을 떨어뜨린다. decreaseDurability(NULL, pTargetCreature, pSkillInfo, NULL, &_GCSkillToTileOK2); // if ( param.SkillType == SKILL_WILD_TYPHOON ) @@ -272,11 +272,11 @@ void SimpleTileMissileSkill::execute(Slayer* pSlayer, int X, int Y, SkillSlot* p // } // } - // Ŷ ش. + // 패킷을 보내준다. pTargetCreature->getPlayer()->sendPacket(&_GCSkillToTileOK2); // _GCSkillToTileOK2.setSkillType(param.SkillType); } else if (pTargetCreature->isMonster()) { - // νѴ. + // 당근 적으로 인식한다. Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pSlayer); } @@ -336,10 +336,10 @@ void SimpleTileMissileSkill::execute(Vampire* pVampire, int X, int Y, VampireSki } if (bManaCheck && bTimeCheck && bRangeCheck) { - // ߸. + // 마나를 떨어뜨린다. decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); - // ǥ Ѵ. + // 좌표와 방향을 구한다. ZoneCoord_t myX = pVampire->getX(); ZoneCoord_t myY = pVampire->getY(); Dir_t dir = calcDirection(myX, myY, X, Y); @@ -358,9 +358,9 @@ void SimpleTileMissileSkill::execute(Vampire* pVampire, int X, int Y, VampireSki int tileY = Y + mask.y; int penalty = mask.penalty; - // Ÿ ̰, 밡 ƴ϶ ɼ ִ. + // 현재 타일이 존 내부이고, 안전지대가 아니라면 맞을 가능성이 있다. if (rect.ptInRect(tileX, tileY)) { - // Ÿ ޾ƿ´. + // 타일을 받아온다. Tile& tile = pZone->getTile(tileX, tileY); list targetList; @@ -422,7 +422,7 @@ void SimpleTileMissileSkill::execute(Vampire* pVampire, int X, int Y, VampireSki Damage += param.SkillDamage; } - // Ƽ ⺻ 100̴. + // 페널티는 기본적으로 100이다. Damage = getPercentValue(Damage, penalty); ObjectID_t targetObjectID = pTargetCreature->getObjectID(); @@ -432,13 +432,13 @@ void SimpleTileMissileSkill::execute(Vampire* pVampire, int X, int Y, VampireSki _GCSkillToTileOK2.addCListElement(targetObjectID); _GCSkillToTileOK5.addCListElement(targetObjectID); - // ϴ ´ Ŷ · ä, ش. + // 일단 맞는 놈이 받을 패킷은 널 상태로 한 채로, 데미지를 준다. setDamage(pTargetCreature, Damage, pVampire, param.SkillType, NULL, &_GCSkillToTileOK1); computeAlignmentChange(pTargetCreature, Damage, pVampire, NULL, &_GCSkillToTileOK1); increaseAlignment(pVampire, pTargetCreature, _GCSkillToTileOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit || bForceKnockback) { knockbackCreature(pZone, pTargetCreature, pVampire->getX(), pVampire->getY()); } @@ -453,7 +453,7 @@ void SimpleTileMissileSkill::execute(Vampire* pVampire, int X, int Y, VampireSki } } - // ߸. + // 공격자의 아이템 내구성을 떨어뜨린다. decreaseDurability(pVampire, NULL, pSkillInfo, &_GCSkillToTileOK1, NULL); _GCSkillToTileOK1.setSkillType(param.SkillType); @@ -479,7 +479,7 @@ void SimpleTileMissileSkill::execute(Vampire* pVampire, int X, int Y, VampireSki pPlayer->sendPacket(&_GCSkillToTileOK1); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; Assert(pTargetCreature != NULL); @@ -487,7 +487,7 @@ void SimpleTileMissileSkill::execute(Vampire* pVampire, int X, int Y, VampireSki if (pTargetCreature->isPC()) { _GCSkillToTileOK2.clearList(); - // HP Ŷ Ѵ. + // HP의 변경사항을 패킷에다 기록한다. HP_t targetHP = 0; if (pTargetCreature->isSlayer()) { targetHP = (dynamic_cast(pTargetCreature))->getHP(ATTR_CURRENT); @@ -499,13 +499,13 @@ void SimpleTileMissileSkill::execute(Vampire* pVampire, int X, int Y, VampireSki _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // ߸. + // 아이템의 내구력을 떨어뜨린다. decreaseDurability(NULL, pTargetCreature, pSkillInfo, NULL, &_GCSkillToTileOK2); - // Ŷ ش. + // 패킷을 보내준다. pTargetCreature->getPlayer()->sendPacket(&_GCSkillToTileOK2); } else if (pTargetCreature->isMonster()) { - // νѴ. + // 당근 적으로 인식한다. Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pVampire); } @@ -558,10 +558,10 @@ void SimpleTileMissileSkill::execute(Ousters* pOusters, int X, int Y, OustersSki bool bRangeCheck = verifyDistance(pOusters, X, Y, pSkillInfo->getRange()); if (bManaCheck && bTimeCheck && bRangeCheck) { - // ߸. + // 마나를 떨어뜨린다. decreaseMana(pOusters, RequiredMP, _GCSkillToTileOK1); - // ǥ Ѵ. + // 좌표와 방향을 구한다. ZoneCoord_t myX = pOusters->getX(); ZoneCoord_t myY = pOusters->getY(); Dir_t dir = calcDirection(myX, myY, X, Y); @@ -587,9 +587,9 @@ void SimpleTileMissileSkill::execute(Ousters* pOusters, int X, int Y, OustersSki canSteal = false; } - // Ÿ ̰, 밡 ƴ϶ ɼ ִ. + // 현재 타일이 존 내부이고, 안전지대가 아니라면 맞을 가능성이 있다. if (rect.ptInRect(tileX, tileY)) { - // Ÿ ޾ƿ´. + // 타일을 받아온다. Tile& tile = pZone->getTile(tileX, tileY); list targetList; @@ -652,7 +652,7 @@ void SimpleTileMissileSkill::execute(Ousters* pOusters, int X, int Y, OustersSki computeCriticalBonus(pOusters, param.SkillType, Damage, bCriticalHit); - // Ƽ ⺻ 100̴. + // 페널티는 기본적으로 100이다. Damage = getPercentValue(Damage, penalty); ObjectID_t targetObjectID = pTargetCreature->getObjectID(); @@ -662,14 +662,14 @@ void SimpleTileMissileSkill::execute(Ousters* pOusters, int X, int Y, OustersSki _GCSkillToTileOK2.addCListElement(targetObjectID); _GCSkillToTileOK5.addCListElement(targetObjectID); - // ϴ ´ Ŷ · ä, ش. + // 일단 맞는 놈이 받을 패킷은 널 상태로 한 채로, 데미지를 준다. setDamage(pTargetCreature, Damage, pOusters, param.SkillType, NULL, &_GCSkillToTileOK1, true, canSteal); computeAlignmentChange(pTargetCreature, Damage, pOusters, NULL, &_GCSkillToTileOK1); increaseAlignment(pOusters, pTargetCreature, _GCSkillToTileOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit || bForceKnockback) { knockbackCreature(pZone, pTargetCreature, pOusters->getX(), pOusters->getY()); } @@ -686,7 +686,7 @@ void SimpleTileMissileSkill::execute(Ousters* pOusters, int X, int Y, OustersSki } } - // ߸. + // 공격자의 아이템 내구성을 떨어뜨린다. decreaseDurability(pOusters, NULL, pSkillInfo, &_GCSkillToTileOK1, NULL); _GCSkillToTileOK1.setSkillType(param.SkillType); @@ -715,7 +715,7 @@ void SimpleTileMissileSkill::execute(Ousters* pOusters, int X, int Y, OustersSki pPlayer->sendPacket(&_GCSkillToTileOK1); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; Assert(pTargetCreature != NULL); @@ -723,7 +723,7 @@ void SimpleTileMissileSkill::execute(Ousters* pOusters, int X, int Y, OustersSki if (pTargetCreature->isPC()) { _GCSkillToTileOK2.clearList(); - // HP Ŷ Ѵ. + // HP의 변경사항을 패킷에다 기록한다. HP_t targetHP = 0; if (pTargetCreature->isSlayer()) { targetHP = (dynamic_cast(pTargetCreature))->getHP(ATTR_CURRENT); @@ -735,13 +735,13 @@ void SimpleTileMissileSkill::execute(Ousters* pOusters, int X, int Y, OustersSki _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // ߸. + // 아이템의 내구력을 떨어뜨린다. decreaseDurability(NULL, pTargetCreature, pSkillInfo, NULL, &_GCSkillToTileOK2); - // Ŷ ش. + // 패킷을 보내준다. pTargetCreature->getPlayer()->sendPacket(&_GCSkillToTileOK2); } else if (pTargetCreature->isMonster()) { - // νѴ. + // 당근 적으로 인식한다. Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pOusters); } @@ -791,7 +791,7 @@ void SimpleTileMissileSkill::execute(Monster* pMonster, int X, int Y, const SIMP bRangeCheck = true; if (bRangeCheck && bHitRoll) { - // ǥ Ѵ. + // 좌표와 방향을 구한다. ZoneCoord_t myX = pMonster->getX(); ZoneCoord_t myY = pMonster->getY(); Dir_t dir = calcDirection(myX, myY, X, Y); @@ -810,9 +810,9 @@ void SimpleTileMissileSkill::execute(Monster* pMonster, int X, int Y, const SIMP int tileY = Y + mask.y; int penalty = mask.penalty; - // Ÿ ̰, 밡 ƴ϶ ɼ ִ. + // 현재 타일이 존 내부이고, 안전지대가 아니라면 맞을 가능성이 있다. if (rect.ptInRect(tileX, tileY)) { - // Ÿ ޾ƿ´. + // 타일을 받아온다. Tile& tile = pZone->getTile(tileX, tileY); list targetList; @@ -836,7 +836,7 @@ void SimpleTileMissileSkill::execute(Monster* pMonster, int X, int Y, const SIMP cout << pMonster->getName() << " checks enemy " << pEnemy->getName() << endl; - // ´ 쿡.. + // 공격 대상이 맞는 경우에.. if (pMonster->isEnemyToAttack(pEnemy)) { bool bPK = verifyPK(pMonster, pEnemy); bool bRaceCheck = !pEnemy->isNPC(); // pEnemy->isSlayer() || pEnemy->isVampire(); @@ -860,7 +860,7 @@ void SimpleTileMissileSkill::execute(Monster* pMonster, int X, int Y, const SIMP // cout << "!bMagicDamage = " << Damage << endl; } - // Ƽ ⺻ 100̴. + // 페널티는 기본적으로 100이다. Damage = getPercentValue(Damage, penalty); // cout << "bPenaltyDamage = " << Damage << endl; @@ -873,14 +873,14 @@ void SimpleTileMissileSkill::execute(Monster* pMonster, int X, int Y, const SIMP if (param.SkillType == SKILL_GORE_GLAND_FIRE || param.SkillType == SKILL_SUMMON_MIGA_ATTACK) { - // ϴ ´ Ŷ · ä, ش. + // 일단 맞는 놈이 받을 패킷은 널 상태로 한 채로, 데미지를 준다. setDamage(pEnemy, Damage, pMonster, param.SkillType, NULL, NULL, false); } else { setDamage(pEnemy, Damage, pMonster, param.SkillType, NULL, NULL); } - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit || bForceKnockback) { knockbackCreature(pZone, pEnemy, pMonster->getX(), pMonster->getY()); } @@ -904,7 +904,7 @@ void SimpleTileMissileSkill::execute(Monster* pMonster, int X, int Y, const SIMP _GCSkillToTileOK5.setRange(dir); _GCSkillToTileOK5.setDuration(0); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pEnemy = *itr; Assert(pEnemy != NULL); @@ -912,7 +912,7 @@ void SimpleTileMissileSkill::execute(Monster* pMonster, int X, int Y, const SIMP if (pEnemy->isPC()) { _GCSkillToTileOK2.clearList(); - // HP Ŷ Ѵ. + // HP의 변경사항을 패킷에다 기록한다. HP_t targetHP = 0; if (pEnemy->isSlayer()) { targetHP = (dynamic_cast(pEnemy))->getHP(ATTR_CURRENT); @@ -924,15 +924,15 @@ void SimpleTileMissileSkill::execute(Monster* pMonster, int X, int Y, const SIMP _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // ߸. + // 아이템의 내구력을 떨어뜨린다. decreaseDurability(NULL, pEnemy, pSkillInfo, NULL, &_GCSkillToTileOK2); - // Ŷ ش. + // 패킷을 보내준다. pEnemy->getPlayer()->sendPacket(&_GCSkillToTileOK2); // cout << "SimpleTileMissibleSkill: " << _GCSkillToTileOK2.toString().c_str() << endl; } else if (pEnemy->isMonster()) { - // νѴ. + // 당근 적으로 인식한다. Monster* pTargetMonster = dynamic_cast(pEnemy); pTargetMonster->addEnemy(pMonster); } diff --git a/src/server/gameserver/skill/SingleBlow.cpp b/src/server/gameserver/skill/SingleBlow.cpp index 149b7f4f..93e1b2a2 100644 --- a/src/server/gameserver/skill/SingleBlow.cpp +++ b/src/server/gameserver/skill/SingleBlow.cpp @@ -9,7 +9,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void SingleBlow::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -44,7 +44,7 @@ void SingleBlow::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void SingleBlow::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/Skill.h b/src/server/gameserver/skill/Skill.h index 50ca9636..b604b791 100644 --- a/src/server/gameserver/skill/Skill.h +++ b/src/server/gameserver/skill/Skill.h @@ -10,7 +10,7 @@ #include "Types.h" ////////////////////////////////////////////////////////////////////////////// -// ų ... +// ½ºÅ³ °ü·Ã »ó¼öµé... ////////////////////////////////////////////////////////////////////////////// const int ATTR_SAVE_DIVIDER = 100; @@ -31,31 +31,31 @@ const int MONSTER_DUSK_FACTOR = 75; const int MONSTER_NIGHT_FACTOR = 100; const int VampireTimebandFactor[4] = { - 125, // - 100, // - 125, // - 150 // + 125, // »õº® + 100, // ³· + 125, // Àú³á + 150 // ¹ã }; const int MonsterTimebandFactor[4] = { - 75, // - 50, // - 75, // - 100 // + 75, // »õº® + 50, // ³· + 75, // Àú³á + 100 // ¹ã }; const int AttrExpTimebandFactor[4] = { - 100, // - 100, // - 100, // - 150 // + 100, // »õº® + 100, // ³· + 100, // Àú³á + 150 // ¹ã }; const int DomainExpTimebandFactor[4] = { - 100, // - 100, // - 100, // - 150 // + 100, // »õº® + 100, // ³· + 100, // Àú³á + 150 // ¹ã }; ////////////////////////////////////////////////////////////////////////////// @@ -239,7 +239,7 @@ enum SkillTypes { SKILL_BLOODY_STRIKE, // 149 SKILL_BLOODY_STORM, // 150 - // ӽ÷ ߰ 2002.2.22 + // Àӽ÷ΠÃß°¡ 2002.2.22 SKILL_SUMMON_BAT, // 151 SKILL_CHARM, // 152 SKILL_POLYMORPH, // 153 @@ -441,7 +441,7 @@ enum SkillTypes { SKILL_FABULOUS_SOUL, // 305 SKILL_WILL_OF_IRON, // 306 - // 巹 ų + // Áúµå·¹ ½ºÅ³ SKILL_WIDE_ICE_FIELD, // 307 SKILL_GLACIER_1, // 308 SKILL_GLACIER_2, // 309 @@ -476,10 +476,10 @@ enum SkillTypes { SKILL_REACTIVE_ARMOR_MASTERY, // 335 SKILL_THROWING_AXE, // 336 - SKILL_CHOPPING_FIREWOOD, // 337 б - SKILL_CHAIN_THROWING_AXE, // 338 - SKILL_MULTI_THROWING_AXE, // 339 "" - SKILL_PLAYING_WITH_FIRE, // 340 峭 + SKILL_CHOPPING_FIREWOOD, // 337 ÀåÀÛÆÐ±â + SKILL_CHAIN_THROWING_AXE, // 338 µµ³¢ ¼¼°³ ´øÁö±â + SKILL_MULTI_THROWING_AXE, // 339 µµ³¢ "" + SKILL_PLAYING_WITH_FIRE, // 340 ºÒÀå³­ SKILL_INFINITY_THUNDERBOLT, // 341 SKILL_SPIT_STREAM, // 342 @@ -490,17 +490,17 @@ enum SkillTypes { SKILL_NOOSE_OF_WRAITH, // 347 SKILL_SHARP_HAIL, // 348 - SKILL_SUMMON_MIGA, // 349 // ƿ콺 ų - SKILL_SUMMON_MIGA_ATTACK, // 350 // ȯȳ ų + SKILL_SUMMON_MIGA, // 349 // ¾Æ¿ì½ºÅÍÁî°¡ ¾²´Â ½ºÅ³ + SKILL_SUMMON_MIGA_ATTACK, // 350 // ¼ÒȯµÈ³ðÀÌ ¾²´Â ½ºÅ³ SKILL_ICE_HORIZON, // 351 SKILL_FURY_OF_GNOME, // 352 - SKILL_CANNONADE, // 353 // - SKILL_SELF_DESTRUCTION, // 354 // + SKILL_CANNONADE, // 353 // Æ÷°Ý + SKILL_SELF_DESTRUCTION, // 354 // ÀÚÆø°ø°Ý - SKILL_AR_ATTACK, // 355 // Ϳ - SKILL_SMG_ATTACK, // 356 // Ϳ - SKILL_GRENADE_ATTACK, // 357 // Ϳ + SKILL_AR_ATTACK, // 355 // ¸ó½ºÅÍ¿ë + SKILL_SMG_ATTACK, // 356 // ¸ó½ºÅÍ¿ë + SKILL_GRENADE_ATTACK, // 357 // ¸ó½ºÅÍ¿ë SKILL_DRAGON_TORNADO, // 358 SKILL_BIKE_CRASH, // 359 @@ -513,7 +513,7 @@ enum SkillTypes { SKILL_DESTINIES, // 366 SKILL_FIERCE_FLAME, // 367 SKILL_SHADOW_OF_STORM, // 368 - SKILL_HEAL_PASS, // 369 // Űܰ + SKILL_HEAL_PASS, // 369 // ¿Å°Ü°¡´Â Èú SKILL_TRASLA_ATTACK, // 370 SKILL_PUSCA_ATTACK, // 371 @@ -523,26 +523,26 @@ enum SkillTypes { SKILL_BLLODY_SCARIFY, // 374 SKILL_BLOOD_CURSE, // 375 ////////////////////////////////////////////////////////////////////////// - // ༼ - SKILL_SHINE_SWORD, // 376 ҫ֮ - SKILL_BOMB_CRASH_WALK, // 377 ںը - SKILL_SATELLITE_BOMB, // 378 Ǻ - SKILL_ILLUSION_INVERSION, // 379 ֲþ - SKILL_HEAVEN_GROUND, // 380 + // ÈËÀ༼ÄÜ + SKILL_SHINE_SWORD, // 376 ÉÁÒ«Ö®½£ + SKILL_BOMB_CRASH_WALK, // 377 ¾ÞÅÚºäÕ¨ + SKILL_SATELLITE_BOMB, // 378 ÎÀÐǺä»÷ + SKILL_ILLUSION_INVERSION, // 379 ¿Ö²À»Ã¾õ + SKILL_HEAVEN_GROUND, // 380 ÌìÉñ½µÁÙ TEMP_SKILL_ILLUSION_INVERSION, // 381 ////////////////////////////////////////////////////////////////////////// - // ħ¼ + // ħÁéм¼ÄÜ // 2007-2-15 Coffee add end - SKILL_DUMMY_DRAKE, // 382 ׿˿() - SKILL_HYDRO_CONVERGENCE, // 383 ˮ(ˮ) - SKILL_SUMMON_CLAY, // 384 ճٻ() - SKILL_HETER_CHAKRAM, // 385 IJ(սʿ) - SKILL_Sky_Fire, // 386 ׻ ADD BY RALLSER + SKILL_DUMMY_DRAKE, // 382 µÂÀ׿˿þÀÜ(»ð) + SKILL_HYDRO_CONVERGENCE, // 383 ¸´ºÏË®ÁÆ(Ë®) + SKILL_SUMMON_CLAY, // 384 Õ³ÍÁÕÙ»½(ÍÁ) + SKILL_HETER_CHAKRAM, // 385 ÏIJ¼Àû»ùÒò(սʿ) + SKILL_Sky_Fire, // 386 ÌìÀ׻𻨠ADD BY RALLSER SKILL_Cut_Storm, // 387 ADD BY RALLSER SKILL_XRL_Missile, // 388 ADD BY RALLSER SKILL_Sacred_Stamp, // 389 ADD BY RALLSER SKILL_Bramble_Halo, // 390 ADD BY RALLSER - SKILL_Deadly_Claw, // 391צ add by rallser + SKILL_Deadly_Claw, // 391ÖÂÉËÁÑצ add by rallser SKILL_Voodoo_Ring, // 392 ADD BY RALLSER SKILL_Penetrate_Wheel, // 393 ADD BY RALLSER SKILL_Fire_Meteor, // 394 ADD BY RALLSER @@ -960,10 +960,10 @@ const string SkillTypes2String[] = {"SKILL_ATTACK_MELEE", // 0 "SKILL_REACTIVE_ARMOR_MASTERY", // 335 "SKILL_THROWING_AXE", // 336 - "SKILL_CHOPPING_FIREWOOD", // 337 б + "SKILL_CHOPPING_FIREWOOD", // 337 ÀåÀÛÆÐ±â "SKILL_CHAIN_THROWING_AXE", // 338 "SKILL_MULTI_THROWING_AXE", // 339 - "SKILL_PLAYING_WITH_FIRE", // 340 峭 + "SKILL_PLAYING_WITH_FIRE", // 340 ºÒÀå³­ "SKILL_INFINITY_THUNDERBOLT", // 341 "SKILL_SPIT_STREAM", // 342 @@ -974,17 +974,17 @@ const string SkillTypes2String[] = {"SKILL_ATTACK_MELEE", // 0 "SKILL_NOOSE_OF_WRAITH", // 347 "SKILL_SHARP_HAIL", // 348 - "SKILL_SUMMON_MIGA", // 349 // ƿ콺 ų - "SKILL_SUMMON_MIGA_ATTACK", // 350 // ȯȳ ų + "SKILL_SUMMON_MIGA", // 349 // ¾Æ¿ì½ºÅÍÁî°¡ ¾²´Â ½ºÅ³ + "SKILL_SUMMON_MIGA_ATTACK", // 350 // ¼ÒȯµÈ³ðÀÌ ¾²´Â ½ºÅ³ "SKILL_ICE_HORIZON", // 351 "SKILL_FURY_OF_GNOME", // 352 - "SKILL_CANNONADE", // 353 // - "SKILL_SELF_DESTRUCTION", // 354 // + "SKILL_CANNONADE", // 353 // Æ÷°Ý + "SKILL_SELF_DESTRUCTION", // 354 // ÀÚÆø°ø°Ý - "SKILL_AR_ATTACK", // 355 // Ϳ - "SKILL_SMG_ATTACK", // 356 // Ϳ - "SKILL_GRENADE_ATTACK", // 357 // Ϳ + "SKILL_AR_ATTACK", // 355 // ¸ó½ºÅÍ¿ë + "SKILL_SMG_ATTACK", // 356 // ¸ó½ºÅÍ¿ë + "SKILL_GRENADE_ATTACK", // 357 // ¸ó½ºÅÍ¿ë "SKILL_DRAGON_TORNADO", // 358 "SKILL_BIKE_CRASH", // 359 @@ -997,36 +997,36 @@ const string SkillTypes2String[] = {"SKILL_ATTACK_MELEE", // 0 "SKILL_DESTINIES", // 366 "SKILL_FIERCE_FLAME", // 367 "SKILL_SHADOW_OF_STORM", // 368 - "SKILL_HEAL_PASS", // 369 // Űܰ + "SKILL_HEAL_PASS", // 369 // ¿Å°Ü°¡´Â Èú "SKILL_TRASLA_ATTACK", // 370 "SKILL_PUSCA_ATTACK", // 371 "SKILL_NOD_COPILA_ATTACK", // 372 "SKILL_NOD_COPILA_ATTACK_2", // 373 // add by coffee 2007-2-17 start - "SKILL_BLLODY_SCARIFY", // 374 Ѫ֮ӡ + "SKILL_BLLODY_SCARIFY", // 374 Ѫ֮ÀÓÓ¡ "SKILL_BLOOD_CURSE", ////////////////////////////////////////////////////////////////////////// - // ༼ - "SKILL_SHINE_SWORD", // 376 ҫ֮ - "SKILL_BOMB_CRASH_WALK", // 377 ںը - "SKILL_SATELLITE_BOMB", // 378 Ǻ - "SKILL_ILLUSION_INVERSION", // 379 ֲþ - "SKILL_HEAVEN_GROUND", // 380 + // ÈËÀ༼ÄÜ + "SKILL_SHINE_SWORD", // 376 ÉÁÒ«Ö®½£ + "SKILL_BOMB_CRASH_WALK", // 377 ¾ÞÅÚºäÕ¨ + "SKILL_SATELLITE_BOMB", // 378 ÎÀÐǺä»÷ + "SKILL_ILLUSION_INVERSION", // 379 ¿Ö²À»Ã¾õ + "SKILL_HEAVEN_GROUND", // 380 ÌìÉñ½µÁÙ "TEMP_SKILL_ILLUSION_INVERSION", // 381 ////////////////////////////////////////////////////////////////////////// - // ħ¼ + // ħÁéм¼ÄÜ - "SKILL_DUMMY_DRAKE", // 382 ׿˿() - "SKILL_HYDRO_CONVERGENCE", // 383 ˮ(ˮ) - "SKILL_SUMMON_CLAY", // 384 ճٻ() - "HETER_CHAKRAM", // 385 IJ(սʿ) - "SKILL_Sky_Fire", // 386 ׻ ADD BY RALLSER + "SKILL_DUMMY_DRAKE", // 382 µÂÀ׿˿þÀÜ(»ð) + "SKILL_HYDRO_CONVERGENCE", // 383 ¸´ºÏË®ÁÆ(Ë®) + "SKILL_SUMMON_CLAY", // 384 Õ³ÍÁÕÙ»½(ÍÁ) + "HETER_CHAKRAM", // 385 ÏIJ¼Àû»ùÒò(սʿ) + "SKILL_Sky_Fire", // 386 ÌìÀ׻𻨠ADD BY RALLSER "SKILL_Cut_Storm", // 387 ADD BY RALLSER "SKILL_XRL_Missile", // 388 ADD BY RALLSER "SKILL_Sacred_Stamp", // 389 ADD BY RALLSER "SKILL_Bramble_Halo", // 390 ADD BY RALLSER - "SKILL_Deadly_Claw", // 391צ add by rallser + "SKILL_Deadly_Claw", // 391ÖÂÉËÁÑצ add by rallser "SKILL_Voodoo_Ring", // 392 ADD BY RALLSER "SKILL_Penetrate_Wheel", // 393 ADD BY RALLSER "SKILL_Fire_Meteor", // 394 ADD BY RALLSER diff --git a/src/server/gameserver/skill/SkillFormula.cpp b/src/server/gameserver/skill/SkillFormula.cpp index fae7b71c..7529cb83 100644 --- a/src/server/gameserver/skill/SkillFormula.cpp +++ b/src/server/gameserver/skill/SkillFormula.cpp @@ -9,7 +9,7 @@ #include "SkillHandler.h" #include "Vampire.h" -// ˰迭 +// °Ë°è¿­ #include "CrossCounter.h" #include "DancingSword.h" #include "DoubleImpact.h" @@ -32,7 +32,7 @@ #include "WideLightning.h" #include "WindDivider.h" -// 迭 +// µµ°è¿­ #include "AirShield.h" #include "Berserker.h" #include "ChargingPower.h" @@ -53,7 +53,7 @@ #include "WildSmash.h" #include "WildTyphoon.h" -// 迭 +// ±ºÀÎ °è¿­ #include "DoubleShot.h" #include "HeadShot.h" #include "MindControl.h" @@ -74,7 +74,7 @@ #include "Revealer.h" #include "UltimateBlow.h" -// æ 迭 +// ÀÎæ °è¿­ #include "AuraBall.h" #include "AuraRing.h" #include "Bless.h" @@ -100,7 +100,7 @@ #include "VigorDrop.h" #include "Visible.h" -// 迭 +// Èú¸µ °è¿­ #include "Activation.h" #include "CauseCriticalWounds.h" #include "CauseLightWounds.h" @@ -128,7 +128,7 @@ #include "TurnUndead.h" -// 迭 +// ¹ìÇÁ °è¿­ #include "AcidBall.h" #include "AcidBolt.h" #include "AcidSwamp.h" @@ -181,7 +181,7 @@ #include "PoisonStrike.h" #include "Transfusion.h" -// Ÿ +// ±âŸ #include "CriticalGround.h" #include "DuplicateSelf.h" #include "GroundAttack.h" @@ -192,13 +192,13 @@ #include "SoulChain.h" #include "SummonMonsters.h" -// ų +// ¼ºÁö½ºÅ³ #include "IllusionOfAvenge.h" #include "MagicElusion.h" #include "PoisonMesh.h" #include "WillOfLife.h" -// ƿ콺 ų +// ¾Æ¿ì½ºÅÍÁî ½ºÅ³ #include "AcidEruption.h" #include "BackStab.h" #include "BeatHead.h" @@ -304,7 +304,7 @@ #include "WideIceField.h" #include "WideIceHail.h" -// ƿ콺 140 ų +// ¾Æ¿ì½ºÅÍÁî 140·¹º§ ½ºÅ³ #include "ARAttack.h" #include "Aberration.h" #include "BikeCrash.h" @@ -326,27 +326,27 @@ #include "SummonMigaAttack.h" #include "WildWolf.h" // add by coffee 2007-2-17 -#include "BloodCurse.h" //Ѫ֮? -#include "BloodyScarify.h" //Ѫ֮ӡ -#include "BombCrashWalk.h" //ںը -#include "HeavenGround.h" // -#include "IllusionInversion.h" //ֲþ(෨ʦ) -#include "SatelliteBomb.h" //Ǻ (ǹ¼) -#include "ShineSword.h" //ҫ֮ -// ħ +#include "BloodCurse.h" //Ѫ֮?Öä +#include "BloodyScarify.h" //Ѫ֮ÀÓÓ¡ +#include "BombCrashWalk.h" //¾ÞÅÚºäÕ¨ +#include "HeavenGround.h" //ÌìÉñ½µÁÙ +#include "IllusionInversion.h" //¿Ö²À»Ã¾õ(ÈËÀ෨ʦ) +#include "SatelliteBomb.h" //ÎÀÐǺä»÷ (ÈËÀàǹм¼ÄÜ) +#include "ShineSword.h" //ÉÁÒ«Ö®½£ +// ħÁé #include "BigRockfall.h" //395 ADD BY RALLSER #include "BrambleHalo.h" //390 ADD BY RALLSER #include "CutStorm.h" //387 ADD BY RALLSER -#include "DeadlyClaw.h" //391צ add by rallser -#include "DummyDrake.h" // ׿˿() +#include "DeadlyClaw.h" //391ÖÂÉËÁÑצ add by rallser +#include "DummyDrake.h" // µÂÀ׿˿þÀÜ(»ð·¨) #include "FireMeteor.h" //394 ADD BY RALLSER -#include "HeterChakram.h" // IJ(ս) -#include "HydroConvergence.h" // ˮ(ˮ) +#include "HeterChakram.h" // ÏIJ¼Àû»ùÒò(ÃôÕ½) +#include "HydroConvergence.h" // ¸´ºÏË®ÁÆ(Ë®·¨) #include "PenetrateWheel.h" //393 ADD BY RALLSER #include "RapidFreeze.h" //396 ADD BY RALLSER #include "SacredStamp.h" //389 ADD BY RALLSER -#include "SkyFire.h" //386 ׻ ADD BY RALLSER -#include "SummonClay.h" // +#include "SkyFire.h" //386 ÌìÀ׻𻨠ADD BY RALLSER +#include "SummonClay.h" // ÍÁ·¨ #include "VoodooRing.h" //392 ADD BY RALLSER #include "XRLMissile.h" //388 ADD BY RALLSER @@ -374,92 +374,92 @@ const int PartyDurationBoost[7] = { }; ////////////////////////////////////////////////////////////////////////////// -// 迭 +// °Ë °è¿­ ////////////////////////////////////////////////////////////////////////////// void DoubleImpact::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 1 + (input.STR / 20) + input.SkillLevel / 20; - output.Delay = 8; // 1 + output.Delay = 8; // 1ÃÊ // output.Damage = 2 + input.SkillLevel/33; - // output.Delay = 10; // 1 + // output.Delay = 10; // 1ÃÊ } void TripleSlasher::computeOutput(const SkillInput& input, SkillOutput& output) { // output.Damage = 2 + (input.STR/20) + (input.SkillLevel/15); output.Damage = 3 + (input.STR / 20) + (input.SkillLevel / 15); - output.Delay = 8; // 0.7 + output.Delay = 8; // 0.7ÃÊ // output.Damage = 3 + input.SkillLevel/33; - // output.Delay = 7; // 0.7 + // output.Delay = 7; // 0.7ÃÊ } void RainbowSlasher::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 4 + input.STR / 15 + input.SkillLevel / 10; - output.Delay = 8; // 0.8 + output.Delay = 8; // 0.8ÃÊ // output.Damage = 7 + input.SkillLevel/33; - // output.Delay = 8; // 0.8 + // output.Delay = 8; // 0.8ÃÊ } void ThunderSpark::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 3 + input.STR / 20 + input.SkillLevel / 10; - output.Delay = 7; // 0.7 + output.Delay = 7; // 0.7ÃÊ // output.Damage = 5 + input.SkillLevel/33; - // output.Delay = 7; // 0.7 + // output.Delay = 7; // 0.7ÃÊ } void DancingSword::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 1 + (input.DEX / 10) + (input.SkillLevel / 10); // output.Duration = (10 + input.STR/10 + input.SkillLevel/2) * 10; output.Duration = (30 + input.STR / 10 + input.SkillLevel / 2) * 10; - // output.Delay = (5 - input.SkillLevel/33) * 10; // 5->2 - output.Delay = output.Duration; // Delay Duration . by bezz 2003.3.5 + // output.Delay = (5 - input.SkillLevel/33) * 10; // 5->2ÃÊ + output.Delay = output.Duration; // Delay ¿Í Duration ÀÌ °°´Ù. by bezz 2003.3.5 // output.Damage = 5 + input.SkillLevel/10; // output.Duration = (30 + input.SkillLevel/4) * 10; - // output.Delay = (5 - input.SkillLevel/33) * 10; // 5->2 + // output.Delay = (5 - input.SkillLevel/33) * 10; // 5->2ÃÊ } void CrossCounter::computeOutput(const SkillInput& input, SkillOutput& output) { output.Duration = (10 + input.SkillLevel / 2) * 10; - // output.Delay = max(5 - input.SkillLevel/20, 2) * 10; // 5->2 - output.Delay = output.Duration; // Delay Duration . by bezz 2003.3.5 + // output.Delay = max(5 - input.SkillLevel/20, 2) * 10; // 5->2ÃÊ + output.Delay = output.Duration; // Delay ¿Í Duration ÀÌ °°´Ù. by bezz 2003.3.5 // output.Duration = (30 + input.SkillLevel/4) * 10; - // output.Delay = max(5 - input.SkillLevel/20, 2) * 10; // 5->2 + // output.Delay = max(5 - input.SkillLevel/20, 2) * 10; // 5->2ÃÊ } void FlashSliding::computeOutput(const SkillInput& input, SkillOutput& output) { - output.Delay = max(3 - input.SkillLevel / 50, 1) * 10; // 3->1 + output.Delay = max(3 - input.SkillLevel / 50, 1) * 10; // 3->1ÃÊ output.Duration = 3 - input.SkillLevel / 50; - // output.Delay = (3 - input.SkillLevel/50) * 10; // 3->1 + // output.Delay = (3 - input.SkillLevel/50) * 10; // 3->1ÃÊ } void LightningHand::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = input.STR / 10 + input.SkillLevel / 10; - // Ŭ̾Ʈ ȭ ̰ ų ªƾ Ѵ. - output.Delay = 4; // 0.2 + // Ŭ¶óÀÌ¾ðÆ®¿ÍÀÇ µ¿±âÈ­ ¹®Á¦·Î µô·¹À̰¡ ¾ø°Å³ª Á¶±Ý ´õ ª¾Æ¾ß ÇÑ´Ù. + output.Delay = 4; // 0.2ÃÊ // output.Damage = 7 + input.SkillLevel/20; - // output.Delay = 2; // 0.2 + // output.Delay = 2; // 0.2ÃÊ } void SwordWave::computeOutput(const SkillInput& input, SkillOutput& output) { // output.Damage = 5 + input.SkillLevel/33; output.Damage = 15 + input.SkillLevel / 20; - output.Delay = 4; // 1 + output.Delay = 4; // 1ÃÊ // output.Damage = 5 + input.SkillLevel/33; - // output.Delay = 10; // 1 + // output.Delay = 10; // 1ÃÊ } void SnakeCombo::computeOutput(const SkillInput& input, SkillOutput& output) { // by sigi. 2002.12.3 output.Damage = 5 + input.STR / 12 + input.SkillLevel / 8; - output.Delay = 10; // 1 + output.Delay = 10; // 1ÃÊ // output.Damage = 7 + input.SkillLevel/10; - // output.Delay = 10; // 1 + // output.Delay = 10; // 1ÃÊ } void WindDivider::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = input.STR / 14 + input.SkillLevel / 20; - output.Delay = 13; // 1 + output.Delay = 13; // 1ÃÊ } void ThunderBolt::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -468,69 +468,69 @@ void ThunderBolt::computeOutput(const SkillInput& input, SkillOutput& output) { } void Expansion::computeOutput(const SkillInput& input, SkillOutput& output) { - output.Damage = 10 + input.SkillLevel / 2; // ڽ + - output.ToHit = 5 + input.SkillLevel / 3; // Ƽ + + output.Damage = 10 + input.SkillLevel / 2; // ÀÚ½ÅÀÇ + °ª + output.ToHit = 5 + input.SkillLevel / 3; // ÆÄƼÀÇ + °ª // output.Duration = (30 + input.STR/10 + input.SkillLevel*2/3) * 10; output.Duration = (45 + input.STR / 10 + input.SkillLevel) * 10; // output.Delay = max(5 - input.SkillLevel/33,2) * 10; - output.Delay = output.Duration; // Delay Duration . by bezz 2003.3.5 + output.Delay = output.Duration; // Delay ¿Í Duration ÀÌ °°´Ù. by bezz 2003.3.5 - // output.Damage = 30 + input.SkillLevel/2; // ڽ + - // output.ToHit = 15 + input.SkillLevel/4; // Ƽ + + // output.Damage = 30 + input.SkillLevel/2; // ÀÚ½ÅÀÇ + °ª + // output.ToHit = 15 + input.SkillLevel/4; // ÆÄƼÀÇ + °ª // output.Duration = (30 + input.SkillLevel/3) * 10; // output.Delay = (5 - input.SkillLevel/33) * 10; } void MiracleShield::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = (5 + input.SkillLevel / 5); // 5->25 - output.Duration = (30 + input.SkillLevel / 5) * 10; // 30~50 - output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2 + output.Duration = (30 + input.SkillLevel / 5) * 10; // 30~50ÃÊ + output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2ÃÊ } void ThunderFlash::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 5 + input.SkillLevel / 10; - output.Delay = 20; // 2 + output.Delay = 20; // 2ÃÊ } void ThunderStorm::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = input.STR / 10 + input.SkillLevel / 10; // by bezz. 2002.12.10 - output.Delay = (3 - input.SkillLevel / 50) * 10; // 1 + output.Delay = (3 - input.SkillLevel / 50) * 10; // 1ÃÊ // output.Damage = 10 + input.SkillLevel/5; - // output.Delay = (5 - input.SkillLevel/33)*10; // 1 + // output.Delay = (5 - input.SkillLevel/33)*10; // 1ÃÊ } void MentalSword::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 30 + (15 * input.SkillLevel / 50); output.Range = 2 + input.SkillLevel / 33; - output.Delay = (8 - input.SkillLevel / 20) * 10; // 5~3 + output.Delay = (8 - input.SkillLevel / 20) * 10; // 5~3ÃÊ // output.Damage = 30 + ( 15 * input.SkillLev/50 ); // output.Range = 2 + input.SkillLevel/20; - // output.Delay = (5 - input.SkillLevel / 50)*10; // 5~3 + // output.Delay = (5 - input.SkillLevel / 50)*10; // 5~3ÃÊ } ////////////////////////////////////////////////////////////////////////////// -// 迭 +// µµ °è¿­ ////////////////////////////////////////////////////////////////////////////// void SingleBlow::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 1 + input.STR / 20 + input.SkillLevel / 20; // by sigi. 2002.12.3 - output.Delay = 7; // 1 + output.Delay = 7; // 1ÃÊ } void SpiralSlay::computeOutput(const SkillInput& input, SkillOutput& output) { // output.Damage = 2 + input.STR/20 + input.SkillLevel/15; // by sigi. 2002.12.3 output.Damage = 4 + input.STR / 20 + input.SkillLevel / 15; - output.Delay = 7; // 0.7 + output.Delay = 7; // 0.7ÃÊ } void TripleBreak::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 3 + input.STR / 20 + input.SkillLevel / 10; // by sigi. 2002.12.3 - output.Delay = 7; // 0.7 + output.Delay = 7; // 0.7ÃÊ } void WildSmash::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 4 + input.STR / 15 + input.SkillLevel / 10; // by sigi. 2002.12.3 - output.Delay = 8; // 0.8 + output.Delay = 8; // 0.8ÃÊ } void GhostBlade::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -538,21 +538,21 @@ void GhostBlade::computeOutput(const SkillInput& input, SkillOutput& output) { // output.Duration = (30 + input.SkillLevel/4) * 10; // output.Duration = (10 + input.STR/10 + input.SkillLevel/2) * 10; output.Duration = (30 + input.STR / 10 + input.SkillLevel / 2) * 10; - // output.Delay = (5 - input.SkillLevel/33) * 10; // 5->2 - output.Delay = output.Duration; // Delay Duration . by bezz 2003.3.5 + // output.Delay = (5 - input.SkillLevel/33) * 10; // 5->2ÃÊ + output.Delay = output.Duration; // Delay ¿Í Duration ÀÌ °°´Ù. by bezz 2003.3.5 } void PotentialExplosion::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 1 + input.SkillLevel / 15; // output.Duration = (10 + input.SkillLevel/2) * 10; output.Duration = (30 + input.SkillLevel / 2) * 10; - // output.Delay = (7 - input.SkillLevel/20) * 10; // 7->2 - output.Delay = output.Duration; // Delay Duration . by bezz 2003.3.5 + // output.Delay = (7 - input.SkillLevel/20) * 10; // 7->2ÃÊ + output.Delay = output.Duration; // Delay ¿Í Duration ÀÌ °°´Ù. by bezz 2003.3.5 } void ShadowWalk::computeOutput(const SkillInput& input, SkillOutput& output) { output.Range = max(2 + input.SkillLevel / 25, 2); - output.Delay = (3 - input.SkillLevel / 50) * 10; // 3->1 + output.Delay = (3 - input.SkillLevel / 50) * 10; // 3->1ÃÊ } void ChargingPower::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -561,70 +561,70 @@ void ChargingPower::computeOutput(const SkillInput& input, SkillOutput& output) // output.Duration = (30 + input.STR/10 + input.SkillLevel*10/12) * 10; // output.Damage = 1 + (input.STR + input.SkillLevel)/20; // output.Duration = (10 + input.SkillLevel/2) * 10; - // output.Delay = (5 - input.SkillLevel/33) * 10; // 5->2 - output.Delay = output.Duration; // Delay Duration . by bezz 2003.3.5 + // output.Delay = (5 - input.SkillLevel/33) * 10; // 5->2ÃÊ + output.Delay = output.Duration; // Delay ¿Í Duration ÀÌ °°´Ù. by bezz 2003.3.5 } void HurricaneCombo::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 5 + input.STR / 12 + input.SkillLevel / 8; - output.Delay = 10; // 1 + output.Delay = 10; // 1ÃÊ } void TornadoSever::computeOutput(const SkillInput& input, SkillOutput& output) { // output.Damage = 8 + input.STR/15 + input.SkillLevel/10; // output.Damage = 3 + input.STR/20 + input.SkillLevel/10; output.Damage = 10 + input.STR / 20 + input.SkillLevel / 8; - // output.Delay = 20 - (input.SkillLevel/100); // 2 + // output.Delay = 20 - (input.SkillLevel/100); // 2ÃÊ output.Delay = 4; } void Earthquake::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 5 + input.STR / 20 + input.SkillLevel / 10; // by sigi. 2002.12.3 output.Range = 7; // by bezz. 2002.12.10 - output.Delay = 13; // 1.3 by bezz. 2002.12.10 + output.Delay = 13; // 1.3ÃÊ by bezz. 2002.12.10 } void Berserker::computeOutput(const SkillInput& input, SkillOutput& output) { - // penalty Berserker.cpp ִ. - // output.Damage = (input.STR/20) * (1 + input.SkillLevel/20); // ʽ - // output.ToHit = (input.DEX/10) * (1 + input.SkillLevel/10); // ʽ + // penalty°ªÀº Berserker.cpp¿¡ ÀÖ´Ù. + // output.Damage = (input.STR/20) * (1 + input.SkillLevel/20); // µ¥¹ÌÁö º¸³Ê½º + // output.ToHit = (input.DEX/10) * (1 + input.SkillLevel/10); // ÅõÈý º¸³Ê½º - // 2002.12.06 ȫâ - output.Damage = (input.STR / 20) * (1 + input.SkillLevel / 25); // ʽ - // output.ToHit = (input.DEX/10) * (1 + input.SkillLevel/12); // ʽ - output.ToHit = 10 + (1 + input.SkillLevel / 12); // ʽ + // 2002.12.06 Àåȫâ + output.Damage = (input.STR / 20) * (1 + input.SkillLevel / 25); // µ¥¹ÌÁö º¸³Ê½º + // output.ToHit = (input.DEX/10) * (1 + input.SkillLevel/12); // ÅõÈý º¸³Ê½º + output.ToHit = 10 + (1 + input.SkillLevel / 12); // ÅõÈý º¸³Ê½º // output.Duration = (30 + input.SkillLevel/5) * 10; output.Duration = (45 + input.SkillLevel / 1.5) * 10; // output.Delay = max(5 - input.SkillLevel/33,2) * 10; - output.Delay = output.Duration; // Delay Duration . by bezz 2003.3.5 + output.Delay = output.Duration; // Delay ¿Í Duration ÀÌ °°´Ù. by bezz 2003.3.5 } void MoonlightSever::computeOutput(const SkillInput& input, SkillOutput& output) { // output.Damage = 8 + input.STR/10 + input.SkillLevel/10; output.Damage = 15 + input.STR / 10 + input.SkillLevel / 8; - // output.Delay = 8; // 0.8 - output.Delay = 4; // 0.4 + // output.Delay = 8; // 0.8ÃÊ + output.Delay = 4; // 0.4ÃÊ } void ShadowDancing::computeOutput(const SkillInput& input, SkillOutput& output) { // output.Damage = 30 + ( 15 * input.SkillLevel/50 ); output.Damage = 30 + (15 * input.SkillLevel / 25); - output.ToHit = 10 + input.SkillLevel / 20; // ũƼ Ȯ ġ - // output.Delay = (5 - input.SkillLevel / 50)*10; // 2ʸ 0.66666 = 0.7 + output.ToHit = 10 + input.SkillLevel / 20; // Å©¸®Æ¼Äà Ȯ·ü Áõ°¡Ä¡ + // output.Delay = (5 - input.SkillLevel / 50)*10; // 2Ãʸ¦ ¼¼¹øÀ¸·Î ³ª´©¸é 0.66666 = 0.7ÃÊ output.Delay = (8 - input.SkillLevel / 20) * 10; // by sigi. 2002.12.3 } void Typhoon::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = input.STR / 10 + input.SkillLevel / 5; - // output.Duration = 10; // 1 (Ÿ ư ð) - effect -_-; - // output.Delay = 15; // 1.5 - output.Duration = (1 + input.SkillLevel / 100) * 10; // 1 (Ÿ ư ð) - effect -_-; + // output.Duration = 10; // 1ÃÊ (Ÿ°ÙÀÌ »æ»æ µ¹¾Æ°¡´Â ½Ã°£) - effect¾ø´Ù -_-; + // output.Delay = 15; // 1.5ÃÊ + output.Duration = (1 + input.SkillLevel / 100) * 10; // 1ÃÊ (Ÿ°ÙÀÌ »æ»æ µ¹¾Æ°¡´Â ½Ã°£) - effect¾ø´Ù -_-; output.Delay = (3 - input.SkillLevel / 50) * 10; // by bezz. 2002.12.10 } ////////////////////////////////////////////////////////////////////////////// -// 迭 +// ÃÑ °è¿­ ////////////////////////////////////////////////////////////////////////////// void QuickFire::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -664,13 +664,13 @@ void MultiShot::computeOutput(const SkillInput& input, SkillOutput& output) { } output.ToHit = -20 + input.SkillLevel / 5; - output.Delay = 8; // 0.8 + output.Delay = 8; // 0.8ÃÊ } void HeadShot::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 0; - // SkillUtil.cpp computeArmsWeaponDamageBonus() ǹǷ.. ߺ . - -; by sigi. 2002.12.3 + // SkillUtil.cppÀÇ computeArmsWeaponDamageBonus()¿¡¼­ °è»êµÇ¹Ç·Î.. Áߺ¹ µ¥¹ÌÁö´Ù. - -; by sigi. 2002.12.3 if (input.IClass == Item::ITEM_CLASS_SG) { switch (input.Range) { case 3: @@ -708,32 +708,32 @@ void HeadShot::computeOutput(const SkillInput& input, SkillOutput& output) { Assert(false); } - output.Delay = 8; // 0.8 + output.Delay = 8; // 0.8ÃÊ } void Piercing::computeOutput(const SkillInput& input, SkillOutput& output) { output.ToHit = 0; output.Damage = 2; - output.Delay = 8; // 0.8 + output.Delay = 8; // 0.8ÃÊ } void Sniping::computeOutput(const SkillInput& input, SkillOutput& output) { output.Duration = (30 + input.SkillLevel / 5) * 10; - output.Delay = (10 - input.SkillLevel / 20) * 10; // 10->5 + output.Delay = (10 - input.SkillLevel / 20) * 10; // 10->5ÃÊ } void MindControl::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 15 + input.SkillLevel / 10; output.Duration = (30 + input.SkillLevel / 5) * 10; - output.Delay = 30; // 3 + output.Delay = 30; // 3ÃÊ } void Revealer::computeOutput(const SkillInput& input, SkillOutput& output) { - output.Duration = (30 + input.SkillLevel / 5) * 10; // 30~50 + output.Duration = (30 + input.SkillLevel / 5) * 10; // 30~50ÃÊ output.Delay = output.Duration; - // output.Delay = (5 - input.SkillLevel/33) * 10; // 5->2 + // output.Delay = (5 - input.SkillLevel/33) * 10; // 5->2ÃÊ - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. // output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } @@ -741,60 +741,60 @@ void Revealer::computeOutput(const SkillInput& input, SkillOutput& output) { void CreateBomb::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 15 + input.SkillLevel / 10; output.Duration = (30 + input.SkillLevel / 5) * 10; - output.Delay = 30 - input.SkillLevel / 10; // 3 ~ 2 + output.Delay = 30 - input.SkillLevel / 10; // 3ÃÊ ~ 2ÃÊ } void CreateMine::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 15 + input.SkillLevel / 10; output.Duration = (30 + input.SkillLevel / 5) * 10; - output.Delay = 30 - input.SkillLevel / 10; // 3 ~ 2 + output.Delay = 30 - input.SkillLevel / 10; // 3ÃÊ ~ 2ÃÊ } void InstallMine::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 15 + input.SkillLevel / 10; output.Duration = (30 + input.SkillLevel / 5) * 10; - // output.Delay = 30 - input.SkillLevel / 10; // 3 ~ 2 - output.Delay = 90 - input.SkillLevel / 2.5; // 9 ~ 5 + // output.Delay = 30 - input.SkillLevel / 10; // 3ÃÊ ~ 2ÃÊ + output.Delay = 90 - input.SkillLevel / 2.5; // 9ÃÊ ~ 5ÃÊ } void DisarmMine::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 15 + input.SkillLevel / 10; output.Duration = (30 + input.SkillLevel / 5) * 10; - output.Delay = 30; // 3 + output.Delay = 30; // 3ÃÊ } void ObservingEye::computeOutput(const SkillInput& input, SkillOutput& output) { // output.Duration = (10 + input.SkillLevel/5)*10; output.Duration = (30 + input.SkillLevel / 3) * 10; - // damage vision ְ - // ٸ ؼ . -_-; + // damage°ªÀº visionÀ¸·Î ³Ö°í + // ´Ù¸¥ °ªÀ» Àû´çÈ÷ °è»êÇØ¼­ ¾´´Ù. -_-; output.Damage = 1 + input.SkillLevel / 50; - // output.Delay = (5 - input.DEX/50) * 10; // 20 - output.Delay = output.Duration; // Delay Duration . by bezz 2003.3.5 + // output.Delay = (5 - input.DEX/50) * 10; // 20ÃÊ + output.Delay = output.Duration; // Delay ¿Í Duration ÀÌ °°´Ù. by bezz 2003.3.5 } ////////////////////////////////////////////////////////////////////////////// -// æƮ 迭 +// ÀÎæƮ °è¿­ ////////////////////////////////////////////////////////////////////////////// void CreateHolyWater::computeOutput(const SkillInput& input, SkillOutput& output) { - output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2 + output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2ÃÊ } void Light::computeOutput(const SkillInput& input, SkillOutput& output) { - output.Duration = (60 + input.SkillLevel / 20 * 60) * 10; // 60~360 - output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2 + output.Duration = (60 + input.SkillLevel / 20 * 60) * 10; // 60~360ÃÊ + output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2ÃÊ - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. // output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } void DetectHidden::computeOutput(const SkillInput& input, SkillOutput& output) { - output.Duration = (10 + input.SkillLevel / 2) * 10; // 30~50 - output.Delay = (5 - input.INTE / 50) * 10; // 5->2 + output.Duration = (10 + input.SkillLevel / 2) * 10; // 30~50ÃÊ + output.Delay = (5 - input.INTE / 50) * 10; // 5->2ÃÊ - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. // output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } @@ -803,10 +803,10 @@ void AuraBall::computeOutput(const SkillInput& input, SkillOutput& output) { // output.Damage = 5 + (input.INTE/20) + input.SkillLevel/5; // output.Damage = 10 + (input.INTE/10) + input.SkillLevel/5; output.Damage = 16 + (input.INTE / 10) + input.SkillLevel / 4; - output.Delay = 10; // 1 - // output.Range = 2 + (input.SkillLevel/25); // ʴ ־.. 8/18 + output.Delay = 10; // 1ÃÊ + // output.Range = 2 + (input.SkillLevel/25); // ¾²Áöµµ ¾Ê´Â °ª ¿Ö ³Ö¾î³ùÀ»±î.. 8/18 - // ݰ Ƽ ʽ ʴ´. + // °ø°Ý°è ±â¼ú¿¡´Â ÆÄƼ º¸³Ê½º°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù. } void Bless::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -818,10 +818,10 @@ void Bless::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 2 + input.INTE / 40 + input.SkillLevel / 20; } - output.Duration = (30 + input.SkillLevel * 3 / 2) * 10; // 30~50 - output.Delay = (7 - input.SkillLevel / 20) * 10; // 6->3 + output.Duration = (30 + input.SkillLevel * 3 / 2) * 10; // 30~50ÃÊ + output.Delay = (7 - input.SkillLevel / 20) * 10; // 6->3ÃÊ - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } @@ -848,22 +848,22 @@ void ContinualLight::computeOutput(const SkillInput& input, SkillOutput& output) break; } - output.Delay = (6 - input.SkillLevel / 25) * 10; // 5->2 + output.Delay = (6 - input.SkillLevel / 25) * 10; // 5->2ÃÊ output.Duration = (10 + input.SkillLevel / 2) * 10; } void Flare::computeOutput(const SkillInput& input, SkillOutput& output) { - output.Duration = (5 + input.SkillLevel / 5) * 10; // 10~20 - output.Delay = (6 - input.SkillLevel / 33) * 10; // 6->3 + output.Duration = (5 + input.SkillLevel / 5) * 10; // 10~20ÃÊ + output.Delay = (6 - input.SkillLevel / 33) * 10; // 6->3ÃÊ - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. // output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } void Purify::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 10 + input.SkillLevel / 10; - output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2 + output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2ÃÊ switch (g_pSkillInfoManager->getGradeByDomainLevel(input.DomainLevel)) { case SKILL_GRADE_APPRENTICE: @@ -886,7 +886,7 @@ void Purify::computeOutput(const SkillInput& input, SkillOutput& output) { break; } - // ݰ Ƽ ʽ ʴ´. + // °ø°Ý°è ±â¼ú¿¡´Â ÆÄƼ º¸³Ê½º°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù. } void AuraRing::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -894,7 +894,7 @@ void AuraRing::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 15 + input.INTE / 10 + input.SkillLevel / 3; // by bezz. 2002.12.10 output.Delay = max(1, 2 - (input.SkillLevel / 50)) * 10; // by bezz. 2002.12.10 - // ݰ Ƽ ʽ ʴ´. + // °ø°Ý°è ±â¼ú¿¡´Â ÆÄƼ º¸³Ê½º°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù. } void Striking::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -908,15 +908,15 @@ void Striking::computeOutput(const SkillInput& input, SkillOutput& output) { output.Duration = (30 + input.SkillLevel * 3 / 2) * 10; // output.Duration = (30 + input.SkillLevel * 2 / 3) * 10; - output.Delay = (6 - input.SkillLevel / 33) * 10; // 6->3 + output.Delay = (6 - input.SkillLevel / 33) * 10; // 6->3ÃÊ - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } void DetectInvisibility::computeOutput(const SkillInput& input, SkillOutput& output) { - output.Duration = (10 + input.SkillLevel / 2) * 10; // 30~50 - output.Delay = (6 - input.SkillLevel / 33) * 10; // 6->3 + output.Duration = (10 + input.SkillLevel / 2) * 10; // 30~50ÃÊ + output.Delay = (6 - input.SkillLevel / 33) * 10; // 6->3ÃÊ switch (g_pSkillInfoManager->getGradeByDomainLevel(input.DomainLevel)) { case SKILL_GRADE_APPRENTICE: @@ -939,31 +939,31 @@ void DetectInvisibility::computeOutput(const SkillInput& input, SkillOutput& out break; } - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } void AuraShield::computeOutput(const SkillInput& input, SkillOutput& output) { - output.Duration = (10 + input.SkillLevel / 3) * 10; // 15~35 - // output.Delay = (5 - input.SkillLevel/33) * 10; // 5->2 + output.Duration = (10 + input.SkillLevel / 3) * 10; // 15~35ÃÊ + // output.Delay = (5 - input.SkillLevel/33) * 10; // 5->2ÃÊ - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. // output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); - output.Delay = output.Duration; // Delay Duration . by bezz 2003.3.5 + output.Delay = output.Duration; // Delay ¿Í Duration ÀÌ °°´Ù. by bezz 2003.3.5 } void Visible::computeOutput(const SkillInput& input, SkillOutput& output) { - output.Delay = (5 - input.SkillLevel / 50) * 10; // 5->3 + output.Delay = (5 - input.SkillLevel / 50) * 10; // 5->3ÃÊ output.Range = 3 + (input.SkillLevel / 50); - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. // output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); // output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } ////////////////////////////////////////////////////////////////////////////// -// 迭 +// Èú¸µ °è¿­ ////////////////////////////////////////////////////////////////////////////// void CureLightWounds::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -973,9 +973,9 @@ void CureLightWounds::computeOutput(const SkillInput& input, SkillOutput& output output.Damage = 10 + input.SkillLevel / 4; } - output.Delay = 10; // 1 + output.Delay = 10; // 1ÃÊ - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); // output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } @@ -987,19 +987,19 @@ void CureAll::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 35 + input.SkillLevel / 2; } - output.Delay = 40 - input.SkillLevel / 5; // 4~ 2 + output.Delay = 40 - input.SkillLevel / 5; // 4ÃÊ~ 2ÃÊ - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); // output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } void CurePoison::computeOutput(const SkillInput& input, SkillOutput& output) { - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. // output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); // output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); - output.Delay = (4 - input.SkillLevel / 33) * 10; // 4->1 + output.Delay = (4 - input.SkillLevel / 33) * 10; // 4->1ÃÊ } void ProtectionFromPoison::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -1011,12 +1011,12 @@ void ProtectionFromPoison::computeOutput(const SkillInput& input, SkillOutput& o output.Damage = min(30, 20 + input.INTE / 20); } - // output.Duration = (30 + input.SkillLevel/2) * 10; // 30~80 - // output.Duration = (50 + input.INTE * 2 / 3) * 10; // 30~80// by sigi. 2002.12.3 + // output.Duration = (30 + input.SkillLevel/2) * 10; // 30~80ÃÊ + // output.Duration = (50 + input.INTE * 2 / 3) * 10; // 30~80ÃÊ// by sigi. 2002.12.3 output.Duration = (60 + input.INTE / 2 + input.SkillLevel / 2) * 10; // - output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2 + output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2ÃÊ - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } @@ -1025,9 +1025,9 @@ void CauseLightWounds::computeOutput(const SkillInput& input, SkillOutput& outpu // output.Damage = 10 + input.SkillLevel/10; // output.Damage = 5 + input.INTE/10 + input.SkillLevel/10; // by sigi. 2002.12.3 output.Damage = 10 + input.INTE / 10 + input.SkillLevel / 10; // by sigi. 2002.12.3 - output.Delay = 10; // 1 + output.Delay = 10; // 1ÃÊ - // ݰ Ƽ ʽ ʴ´. + // °ø°Ý°è ±â¼ú¿¡´Â ÆÄƼ º¸³Ê½º°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù. } void CureSeriousWounds::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -1037,17 +1037,17 @@ void CureSeriousWounds::computeOutput(const SkillInput& input, SkillOutput& outp output.Damage = 30 + input.SkillLevel / 4; } - output.Delay = 10; // 1 + output.Delay = 10; // 1ÃÊ - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); // output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } void RemoveCurse::computeOutput(const SkillInput& input, SkillOutput& output) { - output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2 + output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2ÃÊ - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. // output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); // output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } @@ -1062,18 +1062,18 @@ void ProtectionFromCurse::computeOutput(const SkillInput& input, SkillOutput& ou output.Damage = max(30, 20 + input.INTE / 20); } - // output.Duration = (25 + input.SkillLevel/2) * 10; // 25~75 - // output.Duration = (40 + input.INTE*2/3) * 10; // 25~75 // by sigi. 2002.12.3 - output.Duration = (60 + input.SkillLevel / 2 + input.INTE / 2) * 10; // 25~75 // by sigi. 2002.12.3 - output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2 + // output.Duration = (25 + input.SkillLevel/2) * 10; // 25~75ÃÊ + // output.Duration = (40 + input.INTE*2/3) * 10; // 25~75ÃÊ // by sigi. 2002.12.3 + output.Duration = (60 + input.SkillLevel / 2 + input.INTE / 2) * 10; // 25~75ÃÊ // by sigi. 2002.12.3 + output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2ÃÊ - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } void Resurrect::computeOutput(const SkillInput& input, SkillOutput& output) { - output.Delay = 20; // 2 + output.Delay = 20; // 2ÃÊ } void CauseSeriousWounds::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -1081,9 +1081,9 @@ void CauseSeriousWounds::computeOutput(const SkillInput& input, SkillOutput& out // by sigi. 2002.12.3 // output.Damage = 5 + input.INTE/8 + input.SkillLevel/5; output.Damage = 15 + input.INTE / 8 + input.SkillLevel / 5; - output.Delay = 10; // 1 + output.Delay = 10; // 1ÃÊ - // ݰ Ƽ ʽ ʴ´. + // °ø°Ý°è ±â¼ú¿¡´Â ÆÄƼ º¸³Ê½º°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù. } void CureCriticalWounds::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -1093,11 +1093,11 @@ void CureCriticalWounds::computeOutput(const SkillInput& input, SkillOutput& out output.Damage = 10 + input.SkillLevel / 20; } - output.Delay = (40 - input.SkillLevel / 5) * 10; // 40~20 + output.Delay = (40 - input.SkillLevel / 5) * 10; // 40ÃÊ~20ÃÊ - output.Duration = (20 + input.SkillLevel / 5) * 10; // 20~40 + output.Duration = (20 + input.SkillLevel / 5) * 10; // 20ÃÊ~40ÃÊ - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); // output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } @@ -1112,21 +1112,21 @@ void ProtectionFromAcid::computeOutput(const SkillInput& input, SkillOutput& out output.Damage = min(30, 20 + input.INTE / 20); } - // output.Duration = (20 + input.SkillLevel/2) * 10; // 20~70 - // output.Duration = (40 + input.INTE*2/3) * 10; // 20~70 - output.Duration = (60 + input.SkillLevel / 2 + input.INTE / 2) * 10; // 20~70 - output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2 + // output.Duration = (20 + input.SkillLevel/2) * 10; // 20~70ÃÊ + // output.Duration = (40 + input.INTE*2/3) * 10; // 20~70ÃÊ + output.Duration = (60 + input.SkillLevel / 2 + input.INTE / 2) * 10; // 20~70ÃÊ + output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2ÃÊ - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } void Sacrifice::computeOutput(const SkillInput& input, SkillOutput& output) { - output.Duration = (30 + input.SkillLevel / 5) * 10; // 30~50 - output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2 + output.Duration = (30 + input.SkillLevel / 5) * 10; // 30~50ÃÊ + output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2ÃÊ - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. // output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } @@ -1134,22 +1134,22 @@ void Sacrifice::computeOutput(const SkillInput& input, SkillOutput& output) { void CauseCriticalWounds::computeOutput(const SkillInput& input, SkillOutput& output) { /* output.Damage = 20 + input.SkillLevel/6; - output.Delay = 10; // 1 + output.Delay = 10; // 1ÃÊ */ // output.Damage = 3 + input.SkillLevel / 10; // 3-13 // by sigi. 2002.12.3 output.Damage = 5 + input.INTE / 10 + input.SkillLevel / 5; // 3-13 - output.Delay = (10 - input.SkillLevel / 33) * 10; // 10-7 - output.Duration = (3 + input.SkillLevel / 50) * 10; // 3-5 + output.Delay = (10 - input.SkillLevel / 33) * 10; // 10-7ÃÊ + output.Duration = (3 + input.SkillLevel / 50) * 10; // 3-5ÃÊ - // ݰ Ƽ ʽ ʴ´. + // °ø°Ý°è ±â¼ú¿¡´Â ÆÄƼ º¸³Ê½º°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù. } /* void CureAll::computeOutput(const SkillInput& input, SkillOutput& output) { - output.Delay = (4 - input.SkillLevel/33) * 10; // 4->1 + output.Delay = (4 - input.SkillLevel/33) * 10; // 4->1ÃÊ } */ @@ -1157,10 +1157,10 @@ void RegenerationSkill::computeOutput(const SkillInput& input, SkillOutput& outp void EnergyDrop::computeOutput(const SkillInput& input, SkillOutput& output) { // output.Damage = 25 + input.SkillLevel/5; // 20 ~ 45 - // output.Delay = 30; // 3 + // output.Delay = 30; // 3ÃÊ // output.Damage = 10 + input.INTE/10 + input.SkillLevel/5; // 20 ~ 45 12.06 - // 2002.12.06 ȫâ + // 2002.12.06 Àåȫâ // output.Damage = 10 + input.INTE/10 + input.SkillLevel/3; output.Damage = 18 + input.INTE / 10 + input.SkillLevel / 2.5; // output.Delay = (8 - input.SkillLevel/20)*10; @@ -1170,10 +1170,10 @@ void EnergyDrop::computeOutput(const SkillInput& input, SkillOutput& output) { void VigorDrop::computeOutput(const SkillInput& input, SkillOutput& output) { // by sigi. 2002.12.3 // output.Damage = 25 + input.SkillLevel/5; // 20 ~ 45 - // output.Delay = 30; // 3 + // output.Delay = 30; // 3ÃÊ // output.Damage = 10 + input.INTE/10 + input.SkillLevel/5; // 20 ~ 45 2002.12.06 - // 2002.12.06 ȫâ + // 2002.12.06 Àåȫâ // output.Damage = 10 + input.INTE/10 + input.SkillLevel/3; output.Damage = 18 + input.INTE / 10 + input.SkillLevel / 3; // output.Delay = (8 - input.SkillLevel/20)*10; @@ -1186,7 +1186,7 @@ void Activation::computeOutput(const SkillInput& input, SkillOutput& output) { output.Duration = (40 + input.SkillLevel / 5) * 10; output.Delay = (6 - input.SkillLevel / 50) * 10; - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. output.Damage = 0; output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } @@ -1207,7 +1207,7 @@ void Reflection::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 0; // output.Delay = 5 - input.SkillLevel/33; output.Duration = (20 + input.SkillLevel / 5) * 10; - output.Delay = output.Duration; // Delay Duration . by bezz 2003.3.5 + output.Delay = output.Duration; // Delay ¿Í Duration ÀÌ °°´Ù. by bezz 2003.3.5 } void Hymn::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -1217,23 +1217,23 @@ void Hymn::computeOutput(const SkillInput& input, SkillOutput& output) { } ////////////////////////////////////////////////////////////////////////////// -// ̾ 迭 +// ¹ìÆÄÀÌ¾î °è¿­ ////////////////////////////////////////////////////////////////////////////// void PoisonousHands::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = min(20, 3 + (input.INTE - 20) / 3); - output.Delay = 6; // 0.6 + output.Delay = 6; // 0.6ÃÊ } void AcidTouch::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = input.STR / 6 + input.INTE / 15; - output.Delay = 6; // 0.6 + output.Delay = 6; // 0.6ÃÊ } void GreenPoison::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = min(15, 5 + (input.INTE - 20) / 10); output.Duration = min(20, 10 + (input.INTE - 20) / 10) * 10; - output.Delay = max(2, 5 - (input.INTE - 20) / 50) * 10; // 5->2 + output.Delay = max(2, 5 - (input.INTE - 20) / 50) * 10; // 5->2ÃÊ } void Darkness::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -1327,7 +1327,7 @@ void Seduction::computeOutput(const SkillInput& input, SkillOutput& output) { void BloodyNail::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = input.STR / 8 + input.DEX / 10 + input.INTE / 30; - output.Delay = 6; // 0.6 + output.Delay = 6; // 0.6ÃÊ } void BloodyKnife::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -1343,21 +1343,21 @@ void BloodyBall::computeOutput(const SkillInput& input, SkillOutput& output) { void BloodyWave::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = input.INTE / 6 + input.STR / 7 + input.DEX / 7; output.Delay = max(1, 3 - input.DEX / 50) * 10; - // ToHit bKnockback δ. + // ToHit´Â bKnockbackÀ¸·Î ¾²ÀδÙ. output.ToHit = 50; // min(35, 10 + (int)(input.INTE/10)); } void BloodyMasterWave::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = min(80, 40 + (input.INTE - 20) / 4); output.Delay = 30; - // ToHit bKnockback δ. + // ToHit´Â bKnockbackÀ¸·Î ¾²ÀδÙ. output.ToHit = min(55, 30 + (int)(input.INTE / 10)); } void BloodyWarp::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = min(70, 30 + (input.INTE - 20) / 4); output.Delay = 30; - // ToHit bKnockback δ. + // ToHit´Â bKnockbackÀ¸·Î ¾²ÀδÙ. output.ToHit = min(35, 10 + (int)(input.INTE / 10)); } @@ -1399,10 +1399,10 @@ void BloodyStrike::computeOutput(const SkillInput& input, SkillOutput& output) { void PoisonStorm::computeOutput(const SkillInput& input, SkillOutput& output) { // output.Damage = input.STR/30 + input.INTE/9; 12.6 - // 2002.12.06 ȫâ + // 2002.12.06 Àåȫâ output.Damage = input.STR / 30 + input.INTE / 4; - // 2003.3.20 Sequoia ̴ϸ ־. + // 2003.3.20 Sequoia µô·¹ÀÌ ¹Ì´Ï¸Ø ³Ö¾ú´Ù. output.Delay = max((8 - input.DEX / 50) * 10, 20); output.Range = min(6, 3 + (input.SkillLevel - 40) / 8); } @@ -1410,10 +1410,10 @@ void PoisonStorm::computeOutput(const SkillInput& input, SkillOutput& output) { void AcidStorm::computeOutput(const SkillInput& input, SkillOutput& output) { // output.Damage = input.STR/28 + input.INTE/8; 12.6 - // 2002.12.06 ȫâ + // 2002.12.06 Àåȫâ output.Damage = input.STR / 25 + input.INTE * 2 / 7; - // 2003.3.20 Sequoia ̴ϸ ־. + // 2003.3.20 Sequoia µô·¹ÀÌ ¹Ì´Ï¸Ø ³Ö¾ú´Ù. output.Delay = max((9 - input.DEX / 50) * 10, 20); } @@ -1421,13 +1421,13 @@ void BloodyStorm::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = input.STR / 25 + input.INTE / 6; output.Duration = (input.DEX / 100 + input.INTE / 100) * 10; - // 2003.3.20 Sequoia ̴ϸ ־. + // 2003.3.20 Sequoia µô·¹ÀÌ ¹Ì´Ï¸Ø ³Ö¾ú´Ù. output.Delay = max((9 - input.DEX / 50) * 10, 20); } void Extreme::computeOutput(const SkillInput& input, SkillOutput& output) { - // ʽ ⼭ ʰ, - // Vampire::initAllStat() Ѵ. + // µ¥¹ÌÁö º¸³Ê½º´Â ¿©±â¼­ °è»êÇÏÁö ¾Ê°í, + // Vampire::initAllStat()¿¡¼­ °è»êÇÑ´Ù. output.Damage = 0; // output.Duration = (30 + (input.INTE-20)/6) * 10; // 30 -> 80 output.Duration = (60 + input.STR / 15 + input.DEX / 6 + input.INTE / 20) * 10; // 30 -> 80 @@ -1435,13 +1435,13 @@ void Extreme::computeOutput(const SkillInput& input, SkillOutput& output) { } void CriticalGround::computeOutput(const SkillInput& input, SkillOutput& output) { - // acid bolt Ȱ - -; + // acid bolt¶û ¶È°°´ç - -; // output.Damage = min(40, 20 + (input.INTE-20)/6); - // output.Delay = 10; // 1 + // output.Delay = 10; // 1ÃÊ // 20 // 145 --> 145~290 --> 22~46 - // 500 --> 500~1000 --> 125~250 (ȹ140~280) + // 500 --> 500~1000 --> 125~250 (±âȹ140~280) int divider = 1; if (input.STR < 200) { @@ -1451,9 +1451,9 @@ void CriticalGround::computeOutput(const SkillInput& input, SkillOutput& output) } output.Damage = max(20, (input.STR + rand() % input.STR) / divider); - output.Delay = 10; // 0.6 + output.Delay = 10; // 0.6ÃÊ - // ݰ Ƽ ʽ ʴ´. + // °ø°Ý°è ±â¼ú¿¡´Â ÆÄƼ º¸³Ê½º°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù. } void Peace::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -1463,7 +1463,7 @@ void Peace::computeOutput(const SkillInput& input, SkillOutput& output) { } void Death::computeOutput(const SkillInput& input, SkillOutput& output) { - // 2003.3.20 by Sequoia ִ밪 ߰Ǿ. + // 2003.3.20 by Sequoia ÃÖ´ë°ªÀÌ Ãß°¡µÇ¾ú´Ù. // output.Damage = min( input.INTE*10/25 + input.STR/6, 150 ); output.Damage = min(input.INTE / 5 + input.STR / 12, 80); output.Duration = (input.INTE / 5) * 10; @@ -1471,7 +1471,7 @@ void Death::computeOutput(const SkillInput& input, SkillOutput& output) { } void Mephisto::computeOutput(const SkillInput& input, SkillOutput& output) { - // Ư.. parameter Ѱش. + // ÀÌ ±â¼ú¸¸ Ưº°È÷.. parameter¸¦ ´ÙÀ½°ú °°ÀÌ ³Ñ°ÜÁØ´Ù. // input.SkillLevel = pVampire->getSTR()+pVampire->getDEX()+pVampire->getINT(); // input.DomainLevel = pVampire->getLevel(); @@ -1493,12 +1493,12 @@ void Transfusion::computeOutput(const SkillInput& input, SkillOutput& output) { void SummonMonsters::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 0; - output.Delay = 20; // 2 + output.Delay = 20; // 2ÃÊ } void GroundAttack::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = min(100, 30 + (input.INTE - 20) / 5); // % damage - output.Duration = 20; // + output.Duration = 20; // ¸î ÃÊÈÄ Æø¹ß output.Tick = 15; output.Delay = max(3, 6 - (input.INTE - 20) / 50) * 10; } @@ -1506,7 +1506,7 @@ void GroundAttack::computeOutput(const SkillInput& input, SkillOutput& output) { void MeteorStrike::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = (int)(input.SkillLevel * 0.8 + (rand() % (int)(input.SkillLevel * 0.4 + 1))) + (input.STR + input.DEX) / 6; - output.Duration = 10; // + output.Duration = 10; // ¸î ÃÊÈÄ Æø¹ß output.Delay = 10; } @@ -1520,7 +1520,7 @@ void Hallucination::computeOutput(const SkillInput& input, SkillOutput& output) } void DuplicateSelf::computeOutput(const SkillInput& input, SkillOutput& output) { - output.Damage = min((3 + rand() % 5), input.INTE / 100); // н + output.Damage = min((3 + rand() % 5), input.INTE / 100); // ºÐ½Å °³¼ö output.Duration = min(80, 30 + (input.INTE - 20) / 3) * 10; output.Delay = max(3, 5 - (input.INTE - 20) / 10) * 10; } @@ -1534,14 +1534,14 @@ void SharpShield::computeOutput(const SkillInput& input, SkillOutput& output) { output.Duration = (10 + (input.SkillLevel / 2)) * 10; output.Damage = (input.STR / 20) + (input.SkillLevel / 20); // output.Delay = ( 5 - ( input.SkillLevel / 25 ) ) * 10; - output.Delay = output.Duration; // Delay Duration . by bezz 2003.3.5 + output.Delay = output.Duration; // Delay ¿Í Duration ÀÌ °°´Ù. by bezz 2003.3.5 } void WideLightning::computeOutput(const SkillInput& input, SkillOutput& output) { output.Delay = 10; output.Damage = (input.STR / 8) + (input.SkillLevel / 3); - output.Duration = 6; // 0.6 - output.Tick = 6; // 0.6 + output.Duration = 6; // 0.6ÃÊ + output.Tick = 6; // 0.6ÃÊ } void GunShotGuidance::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -1554,9 +1554,9 @@ void GunShotGuidance::computeOutput(const SkillInput& input, SkillOutput& output void AirShield::computeOutput(const SkillInput& input, SkillOutput& output) { // output.Damage = 50 + ( input.SkillLevel >> 1 ); // 50 + SkillLevel / 2 output.Damage = 50 + (input.SkillLevel / 5); // 50 + SkillLevel / 2 - output.Duration = (10 + (input.SkillLevel >> 1)) * 10; // 10 + SkillLevel / 2 () + output.Duration = (10 + (input.SkillLevel >> 1)) * 10; // 10 + SkillLevel / 2 (ÃÊ) // output.Delay = ( 5 - ( input.SkillLevel / 25 ) ) * 10; - output.Delay = output.Duration; // Delay Duration . by bezz 2003.3.5 + output.Delay = output.Duration; // Delay ¿Í Duration ÀÌ °°´Ù. by bezz 2003.3.5 } void BulletOfLight::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -1580,25 +1580,25 @@ void BulletOfLight::computeOutput(const SkillInput& input, SkillOutput& output) }*/ output.Damage = -20 + (input.SkillLevel * 2 / 3); // / 1.5 ); output.ToHit = -10 + (input.SkillLevel / 2); // / 1.5 ); - output.Delay = 2; // 0.2 + output.Delay = 2; // 0.2ÃÊ } void HandsOfWisdom::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = input.STR / 15 + input.INTE / 8; - output.Delay = 6; // 0.6 + output.Delay = 6; // 0.6ÃÊ } void LightBall::computeOutput(const SkillInput& input, SkillOutput& output) { // output.Damage = 2 + (input.INTE/20) + (input.SkillLevel/10); output.Damage = 9 + (input.INTE / 20) + (input.SkillLevel / 10); - output.Delay = 10; // 1 + output.Delay = 10; // 1ÃÊ output.Range = 2 + (input.SkillLevel / 25); } void HolyArrow::computeOutput(const SkillInput& input, SkillOutput& output) { // output.Damage = 2 + (input.INTE/20) + (input.SkillLevel/10); output.Damage = 8 + (input.INTE / 20) + (input.SkillLevel / 10); - output.Delay = 10; // 1 + output.Delay = 10; // 1ÃÊ output.Range = 2 + (input.SkillLevel / 25); } @@ -1629,8 +1629,8 @@ void Regeneration::computeOutput(const SkillInput& input, SkillOutput& output) { void PowerOfLand::computeOutput(const SkillInput& input, SkillOutput& output) { output.Delay = 10; output.Damage = (input.STR / 8) + (input.SkillLevel / 3); - output.Duration = 10; // 1 - output.Tick = 10; // 1 + output.Duration = 10; // 1ÃÊ + output.Tick = 10; // 1ÃÊ } void TurnUndead::computeOutput(const SkillInput& input, SkillOutput& output) { @@ -1649,7 +1649,7 @@ void Armageddon::computeOutput(const SkillInput& input, SkillOutput& output) { void BloodyBreaker::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = input.INTE / 4 + input.STR / 5 + input.DEX / 5; output.Delay = max(1, 3 - input.DEX / 50) * 10; - // ToHit knockback Ȯ + // ToHit Àº knockback È®·ü output.ToHit = 50; } @@ -2134,7 +2134,7 @@ void GreatHeal::computeOutput(const SkillInput& input, SkillOutput& output) { output.Delay = (5 - input.SkillLevel / 33) * 10; - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. // output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } @@ -2202,11 +2202,11 @@ void ProtectionFromBlood::computeOutput(const SkillInput& input, SkillOutput& ou output.Damage = min(30, 20 + input.INTE / 20); } - // output.Duration = (20 + input.SkillLevel/2) * 10; // 20~70 - output.Duration = (60 + input.INTE / 2 + input.SkillLevel / 2) * 10; // 20~70 - output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2 + // output.Duration = (20 + input.SkillLevel/2) * 10; // 20~70ÃÊ + output.Duration = (60 + input.INTE / 2 + input.SkillLevel / 2) * 10; // 20~70ÃÊ + output.Delay = (5 - input.SkillLevel / 33) * 10; // 5->2ÃÊ - // Ƽ ʽ Ѵ. + // ÆÄƼ º¸³Ê½º¸¦ °è»êÇÑ´Ù. output.Damage = getPercentValue(output.Damage, PartyEffectBoost[input.PartySize]); output.Duration = getPercentValue(output.Duration, PartyDurationBoost[input.PartySize]); } @@ -2401,7 +2401,7 @@ void HellFire::computeOutput(const SkillInput& input, SkillOutput& output) { max(20, min(150, (int)(((input.INTE / 30.0) * (1.0 + ((float)(input.SkillLevel) / 45.0)) + 5.0) * 10))); } - // ToHit Speed Damage + // ToHit À» Speed Damage ·Î »ç¿ë output.ToHit = (int)(5.0 + (input.INTE / 50.0) * (1.0 + (input.SkillLevel / 15.0))); output.Delay = (int)max(40.0, (output.Duration * 1.2 - (input.SkillLevel * 10))); output.Tick = 5; @@ -2698,30 +2698,30 @@ void GoreGlandFire::computeOutput(const SkillInput& input, SkillOutput& output) void ThrowingAxe::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = Random(870, 1000); - output.Duration = 20; // + output.Duration = 20; // ¸î ÃÊÈÄ Æø¹ß output.Delay = 10; } void ChoppingFirewood::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = Random(870, 1000); - output.Duration = 10; // + output.Duration = 10; // ¸î ÃÊÈÄ Æø¹ß output.Delay = 10; } void ChainThrowingAxe::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = Random(500, 650); - output.Duration = 20; // + output.Duration = 20; // ¸î ÃÊÈÄ Æø¹ß output.Delay = 10; } void MultiThrowingAxe::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = Random(870, 1000); - output.Duration = 20; // + output.Duration = 20; // ¸î ÃÊÈÄ Æø¹ß output.Delay = 10; } void PlayingWithFire::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 400; - output.Duration = 20; // + output.Duration = 20; // ¸î ÃÊÈÄ Æø¹ß output.Delay = 0; } @@ -2734,7 +2734,7 @@ void InfinityThunderbolt::computeOutput(const SkillInput& input, SkillOutput& ou void SpitStream::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 30 + (input.STR / 10) + (input.SkillLevel / 5); - output.Duration = 4; // + output.Duration = 4; // ¸î ÃÊÈÄ Æø¹ß output.Delay = 0; } @@ -2875,7 +2875,7 @@ void ShadowOfStorm::computeOutput(const SkillInput& input, SkillOutput& output) output.Duration = 50 + (min(input.Range, 10) * 5); output.Delay = 50; } -// Ұ +// Ò°ÀÇ void WildWolf::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = (input.DEX / 8) + (input.STR / 30) + min(input.Range, 10) * 2; output.Delay = max(5, (10 - (input.DEX / 200))) * 10; @@ -2920,49 +2920,49 @@ void RottenApple::computeOutput(const SkillInput& input, SkillOutput& output) { } // add by coffee 2007-2-17 -// Ѫ֮ӡ +// Ѫ֮ÀÓÓ¡ void BloodyScarify::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = (input.DEX / 5) + (input.STR / 25) + min(input.Range, 10) * 2; output.Delay = max(5, (10 - (input.DEX / 200))) * 10; } -// Ѫ֮? +// Ѫ֮?Öä void BloodCurse::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = (int)(input.SkillLevel * 0.8 + (rand() % (int)(input.SkillLevel * 0.4 + 1))) + (input.INTE + input.DEX) / 4; - output.Duration = 28; // ʱʾЧ + output.Duration = 28; // ÑÓʱÏÔʾЧ¹û output.Delay = max(5, (10 - (input.DEX / 200))) * 10; ; } -// ҫ֮ +// ÉÁÒ«Ö®½£ void ShineSword::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = (20 + (input.STR / 15) + (min(input.Range, 10) * 2)) * 3; output.Delay = (4 - min(input.Range, 10) / 5) * 10; - output.Duration = 20; // ʱʾЧ + output.Duration = 20; // ÑÓʱÏÔʾЧ¹û } -// ںը +// ¾ÞÅÚºäÕ¨ void BombCrashWalk::computeOutput(const SkillInput& input, SkillOutput& output) { output.Delay = 10; output.Damage = (input.STR / 8) + (input.SkillLevel / 3); - output.Duration = 7; // 1 - output.Tick = 1; // 1 + output.Duration = 7; // 1ÃÊ + output.Tick = 1; // 1ÃÊ /* output.Damage = (20 + (input.STR/15) + (min(input.Range,10)*2))*3; output.Delay = (4 - min(input.Range,10)/5)*10; - output.Duration = 20;//ʱʾЧ + output.Duration = 20;//ÑÓʱÏÔʾЧ¹û */ } -// Ǻ (ǹ¼) +// ÎÀÐǺä»÷ (ÈËÀàǹм¼ÄÜ) void SatelliteBomb::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 150 + input.SkillLevel / 2; - output.Duration = 6; // 0.6 + output.Duration = 6; // 0.6 Ãë output.Delay = 35 - input.SkillLevel * 10 / 33; output.Range = 8; } -// ֲþ (ҽ¼) +// ¿Ö²À»Ã¾õ (ÈËÀàÒ½Éúм¼ÄÜ) void IllusionInversion::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = max(200, ((input.INTE / 8) * (1 + (input.SkillLevel / 33)))); // output.Damage = (( input.INTE / 5 )* 0.7) * ( 1 + ( input.SkillLevel / 33 ) ); @@ -2970,42 +2970,42 @@ void IllusionInversion::computeOutput(const SkillInput& input, SkillOutput& outp output.Range = 5; /* output.Damage = + input.SkillLevel / 2; - output.Duration = 6; //0.6 + output.Duration = 6; //0.6 Ãë output.Delay = 10; output.Range = 8; */ } -// (ף¼) +// ÌìÉñ½µÁÙ (ÈËÀà×£¸£Ð¼¼ÄÜ) void HeavenGround::computeOutput(const SkillInput& input, SkillOutput& output) { // output.Duration = (10 + input.INTE/20 + input.SkillLevel/10)*10; output.Duration = (10 + input.INTE / 20 + input.SkillLevel / 6) * 9; - // cout << "ʱ:" << (int)output.Duration << endl; + // cout << "ÌìÉñ½µÁÙÑÓʱ:" << (int)output.Duration << endl; output.Delay = output.Duration; //(10 - input.SkillLevel/33) * 10; // edit by Coffee 2007-5-8 output.Damage = min(80, (input.INTE / 18) * (1 + (input.SkillLevel / 33))); output.Tick = 20; } -// ׿˿(ħ ) +// µÂÀ׿˿þÀÜ(ħÁé »ð·¨) void DummyDrake::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 250 + (input.INTE / 50) + min(input.Range, 10); output.Duration = (10 + (min(input.Range, 10) / 2)) * 5; output.Delay = output.Duration; } -// ˮ (ˮ) +// ¸´ºÏË®ÁÆ (Ë®·¨) void HydroConvergence::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 20 + (input.INTE / 50) + min(input.Range, 10); output.Duration = (10 + (min(input.Range, 10) / 2)) * 5; output.Delay = output.Duration; } -// ճٻ () +// Õ³ÍÁÕÙ»½ (ÍÁ·¨) void SummonClay::computeOutput(const SkillInput& input, SkillOutput& output) { // output.Damage = 20 + (input.INTE/50) + min(input.Range,10); output.Duration = ((input.INTE / 30) + (min(input.Range, 10) / 2)) * 13; - // cout << "ճٻ:" << (int)output.Duration << endl; + // cout << "Õ³ÍÁÕÙ»½:" << (int)output.Duration << endl; output.Delay = output.Duration; } -// IJ (ħս) +// ÏIJ¼Àû»ùÒò (ħս) void HeterChakram::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = min(200, 140 + (input.STR / 5) + (min(input.Range, 10) * 5)); output.Range = 60 + (min(input.Range, 10) * 3); @@ -3022,11 +3022,11 @@ void SkyFire::computeOutput(const SkillInput& input, SkillOutput& output) { void CutStorm::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = (20 + (input.STR / 15) + (min(input.Range, 10) * 2)) * 3; output.Delay = (4 - min(input.Range, 10) / 5) * 10; - output.Duration = 20; // ʱʾЧ + output.Duration = 20; // ÑÓʱÏÔʾЧ¹û } void XRLMissile::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = 150 + input.SkillLevel / 2; - output.Duration = 6; // 0.6 + output.Duration = 6; // 0.6 Ãë output.Delay = 35 - input.SkillLevel * 10 / 33; output.Range = 8; } @@ -3037,7 +3037,7 @@ void SacredStamp::computeOutput(const SkillInput& input, SkillOutput& output) { output.Range = 5; /* output.Damage = + input.SkillLevel / 2; - output.Duration = 6; //0.6 + output.Duration = 6; //0.6 Ãë output.Delay = 10; output.Range = 8; */ @@ -3055,7 +3055,7 @@ void DeadlyClaw::computeOutput(const SkillInput& input, SkillOutput& output) { void VoodooRing::computeOutput(const SkillInput& input, SkillOutput& output) { output.Damage = (int)(input.SkillLevel * 0.8 + (rand() % (int)(input.SkillLevel * 0.4 + 1))) + (input.INTE + input.DEX) / 4; - output.Duration = 28; // ʱʾЧ + output.Duration = 28; // ÑÓʱÏÔʾЧ¹û output.Delay = max(5, (10 - (input.DEX / 200))) * 10; ; } diff --git a/src/server/gameserver/skill/SkillHandler.cpp b/src/server/gameserver/skill/SkillHandler.cpp index 691c1ae9..329c879f 100644 --- a/src/server/gameserver/skill/SkillHandler.cpp +++ b/src/server/gameserver/skill/SkillHandler.cpp @@ -250,7 +250,7 @@ void SkillHandler::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, CoordInve } } -// Create Holy Water execute +// Create Holy Water 용 execute void SkillHandler::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, ObjectID_t ItemObjectID, CoordInven_t X, CoordInven_t Y) @@ -349,11 +349,11 @@ void SkillHandler::execute(Monster* pMonster, Creature* pEnemy) void SkillHandler::execute(Monster* pMonster, ZoneCoord_t x, ZoneCoord_t y) {} -// Mine & Bomb -const int ETypeCount = 5; // -const int tilesByEType[ETypeCount] = {3, 3, 5, 5, 9}; // ŸԿ Ÿ . +// Mine & Bomb 관련 +const int ETypeCount = 5; // 폭발의 종류 +const int tilesByEType[ETypeCount] = {3, 3, 5, 5, 9}; // 폭발 타입에 따른 피해 타일의 수. -// . +// 방향 왼쪽 부터 밑으로 돈다. const int xOffsetByEType0[DIR_MAX][3] = {{-1, 0, 1}, {-1, 0, 1}, {0, 0, 0}, {-1, 0, 1}, {-1, 0, 1}, {-1, 0, 1}, {0, 0, 0}, {-1, 0, 1}}; @@ -380,7 +380,7 @@ const int xOffsetByEType4[9] = {-1, 0, 1, -1, 0, 1, -1, 0, 1}; const int yOffsetByEType4[9] = {-1, -1, -1, 0, 0, 0, 1, 1, 1}; /* -// Ÿ ġ +// 폭발 종류에 따른 피해 타일의 위치 const int xOffsetByEType0[ 1 ] = { 0}; const int yOffsetByEType0[ 1 ] = { 0}; diff --git a/src/server/gameserver/skill/SkillHandler.h b/src/server/gameserver/skill/SkillHandler.h index a60fd0a3..db03cc87 100644 --- a/src/server/gameserver/skill/SkillHandler.h +++ b/src/server/gameserver/skill/SkillHandler.h @@ -25,7 +25,7 @@ #include "ZoneUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ũ, , Լ +// 매크로, 상수, 함수 헤더 ////////////////////////////////////////////////////////////////////////////// #define MAKEWORD(U, D) (WORD)((WORD)(U) << 8 | (WORD)(D)) @@ -75,12 +75,12 @@ class SkillOutput { } public: - int Damage; // Ǵ ȿġ - int Duration; // ð , ð - int Tick; // ֱ⸶ ִ , ֱ - int ToHit; // Բ ߷ ȭŰ . - int Range; // õ, INT  ϴ . - int Delay; // ִ ð + int Damage; // 데미지 또는 효과치 + int Duration; // 지속 시간을 가지는 기술일 경우, 지속 시간 + int Tick; // 일정 주기마다 영향을 주는 기술일 경우, 그 일정 주기 + int ToHit; // 데미지와 함께 명중률도 같이 변화시키는 기술일 경우. + int Range; // 숙련도, INT 등에 따라 영향 범위가 변하는 기술일 경우. + int Delay; // 다음으로 기술을 쓸 수 있는 시간 }; @@ -129,15 +129,15 @@ class SkillHandler { CoordInven_t TargetX, CoordInven_t TargetY, VampireSkillSlot* pVampireSkillSlot); virtual void execute(Ousters* pOusters, ObjectID_t TargetObjectID, CoordInven_t X, CoordInven_t Y, CoordInven_t TargetX, CoordInven_t TargetY, OustersSkillSlot* pOustersSkillSlot); - // Throw Holy Water... + // Throw Holy Water용... virtual void execute(Slayer* pSlayer, ObjectID_t TargetObjectID, ObjectID_t ItemObjectID, CoordInven_t X, CoordInven_t Y); - // Absorb Soul + // Absorb Soul 용 virtual void execute(Ousters* pOusters, ObjectID_t TargetObjectID, ZoneCoord_t TargetZoneX, ZoneCoord_t TargetZoneY, ObjectID_t InvenObjectID, CoordInven_t X, CoordInven_t Y, CoordInven_t TargetX, CoordInven_t TargetY); - // Target ̸ ĺǴ + // Target이 이름으로 식별되는 경우 // ex) SoulChain . virtual void execute(PlayerCreature* pPC, const string& TargetName, SkillSlot* pSkillSlot, CEffectID_t CEffectID); virtual void execute(Slayer* pSlayer, const string& TargetName, SkillSlot* pSkillSlot, CEffectID_t CEffectID); diff --git a/src/server/gameserver/skill/SkillHandlerManager.cpp b/src/server/gameserver/skill/SkillHandlerManager.cpp index e04bfaf5..6d2f0eb0 100644 --- a/src/server/gameserver/skill/SkillHandlerManager.cpp +++ b/src/server/gameserver/skill/SkillHandlerManager.cpp @@ -8,11 +8,11 @@ #include "Assert.h" -// Ϲ +// ÀÏ¹Ý °ø°Ý #include "AttackArms.h" #include "AttackMelee.h" -// ˰迭 +// °Ë°è¿­ #include "CrossCounter.h" #include "DancingSword.h" #include "DoubleImpact.h" @@ -33,7 +33,7 @@ #include "TripleSlasher.h" #include "WindDivider.h" -// 迭 +// µµ°è¿­ #include "AirShield.h" #include "Berserker.h" #include "ChargingPower.h" @@ -54,7 +54,7 @@ #include "WildSmash.h" #include "WildTyphoon.h" -// 迭 +// ±ºÀÎ °è¿­ #include "BulletOfLight.h" #include "Concealment.h" #include "CreateBomb.h" @@ -73,7 +73,7 @@ #include "TripleShot.h" #include "UltimateBlow.h" -// æ 迭 +// ÀÎæ °è¿­ #include "AuraBall.h" #include "AuraRing.h" #include "Bless.h" @@ -99,7 +99,7 @@ #include "VigorDrop.h" #include "Visible.h" -// 迭 +// Èú¸µ °è¿­ #include "Activation.h" #include "CauseCriticalWounds.h" #include "CauseLightWounds.h" @@ -127,7 +127,7 @@ #include "TurnUndead.h" -// 迭 +// ¹ìÇÁ °è¿­ #include "AcidBall.h" #include "AcidBolt.h" #include "AcidSwamp.h" @@ -188,7 +188,7 @@ #include "Untransform.h" -// Ÿ 迭 +// ±âŸ °è¿­ #include "CriticalGround.h" #include "DuplicateSelf.h" #include "GroundAttack.h" @@ -206,13 +206,13 @@ #include "SharpShield.h" #include "WideLightning.h" -// ų +// ¼ºÁö½ºÅ³ #include "IllusionOfAvenge.h" #include "MagicElusion.h" #include "PoisonMesh.h" #include "WillOfLife.h" -// ƿ콺 ų +// ¾Æ¿ì½ºÅÍÁî ½ºÅ³ #include "AbsorbSoul.h" #include "AcidEruption.h" #include "BackStab.h" @@ -318,7 +318,7 @@ #include "WideIceField.h" #include "WideIceHail.h" -// ƿ콺 140 ų +// ¾Æ¿ì½ºÅÍÁî 140·¹º§ ½ºÅ³ #include "ARAttack.h" #include "Cannonade.h" #include "FuryOfGnome.h" @@ -330,7 +330,7 @@ #include "SummonMiga.h" #include "SummonMigaAttack.h" -// ų +// ½ÂÁ÷ ½ºÅ³ #include "Aberration.h" #include "BikeCrash.h" #include "Destinies.h" @@ -343,27 +343,27 @@ #include "ShadowOfStorm.h" #include "WildWolf.h" // add by coffee 2007-3-1 -#include "BloodCurse.h" //Ѫ֮{ -#include "BloodyScarify.h" //Ѫ֮ӡ -#include "BombCrashWalk.h" //ںը -#include "HeavenGround.h" // -#include "IllusionInversion.h" //ֲþ(ҽ) -#include "SatelliteBomb.h" //Ǻ (ǹ¼) -#include "ShineSword.h" //ҫ֮ ( )] -// ħ +#include "BloodCurse.h" //Ѫ֮Ô{Öä +#include "BloodyScarify.h" //Ѫ֮ÀÓÓ¡ +#include "BombCrashWalk.h" //¾ÞÅÚºäÕ¨ +#include "HeavenGround.h" //ÌìÉñ½µÁÙ +#include "IllusionInversion.h" //¿Ö²À»Ã¾õ(ÈËÀàÒ½Éú) +#include "SatelliteBomb.h" //ÎÀÐǺä»÷ (ÈËÀàǹм¼ÄÜ) +#include "ShineSword.h" //ÉÁÒ«Ö®½£ (ÈËÀà ½£¼¼ÄÜ)] +// ħÁé #include "BigRockfall.h" //395 ADD BY RALLSER #include "BrambleHalo.h" //390 ADD BY RALLSER #include "CutStorm.h" //387 ADD BY RALLSER -#include "DeadlyClaw.h" //391צ add by rallser -#include "DummyDrake.h" // ׿˿() +#include "DeadlyClaw.h" //391ÖÂÉËÁÑצ add by rallser +#include "DummyDrake.h" // µÂÀ׿˿þÀÜ(»ð·¨) #include "FireMeteor.h" //394 ADD BY RALLSER -#include "HeterChakram.h" // IJ(ս) -#include "HydroConvergence.h" // ˮ(ˮ) +#include "HeterChakram.h" // ÏIJ¼Àû»ùÒò(ÃôÕ½) +#include "HydroConvergence.h" // ¸´ºÏË®ÁÆ(Ë®·¨) #include "PenetrateWheel.h" //393 ADD BY RALLSER #include "RapidFreeze.h" //396 ADD BY RALLSER #include "SacredStamp.h" //389 ADD BY RALLSER -#include "SkyFire.h" //386 ׻ ADD BY RALLSER -#include "SummonClay.h" // ճٻ() +#include "SkyFire.h" //386 ÌìÀ׻𻨠ADD BY RALLSER +#include "SummonClay.h" // Õ³ÍÁÕÙ»½(ÍÁ·¨) #include "VoodooRing.h" //392 ADD BY RALLSER #include "XRLMissile.h" //388 ADD BY RALLSER // end @@ -372,7 +372,7 @@ // global variable declaration SkillHandlerManager* g_pSkillHandlerManager = NULL; -// ų +// ¸ó½ºÅÍ ·¹ÀÎÁö ½ºÅ³µé MonsterRangeSkill g_TraslaAttack(SKILL_TRASLA_ATTACK, false), g_PuscaAttack(SKILL_PUSCA_ATTACK, false), g_NodCopilaAttack(SKILL_NOD_COPILA_ATTACK, false), g_NodCopilaAttack2(SKILL_NOD_COPILA_ATTACK_2, false); @@ -383,10 +383,10 @@ SkillHandlerManager::SkillHandlerManager() throw() : m_SkillHandlers(NULL), m_Si Assert(m_Size > 0); - // ų ڵ鷯 迭 Ѵ. + // ½ºÅ³ Çڵ鷯 ¹è¿­À» »ý¼ºÇÑ´Ù. m_SkillHandlers = new SkillHandler*[m_Size]; - // ų ڵ鷯 迭 ʱȭѴ. + // ½ºÅ³ Çڵ鷯ÀÇ ¹è¿­À» ÃʱâÈ­ÇÑ´Ù. for (int i = 0; i < m_Size; i++) m_SkillHandlers[i] = NULL; @@ -400,12 +400,12 @@ SkillHandlerManager::~SkillHandlerManager() throw() { Assert(m_SkillHandlers != NULL); - // ų ڵ鷯 Ѵ. + // ½ºÅ³ Çڵ鷯¸¦ °¢°¢ »èÁ¦ÇÑ´Ù. for (int i = 0; i < m_Size; i++) { SAFE_DELETE(m_SkillHandlers[i]); } - // ųڵ鷯 迭 Ѵ. + // ½ºÅ³Çڵ鷯 ¹è¿­À» »èÁ¦ÇÑ´Ù. SAFE_DELETE_ARRAY(m_SkillHandlers); __END_CATCH @@ -418,11 +418,11 @@ void SkillHandlerManager::init() { __BEGIN_TRY - // ⺻ + // ±âº» °ø°Ý addSkillHandler(&g_AttackMelee); addSkillHandler(&g_AttackArms); - // 迭 + // °Ë °è¿­ addSkillHandler(&g_DoubleImpact); addSkillHandler(&g_TripleSlasher); addSkillHandler(&g_RainbowSlasher); @@ -445,7 +445,7 @@ void SkillHandlerManager::init() // addSkillHandler(&g_FiveStormCrash); // addSkillHandler(&g_HeavensSword); - // 迭 + // µµ°è¿­ addSkillHandler(&g_SingleBlow); addSkillHandler(&g_SpiralSlay); addSkillHandler(&g_TripleBreak); @@ -462,7 +462,7 @@ void SkillHandlerManager::init() addSkillHandler(&g_ShadowDancing); addSkillHandler(&g_Typhoon); - // 迭 + // ±ºÀÎ °è¿­ addSkillHandler(&g_QuickFire); addSkillHandler(&g_DoubleShot); addSkillHandler(&g_TripleShot); @@ -478,7 +478,7 @@ void SkillHandlerManager::init() addSkillHandler(&g_CreateMine); addSkillHandler(&g_ObservingEye); - // æ 迭 + // ÀÎæ °è¿­ addSkillHandler(&g_CreateHolyWater); addSkillHandler(&g_Light); addSkillHandler(&g_DetectHidden); @@ -499,7 +499,7 @@ void SkillHandlerManager::init() addSkillHandler(&g_Reflection); addSkillHandler(&g_Hymn); - // 迭 + // Èú¸µ °è¿­ addSkillHandler(&g_CureLightWounds); addSkillHandler(&g_CurePoison); addSkillHandler(&g_ProtectionFromPoison); @@ -522,7 +522,7 @@ void SkillHandlerManager::init() // addSkillHandler(&g_MassCure); // addSkillHandler(&g_MassHeal); - // 迭 + // ¹ìÇÁ °è¿­ addSkillHandler(&g_BloodDrain); addSkillHandler(&g_PoisonousHands); @@ -778,16 +778,16 @@ void SkillHandlerManager::init() addSkillHandler(&g_NodCopilaAttack); addSkillHandler(&g_NodCopilaAttack2); // add by coffee 2007-2-17 start - // Ѫ¼ + // ÎüѪ¹íм¼ÄÜ addSkillHandler(&g_BloodyScarify); addSkillHandler(&g_BloodCurse); - // ༼ + // ÈËÀ༼ÄÜ addSkillHandler(&g_ShineSword); addSkillHandler(&g_BombCrashWalk); addSkillHandler(&g_SatelliteBomb); addSkillHandler(&g_IllusionInversion); addSkillHandler(&g_HeavenGround); - // ħ¼ + // ħÁéм¼ÄÜ addSkillHandler(&g_DummyDrake); addSkillHandler(&g_HydroConvergence); addSkillHandler(&g_SummonClay); @@ -819,7 +819,7 @@ void SkillHandlerManager::addSkillHandler(SkillHandler* pSkillHandler) throw Error(msg.toString()); } - // ųڵ鷯 Ѵ. + // ½ºÅ³Çڵ鷯¸¦ µî·ÏÇÑ´Ù. m_SkillHandlers[pSkillHandler->getSkillType()] = pSkillHandler; __END_CATCH @@ -832,7 +832,7 @@ SkillHandler* SkillHandlerManager::getSkillHandler(SkillType_t SkillType) { __BEGIN_TRY - // Wide Storm , Wide ó ȿ óѴ. + // Wide Storm À» °¡Áö°í ÀÖÀ» °æ¿ì, Wide 󸮴 ¿ø·¡ ±â¼ú ¾È¿¡¼­ ó¸®ÇÑ´Ù. /* if ( SkillType == SKILL_DARKNESS_WIDE ) { SkillType = SKILL_DARKNESS; diff --git a/src/server/gameserver/skill/SkillHandlerManager.h b/src/server/gameserver/skill/SkillHandlerManager.h index 7e1663c9..8dddfb0f 100644 --- a/src/server/gameserver/skill/SkillHandlerManager.h +++ b/src/server/gameserver/skill/SkillHandlerManager.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // Filename : SkillHandlerManager.h // Wrrtten by : elca@ewestsoft.com -// Description : ų ڵ鷯 ϴ Manager̴. +// Description : 스킬 핸들러를 관리하는 Manager이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __SKILL_HANDLER_MANAGER_H__ @@ -20,21 +20,21 @@ class SkillHandlerManager { ~SkillHandlerManager() throw(); public: - // Ӽü init() ȣȴ. + // 게임서버객체의 init()에서 호출된다. void init(); - // ų ڵ鷯 ü ʱȭѴ. + // 스킬 핸들러 객체를 초기화한다. void addSkillHandler(SkillHandler* pSkillHandler); - // ų ڵ鷯 . + // 스킬 핸들러를 얻어낸다. SkillHandler* getSkillHandler(SkillType_t SkillType); // toString string toString() const throw(); private: - SkillHandler** m_SkillHandlers; // ų ڵ鷯 迭 - ushort m_Size; // ų ڵ鷯 迭 ũ + SkillHandler** m_SkillHandlers; // 스킬 핸들러 배열 + ushort m_Size; // 스킬 핸들러 배열의 크기 }; extern SkillHandlerManager* g_pSkillHandlerManager; diff --git a/src/server/gameserver/skill/SkillSlot.cpp b/src/server/gameserver/skill/SkillSlot.cpp index 5992f7e7..c76f8e66 100644 --- a/src/server/gameserver/skill/SkillSlot.cpp +++ b/src/server/gameserver/skill/SkillSlot.cpp @@ -154,19 +154,19 @@ Turn_t SkillSlot::getRemainTurn(Timeval currentTime) const throw() { } void SkillSlot::setRunTime() throw() { - // ð ޾ƿ´. + // 현재 시간을 받아온다. getCurrentTime(m_runTime); - // ִ ð Ѵ. + // 다음 쓸 수 있는 시간을 세팅한다. m_runTime.tv_sec += m_Interval / 10; m_runTime.tv_usec += (m_Interval % 10) * 100000; } void SkillSlot::setRunTime(Turn_t delay, bool bSave) throw() { - // ð ޾ƿ´. + // 현재 시간을 받아온다. getCurrentTime(m_runTime); - // ִ ð Ѵ. + // 다음 쓸 수 있는 시간을 세팅한다. m_runTime.tv_sec += delay / 10; m_runTime.tv_usec += (delay % 10) * 100000; @@ -188,7 +188,7 @@ void SkillSlot::setRunTime(Turn_t delay, bool bSave) throw() { case SKILL_HOWL: break; default: - save(m_Name); // ޸ ̸ ̺Ѵ. + save(m_Name); // 달리진 딜레이를 세이브한다. break; } } diff --git a/src/server/gameserver/skill/SkillSlot.h b/src/server/gameserver/skill/SkillSlot.h index bd79d316..998ef66c 100644 --- a/src/server/gameserver/skill/SkillSlot.h +++ b/src/server/gameserver/skill/SkillSlot.h @@ -76,8 +76,8 @@ class SkillSlot { m_Name = Name; } - // 밡 true - // Ұ false + // 사용가능할 경우 true + // 사용 불가능할 경우 false void setDisable() throw() { m_Enable = false; } @@ -88,18 +88,18 @@ class SkillSlot { return m_Enable; } - // ij Ҷ ð + // 다음 캐스팅이 가능할때까지 남은 시간 Turn_t getRemainTurn(Timeval currentTime) const throw(); protected: string m_Name; - SkillType_t m_SkillType; // , - Exp_t m_Exp; // õ - ExpLevel_t m_ExpLevel; // õ - Turn_t m_Interval; // , , 0.1 - Turn_t m_CastingTime; // ij Ÿ... 0.1 - Timeval m_runTime; // ִ ð - bool m_Enable; // Ѱ Ѱ + SkillType_t m_SkillType; // 마법, 기술의 종류 + Exp_t m_Exp; // 숙련도 + ExpLevel_t m_ExpLevel; // 숙련도 레벨 + Turn_t m_Interval; // 마법, 기술의 딜레이, 0.1 초 단위 + Turn_t m_CastingTime; // 캐스팅 타임... 0.1초 단위 + Timeval m_runTime; // 다음에 쓸 수 있는 시간 + bool m_Enable; // 사용 가능 한가 안한가 }; #endif // __SKILL_SLOT_H__ diff --git a/src/server/gameserver/skill/SkillUtil.cpp b/src/server/gameserver/skill/SkillUtil.cpp index 208263a3..823563f4 100644 --- a/src/server/gameserver/skill/SkillUtil.cpp +++ b/src/server/gameserver/skill/SkillUtil.cpp @@ -118,12 +118,12 @@ void checkFreeLevelLimit(PlayerCreature* pPC) { __BEGIN_TRY - // static const char MsgLevelLimitOver[] = " ִ ѿ ؼ"; + // static const char MsgLevelLimitOver[] = "¹«·á·Î »ç¿ëÇÒ ¼ö ÀÖ´Â ·¹º§ Á¦ÇÑ¿¡ µµ´ÞÇØ¼­"; // by sigi. 2002.11.19 - // ڰ ƴϰų - // Ⱓ (Ȥ ɷġ over) ¥. - // ֵ ý ʰ ϴ . by sigi. 2003.2.21 + // À¯·á »ç¿ëÀÚ°¡ ¾Æ´Ï°Å³ª + // ¹«·á »ç¿ë±â°£ÀÌ ³²¾ÆÀÖÁö ¾ÊÀ¸¸é(ȤÀº ´É·ÂÄ¡ over) Â¥¸¥´Ù. + // ¾Öµåºô ºô¸µ ½Ã½ºÅÛÀº »ç¿ëÇÏÁö ¾Ê°í »ç¿ëÀÚ Á¦ÇÑÀº ÇÏ´Â °æ¿ì. by sigi. 2003.2.21 #if defined(__PAY_SYSTEM_FREE_LIMIT__) if (!pPC->isPayPlayAvaiable()) { @@ -135,11 +135,11 @@ void checkFreeLevelLimit(PlayerCreature* pPC) /* EventKick* pEventKick = new EventKick(pGamePlayer); pEventKick->setDeadline(30*10); pGamePlayer->addEvent(pEventKick); - // Ŀ ©.. ش. + // ¸î ÃÊÈÄ¿¡ ©¸°´Ù..°í º¸³»ÁØ´Ù. //pEventKick->setMessage( MsgLevelLimitOver ); //pEventKick->sendMessage(); - // Ŀ ©.. ش. + // ¸î ÃÊÈÄ¿¡ ©¸°´Ù..°í º¸³»ÁØ´Ù. GCKickMessage gcKickMessage; gcKickMessage.setType( KICK_MESSAGE_EXPIRE_FREEPLAY ); gcKickMessage.setSeconds( 30 ); @@ -152,13 +152,13 @@ void checkFreeLevelLimit(PlayerCreature* pPC) } ////////////////////////////////////////////////////////////////////////////// -// ȭ ġ dz +// À¯·áÈ­Á¸ °æÇèÄ¡ »Ç³ª½º ////////////////////////////////////////////////////////////////////////////// // const uint g_pVariableManager->getPremiumExpBonusPercent() = 150; ////////////////////////////////////////////////////////////////////////////// -// ڿ ǰ Ķ͸ Ѵ. +// °ø°ÝÀÚ¿Í Çǰø°ÝÀÚ »çÀÌÀÇ ÆÄ¶ó¹ÌÅ͸¦ °è»êÇØ ÃÖÁ¾ µ¥¹ÌÁö¸¦ »êÃâÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// Damage_t computeDamage(Creature* pCreature, Creature* pTargetCreature) { Assert(pCreature != NULL); @@ -185,7 +185,7 @@ Damage_t computeDamage(Creature* pCreature, Creature* pTargetCreature) { Assert(pMonster != NULL); Damage = computeMonsterDamage(pMonster, pTargetCreature, bCriticalHit); } else { - // NPC ΰ... + // NPC¶ó´Â ¸»Àΰ¡... return 0; } } catch (Throwable& t) { @@ -196,7 +196,7 @@ Damage_t computeDamage(Creature* pCreature, Creature* pTargetCreature) { } ////////////////////////////////////////////////////////////////////////////// -// Ѵ. +// °ø°ÝÀÚÀÇ ¼ø¼ö µ¥¹ÌÁö¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// Damage_t computePureDamage(Creature* pCreature) { Damage_t Damage = 0; @@ -221,7 +221,7 @@ Damage_t computePureDamage(Creature* pCreature) { Assert(pMonster != NULL); Damage = computePureMonsterDamage(pMonster); } else { - // NPC ΰ... + // NPC¶ó´Â ¸»Àΰ¡... return 0; } @@ -229,9 +229,9 @@ Damage_t computePureDamage(Creature* pCreature) { } ////////////////////////////////////////////////////////////////////////////// -// ڿ ǰ Ķ͸ Ѵ. -// Լ , Լ θ 쿡 ũƼ -// Ʈ õ κ óȴ. +// °ø°ÝÀÚ¿Í Çǰø°ÝÀÚ »çÀÌÀÇ ÆÄ¶ó¹ÌÅ͸¦ °è»êÇØ ÃÖÁ¾ µ¥¹ÌÁö¸¦ »êÃâÇÑ´Ù. +// À§ÀÇ ÇÔ¼ö¿Í °°À¸³ª, ÀÌ ÇÔ¼ö¸¦ ºÎ¸¦ °æ¿ì¿¡´Â ³»ºÎÀûÀ¸·Î Å©¸®Æ¼Äà +// È÷Æ®¿Í °ü·ÃµÈ ºÎºÐÀÌ Ã³¸®µÈ´Ù. ////////////////////////////////////////////////////////////////////////////// Damage_t computeDamage(Creature* pCreature, Creature* pTargetCreature, int CriticalBonus, bool& bCritical) { Assert(pCreature != NULL); @@ -259,7 +259,7 @@ Damage_t computeDamage(Creature* pCreature, Creature* pTargetCreature, int Criti Assert(pMonster != NULL); Damage = computeMonsterDamage(pMonster, pTargetCreature, bCriticalHit); } else { - // NPC ΰ... + // NPC¶ó´Â ¸»Àΰ¡... return 0; } } catch (Throwable& t) { @@ -268,7 +268,7 @@ Damage_t computeDamage(Creature* pCreature, Creature* pTargetCreature, int Criti bCritical = bCriticalHit; - // ũƼ Ʈ̰, ´ Ͷ 150% ְ ȴ. + // Å©¸®Æ¼Äà È÷Æ®À̰í, ¸Â´Â ³ðÀÌ ¸ó½ºÅͶó¸é 150%ÀÇ µ¥¹ÌÁö¸¦ ÁÖ°Ô µÈ´Ù. if (bCritical && pTargetCreature->isMonster()) { Damage = getPercentValue(Damage, 150); } @@ -278,11 +278,11 @@ Damage_t computeDamage(Creature* pCreature, Creature* pTargetCreature, int Criti ////////////////////////////////////////////////////////////////////////////// -// ؼ Ѵ. +// ¿ø·¡ µ¥¹ÌÁö¿¡¼­ ÇÁ·ÎÅØ¼ÇÀ» Á¦¿ÜÇÑ ÃÖÁ¾ µ¥¹ÌÁö¸¦ ¸®ÅÏÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// double computeFinalDamage(Damage_t minDamage, Damage_t maxDamage, Damage_t realDamage, Protection_t Protection, bool bCritical) { - // ũƼ Ʈ ؼ ʰ, ״ . + // Å©¸®Æ¼Äà È÷Æ®¶ó¸é ÇÁ·ÎÅØ¼ÇÀ» °í·ÁÇÏÁö ¾Ê°í, µ¥¹ÌÁö ±×´ë·Î µé¾î°£´Ù. if (bCritical) return realDamage; @@ -329,7 +329,7 @@ double computeFinalDamage(Damage_t minDamage, Damage_t maxDamage, Damage_t realD ////////////////////////////////////////////////////////////////////////////// -// ̾ ڿ ǰ Ѵ. +// ½½·¹ÀÌ¾î °ø°ÝÀÚ¿Í Çǰø°ÝÀÚ »çÀÌÀÇ µ¥¹ÌÁö¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// Damage_t computeSlayerDamage(Slayer* pSlayer, Creature* pTargetCreature, bool bCritical) { Assert(pSlayer != NULL); @@ -339,22 +339,22 @@ Damage_t computeSlayerDamage(Slayer* pSlayer, Creature* pTargetCreature, bool bC uint timeband = getZoneTimeband(pSlayer->getZone()); double FinalDamage = 0; - // ϴ Ǽ ޾ƿ´. + // ÀÏ´Ü ¸Ç¼ÕÀÇ µ¥¹ÌÁö¸¦ ¹Þ¾Æ¿Â´Ù. Damage_t MinDamage = pSlayer->getDamage(ATTR_CURRENT); Damage_t MaxDamage = pSlayer->getDamage(ATTR_MAX); - // ⸦ ִٸ, min, max min, max ش. + // ¹«±â¸¦ µé°í ÀÖ´Ù¸é, min, max¿¡ ¹«±âÀÇ min, max¸¦ °è»êÇØ ÁØ´Ù. if (pItem != NULL && pSlayer->isRealWearingEx(Slayer::WEAR_RIGHTHAND)) { - // Ʈŷ ϴ κ Slayer::initAllStat() κ - // ű鼭 װ m_Damage[] , ⼭ - // ʿ䰡 . -- 2002.01.17 輺 + // ½ºÆ®¶óÀÌÅ· µ¥¹ÌÁö¸¦ °è»êÇÏ´Â ºÎºÐÀ» Slayer::initAllStat() ºÎºÐÀ¸·Î + // ¿Å±â¸é¼­ ±×°÷¿¡¼­ m_Damage[]¸¦ ¼¼ÆÃÇØ ¹ö¸®±â ¶§¹®¿¡, ¿©±â¼­ ´õÇÒ + // Çʿ䰡 ¾ø¾îÁ³´Ù. -- 2002.01.17 ±è¼º¹Î // MinDamage += (pItem->getMinDamage() + pItem->getBonusDamage()); // MaxDamage += (pItem->getMaxDamage() + pItem->getBonusDamage()); MinDamage += pItem->getMinDamage(); MaxDamage += pItem->getMaxDamage(); } - // Ѵ. + // ½ÇÁ¦ ·£´ý µ¥¹ÌÁö¸¦ °è»êÇÑ´Ù. Damage_t RealDamage = max(1, Random(MinDamage, MaxDamage)); if (pTargetCreature->isSlayer()) { @@ -394,11 +394,11 @@ Damage_t computeSlayerDamage(Slayer* pSlayer, Creature* pTargetCreature, bool bC FinalDamage = computeFinalDamage(MinDamage, MaxDamage, RealDamage, Protection, bCritical); } else { - // NPC ΰ... + // NPC¶ó´Â ¸»Àΰ¡... return 0; } - // AbilityBalance.cpp Ѵ. + // AbilityBalance.cpp¿¡¼­ ÇÑ´Ù. // FinalDamage += g_pVariableManager->getCombatSlayerDamageBonus(); return (Damage_t)FinalDamage; @@ -406,7 +406,7 @@ Damage_t computeSlayerDamage(Slayer* pSlayer, Creature* pTargetCreature, bool bC ////////////////////////////////////////////////////////////////////////////// -// ̾ ڿ ǰ Ѵ. +// ¹ìÆÄÀÌ¾î °ø°ÝÀÚ¿Í Çǰø°ÝÀÚ »çÀÌÀÇ µ¥¹ÌÁö¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// Damage_t computeVampireDamage(Vampire* pVampire, Creature* pTargetCreature, bool bCritical) { Assert(pVampire != NULL); @@ -417,16 +417,16 @@ Damage_t computeVampireDamage(Vampire* pVampire, Creature* pTargetCreature, bool Damage_t MaxDamage = pVampire->getDamage(ATTR_MAX); uint timeband = getZoneTimeband(pVampire->getZone()); - // vampire ⿡ + // vampire ¹«±â¿¡ ÀÇÇÑ µ¥¹ÌÁö Item* pItem = pVampire->getWearItem(Vampire::WEAR_RIGHTHAND); - // ⸦ ִٸ, min, max min, max ش. + // ¹«±â¸¦ µé°í ÀÖ´Ù¸é, min, max¿¡ ¹«±âÀÇ min, max¸¦ °è»êÇØ ÁØ´Ù. if (pItem != NULL && pVampire->isRealWearingEx(Vampire::WEAR_RIGHTHAND)) { MinDamage += pItem->getMinDamage(); MaxDamage += pItem->getMaxDamage(); } - // Ѵ. + // ½ÇÁ¦ ·£´ý µ¥¹ÌÁö¸¦ °è»êÇÑ´Ù. Damage_t RealDamage = max(1, Random(MinDamage, MaxDamage)); RealDamage = (Damage_t)getPercentValue(RealDamage, VampireTimebandFactor[timeband]); @@ -468,11 +468,11 @@ Damage_t computeVampireDamage(Vampire* pVampire, Creature* pTargetCreature, bool FinalDamage = computeFinalDamage(MinDamage, MaxDamage, RealDamage, Protection, bCritical); } else { - // NPC ΰ... + // NPC¶ó´Â ¸»Àΰ¡... return 0; } - // AbilityBalance.cpp Ѵ. + // AbilityBalance.cpp¿¡¼­ ÇÑ´Ù. // FinalDamage += g_pVariableManager->getCombatVampireDamageBonus(); return (Damage_t)FinalDamage; @@ -480,7 +480,7 @@ Damage_t computeVampireDamage(Vampire* pVampire, Creature* pTargetCreature, bool ////////////////////////////////////////////////////////////////////////////// -// ƿ콺ͽ ڿ ǰ Ѵ. +// ¾Æ¿ì½ºÅͽº °ø°ÝÀÚ¿Í Çǰø°ÝÀÚ »çÀÌÀÇ µ¥¹ÌÁö¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// Damage_t computeOustersDamage(Ousters* pOusters, Creature* pTargetCreature, bool bCritical) { Assert(pOusters != NULL); @@ -491,16 +491,16 @@ Damage_t computeOustersDamage(Ousters* pOusters, Creature* pTargetCreature, bool Damage_t MaxDamage = pOusters->getDamage(ATTR_MAX); uint timeband = getZoneTimeband(pOusters->getZone()); - // Ousters ⿡ + // Ousters ¹«±â¿¡ ÀÇÇÑ µ¥¹ÌÁö Item* pItem = pOusters->getWearItem(Ousters::WEAR_RIGHTHAND); - // ⸦ ִٸ, min, max min, max ش. + // ¹«±â¸¦ µé°í ÀÖ´Ù¸é, min, max¿¡ ¹«±âÀÇ min, max¸¦ °è»êÇØ ÁØ´Ù. if (pItem != NULL && pOusters->isRealWearingEx(Ousters::WEAR_RIGHTHAND)) { MinDamage += pItem->getMinDamage(); MaxDamage += pItem->getMaxDamage(); } - // Ѵ. + // ½ÇÁ¦ ·£´ý µ¥¹ÌÁö¸¦ °è»êÇÑ´Ù. Damage_t RealDamage = max(1, Random(MinDamage, MaxDamage)); if (pTargetCreature->isSlayer()) { @@ -540,11 +540,11 @@ Damage_t computeOustersDamage(Ousters* pOusters, Creature* pTargetCreature, bool FinalDamage = computeFinalDamage(MinDamage, MaxDamage, RealDamage, Protection, bCritical); } else { - // NPC ΰ... + // NPC¶ó´Â ¸»Àΰ¡... return 0; } - // AbilityBalance.cpp Ѵ. + // AbilityBalance.cpp¿¡¼­ ÇÑ´Ù. // FinalDamage += g_pVariableManager->getCombatOustersDamageBonus(); return (Damage_t)FinalDamage; @@ -552,7 +552,7 @@ Damage_t computeOustersDamage(Ousters* pOusters, Creature* pTargetCreature, bool ////////////////////////////////////////////////////////////////////////////// -// ڿ ǰ Ѵ. +// ¸ó½ºÅÍ °ø°ÝÀÚ¿Í Çǰø°ÝÀÚ »çÀÌÀÇ µ¥¹ÌÁö¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// Damage_t computeMonsterDamage(Monster* pMonster, Creature* pTargetCreature, bool bCritical) { Assert(pMonster != NULL); @@ -603,7 +603,7 @@ Damage_t computeMonsterDamage(Monster* pMonster, Creature* pTargetCreature, bool FinalDamage = computeFinalDamage(MinDamage, MaxDamage, RealDamage, Protection, bCritical); } else { - // NPC ΰ? + // NPC¶ó´Â ¸»Àΰ¡? return 0; } @@ -611,7 +611,7 @@ Damage_t computeMonsterDamage(Monster* pMonster, Creature* pTargetCreature, bool } ////////////////////////////////////////////////////////////////////////////// -// resistance Ѵ. +// resistance¸¦ °í·ÁÇÑ ¸¶¹ý µ¥¹ÌÁö¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// Damage_t computeMagicDamage(Creature* pTargetCreature, int Damage, SkillType_t SkillType, bool bVampire, Creature* pAttacker) { @@ -642,7 +642,7 @@ Damage_t computeMagicDamage(Creature* pTargetCreature, int Damage, SkillType_t S if (bVampire) Resist = (int)(Resist / 1.2); - // ׷¿ Ѵ. + // ÀúÇ׷¿¡ µû¶ó µ¥¹ÌÁö¸¦ °¡°¨ÇÑ´Ù. int penalty = (int)(MagicLevel / 5.0 - Resist); penalty = min(penalty, 100); penalty = max(penalty, -100); @@ -659,7 +659,7 @@ Damage_t computeMagicDamage(Creature* pTargetCreature, int Damage, SkillType_t S } ////////////////////////////////////////////////////////////////////////////// -// Ʋ ƿ콺 Ѵ. +// ¸®½ºÆ²¸´À» °í·ÁÇÑ ¾Æ¿ì½ºÅÍÁî ¸¶¹ý µ¥¹ÌÁö¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// Damage_t computeOustersMagicDamage(Ousters* pOusters, Creature* pTargetCreature, int Damage, SkillType_t SkillType) { Assert(pOusters != NULL); @@ -676,19 +676,19 @@ Damage_t computeOustersMagicDamage(Ousters* pOusters, Creature* pTargetCreature, } ////////////////////////////////////////////////////////////////////////////// -// Ÿٿ ġ Ѵ. +// Ÿ°Ù¿¡°Ô ¹ÌÄ¡´Â Àº µ¥¹ÌÁö¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// Damage_t computeSlayerSilverDamage(Creature* pCreature, int Damage, ModifyInfo* pMI) { Assert(pCreature != NULL); - // ̾ ƴ϶ . + // ½½·¹À̾ ¾Æ´Ï¶ó¸é Àº µ¥¹ÌÁö°¡ ³ª¿Ã ÀÌÀ¯°¡ ¾ø´Ù. if (pCreature->isSlayer() == false) return 0; Slayer* pSlayer = dynamic_cast(pCreature); Assert(pSlayer != NULL); - // Ⱑ ִ ˻ϰ, ٸ 0 Ѵ. + // ¹«±â°¡ ÀÖ´ÂÁö °Ë»çÇϰí, ¾ø´Ù¸é 0À» ¸®ÅÏÇÑ´Ù. Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL) return 0; @@ -696,7 +696,7 @@ Damage_t computeSlayerSilverDamage(Creature* pCreature, int Damage, ModifyInfo* Damage_t silverDamage = 0; if (isMeleeWeapon(pWeapon)) { - // 쿡, ⺻ 10% ش. + // ¼ºÁ÷ÀÚ ¹«±âÀÏ °æ¿ì¿¡´Â, ±âº»ÀûÀ¸·Î 10%ÀÇ Àº µ¥¹ÌÁö¸¦ ÁØ´Ù. if (isClericWeapon(pWeapon)) { silverDamage = max(1, (int)(Damage * 0.1)); silverDamage = min((int)silverDamage, (int)pWeapon->getSilver()); @@ -709,10 +709,10 @@ Damage_t computeSlayerSilverDamage(Creature* pCreature, int Damage, ModifyInfo* pMI->addShortData(MODIFY_SILVER_DURABILITY, pWeapon->getSilver()); } - // ⺻  10% + // ±âº»À¸·Î µé¾î°¡´Â 10%ÀÇ Àº µ¥¹ÌÁö silverDamage += max(1, (int)(Damage * 0.1)); } - // Ⱑ ƴ 쿡, ش. + // ¼ºÁ÷ÀÚ ¹«±â°¡ ¾Æ´Ò °æ¿ì¿¡´Â, Àº µµ±ÝÀ» ÇßÀ» ¶§¸¸ Àº µ¥¹ÌÁö¸¦ ÁØ´Ù. else { silverDamage = max(1, (int)(Damage * 0.1)); silverDamage = min((int)silverDamage, (int)pWeapon->getSilver()); @@ -726,9 +726,9 @@ Damage_t computeSlayerSilverDamage(Creature* pCreature, int Damage, ModifyInfo* } } } else if (isArmsWeapon(pWeapon) && pWeapon->getSilver() > 0) { - // 迭 , ź ̹Ƿ, - // ü ̸ ȴ. ̰ ܺο, - // Ѿ ̴ κп óϱ Ѵ. + // ÃÑ °è¿­ÀÇ ¹«±â¶ó¸é, Àº ź¾ËÀÌ ³ª°¡´Â °ÍÀ̹ǷÎ, + // ¹«±â ÀÚüÀÇ ÀºÀ» ÁÙÀÌ¸é ¾È µÈ´Ù. À̰ÍÀº ¿ÜºÎ¿¡¼­, + // Áï ÃѾËÀ» ÁÙÀÌ´Â ºÎºÐ¿¡¼­ ó¸®Çϱâ·Î ÇÑ´Ù. silverDamage = max(1, (int)(Damage * 0.1)); } @@ -801,17 +801,17 @@ RankExp_t computeRankExp(int myLevel, int otherLevel) // by sigi. 2002.12.31 } ////////////////////////////////////////////////////////////////////////////// -// Creature ׿ ȿ +// Creature¸¦ Á׿´À»¶§ÀÇ È¿°ú // -// KillCount ش. --> ġ +// Á×Àº »ç¶÷¿¡°Ô KillCount¸¦ Áõ°¡½ÃÄÑÁØ´Ù. --> °è±Þ °æÇèÄ¡ // by sigi. 2002.8.31 ////////////////////////////////////////////////////////////////////////////// void affectKillCount(Creature* pAttacker, Creature* pDeadCreature) { - // [ó ʿ ] - // ų - // ְ ų - // ƴϰų -_-; - // ְ ƴϸ -_-; + // [ó¸®ÇÒ ÇÊ¿ä ¾ø´Â °æ¿ì] + // °ø°ÝÇÑ »ç¶÷ÀÌ ¾ø°Å³ª + // Á×Àº¾Ö°¡ ¾ø°Å³ª + // °ø°ÝÇÑ »ç¶÷ÀÌ »ç¶÷ÀÌ ¾Æ´Ï°Å³ª -_-; + // Á×Àº¾Ö°¡ Á×Àº°Ô ¾Æ´Ï¸é -_-; if (pAttacker == NULL || pDeadCreature == NULL || !pAttacker->isPC() || pDeadCreature->isAlive()) { return; } @@ -840,36 +840,36 @@ void affectKillCount(Creature* pAttacker, Creature* pDeadCreature) { // int bonusPercent = 100; if (pAttacker->isSlayer()) { - // ̾ ̾ + // ½½·¹À̾ ½½·¹À̾ Á×ÀÎ °æ¿ì if (pDeadCreature->isSlayer()) return; Slayer* pSlayer = dynamic_cast(pAttacker); myLevel = pSlayer->getHighestSkillDomainLevel(); - // ̾ ⸦ ʴٸ Ѵ. + // ½½·¹À̾îÀÏ °æ¿ì ¹«±â¸¦ µé°í ÀÖÁö ¾Ê´Ù¸é ¹«½ÃÇÑ´Ù. if (!pSlayer->isRealWearingEx(Slayer::WEAR_RIGHTHAND)) return; - // ̾ ̾ + // ½½·¹À̾ ¹ìÆÄÀ̾ Á×ÀÎ °æ¿ì if (pDeadCreature->isVampire()) { Vampire* pVampire = dynamic_cast(pDeadCreature); otherLevel = pVampire->getLevel(); // bonusPercent = 150; } - // ̾ ƿ콺ͽ + // ½½·¹À̾ ¾Æ¿ì½ºÅͽº¸¦ Á×ÀÎ °æ¿ì else if (pDeadCreature->isOusters()) { Ousters* pOusters = dynamic_cast(pDeadCreature); otherLevel = pOusters->getLevel(); // bonusPercent = 150; } - // ̾ ͸ + // ½½·¹À̾ ¸ó½ºÅ͸¦ Á×ÀÎ °æ¿ì else if (pDeadCreature->isMonster()) { Monster* pMonster = dynamic_cast(pDeadCreature); - // ʹ MasterLairManager óѴ. + // ¸¶½ºÅÍ´Â MasterLairManager¿¡¼­ ó¸®ÇÑ´Ù. if (pMonster->isMaster()) { - // last kill ġ ѹ Դ´. + // last killÇÑ »ç¶÷Àº °æÇèÄ¡ Çѹø ´õ ¸Ô´Â´Ù. pSlayer->increaseRankExp(MASTER_KILL_RANK_EXP); return; } @@ -878,32 +878,32 @@ void affectKillCount(Creature* pAttacker, Creature* pDeadCreature) { } else return; } else if (pAttacker->isVampire()) { - // ̾ ̾ + // ¹ìÆÄÀ̾ ¹ìÆÄÀ̾ Á×ÀÎ °æ¿ì if (pDeadCreature->isVampire()) return; Vampire* pVampire = dynamic_cast(pAttacker); myLevel = pVampire->getLevel(); - // ̾ ̾ + // ¹ìÆÄÀ̾ ½½·¹À̾ Á×ÀÎ °æ¿ì if (pDeadCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pDeadCreature); otherLevel = pSlayer->getHighestSkillDomainLevel(); // bonusPercent = 150; } - // ̾ ƿ콺ͽ + // ¹ìÆÄÀ̾ ¾Æ¿ì½ºÅͽº¸¦ Á×ÀÎ °æ¿ì else if (pDeadCreature->isOusters()) { Ousters* pOusters = dynamic_cast(pDeadCreature); otherLevel = pOusters->getLevel(); // bonusPercent = 150; } - // ̾ ͸ + // ¹ìÆÄÀ̾ ¸ó½ºÅ͸¦ Á×ÀÎ °æ¿ì else if (pDeadCreature->isMonster()) { Monster* pMonster = dynamic_cast(pDeadCreature); - // ʹ MasterLairManager óѴ. + // ¸¶½ºÅÍ´Â MasterLairManager¿¡¼­ ó¸®ÇÑ´Ù. if (pMonster->isMaster()) { - // last kill ġ ѹ Դ´. + // last killÇÑ »ç¶÷Àº °æÇèÄ¡ Çѹø ´õ ¸Ô´Â´Ù. pVampire->increaseRankExp(MASTER_KILL_RANK_EXP); return; } @@ -912,32 +912,32 @@ void affectKillCount(Creature* pAttacker, Creature* pDeadCreature) { } else return; } else if (pAttacker->isOusters()) { - // ƿ콺ͽ ƿ콺ͽ + // ¾Æ¿ì½ºÅͽº°¡ ¾Æ¿ì½ºÅͽº¸¦ Á×ÀÎ °æ¿ì if (pDeadCreature->isOusters()) return; Ousters* pOusters = dynamic_cast(pAttacker); myLevel = pOusters->getLevel(); - // ƿ콺ͽ ̾ + // ¾Æ¿ì½ºÅͽº°¡°¡ ½½·¹À̾ Á×ÀÎ °æ¿ì if (pDeadCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pDeadCreature); otherLevel = pSlayer->getHighestSkillDomainLevel(); // bonusPercent = 150; } - // ƿ콺 ̾ + // ¾Æ¿ì½ºÅÍÁî°¡ ¹ìÆÄÀ̾ Á×ÀÎ °æ¿ì if (pDeadCreature->isVampire()) { Vampire* pVampire = dynamic_cast(pDeadCreature); otherLevel = pVampire->getLevel(); // bonusPercent = 150; } - // ̾ ͸ + // ¹ìÆÄÀ̾ ¸ó½ºÅ͸¦ Á×ÀÎ °æ¿ì else if (pDeadCreature->isMonster()) { Monster* pMonster = dynamic_cast(pDeadCreature); - // ʹ MasterLairManager óѴ. + // ¸¶½ºÅÍ´Â MasterLairManager¿¡¼­ ó¸®ÇÑ´Ù. if (pMonster->isMaster()) { - // last kill ġ ѹ Դ´. + // last killÇÑ »ç¶÷Àº °æÇèÄ¡ Çѹø ´õ ¸Ô´Â´Ù. pOusters->increaseRankExp(MASTER_KILL_RANK_EXP); return; } @@ -1167,7 +1167,7 @@ void affectKillCount(Creature* pAttacker, Creature* pDeadCreature) { if (iClass == Item::ITEM_CLASS_PET_FOOD && isHigher) ++itemType; - // cout << "̺Ʈ:" << iClass << ", " << itemType << endl; + // cout << "ÆêÀ½½ÄÀ̺¥Æ®:" << iClass << ", " << itemType << endl; Item* pItem = g_pItemFactoryManager->createItem(iClass, itemType, list()); pMonster->setQuestItem(pItem); @@ -1177,8 +1177,8 @@ void affectKillCount(Creature* pAttacker, Creature* pDeadCreature) { int PartyID = pPC->getPartyID(); if (PartyID != 0) { - // Ƽ ԵǾ ִٸ Ƽ Ŵ - // Ƽ ġ Ѵ. + // ÆÄƼ¿¡ °¡ÀԵǾî ÀÖ´Ù¸é ·ÎÄà ÆÄƼ ¸Å´ÏÀú¸¦ ÅëÇØ + // ÁÖÀ§ÀÇ ÆÄƼ¿øµé°ú °æÇèÄ¡¸¦ °øÀ¯ÇÑ´Ù. LocalPartyManager* pLPM = pPC->getLocalPartyManager(); Assert(pLPM != NULL); pLPM->shareRankExp(PartyID, pAttacker, otherLevel); @@ -1190,7 +1190,7 @@ void affectKillCount(Creature* pAttacker, Creature* pDeadCreature) { pAttackPC->increaseAdvancementClassExp(computeCreatureExp(pDeadCreature, 1), true); } - // Ƽ ԵǾ ʴٸ ȥ ö󰣴. + // ÆÄƼ¿¡ °¡ÀԵǾîÀÖÁö ¾Ê´Ù¸é È¥ÀÚ ¿Ã¶ó°£´Ù. RankExp_t rankExp = computeRankExp(myLevel, otherLevel); if (pDeadCreature->isMonster()) { @@ -1209,7 +1209,7 @@ void affectKillCount(Creature* pAttacker, Creature* pDeadCreature) { HP_t setCounterDamage(Creature* pAttacker, Creature* pTarget, Damage_t counterDamage, bool& bBroadcastAttackerHP, bool& bSendAttackerHP) { HP_t Result2 = 0; - // üũ + // ¾ÈÀüÁö´ë üũ // 2003.1.10 by bezz, Sequoia if (pAttacker != NULL && checkZoneLevelToHitTarget(pAttacker)) { if (pAttacker->isSlayer()) { @@ -1227,11 +1227,11 @@ HP_t setCounterDamage(Creature* pAttacker, Creature* pTarget, Damage_t counterDa bBroadcastAttackerHP = true; bSendAttackerHP = true; - // Mephisto Ʈ ɷ HP 30% ϶ Ǯ. + // Mephisto ÀÌÆåÆ® °É·ÁÀÖÀ¸¸é HP 30% ÀÌÇÏÀ϶§ Ç®¸°´Ù. if (pVampireAttacker->isFlag(Effect::EFFECT_CLASS_MEPHISTO)) { HP_t maxHP = pVampireAttacker->getHP(ATTR_MAX); - // 33% ... .. + // 33% ... ÄÉÄÉ.. if (Result2 * 3 < maxHP) { Effect* pEffect = pVampireAttacker->findEffect(Effect::EFFECT_CLASS_MEPHISTO); if (pEffect != NULL) { @@ -1256,7 +1256,7 @@ HP_t setCounterDamage(Creature* pAttacker, Creature* pTarget, Damage_t counterDa pMonsterAttacker->setHP(Result2, ATTR_CURRENT); pMonsterAttacker->setDamaged(true); - // Ͱ 쿡 ǵ ݹ ̾ 켱 ־. + // ¸ó½ºÅͰ¡ ¿ª µ¥¹ÌÁö¸¦ ¹ÞÀ» °æ¿ì¿¡µµ »þÇÁ½Çµå ¾²°í °ø°Ý¹ÞÀº ½½·¹À̾°Ô ¿ì¼±±ÇÀÌ ÁÖ¾îÁø´Ù. pMonsterAttacker->addPrecedence(pTarget->getName(), pTarget->getPartyID(), counterDamage); pMonsterAttacker->setLastHitCreatureClass(pTarget->getCreatureClass()); @@ -1264,15 +1264,15 @@ HP_t setCounterDamage(Creature* pAttacker, Creature* pTarget, Damage_t counterDa if (pMonsterAttacker->getHP(ATTR_CURRENT) * 3 < pMonsterAttacker->getHP(ATTR_MAX)) { PrecedenceTable* pTable = pMonsterAttacker->getPrecedenceTable(); - // HP 3 1 ¶ ϸ, - // ϸ ǹ̰ ϰ ǹǷ, - // ѹ ϰ , ױ ٽ ʵ - // ÷׸ ش. ÷׸ ̿Ͽ ʿ δ. + // HP°¡ 3ºÐÀÇ 1 ÀÌÇÏÀÎ »óŶó°í ¹«Á¶°Ç °è»êÀ» Çϸé, + // ¸ÅÅϸ¶´Ù Àǹ̰¡ ¾ø´Â °è»êÀ» °è¼Ó ÇÏ°Ô µÇ¹Ç·Î, + // Çѹø °è»êÀ» ÇÏ°í ³ª¸é, Á×±â Àü±îÁö´Â ´Ù½Ã °è»êÇÏÁö ¾Êµµ·Ï + // Ç÷¡±×¸¦ ¼¼ÆÃÇØ ÁØ´Ù. ÀÌ Ç÷¡±×¸¦ ÀÌ¿ëÇÏ¿© ÇÊ¿ä¾ø´Â °è»êÀ» ÁÙÀδÙ. if (pTable->getComputeFlag() == false) { - // ش. + // °è»êÀ» ÇØÁØ´Ù. pTable->compute(); - // ȣƮ ̸ Ƽ ID ̿Ͽ, Ʈ ɾش. + // È£½ºÆ®ÀÇ À̸§°ú ÆÄƼ ID¸¦ ÀÌ¿ëÇÏ¿©, ÀÌÆåÆ®¸¦ °É¾îÁØ´Ù. EffectPrecedence* pEffectPrecedence = new EffectPrecedence(pMonsterAttacker); pEffectPrecedence->setDeadline(100); pEffectPrecedence->setHostName(pTable->getHostName()); @@ -1423,13 +1423,13 @@ void giveSkillExp(Slayer* pSlayer, SkillType_t SkillType, ModifyInfo& AttackerMI SkillSlot* pSkillSlot = pSlayer->getSkill(SkillType); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); if (pSkillSlot != NULL && pSkillInfo != NULL) { - // cout << pSlayer->getName() << " " << pSkillInfo->getName() << "ų ġ ݴϴ." << endl; + // cout << pSlayer->getName() << "¿¡°Ô " << pSkillInfo->getName() << "½ºÅ³ÀÇ °æÇèÄ¡¸¦ ÁÝ´Ï´Ù." << endl; increaseSkillExp(pSlayer, pSkillInfo->getDomainType(), pSkillSlot, pSkillInfo, AttackerMI); } } ////////////////////////////////////////////////////////////////////////////// -// Ѵ. +// Á÷Á¢ÀûÀ¸·Î µ¥¹ÌÁö¸¦ ¼¼ÆÃÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, SkillType_t SkillType, ModifyInfo* pMI, ModifyInfo* pAttackerMI, bool canKillTarget, bool canSteal) { @@ -1438,8 +1438,8 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE) || pTargetCreature->isFlag(Effect::EFFECT_CLASS_TENDRIL) || pTargetCreature->isDead()) { // if (pTargetCreature->isVampire()) - // return HP Ѱ ̰ - // return ϴ κ  ϴ Ѵ. + // return°ªÀ¸·Î ÇöÀç HP¸¦ ³Ñ°ÜÁà¾ß Á¤»óÀ̰ÚÁö¸¸ + // return°ªÀ» »ç¿ëÇÏ´Â ºÎºÐÀÌ ¾ø¾î¼­ ÀÏ´Ü ¹«½ÃÇÑ´Ù. // by sigi. 2002.9.5 return 0; } @@ -1449,7 +1449,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, Zone* pZone = pTargetCreature->getZone(); Assert(pZone != NULL); - // 巹  + // Áúµå·¹ ·¹¾î¿¡¼­ if (pZone->getZoneID() == 1412 || pZone->getZoneID() == 1413) { if (pTargetCreature->isPC() && pAttacker != NULL && pAttacker->isPC()) return 0; @@ -1468,12 +1468,12 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, Damage_t OriginalDamage = Damage; - bool bBroadcastTargetHP = false; // ǰ HP εijϳ? - bool bSendTargetHP = false; // ǰ HP ֳ? - bool bSendTargetMP = false; // ǰ MP ֳ? - bool bBroadcastAttackerHP = false; // HP εijϳ? - bool bSendAttackerHP = false; // HP ֳ? - bool bSendAttackerMP = false; // MP ֳ? + bool bBroadcastTargetHP = false; // Çǰø°ÝÀÚÀÇ HP¸¦ ºê·Îµåij½ºÆÃÇϳª? + bool bSendTargetHP = false; // Çǰø°ÝÀÚÀÇ HP¸¦ º¸³»ÁÖ³ª? + bool bSendTargetMP = false; // Çǰø°ÝÀÚÀÇ MP¸¦ º¸³»ÁÖ³ª? + bool bBroadcastAttackerHP = false; // °ø°ÝÀÚÀÇ HP¸¦ ºê·Îµåij½ºÆÃÇϳª? + bool bSendAttackerHP = false; // °ø°ÝÀÚÀÇ HP¸¦ º¸³»ÁÖ³ª? + bool bSendAttackerMP = false; // °ø°ÝÀÚÀÇ MP¸¦ º¸³»ÁÖ³ª? GCStatusCurrentHP gcTargetHP; GCStatusCurrentHP gcAttackerHP; @@ -1506,8 +1506,8 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, } } - // ƸԵ Ʈ ɷ (?) HP ְ Ÿ ݹ ʴ´. - // SKILL_ARMAGEDDON ƸԵ Ʈ ü ̹Ƿ ׳ Ÿ ϴ Ѿ. + // ¾Æ¸¶°Ôµ· ÀÌÆåÆ®°¡ °É·ÁÀÖÀ» °æ¿ì ¼öÁ¤±¸½½(?)ÀÇ HP¸¦ ±ð¾ÆÁÖ°í Ÿ°ÙÀº °ø°Ý¹ÞÁö ¾Ê´Â´Ù. + // SKILL_ARMAGEDDONÀÏ °æ¿ì ¾Æ¸¶°Ôµ· ÀÌÆåÆ® ÀÚüÀÇ µ¥¹ÌÁöÀ̹ǷΠ±×³É Ÿ°ÙÀ» °ø°ÝÇÏ´Â ÂÊÀ¸·Î ³Ñ¾î°£´Ù. /* if( pTargetCreature != NULL && pTargetCreature->isFlag( Effect::EFFECT_CLASS_ARMAGEDDON ) && SkillType != SKILL_ARMAGEDDON ) @@ -1547,7 +1547,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, return 0; } - // Ʈŷ ɷ Ƣ + // ½ºÆ®¶óÀÌÅ·ÀÌ °É·ÁÀÖÀ¸¸é ¸¶¹ý µ¥¹ÌÁö »½Æ¢±â if (pAttacker != NULL && pSkillProperty->isMagic() && pAttacker->isFlag(Effect::EFFECT_CLASS_STRIKING)) { EffectStriking* pEffect = dynamic_cast(pAttacker->findEffect(Effect::EFFECT_CLASS_STRIKING)); if (pEffect != NULL) { @@ -1563,15 +1563,15 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, } } - // Denial Magic ɷ üũؼ ². + // Denial Magic ÀÌ °É·ÁÀÖÀ» °æ¿ì ¸¶¹ýµ¥¹ÌÁöÀÎÁö Ã¼Å©ÇØ¼­ ¹è²´Ù. if (pTargetCreature != NULL && pTargetCreature->isFlag(Effect::EFFECT_CLASS_DENIAL_MAGIC) && pSkillProperty->isMagic()) { - // ⺻ų SkillInfo . + // ±âº»½ºÅ³Àº SkillInfo °¡ ¾ø´Ù. if (SkillType >= SKILL_DOUBLE_IMPACT) { - // ̾ ش. + // ¹ìÆÄÀ̾îÀÇ ¸¶¹ýµ¥¹ÌÁö¸¸ ¸·¾ÆÁØ´Ù. if (pSkillInfo->getDomainType() == SKILL_DOMAIN_VAMPIRE || pSkillInfo->getDomainType() == SKILL_DOMAIN_OUSTERS) { - // Ʈ ش. + // ¼º°øÀûÀ¸·Î ¸·¾ÒÀ» °æ¿ì ÀÌÆåÆ®¸¦ ¸ÚÁö°Ô ³¯·ÁÁØ´Ù. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pTargetCreature->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_DENIAL_MAGIC_DAMAGED); @@ -1581,16 +1581,16 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, &gcAddEffect); // return 0; - // ° 60%...... . + // ¹è°Áö ¸»°í µ¥¹ÌÁö 60%...... ¤Ì.¤Ð Damage = max(1, (int)(Damage * 0.4)); } } } - // Water Barrier ɷ ѽ ݿ ؼ ٿش. + // Water Barrier °¡ °É·ÁÀÖÀ» °æ¿ì Ãѽ½ °ø°Ý¿¡ ´ëÇØ¼­¸¸ µ¥¹ÌÁö¸¦ ÁÙ¿©ÁØ´Ù. if (pTargetCreature != NULL && pTargetCreature->isFlag(Effect::EFFECT_CLASS_WATER_BARRIER) && !pSkillProperty->isMelee()) { - // ⺻ų SkillInfo . + // ±âº»½ºÅ³Àº SkillInfo °¡ ¾ø´Ù. if (canBlockByWaterBarrier(SkillType)) { EffectWaterBarrier* pEWB = dynamic_cast(pTargetCreature->findEffect(Effect::EFFECT_CLASS_WATER_BARRIER)); @@ -1605,7 +1605,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, } } - // Water Shield ɸ ִ ݿ ؼ ʴ´ + // Water Shield °¡ °É¸± ¼ö ÀÖ´Â °æ¿ì ¹°¸® °ø°Ý¿¡ ´ëÇØ¼­´Â µ¥¹ÌÁö¸¦ ÁÖÁö ¾Ê´Â´Ù if (pTargetCreature != NULL && pSkillProperty->isPhysic()) { if (pTargetCreature->isOusters()) { Ousters* pOusters = dynamic_cast(pTargetCreature); @@ -1618,7 +1618,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, gcAddEffect.setDuration(0); pZone->broadcastPacket(pOusters->getX(), pOusters->getY(), &gcAddEffect); - // cout << "ͽǵ ߵ߽ϴ." << endl; + // cout << "¿öÅÍ½Çµå ¹ßµ¿Çß½À´Ï´Ù." << endl; return 0; } } @@ -1657,7 +1657,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, switch (pSkillInfo->getElementalDomain()) { case ELEMENTAL_DOMAIN_FIRE: Damage += pOusters->getFireDamage(); - // cout << "FireDamage : " << pOusters->getFireDamage() <<"," <getFireDamage() <<"," <isFlag(Effect::EFFECT_CLASS_HANDS_OF_FIRE)) { EffectHandsOfFire* pEffect = @@ -1688,10 +1688,10 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, } //////////////////////////////////////////////////////////////////// - // Target Creature Ʈ óѴ. + // Target Creature ¿¡ ÀÌÆåÆ®¸¦ ó¸®ÇÑ´Ù. //////////////////////////////////////////////////////////////////// if (pTargetCreature != NULL) { - // SLEEP Ʈ ɷ ִٸ Ʈ Ѵ. + // SLEEP ÀÌÆåÆ®°¡ °É·Á ÀÖ´Ù¸é ÀÌÆåÆ®¸¦ »èÁ¦ÇÑ´Ù. if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_SLEEP) && SkillType != SKILL_REBUKE) { EffectSleep* pEffect = dynamic_cast(pTargetCreature->findEffect(Effect::EFFECT_CLASS_SLEEP)); Assert(pEffect != NULL); @@ -1707,9 +1707,9 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, gcAttackerHP.setObjectID(AOID); - // ȭ ϰ ȴٸ.. -_-; - // Creatureٰ Penalty member ִ° ̴. - // Hymnɷִٸ damage penalty% ޴´. + // ¾ðÁ¨°¡ ÃÖÀûÈ­¸¦ ÇÏ°Ô µÈ´Ù¸é.. -_-; + // Creature¿¡´Ù°¡ Penalty°ü·Ã memberµéÀ» ³Ö´Â°Ô ³ªÀ» °ÍÀÌ´Ù. + // Hymn°É·ÁÀÖ´Ù¸é damage penalty% ¹Þ´Â´Ù. if (pAttacker->isFlag(Effect::EFFECT_CLASS_HYMN)) { EffectHymn* pHymn = dynamic_cast(pAttacker->getEffectManager()->findEffect(Effect::EFFECT_CLASS_HYMN)); @@ -1721,7 +1721,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, Slayer* pAttackSlayer = dynamic_cast(pAttacker); Assert(pAttackSlayer != NULL); - // ų ġ ֱ --;; + // ¼¿ÇÁ½ºÅ³µé °æÇèÄ¡ ÁÖ±â --;; if (canGiveSkillExp(pAttackSlayer, SKILL_DOMAIN_SWORD, SkillType)) { if (pAttackSlayer->isFlag(Effect::EFFECT_CLASS_DANCING_SWORD) && (rand() % 2) != 0) giveSkillExp(pAttackSlayer, SKILL_DANCING_SWORD, *pAttackerMI); @@ -1810,7 +1810,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, }*/ } - // Blood Bible ʽ Ѵ. + // Blood Bible º¸³Ê½º¸¦ Àû¿ëÇÑ´Ù. if (pAttacker->isPC()) { PlayerCreature* pPC = dynamic_cast(pAttacker); Damage_t MagicBonusDamage = pPC->getMagicBonusDamage(); @@ -1818,37 +1818,37 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, // if ( MagicBonusDamage != 0 && pSkillProperty!= NULL && pSkillProperty->isMagic() ) if (MagicBonusDamage != 0 && bMagicDamage) { - // cout << " ʽ : " << Damage << " + " << MagicBonusDamage << endl; + // cout << "µ¥¹ÌÁö º¸³Ê½º Àû¿ë : " << Damage << " + " << MagicBonusDamage << endl; Damage += MagicBonusDamage; } // if ( PhysicBonusDamage != 0 && pSkillProperty!= NULL && pSkillProperty->isPhysic() ) if (PhysicBonusDamage != 0 && bPhysicDamage) { - // cout << " ʽ : " << Damage << " + " << PhysicBonusDamage << endl; + // cout << "µ¥¹ÌÁö º¸³Ê½º Àû¿ë : " << Damage << " + " << PhysicBonusDamage << endl; Damage += PhysicBonusDamage; } } } //////////////////////////////////////////////////////////// - // hp, mp steal óѴ. + // ¸ÕÀú hp, mp stealÀ» ó¸®ÇÑ´Ù. //////////////////////////////////////////////////////////// if (pAttacker != NULL && canSteal) //(SkillType != SKILL_PROMINENCE && SkillType != SKILL_HELLFIRE) { Steal_t HPStealAmount = pAttacker->getHPStealAmount(); Steal_t MPStealAmount = pAttacker->getMPStealAmount(); - // HP ƿ üũѴ. + // HP ½ºÆ¿À» üũÇÑ´Ù. if (HPStealAmount != 0 && (rand() % 100) < pAttacker->getHPStealRatio()) { if (pAttacker->isSlayer()) { if (pAttacker->isAlive()) { Slayer* pSlayer = dynamic_cast(pAttacker); - // HP ƿ ϰ, - // ƽ ʴ üũ Ѵ. + // ÇöÀçÀÇ HP¿¡´Ù ½ºÆ¿ÇÑ ¾çÀ» ´õÇϰí, + // ¸Æ½º¸¦ ³ÑÁö´Â ¾Ê´ÂÁö üũ¸¦ ÇÑ´Ù. hp = pSlayer->getHP(ATTR_CURRENT) + (int)HPStealAmount; hp = min(hp, pSlayer->getHP(ATTR_MAX)); - // HP ϰ, ÷׸ Ҵ. + // HP¸¦ ¼¼ÆÃÇϰí, Ç÷¡±×¸¦ ÄÒ´Ù. pSlayer->setHP(hp, ATTR_CURRENT); bBroadcastAttackerHP = true; bSendAttackerHP = true; @@ -1856,27 +1856,27 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, } else if (pAttacker->isVampire()) { Vampire* pVampire = dynamic_cast(pAttacker); - // HP ƿ ϰ, - // ƽ ʴ üũ Ѵ. + // ÇöÀçÀÇ HP¿¡´Ù ½ºÆ¿ÇÑ ¾çÀ» ´õÇϰí, + // ¸Æ½º¸¦ ³ÑÁö´Â ¾Ê´ÂÁö üũ¸¦ ÇÑ´Ù. hp = pVampire->getHP(ATTR_CURRENT) + (int)HPStealAmount; hp = min(hp, pVampire->getHP(ATTR_MAX)); - // HP ϰ, ÷׸ Ҵ. + // HP¸¦ ¼¼ÆÃÇϰí, Ç÷¡±×¸¦ ÄÒ´Ù. pVampire->setHP(hp, ATTR_CURRENT); bBroadcastAttackerHP = true; bSendAttackerHP = true; } else if (pAttacker->isOusters()) { - // HP÷ + // Á×Àº³Ñ HP¿Ã·ÁÁÖÁö¸»ÀÚ if (pAttacker->isAlive()) { Ousters* pOusters = dynamic_cast(pAttacker); - // HP ƿ ϰ, - // ƽ ʴ üũ Ѵ. + // ÇöÀçÀÇ HP¿¡´Ù ½ºÆ¿ÇÑ ¾çÀ» ´õÇϰí, + // ¸Æ½º¸¦ ³ÑÁö´Â ¾Ê´ÂÁö üũ¸¦ ÇÑ´Ù. // cout << "HP Steal!" << (int)HPStealAmount << endl; hp = pOusters->getHP(ATTR_CURRENT) + (int)HPStealAmount; hp = min(hp, pOusters->getHP(ATTR_MAX)); - // HP ϰ, ÷׸ Ҵ. + // HP¸¦ ¼¼ÆÃÇϰí, Ç÷¡±×¸¦ ÄÒ´Ù. pOusters->setHP(hp, ATTR_CURRENT); bBroadcastAttackerHP = true; bSendAttackerHP = true; @@ -1885,14 +1885,14 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, Assert(false); } - // MP ƿ üũѴ. + // MP ½ºÆ¿À» üũÇÑ´Ù. if (MPStealAmount != 0 && (rand() % 100) < pAttacker->getMPStealRatio()) { - // ̾ ƿ콺ͽ MP ƿ óѴ. + // ½½·¹À̾î¿Í ¾Æ¿ì½ºÅͽºÀÏ °æ¿ì MP ½ºÆ¿À» ó¸®ÇÑ´Ù. if (pAttacker->isSlayer()) { Slayer* pSlayer = dynamic_cast(pAttacker); - // MP ƿ ϰ, - // ƽ ʴ üũ Ѵ. + // ÇöÀçÀÇ MP¿¡´Ù ½ºÆ¿ÇÑ ¾çÀ» ´õÇϰí, + // ¸Æ½º¸¦ ³ÑÁö´Â ¾Ê´ÂÁö üũ¸¦ ÇÑ´Ù. mp = pSlayer->getMP(ATTR_CURRENT) + (int)MPStealAmount; mp = min(mp, pSlayer->getMP(ATTR_MAX)); @@ -1903,8 +1903,8 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, Ousters* pOusters = dynamic_cast(pAttacker); if (pOusters->getMP(ATTR_CURRENT) < pOusters->getMP(ATTR_MAX)) { - // MP ƿ ϰ, - // ƽ ʴ üũ Ѵ. + // ÇöÀçÀÇ MP¿¡´Ù ½ºÆ¿ÇÑ ¾çÀ» ´õÇϰí, + // ¸Æ½º¸¦ ³ÑÁö´Â ¾Ê´ÂÁö üũ¸¦ ÇÑ´Ù. mp = pOusters->getMP(ATTR_CURRENT) + (int)MPStealAmount; mp = min(mp, pOusters->getMP(ATTR_MAX)); @@ -1956,10 +1956,10 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, } //////////////////////////////////////////////////////////// - // ´ ̾ + // ¸Â´Â ³ðÀÌ ½½·¹À̾îÀÏ °æ¿ì //////////////////////////////////////////////////////////// if (pTargetCreature->isSlayer()) { - // ƿ콺 ̾ + // ¾Æ¿ì½ºÅÍÁî°¡ ¹ìÆÄÀ̾ Á×ÀÎ °æ¿ì Slayer* pSlayer = dynamic_cast(pTargetCreature); bool bSetDamage = false; @@ -1972,11 +1972,11 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, Result2 = setCounterDamage(pAttacker, pSlayer, counterDamage, bBroadcastAttackerHP, bSendAttackerHP); } - // AuraShield ȿ HP MP ҸǴ 찡 ִ. - //  ߴ ׶ ( Ƣ ұ) ǵ ϰ HP Ѵ. + // AuraShield È¿°ú·Î HP´ë½Å MP°¡ ¼Ò¸ðµÇ´Â °æ¿ì°¡ ÀÖ´Ù. + // ¸¶½ºÅÍ ·¹¾î¿¡¼­ ¶ß´Â ±×¶ó¿îµå ¾îÅÃ(¶¥¿¡¼­ Æ¢¾î³ª¿À´Â ºÒ±âµÕ) ¸ÂÀ¸¸é ¿À¶ó½Çµå ¹«½ÃÇϰí HP ´â°Ô ÇÑ´Ù. // 2003. 1.16. Sequoia if (pSlayer->isFlag(Effect::EFFECT_CLASS_AURA_SHIELD) && SkillType != SKILL_GROUND_ATTACK) { - // ڿ Ѵ. + // °ø°ÝÀÚ¿¡°Ô µ¥¹ÌÁö¸¦ µ¹·ÁÁà¾ß ÇÑ´Ù. if (pAttacker != NULL) { Damage_t counterDamage = 0; @@ -1984,7 +1984,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, (EffectAuraShield*)(pSlayer->findEffect(Effect::EFFECT_CLASS_AURA_SHIELD)); Assert(pEffectAuraShield != NULL); - // ī 10 1̴. + // Ä«¿îÅÍ µ¥¹ÌÁö´Â ¿ø·¡ µ¥¹ÌÁöÀÇ 10ºÐÀÇ 1ÀÌ´Ù. counterDamage = max(1, getPercentValue(Damage, 10)); if (pAttacker->isVampire()) { @@ -2020,8 +2020,8 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, pSlayer->setMP(Result, ATTR_CURRENT); bSendTargetMP = true; - // Result 0 , Ҵ ̴. - // ׷Ƿ effect ش. + // Result°¡ 0ÀÎ °æ¿ì, ¸¶³ª°¡ ´Ù ´â¾Ò´Ü ¸»ÀÌ´Ù. + // ±×·¯¹Ç·Î effect¸¦ »èÁ¦ÇØ ÁØ´Ù. if (Result == 0) { Effect* pEffect = pSlayer->findEffect(Effect::EFFECT_CLASS_AURA_SHIELD); if (pEffect != NULL) @@ -2034,7 +2034,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, removeEffect.addEffectList(Effect::EFFECT_CLASS_AURA_SHIELD); pZone->broadcastPacket(TX, TY, &removeEffect);*/ - // ٽ ֵ ̸ ش. + // ±â¼úÀ» ´Ù½Ã ¾µ ¼ö ÀÖµµ·Ï ±â¼ú µô·¹À̸¦ ³¯·ÁÁØ´Ù. SkillSlot* pSkillSlot = pSlayer->hasSkill(SKILL_AURA_SHIELD); if (pSkillSlot != NULL) { pSkillSlot->setRunTime(0, false); @@ -2044,11 +2044,11 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, } // by Sequoia 2002.12.26 - // Melee پ ѿ ش. - // switch isMeleeSkill ϴ ڵ ٲ۴. 2003. 1. 1. + // Melee ¾îÅÃÀÇ °æ¿ì µ¥¹ÌÁö°¡ ÁÙ¾îµé°í ¶§¸° ³Ñ¿¡°Ô µ¥¹ÌÁö¸¦ ÁØ´Ù. + // switch ·Î µÈ °É isMeleeSkill À» »ç¿ëÇÏ´Â ÄÚµå·Î ¹Ù²Û´Ù. 2003. 1. 1. if (pSlayer->isFlag(Effect::EFFECT_CLASS_SHARP_SHIELD_1) && pSkillProperty != NULL && pSkillProperty->isMelee() && pAttacker != NULL) { - // Sharp Shield и ̴. + // Sharp Shield °¡ ÀÖÀ¸¸é ¹Ð¸® ¾îÅÃÀÇ µ¥¹ÌÁö´Â ¹ÝÀÌ´Ù. Damage = max(0, (int)Damage - ((int)OriginalDamage >> 1)); EffectSharpShield* pEffect = @@ -2068,7 +2068,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, // if ( rand()%2 ) increaseSkillExp(pSlayer, SKILL_DOMAIN_SWORD, pSkillSlot, pSkillInfo, //*pAttackerMI); - /* // üũ + /* // ¾ÈÀüÁö´ë üũ // 2003.1.10 by bezz, Sequoia if ( checkZoneLevelToHitTarget(pAttacker) ) { @@ -2090,12 +2090,12 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, bBroadcastAttackerHP = true; bSendAttackerHP = true; - // Mephisto Ʈ ɷ HP 30% ϶ Ǯ. + // Mephisto ÀÌÆåÆ® °É·ÁÀÖÀ¸¸é HP 30% ÀÌÇÏÀ϶§ Ç®¸°´Ù. if (pVampireAttacker->isFlag(Effect::EFFECT_CLASS_MEPHISTO)) { HP_t maxHP = pVampireAttacker->getHP(ATTR_MAX); - // 33% ... .. + // 33% ... ÄÉÄÉ.. if (Result2*3 < maxHP) { pVampireAttacker->getEffectManager()->deleteEffect( @@ -2110,8 +2110,8 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, pMonsterAttacker->setHP(Result2, ATTR_CURRENT); pMonsterAttacker->setDamaged(true); - // Ͱ 쿡 ǵ ݹ ̾ 켱 - ־. pMonsterAttacker->addPrecedence(pSlayer->getName(), pSlayer->getPartyID(), counterDamage); + // ¸ó½ºÅͰ¡ ¿ª µ¥¹ÌÁö¸¦ ¹ÞÀ» °æ¿ì¿¡µµ »þÇÁ½Çµå ¾²°í °ø°Ý¹ÞÀº ½½·¹À̾°Ô ¿ì¼±±ÇÀÌ + ÁÖ¾îÁø´Ù. pMonsterAttacker->addPrecedence(pSlayer->getName(), pSlayer->getPartyID(), counterDamage); pMonsterAttacker->setLastHitCreatureClass(pSlayer->getCreatureClass()); bBroadcastAttackerHP = true; @@ -2119,16 +2119,16 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, { PrecedenceTable* pTable = pMonsterAttacker->getPrecedenceTable(); - // HP 3 1 ¶ ϸ, - // ϸ ǹ̰ ϰ ǹǷ, - // ѹ ϰ , ױ ٽ ʵ - // ÷׸ ش. ÷׸ ̿Ͽ ʿ δ. + // HP°¡ 3ºÐÀÇ 1 ÀÌÇÏÀÎ »óŶó°í ¹«Á¶°Ç °è»êÀ» Çϸé, + // ¸ÅÅϸ¶´Ù Àǹ̰¡ ¾ø´Â °è»êÀ» °è¼Ó ÇÏ°Ô µÇ¹Ç·Î, + // Çѹø °è»êÀ» ÇÏ°í ³ª¸é, Á×±â Àü±îÁö´Â ´Ù½Ã °è»êÇÏÁö ¾Êµµ·Ï + // Ç÷¡±×¸¦ ¼¼ÆÃÇØ ÁØ´Ù. ÀÌ Ç÷¡±×¸¦ ÀÌ¿ëÇÏ¿© ÇÊ¿ä¾ø´Â °è»êÀ» ÁÙÀδÙ. if (pTable->getComputeFlag() == false) { - // ش. + // °è»êÀ» ÇØÁØ´Ù. pTable->compute(); - // ȣƮ ̸ Ƽ ID ̿Ͽ, Ʈ ɾش. + // È£½ºÆ®ÀÇ À̸§°ú ÆÄƼ ID¸¦ ÀÌ¿ëÇÏ¿©, ÀÌÆåÆ®¸¦ °É¾îÁØ´Ù. EffectPrecedence* pEffectPrecedence = new EffectPrecedence(pMonsterAttacker); pEffectPrecedence->setDeadline(100); pEffectPrecedence->setHostName(pTable->getHostName()); @@ -2164,7 +2164,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, Tile& rTile = pZone->getTile(TX, TY); if (rTile.getEffect(Effect::EFFECT_CLASS_MAGIC_ELUSION) != NULL - // Magic Elusion ɷ , ̾ ݿ 50% ٿش. + // Magic Elusion ÀÌ °É·ÁÀÖÀ» ¶§, ¹ìÆÄÀ̾ »ç¿ëÇÑ ¸¶¹ý ·¹ÀÎÁö °ø°Ý¿¡ ´ëÇØ µ¥¹ÌÁö¸¦ 50% ÁÙ¿©ÁØ´Ù. && (!pSkillProperty->isMelee() && pSkillProperty->isMagic()) && pAttacker != NULL && pAttacker->isVampire()) { Damage /= 2; @@ -2185,7 +2185,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, } // cout << "after " << Damage << endl; - // AuraShield , ׳ ¾ƾ Ѵ. + // AuraShield°¡ ¾øÀ¸´Ï, ±×³É ¸öÀ¸·Î ¸Â¾Æ¾ß ÇÑ´Ù. if (canKillTarget) Result = max(0, (int)pSlayer->getHP(ATTR_CURRENT) - (int)Damage); else @@ -2198,7 +2198,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, } } //////////////////////////////////////////////////////////// - // ´ ̾ + // ¸Â´Â ³ðÀÌ ¹ìÆÄÀ̾îÀÏ °æ¿ì //////////////////////////////////////////////////////////// else if (pTargetCreature->isVampire()) { Vampire* pVampire = dynamic_cast(pTargetCreature); @@ -2207,18 +2207,18 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, Tile& rTile = pZone->getTile(TX, TY); if (rTile.getEffect(Effect::EFFECT_CLASS_GRAY_DARKNESS) != NULL && canBlockByGrayDarkness(SkillType)) { - // ׷ ũϽ ȿ 30% + // ±×·¹ÀÌ ´ÙÅ©´Ï½º ¾È¿¡¼­ µ¥¹ÌÁö 30%°¨¼Ò Damage = (Damage_t)(Damage * 0.7); } if (pAttacker != NULL && pAttacker->isSlayer()) { - // ڰ ̾ ߰ ִ. + // °ø°ÝÀÚ°¡ ½½·¹À̾î¶ó¸é µ¥¹ÌÁö¿¡ Àº µ¥¹ÌÁö°¡ Ãß°¡µÉ ¼ö°¡ ÀÖ´Ù. silverDamage = computeSlayerSilverDamage(pAttacker, Damage, pAttackerMI); } - // ߰ ̴. + // Àº µ¥¹ÌÁö´Â Ãß°¡ µ¥¹ÌÁöÀÌ´Ù. Damage += silverDamage; - // add by Coffee 2007-3-4 ҫ֮ ˺ + // add by Coffee 2007-3-4 ½£¼¼ÄÜ ÉÁÒ«Ö®½£ ¹àÒøÉ˺¦ if (SkillType == SKILL_SHINE_SWORD && silverDamage != 0) { silverDamage = Damage; } @@ -2247,11 +2247,11 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, pVampire->setHP(Result, ATTR_CURRENT); - // Mephisto Ʈ ɷ HP 30% ϶ Ǯ. + // Mephisto ÀÌÆåÆ® °É·ÁÀÖÀ¸¸é HP 30% ÀÌÇÏÀ϶§ Ç®¸°´Ù. if (pVampire->isFlag(Effect::EFFECT_CLASS_MEPHISTO)) { HP_t maxHP = pVampire->getHP(ATTR_MAX); - // 33% ... .. + // 33% ... ÄÉÄÉ.. if (currentHP * 3 < maxHP) { Effect* pEffect = pVampire->findEffect(Effect::EFFECT_CLASS_MEPHISTO); if (pEffect != NULL) { @@ -2275,7 +2275,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, } } //////////////////////////////////////////////////////////// - // ´ ƿ콺ͽ + // ¸Â´Â ³ðÀÌ ¾Æ¿ì½ºÅͽºÀÏ °æ¿ì //////////////////////////////////////////////////////////// else if (pTargetCreature->isOusters()) { Ousters* pOusters = dynamic_cast(pTargetCreature); @@ -2291,7 +2291,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, } } - // Divine Shield Ϻ MP ȴ. + // Divine Shield ·Î ÀÎÇØ ¸¶¹ý µ¥¹ÌÁö°¡ ÀϺΠMP·Î Èí¼öµÈ´Ù. if (pOusters->isFlag(Effect::EFFECT_CLASS_DIVINE_SPIRITS) && pSkillProperty->isMagic()) { EffectDivineSpirits* pEffect = dynamic_cast(pOusters->findEffect(Effect::EFFECT_CLASS_DIVINE_SPIRITS)); @@ -2315,7 +2315,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, if (pFrozenArmor != NULL) { Damage -= getPercentValue(Damage, pFrozenArmor->getBonus()); if (pAttacker != NULL) { - // Ʈ Ŭ δ. + // ÀÌÆÑÆ® Ŭ·¡½º¸¦ ¸¸µé¾î ºÙÀδÙ. EffectIceFieldToCreature* pEffect = new EffectIceFieldToCreature(pAttacker, true); pEffect->setDeadline(pFrozenArmor->getTargetDuration()); pAttacker->addEffect(pEffect); @@ -2332,15 +2332,15 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, } if (pAttacker != NULL && pAttacker->isSlayer()) { - // ڰ ̾ ߰ ִ. - // ƿ콺ͽ 1.5 ޴´. + // °ø°ÝÀÚ°¡ ½½·¹À̾î¶ó¸é µ¥¹ÌÁö¿¡ Àº µ¥¹ÌÁö°¡ Ãß°¡µÉ ¼ö°¡ ÀÖ´Ù. + // ¾Æ¿ì½ºÅͽº´Â Àº µ¥¹ÌÁö¸¦ 1.5¹è ¹Þ´Â´Ù. silverDamage = (Silver_t)(computeSlayerSilverDamage(pAttacker, Damage, pAttackerMI) * 1.5); silverDamage = max(0, getPercentValue(silverDamage, 100 - pOusters->getSilverResist())); } - // ߰ ̴. + // Àº µ¥¹ÌÁö´Â Ãß°¡ µ¥¹ÌÁöÀÌ´Ù. Damage += silverDamage; - // add by Coffee 2007-3-4 ҫ֮ ˺ + // add by Coffee 2007-3-4 ½£¼¼ÄÜ ÉÁÒ«Ö®½£ ¹àÒøÉ˺¦ if (SkillType == SKILL_SHINE_SWORD && silverDamage != 0) { silverDamage = Damage; } @@ -2377,18 +2377,18 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, } } //////////////////////////////////////////////////////////// - // ´ + // ¸Â´Â ³ðÀÌ ¸ó½ºÅÍÀÏ °æ¿ì //////////////////////////////////////////////////////////// else if (pTargetCreature->isMonster()) { Monster* pMonster = dynamic_cast(pTargetCreature); Silver_t silverDamage = 0; if (pAttacker != NULL && pAttacker->isSlayer()) { - // ڰ ̾ ߰ ִ. + // °ø°ÝÀÚ°¡ ½½·¹À̾î¶ó¸é µ¥¹ÌÁö¿¡ Àº µ¥¹ÌÁö°¡ Ãß°¡µÉ ¼ö°¡ ÀÖ´Ù. silverDamage = computeSlayerSilverDamage(pAttacker, Damage, pAttackerMI); } - // ߰ ̴. + // Àº µ¥¹ÌÁö´Â Ãß°¡ µ¥¹ÌÁöÀÌ´Ù. Damage += silverDamage; if (canKillTarget) @@ -2439,14 +2439,14 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, pMonster->setDamaged(true); if (pAttacker != NULL && pAttacker->isPC()) { - // ´ ̰, ڰ ̶, - // ϴ 켱 ̺ ־ Ѵ. + // ¸Â´Â ³ðÀÌ ¸ó½ºÅÍÀ̰í, °ø°ÝÀÚ°¡ »ç¶÷À̶ó¸é, + // µ¥¹ÌÁö¿¡ µû¶ó¼­ º¯ÇÏ´Â ¿ì¼±±Ç Å×À̺íÀ» °»½ÅÇØ ÁÖ¾î¾ß ÇÑ´Ù. pMonster->addPrecedence(pAttacker->getName(), pAttacker->getPartyID(), Damage); pMonster->setLastHitCreatureClass(pAttacker->getCreatureClass()); } /* - // Ͱ ׾ٸ 켱 Ѵ. + // ¸ó½ºÅͰ¡ ¸¸¾à Á×¾ú´Ù¸é ¿ì¼±±Ç °è»êÀ» ÇØÁà¾ß ÇÑ´Ù. if (pMonster->isDead()) { PrecedenceTable* pTable = pMonster->getPrecedenceTable(); @@ -2457,20 +2457,20 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, pMonster->setHostPartyID(pTable->getHostPartyID()); } */ - // Ͱ ʾ, ¶, - // 켱 ʾҴٸ ش. + // ¸ó½ºÅͰ¡ ¾ÆÁ÷ Á×Áö´Â ¾Ê¾ÒÁö¸¸, ÈíÇ÷ÀÌ °¡´ÉÇÑ »óŶó¸é, + // ¸¸¾à ¿ì¼±±Ç °è»êÀ» ÇÏÁö ¾Ê¾Ò´Ù¸é °è»êÀ» ÇØÁØ´Ù. if (pMonster->getHP(ATTR_CURRENT) * 3 < pMonster->getHP(ATTR_MAX)) { PrecedenceTable* pTable = pMonster->getPrecedenceTable(); - // HP 3 1 ¶ ϸ, - // ϸ ǹ̰ ϰ ǹǷ, - // ѹ ϰ , ױ ٽ ʵ - // ÷׸ ش. ÷׸ ̿Ͽ ʿ δ. + // HP°¡ 3ºÐÀÇ 1 ÀÌÇÏÀÎ »óŶó°í ¹«Á¶°Ç °è»êÀ» Çϸé, + // ¸ÅÅϸ¶´Ù Àǹ̰¡ ¾ø´Â °è»êÀ» °è¼Ó ÇÏ°Ô µÇ¹Ç·Î, + // Çѹø °è»êÀ» ÇÏ°í ³ª¸é, Á×±â Àü±îÁö´Â ´Ù½Ã °è»êÇÏÁö ¾Êµµ·Ï + // Ç÷¡±×¸¦ ¼¼ÆÃÇØ ÁØ´Ù. ÀÌ Ç÷¡±×¸¦ ÀÌ¿ëÇÏ¿© ÇÊ¿ä¾ø´Â °è»êÀ» ÁÙÀδÙ. if (pTable->getComputeFlag() == false) { - // ش. + // °è»êÀ» ÇØÁØ´Ù. pTable->compute(); - // ȣƮ ̸ Ƽ ID ̿Ͽ, Ʈ ɾش. + // È£½ºÆ®ÀÇ À̸§°ú ÆÄƼ ID¸¦ ÀÌ¿ëÇÏ¿©, ÀÌÆåÆ®¸¦ °É¾îÁØ´Ù. EffectPrecedence* pEffectPrecedence = new EffectPrecedence(pMonster); pEffectPrecedence->setDeadline(100); pEffectPrecedence->setHostName(pTable->getHostName()); @@ -2483,7 +2483,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, if (pMonster->getMonsterType() == 722 && pAttacker != NULL && !pAttacker->isFlag(Effect::EFFECT_CLASS_BLINDNESS)) { if ((rand() % 100) < 30) { - // 巹 + // Áúµå·¹ ¼®»óÀÌÁö·Õ EffectBlindness* pEffect = new EffectBlindness(pAttacker); pEffect->setDamage(50); pEffect->setNextTime(0); @@ -2504,9 +2504,9 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, // if ( pAttacker != NULL ) pAttacker->setLastTarget( pTargetCreature->getObjectID() ); //////////////////////////////////////////////////////////// - // ÷׿ ش. + // º¯°æµÈ »çÇ×À» Ç÷¡±×¿¡ µû¶ó¼­ º¸³»ÁØ´Ù. //////////////////////////////////////////////////////////// - if (bBroadcastTargetHP && pTargetCreature != NULL) // ´ hp پ, ε ijش. + if (bBroadcastTargetHP && pTargetCreature != NULL) // ¸Â´Â ³ðÀÇ hp°¡ ÁÙ¾úÀ¸´Ï, ºê·Îµå ij½ºÆÃÇØÁØ´Ù. { if (pTargetCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pTargetCreature); @@ -2526,7 +2526,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, pZone->broadcastPacket(TX, TY, &gcTargetHP, pTargetCreature); } - if (bSendTargetHP && pTargetCreature != NULL) // ´ ڿ HP پٰ ˷ش. + if (bSendTargetHP && pTargetCreature != NULL) // ¸Â´Â ´ç»çÀÚ¿¡°Ô HP°¡ ÁÙ¾ú´Ù°í ¾Ë·ÁÁØ´Ù. { if (pTargetCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pTargetCreature); @@ -2546,7 +2546,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, Assert(false); } - if (bSendTargetMP && pTargetCreature != NULL) // ´ ڿ MP پٰ ˷ش. + if (bSendTargetMP && pTargetCreature != NULL) // ¸Â´Â ´ç»çÀÚ¿¡°Ô MP°¡ ÁÙ¾ú´Ù°í ¾Ë·ÁÁØ´Ù. { if (pTargetCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pTargetCreature); @@ -2572,7 +2572,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, Assert(false); } - if (bBroadcastAttackerHP && pAttacker != NULL) // HP پ, εijش. + if (bBroadcastAttackerHP && pAttacker != NULL) // ¶§¸®´Â ³ðÀÇ HP°¡ ÁÙ¾úÀ¸´Ï, ºê·Îµåij½ºÆÃÇØÁØ´Ù. { if (pAttacker->isSlayer()) { Slayer* pSlayer = dynamic_cast(pAttacker); @@ -2592,7 +2592,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, pZone->broadcastPacket(AX, AY, &gcAttackerHP, pAttacker); } - if (bSendAttackerHP && pAttacker != NULL) // 𿡰 HP پٰ ˷ش. + if (bSendAttackerHP && pAttacker != NULL) // ¶§¸®´Â ³ð¿¡°Ô HP°¡ ÁÙ¾ú´Ù°í ¾Ë·ÁÁØ´Ù. { if (pAttacker->isSlayer()) { Slayer* pSlayer = dynamic_cast(pAttacker); @@ -2612,7 +2612,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, Assert(false); } - if (bSendAttackerMP && pAttacker != NULL) // 𿡰 MP پٰ ˷ش. + if (bSendAttackerMP && pAttacker != NULL) // ¶§¸®´Â ³ð¿¡°Ô MP°¡ ÁÙ¾ú´Ù°í ¾Ë·ÁÁØ´Ù. { if (pAttacker->isSlayer()) { Slayer* pSlayer = dynamic_cast(pAttacker); @@ -2626,7 +2626,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, Assert(false); } - // KillCount . by sigi. 2002.8.31 + // Á×ÀÎ °æ¿ìÀÇ KillCount Áõ°¡. by sigi. 2002.8.31 if (pTargetCreature->isDead()) { affectKillCount(pAttacker, pTargetCreature); } @@ -2635,7 +2635,7 @@ HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, } ////////////////////////////////////////////////////////////////////////////// -// ߸. +// ¾ÆÀÌÅÛ ³»±¸µµ¸¦ ¶³¾î¶ß¸°´Ù. ////////////////////////////////////////////////////////////////////////////// void decreaseDurability(Creature* pCreature, Creature* pTargetCreature, SkillInfo* pSkillInfo, ModifyInfo* pMI1, ModifyInfo* pMI2) { @@ -2645,7 +2645,7 @@ void decreaseDurability(Creature* pCreature, Creature* pTargetCreature, SkillInf // WORD Point = (pSkillInfo)?pSkillInfo->getPoint():1; // #endif - // ߸ 0̶ ؾ... + // ¶³¾î¶ß¸± ³»±¸µµ°¡ 0À̶ó¸é °Á ¸®ÅÏÇØ¾ßÁã... if (Point == 0) return; @@ -2658,8 +2658,8 @@ void decreaseDurability(Creature* pCreature, Creature* pTargetCreature, SkillInf ulong value = 0; //////////////////////////////////////////////////////////////// - // ϴ Ʈ. - // ִ ڴ ̾ ƴѰ... + // °ø°ÝÇÏ´Â ÀÚÀÇ ¹«±â ³»±¸µµ ¶³¾îÆ®¸². + // ¹«±â µé°í ÀÖ´Â ÀÚ´Â ¹«Á¶°Ç ½½·¹ÀÌ¾î ¾Æ´Ñ°¡... //////////////////////////////////////////////////////////////// if (pCreature != NULL) { if (pCreature->isSlayer()) { @@ -2668,7 +2668,7 @@ void decreaseDurability(Creature* pCreature, Creature* pTargetCreature, SkillInf slot = Slayer::WEAR_RIGHTHAND; pWeapon = pSlayer->getWearItem((Slayer::WearPart)slot); - // ⸦ ִٸ ߸. + // ¹«±â¸¦ µé°í ÀÖ´Ù¸é ¶³¾î¶ß¸°´Ù. if (pWeapon != NULL && canDecreaseDurability(pWeapon)) // && !pWeapon->isUnique()) { @@ -2676,7 +2676,7 @@ void decreaseDurability(Creature* pCreature, Creature* pTargetCreature, SkillInf durDiff = Point; Result = max(0, CurDur - durDiff); - if (Result == 0) // Ⱑ 0̶ ıѴ. + if (Result == 0) // ¹«±â°¡ ³»±¸µµ°¡ 0À̶ó¸é ÆÄ±«ÇÑ´Ù. { GCRemoveFromGear gcRemoveFromGear; gcRemoveFromGear.setSlotID(slot); @@ -2685,14 +2685,14 @@ void decreaseDurability(Creature* pCreature, Creature* pTargetCreature, SkillInf Player* pPlayer = pSlayer->getPlayer(); pPlayer->sendPacket(&gcRemoveFromGear); - // α + // ·Î±× log(LOG_DESTROY_ITEM, pCreature->getName(), "", pWeapon->toString()); - // Ѵ. + // ¶³¾îÁø ³»±¸¼ºÀ» ÀúÀåÇÑ´Ù. pWeapon->setDurability(Result); pWeapon->save(pCreature->getName(), STORAGE_GEAR, 0, slot, 0); - // DB Ѵ. + // DB¿¡¼­ »èÁ¦ÇÑ´Ù. pWeapon->destroy(); SAFE_DELETE(pWeapon); } else { @@ -2706,7 +2706,7 @@ void decreaseDurability(Creature* pCreature, Creature* pTargetCreature, SkillInf value = (DWORD)(slot) << 24 | (DWORD)(Result); pMI1->addLongData(MODIFY_DURABILITY, value); - // Ѵ. + // ¶³¾îÁø ³»±¸¼ºÀ» ÀúÀåÇÑ´Ù. // pWeapon->save(pCreature->getName(), STORAGE_GEAR, 0, slot, 0); } } // if (pWeapon != NULL) @@ -2717,13 +2717,13 @@ void decreaseDurability(Creature* pCreature, Creature* pTargetCreature, SkillInf slot = Vampire::WEAR_RIGHTHAND; pWeapon = pVampire->getWearItem((Vampire::WearPart)slot); - // ⸦ ִٸ ߸. + // ¹«±â¸¦ µé°í ÀÖ´Ù¸é ¶³¾î¶ß¸°´Ù. if (pWeapon != NULL && canDecreaseDurability(pWeapon)) { CurDur = pWeapon->getDurability(); durDiff = Point; Result = max(0, CurDur - durDiff); - if (Result == 0) // Ⱑ 0̶ ıѴ. + if (Result == 0) // ¹«±â°¡ ³»±¸µµ°¡ 0À̶ó¸é ÆÄ±«ÇÑ´Ù. { GCRemoveFromGear gcRemoveFromGear; gcRemoveFromGear.setSlotID(slot); @@ -2732,14 +2732,14 @@ void decreaseDurability(Creature* pCreature, Creature* pTargetCreature, SkillInf Player* pPlayer = pVampire->getPlayer(); pPlayer->sendPacket(&gcRemoveFromGear); - // α + // ·Î±× log(LOG_DESTROY_ITEM, pCreature->getName(), "", pWeapon->toString()); - // Ѵ. + // ¶³¾îÁø ³»±¸¼ºÀ» ÀúÀåÇÑ´Ù. pWeapon->setDurability(Result); pWeapon->save(pCreature->getName(), STORAGE_GEAR, 0, slot, 0); - // DB Ѵ. + // DB¿¡¼­ »èÁ¦ÇÑ´Ù. pWeapon->destroy(); SAFE_DELETE(pWeapon); } else { @@ -2761,13 +2761,13 @@ void decreaseDurability(Creature* pCreature, Creature* pTargetCreature, SkillInf slot = Ousters::WEAR_RIGHTHAND; pWeapon = pOusters->getWearItem((Ousters::WearPart)slot); - // ⸦ ִٸ ߸. + // ¹«±â¸¦ µé°í ÀÖ´Ù¸é ¶³¾î¶ß¸°´Ù. if (pWeapon != NULL && canDecreaseDurability(pWeapon)) { CurDur = pWeapon->getDurability(); durDiff = Point; Result = max(0, CurDur - durDiff); - if (Result == 0) // Ⱑ 0̶ ıѴ. + if (Result == 0) // ¹«±â°¡ ³»±¸µµ°¡ 0À̶ó¸é ÆÄ±«ÇÑ´Ù. { GCRemoveFromGear gcRemoveFromGear; gcRemoveFromGear.setSlotID(slot); @@ -2776,14 +2776,14 @@ void decreaseDurability(Creature* pCreature, Creature* pTargetCreature, SkillInf Player* pPlayer = pOusters->getPlayer(); pPlayer->sendPacket(&gcRemoveFromGear); - // α + // ·Î±× log(LOG_DESTROY_ITEM, pCreature->getName(), "", pWeapon->toString()); - // Ѵ. + // ¶³¾îÁø ³»±¸¼ºÀ» ÀúÀåÇÑ´Ù. pWeapon->setDurability(Result); pWeapon->save(pCreature->getName(), STORAGE_GEAR, 0, slot, 0); - // DB Ѵ. + // DB¿¡¼­ »èÁ¦ÇÑ´Ù. pWeapon->destroy(); SAFE_DELETE(pWeapon); } else { @@ -2802,10 +2802,10 @@ void decreaseDurability(Creature* pCreature, Creature* pTargetCreature, SkillInf } // if (pCreature != NULL) //////////////////////////////////////////////////////////////// - // ݴϴ  Durability Ʈ ϰ + // °ø°Ý´çÇÏ´Â ÀÚÀÇ ¹æ¾î±¸ DurabilityÀ» ¶³¾îÆ®¸² ·£´ýÇÏ°Ô //////////////////////////////////////////////////////////////// if (pTargetCreature != NULL) { - // ִ ߸ Ѵ. + // ¾î´À ½½¶ù¿¡ ÀÖ´Â ±â¾îÀÇ ³»±¸µµ¸¦ ¶³¾î¶ß¸±Áö °áÁ¤ÇÑ´Ù. if (pTargetCreature->isSlayer()) { slot = Random(0, Slayer::WEAR_MAX - 1); pGear = dynamic_cast(pTargetCreature)->getWearItem((Slayer::WearPart)slot); @@ -2817,14 +2817,14 @@ void decreaseDurability(Creature* pCreature, Creature* pTargetCreature, SkillInf pGear = dynamic_cast(pTargetCreature)->getWearItem((Ousters::WearPart)slot); } - // õ ϰ ִٸ - // vampire amulet ´. + // ¼±ÅÃµÈ ½½¶ù¿¡ ¾ÆÀÌÅÛÀ» ÀåÂøÇϰí ÀÖ´Ù¸é + // vampire amuletÀº ¾È ´â´Â´Ù. if (pGear != NULL && canDecreaseDurability(pGear)) // && !pGear->isUnique() // && pGear->getItemClass()!=Item::ITEM_CLASS_VAMPIRE_AMULET) { - // õ ϴ , - // ٲپش. + // ¼±ÅÃµÈ ½½¶ù¿¡ Á¸ÀçÇÏ´Â ¾ÆÀÌÅÛÀÌ ¾ç¼Õ ¹«±â¶ó¸é, + // ½½¶ùÀ» ¹«Á¶°Ç ¿À¸¥ÂÊÀ¸·Î ¹Ù²Ù¾îÁØ´Ù. if (isTwohandWeapon(pGear)) { if (pTargetCreature->isSlayer()) slot = Slayer::WEAR_RIGHTHAND; @@ -2870,10 +2870,10 @@ void decreaseDurability(Creature* pCreature, Creature* pTargetCreature, SkillInf pPlayer->sendPacket(&gcRemoveFromGear); } - // α + // ·Î±× log(LOG_DESTROY_ITEM, pTargetCreature->getName(), "", pGear->toString()); - // ı + // ÆÄ±« pGear->save(pTargetCreature->getName(), STORAGE_GEAR, 0, slot, 0); pGear->destroy(); SAFE_DELETE(pGear); @@ -2889,7 +2889,7 @@ void decreaseDurability(Creature* pCreature, Creature* pTargetCreature, SkillInf pMI2->addLongData(MODIFY_DURABILITY, value); - // Ѵ. + // ¶³¾îÁø ³»±¸¼ºÀ» ÀúÀåÇÑ´Ù. // pGear->save(pTargetCreature->getName(), STORAGE_GEAR, 0, slot, 0); } } @@ -2897,34 +2897,34 @@ void decreaseDurability(Creature* pCreature, Creature* pTargetCreature, SkillInf } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ɼ ִ°? +// Ÿ°ÙÀ» ¸ÂÃâ °¡´É¼ºÀÌ Àִ°¡? ////////////////////////////////////////////////////////////////////////////// bool canHit(Creature* pAttacker, Creature* pDefender, SkillType_t SkillType, SkillLevel_t SkillLevel) { - // + // ¹«Àû »óÅ // if (pDefender->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE)) // { // return false; // } - // ų ϰ, ¸ üũѴ. + // ½ºÅ³ÀÇ Á¾·ù¿¡ ¹«°üÇϰÔ, ¸ÂÃâ ¼ö ¾ø´Â »óŸ¦ üũÇÑ´Ù. if (pAttacker->isSlayer()) { - // ˻絵 , - // ӵ ִ üũ ϱ ؼ ߴ. + // Á¾Á· °Ë»çµµ ÇÒ ¼ö ÀÖÁö¸¸, + // ¼Óµµ ¹®Á¦·Î µÉ ¼ö ÀÖ´Â ÇÑ Ã¼Å©¸¦ Àû°Ô Çϱâ À§Çؼ­ »ý·«Çß´Ù. - // Attacker Revealer Ʈ ´. + // Attacker ÀÇ Revealer ÀÌÆåÆ®¸¦ °¡Á®¿Â´Ù. EffectRevealer* pEffectRevealer = NULL; if (pAttacker->isFlag(Effect::EFFECT_CLASS_REVEALER)) { pEffectRevealer = dynamic_cast(pAttacker->findEffect(Effect::EFFECT_CLASS_REVEALER)); Assert(pEffectRevealer); } - // ̵ϰ , Detect hidden ɷ־ ִ. + // ÇÏÀ̵åÇϰí ÀÖÀ¸¸é, Detect hidden ¸¶¹ýÀÌ °É·ÁÀÖ¾î¾ß º¼ ¼ö ÀÖ´Ù. if (pDefender->isFlag(Effect::EFFECT_CLASS_HIDE)) { if (!pAttacker->isFlag(Effect::EFFECT_CLASS_DETECT_HIDDEN) && !(pEffectRevealer != NULL && pEffectRevealer->canSeeHide(pDefender))) return false; } - // ȭ ¶, Detect invisibility ɷ־ ִ. + // Åõ¸íÈ­ »óŶó¸é, Detect invisibility ¸¶¹ýÀÌ °É·ÁÀÖ¾î¾ß º¼ ¼ö ÀÖ´Ù. if (pDefender->isFlag(Effect::EFFECT_CLASS_INVISIBILITY)) { if (!pAttacker->isFlag(Effect::EFFECT_CLASS_DETECT_INVISIBILITY) && !(pEffectRevealer != NULL && pEffectRevealer->canSeeInvisibility(pDefender))) @@ -2932,10 +2932,10 @@ bool canHit(Creature* pAttacker, Creature* pDefender, SkillType_t SkillType, Ski } } - // ų ŸԿ ִ ˻Ѵ. - // ⺻ ų ⼭ üũѴ. + // ½ºÅ³ÀÇ Å¸ÀÔ¿¡ µû¶ó ¸ÂÃâ ¼ö ÀÖ´ÂÁö °Ë»çÇÑ´Ù. + // ±âº» °ø°ÝÀº ½ºÅ³ ÀÎÆ÷°¡ ¾ø±â ¶§¹®¿¡ ¿©±â¼­ üũÇÑ´Ù. switch (SkillType) { - // Ϲ и ̳, ƴٴϴ 뿡Դ Ұϴ. + // ÀÏ¹Ý ¹Ð¸® °ø°ÝÀ̳ª, ÈíÇ÷Àº ³¯¾Æ´Ù´Ï´Â »ó´ë¿¡°Ô´Â ºÒ°¡´ÉÇÏ´Ù. case SKILL_ATTACK_MELEE: case SKILL_BLOOD_DRAIN: if (pDefender != NULL) { @@ -2944,7 +2944,7 @@ bool canHit(Creature* pAttacker, Creature* pDefender, SkillType_t SkillType, Ski } return true; - // ϴ ƴٴϴ 뿡Ե ϴ. + // ÃÑÀ¸·Î ÇÏ´Â °ø°ÝÀº ³¯¾Æ´Ù´Ï´Â »ó´ë¿¡°Ôµµ °¡´ÉÇÏ´Ù. case SKILL_ATTACK_ARMS: return true; @@ -2952,7 +2952,7 @@ bool canHit(Creature* pAttacker, Creature* pDefender, SkillType_t SkillType, Ski break; } - // ų Ÿ԰ 忡 , θ Ѵ. + // ½ºÅ³ ŸÀÔ°ú »ó´ëÀÇ ÇöÀç ¹«ºê¸ðµå¿¡ µû¶ó, °ø°ÝÀÇ °¡´É ¿©ºÎ¸¦ ¸®ÅÏÇÑ´Ù. SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); Assert(pSkillInfo != NULL); @@ -2970,7 +2970,7 @@ bool canHit(Creature* pAttacker, Creature* pDefender, SkillType_t SkillType, Ski } ////////////////////////////////////////////////////////////////////////////// -// Ʈ Ҹ ϴ ̾ Ҹ Ѵ. +// ÀÎÆ®¿¡ µû¶ó ¸¶³ª ¼Ò¸ð·®ÀÌ º¯ÇÏ´Â ¹ìÆÄÀÌ¾î ¸¶¹ýÀÇ ¸¶³ª ¼Ò¸ð·®À» °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// MP_t decreaseConsumeMP(Vampire* pVampire, SkillInfo* pSkillInfo) { Assert(pVampire != NULL); @@ -3005,7 +3005,7 @@ MP_t decreaseConsumeMP(Vampire* pVampire, SkillInfo* pSkillInfo) { ////////////////////////////////////////////////////////////////////////////// -// ϱ ִ°? +// ±â¼úÀ» »ç¿ëÇϱâ À§ÇÑ ÃæºÐÇÑ ¸¶³ª¸¦ °¡Áö°í Àִ°¡? ////////////////////////////////////////////////////////////////////////////// bool hasEnoughMana(Creature* pCaster, int RequiredMP) { if (pCaster->isSlayer()) { @@ -3016,14 +3016,14 @@ bool hasEnoughMana(Creature* pCaster, int RequiredMP) { RequiredMP += getPercentValue(RequiredMP, decreaseRatio); } - // Sacrifice ¶ ڶ HP ִ. + // Sacrifice¸¦ ¾´ »óŶó¸é ¸¶³ª°¡ ¸ðÀÚ¶óµµ HP·Î ´ë½ÅÇÒ ¼ö ÀÖ´Ù. if (pSlayer->isFlag(Effect::EFFECT_CLASS_SACRIFICE)) { // cout << "RequiredMP : " << (int)RequiredMP << endl; int margin = RequiredMP - pSlayer->getMP(ATTR_CURRENT); // cout << "margin: " << (int)margin<< endl; - // 䱸ġ ġ 0̶̻ , - // 䱸ġ ũٴ ̴. ġ HP Ѵ. + // ¿ä±¸Ä¡¿¡¼­ ÇöÀç ¼öÄ¡¸¦ »« °ªÀÌ 0ÀÌ»óÀ̶ó¸é , + // ¿ä±¸Ä¡°¡ ´õ Å©´Ù´Â ¸»ÀÌ´Ù. ÀÌ ¼öÄ¡´Â HP¿¡¼­ Á¦°ÅÇÑ´Ù. if (margin > 0) { margin = (int)pSlayer->getHP(ATTR_CURRENT) * 2 - (int)margin; // cout << "margin: " << (int)margin<< endl; @@ -3039,9 +3039,9 @@ bool hasEnoughMana(Creature* pCaster, int RequiredMP) { } else if (pCaster->isVampire()) { Vampire* pVampire = dynamic_cast(pCaster); - // ̾ HP MP̱ ϰ, - // ׾ ϴ. ׷Ƿ ϰ - // HP 1 ̻̾ Ѵ. ׷ >= > Ѵ. + // ¹ìÆÄÀ̾î´Â HP°¡ °ð MPÀ̱⠶§¹®¿¡ ¸¶³ª¸¦ »ç¿ëÇϰí, + // Á×¾î¹ö¸®¸é °ï¶õÇÏ´Ù. ±×·¯¹Ç·Î ±â¼úÀ» »ç¿ëÇÏ°í ³ª¼­ + // HP´Â 1 ÀÌ»óÀ̾î¾ß ÇÑ´Ù. ±×·¡¼­ >= ´ë½Å >¸¦ »ç¿ëÇÑ´Ù. int decreaseRatio = pVampire->getConsumeMPRatio(); if (decreaseRatio != 0) { @@ -3061,9 +3061,9 @@ bool hasEnoughMana(Creature* pCaster, int RequiredMP) { if (pOusters->getMP(ATTR_CURRENT) >= (MP_t)RequiredMP) return true; } else if (pCaster->isMonster()) { - // ʹ ǰڴ. ȱȱ - // ߿ Ϳ īƮ ׷ . - // comment by 輺 + // ¸ó½ºÅÍ´Â ¹«ÇÑ ¸¶³ª µÇ°Ú´Ù. À½È±È± + // ³ªÁß¿¡¶óµµ ¸ó½ºÅÍ¿¡ ¸¶¹ý Ä«¿îÆ®³ª ¹¹ ±×·² °ÍÀÌ »ý±æÁöµµ ¸ð¸£Áö. + // comment by ±è¼º¹Î return true; } else { cerr << "hasEnoughMana() : Invalid Creature Class" << endl; @@ -3075,9 +3075,9 @@ bool hasEnoughMana(Creature* pCaster, int RequiredMP) { ////////////////////////////////////////////////////////////////////////////// -// ־ Ʈŭ δ. -// ̾ 쿡 Sacrifice Ʈ پ, -// ڶ , HP ִ. +// ÁÖ¾îÁø Æ÷ÀÎÆ®¸¸Å­ÀÇ ¸¶³ª¸¦ ÁÙÀδÙ. +// ´Ü ½½·¹ÀÌ¾î °°Àº °æ¿ì¿¡´Â Sacrifice °°Àº ÀÌÆåÆ®°¡ ºÙ¾îÀÖÀ¸¸é, +// ¸¶³ª°¡ ¸ðÀÚ¶ö °æ¿ì, HP°¡ ´âÀ» ¼öµµ ÀÖ´Ù. ////////////////////////////////////////////////////////////////////////////// int decreaseMana(Creature* pCaster, int MP, ModifyInfo& info) { Assert(pCaster != NULL); @@ -3091,7 +3091,7 @@ int decreaseMana(Creature* pCaster, int MP, ModifyInfo& info) { if (pCaster->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCaster); - // Magic Brain ִٸ MP Ҹ 25% + // Magic Brain ÀÌ ÀÖ´Ù¸é MP ¼Ò¸ð·® 25% °¨¼Ò if (pSlayer->hasRankBonus(RankBonus::RANK_BONUS_MAGIC_BRAIN)) { RankBonus* pRankBonus = pSlayer->getRankBonus(RankBonus::RANK_BONUS_MAGIC_BRAIN); Assert(pRankBonus != NULL); @@ -3099,22 +3099,22 @@ int decreaseMana(Creature* pCaster, int MP, ModifyInfo& info) { MP -= getPercentValue(MP, pRankBonus->getPoint()); } - // Blood Bible ʽ + // Blood Bible º¸³Ê½º Àû¿ë int decreaseRatio = pSlayer->getConsumeMPRatio(); if (decreaseRatio != 0) { - // decreaseRatio ü ̳ʽ ̴. + // decreaseRatio °ª ÀÚü°¡ ¸¶À̳ʽº °ªÀÌ´Ù. MP += getPercentValue(MP, decreaseRatio); } - // sacrifice ¶ MP , ڶ HP ´. + // sacrifice¸¦ ¾´ »óŶó¸é ¸ÕÀú MP¿¡¼­ ±ï°í, ¸ðÀÚ¶ó¸é HPµµ ±ï´Â´Ù. if (pSlayer->isFlag(Effect::EFFECT_CLASS_SACRIFICE)) { int margin = (int)MP - (int)pSlayer->getMP(ATTR_CURRENT); - // 0 ũٴ 䱸ġ MP ٴ ̴. + // ¸¶ÁøÀÌ 0º¸´Ù Å©´Ù´Â ¸»Àº ¿ä±¸Ä¡º¸´Ù ÇöÀç MP°¡ Àû´Ù´Â ¸»ÀÌ´Ù. if (margin > 0) { - // MP ... + // MP¸¦ ±ï°í... pSlayer->setMP(0, ATTR_CURRENT); - // HP ´. + // HPµµ ±ï´Â´Ù. RemainHP = max(0, (int)(pSlayer->getHP(ATTR_CURRENT) - margin / 2)); pSlayer->setHP(RemainHP, ATTR_CURRENT); @@ -3123,13 +3123,13 @@ int decreaseMana(Creature* pCaster, int MP, ModifyInfo& info) { return CONSUME_BOTH; } - // sacrifice ¶ MP ´. + // sacrifice¸¦ ¾²Áö ¾ÊÀº »óŶó¸é °Á MP¿¡¼­ ±ï´Â´Ù. RemainMP = max(0, ((int)pSlayer->getMP(ATTR_CURRENT) - (int)MP)); pSlayer->setMP(RemainMP, ATTR_CURRENT); info.addShortData(MODIFY_CURRENT_MP, pSlayer->getMP(ATTR_CURRENT)); return CONSUME_MP; - } else // sacrifice ¶ MP ´. + } else // sacrifice¸¦ ¾²Áö ¾ÊÀº »óŶó¸é °Á MP¿¡¼­ ±ï´Â´Ù. { RemainMP = max(0, ((int)pSlayer->getMP(ATTR_CURRENT) - (int)MP)); pSlayer->setMP(RemainMP, ATTR_CURRENT); @@ -3140,7 +3140,7 @@ int decreaseMana(Creature* pCaster, int MP, ModifyInfo& info) { } else if (pCaster->isVampire()) { Vampire* pVampire = dynamic_cast(pCaster); - // Wisdom of Blood ִٸ HP Ҹ 10% + // Wisdom of Blood °¡ ÀÖ´Ù¸é HP ¼Ò¸ð·® 10% °¨¼Ò if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_WISDOM_OF_BLOOD)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_WISDOM_OF_BLOOD); Assert(pRankBonus != NULL); @@ -3148,10 +3148,10 @@ int decreaseMana(Creature* pCaster, int MP, ModifyInfo& info) { MP -= getPercentValue(MP, pRankBonus->getPoint()); } - // Blood Bible ʽ + // Blood Bible º¸³Ê½º Àû¿ë int decreaseRatio = pVampire->getConsumeMPRatio(); if (decreaseRatio != 0) { - // decreaseRatio ü ̳ʽ ̴. + // decreaseRatio °ª ÀÚü°¡ ¸¶À̳ʽº °ªÀÌ´Ù. MP += getPercentValue(MP, decreaseRatio); } @@ -3159,11 +3159,11 @@ int decreaseMana(Creature* pCaster, int MP, ModifyInfo& info) { RemainHP = max(0, ((int)currentHP - (int)MP)); pVampire->setHP(RemainHP, ATTR_CURRENT); - // Mephisto Ʈ ɷ HP 30% ϶ Ǯ. + // Mephisto ÀÌÆåÆ® °É·ÁÀÖÀ¸¸é HP 30% ÀÌÇÏÀ϶§ Ç®¸°´Ù. if (pVampire->isFlag(Effect::EFFECT_CLASS_MEPHISTO)) { HP_t maxHP = pVampire->getHP(ATTR_MAX); - // 33% ... .. + // 33% ... ÄÉÄÉ.. if (currentHP * 3 < maxHP) { Effect* pEffect = pVampire->findEffect(Effect::EFFECT_CLASS_MEPHISTO); if (pEffect != NULL) { @@ -3180,10 +3180,10 @@ int decreaseMana(Creature* pCaster, int MP, ModifyInfo& info) { } else if (pCaster->isOusters()) { Ousters* pOusters = dynamic_cast(pCaster); - // Blood Bible ʽ + // Blood Bible º¸³Ê½º Àû¿ë int decreaseRatio = pOusters->getConsumeMPRatio(); if (decreaseRatio != 0) { - // decreaseRatio ü ̳ʽ ̴. + // decreaseRatio °ª ÀÚü°¡ ¸¶À̳ʽº °ªÀÌ´Ù. MP += getPercentValue(MP, decreaseRatio); } @@ -3193,9 +3193,9 @@ int decreaseMana(Creature* pCaster, int MP, ModifyInfo& info) { info.addShortData(MODIFY_CURRENT_MP, pOusters->getMP(ATTR_CURRENT)); return CONSUME_MP; } else if (pCaster->isMonster()) { - // ʹ ǰڴ. ȱȱ - // ߿ Ϳ īƮ ׷ . - // comment by 輺 + // ¸ó½ºÅÍ´Â ¹«ÇÑ ¸¶³ª µÇ°Ú´Ù. À½È±È± + // ³ªÁß¿¡¶óµµ ¸ó½ºÅÍ¿¡ ¸¶¹ý Ä«¿îÆ®³ª ¹¹ ±×·² °ÍÀÌ »ý±æÁöµµ ¸ð¸£Áö. + // comment by ±è¼º¹Î cerr << "decreaseMana() : Monster don't have Mana" << endl; Assert(false); } else { @@ -3207,20 +3207,20 @@ int decreaseMana(Creature* pCaster, int MP, ModifyInfo& info) { } ////////////////////////////////////////////////////////////////////////////// -// ̾ ų Ÿ Ѵ. +// ½½·¹À̾î¿ë ½ºÅ³ÀÇ »çÁ¤°Å¸®¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// Range_t computeSkillRange(SkillSlot* pSkillSlot, SkillInfo* pSkillInfo) { Assert(pSkillSlot != NULL); Assert(pSkillInfo != NULL); - // Skill Min/Max Range ޾ƿ´. + // SkillÀÇ Min/Max Range ¸¦ ¹Þ¾Æ¿Â´Ù. Range_t SkillMinPoint = pSkillInfo->getMinRange(); Range_t SkillMaxPoint = pSkillInfo->getMaxRange(); - // Skill Level ޾ƿ´. + // Skill LevelÀ» ¹Þ¾Æ¿Â´Ù. SkillLevel_t SkillLevel = pSkillSlot->getExpLevel(); - // Skill Range Ѵ. + // SkillÀÇ Range¸¦ °è»êÇÑ´Ù. Range_t Range = (int)(SkillMinPoint + (SkillMaxPoint - SkillMinPoint) * (double)(SkillLevel * 0.01)); return Range; @@ -3228,7 +3228,7 @@ Range_t computeSkillRange(SkillSlot* pSkillSlot, SkillInfo* pSkillInfo) { ////////////////////////////////////////////////////////////////////////////// -// (OX,OY) (TX,TY) Ÿ Ѵ. +// (OX,OY)¿Í (TX,TY) »çÀÌÀÇ °Å¸®¸¦ ±¸ÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// Range_t getDistance(ZoneCoord_t Ox, ZoneCoord_t Oy, ZoneCoord_t Tx, ZoneCoord_t Ty) { double OriginX = Ox; @@ -3244,7 +3244,7 @@ Range_t getDistance(ZoneCoord_t Ox, ZoneCoord_t Oy, ZoneCoord_t Tx, ZoneCoord_t } ////////////////////////////////////////////////////////////////////////////// -// ų ִ Ÿΰ Ѵ. +// ½ºÅ³À» ¾µ ¼ö ÀÖ´Â Àû´çÇÑ °Å¸®Àΰ¡¸¦ °ËÁõÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// bool verifyDistance(Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y, Range_t Dist) { Assert(pCreature != NULL); @@ -3258,27 +3258,27 @@ bool verifyDistance(Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y, Range_t D ZoneLevel_t AttackerZoneLevel = pZone->getZoneLevel(cx, cy); // ZoneLevel_t DefenderZoneLevel = pZone->getZoneLevel(X, Y); - // ƴ PK 뿡 . + // ¾Æ´ãÀÇ ¼ºÁö³ª PKÁ¸ ³»ÀÇ ¾ÈÀüÁö´ë¿¡¼­´Â ±â¼úÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. if ((AttackerZoneLevel & SAFE_ZONE) && (g_pPKZoneInfoManager->isPKZone(pZone->getZoneID()) || pZone->isHolyLand())) return false; - // ڰ ִ ġ ̾ , - // ̾ ƴ ڴ . + // °ø°ÝÀÚ°¡ ¼­ ÀÖ´Â À§Ä¡°¡ ½½·¹ÀÌ¾î ¾ÈÀüÁö´ë¶ó¸é, + // ½½·¹À̾ ¾Æ´Ñ ÀÚ´Â ±â¼úÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. if ((AttackerZoneLevel & SLAYER_SAFE_ZONE) && !pCreature->isSlayer()) return false; - // ڰ ִ ġ ̾ , - // ̾ ƴ ڴ . + // °ø°ÝÀÚ°¡ ¼­ ÀÖ´Â À§Ä¡°¡ ¹ìÆÄÀÌ¾î ¾ÈÀüÁö´ë¶ó¸é, + // ¹ìÆÄÀ̾ ¾Æ´Ñ ÀÚ´Â ±â¼úÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. else if ((AttackerZoneLevel & VAMPIRE_SAFE_ZONE) && !pCreature->isVampire()) return false; - // ڰ ִ ġ ƿ콺ͽ , - // ƿ콺ͽ ƴ ڴ . + // °ø°ÝÀÚ°¡ ¼­ ÀÖ´Â À§Ä¡°¡ ¾Æ¿ì½ºÅͽº ¾ÈÀüÁö´ë¶ó¸é, + // ¾Æ¿ì½ºÅͽº°¡ ¾Æ´Ñ ÀÚ´Â ±â¼úÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. else if ((AttackerZoneLevel & OUSTERS_SAFE_ZONE) && !pCreature->isOusters()) return false; - // ̾ ̾ . + // ¿ÏÀü ¾ÈÀüÁö´ë¶ó¸é ½½·¹À̾îµç ¹ìÆÄÀ̾îµç ±â¼úÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. else if (AttackerZoneLevel & COMPLETE_SAFE_ZONE) return false; - // ڰ ִ . + // ¹æ¾îÀÚ°¡ ¼­ ÀÖ´Â °÷ÀÌ ¿ÏÀüÁö´ë¶ó¸é ±â¼úÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. // if (DefenderZoneLevel & COMPLETE_SAFE_ZONE) // return false; @@ -3290,7 +3290,7 @@ bool verifyDistance(Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y, Range_t D ////////////////////////////////////////////////////////////////////////////// -// ų ִ Ÿΰ Ѵ. +// ½ºÅ³À» ¾µ ¼ö ÀÖ´Â Àû´çÇÑ °Å¸®Àΰ¡¸¦ °ËÁõÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// bool verifyDistance(Creature* pCreature, Creature* pTargetCreature, Range_t Dist) { Assert(pCreature != NULL); @@ -3307,39 +3307,39 @@ bool verifyDistance(Creature* pCreature, Creature* pTargetCreature, Range_t Dist ZoneLevel_t AttackerZoneLevel = pZone->getZoneLevel(ox, oy); ZoneLevel_t DefenderZoneLevel = pZone->getZoneLevel(tx, ty); - // ƴ PK 뿡 . + // ¾Æ´ãÀÇ ¼ºÁö³ª PKÁ¸ ³»ÀÇ ¾ÈÀüÁö´ë¿¡¼­´Â ±â¼úÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. if ((AttackerZoneLevel & SAFE_ZONE) && (g_pPKZoneInfoManager->isPKZone(pZone->getZoneID()) || pZone->isHolyLand())) return false; - // ڰ ִ ġ ̾ , - // ̾ ƴ ڴ . + // °ø°ÝÀÚ°¡ ¼­ ÀÖ´Â À§Ä¡°¡ ½½·¹ÀÌ¾î ¾ÈÀüÁö´ë¶ó¸é, + // ½½·¹À̾ ¾Æ´Ñ ÀÚ´Â ±â¼úÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. if ((AttackerZoneLevel & SLAYER_SAFE_ZONE) && !pCreature->isSlayer()) return false; - // ڰ ִ ġ ̾ , - // ̾ ƴ ڴ . + // °ø°ÝÀÚ°¡ ¼­ ÀÖ´Â À§Ä¡°¡ ¹ìÆÄÀÌ¾î ¾ÈÀüÁö´ë¶ó¸é, + // ¹ìÆÄÀ̾ ¾Æ´Ñ ÀÚ´Â ±â¼úÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. else if ((AttackerZoneLevel & VAMPIRE_SAFE_ZONE) && !pCreature->isVampire()) return false; - // ڰ ִ ġ ƿ콺ͽ , - // ƿ콺ͽ ƴ ڴ . + // °ø°ÝÀÚ°¡ ¼­ ÀÖ´Â À§Ä¡°¡ ¾Æ¿ì½ºÅͽº ¾ÈÀüÁö´ë¶ó¸é, + // ¾Æ¿ì½ºÅͽº°¡ ¾Æ´Ñ ÀÚ´Â ±â¼úÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. else if ((AttackerZoneLevel & OUSTERS_SAFE_ZONE) && !pCreature->isOusters()) return false; - // ̾ ̾ . + // ¿ÏÀü ¾ÈÀüÁö´ë¶ó¸é ½½·¹À̾îµç ¹ìÆÄÀ̾îµç ±â¼úÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. else if (AttackerZoneLevel & COMPLETE_SAFE_ZONE) return false; - // ڰ ִ ġ ̾ ̰, - // ڰ ̾ ʴ´. + // ¹æ¾îÀÚ°¡ ¼­ ÀÖ´Â À§Ä¡°¡ ½½·¹ÀÌ¾î ¾ÈÀüÁö´ëÀ̰í, + // ¹æ¾îÀÚ°¡ ½½·¹À̾î¶ó¸é ±â¼úÀº ¸ÂÁö ¾Ê´Â´Ù. if ((DefenderZoneLevel & SLAYER_SAFE_ZONE) && pTargetCreature->isSlayer()) return false; - // ڰ ִ ġ ̾ ̰, - // ڰ ̾ ʴ´. + // ¹æ¾îÀÚ°¡ ¼­ ÀÖ´Â À§Ä¡°¡ ¹ìÆÄÀÌ¾î ¾ÈÀüÁö´ëÀ̰í, + // ¹æ¾îÀÚ°¡ ¹ìÆÄÀ̾î¶ó¸é ±â¼úÀº ¸ÂÁö ¾Ê´Â´Ù. else if ((DefenderZoneLevel & VAMPIRE_SAFE_ZONE) && pTargetCreature->isVampire()) return false; - // ڰ ִ ġ ƿ콺ͽ ̰, - // ڰ ƿ콺ͽ ʴ´. + // ¹æ¾îÀÚ°¡ ¼­ ÀÖ´Â À§Ä¡°¡ ¾Æ¿ì½ºÅͽº ¾ÈÀüÁö´ëÀ̰í, + // ¹æ¾îÀÚ°¡ ¾Æ¿ì½ºÅͽº¶ó¸é ±â¼úÀº ¸ÂÁö ¾Ê´Â´Ù. else if ((DefenderZoneLevel & OUSTERS_SAFE_ZONE) && pTargetCreature->isOusters()) return false; - // . + // ¿ÏÀü ¾ÈÀüÁö´ë¶ó¸é ±â¼úÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. else if (DefenderZoneLevel & COMPLETE_SAFE_ZONE) return false; @@ -3351,7 +3351,7 @@ bool verifyDistance(Creature* pCreature, Creature* pTargetCreature, Range_t Dist ////////////////////////////////////////////////////////////////////////////// -// ̾ ų ð Ѵ. +// ½½·¹À̾î¿ë ½ºÅ³ÀÇ ½ÇÇà½Ã°£À» °ËÁõÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// bool verifyRunTime(SkillSlot* pSkillSlot) { Assert(pSkillSlot != NULL); @@ -3369,7 +3369,7 @@ bool verifyRunTime(SkillSlot* pSkillSlot) { ////////////////////////////////////////////////////////////////////////////// -// ̾ ų ð Ѵ. +// ¹ìÆÄÀ̾î¿ë ½ºÅ³ÀÇ ½ÇÇà½Ã°£À» °ËÁõÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// bool verifyRunTime(VampireSkillSlot* pSkillSlot) { Assert(pSkillSlot != NULL); @@ -3387,7 +3387,7 @@ bool verifyRunTime(VampireSkillSlot* pSkillSlot) { ////////////////////////////////////////////////////////////////////////////// -// ƿ콺ͽ ų ð Ѵ. +// ¾Æ¿ì½ºÅͽº¿ë ½ºÅ³ÀÇ ½ÇÇà½Ã°£À» °ËÁõÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// bool verifyRunTime(OustersSkillSlot* pSkillSlot) { Assert(pSkillSlot != NULL); @@ -3405,7 +3405,7 @@ bool verifyRunTime(OustersSkillSlot* pSkillSlot) { ////////////////////////////////////////////////////////////////////////////// -// PK å , PK Ǵ Ǵĸ Ѵ. +// °¢ Á¸ÀÇ PK Á¤Ã¥¿¡ µû¶ó, PK°¡ µÇ´À³Ä ¾È µÇ´À³Ä¸¦ Á¤ÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// bool verifyPK(Creature* pAttacker, Creature* pDefender) { Zone* pZone = pDefender->getZone(); @@ -3418,11 +3418,11 @@ bool verifyPK(Creature* pAttacker, Creature* pDefender) { } if (pDefender->getCreatureClass() == pAttacker->getCreatureClass() && pAttacker->isPC()) { - // PK Ǵ ̶ . + // Á¸ ·¹º§ÀÌ PK°¡ ¾È µÇ´Â °÷À̶ó¸é °ø°ÝÇÒ ¼ö ¾ø´Ù. if (pZone->getZoneLevel() == NO_PK_ZONE) return false; - // Ƽ . + // °°Àº ÆÄƼ¿ø³¢¸®´Â °ø°ÝÇÒ ¼ö ¾ø´Ù. int PartyID1 = pAttacker->getPartyID(); int PartyID2 = pDefender->getPartyID(); if (PartyID1 != 0 && PartyID1 == PartyID2) @@ -3440,8 +3440,8 @@ bool verifyPK(Creature* pAttacker, Creature* pDefender) { } ////////////////////////////////////////////////////////////////////////////// -// ִ ΰ? -// ( , üũϴ Լ...) +// ±â¼úÀ» »ç¿ëÇÒ ¼ö ÀÖ´Â Á¸Àΰ¡? +// (¼¿ÇÁ ±â¼úÀÏ °æ¿ì, Á¸ ·¹º§À» üũÇÏ´Â ÇÔ¼ö´Ù...) ////////////////////////////////////////////////////////////////////////////// bool checkZoneLevelToUseSkill(Creature* pCaster) { Assert(pCaster != NULL); @@ -3456,20 +3456,20 @@ bool checkZoneLevelToUseSkill(Creature* pCaster) { ZoneCoord_t cy = pCaster->getY(); ZoneLevel_t ZoneLevel = pZone->getZoneLevel(cx, cy); - // 뿡 . + // ¾ÈÀüÁö´ë¿¡¼­´Â ¼¿ÇÁ ±â¼úÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. if ((ZoneLevel & SAFE_ZONE)) // && pZone->isHolyLand() ) return false; if (pCaster->isFlag(Effect::EFFECT_CLASS_REFINIUM_TICKET)) return false; - /* // ̾ 뿡 ̾ ִ. + /* // ½½·¹ÀÌ¾î ¾ÈÀüÁö´ë¿¡¼­´Â ½½·¹À̾ÀÌ ±â¼úÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. if ((ZoneLevel & SLAYER_SAFE_ZONE) && !pCaster->isSlayer()) return false; - // ̾ 뿡 ̾ ִ. + // ¸¶Âù°¡Áö·Î ¹ìÆÄÀÌ¾î ¾ÈÀüÁö´ë¿¡¼­´Â ¹ìÆÄÀ̾ÀÌ ±â¼úÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. else if ((ZoneLevel & VAMPIRE_SAFE_ZONE) && !pCaster->isVampire()) return false; - // 뿡 . + // ÅëÇÕ ¾ÈÀüÁö´ë¿¡¼­´Â ´©±¸µµ ±â¼úÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. else if (ZoneLevel & COMPLETE_SAFE_ZONE) return false; */ @@ -3477,7 +3477,7 @@ bool checkZoneLevelToUseSkill(Creature* pCaster) { } ////////////////////////////////////////////////////////////////////////////// -// X, Y ִ ũİ ޴ üũϴ Լ. +// X, Y¿¡ ¼­ ÀÖ´Â Å©¸®Ãİ¡ ÀÓÀÇÀÇ ±â¼ú¿¡ ¿µÇâÀ» ¹Þ´ÂÁö üũÇÏ´Â ÇÔ¼ö´Ù. ////////////////////////////////////////////////////////////////////////////// bool checkZoneLevelToHitTarget(Creature* pTargetCreature) { Assert(pTargetCreature != NULL); @@ -3489,16 +3489,16 @@ bool checkZoneLevelToHitTarget(Creature* pTargetCreature) { ZoneCoord_t ty = pTargetCreature->getY(); ZoneLevel_t ZoneLevel = pZone->getZoneLevel(tx, ty); - // ̾ 뿡 ̾ ʴ´. + // ½½·¹ÀÌ¾î ¾ÈÀüÁö´ë¿¡¼­ ½½·¹À̾î´Â ±â¼ú¿¡ ¸ÂÁö ¾Ê´Â´Ù. if ((ZoneLevel & SLAYER_SAFE_ZONE) && pTargetCreature->isSlayer()) return false; - // ̾ 뿡 ̾ ʴ´. + // ¹ìÆÄÀÌ¾î ¾ÈÀüÁö´ë¿¡¼­ ¹ìÆÄÀ̾î´Â ±â¼ú¿¡ ¸ÂÁö ¾Ê´Â´Ù. else if ((ZoneLevel & VAMPIRE_SAFE_ZONE) && pTargetCreature->isVampire()) return false; - // ƿ콺 뿡 ƿ콺 ʴ´. + // ¾Æ¿ì½ºÅÍÁî ¾ÈÀüÁö´ë¿¡¼­ ¾Æ¿ì½ºÅÍÁî´Â ±â¼ú¿¡ ¸ÂÁö ¾Ê´Â´Ù. else if ((ZoneLevel & OUSTERS_SAFE_ZONE) && pTargetCreature->isOusters()) return false; - // 뿡 ʴ´. + // ÅëÇÕ ¾ÈÀüÁö´ë¿¡¼­´Â ´©±¸µµ ¸ÂÁö ¾Ê´Â´Ù. else if (ZoneLevel & COMPLETE_SAFE_ZONE) return false; @@ -3506,14 +3506,14 @@ bool checkZoneLevelToHitTarget(Creature* pTargetCreature) { } ////////////////////////////////////////////////////////////////////////////// -// Ѵ. -// ϰų, PK ȭ ϴ Լ. +// ¼ºÇâÀ» º¯°æÇÑ´Ù. +// ±â¼úÀ» »ç¿ëÇϰųª, PK¸¦ ÇÒ ¶§ »ý±â´Â ¼ºÇâ º¯È­¸¦ °è»êÇÏ´Â ÇÔ¼ö´Ù. ////////////////////////////////////////////////////////////////////////////// void computeAlignmentChange(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, ModifyInfo* pMI, ModifyInfo* pAttackerMI) { Assert(pTargetCreature != NULL); - // PK ʴ´. + // PKÁ¸¿¡¼­´Â ¼ºÇâÀÌ º¯ÇÏÁö ¾Ê´Â´Ù. if (g_pPKZoneInfoManager->isPKZone(pAttacker->getZoneID())) return; @@ -3522,11 +3522,11 @@ void computeAlignmentChange(Creature* pTargetCreature, Damage_t Damage, Creature bool bSameRace = false; - // ڰ ִٸ, ƴ üũѴ. + // °ø°ÝÀÚ°¡ ÀÖ´Ù¸é, °°Àº Á¾Á·Àº ¾Æ´ÑÁö üũÇÑ´Ù. if (pAttacker != NULL) { - // ̺Ʈ 忡 ȹٲ Ǵ ڵ̴. - // ZoneInfo ְ, Zone ְ ϸ , - // ڱ ̶ ٴ ϵ ڵ̴. - -; + // À̺¥Æ® °æ±âÀå¿¡¼­´Â ¼ºÇâÀÌ ¾È¹Ù²î°Ô µÇ´Â ÄÚµåÀÌ´Ù. + // ZoneInfo¿¡ ³Ö°í, Zone¿¡¼­ ÀÐÀ» ¼ö ÀÖ°Ô Çϸé ÁÁ°ÚÁö¸¸, + // °©Àڱ⠶³¾îÁø ÀÏÀ̶ó ±ÍÂú´Ù´Â ÀÌÀ¯·Î Çϵå ÄÚµùÀÌ´Ù. - -; // 2002.8.21. by sigi // int zoneID = pAttacker->getZone()->getZoneID(); @@ -3548,7 +3548,7 @@ void computeAlignmentChange(Creature* pTargetCreature, Damage_t Damage, Creature break; } - // ƴϸ ø ݸ޴~ + // °°Àº Á¾Á·ÀÌ ¾Æ´Ï¸é ¿Ã¸²ÇÈ ±Ý¸Þ´Þ~ if (!bSameRace && bPKOlympic && pTargetCreature->isPC() && pTargetCreature->isDead() && !GDRLairManager::Instance().isGDRLairZone(pTargetCreature->getZoneID())) { PlayerCreature* pAttackPC = dynamic_cast(pAttacker); @@ -3563,7 +3563,7 @@ void computeAlignmentChange(Creature* pTargetCreature, Damage_t Damage, Creature return; } - // ̶ ⿡ ȭ ִ. + // °°Àº Á¾Á·À̶ó¸é ¼ºÇâ¿¡ º¯È­°¡ »ý±æ ¼ö ÀÖ´Ù. if (bSameRace) { PlayerCreature* pAttackPC = dynamic_cast(pAttacker); PlayerCreature* pTargetPC = dynamic_cast(pTargetCreature); @@ -3576,7 +3576,7 @@ void computeAlignmentChange(Creature* pTargetCreature, Damage_t Damage, Creature Alignment_t ModifyAlignment = 0; - // ϴ ϴ ˾Ƶд. + // °¨¼ÒÇÏ´Â °ÍÀÎÁö Áõ°¡ÇÏ´Â °ÍÀÎÁö ¾Ë¾ÆµÐ´Ù. bool bdecrease = false; if (pTargetPC->isDead()) { ModifyAlignment = g_pAlignmentManager->getMultiplier(AttackAlignment, TargetAlignment); // Damage* 2 @@ -3585,7 +3585,7 @@ void computeAlignmentChange(Creature* pTargetCreature, Damage_t Damage, Creature ModifyAlignment = ModifyAlignment * 10; bdecrease = true; } else if (ModifyAlignment > 0) { - // (ǻ ) / ( ) * ( ȹ淮) :// max = ( ȹ淮) + // (ÇÇ»ìÀÚ ·¹º§) / (»ìÇØÀÚ ·¹º§) * (±âÁ¸ ¼ºÇâ ȹµæ·®) :// max = (±âÁ¸ ¼ºÇâ ȹµæ·®) if (pAttackPC->getLevel() - 10 <= pTargetPC->getLevel() && !pTargetPC->isFlag(Effect::EFFECT_CLASS_PUNISH_COUNTED)) { @@ -3637,14 +3637,14 @@ void computeAlignmentChange(Creature* pTargetCreature, Damage_t Damage, Creature EffectManager* pAttackEffectManager = pAttackPC->getEffectManager(); EffectManager* pTargetEffectManager = pTargetPC->getEffectManager(); - // ⿡ ش ʴ 濡 ش. + // ¼ºÇâ¿¡ °ü°è ¾øÀÌ Á¤´ç¹æÀ§¿¡ ÇØ´çµÇÁö ¾Ê´Â »ç¶÷À» ¶§¸®¸é ¹«Á¶°Ç »ó´ë¹æ¿¡°Ô Á¤´ç¹æÀ§ ±ÇÇÑÀ» ÁØ´Ù. if (!pAttackPC->hasEnemy(TargetName) && g_pAlignmentManager->getAlignmentType(TargetAlignment) >= NEUTRAL) { GCAddInjuriousCreature gcAddInjuriousCreature; gcAddInjuriousCreature.setName(AttackName); pTargetPC->getPlayer()->sendPacket(&gcAddInjuriousCreature); - // ݴϴ Ʈ ߰ϰ - // 5 ڿ ٴ Ʈ δ. + // °ø°Ý´çÇÏ´Â »ç¶÷¿¡°Ô ¼±°øÀÚ ¸®½ºÆ®¿¡ Ãß°¡Çϰí + // 5ºÐ µÚ¿¡ »ç¶óÁø´Ù´Â ÀÌÆåÆ®¸¦ ºÙÀδÙ. pTargetPC->addEnemy(AttackName); EffectEnemyErase* pEffectEnemyErase = new EffectEnemyErase(pTargetPC); @@ -3654,27 +3654,27 @@ void computeAlignmentChange(Creature* pTargetCreature, Damage_t Damage, Creature pTargetEffectManager->addEffect(pEffectEnemyErase); } - // 밡 ̰ 븦 ׿ Ʈ ش. + // »ó´ë°¡ ³ª¿¡°Ô Á¤´ç¹æÀ§ÀÇ ´ë»óÀÌ°í »ó´ë¸¦ Á׿´À» °æ¿ì ÀÌÆåÆ®¸¦ Áö¿öÁØ´Ù. if (pAttackPC->hasEnemy(TargetName) && pTargetPC->isDead()) { EffectEnemyErase* pAttackerEffect = (EffectEnemyErase*)pAttackEffectManager->findEffect(Effect::EFFECT_CLASS_ENEMY_ERASE, TargetName); if (pAttackerEffect != NULL) { - // Ʈ ִٴ ڸ ִ Ʈ ִٴ ̴. NULL - // . + // ¼±°øÀÚ ¸®½ºÆ®¿¡ ÀÖ´Ù´Â ¸»Àº ¼±°øÀÚ¸¦ Áö¿öÁÖ´Â ÀÌÆåÆ®°¡ ¹«Á¶°Ç ÀÖ´Ù´Â ¾ê±âÀÌ´Ù. µû¶ó¼­ NULLÀÌ µÉ ¼ö + // ¾ø´Ù. Assert(pAttackerEffect != NULL); Assert(pAttackerEffect->getEffectClass() == Effect::EFFECT_CLASS_ENEMY_ERASE); - // ش. + // Áö¿öÁØ´Ù. pAttackerEffect->setDeadline(0); } } - // Ʈ ̸ ְ, ڽ Good Ǵ Neutral ̶ ϰ, - // ʰ Ѵ. + // ¼±°øÀÚÀÇ ¸®½ºÆ®¿¡ ¹æ¾îÀÚÀÇ À̸§ÀÌ ÀÖ°í, ÀÚ½ÅÀÇ ¼ºÇâÀÌ Good ¶Ç´Â Neutral À̶ó¸é Á¤´ç¹æÀ§·Î ÀÎÁ¤Çϰí, ¼ºÇâÀÌ + // ¶³¾îÁöÁö´Â ¾Ê°Ô ÇÑ´Ù. if (!(bdecrease && pAttackPC->hasEnemy(TargetName) && g_pAlignmentManager->getAlignmentType(AttackAlignment) >= NEUTRAL)) { - // ö󰡵 ƾ Ѵ. - // ´. + // ¿Ã¶ó°¡µç ³»·Á°¡µç ¸ÕÀú ¼ÂÆÃÀ» ÇØ ³õ¾Æ¾ß ÇÑ´ç. + // ¸ÕÀú ¼ÂÆÃÀ» ÇØ ³õ´Â´Ù. if (pAttackerMI && ModifyAlignment != 0) { if (pAttackPC->isSlayer()) { Slayer* pSlayer = dynamic_cast(pAttackPC); @@ -3730,32 +3730,32 @@ void computeAlignmentChange(Creature* pTargetCreature, Damage_t Damage, Creature } } - // ҵɶ Ʈ Ͽ 10踦 δ ȸŰ ̴. + // ¼ºÇâÀÌ °¨¼ÒµÉ¶§ ÀÌÆåÆ®¸¦ ÅëÇÏ¿© 10¹è¸¦ ÁÙÀδÙÀ½ ¼­¼­È÷ ȸº¹½ÃŰ´Â ¹æ¹ýÀÌ´Ù. if (bdecrease) { - // Ʈ ̸ ִٸ, ڴ ۳̴. - // Ʈ ̸ ִٴ Ʈ پִٴ ̴. - // ȸŰ Ʈ Ѽ ϳ Ϸ ִ. ߺ ʴ´. + // ¸¸¾à ¹æ¾îÀÚÀÇ ¼±°øÀÚ ¸®½ºÆ®¿¡ ³» À̸§ÀÌ ÀÖ´Ù¸é, °ø°ÝÀÚ´Â ³ª»Û³ÑÀÌ´Ù. + // ¼±°øÀÚÀÇ ¸®½ºÆ®¿¡ À̸§ÀÌ ÀÖ´Ù´Â °ÍÀº ¾ÆÁ÷ ÀÌÆåÆ®°¡ ºÙ¾îÀÖ´Ù´Â ¾ê±âÀÌ´Ù. + // ¼ºÇâÀ» ȸº¹½ÃŰ´Â ÀÌÆåÆ®´Â ÇѼø°£¿¡ Çϳª ÀÌÇÏ·Î Á¸ÀçÇÒ ¼ö ÀÖ´Ù. Áߺ¹µÇÁö ¾Ê´Â´Ù. EffectAlignmentRecovery* pAttackerEffect = (EffectAlignmentRecovery*)pAttackEffectManager->findEffect(Effect::EFFECT_CLASS_ALIGNMENT_RECOVERY); - // Ʈ ޾ƿͼ ٽ Ѵ. - // Ƹ ̸ Ƿ Ʈ ʽ ̴. - // ϳ Ⱑ ִ Ȳ Ƿ, ణ ⵵ Ѵ. + // ÀÌÆåÆ®¸¦ ¹Þ¾Æ¿Í¼­ °ªÀ» ´Ù½Ã ¼ÂÆÃÇÑ´Ù. + // ¾Æ¸¶µµ ¼±°øÀÚÀÇ À̸§¿¡ ³»°¡ ÀÖÀ¸¹Ç·Î ÀÌÆåÆ®´Â Çʽà ÀÖÀ» °ÍÀÌ´Ù. + // Çϳª µ¿±â°¡ ±úÁú ¼ö ÀÖ´Â »óȲÀÌ ±úÁú ¼ö ÀÖÀ¸¹Ç·Î, µ¥µå¶óÀÎÀ» ¾à°£ ±æ°Ô Àâµµ·Ï ÇÑ´Ù. if (pAttackerEffect != NULL) { - // 󸶳 ȸų ΰ? + // ¾ó¸¶³ª ȸº¹½Ãų °Í °ÍÀΰ¡? Alignment_t Amount = abs(ModifyAlignment / 10 * 9); - // 󸶾 ȸų ΰ? 10 + // ¾ó¸¶¾¿ ȸº¹½Ãų °ÍÀΰ¡? 10¾¿ Alignment_t Quantity = 10; - // ȸ ֱ ΰ? 30 + // ȸº¹ ÁÖ±â´Â ¾ó¸¶Àΰ¡? 30ÃÊ int DelayProvider = 300; - // ȸų ΰ? + // ¸î¹ø ȸº¹½Ãų °ÍÀΰ¡? double temp = (double)((double)Amount / (double)Quantity); int Period = (uint)floor(temp); - // ȸ۵ ɸ ð ΰ? + // ´Ù ȸº¹½Ã۴µ¥ °É¸®´Â ½Ã°£Àº ¾ó¸¶Àΰ¡? Turn_t Deadline = Period * DelayProvider; pAttackerEffect->setQuantity(Quantity); @@ -3763,28 +3763,28 @@ void computeAlignmentChange(Creature* pTargetCreature, Damage_t Damage, Creature pAttackerEffect->setDeadline(Deadline); pAttackerEffect->setDelay(DelayProvider); } else { - // ٸ ʷ ϴ ̴ Ʈ ؼ ̰ 5а ̴. - // ڿ Ʈ ٿ ƾ Ѵ. - // Ʈ ޴ ִ. - // 30ʸ 10 ȸŰ Ʈ ڿ δ. + // ¾ø´Ù¸é ÃÖÃÊ·Î ¼±°øÇÏ´Â °ÍÀÌ´Ù »õ ÀÌÆåÆ®¸¦ »ý¼ºÇؼ­ ºÙÀ̰í 5ºÐ°£ Áö¼Ó µÉ °ÍÀÌ´Ù. + // ¹æ¾îÀÚ¿¡°Ô »ç¶óÁö´Â ÀÌÆåÆ®¸¦ ºÙ¿©¾ß ÇÔÀ» ÀØÁö ¸»¾Æ¾ß ÇÑ´Ù. + // »ç¶óÁö´Â °ÍÀº »ó´ëÀÇ ÀÌÆåÆ® ¸Þ´ÏÁ®¿¡ ¼ÓÇØÀÖ´Ù. + // 30Ãʸ¶´Ù 10¾¿ ¼ºÇâÀ» ȸº¹½ÃŰ´Â ÀÌÆåÆ®¸¦ °ø°ÝÀÚ¿¡°Ô ºÙÀδÙ. - // 󸶳 ȸų ΰ? + // ¾ó¸¶³ª ȸº¹½Ãų °Í °ÍÀΰ¡? Alignment_t Amount = abs(ModifyAlignment / 10 * 9); - // 󸶾 ȸų ΰ? 10 + // ¾ó¸¶¾¿ ȸº¹½Ãų °ÍÀΰ¡? 10¾¿ Alignment_t Quantity = 10; - // ȸ ֱ ΰ? 30 + // ȸº¹ ÁÖ±â´Â ¾ó¸¶Àΰ¡? 30ÃÊ int DelayProvider = 300; - // ȸų ΰ? + // ¸î¹ø ȸº¹½Ãų °ÍÀΰ¡? double temp = (double)((double)Amount / (double)Quantity); int Period = (uint)floor(temp); - // ȸ۵ ɸ ð ΰ? + // ´Ù ȸº¹½Ã۴µ¥ °É¸®´Â ½Ã°£Àº ¾ó¸¶Àΰ¡? Turn_t Deadline = Period * DelayProvider; - // ȸ Ʈ δ. + // ¸ÕÀú ȸº¹ ÀÌÆåÆ®¸¦ ºÙÀδÙ. EffectAlignmentRecovery* pEffectAlignmentRecovery = new EffectAlignmentRecovery(); pEffectAlignmentRecovery->setTarget(pAttackPC); @@ -3797,16 +3797,16 @@ void computeAlignmentChange(Creature* pTargetCreature, Damage_t Damage, Creature pAttackEffectManager->addEffect(pEffectAlignmentRecovery); } - // ڿ پִ Ʈ ٽ ־ Ѵ. + // ¹æ¾îÀÚ¿¡°Ô ºÙ¾îÀÖ´Â ÀÌÆåÆ®ÀÇ µ¥µå¶óÀÎÀ» ´Ù½Ã ¼ÂÆÃ ÇØ ÁÖ¾î¾ß ÇÑ´Ù. EffectEnemyErase* pDefenderEffect = (EffectEnemyErase*)pTargetEffectManager->findEffect(Effect::EFFECT_CLASS_ENEMY_ERASE, AttackName); if (pDefenderEffect != NULL) { - // Ʈ ִٴ ڸ ִ Ʈ ִٴ ̴. NULL - // . + // ¼±°øÀÚ ¸®½ºÆ®¿¡ ÀÖ´Ù´Â ¸»Àº ¼±°øÀÚ¸¦ Áö¿öÁÖ´Â ÀÌÆåÆ®°¡ ¹«Á¶°Ç ÀÖ´Ù´Â ¾ê±âÀÌ´Ù. µû¶ó¼­ NULLÀÌ µÉ + // ¼ö ¾ø´Ù. Assert(pDefenderEffect != NULL); Assert(pDefenderEffect->getEffectClass() == Effect::EFFECT_CLASS_ENEMY_ERASE); - // 5 + // 5ºÐÀ¸·Î ¼ÂÆÃ pDefenderEffect->setDeadline(36000); pDefenderEffect->save(TargetName); } @@ -3817,25 +3817,25 @@ void computeAlignmentChange(Creature* pTargetCreature, Damage_t Damage, Creature ////////////////////////////////////////////////////////////////////////////// -// ̾ ̾ ణ ȸŲ. +// ½½·¹ÀÌ¾î ¹× ¹ìÆÄÀ̾ ¸÷À» Á×ÀÏ ¶§ ¼ºÇâÀ» ¾à°£¾¿ ȸº¹½ÃŲ´Ù. ////////////////////////////////////////////////////////////////////////////// void increaseAlignment(Creature* pCreature, Creature* pEnemy, ModifyInfo& mi) { Assert(pCreature != NULL); Assert(pEnemy != NULL); - // PK ÷ش. + // PKÁ¸¿¡¼­´Â ¼ºÇâÀ» ¾È ¿Ã·ÁÁØ´Ù. if (g_pPKZoneInfoManager->isPKZone(pCreature->getZoneID())) return; - // ̳ ȿ ÷ش. + // ´ÙÀ̳ª¹Í Á¸ ¾È¿¡¼­´Â ¼ºÇâÀ» ¾È ¿Ã·ÁÁØ´Ù. if (pCreature->getZone() != NULL && pCreature->getZone()->isDynamicZone()) return; - // Ͱ 쿡 ȭ ʴ´. + // ¸ó½ºÅͰ¡ ¾ÆÁ÷ »ì¾ÆÀÖÀ» °æ¿ì¿¡´Â ¼ºÇâÀÌ º¯È­µÇÁö ¾Ê´Â´Ù. if (!pEnemy->isDead()) return; - // NPC̰ų, ϴ 쿡 Ű ʴ´. + // ÀûÀÌ NPCÀ̰ųª, µ¿Á·³¢¸® °ø°ÝÇÏ´Â °æ¿ì¿¡´Â ¼ºÇâÀ» Áõ°¡½ÃŰÁö ¾Ê´Â´Ù. if (pEnemy->isNPC()) return; if (pCreature->isSlayer() && pEnemy->isSlayer()) @@ -3851,14 +3851,14 @@ void increaseAlignment(Creature* pCreature, Creature* pEnemy, ModifyInfo& mi) { if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); - // о´. + // ÇöÀç ¼ºÇâ °ªÀ» Àоî¿Â´Ù. OldAlignValue = pSlayer->getAlignment(); - // 0̻ 쿡 ͸ ׿ ȭ . + // ¼ºÇâÀÌ 0ÀÌ»óÀÎ °æ¿ì¿¡´Â ¸ó½ºÅ͸¦ Á׿©µµ ¼ºÇâÀÇ º¯È­°¡ ¾ø´Ù. if (OldAlignValue > 0) return; - // ö ġ Ѵ. + // ¿Ã¶ó°¥ ¼ºÇâÀÇ ¼öÄ¡¸¦ °è»êÇÑ´Ù. if (pEnemy->isMonster()) { Monster* pMonster = dynamic_cast(pEnemy); Assert(pMonster != NULL); @@ -3876,7 +3876,7 @@ void increaseAlignment(Creature* pCreature, Creature* pEnemy, ModifyInfo& mi) { NewAlignValue = OldAlignValue + NewAlignValue; if (OldAlignValue != NewAlignValue) { - // Ŷ ٲٰ ˷ش. + // ÆÐŶ¿¡´Ù ¼ºÇâÀÌ ¹Ù²î¾ú´Ù°í ¾Ë·ÁÁØ´Ù. mi.addShortData(MODIFY_ALIGNMENT, NewAlignValue); WORD AlignmentSaveCount = pSlayer->getAlignmentSaveCount(); @@ -3893,14 +3893,14 @@ void increaseAlignment(Creature* pCreature, Creature* pEnemy, ModifyInfo& mi) { } else if (pCreature->isVampire()) { Vampire* pVampire = dynamic_cast(pCreature); - // о´. + // ÇöÀç ¼ºÇâ °ªÀ» Àоî¿Â´Ù. OldAlignValue = pVampire->getAlignment(); - // 0̻ 쿡 ͸ ׿ ȭ . + // ¼ºÇâÀÌ 0ÀÌ»óÀÎ °æ¿ì¿¡´Â ¸ó½ºÅ͸¦ Á׿©µµ ¼ºÇâÀÇ º¯È­°¡ ¾ø´Ù. if (OldAlignValue > 0) return; - // ö ġ Ѵ. + // ¿Ã¶ó°¥ ¼ºÇâÀÇ ¼öÄ¡¸¦ °è»êÇÑ´Ù. NewAlignValue = 0; if (pEnemy->isMonster()) { Monster* pMonster = dynamic_cast(pEnemy); @@ -3921,7 +3921,7 @@ void increaseAlignment(Creature* pCreature, Creature* pEnemy, ModifyInfo& mi) { NewAlignValue = OldAlignValue + NewAlignValue; if (OldAlignValue != NewAlignValue) { - // Ŷ ٲٰ ˷ش. + // ÆÐŶ¿¡´Ù ¼ºÇâÀÌ ¹Ù²î¾ú´Ù°í ¾Ë·ÁÁØ´Ù. mi.addShortData(MODIFY_ALIGNMENT, NewAlignValue); WORD AlignmentSaveCount = pVampire->getAlignmentSaveCount(); @@ -3936,14 +3936,14 @@ void increaseAlignment(Creature* pCreature, Creature* pEnemy, ModifyInfo& mi) { } else if (pCreature->isOusters()) { Ousters* pOusters = dynamic_cast(pCreature); - // о´. + // ÇöÀç ¼ºÇâ °ªÀ» Àоî¿Â´Ù. OldAlignValue = pOusters->getAlignment(); - // 0̻ 쿡 ͸ ׿ ȭ . + // ¼ºÇâÀÌ 0ÀÌ»óÀÎ °æ¿ì¿¡´Â ¸ó½ºÅ͸¦ Á׿©µµ ¼ºÇâÀÇ º¯È­°¡ ¾ø´Ù. if (OldAlignValue > 0) return; - // ö ġ Ѵ. + // ¿Ã¶ó°¥ ¼ºÇâÀÇ ¼öÄ¡¸¦ °è»êÇÑ´Ù. NewAlignValue = 0; if (pEnemy->isMonster()) { Monster* pMonster = dynamic_cast(pEnemy); @@ -3964,7 +3964,7 @@ void increaseAlignment(Creature* pCreature, Creature* pEnemy, ModifyInfo& mi) { NewAlignValue = OldAlignValue + NewAlignValue; if (OldAlignValue != NewAlignValue) { - // Ŷ ٲٰ ˷ش. + // ÆÐŶ¿¡´Ù ¼ºÇâÀÌ ¹Ù²î¾ú´Ù°í ¾Ë·ÁÁØ´Ù. mi.addShortData(MODIFY_ALIGNMENT, NewAlignValue); WORD AlignmentSaveCount = pOusters->getAlignmentSaveCount(); @@ -3978,7 +3978,7 @@ void increaseAlignment(Creature* pCreature, Creature* pEnemy, ModifyInfo& mi) { } } - // ܰ谡 ٲ ٸ 鿡Ե ˷ Ѵ. by sigi. 2002.1.6 + // ¼ºÇ⠴ܰ谡 ¹Ù²î¸é ´Ù¸¥ »ç¶÷µé¿¡°Ôµµ ¾Ë·ÁÁà¾ß ÇÑ´Ù. by sigi. 2002.1.6 Alignment beforeAlignment = g_pAlignmentManager->getAlignmentType(OldAlignValue); Alignment afterAlignment = g_pAlignmentManager->getAlignmentType(NewAlignValue); @@ -3995,21 +3995,21 @@ void increaseAlignment(Creature* pCreature, Creature* pEnemy, ModifyInfo& mi) { ////////////////////////////////////////////////////////////////////////////// -// Ƽ ̾ ġ Լ +// ÆÄƼ °ü·Ã ½½·¹ÀÌ¾î °æÇèÄ¡ °è»ê ÇÔ¼ö ////////////////////////////////////////////////////////////////////////////// void shareAttrExp(Slayer* pSlayer, Damage_t Damage, BYTE STRMultiplier, BYTE DEXMultiplier, BYTE INTMultiplier, ModifyInfo& _ModifyInfo) { Assert(pSlayer != NULL); - // PK ȿ ġ ʴ´. + // PKÁ¸ ¾È¿¡¼­´Â °æÇèÄ¡¸¦ ÁÖÁö ¾Ê´Â´Ù. if (g_pPKZoneInfoManager->isPKZone(pSlayer->getZoneID())) return; - // ̳ ȿ ġ ʴ´. + // ´ÙÀ̳ª¹Í Á¸ ¾È¿¡¼­´Â °æÇèÄ¡¸¦ ÁÖÁö ¾Ê´Â´Ù. if (pSlayer->getZone() != NULL && pSlayer->getZone()->isDynamicZone()) return; - // ȭ ġ ޴´. + // À¯·áÈ­ Á¸¿¡¼­´Â °æÇèÄ¡¸¦ ´õ ¹Þ´Â´Ù. GamePlayer* pGamePlayer = dynamic_cast(pSlayer->getPlayer()); Assert(pGamePlayer != NULL); @@ -4031,34 +4031,34 @@ void shareAttrExp(Slayer* pSlayer, Damage_t Damage, BYTE STRMultiplier, BYTE DEX int PartyID = pSlayer->getPartyID(); if (PartyID != 0) { - // Ƽ ԵǾ ִٸ Ƽ Ŵ - // Ƽ ġ Ѵ. + // ÆÄƼ¿¡ °¡ÀԵǾî ÀÖ´Ù¸é ·ÎÄà ÆÄƼ ¸Å´ÏÀú¸¦ ÅëÇØ + // ÁÖÀ§ÀÇ ÆÄƼ¿øµé°ú °æÇèÄ¡¸¦ °øÀ¯ÇÑ´Ù. LocalPartyManager* pLPM = pSlayer->getLocalPartyManager(); Assert(pLPM != NULL); pLPM->shareAttrExp(PartyID, pSlayer, Damage, STRMultiplier, DEXMultiplier, INTMultiplier, _ModifyInfo); } else { - // Ƽ ԵǾ ʴٸ ȥ ö󰣴. + // ÆÄƼ¿¡ °¡ÀԵǾîÀÖÁö ¾Ê´Ù¸é È¥ÀÚ ¿Ã¶ó°£´Ù. divideAttrExp(pSlayer, Damage, STRMultiplier, DEXMultiplier, INTMultiplier, _ModifyInfo); } } ////////////////////////////////////////////////////////////////////////////// -// Ƽ ̾ ġ Լ +// ÆÄƼ °ü·Ã ¹ìÆÄÀÌ¾î °æÇèÄ¡ °è»ê ÇÔ¼ö ////////////////////////////////////////////////////////////////////////////// void shareVampExp(Vampire* pVampire, Exp_t Point, ModifyInfo& _ModifyInfo) { Assert(pVampire != NULL); if (Point <= 0) return; - // PK ȿ ġ ʴ´. + // PKÁ¸ ¾È¿¡¼­´Â °æÇèÄ¡¸¦ ¹ÞÁö ¾Ê´Â´Ù. if (g_pPKZoneInfoManager->isPKZone(pVampire->getZoneID())) return; - // ̳ ȿ ġ ÷ش. + // ´ÙÀ̳ª¹Í Á¸ ¾È¿¡¼­´Â °æÇèÄ¡¸¦ ¾È ¿Ã·ÁÁØ´Ù. if (pVampire->getZone() != NULL && pVampire->getZone()->isDynamicZone()) return; - // ȭ ġ ޴´. + // À¯·áÈ­ Á¸¿¡¼­´Â °æÇèÄ¡¸¦ ´õ ¹Þ´Â´Ù. GamePlayer* pGamePlayer = dynamic_cast(pVampire->getPlayer()); Assert(pGamePlayer != NULL); @@ -4075,34 +4075,34 @@ void shareVampExp(Vampire* pVampire, Exp_t Point, ModifyInfo& _ModifyInfo) { int PartyID = pVampire->getPartyID(); if (PartyID != 0) { - // Ƽ ԵǾ ִٸ Ƽ Ŵ - // Ƽ ġ Ѵ. + // ÆÄƼ¿¡ °¡ÀԵǾî ÀÖ´Ù¸é ·ÎÄà ÆÄƼ ¸Å´ÏÀú¸¦ ÅëÇØ + // ÁÖÀ§ÀÇ ÆÄƼ¿øµé°ú °æÇèÄ¡¸¦ °øÀ¯ÇÑ´Ù. LocalPartyManager* pLPM = pVampire->getLocalPartyManager(); Assert(pLPM != NULL); pLPM->shareVampireExp(PartyID, pVampire, Point, _ModifyInfo); } else { - // Ƽ ԵǾ ʴٸ ȥ ö󰣴. + // ÆÄƼ¿¡ °¡ÀԵǾîÀÖÁö ¾Ê´Ù¸é È¥ÀÚ ¿Ã¶ó°£´Ù. increaseVampExp(pVampire, Point, _ModifyInfo); } } ////////////////////////////////////////////////////////////////////////////// -// Ƽ ƿ콺ͽ ġ Լ +// ÆÄƼ °ü·Ã ¾Æ¿ì½ºÅͽº °æÇèÄ¡ °è»ê ÇÔ¼ö ////////////////////////////////////////////////////////////////////////////// void shareOustersExp(Ousters* pOusters, Exp_t Point, ModifyInfo& _ModifyInfo) { Assert(pOusters != NULL); if (Point <= 0) return; - // PK ȿ ġ ʴ´. + // PKÁ¸ ¾È¿¡¼­´Â °æÇèÄ¡¸¦ ¹ÞÁö ¾Ê´Â´Ù. if (g_pPKZoneInfoManager->isPKZone(pOusters->getZoneID())) return; - // ̳ ȿ ġ ÷ش. + // ´ÙÀ̳ª¹Í Á¸ ¾È¿¡¼­´Â °æÇèÄ¡¸¦ ¾È ¿Ã·ÁÁØ´Ù. if (pOusters->getZone() != NULL && pOusters->getZone()->isDynamicZone()) return; - // ȭ ġ ޴´. + // À¯·áÈ­ Á¸¿¡¼­´Â °æÇèÄ¡¸¦ ´õ ¹Þ´Â´Ù. GamePlayer* pGamePlayer = dynamic_cast(pOusters->getPlayer()); Assert(pGamePlayer != NULL); @@ -4116,13 +4116,13 @@ void shareOustersExp(Ousters* pOusters, Exp_t Point, ModifyInfo& _ModifyInfo) { int PartyID = pOusters->getPartyID(); if (PartyID != 0) { - // Ƽ ԵǾ ִٸ Ƽ Ŵ - // Ƽ ġ Ѵ. + // ÆÄƼ¿¡ °¡ÀԵǾî ÀÖ´Ù¸é ·ÎÄà ÆÄƼ ¸Å´ÏÀú¸¦ ÅëÇØ + // ÁÖÀ§ÀÇ ÆÄƼ¿øµé°ú °æÇèÄ¡¸¦ °øÀ¯ÇÑ´Ù. LocalPartyManager* pLPM = pOusters->getLocalPartyManager(); Assert(pLPM != NULL); pLPM->shareOustersExp(PartyID, pOusters, Point, _ModifyInfo); } else { - // Ƽ ԵǾ ʴٸ ȥ ö󰣴. + // ÆÄƼ¿¡ °¡ÀԵǾîÀÖÁö ¾Ê´Ù¸é È¥ÀÚ ¿Ã¶ó°£´Ù. increaseOustersExp(pOusters, Point, _ModifyInfo); } } @@ -4133,28 +4133,28 @@ void shareOustersExp(Ousters* pOusters, Exp_t Point, ModifyInfo& _ModifyInfo) { Attr_t CurSTR = pSlayer->getSTR( ATTR_BASIC ); - // exp level ɷġ ÷ش. + // exp level°ú ´É·ÂÄ¡¸¦ ¿Ã·ÁÁØ´Ù. CurSTR--; pSlayer->setSTR(CurSTR, ATTR_BASIC); //_ModifyInfo.addLongData(MODIFY_BASIC_STR, CurSTR); - // STRInfo ޾ƿ´. + // ´ÙÀ½ ·¹º§ÀÇ STRInfo¸¦ ¹Þ¾Æ¿Â´Ù. STRBalanceInfo* pAfterSTRInfo = g_pSTRBalanceInfoManager->getSTRBalanceInfo(CurSTR); - // STRInfo ޾ƿ´. + // ÀÌÀü ·¹º§ÀÇ STRInfo¸¦ ¹Þ¾Æ¿Â´Ù. // STRBalanceInfo* pBeforeSTRInfo = g_pSTRBalanceInfoManager->getSTRBalanceInfo(CurSTR-1); - // ο ǥ ġ Ѵ. + // »õ·Î¿î ¸ñÇ¥ °æÇèÄ¡¸¦ ¼ÂÆÃÇØ Áà¾ß ÇÑ´Ù. Exp_t NewGoalExp = pAfterSTRInfo->getGoalExp(); // Exp_t NewExp = pBeforeSTRInfo->getAccumExp(); pSlayer->setSTRGoalExp(NewGoalExp); // pSlayer->setSTRExp(NewExp); - // DB ö ɷġ Ѵ. + // DB¿¡ ¿Ã¶ó°£ ´É·ÂÄ¡¸¦ ÀúÀåÇÑ´Ù. msg1 << "STR = " << (int)CurSTR << ", STRGoalExp = " << NewGoalExp; pSlayer->tinysave(msg1.toString()); -// cout << " ϴ." << endl; +// cout << "ÈûÀ» ³·Ãä´Ï´Ù." << endl; } void decreaseINT(Slayer* pSlayer) @@ -4163,28 +4163,28 @@ void decreaseINT(Slayer* pSlayer) Attr_t CurINT = pSlayer->getINT( ATTR_BASIC ); - // exp level ɷġ ÷ش. + // exp level°ú ´É·ÂÄ¡¸¦ ¿Ã·ÁÁØ´Ù. CurINT--; pSlayer->setINT(CurINT, ATTR_BASIC); //_ModifyInfo.addLongData(MODIFY_BASIC_INT, CurINT); - // INTInfo ޾ƿ´. + // ´ÙÀ½ ·¹º§ÀÇ INTInfo¸¦ ¹Þ¾Æ¿Â´Ù. INTBalanceInfo* pAfterINTInfo = g_pINTBalanceInfoManager->getINTBalanceInfo(CurINT); - // INTInfo ޾ƿ´. + // ÀÌÀü ·¹º§ÀÇ INTInfo¸¦ ¹Þ¾Æ¿Â´Ù. // INTBalanceInfo* pBeforeINTInfo = g_pINTBalanceInfoManager->getINTBalanceInfo(CurINT-1); - // ο ǥ ġ Ѵ. + // »õ·Î¿î ¸ñÇ¥ °æÇèÄ¡¸¦ ¼ÂÆÃÇØ Áà¾ß ÇÑ´Ù. Exp_t NewGoalExp = pAfterINTInfo->getGoalExp(); // Exp_t NewExp = pBeforeINTInfo->getAccumExp(); pSlayer->setINTGoalExp(NewGoalExp); // pSlayer->setINTExp(NewExp); - // DB ö ɷġ Ѵ. + // DB¿¡ ¿Ã¶ó°£ ´É·ÂÄ¡¸¦ ÀúÀåÇÑ´Ù. msg1 << "INTE = " << (int)CurINT << ", INTGoalExp = " << NewGoalExp; pSlayer->tinysave(msg1.toString()); -// cout << "Ʈ ϴ." << endl; +// cout << "ÀÎÆ®¸¦ ³·Ãä´Ï´Ù." << endl; } void decreaseDEX(Slayer* pSlayer) @@ -4193,44 +4193,44 @@ void decreaseDEX(Slayer* pSlayer) Attr_t CurDEX = pSlayer->getDEX( ATTR_BASIC ); - // exp level ɷġ ÷ش. + // exp level°ú ´É·ÂÄ¡¸¦ ¿Ã·ÁÁØ´Ù. CurDEX--; pSlayer->setDEX(CurDEX, ATTR_BASIC); //_ModifyInfo.addLongData(MODIFY_BASIC_DEX, CurDEX); - // DEXInfo ޾ƿ´. + // ´ÙÀ½ ·¹º§ÀÇ DEXInfo¸¦ ¹Þ¾Æ¿Â´Ù. DEXBalanceInfo* pAfterDEXInfo = g_pDEXBalanceInfoManager->getDEXBalanceInfo(CurDEX); - // DEXInfo ޾ƿ´. + // ÀÌÀü ·¹º§ÀÇ DEXInfo¸¦ ¹Þ¾Æ¿Â´Ù. // DEXBalanceInfo* pBeforeDEXInfo = g_pDEXBalanceInfoManager->getDEXBalanceInfo(CurDEX-1); - // ο ǥ ġ Ѵ. + // »õ·Î¿î ¸ñÇ¥ °æÇèÄ¡¸¦ ¼ÂÆÃÇØ Áà¾ß ÇÑ´Ù. Exp_t NewGoalExp = pAfterDEXInfo->getGoalExp(); // Exp_t NewExp = pBeforeDEXInfo->getAccumExp(); pSlayer->setDEXGoalExp(NewGoalExp); // pSlayer->setDEXExp(NewExp); - // DB ö ɷġ Ѵ. + // DB¿¡ ¿Ã¶ó°£ ´É·ÂÄ¡¸¦ ÀúÀåÇÑ´Ù. msg1 << "DEX = " << (int)CurDEX << ", DEXGoalExp = " << NewGoalExp; pSlayer->tinysave(msg1.toString()); -// cout << " ϴ." << endl; +// cout << "µ¦½º¸¦ ³·Ãä´Ï´Ù." << endl; }*/ ////////////////////////////////////////////////////////////////////////////// -// ̾ ɷġ (STR, DEX, INT) ġ Ѵ. +// ½½·¹ÀÌ¾î ´É·ÂÄ¡ (STR, DEX, INT) °æÇèÄ¡¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// void divideAttrExp(Slayer* pSlayer, Damage_t Damage, BYTE STRMultiplier, BYTE DEXMultiplier, BYTE INTMultiplier, ModifyInfo& _ModifyInfo, int numPartyMember) { Assert(pSlayer != NULL); - // STR Ʈ ũ. + // STR Æ÷ÀÎÆ®°¡ Á¦ÀÏ Å©´Ù. if (STRMultiplier > DEXMultiplier && STRMultiplier > INTMultiplier) { pSlayer->divideAttrExp(ATTR_KIND_STR, Damage, _ModifyInfo); - // DEX Ʈ ũ. + // DEX Æ÷ÀÎÆ®°¡ Á¦ÀÏ Å©´Ù. } else if (DEXMultiplier > STRMultiplier && DEXMultiplier > INTMultiplier) { pSlayer->divideAttrExp(ATTR_KIND_DEX, Damage, _ModifyInfo); - // INT Ʈ ũ. + // INT Æ÷ÀÎÆ®°¡ Á¦ÀÏ Å©´Ù. } else if (INTMultiplier > STRMultiplier && INTMultiplier > DEXMultiplier) { pSlayer->divideAttrExp(ATTR_KIND_INT, Damage, _ModifyInfo); } @@ -4239,14 +4239,14 @@ void divideAttrExp(Slayer* pSlayer, Damage_t Damage, BYTE STRMultiplier, BYTE DE /* SkillLevel_t MaxDomainLevel = pSlayer->getHighestSkillDomainLevel(); Attr_t TotalAttr = pSlayer->getTotalAttr( ATTR_BASIC ); - Attr_t TotalAttrBound = 0; // ɷġ - Attr_t AttrBound = 0; // ɷġ - Attr_t OneAttrExpBound = 0; // ɷġ ġ ִ ɷġ 谪 + Attr_t TotalAttrBound = 0; // ´É·ÂÄ¡ ÃÑÇÕ Á¦ÇÑ + Attr_t AttrBound = 0; // ´ÜÀÏ ´É·ÂÄ¡ Á¦ÇÑ + Attr_t OneAttrExpBound = 0; // ÇÑ °³ÀÇ ´É·ÂÄ¡¿¡¸¸ °æÇèÄ¡ ÁÖ´Â ´É·ÂÄ¡ ÃÑÇÕ °æ°è°ª - // ̾ ɷġ 100 300 ȴ.(ó 50, 200, 50 ..) - ġ ʴ´. - // ׸ 100 Ѿ ٽ ɷġ ġ Ǿ ɷġ ö󰡱 Ѵ. - // 100 Ʒ  ɷġ 300 Ѿ 300 ʴ´. + // ½½·¹ÀÌ¾î ´É·ÂÄ¡´Â µµ¸ÞÀÎ ·¹º§ 100ÀÌÀü¿¡´Â ÃÑÇÕ 300À¸·Î Á¦ÇÑ µÈ´Ù.(±âÁ¸Ã³·³ 50, 200, 50 À¸·Î..)¶ÇÇÑ ±× ÀÌÈÄÀÇ + °æÇèÄ¡´Â ´©ÀûµÇÁö ¾Ê´Â´Ù. + // ±×¸®°í µµ¸ÞÀÎ ·¹º§ ÀÌ 100À» ³Ñ¾î¼­¸é ´Ù½Ã ´É·ÂÄ¡ °æÇèÄ¡°¡ ´©ÀûµÇ¾î ´É·ÂÄ¡°¡ ¿Ã¶ó°¡±â ½ÃÀÛÇÑ´Ù. + // µµ¸ÞÀÎ ·¹º§ÀÌ 100 ¾Æ·¡·Î µµ·Î ¶³¾îÁ³¾îµµ ´É·ÂÄ¡ ÃÑÇÕÀÌ 300À» ³Ñ¾úÀ» °æ¿ì 300ÀÇ Á¦ÇÑÀ» ¹ÞÁö ¾Ê´Â´Ù. if ( MaxDomainLevel <= SLAYER_BOUND_LEVEL && TotalAttr <= SLAYER_BOUND_ATTR_SUM ) { @@ -4261,14 +4261,14 @@ void divideAttrExp(Slayer* pSlayer, Damage_t Damage, BYTE STRMultiplier, BYTE DE OneAttrExpBound = SLAYER_ONE_EXP_ATTR; // 400 } - // ̾ ɷġ Ѵ. + // ÇöÀçÀÇ ½½·¹ÀÌ¾î ´É·ÂÄ¡¸¦ ÀúÀåÇÑ´Ù. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); - // ð뿡 ö󰡴 ġ ޶. + // ½Ã°£´ë¿¡ µû¶ó ¿Ã¶ó°¡´Â °æÇèÄ¡°¡ ´Þ¶óÁø´Ù. Damage = (Damage_t)getPercentValue(Damage, AttrExpTimebandFactor[getZoneTimeband(pSlayer->getZone())]); - // VariableManager Pointġ Ѵ. + // VariableManager¿¡ ÀÇÇÑ PointÁõ°¡Ä¡¸¦ °è»êÇÑ´Ù. if(g_pVariableManager->getExpRatio()>100 && g_pVariableManager->getEventActivate() == 1) Damage = getPercentValue(Damage, g_pVariableManager->getExpRatio()); @@ -4276,31 +4276,31 @@ void divideAttrExp(Slayer* pSlayer, Damage_t Damage, BYTE STRMultiplier, BYTE DE Exp_t DEXPoint = max(1, Damage * DEXMultiplier / 10); Exp_t INTPoint = max(1, Damage * INTMultiplier / 10); - // ɷġ ޴´. + // ÇöÀç ¼ø¼ö ´É·ÂÄ¡¸¦ ¹Þ´Â´Ù. Attr_t CurSTR = pSlayer->getSTR(ATTR_BASIC); Attr_t CurDEX = pSlayer->getDEX(ATTR_BASIC); Attr_t CurINT = pSlayer->getINT(ATTR_BASIC); Attr_t CurSUM = CurSTR + CurDEX + CurINT; - // ɷ 200 ̻ 迭 ɷ¿ ٷ ȴ. - // ϰ ȴ. - // ̷ Ǿ, 迭 ϴٸ ɷġ Ӱ ø ְ ȴ. + // ´É·Â ÇÕÀÌ 200 ÀÌ»óÀÎ »ç¶÷µéÀº ¾²´Â °è¿­¿¡ µû¶ó ´É·Â¿¡ ¹Ù·Î Àû¿ë µÈ´Ù. + // ³ª¸ÓÁö ¹èºÐÀº ¹«½Ã ÇÏ°Ô µÈ´Ù. + // ÀÌ·¸°Ô µÇ¾úÀ»¶§, °è¿­·¾¿¡¸¸ ÇÁ¸® ÇÏ´Ù¸é ´É·ÂÄ¡¸¦ ¾î´ÀÁ¤µµ ÀÚÀ¯·Ó°Ô ¿Ã¸± ¼ö ÀÖ°Ô µÈ´Ù. if( CurSUM >= OneAttrExpBound ) { - // Ƽö̾ ū Ѵ. - // STR Ʈ ũ. + // ¾î´À ¸ÖƼÇöóÀ̾ °¡Àå Å«Áö Á¶»ç ÇÑ´Ù. + // STR Æ÷ÀÎÆ®°¡ Á¦ÀÏ Å©´Ù. if( STRMultiplier > DEXMultiplier && STRMultiplier > INTMultiplier ) { DEXPoint = 0; DEXMultiplier = 0; INTPoint = 0; INTMultiplier = 0; - // DEX Ʈ ũ. + // DEX Æ÷ÀÎÆ®°¡ Á¦ÀÏ Å©´Ù. } else if ( DEXMultiplier > STRMultiplier && DEXMultiplier > INTMultiplier ) { STRPoint = 0; STRMultiplier = 0; INTPoint = 0; INTMultiplier = 0; - // INT Ʈ ũ. + // INT Æ÷ÀÎÆ®°¡ Á¦ÀÏ Å©´Ù. } else if ( INTMultiplier > STRMultiplier && INTMultiplier > DEXMultiplier ) { STRPoint = 0; STRMultiplier = 0; @@ -4309,31 +4309,31 @@ void divideAttrExp(Slayer* pSlayer, Damage_t Damage, BYTE STRMultiplier, BYTE DE } } - // ġ + // Èû °æÇèÄ¡ Exp_t CurSTRGoalExp = max(0, (int)(pSlayer->getSTRGoalExp() - STRPoint )); - // ġ + // µ¦½º °æÇèÄ¡ Exp_t CurDEXGoalExp = max(0, (int)(pSlayer->getDEXGoalExp() - DEXPoint )); - // Ʈ ġ + // ÀÎÆ® °æÇèÄ¡ Exp_t CurINTGoalExp = max(0, (int)(pSlayer->getINTGoalExp() - INTPoint)); - // STR, DEX, INT ġ ø. + // STR, DEX, INT °æÇèÄ¡¸¦ ¿Ã¸°´Ù. pSlayer->setSTRGoalExp(CurSTRGoalExp); pSlayer->setDEXGoalExp(CurDEXGoalExp); pSlayer->setINTGoalExp(CurINTGoalExp); bool bInitAll = false; - // ġ Ǿ ⺻ ɷġ ... + // °æÇèÄ¡°¡ ´©ÀûµÇ¾î ±âº» ´É·ÂÄ¡°¡ »ó½ÂÇÒ ¶§´Ù... if ( STRMultiplier != 0 && CurSTRGoalExp == 0 && CurSTR < AttrBound ) { bool isUp = true; - // ɷġ 200 Ѿ ϴ . + // ´É·ÂÄ¡ ÃÑÇÕÀÌ 200À» ³Ñ¾î°¥·Á°í ÇÏ´Â °æ¿ì. if (CurSTR + CurDEX + CurINT >= TotalAttrBound ) { isUp= true; - // DEX INT Ʈ, DEX Ʈ. + // ÈûÀÌ ¿À¸¦ °æ¿ì DEX³ª INTÁß ³ôÀº°ÍÀ» ¶³¾îÆ®¸®°í, °°À» °æ¿ì DEX¸¦ ¶³¾îÆ®¸°´Ù. if (CurDEX >= CurINT) { decreaseDEX(pSlayer); @@ -4348,18 +4348,18 @@ void divideAttrExp(Slayer* pSlayer, Damage_t Damage, BYTE STRMultiplier, BYTE DE { StringStream msg1; - // exp level ɷġ ÷ش. + // exp level°ú ´É·ÂÄ¡¸¦ ¿Ã·ÁÁØ´Ù. CurSTR += 1; pSlayer->setSTR(CurSTR, ATTR_BASIC); - // ο STRInfo ޾ƿ´. + // »õ·Î¿î ·¹º§ÀÇ STRInfo¸¦ ¹Þ¾Æ¿Â´Ù. STRBalanceInfo* pNewSTRInfo = g_pSTRBalanceInfoManager->getSTRBalanceInfo(CurSTR); - // ο ǥ ġ Ѵ. + // »õ·Î¿î ¸ñÇ¥ °æÇèÄ¡¸¦ ¼ÂÆÃÇØ Áà¾ß ÇÑ´Ù. Exp_t NewGoalExp = pNewSTRInfo->getGoalExp(); pSlayer->setSTRGoalExp(NewGoalExp); - // DB ö ɷġ Ѵ. + // DB¿¡ ¿Ã¶ó°£ ´É·ÂÄ¡¸¦ ÀúÀåÇÑ´Ù. msg1 << "STR = " << (int)CurSTR << ", STRGoalExp = " << NewGoalExp; pSlayer->tinysave(msg1.toString()); @@ -4368,17 +4368,17 @@ void divideAttrExp(Slayer* pSlayer, Damage_t Damage, BYTE STRMultiplier, BYTE DE } } - // ġ Ǿ ⺻ ɷġ ... + // °æÇèÄ¡°¡ ´©ÀûµÇ¾î ±âº» ´É·ÂÄ¡°¡ »ó½ÂÇÒ ¶§´Ù... if ( DEXMultiplier != 0 && CurDEXGoalExp == 0 && CurDEX < AttrBound ) { bool isUp = true; - // ɷġ 200 Ѿ ϴ . + // ´É·ÂÄ¡ ÃÑÇÕÀÌ 200À» ³Ñ¾î°¥·Á°í ÇÏ´Â °æ¿ì. if (CurSTR + CurDEX + CurINT >= TotalAttrBound ) { isUp= true; - // ø STR INT Ʈ, STR Ʈ. + // ¹ÎøÀÌ ¿À¸¦ °æ¿ì STR³ª INTÁß ³ôÀº°ÍÀ» ¶³¾îÆ®¸®°í, °°À» °æ¿ì STR¸¦ ¶³¾îÆ®¸°´Ù. if (CurSTR >= CurINT) { decreaseSTR(pSlayer); @@ -4393,18 +4393,18 @@ void divideAttrExp(Slayer* pSlayer, Damage_t Damage, BYTE STRMultiplier, BYTE DE { StringStream msg1; - // exp level ɷġ ÷ش. + // exp level°ú ´É·ÂÄ¡¸¦ ¿Ã·ÁÁØ´Ù. CurDEX += 1; pSlayer->setDEX(CurDEX, ATTR_BASIC); - // ο DEXInfo ޾ƿ´. + // »õ·Î¿î ·¹º§ÀÇ DEXInfo¸¦ ¹Þ¾Æ¿Â´Ù. DEXBalanceInfo* pNewDEXInfo = g_pDEXBalanceInfoManager->getDEXBalanceInfo(CurDEX); - // ο ǥ ġ Ѵ. + // »õ·Î¿î ¸ñÇ¥ °æÇèÄ¡¸¦ ¼ÂÆÃÇØ Áà¾ß ÇÑ´Ù. Exp_t NewGoalExp = pNewDEXInfo->getGoalExp(); pSlayer->setDEXGoalExp(NewGoalExp); - // DB ö ɷġ Ѵ. + // DB¿¡ ¿Ã¶ó°£ ´É·ÂÄ¡¸¦ ÀúÀåÇÑ´Ù. msg1 << "DEX = " << (int)CurDEX << ", DEXGoalExp = " << NewGoalExp; pSlayer->tinysave(msg1.toString()); @@ -4412,17 +4412,17 @@ void divideAttrExp(Slayer* pSlayer, Damage_t Damage, BYTE STRMultiplier, BYTE DE } } - // ġ Ǿ ⺻ ɷġ ... + // °æÇèÄ¡°¡ ´©ÀûµÇ¾î ±âº» ´É·ÂÄ¡°¡ »ó½ÂÇÒ ¶§´Ù... if ( INTMultiplier != 0 && CurINTGoalExp == 0 && CurINT < AttrBound ) { bool isUp = true; - // ɷġ 200 Ѿ ϴ . + // ´É·ÂÄ¡ ÃÑÇÕÀÌ 200À» ³Ñ¾î°¥·Á°í ÇÏ´Â °æ¿ì. if (CurSTR + CurDEX + CurINT >= TotalAttrBound ) { isUp= true; - // STR DEX Ʈ, STR Ʈ. + // Áö½ÄÀÌ ¿À¸¦ °æ¿ì STR³ª DEXÁß ³ôÀº°ÍÀ» ¶³¾îÆ®¸®°í, °°À» °æ¿ì STR¸¦ ¶³¾îÆ®¸°´Ù. if (CurSTR >= CurDEX) { decreaseSTR(pSlayer); @@ -4437,17 +4437,17 @@ void divideAttrExp(Slayer* pSlayer, Damage_t Damage, BYTE STRMultiplier, BYTE DE { StringStream msg1; - // exp level ɷġ ÷ش. + // exp level°ú ´É·ÂÄ¡¸¦ ¿Ã·ÁÁØ´Ù. CurINT += 1; pSlayer->setINT(CurINT, ATTR_BASIC); - // ο INTInfo ޾ƿ´. + // »õ·Î¿î ·¹º§ÀÇ INTInfo¸¦ ¹Þ¾Æ¿Â´Ù. INTBalanceInfo* pNewINTInfo = g_pINTBalanceInfoManager->getINTBalanceInfo(CurINT); - // ο ǥ ġ Ѵ. + // »õ·Î¿î ¸ñÇ¥ °æÇèÄ¡¸¦ ¼ÂÆÃÇØ Áà¾ß ÇÑ´Ù. Exp_t NewGoalExp = pNewINTInfo->getGoalExp(); pSlayer->setINTGoalExp(NewGoalExp); - // DB ö ɷġ Ѵ. + // DB¿¡ ¿Ã¶ó°£ ´É·ÂÄ¡¸¦ ÀúÀåÇÑ´Ù. msg1 << "INTE = " << (int)CurINT << ", INTGoalExp = " << NewGoalExp; pSlayer->tinysave(msg1.toString()); @@ -4456,13 +4456,13 @@ void divideAttrExp(Slayer* pSlayer, Damage_t Damage, BYTE STRMultiplier, BYTE DE } } - // Ŷ ٲ ͸ ԷѴ. - // ɷġ հ ѿ Ƿ ó ִ´ - by Bezz + // ÆÐŶ¿¡´Ù ¹Ù²ï µ¥ÀÌÅ͸¦ ÀÔ·ÂÇÑ´Ù. + // ´É·ÂÄ¡°¡ ÇÕ°è Á¦ÇÑ¿¡ ÀÇÇØ ³»·Á°¥ ¼öµµ ÀÖÀ¸¹Ç·Î ¸ðµç 󸮸¦ ÇÑ µÚ º¯°æÁ¤º¸¸¦ ³Ö´Â´Ù - by Bezz _ModifyInfo.addLongData(MODIFY_STR_EXP, pSlayer->getSTRGoalExp() );//CurSTRExp); _ModifyInfo.addLongData(MODIFY_DEX_EXP, pSlayer->getDEXGoalExp() );//CurDEXExp); _ModifyInfo.addLongData(MODIFY_INT_EXP, pSlayer->getINTGoalExp() );//CurINTExp); - // ö ġ DB Ѵ. + // ¿Ã¶ó°£ °æÇèÄ¡¸¦ DB¿¡ ÀúÀåÇÑ´Ù. WORD AttrExpSaveCount = pSlayer->getAttrExpSaveCount(); if (AttrExpSaveCount > ATTR_EXP_SAVE_PERIOD) { @@ -4478,15 +4478,15 @@ void divideAttrExp(Slayer* pSlayer, Damage_t Damage, BYTE STRMultiplier, BYTE DE pSlayer->setAttrExpSaveCount(AttrExpSaveCount); - // ɷġ ؼ ɷġ ش. + // ±âÁ¸ÀÇ ´É·ÂÄ¡¿Í ºñ±³Çؼ­ º¯°æµÈ ´É·ÂÄ¡¸¦ º¸³»ÁØ´Ù. if (bInitAll) { healCreatureForLevelUp(pSlayer, _ModifyInfo, &prev); - // Ʈ ش. by sigi. 2002.11.9 + // ·¹º§¾÷ ÀÌÆåÆ®µµ º¸¿©ÁØ´Ù. by sigi. 2002.11.9 sendEffectLevelUp( pSlayer ); - // ɷġ 40̰, ɺ̸ . by sigi. 2002.11.7 + // ´É·ÂÄ¡ ÇÕÀÌ 40À̰í, ¾ßÀü»ç·ÉºÎÀÌ¸é µýµ¥·Î º¸³½´Ù. by sigi. 2002.11.7 if (g_pVariableManager->isNewbieTransportToGuild()) { checkNewbieTransportToGuild(pSlayer); @@ -4496,39 +4496,39 @@ void divideAttrExp(Slayer* pSlayer, Damage_t Damage, BYTE STRMultiplier, BYTE DE ////////////////////////////////////////////////////////////////////////////// -// ̾ ġ Ѵ. +// ½½·¹ÀÌ¾î ±â¼ú °æÇèÄ¡¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// void increaseSkillExp(Slayer* pSlayer, SkillDomainType_t DomainType, SkillSlot* pSkillSlot, SkillInfo* pSkillInfo, ModifyInfo& _ModifyInfo) { Assert(pSlayer != NULL); Assert(pSkillSlot != NULL); Assert(pSkillInfo != NULL); - // Edit By Coffee 2007-4-16ȥתܲ + // Edit By Coffee 2007-4-16È¥µô¶þתºó¼¼Äܲ»ÄÜÉý¼¶ÎÊÌâ // if ( pSkillInfo->getLevel() >= 150 ) return; // end - // PK ȿ ġ ʴ´. + // PKÁ¸ ¾È¿¡¼­´Â °æÇèÄ¡¸¦ ÁÖÁö ¾Ê´Â´Ù. if (g_pPKZoneInfoManager->isPKZone(pSlayer->getZoneID())) return; - // ̳ ȿ ġ ʴ´. + // ´ÙÀ̳ª¹Í Á¸ ¾È¿¡¼­´Â °æÇèÄ¡¸¦ ÁÖÁö ¾Ê´Â´Ù. if (pSlayer->getZone() != NULL && pSlayer->getZone()->isDynamicZone()) return; - // NewLevel 쿡 ġ ÷ ʴ´. + // ¸¸¾à NewLevelÀÌ ÇöÀçÀÇ µµ¸ÞÀÎ ·¹º§¿¡¼­ ³ÑÀ» ¼ö ¾ø´Â °æ¿ì¿¡´Â °æÇèÄ¡¸¦ ¿Ã·ÁÁÖÁö ¾Ê´Â´Ù. Level_t CurrentLevel = pSkillSlot->getExpLevel(); - // ̾ ޾ƿ´. + // ÇöÀç ½½·¹À̾îÀÇ µµ¸ÞÀÎÀ» ¹Þ¾Æ¿Â´Ù. Level_t DomainLevel = pSlayer->getSkillDomainLevel(DomainType); - // ܰ踦 ޾ƿ´. + // µµ¸ÞÀÎÀÇ ´Ü°è¸¦ ¹Þ¾Æ¿Â´Ù. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(DomainLevel); - // ܰ迡 + 1 ܰ ޾ƿ´. + // ÇöÀç ´Ü°è¿¡¼­ + 1 ÇÑ ´Ü°èÀÇ Á¦ÇÑ ·¹º§À» ¹Þ¾Æ¿Â´Ù. Level_t LimitLevel = g_pSkillInfoManager->getLimitLevelByDomainGrade(SkillGrade(Grade + 1)); if (CurrentLevel < LimitLevel) { - // ġ Ѵ. + // °æÇèÄ¡¸¦ °è»êÇÑ´Ù. Exp_t MaxExp = pSkillInfo->getSubSkill(); Exp_t OldExp = pSkillSlot->getExp(); Exp_t NewExp; @@ -4542,7 +4542,7 @@ void increaseSkillExp(Slayer* pSlayer, SkillDomainType_t DomainType, SkillSlot* plusExp *= 2; } - // ġ ι + // °æÇèÄ¡ µÎ¹è if (isAffectExp2X()) plusExp *= 2; @@ -4556,7 +4556,7 @@ void increaseSkillExp(Slayer* pSlayer, SkillDomainType_t DomainType, SkillSlot* ulong longData = (((ulong)pSkillSlot->getSkillType()) << 16) | (ulong)(NewExp / 10); _ModifyInfo.addLongData(MODIFY_SKILL_EXP, longData); - // ̾ ߿ DB ؾ ̴. + // ÄüÆÄÀ̾î´Â ³ªÁß¿¡ DB¸¦ ¼öÁ¤ÇØ¾ß ÇÒ °ÍÀÌ´Ù. if (CurrentLevel != NewLevel) { pSkillSlot->setExpLevel(NewLevel); pSkillSlot->save(); @@ -4579,7 +4579,7 @@ void increaseSkillExp(Slayer* pSlayer, SkillDomainType_t DomainType, SkillSlot* ////////////////////////////////////////////////////////////////////////////// -// ̾ 迭 ġ Ѵ. +// ½½·¹ÀÌ¾î °è¿­ °æÇèÄ¡¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// bool increaseDomainExp(Slayer* pSlayer, SkillDomainType_t Domain, Exp_t Point, ModifyInfo& _ModifyInfo, Level_t EnemyLevel, int TargetNum) { @@ -4588,11 +4588,11 @@ bool increaseDomainExp(Slayer* pSlayer, SkillDomainType_t Domain, Exp_t Point, M if (pSlayer->isAdvanced()) return false; - // PK ȿ ġ ʴ´. + // PK Á¸ ¾È¿¡¼­´Â °æÇèÄ¡¸¦ ÁÖÁö ¾Ê´Â´Ù. if (g_pPKZoneInfoManager->isPKZone(pSlayer->getZoneID())) return false; - // ̳ ȿ ġ ʴ´. + // ´ÙÀ̳ª¹Í Á¸ ¾È¿¡¼­´Â °æÇèÄ¡¸¦ ÁÖÁö ¾Ê´Â´Ù. if (pSlayer->getZone() != NULL && pSlayer->getZone()->isDynamicZone()) return false; @@ -4624,8 +4624,8 @@ bool increaseDomainExp(Slayer* pSlayer, SkillDomainType_t Domain, Exp_t Point, M // cout << "after target Point : " << Point << endl; - // ̹ domain ´ ⸦ ִٰ ϰ.. - // type SkillPoint ٸ ش. + // ÀÌ¹Ì ÁöÁ¤µÈ domain¿¡ ¸Â´Â ¹«±â¸¦ µé°í ÀÖ´Ù°í °¡Á¤Çϰí.. + // ¹«±â type¿¡ µû¶ó¼­ SkillPoint¸¦ ´Ù¸£°Ô ÁØ´Ù. // by sigi. 2002.10.30 Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon != NULL) { @@ -4635,7 +4635,7 @@ bool increaseDomainExp(Slayer* pSlayer, SkillDomainType_t Domain, Exp_t Point, M } - // ȭ ġ ޴´. + // À¯·áÈ­ Á¸¿¡¼­´Â °æÇèÄ¡¸¦ ´õ ¹Þ´Â´Ù. GamePlayer* pGamePlayer = dynamic_cast(pSlayer->getPlayer()); Assert(pGamePlayer != NULL); @@ -4676,14 +4676,14 @@ bool increaseDomainExp(Slayer* pSlayer, SkillDomainType_t Domain, Exp_t Point, M } } - // VariableManager Pointġ Ѵ. + // VariableManager¿¡ ÀÇÇÑ PointÁõ°¡Ä¡¸¦ °è»êÇÑ´Ù. if (g_pVariableManager->getExpRatio() > 100 && g_pVariableManager->getEventActivate() == 1) Point = getPercentValue(Point, g_pVariableManager->getExpRatio()); if (pSlayer->isFlag(Effect::EFFECT_CLASS_BONUS_EXP)) Point *= 2; - // ġ ι + // °æÇèÄ¡ µÎ¹è if (isAffectExp2X()) Point *= 2; @@ -4693,9 +4693,9 @@ bool increaseDomainExp(Slayer* pSlayer, SkillDomainType_t Domain, Exp_t Point, M Exp_t NewGoalExp = 0; bool availiable = false; - // ִ ִ . + // ÇöÀç ·¹º§¿¡¼­ ¹è¿ï ¼ö ÀÖ´Â ±â¼úÀÌ ÀÖ´ÂÁö º»´Ù. if (LearnSkillType != 0) { - // ִ ְ ̹ ¶ Domain ġ ÷ش. + // ¹è¿ï ¼ö ÀÖ´Â ±â¼úÀÌ ÀÖ°í ÀÌ¹Ì ¹è¿î »óŶó¸é Domain °æÇèÄ¡¸¦ ¿Ã·ÁÁØ´Ù. if (pSlayer->hasSkill(LearnSkillType)) { availiable = true; } @@ -4706,64 +4706,64 @@ bool increaseDomainExp(Slayer* pSlayer, SkillDomainType_t Domain, Exp_t Point, M if (availiable) { bool isLevelUp = false; - // ð뿡 ö󰡴 ġ ޶. + // ½Ã°£´ë¿¡ µû¶ó ¿Ã¶ó°¡´Â °æÇèÄ¡°¡ ´Þ¶óÁø´Ù. Point = (Exp_t)getPercentValue(Point, DomainExpTimebandFactor[getZoneTimeband(pSlayer->getZone())]); - // cout << pSlayer->getName() << " " << (int)Domain << " ġ " << Point << "ŭ ݴϴ." << + // cout << pSlayer->getName() << "¿¡°Ô " << (int)Domain << " µµ¸ÞÀÎÀÇ °æÇèÄ¡¸¦ " << Point << "¸¸Å­ ÁÝ´Ï´Ù." << // endl; - // ڵ + // º¸»ó¿ë ÄÚµå // Point = max(2, (int)getPercentValue(Point, 150)); - // ǥ ġ - // ġ + // µµ¸ÞÀÎ ¸ñÇ¥ °æÇèÄ¡ + // µµ¸ÞÀÎ ´©Àû °æÇèÄ¡ Exp_t GoalExp = pSlayer->getGoalExp(Domain); // Exp_t CurrentExp = pSlayer->getSkillDomainExp(Domain); - // ο ǥ ġ + // »õ·Î¿î ¸ñÇ¥ °æÇèÄ¡ NewGoalExp = max(0, (int)(GoalExp - Point)); - // ġ ǥġ پ ŭ ö󰡾 ̴. - // ο ġ + // ´©Àû °æÇèÄ¡¿¡´Â ¸ñÇ¥°æÇèÄ¡°¡ ÁÙ¾îµç ¸¸Å­ ¿Ã¶ó°¡¾ß Á¤»óÀÌ´Ù. + // »õ·Î¿î ´©Àû °æÇèÄ¡ // Exp_t DiffExp = max(0, (int)(GoalExp - NewGoalExp)); // Exp_t NewExp = 0; - // ְ ̶ ġ δ. + // ·¹º§ÀÌ ÃÖ°í¿¡ ´ÞÇÑ »ç¶÷ÀÌ¶óµµ °æÇèÄ¡´Â ½×ÀδÙ. // if( DiffExp == 0 && CurDomainLevel >= SLAYER_MAX_DOMAIN_LEVEL ) { // NewExp = CurrentExp + Point; // } else { // NewExp = CurrentExp + DiffExp; // } - // ο ǥ ġ - // ο ġ + // »õ·Î¿î ¸ñÇ¥ °æÇèÄ¡ ¼ÂÆÃ + // »õ·Î¿î ´©Àû °æÇèÄ¡ ¼ÂÆÃ pSlayer->setGoalExp(Domain, NewGoalExp); // pSlayer->setSkillDomainExp(Domain, NewExp); - // cout << " ġ " << NewGoalExp << endl; + // cout << "³²Àº °æÇèÄ¡´Â " << NewGoalExp << endl; - // ǥ ġ 0 ̶, ִ ΰ ˻Ѵ. + // ¸ñÇ¥ °æÇèÄ¡°¡ 0 À̶ó¸é, ·¹º§¾÷À» ÇÒ ¼ö ÀÖ´Â »óÅÂÀΰ¡¸¦ °Ë»çÇÑ´Ù. if (NewGoalExp == 0 && CurDomainLevel != SLAYER_MAX_DOMAIN_LEVEL) { - // ÷ְ, ׿ ִٸ ִٴ ˷ش. + // µµ¸ÞÀÎ ·¹º§À» ¿Ã·ÁÁÖ°í, ±×¿¡ µû¸¥ ±â¼úÀ» ¹è¿ï ¼ö ÀÖ´Ù¸é ±â¼úÀ» ¹è¿ï ¼ö ÀÖ´Ù´Â °ÍÀ» ¾Ë·ÁÁØ´Ù. NewDomainLevel = CurDomainLevel + 1; - // ޴  ǥ ġ ϰ Ѵ. + // µµ¸ÞÀÎ ÀÎÆ÷ ¸Þ´ÏÁ®¸¦ ¸¸µé¾î¼­ ¸ñÇ¥ °æÇèÄ¡¸¦ ¼ÂÆÃÇÏ°í ·¹º§À» Àç ¼³Á¤ ÇÑ´Ù. NewGoalExp = g_pSkillDomainInfoManager->getDomainInfo((SkillDomain)Domain, NewDomainLevel)->getGoalExp(); pSlayer->setGoalExp(Domain, NewGoalExp); pSlayer->setSkillDomainLevel(Domain, NewDomainLevel); - // cout << "ؼ ġ " << NewGoalExp << endl; + // cout << "·¹º§¾÷ÇØ¼­ ³²Àº °æÇèÄ¡´Â " << NewGoalExp << endl; SkillType_t NewLearnSkillType = g_pSkillInfoManager->getSkillTypeByLevel(Domain, NewDomainLevel); - // ִ ִ . + // ÇöÀç ·¹º§¿¡¼­ ¹è¿ï ¼ö ÀÖ´Â ±â¼úÀÌ ÀÖ´ÂÁö º»´Ù. if (NewLearnSkillType != 0) { - // ִ ְ ̹ ¶ ִٴ Ŷ . + // ¹è¿ï ¼ö ÀÖ´Â ±â¼úÀÌ ÀÖ°í ÀÌ¹Ì ¹è¿ìÁö ¾ÊÀº »óŶó¸é ±â¼úÀ» ¹è¿ï ¼ö ÀÖ´Ù´Â ÆÐŶÀ» ³¯¸°´Ù. if (pSlayer->hasSkill(NewLearnSkillType) == NULL) { - // GCLearnSkillReady m_SkillType level up ֱ - // Ѵ. , Ŭ̾Ʈ ų ִ... + // GCLearnSkillReadyÀÇ m_SkillType¿¡ level upµÈ µµ¸ÞÀÎÀÇ °¡Àå ÃÖ±Ù + // ±â¼úÀ» ´ëÀÔÇÑ´Ù. Áï, Ŭ¶óÀÌ¾ðÆ® ±× ´ÙÀ½ ½ºÅ³À» ¹è¿ï¼ö ÀÖ´Ù... GCLearnSkillReady readyPacket; readyPacket.setSkillDomainType((SkillDomainType_t)Domain); // send packet @@ -4772,7 +4772,7 @@ bool increaseDomainExp(Slayer* pSlayer, SkillDomainType_t Domain, Exp_t Point, M } isLevelUp = true; - // cout << " ֽϴ." << endl; + // cout << "·¹º§¾÷ ÇÒ ¼ö ÀÖ½À´Ï´Ù." << endl; } /* if (DiffExp != 0) @@ -4790,8 +4790,8 @@ bool increaseDomainExp(Slayer* pSlayer, SkillDomainType_t Domain, Exp_t Point, M Level_t DomainLevelSum = pSlayer->getSkillDomainLevelSum(); - // Ǿ , 100 Ѵ´ٸ - // ߿ ߷ Ѵ. + // ·¹º§¾÷ÀÌ µÇ¾úÀ» °æ¿ì, µµ¸ÞÀÎ ÃÑÇÕÀÌ 100À» ³Ñ´Â´Ù¸é ÇöÀç µµ¸ÞÀÎÀ» Á¦¿ÜÇÑ + // µµ¸ÞÀÎ Áß¿¡¼­ °¡Àå ³ôÀº µµ¸ÞÀÎ ·¹º§À» ¶³¾î¶ß·Á¾ß ÇÑ´Ù. if (isLevelUp && DomainLevelSum > SLAYER_MAX_DOMAIN_LEVEL) { SDomain ds[SKILL_DOMAIN_VAMPIRE]; @@ -4800,10 +4800,10 @@ bool increaseDomainExp(Slayer* pSlayer, SkillDomainType_t Domain, Exp_t Point, M ds[i].DomainLevel = pSlayer->getSkillDomainLevel((SkillDomain)i); } - // ū ڸ ã´. + // ÇöÁ¦ µµ¸ÞÀÎÀ» Á¦¿ÜÇÑ °¡Àå Å« ¼ýÀÚ¸¦ ã´Â´Ù. stable_sort(ds, ds + SKILL_DOMAIN_VAMPIRE, isBig()); - // ϰ ִ Ʈİ ִ ̴. + // ¼ÒÆÃÀ» ÇÏ°í ³­ ´ÙÀ½ Á¦ÀÏ À§¿¡ ÀÖ´Â ½ºÆ®·°Ãİ¡ °¡Àå ³ôÀº ·¹º§À» °¡Áö°í ÀÖ´Â µµ¸ÞÀÎÀÌ´Ù. int j = 0; while (ds[j].DomainType == Domain) { j++; @@ -4813,38 +4813,38 @@ bool increaseDomainExp(Slayer* pSlayer, SkillDomainType_t Domain, Exp_t Point, M } } - // ᱹ ds[j] ΰ ̴. + // °á±¹ ds[j]ÀÇ °ªÀº ÇöÀç µµ¸ÞÀΰú °°Áö ¾ÊÀº °¡Àå ³ôÀº ·¹º§ÀÇ µµ¸ÞÀÎÀÌ´Ù. SkillDomainType_t DownDomainType = ds[j].DomainType; Level_t DownDomainLevel = ds[j].DomainLevel; - // cout << (int)DownDomainType << " ϴ." << endl; + // cout << (int)DownDomainType << "µµ¸ÞÀÎÀÇ µµ¸ÞÀÎ ·¹º§À» ³·Ãä´Ï´Ù." << endl; - // ο ִ ִٸ Disable Ų. + // ÇöÀç µµ¸ÞÀο¡¼­ ¹è¿ï ¼ö ÀÖ´Â ±â¼úÀÌ ÀÖ´Ù¸é Disable ½ÃŲ´Ù. SkillType_t eraseSkillType = g_pSkillInfoManager->getSkillTypeByLevel(DownDomainType, DownDomainLevel); SkillSlot* pESkillSlot = pSlayer->hasSkill(eraseSkillType); if (pESkillSlot != NULL) { pESkillSlot->setDisable(); } - // Ʈ. + // µµ¸ÞÀÎÀÇ ·¹º§À» ¶³¾îÆ®¸°´Ù. DownDomainLevel--; - // ٿ Ѵ. + // ´Ù¿î µµ¸ÞÀÎÀÇ ·¹º§À» ¼ÂÆÃÇÑ´Ù. pSlayer->setSkillDomainLevel(DownDomainType, DownDomainLevel); - // ٿ ǥ ġ ãƿ´. - // ٿ ġ ãƿ´. + // ´Ù¿î µµ¸ÞÀÎÀÇ ¸ñÇ¥ °æÇèÄ¡¸¦ ã¾Æ¿Â´Ù. + // ´Ù¿î µµ¸ÞÀÎÀÇ ´©Àû °æÇèÄ¡¸¦ ã¾Æ¿Â´Ù. Exp_t DownDomainGoalExp = g_pSkillDomainInfoManager->getDomainInfo((SkillDomain)DownDomainType, DownDomainLevel)->getGoalExp(); // Exp_t DownDomainSumExp = g_pSkillDomainInfoManager->getDomainInfo((SkillDomain)DownDomainType, // DownDomainLevel)->getAccumExp(); - // ٿ ׷̵ ǥ ġ Ѵ. - // ٿ ׷̵ ǾǷ ´ ġ Ѵ. + // ´Ù¿î ±×·¹À̵åµÈ ¸ñÇ¥ °æÇèÄ¡·Î Àç ¼ÂÆÃÇÑ´Ù. + // ´Ù¿î ±×·¹ÀÌµå µÇ¾úÀ¸¹Ç·Î ±× ·¹º§¿¡ ¸Â´Â µµ¸ÞÀÎ °æÇèÄ¡¸¦ ¼ÂÆÃÇÑ´Ù. pSlayer->setGoalExp(DownDomainType, DownDomainGoalExp); // pSlayer->setSkillDomainExp(DownDomainType, DownDomainSumExp); - // cout << " : " << (int)DownDomainLevel << endl; - // cout << "ġ : " << (int)DownDomainGoalExp << endl; + // cout << "·¹º§ : " << (int)DownDomainLevel << endl; + // cout << "³²Àº°æÇèÄ¡ : " << (int)DownDomainGoalExp << endl; StringStream DownSave; if (DownDomainType == SKILL_DOMAIN_BLADE) { @@ -4873,7 +4873,7 @@ bool increaseDomainExp(Slayer* pSlayer, SkillDomainType_t Domain, Exp_t Point, M } else { } - // ߸ ̺Ѵ. + // ¶³¾î¶ß¸° µµ¸ÞÀÎ ·¹º§À» ¼¼À̺êÇÑ´Ù. pSlayer->tinysave(DownSave.toString()); } @@ -4984,10 +4984,10 @@ bool increaseDomainExp(Slayer* pSlayer, SkillDomainType_t Domain, Exp_t Point, M } else { } - // GrandMaster Effect ٿش. + // GrandMasterÀÎ °æ¿ì´Â Effect¸¦ ºÙ¿©ÁØ´Ù. // by sigi. 2002.11.8 if (isLevelUp && DomainLevelSum >= GRADE_GRAND_MASTER_LIMIT_LEVEL) { - // ϳ 100 Ѱ Effect پִٸ.. + // Çϳª°¡ 100·¾ ³Ñ°í ¾ÆÁ÷ Effect°¡ ¾È ºÙ¾îÀÖ´Ù¸é.. if (pSlayer->getHighestSkillDomainLevel() >= GRADE_GRAND_MASTER_LIMIT_LEVEL && !pSlayer->isFlag(Effect::EFFECT_CLASS_GRAND_MASTER_SLAYER)) { EffectGrandMasterSlayer* pEffect = new EffectGrandMasterSlayer(pSlayer); @@ -4995,7 +4995,7 @@ bool increaseDomainExp(Slayer* pSlayer, SkillDomainType_t Domain, Exp_t Point, M pSlayer->getEffectManager()->addEffect(pEffect); - // affect()ȿ.. Flagɾְ, broadcast ش. + // affect()¾È¿¡¼­.. Flag°É¾îÁÖ°í, ÁÖÀ§¿¡ broadcastµµ ÇØÁØ´Ù. pEffect->affect(); } else if (pSlayer->getHighestSkillDomainLevel() == 130 || pSlayer->getHighestSkillDomainLevel() == 150) { Effect* pEffect = pSlayer->findEffect(Effect::EFFECT_CLASS_GRAND_MASTER_SLAYER); @@ -5006,20 +5006,20 @@ bool increaseDomainExp(Slayer* pSlayer, SkillDomainType_t Domain, Exp_t Point, M pSlayer->setDomainExpSaveCount(DomainExpSaveCount); - // ߴٸ ü üش. + // ¹º°¡ ·¹º§¾÷Çß´Ù¸é ü·ÂÀ» ü¿öÁØ´Ù. if (isLevelUp) { SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); healCreatureForLevelUp(pSlayer, _ModifyInfo, &prev); - // Ʈ ش. by sigi. 2002.11.9 + // ·¹º§¾÷ ÀÌÆåÆ®µµ º¸¿©ÁØ´Ù. by sigi. 2002.11.9 sendEffectLevelUp(pSlayer); checkFreeLevelLimit(pSlayer); pSlayer->whenQuestLevelUpgrade(); - // cout << "ؼ Ʈ ϴ." << endl; + // cout << "·¹º§¾÷ÇØ¼­ ÀÌÆåÆ®µµ Âï¾îÁá½À´Ï´Ù." << endl; } } @@ -5027,7 +5027,7 @@ bool increaseDomainExp(Slayer* pSlayer, SkillDomainType_t Domain, Exp_t Point, M } ////////////////////////////////////////////////////////////////////////////// -// ̾ ġ Ѵ. +// ¹ìÆÄÀÌ¾î °æÇèÄ¡¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// void increaseVampExp(Vampire* pVampire, Exp_t Point, ModifyInfo& _ModifyInfo) { Assert(pVampire != NULL); @@ -5036,32 +5036,32 @@ void increaseVampExp(Vampire* pVampire, Exp_t Point, ModifyInfo& _ModifyInfo) { if (pVampire->isAdvanced()) return; - // ϶ ġ ȹ Ѵ. + // ¹ÚÁã »óÅÂÀ϶§´Â °æÇèÄ¡¸¦ ȹµæÇÏÁö ¸øÇÑ´Ù. if (pVampire->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT)) return; - // ̳ ȿ ġ ÷ش. + // ´ÙÀ̳ª¹Í Á¸ ¾È¿¡¼­´Â °æÇèÄ¡¸¦ ¾È ¿Ã·ÁÁØ´Ù. if (pVampire->getZone() != NULL && pVampire->getZone()->isDynamicZone()) return; Level_t curLevel = pVampire->getLevel(); - // VariableManager + // VariableManager¿¡ ÀÇÇÑ Áõ°¡ if (g_pVariableManager->getExpRatio() > 100 && g_pVariableManager->getEventActivate() == 1) Point = getPercentValue(Point, g_pVariableManager->getExpRatio()); if (pVampire->isFlag(Effect::EFFECT_CLASS_BONUS_EXP)) Point *= 2; - // ġ ι + // °æÇèÄ¡ µÎ¹è if (isAffectExp2X()) Point *= 2; - // cout << pVampire->getName() << " " << Point << "ŭ ġ ݴϴ." << endl; + // cout << pVampire->getName() << " ¿¡°Ô " << Point << "¸¸Å­ °æÇèÄ¡¸¦ ÁÝ´Ï´Ù." << endl; /* if (curLevel >= VAMPIRE_MAX_LEVEL) { - // Ѱ迡 ص ġ װ ش. + // ·¹º§ ÇѰ迡 µµ´ÞÇØµµ °æÇèÄ¡´Â ½×°Ô ÇØÁØ´Ù. // by sigi. 2002.8.31 Exp_t NewExp = pVampire->getExp() + Point; @@ -5087,7 +5087,7 @@ void increaseVampExp(Vampire* pVampire, Exp_t Point, ModifyInfo& _ModifyInfo) { Exp_t OldGoalExp = pVampire->getGoalExp(); Exp_t NewGoalExp = max(0, (int)(OldGoalExp - Point)); - // ġ ǥ ġ پ ŭ ÷ Ͽ Ѵ. + // ´©Àû °æÇèÄ¡¿¡´Â ¸ñÇ¥ °æÇèÄ¡°¡ ÁÙ¾îµç ¸¸Å­ Ç÷¯½º ÇÏ¿©¾ß ÇÑ´Ù. // Exp_t DiffGoalExp = max(0, (int)(OldGoalExp - NewGoalExp)); // Exp_t NewExp = OldExp + DiffGoalExp; @@ -5096,14 +5096,14 @@ void increaseVampExp(Vampire* pVampire, Exp_t Point, ModifyInfo& _ModifyInfo) { // _ModifyInfo.addLongData(MODIFY_VAMP_GOAL_EXP, NewGoalExp); - // ǥ ġ 0 ƴϰų, 115 ̶̻ ġ ϰ, - // ö ʴ´. + // ¸ñÇ¥ °æÇèÄ¡°¡ 0ÀÌ ¾Æ´Ï°Å³ª, ÇöÀç ·¹º§ÀÌ 115 ÀÌ»óÀ̶ó¸é °æÇèÄ¡¸¸ ÀúÀåÇϰí, + // ·¹º§Àº ¿Ã¶ó°¡Áö ¾Ê´Â´Ù. /* if (NewGoalExp > 0 || curLevel >= 115) { WORD ExpSaveCount = pVampire->getExpSaveCount(); - // ġ ̺ īƮ ġ ٴٸ ̺ϰ, - // īƮ ʱȭ ش. + // °æÇèÄ¡ ¼¼À̺ê Ä«¿îÆ®°¡ ÀÏÁ¤ ¼öÄ¡¿¡ ´Ù´Ù¸£¸é ¼¼À̺êÇϰí, + // Ä«¿îÆ®¸¦ ÃʱâÈ­½ÃÄÑ ÁØ´Ù. if (ExpSaveCount > VAMPIRE_EXP_SAVE_PERIOD) { StringStream attrsave; @@ -5116,16 +5116,16 @@ void increaseVampExp(Vampire* pVampire, Exp_t Point, ModifyInfo& _ModifyInfo) { pVampire->setExpSaveCount(ExpSaveCount); } - // ǥ ġ 0 ̶ ̴. + // ¸ñÇ¥ °æÇèÄ¡°¡ 0 À̶ó¸é ·¹º§ ¾÷ÀÌ´Ù. else*/ if (NewGoalExp > 0 || curLevel == VAMPIRE_MAX_LEVEL) { _ModifyInfo.addLongData(MODIFY_VAMP_GOAL_EXP, NewGoalExp); WORD ExpSaveCount = pVampire->getExpSaveCount(); - // ġ ̺ īƮ ġ ٴٸ ̺ϰ, - // īƮ ʱȭ ش. + // °æÇèÄ¡ ¼¼À̺ê Ä«¿îÆ®°¡ ÀÏÁ¤ ¼öÄ¡¿¡ ´Ù´Ù¸£¸é ¼¼À̺êÇϰí, + // Ä«¿îÆ®¸¦ ÃʱâÈ­½ÃÄÑ ÁØ´Ù. if (ExpSaveCount > VAMPIRE_EXP_SAVE_PERIOD) { - // cout << "ġ մϴ." << endl; + // cout << "°æÇèÄ¡¸¦ ÀúÀåÇÕ´Ï´Ù." << endl; StringStream attrsave; // attrsave << "Exp = " << NewExp << ", GoalExp = " << NewGoalExp; @@ -5138,8 +5138,8 @@ void increaseVampExp(Vampire* pVampire, Exp_t Point, ModifyInfo& _ModifyInfo) { pVampire->setExpSaveCount(ExpSaveCount); } else { - // cout << " öϴ." << endl; - // !! + // cout << "·¹º§ÀÌ ¿Ã¶ú½À´Ï´Ù." << endl; + // ·¹º§ ¾÷!! VAMPIRE_RECORD prev; pVampire->getVampireRecord(prev); @@ -5154,8 +5154,8 @@ void increaseVampExp(Vampire* pVampire, Exp_t Point, ModifyInfo& _ModifyInfo) { // if ((pVampire->getSTR(ATTR_BASIC) + pVampire->getDEX(ATTR_BASIC) + pVampire->getINT(ATTR_BASIC) + // pVampire->getBonus() - 60) < ((pVampire->getLevel() - 1) * 3)) { - // ġ ʰ, 3 Ǿ. - // 2001.12.12 輺 + // ·¹º§¿¡ »ó°üÄ¡ ¾Ê°í, ¹«Á¶°Ç 3À¸·Î º¯°æµÇ¾ú´Ù. + // 2001.12.12 ±è¼º¹Î bonus += 3; } @@ -5168,7 +5168,7 @@ void increaseVampExp(Vampire* pVampire, Exp_t Point, ModifyInfo& _ModifyInfo) { pVampire->setGoalExp(NextGoalExp); _ModifyInfo.addLongData(MODIFY_VAMP_GOAL_EXP, NextGoalExp); - // cout << " ġ " << NextGoalExp << " Դϴ." << endl; + // cout << "³²Àº °æÇèÄ¡´Â " << NextGoalExp << " ÀÔ´Ï´Ù." << endl; StringStream sav; sav << "Level = " @@ -5177,13 +5177,13 @@ void increaseVampExp(Vampire* pVampire, Exp_t Point, ModifyInfo& _ModifyInfo) { << ",GoalExp = " << (int)NextGoalExp << ",Bonus = " << (int)bonus; pVampire->tinysave(sav.toString()); - // ö ִ ٸ ִٰ ˸. + // ·¹º§ÀÌ ¿Ã¶ó¼­ »õ·Î ¹è¿ï ¼ö ÀÖ´Â ±â¼úÀÌ »ý°å´Ù¸é ±â¼úÀ» ¹è¿ï ¼ö ÀÖ´Ù°í ¾Ë¸°´Ù. SkillType_t NewLearnSkillType = g_pSkillInfoManager->getSkillTypeByLevel(SKILL_DOMAIN_VAMPIRE, curLevel); if (NewLearnSkillType != 0) { - // ִ ְ ̹ ¶ ִٴ Ŷ . + // ¹è¿ï ¼ö ÀÖ´Â ±â¼úÀÌ ÀÖ°í ÀÌ¹Ì ¹è¿ìÁö ¾ÊÀº »óŶó¸é ±â¼úÀ» ¹è¿ï ¼ö ÀÖ´Ù´Â ÆÐŶÀ» ³¯¸°´Ù. if (pVampire->hasSkill(NewLearnSkillType) == NULL) { - // GCLearnSkillReady m_SkillType level up ֱ - // Ѵ. , Ŭ̾Ʈ ų ִ... + // GCLearnSkillReadyÀÇ m_SkillType¿¡ level upµÈ µµ¸ÞÀÎÀÇ °¡Àå ÃÖ±Ù + // ±â¼úÀ» ´ëÀÔÇÑ´Ù. Áï, Ŭ¶óÀÌ¾ðÆ® ±× ´ÙÀ½ ½ºÅ³À» ¹è¿ï¼ö ÀÖ´Ù... GCLearnSkillReady readyPacket; readyPacket.setSkillDomainType(SKILL_DOMAIN_VAMPIRE); pVampire->getPlayer()->sendPacket(&readyPacket); @@ -5192,17 +5192,17 @@ void increaseVampExp(Vampire* pVampire, Exp_t Point, ModifyInfo& _ModifyInfo) { healCreatureForLevelUp(pVampire, _ModifyInfo, &prev); - // Ʈ ش. by sigi. 2002.11.9 + // ·¹º§¾÷ ÀÌÆåÆ®µµ º¸¿©ÁØ´Ù. by sigi. 2002.11.9 sendEffectLevelUp(pVampire); // by sigi. 2002.11.19 - // ڰ ƴϰų - // Ⱓ (Ȥ ɷġ over) ¥. + // À¯·á »ç¿ëÀÚ°¡ ¾Æ´Ï°Å³ª + // ¹«·á »ç¿ë±â°£ÀÌ ³²¾ÆÀÖÁö ¾ÊÀ¸¸é(ȤÀº ´É·ÂÄ¡ over) Â¥¸¥´Ù. checkFreeLevelLimit(pVampire); pVampire->whenQuestLevelUpgrade(); - // GrandMaster Effect ٿش. - // 100 Ѱ Effect پִٸ.. + // GrandMasterÀÎ °æ¿ì´Â Effect¸¦ ºÙ¿©ÁØ´Ù. + // 100·¾ ³Ñ°í ¾ÆÁ÷ Effect°¡ ¾È ºÙ¾îÀÖ´Ù¸é.. // by sigi. 2002.11.9 if (curLevel >= GRADE_GRAND_MASTER_LIMIT_LEVEL && !pVampire->isFlag(Effect::EFFECT_CLASS_GRAND_MASTER_VAMPIRE)) { @@ -5211,7 +5211,7 @@ void increaseVampExp(Vampire* pVampire, Exp_t Point, ModifyInfo& _ModifyInfo) { pVampire->getEffectManager()->addEffect(pEffect); - // affect()ȿ.. Flagɾְ, broadcast ش. + // affect()¾È¿¡¼­.. Flag°É¾îÁÖ°í, ÁÖÀ§¿¡ broadcastµµ ÇØÁØ´Ù. pEffect->affect(); } else if (curLevel == 130 || curLevel == 150) { Effect* pEffect = pVampire->findEffect(Effect::EFFECT_CLASS_GRAND_MASTER_VAMPIRE); @@ -5223,7 +5223,7 @@ void increaseVampExp(Vampire* pVampire, Exp_t Point, ModifyInfo& _ModifyInfo) { ////////////////////////////////////////////////////////////////////////////// -// ƿ콺ͽ ġ Ѵ. +// ¾Æ¿ì½ºÅͽº °æÇèÄ¡¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// void increaseOustersExp(Ousters* pOusters, Exp_t Point, ModifyInfo& _ModifyInfo) { Assert(pOusters != NULL); @@ -5234,29 +5234,29 @@ void increaseOustersExp(Ousters* pOusters, Exp_t Point, ModifyInfo& _ModifyInfo) Level_t curLevel = pOusters->getLevel(); - // ̳ ȿ ġ ÷ش. + // ´ÙÀ̳ª¹Í Á¸ ¾È¿¡¼­´Â °æÇèÄ¡¸¦ ¾È ¿Ã·ÁÁØ´Ù. if (pOusters->getZone() != NULL && pOusters->getZone()->isDynamicZone()) return; - // VariableManager + // VariableManager¿¡ ÀÇÇÑ Áõ°¡ if (g_pVariableManager->getExpRatio() > 100 && g_pVariableManager->getEventActivate() == 1) Point = getPercentValue(Point, g_pVariableManager->getExpRatio()); if (pOusters->isFlag(Effect::EFFECT_CLASS_BONUS_EXP)) Point *= 2; - // ġ ι + // °æÇèÄ¡ µÎ¹è if (isAffectExp2X()) Point *= 2; - // ð뿡 ö󰡴 ġ ޶. + // ½Ã°£´ë¿¡ µû¶ó ¿Ã¶ó°¡´Â °æÇèÄ¡°¡ ´Þ¶óÁø´Ù. Point = (Exp_t)getPercentValue(Point, DomainExpTimebandFactor[getZoneTimeband(pOusters->getZone())]); - // cout << pOusters->getName() << " " << Point << "ŭ ġ ݴϴ." << endl; + // cout << pOusters->getName() << " ¿¡°Ô " << Point << "¸¸Å­ °æÇèÄ¡¸¦ ÁÝ´Ï´Ù." << endl; /* if (curLevel >= OUSTERS_MAX_LEVEL) { - // Ѱ迡 ص ġ װ ش. + // ·¹º§ ÇѰ迡 µµ´ÞÇØµµ °æÇèÄ¡´Â ½×°Ô ÇØÁØ´Ù. // by sigi. 2002.8.31 Exp_t NewExp = pOusters->getExp() + Point; @@ -5282,7 +5282,7 @@ void increaseOustersExp(Ousters* pOusters, Exp_t Point, ModifyInfo& _ModifyInfo) Exp_t OldGoalExp = pOusters->getGoalExp(); Exp_t NewGoalExp = max(0, (int)(OldGoalExp - Point)); - // ġ ǥ ġ پ ŭ ÷ Ͽ Ѵ. + // ´©Àû °æÇèÄ¡¿¡´Â ¸ñÇ¥ °æÇèÄ¡°¡ ÁÙ¾îµç ¸¸Å­ Ç÷¯½º ÇÏ¿©¾ß ÇÑ´Ù. // Exp_t DiffGoalExp = max(0, (int)(OldGoalExp - NewGoalExp)); // Exp_t NewExp = OldExp + DiffGoalExp; @@ -5296,8 +5296,8 @@ void increaseOustersExp(Ousters* pOusters, Exp_t Point, ModifyInfo& _ModifyInfo) WORD ExpSaveCount = pOusters->getExpSaveCount(); _ModifyInfo.addLongData(MODIFY_OUSTERS_GOAL_EXP, NewGoalExp); - // ġ ̺ īƮ ġ ٴٸ ̺ϰ, - // īƮ ʱȭ ش. + // °æÇèÄ¡ ¼¼À̺ê Ä«¿îÆ®°¡ ÀÏÁ¤ ¼öÄ¡¿¡ ´Ù´Ù¸£¸é ¼¼À̺êÇϰí, + // Ä«¿îÆ®¸¦ ÃʱâÈ­½ÃÄÑ ÁØ´Ù. if (ExpSaveCount > OUSTERS_EXP_SAVE_PERIOD) { StringStream attrsave; attrsave << "GoalExp = " << NewGoalExp; @@ -5309,7 +5309,7 @@ void increaseOustersExp(Ousters* pOusters, Exp_t Point, ModifyInfo& _ModifyInfo) pOusters->setExpSaveCount(ExpSaveCount); } else { - // !! + // ·¹º§ ¾÷!! OUSTERS_RECORD prev; pOusters->getOustersRecord(prev); @@ -5344,13 +5344,13 @@ void increaseOustersExp(Ousters* pOusters, Exp_t Point, ModifyInfo& _ModifyInfo) << ",GoalExp = " << (int)NextGoalExp << ",Bonus = " << (int)bonus << ",SkillBonus = " << (int)skillBonus; pOusters->tinysave(sav.toString()); - // ö ִ ٸ ִٰ ˸. + // ·¹º§ÀÌ ¿Ã¶ó¼­ »õ·Î ¹è¿ï ¼ö ÀÖ´Â ±â¼úÀÌ »ý°å´Ù¸é ±â¼úÀ» ¹è¿ï ¼ö ÀÖ´Ù°í ¾Ë¸°´Ù. SkillType_t NewLearnSkillType = g_pSkillInfoManager->getSkillTypeByLevel(SKILL_DOMAIN_OUSTERS, curLevel); if (NewLearnSkillType != 0) { - // ִ ְ ̹ ¶ ִٴ Ŷ . + // ¹è¿ï ¼ö ÀÖ´Â ±â¼úÀÌ ÀÖ°í ÀÌ¹Ì ¹è¿ìÁö ¾ÊÀº »óŶó¸é ±â¼úÀ» ¹è¿ï ¼ö ÀÖ´Ù´Â ÆÐŶÀ» ³¯¸°´Ù. if (pOusters->hasSkill(NewLearnSkillType) == NULL) { - // GCLearnSkillReady m_SkillType level up ֱ - // Ѵ. , Ŭ̾Ʈ ų ִ... + // GCLearnSkillReadyÀÇ m_SkillType¿¡ level upµÈ µµ¸ÞÀÎÀÇ °¡Àå ÃÖ±Ù + // ±â¼úÀ» ´ëÀÔÇÑ´Ù. Áï, Ŭ¶óÀÌ¾ðÆ® ±× ´ÙÀ½ ½ºÅ³À» ¹è¿ï¼ö ÀÖ´Ù... GCLearnSkillReady readyPacket; readyPacket.setSkillDomainType(SKILL_DOMAIN_OUSTERS); pOusters->getPlayer()->sendPacket(&readyPacket); @@ -5359,17 +5359,17 @@ void increaseOustersExp(Ousters* pOusters, Exp_t Point, ModifyInfo& _ModifyInfo) healCreatureForLevelUp(pOusters, _ModifyInfo, &prev); - // Ʈ ش. by sigi. 2002.11.9 + // ·¹º§¾÷ ÀÌÆåÆ®µµ º¸¿©ÁØ´Ù. by sigi. 2002.11.9 sendEffectLevelUp(pOusters); // by sigi. 2002.11.19 - // ڰ ƴϰų - // Ⱓ (Ȥ ɷġ over) ¥. + // À¯·á »ç¿ëÀÚ°¡ ¾Æ´Ï°Å³ª + // ¹«·á »ç¿ë±â°£ÀÌ ³²¾ÆÀÖÁö ¾ÊÀ¸¸é(ȤÀº ´É·ÂÄ¡ over) Â¥¸¥´Ù. checkFreeLevelLimit(pOusters); pOusters->whenQuestLevelUpgrade(); - // GrandMaster Effect ٿش. - // 100 Ѱ Effect پִٸ.. + // GrandMasterÀÎ °æ¿ì´Â Effect¸¦ ºÙ¿©ÁØ´Ù. + // 100·¾ ³Ñ°í ¾ÆÁ÷ Effect°¡ ¾È ºÙ¾îÀÖ´Ù¸é.. // by sigi. 2002.11.9 if (curLevel >= GRADE_GRAND_MASTER_LIMIT_LEVEL && !pOusters->isFlag(Effect::EFFECT_CLASS_GRAND_MASTER_OUSTERS)) { @@ -5378,7 +5378,7 @@ void increaseOustersExp(Ousters* pOusters, Exp_t Point, ModifyInfo& _ModifyInfo) pOusters->getEffectManager()->addEffect(pEffect); - // affect()ȿ.. Flagɾְ, broadcast ش. + // affect()¾È¿¡¼­.. Flag°É¾îÁÖ°í, ÁÖÀ§¿¡ broadcastµµ ÇØÁØ´Ù. pEffect->affect(); } else if (curLevel == 130 || curLevel == 150) { Effect* pEffect = pOusters->findEffect(Effect::EFFECT_CLASS_GRAND_MASTER_OUSTERS); @@ -5390,21 +5390,21 @@ void increaseOustersExp(Ousters* pOusters, Exp_t Point, ModifyInfo& _ModifyInfo) ////////////////////////////////////////////////////////////////////////////// -// ̾ ̾ Ѵ. +// ½½·¹ÀÌ¾î ¹× ¹ìÆÄÀÌ¾î ¸í¼ºÀ» °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// void increaseFame(Creature* pCreature, uint amount) { if (pCreature == NULL) return; - // PK ȿ ÷ ʴ´. + // PKÁ¸ ¾È¿¡¼­´Â ¸í¼ºÀ» ¿Ã·ÁÁÖÁö ¾Ê´Â´Ù. if (g_pPKZoneInfoManager->isPKZone(pCreature->getZoneID())) return; - // ̳ ȿ ÷ ʴ´. + // ´ÙÀ̳ª¹Í Á¸¾È¿¡¼­´Â ¸í¼ºÀ» ¿Ã·ÁÁÖÁö ¾Ê´Â´Ù. if (pCreature->getZone() != NULL && pCreature->getZone()->isDynamicZone()) return; - // Ƽ Ѵٸ, Ƽ ڿ ö󰡴 ġ Ѵ. + // ·ÎÄà ÆÄƼ°¡ Á¸ÀçÇÑ´Ù¸é, ÆÄƼ¿øÀÇ ¼ýÀÚ¿¡ µû¶ó¼­ ¿Ã¶ó°¡´Â ¼öÄ¡°¡ º¯ÇÑ´Ù. int PartyID = pCreature->getPartyID(); if (PartyID != 0) { LocalPartyManager* pLPM = pCreature->getLocalPartyManager(); @@ -5453,7 +5453,7 @@ void increaseFame(Creature* pCreature, uint amount) { pSlayer->setFameSaveCount(FameSaveCount); - // ̺ϵ ϵ, ġ Ѵ. + // ¼¼À̺êÇÏµç ¾È Çϵç, ¸í¼ºÄ¡ ¼¼ÆÃÀº ÇØÁà¾ß ÇÑ´Ù. pSlayer->setFame(NewFame); } } else if (pCreature->isVampire()) { @@ -5475,7 +5475,7 @@ void increaseFame(Creature* pCreature, uint amount) { pVampire->setFameSaveCount(FameSaveCount); - // ̺ϵ ϵ, ġ Ѵ. + // ¼¼À̺êÇÏµç ¾È Çϵç, ¸í¼ºÄ¡ ¼¼ÆÃÀº ÇØÁà¾ß ÇÑ´Ù. pVampire->setFame(NewFame); } } else if (pCreature->isOusters()) { @@ -5497,21 +5497,21 @@ void increaseFame(Creature* pCreature, uint amount) { pOusters->setFameSaveCount(FameSaveCount); - // ̺ϵ ϵ, ġ Ѵ. + // ¼¼À̺êÇÏµç ¾È Çϵç, ¸í¼ºÄ¡ ¼¼ÆÃÀº ÇØÁà¾ß ÇÑ´Ù. pOusters->setFame(NewFame); } } } ////////////////////////////////////////////////////////////////////////////// -// Ÿ SG, SR ʽ Ѵ. +// °Å¸®¿¡ µû¸¥ SG, SRÀÇ º¸³Ê½º¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// int computeArmsWeaponSplashSize(Item* pWeapon, int ox, int oy, int tx, int ty) { Assert(pWeapon != NULL); Item::ItemClass IClass = pWeapon->getItemClass(); int Splash = 0; - // SG 쿡 ÷ ȿ Ѵ. + // SGÀÏ °æ¿ì¿¡¸¸ ½ºÇ÷¡½Ã È¿°ú°¡ Á¸ÀçÇÑ´Ù. if (IClass == Item::ITEM_CLASS_SG) { switch (getDistance(ox, oy, tx, ty)) { case 1: @@ -5618,14 +5618,14 @@ int computeArmsWeaponToHitBonus(Item* pWeapon, int ox, int oy, int tx, int ty) { } ////////////////////////////////////////////////////////////////////////////// -// ǥ ÷ ũĸ ̾ƿ´. +// ÁöÁ¤µÈ ÁÂÇ¥ ÁÖÀ§ÀÇ ½ºÇ÷¡½Ã µ¥¹ÌÁö¸¦ ¸ÂÀ» Å©¸®Ãĸ¦ »Ì¾Æ¿Â´Ù. ////////////////////////////////////////////////////////////////////////////// int getSplashVictims(Zone* pZone, int cx, int cy, Creature::CreatureClass CClass, list& creatureList, int splash) { VSRect rect(0, 0, pZone->getWidth() - 1, pZone->getHeight() - 1); - // ش ũİ ̾, ̾ °, - // ٸ ̾ ʴ´. + // ÇØ´ç Å©¸®Ãİ¡ ½½·¹À̾î¶ó¸é, ±× ½½·¹À̾ ¸Â°í, + // ÁÖÀ§ÀÇ ´Ù¸¥ ½½·¹À̾îµéÀº ¸ÂÁö ¾Ê´Â´Ù. if (CClass == Creature::CREATURE_CLASS_SLAYER) { if (rect.ptInRect(cx, cy)) { Tile& rTile = pZone->getTile(cx, cy); @@ -5636,7 +5636,7 @@ int getSplashVictims(Zone* pZone, int cx, int cy, Creature::CreatureClass CClass creatureList.push_back(pCreature); } } - // μ ƴٴϴ ̾ ... + // ÇöÀç·Î¼­´Â ³¯¾Æ´Ù´Ï´Â ½½·¹À̾î´Â ¾øÁö¸¸... if (rTile.hasCreature(Creature::MOVE_MODE_FLYING)) { Creature* pCreature = rTile.getCreature(Creature::MOVE_MODE_FLYING); if (pCreature->getCreatureClass() == CClass) { @@ -5662,10 +5662,10 @@ int getSplashVictims(Zone* pZone, int cx, int cy, Creature::CreatureClass CClass Creature* pCreature = rTile.getCreature(Creature::MOVE_MODE_WALKING); if (CClass == Creature::CREATURE_CLASS_MAX) { - // CREATURE_CLASS_MAX Ķͷ Ѿ 쿡 . + // CREATURE_CLASS_MAX°¡ ÆÄ¶ó¹ÌÅÍ·Î ³Ñ¾î¿À´Â °æ¿ì¿¡´Â ¹«Á¶°Ç ´õÇÏÀÚ. creatureVector.push_back(pCreature); } else if (pCreature->getCreatureClass() == CClass) { - // ƴ 쿡 CreatureClass 쿡 Ѵ. + // ¾Æ´Ñ °æ¿ì¿¡´Â CreatureClass°¡ °°Àº °æ¿ì¿¡¸¸ ´õÇÑ´Ù. creatureVector.push_back(pCreature); } } @@ -5673,35 +5673,35 @@ int getSplashVictims(Zone* pZone, int cx, int cy, Creature::CreatureClass CClass if (rTile.hasCreature(Creature::MOVE_MODE_FLYING)) { Creature* pCreature = rTile.getCreature(Creature::MOVE_MODE_FLYING); if (CClass == Creature::CREATURE_CLASS_MAX) { - // CREATURE_CLASS_MAX Ķͷ Ѿ 쿡 . + // CREATURE_CLASS_MAX°¡ ÆÄ¶ó¹ÌÅÍ·Î ³Ñ¾î¿À´Â °æ¿ì¿¡´Â ¹«Á¶°Ç ´õÇÏÀÚ. creatureVector.push_back(pCreature); } else if (pCreature->getCreatureClass() == CClass) { - // ƴ 쿡 CreatureClass 쿡 Ѵ. + // ¾Æ´Ñ °æ¿ì¿¡´Â CreatureClass°¡ °°Àº °æ¿ì¿¡¸¸ ´õÇÑ´Ù. creatureVector.push_back(pCreature); } } } } - // ÷ ں ִ ũİ ٸ, - // ÷ ȴ. + // ½ºÇ÷¡½Ã µ¥¹ÌÁö¸¦ ÀÔÈú ³ðµéÀÇ ¼ýÀÚº¸´Ù ÇöÀç ÀÖ´Â Å©¸®Ãİ¡ Àû´Ù¸é, + // ¸ðµÎ ½ºÇ÷¡½Ã µ¥¹ÌÁö¸¦ ÀÔÈ÷¸é µÈ´Ù. if ((int)creatureVector.size() <= splash) { for (int i = 0; i < (int)creatureVector.size(); i++) { creatureList.push_back(creatureVector[i]); } } - // ÷ 𺸴 ϴ ũĵ ٸ, - // ߿ splash ڸŭ ũĸ Ƿ ̾ƾ Ѵ. + // ½ºÇ÷¡½Ã µ¥¹ÌÁö¸¦ ÀÔÈú ³ðº¸´Ù ÇöÀç Á¸ÀçÇÏ´Â Å©¸®ÃĵéÀÌ ¸¹´Ù¸é, + // ÀÌ Áß¿¡ splash ¼ýÀÚ¸¸Å­ÀÇ Å©¸®Ãĸ¦ ÀÓÀÇ·Î »Ì¾Æ¾ß ÇÑ´Ù. else { - // ó 6 ְ, ߿ 4 ̾ƾ Ѵٰ - // ϸ, size = 6 ȴ. - // Indexes 迭 (0, 1, 2, 3, 4, 5, -1...) . - // ߿ 2 ̾Ҵٰ . - // ׷ 迭 2 Ѵ. - // ڿ ĭ Ű Ѵ. + // Á¦ÀÏ Ã³À½¿¡ 6³ðÀÌ ÀÖ°í, ÀÌ Áß¿¡ 4³ðÀ» »Ì¾Æ¾ß ÇÑ´Ù°í + // °¡Á¤Çϸé, size = 6ÀÌ µÈ´Ù. + // Indexes ¹è¿­¿¡´Â (0, 1, 2, 3, 4, 5, -1...)ÀÌ µé¾î°£´Ù. + // ÀÌ Áß¿¡ 2¸¦ »Ì¾Ò´Ù°í °¡Á¤ÇÏÀÚ. + // ±×·¯¸é ÀÌ ¹è¿­¿¡¼­ 2¸¦ Á¦°ÅÇØ Áà¾ß ÇÑ´Ù. + // µÚ¿¡¼­ºÎÅÍ ¾ÕÀ¸·Î ÇÑÄ­¾¿ ¿Å°ÜÁà¾ß ÇÑ´Ù. // (0, 1, 3, 4, 5, 5...) - //  ̰, ٽ ߿ ϳ - // ̾ư ġ ʴ ũ Ʈ ִ. + // ±× ´ÙÀ½ »çÀÌÁ ÁÙÀ̰í, ´Ù½Ã ±× Áß¿¡¼­ Çϳª¸¦ ·£´ýÀ¸·Î + // »Ì¾Æ°¡¸é °ãÄ¡Áö ¾Ê´Â Å©¸®ÃÄÀÇ ¸®½ºÆ®¸¦ ¾òÀ» ¼ö ÀÖ´Ù. int Indexes[50] = { -1, @@ -5730,7 +5730,7 @@ int getSplashVictims(Zone* pZone, int cx, int cy, Creature::CreatureClass CClass ////////////////////////////////////////////////////////////////////////////// -// ǥ ũó ãƼ Ѱش. +// ÁöÁ¤µÈ ÁÂÇ¥ ÁÖÀ§ÀÇ Å©¸®Ã³¸¦ ã¾Æ¼­ ³Ñ°ÜÁØ´Ù. ////////////////////////////////////////////////////////////////////////////// int getSplashVictims(Zone* pZone, int cx, int cy, Creature::CreatureClass CClass, list& creatureList, int splash, int range) { @@ -5752,10 +5752,10 @@ int getSplashVictims(Zone* pZone, int cx, int cy, Creature::CreatureClass CClass Creature* pCreature = rTile.getCreature(Creature::MOVE_MODE_WALKING); if (CClass == Creature::CREATURE_CLASS_MAX) { - // CREATURE_CLASS_MAX Ķͷ Ѿ 쿡 . + // CREATURE_CLASS_MAX°¡ ÆÄ¶ó¹ÌÅÍ·Î ³Ñ¾î¿À´Â °æ¿ì¿¡´Â ¹«Á¶°Ç ´õÇÏÀÚ. creatureVector.push_back(pCreature); } else if (pCreature->getCreatureClass() == CClass) { - // ƴ 쿡 CreatureClass 쿡 Ѵ. + // ¾Æ´Ñ °æ¿ì¿¡´Â CreatureClass°¡ °°Àº °æ¿ì¿¡¸¸ ´õÇÑ´Ù. creatureVector.push_back(pCreature); } } @@ -5763,10 +5763,10 @@ int getSplashVictims(Zone* pZone, int cx, int cy, Creature::CreatureClass CClass if (rTile.hasCreature(Creature::MOVE_MODE_FLYING)) { Creature* pCreature = rTile.getCreature(Creature::MOVE_MODE_FLYING); if (CClass == Creature::CREATURE_CLASS_MAX) { - // CREATURE_CLASS_MAX Ķͷ Ѿ 쿡 . + // CREATURE_CLASS_MAX°¡ ÆÄ¶ó¹ÌÅÍ·Î ³Ñ¾î¿À´Â °æ¿ì¿¡´Â ¹«Á¶°Ç ´õÇÏÀÚ. creatureVector.push_back(pCreature); } else if (pCreature->getCreatureClass() == CClass) { - // ƴ 쿡 CreatureClass 쿡 Ѵ. + // ¾Æ´Ñ °æ¿ì¿¡´Â CreatureClass°¡ °°Àº °æ¿ì¿¡¸¸ ´õÇÑ´Ù. creatureVector.push_back(pCreature); } } @@ -5774,25 +5774,25 @@ int getSplashVictims(Zone* pZone, int cx, int cy, Creature::CreatureClass CClass } } - // ÷ ں ִ ũİ ٸ, - // ÷ ȴ. + // ½ºÇ÷¡½Ã µ¥¹ÌÁö¸¦ ÀÔÈú ³ðµéÀÇ ¼ýÀÚº¸´Ù ÇöÀç ÀÖ´Â Å©¸®Ãİ¡ Àû´Ù¸é, + // ¸ðµÎ ½ºÇ÷¡½Ã µ¥¹ÌÁö¸¦ ÀÔÈ÷¸é µÈ´Ù. if ((int)creatureVector.size() <= splash) { for (int i = 0; i < (int)creatureVector.size(); i++) { creatureList.push_back(creatureVector[i]); } } - // ÷ 𺸴 ϴ ũĵ ٸ, - // ߿ splash ڸŭ ũĸ Ƿ ̾ƾ Ѵ. + // ½ºÇ÷¡½Ã µ¥¹ÌÁö¸¦ ÀÔÈú ³ðº¸´Ù ÇöÀç Á¸ÀçÇÏ´Â Å©¸®ÃĵéÀÌ ¸¹´Ù¸é, + // ÀÌ Áß¿¡ splash ¼ýÀÚ¸¸Å­ÀÇ Å©¸®Ãĸ¦ ÀÓÀÇ·Î »Ì¾Æ¾ß ÇÑ´Ù. else { - // ó 6 ְ, ߿ 4 ̾ƾ Ѵٰ - // ϸ, size = 6 ȴ. - // Indexes 迭 (0, 1, 2, 3, 4, 5, -1...) . - // ߿ 2 ̾Ҵٰ . - // ׷ 迭 2 Ѵ. - // ڿ ĭ Ű Ѵ. + // Á¦ÀÏ Ã³À½¿¡ 6³ðÀÌ ÀÖ°í, ÀÌ Áß¿¡ 4³ðÀ» »Ì¾Æ¾ß ÇÑ´Ù°í + // °¡Á¤Çϸé, size = 6ÀÌ µÈ´Ù. + // Indexes ¹è¿­¿¡´Â (0, 1, 2, 3, 4, 5, -1...)ÀÌ µé¾î°£´Ù. + // ÀÌ Áß¿¡ 2¸¦ »Ì¾Ò´Ù°í °¡Á¤ÇÏÀÚ. + // ±×·¯¸é ÀÌ ¹è¿­¿¡¼­ 2¸¦ Á¦°ÅÇØ Áà¾ß ÇÑ´Ù. + // µÚ¿¡¼­ºÎÅÍ ¾ÕÀ¸·Î ÇÑÄ­¾¿ ¿Å°ÜÁà¾ß ÇÑ´Ù. // (0, 1, 3, 4, 5, 5...) - //  ̰, ٽ ߿ ϳ - // ̾ư ġ ʴ ũ Ʈ ִ. + // ±× ´ÙÀ½ »çÀÌÁ ÁÙÀ̰í, ´Ù½Ã ±× Áß¿¡¼­ Çϳª¸¦ ·£´ýÀ¸·Î + // »Ì¾Æ°¡¸é °ãÄ¡Áö ¾Ê´Â Å©¸®ÃÄÀÇ ¸®½ºÆ®¸¦ ¾òÀ» ¼ö ÀÖ´Ù. int Indexes[50] = { -1, @@ -5820,36 +5820,36 @@ int getSplashVictims(Zone* pZone, int cx, int cy, Creature::CreatureClass CClass } ////////////////////////////////////////////////////////////////////////////// -// ɷġ ϳ , HP MP äִ Լ. -// ̾ -- 2002.01.14 輺 +// ´É·ÂÄ¡°¡ Çϳª¶óµµ »ó½ÂÇßÀ» ¶§, HP¿Í MP¸¦ ¸¸¶¥À¸·Î ä¿öÁÖ´Â ÇÔ¼ö´Ù. +// ½½·¹À̾î¿ë -- 2002.01.14 ±è¼º¹Î ////////////////////////////////////////////////////////////////////////////// void healCreatureForLevelUp(Slayer* pSlayer, ModifyInfo& _ModifyInfo, SLAYER_RECORD* prev) { - // ɷġ Ѵ. + // ´É·ÂÄ¡¸¦ Àç°è»êÇÑ´Ù. pSlayer->initAllStat(); - // ɷġ ΰ ɷġ Ƿ ش. + // ´É·ÂÄ¡°¡ »ó½ÂÇßÀ¸´Ï ¹«¾ð°¡ ºÎ°¡ÀûÀÎ ´É·ÂÄ¡°¡ º¯ÇßÀ¸¹Ç·Î º¸³»ÁØ´Ù. pSlayer->sendRealWearingInfo(); pSlayer->addModifyInfo(*prev, _ModifyInfo); if (pSlayer->isDead()) return; - // ɷġ ϳ ߴٸ HP MP äش. + // ´É·ÂÄ¡°¡ Çϳª¶óµµ »ó½ÂÇß´Ù¸é HP¿Í MP¸¦ ¸¸¶¥À¸·Î ä¿öÁØ´Ù. HP_t OldHP = pSlayer->getHP(ATTR_CURRENT); HP_t OldMP = pSlayer->getMP(ATTR_CURRENT); - // ä... + // ¸¸¶¥ ä¿ì±â... pSlayer->setHP(pSlayer->getHP(ATTR_MAX), ATTR_CURRENT); pSlayer->setMP(pSlayer->getMP(ATTR_MAX), ATTR_CURRENT); HP_t NewHP = pSlayer->getHP(ATTR_CURRENT); HP_t NewMP = pSlayer->getMP(ATTR_CURRENT); - // HP ٲٸ... + // HP°¡ ¹Ù²î¾ú´Ù¸é... if (OldHP != NewHP) { _ModifyInfo.addShortData(MODIFY_CURRENT_HP, NewHP); - // ٲ ü εijش. + // ¹Ù²ï ü·ÂÀ» ÁÖÀ§¿¡ ºê·Îµåij½ºÆÃÇØÁØ´Ù. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pSlayer->getObjectID()); gcStatusCurrentHP.setCurrentHP(NewHP); @@ -5858,7 +5858,7 @@ void healCreatureForLevelUp(Slayer* pSlayer, ModifyInfo& _ModifyInfo, SLAYER_REC pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &gcStatusCurrentHP, pSlayer); } - // MP ٲٸ... + // MP°¡ ¹Ù²î¾ú´Ù¸é... if (OldMP != NewMP) { _ModifyInfo.addShortData(MODIFY_CURRENT_MP, NewMP); } @@ -5867,14 +5867,14 @@ void healCreatureForLevelUp(Slayer* pSlayer, ModifyInfo& _ModifyInfo, SLAYER_REC } ////////////////////////////////////////////////////////////////////////////// -// ɷġ , HP äִ Լ. ̾ -// -- 2002.01.14 輺 +// ´É·ÂÄ¡°¡ »ó½ÂÇßÀ» ¶§, HP¸¦ ¸¸¶¥À¸·Î ä¿öÁÖ´Â ÇÔ¼ö´Ù. ¹ìÆÄÀ̾î¿ë +// -- 2002.01.14 ±è¼º¹Î ////////////////////////////////////////////////////////////////////////////// void healCreatureForLevelUp(Vampire* pVampire, ModifyInfo& _ModifyInfo, VAMPIRE_RECORD* prev) { - // ɷġ Ѵ. + // ´É·ÂÄ¡¸¦ Àç°è»êÇÑ´Ù. pVampire->initAllStat(); - // ɷġ ΰ ɷġ Ƿ ش. + // ´É·ÂÄ¡°¡ »ó½ÂÇßÀ¸´Ï ¹«¾ð°¡ ºÎ°¡ÀûÀÎ ´É·ÂÄ¡°¡ º¯ÇßÀ¸¹Ç·Î º¸³»ÁØ´Ù. pVampire->sendRealWearingInfo(); pVampire->addModifyInfo(*prev, _ModifyInfo); @@ -5883,16 +5883,16 @@ void healCreatureForLevelUp(Vampire* pVampire, ModifyInfo& _ModifyInfo, VAMPIRE_ HP_t OldHP = pVampire->getHP(ATTR_CURRENT); - // ä... + // ¸¸¶¥ ä¿ì±â... pVampire->setHP(pVampire->getHP(ATTR_MAX), ATTR_CURRENT); HP_t NewHP = pVampire->getHP(ATTR_CURRENT); - // HP ٲٸ... + // HP°¡ ¹Ù²î¾ú´Ù¸é... if (OldHP != NewHP) { _ModifyInfo.addShortData(MODIFY_CURRENT_HP, NewHP); - // ٲ ü εijش. + // ¹Ù²ï ü·ÂÀ» ÁÖÀ§¿¡ ºê·Îµåij½ºÆÃÇØÁØ´Ù. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pVampire->getObjectID()); gcStatusCurrentHP.setCurrentHP(NewHP); @@ -5905,9 +5905,9 @@ void healCreatureForLevelUp(Vampire* pVampire, ModifyInfo& _ModifyInfo, VAMPIRE_ } ////////////////////////////////////////////////////////////////////////////// -// н Ŷ . -// Ϲ (Ʈ ߴٴ, ٴ...) , -// ΰ װ ̵鿡 Ŷ . +// ±â¼ú ½ÇÆÐ½Ã ÆÐŶÀ» ³¯¸°´Ù. +// ÀϹÝÀûÀÎ ½ÇÆÐ (È÷Æ®·Ñ ½ÇÆÐÇß´Ù´ø°¡, ¸¶³ª°¡ ¾ø´Ù´ø°¡...)ÀÏ °æ¿ì, +// º»Àΰú ±×°ÍÀ» º¸´Â À̵鿡°Ô ÆÐŶÀ» ³¯¸°´Ù. ////////////////////////////////////////////////////////////////////////////// void executeSkillFailNormal(Creature* pCreature, SkillType_t SkillType, Creature* pTargetCreature, BYTE Grade) { Assert(pCreature != NULL); @@ -5924,10 +5924,10 @@ void executeSkillFailNormal(Creature* pCreature, SkillType_t SkillType, Creature gcSkillFailed2.setObjectID(pCreature->getObjectID()); gcSkillFailed2.setGrade(Grade); - // ObjectSkill , OID Ѵٸ Ŷ Ǿ ش. - // ų̳ Ÿ ų 쿡 NULL parameter Ѿ ̴. - // (Ŭ̾Ʈ Ÿ ų ؼ ƿ GCSkillFailed2 쿡, - // TargetObjectID ʴ´.) + // ObjectSkillÀÏ °æ¿ì, »ó´ë¹æÀÇ OID°¡ Á¸ÀçÇÑ´Ù¸é ÆÐŶ¿¡´Ù ½Ç¾î¼­ º¸³»ÁØ´Ù. + // ¼¿ÇÁ ½ºÅ³À̳ª ŸÀÏ ½ºÅ³ÀÎ °æ¿ì¿¡´Â NULL·Î parameter°¡ ³Ñ¾î¿À´Â °ÍÀÌ Á¤»óÀÌ´Ù. + // (Ŭ¶óÀÌ¾ðÆ®¿¡¼­´Â ¼¿ÇÁ³ª ŸÀÏ ½ºÅ³ÀÌ ½ÇÆÐÇØ¼­ ³¯¾Æ¿À´Â GCSkillFailed2ÀÏ °æ¿ì¿¡´Â, + // TargetObjectID¸¦ ÀÐÁöµµ ¾Ê´Â´Ù.) if (pTargetCreature != NULL) { gcSkillFailed2.setTargetObjectID(pTargetCreature->getObjectID()); } else { @@ -5941,18 +5941,18 @@ void executeSkillFailNormal(Creature* pCreature, SkillType_t SkillType, Creature } ////////////////////////////////////////////////////////////////////////////// -// н Ŷ . -// ų 2 ȴ. -// ⿡ ϳ ϰ -// ϳ. -// ׷ ó üũϴٰ 쿡 -// SkillFail Ŷ 2 ش. +// ±â¼ú ½ÇÆÐ½Ã ÆÐŶÀ» ³¯¸°´Ù. +// ½ºÅ³ÀÇ °á°ú¸¦ 2¹ø ³¯·ÁÁà¾ß µÈ´Ù. +// ¶ó¹Ù ¸¸µé±â¿¡ ´ëÇÑ °Í Çϳª Çϰí +// Èí¿µ¿¡ °üÇÑ °Í Çϳª. +// ±×·¡¼­ óÀ½¿¡ Á¶°Ç üũÇÏ´Ù°¡ ½ÇÆÐÇÒ °æ¿ì¿¡ +// SkillFail ÆÐŶÀ» 2¹ø º¸³»ÁØ´Ù. ////////////////////////////////////////////////////////////////////////////// void executeAbsorbSoulSkillFail(Creature* pCreature, SkillType_t SkillType, ObjectID_t TargetObjectID, bool bBroadcast, bool bSendTwice) { Assert(pCreature != NULL); - // Ŭ̾Ʈ ɷ ų οԴ Ŷ 2 ȴ. + // Ŭ¶óÀÌ¾ðÆ®¿¡ ¶ôÀÌ °É·ÁÀÖÀ¸¸é ½ºÅ³ »ç¿ëÇÑ º»Àο¡°Ô´Â °ËÁõ ÆÐŶÀ» 2¹ø º¸³»Áà¾ß µÈ´Ù. if (pCreature->isPC()) { GCSkillFailed1 gcSkillFailed1; gcSkillFailed1.setSkillType(SkillType); @@ -5975,9 +5975,9 @@ void executeAbsorbSoulSkillFail(Creature* pCreature, SkillType_t SkillType, Obje } ////////////////////////////////////////////////////////////////////////////// -// н Ŷ . -// Ϲ (Ʈ ߴٴ, ٴ...) , -// ΰ װ ̵鿡 Ŷ . +// ±â¼ú ½ÇÆÐ½Ã ÆÐŶÀ» ³¯¸°´Ù. +// ÀϹÝÀûÀÎ ½ÇÆÐ (È÷Æ®·Ñ ½ÇÆÐÇß´Ù´ø°¡, ¸¶³ª°¡ ¾ø´Ù´ø°¡...)ÀÏ °æ¿ì, +// º»Àΰú ±×°ÍÀ» º¸´Â À̵鿡°Ô ÆÐŶÀ» ³¯¸°´Ù. ////////////////////////////////////////////////////////////////////////////// void executeSkillFailNormalWithGun(Creature* pCreature, SkillType_t SkillType, Creature* pTargetCreature, BYTE RemainBullet) { @@ -5994,10 +5994,10 @@ void executeSkillFailNormalWithGun(Creature* pCreature, SkillType_t SkillType, C gcSkillFailed2.setSkillType(SkillType); gcSkillFailed2.setObjectID(pCreature->getObjectID()); - // ObjectSkill , OID Ѵٸ Ŷ Ǿ ش. - // ų̳ Ÿ ų 쿡 NULL parameter Ѿ ̴. - // (Ŭ̾Ʈ Ÿ ų ؼ ƿ GCSkillFailed2 쿡, - // TargetObjectID ʴ´.) + // ObjectSkillÀÏ °æ¿ì, »ó´ë¹æÀÇ OID°¡ Á¸ÀçÇÑ´Ù¸é ÆÐŶ¿¡´Ù ½Ç¾î¼­ º¸³»ÁØ´Ù. + // ¼¿ÇÁ ½ºÅ³À̳ª ŸÀÏ ½ºÅ³ÀÎ °æ¿ì¿¡´Â NULL·Î parameter°¡ ³Ñ¾î¿À´Â °ÍÀÌ Á¤»óÀÌ´Ù. + // (Ŭ¶óÀÌ¾ðÆ®¿¡¼­´Â ¼¿ÇÁ³ª ŸÀÏ ½ºÅ³ÀÌ ½ÇÆÐÇØ¼­ ³¯¾Æ¿À´Â GCSkillFailed2ÀÏ °æ¿ì¿¡´Â, + // TargetObjectID¸¦ ÀÐÁöµµ ¾Ê´Â´Ù.) if (pTargetCreature != NULL) { gcSkillFailed2.setTargetObjectID(pTargetCreature->getObjectID()); } else { @@ -6011,9 +6011,9 @@ void executeSkillFailNormalWithGun(Creature* pCreature, SkillType_t SkillType, C } ////////////////////////////////////////////////////////////////////////////// -// н Ŷ . -// (NPC ߴٴ...) -// οԸ Ŷ . +// ±â¼ú ½ÇÆÐ½Ã ÆÐŶÀ» ³¯¸°´Ù. +// ¿¹¿ÜÀûÀÎ ½ÇÆÐ (NPC¸¦ °ø°ÝÇß´Ù´ø°¡...) +// º»Àο¡°Ô¸¸ ÆÐŶÀ» ³¯¸°´Ù. ////////////////////////////////////////////////////////////////////////////// void executeSkillFailException(Creature* pCreature, SkillType_t SkillType, BYTE Grade) { // by sigi. 2002.5.8 @@ -6030,14 +6030,14 @@ void executeSkillFailException(Creature* pCreature, SkillType_t SkillType, BYTE } ////////////////////////////////////////////////////////////////////////////// -// ɷġ , HP, MP äִ Լ. ƿ콺ͽ +// ´É·ÂÄ¡°¡ »ó½ÂÇßÀ» ¶§, HP, MP¸¦ ¸¸¶¥À¸·Î ä¿öÁÖ´Â ÇÔ¼ö´Ù. ¾Æ¿ì½ºÅͽº¿ë // -- 2003.04.19 by bezz ////////////////////////////////////////////////////////////////////////////// void healCreatureForLevelUp(Ousters* pOusters, ModifyInfo& _ModifyInfo, OUSTERS_RECORD* prev) { - // ɷġ Ѵ. + // ´É·ÂÄ¡¸¦ Àç°è»êÇÑ´Ù. pOusters->initAllStat(); - // ɷġ ΰ ɷġ Ƿ ش. + // ´É·ÂÄ¡°¡ »ó½ÂÇßÀ¸´Ï ¹«¾ð°¡ ºÎ°¡ÀûÀÎ ´É·ÂÄ¡°¡ º¯ÇßÀ¸¹Ç·Î º¸³»ÁØ´Ù. pOusters->sendRealWearingInfo(); pOusters->addModifyInfo(*prev, _ModifyInfo); @@ -6047,18 +6047,18 @@ void healCreatureForLevelUp(Ousters* pOusters, ModifyInfo& _ModifyInfo, OUSTERS_ HP_t OldHP = pOusters->getHP(ATTR_CURRENT); MP_t OldMP = pOusters->getMP(ATTR_CURRENT); - // ä... + // ¸¸¶¥ ä¿ì±â... pOusters->setHP(pOusters->getHP(ATTR_MAX), ATTR_CURRENT); pOusters->setMP(pOusters->getMP(ATTR_MAX), ATTR_CURRENT); HP_t NewHP = pOusters->getHP(ATTR_CURRENT); MP_t NewMP = pOusters->getMP(ATTR_CURRENT); - // HP ٲٸ... + // HP°¡ ¹Ù²î¾ú´Ù¸é... if (OldHP != NewHP) { _ModifyInfo.addShortData(MODIFY_CURRENT_HP, NewHP); - // ٲ ü εijش. + // ¹Ù²ï ü·ÂÀ» ÁÖÀ§¿¡ ºê·Îµåij½ºÆÃÇØÁØ´Ù. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pOusters->getObjectID()); gcStatusCurrentHP.setCurrentHP(NewHP); @@ -6074,11 +6074,11 @@ void healCreatureForLevelUp(Ousters* pOusters, ModifyInfo& _ModifyInfo, OUSTERS_ } -// HP ̴ Լ +// HP¸¦ ÁÙÀÌ´Â ÇÔ¼ö // by sigi. 2002.9.10 void decreaseHP(Zone* pZone, Creature* pCreature, int Damage, ObjectID_t attackerObjectID) { if (!(pZone->getZoneLevel() & COMPLETE_SAFE_ZONE) - // üũ. by sigi. 2002.9.5 + // ¹«Àû»óÅ üũ. by sigi. 2002.9.5 && !pCreature->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE)) { if (pCreature->isSlayer()) { Slayer* pSlayer = dynamic_cast(pCreature); @@ -6094,7 +6094,7 @@ void decreaseHP(Zone* pZone, Creature* pCreature, int Damage, ObjectID_t attacke gcMI.addShortData(MODIFY_CURRENT_HP, RemainHP); pSlayer->getPlayer()->sendPacket(&gcMI); - // HP εijش. + // º¯ÇÑ HP¸¦ ºê·Îµåij½ºÆÃÇØÁØ´Ù. GCStatusCurrentHP pkt; pkt.setObjectID(pSlayer->getObjectID()); pkt.setCurrentHP(RemainHP); @@ -6114,7 +6114,7 @@ void decreaseHP(Zone* pZone, Creature* pCreature, int Damage, ObjectID_t attacke gcMI.addShortData(MODIFY_CURRENT_HP, RemainHP); pVampire->getPlayer()->sendPacket(&gcMI); - // HP εijش. + // º¯ÇÑ HP¸¦ ºê·Îµåij½ºÆÃÇØÁØ´Ù. GCStatusCurrentHP pkt; pkt.setObjectID(pVampire->getObjectID()); pkt.setCurrentHP(RemainHP); @@ -6134,7 +6134,7 @@ void decreaseHP(Zone* pZone, Creature* pCreature, int Damage, ObjectID_t attacke gcMI.addShortData(MODIFY_CURRENT_HP, RemainHP); pOusters->getPlayer()->sendPacket(&gcMI); - // HP εijش. + // º¯ÇÑ HP¸¦ ºê·Îµåij½ºÆÃÇØÁØ´Ù. GCStatusCurrentHP pkt; pkt.setObjectID(pOusters->getObjectID()); pkt.setCurrentHP(RemainHP); @@ -6150,7 +6150,7 @@ void decreaseHP(Zone* pZone, Creature* pCreature, int Damage, ObjectID_t attacke pMonster->setHP(RemainHP, ATTR_CURRENT); - // HP εijش. + // º¯ÇÑ HP¸¦ ºê·Îµåij½ºÆÃÇØÁØ´Ù. GCStatusCurrentHP pkt; pkt.setObjectID(pMonster->getObjectID()); pkt.setCurrentHP(RemainHP); @@ -6158,7 +6158,7 @@ void decreaseHP(Zone* pZone, Creature* pCreature, int Damage, ObjectID_t attacke } } - // attackerObjectID pCreature KillCount ó + // attackerObjectID°¡ pCreature¸¦ Á×ÀÎ °æ¿ìÀÇ KillCount ó¸® // by sigi. 2002.9.9 if (attackerObjectID != 0 && pCreature->isDead()) { Creature* pAttacker = pZone->getCreature(attackerObjectID); @@ -6173,9 +6173,9 @@ void decreaseHP(Zone* pZone, Creature* pCreature, int Damage, ObjectID_t attacke //---------------------------------------------------------------------- // Set Direction To Creature //---------------------------------------------------------------------- -// ٸ Creature ؼ ٶ󺻴. +// ´Ù¸¥ Creature¸¦ ÇâÇØ¼­ ¹Ù¶óº»´Ù. //---------------------------------------------------------------------- -// 8⿡ Ǵ : / +// 8¹æÇâ¿¡ µû¸¥ ±âÁØÀÌ µÇ´Â ±â¿ï±â : °¡·Î/¼¼·Î ºñÀ²°ú °ü·Ã //---------------------------------------------------------------------- const float BASIS_DIRECTION_LOW = 0.35f; const float BASIS_DIRECTION_HIGH = 3.0f; @@ -6183,14 +6183,14 @@ const float BASIS_DIRECTION_HIGH = 3.0f; Dir_t getDirectionToPosition(int originX, int originY, int destX, int destY) { int stepX = destX - originX, stepY = destY - originY; - // 0 check - float k = (stepX == 0) ? 0 : (float)(stepY) / stepX; // + // 0ÀÏ ¶§ check + float k = (stepX == 0) ? 0 : (float)(stepY) / stepX; // ±â¿ï±â //-------------------------------------------------- - // ؾ Ѵ. + // ¹æÇâÀ» Á¤ÇØ¾ß ÇÑ´Ù. //-------------------------------------------------- if (stepY == 0) { - // X + // XÃà // - -;; if (stepX == 0) return DOWN; @@ -6198,13 +6198,13 @@ Dir_t getDirectionToPosition(int originX, int originY, int destX, int destY) { return RIGHT; else return LEFT; - } else if (stepY < 0) // UP + } else if (stepY < 0) // UPÂÊÀ¸·Î { - // y + // yÃà À§ if (stepX == 0) { return UP; } - // 1и + // 1»çºÐ¸é else if (stepX > 0) { if (k < -BASIS_DIRECTION_HIGH) return UP; @@ -6213,7 +6213,7 @@ Dir_t getDirectionToPosition(int originX, int originY, int destX, int destY) { else return RIGHT; } - // 2и + // 2»çºÐ¸é else { if (k > BASIS_DIRECTION_HIGH) return UP; @@ -6223,13 +6223,13 @@ Dir_t getDirectionToPosition(int originX, int originY, int destX, int destY) { return LEFT; } } - // Ʒ + // ¾Æ·¡ÂÊ else { - // y Ʒ + // yÃà ¾Æ·¡ if (stepX == 0) { return DOWN; } - // 4и + // 4»çºÐ¸é else if (stepX > 0) { if (k > BASIS_DIRECTION_HIGH) return DOWN; @@ -6238,7 +6238,7 @@ Dir_t getDirectionToPosition(int originX, int originY, int destX, int destY) { else return RIGHT; } - // 3и + // 3»çºÐ¸é else { if (k < -BASIS_DIRECTION_HIGH) return DOWN; @@ -6281,31 +6281,31 @@ Exp_t computeSkillPointBonus(SkillDomainType_t Domain, SkillLevel_t DomainLevel, } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ѵ. +// ½½·¹ÀÌ¾î °ø°ÝÀÚÀÇ ¼ø¼ö µ¥¹ÌÁö¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// Damage_t computePureSlayerDamage(Slayer* pSlayer) { Assert(pSlayer != NULL); Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); - // ϴ Ǽ ޾ƿ´. + // ÀÏ´Ü ¸Ç¼ÕÀÇ µ¥¹ÌÁö¸¦ ¹Þ¾Æ¿Â´Ù. Damage_t MinDamage = pSlayer->getDamage(ATTR_CURRENT); Damage_t MaxDamage = pSlayer->getDamage(ATTR_MAX); - // ⸦ ִٸ, min, max min, max ش. + // ¹«±â¸¦ µé°í ÀÖ´Ù¸é, min, max¿¡ ¹«±âÀÇ min, max¸¦ °è»êÇØ ÁØ´Ù. if (pItem != NULL && pSlayer->isRealWearingEx(Slayer::WEAR_RIGHTHAND)) { MinDamage += pItem->getMinDamage(); MaxDamage += pItem->getMaxDamage(); } - // Ѵ. + // ½ÇÁ¦ ·£´ý µ¥¹ÌÁö¸¦ °è»êÇÑ´Ù. Damage_t RealDamage = max(1, Random(MinDamage, MaxDamage)); return RealDamage; } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ѵ. +// ¹ìÆÄÀÌ¾î °ø°ÝÀÚÀÇ ¼ø¼ö µ¥ºñÁö¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// Damage_t computePureVampireDamage(Vampire* pVampire) { Assert(pVampire != NULL); @@ -6314,16 +6314,16 @@ Damage_t computePureVampireDamage(Vampire* pVampire) { Damage_t MaxDamage = pVampire->getDamage(ATTR_MAX); uint timeband = getZoneTimeband(pVampire->getZone()); - // vampire ⿡ + // vampire ¹«±â¿¡ ÀÇÇÑ µ¥¹ÌÁö Item* pItem = pVampire->getWearItem(Vampire::WEAR_RIGHTHAND); - // ⸦ ִٸ, min, max min, max ش. + // ¹«±â¸¦ µé°í ÀÖ´Ù¸é, min, max¿¡ ¹«±âÀÇ min, max¸¦ °è»êÇØ ÁØ´Ù. if (pItem != NULL && pVampire->isRealWearingEx(Vampire::WEAR_RIGHTHAND)) { MinDamage += pItem->getMinDamage(); MaxDamage += pItem->getMaxDamage(); } - // Ѵ. + // ½ÇÁ¦ ·£´ý µ¥¹ÌÁö¸¦ °è»êÇÑ´Ù. Damage_t RealDamage = max(1, Random(MinDamage, MaxDamage)); RealDamage = (Damage_t)getPercentValue(RealDamage, VampireTimebandFactor[timeband]); @@ -6333,7 +6333,7 @@ Damage_t computePureVampireDamage(Vampire* pVampire) { ////////////////////////////////////////////////////////////////////////////// -// ƿ콺ͽ Ѵ. +// ¾Æ¿ì½ºÅͽº °ø°ÝÀÚÀÇ ¼ø¼ö µ¥ºñÁö¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// Damage_t computePureOustersDamage(Ousters* pOusters) { Assert(pOusters != NULL); @@ -6341,23 +6341,23 @@ Damage_t computePureOustersDamage(Ousters* pOusters) { Damage_t MinDamage = pOusters->getDamage(ATTR_CURRENT); Damage_t MaxDamage = pOusters->getDamage(ATTR_MAX); - // vampire ⿡ + // vampire ¹«±â¿¡ ÀÇÇÑ µ¥¹ÌÁö Item* pItem = pOusters->getWearItem(Ousters::WEAR_RIGHTHAND); - // ⸦ ִٸ, min, max min, max ش. + // ¹«±â¸¦ µé°í ÀÖ´Ù¸é, min, max¿¡ ¹«±âÀÇ min, max¸¦ °è»êÇØ ÁØ´Ù. if (pItem != NULL && pOusters->isRealWearingEx(Ousters::WEAR_RIGHTHAND)) { MinDamage += pItem->getMinDamage(); MaxDamage += pItem->getMaxDamage(); } - // Ѵ. + // ½ÇÁ¦ ·£´ý µ¥¹ÌÁö¸¦ °è»êÇÑ´Ù. Damage_t RealDamage = max(1, Random(MinDamage, MaxDamage)); return RealDamage; } ////////////////////////////////////////////////////////////////////////////// -// Ѵ. +// ¸ó½ºÅÍ °ø°ÝÀÚÀÇ ¼ø¼ö µ¥¹ÌÁö¸¦ °è»êÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// Damage_t computePureMonsterDamage(Monster* pMonster) { Assert(pMonster != NULL); @@ -6372,14 +6372,14 @@ Damage_t computePureMonsterDamage(Monster* pMonster) { return RealDamage; } -// ̸ ɾ ִ°? ( ũķ ) +// Á¡°ú Á¡»çÀ̸¦ °É¾î¼­ °¥ ¼ö Àִ°¡? ( Å©¸®ÃÄ·Î ¸·Èù °æ¿ì´Â Á¦¿Ü ) bool isPassLine(Zone* pZone, ZoneCoord_t sX, ZoneCoord_t sY, ZoneCoord_t eX, ZoneCoord_t eY, bool blockByCreature) { list tpList; if (pZone == NULL) return false; - // ̷ Ѵ. + // µÎ Á¡»çÀÌÀÇ Áø¼±À» ÀÌ·ç´Â Á¡µéÀ» ±¸ÇÑ´Ù. getLinePoint(sX, sY, eX, eY, tpList); if (tpList.empty()) @@ -6395,7 +6395,7 @@ bool isPassLine(Zone* pZone, ZoneCoord_t sX, ZoneCoord_t sY, ZoneCoord_t eX, Zon return false; if (tp.x == sX && tp.y == sY) { - // üũ Ѵ. + // ½ÃÀÛÁ¡Àº üũ ¾ÈÇÑ´Ù. continue; } @@ -6408,8 +6408,8 @@ bool isPassLine(Zone* pZone, ZoneCoord_t sX, ZoneCoord_t sY, ZoneCoord_t eX, Zon return false; } - // 밢 ٲ , θ ־ ϴ. - // (1,1) -> (2,2) , (1,2) (2,1) ߿ ϳ ־ ִٰ . + // ´ë°¢¼±À¸·Î ¹Ù²ï °æ¿ì, ÇÑÂÊ ¹æÇâÀ¸·Î¸¸ °¥¼ö À־ °¡´ÉÇÏ´Ù. + // (1,1) -> (2,2) ÀÎ °æ¿ì, (1,2) ³ª (2,1) µÑ Áß¿¡ Çϳª¸¸ Áö³ª°¥ ¼ö À־ Áö³ª°¥ ¼ö ÀÖ´Ù°í º»´Ù. if (prev.x != tp.x && prev.y != tp.y) { if (!rect.ptInRect(tp.x, prev.y)) return false; @@ -6430,7 +6430,7 @@ bool isPassLine(Zone* pZone, ZoneCoord_t sX, ZoneCoord_t sY, ZoneCoord_t eX, Zon return true; } -// ̷ Ѵ. +// µÎ Á¡»çÀÌÀÇ Áø¼±À» ÀÌ·ç´Â Á¡µéÀ» ±¸ÇÑ´Ù. void getLinePoint(ZoneCoord_t sX, ZoneCoord_t sY, ZoneCoord_t eX, ZoneCoord_t eY, list& tpList) { int xLength = abs(sX - eX); int yLength = abs(sY - eY); @@ -6528,7 +6528,7 @@ Damage_t computeElementalCombatSkill(Ousters* pOusters, Creature* pTargetCreatur if (!bMaster && !pTargetCreature->isFlag(Effect::EFFECT_CLASS_ICE_OF_SOUL_STONE) && (rand() % 100) < min(23, ratio * 2 / 3)) { Turn_t duration = pOusters->getPassiveBonus(SKILL_ICE_OF_SOUL_STONE); - // Ʈ Ŭ δ. + // ÀÌÆÑÆ® Ŭ·¡½º¸¦ ¸¸µé¾î ºÙÀδÙ. EffectIceOfSoulStone* pEffect = new EffectIceOfSoulStone(pTargetCreature); pEffect->setDeadline(duration); pTargetCreature->addEffect(pEffect); @@ -6605,7 +6605,7 @@ Damage_t computeElementalCombatSkill(Ousters* pOusters, Creature* pTargetCreatur if (!bMaster && !pTargetCreature->isFlag(Effect::EFFECT_CLASS_BLOCK_HEAD) && (rand() % 100) < min(15, ratio / 2)) { Turn_t duration = pOusters->getPassiveBonus(SKILL_BLOCK_HEAD); - // Ʈ Ŭ δ. + // ÀÌÆÑÆ® Ŭ·¡½º¸¦ ¸¸µé¾î ºÙÀδÙ. EffectBlockHead* pEffect = new EffectBlockHead(pTargetCreature); pEffect->setDeadline(duration); pTargetCreature->addEffect(pEffect); @@ -6753,29 +6753,29 @@ Damage_t computeElementalCombatSkill(Ousters* pOusters, Creature* pTargetCreatur } ////////////////////////////////////////////////////////////////////////////// -// ִ°? -// ³ non PK ؼ ִ üũѴ. +// °ø°ÝÇÒ ¼ö Àִ°¡? +// ¹«Àû »óųª non PK ¸¦ À§Çؼ­ °ø°ÝÇÒ ¼ö ÀÖ´ÂÁö¸¦ üũÇÑ´Ù. ////////////////////////////////////////////////////////////////////////////// bool canAttack(Creature* pAttacker, Creature* pDefender) { Assert(pDefender != NULL); - // üũ + // ¹«Àû »óÅ üũ if (pDefender->isFlag(Effect::EFFECT_CLASS_NO_DAMAGE)) return false; - // Attacker NULL ̸ true - // հ ϰ ġ ٶ Effect üũҶ Attacker NULL ִ. + // Attacker °¡ NULL ÀÌ¸é °Á true + // Á¨Àå ¸Õ°¡ ±ò²ûÇÏ°Ô °íÄ¡±â ¹Ù¶÷ Effect¿¡¼­ üũÇÒ¶§ Attacker °¡ NULL ÀÌ µÉ ¼ö ÀÖ´Ù. if (pAttacker == NULL) return true; - // Ӽ PK Ǿ°? + // °ÔÀÓ¼­¹ö¿¡ PK ¼³Á¤ÀÌ µÇ¾ú´Â°¡? static bool bNonPK = g_pGameServerInfoManager ->getGameServerInfo(1, g_pConfig->getPropertyInt("ServerID"), g_pConfig->getPropertyInt("WorldID")) ->isNonPKServer(); // bool canPK = bNonPK || GDRLairManager::Instance().isGDRLairZone( pAttacker->getZoneID() ); - // non PK üũ + // non PK üũ if (bNonPK && pAttacker->isPC() && pDefender->isPC()) return false; @@ -6784,7 +6784,7 @@ bool canAttack(Creature* pAttacker, Creature* pDefender) { ////////////////////////////////////////////////////////////////////////// // add by Coffee 2007-6-9 -// ¼ʹ¼ ۳֤ܿ +// Ôö¼Óм¼ÄÜÈý×åʹÓÃм¼ÄÜ ¿Û³ý¼¼ÄÜ¿¨ÑéÖ¤ ////////////////////////////////////////////////////////////////////////// bool useSkillCrad(Creature* pCreature) { GamePlayer* pGamePlayer = dynamic_cast(pCreature->getPlayer()); @@ -6792,7 +6792,7 @@ bool useSkillCrad(Creature* pCreature) { CoordInven_t InvenX = 0; CoordInven_t InvenY = 0; - ItemType_t fitItem = 0; // Ҷ + ItemType_t fitItem = 0; // ËÄÒ¶²Ý if (pCreature->isSlayer()) { fitItem = 5; } else if (pCreature->isVampire()) { @@ -6804,7 +6804,7 @@ bool useSkillCrad(Creature* pCreature) { Item* pItem = pPC->getInventory()->findItem(Item::ITEM_CLASS_MOON_CARD, fitItem, InvenX, InvenY); if (pItem == NULL) { GCSystemMessage gcSystemMessage1; - gcSystemMessage1.setMessage("ʹøüҪܿ!"); + gcSystemMessage1.setMessage("ʹÓøü¼ÄÜÐèÒª¼¼ÄÜ¿¨!"); gcSystemMessage1.setType(SYSTEM_MESSAGE_OPERATOR); pGamePlayer->sendPacket(&gcSystemMessage1); return false; @@ -6822,7 +6822,7 @@ bool useSkillCrad(Creature* pCreature) { } else { GCSystemMessage gcSystemMessage1; - gcSystemMessage1.setMessage("ʹøüҪܿ!"); + gcSystemMessage1.setMessage("ʹÓøü¼ÄÜÐèÒª¼¼ÄÜ¿¨!"); gcSystemMessage1.setType(SYSTEM_MESSAGE_OPERATOR); pGamePlayer->sendPacket(&gcSystemMessage1); return false; diff --git a/src/server/gameserver/skill/SkillUtil.h b/src/server/gameserver/skill/SkillUtil.h index f9e34778..28de53a1 100644 --- a/src/server/gameserver/skill/SkillUtil.h +++ b/src/server/gameserver/skill/SkillUtil.h @@ -13,12 +13,12 @@ #include "Vampire.h" ////////////////////////////////////////////////////////////////////////////// -// ũ, +// 매크로, 상수 ////////////////////////////////////////////////////////////////////////////// -// decreaseMana ȣ , -// MP CONSUME_MP, HP 쿡 CONSUME_HP, -// ҸǾ 쿡, BOTH Ѵ. +// decreaseMana를 호출했을 경우, +// MP만 닳았으면 CONSUME_MP를, HP만 닳았을 경우에는 CONSUME_HP를, +// 둘 다 소모되었을 경우에는, BOTH를 리턴한다. #define CONSUME_MP 0 #define CONSUME_HP 1 #define CONSUME_BOTH 2 @@ -40,208 +40,208 @@ class Item; class Zone; ////////////////////////////////////////////////////////////////////////////// -// Լ +// 데미지 계산 함수 ////////////////////////////////////////////////////////////////////////////// -// ڿ ǰ Ķ͸ Ѵ. +// 공격자와 피공격자 사이의 파라미터를 계산해 최종 데미지를 산출한다. Damage_t computeDamage(Creature* pCreature, Creature* pTargetCreature); -// Ѵ. +// 공격자의 순수 데미지를 계산한다. Damage_t computePureDamage(Creature* pCreature); -// ڿ ǰ Ķ͸ Ѵ. -// Լ , Լ θ 쿡 ũƼ Ʈ õ κ óȴ. +// 공격자와 피공격자 사이의 파라미터를 계산해 최종 데미지를 산출한다. +// 위의 함수와 같으나, 이 함수를 부를 경우에는 내부적으로 크리티컬 히트와 관련된 부분이 처리된다. Damage_t computeDamage(Creature* pCreature, Creature* pTargetCreature, int CriticalBonus, bool& bCritical); -// ؼ Ѵ. +// 원래 데미지에서 프로텍션을 제외한 최종 데미지를 리턴한다. double computeFinalDamage(Damage_t minDamage, Damage_t maxDamage, Damage_t realDamage, Protection_t Protection, bool bCritical); -// ̾ ڿ ǰ Ѵ. +// 슬레이어 공격자와 피공격자 사이의 데미지를 계산한다. Damage_t computeSlayerDamage(Slayer* pSlayer, Creature* pTargetCreature, bool bCritical); -// ̾ ڿ ǰ Ѵ. +// 뱀파이어 공격자와 피공격자 사이의 데미지를 계산한다. Damage_t computeVampireDamage(Vampire* pVampire, Creature* pTargetCreature, bool bCritical); -// ƿ콺ͽ ڿ ǰ Ѵ. +// 아우스터스 공격자와 피공격자 사이의 데미지를 계산한다. Damage_t computeOustersDamage(Ousters* pOusters, Creature* pTargetCreature, bool bCritical); -// ڿ ǰ Ѵ. +// 몬스터 공격자와 피공격자 사이의 데미지를 계산한다. Damage_t computeMonsterDamage(Monster* pMonster, Creature* pTargetCreature, bool bCritical); -// ̾ Ѵ. +// 슬레이어 공격자의 순수 데미지를 계산한다. Damage_t computePureSlayerDamage(Slayer* pSlayer); -// ̾ Ѵ. +// 뱀파이어 공격자의 순수 데미지를 계산한다. Damage_t computePureVampireDamage(Vampire* pVampire); -// ƿ콺ͽ Ѵ. +// 아우스터스 공격자의 순수 데미지를 계산한다. Damage_t computePureOustersDamage(Ousters* pOusters); -// ڿ ǰ Ѵ. +// 몬스터 공격자와 피공격자 사이의 데미지를 계산한다. Damage_t computePureMonsterDamage(Monster* pMonster); -// resistance Ѵ. +// resistance를 고려한 마법 데미지를 계산한다. Damage_t computeMagicDamage(Creature* pTargetCreature, int Damage, SkillType_t SkillType, bool bVampire = false, Creature* pAttacker = NULL); -// Ʋ ƿ콺 Ѵ. +// 리스틀릿을 고려한 아우스터즈 마법 데미지를 계산한다. Damage_t computeOustersMagicDamage(Ousters* pOusters, Creature* pTargetCreature, int Damage, SkillType_t SkillType); -// Ÿٿ ġ Ѵ. +// 타겟에게 미치는 은 데미지를 계산한다. Damage_t computeSlayerSilverDamage(Creature* pCreature, int Damage, ModifyInfo* pMI); -// Critical Magic нú ų ȭ ũƼ ȭ Ѵ. +// Critical Magic 과 같은 패시브 스킬로 인한 데미지 변화와 크리티컬 변화를 계산한다. void computeCriticalBonus(Ousters* pOusters, SkillType_t skillType, Damage_t& Damage, bool& bCriticalHit); ////////////////////////////////////////////////////////////////////////////// -// , ߸ ... +// 데미지 세팅, 내구도 떨어뜨리기 등등... ////////////////////////////////////////////////////////////////////////////// -// Ѵ. +// 직접적으로 데미지를 세팅한다. HP_t setDamage(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, SkillType_t SkillType = 0, ModifyInfo* pMI = NULL, ModifyInfo* pAttackerMI = NULL, bool canKillTarget = true, bool canSteal = true); -// ߸. +// 아이템 내구도를 떨어뜨린다. void decreaseDurability(Creature* pCreature, Creature* pTargetCreature, SkillInfo* pSkillInfo, ModifyInfo*, ModifyInfo*); -// Ÿ ɼ ִ°? +// 타겟을 맞출 가능성이 있는가? bool canHit(Creature* pAttacker, Creature* pDefender, SkillType_t SkillType, SkillLevel_t SkillLevel = 0); ////////////////////////////////////////////////////////////////////////////// -// Լ... +// 마나 관련 함수들... ////////////////////////////////////////////////////////////////////////////// -// Ʈ Ҹ ϴ ̾ Ҹ Ѵ. +// 인트에 따라 마나 소모량이 변하는 뱀파이어 마법의 마나 소모량을 계산한다. MP_t decreaseConsumeMP(Vampire* pVampire, SkillInfo* pSkillInfo); -// ϱ ִ°? +// 기술을 사용하기 위한 충분한 마나를 가지고 있는가? bool hasEnoughMana(Creature* pCaster, int RequiredMP); -// δ. +// 마나를 줄인다. int decreaseMana(Creature* pCaster, int MP, ModifyInfo& modifyinfo); ////////////////////////////////////////////////////////////////////////////// -// Ÿ, ӽð, ðüũ Լ... +// 사정거리, 지속시간, 시간체크 등의 검증 함수들... ////////////////////////////////////////////////////////////////////////////// -// ̾ ų Ÿ Ѵ. +// 슬레이어용 스킬의 사정거리를 구한다. Range_t computeSkillRange(SkillSlot* pSkillSlot, SkillInfo* pSkillInfo); -//(OX,OY)(TX,TY) Ÿ Ѵ. +//(OX,OY)와(TX,TY) 사이의 거리를 구한다. Range_t getDistance(ZoneCoord_t OX, ZoneCoord_t OY, ZoneCoord_t TX, ZoneCoord_t TY); -// ų ִ Ÿΰ +// 스킬을 쓸 수 있는 적당한 거리인가를 검증 bool verifyDistance(Creature* pCreature, ZoneCoord_t X, ZoneCoord_t Y, Range_t Distance); -// ų ִ Ÿΰ +// 스킬을 쓸 수 있는 적당한 거리인가를 검증 bool verifyDistance(Creature* pCreature, Creature* pTargetCreature, Range_t Distance); -// ̾ ų ð Ѵ. +// 슬레이어용 스킬의 실행 시간을 검증한다. bool verifyRunTime(SkillSlot* pSkillSlot); -// ̾ ų ð Ѵ. +// 뱀파이어용 스킬의 실행 시간을 검증한다. bool verifyRunTime(VampireSkillSlot* pSkillSlot); -// ƿ콺ͽ ų ð Ѵ. +// 아우스터스용 스킬의 실행 시간을 검증한다. bool verifyRunTime(OustersSkillSlot* pSkillSlot); -// PK å , PK Ǵ Ǵĸ Ѵ. +// 각 존의 PK 정책에 따라, PK가 되느냐 안 되느냐를 정한다. bool verifyPK(Creature* pAttacker, Creature* pDefender); -// ִ ΰ? -// ( , üũϴ Լ...) +// 기술을 사용할 수 있는 존인가? +// (셀프 기술일 경우, 존 레벨을 체크하는 함수다...) bool checkZoneLevelToUseSkill(Creature* pCaster); -// X, Y ִ ũİ ޴ üũϴ Լ. +// X, Y에 서 있는 크리쳐가 임의의 기술에 영향을 받는지 체크하는 함수다. bool checkZoneLevelToHitTarget(Creature* pTargetCreature); -// и ΰ? - 2003. 1. 1. Sequoia +// 기술이 밀리 공격인가? - 2003. 1. 1. Sequoia // bool isMeleeSkill(SkillType_t SkillType); -// Magic ΰ? +// Magic 기술인가? // bool isMagicSkill(SkillType_t SkillType); -// Physic ΰ? +// Physic 기술인가? // bool isPhysicSkill(SkillType_t SkillType); ////////////////////////////////////////////////////////////////////////////// -// Լ... +// 성향 관련 함수들... ////////////////////////////////////////////////////////////////////////////// -// Ѵ. -// ϰų, PK ȭ ϴ Լ. +// 성향을 변경한다. +// 기술을 사용하거나, PK를 할 때 생기는 성향 변화를 계산하는 함수다. void computeAlignmentChange(Creature* pTargetCreature, Damage_t Damage, Creature* pAttacker, ModifyInfo* pMI = NULL, ModifyInfo* pAttackerMI = NULL); -// ̾ ̾ ణ ȸŲ. -// ý Ͱ , ׳ Ÿ -// ణ ȸִ Լ̴. +// 슬레이어 및 뱀파이어가 몹을 죽일 때 성향을 약간씩 회복시킨다. +// 정당 방위 시스템 같은 것과는 관련 없이, 그냥 타종족을 공격할 때 +// 약간씩 성향을 회복시켜주는 함수이다. void increaseAlignment(Creature* pCreature, Creature* pEnemy, ModifyInfo& mi); ////////////////////////////////////////////////////////////////////////////// -// ġ Լ... +// 경험치 관련 함수들... ////////////////////////////////////////////////////////////////////////////// -// Ƽ ̾ ġ Լ +// 파티 관련 슬레이어 경험치 계산 함수 void shareAttrExp(Slayer* pSlayer, Damage_t Damage, BYTE STRMultiplier, BYTE DEXMultiplier, BYTE INTMultiplier, ModifyInfo&); -// Ƽ ̾ ġ Լ +// 파티 관련 뱀파이어 경험치 계산 함수 void shareVampExp(Vampire*, Exp_t, ModifyInfo&); -// Ƽ ƿ콺ͽ ġ Լ +// 파티 관련 아우스터스 경험치 계산 함수 void shareOustersExp(Ousters*, Exp_t, ModifyInfo&); -// ̾ ɷġ(STR,DEX,INT) ġ Ѵ. +// 슬레이어 능력치(STR,DEX,INT) 경험치를 계산한다. void divideAttrExp(Slayer* pSlayer, Damage_t Damage, BYTE STRMultiplier, BYTE DEXMultiplier, BYTE INTMultiplier, ModifyInfo&, int numPartyMember = -1); -// ̾ ġ Ѵ. +// 슬레이어 기술 경험치를 계산한다. void increaseSkillExp(Slayer* pSlayer, SkillDomainType_t DomainType, SkillSlot* pSkillSlot, SkillInfo* pSkillInfo, ModifyInfo&); -// ̾ 迭 ġ Ѵ. +// 슬레이어 계열 경험치를 계산한다. bool increaseDomainExp(Slayer* pSlayer, SkillDomainType_t Domain, Exp_t Exp, ModifyInfo&, Level_t EnemyLevel = 0, int TargetNum = -1); -// ̾ ġ Ѵ. +// 뱀파이어 경험치를 계산한다. void increaseVampExp(Vampire*, Exp_t, ModifyInfo&); -// ƿ콺ͽ ġ Ѵ. +// 아우스터스 경험치를 계산한다. void increaseOustersExp(Ousters*, Exp_t, ModifyInfo&); -// ̾ ̾ Ѵ. +// 슬레이어 및 뱀파이어 명성을 계산한다. void increaseFame(Creature* pAttackee, uint amount); -// ׿ ó +// 죽였을때의 처리 RankExp_t computeRankExp(int myLevel, int otherLevel); void affectKillCount(Creature* pAttacker, Creature* pDeadCreature); ////////////////////////////////////////////////////////////////////////////// -// Ÿ Լ... +// 기타 함수들... ////////////////////////////////////////////////////////////////////////////// -// Ÿ SG, SR ʽ Ѵ. +// 거리에 따른 SG, SR의 보너스를 계산한다. int computeArmsWeaponSplashSize(Item* pWeapon, int ox, int oy, int tx, int ty); int computeArmsWeaponDamageBonus(Item* pWeapon, int ox, int oy, int tx, int ty); int computeArmsWeaponToHitBonus(Item* pWeapon, int ox, int oy, int tx, int ty); -// ǥ ÷ ũĸ ̾ƿ´. +// 지정된 좌표 주위의 스플래쉬 데미지를 맞을 크리쳐를 뽑아온다. int getSplashVictims(Zone* pZone, int cx, int cy, Creature::CreatureClass CClass, list& creatureList, int splash); int getSplashVictims(Zone* pZone, int cx, int cy, Creature::CreatureClass CClass, list& creatureList, int splash, int range); int getSplashVictims(Zone* pZone, int cx, int cy, list& creatureList, int splash); -// HP MP äش. +// 레벨업 시 HP와 MP를 꽉 채워준다. void healCreatureForLevelUp(Slayer* pSlayer, ModifyInfo& _ModifyInfo, SLAYER_RECORD* prev); void healCreatureForLevelUp(Vampire* pVampire, ModifyInfo& _ModifyInfo, VAMPIRE_RECORD* prev); void healCreatureForLevelUp(Ousters* pOusters, ModifyInfo& _ModifyInfo, OUSTERS_RECORD* prev); -// н Ŷ . +// 기술 실패시 패킷을 날린다. void executeSkillFailNormal(Creature* pCreature, SkillType_t SkillType, Creature* pTargetCreature, BYTE Grade = 0); void executeAbsorbSoulSkillFail(Creature* pCreature, SkillType_t SkillType, ObjectID_t TargetObjectID, bool bBroadcast, bool bSendTwice); @@ -256,11 +256,11 @@ Dir_t getDirectionToPosition(int originX, int originY, int destX, int destY); Exp_t computeSkillPointBonus(SkillDomainType_t Domain, SkillLevel_t DomainLevel, Item* pWeapon, Exp_t Point); -// ̸ ɾ ִ°? ( ũķ ) +// 점과 점사이를 걸어서 갈 수 있는가? ( 크리쳐로 막힌 경우는 제외 ) bool isPassLine(Zone* pZone, ZoneCoord_t sX, ZoneCoord_t sY, ZoneCoord_t eX, ZoneCoord_t eY, bool blockByCreature = false); -// ̷ Ѵ. +// 두 점사이의 진선을 이루는 점들을 구한다. void getLinePoint(ZoneCoord_t sX, ZoneCoord_t sY, ZoneCoord_t eX, ZoneCoord_t eY, list& tpList); ElementalType getElementalTypeFromString(const string& type); @@ -268,14 +268,14 @@ ElementalType getElementalTypeFromString(const string& type); Damage_t computeElementalCombatSkill(Ousters* pOusters, Creature* pTargetCreature, ModifyInfo& AttackerMI); ////////////////////////////////////////////////////////////////////////////// -// ִ°? -// ³ non PK ؼ ִ üũѴ. +// 공격할 수 있는가? +// 무적 상태나 non PK 를 위해서 공격할 수 있는지를 체크한다. ////////////////////////////////////////////////////////////////////////////// bool canAttack(Creature* pAttacker, Creature* pDefender); ////////////////////////////////////////////////////////////////////////// // add by Coffee 2007-6-9 -// ¼ʹ¼ ۳֤ܿ +// 藤속劤세콘힛痢賈痰劤세콘 왱뇜세콘엥駱聯 ////////////////////////////////////////////////////////////////////////// bool useSkillCrad(Creature* pCreature); diff --git a/src/server/gameserver/skill/SkyFire.cpp b/src/server/gameserver/skill/SkyFire.cpp index 616b127b..dd38c92a 100644 --- a/src/server/gameserver/skill/SkyFire.cpp +++ b/src/server/gameserver/skill/SkyFire.cpp @@ -22,7 +22,7 @@ void SkyFire::execute(Slayer* pSlayer, ObjectID_t targetObjectID, SkillSlot* pSk Creature* pTargetCreature = pZone->getCreature(targetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -67,7 +67,7 @@ void SkyFire::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* SIMPLE_SKILL_OUTPUT result; - // ǥġ+4 + // 목표위치+4방향 /* param.addMask( 0 + dir_advance[dir][0], 0 + dir_advance[dir][1], 100); param.addMask(-1 + dir_advance[dir][0], -1 + dir_advance[dir][1], 100); param.addMask( 0 + dir_advance[dir][0], -1 + dir_advance[dir][1], 100); diff --git a/src/server/gameserver/skill/SnakeCombo.cpp b/src/server/gameserver/skill/SnakeCombo.cpp index 8f57e23d..b0c53b48 100644 --- a/src/server/gameserver/skill/SnakeCombo.cpp +++ b/src/server/gameserver/skill/SnakeCombo.cpp @@ -9,7 +9,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void SnakeCombo::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/Sniping.cpp b/src/server/gameserver/skill/Sniping.cpp index c761a9df..03082b77 100644 --- a/src/server/gameserver/skill/Sniping.cpp +++ b/src/server/gameserver/skill/Sniping.cpp @@ -15,7 +15,7 @@ #include "ZoneUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Sniping::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -34,7 +34,7 @@ void Sniping::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffec Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ ̰ų, ƴ϶ . + // 무장하고 있는 무기가 널이거나, 총이 아니라면 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || isArmsWeapon(pItem) == false || pSlayer->hasRelicItem()) { executeSkillFailException(pSlayer, getSkillType()); @@ -70,9 +70,9 @@ void Sniping::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffec SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. - // ɷġ EffectFadeOut unaffectǸ鼭, - // EffectSnipingMode 鼭 ̷. + // 이펙트 클래스를 만들어 붙인다. + // 능력치 재계산은 EffectFadeOut이 unaffect되면서, + // 즉 EffectSnipingMode가 붙으면서 이루어진다. EffectFadeOut* pEffect = new EffectFadeOut(pSlayer); pEffect->setDuration(output.Duration); pEffect->setDeadline(40); @@ -80,14 +80,14 @@ void Sniping::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffec pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_FADE_OUT); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 8, 1, _GCSkillToSelfOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); - // Ŷ . + // 패킷을 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(0); @@ -137,7 +137,7 @@ void Sniping::checkRevealRatio(Creature* pCreature, int base, int divisor) { if (rand() % 100 < pEffectSM->getRevealRatio()) { // addUnSnipingModeCreature(pZone, pCreature, true); - // Ʈ Ѵ. + // 이펙트가 꺼지도록 한다. // 2003. 1. 17 by bezz pEffectSM->setDeadline(0); } diff --git a/src/server/gameserver/skill/SoulChain.cpp b/src/server/gameserver/skill/SoulChain.cpp index c11cbc3a..b2fa9920 100644 --- a/src/server/gameserver/skill/SoulChain.cpp +++ b/src/server/gameserver/skill/SoulChain.cpp @@ -17,7 +17,7 @@ #include "war/WarSystem.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void SoulChain::execute(Slayer* pSlayer, const string& targetName, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -50,8 +50,8 @@ void SoulChain::execute(Slayer* pSlayer, const string& targetName, SkillSlot* pS SkillType_t SkillType = pSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // ų ̾ ׷ Ͷ ִ. - // ε ӵ ų ƴϹǷ ְ Ѵ. + // 이 스킬은 모든 슬레이어 그랜드 마스터라면 쓸 수 있다. + // 도메인데 종속된 스킬이 아니므로 도메인 중 최고 레벨을 현재 도메인으로 한다. SkillDomainType_t DomainType = pSlayer->getHighestSkillDomain(); ZoneCoord_t x = pSlayer->getX(); @@ -64,30 +64,30 @@ void SoulChain::execute(Slayer* pSlayer, const string& targetName, SkillSlot* pS if (pTarget != NULL) { Zone* pTargetZone = pTarget->getZone(); if (pTargetZone != NULL) { - // Target üũ - // ̾ Ѵ. + // Target 체크 + // 같은 종족이어야 한다. bool bSlayer = pTarget->isSlayer(); - // Ϲ ̿ ȴ. + // 일반 유저이여야 된다. bool bPLAYER = pTarget->getCompetence() == PLAYER; bool bMasterLair = pTargetZone->isMasterLair() || GDRLairManager::Instance().isGDRLairZone(pTargetZone->getZoneID()); - // Ѱ? + // 유료 서비스 사용이 가능한가? bool bValidPay = pGamePlayer->loginPayPlay(pGamePlayer->getSocket()->getHost(), pGamePlayer->getID()) || pGamePlayer->isFamilyFreePass() || !g_pZoneInfoManager->getZoneInfo(pTargetZone->getZoneID())->isPayPlay(); - // ɺ, ÿܰ, ̺Ʈ, ̺ƮOX, ׸޸δ . + // 야전사령부, 시외곽지역, 이벤트경기장, 이벤트OX, 테메리에로는 갈 수 없다. bool bValidZone = pTargetZone->getZoneID() != 2101 && pTargetZone->getZoneID() != 2102 && pTargetZone->getZoneID() != 1005 && pTargetZone->getZoneID() != 1006 && pTargetZone->getZoneID() != 1122 && pTargetZone->getZoneID() != 1131 && pTargetZone->getZoneID() != 1132 && pTargetZone->getZoneID() != 1133 && pTargetZone->getZoneID() != 1134 && !pTargetZone->isCastleZone() && - // ̳ ε Ѿư . 2003. 1.20. by bezz, Sequoia - // ƴ ε Ѿư . 2003. 2. 8. by Sequoia + // 성이나 마스터 레어로도 쫓아갈 수 없다. 2003. 1.20. by bezz, Sequoia + // 아담의 성지 내로도 쫓아갈 수 없다. 2003. 2. 8. by Sequoia (!g_pWarSystem->hasActiveRaceWar() || !pTargetZone->isHolyLand()) && !pTargetZone->isCastle() && !pTargetZone->isMasterLair() && !g_pPKZoneInfoManager->isPKZone(pTargetZone->getZoneID()) && - // ̳ ε . + // 다이나믹 존으로도 갈 수 없다. !pTargetZone->isDynamicZone(); bValidTarget = bSlayer && bPLAYER && !bMasterLair && bValidPay && bValidZone; @@ -112,7 +112,7 @@ void SoulChain::execute(Slayer* pSlayer, const string& targetName, SkillSlot* pS SkillOutput output; computeOutput(input, output); - // 10 Ʈ δ. + // 10 초 동안 움직일 수 없도록 이펙트를 붙인다. EffectSoulChain* pEffect = new EffectSoulChain(pSlayer); pEffect->setDuration(output.Duration); pEffect->setDeadline(100); @@ -125,7 +125,7 @@ void SoulChain::execute(Slayer* pSlayer, const string& targetName, SkillSlot* pS pZone->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_SOUL_CHAIN); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); @@ -155,7 +155,7 @@ void SoulChain::execute(Slayer* pSlayer, const string& targetName, SkillSlot* pS increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); - // Ŷ . + // 패킷을 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(0); @@ -185,7 +185,7 @@ void SoulChain::execute(Slayer* pSlayer, const string& targetName, SkillSlot* pS ////////////////////////////////////////////////////////////////////////////// -// ̾ +// 뱀파이어 셀프 ////////////////////////////////////////////////////////////////////////////// void SoulChain::execute(Vampire* pVampire, const string& targetName, VampireSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -229,20 +229,20 @@ void SoulChain::execute(Vampire* pVampire, const string& targetName, VampireSkil if (pTarget != NULL) { Zone* pTargetZone = pTarget->getZone(); if (pTargetZone != NULL) { - // Target üũ - // ̾ Ѵ. + // Target 체크 + // 같은 종족이어야 한다. bool bVampire = pTarget->isVampire(); - // Ϲ ̿ ȴ. + // 일반 유저이여야 된다. bool bPLAYER = pTarget->getCompetence() == PLAYER; - // δ ̵ . + // 마스터 레어로는 이동할 수 없다. bool bMasterLair = pTargetZone->isMasterLair() || GDRLairManager::Instance().isGDRLairZone(pTargetZone->getZoneID()); - // Ѱ? + // 유료 서비스 사용이 가능한가? bool bValidPay = pGamePlayer->loginPayPlay(pGamePlayer->getSocket()->getHost(), pGamePlayer->getID()) || pGamePlayer->isFamilyFreePass() || !g_pZoneInfoManager->getZoneInfo(pTargetZone->getZoneID())->isPayPlay(); - // ɺ, ÿܰ, ̺Ʈ, ̺ƮOX, ׸޸δ . + // 야전사령부, 시외곽지역, 이벤트경기장, 이벤트OX, 테메리에로는 갈 수 없다. bool bValidZone = pTargetZone->getZoneID() != 2101 && pTargetZone->getZoneID() != 2102 && pTargetZone->getZoneID() != 1005 && pTargetZone->getZoneID() != 1006 && pTargetZone->getZoneID() != 1122 && pTargetZone->getZoneID() != 1131 && @@ -251,7 +251,7 @@ void SoulChain::execute(Vampire* pVampire, const string& targetName, VampireSkil (!g_pWarSystem->hasActiveRaceWar() || !pTargetZone->isHolyLand()) && !pTargetZone->isCastle() && !pTargetZone->isMasterLair() && !g_pPKZoneInfoManager->isPKZone(pTargetZone->getZoneID()) && - // ̳ ε . + // 다이나믹 존으로도 갈 수 없다. !pTargetZone->isDynamicZone(); bValidTarget = bVampire && bPLAYER && !bMasterLair && bValidPay && bValidZone; @@ -276,7 +276,7 @@ void SoulChain::execute(Vampire* pVampire, const string& targetName, VampireSkil SkillOutput output; computeOutput(input, output); - // 10 Ʈ δ. + // 10 초 동안 움직일 수 없도록 이펙트를 붙인다. EffectSoulChain* pEffect = new EffectSoulChain(pVampire); pEffect->setDuration(output.Duration); pEffect->setDeadline(100); @@ -317,7 +317,7 @@ void SoulChain::execute(Vampire* pVampire, const string& targetName, VampireSkil } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 +// 아우스터즈 셀프 ////////////////////////////////////////////////////////////////////////////// void SoulChain::execute(Ousters* pOusters, const string& targetName, OustersSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -361,20 +361,20 @@ void SoulChain::execute(Ousters* pOusters, const string& targetName, OustersSkil if (pTarget != NULL) { Zone* pTargetZone = pTarget->getZone(); if (pTargetZone != NULL) { - // Target üũ - // ̾ Ѵ. + // Target 체크 + // 같은 종족이어야 한다. bool bOusters = pTarget->isOusters(); - // Ϲ ̿ ȴ. + // 일반 유저이여야 된다. bool bPLAYER = pTarget->getCompetence() == PLAYER; - // δ ̵ . + // 마스터 레어로는 이동할 수 없다. bool bMasterLair = pTargetZone->isMasterLair() || GDRLairManager::Instance().isGDRLairZone(pTargetZone->getZoneID()); - // Ѱ? + // 유료 서비스 사용이 가능한가? bool bValidPay = pGamePlayer->loginPayPlay(pGamePlayer->getSocket()->getHost(), pGamePlayer->getID()) || pGamePlayer->isFamilyFreePass() || !g_pZoneInfoManager->getZoneInfo(pTargetZone->getZoneID())->isPayPlay(); - // ɺ, ÿܰ, ̺Ʈ, ̺ƮOX, ׸޸δ . + // 야전사령부, 시외곽지역, 이벤트경기장, 이벤트OX, 테메리에로는 갈 수 없다. bool bValidZone = pTargetZone->getZoneID() != 2101 && pTargetZone->getZoneID() != 2102 && pTargetZone->getZoneID() != 1005 && pTargetZone->getZoneID() != 1006 && pTargetZone->getZoneID() != 1122 && pTargetZone->getZoneID() != 1131 && @@ -383,7 +383,7 @@ void SoulChain::execute(Ousters* pOusters, const string& targetName, OustersSkil (!g_pWarSystem->hasActiveRaceWar() || !pTargetZone->isHolyLand()) && !pTargetZone->isCastle() && !pTargetZone->isMasterLair() && !g_pPKZoneInfoManager->isPKZone(pTargetZone->getZoneID()) && - // ̳ ε . + // 다이나믹 존으로도 갈 수 없다. !pTargetZone->isDynamicZone(); bValidTarget = bOusters && bPLAYER && !bMasterLair && bValidPay && bValidZone; @@ -408,7 +408,7 @@ void SoulChain::execute(Ousters* pOusters, const string& targetName, OustersSkil SkillOutput output; computeOutput(input, output); - // 10 Ʈ δ. + // 10 초 동안 움직일 수 없도록 이펙트를 붙인다. EffectSoulChain* pEffect = new EffectSoulChain(pOusters); pEffect->setDuration(output.Duration); pEffect->setDeadline(100); diff --git a/src/server/gameserver/skill/SoulRebirth.cpp b/src/server/gameserver/skill/SoulRebirth.cpp index 04b83aaf..c14228d0 100644 --- a/src/server/gameserver/skill/SoulRebirth.cpp +++ b/src/server/gameserver/skill/SoulRebirth.cpp @@ -18,7 +18,7 @@ #include "Properties.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void SoulRebirth::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -40,7 +40,7 @@ void SoulRebirth::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // ƿ콺 ǻ츱 ִ. + // 아우스터즈만 되살릴 수 있다. if (pTargetCreature == NULL || !pTargetCreature->isOusters() || (g_pConfig->hasKey("Hardcore") && g_pConfig->getPropertyInt("Hardcore") != 0)) { executeSkillFailException(pOusters, getSkillType()); @@ -50,7 +50,7 @@ void SoulRebirth::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersS Ousters* pTargetOusters = dynamic_cast(pTargetCreature); Assert(pTargetOusters != NULL); - // Ÿٿ ڸ Ʈ ɷ ʰų, ° ƴ϶ . + // 타겟에게 코마 이펙트가 걸려있지 않거나, 죽은 상태가 아니라면 쓸 수 없다. if (!pTargetOusters->isFlag(Effect::EFFECT_CLASS_COMA) || !pTargetOusters->isDead()) { executeSkillFailException(pOusters, getSkillType()); return; @@ -109,11 +109,11 @@ void SoulRebirth::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersS if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bCanSoulRebirth && bCheckRatio) { decreaseMana(pOusters, RequiredMP, _GCSkillToObjectOK1); - // Ÿ Ʈ Ŵ ڸ Ʈ Ѵ. + // 타겟의 이펙트 매니저에서 코마 이펙트를 삭제한다. pTargetCreature->deleteEffect(Effect::EFFECT_CLASS_COMA); pTargetCreature->removeFlag(Effect::EFFECT_CLASS_COMA); - // ڸ Ʈ ưٰ ˷ش. + // 코마 이펙트가 날아갔다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pTargetOusters->getObjectID()); gcRemoveEffect.addEffectList((EffectID_t)Effect::EFFECT_CLASS_COMA); @@ -134,12 +134,12 @@ void SoulRebirth::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersS pEffectKillAftermath->create(pTargetOusters->getName()); } - // ü 10% ä. + // 대상의 체력을 10%만 채운다. HP_t CurrentHP = getPercentValue(pTargetOusters->getHP(ATTR_MAX), HealRatio); pTargetOusters->setHP(CurrentHP, ATTR_CURRENT); // pTargetOusters->setMP(0, ATTR_CURRENT); - // ü äٴ ˸. + // 주위에 체력이 채워졌다는 사실을 알린다. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pTargetOusters->getObjectID()); gcStatusCurrentHP.setCurrentHP(pTargetOusters->getHP(ATTR_CURRENT)); diff --git a/src/server/gameserver/skill/SpiralSlay.cpp b/src/server/gameserver/skill/SpiralSlay.cpp index 59def0f7..93285627 100644 --- a/src/server/gameserver/skill/SpiralSlay.cpp +++ b/src/server/gameserver/skill/SpiralSlay.cpp @@ -9,7 +9,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void SpiralSlay::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/SpiritGuard.cpp b/src/server/gameserver/skill/SpiritGuard.cpp index b7701a3f..c5687d14 100644 --- a/src/server/gameserver/skill/SpiritGuard.cpp +++ b/src/server/gameserver/skill/SpiritGuard.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void SpiritGuard::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -49,22 +49,22 @@ void SpiritGuard::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pSlayer, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectSpiritGuard* pEffect = new EffectSpiritGuard(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setLevel(SkillLevel); pEffect->setDamage(output.Damage); - pEffect->setNextTime(0); // ϴ ܹ ߵѴ. by Sequoia + pEffect->setNextTime(0); // 일단 단번에 발동한다. by Sequoia pEffect->setDelay(output.Tick); // added by Sequoia pSlayer->addEffect(pEffect); pSlayer->setFlag(Effect::EFFECT_CLASS_SPIRIT_GUARD_1); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); diff --git a/src/server/gameserver/skill/SpitStream.cpp b/src/server/gameserver/skill/SpitStream.cpp index e1d5b1eb..b3f6f7f4 100644 --- a/src/server/gameserver/skill/SpitStream.cpp +++ b/src/server/gameserver/skill/SpitStream.cpp @@ -9,7 +9,7 @@ #include "SimpleLinearMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void SpitStream::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -25,7 +25,7 @@ void SpitStream::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Zone* pZone = pSlayer->getZone(); Creature* pTargetCreature = pZone->getCreature(TargetObjectID); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -42,7 +42,7 @@ void SpitStream::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void SpitStream::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -64,7 +64,7 @@ void SpitStream::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo param.STRMultiplier = 8; param.DEXMultiplier = 1; param.INTMultiplier = 1; - // param.Level = 2; // 2 ؾ ϳ? + // param.Level = 2; // 2로 해야 하나? param.bMagicHitRoll = false; param.bMagicDamage = false; param.bAdd = true; diff --git a/src/server/gameserver/skill/StoneAuger.cpp b/src/server/gameserver/skill/StoneAuger.cpp index fc762b51..cf5c8894 100644 --- a/src/server/gameserver/skill/StoneAuger.cpp +++ b/src/server/gameserver/skill/StoneAuger.cpp @@ -10,7 +10,7 @@ #include "SimpleTileMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void StoneAuger::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -30,7 +30,7 @@ void StoneAuger::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pOusters, pTargetCreature)) { executeSkillFailException(pOusters, getSkillType()); return; diff --git a/src/server/gameserver/skill/StoneSkin.cpp b/src/server/gameserver/skill/StoneSkin.cpp index cd52f81d..a8e7873d 100644 --- a/src/server/gameserver/skill/StoneSkin.cpp +++ b/src/server/gameserver/skill/StoneSkin.cpp @@ -18,7 +18,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void StoneSkin::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -43,7 +43,7 @@ void StoneSkin::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, SkillType_t SkillType = pVampireSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // Knowledge of Curse ִٸ hit bonus 10 + // Knowledge of Curse 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE); @@ -62,28 +62,28 @@ void StoneSkin::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pVampire, RequiredMP, _GCSkillToSelfOK1); - // ų ʽ ޶. + // 스킬 레벨에 따라 데미지 보너스가 달라진다. SkillInput input(pVampire); SkillOutput output; input.SkillLevel = pVampire->getSTR() + pVampire->getDEX() + pVampire->getINT(); input.DomainLevel = pVampire->getLevel(); computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectStoneSkin* pEffect = new EffectStoneSkin(pVampire); pEffect->setDeadline(output.Duration); pEffect->setBonus(output.Damage); pVampire->addEffect(pEffect); pVampire->setFlag(Effect::EFFECT_CLASS_STONE_SKIN); - // ̷ Ͽ ٲ ɷġ . + // 이로 인하여 바뀌는 능력치를 보낸다. VAMPIRE_RECORD prev; pVampire->getVampireRecord(prev); pVampire->initAllStat(); pVampire->sendRealWearingInfo(); pVampire->sendModifyInfo(prev); - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(output.Duration); @@ -96,7 +96,7 @@ void StoneSkin::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, pZone->broadcastPacket(pVampire->getX(), pVampire->getY(), &_GCSkillToSelfOK2, pVampire); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pVampire->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_STONE_SKIN); diff --git a/src/server/gameserver/skill/Striking.cpp b/src/server/gameserver/skill/Striking.cpp index 7b34db2d..c304157d 100644 --- a/src/server/gameserver/skill/Striking.cpp +++ b/src/server/gameserver/skill/Striking.cpp @@ -16,7 +16,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Striking::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,8 +37,8 @@ void Striking::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // ̾ ܿ . - // NoSuch. by sigi. 2002.5.2 + // 슬레이어 외에는 걸 수 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isSlayer() == false) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -74,7 +74,7 @@ void Striking::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ ؼ δ. + // 이펙트 오브젝트를 생성해서 붙인다. EffectStriking* pEffect = new EffectStriking(pTargetSlayer); pEffect->setDeadline(output.Duration); pEffect->setTargetItem(pItem); @@ -82,14 +82,14 @@ void Striking::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS pTargetSlayer->setFlag(Effect::EFFECT_CLASS_STRIKING); pTargetSlayer->addEffect(pEffect); - // Ʈ ٿ Ѵ. + // 이펙트를 붙였으니 계산을 새로 한다. SLAYER_RECORD prev; pTargetSlayer->getSlayerRecord(prev); pTargetSlayer->initAllStat(); pTargetSlayer->sendRealWearingInfo(); pTargetSlayer->addModifyInfo(prev, _GCSkillToObjectOK2); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToObjectOK1); @@ -157,7 +157,7 @@ void Striking::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void Striking::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -203,7 +203,7 @@ void Striking::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffe SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ ؼ δ. + // 이펙트 오브젝트를 생성해서 붙인다. EffectStriking* pEffect = new EffectStriking(pSlayer); pEffect->setDeadline(output.Duration); pEffect->setDamageBonus(output.Damage); @@ -211,21 +211,21 @@ void Striking::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffe pSlayer->setFlag(Effect::EFFECT_CLASS_STRIKING); pSlayer->addEffect(pEffect); - // Ʈ ٿ Ѵ. + // 이펙트를 붙였으니 계산을 새로 한다. SLAYER_RECORD prev; pSlayer->getSlayerRecord(prev); pSlayer->initAllStat(); pSlayer->sendRealWearingInfo(); pSlayer->addModifyInfo(prev, _GCSkillToSelfOK1); - // ġ ø. + // 경험치를 올린다. SkillGrade Grade = g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = 10 * (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToSelfOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToSelfOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); - // Ŷ . + // 패킷을 날린다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(0); diff --git a/src/server/gameserver/skill/SummonCasket.cpp b/src/server/gameserver/skill/SummonCasket.cpp index a14e675a..0817feda 100644 --- a/src/server/gameserver/skill/SummonCasket.cpp +++ b/src/server/gameserver/skill/SummonCasket.cpp @@ -18,7 +18,7 @@ #include "ZoneUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 뱀파이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void SummonCasket::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -54,7 +54,7 @@ void SummonCasket::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEff ZoneCoord_t x = pVampire->getX(); ZoneCoord_t y = pVampire->getY(); - // Knowledge of Summon ִٸ hit bonus 10 + // Knowledge of Summon 이 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_SUMMON)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_SUMMON); @@ -82,7 +82,7 @@ void SummonCasket::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEff computeOutput(input, output); - // ̾ ϱ Ŷ . + // 뱀파이어를 땅 위에서 삭제하기 이전에 기술 패킷들을 날린다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(output.Duration); @@ -95,14 +95,14 @@ void SummonCasket::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEff pZone->broadcastPacket(x, y, &_GCSkillToSelfOK3, pVampire); //--------------------------------------------------------------- - // ȿ Ѵ. + // 기존의 지속 마법 효과를 제거한다. //--------------------------------------------------------------- EffectManager* pEffectManager = pVampire->getEffectManager(); Assert(pEffectManager != NULL); Effect* pCheckEffect = NULL; - // level Ѵ. + // 사용자의 level을 구한다. int userLevel = pVampire->getLevel(); Effect::EffectClass effectClass; @@ -145,7 +145,7 @@ void SummonCasket::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEff //--------------------------------------------------------------- - // Ʈ Ʈ δ. + // 이펙트 오브젝트를 생성해 붙인다. //--------------------------------------------------------------- EffectSummonCasket* pEffect = new EffectSummonCasket(pVampire); pEffect->setDeadline(99999999); @@ -153,7 +153,7 @@ void SummonCasket::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEff pVampire->addEffect(pEffect); pVampire->setFlag(Effect::EFFECT_CLASS_CASKET); - // SUMMON CASKET ϴ ɷġ Ѵ.. 2002.12.13 by bezz. + // SUMMON CASKET 에 의해 변하는 능력치가 변한다.. 2002.12.13 by bezz. VAMPIRE_RECORD prev; pVampire->getVampireRecord(prev); @@ -183,7 +183,7 @@ void SummonCasket::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEff } ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void SummonCasket::execute(Monster* pMonster) @@ -224,19 +224,19 @@ void SummonCasket::execute(Monster* pMonster) if (bRangeCheck && bHitRoll && bTileCheck && bMoveModeCheck && !bEffected) { - // ͸ ϱ Ŷ . + // 몬스터를 땅 위에서 삭제하기 이전에 기술 패킷들을 날린다. _GCSkillToSelfOK3.setXY(x, y); _GCSkillToSelfOK3.setDuration(0); _GCSkillToSelfOK3.setSkillType(SkillType); pZone->broadcastPacket(x, y, &_GCSkillToSelfOK3); - // ִ ϶ ˸. + // 땅 위에 나와있는 몬스터 삭제하라고 알린다. GCDeleteObject gcDO; gcDO.setObjectID(pMonster->getObjectID()); pZone->broadcastPacket(x, y, &gcDO); - // ӿٰ ͸ ߰Ѵ. + // 땅 속에다가 몬스터를 추가한다. addBurrowingCreature(pZone, pMonster, x, y); } else diff --git a/src/server/gameserver/skill/SummonClay.cpp b/src/server/gameserver/skill/SummonClay.cpp index 8ec55ef6..79729c98 100644 --- a/src/server/gameserver/skill/SummonClay.cpp +++ b/src/server/gameserver/skill/SummonClay.cpp @@ -79,7 +79,7 @@ SummonClay::SummonClay() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void SummonClay::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -110,8 +110,8 @@ void SummonClay::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSk // Assert(pTargetCreature != NULL); - // NPC . - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType(), Grade); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -130,7 +130,7 @@ void SummonClay::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSk } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ÿ ڵ鷯 +// 아우스터즈 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void SummonClay::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -175,7 +175,7 @@ void SummonClay::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster SkillType_t SkillType = pOustersSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); @@ -206,7 +206,7 @@ void SummonClay::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster for (int oY = pt.y - 2; oY <= pt.y + 2; ++oY) { if (!rect.ptInRect(oX, oY)) continue; - // check Ч + // check 槻벎 if (pZone->getTile(oX, oY).getEffect(Effect::EFFECT_CLASS_DARKNESS) != NULL || pZone->getTile(oX, oY).getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL || pZone->getTile(oX, oY).getEffect(Effect::EFFECT_CLASS_PROMINENCE) != NULL || @@ -255,7 +255,7 @@ void SummonClay::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster if (tile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION)) continue; - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_SUMMON_CLAY); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); @@ -264,7 +264,7 @@ void SummonClay::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster ////////////////////////////////////////////////////////////////////////// // edit by Coffee 2007-5-8 - // Ƿлƶ + // 쇱꿎角뤠唐뼝뗀 pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_YELLOW_POISON); if (pOldEffect != NULL) { // @@ -276,15 +276,15 @@ void SummonClay::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster ////////////////////////////////////////////////////////////////////////// - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectSummonClay* pEffect = new EffectSummonClay(pZone, oX, oY); pEffect->setDeadline(output.Duration); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); diff --git a/src/server/gameserver/skill/SummonFireElemental.cpp b/src/server/gameserver/skill/SummonFireElemental.cpp index 727f7901..ee6087e9 100644 --- a/src/server/gameserver/skill/SummonFireElemental.cpp +++ b/src/server/gameserver/skill/SummonFireElemental.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void SummonFireElemental::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -58,12 +58,12 @@ void SummonFireElemental::execute(Ousters* pOusters, OustersSkillSlot* pOustersS if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bSatisfyRequire) { decreaseMana(pOusters, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); - // cout << pOusters->getName() << " SummonFireElemental " << output.Damage << "Դϴ." << + // cout << pOusters->getName() << "이 SummonFireElemental를 썼고 데미지는 " << output.Damage << "입니다." << // endl; Damage_t Damage = output.Damage; @@ -71,7 +71,7 @@ void SummonFireElemental::execute(Ousters* pOusters, OustersSkillSlot* pOustersS bool dummy; computeCriticalBonus(pOusters, getSkillType(), Damage, dummy); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectSummonFireElemental* pEffect = new EffectSummonFireElemental(pOusters); pEffect->setDeadline(output.Duration); pEffect->setDamage(Damage); diff --git a/src/server/gameserver/skill/SummonGoreGland.cpp b/src/server/gameserver/skill/SummonGoreGland.cpp index d83941e6..f51d2ea4 100644 --- a/src/server/gameserver/skill/SummonGoreGland.cpp +++ b/src/server/gameserver/skill/SummonGoreGland.cpp @@ -17,7 +17,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void SummonGoreGland::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -37,8 +37,8 @@ void SummonGoreGland::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vamp Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -57,7 +57,7 @@ void SummonGoreGland::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vamp } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void SummonGoreGland::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -95,7 +95,7 @@ void SummonGoreGland::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, V if (!rect.ptInRect(X, Y)) { /* Tile& tile = pZone->getTile(X, Y); if (tile.canAddEffect()) bTileCheck = true; - // ӽ ׶ ߰ Ѵ. + // 머시 그라운드 있음 추가 못한당. if ( tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL ) bTileCheck=false; if ( tile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION) != NULL ) bTileCheck=false;*/ bTileCheck = false; @@ -105,9 +105,9 @@ void SummonGoreGland::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, V decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); // Tile& tile = pZone->getTile(X, Y); - Range_t Range = 1; // ׻ 1̴. + Range_t Range = 1; // 항상 1이다. - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); diff --git a/src/server/gameserver/skill/SummonGroundElemental.cpp b/src/server/gameserver/skill/SummonGroundElemental.cpp index dfe296c7..af632649 100644 --- a/src/server/gameserver/skill/SummonGroundElemental.cpp +++ b/src/server/gameserver/skill/SummonGroundElemental.cpp @@ -79,7 +79,7 @@ SummonGroundElemental::SummonGroundElemental() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void SummonGroundElemental::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -110,8 +110,8 @@ void SummonGroundElemental::execute(Ousters* pOusters, ObjectID_t TargetObjectID // Assert(pTargetCreature != NULL); - // NPC . - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType(), Grade); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -130,7 +130,7 @@ void SummonGroundElemental::execute(Ousters* pOusters, ObjectID_t TargetObjectID } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ÿ ڵ鷯 +// 아우스터즈 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void SummonGroundElemental::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -175,7 +175,7 @@ void SummonGroundElemental::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_ SkillType_t SkillType = pOustersSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); @@ -229,7 +229,7 @@ void SummonGroundElemental::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_ Regen = 1 HP per 1 sec */ Monster* pGroundElemental = new Monster(GROUND_ELEMENTAL_TYPE); - pGroundElemental->setName(" "); + pGroundElemental->setName("대지 정령"); pGroundElemental->setHP(1000 + input.SkillLevel * 100); pGroundElemental->setHP(1000 + input.SkillLevel * 100, ATTR_MAX); pGroundElemental->setDefense(0); @@ -242,14 +242,14 @@ void SummonGroundElemental::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_ pGroundElemental->removeFlag(Effect::EFFECT_CLASS_HIDE); pGroundElemental->setMoveMode(Creature::MOVE_MODE_WALKING); - // + // 무뇌정령 pGroundElemental->setBrain(NULL); pZone->addCreature(pGroundElemental, X, Y, 2); X = pGroundElemental->getX(); Y = pGroundElemental->getY(); - cout << pGroundElemental->toString() << " " << X << ", " << Y << " ҷ½ϴ." << endl; + cout << pGroundElemental->toString() << " 을 " << X << ", " << Y << " 에 불러냈습니다." << endl; EffectGroundElemental* pCreatureEffect = new EffectGroundElemental(pGroundElemental); pCreatureEffect->setDeadline(output.Duration); @@ -282,22 +282,22 @@ void SummonGroundElemental::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_ if (tile.getEffect(Effect::EFFECT_CLASS_TRYING_POSITION)) continue; - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_GROUND_ELEMENTAL_AURA); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); } - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectSummonGroundElemental* pEffect = new EffectSummonGroundElemental(pZone, oX, oY); pEffect->setDeadline(output.Duration); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); diff --git a/src/server/gameserver/skill/SummonMiga.cpp b/src/server/gameserver/skill/SummonMiga.cpp index ee249763..35731024 100644 --- a/src/server/gameserver/skill/SummonMiga.cpp +++ b/src/server/gameserver/skill/SummonMiga.cpp @@ -21,7 +21,7 @@ SummonMiga::SummonMiga() throw() {} ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ʈ ڵ鷯 +// 아우스터즈 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void SummonMiga::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -52,8 +52,8 @@ void SummonMiga::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSk // Assert(pTargetCreature != NULL); - // NPC . - if (pTargetCreature == NULL // NoSuch .. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + if (pTargetCreature == NULL // NoSuch제거 때문에.. by sigi. 2002.5.2 || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType(), Grade); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; @@ -72,7 +72,7 @@ void SummonMiga::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSk } ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 Ÿ ڵ鷯 +// 아우스터즈 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void SummonMiga::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -117,7 +117,7 @@ void SummonMiga::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster SkillType_t SkillType = pOustersSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); @@ -140,7 +140,7 @@ void SummonMiga::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster decreaseMana(pOusters, RequiredMP, _GCSkillToTileOK1); Monster* pMiga = new Monster(MIGA_TYPE); - pMiga->setName("̰"); + pMiga->setName("미가"); pMiga->setClanType(33); pMiga->setTreasure(false); pMiga->setScanEnemy(true); @@ -155,7 +155,7 @@ void SummonMiga::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, Ouster X = pMiga->getX(); Y = pMiga->getY(); - cout << pMiga->toString() << " " << X << ", " << Y << " ҷ½ϴ." << endl; + cout << pMiga->toString() << " 을 " << X << ", " << Y << " 에 불러냈습니다." << endl; EffectKillTimer* pCreatureEffect = new EffectKillTimer(pMiga); pCreatureEffect->setDeadline(output.Duration); diff --git a/src/server/gameserver/skill/SummonMigaAttack.cpp b/src/server/gameserver/skill/SummonMigaAttack.cpp index a6755e04..884e3378 100644 --- a/src/server/gameserver/skill/SummonMigaAttack.cpp +++ b/src/server/gameserver/skill/SummonMigaAttack.cpp @@ -12,8 +12,8 @@ ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// SummonMigaAttack::SummonMigaAttack() throw() { __BEGIN_TRY @@ -22,7 +22,7 @@ SummonMigaAttack::SummonMigaAttack() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void SummonMigaAttack::execute(Monster* pMonster) @@ -46,7 +46,7 @@ void SummonMigaAttack::execute(Monster* pMonster) if (bRangeCheck) { //-------------------------------------------------------- - // knockbackǴ¸´ ֵ üũش. + // 주위에 knockback되는맞는 애들을 체크해준다. //-------------------------------------------------------- SkillInput input(pMonster); SkillOutput output; @@ -79,7 +79,7 @@ void SummonMigaAttack::execute(Monster* pMonster) pEffect->setDeadline(8); pMonster->addEffect(pEffect); } else - cout << "̰ " << endl; + cout << "미가 자폭 실패" << endl; } else { executeSkillFailNormal(pMonster, getSkillType(), NULL); } diff --git a/src/server/gameserver/skill/SummonMonsters.cpp b/src/server/gameserver/skill/SummonMonsters.cpp index 960aff71..ca2d01de 100644 --- a/src/server/gameserver/skill/SummonMonsters.cpp +++ b/src/server/gameserver/skill/SummonMonsters.cpp @@ -15,8 +15,8 @@ ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// SummonMonsters::SummonMonsters() throw() { __BEGIN_TRY @@ -24,7 +24,7 @@ SummonMonsters::SummonMonsters() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 뱀파이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// /* void SummonMonsters::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -67,7 +67,7 @@ void SummonMonsters::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CE { decreaseMana(pVampire, RequiredMP, _GCSkillToSelfOK1); - // ̾ ϱ Ŷ . + // 뱀파이어를 땅 위에서 삭제하기 이전에 기술 패킷들을 날린다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(0); @@ -79,12 +79,12 @@ void SummonMonsters::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CE pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(x, y, &_GCSkillToSelfOK2, pVampire); - // ִ ̾ ϶ ˸. + // 땅 위에 나와있는 뱀파이어 삭제하라고 알린다. GCDeleteObject gcDO; gcDO.setObjectID(pVampire->getObjectID()); pZone->broadcastPacket(x, y, &gcDO, pVampire); - // ӿٰ ̾ ߰Ѵ. + // 땅 속에다가 뱀파이어를 추가한다. addBurrowingCreature(pZone, pVampire, x, y); pSkillSlot->setRunTime(); @@ -107,7 +107,7 @@ void SummonMonsters::execute(Vampire* pVampire, VampireSkillSlot* pSkillSlot, CE */ ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void SummonMonsters::execute(Monster* pMonster) @@ -143,7 +143,7 @@ void SummonMonsters::execute(Monster* pMonster) if (bRangeCheck) // && bMoveModeCheck) { //-------------------------------------------------------- - // knockbackǴ¸´ ֵ üũش. + // 주위에 knockback되는맞는 애들을 체크해준다. //-------------------------------------------------------- // SkillInput input(pMonster); // SkillOutput output; @@ -155,16 +155,16 @@ void SummonMonsters::execute(Monster* pMonster) if (!hasInfo || summonInfo.pMonsters == NULL) { // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; - // ȯ . -_-; + // 소환할 몹이 없는 경우다. -_-; executeSkillFailNormal(pMonster, getSkillType(), NULL); - //  Ͱ ȯҷ + // 마스터 레어에서 마스터가 몹을 소환할려고 한 경우 if (pZone->isMasterLair() && pMonster->isMaster()) { MasterLairManager* pMasterLairManager = pZone->getMasterLairManager(); Assert(pMasterLairManager != NULL); - // ̻ ȯҰ ٸ.. - // Ͱ ο߰.. + // 더 이상 소환할게 없다면.. + // 마스터가 직접 나서서 싸워야겠지.. pMasterLairManager->setMasterReady(); // cout << "no more SummonMonsters: set MasterReady" << endl; } @@ -173,7 +173,7 @@ void SummonMonsters::execute(Monster* pMonster) if (pMonster->isMaster() && pZone->isMasterLair()) { MasterLairManager* pMasterLairManager = pZone->getMasterLairManager(); Assert(pMasterLairManager != NULL); - // minion combat ǥ ȯѴ. + // minion combat에서는 지정된 좌표에 소환한다. MasterLairInfo* pInfo = g_pMasterLairInfoManager->getMasterLairInfo(pZone->getZoneID()); Assert(pInfo != NULL); @@ -190,19 +190,19 @@ void SummonMonsters::execute(Monster* pMonster) pZone->broadcastPacket(pMonster->getX(), pMonster->getY(), &gcSay); } - //  ȯ ͵ ش. + // 마스터 레어에서는 소환된 몬스터들이 아템 안 준다. // by sigi. 2002.11.21 summonInfo.hasItem = false; } summonInfo.scanEnemy = true; summonInfo.clanType = SUMMON_INFO::CLAN_TYPE_GROUP; - summonInfo.clanID = pMonster->getClanType(); // clan . + summonInfo.clanID = pMonster->getClanType(); // 주인의 clan을 따른다. summonInfo.X = x; summonInfo.Y = y; summonInfo.regenType = REGENTYPE_PORTAL; - // ͸ ߰Ѵ. + // 몬스터를 존에 추가한다. addMonstersToZone(pZone, summonInfo); // cout << "SummonMonsters OK" << endl; diff --git a/src/server/gameserver/skill/SummonSylph.cpp b/src/server/gameserver/skill/SummonSylph.cpp index e768717e..a4c29f91 100644 --- a/src/server/gameserver/skill/SummonSylph.cpp +++ b/src/server/gameserver/skill/SummonSylph.cpp @@ -16,7 +16,7 @@ #include "GamePlayer.h" ////////////////////////////////////////////////////////////////////////////// -// ƿ콺 ڵ鷯 +// 아우스터즈 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void SummonSylph::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -57,12 +57,12 @@ void SummonSylph::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bSatisfyRequire) { decreaseMana(pOusters, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. // SkillInput input(pOusters, pOustersSkillSlot); // SkillOutput output; // computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectSummonSylph* pEffect = new EffectSummonSylph(pOusters); // pEffect->setDeadline(output.Duration); // pEffect->setBonus(output.Damage); diff --git a/src/server/gameserver/skill/SummonWaterElemental.cpp b/src/server/gameserver/skill/SummonWaterElemental.cpp index defbdca6..a1d97c59 100644 --- a/src/server/gameserver/skill/SummonWaterElemental.cpp +++ b/src/server/gameserver/skill/SummonWaterElemental.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void SummonWaterElemental::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -58,15 +58,15 @@ void SummonWaterElemental::execute(Ousters* pOusters, OustersSkillSlot* pOusters if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bSatisfyRequire) { decreaseMana(pOusters, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); - // cout << pOusters->getName() << " SummonWaterElemental " << output.Damage << "Դϴ." + // cout << pOusters->getName() << "이 SummonWaterElemental를 썼고 데미지는 " << output.Damage << "입니다." // << endl; - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectSummonWaterElemental* pEffect = new EffectSummonWaterElemental(pOusters); pEffect->setDeadline(output.Duration); pEffect->setDamage(output.Damage); diff --git a/src/server/gameserver/skill/SweepVice.cpp b/src/server/gameserver/skill/SweepVice.cpp index cb28f314..96a5c4d0 100644 --- a/src/server/gameserver/skill/SweepVice.cpp +++ b/src/server/gameserver/skill/SweepVice.cpp @@ -26,7 +26,7 @@ void SweepVice::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); diff --git a/src/server/gameserver/skill/SwordOfThor.cpp b/src/server/gameserver/skill/SwordOfThor.cpp index 5487f846..1fb72e59 100644 --- a/src/server/gameserver/skill/SwordOfThor.cpp +++ b/src/server/gameserver/skill/SwordOfThor.cpp @@ -23,7 +23,7 @@ void SwordOfThor::execute(Slayer* pSlayer, ObjectID_t targetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(targetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -68,7 +68,7 @@ void SwordOfThor::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl SIMPLE_SKILL_OUTPUT result; - // ǥġ+4 + // 목표위치+4방향 /* param.addMask( 0 + dir_advance[dir][0], 0 + dir_advance[dir][1], 100); param.addMask(-1 + dir_advance[dir][0], -1 + dir_advance[dir][1], 100); param.addMask( 0 + dir_advance[dir][0], -1 + dir_advance[dir][1], 100); diff --git a/src/server/gameserver/skill/SwordRay.cpp b/src/server/gameserver/skill/SwordRay.cpp index fd339d82..6adf6293 100644 --- a/src/server/gameserver/skill/SwordRay.cpp +++ b/src/server/gameserver/skill/SwordRay.cpp @@ -18,7 +18,7 @@ #include "GCSkillToTileOK6.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void SwordRay::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -38,7 +38,7 @@ void SwordRay::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); @@ -57,8 +57,8 @@ void SwordRay::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pS } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 -// ̾ Wide Lightning Skill Tile ϴ Handler +// 슬레이어 타일 핸들러 +// 슬레이어가 Wide Lightning Skill을 Tile에 사용했을때 사용하는 Handler ////////////////////////////////////////////////////////////////////////////// void SwordRay::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -92,8 +92,8 @@ void SwordRay::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* bool bTimeCheck = verifyRunTime(pSkillSlot); bool bRangeCheck = verifyDistance(pSlayer, X, Y, pSkillInfo->getRange()); - // ϴ ϴ ɷ ϰ Ҷ(EffectTileStorm::affect()) - // HitRoll Ѵ. + // 일단 기술은 성공하는 걸로 하고 데미지를 가할때(EffectTileStorm::affect()) + // 개별적으로 HitRoll을 계산한다. // 2003.1.8 by bezz // bool bHitRoll = HitRoll::isSuccessMagic(pSlayer, pSkillInfo, pSkillSlot); @@ -130,7 +130,7 @@ void SwordRay::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pZone->addEffect(pEffect); tile.addEffect(pEffect); - // 鿡 + // 기술을 사용한 사람들에게 _GCSkillToTileOK1.setSkillType(SkillType); _GCSkillToTileOK1.setCEffectID(CEffectID); _GCSkillToTileOK1.setX(X); @@ -138,21 +138,21 @@ void SwordRay::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* _GCSkillToTileOK1.setDuration(output.Duration); _GCSkillToTileOK1.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK3.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(X); _GCSkillToTileOK3.setY(Y); //_GCSkillToTileOK3.setRange(Range); - // ִ 鿡 + // 기술을 당한 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람과 당한 사람을 모두 볼 수 있는 사람들에게 _GCSkillToTileOK5.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); @@ -160,23 +160,23 @@ void SwordRay::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); - // packet + // 기술을 사용한 사람에게 packet 전달 pPlayer->sendPacket(&_GCSkillToTileOK1); - // ִ 鿡 broadcasing - // broadcasting 5OK Ѵ. - // ⿡ ϵ broadcasting ܵȴ. + // 기술을 쓸 사람과 당한 사람을 모두 볼 수 있는 사람들에게 broadcasing + // broadcasting후 5번OK를 받은 사람을 기록한다. + // 여기에 기록된 사람은 차후 broadcasting에서 제외된다. list cList; cList.push_back(pSlayer); cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); - // ִ 鿡 broadcasting + // 기술을 쓴 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); - // ִ 鿡 broadcasting + // 기술을 당한 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); - // delay setting + // 기술 delay setting pSkillSlot->setRunTime(output.Delay); } else { diff --git a/src/server/gameserver/skill/SwordWave.cpp b/src/server/gameserver/skill/SwordWave.cpp index e5653cc1..c2d2d525 100644 --- a/src/server/gameserver/skill/SwordWave.cpp +++ b/src/server/gameserver/skill/SwordWave.cpp @@ -9,20 +9,20 @@ #include "SimpleTileMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// .. Ÿ ũ ʱȭѴ. +// 생성자.. 타일 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// SwordWave::SwordWave() throw() { __BEGIN_TRY - // ũ ʱȭŲ. - // 3 Ÿ Ŭ̾Ʈ Ʈ . + // 마스크를 초기화시킨다. + // 한 방향의 3개 타일 순서는 클라이언트 이펙트 출력 순서에 맞춘다. // // (-1,-1)(0,-1)(1,-1) // (-1, 0)(0, 0)(1, 0) // (-1, 1)(0, 1)(1, 1) // - // ⿡ Ÿ ̳ĸ - // ϸ ũ ϱ . + // 각 방향에 따라 어느 타일이 명중 대상이냐를 + // 생각하면 마스크를 이해하기 쉽다. m_pSwordWaveMask[LEFT][0].set(-1, 1); m_pSwordWaveMask[LEFT][1].set(-1, -1); @@ -60,7 +60,7 @@ SwordWave::SwordWave() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void SwordWave::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -79,7 +79,7 @@ void SwordWave::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; diff --git a/src/server/gameserver/skill/SwordWave.h b/src/server/gameserver/skill/SwordWave.h index b770de74..bd1900c8 100644 --- a/src/server/gameserver/skill/SwordWave.h +++ b/src/server/gameserver/skill/SwordWave.h @@ -33,7 +33,7 @@ class SwordWave : public SkillHandler { void computeOutput(const SkillInput& input, SkillOutput& output); protected: - POINT m_pSwordWaveMask[8][3]; // ⿡ Ÿ ũ + POINT m_pSwordWaveMask[8][3]; // 각 방향에 따른 타격 마스크 }; // global variable declaration diff --git a/src/server/gameserver/skill/TalonOfCrow.cpp b/src/server/gameserver/skill/TalonOfCrow.cpp index 798a4119..7878ed63 100644 --- a/src/server/gameserver/skill/TalonOfCrow.cpp +++ b/src/server/gameserver/skill/TalonOfCrow.cpp @@ -10,7 +10,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void TalonOfCrow::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -38,7 +38,7 @@ void TalonOfCrow::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS SIMPLE_SKILL_OUTPUT result; - // Tiger Nail ִٸ 10% + // Tiger Nail 이 있다면 데미지 10% 증가 if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_TIGER_NAIL)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_TIGER_NAIL); Assert(pRankBonus != NULL); @@ -46,7 +46,7 @@ void TalonOfCrow::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS param.SkillDamage += getPercentValue(param.SkillDamage, pRankBonus->getPoint()); } - // Knowledge of Innate ִٸ hit bonus ִ. + // Knowledge of Innate 가 있다면 hit bonus 가 있다. int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE); @@ -63,7 +63,7 @@ void TalonOfCrow::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void TalonOfCrow::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/Teleport.cpp b/src/server/gameserver/skill/Teleport.cpp index 22a78b4c..6c0bc4a6 100644 --- a/src/server/gameserver/skill/Teleport.cpp +++ b/src/server/gameserver/skill/Teleport.cpp @@ -12,7 +12,7 @@ #include "GCStatusCurrentHP.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void Teleport::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -40,8 +40,8 @@ void Teleport::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersS SkillType_t SkillType = pOustersSkillSlot->getSkillType(); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 - // NPC . + // NoSuch제거. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. // bool bIncreaseDomainExp = pOusters->isRealWearingEx(Ousters::WEAR_RIGHTHAND); GCSkillToTileOK1 _GCSkillToTileOK1; @@ -66,7 +66,7 @@ void Teleport::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersS pOusters->isFlag(Effect::EFFECT_CLASS_HAS_SWEEPER); if (bManaCheck && bTimeCheck && bRangeCheck && !bEffected) { - // PC ش. + // 빠르게 PC를 움직여준다. if (pZone->moveFastPC(pOusters, pOusters->getX(), pOusters->getY(), X, Y, getSkillType())) { decreaseMana(pOusters, RequiredMP, _GCSkillToTileOK1); @@ -84,7 +84,7 @@ void Teleport::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersS _GCSkillToTileOK5.setRange(0); _GCSkillToTileOK5.setDuration(0); - // ڽſ ٲ MP ˷ش. + // 자신에게 바뀐 MP를 알려준다. pPlayer->sendPacket(&_GCSkillToTileOK1); pZone->broadcastPacket(pOusters->getX(), pOusters->getY(), &_GCSkillToTileOK5, pOusters); @@ -105,7 +105,7 @@ void Teleport::execute(Ousters* pOusters, ZoneCoord_t X, ZoneCoord_t Y, OustersS __END_CATCH } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Teleport::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -128,8 +128,8 @@ void Teleport::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkil // SkillType_t SkillType = pOustersSkillSlot->getSkillType(); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 - // NPC . + // NoSuch제거. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. if (pTargetCreature == NULL) { executeSkillFailException(pOusters, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -155,7 +155,7 @@ void Teleport::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkil if (bManaCheck && bTimeCheck && bRangeCheck && !bEffected ) { - // PC ش. + // 빠르게 PC를 움직여준다. if (pZone->moveFastPC(pOusters, pOusters->getX(), pOusters->getY(), pTargetCreature->getX(), pTargetCreature->getY())) { @@ -163,10 +163,10 @@ void Teleport::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkil decreaseMana(pOusters, RequiredMP, gcMI); - // ڽſ ٲ HP ˷ش. + // 자신에게 바뀐 HP를 알려준다. pPlayer->sendPacket( &gcMI ); - // HP ٲٰ ˸. + // 주위에 HP가 바꼈다고 알린다. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pOusters->getObjectID()); gcStatusCurrentHP.setCurrentHP(pOusters->getHP()); diff --git a/src/server/gameserver/skill/Tendril.cpp b/src/server/gameserver/skill/Tendril.cpp index bc783a67..0d6598d6 100644 --- a/src/server/gameserver/skill/Tendril.cpp +++ b/src/server/gameserver/skill/Tendril.cpp @@ -20,7 +20,7 @@ #include "Reflection.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Tendril::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -48,9 +48,9 @@ void Tendril::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkill Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // 鿪. by sigi. 2002.9.13 - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수 없다. + // 저주 면역. by sigi. 2002.9.13 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isFlag(Effect::EFFECT_CLASS_IMMUNE_TO_CURSE) || !canAttack(pOusters, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pOusters, getSkillType()); @@ -110,7 +110,7 @@ void Tendril::execute(Ousters* pOusters, ObjectID_t TargetObjectID, OustersSkill bool bCanSeeCaster = canSee(pTargetCreature, pOusters); - // Ʈ Ʈ δ. + // 이펙트 오브젝트를 생성해 붙인다. EffectTendril* pEffect = new EffectTendril(pTargetCreature); pEffect->setDeadline(output.Duration); // pEffect->setLevel(pSkillSlot->getExpLevel()); diff --git a/src/server/gameserver/skill/ThrowHolyWater.cpp b/src/server/gameserver/skill/ThrowHolyWater.cpp index 71a5e2d2..b16a2800 100644 --- a/src/server/gameserver/skill/ThrowHolyWater.cpp +++ b/src/server/gameserver/skill/ThrowHolyWater.cpp @@ -53,8 +53,8 @@ void ThrowHolyWater::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, ObjectI ObjectID_t ObjectID = pItem->getObjectID(); Creature* pTargetCreature = NULL; - // Ŷ Ŷ, ̵ Ʋų, - // ƴ϶ ߴٰ ش. + // 패킷에 온 거랑, 아이템 아이디가 틀리거나, + // 성수가 아니라면 실패했다고 보내준다. if (ObjectID != ItemObjectID || pItem->getItemClass() != Item::ITEM_CLASS_HOLYWATER) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -65,7 +65,7 @@ void ThrowHolyWater::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, ObjectI GCThrowItemOK2 _GCThrowItemOK2; GCModifyInformation gcAttackerMI; - // Ÿ ũĸ ã´. + // 존에서 타겟 크리쳐를 찾는다. /* try { @@ -79,12 +79,12 @@ void ThrowHolyWater::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, ObjectI pTargetCreature = pZone->getCreature(TargetObjectID); - // Ŭ̾Ʈ ȭ , Ͱ ִ. - // ΰ µ, , - // Ÿ װ , Ŭ̾Ʈ ó Ŷ ϰ, - // ٽ ѹ , ϸ ϴ. + // 클라이언트와의 동기화 문제로 인해, 포인터가 널일 수 있다. + // 성수병 두개를 연속으로 던졌는데, 먼저 던진 성수병으로 인해, + // 타겟이 죽고 난 뒤, 클라이언트가 미처 그 패킷을 받지 못하고, + // 다시 한번 성수를 던질 경우, 걍 리턴하면 곤란하다. if (pTargetCreature == NULL) { - // ڸ ٿ־ Ѵ. + // 먼저 아이템 숫자를 줄여주어야 한다. decreaseItemNum(pItem, pInventory, pSlayer->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -96,10 +96,10 @@ void ThrowHolyWater::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, ObjectI Damage_t MaxDamage = pHolyWater->getMaxDamage(); Damage_t Damage = max(1, Random(MinDamage, MaxDamage)); - // Ϲ ƴ϶ 0 ش. - // κп checkZoneLevelToHitTarget Լ θ - // ⼭ ˻縦 ʿ䰡 . - // -- 2002-01-31 輺 + // 일반 지역이 아니라면 데미지를 0으로 세팅해 준다. + // 밑 부분에서 checkZoneLevelToHitTarget 함수를 부르기 때문에 + // 여기서 안전지대 관련 검사를 할 필요가 없다. + // -- 2002-01-31 김성민 // if (!(pZone->getZoneLevel() & NO_SAFE_ZONE)) Damage = 0; list cList; @@ -110,17 +110,17 @@ void ThrowHolyWater::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, ObjectI bool bRangeCheck = verifyDistance(pSlayer, pTargetCreature, 10); bool bZoneLevelCheck = checkZoneLevelToHitTarget(pTargetCreature) && canAttack(pSlayer, pTargetCreature); - // Ǿٸ, ش.. - // ʾƵ ѹ ̴. + // 명중 되었다면, 데미지를 준다.. + // 명중이 되지 않아도 성수는 한번 던지면 끝이다. if (bHitRoll && bPK && bRangeCheck && bZoneLevelCheck) { - // ̾ ƴ 쿡 ġ ÷ش. + // 상대방이 슬레이어가 아닌 경우에만 경험치를 올려준다. if (!pTargetCreature->isSlayer()) { shareAttrExp(pSlayer, Damage, 1, 1, 8, gcAttackerMI); - // þ ÷ش. + // 인첸 도메은도 올려준다. // 2003. 1. 12 by bezz - // Throw Holy Water SkillInfo . - // ׷ Create Holy Water Point . + // Throw Holy Water 의 SkillInfo 가 없다. + // 그래서 Create Holy Water 의 Point 를 쓴다. SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SKILL_CREATE_HOLY_WATER); increaseDomainExp(pSlayer, SKILL_DOMAIN_ENCHANT, pSkillInfo->getPoint(), gcAttackerMI, pTargetCreature->getLevel()); @@ -142,7 +142,7 @@ void ThrowHolyWater::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, ObjectI setDamage(pTargetVampire, Damage, NULL, 0, &_GCThrowItemOK2); - // ŭ Ȧ ش. + // 받은 데미지만큼의 홀리 데미지를 준다. Silver_t silverDamage = max(1, getPercentValue(Damage, 10)); Silver_t newSilverDamage = pTargetVampire->getSilverDamage() + silverDamage; pTargetVampire->saveSilverDamage(newSilverDamage); @@ -158,7 +158,7 @@ void ThrowHolyWater::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, ObjectI setDamage(pTargetOusters, Damage, NULL, 0, &_GCThrowItemOK2); - // ŭ Ȧ ش. + // 받은 데미지만큼의 홀리 데미지를 준다. Silver_t silverDamage = max(1, getPercentValue(Damage, 10)); Silver_t newSilverDamage = pTargetOusters->getSilverDamage() + silverDamage; pTargetOusters->saveSilverDamage(newSilverDamage); @@ -180,24 +180,24 @@ void ThrowHolyWater::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, ObjectI cList.push_back(pTargetCreature); - // ֺ 鿡 OK3 Packet . + // 주변 사람들에게 OK3 Packet을 보낸다. GCThrowItemOK3 _GCThrowItemOK3; _GCThrowItemOK3.setObjectID(pSlayer->getObjectID()); _GCThrowItemOK3.setTargetObjectID(TargetObjectID); pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCThrowItemOK3, cList); - // OK Packet . + // 던진 사람에게 OK Packet을 보낸다. GCThrowItemOK1 _GCThrowItemOK1; _GCThrowItemOK1.setObjectID(TargetObjectID); pPlayer->sendPacket(&_GCThrowItemOK1); pPlayer->sendPacket(&gcAttackerMI); - } else // ⿡ ... + } else // 성수 던지기에 실패했을 경우... { executeSkillFailNormal(pSlayer, getSkillType(), pTargetCreature); } - // µ ʾҵ ڴ ٿ־ Ѵ. + // 맞든 맞지 않았든 성수의 숫자는 줄여주어야 한다. decreaseItemNum(pItem, pInventory, pSlayer->getName(), STORAGE_INVENTORY, 0, InvenX, InvenY); } } catch (Throwable& t) { diff --git a/src/server/gameserver/skill/ThrowingAxe.cpp b/src/server/gameserver/skill/ThrowingAxe.cpp index 5e059a46..ca54aa8c 100644 --- a/src/server/gameserver/skill/ThrowingAxe.cpp +++ b/src/server/gameserver/skill/ThrowingAxe.cpp @@ -17,7 +17,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void ThrowingAxe::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -60,15 +60,15 @@ void ThrowingAxe::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) } Tile& tile = pZone->getTile(X, Y); - Range_t Range = 1; // ׻ 1̴. + Range_t Range = 1; // 항상 1이다. - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); input.SkillLevel = pMonster->getLevel(); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectMeteorStrike* pEffect = new EffectMeteorStrike(pZone, X, Y); pEffect->setNextTime(output.Duration); pEffect->setUserObjectID(pMonster->getObjectID()); @@ -80,11 +80,11 @@ void ThrowingAxe::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pEffect->setSplashRatio(2, 50); // pEffect->setLevel(pSkillInfo->getLevel()/2); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); diff --git a/src/server/gameserver/skill/ThunderBolt.cpp b/src/server/gameserver/skill/ThunderBolt.cpp index f5842856..616a04e4 100644 --- a/src/server/gameserver/skill/ThunderBolt.cpp +++ b/src/server/gameserver/skill/ThunderBolt.cpp @@ -76,7 +76,7 @@ void ThunderBolt::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ThunderBolt::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -91,7 +91,7 @@ void ThunderBolt::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; diff --git a/src/server/gameserver/skill/ThunderFlash.cpp b/src/server/gameserver/skill/ThunderFlash.cpp index 9882ef4d..cccbe5de 100644 --- a/src/server/gameserver/skill/ThunderFlash.cpp +++ b/src/server/gameserver/skill/ThunderFlash.cpp @@ -15,8 +15,8 @@ #include "ZoneUtil.h" ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// ThunderFlash::ThunderFlash() throw() { __BEGIN_TRY @@ -30,7 +30,7 @@ ThunderFlash::ThunderFlash() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ThunderFlash::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -49,7 +49,7 @@ void ThunderFlash::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -87,7 +87,7 @@ void ThunderFlash::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS Assert(pPlayer != NULL); Assert(pZone != NULL); - // ϰ ִ Ⱑ ̰ų, SWORD ƴ϶ . + // 무장하고 있는 무기가 널이거나, SWORD가 아니라면 사용할 수 없다. Item* pItem = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_SWORD) { executeSkillFailException(pSlayer, getSkillType()); @@ -111,12 +111,12 @@ void ThunderFlash::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS bool bTimeCheck = verifyRunTime(pSkillSlot); bool bRangeCheck = verifyDistance(pSlayer, X, Y, pSkillInfo->getRange()); - // ־ ϰ, ð Ÿ üũ ϰ, + // 마나가 있어야 하고, 시간과 거리 체크에 성공하고, if (bManaCheck && bTimeCheck && bRangeCheck) { - // MP ߸. + // MP를 떨어뜨린다. decreaseMana(pSlayer, RequiredMP, _GCSkillToTileOK1); - // ǥ Ѵ. + // 좌표와 방향을 구한다. ZoneCoord_t myX = pSlayer->getX(); ZoneCoord_t myY = pSlayer->getY(); Dir_t dir = calcDirection(myX, myY, X, Y); @@ -140,9 +140,9 @@ void ThunderFlash::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS int tileX = X + m_pThunderFlashMask[count].x; int tileY = Y + m_pThunderFlashMask[count].y; - // Ÿ ̰, 밡 ƴ϶, Ȯ ִ. + // 현재 타일이 존 내부이고, 안전지대가 아니라면, 맞을 확률이 있다. if (rect.ptInRect(tileX, tileY)) { - // Ÿ ޾ƿ´. + // 타일을 받아온다. Tile& tile = pZone->getTile(tileX, tileY); list targetList; @@ -180,17 +180,17 @@ void ThunderFlash::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS _GCSkillToTileOK2.addCListElement(targetObjectID); _GCSkillToTileOK5.addCListElement(targetObjectID); - // ϴ ´ Ŷ · ä, ش. + // 일단 맞는 놈이 받을 패킷은 널 상태로 한 채로, 데미지를 준다. setDamage(pTargetCreature, Damage, pSlayer, SkillType, NULL, &_GCSkillToTileOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, NULL, &_GCSkillToTileOK1); increaseAlignment(pSlayer, pTargetCreature, _GCSkillToTileOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } - // ̾ ƴ 쿡 Ѵ. + // 슬레이어가 아닐 경우에만 맞은 것으로 간주한다. if (!pTargetCreature->isSlayer()) { bHit = true; if (maxEnemyLevel < pTargetCreature->getLevel()) @@ -211,7 +211,7 @@ void ThunderFlash::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS } } - // Ʈ. + // 공격자 아이템 내구성 떨어트림. decreaseDurability(pSlayer, NULL, pSkillInfo, &_GCSkillToTileOK1, NULL); _GCSkillToTileOK1.setSkillType(SkillType); @@ -237,7 +237,7 @@ void ThunderFlash::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS pPlayer->sendPacket(&_GCSkillToTileOK1); - // ޴ 鿡 Ŷ Ѵ. + // 이 기술에 의해 영향을 받는 놈들에게 패킷을 보내줘야 한다. for (list::const_iterator itr = cList.begin(); itr != cList.end(); itr++) { Creature* pTargetCreature = *itr; Assert(pTargetCreature != NULL); @@ -245,7 +245,7 @@ void ThunderFlash::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS if (pTargetCreature->isPC()) { _GCSkillToTileOK2.clearList(); - // HP Ŷ Ѵ. + // HP의 변경사항을 패킷에다 기록한다. HP_t targetHP = 0; if (pTargetCreature->isSlayer()) targetHP = (dynamic_cast(pTargetCreature))->getHP(ATTR_CURRENT); @@ -253,13 +253,13 @@ void ThunderFlash::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS targetHP = (dynamic_cast(pTargetCreature))->getHP(ATTR_CURRENT); _GCSkillToTileOK2.addShortData(MODIFY_CURRENT_HP, targetHP); - // ߸. + // 아이템의 내구력을 떨어뜨린다. decreaseDurability(NULL, pTargetCreature, pSkillInfo, NULL, &_GCSkillToTileOK2); - // Ŷ ش. + // 패킷을 보내준다. pTargetCreature->getPlayer()->sendPacket(&_GCSkillToTileOK2); } else if (pTargetCreature->isMonster()) { - // νѴ. + // 당근 적으로 인식한다. Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pSlayer); } diff --git a/src/server/gameserver/skill/ThunderSpark.cpp b/src/server/gameserver/skill/ThunderSpark.cpp index 45e9fcc0..4f89490c 100644 --- a/src/server/gameserver/skill/ThunderSpark.cpp +++ b/src/server/gameserver/skill/ThunderSpark.cpp @@ -9,7 +9,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ThunderSpark::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/ThunderStorm.cpp b/src/server/gameserver/skill/ThunderStorm.cpp index 9a6b753d..d4c2c229 100644 --- a/src/server/gameserver/skill/ThunderStorm.cpp +++ b/src/server/gameserver/skill/ThunderStorm.cpp @@ -59,7 +59,7 @@ void ThunderStorm::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS SIMPLE_SKILL_OUTPUT result; - // ǥġ+4 + // 목표위치+4방향 param.addMask(0, 0, 100); param.addMask(-1, -1, 100); param.addMask(0, -1, 100); @@ -70,8 +70,8 @@ void ThunderStorm::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS param.addMask(0, 1, 100); param.addMask(1, 1, 100); - // ڽ ֺ ߸. - // ƴϴ.. --; + // 자신의 주변에 떨어뜨린다. + // 아니다.. --; // X = pSlayer->getX(); // Y = pSlayer->getY(); @@ -83,7 +83,7 @@ void ThunderStorm::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillS } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ThunderStorm::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/TornadoSever.cpp b/src/server/gameserver/skill/TornadoSever.cpp index 9541d508..95db2353 100644 --- a/src/server/gameserver/skill/TornadoSever.cpp +++ b/src/server/gameserver/skill/TornadoSever.cpp @@ -9,8 +9,8 @@ #include "SimpleTileMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// TornadoSever::TornadoSever() throw() { __BEGIN_TRY @@ -29,7 +29,7 @@ TornadoSever::TornadoSever() throw() { } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void TornadoSever::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -48,7 +48,7 @@ void TornadoSever::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; diff --git a/src/server/gameserver/skill/TransformToBat.cpp b/src/server/gameserver/skill/TransformToBat.cpp index c41f1762..e1507148 100644 --- a/src/server/gameserver/skill/TransformToBat.cpp +++ b/src/server/gameserver/skill/TransformToBat.cpp @@ -24,7 +24,7 @@ #include "ZoneUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ κ丮 ڵ鷯 +// 뱀파이어 인벤토리 핸들러 ////////////////////////////////////////////////////////////////////////////// void TransformToBat::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordInven_t X, CoordInven_t Y, CoordInven_t TargetX, CoordInven_t TargetY, VampireSkillSlot* pSkillSlot) @@ -47,8 +47,8 @@ void TransformToBat::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordI Assert(pZone != NULL); Item* pItem = pInventory->getItem(X, Y); - // ƴ϶ 翬 . - // PK̶ . + // 적당한 아이템이 아니라면 당연히 변신할 수 없다. + // PK존이라면 변신할 수 없다. if (pItem == NULL || pItem->getItemClass() != Item::ITEM_CLASS_VAMPIRE_ETC || pItem->getItemType() != 1 || pVampire->hasRelicItem() || g_pPKZoneInfoManager->isPKZone(pZone->getZoneID()) || pVampire->isFlag(Effect::EFFECT_CLASS_REFINIUM_TICKET) || @@ -70,7 +70,7 @@ void TransformToBat::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordI ZoneCoord_t y = pVampire->getY(); Tile& tile = pZone->getTile(x, y); - // Knowledge of Innate ִٸ hit bonus 10 + // Knowledge of Innate 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE); @@ -94,7 +94,7 @@ void TransformToBat::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordI if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && bMoveModeCheck && bTileCheck && !bEffected) { TPOINT pt = findSuitablePosition(pZone, x, y, Creature::MOVE_MODE_FLYING); - if (pt.x != -1) //  ǥ üũ. by sigi. 2002.5.2 + if (pt.x != -1) // 들어갈 좌표 체크. by sigi. 2002.5.2 { decreaseMana(pVampire, RequiredMP, _GCSkillToInventoryOK1); @@ -102,13 +102,13 @@ void TransformToBat::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordI SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectTransformToBat* pEffectTTW = new EffectTransformToBat(pVampire); pEffectTTW->setDeadline(99999999); pVampire->addEffect(pEffectTTW); pVampire->setFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT); - // ̷ ؼ ϴ ɷġ ش. + // 이로 인해서 변하는 능력치들을 보내준다. VAMPIRE_RECORD prev; pVampire->getVampireRecord(prev); pVampire->initAllStat(); @@ -120,7 +120,7 @@ void TransformToBat::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordI pPlayer->sendPacket(&_GCSkillToInventoryOK1); - // ̾ 㸦 ϶ ˷ش. + // 뱀파이어 대신 박쥐를 더하라고 알려준다. GCAddBat gcAddBat; gcAddBat.setObjectID(pVampire->getObjectID()); gcAddBat.setName(pVampire->getName()); @@ -132,7 +132,7 @@ void TransformToBat::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordI gcAddBat.setColor(pVampire->getBatColor()); pZone->broadcastPacket(x, y, &gcAddBat, pVampire); - // ŸϿ , ٽ μ 带 ٲ մ. + // 타일에다 지웠다, 다시 더함으로서 무브모드를 바꿀 수 잇다. tile.deleteCreature(pVampire->getObjectID()); Tile& newtile = pZone->getTile(pt.x, pt.y); @@ -165,7 +165,7 @@ void TransformToBat::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordI } ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void TransformToBat::execute(Monster* pMonster) @@ -199,16 +199,16 @@ void TransformToBat::execute(Monster* pMonster) SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectTransformToBat* pEffectTTW = new EffectTransformToBat(pMonster); pEffectTTW->setDeadline(99999999); pMonster->addEffect(pEffectTTW); pMonster->setFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_BAT); - // ̷ ؼ ϴ ɷġ ش. + // 이로 인해서 변하는 능력치들을 보내준다. pMonster->initAllStat(); - // ̾ 㸦 ϶ ˷ش. + // 뱀파이어 대신 박쥐를 더하라고 알려준다. GCAddBat gcAddBat; gcAddBat.setObjectID(pMonster->getObjectID()); gcAddBat.setName(pMonster->getName()); @@ -221,7 +221,7 @@ void TransformToBat::execute(Monster* pMonster) pZone->broadcastPacket(x, y, &gcAddBat, pMonster); - // ŸϿ , ٽ μ 带 ٲ մ. + // 타일에다 지웠다, 다시 더함으로서 무브모드를 바꿀 수 잇다. Tile& tile = pZone->getTile(x, y); tile.deleteCreature(pMonster->getObjectID()); diff --git a/src/server/gameserver/skill/TransformToWerwolf.cpp b/src/server/gameserver/skill/TransformToWerwolf.cpp index 738958e6..c9057f8c 100644 --- a/src/server/gameserver/skill/TransformToWerwolf.cpp +++ b/src/server/gameserver/skill/TransformToWerwolf.cpp @@ -18,7 +18,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ κ丮 ڵ鷯 +// 뱀파이어 인벤토리 핸들러 ////////////////////////////////////////////////////////////////////////////// void TransformToWerwolf::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordInven_t X, CoordInven_t Y, CoordInven_t TargetX, CoordInven_t TargetY, VampireSkillSlot* pSkillSlot) @@ -43,8 +43,8 @@ void TransformToWerwolf::execute(Vampire* pVampire, ObjectID_t InvenObjectID, Co Item* pItem = pInventory->getItem(X, Y); Assert(pItem != NULL); - // ƴ϶ 翬 . - // PK . + // 적당한 아이템이 아니라면 당연히 변신할 수 없다. + // PK존에서는 변신할 수 없다. if (pItem->getItemClass() != Item::ITEM_CLASS_SKULL || pItem->getItemType() != 39 || pVampire->hasRelicItem() || g_pPKZoneInfoManager->isPKZone(pZone->getZoneID()) || pVampire->isFlag(Effect::EFFECT_CLASS_REFINIUM_TICKET)) { @@ -61,7 +61,7 @@ void TransformToWerwolf::execute(Vampire* pVampire, ObjectID_t InvenObjectID, Co ZoneCoord_t x = pVampire->getX(); ZoneCoord_t y = pVampire->getY(); - // Knowledge of Innate ִٸ hit bonus 10 + // Knowledge of Innate 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE); @@ -87,13 +87,13 @@ void TransformToWerwolf::execute(Vampire* pVampire, ObjectID_t InvenObjectID, Co SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectTransformToWerwolf* pEffectTTW = new EffectTransformToWerwolf(pVampire); pEffectTTW->setDeadline(999999999); pVampire->addEffect(pEffectTTW); pVampire->setFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WERWOLF); - // ̷ ؼ ϴ ɷġ ش. + // 이로 인해서 변하는 능력치들을 보내준다. VAMPIRE_RECORD prev; pVampire->getVampireRecord(prev); pVampire->initAllStat(); @@ -109,7 +109,7 @@ void TransformToWerwolf::execute(Vampire* pVampire, ObjectID_t InvenObjectID, Co Color_t color[PCVampireInfo::VAMPIRE_COLOR_MAX]; pVampire->getShapeInfo(dummyFlag, color); - // ̾ 븦 ϶ ˷ش. + // 뱀파이어 대신 늑대를 더하라고 알려준다. GCAddWolf gcAddWerwolf; gcAddWerwolf.setObjectID(pVampire->getObjectID()); gcAddWerwolf.setName(pVampire->getName()); @@ -142,7 +142,7 @@ void TransformToWerwolf::execute(Vampire* pVampire, ObjectID_t InvenObjectID, Co } ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void TransformToWerwolf::execute(Monster* pMonster) @@ -173,16 +173,16 @@ void TransformToWerwolf::execute(Monster* pMonster) SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectTransformToWerwolf* pEffectTTW = new EffectTransformToWerwolf(pMonster); pEffectTTW->setDeadline(999999999); pMonster->addEffect(pEffectTTW); pMonster->setFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WERWOLF); - // ̷ ؼ ϴ ɷġ ش. + // 이로 인해서 변하는 능력치들을 보내준다. pMonster->initAllStat(); - // ̾ 븦 ϶ ˷ش. + // 뱀파이어 대신 늑대를 더하라고 알려준다. GCAddWolf gcAddWerwolf; gcAddWerwolf.setObjectID(pMonster->getObjectID()); gcAddWerwolf.setName(pMonster->getName()); diff --git a/src/server/gameserver/skill/TransformToWolf.cpp b/src/server/gameserver/skill/TransformToWolf.cpp index 62cace11..faaa3b13 100644 --- a/src/server/gameserver/skill/TransformToWolf.cpp +++ b/src/server/gameserver/skill/TransformToWolf.cpp @@ -20,7 +20,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ κ丮 ڵ鷯 +// 뱀파이어 인벤토리 핸들러 ////////////////////////////////////////////////////////////////////////////// void TransformToWolf::execute(Vampire* pVampire, ObjectID_t InvenObjectID, CoordInven_t X, CoordInven_t Y, CoordInven_t TargetX, CoordInven_t TargetY, VampireSkillSlot* pSkillSlot) @@ -45,8 +45,8 @@ void TransformToWolf::execute(Vampire* pVampire, ObjectID_t InvenObjectID, Coord Item* pItem = pInventory->getItem(X, Y); Assert(pItem != NULL); - // ƴ϶ 翬 . - // PK . + // 적당한 아이템이 아니라면 당연히 변신할 수 없다. + // PK존에서는 변신할 수 없다. if (pItem->getItemClass() != Item::ITEM_CLASS_VAMPIRE_ETC || pItem->getItemType() != 0 || pVampire->hasRelicItem() || g_pPKZoneInfoManager->isPKZone(pZone->getZoneID()) || pVampire->isFlag(Effect::EFFECT_CLASS_REFINIUM_TICKET) || @@ -64,7 +64,7 @@ void TransformToWolf::execute(Vampire* pVampire, ObjectID_t InvenObjectID, Coord ZoneCoord_t x = pVampire->getX(); ZoneCoord_t y = pVampire->getY(); - // Knowledge of Innate ִٸ hit bonus 10 + // Knowledge of Innate 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE); @@ -82,7 +82,7 @@ void TransformToWolf::execute(Vampire* pVampire, ObjectID_t InvenObjectID, Coord bool bEffected = pVampire->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF) || pVampire->isFlag(Effect::EFFECT_CLASS_HAS_FLAG) || pVampire->isFlag(Effect::EFFECT_CLASS_HAS_SWEEPER) - // add by coffee 2006-12-29 䳬СBUG + // add by coffee 2006-12-29 錦攣긴낚鬼의BUG || pVampire->isFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WERWOLF); // end 2006-12-29 @@ -93,13 +93,13 @@ void TransformToWolf::execute(Vampire* pVampire, ObjectID_t InvenObjectID, Coord SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectTransformToWolf* pEffectTTW = new EffectTransformToWolf(pVampire); pEffectTTW->setDeadline(999999999); pVampire->addEffect(pEffectTTW); pVampire->setFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF); - // ̷ ؼ ϴ ɷġ ش. + // 이로 인해서 변하는 능력치들을 보내준다. VAMPIRE_RECORD prev; pVampire->getVampireRecord(prev); pVampire->initAllStat(); @@ -111,7 +111,7 @@ void TransformToWolf::execute(Vampire* pVampire, ObjectID_t InvenObjectID, Coord pPlayer->sendPacket(&_GCSkillToInventoryOK1); - // ̾ 븦 ϶ ˷ش. + // 뱀파이어 대신 늑대를 더하라고 알려준다. GCAddWolf gcAddWolf; gcAddWolf.setObjectID(pVampire->getObjectID()); gcAddWolf.setName(pVampire->getName()); @@ -143,7 +143,7 @@ void TransformToWolf::execute(Vampire* pVampire, ObjectID_t InvenObjectID, Coord } ////////////////////////////////////////////////////////////////////////////// -// ڵ鷯 +// 몬스터 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void TransformToWolf::execute(Monster* pMonster) @@ -174,16 +174,16 @@ void TransformToWolf::execute(Monster* pMonster) SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectTransformToWolf* pEffectTTW = new EffectTransformToWolf(pMonster); pEffectTTW->setDeadline(999999999); pMonster->addEffect(pEffectTTW); pMonster->setFlag(Effect::EFFECT_CLASS_TRANSFORM_TO_WOLF); - // ̷ ؼ ϴ ɷġ ش. + // 이로 인해서 변하는 능력치들을 보내준다. pMonster->initAllStat(); - // ̾ 븦 ϶ ˷ش. + // 뱀파이어 대신 늑대를 더하라고 알려준다. GCAddWolf gcAddWolf; gcAddWolf.setObjectID(pMonster->getObjectID()); gcAddWolf.setName(pMonster->getName()); diff --git a/src/server/gameserver/skill/Transfusion.cpp b/src/server/gameserver/skill/Transfusion.cpp index 93fd0584..af2fd3b0 100644 --- a/src/server/gameserver/skill/Transfusion.cpp +++ b/src/server/gameserver/skill/Transfusion.cpp @@ -21,7 +21,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Transfusion::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -43,11 +43,11 @@ void Transfusion::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isNPC() - // HIDE ǻ ̻ϰ ȴ. ϴ Ƴ. + // HIDE 인 놈은 되살려내면 이상하게 된다. 일단 막아놓음. // 2003. 1. 17. DEW || pTargetCreature->isFlag(Effect::EFFECT_CLASS_HIDE) || (g_pConfig->hasKey("Hardcore") && g_pConfig->getPropertyInt("Hardcore") != 0 && @@ -71,7 +71,7 @@ void Transfusion::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS SkillType_t SkillType = pVampireSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // Knowledge of Innate ִٸ hit bonus 10 + // Knowledge of Innate 가 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_INNATE); @@ -80,7 +80,7 @@ void Transfusion::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS HitBonus = pRankBonus->getPoint(); } - // 15% + // 15%를 사용 int CurrentHP = pVampire->getHP(ATTR_CURRENT); #ifdef __CHINA_SERVER__ int RequiredMP = CurrentHP * 15 / 100; // decreaseConsumeMP(pVampire, pSkillInfo); @@ -97,19 +97,19 @@ void Transfusion::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS Range_t Range = 1; - // HP Full ƴϰ - // ڽ HP 30̻ + // 상대방의 HP가 Full이 아니고 + // 자신의 HP가 30이상 if (pVampire->getHP(ATTR_CURRENT) >= 30) { if (pTargetCreature->isVampire()) { Vampire* pTargetVampire = dynamic_cast(pTargetCreature); - // HP+SilverDamage < MaxHP Ѵ. + // 현재HP+SilverDamage < MaxHP 여야 한다. if (pTargetVampire->getHP(ATTR_CURRENT) + pTargetVampire->getSilverDamage() < pTargetVampire->getHP(ATTR_MAX)) bHPCheck = true; } /* - // ̰ ʿ. + // 아직 이건 필요없다. else if (pTargetCreature->isMonster()) { Monster* pMonster = dynamic_cast(pTargetCreature); @@ -125,12 +125,12 @@ void Transfusion::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS decreaseMana(pVampire, RequiredMP, _GCSkillToTileOK1); - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); - // TargetCreature HP ä + // TargetCreature의 HP를 채운다 if (pTargetCreature->isVampire()) { Vampire* pTargetVampire = dynamic_cast(pTargetCreature); @@ -140,7 +140,7 @@ void Transfusion::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS pTargetVampire->setHP(newHP); - // HP 30% Ǹ(33% -_-;) Ƴ ȴ. + // HP가 30%가 되면(33% -_-;) 살아나게 된다. if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_COMA)) { // cout << "Target has EFFECT_COMA" << endl; if (newHP * 3 >= maxHP) { @@ -152,21 +152,21 @@ void Transfusion::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS if (pEffectComa->canResurrect()) { // cout << "Can Resurrect!" << endl; - // Ÿ Ʈ Ŵ ڸ Ʈ Ѵ. + // 타겟의 이펙트 매니저에서 코마 이펙트를 삭제한다. pTargetCreature->deleteEffect(Effect::EFFECT_CLASS_COMA); pTargetCreature->removeFlag(Effect::EFFECT_CLASS_COMA); - // ڸ Ʈ ưٰ ˷ش. + // 코마 이펙트가 날아갔다고 알려준다. GCRemoveEffect gcRemoveEffect; gcRemoveEffect.setObjectID(pTargetCreature->getObjectID()); gcRemoveEffect.addEffectList((EffectID_t)Effect::EFFECT_CLASS_COMA); pZone->broadcastPacket(pTargetCreature->getX(), pTargetCreature->getY(), &gcRemoveEffect); - // Ʈ ٽ ش. by sigi. 2002.11.14 + // 이펙트 정보를 다시 보내준다. by sigi. 2002.11.14 pTargetCreature->getEffectManager()->sendEffectInfo( pTargetCreature, pZone, pTargetCreature->getX(), pTargetCreature->getY()); - // EffectKillAftermath δ. + // EffectKillAftermath 를 붙인다. if (pTargetCreature->isFlag(Effect::EFFECT_CLASS_KILL_AFTERMATH)) { Effect* pEffect = pTargetCreature->findEffect(Effect::EFFECT_CLASS_KILL_AFTERMATH); EffectKillAftermath* pEffectKillAftermath = dynamic_cast(pEffect); @@ -182,13 +182,13 @@ void Transfusion::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS } } - // ü äٴ ˸. + // 주위에 체력이 채워졌다는 사실을 알린다. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pTargetVampire->getObjectID()); gcStatusCurrentHP.setCurrentHP(pTargetVampire->getHP(ATTR_CURRENT)); pZone->broadcastPacket(X, Y, &gcStatusCurrentHP); - // ڽ پ͵ + // 자신의 에너지가 줄어든것도 보여주자 gcStatusCurrentHP.setObjectID(pVampire->getObjectID()); gcStatusCurrentHP.setCurrentHP(pVampire->getHP(ATTR_CURRENT)); pZone->broadcastPacket(pVampire->getX(), pVampire->getY(), &gcStatusCurrentHP); @@ -259,7 +259,7 @@ void Transfusion::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireS } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void Transfusion::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/Trident.cpp b/src/server/gameserver/skill/Trident.cpp index f2d93d7f..73df221e 100644 --- a/src/server/gameserver/skill/Trident.cpp +++ b/src/server/gameserver/skill/Trident.cpp @@ -14,7 +14,7 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ +// 슬레이어 오브젝트 ////////////////////////////////////////////////////////////////////////////// void Trident::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -35,7 +35,7 @@ void Trident::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -48,9 +48,9 @@ void Trident::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk GCAttackArmsOK4 _GCAttackArmsOK4; GCAttackArmsOK5 _GCAttackArmsOK5; - // ִ Ⱑ ų, 迭 Ⱑ ƴ϶ . - // 迭 ߿ SG SR Trident . - // SG, SR ִ. + // 들고 있는 무기가 없거나, 총 계열 무기가 아니라면 기술을 쓸 수 없다. + // 총 계열 무기 중에서도 SG나 SR은 Trident를 쓸 수가 없다. + // SG, SR 도 이제 쓸 수 있다. // 2003. 1. 14 by bezz Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL || isArmsWeapon(pWeapon) == false) @@ -73,7 +73,7 @@ void Trident::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk SkillOutput output; computeOutput(input, output); - // Ƽ Ѵ. + // 페널티 값을 계산한다. int ToHitPenalty = getPercentValue(pSlayer->getToHit(), output.ToHit); int RequiredMP = (int)pSkillInfo->getConsumeMP(); @@ -84,12 +84,12 @@ void Trident::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk bool bHitRoll = HitRoll::isSuccess(pSlayer, pTargetCreature, ToHitPenalty); bool bPK = verifyPK(pSlayer, pTargetCreature); - // Ѿ ڴ ߸. + // 총알 숫자는 무조건 떨어뜨린다. Bullet_t RemainBullet = 0; if (bBulletCheck) { - // Ѿ ڸ ߸, ϰ, Ѿ ڸ ޾ƿ´. + // 총알 숫자를 떨어뜨리고, 저장하고, 남은 총알 숫자를 받아온다. decreaseBullet(pWeapon); - // ѹ߾ ʿ . by sigi. 2002.5.9 + // 한발쓸때마다 저장할 필요 없다. by sigi. 2002.5.9 // pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); RemainBullet = getRemainBullet(pWeapon); } @@ -103,26 +103,26 @@ void Trident::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk bool bCriticalHit = false; - // ϰ, quickfire Ƽ Ѵ. - // output.Damage ̱ , % ϸ ᱹ ȴ. + // 데미지를 계산하고, quickfire 페널티를 가한다. + // output.Damage가 음수이기 때문에, %값을 구해 더하면 결국 빼는 것이 된다. int Damage = computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); Damage += getPercentValue(Damage, output.Damage); Damage = max(0, Damage); // cout << "TridentDamage:" << Damage << endl; - // Ѵ. + // 데미지를 세팅한다. setDamage(pTargetCreature, Damage, pSlayer, SkillType, &_GCAttackArmsOK2, &_GCAttackArmsOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCAttackArmsOK2, &_GCAttackArmsOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } /* - // 80% Ȯθ ɷġ Ѵ. - // ̾ ƴ 쿡 ġ Ѵ. + // 80% 확률로만 능력치가 상승한다. + // 상대방이 슬레이어가 아닐 경우에만 경험치가 상승한다. if (Random(1, 100) < 80 && !pTargetCreature->isSlayer()) { */ @@ -150,7 +150,7 @@ void Trident::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk pMonster->addEnemy(pSlayer); } - // ڿ Ʈ. + // 공격자와 상대의 아이템 내구성 떨어트림. decreaseDurability(pSlayer, pTargetCreature, NULL, &_GCAttackArmsOK1, &_GCAttackArmsOK2); ZoneCoord_t targetX = pTargetCreature->getX(); @@ -211,7 +211,7 @@ void Trident::execute(Monster* pMonster, Creature* pEnemy) Zone* pZone = pMonster->getZone(); Assert(pZone != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pEnemy == NULL || pEnemy->isNPC()) { // cout << "WrongEnemy" << endl; executeSkillFailNormalWithGun(pMonster, getSkillType(), pEnemy, RemainBullet); @@ -230,7 +230,7 @@ void Trident::execute(Monster* pMonster, Creature* pEnemy) SkillOutput output; computeOutput(input, output); - // Ƽ Ѵ. + // 페널티 값을 계산한다. int ToHitPenalty = getPercentValue(pMonster->getToHit(), output.ToHit); bool bRangeCheck = verifyDistance(pMonster, pEnemy, pSkillInfo->getRange()); @@ -243,19 +243,19 @@ void Trident::execute(Monster* pMonster, Creature* pEnemy) bool bCriticalHit = false; - // ϰ, quickfire Ƽ Ѵ. - // output.Damage ̱ , % ϸ ᱹ ȴ. + // 데미지를 계산하고, quickfire 페널티를 가한다. + // output.Damage가 음수이기 때문에, %값을 구해 더하면 결국 빼는 것이 된다. int Damage = computeDamage(pMonster, pEnemy, 0, bCriticalHit); Damage += getPercentValue(Damage, output.Damage); Damage = max(0, Damage); // cout << "TridentDamage:" << Damage << endl; - // Ѵ. + // 데미지를 세팅한다. setDamage(pEnemy, Damage, pMonster, SkillType, &_GCAttackArmsOK2); // computeAlignmentChange(pEnemy, Damage, pMonster, &_GCAttackArmsOK2, &_GCAttackArmsOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pEnemy, pMonster->getX(), pMonster->getY()); } @@ -272,7 +272,7 @@ void Trident::execute(Monster* pMonster, Creature* pEnemy) pOtherMonster->addEnemy(pMonster); } - // ڿ Ʈ. + // 공격자와 상대의 아이템 내구성 떨어트림. decreaseDurability(pMonster, pEnemy, NULL, NULL, &_GCAttackArmsOK2); ZoneCoord_t targetX = pEnemy->getX(); diff --git a/src/server/gameserver/skill/TripleBreak.cpp b/src/server/gameserver/skill/TripleBreak.cpp index 480b147a..89f512c2 100644 --- a/src/server/gameserver/skill/TripleBreak.cpp +++ b/src/server/gameserver/skill/TripleBreak.cpp @@ -9,7 +9,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void TripleBreak::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/TripleShot.cpp b/src/server/gameserver/skill/TripleShot.cpp index 6cbf5192..4eb78e32 100644 --- a/src/server/gameserver/skill/TripleShot.cpp +++ b/src/server/gameserver/skill/TripleShot.cpp @@ -14,7 +14,7 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ +// 슬레이어 오브젝트 ////////////////////////////////////////////////////////////////////////////// void TripleShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -35,7 +35,7 @@ void TripleShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -48,9 +48,9 @@ void TripleShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* GCAttackArmsOK4 _GCAttackArmsOK4; GCAttackArmsOK5 _GCAttackArmsOK5; - // ִ Ⱑ ų, 迭 Ⱑ ƴ϶ . - // 迭 ߿ SG SR TripleShot . - // SR, SG ִ. + // 들고 있는 무기가 없거나, 총 계열 무기가 아니라면 기술을 쓸 수 없다. + // 총 계열 무기 중에서도 SG나 SR은 TripleShot를 쓸 수가 없다. + // SR, SG 도 이제 쓸 수 있다. // 2003. 1. 14 by bezz Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL || isArmsWeapon(pWeapon) == false) @@ -73,7 +73,7 @@ void TripleShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* SkillOutput output; computeOutput(input, output); - // Ƽ Ѵ. + // 페널티 값을 계산한다. int ToHitPenalty = getPercentValue(pSlayer->getToHit(), output.ToHit); int RequiredMP = (int)pSkillInfo->getConsumeMP(); @@ -84,12 +84,12 @@ void TripleShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* bool bHitRoll = HitRoll::isSuccess(pSlayer, pTargetCreature, ToHitPenalty); bool bPK = verifyPK(pSlayer, pTargetCreature); - // Ѿ ڴ ߸. + // 총알 숫자는 무조건 떨어뜨린다. Bullet_t RemainBullet = 0; if (bBulletCheck) { - // Ѿ ڸ ߸, ϰ, Ѿ ڸ ޾ƿ´. + // 총알 숫자를 떨어뜨리고, 저장하고, 남은 총알 숫자를 받아온다. decreaseBullet(pWeapon); - // ѹ߾ ʿ . by sigi. 2002.5.9 + // 한발쓸때마다 저장할 필요 없다. by sigi. 2002.5.9 // pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); RemainBullet = getRemainBullet(pWeapon); } @@ -102,26 +102,26 @@ void TripleShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* bool bCriticalHit = false; - // ϰ, quickfire Ƽ Ѵ. - // output.Damage ̱ , % ϸ ᱹ ȴ. + // 데미지를 계산하고, quickfire 페널티를 가한다. + // output.Damage가 음수이기 때문에, %값을 구해 더하면 결국 빼는 것이 된다. int Damage = computeDamage(pSlayer, pTargetCreature, SkillLevel / 5, bCriticalHit); Damage += getPercentValue(Damage, output.Damage); Damage = max(0, Damage); // cout << "TripleShotDamage:" << Damage << endl; - // Ѵ. + // 데미지를 세팅한다. setDamage(pTargetCreature, Damage, pSlayer, SkillType, &_GCAttackArmsOK2, &_GCAttackArmsOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCAttackArmsOK2, &_GCAttackArmsOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); } /* - // 80% Ȯθ ɷġ Ѵ. - // ̾ ƴ 쿡 ġ Ѵ. + // 80% 확률로만 능력치가 상승한다. + // 상대방이 슬레이어가 아닐 경우에만 경험치가 상승한다. if (Random(1, 100) < 80 && !pTargetCreature->isSlayer()) { */ @@ -148,7 +148,7 @@ void TripleShot::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pMonster->addEnemy(pSlayer); } - // ڿ Ʈ. + // 공격자와 상대의 아이템 내구성 떨어트림. decreaseDurability(pSlayer, pTargetCreature, NULL, &_GCAttackArmsOK1, &_GCAttackArmsOK2); ZoneCoord_t targetX = pTargetCreature->getX(); diff --git a/src/server/gameserver/skill/TripleSlasher.cpp b/src/server/gameserver/skill/TripleSlasher.cpp index f09133f6..0ce32262 100644 --- a/src/server/gameserver/skill/TripleSlasher.cpp +++ b/src/server/gameserver/skill/TripleSlasher.cpp @@ -9,7 +9,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void TripleSlasher::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/TurnUndead.cpp b/src/server/gameserver/skill/TurnUndead.cpp index 5af1d6e4..9b316633 100644 --- a/src/server/gameserver/skill/TurnUndead.cpp +++ b/src/server/gameserver/skill/TurnUndead.cpp @@ -15,7 +15,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void TurnUndead::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -80,7 +80,7 @@ void TurnUndead::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEf Tile& tile = pZone->getTile(tileX, tileY); - // ŸϿ ִ ũó Ʈ . + // 타일에 있는 크리처들을 리스트로 만든다. list targetList; if (tile.hasCreature(Creature::MOVE_MODE_WALKING)) { Creature* pCreature = tile.getCreature(Creature::MOVE_MODE_WALKING); @@ -108,15 +108,15 @@ void TurnUndead::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEf bHit = true; - // Ų. + // 데미지를 적용시킨다. GCModifyInformation gcMI; ::setDamage(pTargetCreature, output.Damage, pSlayer, pSkillSlot->getSkillType(), &gcMI); - // HP ߴٰ ڿ . + // HP 가 변했다고 당사자에게 보낸다. pTargetPlayer->sendPacket(&gcMI); GCSkillToObjectOK2 gcSkillToObjectOK2; - gcSkillToObjectOK2.setObjectID(1); // ǹ . + gcSkillToObjectOK2.setObjectID(1); // 의미 없다. gcSkillToObjectOK2.setSkillType(SKILL_ATTACK_MELEE); gcSkillToObjectOK2.setDuration(0); } else if (pTargetCreature->isMonster()) { @@ -140,7 +140,7 @@ void TurnUndead::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEf pZone->broadcastPacket(pTargetCreature->getX(), pTargetCreature->getY(), &gcSkillToObjectOK4); - // ø. + // 성향을 올린다. increaseAlignment(pSlayer, pTargetCreature, _GCSkillToSelfOK1); } } @@ -154,7 +154,7 @@ void TurnUndead::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEf increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToSelfOK1); } - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(0); @@ -163,11 +163,11 @@ void TurnUndead::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CEf _GCSkillToSelfOK2.setSkillType(SkillType); _GCSkillToSelfOK2.setDuration(0); - // packet + // 기술을 사용한 사람에게 packet 전달 pPlayer->sendPacket(&_GCSkillToSelfOK1); pZone->broadcastPacket(X, Y, &_GCSkillToSelfOK2, pSlayer); - // delay setting + // 기술 delay setting pSkillSlot->setRunTime(output.Delay); } else { diff --git a/src/server/gameserver/skill/TurretFire.cpp b/src/server/gameserver/skill/TurretFire.cpp index eff69fdb..2687a1a8 100644 --- a/src/server/gameserver/skill/TurretFire.cpp +++ b/src/server/gameserver/skill/TurretFire.cpp @@ -27,10 +27,10 @@ void TurretFire::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo bool bBulletCheck = (getRemainBullet(pWeapon) > 0) ? true : false; - // Ѿ ڴ ߸. + // 총알 숫자는 무조건 떨어뜨린다. Bullet_t RemainBullet = 0; if (bBulletCheck) { - // Ѿ ڸ ߸, ϰ, Ѿ ڸ ޾ƿ´. + // 총알 숫자를 떨어뜨리고, 저장하고, 남은 총알 숫자를 받아온다. decreaseBullet(pWeapon); RemainBullet = getRemainBullet(pWeapon); } else { @@ -57,7 +57,7 @@ void TurretFire::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo SIMPLE_SKILL_OUTPUT result; - // ǥġ+4 + // 목표위치+4방향 param.addMask(0, 0, 100); param.addMask(-1, -1, 100); param.addMask(0, -1, 100); @@ -74,7 +74,7 @@ void TurretFire::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlo } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void TurretFire::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/Typhoon.cpp b/src/server/gameserver/skill/Typhoon.cpp index 9767c16f..b0624717 100644 --- a/src/server/gameserver/skill/Typhoon.cpp +++ b/src/server/gameserver/skill/Typhoon.cpp @@ -10,7 +10,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Typhoon::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -49,12 +49,12 @@ void Typhoon::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Creature* pCreature = pZone->getCreature(TargetObjectID); if (pCreature != NULL) { - // 츸 delay ߰Ѵ. - // player client óϰ Ǿִ. + // 몬스터인 경우만 delay를 추가한다. + // player들은 client에서 처리하게 되어있다. if (pCreature->isMonster()) { Monster* pMonster = dynamic_cast(pCreature); - // delay ( + 1 ) + // delay설정 ( + 1초 ) if (!pMonster->isMaster() #ifdef __UNDERWORLD__ && !pMonster->isUnderworld() && pMonster->getMonsterType() != 599 @@ -69,7 +69,7 @@ void Typhoon::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk } } - // 뿡 Ʈ ٿش. + // 상대에게 데미지를 준 다음 이펙트를 붙여준다. // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; diff --git a/src/server/gameserver/skill/UltimateBlow.cpp b/src/server/gameserver/skill/UltimateBlow.cpp index 184611a9..65b01c69 100644 --- a/src/server/gameserver/skill/UltimateBlow.cpp +++ b/src/server/gameserver/skill/UltimateBlow.cpp @@ -14,7 +14,7 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ +// 슬레이어 오브젝트 ////////////////////////////////////////////////////////////////////////////// void UltimateBlow::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -35,7 +35,7 @@ void UltimateBlow::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " End" << endl; @@ -48,9 +48,9 @@ void UltimateBlow::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot GCAttackArmsOK4 _GCAttackArmsOK4; GCAttackArmsOK5 _GCAttackArmsOK5; - // ִ Ⱑ ų, 迭 Ⱑ ƴ϶ . - // 迭 ߿ SG SR UltimateBlow . - // SG, SR ִ. + // 들고 있는 무기가 없거나, 총 계열 무기가 아니라면 기술을 쓸 수 없다. + // 총 계열 무기 중에서도 SG나 SR은 UltimateBlow를 쓸 수가 없다. + // SG, SR 도 이제 쓸 수 있다. // 2003. 1. 14 by bezz Item* pWeapon = pSlayer->getWearItem(Slayer::WEAR_RIGHTHAND); if (pWeapon == NULL || isArmsWeapon(pWeapon) == false) @@ -73,7 +73,7 @@ void UltimateBlow::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot SkillOutput output; computeOutput(input, output); - // Ƽ Ѵ. + // 페널티 값을 계산한다. int ToHitPenalty = getPercentValue(pSlayer->getToHit(), output.ToHit); int RequiredMP = (int)pSkillInfo->getConsumeMP(); @@ -84,12 +84,12 @@ void UltimateBlow::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot bool bHitRoll = HitRoll::isSuccess(pSlayer, pTargetCreature, ToHitPenalty); bool bPK = verifyPK(pSlayer, pTargetCreature); - // Ѿ ڴ ߸. + // 총알 숫자는 무조건 떨어뜨린다. Bullet_t RemainBullet = 0; if (bBulletCheck) { - // Ѿ ڸ ߸, ϰ, Ѿ ڸ ޾ƿ´. + // 총알 숫자를 떨어뜨리고, 저장하고, 남은 총알 숫자를 받아온다. decreaseBullet(pWeapon); - // ѹ߾ ʿ . by sigi. 2002.5.9 + // 한발쓸때마다 저장할 필요 없다. by sigi. 2002.5.9 // pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); RemainBullet = getRemainBullet(pWeapon); } @@ -103,8 +103,8 @@ void UltimateBlow::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot // bool bCriticalHit = false; - // ϰ, quickfire Ƽ Ѵ. - // output.Damage ̱ , % ϸ ᱹ ȴ. + // 데미지를 계산하고, quickfire 페널티를 가한다. + // output.Damage가 음수이기 때문에, %값을 구해 더하면 결국 빼는 것이 된다. int Damage = max(1, Random(pWeapon->getMinDamage(), pWeapon->getMaxDamage())) * (1.0f + ((float)pSkillSlot->getExpLevel() * 4.0f / 100.f)); // computeDamage(pSlayer, pTargetCreature, SkillLevel/5, bCriticalHit); @@ -113,11 +113,11 @@ void UltimateBlow::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot // cout << "UltimateBlowDamage:" << Damage << endl; - // Ѵ. + // 데미지를 세팅한다. setDamage(pTargetCreature, Damage, pSlayer, SkillType, &_GCAttackArmsOK2, &_GCAttackArmsOK1); computeAlignmentChange(pTargetCreature, Damage, pSlayer, &_GCAttackArmsOK2, &_GCAttackArmsOK1); - // ũƼ Ʈ ڷ Ѵ. + // 크리티컬 히트라면 상대방을 뒤로 물러나게 한다. /* if (bCriticalHit) { knockbackCreature(pZone, pTargetCreature, pSlayer->getX(), pSlayer->getY()); @@ -129,8 +129,8 @@ void UltimateBlow::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot } /* - // 80% Ȯθ ɷġ Ѵ. - // ̾ ƴ 쿡 ġ Ѵ. + // 80% 확률로만 능력치가 상승한다. + // 상대방이 슬레이어가 아닐 경우에만 경험치가 상승한다. if (Random(1, 100) < 80 && !pTargetCreature->isSlayer()) { */ @@ -159,7 +159,7 @@ void UltimateBlow::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot pMonster->addEnemy(pSlayer); } - // ڿ Ʈ. + // 공격자와 상대의 아이템 내구성 떨어트림. decreaseDurability(pSlayer, pTargetCreature, NULL, &_GCAttackArmsOK1, &_GCAttackArmsOK2); ZoneCoord_t targetX = pTargetCreature->getX(); diff --git a/src/server/gameserver/skill/UnterfeldwebelFire.cpp b/src/server/gameserver/skill/UnterfeldwebelFire.cpp index c710b85d..9edf9bae 100644 --- a/src/server/gameserver/skill/UnterfeldwebelFire.cpp +++ b/src/server/gameserver/skill/UnterfeldwebelFire.cpp @@ -10,7 +10,7 @@ #include "SkillUtil.h" ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void UnterfeldwebelFire::execute(Monster* pMonster, Creature* pEnemy) diff --git a/src/server/gameserver/skill/Untransform.cpp b/src/server/gameserver/skill/Untransform.cpp index a94b713c..6cf2a0fd 100644 --- a/src/server/gameserver/skill/Untransform.cpp +++ b/src/server/gameserver/skill/Untransform.cpp @@ -38,9 +38,9 @@ void Untransform::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE gcOK1.setSkillType(SKILL_UN_TRANSFORM); pSlayer->getPlayer()->sendPacket(&gcOK1); - // EffectSummonSylph unaffect ش. + // EffectSummonSylph에 unaffect에서 다 해준다. - // Ʈ ݴٰ ְ + // 존에 이펙트 없앴다고 보내주고 // GCRemoveEffect removeEffect; // removeEffect.setObjectID(pSlayer->getObjectID()); // removeEffect.addEffectList(Effect::EFFECT_CLASS_SUMMON_SYLPH); @@ -49,7 +49,7 @@ void Untransform::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE // // GCModifyInformation gcMI; // - // // ٽ ؼ ְ + // // 디펜 프텍 다시 계산해서 보내주고 // OUSTERS_RECORD prev; // pSlayer->getSlayerRecord(prev); // pSlayer->initAllStat(); @@ -62,7 +62,7 @@ void Untransform::execute(Slayer* pSlayer, SkillSlot* pSkillSlot, CEffectID_t CE pSlayer->getPlayer()->sendPacket(&gcFail); } } catch (Throwable& t) { - // Ŭ̾Ʈ -_- ̷ Ф + // 클라이언트에서 -_- 이런 거 보내지 말란다 흑 ㅠㅠ // executeSkillFailException(pSlayer, getSkillType()); } @@ -120,9 +120,9 @@ void Untransform::execute(Ousters* pOusters) gcOK1.setSkillType(SKILL_UN_TRANSFORM); pOusters->getPlayer()->sendPacket(&gcOK1); - // EffectSummonSylph unaffect ش. + // EffectSummonSylph에 unaffect에서 다 해준다. - // Ʈ ݴٰ ְ + // 존에 이펙트 없앴다고 보내주고 // GCRemoveEffect removeEffect; // removeEffect.setObjectID(pOusters->getObjectID()); // removeEffect.addEffectList(Effect::EFFECT_CLASS_SUMMON_SYLPH); @@ -131,7 +131,7 @@ void Untransform::execute(Ousters* pOusters) // // GCModifyInformation gcMI; // - // // ٽ ؼ ְ + // // 디펜 프텍 다시 계산해서 보내주고 // OUSTERS_RECORD prev; // pOusters->getOustersRecord(prev); // pOusters->initAllStat(); @@ -144,7 +144,7 @@ void Untransform::execute(Ousters* pOusters) pOusters->getPlayer()->sendPacket(&gcFail); } } catch (Throwable& t) { - // Ŭ̾Ʈ -_- ̷ Ф + // 클라이언트에서 -_- 이런 거 보내지 말란다 흑 ㅠㅠ // executeSkillFailException(pOusters, getSkillType()); } diff --git a/src/server/gameserver/skill/VampireSkillSlot.cpp b/src/server/gameserver/skill/VampireSkillSlot.cpp index 73dd40d4..441bdf40 100644 --- a/src/server/gameserver/skill/VampireSkillSlot.cpp +++ b/src/server/gameserver/skill/VampireSkillSlot.cpp @@ -143,19 +143,19 @@ Turn_t VampireSkillSlot::getRemainTurn(Timeval currentTime) const throw() { } void VampireSkillSlot::setRunTime() throw() { - // ð ޾ƿ´. + // 현재 시간을 받아온다. getCurrentTime(m_runTime); - // ִ ð Ѵ. + // 다음 쓸 수 있는 시간을 세팅한다. m_runTime.tv_sec += m_Interval / 10; m_runTime.tv_usec += (m_Interval % 10) * 100000; } void VampireSkillSlot::setRunTime(Turn_t delay) throw() { - // ð ޾ƿ´. + // 현재 시간을 받아온다. getCurrentTime(m_runTime); - // ִ ð Ѵ. + // 다음 쓸 수 있는 시간을 세팅한다. m_runTime.tv_sec += delay / 10; m_runTime.tv_usec += (delay % 10) * 100000; @@ -177,7 +177,7 @@ void VampireSkillSlot::setRunTime(Turn_t delay) throw() { case SKILL_HOWL: break; default: - save(m_Name); // ޸ ̸ ̺Ѵ. + save(m_Name); // 달리진 딜레이를 세이브한다. break; } } diff --git a/src/server/gameserver/skill/VampireSkillSlot.h b/src/server/gameserver/skill/VampireSkillSlot.h index 17222bc2..9cbd0bd3 100644 --- a/src/server/gameserver/skill/VampireSkillSlot.h +++ b/src/server/gameserver/skill/VampireSkillSlot.h @@ -63,15 +63,15 @@ class VampireSkillSlot { m_Name = Name; } - // ij Ҷ ð + // 다음 캐스팅이 가능할때까지 남은 시간 Turn_t getRemainTurn(Timeval currentTime) const throw(); private: string m_Name; - SkillType_t m_SkillType; // , - Turn_t m_Interval; // , , - Turn_t m_CastingTime; // ij Ÿ... 0.1 - Timeval m_runTime; // ִ ð + SkillType_t m_SkillType; // 마법, 기술의 종류 + Turn_t m_Interval; // 마법, 기술의 딜레이, 초 단위 + Turn_t m_CastingTime; // 캐스팅 타임... 0.1초 단위 + Timeval m_runTime; // 다음에 쓸 수 있는 시간 }; #endif // __VAMPIRE_SKILL_SLOT_H__ diff --git a/src/server/gameserver/skill/VigorDrop-old.cpp b/src/server/gameserver/skill/VigorDrop-old.cpp index aa23cf17..9b704f8a 100644 --- a/src/server/gameserver/skill/VigorDrop-old.cpp +++ b/src/server/gameserver/skill/VigorDrop-old.cpp @@ -2,23 +2,23 @@ // Project : DARKEDEN // Module : Skill - Effect // File Name : EffectVigorDrop.h -// Writer : ȫâ +// Writer : 장홍창 // Date : 2002.3.28 // Description : -// Vigor Drop --storm Ǵ -// Slayer ̴. -// ϰ Ǹ, ߽ 3x3 -// EffectVigorDrop Effect ٰ ȴ. EffectVigorDrop Effect -// ϴ ƴ϶. -// ش Creature EffectVigorDropToCreature Effect -// ̰ . EffectVigorDropToCreature VigorDrop -// ü 1/3 شϴ Damage 3 ش -// Creature ϰ . +// Vigor Drop은 --storm류의 기술과 동일한 방식으로 구현되는 +// Slayer의 기술이다. +// 기술을 사용하게 되면, 기술 시전 지역을 중심으로 3x3의 영역에 +// EffectVigorDrop Effect가 붙게 된다. EffectVigorDrop Effect +// 는 독자적으로 데미지를 가하는 기술이 아니라. +// 해당 지역의 Creature에게 EffectVigorDropToCreature Effect를 +// 붙이고 사라진다. EffectVigorDropToCreature는 VigorDrop의 +// 전체 데미지의 1/3에 해당하는 Damage를 3번 연속으로 해당 +// Creature에게 가하고 사라진다. // // History // DATE WRITER DESCRIPTION // =========== =========== ===================================================== -// 2002.3.28 ȫâ header file ۼ +// 2002.3.28 장홍창 header file 작성 // // //////////////////////////////////////////////////////////////////////////////// @@ -35,7 +35,7 @@ #include "VigorDrop.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void VigorDrop::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -55,7 +55,7 @@ void VigorDrop::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); @@ -74,8 +74,8 @@ void VigorDrop::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 -// ̾ Vigor Drop Skill Tile ϴ Handler +// 뱀파이어 타일 핸들러 +// 뱀파이어가 Vigor Drop Skill을 Tile에 사용했을때 사용하는 Handler ////////////////////////////////////////////////////////////////////////////// void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -98,10 +98,10 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot GCSkillToTileOK5 _GCSkillToTileOK5; GCSkillToTileOK6 _GCSkillToTileOK6; - // Skillype + // Skillype을 가지고 // SkillInfo - // SkillDomainInfo ´. - // SkillDomain ش 迭 ġ ø ̴. + // SkillDomainInfo정보를 가져온다. + // SkillDomain정보는 기술이 성공했을 경우 해당 계열의 경험치를 올리기 위한 것이다. SkillType_t SkillType = pSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); SkillDomainType_t DomainType = pSkillInfo->getDomainType(); @@ -136,7 +136,7 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot Range_t Range = 3; - // Ʈ ŸϿ ִٸ Ѵ. + // 기존에 같은 이펙트가 타일에 있다면 지우고 새로 설정한다. Tile& tile = pZone->getTile(X, Y); Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_VIGOR_DROP); if (pOldEffect != NULL) { @@ -144,11 +144,11 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot pZone->deleteEffect(effectID); } - // Ʈ Ʈ ؼ ŸϿ δ. + // 이펙트 오브젝트를 생성해서 타일에 붙인다. // cout << "make EffectObject to Tile" << X << " " << Y << endl; EffectVigorDrop* pEffect = new EffectVigorDrop(pZone, X, Y); - // 켱 ý Ͽ ̸ Ƽ ̵ ִ´. + // 우선권 시스템을 위하여 이름과 파티 아이디를 넣는다. pEffect->setCasterName(pSlayer->getName()); pEffect->setPartyID(pSlayer->getPartyID()); @@ -168,9 +168,9 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot // tile.addEffect(pEffect); - // Ʈ Creature effect ٿش. - // Slayer SlayerԴ - // ش ʴ´. + // 이펙트 범위내의 모든 Creature에게 effect를 붙여준다. + // Slayer가 기술을 사용한 경우 같은 Slayer에게는 + // 해당하지 않는다. bool bEffected = false; bool bHit = false; Creature* pTargetCreature; @@ -203,7 +203,7 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot Player* pTargetPlayer = pTargetCreature->getPlayer(); bEffected = true; - // ġ ؼ Hit/Don'tHie Ѵ. + // 경험치 상승을 위해서 Hit/Don'tHie를 기록한다. bHit = true; bool bCanSee = canSee(pTargetCreature, pSlayer); @@ -215,7 +215,7 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot cList.push_back(pTargetCreature); if (bCanSee) { - // + // 공격을 당한 사람에게 _GCSkillToTileOK2.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK2.setSkillType(SkillType); _GCSkillToTileOK2.setX(X); @@ -234,7 +234,7 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pSlayer); - // ְ ̾ Ѵ. by sigi. 2002.6.21 + // 마지막 때린 애가 슬레이어라고 설정한다. by sigi. 2002.6.21 pMonster->setLastHitCreatureClass(Creature::CREATURE_CLASS_SLAYER); } } @@ -242,16 +242,16 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot } if (bHit) { - // Ÿϳ ѹ̶ ġ ޴´. - // Creature 쿡  ϴ°? - // 1. Creature Point Ѵ. - // 2. Creature Point Ѵ. + // 기술이 타일내에서 한번이라도 성공했을때에는 경험치를 받는다. + // 광역기술내에서 여러 Creature한테 데미지를 준 경우에는 어떻게 하는가? + // 1. 한 Creature에게 준 데미지를 Point로 계산한다. + // 2. 여러 Creature에게 준 데미지의 합을 Point로 계산한다. shareAttrExp(pSlayer, output.Damage, 1, 1, 8, _GCSkillToTileOK1); increaseDomainExp(pSlayer, DomainType, pSkillInfo->getPoint(), _GCSkillToTileOK1); increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToTileOK1); } - // 鿡 + // 기술을 사용한 사람들에게 _GCSkillToTileOK1.setSkillType(SkillType); _GCSkillToTileOK1.setCEffectID(CEffectID); _GCSkillToTileOK1.setX(X); @@ -259,21 +259,21 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot _GCSkillToTileOK1.setDuration(output.Duration); _GCSkillToTileOK1.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(X); _GCSkillToTileOK3.setY(Y); //_GCSkillToTileOK3.setDuration(output.Duration); //_GCSkillToTileOK3.setRange(Range); - // ִ 鿡 + // 기술을 당한 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람과 당한 사람을 모두 볼 수 있는 사람들에게 _GCSkillToTileOK5.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); @@ -281,21 +281,21 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); - // packet + // 기술을 사용한 사람에게 packet 전달 pPlayer->sendPacket(&_GCSkillToTileOK1); - // ִ 鿡 broadcasing - // broadcasting 5OK Ѵ. - // ⿡ ϵ broadcasting ܵȴ. + // 기술을 쓸 사람과 당한 사람을 모두 볼 수 있는 사람들에게 broadcasing + // broadcasting후 5번OK를 받은 사람을 기록한다. + // 여기에 기록된 사람은 차후 broadcasting에서 제외된다. cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); - // ִ 鿡 broadcasting + // 기술을 쓴 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); - // ִ 鿡 broadcasting + // 기술을 당한 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); - // delay setting + // 기술 delay setting pSkillSlot->setRunTime(output.Delay); } else { executeSkillFailNormal(pSlayer, getSkillType(), NULL); @@ -310,7 +310,7 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void VigorDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -358,7 +358,7 @@ void VigorDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) Range_t Range = 3; - // Ʈ ŸϿ ִٸ Ѵ. + // 기존에 같은 이펙트가 타일에 있다면 지우고 새로 설정한다. Tile& tile = pZone->getTile(X, Y); Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_VIGOR_DROP); if (pOldEffect != NULL) { @@ -366,7 +366,7 @@ void VigorDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pZone->deleteEffect(effectID); } - // Ʈ Ʈ ؼ ŸϿ δ. + // 이펙트 오브젝트를 생성해서 타일에 붙인다. EffectVigorDrop* pEffect = new EffectVigorDrop(pZone, X, Y); pEffect->setDeadline(output.Duration); pEffect->setNextTime(0); @@ -384,9 +384,9 @@ void VigorDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) tile.addEffect(pEffect); - // Ʈ Creature effect ٿش. - // Slayer SlayerԴ - // ش ʴ´. + // 이펙트 범위내의 모든 Creature에게 effect를 붙여준다. + // Slayer가 기술을 사용한 경우 같은 Slayer에게는 + // 해당하지 않는다. bool bEffected = false; Creature* pTargetCreature; @@ -428,7 +428,7 @@ void VigorDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) cList.push_back(pTargetCreature); if (bCanSee) { - // + // 공격을 당한 사람에게 _GCSkillToTileOK2.setObjectID(pMonster->getObjectID()); _GCSkillToTileOK2.setSkillType(SkillType); _GCSkillToTileOK2.setX(X); @@ -442,21 +442,21 @@ void VigorDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) } // if(pTargetCreature!= NULL) } - // ִ 鿡 + // 기술을 쓴 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(myX); _GCSkillToTileOK3.setY(myY); //_GCSkillToTileOK3.setDuration(output.Duration); //_GCSkillToTileOK3.setRange(Range); - // ִ 鿡 + // 기술을 당한 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람과 당한 사람을 모두 볼 수 있는 사람들에게 _GCSkillToTileOK5.setObjectID(pMonster->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); @@ -464,13 +464,13 @@ void VigorDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); - // ִ 鿡 broadcasing + // 기술을 쓸 사람과 당한 사람을 모두 볼 수 있는 사람들에게 broadcasing cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); - // ִ 鿡 broadcasting + // 기술을 쓴 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); - // ִ 鿡 broadcasting + // 기술을 당한 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); } else { diff --git a/src/server/gameserver/skill/VigorDrop.cpp b/src/server/gameserver/skill/VigorDrop.cpp index d28425b4..8d99117f 100644 --- a/src/server/gameserver/skill/VigorDrop.cpp +++ b/src/server/gameserver/skill/VigorDrop.cpp @@ -2,23 +2,23 @@ // Project : DARKEDEN // Module : Skill - Effect // File Name : EffectVigorDrop.h -// Writer : ȫâ +// Writer : 장홍창 // Date : 2002.3.28 // Description : -// Vigor Drop --storm Ǵ -// Slayer ̴. -// ϰ Ǹ, ߽ 3x3 -// EffectVigorDrop Effect ٰ ȴ. EffectVigorDrop Effect -// ϴ ƴ϶. -// ش Creature EffectVigorDropToCreature Effect -// ̰ . EffectVigorDropToCreature VigorDrop -// ü 1/3 شϴ Damage 3 ش -// Creature ϰ . +// Vigor Drop은 --storm류의 기술과 동일한 방식으로 구현되는 +// Slayer의 기술이다. +// 기술을 사용하게 되면, 기술 시전 지역을 중심으로 3x3의 영역에 +// EffectVigorDrop Effect가 붙게 된다. EffectVigorDrop Effect +// 는 독자적으로 데미지를 가하는 기술이 아니라. +// 해당 지역의 Creature에게 EffectVigorDropToCreature Effect를 +// 붙이고 사라진다. EffectVigorDropToCreature는 VigorDrop의 +// 전체 데미지의 1/3에 해당하는 Damage를 3번 연속으로 해당 +// Creature에게 가하고 사라진다. // // History // DATE WRITER DESCRIPTION // =========== =========== ===================================================== -// 2002.3.28 ȫâ header file ۼ +// 2002.3.28 장홍창 header file 작성 // // //////////////////////////////////////////////////////////////////////////////// @@ -37,7 +37,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void VigorDrop::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -57,7 +57,7 @@ void VigorDrop::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); @@ -76,8 +76,8 @@ void VigorDrop::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* p } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 -// ̾ Vigor Drop Skill Tile ϴ Handler +// 뱀파이어 타일 핸들러 +// 뱀파이어가 Vigor Drop Skill을 Tile에 사용했을때 사용하는 Handler ////////////////////////////////////////////////////////////////////////////// void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -137,7 +137,7 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot SkillOutput output; computeOutput(input, output); - // Soul Smashing ִٸ 10% + // Soul Smashing 이 있다면 데미지 10% 증가 if (pSlayer->hasRankBonus(RankBonus::RANK_BONUS_SOUL_SMASHING)) { RankBonus* pRankBonus = pSlayer->getRankBonus(RankBonus::RANK_BONUS_SOUL_SMASHING); Assert(pRankBonus != NULL); @@ -148,7 +148,7 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot Range_t Range = 3; - // Ʈ ŸϿ ִٸ Ѵ. + // 기존에 같은 이펙트가 타일에 있다면 지우고 새로 설정한다. Tile& tile = pZone->getTile(X, Y); Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_ENERGY_DROP); if (pOldEffect != NULL) { @@ -156,7 +156,7 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot pZone->deleteEffect(effectID); } - // Ʈ Ʈ ؼ ŸϿ δ. + // 이펙트 오브젝트를 생성해서 타일에 붙인다. // cout << "make EffectObject to Tile" << X << " " << Y << endl; pEffect = new EffectVigorDrop(pZone, X, Y); @@ -177,7 +177,7 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot // // pZone->addEffect(pEffect); // tile.addEffect(pEffect); - // Ʈ Ʈ ؼ ŸϿ δ. + // 이펙트 오브젝트를 생성해서 타일에 붙인다. pEffect2 = new EffectVigorDrop(pZone, X, Y); pEffect2->setUserObjectID(pSlayer->getObjectID()); pEffect2->setDeadline(output.Duration); @@ -186,9 +186,9 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot pEffect2->setDamage(output.Damage * 30 / 100); pEffect2->setLevel(pSkillInfo->getLevel() / 2); - // Ʈ Creature effect ٿش. - // Slayer SlayerԴ - // ش ʴ´. + // 이펙트 범위내의 모든 Creature에게 effect를 붙여준다. + // Slayer가 기술을 사용한 경우 같은 Slayer에게는 + // 해당하지 않는다. bool bEffected = false; bool bHit = false; @@ -242,7 +242,7 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot cList.push_back(pTargetCreature); if (bCanSee) { - // + // 공격을 당한 사람에게 _GCSkillToTileOK2.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK2.setSkillType(SkillType); _GCSkillToTileOK2.setX(X); @@ -261,7 +261,7 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot Monster* pMonster = dynamic_cast(pTargetCreature); pMonster->addEnemy(pSlayer); - // ְ ̾ Ѵ. by sigi. 2002.6.21 + // 마지막 때린 애가 슬레이어라고 설정한다. by sigi. 2002.6.21 pMonster->setLastHitCreatureClass(Creature::CREATURE_CLASS_SLAYER); } else { // cout << "VigorDrop to Monster Falis" << endl; @@ -284,7 +284,7 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToTileOK1); } - // 鿡 + // 기술을 사용한 사람들에게 _GCSkillToTileOK1.setSkillType(SkillType); _GCSkillToTileOK1.setCEffectID(CEffectID); _GCSkillToTileOK1.setX(X); @@ -292,21 +292,21 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot _GCSkillToTileOK1.setDuration(output.Duration); _GCSkillToTileOK1.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(X); _GCSkillToTileOK3.setY(Y); //_GCSkillToTileOK3.setDuration(output.Duration); //_GCSkillToTileOK3.setRange(Range); - // ִ 鿡 + // 기술을 당한 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람과 당한 사람을 모두 볼 수 있는 사람들에게 _GCSkillToTileOK5.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); @@ -314,21 +314,21 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); - // packet + // 기술을 사용한 사람에게 packet 전달 pPlayer->sendPacket(&_GCSkillToTileOK1); - // ִ 鿡 broadcasing - // broadcasting 5OK Ѵ. - // ⿡ ϵ broadcasting ܵȴ. + // 기술을 쓸 사람과 당한 사람을 모두 볼 수 있는 사람들에게 broadcasing + // broadcasting후 5번OK를 받은 사람을 기록한다. + // 여기에 기록된 사람은 차후 broadcasting에서 제외된다. cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); - // ִ 鿡 broadcasting + // 기술을 쓴 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); - // ִ 鿡 broadcasting + // 기술을 당한 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); - // delay setting + // 기술 delay setting pSkillSlot->setRunTime(output.Delay); } else { @@ -349,7 +349,7 @@ void VigorDrop::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void VigorDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -400,7 +400,7 @@ void VigorDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) Range_t Range = 3; - // Ʈ ŸϿ ִٸ Ѵ. + // 기존에 같은 이펙트가 타일에 있다면 지우고 새로 설정한다. Tile& tile = pZone->getTile(X, Y); Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_ENERGY_DROP); if (pOldEffect != NULL) { @@ -408,7 +408,7 @@ void VigorDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pZone->deleteEffect(effectID); } - // Ʈ Ʈ ؼ ŸϿ δ. + // 이펙트 오브젝트를 생성해서 타일에 붙인다. pEffect = new EffectVigorDrop(pZone, X, Y); pEffect->setDeadline(output.Duration); pEffect->setNextTime(0); @@ -425,7 +425,7 @@ void VigorDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) // pZone->addEffect(pEffect); // tile.addEffect(pEffect); - // Ʈ Ʈ ؼ ŸϿ δ. + // 이펙트 오브젝트를 생성해서 타일에 붙인다. pEffect2 = new EffectVigorDrop(pZone, X, Y); pEffect2->setDeadline(output.Duration); pEffect2->setNextTime(0); @@ -434,9 +434,9 @@ void VigorDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pEffect2->setLevel(pSkillInfo->getLevel() / 2); - // Ʈ Creature effect ٿش. - // Slayer SlayerԴ - // ش ʴ´. + // 이펙트 범위내의 모든 Creature에게 effect를 붙여준다. + // Slayer가 기술을 사용한 경우 같은 Slayer에게는 + // 해당하지 않는다. bool bEffected = false; Creature* pTargetCreature; @@ -485,7 +485,7 @@ void VigorDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) cList.push_back(pTargetCreature); if (bCanSee) { - // + // 공격을 당한 사람에게 _GCSkillToTileOK2.setObjectID(pMonster->getObjectID()); _GCSkillToTileOK2.setSkillType(SkillType); _GCSkillToTileOK2.setX(X); @@ -499,21 +499,21 @@ void VigorDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) } // if(pTargetCreature!= NULL) } - // ִ 鿡 + // 기술을 쓴 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(myX); _GCSkillToTileOK3.setY(myY); //_GCSkillToTileOK3.setDuration(output.Duration); //_GCSkillToTileOK3.setRange(Range); - // ִ 鿡 + // 기술을 당한 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람과 당한 사람을 모두 볼 수 있는 사람들에게 _GCSkillToTileOK5.setObjectID(pMonster->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); @@ -521,13 +521,13 @@ void VigorDrop::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); - // ִ 鿡 broadcasing + // 기술을 쓸 사람과 당한 사람을 모두 볼 수 있는 사람들에게 broadcasing cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); - // ִ 鿡 broadcasting + // 기술을 쓴 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); - // ִ 鿡 broadcasting + // 기술을 당한 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); diff --git a/src/server/gameserver/skill/ViolentPhantom.cpp b/src/server/gameserver/skill/ViolentPhantom.cpp index 53412f57..a2b27a05 100644 --- a/src/server/gameserver/skill/ViolentPhantom.cpp +++ b/src/server/gameserver/skill/ViolentPhantom.cpp @@ -10,8 +10,8 @@ #include "SimpleTileMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// ViolentPhantom::ViolentPhantom() throw() { __BEGIN_TRY @@ -31,7 +31,7 @@ ViolentPhantom::ViolentPhantom() throw() { ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void ViolentPhantom::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -51,7 +51,7 @@ void ViolentPhantom::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampi Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pVampire, getSkillType()); @@ -70,7 +70,7 @@ void ViolentPhantom::execute(Vampire* pVampire, ObjectID_t TargetObjectID, Vampi } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void ViolentPhantom::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -102,7 +102,7 @@ void ViolentPhantom::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Va param.addMask(m_pViolentPhantomMask[i].x, m_pViolentPhantomMask[i].y, 100); } - // Knowledge of Blood ִٸ hit bonus 10 + // Knowledge of Blood 가 있다면 hit bonus 10 // int HitBonus = 0; g_SimpleTileMeleeSkill.execute(pVampire, X, Y, pVampireSkillSlot, param, result, CEffectID); @@ -112,7 +112,7 @@ void ViolentPhantom::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Va } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void ViolentPhantom::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) diff --git a/src/server/gameserver/skill/Visible.cpp b/src/server/gameserver/skill/Visible.cpp index 041185f3..08e65a72 100644 --- a/src/server/gameserver/skill/Visible.cpp +++ b/src/server/gameserver/skill/Visible.cpp @@ -35,17 +35,17 @@ void Visible::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* Assert(pSkillSlot != NULL); try { - // Player ޾ƿ´. + // Player를 받아온다. Player* pPlayer = pSlayer->getPlayer(); - // Zone ޾ƿ´. + // Zone을 받아온다. Zone* pZone = pSlayer->getZone(); SkillType_t SkillType = pSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // ޾ƿ´. + // 기술의 레벨을 받아온다. // SkillLevel_t SkillLevel = pSkillSlot->getExpLevel(); // SkillDomainType_t DomainType = pSkillInfo->getDomainType(); @@ -58,7 +58,7 @@ void Visible::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* bool bRangeCheck = verifyDistance(pSlayer, X, Y, pSkillInfo->getRange()); bool bHit = false; - // . + // 기술성공률 검증. if (bManaCheck && bTimeCheck && bRangeCheck) { SkillInput input(pSlayer, pSkillSlot); SkillOutput output; @@ -94,8 +94,8 @@ void Visible::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* bool bEffected = pTargetCreature->isFlag(Effect::EFFECT_CLASS_INVISIBILITY); if (bHitRoll && bEffected) { - // GCAddXXX , effect manager effect ϰ, GCRemoveEffect - // . + // 주위에 GCAddXXX를 보내고, effect manager에서 effect를 삭제하고, GCRemoveEffect를 + // 보낸다. addVisibleCreature(pZone, pTargetCreature, true); _GCSkillToTileOK2.setObjectID(pSlayer->getObjectID()); @@ -192,10 +192,10 @@ void Visible::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk Assert(pSkillSlot != NULL); try { - // Player ޾ƿ´. + // Player를 받아온다. Player* pPlayer = pSlayer->getPlayer(); - // Zone ޾ƿ´. + // Zone을 받아온다. Zone* pZone = pSlayer->getZone(); Creature* pTargetCreature = NULL; @@ -215,7 +215,7 @@ void Visible::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // ޾ƿ´. + // 기술의 레벨을 받아온다. // SkillLevel_t SkillLevel = pSkillSlot->getExpLevel(); // SkillDomainType_t DomainType = pSkillInfo->getDomainType(); @@ -227,7 +227,7 @@ void Visible::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk bool bHit = false; - // . + // 기술성공률 검증. if (bManaCheck && bTimeCheck && bRangeCheck) { Coord_t myX = pSlayer->getX(), myY = pSlayer->getY(); Coord_t X = pTargetCreature->getX(), Y = pTargetCreature->getY(); @@ -271,8 +271,8 @@ void Visible::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSk bool bEffected = pTargetCreature->isFlag(Effect::EFFECT_CLASS_INVISIBILITY); if (bHitRoll && bEffected) { - // GCAddXXX , effect manager effect ϰ, GCRemoveEffect - // . + // 주위에 GCAddXXX를 보내고, effect manager에서 effect를 삭제하고, GCRemoveEffect를 + // 보낸다. addVisibleCreature(pZone, pTargetCreature, true); _GCSkillToTileOK2.setObjectID(pSlayer->getObjectID()); diff --git a/src/server/gameserver/skill/VoodooRing.cpp b/src/server/gameserver/skill/VoodooRing.cpp index 2af99b34..dda130ec 100644 --- a/src/server/gameserver/skill/VoodooRing.cpp +++ b/src/server/gameserver/skill/VoodooRing.cpp @@ -10,8 +10,8 @@ #include "SimpleTileMissileSkill.h" ////////////////////////////////////////////////////////////////////////////// -// -// ũ ʱȭѴ. +// 생성자 +// 마스크를 초기화한다. ////////////////////////////////////////////////////////////////////////////// VoodooRing::VoodooRing() throw() { __BEGIN_TRY @@ -21,7 +21,7 @@ VoodooRing::VoodooRing() throw() { ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void VoodooRing::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -41,7 +41,7 @@ void VoodooRing::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pVampire, getSkillType()); @@ -60,7 +60,7 @@ void VoodooRing::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSk } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 +// 뱀파이어 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void VoodooRing::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -101,7 +101,7 @@ void VoodooRing::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vampir } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void VoodooRing::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) diff --git a/src/server/gameserver/skill/WaterBarrier.cpp b/src/server/gameserver/skill/WaterBarrier.cpp index 066413db..e87c518d 100644 --- a/src/server/gameserver/skill/WaterBarrier.cpp +++ b/src/server/gameserver/skill/WaterBarrier.cpp @@ -12,7 +12,7 @@ #include "GCSkillToSelfOK2.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void WaterBarrier::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlot, CEffectID_t CEffectID) @@ -57,12 +57,12 @@ void WaterBarrier::execute(Ousters* pOusters, OustersSkillSlot* pOustersSkillSlo if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bSatisfyRequire) { decreaseMana(pOusters, RequiredMP, _GCSkillToSelfOK1); - // ð Ѵ. + // 지속 시간을 계산한다. SkillInput input(pOusters, pOustersSkillSlot); SkillOutput output; computeOutput(input, output); - // Ʈ Ŭ δ. + // 이팩트 클래스를 만들어 붙인다. EffectWaterBarrier* pEffect = new EffectWaterBarrier(pOusters); pEffect->setDeadline(output.Duration); pEffect->setBonus(output.Damage); diff --git a/src/server/gameserver/skill/Whitsuntide.cpp b/src/server/gameserver/skill/Whitsuntide.cpp index c0edc3df..222a7a78 100644 --- a/src/server/gameserver/skill/Whitsuntide.cpp +++ b/src/server/gameserver/skill/Whitsuntide.cpp @@ -18,7 +18,7 @@ #include "Properties.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void Whitsuntide::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -38,7 +38,7 @@ void Whitsuntide::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); @@ -57,8 +57,8 @@ void Whitsuntide::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 -// ̾ Vigor Drop Skill Tile ϴ Handler +// 뱀파이어 타일 핸들러 +// 뱀파이어가 Vigor Drop Skill을 Tile에 사용했을때 사용하는 Handler ////////////////////////////////////////////////////////////////////////////// void Whitsuntide::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -162,19 +162,19 @@ void Whitsuntide::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl pTargetSlayer->setFlag(Effect::EFFECT_CLASS_WHITSUNTIDE); pTargetSlayer->addEffect(pEffect); - // Ʈ ٿ, ɷġ Ѵ. + // 이펙트를 붙였으니, 능력치를 재계산한다. SLAYER_RECORD prev; pTargetSlayer->getSlayerRecord(prev); pTargetSlayer->initAllStat(); pTargetSlayer->sendRealWearingInfo(); pTargetSlayer->addModifyInfo(prev, _GCSkillToTileOK2); - // Ʈ ٽ ش. by sigi. 2002.11.14 + // 이펙트 정보를 다시 보내준다. by sigi. 2002.11.14 pTargetSlayer->getEffectManager()->sendEffectInfo( pTargetSlayer, pZone, pTargetSlayer->getX(), pTargetSlayer->getY()); - // Ȱ Ƹ̵带 ϱ ؼ Aftermath Ʈ δ. - // 2002.11.19 ȫâ + // 부활 아르바이드를 방지하기 위해서 Aftermath 이펙트를 붙인다. + // 2002.11.19 장홍창 if (pTargetSlayer->isFlag(Effect::EFFECT_CLASS_KILL_AFTERMATH)) { Effect* pEffect = pTargetSlayer->findEffect(Effect::EFFECT_CLASS_KILL_AFTERMATH); EffectKillAftermath* pEffectKillAftermath = dynamic_cast(pEffect); @@ -193,7 +193,7 @@ void Whitsuntide::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl pTargetSlayer->setHP(CurrentHP, ATTR_CURRENT); // pTargetSlayer->setMP(0, ATTR_CURRENT); - // ü äٴ ˸. + // 주위에 체력이 채워졌다는 사실을 알린다. GCStatusCurrentHP gcStatusCurrentHP; gcStatusCurrentHP.setObjectID(pTargetSlayer->getObjectID()); gcStatusCurrentHP.setCurrentHP(pTargetSlayer->getHP(ATTR_CURRENT)); @@ -220,47 +220,47 @@ void Whitsuntide::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToTileOK1); } - // 鿡 + // 기술을 사용한 사람들에게 _GCSkillToTileOK1.setSkillType(SkillType); _GCSkillToTileOK1.setCEffectID(CEffectID); _GCSkillToTileOK1.setX(X); _GCSkillToTileOK1.setY(Y); _GCSkillToTileOK1.setDuration(output.Duration); - // ִ 鿡 + // 기술을 쓴 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK3.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(X); _GCSkillToTileOK3.setY(Y); - // ִ 鿡 + // 기술을 당한 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); - // ִ 鿡 + // 기술을 쓴 사람과 당한 사람을 모두 볼 수 있는 사람들에게 _GCSkillToTileOK5.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); _GCSkillToTileOK5.setY(Y); _GCSkillToTileOK5.setDuration(output.Duration); - // packet + // 기술을 사용한 사람에게 packet 전달 pPlayer->sendPacket(&_GCSkillToTileOK1); - // ִ 鿡 broadcasing - // broadcasting 5OK Ѵ. - // ⿡ ϵ broadcasting ܵȴ. + // 기술을 쓸 사람과 당한 사람을 모두 볼 수 있는 사람들에게 broadcasing + // broadcasting후 5번OK를 받은 사람을 기록한다. + // 여기에 기록된 사람은 차후 broadcasting에서 제외된다. cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); - // ִ 鿡 broadcasting + // 기술을 쓴 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); - // ִ 鿡 broadcasting + // 기술을 당한 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); - // delay setting + // 기술 delay setting pSkillSlot->setRunTime(output.Delay); } else { diff --git a/src/server/gameserver/skill/WideIceField.cpp b/src/server/gameserver/skill/WideIceField.cpp index 298420b1..6a744fb4 100644 --- a/src/server/gameserver/skill/WideIceField.cpp +++ b/src/server/gameserver/skill/WideIceField.cpp @@ -17,7 +17,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void WideIceField::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -46,7 +46,7 @@ void WideIceField::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) ZoneCoord_t myY = pMonster->getY(); if (bHitRoll) { - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); @@ -62,7 +62,7 @@ void WideIceField::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) Tile& tile = pZone->getTile(tX, tY); if (tile.canAddEffect()) bTileCheck = true; - // ӽ ׶ ߰ Ѵ. + // 머시 그라운드 있음 추가 못한당. if (tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL) bTileCheck = false; } @@ -72,14 +72,14 @@ void WideIceField::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) Tile& tile = pZone->getTile(tX, tY); - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_ICE_FIELD); if (pOldEffect != NULL) { ObjectID_t effectID = pOldEffect->getObjectID(); pZone->deleteEffect(effectID); } - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectIceField* pEffect = new EffectIceField(pZone, tX, tY); pEffect->setCasterName(pMonster->getName()); pEffect->setCasterID(pMonster->getObjectID()); @@ -89,11 +89,11 @@ void WideIceField::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pEffect->setTick(output.Tick); pEffect->setForce(true); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); } diff --git a/src/server/gameserver/skill/WideIceHail.cpp b/src/server/gameserver/skill/WideIceHail.cpp index bf6ecfcd..c0e6e01e 100644 --- a/src/server/gameserver/skill/WideIceHail.cpp +++ b/src/server/gameserver/skill/WideIceHail.cpp @@ -17,7 +17,7 @@ #include "ZoneUtil.h" ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void WideIceHail::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -46,7 +46,7 @@ void WideIceHail::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) Tile& tile = pZone->getTile(X, Y); if (tile.canAddEffect()) bTileCheck = true; - // ӽ ׶ ߰ Ѵ. + // 머시 그라운드 있음 추가 못한당. // if ( tile.getEffect(Effect::EFFECT_CLASS_MERCY_GROUND) != NULL ) bTileCheck=false; } @@ -56,12 +56,12 @@ void WideIceHail::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) ZoneCoord_t myY = pMonster->getY(); if (bHitRoll && bTileCheck) { - // ð Ѵ. + // 데미지와 지속 시간을 계산한다. SkillInput input(pMonster); SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectIceHail* pEffect = new EffectIceHail(pZone, X, Y); pEffect->setDeadline(output.Duration); pEffect->setDamage(output.Damage); @@ -70,11 +70,11 @@ void WideIceHail::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) pEffect->setRange(4); pEffect->setCasterID(pMonster->getObjectID()); - // ŸϿ Ʈ OID ޾ƾ Ѵ. + // 타일에 붙은 이펙트는 OID를 받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); pZone->getTile(X, Y).addEffect(pEffect); diff --git a/src/server/gameserver/skill/WideLightning.cpp b/src/server/gameserver/skill/WideLightning.cpp index b3b247b6..1d6e834d 100644 --- a/src/server/gameserver/skill/WideLightning.cpp +++ b/src/server/gameserver/skill/WideLightning.cpp @@ -17,7 +17,7 @@ #include "GCSkillToTileOK6.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void WideLightning::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,7 +37,7 @@ void WideLightning::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pSlayer, getSkillType()); @@ -56,8 +56,8 @@ void WideLightning::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlo } ////////////////////////////////////////////////////////////////////////////// -// ̾ Ÿ ڵ鷯 -// ̾ Wide Lightning Skill Tile ϴ Handler +// 슬레이어 타일 핸들러 +// 슬레이어가 Wide Lightning Skill을 Tile에 사용했을때 사용하는 Handler ////////////////////////////////////////////////////////////////////////////// void WideLightning::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -91,8 +91,8 @@ void WideLightning::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill bool bTimeCheck = verifyRunTime(pSkillSlot); bool bRangeCheck = verifyDistance(pSlayer, X, Y, pSkillInfo->getRange()); - // ϴ ϴ ɷ ϰ Ҷ(EffectTileStorm::affect()) - // HitRoll Ѵ. + // 일단 기술은 성공하는 걸로 하고 데미지를 가할때(EffectTileStorm::affect()) + // 개별적으로 HitRoll을 계산한다. // 2003.1.8 by bezz // bool bHitRoll = HitRoll::isSuccessMagic(pSlayer, pSkillInfo, pSkillSlot); @@ -128,7 +128,7 @@ void WideLightning::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill pZone->addEffect(pEffect); tile.addEffect(pEffect); - // 鿡 + // 기술을 사용한 사람들에게 _GCSkillToTileOK1.setSkillType(SkillType); _GCSkillToTileOK1.setCEffectID(CEffectID); _GCSkillToTileOK1.setX(X); @@ -136,21 +136,21 @@ void WideLightning::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill _GCSkillToTileOK1.setDuration(output.Duration); _GCSkillToTileOK1.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK3.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK3.setSkillType(SkillType); _GCSkillToTileOK3.setX(X); _GCSkillToTileOK3.setY(Y); //_GCSkillToTileOK3.setRange(Range); - // ִ 鿡 + // 기술을 당한 사람만 볼 수 있는 사람들에게 _GCSkillToTileOK4.setSkillType(SkillType); _GCSkillToTileOK4.setX(X); _GCSkillToTileOK4.setY(Y); _GCSkillToTileOK4.setDuration(output.Duration); _GCSkillToTileOK4.setRange(Range); - // ִ 鿡 + // 기술을 쓴 사람과 당한 사람을 모두 볼 수 있는 사람들에게 _GCSkillToTileOK5.setObjectID(pSlayer->getObjectID()); _GCSkillToTileOK5.setSkillType(SkillType); _GCSkillToTileOK5.setX(X); @@ -158,23 +158,23 @@ void WideLightning::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, Skill _GCSkillToTileOK5.setDuration(output.Duration); _GCSkillToTileOK5.setRange(Range); - // packet + // 기술을 사용한 사람에게 packet 전달 pPlayer->sendPacket(&_GCSkillToTileOK1); - // ִ 鿡 broadcasing - // broadcasting 5OK Ѵ. - // ⿡ ϵ broadcasting ܵȴ. + // 기술을 쓸 사람과 당한 사람을 모두 볼 수 있는 사람들에게 broadcasing + // broadcasting후 5번OK를 받은 사람을 기록한다. + // 여기에 기록된 사람은 차후 broadcasting에서 제외된다. list cList; cList.push_back(pSlayer); cList = pZone->broadcastSkillPacket(myX, myY, X, Y, &_GCSkillToTileOK5, cList); - // ִ 鿡 broadcasting + // 기술을 쓴 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(myX, myY, &_GCSkillToTileOK3, cList); - // ִ 鿡 broadcasting + // 기술을 당한 사람을 볼 수 있는 사람들에게 broadcasting pZone->broadcastPacket(X, Y, &_GCSkillToTileOK4, cList); - // delay setting + // 기술 delay setting pSkillSlot->setRunTime(output.Delay); } else { diff --git a/src/server/gameserver/skill/WildSmash.cpp b/src/server/gameserver/skill/WildSmash.cpp index c37bf3f7..603ffaf4 100644 --- a/src/server/gameserver/skill/WildSmash.cpp +++ b/src/server/gameserver/skill/WildSmash.cpp @@ -9,7 +9,7 @@ #include "SimpleMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void WildSmash::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) diff --git a/src/server/gameserver/skill/WildTyphoon.cpp b/src/server/gameserver/skill/WildTyphoon.cpp index 79a4a3b2..c08fa90a 100644 --- a/src/server/gameserver/skill/WildTyphoon.cpp +++ b/src/server/gameserver/skill/WildTyphoon.cpp @@ -22,7 +22,7 @@ void WildTyphoon::execute(Slayer* pSlayer, ObjectID_t targetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(targetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -64,7 +64,7 @@ void WildTyphoon::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl SIMPLE_SKILL_OUTPUT result; - // ǥġ+4 + // 목표위치+4방향 param.addMask(0 + dir_advance[dir][0], 0 + dir_advance[dir][1], 100); param.addMask(-1 + dir_advance[dir][0], -1 + dir_advance[dir][1], 100); param.addMask(0 + dir_advance[dir][0], -1 + dir_advance[dir][1], 100); @@ -83,13 +83,13 @@ void WildTyphoon::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl for (; itr != endItr; ++itr) { Creature* pCreature = *itr; if (pCreature != NULL) { - // 츸 delay ߰Ѵ. - // player client óϰ Ǿִ. + // 몬스터인 경우만 delay를 추가한다. + // player들은 client에서 처리하게 되어있다. int stunRatio = pSlayer->getSTR() / 5; if (pCreature->isMonster() && (rand() % 100) < stunRatio) { Monster* pMonster = dynamic_cast(pCreature); - // delay ( + 2 ) + // delay설정 ( + 2초 ) if (!pMonster->isMaster() #ifdef __UNDERWORLD__ && !pMonster->isUnderworld() && pMonster->getMonsterType() != 599 diff --git a/src/server/gameserver/skill/WildWolf.cpp b/src/server/gameserver/skill/WildWolf.cpp index 850f7642..dfba1158 100644 --- a/src/server/gameserver/skill/WildWolf.cpp +++ b/src/server/gameserver/skill/WildWolf.cpp @@ -24,7 +24,7 @@ #include "Zone.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 뱀파이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void WildWolf::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -54,8 +54,8 @@ void WildWolf::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil return; } - // NPC . - // NoSuch. by sigi. 2002.5.2 + // NPC는 공격할 수가 없다. + // NoSuch제거. by sigi. 2002.5.2 if (!canAttack(pVampire, pTargetCreature) || pTargetCreature->isNPC()) { executeSkillFailException(pVampire, getSkillType()); return; @@ -91,7 +91,7 @@ void WildWolf::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil bool bCriticalHit = false; Damage += computeDamage(pVampire, pTargetCreature, 0, bCriticalHit); - // ´. + // 마나를 깍는다. decreaseMana(pVampire, RequiredMP, _GCSkillToObjectOK1); EffectSetAfire* pEffect = new EffectSetAfire(pTargetCreature); @@ -104,7 +104,7 @@ void WildWolf::execute(Vampire* pVampire, ObjectID_t TargetObjectID, VampireSkil increaseAlignment(pVampire, pTargetCreature, _GCSkillToObjectOK1); - // Ŷ . + // 패킷을 보낸다. _GCSkillToObjectOK1.setSkillType(getSkillType()); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); @@ -203,22 +203,22 @@ void WildWolf::eatCorpse(Vampire* pVampire, Item* pCorpse, VampireSkillSlot* pVa Effect* pEffect = pVampire->findEffect(Effect::EFFECT_CLASS_HP_RECOVERY); EffectHPRecovery* pEffectHPRecoveryEffect = dynamic_cast(pEffect); - // ؾ Ѵٴ ش. + // 몇번 더 해야 한다는 것을 갱신해 준다. Turn_t OldCount = pEffectHPRecoveryEffect->getPeriod(); Turn_t NewPeriod = OldCount + Period; pEffectHPRecoveryEffect->setPeriod(NewPeriod); pEffectHPRecoveryEffect->setDeadline(NewPeriod * RegenPeriod); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; - gcHPRecoveryStartToSelf.setPeriod(NewPeriod); // ȸϳ? - gcHPRecoveryStartToSelf.setDelay(RegenPeriod); // ϳ? - gcHPRecoveryStartToSelf.setQuantity(RegenHPUnit); // ѹ 󸶳 ȸϳ? + gcHPRecoveryStartToSelf.setPeriod(NewPeriod); // 몇번 회복하나? + gcHPRecoveryStartToSelf.setDelay(RegenPeriod); // 몇 초 단위로 하나? + gcHPRecoveryStartToSelf.setQuantity(RegenHPUnit); // 한번에 얼마나 회복하나? pVampire->getPlayer()->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ٸ̵鿡 . - // ȸ Ŷ, ۰ Ŷ . + // 회복 시작하라는 패킷을 다른이들에게 보낸다. + // 회복 갱신 패킷, 시작과 똑 같은 패킷을 보낸다. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pVampire->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(NewPeriod); @@ -238,7 +238,7 @@ void WildWolf::eatCorpse(Vampire* pVampire, Item* pCorpse, VampireSkillSlot* pVa pVampire->addEffect(pEffectHPRecovery); - // ȸ ϶ Ŷ ڽſ . + // 회복 시작하라는 패킷을 자신에게 보낸다. GCHPRecoveryStartToSelf gcHPRecoveryStartToSelf; gcHPRecoveryStartToSelf.setPeriod(Period); gcHPRecoveryStartToSelf.setDelay(RegenPeriod); @@ -246,7 +246,7 @@ void WildWolf::eatCorpse(Vampire* pVampire, Item* pCorpse, VampireSkillSlot* pVa pVampire->getPlayer()->sendPacket(&gcHPRecoveryStartToSelf); - // ȸ ϶ Ŷ ̵鿡 . + // 회복 시작하라는 패킷을 보는이들에게 보낸다. GCHPRecoveryStartToOthers gcHPRecoveryStartToOthers; gcHPRecoveryStartToOthers.setObjectID(pVampire->getObjectID()); gcHPRecoveryStartToOthers.setPeriod(Period); @@ -256,7 +256,7 @@ void WildWolf::eatCorpse(Vampire* pVampire, Item* pCorpse, VampireSkillSlot* pVa pZone->broadcastPacket(pVampire->getX(), pVampire->getY(), &gcHPRecoveryStartToOthers, pVampire); } - // Ŷ . + // 패킷을 보낸다. _GCSkillToObjectOK1.setSkillType(getSkillType()); _GCSkillToObjectOK1.setCEffectID(0); _GCSkillToObjectOK1.setTargetObjectID(pTargetCorpse->getObjectID()); @@ -278,13 +278,13 @@ void WildWolf::eatCorpse(Vampire* pVampire, Item* pCorpse, VampireSkillSlot* pVa pVampireSkillSlot->setRunTime(output.Delay); - // Ŷ . + // 사라지는 패킷을 날린다. GCDeleteObject gcDO; gcDO.setObjectID(pTargetCorpse->getObjectID()); pZone->broadcastPacket(pTargetCorpse->getX(), pTargetCorpse->getY(), &gcDO); - // . + // 존에서 지운다. pZone->deleteItem(pTargetCorpse, pTargetCorpse->getX(), pTargetCorpse->getY()); - // ȿ ͸ Ƿ ͸ Ѵ. + // 존안에서 실제적으로 포인터를 없애지는 않으므로 포인터를 삭제 시켜 줘야 한다. SAFE_DELETE(pTargetCorpse); } diff --git a/src/server/gameserver/skill/WillOfLife.cpp b/src/server/gameserver/skill/WillOfLife.cpp index 2a1529e0..11f34892 100644 --- a/src/server/gameserver/skill/WillOfLife.cpp +++ b/src/server/gameserver/skill/WillOfLife.cpp @@ -19,7 +19,7 @@ #include "RankBonus.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void WillOfLife::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, CEffectID_t CEffectID) @@ -44,7 +44,7 @@ void WillOfLife::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, SkillType_t SkillType = pVampireSkillSlot->getSkillType(); // SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // ų ʽ ޶. + // 스킬 레벨에 따라 데미지 보너스가 달라진다. SkillInput input(pVampire); SkillOutput output; computeOutput(input, output); @@ -59,7 +59,7 @@ void WillOfLife::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected) { decreaseMana(pVampire, RequiredMP, _GCSkillToSelfOK1); - // Ʈ Ŭ δ. + // 이펙트 클래스를 만들어 붙인다. EffectWillOfLife* pEffect = new EffectWillOfLife(pVampire); pEffect->setDeadline(output.Duration); pEffect->setBonus(output.Damage); @@ -67,7 +67,7 @@ void WillOfLife::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, pVampire->addEffect(pEffect); pVampire->setFlag(Effect::EFFECT_CLASS_WILL_OF_LIFE); - // Ŷ . + // 패킷을 만들어 보낸다. _GCSkillToSelfOK1.setSkillType(SkillType); _GCSkillToSelfOK1.setCEffectID(CEffectID); _GCSkillToSelfOK1.setDuration(output.Duration); @@ -86,7 +86,7 @@ void WillOfLife::execute(Vampire* pVampire, VampireSkillSlot* pVampireSkillSlot, pZone->broadcastPacket(pVampire->getX(), pVampire->getY(), &_GCSkillToSelfOK2, pVampire); pZone->broadcastPacket(pVampire->getX(), pVampire->getY(), &gcStatusCurrentHP); - // Ʈ پٰ ˷ش. + // 이펙트가 붙었다고 알려준다. GCAddEffect gcAddEffect; gcAddEffect.setObjectID(pVampire->getObjectID()); gcAddEffect.setEffectID(Effect::EFFECT_CLASS_WILL_OF_LIFE); diff --git a/src/server/gameserver/skill/WindDivider.cpp b/src/server/gameserver/skill/WindDivider.cpp index 0f4567a2..4a8c3655 100644 --- a/src/server/gameserver/skill/WindDivider.cpp +++ b/src/server/gameserver/skill/WindDivider.cpp @@ -9,7 +9,7 @@ #include "SimpleLinearMeleeSkill.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void WindDivider::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -25,7 +25,7 @@ void WindDivider::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Zone* pZone = pSlayer->getZone(); Creature* pTargetCreature = pZone->getCreature(TargetObjectID); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL) { executeSkillFailException(pSlayer, getSkillType()); return; @@ -42,7 +42,7 @@ void WindDivider::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* } ////////////////////////////////////////////////////////////////////////////// -// ̾ ڵ鷯 +// 슬레이어 셀프 핸들러 ////////////////////////////////////////////////////////////////////////////// void WindDivider::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -63,8 +63,8 @@ void WindDivider::execute(Slayer* pSlayer, ZoneCoord_t X, ZoneCoord_t Y, SkillSl param.STRMultiplier = 8; param.DEXMultiplier = 1; param.INTMultiplier = 1; - // ߿ ִ ͸ üũϱ Ͽ Ƿ . - // 1 , 2 + // 공중에 있는 몬스터를 체크하기 위하여 임의로 날린다. + // 1 번은 공중 공격 가능, 2 번은 땅속 공격 가능 param.Level = 1; param.bMagicHitRoll = false; param.bMagicDamage = false; diff --git a/src/server/gameserver/skill/XRLMissile.cpp b/src/server/gameserver/skill/XRLMissile.cpp index 5b7b7cbd..15951c7b 100644 --- a/src/server/gameserver/skill/XRLMissile.cpp +++ b/src/server/gameserver/skill/XRLMissile.cpp @@ -16,7 +16,7 @@ #include "ItemUtil.h" ////////////////////////////////////////////////////////////////////////////// -// ̾ Ʈ ڵ鷯 +// 슬레이어 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void XRLMissile::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pSkillSlot, CEffectID_t CEffectID) @@ -37,14 +37,14 @@ void XRLMissile::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* Creature* pTargetCreature = pZone->getCreature(TargetObjectID); // Assert(pTargetCreature != NULL); - // NoSuch. by sigi. 2002.5.2 + // NoSuch제거. by sigi. 2002.5.2 if (pTargetCreature == NULL || !canAttack(pSlayer, pTargetCreature)) { executeSkillFailException(pSlayer, getSkillType()); // cout << "TID[" << Thread::self() << "]" << getSkillHandlerName() << " end " << endl; return; } - // Ʈ ȿ ӽð Ѵ. + // 이펙트의 효과와 지속시간을 계산한다. SkillInput input(pSlayer, pSkillSlot); SkillOutput output; input.Range = getDistance(pSlayer->getX(), pSlayer->getY(), pTargetCreature->getX(), pTargetCreature->getY()); @@ -64,7 +64,7 @@ void XRLMissile::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); SkillDomainType_t DomainType = pSkillInfo->getDomainType(); - // Ƽ Ѵ. + // 페널티 값을 계산한다. int ToHitPenalty = getPercentValue(pSlayer->getToHit(), output.ToHit); bool bIncreaseDomainExp = pSlayer->isRealWearingEx(Slayer::WEAR_RIGHTHAND); @@ -84,18 +84,18 @@ void XRLMissile::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* if (bManaCheck && bTimeCheck && bRangeCheck && bHitRoll && !bEffected && bPK && bBulletCheck) { printf("check OK\n"); - // δ. + // 마나를 줄인다. decreaseMana(pSlayer, RequiredMP, _GCSkillToObjectOK1); Bullet_t RemainBullet = 0; decreaseBullet(pWeapon); - // ѹ߾ ʿ . by sigi. 2002.5.9 + // 한발쓸때마다 저장할 필요 없다. by sigi. 2002.5.9 // pWeapon->save(pSlayer->getName(), STORAGE_GEAR, 0, Slayer::WEAR_RIGHTHAND, 0); RemainBullet = getRemainBullet(pWeapon); if (!pTargetCreature->isSlayer()) { - // ġ ÷ش. + // 경험치를 올려준다. // SkillGrade Grade = // g_pSkillInfoManager->getGradeByDomainLevel(pSlayer->getSkillDomainLevel(DomainType)); Exp_t ExpUp = // 10* (Grade + 1); shareAttrExp(pSlayer, ExpUp, 1, 1, 8, _GCSkillToObjectOK1); @@ -108,7 +108,7 @@ void XRLMissile::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* increaseSkillExp(pSlayer, DomainType, pSkillSlot, pSkillInfo, _GCSkillToObjectOK1); } - // Ʈ ؼ δ. + // 이펙트를 생성해서 붙인다. EffectXRLMissile* pEffect = new EffectXRLMissile(pTargetCreature); Assert(pEffect != NULL); pEffect->setNextTime(output.Duration); @@ -118,7 +118,7 @@ void XRLMissile::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pTargetCreature->addEffect(pEffect); pTargetCreature->setFlag(Effect::EFFECT_CLASS_XRL_Missile); - // Ŷ غؼ . + // 패킷을 준비해서 보낸다. _GCSkillToObjectOK1.setSkillType(SkillType); _GCSkillToObjectOK1.setCEffectID(CEffectID); _GCSkillToObjectOK1.setTargetObjectID(TargetObjectID); @@ -152,7 +152,7 @@ void XRLMissile::execute(Slayer* pSlayer, ObjectID_t TargetObjectID, SkillSlot* pZone->broadcastPacket(pSlayer->getX(), pSlayer->getY(), &_GCSkillToObjectOK5, cList); - // // Ʈ پٰ ˷ش. + // // 이펙트가 붙었다고 알려준다. // GCAddEffect gcAddEffect; // gcAddEffect.setObjectID(pTargetCreature->getObjectID()); // gcAddEffect.setEffectID(Effect::EFFECT_CLASS_); diff --git a/src/server/gameserver/skill/YellowPoison.cpp b/src/server/gameserver/skill/YellowPoison.cpp index 74a9f7a7..73a02621 100644 --- a/src/server/gameserver/skill/YellowPoison.cpp +++ b/src/server/gameserver/skill/YellowPoison.cpp @@ -86,7 +86,7 @@ void YellowPoison::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp SkillType_t SkillType = pVampireSkillSlot->getSkillType(); SkillInfo* pSkillInfo = g_pSkillInfoManager->getSkillInfo(SkillType); - // Knowledge of Poison ִٸ hit bonus 10 + // Knowledge of Poison 이 있다면 hit bonus 10 int HitBonus = 0; if (pVampire->hasRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_POISON)) { RankBonus* pRankBonus = pVampire->getRankBonus(RankBonus::RANK_BONUS_KNOWLEDGE_OF_POISON); @@ -107,7 +107,7 @@ void YellowPoison::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp Tile& tile = pZone->getTile(X, Y); if (tile.canAddEffect()) bTileCheck = true; - // add by Coffee 2007-5-8 ӶSummonClayħ鼼ܵļ + // add by Coffee 2007-5-8 藤속뚤SummonClay침쥣세콘돨쇱꿎 if (tile.getEffect(Effect::EFFECT_CLASS_SUMMON_CLAY)) bTileCheck = false; // end by Coffee @@ -120,7 +120,7 @@ void YellowPoison::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp Tile& tile = pZone->getTile(X, Y); Range_t Range = 1; - // Ʈ . + // 같은 이펙트가 있으면 지운다. Effect* pOldEffect = NULL; if ((pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_YELLOW_POISON))) { ObjectID_t effectID = pOldEffect->getObjectID(); @@ -131,22 +131,22 @@ void YellowPoison::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectYellowPoison* pEffect = new EffectYellowPoison(pZone, X, Y); pEffect->setVampire(); pEffect->setDeadline(output.Duration); pEffect->setDuration(output.Duration); pEffect->setLevel(pSkillInfo->getLevel()); - // ŸϿ ̴ Effect OID Ϲ޾ƾ Ѵ. + // 타일에 붙이는 Effect는 OID를 등록받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); - // tile creature ִٸ ٷ ֵ Ѵ. + // tile위에 creature가 있다면 바로 영향을 주도록 한다. bool bEffected = false; Creature* pTargetCreature = NULL; @@ -160,12 +160,12 @@ void YellowPoison::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp if (pEffect->affectCreature(pTargetCreature, false) == true) { bEffected = true; - // κп ̾ΰ ˻ϱ , - // κ if ׻ иϴ. - // ߿ YellowPoison ̾ ͿԵ - // ɸ ȴٸ, κ isSlayer ˻ ׸ - // ̹Ƿ, ̸ κп Monster ʰ - // isPC() ˻ϴ κ ־ д. + // 윗부분에서 슬레이어인가를 검사하기 때문에, + // 이 부분의 if가 항상 참이 될 것은 분명하다. + // 하지만 나중에 YellowPoison이 뱀파이어나 몬스터에게도 + // 걸리게 변경된다면, 윗부분의 isSlayer 검사 항목이 빠지게 + // 될 것이므로, 미리 이 부분에서 Monster일 경우 에러가 나지 않게 + // isPC() 검사하는 부분을 집어넣어 둔다. if (pTargetCreature->isPC()) { Player* pTargetPlayer = pTargetCreature->getPlayer(); bool bCanSee = canSee(pTargetCreature, pVampire); @@ -248,7 +248,7 @@ void YellowPoison::execute(Vampire* pVampire, ZoneCoord_t X, ZoneCoord_t Y, Vamp } ////////////////////////////////////////////////////////////////////////////// -// Ʈ ڵ鷯 +// 몬스터 오브젝트 핸들러 ////////////////////////////////////////////////////////////////////////////// void YellowPoison::execute(Monster* pMonster, Creature* pEnemy) @@ -264,7 +264,7 @@ void YellowPoison::execute(Monster* pMonster, Creature* pEnemy) } ////////////////////////////////////////////////////////////////////////////// -// Ÿ ڵ鷯 +// 몬스터 타일 핸들러 ////////////////////////////////////////////////////////////////////////////// void YellowPoison::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) @@ -312,7 +312,7 @@ void YellowPoison::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) Tile& tile = pZone->getTile(X, Y); Range_t Range = 1; - // Ʈ ̹ Ѵٸ Ѵ. + // 같은 이펙트가 이미 존재한다면 삭제한다. Effect* pOldEffect = NULL; if ((pOldEffect = tile.getEffect(Effect::EFFECT_CLASS_YELLOW_POISON))) { ObjectID_t effectID = pOldEffect->getObjectID(); @@ -323,21 +323,21 @@ void YellowPoison::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) SkillOutput output; computeOutput(input, output); - // Ʈ Ʈ Ѵ. + // 이펙트 오브젝트를 생성한다. EffectYellowPoison* pEffect = new EffectYellowPoison(pZone, X, Y); pEffect->setDeadline(output.Duration); pEffect->setDuration(output.Duration); pEffect->setLevel(pSkillInfo->getLevel() / 2); - // ŸϿ ̴ Effect ObjectID Ϲ޾ƾ Ѵ. + // 타일에 붙이는 Effect는 ObjectID를 등록받아야 한다. ObjectRegistry& objectregister = pZone->getObjectRegistry(); objectregister.registerObject(pEffect); - // ŸϿٰ Ʈ ߰Ѵ. + // 존 및 타일에다가 이펙트를 추가한다. pZone->addEffect(pEffect); tile.addEffect(pEffect); - // tile creature ִٸ ٷ ֵ Ѵ. + // tile위에 creature가 있다면 바로 영향을 주도록 한다. bool bEffected = false; Creature* pTargetCreature = NULL; @@ -351,12 +351,12 @@ void YellowPoison::execute(Monster* pMonster, ZoneCoord_t X, ZoneCoord_t Y) if (pEffect->affectCreature(pTargetCreature, false) == true) { bEffected = true; - // κп ̾ΰ ˻ϱ , - // κ if ׻ иϴ. - // ߿ YellowPoison ̾ ͿԵ - // ɸ ȴٸ, κ isSlayer ˻ ׸ - // ̹Ƿ, ̸ κп Monster ʰ - // isPC() ˻ϴ κ ־ д. + // 윗부분에서 슬레이어인가를 검사하기 때문에, + // 이 부분의 if가 항상 참이 될 것은 분명하다. + // 하지만 나중에 YellowPoison이 뱀파이어나 몬스터에게도 + // 걸리게 변경된다면, 윗부분의 isSlayer 검사 항목이 빠지게 + // 될 것이므로, 미리 이 부분에서 Monster일 경우 에러가 나지 않게 + // isPC() 검사하는 부분을 집어넣어 둔다. if (pTargetCreature->isPC()) { Player* pTargetPlayer = pTargetCreature->getPlayer(); bool bCanSee = canSee(pTargetCreature, pMonster); diff --git a/src/server/gameserver/test/GameServerExpTest.cpp b/src/server/gameserver/test/GameServerExpTest.cpp index e69e5a53..53358554 100644 --- a/src/server/gameserver/test/GameServerExpTest.cpp +++ b/src/server/gameserver/test/GameServerExpTest.cpp @@ -17,7 +17,7 @@ void GameServerExpTest::testRankExp() { RankExp_t rankExp1 = computeRankExp(myLevel, otherLevel); RankExp_t rankExp1_2 = rankExp1 * 2; - // CPPUNIT_ASSERT( rankExpGain== ); -_-; + // CPPUNIT_ASSERT( rankExpGain==얼마 ); -_-; if (myLevel == 0 || otherLevel == 0) { CPPUNIT_ASSERT(rankExp1 == 0); diff --git a/src/server/gameserver/test/GameServerItemTest.cpp b/src/server/gameserver/test/GameServerItemTest.cpp index af755dd4..1b2c2dc8 100644 --- a/src/server/gameserver/test/GameServerItemTest.cpp +++ b/src/server/gameserver/test/GameServerItemTest.cpp @@ -30,7 +30,7 @@ void GameServerItemTest::testLuckPercent() { CPPUNIT_ASSERT( variableLuckRatio==200 ); CPPUNIT_ASSERT( luckInfo.getMaxRatio()==50000 ); - // 0% : min 10%̱ .. 10% --> 10000 + // 0% : min이 10%이기 때문에.. 10% --> 10000 g_pVariableManager->setVariable(ITEM_LUCK_PERCENT, 0); variableLuckRatio = g_pVariableManager->getVariable(ITEM_LUCK_PERCENT); @@ -49,8 +49,8 @@ void GameServerItemTest::testLuckPercent() { } -// 䱸ɷġ ִ밪(ex> ̾ 100) Ѿ Ŷ -// 䱸ɷġ ִ밪 ع Ϳ ׽Ʈ -_-; 2003.1.6 +// 아이템 착용 요구능력치가 최대값(ex> 뱀파이어 레벨100)을 넘어가는 거때메 +// 요구능력치의 최대값을 제한해버린 것에 대한 테스트 -_-; 2003.1.6 void GameServerItemTest::testRequireMaxVampire() { __BEGIN_TEST_CASE @@ -133,8 +133,8 @@ void GameServerItemTest::testGiveNewbieItem() { Item* pItem; - // ɷġ ϳ Ա NULLüũϴ κп - // Fail ϳ ߰ ȴ -_-; + // 능력치에 따라서 하나를 입기 때문에 NULL체크하는 부분에서 + // Fail이 하나는 뜨게 된다 -_-; pItem = pInventory->getItem(2, 3); CPPUNIT_ASSERT(pItem != NULL); @@ -209,7 +209,7 @@ void GameServerItemTest::testUpgradeItemType() { Item::ItemClass IClass; - // Sword: 0~11. 10 unique + // Sword: 0~11. 10이 unique IClass = Item::ITEM_CLASS_SWORD; CPPUNIT_ASSERT(getUpgradeItemType(IClass, 0, 1) == 1); CPPUNIT_ASSERT(getUpgradeItemType(IClass, 1, 1) == 2); @@ -224,7 +224,7 @@ void GameServerItemTest::testUpgradeItemType() { CPPUNIT_ASSERT(getUpgradeItemType(IClass, 10, 1) == 10); CPPUNIT_ASSERT(getUpgradeItemType(IClass, 11, 1) == 11); - // 2 + // 2단 업글 CPPUNIT_ASSERT(getUpgradeItemType(IClass, 0, 2) == 2); CPPUNIT_ASSERT(getUpgradeItemType(IClass, 1, 2) == 3); CPPUNIT_ASSERT(getUpgradeItemType(IClass, 2, 2) == 4); @@ -238,7 +238,7 @@ void GameServerItemTest::testUpgradeItemType() { CPPUNIT_ASSERT(getUpgradeItemType(IClass, 10, 2) == 10); CPPUNIT_ASSERT(getUpgradeItemType(IClass, 11, 2) == 11); - // 3 + // 3단 업글 CPPUNIT_ASSERT(getUpgradeItemType(IClass, 0, 3) == 3); CPPUNIT_ASSERT(getUpgradeItemType(IClass, 1, 3) == 4); CPPUNIT_ASSERT(getUpgradeItemType(IClass, 2, 3) == 5); diff --git a/src/server/gameserver/test/GameServerSkillTest.cpp b/src/server/gameserver/test/GameServerSkillTest.cpp index 5cc1981d..b3bdcc51 100644 --- a/src/server/gameserver/test/GameServerSkillTest.cpp +++ b/src/server/gameserver/test/GameServerSkillTest.cpp @@ -35,9 +35,9 @@ void GameServerSkillTest::testSharpShieldFormula() { pSkillHandler->computeOutput(input, output); - CPPUNIT_ASSERT(output.Duration == 350); // 35 + CPPUNIT_ASSERT(output.Duration == 350); // 35초 CPPUNIT_ASSERT(output.Damage == 4); - CPPUNIT_ASSERT(output.Delay == 30); // 3 + CPPUNIT_ASSERT(output.Delay == 30); // 3초 //--------------------------------------------------------------------------- // SkillLevel( 1 ), STR( 100 ) @@ -49,9 +49,9 @@ void GameServerSkillTest::testSharpShieldFormula() { pSkillHandler->computeOutput(input, output); - CPPUNIT_ASSERT(output.Duration == 100); // 10 + CPPUNIT_ASSERT(output.Duration == 100); // 10초 CPPUNIT_ASSERT(output.Damage == 5); - CPPUNIT_ASSERT(output.Delay == 50); // 5 + CPPUNIT_ASSERT(output.Delay == 50); // 5초 __END_TEST_CASE @@ -64,7 +64,7 @@ void GameServerSkillTest::testSharpShieldExecute() { /* ObjectID_t TargetObjectID = 111; SkillSlot* pSkillSlot = pSlayer->hasSkill(SkillType); - EffectID_t EffectID = 0; // ǹ . + EffectID_t EffectID = 0; // 의미 없다. pSkillHandler->execute(pSlayer, TargetObjectID, pSkillSlot, EffectID); Damage_t damage = 10; diff --git a/src/server/gameserver/test/GameServerSpeedCheckTest.cpp b/src/server/gameserver/test/GameServerSpeedCheckTest.cpp index 1d3895da..c07c8812 100644 --- a/src/server/gameserver/test/GameServerSpeedCheckTest.cpp +++ b/src/server/gameserver/test/GameServerSpeedCheckTest.cpp @@ -6,7 +6,7 @@ void GameServerSpeedCheckTest::testSpeedHack() { __BEGIN_TEST_CASE - Socket* pSocket = new Socket(); // gameplayerȿ deleteȴ. + Socket* pSocket = new Socket(); // gameplayer안에서 delete된다. GamePlayer gameplayer(pSocket); bool bCheck = false; diff --git a/src/server/gameserver/test/MockSkillInput.h b/src/server/gameserver/test/MockSkillInput.h index 37693987..9da010d3 100644 --- a/src/server/gameserver/test/MockSkillInput.h +++ b/src/server/gameserver/test/MockSkillInput.h @@ -11,7 +11,7 @@ class MockSkillInput : public SkillInput { Range = 0; PartySize = 1; - // ׽ƮҶ Ǿ ϴ + // 테스트할때 설정되어야 하는 값 /* SkillLevel diff --git a/src/server/gameserver/testAlone/Schedule.cpp b/src/server/gameserver/testAlone/Schedule.cpp index b1b64513..ea8ee649 100644 --- a/src/server/gameserver/testAlone/Schedule.cpp +++ b/src/server/gameserver/testAlone/Schedule.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// ٸ ۾ Schedule Ŭ +// 스케줄링된 작업을 위한 Schedule 클래스 구현 /////////////////////////////////////////////////////////////////// #include "Schedule.h" diff --git a/src/server/gameserver/testAlone/Schedule.h b/src/server/gameserver/testAlone/Schedule.h index 63760f88..020eb4da 100644 --- a/src/server/gameserver/testAlone/Schedule.h +++ b/src/server/gameserver/testAlone/Schedule.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// ٸ ۾ Schedule Ŭ +// 스케줄링된 작업을 위한 Schedule 클래스 /////////////////////////////////////////////////////////////////// #ifndef __SCHEDULE_H__ diff --git a/src/server/gameserver/testAlone/ScheduleTest.cpp b/src/server/gameserver/testAlone/ScheduleTest.cpp index d974f7ec..32626d3f 100644 --- a/src/server/gameserver/testAlone/ScheduleTest.cpp +++ b/src/server/gameserver/testAlone/ScheduleTest.cpp @@ -36,8 +36,8 @@ void ScheduleTest::tearDown() {} void ScheduleTest::testSchedule() { __BEGIN_TEST_CASE - VSDateTime::setCurrentDateTime(0); // ó - VSDateTime dt(100); // 100 ڿ ϵ صд. + VSDateTime::setCurrentDateTime(0); // 처음에 + VSDateTime dt(100); // 100초 뒤에 실행하도록 예약해둔다. TestWork* pWork = new TestWork(); Schedule* pSchedule = new Schedule(pWork, dt); @@ -48,14 +48,14 @@ void ScheduleTest::testSchedule() { CPPUNIT_ASSERT(!pSchedule->heartbeat()); CPPUNIT_ASSERT(!pWork->test); - VSDateTime::setCurrentDateTime(50); // 50 (50? 50ð?) ڿ + VSDateTime::setCurrentDateTime(50); // 50 (50분? 50시간?) 뒤에 - CPPUNIT_ASSERT(!pSchedule->heartbeat()); // Ǿ ȴ. + CPPUNIT_ASSERT(!pSchedule->heartbeat()); // 아직 실행되어선 안 된다. CPPUNIT_ASSERT(!pWork->test); - VSDateTime::setCurrentDateTime(101); // 100 (100? 100ð?) ڿ + VSDateTime::setCurrentDateTime(101); // 100초 (100분? 100시간?) 뒤에 - CPPUNIT_ASSERT(pSchedule->heartbeat()); // Ǿ Ѵ. + CPPUNIT_ASSERT(pSchedule->heartbeat()); // 실행되어야 한다. CPPUNIT_ASSERT(pWork->test); SAFE_DELETE(pSchedule); @@ -70,7 +70,7 @@ void ScheduleTest::testScheduler() { Scheduler* pScheduler = new Scheduler(); TestWork* pWork1 = new TestWork(); - Schedule* pSchedule1 = new Schedule(pWork1, VSDateTime(100)); // 100 ڿ ϵ صд. + Schedule* pSchedule1 = new Schedule(pWork1, VSDateTime(100)); // 100초 뒤에 실행하도록 예약해둔다. pScheduler->addSchedule(pSchedule1); @@ -81,44 +81,44 @@ void ScheduleTest::testScheduler() { pScheduler->addSchedule(pSchedule2); - CPPUNIT_ASSERT(pScheduler->getSize() == 2); // ΰ  Ѵ. + CPPUNIT_ASSERT(pScheduler->getSize() == 2); // 두개 다 잘 들어가야 한다. pScheduler->heartbeat(); CPPUNIT_ASSERT(!pWork1->test); CPPUNIT_ASSERT(!pWork2->test); - VSDateTime::setCurrentDateTime(50); // 50 ڿ + VSDateTime::setCurrentDateTime(50); // 50초 뒤에 pScheduler->heartbeat(); CPPUNIT_ASSERT(pScheduler->getSize() == 2); - CPPUNIT_ASSERT(!pWork1->test); // ƹ͵ ʾҾ Ѵ. + CPPUNIT_ASSERT(!pWork1->test); // 아무것도 실행되지 않았어야 한다. CPPUNIT_ASSERT(!pWork2->test); - VSDateTime::setCurrentDateTime(101); // 100 ڿ + VSDateTime::setCurrentDateTime(101); // 100초 뒤에 pWork = dynamic_cast(pScheduler->heartbeat()); CPPUNIT_ASSERT(pWork1 == pWork); - CPPUNIT_ASSERT(pScheduler->getSize() == 1); // Ѱ Ѵ. + CPPUNIT_ASSERT(pScheduler->getSize() == 1); // 한개는 지워졌어야 한다. - CPPUNIT_ASSERT(pWork1->test); // 1 ٸ Ǿ Ѵ. + CPPUNIT_ASSERT(pWork1->test); // 1번 스케줄만 실행되었어야 한다. CPPUNIT_ASSERT(!pWork2->test); - VSDateTime::setCurrentDateTime(151); // 150 ڿ + VSDateTime::setCurrentDateTime(151); // 150초 뒤에 pScheduler->heartbeat(); - CPPUNIT_ASSERT(pScheduler->getSize() == 1); // Ѱ Ѵ. + CPPUNIT_ASSERT(pScheduler->getSize() == 1); // 한개는 지워졌어야 한다. CPPUNIT_ASSERT(pWork1->test); CPPUNIT_ASSERT(!pWork2->test); - VSDateTime::setCurrentDateTime(201); // 200 ڿ + VSDateTime::setCurrentDateTime(201); // 200초 뒤에 pWork = dynamic_cast(pScheduler->heartbeat()); CPPUNIT_ASSERT(pWork2 == pWork); - CPPUNIT_ASSERT(pScheduler->getSize() == 0); // ΰ Ѵ. + CPPUNIT_ASSERT(pScheduler->getSize() == 0); // 두개 다 지워졌어야 한다. CPPUNIT_ASSERT(pWork1->test); CPPUNIT_ASSERT(pWork2->test); diff --git a/src/server/gameserver/testAlone/Scheduler.cpp b/src/server/gameserver/testAlone/Scheduler.cpp index 28dd8f78..3c63c141 100644 --- a/src/server/gameserver/testAlone/Scheduler.cpp +++ b/src/server/gameserver/testAlone/Scheduler.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// ٸ ۾ Scheduler Ŭ +// 스케줄링된 작업을 위한 Scheduler 클래스 구현 /////////////////////////////////////////////////////////////////// #include "Scheduler.h" @@ -29,7 +29,7 @@ void Scheduler::clear() throw(Error) { // addSchedule( Schedule* ) // //-------------------------------------------------------------------------------- -// Schedule RecentSchedules Schedules ÿ ϵǾ ִ. +// Schedule은 RecentSchedules와 Schedules에 동시에 등록되어 있다. //-------------------------------------------------------------------------------- void Scheduler::addSchedule(Schedule* pSchedule) throw(Error) { __BEGIN_TRY @@ -45,8 +45,8 @@ void Scheduler::addSchedule(Schedule* pSchedule) throw(Error) { // popRecentWork( Schedule* pSchedule ) // //-------------------------------------------------------------------------------- -// m_RecentSchedules, m_Schedules -// pRecentSchedule Work returnϰ pRecentSchedule +// m_RecentSchedules, m_Schedules에서 제거 +// pRecentSchedule의 Work는 return하고 pRecentSchedule은 지운다 //-------------------------------------------------------------------------------- Work* Scheduler::popRecentWork() throw(Error) { __BEGIN_TRY @@ -68,8 +68,8 @@ Work* Scheduler::popRecentWork() throw(Error) { // Work* heartbeat() // //-------------------------------------------------------------------------------- -// ٷ? ִ Schedule üũغ ƴٸ, -// Schedule Work returnѴ. , Schedule . +// 가장 근래?에 실행될 수 있는 Schedule을 체크해보고 실행됐다면, +// Schedule의 Work를 return한다. 이 때, Schedule은 지운다. //-------------------------------------------------------------------------------- Work* Scheduler::heartbeat() throw(Error) { __BEGIN_TRY @@ -77,10 +77,10 @@ Work* Scheduler::heartbeat() throw(Error) { if (m_RecentSchedules.empty()) return NULL; - // priority queue top() ( Former ؼ) Ҹ Ѵ. - // ŸԵ 𸣰ڴ. -.-;;; + // priority queue 의 top()은 가장 작은 (위의 Former 에 의해서) 원소를 리턴한다. + // 안타깝게도 지금은 가장 빠른 게 나올지 늦은게 나올지 모르겠다. -.-;;; // 2003. 1.23. by Sequoia - // Former Ŭ Latter Ŭ ٲ㼭 ´. + // Former 클래스를 Latter 클래스로 바꿔서 지금은 가장 빠른 게 나온다. Schedule* pRecentSchedule = m_RecentSchedules.top(); if (pRecentSchedule->heartbeat()) { diff --git a/src/server/gameserver/testAlone/Scheduler.h b/src/server/gameserver/testAlone/Scheduler.h index 12d6666b..652bf5ff 100644 --- a/src/server/gameserver/testAlone/Scheduler.h +++ b/src/server/gameserver/testAlone/Scheduler.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// ٸ ۾ Scheduler Ŭ. +// 스케줄링된 작업을 위한 Scheduler 클래스. /////////////////////////////////////////////////////////////////// #ifndef __SCHEDULER_H__ diff --git a/src/server/gameserver/testAlone/StringStream.cpp b/src/server/gameserver/testAlone/StringStream.cpp index 85dbed9b..a8a63190 100644 --- a/src/server/gameserver/testAlone/StringStream.cpp +++ b/src/server/gameserver/testAlone/StringStream.cpp @@ -198,16 +198,16 @@ StringStream& StringStream::operator<<(const string& str) throw() { // make string ////////////////////////////////////////////////////////////////////// const string& StringStream::toString() const throw() { - // ϴ Ʈ ѹ س, - // ״ ȣ⶧ ߰ ʴ ״ Ѵ. + // 일단 스트링을 한번 생성해놓으면, + // 그다음 호출때에는 새로 추가되지 않는 한 그대로 사용한다. if (m_bInserted) { m_bInserted = false; - // ӵ ϴ ޸𸮸 Ƴ Ѵ. + // 속도를 위해 쓸데없는 복사 방지를 일단 메모리를 다 잡아놓고 시작한다. m_Buffer.reserve(m_Size); for (list::const_iterator itr = m_Strings.begin(); itr != m_Strings.end(); itr++) { - // ۿ ϳ ߰Ѵ. + // 버퍼에 하나씩 추가한다. m_Buffer.append(*itr); } } diff --git a/src/server/gameserver/testAlone/Util.cpp b/src/server/gameserver/testAlone/Util.cpp index a5b77833..6438a50d 100644 --- a/src/server/gameserver/testAlone/Util.cpp +++ b/src/server/gameserver/testAlone/Util.cpp @@ -1,5 +1,5 @@ -//  Zone ޼ Ѹ ؼ ZoneIDList ʿ +// 몇개의 Zone 에만 메세지를 뿌리기 위해서 성에 속한 ZoneIDList가 필요함 void makeZoneIDList(const string& zoneIDs, list& zoneIDList) { __BEGIN_TRY @@ -21,7 +21,7 @@ void makeZoneIDList(const string& zoneIDs, list& zoneIDList) { string zoneID = trim(zoneIDs.substr(a, b - a)); - // -_- ׳ atoi ᵵ ɷ ;; + // 음 -_- 그냥 atoi 써도 될려나 ;; zoneIDList.push_back(atoi(zoneID.c_str())); a = b + 1; diff --git a/src/server/gameserver/testAlone/WarSystem.cpp b/src/server/gameserver/testAlone/WarSystem.cpp index 5add2f46..152aa7e5 100644 --- a/src/server/gameserver/testAlone/WarSystem.cpp +++ b/src/server/gameserver/testAlone/WarSystem.cpp @@ -70,14 +70,14 @@ void WarSystem::prepareRaceWar() throw(Error) { SAFE_DELETE(m_pRaceWarSchedule); - // غصд. + // 종족 전쟁을 준비해둔다. VSDateTime warStartTime = WarScheduler::getNextWarDateTime(WAR_RACE, VSDateTime::currentDateTime()); War* pRaceWar = new RaceWar(War::WAR_STATE_WAIT); pRaceWar->setWarStartTime(warStartTime); m_pRaceWarSchedule = new Schedule(pRaceWar, warStartTime); - filelog("WarLog.txt", "[WarID=%d,Time=%s] ߰մϴ.", (int)pRaceWar->getWarID(), + filelog("WarLog.txt", "[WarID=%d,Time=%s] 종족 전쟁을 추가합니다.", (int)pRaceWar->getWarID(), warStartTime.toString().c_str()); __END_CATCH @@ -86,21 +86,21 @@ void WarSystem::prepareRaceWar() throw(Error) { void WarSystem::load() throw (Error){__BEGIN_TRY - // loadҰ . + // load할거 없다. - // loadؾ Ѵ. + // 진행중인 전쟁을 load해야 한다. __END_CATCH} VSDateTime WarSystem::getWarEndTime(WarType_t warType) const { int seconds = 0; switch (warType) { - // 1ð + // 길드전은 1시간 case WAR_GUILD: seconds = g_pVariableManager->getVariable(GUILD_WAR_TIME); break; - // 2ð + // 종족전은 2시간 case WAR_RACE: seconds = g_pVariableManager->getVariable(RACE_WAR_TIME); break; @@ -117,7 +117,7 @@ bool WarSystem::addWarDelayed(War* pWar) throw(Error) { Assert(pWar != NULL); if (hasActiveRaceWar() && pWar->getWarType() == WAR_RACE) { - throw Error("̹ Դϴ."); + throw Error("이미 종족 전쟁이 진행중입니다."); } __ENTER_CRITICAL_SECTION(m_MutexWarQueue); @@ -152,7 +152,7 @@ bool WarSystem::addQueuedWar() throw(Error) { __END_CATCH } -// WarSystem ȿ ȣǴ Լ̹Ƿ LOCKʿ. +// WarSystem 안에서만 호출되는 함수이므로 LOCK필요없다. bool WarSystem::addWar(War* pWar) throw(Error) { __BEGIN_TRY @@ -170,7 +170,7 @@ bool WarSystem::addWar(War* pWar) throw(Error) { addSchedule(pWarSchedule); - // ϴ Ѹ. + // 일단 모든 존에 뿌린다. if (makeGCWarList_LOCKED()) { GCWarList gcWarList; @@ -183,16 +183,16 @@ bool WarSystem::addWar(War* pWar) throw(Error) { g_pZoneGroupManager->broadcast(&gcWarList); } - // ̹ . WarScheduler execute tinysave߱ Statusٲ ʿ䵵 . + // 이미 만들어졌다. WarScheduler의 execute에서 tinysave했기 때메 Status바꿀 필요도 없다. // pWarSchedule->create(); - // Ʈ ߰ش. - // heartbeat() Žش. + // 진행 중인 전쟁 리스트에 추가시켜준다. + // heartbeat()에서 제거시켜준다. if (pWar->getWarType() == WAR_GUILD) { SuildWar* pSiegeWar = dynamic_cast(pWar); Assert(pSiegeWar != NULL); - // ִ ¸ Refresh ش. + // 성지에 있는 유저의 상태를 Refresh 해준다. EventRefreshHolyLandPlayer* pEvent = new EventRefreshHolyLandPlayer(NULL); pEvent->setDeadline(0); g_pClientManager->addEvent(pEvent); @@ -205,15 +205,15 @@ bool WarSystem::addWar(War* pWar) throw(Error) { } else if (pWar->getWarType() == WAR_RACE) { m_bHasRaceWar = true; - // ִ ¸ Refresh ش. + // 성지에 있는 유저의 상태를 Refresh 해준다. EventRefreshHolyLandPlayer* pEvent = new EventRefreshHolyLandPlayer(NULL); pEvent->setDeadline(0); g_pClientManager->addEvent(pEvent); - // ƴ ġ ش. + // 아담의 성지 전역에 피의 성서 위치를 보내준다. g_pShrineInfoManager->broadcastBloodBibleStatus(); - // £ ʴ . + // 종족 전쟁에 참가하지 않는 사람들을 내보낸다. g_pHolyLandManager->remainRaceWarPlayers(); } @@ -257,7 +257,7 @@ bool WarSystem::makeGCWarList_LOCKED() throw(Error) { pWarInfo = new RaceWarInfo; break; default: - throw Error("WarType ߸ƴ."); + throw Error("WarType이 잘못됐다."); } pWarSchedule->makeWarInfo(pWarInfo); @@ -317,16 +317,16 @@ Work* WarSystem::heartbeat() throw(Error) { pWork = Scheduler::heartbeat(); if (pWork != NULL) { - // ð ż £ ó + // 시간이 다 돼서 끝난 전쟁에 대한 처리 War* pWar = dynamic_cast(pWork); Assert(pWar != NULL); - // üδ War::executeEnd() ̴. + // 대체로는 War::executeEnd()에서 할 것이다. if (pWar->getWarType() == WAR_GUILD) { SiegeWar* pSiegeWar = dynamic_cast(pWar); Assert(pSiegeWar != NULL); - // Ʈ Žش. + // 진행 중인 전쟁 리스트에서 제거시켜준다. __ENTER_CRITICAL_SECTION(m_MutexActiveWars) list::iterator itr = @@ -339,7 +339,7 @@ Work* WarSystem::heartbeat() throw(Error) { } else if (pWar->getWarType() == WAR_RACE) { m_bHasRaceWar = false; - // ִ ¸ Refresh ش. + // 성지에 있는 유저의 상태를 Refresh 해준다. EventRefreshHolyLandPlayer* pEvent = new EventRefreshHolyLandPlayer(NULL); pEvent->setDeadline(0); g_pClientManager->addEvent(pEvent); @@ -348,12 +348,12 @@ Work* WarSystem::heartbeat() throw(Error) { SAFE_DELETE(pWork); } - // ڵ Ų. + // 종족 전쟁을 자동으로 시작 시킨다. if (m_pRaceWarSchedule != NULL && !m_bHasRaceWar && g_pVariableManager->isAutoStartRaceWar()) { checkStartRaceWar(); } - // WarList ش. + // WarList를 갱신해준다. static Timeval nextTime = {0, 0}; Timeval currentTime; getCurrentTime(currentTime); @@ -427,8 +427,8 @@ bool WarSystem::hasCastleActiveWar(ZoneID_t zoneID) const throw(Error) { __LEAVE_CRITICAL_SECTION(m_MutexActiveWars) /* - // deadlock(Zone EffectHasBloodBible::affect(Item), ְ -_-;) Ͽ - // £ Ʈ óѴ. + // deadlock(Zone의 EffectHasBloodBible::affect(Item)에서, 딴데도 있겠지만 -_-;) 문제로 인하여 + // 실행중인 전쟁에 대한 리스트를 따로 갖고 처리한다. __ENTER_CRITICAL_SECTION(m_Mutex) const RecentSchedules::container_type& schedules = m_RecentSchedules.getSchedules(); @@ -483,7 +483,7 @@ WarSchedule* WarSystem::getActiveWarSchedule_LOCKED(ZoneID_t zoneID) throw(Error War* pWar = dynamic_cast(pWarSchedule->getWork()); if (pWar == NULL) { - cout << "WarSystem ִ Schedule Workü War ƴϰų NULLԴϴ. ~~~~" << endl; + cout << "WarSystem에 들어있는 Schedule의 Work객체가 War가 아니거나 NULL입니다. 삽질삽질~~~~" << endl; continue; } @@ -539,7 +539,7 @@ bool WarSystem::isEndCondition(Item* pItem, MonsterCorpse* pMonsterCorpse) throw Assert(pItem != NULL); Assert(pMonsterCorpse != NULL); - // pItem pMonsterCorpse ¦ ´°? + // pItem과 pMonsterCorpse의 짝이 맞는가? // return pBloodBibleItem->getBibleMonsterType()==pMonsterCorpse->getMonter()->getMonsterType() return true; @@ -558,7 +558,7 @@ bool WarSystem::isModifyCastleOwner(ZoneID_t castleZoneID, PlayerCreature* pPC) __END_CATCH } -// pPC castleZoneID õ £ ¸ߴ. +// pPC가 castleZoneID와 관련된 전쟁에 승리했다. bool WarSystem::endWar(PlayerCreature* pPC, ZoneID_t castleZoneID) throw(Error) { __BEGIN_TRY @@ -578,10 +578,10 @@ bool WarSystem::endWar(PlayerCreature* pPC, ZoneID_t castleZoneID) throw(Error) Assert(pWar != NULL); if (pWar->endWar(pPC)) { - // ( ð ڵ ) + // 전쟁 제거( 시간 수정으로 자동으로 빠지도록 하자) pWarSchedule->setScheduledTime(VSDateTime::currentDateTime()); - // heap ٽ ؾ Ѵ. + // heap을 다시 구성해야 한다. m_RecentSchedules.arrange(); bEndWar = true; @@ -595,7 +595,7 @@ bool WarSystem::endWar(PlayerCreature* pPC, ZoneID_t castleZoneID) throw(Error) __END_CATCH } -// castleZoneID Ѵ. +// castleZoneID의 진행중인 전쟁을 제거한다. bool WarSystem::removeWar(ZoneID_t castleZoneID) throw(Error) { __BEGIN_TRY @@ -606,10 +606,10 @@ bool WarSystem::removeWar(ZoneID_t castleZoneID) throw(Error) { WarSchedule* pWarSchedule = getActiveWarSchedule_LOCKED(castleZoneID); if (pWarSchedule != NULL) { - // ( ð ڵ ) + // 전쟁 제거( 시간 수정으로 자동으로 빠지도록 하자) pWarSchedule->setScheduledTime(VSDateTime::currentDateTime()); - // heap ٽ ؾ Ѵ. + // heap을 다시 구성해야 한다. m_RecentSchedules.arrange(); bRemoved = true; @@ -622,7 +622,7 @@ bool WarSystem::removeWar(ZoneID_t castleZoneID) throw(Error) { __END_CATCH } -// castleZoneID Ѵ. +// castleZoneID의 진행중인 전쟁을 제거한다. bool WarSystem::removeRaceWar() throw(Error) { __BEGIN_TRY @@ -640,10 +640,10 @@ bool WarSystem::removeRaceWar() throw(Error) { continue; if (pWar->getWarType() == WAR_RACE) { - // ( ð ڵ ) + // 전쟁 제거( 시간 수정으로 자동으로 빠지도록 하자) pSchedule->setScheduledTime(VSDateTime::currentDateTime()); - // heap ٽ ؾ Ѵ. + // heap을 다시 구성해야 한다. m_RecentSchedules.arrange(); bRemoved = true; @@ -657,7 +657,7 @@ bool WarSystem::removeRaceWar() throw(Error) { __END_CATCH } -// Ư ÷̾ Ʈ ش. +// 특정한 플레이어에게 현재 진행중인 전쟁의 리스트를 보내준다. void WarSystem::broadcastWarList(GamePlayer* pGamePlayer) const throw(Error) { __BEGIN_TRY @@ -689,8 +689,8 @@ void WarSystem::broadcastWarList(GamePlayer* pGamePlayer) const throw(Error) { warExist = true; /* StringStream msg; - msg << pWar->getWarName() << " " - << ( pSchedule->getScheduledTime() ).toString() << " ˴ϴ."; + msg << pWar->getWarName() << "이 " + << ( pSchedule->getScheduledTime() ).toString() << " 까지 진행됩니다."; */ char msg[100]; diff --git a/src/server/gameserver/testAlone/Work.h b/src/server/gameserver/testAlone/Work.h index e62d0a07..efeb157a 100644 --- a/src/server/gameserver/testAlone/Work.h +++ b/src/server/gameserver/testAlone/Work.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// ٸ ۾ Work ߻ Ŭ. +// 스케줄링된 작업을 위한 Work 추상 클래스. /////////////////////////////////////////////////////////////////// #ifndef __WORK_H__ diff --git a/src/server/gameserver/war/CorpseItemPosition.cpp b/src/server/gameserver/war/CorpseItemPosition.cpp index 392c1a2a..94fad519 100644 --- a/src/server/gameserver/war/CorpseItemPosition.cpp +++ b/src/server/gameserver/war/CorpseItemPosition.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// CorpseItemPosition Ŭ +// CorpseItemPosition 클래스 구현 /////////////////////////////////////////////////////////////////// #include "CorpseItemPosition.h" @@ -44,7 +44,7 @@ Item* CorpseItemPosition::getItem_LOCKED(bool isDel) m_pZone = pZone; if (pZone == NULL) { - filelog("ItemError.log", "CorpseItemPosition:getItem() : ZoneID ߸Ǿϴ."); + filelog("ItemError.log", "CorpseItemPosition:getItem() : ZoneID가 잘못되었습니다."); return NULL; } @@ -62,7 +62,7 @@ Item* CorpseItemPosition::getItem_UNLOCKED(bool isDel) m_pZone = pZone; if (pZone == NULL) { - filelog("ItemError.log", "CorpseItemPosition:getItem() : ZoneID ߸Ǿϴ."); + filelog("ItemError.log", "CorpseItemPosition:getItem() : ZoneID가 잘못되었습니다."); return NULL; } @@ -88,7 +88,7 @@ Item* CorpseItemPosition::getItem_CORE(Zone* pZone, bool isDel) Item* pRet = NULL; if (pCorpse == NULL || pCorpse->getItemClass() != Item::ITEM_CLASS_CORPSE) { - filelog("ItemError.log", "CorpseItemPosition::getItem() : شϴ ü ϴ."); + filelog("ItemError.log", "CorpseItemPosition::getItem() : 해당하는 시체가 없습니다."); return NULL; } @@ -97,7 +97,7 @@ Item* CorpseItemPosition::getItem_CORE(Zone* pZone, bool isDel) pRet = pCorpse->popTreasure(m_ObjectID); if (pRet == NULL) { - filelog("ItemError.log", "CorpseItemPosition::getItem() : ش ü ȿ ϴ."); + filelog("ItemError.log", "CorpseItemPosition::getItem() : 해당 아이템이 시체 안에 없습니다."); return NULL; } @@ -127,7 +127,7 @@ Item* CorpseItemPosition::getItem_CORE(Zone* pZone, bool isDel) gcAddEffectToTile.setObjectID(pMonsterCorpse->getObjectID()); gcAddEffectToTile.setEffectID(effectClass); gcAddEffectToTile.setXY(pMonsterCorpse->getX(), pMonsterCorpse->getY()); - gcAddEffectToTile.setDuration(10); // ǹ ׳ 1 + gcAddEffectToTile.setDuration(10); // 별 의미 없다 그냥 1초 pZone->broadcastPacket(pMonsterCorpse->getX(), pMonsterCorpse->getY(), &gcAddEffectToTile); } @@ -137,7 +137,7 @@ Item* CorpseItemPosition::getItem_CORE(Zone* pZone, bool isDel) pRet = pCorpse->getTreasure(m_ObjectID); if (pRet == NULL) { - filelog("ItemError.log", "CorpseItemPosition::getItem() : ش ü ȿ ϴ."); + filelog("ItemError.log", "CorpseItemPosition::getItem() : 해당 아이템이 시체 안에 없습니다."); return NULL; } diff --git a/src/server/gameserver/war/DragonEyeManager.cpp b/src/server/gameserver/war/DragonEyeManager.cpp index c6298e1c..01bf6f8f 100644 --- a/src/server/gameserver/war/DragonEyeManager.cpp +++ b/src/server/gameserver/war/DragonEyeManager.cpp @@ -46,16 +46,16 @@ void DragonEyeManager::initDefaultPositions() { __BEGIN_TRY - // ۽ DragonEye ġ . - m_DefaultPositions[0].set(73, 24, 121); // ̾ / ƴ㼭 / 24 / 121 - m_DefaultPositions[1].set(1201, 62, 68); // ̾ / Ÿν / 62 / 68 - m_DefaultPositions[2].set(1203, 85, 50); // ̾ / Ƽ / 85 / 50 - m_DefaultPositions[3].set(71, 111, 124); // ̾ / ƴ㵿 / 111 / 124 - m_DefaultPositions[4].set(1204, 62, 69); // ̾ / Ƹ / 62 / 69 - m_DefaultPositions[5].set(1202, 81, 52); // ̾ / ׸Ƽ콺 / 81 / 52 - m_DefaultPositions[6].set(72, 66, 168); // ƿ콺 / ƴ / 66 / 168 - m_DefaultPositions[7].set(1205, 62, 69); // ƿ콺 / Ÿ / 62 / 69 - m_DefaultPositions[8].set(1206, 82, 52); // ƿ콺 / ø콺 / 82 / 52 + // 전쟁 시작시 DragonEye 의 시작 위치 설정. + m_DefaultPositions[0].set(73, 24, 121); // 슬레이어 / 아담서 / 24 / 121 + m_DefaultPositions[1].set(1201, 62, 68); // 슬레이어 / 옥타부스 / 62 / 68 + m_DefaultPositions[2].set(1203, 85, 50); // 슬레이어 / 셉티무스 / 85 / 50 + m_DefaultPositions[3].set(71, 111, 124); // 뱀파이어 / 아담동 / 111 / 124 + m_DefaultPositions[4].set(1204, 62, 69); // 뱀파이어 / 쿠아르투스 / 62 / 69 + m_DefaultPositions[5].set(1202, 81, 52); // 뱀파이어 / 테르티우스 / 81 / 52 + m_DefaultPositions[6].set(72, 66, 168); // 아우스터즈 / 아담 / 66 / 168 + m_DefaultPositions[7].set(1205, 62, 69); // 아우스터즈 / 펜타누스 / 62 / 69 + m_DefaultPositions[8].set(1206, 82, 52); // 아우스터즈 / 헥시리우스 / 82 / 52 __END_CATCH } @@ -65,7 +65,7 @@ void DragonEyeManager::createAllDragonEyes() { __BEGIN_TRY - // ϴ 巡 Ѵ. + // 일단 드래곤 아이 이이템을 생성한다. for (int i = 0; i < nDragonEyes; ++i) { list optionNull; Item* pItem = g_pItemFactoryManager->createItem(Item::ITEM_CLASS_WAR_ITEM, 0, optionNull); @@ -96,7 +96,7 @@ void DragonEyeManager::addAllDragonEyesToZone() { __BEGIN_TRY - // ʱ ġ ´. + // 아이템을 각자의 초기 위치에 놓는다. for (int i = 0; i < nDragonEyes; ++i) { Zone* pZone = getZoneByZoneID(m_DefaultPositions[i].id); Assert(pZone != NULL); @@ -104,7 +104,7 @@ void DragonEyeManager::addAllDragonEyesToZone() Item* pItem = m_DragonEyes[i]; Assert(pItem != NULL); - // ߰ϱ + // 존에 아이템 추가하기 pZone->addItemDelayed(pItem, m_DefaultPositions[i].x, m_DefaultPositions[i].y); } @@ -116,7 +116,7 @@ void DragonEyeManager::removeAllDragonEyes() { __BEGIN_TRY - // ϴ 巡 ̸ ش. + // 존재하는 모든 드래곤 아이이를 볼 수 없도록 없앤다. for (int i = 0; i < nDragonEyes; ++i) { Item::ItemClass ItemClass = Item::ITEM_CLASS_WAR_ITEM; ItemID_t ItemID = m_DragonEyes[i]->getItemID(); @@ -126,7 +126,7 @@ void DragonEyeManager::removeAllDragonEyes() if (pItemPosition == NULL) return; - // War 忡 ȣ ǹǷ ɾ ȴ. + // War 쓰레드에서 호출 되므로 락 걸어야 된다. pItemPosition->popItem(true); } @@ -138,13 +138,13 @@ void DragonEyeManager::warpToDefaultPosition(Creature* pCreature) { __BEGIN_TRY - // pCreature 巡 ̸ ִ ũ̴. - // 巡 ̸ ִ ڰ װų ų Ҷ Ҹ. - // 巡 ̸ ġ ̵Ű ڵ. - // GlobalItemPositionLoader ؼ ġ Ѵ. - // ͸ ͼ ִ´. - // Լ ڰ  ൿ Ҷ Ҹ ڵ̹Ƿ ZoneGroup ȣǴ ڵ̴. - // ׷ ͷ ۾ ZoneGroup غ ۾ Ѵ. + // pCreature 는 드래곤 아이를 가지고 있는 크리쳐이다. + // 드래곤 아이를 가지고 있던 사용자가 죽거나 나가거나 할때 불린다. + // 드래곤 아이를 원래 위치로 이동시키는 코드다. + // GlobalItemPositionLoader 를 사용해서 아이템을 원래 위치에서 제거한다. + // 원래 존의 포인터를 가져와서 아이템을 넣는다. + // 이 함수는 사용자가 어떤 행동을 할때 불리는 코드이므로 ZoneGroup 에서 호출되는 코드이다. + // 그래서 존의 포인터로 작업을 할 때 ZoneGroup 을 비교해보고 작업을 한다. EffectDragonEye* pEffect = dynamic_cast(pCreature->getEffectManager()->findEffect(Effect::EFFECT_CLASS_DRAGON_EYE)); Assert(pEffect != NULL); diff --git a/src/server/gameserver/war/GlobalItemPosition.h b/src/server/gameserver/war/GlobalItemPosition.h index 00e3b6ea..2eab64c8 100644 --- a/src/server/gameserver/war/GlobalItemPosition.h +++ b/src/server/gameserver/war/GlobalItemPosition.h @@ -17,7 +17,7 @@ class GlobalItemPosition { }; protected: - // Ŭ . + // 이 클래스를 직접 생성할 수는 없다. GlobalItemPosition(PositionType type) : m_ItemPosType(type) {} public: @@ -32,7 +32,7 @@ class GlobalItemPosition { } public: - // ̾Ƴ. + // 아이템을 뽑아낸다. virtual Item* popItem(bool bLock = true) = 0; virtual Zone* getZone() = 0; diff --git a/src/server/gameserver/war/GuildWar.cpp b/src/server/gameserver/war/GuildWar.cpp index bdbd4805..69d055e2 100644 --- a/src/server/gameserver/war/GuildWar.cpp +++ b/src/server/gameserver/war/GuildWar.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// £ óƾ +// 전쟁에 대한 전반적인 정보 및 전쟁 시작 및 종료시 처리루틴 구현 /////////////////////////////////////////////////////////////////// #include "GuildWar.h" @@ -46,10 +46,10 @@ GuildWar::~GuildWar() {} // executeStart // //-------------------------------------------------------------------------------- -// ϴ óؾ ͵ +// 전쟁이 시작하는 시점에서 처리해야 될 것들 // -// (!) Zone پִ WarScheduler Ǵ κ̹Ƿ -// ڽ Zone() ó lock ʿ. +// (!) Zone에 붙어있는 WarScheduler에서 실행되는 부분이므로 +// 자신의 Zone(성)에 대한 처리는 lock이 필요없다. //-------------------------------------------------------------------------------- void GuildWar::executeStart() @@ -58,26 +58,26 @@ void GuildWar::executeStart() sendWarStartMessage(); - // 븦 . + // 성 안의 안전지대를 끈다. ZoneID_t guardShrineZoneID = g_pCastleShrineInfoManager->getGuardShrineZoneID(m_CastleZoneID); Zone* pZone = getZoneByZoneID(guardShrineZoneID); Assert(pZone != NULL); /* - // NPC . + // NPC를 모두 지운다. pZone->deleteNPCs( RACE_SLAYER ); pZone->deleteNPCs( RACE_VAMPIRE ); pZone->releaseSafeZone(); */ - // κ ߿~~ CastleInfo ִ° ڴ. + // 이 부분은 나중에~~ CastleInfo로 넣는게 낫겠다. CastleInfo* pCastleInfo = g_pCastleInfoManager->getCastleInfo(m_CastleZoneID); Assert(pCastleInfo != NULL); GuildID_t OwnerGuildID = pCastleInfo->getGuildID(); - // 뼺 ƴ 츸 ͸ ش. + // 공용성이 아닌 경우만 몬스터를 없애준다. if (OwnerGuildID != SlayerCommon && OwnerGuildID != VampireCommon) { const list& zoneIDs = pCastleInfo->getZoneIDList(); @@ -86,7 +86,7 @@ void GuildWar::executeStart() ZoneID_t targetZoneID = *itr; Zone* pTargetZone = getZoneByZoneID(targetZoneID); - // ƴϰ.. .. + // 성이 아니고.. 던전 맵인 경우.. if (targetZoneID != m_CastleZoneID) { pTargetZone->killAllMonsters(); } @@ -95,7 +95,7 @@ void GuildWar::executeStart() g_pCastleShrineInfoManager->removeShrineShield(pZone); - // GuildWarHistory Table + // GuildWarHistory Table 에 기록 recordGuildWarStart(); __END_CATCH @@ -110,7 +110,7 @@ void GuildWar::recordGuildWarStart() CastleInfo* pCastleInfo = g_pCastleInfoManager->getCastleInfo(m_CastleZoneID); - // NULL ϸ Ȥó ϴ -_-; + // NULL 일리도 없지만 혹시나 하는 맘에 -_-; if (pCastleInfo == NULL) return; @@ -134,7 +134,7 @@ void GuildWar::recordGuildWarStart() // executeEnd // //-------------------------------------------------------------------------------- -// óؾ ͵ +// 전쟁이 끝나는 시점에서 처리해야 될 것들 //-------------------------------------------------------------------------------- void GuildWar::executeEnd() @@ -142,12 +142,12 @@ void GuildWar::executeEnd() __BEGIN_TRY //---------------------------------------------------------------------------- - // ٴ ˸. + // 전쟁 끝났다는 걸 알린다. //---------------------------------------------------------------------------- sendWarEndMessage(); //---------------------------------------------------------------------------- - // + // 성 주인 변경 //---------------------------------------------------------------------------- if (m_bModifyCastleOwner) { g_pCastleInfoManager->modifyCastleOwner(m_CastleZoneID, m_WinnerRace, m_WinnerGuildID); @@ -158,21 +158,21 @@ void GuildWar::executeEnd() CGSayHandler::opworld(NULL, sCommand, 0, true); } } else { - // WinnerGuildID ش + // WinnerGuildID 를 지금 주인으로 셋팅해준다 CastleInfo* pCastleInfo = g_pCastleInfoManager->getCastleInfo(m_CastleZoneID); m_WinnerGuildID = pCastleInfo->getGuildID(); } //---------------------------------------------------------------------------- - // ¡ ǵش. + // 성 상징을 되돌려준다. //---------------------------------------------------------------------------- g_pCastleShrineInfoManager->returnAllCastleSymbol(m_CastleZoneID); //---------------------------------------------------------------------------- - // + // 성 안 안전지대 복구 //---------------------------------------------------------------------------- - // Լ ClientManager 忡 ư WarSystem ҷֹǷ - // Ե Zone ɾ ȴ. + // 이 함수는 ClientManager와 같은 스레드에서 돌아가는 WarSystem에서 불러주므로 + // 성이 포함된 Zone의 락을 걸어줘야 된다. ZoneID_t guardShrineZoneID = g_pCastleShrineInfoManager->getGuardShrineZoneID(m_CastleZoneID); Zone* pZone = getZoneByZoneID(guardShrineZoneID); Assert(pZone != NULL); @@ -195,14 +195,14 @@ void GuildWar::executeEnd() g_pCastleShrineInfoManager->addShrineShield(pZone); //---------------------------------------------------------------------------- - // û ״´. - // (켱 ٲٰ Ѵ.) + // 전쟁 신청금을 성에 쌓는다. + // (우선 전쟁 결과에 따라서 성의 주인이 바뀌었다고 가정한다.) //---------------------------------------------------------------------------- g_pCastleInfoManager->increaseTaxBalance(m_CastleZoneID, m_RegistrationFee); m_RegistrationFee = 0; - // tinysave("û=0") <-- ʿ ? + // tinysave("전쟁신청금=0") <-- 할 필요 있을까? - // GuildWarHistory Table + // GuildWarHistory Table 에 기록 recordGuildWarEnd(); __END_CATCH @@ -223,7 +223,7 @@ void GuildWar::recordGuildWarEnd() } END_DB(pStmt) - // script ., system Լ ̾ !_! + // script 돌리기 ㅡ.,ㅡ system 함수를 쓰게 될 줄이야 !_! char cmd[100]; sprintf(cmd, "/home/darkeden/vs/bin/script/recordGuildWarHistory.py %d %d %d ", (int)getWarID(), g_pConfig->getPropertyInt("Dimension"), g_pConfig->getPropertyInt("WorldID")); @@ -247,10 +247,10 @@ string GuildWar::getWarName() const pZoneInfo = g_pZoneInfoManager->getZoneInfo(m_CastleZoneID); if (pGuild == NULL || pZoneInfo == NULL) - return " "; + return "길드 전쟁"; } catch (Throwable& t) { - return " "; + return "길드 전쟁"; } Assert(pZoneInfo != NULL); @@ -258,8 +258,8 @@ string GuildWar::getWarName() const StringStream msg; - msg << pGuild->getName() << "尡 "; - msg << pZoneInfo->getFullName() << " ϴ "; + msg << pGuild->getName() << "길드가 "; + msg << pZoneInfo->getFullName() << "을 공격하는 길드 전쟁"; return msg.toString(); @@ -271,7 +271,7 @@ string GuildWar::getWarName() const // isModifyCastleOwner( PlayerCreature* pPC ) // //-------------------------------------------------------------------------------- -// ٲ +// 성의 주인이 바뀌는 경우 //-------------------------------------------------------------------------------- bool GuildWar::isModifyCastleOwner(PlayerCreature* pPC) @@ -283,14 +283,14 @@ bool GuildWar::isModifyCastleOwner(PlayerCreature* pPC) CastleInfo* pCastleInfo = g_pCastleInfoManager->getCastleInfo(m_CastleZoneID); Assert(pCastleInfo != NULL); - // 뼺 : ݱ --> ݱ强 - // 뼺 : Ϲ --> ڸ - // 强 : ݱ --> ݱ强 - // 强 : --> ڸ - // 强 : Ϲ --> 뼺 + // 공용성 : 공격길드 --> 공격길드성 + // 공용성 : 일반 --> 원래 자리로 + // 길드성 : 공격길드 --> 공격길드성 + // 길드성 : 수비길드 --> 원래 자리로 + // 길드성 : 일반 --> 공용성 - // : û ̰ų - // 强 Ϲ + // 길드전쟁인 경우 : 전쟁 신청한 길드이거나 + // 길드성인 경우는 일반인 if (pPC->getGuildID() == m_ChallangerGuildID || (!pCastleInfo->isCommon() && pPC->getCommonGuildID() == pPC->getGuildID())) { return true; @@ -307,7 +307,7 @@ bool GuildWar::isModifyCastleOwner(PlayerCreature* pPC) // getWinnerGuildID( PlayerCreature* pPC ) // //-------------------------------------------------------------------------------- -// £ ¸ GuildID Ѱش. +// 전쟁에 승리한 길드의 GuildID를 넘겨준다. //-------------------------------------------------------------------------------- GuildID_t GuildWar::getWinnerGuildID(PlayerCreature* pPC) @@ -316,9 +316,9 @@ GuildID_t GuildWar::getWinnerGuildID(PlayerCreature* pPC) Assert(pPC != NULL); - // : û pPC 尡 pPC GuildID - // ƴϸ ID GuildID - // ƴϸ COMMON_GUILD_ID + // 길드전쟁인 경우 : 전쟁신청 길드와 pPC의 길드가 같으면 pPC의 GuildID + // 아니면 원래 성주인의 길드ID와 같으면 원래 성주인 GuildID + // 아니면 COMMON_GUILD_ID CastleInfo* pCastleInfo = g_pCastleInfoManager->getCastleInfo(m_CastleZoneID); Assert(pCastleInfo != NULL); @@ -338,7 +338,7 @@ bool GuildWar::endWar(PlayerCreature* pPC) Assert(pPC != NULL); - // < > + // < 성 주인 변경 > if (isModifyCastleOwner(pPC)) { m_WinnerRace = pPC->getRace(); m_WinnerGuildID = getWinnerGuildID(pPC); @@ -353,7 +353,7 @@ bool GuildWar::endWar(PlayerCreature* pPC) } //-------------------------------------------------------------------------------- -// +// 전쟁 끝날 때 //-------------------------------------------------------------------------------- void GuildWar::sendWarEndMessage() const @@ -362,7 +362,7 @@ void GuildWar::sendWarEndMessage() const War::sendWarEndMessage(); - // Ȯ? Ŷ + // 안전지대 해제 확인? 패킷 GCNoticeEvent gcNoticeEvent; gcNoticeEvent.setCode(NOTICE_EVENT_WAR_OVER); gcNoticeEvent.setParameter(m_CastleZoneID); @@ -399,24 +399,24 @@ void GuildWar::makeWarInfo(WarInfo* pWarInfo) const Assert(pGuildWarInfo != NULL); //--------------------------------------------------- - // ϱ + // 현재 성 주인 구하기 //--------------------------------------------------- CastleInfo* pCastleInfo = g_pCastleInfoManager->getCastleInfo(getCastleZoneID()); if (pCastleInfo == NULL) { - filelog("WarError.log", "CastleInfo (%d)", getCastleZoneID()); + filelog("WarError.log", "CastleInfo가 없다(%d)", getCastleZoneID()); return; } GuildID_t ownGuildID = pCastleInfo->getGuildID(); GuildID_t challangerGuildID = getChallangerGuildID(); - pGuildWarInfo->addJoinGuild(ownGuildID); // - pGuildWarInfo->addJoinGuild(challangerGuildID); // ϴ + pGuildWarInfo->addJoinGuild(ownGuildID); // 현재 성 주인 + pGuildWarInfo->addJoinGuild(challangerGuildID); // 성에 공격하는 길드 pGuildWarInfo->setCastleID(getCastleZoneID()); - // ̸ - static const string commonSlayerGuild(""); - static const string commonVampireGuild(""); + // 공격 길드 이름 + static const string commonSlayerGuild("없음"); + static const string commonVampireGuild("없음"); string attackGuildName; string defenseGuildName; diff --git a/src/server/gameserver/war/GuildWar.h b/src/server/gameserver/war/GuildWar.h index 5dd747ac..1967dfa2 100644 --- a/src/server/gameserver/war/GuildWar.h +++ b/src/server/gameserver/war/GuildWar.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// £ óƾ. +// 전쟁에 대한 전반적인 정보 및 전쟁 시작 및 종료시 처리루틴. /////////////////////////////////////////////////////////////////// #ifndef __GUILD_WAR_H__ @@ -63,11 +63,11 @@ class GuildWar : public War { virtual string toString() const; private: - ZoneID_t m_CastleZoneID; // õ ZoneID - GuildID_t m_ChallangerGuildID; // WAR_GUILD ϶ û ID - Gold_t m_RegistrationFee; // ޵ û + ZoneID_t m_CastleZoneID; // 전쟁과 관련된 성의 ZoneID + GuildID_t m_ChallangerGuildID; // WAR_GUILD 일때 전쟁을 신청한 길드의 ID + Gold_t m_RegistrationFee; // 지급된 전쟁 신청금 - // + // 전쟁 결과 Race_t m_WinnerRace; GuildID_t m_WinnerGuildID; bool m_bModifyCastleOwner; diff --git a/src/server/gameserver/war/InventoryItemPosition.cpp b/src/server/gameserver/war/InventoryItemPosition.cpp index 05c1f02b..0ab14a98 100644 --- a/src/server/gameserver/war/InventoryItemPosition.cpp +++ b/src/server/gameserver/war/InventoryItemPosition.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// InventoryItemPosition Ŭ +// InventoryItemPosition 클래스 구현 /////////////////////////////////////////////////////////////////// #include "InventoryItemPosition.h" @@ -118,7 +118,7 @@ Creature* InventoryItemPosition::findCreature() pTargetCreature = g_pPCFinder->getCreature_LOCKED(m_OwnerName); if (pTargetCreature == NULL) { - filelog("ItemError.log", "InventoryItemPosition:getItem() : شϴ Creature ϴ."); + filelog("ItemError.log", "InventoryItemPosition:getItem() : 해당하는 Creature가 없습니다."); g_pPCFinder->unlock(); return NULL; @@ -159,7 +159,7 @@ Item* InventoryItemPosition::popItem_CORE(PlayerCreature* pPC) Assert(pInventory != NULL); if (!pInventory->hasItem(m_InvenX, m_InvenY)) { - filelog("ItemError.log", "InventoryItemPosition:getItem() : شϴ ġ ϴ."); + filelog("ItemError.log", "InventoryItemPosition:getItem() : 해당하는 위치에 아이템이 없습니다."); return NULL; } diff --git a/src/server/gameserver/war/InventoryItemPosition.h b/src/server/gameserver/war/InventoryItemPosition.h index d3ba777a..389f7f0d 100644 --- a/src/server/gameserver/war/InventoryItemPosition.h +++ b/src/server/gameserver/war/InventoryItemPosition.h @@ -59,7 +59,7 @@ class InventoryItemPosition : public GlobalItemPosition { CoordInven_t m_InvenX; CoordInven_t m_InvenY; - // getZone ...... + // getZone 을 위한...... Zone* m_pZone; bool m_bSetZone; }; diff --git a/src/server/gameserver/war/MouseItemPosition.cpp b/src/server/gameserver/war/MouseItemPosition.cpp index 22428712..e5c4c5bc 100644 --- a/src/server/gameserver/war/MouseItemPosition.cpp +++ b/src/server/gameserver/war/MouseItemPosition.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// MouseItemPosition Ŭ +// MouseItemPosition 클래스 구현 /////////////////////////////////////////////////////////////////// #include "MouseItemPosition.h" @@ -82,11 +82,11 @@ Zone* MouseItemPosition::getZone() { __BEGIN_TRY - // س װɷ Ѵ. + // 구해놓은게 있으면 그걸로 리턴한다. if (m_bSetZone) return m_pZone; - // س Ѵ. + // 구해놓은게 없으면 새로 구한다. Creature* pTargetCreature = findCreature(); return getZoneByCreature(pTargetCreature); @@ -102,7 +102,7 @@ Item* MouseItemPosition::popItem_CORE(PlayerCreature* pPC) Item* pItem; if (pPC->getExtraInventorySlotItem() == NULL) { - filelog("ItemError.log", "InventoryItemPosition:getItem() : شϴ ġ ϴ."); + filelog("ItemError.log", "InventoryItemPosition:getItem() : 해당하는 위치에 아이템이 없습니다."); return NULL; } @@ -153,7 +153,7 @@ Creature* MouseItemPosition::findCreature() pTargetCreature = g_pPCFinder->getCreature_LOCKED(m_OwnerName); if (pTargetCreature == NULL) { - filelog("ItemError.log", "InventoryItemPosition:getItem() : شϴ Creature ϴ."); + filelog("ItemError.log", "InventoryItemPosition:getItem() : 해당하는 Creature가 없습니다."); g_pPCFinder->unlock(); return NULL; diff --git a/src/server/gameserver/war/MouseItemPosition.h b/src/server/gameserver/war/MouseItemPosition.h index 90081c0e..e839860a 100644 --- a/src/server/gameserver/war/MouseItemPosition.h +++ b/src/server/gameserver/war/MouseItemPosition.h @@ -5,6 +5,7 @@ #include "Types.h" class Creature; +class PlayerCreature; class Zone; class MouseItemPosition : public GlobalItemPosition { @@ -39,7 +40,7 @@ class MouseItemPosition : public GlobalItemPosition { private: string m_OwnerName; - // getZone ...... + // getZone �� ����...... Zone* m_pZone; bool m_bSetZone; }; diff --git a/src/server/gameserver/war/RaceWar.cpp b/src/server/gameserver/war/RaceWar.cpp index 39540fa1..d3352c3d 100644 --- a/src/server/gameserver/war/RaceWar.cpp +++ b/src/server/gameserver/war/RaceWar.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// £ óƾ +// 전쟁에 대한 전반적인 정보 및 전쟁 시작 및 종료시 처리루틴 구현 /////////////////////////////////////////////////////////////////// #include "RaceWar.h" @@ -46,10 +46,10 @@ RaceWar::~RaceWar() {} // executeStart // //-------------------------------------------------------------------------------- -// ϴ óؾ ͵ +// 전쟁이 시작하는 시점에서 처리해야 될 것들 // -// (!) Zone پִ WarScheduler Ǵ κ̹Ƿ -// ڽ Zone() ó lock ʿ. +// (!) Zone에 붙어있는 WarScheduler에서 실행되는 부분이므로 +// 자신의 Zone(성)에 대한 처리는 lock이 필요없다. //-------------------------------------------------------------------------------- void RaceWar::executeStart() @@ -58,24 +58,24 @@ void RaceWar::executeStart() sendWarStartMessage(); - // ʽ . + // 종족전에서는 보너스를 끈다. // g_pHolyLandRaceBonus->clear(); - // ߿ NPC . + // 전쟁 중에는 NPC가 사라진다. // g_pCastleInfoManager->deleteAllNPCs(); - // ߿ ȿ ο~ + // 전쟁 중에는 성 안에서 마구 싸운다~ g_pCastleInfoManager->releaseAllSafeZone(); - // ȣ ȣ . + // 수호성단 보호막이 모두 사라진다. g_pShrineInfoManager->removeAllShrineShield(); - // ƴ ġ ش. - // ̰ WarSystem::addWar ȿ ҷش. + // 아담의 성지 전역에 피의 성서 위치를 보내준다. + // 이거 이제 WarSystem::addWar 안에서 불러준다. // g_pShrineInfoManager->broadcastBloodBibleStatus(); // g_pHolyLandManager->sendBloodBibleStatus(); - // ƴ ð Ѵ. + // 아담의 성지 전역에 시간을 고정한다. g_pHolyLandManager->fixTimeband(g_pVariableManager->getVariable(RACE_WAR_TIMEBAND)); g_pHolyLandManager->killAllMonsters(); @@ -83,15 +83,15 @@ void RaceWar::executeStart() RegenZoneManager::getInstance()->putTryingPosition(); RegenZoneManager::getInstance()->broadcastStatus(); - // 巡 ʱ ġ д. + // 드래곤 아이 아이템을 초기 위치에 둔다. g_pDragonEyeManager->addAllDragonEyesToZone(); - // hasActiveRaceWar() Ǵ Ÿ̹ .. - // WarSystem::addWar() Ѵ. - // £ ʴ . + // hasActiveRaceWar()가 설정되는 타이밍 때문에.. + // WarSystem::addWar()에서 실행한다. + // 종족 전쟁에 참가하지 않는 사람들을 내보낸다. // g_pHolyLandManager->remainRaceWarPlayers(); - // RaceWarHistory Table + // RaceWarHistory Table 에 기록 recordRaceWarStart(); __END_CATCH @@ -159,7 +159,7 @@ void RaceWar::recordRaceWarStart() // executeEnd // //-------------------------------------------------------------------------------- -// óؾ ͵ +// 전쟁이 끝나는 시점에서 처리해야 될 것들 //-------------------------------------------------------------------------------- void RaceWar::executeEnd() @@ -167,19 +167,19 @@ void RaceWar::executeEnd() __BEGIN_TRY //---------------------------------------------------------------------------- - // ٴ ˸. + // 전쟁 끝났다는 걸 알린다. //---------------------------------------------------------------------------- sendWarEndMessage(); //---------------------------------------------------------------------------- - // ó + // 종족전인 경우 처리 //---------------------------------------------------------------------------- - // û ΰŴ  ұ? _-_; - // ʽ ٽ Ҵ. + // 전쟁 신청금 쌓인거는 어떻게 할까? 무시 _-_; + // 종족전에서는 꺼진 보너스를 다시 켠다. // g_pHolyLandRaceBonus->refresh(); //---------------------------------------------------------------------------- - // ǵش. + // 피의 성서 조각을 되돌려준다. //---------------------------------------------------------------------------- g_pShrineInfoManager->returnAllBloodBible(); @@ -191,30 +191,30 @@ void RaceWar::executeEnd() // g_pCastleInfoManager->loadAllNPCs(); - // ƴ ġ ش. + // 아담의 성지 전역에 피의 성서 위치를 보내준다. // g_pHolyLandManager->sendBloodBibleStatus(); g_pShrineInfoManager->broadcastBloodBibleStatus(); - // ƴ ߴ ð ٽ . + // 아담의 성지 전역에 고정했던 시간을 다시 돌린다. g_pHolyLandManager->resumeTimeband(); - // Ʈ Ѵ. + // 전쟁 참가자 리스트를 모두 제거한다. RaceWarLimiter::clearPCList(); - // ڸ 0 ٲ۴. + // 참가자 숫자를 0으로 바꾼다. RaceWarLimiter::getInstance()->clearCurrent(); RegenZoneManager::getInstance()->deleteTryingPosition(); RegenZoneManager::getInstance()->reload(); - // ij͵ Flag Ѵ. + // 캐릭터들의 Flag도 모두 제거한다. g_pZoneGroupManager->removeFlag(Effect::EFFECT_CLASS_RACE_WAR_JOIN_TICKET); CGSayHandler::opworld(NULL, "*world *load blood_bible_owner", 0, true); - // 巡 ش. + // 드래곤 아이 아이템을 없앤다. g_pDragonEyeManager->removeAllDragonEyes(); - // RaceWarHistory Table + // RaceWarHistory Table 에 기록 recordRaceWarEnd(); __END_CATCH @@ -256,7 +256,7 @@ void RaceWar::recordRaceWarEnd() } END_DB(pStmt) - // script ., system Լ ̾ !_! + // script 돌리기 ㅡ.,ㅡ system 함수를 쓰게 될 줄이야 !_! char cmd[100]; sprintf(cmd, "/home/darkeden/vs/bin/script/recordRaceWarHistory.py %s %d %d ", getWarStartTime().toStringforWeb().c_str(), g_pConfig->getPropertyInt("Dimension"), @@ -273,13 +273,13 @@ string RaceWar::getWarName() const { __BEGIN_TRY - return "ս"; + return "蘆痢쇌濫轢"; __END_CATCH } //-------------------------------------------------------------------------------- -// +// 전쟁 끝날 때 //-------------------------------------------------------------------------------- void RaceWar::sendWarEndMessage() const @@ -288,7 +288,7 @@ void RaceWar::sendWarEndMessage() const War::sendWarEndMessage(); - // Ȯ? Ŷ + // 안전지대 해제 확인? 패킷 GCNoticeEvent gcNoticeEvent; gcNoticeEvent.setCode(NOTICE_EVENT_RACE_WAR_OVER); g_pZoneGroupManager->broadcast(&gcNoticeEvent); diff --git a/src/server/gameserver/war/RaceWar.h b/src/server/gameserver/war/RaceWar.h index 0108efe5..5e7420b8 100644 --- a/src/server/gameserver/war/RaceWar.h +++ b/src/server/gameserver/war/RaceWar.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// £ óƾ. +// 전쟁에 대한 전반적인 정보 및 전쟁 시작 및 종료시 처리루틴. /////////////////////////////////////////////////////////////////// #ifndef __RACE_WAR_H__ diff --git a/src/server/gameserver/war/RaceWarLimiter.cpp b/src/server/gameserver/war/RaceWarLimiter.cpp index 0f8b169e..809e9b20 100644 --- a/src/server/gameserver/war/RaceWarLimiter.cpp +++ b/src/server/gameserver/war/RaceWarLimiter.cpp @@ -64,14 +64,14 @@ void PCWarLimiter::load() //-------------------------------------------------------------------------------- // saveCurrent // -// lockɸ ¿ ҷ Ѵ. +// lock걸린 상태에서 불려야 한다. //-------------------------------------------------------------------------------- void PCWarLimiter::clearCurrent() { __BEGIN_TRY - // ο 0 + // 참가 인원을 0으로 int num = m_LimitInfos.size(); for (int i = 0; i < num; i++) { LimitInfo_t* pLI = &(m_LimitInfos[i]); @@ -79,7 +79,7 @@ void PCWarLimiter::clearCurrent() pLI->setCurrent(0); } - // DB 0 ٲش. + // DB에도 0으로 바꿔준다. Statement* pStmt = NULL; BEGIN_DB { @@ -96,7 +96,7 @@ void PCWarLimiter::clearCurrent() //-------------------------------------------------------------------------------- // saveCurrent // -// lockɸ ¿ ҷ Ѵ. +// lock걸린 상태에서 불려야 한다. //-------------------------------------------------------------------------------- void PCWarLimiter::saveCurrent(const LevelLimitInfo* pLI) const diff --git a/src/server/gameserver/war/RaceWarLimiter.h b/src/server/gameserver/war/RaceWarLimiter.h index 9ab196c0..ad13d085 100644 --- a/src/server/gameserver/war/RaceWarLimiter.h +++ b/src/server/gameserver/war/RaceWarLimiter.h @@ -8,7 +8,7 @@ // PCWarLimiter // //-------------------------------------------------------------------------------- -// üũ +// 에 대한 출입 체크 //-------------------------------------------------------------------------------- class PCWarLimiter : public PCLimiter { public: @@ -111,7 +111,7 @@ class RaceWarLimiter { LevelLimitInfo* getLimitInfo(Race_t race, int index); - // Ʈ + // 전쟁 참가자 리스트 static void clearPCList(); static void addPCList(PlayerCreature* pPC); static bool isInPCList(PlayerCreature* pPC); diff --git a/src/server/gameserver/war/Scheduler.cpp b/src/server/gameserver/war/Scheduler.cpp index 57034c5b..885a6bf5 100644 --- a/src/server/gameserver/war/Scheduler.cpp +++ b/src/server/gameserver/war/Scheduler.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// ٸ ۾ Scheduler Ŭ +// 스케줄링된 작업을 위한 Scheduler 클래스 구현 /////////////////////////////////////////////////////////////////// #include "Scheduler.h" @@ -35,7 +35,7 @@ void Scheduler::clear() // addSchedule( Schedule* ) // //-------------------------------------------------------------------------------- -// Schedule RecentSchedules Schedules ÿ ϵǾ ִ. +// Schedule은 RecentSchedules와 Schedules에 동시에 등록되어 있다. //-------------------------------------------------------------------------------- void Scheduler::addSchedule(Schedule* pSchedule) @@ -53,8 +53,8 @@ void Scheduler::addSchedule(Schedule* pSchedule) // popRecentWork( Schedule* pSchedule ) // //-------------------------------------------------------------------------------- -// m_RecentSchedules, m_Schedules -// pRecentSchedule Work returnϰ pRecentSchedule +// m_RecentSchedules, m_Schedules에서 제거 +// pRecentSchedule의 Work는 return하고 pRecentSchedule은 지운다 //-------------------------------------------------------------------------------- Work* Scheduler::popRecentWork() @@ -78,8 +78,8 @@ Work* Scheduler::popRecentWork() // Work* heartbeat() // //-------------------------------------------------------------------------------- -// ٷ? ִ Schedule üũغ ƴٸ, -// Schedule Work returnѴ. , Schedule . +// 가장 근래?에 실행될 수 있는 Schedule을 체크해보고 실행됐다면, +// Schedule의 Work를 return한다. 이 때, Schedule은 지운다. //-------------------------------------------------------------------------------- Work* Scheduler::heartbeat() @@ -89,10 +89,10 @@ Work* Scheduler::heartbeat() if (m_RecentSchedules.empty()) return NULL; - // priority queue top() ( Former ؼ) Ҹ Ѵ. - // ŸԵ 𸣰ڴ. -.-;;; + // priority queue 의 top()은 가장 작은 (위의 Former 에 의해서) 원소를 리턴한다. + // 안타깝게도 지금은 가장 빠른 게 나올지 늦은게 나올지 모르겠다. -.-;;; // 2003. 1.23. by Sequoia - // Former Ŭ Latter Ŭ ٲ㼭 ´. + // Former 클래스를 Latter 클래스로 바꿔서 지금은 가장 빠른 게 나온다. Schedule* pRecentSchedule = m_RecentSchedules.top(); if (pRecentSchedule->heartbeat()) { diff --git a/src/server/gameserver/war/SiegeWar.cpp b/src/server/gameserver/war/SiegeWar.cpp index ae9e8c6a..193b81f2 100644 --- a/src/server/gameserver/war/SiegeWar.cpp +++ b/src/server/gameserver/war/SiegeWar.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// £ óƾ +// 전쟁에 대한 전반적인 정보 및 전쟁 시작 및 종료시 처리루틴 구현 /////////////////////////////////////////////////////////////////// #include "SiegeWar.h" @@ -85,10 +85,10 @@ bool SiegeWar::addChallengerGuild(GuildID_t gID) { // executeStart // //-------------------------------------------------------------------------------- -// ϴ óؾ ͵ +// 전쟁이 시작하는 시점에서 처리해야 될 것들 // -// (!) Zone پִ WarScheduler Ǵ κ̹Ƿ -// ڽ Zone() ó lock ʿ. +// (!) Zone에 붙어있는 WarScheduler에서 실행되는 부분이므로 +// 자신의 Zone(성)에 대한 처리는 lock이 필요없다. //-------------------------------------------------------------------------------- void SiegeWar::executeStart() @@ -98,7 +98,7 @@ void SiegeWar::executeStart() sendWarStartMessage(); clearReinforceRegisters(); - // κ ߿~~ CastleInfo ִ° ڴ. + // 이 부분은 나중에~~ CastleInfo로 넣는게 낫겠다. CastleInfo* pCastleInfo = g_pCastleInfoManager->getCastleInfo(m_CastleZoneID); Assert(pCastleInfo != NULL); @@ -109,25 +109,25 @@ void SiegeWar::executeStart() if ( !pCastleInfo->isCommon() ) { SiegeManager::Instance().recallGuild( m_CastleZoneID, siegeZoneID, OwnerGuildID, 1, 200 ); - filelog("WarLog.txt", "%d 尡 Դϴ.", OwnerGuildID); + filelog("WarLog.txt", "%d 길드가 성 주인입니다.", OwnerGuildID); } if ( m_ReinforceGuildID != 0 ) { SiegeManager::Instance().recallGuild( m_CastleZoneID, siegeZoneID, m_ReinforceGuildID, 2, 200 ); - filelog("WarLog.txt", "%d 尡 Դϴ.", m_ReinforceGuildID); + filelog("WarLog.txt", "%d 길드가 수성 지원측입니다.", m_ReinforceGuildID); } for ( int i=0; igetCastleInfo( m_CastleZoneID ); - // NULL ϸ Ȥó ϴ -_-; + // NULL 일리도 없지만 혹시나 하는 맘에 -_-; if ( pCastleInfo == NULL ) return; BEGIN_DB @@ -168,7 +168,7 @@ void SiegeWar::recordSiegeWarStart() // executeEnd // //-------------------------------------------------------------------------------- -// óؾ ͵ +// 전쟁이 끝나는 시점에서 처리해야 될 것들 //-------------------------------------------------------------------------------- void SiegeWar::executeEnd() @@ -176,7 +176,7 @@ void SiegeWar::executeEnd() __BEGIN_TRY //---------------------------------------------------------------------------- - // ٴ ˸. + // 전쟁 끝났다는 걸 알린다. //---------------------------------------------------------------------------- sendWarEndMessage(); @@ -210,7 +210,7 @@ void SiegeWar::executeEnd() GameServerInfo* pGameServerInfo = itr->second; if (pGameServerInfo->getWorldID() == myWorldID) { - // ƴ 쿡..( óǷ) + // 현재 서버가 아닌 경우에만..(위에서 처리했으므로) if (pGameServerInfo->getGroupID() == myServerID) { } else if (pGameServerInfo->getCastleFollowingServerID() == myServerID) { g_pLoginServerManager->sendPacket(pGameServerInfo->getIP(), pGameServerInfo->getUDPPort(), @@ -223,18 +223,18 @@ void SiegeWar::executeEnd() } } } else { - // WinnerGuildID ش + // WinnerGuildID 를 지금 주인으로 셋팅해준다 CastleInfo* pCastleInfo = g_pCastleInfoManager->getCastleInfo(m_CastleZoneID); m_WinnerGuildID = pCastleInfo->getGuildID(); } //---------------------------------------------------------------------------- - // û ״´. - // (켱 ٲٰ Ѵ.) + // 전쟁 신청금을 성에 쌓는다. + // (우선 전쟁 결과에 따라서 성의 주인이 바뀌었다고 가정한다.) //---------------------------------------------------------------------------- g_pCastleInfoManager->increaseTaxBalance(m_CastleZoneID, m_RegistrationFee); m_RegistrationFee = 0; - // tinysave("û=0") <-- ʿ ? + // tinysave("전쟁신청금=0") <-- 할 필요 있을까? ZoneID_t siegeZoneID = SiegeManager::Instance().getSiegeZoneID(m_CastleZoneID); Assert(siegeZoneID != 0); @@ -242,7 +242,7 @@ void SiegeWar::executeEnd() filelog("SiegeWar.log", "[%u] executeEnd : reset zone %u", getWarID(), siegeZoneID); SiegeManager::Instance().reset(siegeZoneID); - // SiegeWarHistory Table + // SiegeWarHistory Table 에 기록 recordSiegeWarEnd(); __END_CATCH @@ -265,7 +265,7 @@ void SiegeWar::recordSiegeWarEnd() } END_DB(pStmt) - // script ., system Լ ̾ !_! + // script 돌리기 ㅡ.,ㅡ system 함수를 쓰게 될 줄이야 !_! char cmd[100]; sprintf(cmd, "/home/darkeden/vs/bin/script/recordSiegeWarHistory.py %d %d %d ", (int)getWarID(), @@ -282,7 +282,7 @@ string SiegeWar::getWarName() const { __BEGIN_TRY - return ""; + return "공성전"; __END_CATCH } @@ -292,7 +292,7 @@ string SiegeWar::getWarName() const // isModifyCastleOwner( PlayerCreature* pPC ) // //-------------------------------------------------------------------------------- -// ٲ +// 성의 주인이 바뀌는 경우 //-------------------------------------------------------------------------------- bool SiegeWar::isModifyCastleOwner(PlayerCreature* pPC) @@ -325,7 +325,7 @@ bool SiegeWar::isModifyCastleOwner(PlayerCreature* pPC) // getWinnerGuildID( PlayerCreature* pPC ) // //-------------------------------------------------------------------------------- -// £ ¸ GuildID Ѱش. +// 전쟁에 승리한 길드의 GuildID를 넘겨준다. //-------------------------------------------------------------------------------- GuildID_t SiegeWar::getWinnerGuildID(PlayerCreature* pPC) @@ -334,9 +334,9 @@ GuildID_t SiegeWar::getWinnerGuildID(PlayerCreature* pPC) Assert(pPC != NULL); - // : û pPC 尡 pPC GuildID - // ƴϸ ID GuildID - // ƴϸ COMMON_GUILD_ID + // 길드전쟁인 경우 : 전쟁신청 길드와 pPC의 길드가 같으면 pPC의 GuildID + // 아니면 원래 성주인의 길드ID와 같으면 원래 성주인 GuildID + // 아니면 COMMON_GUILD_ID // CastleInfo* pCastleInfo = g_pCastleInfoManager->getCastleInfo( m_CastleZoneID ); // Assert( pCastleInfo!=NULL ); @@ -352,7 +352,7 @@ bool SiegeWar::endWar(PlayerCreature* pPC) Assert(pPC != NULL); - // < > + // < 성 주인 변경 > if (isModifyCastleOwner(pPC)) { m_WinnerRace = pPC->getRace(); m_WinnerGuildID = getWinnerGuildID(pPC); @@ -367,7 +367,7 @@ bool SiegeWar::endWar(PlayerCreature* pPC) } //-------------------------------------------------------------------------------- -// +// 전쟁 끝날 때 //-------------------------------------------------------------------------------- void SiegeWar::sendWarEndMessage() const @@ -376,7 +376,7 @@ void SiegeWar::sendWarEndMessage() const War::sendWarEndMessage(); - // Ȯ? Ŷ + // 안전지대 해제 확인? 패킷 GCNoticeEvent gcNoticeEvent; gcNoticeEvent.setCode(NOTICE_EVENT_WAR_OVER); gcNoticeEvent.setParameter(m_CastleZoneID); @@ -417,25 +417,25 @@ void SiegeWar::makeWarInfo(WarInfo* pWarInfo) const Assert(pGuildWarInfo != NULL); //--------------------------------------------------- - // ϱ + // 현재 성 주인 구하기 //--------------------------------------------------- CastleInfo* pCastleInfo = g_pCastleInfoManager->getCastleInfo(getCastleZoneID()); if (pCastleInfo == NULL) { - filelog("WarError.log", "CastleInfo (%d)", getCastleZoneID()); + filelog("WarError.log", "CastleInfo가 없다(%d)", getCastleZoneID()); return; } GuildID_t ownGuildID = pCastleInfo->getGuildID(); - pGuildWarInfo->addJoinGuild(ownGuildID); // + pGuildWarInfo->addJoinGuild(ownGuildID); // 현재 성 주인 for (uint i = 0; i < m_ChallangerGuildCount; ++i) pGuildWarInfo->addJoinGuild(m_ChallangerGuildID[i]); pGuildWarInfo->setCastleID(getCastleZoneID()); - // ̸ - static const string commonGuild(""); + // 공격 길드 이름 + static const string commonGuild("없음"); string attackGuildName; string defenseGuildName; @@ -443,7 +443,7 @@ void SiegeWar::makeWarInfo(WarInfo* pWarInfo) const attackGuildName = g_pGuildManager->getGuildName(m_ChallangerGuildID[0]); if (m_ChallangerGuildCount > 1) { char buffer[40]; - snprintf(buffer, 40, "%s %u", attackGuildName.c_str(), m_ChallangerGuildCount - 1); + snprintf(buffer, 40, "%s외 %u개", attackGuildName.c_str(), m_ChallangerGuildCount - 1); attackGuildName = buffer; } diff --git a/src/server/gameserver/war/SiegeWar.h b/src/server/gameserver/war/SiegeWar.h index 3e265d7a..534d4204 100644 --- a/src/server/gameserver/war/SiegeWar.h +++ b/src/server/gameserver/war/SiegeWar.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// £ óƾ. +// 전쟁에 대한 전반적인 정보 및 전쟁 시작 및 종료시 처리루틴. /////////////////////////////////////////////////////////////////// #ifndef __SIEGE_WAR_H__ @@ -95,15 +95,15 @@ class SiegeWar : public War { } private: - ZoneID_t m_CastleZoneID; // õ ZoneID - uint m_ChallangerGuildCount; // û - GuildID_t m_ChallangerGuildID[5]; // û ID - GuildID_t m_ReinforceGuildID; // ID - Gold_t m_RegistrationFee; // ޵ û + ZoneID_t m_CastleZoneID; // 전쟁과 관련된 성의 ZoneID + uint m_ChallangerGuildCount; // 전쟁 신청한 길드 수 + GuildID_t m_ChallangerGuildID[5]; // 전쟁을 신청한 길드의 ID + GuildID_t m_ReinforceGuildID; // 수비측 원군 길드 ID + Gold_t m_RegistrationFee; // 지급된 전쟁 신청금 GuildID_t m_RecentReinforceCandidate; - // + // 전쟁 결과 Race_t m_WinnerRace; GuildID_t m_WinnerGuildID; bool m_bModifyCastleOwner; diff --git a/src/server/gameserver/war/SubInventoryItemPosition.cpp b/src/server/gameserver/war/SubInventoryItemPosition.cpp index 274ec2cb..5b24e2f3 100644 --- a/src/server/gameserver/war/SubInventoryItemPosition.cpp +++ b/src/server/gameserver/war/SubInventoryItemPosition.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// SubInventoryItemPosition Ŭ +// SubInventoryItemPosition 클래스 구현 /////////////////////////////////////////////////////////////////// #include "SubInventoryItemPosition.h" @@ -119,7 +119,7 @@ Creature* SubInventoryItemPosition::findCreature() pTargetCreature = g_pPCFinder->getCreature_LOCKED(m_OwnerName); if (pTargetCreature == NULL) { - filelog("ItemError.log", "SubInventoryItemPosition:getItem() : شϴ Creature ϴ."); + filelog("ItemError.log", "SubInventoryItemPosition:getItem() : 해당하는 Creature가 없습니다."); g_pPCFinder->unlock(); return NULL; @@ -159,14 +159,14 @@ Item* SubInventoryItemPosition::popItem_CORE(PlayerCreature* pPC) Item* pSubInventoryItem = pPC->findItemIID(m_SubInventoryID); if (pSubInventoryItem == NULL) { filelog("ItemError.log", - "SubInventoryItemPosition:getItem() : شϴ ġ SubInventory ϴ."); + "SubInventoryItemPosition:getItem() : 해당하는 위치에 SubInventory 아이템이 없습니다."); return NULL; } SubInventory* pSubInventory = dynamic_cast(pSubInventoryItem); if (pSubInventoryItem == NULL) { filelog("ItemError.log", - "SubInventoryItemPosition:getItem() : شϴ ġ SubInventory ƴմϴ.."); + "SubInventoryItemPosition:getItem() : 해당하는 위치의 아이템이 SubInventory 가 아닙니다.."); return NULL; } @@ -174,7 +174,7 @@ Item* SubInventoryItemPosition::popItem_CORE(PlayerCreature* pPC) Assert(pInventory != NULL); if (!pInventory->hasItem(m_InvenX, m_InvenY)) { - filelog("ItemError.log", "SubInventoryItemPosition:getItem() : شϴ ġ ϴ."); + filelog("ItemError.log", "SubInventoryItemPosition:getItem() : 해당하는 위치에 아이템이 없습니다."); return NULL; } diff --git a/src/server/gameserver/war/SubInventoryItemPosition.h b/src/server/gameserver/war/SubInventoryItemPosition.h index f3873db0..a64f7025 100644 --- a/src/server/gameserver/war/SubInventoryItemPosition.h +++ b/src/server/gameserver/war/SubInventoryItemPosition.h @@ -67,7 +67,7 @@ class SubInventoryItemPosition : public GlobalItemPosition { CoordInven_t m_InvenX; CoordInven_t m_InvenY; - // getZone ...... + // getZone 을 위한...... Zone* m_pZone; bool m_bSetZone; }; diff --git a/src/server/gameserver/war/War.cpp b/src/server/gameserver/war/War.cpp index 97695d49..be2fe511 100644 --- a/src/server/gameserver/war/War.cpp +++ b/src/server/gameserver/war/War.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// £ óƾ +// 전쟁에 대한 전반적인 정보 및 전쟁 시작 및 종료시 처리루틴 구현 /////////////////////////////////////////////////////////////////// #include "War.h" @@ -129,7 +129,7 @@ void War::execute() Assert(false); } - // execute()Ŀ WarSchedule heartbeat() DB Status ϰ ȴ. + // execute()후에는 WarSchedule의 heartbeat()에서 DB의 Status를 설정하게 된다. __END_CATCH } @@ -139,7 +139,7 @@ void War::execute() // send Message // //-------------------------------------------------------------------------------- -// +// 전쟁 시작할 때 //-------------------------------------------------------------------------------- void War::sendWarStartMessage() const @@ -148,7 +148,7 @@ void War::sendWarStartMessage() const GCSystemMessage gcSystemMessage; char str[80]; - // sprintf(str, "%s ۵Ǿϴ.", getWarName().c_str()); + // sprintf(str, "%s이 시작되었습니다.", getWarName().c_str()); sprintf(str, g_pStringPool->c_str(STRID_WAR_START), getWarName().c_str()); gcSystemMessage.setMessage(str); @@ -160,7 +160,7 @@ void War::sendWarStartMessage() const } //-------------------------------------------------------------------------------- -// +// 전쟁 끝날 때 //-------------------------------------------------------------------------------- void War::sendWarEndMessage() const @@ -169,7 +169,7 @@ void War::sendWarEndMessage() const GCSystemMessage gcSystemMessage; char str[80]; - // sprintf(str, "%s ϴ.", getWarName().c_str()); + // sprintf(str, "%s이 끝났습니다.", getWarName().c_str()); sprintf(str, g_pStringPool->c_str(STRID_WAR_END), getWarName().c_str()); gcSystemMessage.setMessage(str); diff --git a/src/server/gameserver/war/War.h b/src/server/gameserver/war/War.h index 19f816d9..c6ae0956 100644 --- a/src/server/gameserver/war/War.h +++ b/src/server/gameserver/war/War.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// £ óƾ. +// 전쟁에 대한 전반적인 정보 및 전쟁 시작 및 종료시 처리루틴. /////////////////////////////////////////////////////////////////// #ifndef __WAR_H__ @@ -86,8 +86,8 @@ class War : public Work { private: WarID_t m_WarID; - WarState m_State; // . - VSDateTime m_StartTime; // ð + WarState m_State; // 전쟁의 현재 상태. + VSDateTime m_StartTime; // 전쟁 시작 시간 static Mutex m_Mutex; static WarID_t m_WarIDRegistry; diff --git a/src/server/gameserver/war/WarSchedule.cpp b/src/server/gameserver/war/WarSchedule.cpp index b4a2a99e..80305df7 100644 --- a/src/server/gameserver/war/WarSchedule.cpp +++ b/src/server/gameserver/war/WarSchedule.cpp @@ -55,7 +55,7 @@ void WarSchedule::makeWarInfo(WarInfo* pWarInfo) const Assert(pWar != NULL); //--------------------------------------------------- - // ð ϱ.. -_-; ߵ... + // 남은 전쟁 시간 구하기.. -_-; 따로 빼야돼... //--------------------------------------------------- VSDateTime dt(VSDateTime::currentDateTime()); int endHour = m_ScheduledTime.time().hour(); @@ -80,7 +80,7 @@ void WarSchedule::makeWarInfo(WarInfo* pWarInfo) const // cout << "startTime : " << startTime << endl; //--------------------------------------------------- - // WarInfo + // WarInfo 값 설정 //--------------------------------------------------- pWar->makeWarInfo(pWarInfo); pWarInfo->setRemainTime(remainSec); @@ -123,7 +123,7 @@ void WarSchedule::create() pSiegeWar->getState2DBString().c_str()); if (pStmt->getAffectedRowCount() == 0) { - filelog("WarError.log", "WarSchedule::create() : ̹ ̺ War ְų ̺ ߸Ǿϴ."); + filelog("WarError.log", "WarSchedule::create() : 이미 테이블에 War 정보가 있거나 테이블이 잘못되었습니다."); SAFE_DELETE(pStmt); return; } @@ -166,7 +166,7 @@ void WarSchedule::save() m_ScheduledTime.toDateTime().c_str(), pSiegeWar->getState2DBString().c_str()); if (pStmt->getAffectedRowCount() == 0) { - filelog("WarError.log", "WarSchedule::create() : ̹ ̺ War ְų ̺ ߸Ǿϴ."); + filelog("WarError.log", "WarSchedule::create() : 이미 테이블에 War 정보가 있거나 테이블이 잘못되었습니다."); SAFE_DELETE(pStmt); return; } @@ -197,7 +197,7 @@ void WarSchedule::tinysave(const string& query) /* if( pStmt->getAffectedRowCount() == 0 ) { - filelog( "WarError.log", "WarSchedule::tinySave() DB WarSchedule ų ߸Ǿϴ. + filelog( "WarError.log", "WarSchedule::tinySave() DB에 WarSchedule이 없거나 정보가 잘못되었습니다. ZoneID:%d, WarID:%d, Query:%s", pWarScheduler->getZone()->getZoneID(), pWar->getWarID(), query.c_str() ); SAFE_DELETE(pStmt); return; @@ -216,7 +216,7 @@ bool WarSchedule::heartbeat() __BEGIN_TRY if (Schedule::heartbeat()) { - // pSchedule Ǿ. + // pSchedule가 실행되었다. if (m_pWork != NULL) { War* pWar = dynamic_cast(m_pWork); Assert(pWar != NULL); diff --git a/src/server/gameserver/war/WarSchedule.h b/src/server/gameserver/war/WarSchedule.h index aee16788..e498e0a9 100644 --- a/src/server/gameserver/war/WarSchedule.h +++ b/src/server/gameserver/war/WarSchedule.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// . DB I/O +// 전쟁 스케줄. DB I/O 지원용 /////////////////////////////////////////////////////////////////// #ifndef __WAR_SCHEDULE_H__ diff --git a/src/server/gameserver/war/WarScheduler.cpp b/src/server/gameserver/war/WarScheduler.cpp index 244f4512..3d70115c 100644 --- a/src/server/gameserver/war/WarScheduler.cpp +++ b/src/server/gameserver/war/WarScheduler.cpp @@ -13,31 +13,31 @@ #include "WarSystem.h" #include "Zone.h" -// dt , , 8(~9) -// dt Ͽ 7(~9) +// dt 이후의 월, 수, 금 오후 8시(~9시) +// dt 이후의 일요일 7시(~9시) const int NextWarDay[2][8] = { - {0, 1, 7, 6, 5, 4, 3, 2}, // - //{ 0, 2, 1, 0, 3, 2, 1, 0 } // RaceWar ,һ,,,,,, - {0, 6, 5, 4, 3, 2, 1, 0} // RaceWar ,һ,,,,,, + {0, 1, 7, 6, 5, 4, 3, 2}, // 길드전 + //{ 0, 2, 1, 0, 3, 2, 1, 0 } // RaceWar 휑,寧,랗,힛,愷,巧,짇,휑 + {0, 6, 5, 4, 3, 2, 1, 0} // RaceWar 휑,寧,랗,힛,愷,巧,짇,휑 }; -// ׽Ʈ .. +// 테스트 서버에서.. const int NextWarHour[2][24] = { // * * * * // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 - {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 1, 5, 4, 3, 2, 1, 2, 1, 15, 14, 13, 12, 11}, // + {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 1, 5, 4, 3, 2, 1, 2, 1, 15, 14, 13, 12, 11}, // 길드전 // * * // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 - {14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, 1, 16, 15} // + {14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, 7, 6, 5, 4, 3, 2, 1, 16, 15} // 종족전 }; WarScheduler::WarScheduler(Zone* pZone) : m_pZone(pZone) { - // Zone پ ư. - // ׷, cancelGuildSchedules() ܺο Ҹ. + // Zone에 붙어서 돌아간다. + // 그런데, cancelGuildSchedules()는 외부에서 불린다. m_Mutex.setName("WarSheduler"); } @@ -65,7 +65,7 @@ bool WarScheduler::makeGCWarScheduleList(GCWarScheduleList* pGCWarScheduleList) pGCWarScheduleList->addWarScheduleInfo(pWSI); } - // ڵ ϴ Ǿ ִٸ, ־ش. + // 자동으로 시작하는 기능이 설정되어 있다면, 종족 전쟁 정보는 무조건 넣어준다. if (g_pVariableManager->isAutoStartRaceWar()) { WarScheduleInfo* pWSI = new WarScheduleInfo; if (g_pWarSystem->addRaceWarScheduleInfo(pWSI)) { @@ -96,7 +96,7 @@ Work* WarScheduler::heartbeat() __LEAVE_CRITICAL_SECTION(m_Mutex) - // ٽ 1 ־ش. + // 종족 전쟁인 경우는 다시 1주일 후 스케쥴을 넣어준다. /* if (pWork != NULL) { @@ -110,7 +110,7 @@ Work* WarScheduler::heartbeat() addWar( pNewWar ); - filelog("WarLog.txt", "[%d][WarID=%d] ۵ǾǷ ߰մϴ.", + filelog("WarLog.txt", "[%d][WarID=%d] 종족 전쟁이 시작되었으므로 다음 종족 전쟁을 추가합니다.", (int)m_pZone->getZoneID(), (int)pWar->getWarID()); } } @@ -190,7 +190,7 @@ void WarScheduler::load() dateTemp = pResult->getString(++i); warStartTime = VSDateTime(dateTemp); - // ̹ ۵Ǿ ̶ ۽ð ٲش. + // 이미 시작되었어야할 전쟁이라면 시작시간을 바꿔준다. if (warStartTime < currentDateTime) { warStartTime = currentDateTime; } @@ -230,7 +230,7 @@ void WarScheduler::load() } END_DB(pStmt) - // Ȱ Ѵ. + // 종족 전쟁 설정된게 없으면 설정한다. /* if (numRaceWar==0) { @@ -240,7 +240,7 @@ void WarScheduler::load() WarSchedule* pWarSchedule = new WarSchedule( pRaceWar, warStartTime, Schedule::SCHEDULE_TYPE_PERIODIC ); addSchedule( pWarSchedule ); - filelog("WarLog.txt", "[%d][WarID=%d] Ƿ ߰մϴ.", + filelog("WarLog.txt", "[%d][WarID=%d] 종족 전쟁이 없으므로 종족 전쟁을 추가합니다.", (int)m_pZone->getZoneID(), (int)pRaceWar->getWarID()); pWarSchedule->create(); @@ -303,7 +303,7 @@ void WarScheduler::tinysave(WarID_t warID, const string& query) __LEAVE_CRITICAL_SECTION(m_Mutex) - filelog("WarError.log", "WarScheduler::tinySave() DB WarID:%d WarSchedule ϴ.", warID); + filelog("WarError.log", "WarScheduler::tinySave() DB에 WarID:%d 인 WarSchedule이 없습니다.", warID); __END_CATCH } @@ -331,23 +331,23 @@ VSDateTime WarScheduler::getLastWarDateTime(WarType_t warType) const { return dt; } -// dt ð ˾ƿ´. +// dt 이후의 전쟁 시간을 알아온다. VSDateTime WarScheduler::getNextWarDateTime(WarType_t warType, const VSDateTime& dt) { int startHour = 0; VSDateTime nextWarDateTime; VSTime nextWarTime; - if (g_pVariableManager->isWarPeriodWeek()) // ʹڳ ̤ + if (g_pVariableManager->isWarPeriodWeek()) // 아 너무하자나 ㅜㅜ { switch (warType) { case WAR_GUILD: - // dt , , 8(~9) + // dt 이후의 월, 수, 금 오후 8시(~9시) startHour = 20; break; case WAR_RACE: - // dt Ͽ 7(~9) + // dt 이후의 일요일 7시(~9시) startHour = 19; break; } @@ -398,8 +398,8 @@ bool WarScheduler::addWar(War* pWar) addSchedule(pWarSchedule); - filelog("WarLog.txt", "[%d][WarID=%d] %s ûǷ 쿡 ߰մϴ.", (int)m_pZone->getZoneID(), - (int)pWar->getWarID(), (pWar->getWarType() == WAR_GUILD ? "" : "")); + filelog("WarLog.txt", "[%d][WarID=%d] %s 전쟁을 신청했으므로 스케쥴에 추가합니다.", (int)m_pZone->getZoneID(), + (int)pWar->getWarID(), (pWar->getWarType() == WAR_GUILD ? "길드" : "종족")); pWarSchedule->create(); @@ -440,7 +440,7 @@ void WarScheduler::cancelGuildSchedules() } END_DB(pStmt) - // ٽ εѴ. - -; + // 다시 로드한다. ㅋㅋ - -; load(); __END_CATCH diff --git a/src/server/gameserver/war/WarScheduler.h b/src/server/gameserver/war/WarScheduler.h index 3032fd23..c5e18a23 100644 --- a/src/server/gameserver/war/WarScheduler.h +++ b/src/server/gameserver/war/WarScheduler.h @@ -1,7 +1,7 @@ /////////////////////////////////////////////////////////////////// // WarScheduler.h // -// Zone پ ư. +// Zone에 붙어서 돌아간다. /////////////////////////////////////////////////////////////////// #ifndef __WAR_SCHEDULER_H__ diff --git a/src/server/gameserver/war/WarSystem.cpp b/src/server/gameserver/war/WarSystem.cpp index 2e56819e..093342b9 100644 --- a/src/server/gameserver/war/WarSystem.cpp +++ b/src/server/gameserver/war/WarSystem.cpp @@ -73,14 +73,14 @@ void WarSystem::prepareRaceWar() { SAFE_DELETE(m_pRaceWarSchedule); - // غصд. + // 종족 전쟁을 준비해둔다. VSDateTime warStartTime = WarScheduler::getNextWarDateTime(WAR_RACE, VSDateTime::currentDateTime()); War* pRaceWar = new RaceWar(War::WAR_STATE_WAIT); pRaceWar->setWarStartTime(warStartTime); m_pRaceWarSchedule = new Schedule(pRaceWar, warStartTime); - filelog("WarLog.txt", "[WarID=%d,Time=%s] ߰մϴ.", (int)pRaceWar->getWarID(), + filelog("WarLog.txt", "[WarID=%d,Time=%s] 종족 전쟁을 추가합니다.", (int)pRaceWar->getWarID(), warStartTime.toString().c_str()); // m_RaceWarTimeParam = ((DWORD)((DWORD)warStartTime.date().month() << 24)) | @@ -91,7 +91,7 @@ void WarSystem::prepareRaceWar() { ((DWORD)((DWORD)sendStartTime.date().month()) * 10000) + ((DWORD)((DWORD)sendStartTime.date().day()) * 100); // + ((DWORD)((DWORD)sendStartTime.time().hour())); - cout << " Ŷ ¥ : " << m_RaceWarTimeParam << endl; + cout << "종족전쟁 패킷 보내는 날짜 : " << m_RaceWarTimeParam << endl; __END_CATCH } @@ -101,21 +101,21 @@ void WarSystem::load() {__BEGIN_TRY - // loadҰ . + // load할거 없다. - // loadؾ Ѵ. + // 진행중인 전쟁을 load해야 한다. __END_CATCH} VSDateTime WarSystem::getWarEndTime(WarType_t warType) const { int seconds = 0; switch (warType) { - // 1ð + // 길드전은 1시간 case WAR_GUILD: seconds = g_pVariableManager->getVariable(GUILD_WAR_TIME); break; - // 2ð + // 종족전은 2시간 case WAR_RACE: seconds = g_pVariableManager->getVariable(RACE_WAR_TIME); break; @@ -134,7 +134,7 @@ bool WarSystem::addWarDelayed(War* pWar) Assert(pWar != NULL); if (hasActiveRaceWar() && pWar->getWarType() == WAR_RACE) { - throw Error("̹ Դϴ."); + throw Error("이미 종족 전쟁이 진행중입니다."); } __ENTER_CRITICAL_SECTION(m_MutexWarQueue); @@ -171,7 +171,7 @@ bool WarSystem::addQueuedWar() __END_CATCH } -// WarSystem ȿ ȣǴ Լ̹Ƿ LOCKʿ. +// WarSystem 안에서만 호출되는 함수이므로 LOCK필요없다. bool WarSystem::addWar(War* pWar) { @@ -191,7 +191,7 @@ bool WarSystem::addWar(War* pWar) addSchedule(pWarSchedule); - // ϴ Ѹ. + // 일단 모든 존에 뿌린다. if (makeGCWarList_LOCKED()) { GCWarList gcWarList; @@ -204,11 +204,11 @@ bool WarSystem::addWar(War* pWar) g_pZoneGroupManager->broadcast(&gcWarList); } - // ̹ . WarScheduler execute tinysave߱ Statusٲ ʿ䵵 . + // 이미 만들어졌다. WarScheduler의 execute에서 tinysave했기 때메 Status바꿀 필요도 없다. // pWarSchedule->create(); - // Ʈ ߰ش. - // heartbeat() Žش. + // 진행 중인 전쟁 리스트에 추가시켜준다. + // heartbeat()에서 제거시켜준다. if (pWar->getWarType() == WAR_GUILD) { #ifndef __OLD_GUILD_WAR__ SiegeWar* pSiegeWar = dynamic_cast(pWar); @@ -217,7 +217,7 @@ bool WarSystem::addWar(War* pWar) #endif Assert(pSiegeWar != NULL); - // ִ ¸ Refresh ش. + // 성지에 있는 유저의 상태를 Refresh 해준다. EventRefreshHolyLandPlayer* pEvent = new EventRefreshHolyLandPlayer(NULL); pEvent->setDeadline(0); g_pClientManager->addEvent(pEvent); @@ -230,15 +230,15 @@ bool WarSystem::addWar(War* pWar) } else if (pWar->getWarType() == WAR_RACE) { m_bHasRaceWar = true; - // ִ ¸ Refresh ش. + // 성지에 있는 유저의 상태를 Refresh 해준다. EventRefreshHolyLandPlayer* pEvent = new EventRefreshHolyLandPlayer(NULL); pEvent->setDeadline(0); g_pClientManager->addEvent(pEvent); - // ƴ ġ ش. + // 아담의 성지 전역에 피의 성서 위치를 보내준다. g_pShrineInfoManager->broadcastBloodBibleStatus(); - // £ ʴ . + // 종족 전쟁에 참가하지 않는 사람들을 내보낸다. g_pHolyLandManager->remainRaceWarPlayers(); } @@ -284,7 +284,7 @@ bool WarSystem::makeGCWarList_LOCKED() pWarInfo = new RaceWarInfo; break; default: - throw Error("WarType ߸ƴ."); + throw Error("WarType이 잘못됐다."); } pWarSchedule->makeWarInfo(pWarInfo); @@ -352,11 +352,11 @@ Work* WarSystem::heartbeat() War* pWar = dynamic_cast(pSchedule->getWork()); if (pWar != NULL && pWar->getWarType() == WAR_RACE) { int lastSec = VSDateTime::currentDateTime().secsTo(pSchedule->getScheduledTime()); - // 20 + // 20분전 if (lastSec < 20 * 60 && !m_b20Minutes) { m_b20Minutes = true; - // ִ ¸ Refresh ش. + // 성지에 있는 유저의 상태를 Refresh 해준다. EventRefreshHolyLandPlayer* pEvent = new EventRefreshHolyLandPlayer(NULL); pEvent->setDeadline(0); g_pClientManager->addEvent(pEvent); @@ -391,11 +391,11 @@ Work* WarSystem::heartbeat() pWork = Scheduler::heartbeat(); if (pWork != NULL) { - // ð ż £ ó + // 시간이 다 돼서 끝난 전쟁에 대한 처리 War* pWar = dynamic_cast(pWork); Assert(pWar != NULL); - // üδ War::executeEnd() ̴. + // 대체로는 War::executeEnd()에서 할 것이다. if (pWar->getWarType() == WAR_GUILD) { #ifndef __OLD_GUILD_WAR__ SiegeWar* pSiegeWar = dynamic_cast(pWar); @@ -404,7 +404,7 @@ Work* WarSystem::heartbeat() #endif Assert(pSiegeWar != NULL); - // Ʈ Žش. + // 진행 중인 전쟁 리스트에서 제거시켜준다. __ENTER_CRITICAL_SECTION(m_MutexActiveWars) list::iterator itr = @@ -417,7 +417,7 @@ Work* WarSystem::heartbeat() } else if (pWar->getWarType() == WAR_RACE) { m_bHasRaceWar = false; - // ִ ¸ Refresh ش. + // 성지에 있는 유저의 상태를 Refresh 해준다. EventRefreshHolyLandPlayer* pEvent = new EventRefreshHolyLandPlayer(NULL); pEvent->setDeadline(0); g_pClientManager->addEvent(pEvent); @@ -428,13 +428,13 @@ Work* WarSystem::heartbeat() SAFE_DELETE(pWork); } - // ڵ Ų. + // 종족 전쟁을 자동으로 시작 시킨다. if (m_pRaceWarSchedule != NULL && !m_bHasRaceWar && g_pVariableManager->isAutoStartRaceWar()) { checkStartRaceWar(); m_bRaceWarToday = VSDateTime::currentDateTime().daysTo(m_pRaceWarSchedule->getScheduledTime()) <= 4; } - // WarList ش. + // WarList를 갱신해준다. static Timeval nextTime = {0, 0}; Timeval currentTime; getCurrentTime(currentTime); @@ -515,8 +515,8 @@ bool WarSystem::hasCastleActiveWar(ZoneID_t zoneID) const __LEAVE_CRITICAL_SECTION(m_MutexActiveWars) /* - // deadlock(Zone EffectHasBloodBible::affect(Item), ְ -_-;) Ͽ - // £ Ʈ óѴ. + // deadlock(Zone의 EffectHasBloodBible::affect(Item)에서, 딴데도 있겠지만 -_-;) 문제로 인하여 + // 실행중인 전쟁에 대한 리스트를 따로 갖고 처리한다. __ENTER_CRITICAL_SECTION(m_Mutex) const RecentSchedules::container_type& schedules = m_RecentSchedules.getSchedules(); @@ -575,7 +575,7 @@ WarSchedule* WarSystem::getActiveWarSchedule_LOCKED(ZoneID_t zoneID) War* pWar = dynamic_cast(pWarSchedule->getWork()); if (pWar == NULL) { - cout << "WarSystem ִ Schedule Workü War ƴϰų NULLԴϴ. ~~~~" << endl; + cout << "WarSystem에 들어있는 Schedule의 Work객체가 War가 아니거나 NULL입니다. 삽질삽질~~~~" << endl; continue; } @@ -643,7 +643,7 @@ bool WarSystem::isEndCondition(Item* pItem, MonsterCorpse* pMonsterCorpse) Assert(pItem != NULL); Assert(pMonsterCorpse != NULL); - // pItem pMonsterCorpse ¦ ´°? + // pItem과 pMonsterCorpse의 짝이 맞는가? // return pBloodBibleItem->getBibleMonsterType()==pMonsterCorpse->getMonter()->getMonsterType() return true; @@ -664,7 +664,7 @@ bool WarSystem::isModifyCastleOwner(ZoneID_t castleZoneID, PlayerCreature* pPC) __END_CATCH } -// pPC castleZoneID õ £ ¸ߴ. +// pPC가 castleZoneID와 관련된 전쟁에 승리했다. bool WarSystem::endWar(PlayerCreature* pPC, ZoneID_t castleZoneID) { @@ -686,10 +686,10 @@ bool WarSystem::endWar(PlayerCreature* pPC, ZoneID_t castleZoneID) Assert(pWar != NULL); if (pWar->endWar(pPC)) { - // ( ð ڵ ) + // 전쟁 제거( 시간 수정으로 자동으로 빠지도록 하자) pWarSchedule->setScheduledTime(VSDateTime::currentDateTime()); - // heap ٽ ؾ Ѵ. + // heap을 다시 구성해야 한다. m_RecentSchedules.arrange(); bEndWar = true; @@ -703,7 +703,7 @@ bool WarSystem::endWar(PlayerCreature* pPC, ZoneID_t castleZoneID) __END_CATCH } -// castleZoneID Ѵ. +// castleZoneID의 진행중인 전쟁을 제거한다. bool WarSystem::removeWar(ZoneID_t castleZoneID) { @@ -716,10 +716,10 @@ bool WarSystem::removeWar(ZoneID_t castleZoneID) WarSchedule* pWarSchedule = getActiveWarSchedule_LOCKED(castleZoneID); if (pWarSchedule != NULL) { - // ( ð ڵ ) + // 전쟁 제거( 시간 수정으로 자동으로 빠지도록 하자) pWarSchedule->setScheduledTime(VSDateTime::currentDateTime()); - // heap ٽ ؾ Ѵ. + // heap을 다시 구성해야 한다. m_RecentSchedules.arrange(); bRemoved = true; @@ -732,7 +732,7 @@ bool WarSystem::removeWar(ZoneID_t castleZoneID) __END_CATCH } -// castleZoneID Ѵ. +// castleZoneID의 진행중인 전쟁을 제거한다. bool WarSystem::removeRaceWar() { @@ -752,10 +752,10 @@ bool WarSystem::removeRaceWar() continue; if (pWar->getWarType() == WAR_RACE) { - // ( ð ڵ ) + // 전쟁 제거( 시간 수정으로 자동으로 빠지도록 하자) pSchedule->setScheduledTime(VSDateTime::currentDateTime()); - // heap ٽ ؾ Ѵ. + // heap을 다시 구성해야 한다. m_RecentSchedules.arrange(); bRemoved = true; @@ -769,7 +769,7 @@ bool WarSystem::removeRaceWar() __END_CATCH } -// Ư ÷̾ Ʈ ش. +// 특정한 플레이어에게 현재 진행중인 전쟁의 리스트를 보내준다. void WarSystem::broadcastWarList(GamePlayer* pGamePlayer) const { @@ -803,8 +803,8 @@ void WarSystem::broadcastWarList(GamePlayer* pGamePlayer) const warExist = true; /* StringStream msg; - msg << pWar->getWarName() << " " - << ( pSchedule->getScheduledTime() ).toString() << " ˴ϴ."; + msg << pWar->getWarName() << "이 " + << ( pSchedule->getScheduledTime() ).toString() << " 까지 진행됩니다."; */ char msg[100]; diff --git a/src/server/gameserver/war/Work.h b/src/server/gameserver/war/Work.h index 2ac193c3..31d41d1b 100644 --- a/src/server/gameserver/war/Work.h +++ b/src/server/gameserver/war/Work.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// ٸ ۾ Work ߻ Ŭ. +// 스케줄링된 작업을 위한 Work 추상 클래스. /////////////////////////////////////////////////////////////////// #ifndef __WORK_H__ diff --git a/src/server/gameserver/war/ZoneItemPosition.cpp b/src/server/gameserver/war/ZoneItemPosition.cpp index b1a671aa..3a16f1ba 100644 --- a/src/server/gameserver/war/ZoneItemPosition.cpp +++ b/src/server/gameserver/war/ZoneItemPosition.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////// -// ZoneItemPosition Ŭ +// ZoneItemPosition 클래스 구현 /////////////////////////////////////////////////////////////////// #include "ZoneItemPosition.h" @@ -24,7 +24,7 @@ Item* ZoneItemPosition::getItem_LOCKED(bool isDel) Zone* pZone = getZone(); if (pZone == NULL) { - filelog("ItemError.log", "ZoneItemPosition:getItem() : ZoneID ߸Ǿϴ."); + filelog("ItemError.log", "ZoneItemPosition:getItem() : ZoneID가 잘못되었습니다."); return NULL; } @@ -55,7 +55,7 @@ Item* ZoneItemPosition::getItem(bool isDel) Zone* pZone = getZone(); if (pZone == NULL) { - filelog("ItemError.log", "ZoneItemPosition:getItem() : ZoneID ߸Ǿϴ."); + filelog("ItemError.log", "ZoneItemPosition:getItem() : ZoneID가 잘못되었습니다."); return NULL; } @@ -110,7 +110,7 @@ Item* ZoneItemPosition::getItemFromZone(Zone* pZone) VSRect rect(0, 0, pZone->getWidth() - 1, pZone->getHeight() - 1); if (!rect.ptInRect(m_ZoneX, m_ZoneY)) { - filelog("ItemError.log", "ZoneItemPosition:getItem() : ǥ ߸Ǿϴ."); + filelog("ItemError.log", "ZoneItemPosition:getItem() : 아이템 좌표가 잘못되었습니다."); return NULL; } @@ -118,7 +118,7 @@ Item* ZoneItemPosition::getItemFromZone(Zone* pZone) Tile& tile = pZone->getTile(m_ZoneX, m_ZoneY); if (!tile.hasItem()) { - filelog("ItemError.log", "ZoneItemPosition:getItem() : ϴ."); + filelog("ItemError.log", "ZoneItemPosition:getItem() : 아이템이 없습니다."); return NULL; } diff --git a/src/server/loginserver/ClientManager.cpp b/src/server/loginserver/ClientManager.cpp index d04990bb..ab624e83 100644 --- a/src/server/loginserver/ClientManager.cpp +++ b/src/server/loginserver/ClientManager.cpp @@ -2,7 +2,7 @@ // // Filename : ClientManager.cpp // Written by : reiot@ewestsoft.com -// Description : α Ŭ̾Ʈ Ŵ +// Description : 로그인 서버용 클라이언트 매니저 // ////////////////////////////////////////////////////////////////////// @@ -29,13 +29,13 @@ // // constructor // -// Ŵ ü ϴ ̴. +// 하위 매니저 객체를 생성하는 곳이다. // ////////////////////////////////////////////////////////////////////// ClientManager::ClientManager() throw(Error) { __BEGIN_TRY - // α ÷̾ Ŵ Ѵ. + // 로그인 플레이어 매니저를 생성한다. g_pLoginPlayerManager = new LoginPlayerManager(); __END_CATCH @@ -46,13 +46,13 @@ ClientManager::ClientManager() throw(Error) { // // destructor // -// Ŵ ü ϴ ̴. +// 하위 매니저 객체를 삭제하는 곳이다. // ////////////////////////////////////////////////////////////////////// ClientManager::~ClientManager() throw(Error) { __BEGIN_TRY - // α ÷̾ Ŵ Ѵ. + // 로그인 플레이어 매니저를 삭제한다. if (g_pLoginPlayerManager != NULL) { delete g_pLoginPlayerManager; g_pLoginPlayerManager = NULL; @@ -64,7 +64,7 @@ ClientManager::~ClientManager() throw(Error) { ////////////////////////////////////////////////////////////////////// // -// Ŵ ü ʱȭϰ, ڽ ʱȭѴ. +// 하위 매니저 객체를 초기화하고, 자신을 초기화한다. // ////////////////////////////////////////////////////////////////////// void ClientManager::init() throw(Error) { @@ -78,13 +78,13 @@ void ClientManager::init() throw(Error) { ////////////////////////////////////////////////////////////////////// // -// 񽺸 Ѵ. +// 서비스를 시작한다. // ////////////////////////////////////////////////////////////////////// void ClientManager::start() throw(Error) { __BEGIN_TRY - run(); // ٷ run() ޽带 ȣѴ. ^^; + run(); // 바로 run() 메쏘드를 호출한다. ^^; __END_CATCH } @@ -92,7 +92,7 @@ void ClientManager::start() throw(Error) { ////////////////////////////////////////////////////////////////////// // -// ڽ 񽺸 ߴ , Ŵ ü 񽺸 ߴܽŲ. +// 자신의 서비스를 중단한 후, 하위 매니저 객체들의 서비스를 중단시킨다. // ////////////////////////////////////////////////////////////////////// void ClientManager::stop() throw(Error) { @@ -105,7 +105,7 @@ void ClientManager::stop() throw(Error) { ////////////////////////////////////////////////////////////////////// -// Ŭ̾Ʈ Ŵ ̴. +// 클라이언트 매니저의 메인 루프이다. ////////////////////////////////////////////////////////////////////// void ClientManager::run() throw(Error) { __BEGIN_TRY @@ -115,9 +115,9 @@ void ClientManager::run() throw(Error) { Timeval NextTime; getCurrentTime(NextTime); - // GameWorldInfo, GameServerInfo εϴ ð + // GameWorldInfo, GameServerInfo 새로 로드하는 시간 Timeval ReloadNextTime = NextTime; - // GameWorldInfo, GameServerInfo εϴ ð , + // GameWorldInfo, GameServerInfo 새로 로드하는 시간 간격, 분 단위 int ReloadGap = g_pConfig->getPropertyInt("ServerInfoReloadTime") * 60; ReloadNextTime.tv_sec += ReloadGap; @@ -167,8 +167,8 @@ void ClientManager::run() throw(Error) { NextTime.tv_sec = currentTime.tv_sec + 10; NextTime.tv_usec = currentTime.tv_usec; - // ϸ ͸ ʱȭش. - // ͺٴ ð뿡 ð ϱ ؼ... + // 매턴마다 프로파일 데이터를 초기화해준다. + // 누적 데이터보다는 시간대에 따른 시간을 측정하기 위해서... initProfileEx(); // g_PacketProfileManager.outputResultToFile("PacketProfile.txt"); @@ -187,7 +187,7 @@ void ClientManager::run() throw(Error) { ReloadNextTime.tv_sec += ReloadGap; } - // DB connection timeout ʰ ǹ̾ ش. + // DB connection 이 timeout 으로 끊어지지 않게 가끔씩 의미없는 쿼리함해준다. // by bezz. 2003.04.21 if (dummyQueryTime < currentTime) { g_pDatabaseManager->executeDummyQuery(g_pDatabaseManager->getConnection("DARKEDEN")); diff --git a/src/server/loginserver/ClientManager.h b/src/server/loginserver/ClientManager.h index cbcffd04..3c842b8c 100644 --- a/src/server/loginserver/ClientManager.h +++ b/src/server/loginserver/ClientManager.h @@ -2,7 +2,7 @@ // // Filename : ClientManager.h // Written by : reiot@ewestsoft.com -// Description : α Ŭ̾Ʈ Ŵ +// Description : 로그인 서버용 클라이언트 매니저 // ////////////////////////////////////////////////////////////////////// @@ -17,17 +17,17 @@ // // class ClientManager; // -// α ÷̾ óϸ, -// ο Ŭ̾Ʈ õ óѴ. +// 로그인 서버에 접속한 모든 플레이어들의 입출력을 처리하며, +// 새로운 클라이언트의 연결 시도를 처리한다. // -// Ŭ̾Ʈ run() α μ 忡 ư. -// , Thread ӹ ʿ䰡 . ׷, Ŭ -// Thread ӹ ٸ Ŭ ϴ. +// 클라이언트의 run()은 로그인 서버 프로세스의 메인 쓰레드에서 돌아간다. +// 따라서, Thread를 상속받을 필요가 없다. 그러나, 클래스의 구조나 역할은 +// Thread 를 상속받은 다른 클래스와 유사하다. // // *NOTES* // -// LoginPlayerManager ClientManager , -// Ŷ ڵ鷯 ϱ ؼ ۷ι ǵǾ Ѵ. +// LoginPlayerManager를 ClientManager의 데이터 멤버로 정의할 수도 있지만, +// 패킷 핸들러에서 쉽게 접근하기 위해서는 글로벌 변수로 정의되어야 한다. // ////////////////////////////////////////////////////////////////////// @@ -39,16 +39,16 @@ class ClientManager { // destructor ~ClientManager() throw(Error); - // Ŭ̾Ʈ Ŵ ʱȭѴ. + // 클라이언트 매니저를 초기화한다. void init() throw(Error); - // Ŭ̾Ʈ Ŵ Ѵ. + // 클라이언트 매니저를 시작한다. void start() throw(Error); - // Ŭ̾Ʈ Ŵ ߴѴ. + // 클라이언트 매니저를 중단한다. void stop() throw(Error); - // Ŭ̾Ʈ Ŵ ޽ + // 클라이언트 매니저의 메인 메쏘드 void run() throw(Error); }; diff --git a/src/server/loginserver/GameServerGroupInfo.h b/src/server/loginserver/GameServerGroupInfo.h index 9dfdb0e1..c34129fe 100644 --- a/src/server/loginserver/GameServerGroupInfo.h +++ b/src/server/loginserver/GameServerGroupInfo.h @@ -2,7 +2,7 @@ // // Filename : GameServerGroupInfo.h // Written By : Reiot -// Description : α ִ +// Description : 로그인 서버에서 갖고 있는 각 게임 서버에 대한 정보 // //---------------------------------------------------------------------- @@ -19,8 +19,8 @@ // // class GameServerGroupInfo; // -// GAME DB GameServerGroupInfo ̺ о -// Ŭ̴. +// GAME DB의 GameServerGroupInfo 테이블에서 읽어들인 각 게임 서버의 정보를 +// 담은 클래스이다. // //---------------------------------------------------------------------- diff --git a/src/server/loginserver/GameServerManager.h b/src/server/loginserver/GameServerManager.h index 9c8cc707..d6414d07 100644 --- a/src/server/loginserver/GameServerManager.h +++ b/src/server/loginserver/GameServerManager.h @@ -22,9 +22,9 @@ class DatagramPacket; // // class GameServerManager; // -// ϴ ̴. +// 게임 서버와의 통신을 전담하는 쓰레드이다. // -// ο ͱ׷ ϳ ŷ Ѵ. +// 내부에 데이터그램 서버소켓을 하나 가지고 블로킹 기반으로 동작한다. // ////////////////////////////////////////////////////////////////////// @@ -49,7 +49,7 @@ class GameServerManager : public Thread { void sendPacket(string host, uint port, DatagramPacket* pPacket); private: - // UDP + // UDP 서버 소켓 DatagramSocket* m_pDatagramSocket; }; diff --git a/src/server/loginserver/LoginPlayer.cpp b/src/server/loginserver/LoginPlayer.cpp index 86874dc8..e0e2d7b0 100644 --- a/src/server/loginserver/LoginPlayer.cpp +++ b/src/server/loginserver/LoginPlayer.cpp @@ -28,14 +28,14 @@ const int defaultLoginPlayerInputStreamSize = 1024; const int defaultLoginPlayerOutputStreamSize = 4096; -static int maxIdleSec = 60 * 15; // 15 е Է ڵ ȴ. +static int maxIdleSec = 60 * 15; // 15 분동안 입력을 하지 않으면 자동 접속 종료된당. -// '̹ ' ذϱ .. ð üũ -static uint maxWaitForKickCharacter = 3; // GameServer 5ʰ ٸ. -static uint maxWaitForKickCharacterCount = 3; // GameServer 3ȸ õѴ. +// '이미 접속 중'문제를 해결하기 위한.. 시간 체크 +static uint maxWaitForKickCharacter = 3; // GameServer의 응답을 5초간 기다린다. +static uint maxWaitForKickCharacterCount = 3; // GameServer가 반응이 없으면 3회 응답을 시도한다. -// CLLoginHandler.cpp ִ Լ. +// CLLoginHandler.cpp에 있는 함수다. void addLoginPlayerData(const string& ID, const string& ip, const string& SSN, const string& zipcode); void addLogoutPlayerData(Player* pPlayer); @@ -69,7 +69,7 @@ LoginPlayer::LoginPlayer(Socket* pSocket) Assert(m_PacketHistory.empty()); - // α ÷̾ , ð Է ð Ѵ. + // 로그인 플레이어가 생성될 때, 현재 시간을 최종 입력 시간으로 간주한다. getCurrentTime(m_ExpireTime); m_ExpireTime.tv_sec += maxIdleSec; @@ -96,8 +96,8 @@ LoginPlayer::LoginPlayer(Socket* pSocket) LoginPlayer::~LoginPlayer() { __BEGIN_TRY - //  ÷̾ ü , ´ α׾ƿ̾ Ѵ. - //  ÷̾ Ű, ¸ α׾ƿ Ѵ. + // 그 어떤 플레이어 객체가 삭제될 때에도, 그 상태는 로그아웃이어야 한다. + // 즉 어떤 플레이어를 접속 종료 시키려면, 그 상태를 로그아웃으로 만들어야 한다. Assert(m_PlayerStatus == LPS_END_SESSION); // delete all previous packets @@ -112,8 +112,8 @@ LoginPlayer::~LoginPlayer() { ////////////////////////////////////////////////////////////////////// // -// '̹ ' . ij ؼ -// ϴ ð . +// '이미 접속 중'인 경우. 캐릭터의 강제 접속 해제를 위해서 +// 대기하는 시간 설정. // ////////////////////////////////////////////////////////////////////// void LoginPlayer::setExpireTimeForKickCharacter() { @@ -132,18 +132,18 @@ void LoginPlayer::processCommand(bool Option) { // static Timeval currentTime; - // '̹ ' .. ų . + // '이미 접속 중'인 경우.. 강제 접속 해제를 시킬려고 할 때. if (m_PlayerStatus == LPS_WAITING_FOR_GL_KICK_VERIFY) { Timeval currentTime; getCurrentTime(currentTime); - // timeout üũ + // timeout 체크 if (currentTime >= m_ExpireTimeForKickCharacter) { - // ٽ KickCharcter . + // 다시 KickCharcter를 보내본다. sendLGKickCharacter(); - // õ غ. - // Ѱ迡 ϸ.. GameServer ׾ٰ Ǵϰ LoginOK . + // 반응이 없는 경우 여러번 시도를 해본다. + // 한계에 도달하면.. GameServer가 죽었다고 판단하고 LoginOK를 보낸다. if (++m_KickCharacterCount >= maxWaitForKickCharacterCount) { sendLCLoginOK(); } @@ -153,28 +153,28 @@ void LoginPlayer::processCommand(bool Option) { } try { - // ӽ + // 헤더를 임시저장할 버퍼 생성 char header[szPacketHeader]; PacketID_t packetID; PacketSize_t packetSize; Packet* pPacket; - // Է¹ۿ ִ Ŷ óѴ. + // 입력버퍼에 들어있는 완전한 패킷들을 모조리 처리한다. while (true) { - // Է½Ʈ Ŷũ⸸ŭ о. - // ũ⸸ŭ Ʈ ٸ, - // Insufficient ܰ ߻ϰ, . + // 입력스트림에서 패킷헤더크기만큼 읽어본다. + // 만약 지정한 크기만큼 스트림에서 읽을 수 없다면, + // Insufficient 예외가 발생하고, 루프를 빠져나간다. if (!m_pInputStream->peek(header, szPacketHeader)) { - // Է ƹ ͵ ٸ, Է ð ʰߴ üũѴ. + // 입력이 아무 것도 없었다면, 입력제한 시간을 초과했는지 체크한다. Timeval currentTime; getCurrentTime(currentTime); if (currentTime >= m_ExpireTime) - throw DisconnectException(" ð Է ˴ϴ."); + throw DisconnectException("일정 시간동안 입력하지 않으면 접속이 종료됩니다."); break; } - // Ŷ̵ Ŷũ⸦ ˾Ƴ. - // ̶ Ŷũ Ѵ. + // 패킷아이디 및 패킷크기를 알아낸다. + // 이때 패킷크기는 헤더를 포함한다. memcpy(&packetID, &header[0], szPacketID); memcpy(&packetSize, &header[szPacketID], szPacketSize); @@ -194,58 +194,58 @@ void LoginPlayer::processCommand(bool Option) { << packetID << ") " << szPacketHeader + packetSize << "/" << m_pInputStream->length() << eos; cout << msg.toString() << endl; - // Ŷ ̵ ̻ϸ Ѵ. + // 패킷 아이디가 이상하면 프로토콜 에러로 간주한다. if (packetID >= Packet::PACKET_MAX) - // ؼ ü ǥصд. + // 디버깅을 위해서 에러를 구체적으로 표시해둔다. throw InvalidProtocolException("too large packet id"); try { - // Ŷ valid üũѴ. + // 패킷의 순서가 valid 한지 체크한다. if (!g_pPacketValidator->isValidPacketID(getPlayerStatus(), packetID)) { // DEBUG by tiancaiamao cout << "player status: " << getPlayerStatus() << " receive packet: " << packetID << endl; throw InvalidProtocolException("invalid packet order"); } - // Ŷ ũⰡ ʹ ũ Ѵ. + // 패킷 크기가 너무 크면 프로토콜 에러로 간주한다. if (packetSize > g_pPacketFactoryManager->getPacketMaxSize(packetID)) throw InvalidProtocolException("too large packet size"); - // Է¹۳ Ŷũ⸸ŭ Ÿ ִ ȮѴ. - // ȭ break ϸ ȴ. (⼭ ϴ exception ̴.) + // 입력버퍼내에 패킷크기만큼의 데이타가 들어있는지 확인한다. + // 최적화시 break 를 사용하면 된다. (여기서는 일단 exception을 쓸 것이다.) if (m_pInputStream->length() < szPacketHeader + packetSize) // throw InsufficientDataException(); break; - // Է½ð Ѵ. - // Է½ð Ŷ ϳ ϰ ð ǹѴ. + // 최종입력시간을 갱신한다. + // 최종입력시간은 패킷 하나가 완전하게 도착한 시간을 의미한다. getCurrentTime(m_ExpireTime); m_ExpireTime.tv_sec += maxIdleSec; - // Դٸ Է¹ۿ Ŷ ϳ ̻ ִٴ ̴. - // Ŷ丮Ŵκ Ŷ̵ ؼ Ŷ Ʈó ϸ ȴ. - // Ŷ̵ ߸ Ŷ丮Ŵ óѴ. + // 여기까지 왔다면 입력버퍼에는 완전한 패킷 하나 이상이 들어있다는 뜻이다. + // 패킷팩토리매니저로부터 패킷아이디를 사용해서 패킷 스트럭처를 생성하면 된다. + // 패킷아이디가 잘못될 경우는 패킷팩토리매니저에서 처리한다. pPacket = g_pPacketFactoryManager->createPacket(packetID); - // ŶƮó ʱȭѴ. - // ŶŬ ǵ read() virtual Ŀ ؼ ȣǾ - // ڵ ʱȭȴ. + // 이제 이 패킷스트럭처를 초기화한다. + // 패킷하위클래스에 정의된 read()가 virtual 메커니즘에 의해서 호출되어 + // 자동적으로 초기화된다. m_pInputStream->readPacket(pPacket); Timeval start, end; getCurrentTime(start); - // ŶƮó Ŷڵ鷯 ϸ ȴ. - // Ŷ̵ ߸ Ŷڵ鷯Ŵ óѴ. + // 이제 이 패킷스트럭처를 가지고 패킷핸들러를 수행하면 된다. + // 패킷아이디가 잘못될 경우는 패킷핸들러매니저에서 처리한다. pPacket->execute(this); getCurrentTime(end); g_PacketProfileManager.addAccuTime(pPacket->getPacketName(), start, end); - // Ŷ Ŷ 丮 ڿ ִ´. + // 현재 패킷을 패킷 히스토리의 맨 뒤에 넣는다. m_PacketHistory.push_back(pPacket); - // Ŷ nPacketHistory ŭ Ѵ. + // 패킷을 nPacketHistory 개만큼만 저장한다. while (m_PacketHistory.size() > nPacketHistory) { Packet* oldPacket = m_PacketHistory.front(); delete oldPacket; @@ -253,41 +253,41 @@ void LoginPlayer::processCommand(bool Option) { } } catch (IgnorePacketException&) { - // PacketValidator Ŷ ϶ , - // Է½Ʈ ʵ Ѵ. + // PacketValidator 에서 패킷을 무시하라고 했으니, + // 입력스트림에서 모두 지워버리고 실행하지 않도록 한다. - // Ŷ ũⰡ ʹ ũ Ѵ. + // 패킷 크기가 너무 크면 프로토콜 에러로 간주한다. if (packetSize > g_pPacketFactoryManager->getPacketMaxSize(packetID)) throw InvalidProtocolException("too large packet size"); - // Է¹۳ Ŷũ⸸ŭ Ÿ ִ ȮѴ. - // ȭ break ϸ ȴ. (⼭ ϴ exception ?̴.) + // 입력버퍼내에 패킷크기만큼의 데이타가 들어있는지 확인한다. + // 최적화시 break 를 사용하면 된다. (여기서는 일단 exception을 ?것이다.) if (m_pInputStream->length() < szPacketHeader + packetSize) throw InsufficientDataException(); - // Ÿ , ũ⸸ŭ ϰ, - // ٸ Ŷ óϵ Ѵ.... + // 데이타가 모두 도착했으면, 그 크기만큼 무시하고, + // 다른 패킷을 처리하도록 한다.... m_pInputStream->skip(szPacketHeader + packetSize); - // õ Ŷ, expire ʰ ȴ. - // ȿ Ŷ © ʰ ش. - // 丮  ʴ´. + // 무시된 패킷은, expire 에 영향을 주지 않게 된다. + // 즉 유효한 패킷만이 짤리지 않게 해준다. + // 또한 히스토리에도 들어가지 않는다. } } } catch (InsufficientDataException& ide) { - // Է ƹ ͵ ٸ, Է ð ʰߴ üũѴ. + // 입력이 아무 것도 없었다면, 입력제한 시간을 초과했는지 체크한다. Timeval currentTime; getCurrentTime(currentTime); if (currentTime >= m_ExpireTime) - throw DisconnectException(" ð Է ˴ϴ."); + throw DisconnectException("일정 시간동안 입력하지 않으면 접속이 종료됩니다."); } catch (InvalidProtocolException& ipe) { - // Ѿ Ѵ. ?? + // 접속을 강제종료시켜야 한다. 무슨 방법으로?? throw; } catch (DisconnectException& de) { - // Ŷ ó ߻  ؾ Ѵ. + // 패킷 처리에서 발생한 어떤 문제로 연결을 종료해야 한다. throw; } @@ -302,52 +302,52 @@ void LoginPlayer::disconnect(bool bDisconnected) { __BEGIN_TRY if (bDisconnected == UNDISCONNECTED) { - // Ŭ̾Ʈ GCDisconnect Ŷ Ѵ. + // 클라이언트에게 GCDisconnect 패킷을 전송한다. // GCDisconnect lcDisconnect; // sendPacket( lcDisconnect ); - // ۿ ִ Ÿ Ѵ. + // 출력 버퍼에 남아있는 데이타를 전송한다. m_pOutputStream->flush(); } - // ݴ´. + // 소켓 연결을 닫는다. m_pSocket->close(); - // '̹ ' , ij ٸ Ȳ. + // '이미 접속 중'인 경우, 캐릭터 강제 접속 해제를 기다리는 상황. if (m_PlayerStatus == LPS_WAITING_FOR_GL_KICK_VERIFY) { m_ID = "NONE"; } - // ÷̾ ¸ α׾ƿ . + // 플레이어의 상태를 로그아웃으로 만든다. Assert(m_PlayerStatus != LPS_END_SESSION); m_PlayerStatus = LPS_END_SESSION; - // ̵ Ǿٴ , α ̷ٴ ̴. - // '̹ ' 쿡.. - // ij ٸ ID Ƿ ƴϴ + // 아이디가 설정되었다는 뜻은, 로그인이 이루어졌다는 뜻이다. + // '이미 접속 중'인 경우에.. + // 캐릭 접속 해제를 기다리는 경우는 ID가 설정될 수 있으므로 아니다 if (m_ID != "NONE") { Statement* pStmt = NULL; // Result* pResult = NULL; try { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); - // queryؼ 淡.. ȶ.. by sigi. 2002.5.7 + // query해서 안 쓰길래.. 날렸땅.. by sigi. 2002.5.7 // pResult = pStmt->executeQuery( "SELECT LogOn FROM Player WHERE PlayerID='%s'" , m_ID.c_str() ); - // α׿̾ Ѵ. + // 로그온이어야 한다. // pResult->next(); // string logon = pResult->getString(1); // cout << "logon = " << logon << endl; // Assert( logon == "LOGON" ); - // LogOn 'LOGON' 츸 'LOGOFF' Ѵ. by sigi. 2002.5.15 - // α׿ Ѵ. + // LogOn이 'LOGON'인 경우만 'LOGOFF'로 변경한다. by sigi. 2002.5.15 + // 로그오프로 변경한다. pStmt->executeQuery("UPDATE Player SET LogOn = 'LOGOFF' WHERE PlayerID='%s' AND LogOn='LOGON'", m_ID.c_str()); #if defined(__PAY_SYSTEM_LOGIN__) || defined(__PAY_SYSTEM_FREE_LIMIT__) - bool bClear = false; // - bool bDecreaseTime = false; // ð - loginserver . + bool bClear = false; // 유료 정보 완전 제거 + bool bDecreaseTime = false; // 사용 시간 감소 - loginserver에서는 무시하자. logoutPayPlay(m_ID, bClear, bDecreaseTime); #endif @@ -367,58 +367,58 @@ void LoginPlayer::disconnect(bool bDisconnected) { } //-------------------------------------------------------------------------------- // disconnect player no log -// DB α׸ ʰ Ѵ. +// DB 에 로그를 쌓지 않게 한다. //-------------------------------------------------------------------------------- void LoginPlayer::disconnect_nolog(bool bDisconnected) { __BEGIN_TRY if (bDisconnected == UNDISCONNECTED) { - // Ŭ̾Ʈ GCDisconnect Ŷ Ѵ. + // 클라이언트에게 GCDisconnect 패킷을 전송한다. // GCDisconnect lcDisconnect; // sendPacket( lcDisconnect ); - // ۿ ִ Ÿ Ѵ. + // 출력 버퍼에 남아있는 데이타를 전송한다. m_pOutputStream->flush(); } - // ݴ´. + // 소켓 연결을 닫는다. m_pSocket->close(); - // '̹ ' , ij ٸ Ȳ. + // '이미 접속 중'인 경우, 캐릭터 강제 접속 해제를 기다리는 상황. if (m_PlayerStatus == LPS_WAITING_FOR_GL_KICK_VERIFY) { m_ID = "NONE"; } - // ÷̾ ¸ α׾ƿ . + // 플레이어의 상태를 로그아웃으로 만든다. Assert(m_PlayerStatus != LPS_END_SESSION); m_PlayerStatus = LPS_END_SESSION; - // ̵ Ǿٴ , α ̷ٴ ̴. - // '̹ ' 쿡.. - // ij ٸ ID Ƿ ƴϴ + // 아이디가 설정되었다는 뜻은, 로그인이 이루어졌다는 뜻이다. + // '이미 접속 중'인 경우에.. + // 캐릭 접속 해제를 기다리는 경우는 ID가 설정될 수 있으므로 아니다 if (m_ID != "NONE") { Statement* pStmt = NULL; // Result* pResult = NULL; try { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); - // queryؼ 淡.. ȶ.. by sigi. 2002.5.7 + // query해서 안 쓰길래.. 날렸땅.. by sigi. 2002.5.7 // pResult = pStmt->executeQuery( "SELECT LogOn FROM Player WHERE PlayerID='%s'" , m_ID.c_str() ); - // α׿̾ Ѵ. + // 로그온이어야 한다. // pResult->next(); // string logon = pResult->getString(1); // cout << "logon = " << logon << endl; // Assert( logon == "LOGON" ); - // LogOn 'LOGON' 츸 'LOGOFF' Ѵ. by sigi. 2002.5.15 - // α׿ Ѵ. + // LogOn이 'LOGON'인 경우만 'LOGOFF'로 변경한다. by sigi. 2002.5.15 + // 로그오프로 변경한다. pStmt->executeQuery("UPDATE Player SET LogOn = 'LOGOFF' WHERE PlayerID='%s' AND LogOn='LOGON'", m_ID.c_str()); #if defined(__PAY_SYSTEM_LOGIN__) || defined(__PAY_SYSTEM_FREE_LIMIT__) - bool bClear = false; // - bool bDecreaseTime = false; // ð - loginserver . + bool bClear = false; // 유료 정보 완전 제거 + bool bDecreaseTime = false; // 사용 시간 감소 - loginserver에서는 무시하자. logoutPayPlay(m_ID, bClear, bDecreaseTime); #endif @@ -438,10 +438,10 @@ void LoginPlayer::disconnect_nolog(bool bDisconnected) { //-------------------------------------------------------------------------------- // -// α÷̾Ŵ ܿ α÷̾ ÿ ϴ -// ȹ̾, ӼŴ ÿ -// ư鼭 α ÷̾ ɼ ܹȴ. - -; ׷, -// Ʒ mutex ȣǴ ߴ. +// 원래는 로그인플레이어매니저 외에는 로그인플레이어에 동시에 접속하는 +// 쓰레드는 존재하지 않을 계획이었지만, 게임서버매니저가 동시에 쓰레드로 +// 돌아가면서 로그인 플레이어에 접근할 가능성이 생겨버렸다. - -; 그래서, +// 아래와 같이 mutex 로 보호되는 버전을 급조했다. // //-------------------------------------------------------------------------------- void LoginPlayer::sendPacket(Packet* pPacket) { @@ -461,11 +461,11 @@ void LoginPlayer::sendPacket(Packet* pPacket) { ////////////////////////////////////////////////////////////////////// // -// ֱ N ° Ŷ Ѵ. +// 최근 N 번째의 패킷을 리턴한다. // -// N == 0 , ֱ Ŷ ϰ ȴ. +// N == 0 일 경우, 가장 최근의 패킷을 리턴하게 된다. // -// ִ nPacketHistory - 1 ִ. +// 최대 nPacketHistory - 1 까지 지정할 수 있다. // ////////////////////////////////////////////////////////////////////// Packet* LoginPlayer::getOldPacket(uint prev) { @@ -483,7 +483,7 @@ Packet* LoginPlayer::getOldPacket(uint prev) { ////////////////////////////////////////////////////////////////////// // -// Ư Ŷ̵ ֱ Ŷ Ѵ. +// 특정 패킷아이디를 가진 가장 최근의 패킷을 리턴한다. // ////////////////////////////////////////////////////////////////////// Packet* LoginPlayer::getOldPacket(PacketID_t packetID) { @@ -512,13 +512,13 @@ Packet* LoginPlayer::getOldPacket(PacketID_t packetID) { // // send LGKickCharacter // -// GameServer '̹ ' ij͸ ش޶ ޼ . +// GameServer로 '이미 접속중'인 캐릭터를 제거해달라고 메세지를 보낸다. // ////////////////////////////////////////////////////////////////////////////// void LoginPlayer::sendLGKickCharacter() { cout << "send LGKickCharacter" << endl; - // Game ij͸ ش޶ message . + // Game서버로 캐릭터를 제거해달라는 message를 보낸다. LGKickCharacter lgKickCharacter; Statement* pStmt = NULL; @@ -531,8 +531,8 @@ void LoginPlayer::sendLGKickCharacter() { uint gameServerPort; //---------------------------------------------------------------------- - // DB player ֱٿ - // WorldID, ServerID, LastSlot . + // DB에서 이 player가 최근에 접속한 + // WorldID, ServerID, LastSlot을 얻어내자. //---------------------------------------------------------------------- if (!isSetWorldGroupID()) { BEGIN_DB { @@ -542,7 +542,7 @@ void LoginPlayer::sendLGKickCharacter() { getID().c_str()); if (pResult->next()) { - serverID = 1; // 1̴. + serverID = 1; // 현재는 무조건 1이다. worldID = pResult->getInt(1); serverGroupID = pResult->getInt(2); lastSlot = pResult->getInt(3); @@ -551,23 +551,23 @@ void LoginPlayer::sendLGKickCharacter() { setGroupID(serverGroupID); setLastSlot(lastSlot); - setWorldGroupID(true); // ƴٴ ǹ. - // ٽ Query ҷ + setWorldGroupID(true); // 값이 설정됐다는 의미. + // 다음에 다시 Query 안 할려고 } SAFE_DELETE(pStmt1); } END_DB(pStmt1) } else { - // ״ . - serverID = 1; // 1̴. + // 기존에 저장된 값을 그대로 쓴다. + serverID = 1; // 현재는 무조건 1이다. worldID = getWorldID(); serverGroupID = getGroupID(); } //---------------------------------------------------------------------- - // Slot Ǵ ij ̸ ˾Ƴ. + // Slot에 대응되는 캐릭터 이름을 알아낸다. //---------------------------------------------------------------------- if (characterName.size() == 0) { BEGIN_DB { @@ -581,13 +581,13 @@ void LoginPlayer::sendLGKickCharacter() { setLastCharacterName(characterName); } else { cout << "No CharacterName" << endl; - // LoginError(̹ ) + // LoginError(이미 접속 중) LCLoginError lcLoginError; lcLoginError.setErrorID(ALREADY_CONNECTED); sendPacket(&lcLoginError); setPlayerStatus(LPS_BEGIN_SESSION); - setID("NONE"); // disconnect LOGOFF ʰ ϱ ؼ + setID("NONE"); // disconnect에서 LOGOFF로 설정되지 않게 하기 위해서 SAFE_DELETE(pStmt); return; @@ -599,9 +599,9 @@ void LoginPlayer::sendLGKickCharacter() { } //---------------------------------------------------------------------- - // GameServer ˾Ƴ. + // GameServer의 정보를 알아낸다. // - // ش World Server + // 해당 World 에 모든 Server 에 보낸다 //---------------------------------------------------------------------- for (int i = 0; i < g_pGameServerInfoManager->getMaxServerGroupID(); i++) { serverGroupID = i; @@ -622,18 +622,18 @@ void LoginPlayer::sendLGKickCharacter() { } } catch (NoSuchElementException&) { cout << "No GameServerInfo" << endl; - // LoginError(̹ ) + // LoginError(이미 접속 중) // LCLoginError lcLoginError; // lcLoginError.setErrorID(ALREADY_CONNECTED); // sendPacket(&lcLoginError); // setPlayerStatus(LPS_BEGIN_SESSION); - setID("NONE"); // disconnect LOGOFF ʰ ϱ ؼ + setID("NONE"); // disconnect에서 LOGOFF로 설정되지 않게 하기 위해서 return; } - lgKickCharacter.setID(getSocket()->getSOCKET()); // SocketFD. ˻ ؼ + lgKickCharacter.setID(getSocket()->getSOCKET()); // SocketFD. 검색을 위해서 lgKickCharacter.setPCName(characterName); cout << "( " << gameServerIP.c_str() << ", " << gameServerPort << " )" << endl; @@ -649,9 +649,9 @@ void LoginPlayer::sendLGKickCharacter() { // // send LCLoginOK // -// Player table LogOn 'LOGON' ٲٰ -// client LCLoginOK . -// PlayerStatus LPS_WAITING_FOR_CL_GET_PC_LIST . +// Player table의 LogOn을 'LOGON'으로 바꾸고 +// client에게 LCLoginOK를 보낸다. +// PlayerStatus는 LPS_WAITING_FOR_CL_GET_PC_LIST로 설정. // ////////////////////////////////////////////////////////////////////// void LoginPlayer::sendLCLoginOK() { @@ -667,7 +667,7 @@ void LoginPlayer::sendLCLoginOK() { pStmt->executeQuery("UPDATE Player SET LogOn = 'LOGON' WHERE PlayerID = '%s'", getID().c_str()); if (pStmt->getAffectedRowCount() == 0) { - filelog("MultiLogin.log", "Ƽ α õ : [%s:%s]", getID().c_str(), + filelog("MultiLogin.log", "멀티 로그인 접속 시도로 예상됨 : [%s:%s]", getID().c_str(), connectIP.c_str()); LCLoginError lcLoginError; // lcLoginError.setMessage("already connected"); @@ -688,10 +688,10 @@ void LoginPlayer::sendLCLoginOK() { END_DB(pStmt) - // Player table Login LOGON ٲ۴. + // Player table의 Login을 LOGON으로 바꾼다. LCLoginOK lcLoginOK; - // LoginPlayer صд. + // 이 전에 LoginPlayer에 저장해둔다. lcLoginOK.setAdult(isAdult()); lcLoginOK.setLastDays(0xffff); @@ -699,7 +699,7 @@ void LoginPlayer::sendLCLoginOK() { setPlayerStatus(LPS_WAITING_FOR_CL_GET_PC_LIST); - // ߴٰ + // 사용자 접속했다고 기록 addLoginPlayerData(m_ID, connectIP, m_SSN, m_Zipcode); } catch (Throwable& t) { @@ -719,10 +719,10 @@ bool LoginPlayer::sendBillingLogin() { if (currentTime > m_BillingNextLoginRequestTime) { g_pBillingPlayerManager->sendPayLogin(this); - // PayLogin û ȸ + // PayLogin 요청한 회수 기억 m_BillingLoginRequestCount++; - // 10 ٽ üũѴ. + // 10초 후 다시 체크한다. m_BillingNextLoginRequestTime.tv_sec = currentTime.tv_sec + 10; } @@ -754,8 +754,8 @@ string LoginPlayer::toString() const { // // add LogoutPlayerdata // -// 踦 ؼ -// UserInfo DB LogoutPlayerData Logout ڸ ߰Ѵ. +// 접속자 통계를 위해서 +// UserInfo DB의 LogoutPlayerData에 Logout한 사용자를 추가한다. // ////////////////////////////////////////////////////////////////////////////// void addLogoutPlayerData(Player* pPlayer) { @@ -766,13 +766,13 @@ void addLogoutPlayerData(Player* pPlayer) { pStmt = g_pDatabaseManager->getUserInfoConnection()->createStatement(); - // ԷѴ. + // 유저 통계 관련 정보를 입력한다. BEGIN_DB { string ID = pPlayer->getID(); string ip = pPlayer->getSocket()->getHost(); - // ð . + // 먼저 현재 시간을 얻어낸다. int year, month, day, hour, minute, second; getCurrentTimeEx(year, month, day, hour, minute, second); string currentDT = VSDateTime::currentDateTime().toDateTime(); @@ -804,21 +804,21 @@ void LoginPlayer::makePCList(LCPCList& lcPCList) { pStmt2 = g_pDatabaseManager->getConnection(WorldID)->createStatement(); //---------------------------------------------------------------------- - // 켱 ̾ ̺ ˻ؼ, Active ̾ εѴ. - // Ŭ̾Ʈ ؾ . + // 우선 슬레이어 테이블을 검색해서, Active 한 슬레이어 정보를 로딩한다. + // 클라이언트로 전송해야 할 정보는 다음과 같다. // - // - ̸ - // - ȣ - // - - // - Ÿ : ̾ - // - Ӹ - // - Ǻλ - // - ԰ִ¿ : ̾ , Ӹ// - // - ɷġ : STR,DEX,CON - // - HP/MP ִ : ̾ MP - // - ġ : ̾ - // - ִ - // - ̵ + // - 이름 + // - 슬랏번호 + // - 성별 + // - 헤어스타일 : 슬레이어 전용 + // - 머리색 + // - 피부색 + // - 입고있는옷정보 : 슬레이어 전용, 머리/상의/하의의 색상정보 + // - 능력치 : STR,DEX,CON + // - HP/MP 의 현재 및 최대 : 뱀파이어는 MP 없음 + // - 기술과 그 경험치 : 슬레이어전용 + // - 갖고 있는 돈 + // - 존의 아이디 // //---------------------------------------------------------------------- pResult1 = pStmt->executeQuery( @@ -828,7 +828,7 @@ void LoginPlayer::makePCList(LCPCList& lcPCList) { "Slayer WHERE PlayerID = '%s' AND Active = 'ACTIVE'", getID().c_str()); - // flag. by sigi. 2002.6.18 + // 복장 flag. by sigi. 2002.6.18 DWORD shape; Color_t colors[PCSlayerInfo::SLAYER_COLOR_MAX]; Color_t colorsVamp[PCVampireInfo::VAMPIRE_COLOR_MAX]; @@ -839,10 +839,10 @@ void LoginPlayer::makePCList(LCPCList& lcPCList) { string name = pResult1->getString(++i); if (race == "SLAYER") { - // ̾ PCInfo ü Ѵ. + // 슬레이어 PCInfo 객체를 생성한다. PCSlayerInfo* pPCSlayerInfo = new PCSlayerInfo(); - // ʵ尪 Ѵ. + // 각 필드값을 지정한다. pPCSlayerInfo->setName(name); pPCSlayerInfo->setSlot(pResult1->getString(++i)); pPCSlayerInfo->setSex(pResult1->getString(++i)); @@ -866,7 +866,7 @@ void LoginPlayer::makePCList(LCPCList& lcPCList) { pPCSlayerInfo->setAlignment(pResult1->getInt(++i)); - // flag üѴ. by sigi. 2002.6.18 + // 복장 정보를 flag로 대체한다. by sigi. 2002.6.18 shape = pResult1->getDWORD(++i); colors[PCSlayerInfo::SLAYER_COLOR_HAIR] = pPCSlayerInfo->getHairColor(); @@ -884,16 +884,16 @@ void LoginPlayer::makePCList(LCPCList& lcPCList) { lcPCList.setPCInfo(pPCSlayerInfo->getSlot(), pPCSlayerInfo); } else if (race == "VAMPIRE") { //---------------------------------------------------------------------- - // ̾ ̺ ˻ؼ LCPCList Ŷ .. - // Ŭ̾Ʈ ؾ . + // 이제 뱀파이어 테이블을 검색해서 LCPCList 패킷에 집어넣자.. + // 클라이언트로 전송해야 할 정보는 다음과 같다. // // - Name // - Slot // - Sex // - BatColor // - SkinColor - // - / - // - ɷġ : STR,DEX,CON + // - 상의/하의의 색상정보 + // - 능력치 : STR,DEX,CON // - CurrentHP/MaxHP // - Gold // - ZoneID @@ -912,10 +912,10 @@ void LoginPlayer::makePCList(LCPCList& lcPCList) { pResult2->next(); - // ̾ PCInfo ü Ѵ. + // 뱀파이어 PCInfo 객체를 생성한다. PCVampireInfo* pPCVampireInfo = new PCVampireInfo(); - // ʵ尪 Ѵ. + // 각 필드값을 지정한다. uint i = 0; pPCVampireInfo->setName(pResult2->getString(++i)); @@ -937,7 +937,7 @@ void LoginPlayer::makePCList(LCPCList& lcPCList) { pPCVampireInfo->setFame(pResult2->getInt(++i)); pPCVampireInfo->setAlignment(pResult2->getInt(++i)); - // о ȭ. by sigi. 2002.6.19 + // 복장 정보 읽어오기 최적화. by sigi. 2002.6.19 shape = pResult2->getDWORD(++i); colorsVamp[0] = pResult2->getInt(++i); // CoatColor @@ -946,16 +946,16 @@ void LoginPlayer::makePCList(LCPCList& lcPCList) { lcPCList.setPCInfo(pPCVampireInfo->getSlot(), pPCVampireInfo); } else { //---------------------------------------------------------------------- - // ƿ콺 ̺ ˻ؼ LCPCList Ŷ .. - // Ŭ̾Ʈ ؾ . + // 이제 아우스터즈 테이블을 검색해서 LCPCList 패킷에 집어넣자.. + // 클라이언트로 전송해야 할 정보는 다음과 같다. // // - Name // - Slot // - Sex // - HairColor // - SkinColor - // - / - // - ɷġ : STR,DEX,CON + // - 상의/하의의 색상정보 + // - 능력치 : STR,DEX,CON // - CurrentHP/MaxHP // - Gold // - ZoneID @@ -974,10 +974,10 @@ void LoginPlayer::makePCList(LCPCList& lcPCList) { pResult2->next(); - // ƿ콺 PCInfo ü Ѵ. + // 아우스터즈 PCInfo 객체를 생성한다. PCOustersInfo* pPCOustersInfo = new PCOustersInfo(); - // ʵ尪 Ѵ. + // 각 필드값을 지정한다. uint i = 0; pPCOustersInfo->setName(pResult2->getString(++i)); @@ -1008,11 +1008,11 @@ void LoginPlayer::makePCList(LCPCList& lcPCList) { } } - // ü Ѵ. + // 쿼리 결과 및 쿼리문 객체를 삭제한다. SAFE_DELETE(pStmt); SAFE_DELETE(pStmt2); } catch (SQLQueryException& sce) { - // ü Ѵ. + // 쿼리 결과 및 쿼리문 객체를 삭제한다. SAFE_DELETE(pStmt); SAFE_DELETE(pStmt2); diff --git a/src/server/loginserver/LoginPlayer.h b/src/server/loginserver/LoginPlayer.h index 18855c3b..9987a4b5 100644 --- a/src/server/loginserver/LoginPlayer.h +++ b/src/server/loginserver/LoginPlayer.h @@ -2,7 +2,7 @@ // // Filename : LoginPlayer.h // Written by : reiot@ewestsoft.com -// Description : ÷̾ Ŭ +// Description : 게임 서버용 플레이어 클래스 // ////////////////////////////////////////////////////////////////////// @@ -28,22 +28,22 @@ class LCPCList; // // class LoginPlayer // -// ÷̾ Ŭ +// 게임 서버용 플레이어 클래스 // -// Player Ŭ ӹ޾Ƽ, Ǵ Mutex -// Creature ޽, PreviousPacket -// ޼ҵ ߰ߴ. +// Player 클래스를 상속받아서, 게임 서버에서만 사용되는 Mutex 및 +// Creature 관련 데이터 및 메쏘드, PreviousPacket 관련 데이터 및 +// 메소드들을 추가했다. // -// Ư processOutput() sendPacket() Race Condition ߻ -// Ƿ, Mutex ȣǾ Ѵ. ( MODE-IV ̸, MODE-I, II -// 쿡 processInput(), processCommand() Mutex ȣؾ -// Ѵ.) +// 특히 processOutput() 및 sendPacket()은 Race Condition 이 발생될 수 +// 있으므로, Mutex 로 보호되어야 한다. ( MODE-IV의 경우이며, MODE-I, II +// 의 경우에는 processInput(), processCommand() 모두 Mutex 로 보호해야 +// 한다.) // ////////////////////////////////////////////////////////////////////// class LoginPlayer : public Player, public PaySystem, public BillingPlayerInfo, public CBillingPlayerInfo { public: - // س Ŷ + // 저장해놓을 이전 패킷의 개수 static const uint nPacketHistory = 10; static const uint maxFailure = 3; @@ -68,7 +68,7 @@ class LoginPlayer : public Player, public PaySystem, public BillingPlayerInfo, p virtual void sendPacket(Packet* packet); // disconnect - // α׾ƿ disconnect(LOGOUT) + // 정식 로그아웃의 경우 disconnect(LOGOUT) virtual void disconnect(bool bDisconnected = DISCONNECTED); virtual void disconnect_nolog(bool bDisconnected = DISCONNECTED); @@ -78,11 +78,11 @@ class LoginPlayer : public Player, public PaySystem, public BillingPlayerInfo, p public: // return recent N-th packet - // ֱ ۵ N ° Ŷ Ѵ. + // 최근 전송된 N 번째 패킷을 리턴한다. Packet* getOldPacket(uint prev = 0); // return recent packet which has packetID - // Ư ID Ŷ ֱ Ŷ Ѵ. + // 특정 ID를 가진 패킷 중 가장 최근의 패킷을 리턴한다. Packet* getOldPacket(PacketID_t packetID); // get/set player's status @@ -93,7 +93,7 @@ class LoginPlayer : public Player, public PaySystem, public BillingPlayerInfo, p m_PlayerStatus = playerStatus; } - // ȸ + // 실패한 회수 uint getFailureCount() const throw() { return m_FailureCount; } @@ -115,7 +115,7 @@ class LoginPlayer : public Player, public PaySystem, public BillingPlayerInfo, p } void setExpireTimeForKickCharacter(); - // ID + // 현재 월드의 ID WorldID_t getWorldID() const throw() { return m_WorldID; } @@ -123,7 +123,7 @@ class LoginPlayer : public Player, public PaySystem, public BillingPlayerInfo, p m_WorldID = WorldID; } - // ID + // 현재 서버의 ID WorldID_t getGroupID() const throw() { return m_ServerGroupID; } @@ -131,7 +131,7 @@ class LoginPlayer : public Player, public PaySystem, public BillingPlayerInfo, p m_ServerGroupID = ServerGroupID; } - // ID + // 현재 서버의 ID uint getLastSlot() const throw() { return m_LastSlot; } @@ -139,7 +139,7 @@ class LoginPlayer : public Player, public PaySystem, public BillingPlayerInfo, p m_LastSlot = lastSlot; } - // WorldID, GroupID Ǿ? + // WorldID, GroupID가 설정되었나? bool isSetWorldGroupID() const throw() { return m_bSetWorldGroupID; } @@ -147,7 +147,7 @@ class LoginPlayer : public Player, public PaySystem, public BillingPlayerInfo, p m_bSetWorldGroupID = bSet; } - // ij ̸ + // 마지막으로 접속한 캐릭터의 이름 const string& getLastCharacterName() const throw() { return m_LastCharacterName; } @@ -213,33 +213,33 @@ class LoginPlayer : public Player, public PaySystem, public BillingPlayerInfo, p // expire time Timeval m_ExpireTime; - // ij (CLRegisterPlayer) Ǵ α(CLLogin) ȸ + // 캐릭터 등록(CLRegisterPlayer) 또는 로그인(CLLogin)에 실패한 회수 uint m_FailureCount; // mutex mutable Mutex m_Mutex; - // ID + // 현재 월드 ID bool m_bSetWorldGroupID; WorldID_t m_WorldID; ServerGroupID_t m_ServerGroupID; uint m_LastSlot; string m_LastCharacterName; - // LoginPlayerData.. T_T; + // LoginPlayerData때문에.. T_T; string m_SSN; string m_Zipcode; bool m_isAdult; - // '̹ ' ij ð + // '이미 접속 중'인 경우 캐릭터 강제 접속 해제 대기 시간 uint m_KickCharacterCount; Timeval m_ExpireTimeForKickCharacter; - // ٸ (ݸ) ޾Ҵٰ ϰ.. FreePass ޴´. - -; by sigi. 2002.10.23 + // 다른 곳에서 검증(넷마블)을 받았다고 하고.. FreePass를 받는다. - -; by sigi. 2002.10.23 bool m_bFreePass; - // α + // 웹 로그인 모드 bool m_bWebLogin; // m_gameServerIP is set in CLSelectPCHandler. diff --git a/src/server/loginserver/LoginPlayerManager.cpp b/src/server/loginserver/LoginPlayerManager.cpp index 05a057d1..2fe739c3 100644 --- a/src/server/loginserver/LoginPlayerManager.cpp +++ b/src/server/loginserver/LoginPlayerManager.cpp @@ -2,7 +2,7 @@ // // Filename : LoginPlayerManager.cpp // Written by : reiot@ewestsoft.com -// Description : α Ŭ̾Ʈ Ŵ +// Description : 로그인 서버용 클라이언트 매니저 // ////////////////////////////////////////////////////////////////////// @@ -28,7 +28,7 @@ // // constructor // -// Ŵ ü ϴ ̴. (׷, . - -;) +// 하위 매니저 객체를 생성하는 곳이다. (그런데, 없다. - -;) // ////////////////////////////////////////////////////////////////////// LoginPlayerManager::LoginPlayerManager() : m_pServerSocket(NULL), m_ServerFD(INVALID_SOCKET), m_MinFD(-1), m_MaxFD(-1) { @@ -46,7 +46,7 @@ LoginPlayerManager::LoginPlayerManager() : m_pServerSocket(NULL), m_ServerFD(INV // // destructor // -// Ŵ ü ϴ ̴. (׷, . - -;) +// 하위 매니저 객체를 삭제하는 곳이다. (그런데, 없다. - -;) // ////////////////////////////////////////////////////////////////////// LoginPlayerManager::~LoginPlayerManager() { @@ -58,8 +58,8 @@ LoginPlayerManager::~LoginPlayerManager() { m_pServerSocket = NULL; } - // base class PlayerManager destructor ÷̾ - // , ü ϹǷ Ű澲 ʾƵ ȴ. + // base class인 PlayerManager의 destructor에서 접속한 모든 플레이어들의 + // 연결을 끊고, 객체를 삭제하므로 신경쓰지 않아도 된다. // if (g_pReconnectLoginInfoManager != NULL) { delete g_pReconnectLoginInfoManager; @@ -72,18 +72,18 @@ LoginPlayerManager::~LoginPlayerManager() { ////////////////////////////////////////////////////////////////////// // -// Ŵ ü ʱȭϰ, ڽ ʱȭѴ. +// 하위 매니저 객체를 초기화하고, 자신을 초기화한다. // ////////////////////////////////////////////////////////////////////// void LoginPlayerManager::init() { __BEGIN_TRY - // εɶ õ + // 바인드될때까지 재시도 while (1) { try { - // Ѵ. + // 서버 소켓을 생성한다. m_pServerSocket = new ServerSocket(g_pConfig->getPropertyInt("LoginServerPort")); - // εǸ . + // 정상적으로 바인드되면 나간다. break; } catch (BindException& be) { SAFE_DELETE(m_pServerSocket); @@ -92,28 +92,28 @@ void LoginPlayerManager::init() { } } - // ũ͸ Ѵ. + // 서버 소켓 디스크립터를 지정한다. m_ServerFD = m_pServerSocket->getSOCKET(); - // fd_set 0 ʱȭѴ. + // fd_set 들을 0 으로 초기화한다. FD_ZERO(&m_ReadFDs[0]); FD_ZERO(&m_WriteFDs[0]); FD_ZERO(&m_ExceptFDs[0]); - // Ҵ. + // 서버 소켓을 켠다. FD_SET(m_ServerFD, &m_ReadFDs[0]); // set min/max fd m_MaxFD = m_MinFD = m_ServerFD; - // m_Timeout ʱȭѴ. - // ߿ ֱ ɼ óϵ . - // ZonePlayerManager ؼ  ϴ..... + // m_Timeout 을 초기화한다. + // 나중에는 이 주기 역시 옵션으로 처리하도록 하자. + // ZonePlayerManager에 비해서 길어도 무방하다..... m_Timeout[0].tv_sec = 0; m_Timeout[0].tv_usec = 0; //-------------------------------------------------------------------------------- - // Player.LogOn ش. + // Player.LogOn 를 정리해준다. //-------------------------------------------------------------------------------- Statement* pStmt = NULL; Statement* pStmt2 = NULL; @@ -125,8 +125,8 @@ void LoginPlayerManager::init() { pStmt->executeQuery("SELECT PlayerID from Player WHERE LogOn = 'LOGON' AND CurrentLoginServerID=%d", g_pConfig->getPropertyInt("LoginServerID")); - // ׹濡 ֵ ش. - // ~ by sigi 2002.5.31 + // 겜방에서 놀던애들 정리해준다. + // 빌링~ by sigi 2002.5.31 while (pResult->next()) { string playerID = pResult->getString(1); @@ -152,30 +152,30 @@ void LoginPlayerManager::init() { } ////////////////////////////////////////////////////////////////////// -// select() ؼ I/O Multiplexing Ѵ. +// select()를 사용해서 I/O Multiplexing 을 한다. ////////////////////////////////////////////////////////////////////// void LoginPlayerManager::select() { __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) - // m_Timeout[0] m_Timeout[1] Ѵ. + // m_Timeout[0] 을 m_Timeout[1] 으로 복사한다. m_Timeout[1].tv_sec = m_Timeout[0].tv_sec; m_Timeout[1].tv_usec = m_Timeout[0].tv_usec; - // m_XXXFDs[0] m_XXXFDs[1] Ѵ. + // m_XXXFDs[0] 을 m_XXXFDs[1] 으로 복사한다. m_ReadFDs[1] = m_ReadFDs[0]; m_WriteFDs[1] = m_WriteFDs[0]; m_ExceptFDs[1] = m_ExceptFDs[0]; try { - // m_XXXFDs[1] select() ȣѴ. + // 이제 m_XXXFDs[1] 을 가지고 select() 를 호출한다. SocketAPI::select_ex(m_MaxFD + 1, &m_ReadFDs[1], &m_WriteFDs[1], &m_ExceptFDs[1], &m_Timeout[1]); } catch (TimeoutException) { // do nothing } catch (InterruptedException& ie) { - // ñ׳ ~~ + // 시그널이 올 리가 엄찌~~ log(LOG_LOGINSERVER, "", "", ie.toString()); } @@ -185,7 +185,7 @@ void LoginPlayerManager::select() { } ////////////////////////////////////////////////////////////////////// -// Ȥø OOB Ÿ óѴ. +// 혹시모를 OOB 데이타를 처리한다. ////////////////////////////////////////////////////////////////////// void LoginPlayerManager::processExceptions() { __BEGIN_TRY @@ -201,13 +201,13 @@ void LoginPlayerManager::processExceptions() { log(LOG_LOGINSERVER_ERROR, "", "", msg.toString()); cout << msg.toString() << endl; - // ۸ ÷Ѵ. + // 출력 버퍼를 플러시한다. m_pPlayers[i]->disconnect(UNDISCONNECTED); - // ÷̾ ü Ѵ. + // 플레이어 객체를 삭제한다. delete m_pPlayers[i]; - // ÷̾ Ŵ ÷̾ Ѵ. + // 플레이어 매니저에서 플레이어를 삭제한다. deletePlayer_NOLOCKED(i); } } @@ -218,7 +218,7 @@ void LoginPlayerManager::processExceptions() { } ////////////////////////////////////////////////////////////////////// -// ÷̾ Է Է ۿ Ѵ. +// 접속한 모든 플레이어들의 입력을 각자의 입력 버퍼에 복사한다. ////////////////////////////////////////////////////////////////////// void LoginPlayerManager::processInputs() { __BEGIN_TRY @@ -228,7 +228,7 @@ void LoginPlayerManager::processInputs() { for (int i = m_MinFD; i <= m_MaxFD; i++) { if (FD_ISSET(i, &m_ReadFDs[1])) { if (i == m_ServerFD) { - // , ο Դٴ ̴. + // 서버 소켓일 경우, 새로운 접속이 들어왔다는 뜻이다. acceptNewConnection(); } else { @@ -236,31 +236,31 @@ void LoginPlayerManager::processInputs() { try { if (m_pPlayers[i]->getSocket()->getSockError()) { - // ̹ ̹Ƿ, ۸ ÷ ʾƾ Ѵ. + // 이미 연결이 끊긴 상태이므로, 출력 버퍼를 플러시하지 않아야 한다. m_pPlayers[i]->disconnect(DISCONNECTED); - // ÷̾ ü Ѵ. + // 플레이어 객체를 삭제한다. delete m_pPlayers[i]; - // ÷̾ Ŵ ÷̾ Ѵ. + // 플레이어 매니저에서 플레이어를 삭제한다. deletePlayer_NOLOCKED(i); } else { m_pPlayers[i]->processInput(); } } catch (ConnectException& ce) { - // Blocking ̹Ƿ ConnectException Error  ܵ ߻ ʴ´. + // Blocking 소켓이므로 ConnectException 과 Error를 제외한 어떤 예외도 발생하지 않는다. cout << ce.toString() << endl; log(LOG_LOGINSERVER_ERROR, "", ce.toString()); - // ̹ ̹Ƿ, ۸ ÷ ʾƾ Ѵ. + // 이미 연결이 끊긴 상태이므로, 출력 버퍼를 플러시하지 않아야 한다. m_pPlayers[i]->disconnect(DISCONNECTED); - // ÷̾ ü Ѵ. + // 플레이어 객체를 삭제한다. delete m_pPlayers[i]; - // ÷̾ Ŵ ÷̾ Ѵ. + // 플레이어 매니저에서 플레이어를 삭제한다. deletePlayer_NOLOCKED(i); } } @@ -273,15 +273,15 @@ void LoginPlayerManager::processInputs() { } ////////////////////////////////////////////////////////////////////// -// ÷̾ Է Ŷ óѴ. +// 접속한 모든 플레이어들의 입력 패킷을 처리한다. ////////////////////////////////////////////////////////////////////// void LoginPlayerManager::processCommands() { __BEGIN_TRY __ENTER_CRITICAL_SECTION(m_Mutex) - // m_pPlayers[i] != NULL Ȯ i != m_ServerFD Ƿ - // տٰ д. + // m_pPlayers[i] != NULL 의 확률이 i != m_ServerFD 보다 높으므로 + // 이 조건을 앞에다가 둔다. for (int i = m_MinFD; i <= m_MaxFD; i++) { if (m_pPlayers[i] != NULL && i != m_ServerFD) { @@ -290,8 +290,8 @@ void LoginPlayerManager::processCommands() { // LoginPlayer* pLoginPlayer = dynamic_cast(m_pPlayers[i]); - // ýۿ ʾҴٸ.. - // ѹ Ա ɷ . ֵ() û. by bezz. 2003.04.21 + // 아직 빌링 시스템에서 검증되지 않았다면.. + // 한번만 보내고 게기는 걸로 수정. 애드빌(박정수) 요청. by bezz. 2003.04.21 // if (!pLoginPlayer->isBillingLoginVerified()) //{ // pLoginPlayer->sendBillingLogin(); @@ -301,15 +301,15 @@ void LoginPlayerManager::processCommands() { m_pPlayers[i]->processCommand(); } catch (ProtocolException& pe) { //-------------------------------------------------- - // ProtocolException 3 ִ. + // ProtocolException의 종류에는 3 가지가 있다. // - // - InvalidProtocolException : - // - DisconnectException : Ŵ - // - InsufficiendDataException : Ŷ κθ + // - InvalidProtocolException : 프로토콜 에러 + // - DisconnectException : 연결을 종료시킴 + // - InsufficiendDataException : 패킷이 부분적으로만 도착했음 // - // Ŭ̾Ʈ ӵǾ ִ - // ̹Ƿ, disconnect UNDISCONNECTED Ķ͸ ؼ - // ۸ ÷ Ѵ. + // 이 모두 클라이언트와의 연결이 지속되어 있는 상태 + // 이므로, disconnect시 UNDISCONNECTED 파라미터를 사용해서 + // 출력 버퍼를 플러시해줘야 한다. // //-------------------------------------------------- @@ -318,23 +318,23 @@ void LoginPlayerManager::processCommands() { m_pPlayers[i]->disconnect(UNDISCONNECTED); - // ÷̾ ü Ѵ. + // 플레이어 객체를 삭제한다. delete m_pPlayers[i]; - // ÷̾ Ŵ ÷̾ Ѵ. + // 플레이어 매니저에서 플레이어를 삭제한다. deletePlayer_NOLOCKED(i); } - // 輺ο ߰... + // 김성민에 의해 추가... catch (ConnectException& ce) { cout << ce.toString() << endl; log(LOG_LOGINSERVER_ERROR, "", "", ce.toString()); m_pPlayers[i]->disconnect(DISCONNECTED); - // ÷̾ ü Ѵ. + // 플레이어 객체를 삭제한다. delete m_pPlayers[i]; - // ÷̾ Ŵ ÷̾ Ѵ. + // 플레이어 매니저에서 플레이어를 삭제한다. deletePlayer_NOLOCKED(i); } } @@ -346,7 +346,7 @@ void LoginPlayerManager::processCommands() { } ////////////////////////////////////////////////////////////////////// -// ÷̾ Ŭ̾Ʈ Ѵ. +// 접속한 모든 플레이어들의 출력을 클라이언트로 전송한다. ////////////////////////////////////////////////////////////////////// void LoginPlayerManager::processOutputs() { __BEGIN_TRY @@ -364,26 +364,26 @@ void LoginPlayerManager::processOutputs() { cout << ce.toString() << endl; log(LOG_LOGINSERVER_ERROR, "", "", ce.toString()); - // ̹ ̹Ƿ, ۸ ÷ ʾƾ Ѵ. + // 이미 연결이 끊긴 상태이므로, 출력 버퍼를 플러시하지 않아야 한다. m_pPlayers[i]->disconnect(DISCONNECTED); - // ÷̾ ü Ѵ. + // 플레이어 객체를 삭제한다. delete m_pPlayers[i]; - // ÷̾ Ŵ ÷̾ Ѵ. + // 플레이어 매니저에서 플레이어를 삭제한다. deletePlayer_NOLOCKED(i); } catch (ProtocolException& pe) { cout << pe.toString() << endl; log(LOG_LOGINSERVER_ERROR, "", "", pe.toString()); - // ̹ ̹Ƿ, ۸ ÷ ʾƾ Ѵ. + // 이미 연결이 끊긴 상태이므로, 출력 버퍼를 플러시하지 않아야 한다. m_pPlayers[i]->disconnect(DISCONNECTED); - // ÷̾ ü Ѵ. + // 플레이어 객체를 삭제한다. delete m_pPlayers[i]; - // ÷̾ Ŵ ÷̾ Ѵ. + // 플레이어 매니저에서 플레이어를 삭제한다. deletePlayer_NOLOCKED(i); } } @@ -399,18 +399,18 @@ void LoginPlayerManager::processOutputs() { // // accept new connection // -// select ݿ nonblocking ʴ´. +// select 기반에서는 nonblocking 소켓을 사용하지 않는다. // -// α ⺻ õ ޾Ƶδ. -// BAN DB ϵ IPκ ޾Ƶ ʴ´. +// 로그인 서버는 기본적으로 모든 연결시도를 받아들인다. +// 단 BAN DB에 등록된 IP로부터의 연결은 받아들이지 않는다. // ////////////////////////////////////////////////////////////////////// void LoginPlayerManager::acceptNewConnection() { __BEGIN_TRY - // ŷ connection ٸ - // ϵǴ NULL . - // NonBlockingIOException ߻ . + // 블록킹 방식으로 connection을 기다릴 경우 + // 리턴되는 값은 절대 NULL이 될 수 없다. + // 또한 NonBlockingIOException도 발생할 수 없다. Socket* client = NULL; try { @@ -418,9 +418,9 @@ void LoginPlayerManager::acceptNewConnection() { } catch (Throwable& t) { } - // ConnectException ߻ ɼ ִ. ( ߻ߴ.) - // ο CE ߻ , NULL ϱ .. - // NULL üũؼ, Ѵ. + // ConnectException 이 발생할 가능성이 있다. (실제로 발생했다.) + // 현재 내부에서 CE 가 발새할 경우, NULL 을 리턴하기 때문에.. + // NULL 을 체크해서, 무시해줘야 한다. if (client == NULL) return; @@ -444,7 +444,7 @@ void LoginPlayerManager::acceptNewConnection() { cerr << "NEW CONNECTION FROM " << client->getHost() << ":" << client->getPort() << endl; //-------------------------------------------------- - // BAN DB ؼ IP ùٸ Ȯغ. + // BAN DB에 쿼리해서 현재 IP가 올바른지 확인해본다. //-------------------------------------------------- /* if ( g_pBanManager->isBanned( client->getHost() ) ) { @@ -458,14 +458,14 @@ void LoginPlayerManager::acceptNewConnection() { // set socket option ( !NonBlocking, NoLinger ) client->setLinger(0); - // Ŭ̾Ʈ Ķͷ ؼ ÷̾ ü Ѵ. + // 클라이언트 소켓을 파라미터로 사용해서 플레이어 객체를 생성한다. LoginPlayer* pPlayer = new LoginPlayer(client); // set player status to PLAYER_LOGON Assert(pPlayer->getPlayerStatus() == LPS_NONE); pPlayer->setPlayerStatus(LPS_BEGIN_SESSION); - // LoginPlayerManager Ѵ. + // LoginPlayerManager에 등록한다. addPlayer_NOLOCKED(pPlayer); __END_CATCH @@ -473,10 +473,10 @@ void LoginPlayerManager::acceptNewConnection() { ////////////////////////////////////////////////////////////////////// // -// Ư ÷̾ Ŵ ߰Ѵ. +// 특정 플레이어를 매니저에 추가한다. // -// α ÷̾ 迭 ؼ 尡 Ƿ -// locking ʿ䰡 . +// 로그인 서버에서는 플레이어 배열에 대해서 따로 쓰레드가 돌지 않으므로 +// locking 을 할 필요가 없다. // ////////////////////////////////////////////////////////////////////// void LoginPlayerManager::addPlayer_NOLOCKED(Player* pPlayer) { @@ -486,12 +486,12 @@ void LoginPlayerManager::addPlayer_NOLOCKED(Player* pPlayer) { SOCKET fd = pPlayer->getSocket()->getSOCKET(); - // m_MinFD , m_MaxFD Ѵ. + // m_MinFD , m_MaxFD 를 재조정한다. m_MinFD = min(fd, m_MinFD); m_MaxFD = max(fd, m_MaxFD); - // fd_set fd Ʈ on Ų. - // m_XXXFDs[1] óָ ȴ. + // 모든 fd_set 에 fd 비트를 on 시킨다. + // m_XXXFDs[1] 은 다음번에 처리해주면 된다. FD_SET(fd, &m_ReadFDs[0]); FD_SET(fd, &m_WriteFDs[0]); FD_SET(fd, &m_ExceptFDs[0]); @@ -513,10 +513,10 @@ void LoginPlayerManager::addPlayer(Player* pPlayer) { //-------------------------------------------------------------------------------- // -// Ư ÷̾ Ŵ Ѵ. +// 특정 플레이어를 매니저에서 삭제한다. // -// α ÷̾ 迭 ؼ 尡 Ƿ -// locking ʿ䰡 . +// 로그인 서버에서는 플레이어 배열에 대해서 따로 쓰레드가 돌지 않으므로 +// locking 을 할 필요가 없다. // //-------------------------------------------------------------------------------- void LoginPlayerManager::deletePlayer_NOLOCKED(SOCKET fd) { @@ -526,11 +526,11 @@ void LoginPlayerManager::deletePlayer_NOLOCKED(SOCKET fd) { Assert(m_pPlayers[fd] == NULL); - // m_MinFD , m_MaxFD Ѵ. - // fd == m_MinFD && fd == m_MaxFD ù° if óȴ. + // m_MinFD , m_MaxFD 를 재조정한다. + // fd == m_MinFD && fd == m_MaxFD 인 경우는 첫번째 if 에서 처리된다. if (fd == m_MinFD) { - // տ fd ã´. - // m_MinFD ڸ NULL Ǿ ϶. + // 앞에서부터 제일 작은 fd 를 찾는다. + // m_MinFD 자리는 현재 NULL 이 되어 있음을 유의하라. int i = m_MinFD; for (; i <= m_MaxFD; i++) { if (m_pPlayers[i] != NULL || i == m_ServerFD) { @@ -539,15 +539,15 @@ void LoginPlayerManager::deletePlayer_NOLOCKED(SOCKET fd) { } } - // m_MinFD ã , - // ̶ m_MinFD == m_MaxFD ̴. - // ̶ -1 . + // 적절한 m_MinFD를 찾지 못했을 경우, + // 이때에는 m_MinFD == m_MaxFD 인 경우이다. + // 이때에는 둘 다 -1 로 설정해주자. if (i > m_MaxFD) m_MinFD = m_MaxFD = -1; } else if (fd == m_MaxFD) { - // ڿ ū fd ã´. - // ServerFD ! ( ServerFD Player ʹ NULL ̴. ) + // 뒤에서부터 가장 큰 fd 를 찾는다. + // ServerFD 에 유의할 것! ( ServerFD 의 경우 Player 포인터는 NULL 이다. ) int i = m_MaxFD; for (; i >= m_MinFD; i--) { if (m_pPlayers[i] != NULL || i == m_ServerFD) { @@ -556,15 +556,15 @@ void LoginPlayerManager::deletePlayer_NOLOCKED(SOCKET fd) { } } - // m_MinFD ã , + // 적절한 m_MinFD를 찾지 못했을 경우, if (i < m_MinFD) { throw UnknownError("m_MinFD & m_MaxFD problem."); } } - // fd_set fd Ʈ off Ų. - // m_XXXFDs[1] ľ ϴ , ó ü µ - // ó Ȯ ֱ ̴. + // 모든 fd_set 에 fd 비트를 off 시킨다. + // m_XXXFDs[1]도 고쳐야 하는 이유는, 이후 처리에서 객체가 없어졌는데도 + // 처리받을 확률이 있기 때문이다. FD_CLR(fd, &m_ReadFDs[0]); FD_CLR(fd, &m_ReadFDs[1]); FD_CLR(fd, &m_WriteFDs[0]); @@ -587,7 +587,7 @@ void LoginPlayerManager::deletePlayer(SOCKET fd) { //---------------------------------------------------------------------- -// α Ư ÷̾ ˻Ѵ. +// 로그인 서버에 접속한 특정 플레이어를 검색한다. //---------------------------------------------------------------------- LoginPlayer* LoginPlayerManager::getPlayer_NOLOCKED(const string& id) const { __BEGIN_TRY @@ -611,7 +611,7 @@ LoginPlayer* LoginPlayerManager::getPlayer_NOLOCKED(const string& id) const { } if (pLoginPlayer == NULL) - throw NoSuchElementException("׷ ̵ ÷̾ ʽϴ."); + throw NoSuchElementException("그런 아이디를 가진 플레이어는 존재하지 않습니다."); return pLoginPlayer; @@ -635,7 +635,7 @@ LoginPlayer* LoginPlayerManager::getPlayer(const string& id) const { //-------------------------------------------------------------------------------- -// α ÷̾鿡 Ư Ŷ Ѵ. +// 로그인 서버에 접속한 모든 플레이어들에게 특정 패킷을 전송한다. //-------------------------------------------------------------------------------- void LoginPlayerManager::broadcastPacket(Packet* pPacket) { __BEGIN_TRY @@ -651,7 +651,7 @@ void LoginPlayerManager::broadcastPacket(Packet* pPacket) { //-------------------------------------------------------------------------------- -// α Ư ÷̾ Ư Ŷ . +// 로그인 서버에 접속한 특정 플레이어에게 특정 패킷을 보낸다. //-------------------------------------------------------------------------------- void LoginPlayerManager::sendPacket(const string& id, Packet* pPacket) { __BEGIN_TRY diff --git a/src/server/loginserver/LoginPlayerManager.h b/src/server/loginserver/LoginPlayerManager.h index 89eccfab..ebbcbcda 100644 --- a/src/server/loginserver/LoginPlayerManager.h +++ b/src/server/loginserver/LoginPlayerManager.h @@ -2,7 +2,7 @@ // // Filename : LoginPlayerManager.h // Written by : reiot@ewestsoft.com -// Description : α α ÷̾ Ŵ +// Description : 로그인 서버용 로그인 플레이어 매니저 // ////////////////////////////////////////////////////////////////////// @@ -21,7 +21,7 @@ class LoginPlayer; // // class LoginPlayerManager; // -// α ÷̾ Ѵ. +// 로그인 서버에 접속한 모든 플레이어들을 관리한다. // ////////////////////////////////////////////////////////////////////// @@ -34,43 +34,43 @@ class LoginPlayerManager : public PlayerManager { ~LoginPlayerManager(); public: - // Ŭ̾Ʈ Ŵ ʱȭѴ. + // 클라이언트 매니저를 초기화한다. void init(); // accept new connection void acceptNewConnection(); - // select() ý ؼ I/O Multiplexing Ѵ. + // select() 시스템콜을 사용해서 I/O Multiplexing을 한다. void select(); - // Է Է ۷ Ѵ. + // 접속한 모든 사용자의 입력을 입력 버퍼로 복사한다. void processInputs(); - // Ŭ̾Ʈ Ѵ. + // 접속한 모든 사용자의 출력을 클라이언트로 전송한다. void processOutputs(); - // Ŷ óѴ. + // 접속한 모든 사용자의 패킷을 처리한다. void processCommands(); - // OOB Ÿ óѴ. ^^; + // OOB 데이타를 처리한다. ^^; void processExceptions(); public: - // α ÷̾鿡 Ư Ŷ Ѵ. + // 로그인 서버에 접속한 모든 플레이어들에게 특정 패킷을 전달한다. void broadcastPacket(Packet* pPacket); - // Ư ̵ ÷̾ Ư Ŷ Ѵ. + // 특정 아이디의 플레이어에게 특정 패킷을 전달한다. void sendPacket(const string& id, Packet* pPacket); - // ÷̾ ü ߰Ѵ. + // 플레이어 객체를 추가한다. void addPlayer(Player* pPlayer); void addPlayer_NOLOCKED(Player* pPlayer); - // ÷̾ ü Ѵ. + // 플레이어 객체를 삭제한다. void deletePlayer(SOCKET fd); void deletePlayer_NOLOCKED(SOCKET fd); - // ÷̾ ü Ѵ. + // 플레이어 객체에 접근한다. LoginPlayer* getPlayer(const string& PCName) const; LoginPlayer* getPlayer_NOLOCKED(const string& PCName) const; @@ -86,34 +86,34 @@ class LoginPlayerManager : public PlayerManager { string toString() const; private: - // + // 서버 소켓 ServerSocket* m_pServerSocket; - // ũ ( for fast reference ) + // 서버 소켓 디스크립터 ( for fast reference ) SOCKET m_ServerFD; - // Ҽӵ ÷̾ ũ ̴. - // m_XXXXFDs[0] ̸, m_XXXFDs[1] select() Ķͷ ȴ. - // select()ϱ [0] -> [1] 簡 ̷ Ѵ. + // 소속된 플레이어들의 소켓 디스크립터의 집합이다. + // m_XXXXFDs[0]은 저장용이며, m_XXXFDs[1]이 실제로 select()의 파라미터로 사용된다. + // 즉 select()하기 전에 [0] -> [1] 로 복사가 이루어져야 한다. fd_set m_ReadFDs[2]; fd_set m_WriteFDs[2]; fd_set m_ExceptFDs[2]; - // select Ǵ ð + // select에 사용되는 시간 Timeval m_Timeout[2]; // min_fd , max_fd - // select() iterating ӵ ؼ Ѵ. - // select() ù° Ķ͸ ϱ ؼ Ѵ. + // select()후 iterating 할 때 속도 증가를 위해서 사용한다. + // 또한 select()의 첫번째 파라미터를 계산하기 위해서 사용한다. SOCKET m_MinFD; SOCKET m_MaxFD; - // α ȴ. - // , mutex ʾƵ ó .. - // Ӽκ ͱ׷ ޾Ƽ óϴ ƾ - // ȴ. , 尡 LPM - // ÷̾ 迭 manipulate ߻ - // ɼ . - -; + // 로그인 서버의 메인 루프는 단일 쓰레드로 구현된다. + // 따라서, mutex 를 사용하지 않아도 될 것처럼 보이지만.. + // 게임서버로부터 데이터그램을 받아서 처리하는 루틴은 + // 독립적인 쓰레드로 구현된다. 즉, 이 쓰레드가 LPM의 + // 플레이어 배열을 manipulate할 때 경쟁조건이 발생할 + // 가능성이 높다. - -; mutable Mutex m_Mutex; }; diff --git a/src/server/loginserver/LoginServer.cpp b/src/server/loginserver/LoginServer.cpp index 99b3694d..e688905a 100644 --- a/src/server/loginserver/LoginServer.cpp +++ b/src/server/loginserver/LoginServer.cpp @@ -2,7 +2,7 @@ // // Filename : LoginServer.cpp // Written By : reiot@ewestsoft.com -// Description : α Ŭ +// Description : 로그인 서버용 메인 클래스 // ////////////////////////////////////////////////////////////////////// @@ -36,7 +36,7 @@ // // constructor // -// ý Ŵ constructor Ŵ ü Ѵ. +// 시스템 매니저의 constructor에서는 하위 매니저 객체를 생성한다. // ////////////////////////////////////////////////////////////////////// LoginServer::LoginServer() throw(Error) { @@ -53,7 +53,7 @@ LoginServer::LoginServer() throw(Error) { g_pZoneGroupInfoManager = new ZoneGroupInfoManager(); // create packet factory manager, packet validator - // (Ŭ̾Ʈ Ŵ ŸŴ , ʱȭǾ Ѵ.) + // (클라이언트 매니저와 서버간통신매니저보다 먼저 생성, 초기화되어야 한다.) g_pPacketFactoryManager = new PacketFactoryManager(); g_pPacketValidator = new PacketValidator(); @@ -72,14 +72,14 @@ LoginServer::LoginServer() throw(Error) { // create GameWorldInfoManager g_pGameWorldInfoManager = new GameWorldInfoManager(); - // login Ѵ. - // ֵ û. by bezz 2003.04.22 + // login 서버에서는 빌링을 빼기로 한다. + // 애드빌 요청. by bezz 2003.04.22 // #ifdef __CONNECT_BILLING_SYSTEM__ // create GameWorldInfoManager // g_pBillingPlayerManager = new BillingPlayerManager(); // #endif - // ߱ + // 중국 빌링 #ifdef __CONNECT_CBILLING_SYSTEM__ // create CBillingPlayerManager g_pCBillingPlayerManager = new CBillingPlayerManager(); @@ -98,7 +98,7 @@ LoginServer::LoginServer() throw(Error) { // // destructor // -// ý Ŵ destructor Ŵ ü ؾ Ѵ. +// 시스템 매니저의 destructor에서는 하위 매니저 객체를 삭제해야 한다. // ////////////////////////////////////////////////////////////////////// LoginServer::~LoginServer() throw(Error) { @@ -156,8 +156,8 @@ LoginServer::~LoginServer() throw(Error) { g_pGameWorldInfoManager = NULL; } - // login Ѵ. - // ֵ û. by bezz 2003.04.22 + // login 서버에서는 빌링을 빼기로 한다. + // 애드빌 요청. by bezz 2003.04.22 // #ifdef __CONNECT_BILLING_SYSTEM__ // if ( g_pBillingPlayerManager != NULL ) { // delete g_pBillingPlayerManager; @@ -165,7 +165,7 @@ LoginServer::~LoginServer() throw(Error) { //} // #endif - // ߱ + // 중국 빌링 #ifdef __CONNECT_CBILLING_SYSTEM__ // destroy CBillingPlayerManager if (g_pCBillingPlayerManager != NULL) { @@ -195,7 +195,7 @@ LoginServer::~LoginServer() throw(Error) { void LoginServer::init() throw(Error) { __BEGIN_TRY - // Ÿ̽Ŵ ʱȭѴ. + // 데이타베이스매니저를 초기화한다. g_pDatabaseManager->init(); // initialize some info managers @@ -206,25 +206,25 @@ void LoginServer::init() throw(Error) { g_pGameWorldInfoManager->init(); - // Ŭ̾ƮŴ ʱȭϱ , Ŷ丮Ŵ/Ŷ߸͸ ʱȭѴ. + // 클라이언트매니저를 초기화하기 전에, 패킷팩토리매니저/패킷발리데이터를 초기화한다. g_pPacketFactoryManager->init(); g_pPacketValidator->init(); g_pUserInfoManager->init(); - // Ŵ ʱȭѴ. + // 서버간 통신 매니저를 초기화한다. g_pGameServerManager->init(); - // login Ѵ. - // ֵ û. by bezz 2003.04.22 + // login 서버에서는 빌링을 빼기로 한다. + // 애드빌 요청. by bezz 2003.04.22 // #ifdef __CONNECT_BILLING_SYSTEM__ - // غ + // 빌링 서버 접속 준비 // g_pBillingPlayerManager->init(); // #endif - // ߱ + // 중국 빌링 #ifdef __CONNECT_CBILLING_SYSTEM__ - // ߱ غ + // 중국 빌링 서버 접속 준비 g_pCBillingPlayerManager->init(); #endif @@ -234,8 +234,8 @@ void LoginServer::init() throw(Error) { #endif - // غ Ŭ̾ƮŴ ʱȭν, - // Ʈŷ Ѵ. + // 만반의 준비가 끝이 나면 이제 클라이언트매니저를 초기화함으로써, + // 네트워킹에 대비한다. g_pClientManager->init(); __END_CATCH @@ -250,29 +250,29 @@ void LoginServer::init() throw(Error) { void LoginServer::start() throw(Error) { __BEGIN_TRY - // Ŵ Ѵ. + // 서버간 통신 매니저를 시작한다. g_pGameServerManager->start(); - // login Ѵ. - // ֵ û. by bezz 2003.04.22 + // login 서버에서는 빌링을 빼기로 한다. + // 애드빌 요청. by bezz 2003.04.22 // #ifdef __CONNECT_BILLING_SYSTEM__ // g_pBillingPlayerManager->start(); // #endif -// ߱ +// 중국 빌링 #ifdef __CONNECT_CBILLING_SYSTEM__ - // ߱ + // 중국 빌링 서버 돌려 g_pCBillingPlayerManager->start(); #endif // - // Ŭ̾Ʈ Ŵ Ѵ. + // 클라이언트 매니저를 시작한다. // // *Reiot's Notes* // - // ߿ Ǿ Ѵ. ֳϸ Ƽ ƴ - // ѷ Լ̱ ̴. ٸ Լ - // ȣ , ʴ( ߻ ʴ) - // ٸ Ŵ ó ʴ´. + // 가장 나중에 실행되어야 한다. 왜냐하면 멀티쓰레드기반이 아닌 + // 무한루프를 가진 함수이기 때문이다. 만일 이 다음에 다른 함수를 + // 호출할 경우, 루프가 끝나지 않는한(즉 에러가 발생하지 않는한) + // 다른 매니저의 처리 루프는 실행되지 않는다. // g_pClientManager->start(); @@ -284,32 +284,32 @@ void LoginServer::start() throw(Error) { // // stop login server // -// stop ϵ . ִ Ŵ -// stop Ѿ Ѵ. ݴ stop ų null pointer -// ߻ ִ. +// stop 순서에 유의하도록 하자. 가장 영향을 많이 주는 매니저부터 +// stop 시켜야 한다. 만일 반대의 순서로 stop 시킬 경우 null pointer +// 같은 현상이 발생할 수 있다. // ////////////////////////////////////////////////////////////////////// void LoginServer::stop() throw(Error) { __BEGIN_TRY - // ߿ κ ڸƮȭؾ Ѵ. + // 나중에 이 부분을 코멘트화해야 한다. throw UnsupportedError(); - // Ŭ̾Ʈ Ŵ Ŵν ̻ ʵ Ѵ. + // 가장 먼저 클라이언트 매니저를 삭제시킴으로써 더이상 새 접속을 받지 않도록 한다. g_pClientManager->stop(); // g_pGameServerManager->stop(); - // login Ѵ. - // ֵ û. by bezz 2003.04.22 + // login 서버에서는 빌링을 빼기로 한다. + // 애드빌 요청. by bezz 2003.04.22 // #ifdef __CONNECT_BILLING_SYSTEM__ // g_pBillingPlayerManager->stop(); // #endif - // ߱ + // 중국 빌링 #ifdef __CONNECT_CBILLING_SYSTEM__ - // ߱ + // 중국 빌링 서버 세워 g_pCBillingPlayerManager->stop(); #endif diff --git a/src/server/loginserver/LoginServer.h b/src/server/loginserver/LoginServer.h index 89ecd4b0..50747bce 100644 --- a/src/server/loginserver/LoginServer.h +++ b/src/server/loginserver/LoginServer.h @@ -2,14 +2,14 @@ // // Filename : LoginServer.h // Written By : reiot@ewestsoft.com -// Description : α Ŭ +// Description : 로그인 서버용 메인 클래스 // ////////////////////////////////////////////////////////////////////// #ifndef __LOGIN_SERVER_H__ #define __LOGIN_SERVER_H__ -// ԵǸ, α ȴ. +// 이 모듈이 포함되면, 로그인 서버 모듈이 된다. #ifndef __LOGIN_SERVER__ #define __LOGIN_SERVER__ #endif @@ -22,7 +22,7 @@ // // class LoginServer // -// α ü Ÿ Ŭ̴. +// 로그인 서버 자체를 나타내는 클래스이다. // ////////////////////////////////////////////////////////////////////// diff --git a/src/server/loginserver/ReconnectLoginInfo.h b/src/server/loginserver/ReconnectLoginInfo.h index 8d35e6b1..56344acb 100644 --- a/src/server/loginserver/ReconnectLoginInfo.h +++ b/src/server/loginserver/ReconnectLoginInfo.h @@ -19,7 +19,7 @@ // // class ReconnectLoginInfo; // -// ̵ ῡ Ÿ ü +// ¼­¹ö°£ À̵¿¿¡¼­ Á¤´çÇÑ ¿¬°á¿¡ ´ëÇÑ Á¤º¸¸¦ ³ªÅ¸³»´Â °´Ã¼ // //---------------------------------------------------------------------- @@ -81,7 +81,7 @@ class ReconnectLoginInfo { // PlayerID string m_PlayerID; - // expire time : ϰ ־ ϴ.. + // expire time : ¾ðÁ¦±îÁö ÀÌ Á¤º¸¸¦ À¯ÁöÇϰí ÀÖ¾î¾ß ÇÏ´ÂÁö.. Timeval m_ExpireTime; // validation key @@ -92,13 +92,13 @@ class ReconnectLoginInfo { // // CompareReconnectLoginInfo // -// priority_queue ReconnectLoginInfo ϴ Ŭ +// priority_queue ¿¡¼­ ReconnectLoginInfo ³¢¸® ºñ±³ÇÒ ¶§ »ç¿ëÇϴ Ŭ·¡½º¸ // // *CAUTION* // -// ð ̸(ð ) PQ top ġؾ Ѵ. -// PQ ascending order ̷ Ѵ. ׷ 캸⸦.. -// ð .. - -; +// ½Ã°£ÀûÀ¸·Î À̸¥(½Ã°£°ªÀÌ ÀÛÀº) ÂÊÀÌ PQ ÀÇ top ¿¡ À§Ä¡ÇØ¾ß ÇÑ´Ù. +// Áï PQ ´Â ascending order ¸¦ ÀÌ·ï¾ß ÇÑ´Ù. ¿Ö ±×·±Áö´Â Àß »ìÆìº¸±â¸¦.. +// ½Ã°£ÀÌ ¾ø´Â °ü°è·Î.. - -; // //---------------------------------------------------------------------- class CompareReconnectLoginInfo { diff --git a/src/server/loginserver/UserInfo.h b/src/server/loginserver/UserInfo.h index 6e8e936e..05ce5d4f 100644 --- a/src/server/loginserver/UserInfo.h +++ b/src/server/loginserver/UserInfo.h @@ -17,9 +17,9 @@ // // class UserInfo; // -// α ׷ ü̴. +// 로그인 서버용 존 그룹 정보 객체이다. // -//  ׷  ؼ óǴ ٷ. +// 어떤 존그룹이 어떤 서버에 의해서 처리되는지만 다룬다. // //---------------------------------------------------------------------- @@ -61,13 +61,13 @@ class UserInfo { } private: - // ID + // 월드 ID WorldID_t m_WorldID; - // + // 게임 서버 ZoneGroupID_t m_ServerGroupID; - // + // 숫자 UserNum_t m_UserNum; }; diff --git a/src/server/loginserver/ZoneGroupInfo.h b/src/server/loginserver/ZoneGroupInfo.h index 2c5a72e2..49618447 100644 --- a/src/server/loginserver/ZoneGroupInfo.h +++ b/src/server/loginserver/ZoneGroupInfo.h @@ -17,9 +17,9 @@ // // class ZoneGroupInfo; // -// α ׷ ü̴. +// 로그인 서버용 존 그룹 정보 객체이다. // -//  ׷  ؼ óǴ ٷ. +// 어떤 존그룹이 어떤 서버에 의해서 처리되는지만 다룬다. // //---------------------------------------------------------------------- @@ -52,10 +52,10 @@ class ZoneGroupInfo { } private: - // ׷ ̵ + // 존그룹 아이디 ZoneGroupID_t m_ZoneGroupID; - // + // 게임 서버 ServerID_t m_ServerID; }; diff --git a/src/server/loginserver/ZoneInfo.h b/src/server/loginserver/ZoneInfo.h index 21b0bdf5..ecf3f35b 100644 --- a/src/server/loginserver/ZoneInfo.h +++ b/src/server/loginserver/ZoneInfo.h @@ -17,9 +17,9 @@ // // class ZoneInfo; // -// α ü̴. +// 로그인 서버용 존 정보 객체이다. // -//   ׷쿡 ϴ ٷ. +// 어떤 존이 어떤 존 그룹에 속하는지만 다룬다. // //---------------------------------------------------------------------- @@ -49,10 +49,10 @@ class ZoneInfo { } private: - // ̵ + // 존 아이디 ZoneID_t m_ZoneID; - // ׷ ̵ + // 존 그룹 아이디 ZoneGroupID_t m_ZoneGroupID; }; diff --git a/src/server/loginserver/ZoneInfoManager.cpp b/src/server/loginserver/ZoneInfoManager.cpp index 5b5e58ad..8544dc9d 100644 --- a/src/server/loginserver/ZoneInfoManager.cpp +++ b/src/server/loginserver/ZoneInfoManager.cpp @@ -23,16 +23,16 @@ ZoneInfoManager::ZoneInfoManager() {} // destructor //---------------------------------------------------------------------- ZoneInfoManager::~ZoneInfoManager() { - // hashmap pair second, ZoneInfo ü ϰ - // pair ü ״ д. (ZoneInfo Ǿ ִٴ Ϳ - // ϶. ʻ ؾ Ѵ. ϱ, ZIM destruct ȴٴ - // α ˴ٿȴٴ ǹϴϱ.. - -; ) + // hashmap 안의 각 pair 의 second, 즉 ZoneInfo 객체만을 삭제하고 + // pair 자체는 그대로 둔다. (ZoneInfo가 힙에 생성되어 있다는 것에 + // 유의하라. 즉 필살삭제를 해야 한다. 하긴, ZIM이 destruct 된다는 것은 + // 로그인 서버가 셧다운된다는 것을 의미하니깐.. - -; ) for (HashMapZoneInfo::iterator itr = m_ZoneInfos.begin(); itr != m_ZoneInfos.end(); itr++) { delete itr->second; itr->second = NULL; } - // ؽʾȿ ִ pair Ѵ. + // 이제 해쉬맵안에 있는 모든 pair 들을 삭제한다. m_ZoneInfos.clear(); } @@ -72,13 +72,13 @@ void ZoneInfoManager::load() { } } catch (SQLQueryException& sqe) { - // ʻ ! + // 필살 삭제! delete pStmt; throw Error(sqe.toString()); } - // ʻ ! + // 필살 삭제! delete pStmt; __END_CATCH @@ -109,10 +109,10 @@ void ZoneInfoManager::deleteZoneInfo(ZoneID_t zoneID) { HashMapZoneInfo::iterator itr = m_ZoneInfos.find(zoneID); if (itr != m_ZoneInfos.end()) { - // ZoneInfo Ѵ. + // ZoneInfo 를 삭제한다. delete itr->second; - // pair Ѵ. + // pair를 삭제한다. m_ZoneInfos.erase(itr); } else { // not found @@ -167,7 +167,7 @@ string ZoneInfoManager::toString() const { //-------------------------------------------------- // *OPTIMIZATION* // - // for_each() + // for_each()를 사용할 것 //-------------------------------------------------- for (HashMapZoneInfo::const_iterator itr = m_ZoneInfos.begin(); itr != m_ZoneInfos.end(); itr++) msg << itr->second->toString() << '\n'; diff --git a/src/server/loginserver/ZoneInfoManager.h b/src/server/loginserver/ZoneInfoManager.h index 7c0a6409..ddcd3317 100644 --- a/src/server/loginserver/ZoneInfoManager.h +++ b/src/server/loginserver/ZoneInfoManager.h @@ -22,7 +22,7 @@ typedef unordered_map HashMapZoneInfo; // // class ZoneInfoManager; // -// ̵ Ű ϴ unordered_map ִ. +// 존 아이디를 키값으로 하는 존 정보의 unordered_map 을 가지고 있다. // //---------------------------------------------------------------------- diff --git a/src/server/loginserver/main.cpp b/src/server/loginserver/main.cpp index fe591263..a253a266 100644 --- a/src/server/loginserver/main.cpp +++ b/src/server/loginserver/main.cpp @@ -2,7 +2,7 @@ // // Filename : main.cpp // Written By : reiot@ewestsoft.com -// Description : α Լ +// Description : ·Î±×ÀÎ ¼­¹ö¿ë ¸ÞÀÎ ÇÔ¼ö // ////////////////////////////////////////////////////////////////////// @@ -34,31 +34,31 @@ void memoryError() { // ////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { - // ޸ .. Լ Ѵ. + // ¸Þ¸ð¸® ¾ø´Ù.. ÇÔ¼ö¸¦ ¼³Á¤ÇÑ´Ù. set_new_handler(memoryError); if (argc < 3) { - cout << "Usage : loginserver -f ȯ [-p port]" << endl; + cout << "Usage : loginserver -f ȯ°æÆÄÀÏ [-p port]" << endl; exit(1); } - // command-line parameter string ȯѴ. ^^; + // command-line parameter¸¦ string À¸·Î º¯È¯ÇÑ´Ù. ^^; string* Argv; Argv = new string[argc]; for (int i = 0; i < argc; i++) Argv[i] = argv[i]; - // ȯ оδ. - // $VSHOME/bin, ȯ $VSHOME/conf ؾ Ѵ. - // command line ȯ ֵ Ѵ. + // ȯ°æ ÆÄÀÏÀ» ÀоîµéÀδÙ. + // ´Ü ½ÇÇà ÆÄÀÏÀº $VSHOME/bin¿¡, ȯ°æ ÆÄÀÏÀº $VSHOME/conf ¿¡ Á¸ÀçÇØ¾ß ÇÑ´Ù.½ + // command line ¿¡¼­ ȯ°æ ÆÄÀÏÀ» ÁöÁ¤ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. try { if (Argv[1] != "-f") { - throw Error("Usage : loginserver -f ȯ [-p port]"); + throw Error("Usage : loginserver -f ȯ°æÆÄÀÏ [-p port]"); } - // ù° ĶͰ -f , ι° Ķʹ ȯ ġ ȴ. + // ù¹øÂ° ÆÄ¶ó¹ÌÅͰ¡ -f ÀÏ °æ¿ì, µÎ¹øÂ° ÆÄ¶ó¹ÌÅʹ ȯ°æÆÄÀÏÀÇ À§Ä¡°¡ µÈ´Ù. g_pConfig = new Properties(); g_pConfig->load(Argv[2]); @@ -71,9 +71,9 @@ int main(int argc, char* argv[]) { try { if (argc > 3) { if (argc < 5 || Argv[3] != "-i") - throw Error("Usage : loginserver -f ȯ [-i ID]"); + throw Error("Usage : loginserver -f ȯ°æÆÄÀÏ [-i ID]"); - // port Ѵ. + // port¸¦ °­Á¦·Î ¼³Á¤ÇÑ´Ù. char sLoginServerPort[5], sLoginServerUDPPort[5], sLoginServerID[5]; sprintf(sLoginServerPort, "%d", g_pConfig->getPropertyInt("LoginServerBasePort") + atoi(argv[4])); sprintf(sLoginServerUDPPort, "%d", g_pConfig->getPropertyInt("LoginServerBaseUDPPort") + atoi(argv[4])); @@ -93,11 +93,11 @@ int main(int argc, char* argv[]) { } - // α Ŵ ϰ ʱȭ ȰȭŲ. - // α Ŵ α ʱȭ ߻ ɼ ִ - // س ϹǷ α ο ʱȭؼ ȵȴ. - // ٸ ü ϰ ʱȭϱ α׸Ŵ 켱 , - // ʱȭǾ Ѵ. + // ·Î±× ¸Å´ÏÀú¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇÑÈÄ È°¼ºÈ­½ÃŲ´Ù. + // ·Î±× ¸Å´ÏÀú´Â ·Î±×ÀÎ ¼­¹öÀÇ ÃʱâÈ­°úÁ¤¿¡¼­ ¹ß»ýÇÒ °¡´É¼ºÀÌ ÀÖ´Â ¿¡·¯±îÁöµµ + // °ËÃâÇØ³»¾ß ÇϹǷΠ·Î±×ÀÎ ¼­¹ö ³»ºÎ¿¡¼­ ÃʱâÈ­ÇØ¼­´Â ¾ÈµÈ´Ù. + // ¶ÇÇÑ ´Ù¸¥ °´Ã¼¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇϱâÀü¿¡ ·Î±×¸Å´ÏÀú°¡ ¿ì¼±ÀûÀ¸·Î »ý¼º, + // ÃʱâÈ­µÇ¾î¾ß ÇÑ´Ù. try { string LogServerIP = g_pConfig->getProperty("LogServerIP"); @@ -111,7 +111,7 @@ int main(int argc, char* argv[]) { } // - // α ü ϰ ʱȭ ȰȭŲ. + // ·Î±×ÀÎ ¼­¹ö °´Ã¼¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇÑ ÈÄ È°¼ºÈ­½ÃŲ´Ù. // try { struct rlimit rl; @@ -119,29 +119,29 @@ int main(int argc, char* argv[]) { rl.rlim_max = RLIM_INFINITY; setrlimit(RLIMIT_CORE, &rl); - // α ü Ѵ. + // ·Î±×ÀÎ ¼­¹ö °´Ã¼¸¦ »ý¼ºÇÑ´Ù. g_pLoginServer = new LoginServer(); - // α ü ʱȭѴ. + // ·Î±×ÀÎ ¼­¹ö °´Ã¼¸¦ ÃʱâÈ­ÇÑ´Ù. g_pLoginServer->init(); - // α ü ȰȭŲ. + // ·Î±×ÀÎ ¼­¹ö °´Ã¼¸¦ Ȱ¼ºÈ­½ÃŲ´Ù. g_pLoginServer->start(); } catch (Throwable& e) { - // αװ ̷ 츦 ؼ + // ·Î±×°¡ ÀÌ·ïÁö±â Àü¿¡ ¼­¹ö°¡ ³¡³¯ °æ¿ì¸¦ ´ëºñÇØ¼­ ofstream ofile("../log/instant.log", ios::out); ofile << e.toString() << endl; ofile.close(); - // ijġ Ǵ ߻ߴٴ ̴. - // LEVEL1 αؾ Ѵ. ( αѴٴ ) + // ÇÏÀ§¿¡¼­ ijġµÇÁö ¾ÊÀº ¿¹¿Ü ¶Ç´Â ¿¡·¯°¡ ¹ß»ýÇß´Ù´Â ¶æÀÌ´Ù. + // ÀÌ °æ¿ì LEVEL1·Î ·Î±×ÇØ¾ß ÇÑ´Ù. (¹«Á¶°Ç ·Î±×ÇÑ´Ù´Â ¶æ) log(LOG_LOGINSERVER_ERROR, "", "", e.toString()); - // ǥ ε ش. + // Ç¥ÁØ Ãâ·ÂÀ¸·Îµµ Ãâ·ÂÇØÁØ´Ù. cout << e.toString() << endl; - // α ߴܽŲ. - // ο Ŵ ߴܵǾ Ѵ. + // ·Î±×ÀÎ ¼­¹ö¸¦ ÁߴܽÃŲ´Ù. + // ÀÌ ³»ºÎ¿¡¼­ ÇÏÀ§ ¸Å´ÏÀú ¿ª½Ã ÁߴܵǾî¾ß ÇÑ´Ù. g_pLoginServer->stop(); } } diff --git a/src/server/pthreadAPI.cpp b/src/server/pthreadAPI.cpp index 7cdfa213..4b048174 100644 --- a/src/server/pthreadAPI.cpp +++ b/src/server/pthreadAPI.cpp @@ -30,7 +30,7 @@ void pthreadAPI::pthread_create_ex(pthread_t* thread, pthread_attr_t* attr, void if (pthread_create(thread, attr, start_routine, arg) < 0) { switch (errno) { case EAGAIN: - throw ThreadException("ý ҽ ϰų, ʹ 尡 ȰȭԴϴ."); + throw ThreadException("시스템 리소스가 부족하거나, 너무 많은 쓰레드가 활성화상태입니다."); default: throw UnknownError(strerror(errno), errno); } @@ -51,11 +51,11 @@ void pthreadAPI::pthread_join_ex(pthread_t th, void** thread_return) { if (pthread_join(th, thread_return) < 0) { switch (errno) { case ESRCH: - throw Error(" 带 ã ϴ."); + throw Error("지정된 쓰레드를 찾을 수 없습니다."); case EINVAL: - throw ThreadException(" 尡 ̹ detached Ǿų, Ǵٸ 尡 ̹ ٸ ֽϴ."); + throw ThreadException("지정된 쓰레드가 이미 detached 되었거나, 또다른 쓰레드가 이미 기다리고 있습니다."); case EDEADLK: - throw Error("ڱ ڽ ٸ ϴ."); + throw Error("자기 자신을 기다릴 수는 없습니다."); default: throw UnknownError(strerror(errno), errno); } @@ -76,9 +76,9 @@ void pthreadAPI::pthread_detach_ex(pthread_t th) { if (pthread_detach(th) < 0) { switch (errno) { case ESRCH: - throw Error(" 带 ã ϴ."); + throw Error("지정된 쓰레드를 찾을 수 없습니다."); case EINVAL: - throw ThreadException(" ̹ detached Դϴ."); + throw ThreadException("지정된 쓰레드는 이미 detached 상태입니다."); default: throw UnknownError(strerror(errno), errno); } @@ -200,7 +200,7 @@ void pthreadAPI::pthread_mutex_destroy_ex(pthread_mutex_t* mutex) { if (pthread_mutex_destroy(mutex) < 0) { switch (errno) { case EBUSY: - throw MutexException("ؽ ݻԴϴ."); + throw MutexException("뮤텍스가 현재 잠금상태입니다."); default: throw UnknownError(strerror(errno), errno); } @@ -221,9 +221,9 @@ void pthreadAPI::pthread_mutex_lock_ex(pthread_mutex_t* mutex) { if (pthread_mutex_lock(mutex) < 0) { switch (errno) { case EINVAL: - throw Error("ؽ ùٸ ʱȭ ʾҽϴ."); + throw Error("뮤텍스가 올바르게 초기화되지 않았습니다."); case EDEADLK: - throw MutexException("DEADLOCK - ؽ 忡 ؼ ̹ ֽϴ."); + throw MutexException("DEADLOCK - 뮤텍스가 현재 쓰레드에 의해서 이미 잠겨있습니다."); default: throw UnknownError(strerror(errno), errno); } @@ -244,9 +244,9 @@ void pthreadAPI::pthread_mutex_unlock_ex(pthread_mutex_t* mutex) { if (pthread_mutex_unlock(mutex) < 0) { switch (errno) { case EINVAL: - throw Error("ؽ ùٸ ʱȭ ʾҽϴ."); + throw Error("뮤텍스가 올바르게 초기화되지 않았습니다."); case EPERM: - throw MutexException(" 尡 ؽ װ ʽϴ."); + throw MutexException("현재 쓰레드가 뮤텍스를 잠그고 있지 않습니다."); default: throw UnknownError(strerror(errno), errno); } @@ -267,7 +267,7 @@ void pthreadAPI::pthread_mutex_trylock_ex(pthread_mutex_t* mutex) { if (pthread_mutex_trylock(mutex) < 0) { switch (errno) { case EINVAL: - throw Error("ؽ ùٸ ʱȭ ʾҽϴ."); + throw Error("뮤텍스가 올바르게 초기화되지 않았습니다."); case EBUSY: throw MutexException("mutex already locked..."); default: diff --git a/src/server/sharedserver/GameServerGroupInfo.h b/src/server/sharedserver/GameServerGroupInfo.h index 42413f12..30e16a88 100644 --- a/src/server/sharedserver/GameServerGroupInfo.h +++ b/src/server/sharedserver/GameServerGroupInfo.h @@ -2,7 +2,7 @@ // // Filename : GameServerGroupInfo.h // Written By : Reiot -// Description : α ִ +// Description : 로그인 서버에서 갖고 있는 각 게임 서버에 대한 정보 // //---------------------------------------------------------------------- @@ -19,8 +19,8 @@ // // class GameServerGroupInfo; // -// GAME DB GameServerGroupInfo ̺ о -// Ŭ̴. +// GAME DB의 GameServerGroupInfo 테이블에서 읽어들인 각 게임 서버의 정보를 +// 담은 클래스이다. // //---------------------------------------------------------------------- diff --git a/src/server/sharedserver/GameServerGroupInfoManager.cpp b/src/server/sharedserver/GameServerGroupInfoManager.cpp index 75cbafb9..1b630e43 100644 --- a/src/server/sharedserver/GameServerGroupInfoManager.cpp +++ b/src/server/sharedserver/GameServerGroupInfoManager.cpp @@ -24,10 +24,10 @@ GameServerGroupInfoManager::GameServerGroupInfoManager() throw() {} // destructor //---------------------------------------------------------------------- GameServerGroupInfoManager::~GameServerGroupInfoManager() throw() { - // hashmap pair second, GameServerGroupInfo ü ϰ - // pair ü ״ д. (GameServerGroupInfo Ǿ ִٴ Ϳ - // ϶. ʻ ؾ Ѵ. ϱ, GSIM destruct ȴٴ - // α ˴ٿȴٴ ǹϴϱ.. - -; ) + // hashmap 안의 각 pair 의 second, 즉 GameServerGroupInfo 객체만을 삭제하고 + // pair 자체는 그대로 둔다. (GameServerGroupInfo가 힙에 생성되어 있다는 것에 + // 유의하라. 즉 필살삭제를 해야 한다. 하긴, GSIM이 destruct 된다는 것은 + // 로그인 서버가 셧다운된다는 것을 의미하니깐.. - -; ) for (int i = 1; i < m_MaxWorldID; i++) { for (HashMapGameServerGroupInfo::iterator itr = m_GameServerGroupInfos[i].begin(); itr != m_GameServerGroupInfos[i].end(); itr++) { @@ -35,7 +35,7 @@ GameServerGroupInfoManager::~GameServerGroupInfoManager() throw() { itr->second = NULL; } - // ؽʾȿ ִ pair Ѵ. + // 이제 해쉬맵안에 있는 모든 pair 들을 삭제한다. m_GameServerGroupInfos[i].clear(); } @@ -96,11 +96,11 @@ void GameServerGroupInfoManager::load() throw(Error) { addGameServerGroupInfo(pGameServerGroupInfo, WorldID); } - // ʻ ! + // 필살 삭제! delete pStmt; } catch (SQLQueryException& sqe) { - // ʻ ! + // 필살 삭제! delete pStmt; throw Error(sqe.toString()); @@ -139,14 +139,14 @@ void GameServerGroupInfoManager::deleteGameServerGroupInfo(const ServerGroupID_t HashMapGameServerGroupInfo::iterator itr = m_GameServerGroupInfos[WorldID].find(GroupID); if (itr != m_GameServerGroupInfos[WorldID].end()) { - // GameServerGroupInfo Ѵ. + // GameServerGroupInfo 를 삭제한다. delete itr->second; - // pair Ѵ. + // pair를 삭제한다. m_GameServerGroupInfos[WorldID].erase(itr); } else { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없을 때 throw NoSuchElementException(); } @@ -162,7 +162,7 @@ GameServerGroupInfo* GameServerGroupInfoManager::getGameServerGroupInfo(const Se __BEGIN_TRY if (WorldID >= m_MaxWorldID) { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없었을 때 throw NoSuchElementException(); } @@ -173,7 +173,7 @@ GameServerGroupInfo* GameServerGroupInfoManager::getGameServerGroupInfo(const Se if (itr != m_GameServerGroupInfos[WorldID].end()) { pGameServerGroupInfo = itr->second; } else { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없었을 때 throw NoSuchElementException(); } @@ -200,7 +200,7 @@ string GameServerGroupInfoManager::toString() const throw() { //-------------------------------------------------- // *OPTIMIZATION* // - // for_each() + // for_each()를 사용할 것 //-------------------------------------------------- for (HashMapGameServerGroupInfo::const_iterator itr = m_GameServerGroupInfos[i].begin(); itr != m_GameServerGroupInfos[i].end(); itr++) diff --git a/src/server/sharedserver/GameServerGroupInfoManager.h b/src/server/sharedserver/GameServerGroupInfoManager.h index 52d1274d..47f50ac3 100644 --- a/src/server/sharedserver/GameServerGroupInfoManager.h +++ b/src/server/sharedserver/GameServerGroupInfoManager.h @@ -22,8 +22,8 @@ typedef unordered_map HashMapGameServerGr // // class GameServerGroupInfoManager; // -// ID Ű ϴ GameServerGroupInfo unordered_map -// ο ִ. +// 게임 서버의 ID 를 키값으로 하는 GameServerGroupInfo의 unordered_map 을 +// 내부에 가지고 있다. // //---------------------------------------------------------------------- diff --git a/src/server/sharedserver/GameServerInfo.h b/src/server/sharedserver/GameServerInfo.h index 67e72c3e..3740b41c 100644 --- a/src/server/sharedserver/GameServerInfo.h +++ b/src/server/sharedserver/GameServerInfo.h @@ -2,7 +2,7 @@ // // Filename : GameServerInfo.h // Written By : Reiot -// Description : α ִ +// Description : 로그인 서버에서 갖고 있는 각 게임 서버에 대한 정보 // //---------------------------------------------------------------------- @@ -19,8 +19,8 @@ // // class GameServerInfo; // -// GAME DB GameServerInfo ̺ о -// Ŭ̴. +// GAME DB의 GameServerInfo 테이블에서 읽어들인 각 게임 서버의 정보를 +// 담은 클래스이다. // //---------------------------------------------------------------------- diff --git a/src/server/sharedserver/GameServerInfoManager.cpp b/src/server/sharedserver/GameServerInfoManager.cpp index 3694cc1f..46bbd2f2 100644 --- a/src/server/sharedserver/GameServerInfoManager.cpp +++ b/src/server/sharedserver/GameServerInfoManager.cpp @@ -17,17 +17,17 @@ GameServerInfoManager::GameServerInfoManager() throw() {} GameServerInfoManager::~GameServerInfoManager() throw() { - // hashmap pair second, GameServerInfo ü ϰ - // pair ü ״ д. (GameServerInfo Ǿ ִٴ Ϳ - // ϶. ʻ ؾ Ѵ. ϱ, GSIM destruct ȴٴ - // α ˴ٿȴٴ ǹϴϱ.. - -;) + // hashmap 안의 각 pair 의 second, 즉 GameServerInfo 객체만을 삭제하고 + // pair 자체는 그대로 둔다. (GameServerInfo가 힙에 생성되어 있다는 것에 + // 유의하라. 즉 필살삭제를 해야 한다. 하긴, GSIM이 destruct 된다는 것은 + // 로그인 서버가 셧다운된다는 것을 의미하니깐.. - -;) for (int i = 0; i < m_MaxServerGroupID; i++) { HashMapGameServerInfoItor itr = m_pGameServerInfos[i].begin(); for (; itr != m_pGameServerInfos[i].end(); itr++) { SAFE_DELETE(itr->second); } - // ؽʾȿ ִ pair Ѵ. + // 이제 해쉬맵안에 있는 모든 pair 들을 삭제한다. m_pGameServerInfos[i].clear(); } @@ -56,7 +56,7 @@ void GameServerInfoManager::load() throw(Error) { WorldID_t WorldID = g_pConfig->getPropertyInt("WorldID"); - // MAX SERVER GROUP ID о鿩 Ѵ. + // 먼저 MAX SERVER GROUP ID를 읽어들여야 한다. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); Result* pResult = pStmt->executeQuery("SELECT MAX(GroupID) FROM GameServerInfo WHERE WorldID = %d", WorldID); @@ -139,13 +139,13 @@ void GameServerInfoManager::deleteGameServerInfo(const ServerID_t ServerID, HashMapGameServerInfoItor itr = m_pGameServerInfos[ServerGroupID].find(ServerID); if (itr != m_pGameServerInfos[ServerGroupID].end()) { - // GameServerInfo Ѵ. + // GameServerInfo 를 삭제한다. delete itr->second; - // pair Ѵ. + // pair를 삭제한다. m_pGameServerInfos[ServerGroupID].erase(itr); } else { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없을 때 throw NoSuchElementException(); } @@ -161,7 +161,7 @@ GameServerInfo* GameServerInfoManager::getGameServerInfo(const ServerID_t Server GameServerInfo* pGameServerInfo = NULL; if (ServerGroupID >= m_MaxServerGroupID) { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없었을 때 throw NoSuchElementException(); } @@ -170,7 +170,7 @@ GameServerInfo* GameServerInfoManager::getGameServerInfo(const ServerID_t Server if (itr != m_pGameServerInfos[ServerGroupID].end()) { pGameServerInfo = itr->second; } else { - // ׷ Ӽ ü ã + // 그런 게임서버인포 객체를 찾을 수 없었을 때 throw NoSuchElementException(); } diff --git a/src/server/sharedserver/GameServerInfoManager.h b/src/server/sharedserver/GameServerInfoManager.h index bafd81b8..c92b2a8b 100644 --- a/src/server/sharedserver/GameServerInfoManager.h +++ b/src/server/sharedserver/GameServerInfoManager.h @@ -18,9 +18,9 @@ typedef HashMapGameServerInfo::iterator HashMapGameServerInfoItor; ////////////////////////////////////////////////////////////////////////////// // class GameServerInfoManager; -// ID Ű ϴ GameServerInfo unordered_map -// ο ִ. -// World ϳ GameServerInfo . +// 게임 서버의 ID 를 키값으로 하는 GameServerInfo의 unordered_map 을 +// 내부에 가지고 있다. +// World 하나의 GameServerInfo를 가진다. ////////////////////////////////////////////////////////////////////////////// class GameServerInfoManager { diff --git a/src/server/sharedserver/GameServerManager.h b/src/server/sharedserver/GameServerManager.h index 7530519c..f6765d42 100644 --- a/src/server/sharedserver/GameServerManager.h +++ b/src/server/sharedserver/GameServerManager.h @@ -28,7 +28,7 @@ class GameServerManager : public Thread { ~GameServerManager(); public: - // 弭 ޾Ƶ̴ ִ Ӽ + // 쉐어드서버에서 받아들이는 최대 게임서버 수 const static uint nMaxGameServers = 100; // initialize @@ -74,23 +74,23 @@ class GameServerManager : public Thread { void heartbeat(); private: - // TCP ϰ ũ + // TCP 서버 소켓과 소켓 디스크립터 ServerSocket* m_pServerSocket; SOCKET m_SocketID; - // Ҽӵ ÷̾ ũ ̴. - // m_XXXXFDs[0] ̸, m_XXXFDs[1] select() Ķͷ ȴ. - // select()ϱ [0] -> [1] 簡 ̷ Ѵ. + // 소속된 플레이어들의 소켓 디스크립터의 집합이다. + // m_XXXXFDs[0]은 저장용이며, m_XXXFDs[1]이 실제로 select()의 파라미터로 사용된다. + // 즉 select()하기 전에 [0] -> [1] 로 복사가 이루어져야 한다. fd_set m_ReadFDs[2]; fd_set m_WriteFDs[2]; fd_set m_ExceptFDs[2]; - // select Ǵ ð + // select에 사용되는 시간 Timeval m_Timeout[2]; // min_fd, max_fd - // select() iterating ӵ ؼ Ѵ. - // select() ù° Ķ͸ ϱ ؼ Ѵ. + // select()후 iterating 할 때 속도 증가를 위해서 사용한다. + // 또한 select()의 첫번째 파라미터를 계산하기 위해서 사용한다. SOCKET m_MinFD; SOCKET m_MaxFD; @@ -98,7 +98,7 @@ class GameServerManager : public Thread { mutable Mutex m_Mutex; - // Ӽ 迭. ũ͸ ε Ѵ. + // 게임서버의 포인터 배열. 소켓 디스크립터를 인덱스로 사용한다. GameServerPlayer* m_pGameServerPlayers[nMaxGameServers]; }; diff --git a/src/server/sharedserver/HeartbeatManager.cpp b/src/server/sharedserver/HeartbeatManager.cpp index f619d5b9..e5bcdf90 100644 --- a/src/server/sharedserver/HeartbeatManager.cpp +++ b/src/server/sharedserver/HeartbeatManager.cpp @@ -2,7 +2,7 @@ // // Filename : HeartbeatManager.cpp // Written by : reiot@ewestsoft.com -// Description : α Ŭ̾Ʈ Ŵ +// Description : 로그인 서버용 클라이언트 매니저 // ////////////////////////////////////////////////////////////////////// @@ -17,7 +17,7 @@ // // constructor // -// Ŵ ü ϴ ̴. +// 하위 매니저 객체를 생성하는 곳이다. // ////////////////////////////////////////////////////////////////////// HeartbeatManager::HeartbeatManager() throw (Error){__BEGIN_TRY @@ -29,7 +29,7 @@ HeartbeatManager::HeartbeatManager() throw (Error){__BEGIN_TRY // // destructor // -// Ŵ ü ϴ ̴. +// 하위 매니저 객체를 삭제하는 곳이다. // ////////////////////////////////////////////////////////////////////// HeartbeatManager::~HeartbeatManager() throw(Error) { @@ -41,7 +41,7 @@ HeartbeatManager::~HeartbeatManager() throw(Error) { ////////////////////////////////////////////////////////////////////// // -// Ŵ ü ʱȭϰ, ڽ ʱȭѴ. +// 하위 매니저 객체를 초기화하고, 자신을 초기화한다. // ////////////////////////////////////////////////////////////////////// void HeartbeatManager::init() throw(Error) { @@ -53,13 +53,13 @@ void HeartbeatManager::init() throw(Error) { ////////////////////////////////////////////////////////////////////// // -// 񽺸 Ѵ. +// 서비스를 시작한다. // ////////////////////////////////////////////////////////////////////// void HeartbeatManager::start() throw(Error) { __BEGIN_TRY - run(); // ٷ run() ޽带 ȣѴ. ^^; + run(); // 바로 run() 메쏘드를 호출한다. ^^; __END_CATCH } @@ -67,7 +67,7 @@ void HeartbeatManager::start() throw(Error) { ////////////////////////////////////////////////////////////////////// // -// ڽ 񽺸 ߴ , Ŵ ü 񽺸 ߴܽŲ. +// 자신의 서비스를 중단한 후, 하위 매니저 객체들의 서비스를 중단시킨다. // ////////////////////////////////////////////////////////////////////// void HeartbeatManager::stop() throw(Error) { @@ -80,14 +80,14 @@ void HeartbeatManager::stop() throw(Error) { ////////////////////////////////////////////////////////////////////// -// Ŭ̾Ʈ Ŵ ̴. +// 클라이언트 매니저의 메인 루프이다. ////////////////////////////////////////////////////////////////////// void HeartbeatManager::run() throw(Error) { __BEGIN_TRY while (true) { // *TODO - // HeartBeat ⼭ óϸ ȴ. + // 각종 HeartBeat들을 여기서 처리하면 된다. usleep(100); } diff --git a/src/server/sharedserver/HeartbeatManager.h b/src/server/sharedserver/HeartbeatManager.h index 85f18edd..fa21add6 100644 --- a/src/server/sharedserver/HeartbeatManager.h +++ b/src/server/sharedserver/HeartbeatManager.h @@ -2,7 +2,7 @@ // // Filename : HeartbeatManager.h // Written by : reiot@ewestsoft.com -// Description : α Ŭ̾Ʈ Ŵ +// Description : 로그인 서버용 클라이언트 매니저 // ////////////////////////////////////////////////////////////////////// @@ -17,12 +17,12 @@ // // class HeartbeatManager; // -// α ÷̾ óϸ, -// ο Ŭ̾Ʈ õ óѴ. +// 로그인 서버에 접속한 모든 플레이어들의 입출력을 처리하며, +// 새로운 클라이언트의 연결 시도를 처리한다. // -// Ŭ̾Ʈ run() α μ 忡 ư. -// , Thread ӹ ʿ䰡 . ׷, Ŭ -// Thread ӹ ٸ Ŭ ϴ. +// 클라이언트의 run()은 로그인 서버 프로세스의 메인 쓰레드에서 돌아간다. +// 따라서, Thread를 상속받을 필요가 없다. 그러나, 클래스의 구조나 역할은 +// Thread 를 상속받은 다른 클래스와 유사하다. // ////////////////////////////////////////////////////////////////////// @@ -34,16 +34,16 @@ class HeartbeatManager { // destructor ~HeartbeatManager() throw(Error); - // Ŭ̾Ʈ Ŵ ʱȭѴ. + // 클라이언트 매니저를 초기화한다. void init() throw(Error); - // Ŭ̾Ʈ Ŵ Ѵ. + // 클라이언트 매니저를 시작한다. void start() throw(Error); - // Ŭ̾Ʈ Ŵ ߴѴ. + // 클라이언트 매니저를 중단한다. void stop() throw(Error); - // Ŭ̾Ʈ Ŵ ޽ + // 클라이언트 매니저의 메인 메쏘드 void run() throw(Error); }; diff --git a/src/server/sharedserver/NetmarbleGuildRegisterThread.cpp b/src/server/sharedserver/NetmarbleGuildRegisterThread.cpp index 1614f971..b5d3d3ad 100644 --- a/src/server/sharedserver/NetmarbleGuildRegisterThread.cpp +++ b/src/server/sharedserver/NetmarbleGuildRegisterThread.cpp @@ -72,7 +72,7 @@ void NetmarbleGuildRegisterThread::run() throw(Error) { getCurrentTime(dummyQueryTime); while (true) { - // + // 길드 등록 registerGuild(); // for context switch @@ -93,7 +93,7 @@ void NetmarbleGuildRegisterThread::run() throw(Error) { __END_DEBUG } -// ݸ ̵ ״´. +// 넷마블에 등록할 길드 아이디를 쌓는다. void NetmarbleGuildRegisterThread::pushGuildID(GuildID_t guildID) { __ENTER_CRITICAL_SECTION(m_Mutex) @@ -102,7 +102,7 @@ void NetmarbleGuildRegisterThread::pushGuildID(GuildID_t guildID) { __LEAVE_CRITICAL_SECTION(m_Mutex) } -// ݸ Ѵ. +// 길드 정보를 넷마블 쪽으로 등록한다. void NetmarbleGuildRegisterThread::registerGuild() { GuildID_t guildID; diff --git a/src/server/sharedserver/NetmarbleGuildRegisterThread.h b/src/server/sharedserver/NetmarbleGuildRegisterThread.h index 7f1da0d4..6f63cf72 100644 --- a/src/server/sharedserver/NetmarbleGuildRegisterThread.h +++ b/src/server/sharedserver/NetmarbleGuildRegisterThread.h @@ -36,10 +36,10 @@ class NetmarbleGuildRegisterThread : public Thread { void run() throw(Error); public: - // ݸ ̵ ״´. + // 넷마블에 등록할 길드 아이디를 쌓는다. void pushGuildID(GuildID_t guildID); - // ݸ Ѵ. + // 길드 정보를 넷마블쪽으로 등록한다. void registerGuild(); private: diff --git a/src/server/sharedserver/ResurrectLocationManager.cpp b/src/server/sharedserver/ResurrectLocationManager.cpp index b98a9811..95c373ff 100644 --- a/src/server/sharedserver/ResurrectLocationManager.cpp +++ b/src/server/sharedserver/ResurrectLocationManager.cpp @@ -88,7 +88,7 @@ bool ResurrectLocationManager::getSlayerPosition(ZoneID_t id, ZONE_COORD& zoneCo cerr << "ResurrectLocationManager::getPosition() : No Such ZoneID" << endl; // throw NoSuchElementException("ResurrectLocationManager::getPosition() : No Such ZoneID"); - // NoSuch. by sigi. 2002.5.9 + // NoSuch제거. by sigi. 2002.5.9 return false; } @@ -126,7 +126,7 @@ bool ResurrectLocationManager::getVampirePosition(ZoneID_t id, ZONE_COORD& zoneC if (itr == m_VampirePosition.end()) { cerr << "ResurrectLocationManager::getPosition() : No Such ZoneID" << endl; - // NoSuch. by sigi. 2002.5.9 + // NoSuch제거. by sigi. 2002.5.9 // throw NoSuchElementException("ResurrectLocationManager::getPosition() : No Such ZoneID"); return false; } diff --git a/src/server/sharedserver/ResurrectLocationManager.h b/src/server/sharedserver/ResurrectLocationManager.h index 297e70e6..e7c3ca09 100644 --- a/src/server/sharedserver/ResurrectLocationManager.h +++ b/src/server/sharedserver/ResurrectLocationManager.h @@ -2,8 +2,8 @@ // Filename : ResurrectLocationManager.h // Written by : excel96 // Description : -// ÷̾ ׾ ٽ ¾ Ȱ ġ ϰ -// ִ ̴. +// 플레이어가 죽었을 때 다시 태어나는 부활 위치를 존 별로 저장하고 +// 있는 맵이다. ////////////////////////////////////////////////////////////////////////////// #ifndef __RESURRECTMANAGER_H__ @@ -17,11 +17,11 @@ ////////////////////////////////////////////////////////////////////////////// // class ResurrectLocationManager // -// ÷̾ ׾ ٽ ¾ Ȱ ġ ϰ -// ִ ̴. +// 플레이어가 죽었을 때 다시 태어나는 부활 위치를 존 별로 저장하고 +// 있는 맵이다. // -// ̾ ̾ ⺻ Ȱ ġ ִ -// Լ ־ Ѵ. Resurrect.cpp ҽ  ִ. +// 슬레이어 및 뱀파이어 각각 기본 부활 위치를 지정할 수 있는 +// 함수가 있어야 한다. 현재는 Resurrect.cpp에 소스 레벨로 들어가 있다. ////////////////////////////////////////////////////////////////////////////// class ResurrectLocationManager { diff --git a/src/server/sharedserver/SharedServer.cpp b/src/server/sharedserver/SharedServer.cpp index 2d56477f..553adb60 100644 --- a/src/server/sharedserver/SharedServer.cpp +++ b/src/server/sharedserver/SharedServer.cpp @@ -2,7 +2,7 @@ // // Filename : SharedServer.cpp // Written By : reiot@ewestsoft.com -// Description : Ŭ +// Description : 쉐어드 서버용 메인 클래스 // ////////////////////////////////////////////////////////////////////// @@ -31,7 +31,7 @@ // // constructor // -// ý Ŵ constructor Ŵ ü Ѵ. +// 시스템 매니저의 constructor에서는 하위 매니저 객체를 생성한다. // ////////////////////////////////////////////////////////////////////// SharedServer::SharedServer() throw(Error) { @@ -48,7 +48,7 @@ SharedServer::SharedServer() throw(Error) { g_pGameServerGroupInfoManager = new GameServerGroupInfoManager(); // create packet factory manager, packet validator - // (Ŭ̾Ʈ Ŵ ŸŴ , ʱȭǾ Ѵ.) + // (클라이언트 매니저와 서버간통신매니저보다 먼저 생성, 초기화되어야 한다.) g_pPacketFactoryManager = new PacketFactoryManager(); g_pPacketValidator = new PacketValidator(); @@ -78,7 +78,7 @@ SharedServer::SharedServer() throw(Error) { // // destructor // -// ý Ŵ destructor Ŵ ü ؾ Ѵ. +// 시스템 매니저의 destructor에서는 하위 매니저 객체를 삭제해야 한다. // ////////////////////////////////////////////////////////////////////// SharedServer::~SharedServer() throw(Error) { @@ -114,12 +114,12 @@ void SharedServer::init() throw(Error) { cout << "SharedServer::init() start" << endl; - // Ÿ̽Ŵ ʱȭѴ. + // 데이타베이스매니저를 초기화한다. g_pDatabaseManager->init(); g_pStringPool->load(); - // guild manager ʱȭѴ. + // guild manager 를 초기화한다. g_pGuildManager->init(); // initialize some info managers @@ -128,22 +128,22 @@ void SharedServer::init() throw(Error) { g_pGameWorldInfoManager->init(); - // Ŭ̾ƮŴ ʱȭϱ , Ŷ丮Ŵ/Ŷ߸͸ ʱȭѴ. + // 클라이언트매니저를 초기화하기 전에, 패킷팩토리매니저/패킷발리데이터를 초기화한다. g_pPacketFactoryManager->init(); g_pPacketValidator->init(); - // Ŵ ʱȭѴ. + // 서버간 통신 매니저를 초기화한다. g_pGameServerManager->init(); - // ResurrectLocationManager ʱȭ + // ResurrectLocationManager 초기화 g_pResurrectLocationManager->init(); /*#ifdef __NETMARBLE_SERVER__ g_pNetmarbleGuildRegisterThread->init(); #endif*/ - // غ Ŭ̾ƮŴ ʱȭν, - // Ʈŷ Ѵ. + // 만반의 준비가 끝이 나면 이제 클라이언트매니저를 초기화함으로써, + // 네트워킹에 대비한다. g_pHeartbeatManager->init(); __END_CATCH @@ -159,23 +159,23 @@ void SharedServer::start() throw(Error) { __BEGIN_TRY cout << "---------- Start SharedServer ---------" << endl; - // Ŵ Ѵ. + // 서버간 통신 매니저를 시작한다. g_pGameServerManager->start(); - // ݸ + // 넷마블 길드 등록 스레드 시작 /*#ifdef __NETMARBLE_SERVER__ g_pNetmarbleGuildRegisterThread->start(); #endif*/ // - // Ŭ̾Ʈ Ŵ Ѵ. + // 클라이언트 매니저를 시작한다. // // *Reiot's Notes* // - // ߿ Ǿ Ѵ. ֳϸ Ƽ ƴ - // ѷ Լ̱ ̴. ٸ Լ - // ȣ , ʴ( ߻ ʴ) - // ٸ Ŵ ó ʴ´. + // 가장 나중에 실행되어야 한다. 왜냐하면 멀티쓰레드기반이 아닌 + // 무한루프를 가진 함수이기 때문이다. 만일 이 다음에 다른 함수를 + // 호출할 경우, 루프가 끝나지 않는한(즉 에러가 발생하지 않는한) + // 다른 매니저의 처리 루프는 실행되지 않는다. // g_pHeartbeatManager->start(); @@ -187,15 +187,15 @@ void SharedServer::start() throw(Error) { // // stop shared server // -// stop ϵ . ִ Ŵ -// stop Ѿ Ѵ. ݴ stop ų null pointer -// ߻ ִ. +// stop 순서에 유의하도록 하자. 가장 영향을 많이 주는 매니저부터 +// stop 시켜야 한다. 만일 반대의 순서로 stop 시킬 경우 null pointer +// 같은 현상이 발생할 수 있다. // ////////////////////////////////////////////////////////////////////// void SharedServer::stop() throw(Error) { __BEGIN_TRY - // ߿ κ ڸƮȭؾ Ѵ. + // 나중에 이 부분을 코멘트화해야 한다. throw UnsupportedError(); // diff --git a/src/server/sharedserver/SharedServer.h b/src/server/sharedserver/SharedServer.h index ea822987..e92c29c8 100644 --- a/src/server/sharedserver/SharedServer.h +++ b/src/server/sharedserver/SharedServer.h @@ -2,14 +2,14 @@ // // Filename : SharedServer.h // Written By : reiot@ewestsoft.com -// Description : α Ŭ +// Description : 로그인 서버용 메인 클래스 // ////////////////////////////////////////////////////////////////////// #ifndef __SHARED_SERVER_H__ #define __SHARED_SERVER_H__ -// ԵǸ, α ȴ. +// 이 모듈이 포함되면, 로그인 서버 모듈이 된다. #ifndef __SHARED_SERVER__ #define __SHARED_SERVER__ #endif @@ -22,7 +22,7 @@ // // class SharedServer // -// α ü Ÿ Ŭ̴. +// 로그인 서버 자체를 나타내는 클래스이다. // ////////////////////////////////////////////////////////////////////// diff --git a/src/server/sharedserver/main.cpp b/src/server/sharedserver/main.cpp index 31db298d..a280f9f7 100644 --- a/src/server/sharedserver/main.cpp +++ b/src/server/sharedserver/main.cpp @@ -2,7 +2,7 @@ // // Filename : main.cpp // Written By : reiot@ewestsoft.com -// Description : α Լ +// Description : ·Î±×ÀÎ ¼­¹ö¿ë ¸ÞÀÎ ÇÔ¼ö // ////////////////////////////////////////////////////////////////////// @@ -31,31 +31,31 @@ void memoryError() { // ////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { - // ޸ .. Լ Ѵ. + // ¸Þ¸ð¸® ¾ø´Ù.. ÇÔ¼ö¸¦ ¼³Á¤ÇÑ´Ù. set_new_handler(memoryError); if (argc < 3) { - cout << "Usage : sharedserver -f ȯ" << endl; + cout << "Usage : sharedserver -f ȯ°æÆÄÀÏ" << endl; exit(1); } - // command-line parameter string ȯѴ. ^^; + // command-line parameter¸¦ string À¸·Î º¯È¯ÇÑ´Ù. ^^; string* Argv; Argv = new string[argc]; for (int i = 0; i < argc; i++) Argv[i] = argv[i]; - // ȯ оδ. - // $VSHOME/bin, ȯ $VSHOME/conf ؾ Ѵ. - // command line ȯ ֵ Ѵ. + // ȯ°æ ÆÄÀÏÀ» ÀоîµéÀδÙ. + // ´Ü ½ÇÇà ÆÄÀÏÀº $VSHOME/bin¿¡, ȯ°æ ÆÄÀÏÀº $VSHOME/conf ¿¡ Á¸ÀçÇØ¾ß ÇÑ´Ù.½ + // command line ¿¡¼­ ȯ°æ ÆÄÀÏÀ» ÁöÁ¤ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. try { if (Argv[1] != "-f") { - throw Error("Usage : sharedserver -f ȯ"); + throw Error("Usage : sharedserver -f ȯ°æÆÄÀÏ"); } - // ù° ĶͰ -f , ι° Ķʹ ȯ ġ ȴ. + // ù¹øÂ° ÆÄ¶ó¹ÌÅͰ¡ -f ÀÏ °æ¿ì, µÎ¹øÂ° ÆÄ¶ó¹ÌÅʹ ȯ°æÆÄÀÏÀÇ À§Ä¡°¡ µÈ´Ù. g_pConfig = new Properties(); g_pConfig->load(Argv[2]); @@ -65,11 +65,11 @@ int main(int argc, char* argv[]) { cout << e.toString() << endl; } - // α Ŵ ϰ ʱȭ ȰȭŲ. - // α Ŵ α ʱȭ ߻ ɼ ִ - // س ϹǷ α ο ʱȭؼ ȵȴ. - // ٸ ü ϰ ʱȭϱ α׸Ŵ 켱 , - // ʱȭǾ Ѵ. + // ·Î±× ¸Å´ÏÀú¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇÑÈÄ È°¼ºÈ­½ÃŲ´Ù. + // ·Î±× ¸Å´ÏÀú´Â ·Î±×ÀÎ ¼­¹öÀÇ ÃʱâÈ­°úÁ¤¿¡¼­ ¹ß»ýÇÒ °¡´É¼ºÀÌ ÀÖ´Â ¿¡·¯±îÁöµµ + // °ËÃâÇØ³»¾ß ÇϹǷΠ·Î±×ÀÎ ¼­¹ö ³»ºÎ¿¡¼­ ÃʱâÈ­ÇØ¼­´Â ¾ÈµÈ´Ù. + // ¶ÇÇÑ ´Ù¸¥ °´Ã¼¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇϱâÀü¿¡ ·Î±×¸Å´ÏÀú°¡ ¿ì¼±ÀûÀ¸·Î »ý¼º, + // ÃʱâÈ­µÇ¾î¾ß ÇÑ´Ù. try { string LogServerIP = g_pConfig->getProperty("LogServerIP"); @@ -83,7 +83,7 @@ int main(int argc, char* argv[]) { } // - // α ü ϰ ʱȭ ȰȭŲ. + // ·Î±×ÀÎ ¼­¹ö °´Ã¼¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇÑ ÈÄ È°¼ºÈ­½ÃŲ´Ù. // try { struct rlimit rl; @@ -91,29 +91,29 @@ int main(int argc, char* argv[]) { rl.rlim_max = RLIM_INFINITY; setrlimit(RLIMIT_CORE, &rl); - // α ü Ѵ. + // ·Î±×ÀÎ ¼­¹ö °´Ã¼¸¦ »ý¼ºÇÑ´Ù. g_pSharedServer = new SharedServer(); - // α ü ʱȭѴ. + // ·Î±×ÀÎ ¼­¹ö °´Ã¼¸¦ ÃʱâÈ­ÇÑ´Ù. g_pSharedServer->init(); - // α ü ȰȭŲ. + // ·Î±×ÀÎ ¼­¹ö °´Ã¼¸¦ Ȱ¼ºÈ­½ÃŲ´Ù. g_pSharedServer->start(); } catch (Throwable& e) { - // αװ ̷ 츦 ؼ + // ·Î±×°¡ ÀÌ·ïÁö±â Àü¿¡ ¼­¹ö°¡ ³¡³¯ °æ¿ì¸¦ ´ëºñÇØ¼­ ofstream ofile("../log/instant.log", ios::out); ofile << e.toString() << endl; ofile.close(); - // ijġ Ǵ ߻ߴٴ ̴. - // LEVEL1 αؾ Ѵ. ( αѴٴ ) + // ÇÏÀ§¿¡¼­ ijġµÇÁö ¾ÊÀº ¿¹¿Ü ¶Ç´Â ¿¡·¯°¡ ¹ß»ýÇß´Ù´Â ¶æÀÌ´Ù. + // ÀÌ °æ¿ì LEVEL1·Î ·Î±×ÇØ¾ß ÇÑ´Ù. (¹«Á¶°Ç ·Î±×ÇÑ´Ù´Â ¶æ) log(LOG_SHAREDSERVER_ERROR, "", "", e.toString()); - // ǥ ε ش. + // Ç¥ÁØ Ãâ·ÂÀ¸·Îµµ Ãâ·ÂÇØÁØ´Ù. cout << e.toString() << endl; - // α ߴܽŲ. - // ο Ŵ ߴܵǾ Ѵ. + // ·Î±×ÀÎ ¼­¹ö¸¦ ÁߴܽÃŲ´Ù. + // ÀÌ ³»ºÎ¿¡¼­ ÇÏÀ§ ¸Å´ÏÀú ¿ª½Ã ÁߴܵǾî¾ß ÇÑ´Ù. g_pSharedServer->stop(); } } diff --git a/src/server/theoneserver/Connection.cpp b/src/server/theoneserver/Connection.cpp index 4152f6ab..8081d1e3 100644 --- a/src/server/theoneserver/Connection.cpp +++ b/src/server/theoneserver/Connection.cpp @@ -2,7 +2,7 @@ // // File Name : Connection.cpp // Written by : Gday29@ewestsoft.com -// Description : Ŀؼ Ŭ +// Description : 커넥션 클래스 구현 // ////////////////////////////////////////////////////////////////////// @@ -15,8 +15,8 @@ // // constructor // -// ̽ ϰ, ͺ̽ Ѵ. -// ܸ κ ؾ Ѵ. +// 데이터 베이스와 연결하고, 데이터베이스를 선택한다. +// 예외를 던지는 부분은 수정해야 한다. // ////////////////////////////////////////////////////////////////////// @@ -25,7 +25,7 @@ Connection::Connection() throw(Error) : m_bConnected(false), m_bBusy(false) { m_Mutex.setName("Connection"); - // MYSQL ü ʱȭѴ. + // MYSQL 객체를 초기화한다. if (mysql_init(&m_Mysql) == NULL) { throw Error(mysql_error(&m_Mysql)); } @@ -37,9 +37,9 @@ Connection::Connection() throw(Error) : m_bConnected(false), m_bBusy(false) { // // *CAUTION* // -// connect() ȣ port , Ʈ 0 Ǹ -// ̶ MYSQL Ʈ Ʈ ȴ. ׷, ؼ MYSQL ٸ -// Ʈٰ ̴. , Ʈ ʿ䰡 ִ. +// connect()를 호출할 때 port 를 명시하지 않을 경우, 디폴트값인 0 이 사용되며 +// 이때 MYSQL의 디폴트 포트가 사용된다. 그렇지만, 보안을 위해서 MYSQL을 다른 +// 포트에다가 띄워놔야 할 것이다. 따라서, 포트를 지정할 필요가 있다. // ////////////////////////////////////////////////////////////////////// @@ -50,11 +50,11 @@ Connection::Connection(string host, string db, string user, string password, uin m_Mutex.setName("Connection"); - // MYSQL ü ʱȭѴ. + // MYSQL 객체를 초기화한다. if (mysql_init(&m_Mysql) == NULL) throw Error(mysql_error(&m_Mysql)); - // ٷ õѴ. + // 바로 연결을 시도한다. connect(m_Host, m_Database, m_User, m_Password, m_Port); __END_CATCH @@ -69,7 +69,7 @@ Connection::Connection(string host, string db, string user, string password, uin Connection::~Connection() throw(Error) { __BEGIN_TRY - // Ǿ , ´. + // 연결되어 있을 경우, 연결을 끊는다. if (m_bConnected) { close(); } @@ -81,17 +81,17 @@ Connection::~Connection() throw(Error) { // // connect() // -// Connection ü , -// ϴ default constructor ؼ ü , -// ޾Ƽ ͸ ʱȭ Ѵ. +// Connection 객체가 생성될 때, 어디에 연결할 지 알지 못할 경우 +// 일단 default constructor 를 사용해서 객체를 생성한 다음, +// 연결할 때 값을 받아서 내부 데이터멤버들을 초기화한 후 연결한다. // // *CAUTION* // -// connect() ȣ port , Ʈ 0 Ǹ -// ̶ MYSQL Ʈ Ʈ ȴ. ׷, ؼ MYSQL ٸ -// Ʈٰ ̴. +// connect()를 호출할 때 port 를 명시하지 않을 경우, 디폴트값인 0 이 사용되며 +// 이때 MYSQL 의 디폴트 포트가 사용된다. 그렇지만, 보안을 위해서 MYSQL을 다른 +// 포트에다가 띄워놔야 할 것이다. // -// Ʈ Ķ͸ ؾ ϱ , Ʈ ĶͰ ڷ .. *_*; +// 디폴트 파라미터를 사용해야 하기 때문에, 포트 파라미터가 맨 뒤로 갔다.. *_*; // // ex> Connection conn; // conn.connect( "vampire.ewestsoft.com" , "bbs" , "bbsuser" , "bbspassword" ); @@ -116,30 +116,30 @@ void Connection::connect(string host, string db, string user, string password, u // // connect() // -// ڿ Է¹ , ٷ ޽带 ȣؼ -// õѴ. +// 생성자에서 직접 정보를 입력받을 경우, 바로 이 메쏘드를 호출해서 +// 연결을 시도한다. // ////////////////////////////////////////////////////////////////////// void Connection::connect() throw(SQLConnectException) { __BEGIN_TRY - // Ϸ ϴµ ̹ Ǿִٸ . + // 연결을 하려구 하는데 이미 연결이 되어있다면 에러다. if (m_bConnected) { - // ̷ , ݾ ְ ܸ ̴. + // 이럴 경우, 연결은 닫아 주고 예외를 던져야 할 것이다. close(); throw SQLConnectException("Already Connected"); } //-------------------------------------------------- - // üũؾ ... + // 에러가 생기는지 체크해야 함... //-------------------------------------------------- m_bConnected = (mysql_real_connect(&m_Mysql, m_Host.c_str(), m_User.c_str(), m_Password.c_str(), m_Database.c_str(), m_Port, 0, 0) != NULL); // cout << "Connection Calls~~~" << endl; - // ° ƴ϶ . + // 연결상태가 아니라면 에러다. if (!m_bConnected) { throw SQLConnectException(mysql_error(&m_Mysql)); } @@ -151,7 +151,7 @@ void Connection::connect() throw(SQLConnectException) { // // close() // -// ´. +// 연결을 끊는다. // ////////////////////////////////////////////////////////////////////// @@ -162,7 +162,7 @@ void Connection::close() throw(SQLConnectException, Error) { throw SQLConnectException("Not Connected"); } - // void ̹Ƿ .. - -; + // void 이므로 무시.. - -; mysql_close(&m_Mysql); m_bConnected = false; @@ -174,20 +174,20 @@ void Connection::close() throw(SQLConnectException, Error) { // // createStatement // -// ο Statement ü ü ͸ Ѵ. +// 새로운 Statement 객체를 만들어 그 객체의 포인터를 리턴한다. // ////////////////////////////////////////////////////////////////////// Statement* Connection::createStatement() throw() { __BEGIN_TRY - // ο Statement ü . + // 새로운 Statement 객체를 만든다. Statement* pStatement = new Statement(); - // ü Ŀؼ Ŀؼ ü ϰ.. + // 만든 객체의 커넥션 값을 이 커넥션 객체로 하고.. pStatement->setConnection(this); - // Ѵ. + // 리턴한다. return pStatement; __END_CATCH diff --git a/src/server/theoneserver/Connection.h b/src/server/theoneserver/Connection.h index 653a27ec..1c0b9872 100644 --- a/src/server/theoneserver/Connection.h +++ b/src/server/theoneserver/Connection.h @@ -2,7 +2,7 @@ // // File Name : Connection.h // Written by : Gday29@ewestsoft.com -// Description : Ÿ̽ ϴ Ŭ +// Description : 데이타베이스와의 연결을 담당하는 클래스 // ////////////////////////////////////////////////////////////////////// @@ -23,7 +23,7 @@ class Statement; // // class Connection; // -// ̽ ϰ, Ѵ. +// 데이터 베이스에 연결하고, 관리한다. // ////////////////////////////////////////////////////////////////////// @@ -41,10 +41,10 @@ class Connection { // close the connection to database void close() throw(SQLConnectException, Error); - // Ÿ̽ õѴ. + // 데이타베이스에 연결을 시도한다. void connect(string host, string db, string user, string password, uint port = 0) throw(SQLConnectException); - // Ÿ̽ õѴ. + // 데이타베이스에 연결을 시도한다. void connect() throw(SQLConnectException); // check the connection @@ -55,7 +55,7 @@ class Connection { return m_bConnected == false; } - // Statement ü ؼ Ѵ. + // Statement 객체를 생성해서 리턴한다. Statement* createStatement() throw(); // get the MYSQL object @@ -126,28 +126,28 @@ class Connection { // is connected? bool m_bConnected; - // DBMS Ǵ ȣƮ + // DBMS 가 운영되는 호스트 명 string m_Host; - // DBMS Ʈ + // DBMS 의 연결 포트 uint m_Port; - // Ÿ̽ ̸ + // 데이타베이스 이름 string m_Database; - // ̵ + // 사용자 아이디 string m_User; - // н + // 사용자 패스워드 string m_Password; - // connection name(DatabaseManager Ű) + // connection name(DatabaseManager 에서 사용할 키값) string m_Name; - // Ŀؼΰ? + // 현재 사용중인 커넥션인가? bool m_bBusy; - // lock + // 동시 쿼리를 막기 위한 lock Mutex m_Mutex; }; diff --git a/src/server/theoneserver/GameServerManager.cpp b/src/server/theoneserver/GameServerManager.cpp index 8d359e1f..710540e9 100644 --- a/src/server/theoneserver/GameServerManager.cpp +++ b/src/server/theoneserver/GameServerManager.cpp @@ -57,26 +57,26 @@ void GameServerManager::run() throw(Error) { DatagramPacket* pDatagramPacket = NULL; try { - // ͱ׷ ü . + // 데이터그램 객체를 끄집어낸다. cout << "wait recv.." << endl; pDatagram = m_pDatagramSocket->receive(); cout << "recved.." << endl; - if (pDatagram != NULL) // Ϻ exception. by sigi. 2002.5.17 + if (pDatagram != NULL) // 일부 exception제거. by sigi. 2002.5.17 { - // ͱ׷ Ŷ ü . + // 데이터그램 패킷 객체를 끄집어낸다. pDatagram->read(pDatagramPacket); if (pDatagramPacket != NULL) { - //  ͱ׷ Ŷ ü Ѵ. + // 끄집어낸 데이터그램 패킷 객체를 실행한다. pDatagramPacket->execute(NULL); - // ͱ׷ Ŷ ü Ѵ. + // 데이터그램 패킷 객체를 삭제한다. SAFE_DELETE(pDatagramPacket); pDatagramPacket = NULL; } - // ͱ׷ ü Ѵ. + // 데이터그램 객체를 삭제한다. SAFE_DELETE(pDatagram); pDatagram = NULL; } @@ -84,9 +84,9 @@ void GameServerManager::run() throw(Error) { cout << "GameServerManager::run Exception Check(ProtocolException)" << endl; cout << pe.toString() << endl; - // ſ ߻ϸ, - // α׷ ̰ų ŷ õ̴. - // ϴ ڸ شǹǷ.. Ѵ. + // 서버간 통신에서 프로토콜 에러가 발생하면, + // 프로그래밍 오류이거나 해킹 시도이다. + // 일단은 전자만이 해당되므로.. 에러로 간주한다. // throw Error( pe.toString() ); SAFE_DELETE(pDatagramPacket); SAFE_DELETE(pDatagram); @@ -94,8 +94,8 @@ void GameServerManager::run() throw(Error) { cout << "GameServerManager::run Exception Check(ConnectException)" << endl; cout << ce.toString() << endl; - // .. ̰.. - // ϴ .. + // 으음.. 머지 이건.. + // 일단 에러당.. // throw Error( ce.toString() ); SAFE_DELETE(pDatagramPacket); SAFE_DELETE(pDatagram); @@ -129,7 +129,7 @@ void GameServerManager::sendDatagram(Datagram* pDatagram) throw(ConnectException } catch (ConnectException& t) { cout << "GameServerManager::sendDatagram Exception Check!!" << endl; cout << t.toString() << endl; - throw ConnectException("GameServerManager::sendDatagram "); + throw ConnectException("GameServerManager::sendDatagram 상위로 던진다"); } __END_CATCH @@ -146,23 +146,23 @@ void GameServerManager::sendPacket(string host, uint port, DatagramPacket* pPack try { // try // { - // ͱ׷ ü ϳ ΰ, peer ȣƮ Ʈ Ѵ. + // 데이터그램 객체를 하나 두고, 전송할 peer 의 호스트와 포트를 지정한다. Datagram datagram; datagram.setHost(host); datagram.setPort(port); - // ͱ׷ Ŷ ͱ׷ ִ´. + // 데이터그램 패킷을 데이터그램에 집어넣는다. datagram.write(pPacket); - // ͱ׷ ؼ ͱ׷ Ѵ. + // 데이터그램 소켓을 통해서 데이터그램을 전송한다. m_pDatagramSocket->send(&datagram); // } // catch ( ConnectException & t ) // { // cout << "GameServerManager::sendDatagram Exception Check!!" << endl; // cout << t.toString() << endl; - // throw ConnectException( "GameServerManager::sendDatagram "); + // throw ConnectException( "GameServerManager::sendDatagram 상위로 던진다"); // } } catch (Throwable& t) { diff --git a/src/server/theoneserver/GameServerManager.h b/src/server/theoneserver/GameServerManager.h index 38fc84af..2358996f 100644 --- a/src/server/theoneserver/GameServerManager.h +++ b/src/server/theoneserver/GameServerManager.h @@ -23,9 +23,9 @@ class DatagramPacket; // // class GameServerManager; // -// ϴ ̴. +// 게임 서버와의 통신을 전담하는 쓰레드이다. // -// ο ͱ׷ ϳ ŷ Ѵ. +// 내부에 데이터그램 서버소켓을 하나 가지고 블로킹 기반으로 동작한다. // ////////////////////////////////////////////////////////////////////// @@ -51,7 +51,7 @@ class GameServerManager { void sendPacket(string host, uint port, DatagramPacket* pPacket) throw(ConnectException, Error); private: - // UDP + // UDP 서버 소켓 DatagramSocket* m_pDatagramSocket; bool m_bRunning; }; diff --git a/src/server/theoneserver/KillManager.cpp b/src/server/theoneserver/KillManager.cpp index e4d33b8c..f98cfe8a 100644 --- a/src/server/theoneserver/KillManager.cpp +++ b/src/server/theoneserver/KillManager.cpp @@ -24,7 +24,7 @@ GameServerManager::GameServerManager() throw(Error) : m_pDatagramSocket(NULL) { // create datagram server socket m_pDatagramSocket = new DatagramSocket(g_pConfig->getPropertyInt("TheOneServerUDPPort")); - // ʸ DB 鿡 UDPŶ . ݼ() + // 몇 초마다 DB를 뒤져서 각 서버들에게 UDP패킷을 보낼까. 간격설정(초) /* getCurrentTime(m_ExpireTime); m_ExpireTime.tv_sec += g_pConfig->getPropertyInt("CHECK_INTERVAL"); cout << "." << endl; @@ -33,7 +33,7 @@ GameServerManager::GameServerManager() throw(Error) : m_pDatagramSocket(NULL) { getCurrentTime(currentTime); if ( currentTime >= m_ExpireTime ) { - // ðǾ.. + // 시간되었으면.. cout << "Send Kill Packet..." << endl; } */ @@ -72,24 +72,24 @@ void GameServerManager::run() throw(Error) { DatagramPacket* pDatagramPacket = NULL; try { - // ͱ׷ ü . + // 데이터그램 객체를 끄집어낸다. pDatagram = m_pDatagramSocket->receive(); - if (pDatagram != NULL) // Ϻ exception. by sigi. 2002.5.17 + if (pDatagram != NULL) // 일부 exception제거. by sigi. 2002.5.17 { - // ͱ׷ Ŷ ü . + // 데이터그램 패킷 객체를 끄집어낸다. pDatagram->read(pDatagramPacket); if (pDatagramPacket != NULL) { - //  ͱ׷ Ŷ ü Ѵ. + // 끄집어낸 데이터그램 패킷 객체를 실행한다. pDatagramPacket->execute(NULL); - // ͱ׷ Ŷ ü Ѵ. + // 데이터그램 패킷 객체를 삭제한다. SAFE_DELETE(pDatagramPacket); pDatagramPacket = NULL; } - // ͱ׷ ü Ѵ. + // 데이터그램 객체를 삭제한다. SAFE_DELETE(pDatagram); pDatagram = NULL; } @@ -97,9 +97,9 @@ void GameServerManager::run() throw(Error) { cout << "GameServerManager::run Exception Check(ProtocolException)" << endl; cout << pe.toString() << endl; - // ſ ߻ϸ, - // α׷ ̰ų ŷ õ̴. - // ϴ ڸ شǹǷ.. Ѵ. + // 서버간 통신에서 프로토콜 에러가 발생하면, + // 프로그래밍 오류이거나 해킹 시도이다. + // 일단은 전자만이 해당되므로.. 에러로 간주한다. // throw Error( pe.toString() ); SAFE_DELETE(pDatagramPacket); SAFE_DELETE(pDatagram); @@ -107,8 +107,8 @@ void GameServerManager::run() throw(Error) { cout << "GameServerManager::run Exception Check(ConnectException)" << endl; cout << ce.toString() << endl; - // .. ̰.. - // ϴ .. + // 으음.. 머지 이건.. + // 일단 에러당.. // throw Error( ce.toString() ); SAFE_DELETE(pDatagramPacket); SAFE_DELETE(pDatagram); @@ -142,7 +142,7 @@ void GameServerManager::sendDatagram(Datagram* pDatagram) throw(ConnectException } catch (ConnectException& t) { cout << "GameServerManager::sendDatagram Exception Check!!" << endl; cout << t.toString() << endl; - throw ConnectException("GameServerManager::sendDatagram "); + throw ConnectException("GameServerManager::sendDatagram 상위로 던진다"); } __END_CATCH @@ -159,23 +159,23 @@ void GameServerManager::sendPacket(string host, uint port, DatagramPacket* pPack try { // try // { - // ͱ׷ ü ϳ ΰ, peer ȣƮ Ʈ Ѵ. + // 데이터그램 객체를 하나 두고, 전송할 peer 의 호스트와 포트를 지정한다. Datagram datagram; datagram.setHost(host); datagram.setPort(port); - // ͱ׷ Ŷ ͱ׷ ִ´. + // 데이터그램 패킷을 데이터그램에 집어넣는다. datagram.write(pPacket); - // ͱ׷ ؼ ͱ׷ Ѵ. + // 데이터그램 소켓을 통해서 데이터그램을 전송한다. m_pDatagramSocket->send(&datagram); // } // catch ( ConnectException & t ) // { // cout << "GameServerManager::sendDatagram Exception Check!!" << endl; // cout << t.toString() << endl; - // throw ConnectException( "GameServerManager::sendDatagram "); + // throw ConnectException( "GameServerManager::sendDatagram 상위로 던진다"); // } } catch (Throwable& t) { diff --git a/src/server/theoneserver/KillManager.h b/src/server/theoneserver/KillManager.h index a8f5d03b..b4d3e930 100644 --- a/src/server/theoneserver/KillManager.h +++ b/src/server/theoneserver/KillManager.h @@ -23,9 +23,9 @@ class DatagramPacket; // // class GameServerManager; // -// ϴ ̴. +// 게임 서버와의 통신을 전담하는 쓰레드이다. // -// ο ͱ׷ ϳ ŷ Ѵ. +// 내부에 데이터그램 서버소켓을 하나 가지고 블로킹 기반으로 동작한다. // ////////////////////////////////////////////////////////////////////// @@ -51,7 +51,7 @@ class GameServerManager { void sendPacket(string host, uint port, DatagramPacket* pPacket) throw(ConnectException, Error); private: - // UDP + // UDP 서버 소켓 DatagramSocket* m_pDatagramSocket; bool m_bRunning; diff --git a/src/server/theoneserver/PacketFactoryManager.cpp b/src/server/theoneserver/PacketFactoryManager.cpp index 83551a5c..b7f331c0 100644 --- a/src/server/theoneserver/PacketFactoryManager.cpp +++ b/src/server/theoneserver/PacketFactoryManager.cpp @@ -22,10 +22,10 @@ PacketFactoryManager::PacketFactoryManager() throw() : m_Factories(NULL), m_Size Assert(m_Size > 0); - // Ŷ丮迭 Ѵ. + // 패킷팩토리배열을 생성한다. m_Factories = new PacketFactory*[m_Size]; - // 丮 ͵ NULL ʱȭѴ. + // 팩토리에 대한 포인터들을 NULL 로 초기화한다. for (int i = 0; i < m_Size; i++) m_Factories[i] = NULL; @@ -43,7 +43,7 @@ PacketFactoryManager::~PacketFactoryManager() throw() { Assert(m_Factories != NULL); - // Ŷ丮 Ѵ. + // 각각의 패킷팩토리들을 삭제한다. for (int i = 0; i < m_Size; i++) { #ifdef __GAME_CLIENT__ if (m_Factories[i] != NULL) { @@ -55,7 +55,7 @@ PacketFactoryManager::~PacketFactoryManager() throw() { #endif } - // Ŷ丮迭 Ѵ. + // 패킷팩토리배열을 삭제한다. #ifdef __GAME_CLIENT__ if (m_Factories != NULL) { delete[] m_Factories; @@ -71,7 +71,7 @@ PacketFactoryManager::~PacketFactoryManager() throw() { ////////////////////////////////////////////////////////////////////// // -// ǵ Ŷ丮 ⿡ ߰Ѵ. +// 정의된 모든 패킷팩토리들을 여기에 추가한다. // ////////////////////////////////////////////////////////////////////// void PacketFactoryManager::init() throw(Error) { @@ -88,7 +88,7 @@ void PacketFactoryManager::init() throw(Error) { ////////////////////////////////////////////////////////////////////// // -// 丮 ü Ư ε ߰Ѵ. +// 팩토리 객체를 특정 인덱스에 추가한다. // ////////////////////////////////////////////////////////////////////// void PacketFactoryManager::addFactory(PacketFactory* pFactory) throw(Error) { @@ -108,7 +108,7 @@ void PacketFactoryManager::addFactory(PacketFactory* pFactory) throw(Error) { throw Error(msg.toString()); } - // Ŷ丮 Ѵ. + // 패킷팩토리를 등록한다. m_Factories[pFactory->getPacketID()] = pFactory; __END_CATCH @@ -117,14 +117,14 @@ void PacketFactoryManager::addFactory(PacketFactory* pFactory) throw(Error) { ////////////////////////////////////////////////////////////////////// // -// Ŷ̵ Ŷü Ѵ. +// 패킷아이디로 패킷객체를 생성한다. // ////////////////////////////////////////////////////////////////////// Packet* PacketFactoryManager::createPacket(PacketID_t packetID) throw(InvalidProtocolException, Error) { __BEGIN_TRY - // Ŷ ̵ Ѿ ؼ Seg.Fault ߻ ʵ. - // ̷ ڴ © Ѵ. + // 패킷 아이디가 범위를 넘어섬으로 인해서 Seg.Fault 가 발생하지 않도록. + // 이런 사용자는 당장 짤라야 한다. if (packetID >= m_Size || m_Factories[packetID] == NULL) { StringStream msg; msg << "packet factory [" << packetID << "] not exist."; @@ -139,14 +139,14 @@ Packet* PacketFactoryManager::createPacket(PacketID_t packetID) throw(InvalidPro ////////////////////////////////////////////////////////////////////// // -// Ŷ̵ Ư Ŷ ִ ũ⸦ Ѵ. +// 패킷아이디로 특정 패킷의 최대 크기를 리턴한다. // ////////////////////////////////////////////////////////////////////// PacketSize_t PacketFactoryManager::getPacketMaxSize(PacketID_t packetID) throw(InvalidProtocolException, Error) { __BEGIN_TRY - // Ŷ ̵ Ѿ ؼ Seg.Fault ߻ ʵ. - // ̷ ڴ © Ѵ. + // 패킷 아이디가 범위를 넘어섬으로 인해서 Seg.Fault 가 발생하지 않도록. + // 이런 사용자는 당장 짤라야 한다. if (packetID >= m_Size || m_Factories[packetID] == NULL) { StringStream msg; msg << "invalid packet id(" << packetID << ")"; @@ -161,15 +161,15 @@ PacketSize_t PacketFactoryManager::getPacketMaxSize(PacketID_t packetID) throw(I ////////////////////////////////////////////////////////////////////// // -// Ŷ̵ Ư Ŷ ̸ Ѵ. +// 패킷아이디로 특정 패킷의 이름을 리턴한다. // ////////////////////////////////////////////////////////////////////// #if !defined(__GAME_CLIENT__) || defined(__GAME_CLIENT__) && defined(__DEBUG_OUTPUT__) string PacketFactoryManager::getPacketName(PacketID_t packetID) throw(InvalidProtocolException, Error) { __BEGIN_TRY - // Ŷ ̵ Ѿ ؼ Seg.Fault ߻ ʵ. - // ̷ ڴ © Ѵ. + // 패킷 아이디가 범위를 넘어섬으로 인해서 Seg.Fault 가 발생하지 않도록. + // 이런 사용자는 당장 짤라야 한다. if (packetID >= m_Size || m_Factories[packetID] == NULL) { StringStream msg; msg << "invalid packet id(" << packetID << ")"; diff --git a/src/server/theoneserver/PacketFactoryManager.h b/src/server/theoneserver/PacketFactoryManager.h index 70dff8c7..96f2c1cd 100644 --- a/src/server/theoneserver/PacketFactoryManager.h +++ b/src/server/theoneserver/PacketFactoryManager.h @@ -28,30 +28,30 @@ class PacketFactoryManager { // destructor ~PacketFactoryManager() throw(); - // Ŷ丮Ŵ ʱȭѴ. - // Ӽü init() ȣȴ. + // 패킷팩토리매니저를 초기화한다. + // 게임서버객체의 init()에서 호출된다. void init() throw(Error); - // 丮 ü Ư ε ߰Ѵ. + // 팩토리 객체를 특정 인덱스에 추가한다. void addFactory(PacketFactory* pFactory) throw(Error); - // Ŷ̵ Ŷü Ѵ. + // 패킷아이디로 패킷객체를 생성한다. Packet* createPacket(PacketID_t packetID) throw(InvalidProtocolException, Error); - // Ư Ŷ ִ ũ⸦ Ѵ. + // 특정 패킷의 최대 크기를 리턴한다. string getPacketName(PacketID_t packetID) throw(InvalidProtocolException, Error); - // Ư Ŷ ִ ũ⸦ Ѵ. + // 특정 패킷의 최대 크기를 리턴한다. PacketSize_t getPacketMaxSize(PacketID_t packetID) throw(InvalidProtocolException, Error); // get debug string string toString() const throw(); private: - // Ŷ丮 迭 + // 패킷팩토리의 배열 PacketFactory** m_Factories; - // Ŷ丮迭 ũ + // 패킷팩토리배열의 크기 ushort m_Size; }; diff --git a/src/server/theoneserver/Result.cpp b/src/server/theoneserver/Result.cpp index 81b2bc16..e2822c6f 100644 --- a/src/server/theoneserver/Result.cpp +++ b/src/server/theoneserver/Result.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // File Name : Result.cc // Written By : Gday29@ewestsoft.com -// Description : Result class +// Description : Result class 구현 ////////////////////////////////////////////////////////////////////////////// #include "Result.h" @@ -21,7 +21,7 @@ Result::Result(T_RESULT* pResult, const string& statement) throw(Error) { Assert(m_pResult != NULL); - // #rows Ѵ. + // #rows 값을 지정한다. m_RowCount = mysql_num_rows(m_pResult); m_FieldCount = mysql_num_fields(m_pResult); @@ -60,7 +60,7 @@ Result::~Result() throw() { ////////////////////////////////////////////////////////////////////////////// // next() -// row true , false Ѵ. +// 다음 row 가 존재할 경우 true 를, 없을 경우 false 를 리턴한다. ////////////////////////////////////////////////////////////////////////////// bool Result::next() throw(Error) { @@ -75,8 +75,8 @@ bool Result::next() throw(Error) { ////////////////////////////////////////////////////////////////////////////// // getField -// Ķͷ ε ؼ ÷ Ѵ. -// 1 ÷ ȴ. (0 ƴϴ..) +// 파라미터로 인덱스를 지정해서 그 컬럼을 리턴한다. +// 1 이 최초의 컬럼이 된다. (0 이 아니당..) ////////////////////////////////////////////////////////////////////////////// char* Result::getField(uint index) throw(OutOfBoundException, Error) { diff --git a/src/server/theoneserver/Result.h b/src/server/theoneserver/Result.h index c8eadfd9..c1ba315c 100644 --- a/src/server/theoneserver/Result.h +++ b/src/server/theoneserver/Result.h @@ -23,7 +23,7 @@ class Statement; ////////////////////////////////////////////////////////////////////////////// // class Result; -// Result ʿ䰡 . ڴ Statement ϸ ȴ. +// Result 는 삭제할 필요가 없다. 사용자는 Statement 만 삭제하면 된다. ////////////////////////////////////////////////////////////////////////////// class Result { @@ -32,10 +32,10 @@ class Result { ~Result() throw(); public: - // row Ѿ. + // 다음 row로 넘어간다. bool next() throw(Error); - // Ư ʵ(÷) ´. + // 특정 필드(컬럼) 값을 가지고 온다. char* getField(uint index) throw(OutOfBoundException, Error); char getChar(uint index) throw(OutOfBoundException, Error) { return (getField(index))[0]; @@ -57,7 +57,7 @@ class Result { } const char* getString(uint index) throw(OutOfBoundException, Error); - // ϴ row/column ڸ Ѵ. + // 쿼리 결과값이 포함하는 row/column의 숫자를 리턴한다. uint getRowCount() const throw() { return m_RowCount; } @@ -70,11 +70,11 @@ class Result { } private: - T_RESULT* m_pResult; // Ÿ MYSQL structure - MYSQL_ROW m_pRow; // óϰ ִ row - uint m_RowCount; //  row + T_RESULT* m_pResult; // 결과값을 나타내는 MYSQL structure + MYSQL_ROW m_pRow; // 현재 처리하고 있는 row + uint m_RowCount; // 쿼리 결과로 얻어낸 row의 숫자 uint m_FieldCount; - string m_Statement; //  query ΰ...? + string m_Statement; // 어떤 query문에 의한 결과인가...? }; #endif // __RESULT_H__ diff --git a/src/server/theoneserver/Statement.cpp b/src/server/theoneserver/Statement.cpp index 034f384d..228f35db 100644 --- a/src/server/theoneserver/Statement.cpp +++ b/src/server/theoneserver/Statement.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // File Name : Statement.cpp // Written by : Gday29@ewestsoft.com -// Description : SQL .. +// Description : SQL 문을 만든다.. ////////////////////////////////////////////////////////////////////////////// #include "Statement.h" @@ -41,14 +41,14 @@ Statement::Statement(char* fmt, ...) throw(Error) { int nchars = vsnprintf(buffer, 2048, fmt, valist); - // ũⰡ ϰ Ǹ, Ѿ Ѵ. + // 만약 버퍼 크기가 부족하게 되면, 에러를 던져서 수동으로 값을 증가시켜야 한다. if (nchars == -1 || nchars > 2048) throw Error("more buffer size needed for SQL statement buffer..."); va_end(valist); - // string ̹Ƿ ص ϴ. - // char * ٸ, local variable ϴ ϴ. + // string 이므로 대입해도 안전하다. + // 만약 char * 였다면, local variable을 포인팅하는 것은 위험하다. m_Statement = buffer; __END_CATCH @@ -58,7 +58,7 @@ Statement::Statement(char* fmt, ...) throw(Error) { // // destructor // -// ޸𸮿 Ѵ. +// 쿼리문에서 만든 결과를 메모리에서 해제한다. // ////////////////////////////////////////////////////////////////////// @@ -78,7 +78,7 @@ Statement::~Statement() throw() { // // executeQuery() // -// Connection, SQL Ʈ ޾Ƽ Result * Ѵ. +// Connection, SQL문을 스트링으로 받아서 결과값을 Result *로 리턴한다. // ////////////////////////////////////////////////////////////////////// @@ -88,7 +88,7 @@ Result* Statement::executeQuery() throw(SQLQueryException, Error) { Assert(m_pConnection != NULL); if (m_pResult != NULL) { - // ø̼ǿ Result , + // 어플리케이션에서 Result 를 삭제하지 않은 경우, delete m_pResult; m_pResult = NULL; } @@ -105,7 +105,7 @@ Result* Statement::executeQuery() throw(SQLQueryException, Error) { MYSQL_RES* pResult = mysql_store_result(m_pConnection->getMYSQL()); - // NULL updatḛų ̴. + // 쿼리 결과값이 NULL일 경우는 update문이거나 에러이다. if (pResult != NULL) { m_pResult = new Result(pResult, m_Statement); } else { @@ -130,7 +130,7 @@ Result* Statement::executeQuery() throw(SQLQueryException, Error) { // // executeQuery () // -// Connection, SQL Ʈ ޾Ƽ Result * Ѵ. +// Connection, SQL문을 스트링으로 받아서 결과값을 Result *로 리턴한다. // ////////////////////////////////////////////////////////////////////// @@ -148,14 +148,14 @@ Result* Statement::executeQuery(const string& sqlStatement) throw(SQLQueryExcept // // executeQuery () // -// Connection, SQL Ʈ ޾Ƽ Result * Ѵ. +// Connection, SQL문을 스트링으로 받아서 결과값을 Result *로 리턴한다. // ////////////////////////////////////////////////////////////////////// Result* Statement::executeQuery(char* fmt, ...) throw(SQLQueryException, Error) { __BEGIN_TRY - // SQL Statement . + // SQL Statement 를 만들어낸다. va_list valist; va_start(valist, fmt); @@ -164,7 +164,7 @@ Result* Statement::executeQuery(char* fmt, ...) throw(SQLQueryException, Error) int nchars = vsnprintf(buffer, 2048, fmt, valist); - // ũⰡ ϰ Ǹ, ܸ Ѿ Ѵ. + // 만약 버퍼 크기가 부족하게 되면, 예외를 던져서 값을 증가시켜야 한다. if (nchars == -1 || nchars > 2048) throw Error("more buffer size needed for SQL statement buffer..."); @@ -181,7 +181,7 @@ Result* Statement::executeQuery(char* fmt, ...) throw(SQLQueryException, Error) // // setStatement() // -// ٽ . +// 쿼리문을 다시 만든다. // ////////////////////////////////////////////////////////////////////// @@ -198,7 +198,7 @@ void Statement::setStatement(char* fmt, ...) throw(Error) { int nchars = vsnprintf(buffer, 2048, fmt, valist); - // ũⰡ ϰ Ǹ, ܸ Ѿ Ѵ. + // 만약 버퍼 크기가 부족하게 되면, 예외를 던져서 값을 증가시켜야 한다. if (nchars == -1 || nchars > 2048) throw Error("more buffer size needed for SQL statement buffer..."); diff --git a/src/server/theoneserver/Statement.h b/src/server/theoneserver/Statement.h index 1be8147c..d4fdb6e9 100644 --- a/src/server/theoneserver/Statement.h +++ b/src/server/theoneserver/Statement.h @@ -2,7 +2,7 @@ // // File Name : Statement.h // Written by : Gday29@ewestsoft.com -// Description : SQL .. +// Description : SQL ¹®À» ¸¸µç´Ù.. // ////////////////////////////////////////////////////////////////////// @@ -21,7 +21,7 @@ class Result; // // class Statement; // -// SQL Ѵ. +// SQL¹®À» ¸¸µé¾î µðºñ¿¡ Äõ¸®ÇÑ´Ù. // ////////////////////////////////////////////////////////////////////// @@ -37,10 +37,10 @@ class Statement { ~Statement() throw(); public: - // SQL Ѵ. + // »çÀü¿¡ ÁöÁ¤µÈ SQL ¹®À» °¡Áö°í Äõ¸®ÇÑ´Ù. Result* executeQuery() throw(SQLQueryException, Error); - // SQL ޾Ƽ Ѵ. + // SQL ¹®À» ¹Þ¾Æ¼­ Äõ¸®ÇÑ´Ù. Result* executeQuery(char*, ...) throw(SQLQueryException, Error); Result* executeQuery(const string& sqlStatement) throw(SQLQueryException, Error); @@ -49,7 +49,7 @@ class Statement { return m_Statement; } - // SQL Ѵ. + // SQL ¹®À» ÁöÁ¤ÇÑ´Ù. void setStatement(char* fmt, ...) throw(Error); // get connection object @@ -77,13 +77,13 @@ class Statement { // Connection Connection* m_pConnection; - // SQL Statement + // SQL Statement¹ string m_Statement; // Query Result Result* m_pResult; - // insert, update, delete row + // insert, update, delete ÇßÀ» ¶§ ¿µÇâÀ» ¹ÞÀº row ÀÇ °³¼ö uint m_nAffectedRows; }; diff --git a/src/server/theoneserver/TheOneServer.cpp b/src/server/theoneserver/TheOneServer.cpp index 731ea64f..8020e8b4 100644 --- a/src/server/theoneserver/TheOneServer.cpp +++ b/src/server/theoneserver/TheOneServer.cpp @@ -2,7 +2,7 @@ // // Filename : TheOneServer.cpp // Written By : reiot@ewestsoft.com -// Description : α Ŭ +// Description : 로그인 서버용 메인 클래스 // ////////////////////////////////////////////////////////////////////// @@ -19,7 +19,7 @@ // // constructor // -// ý Ŵ constructor Ŵ ü Ѵ. +// 시스템 매니저의 constructor에서는 하위 매니저 객체를 생성한다. // ////////////////////////////////////////////////////////////////////// TheOneServer::TheOneServer() throw(Error) { @@ -43,7 +43,7 @@ TheOneServer::TheOneServer() throw(Error) { // // destructor // -// ý Ŵ destructor Ŵ ü ؾ Ѵ. +// 시스템 매니저의 destructor에서는 하위 매니저 객체를 삭제해야 한다. // ////////////////////////////////////////////////////////////////////// TheOneServer::~TheOneServer() throw(Error) { @@ -66,13 +66,13 @@ void TheOneServer::init() throw(Error) { __BEGIN_TRY cout << "Init DatabaseManager..." << endl; - // Ÿ̽Ŵ ʱȭѴ. + // 데이타베이스매니저를 초기화한다. g_pDatabaseManager->init(); cout << "Init DatabaseManager Complete!" << endl; g_pPacketFactoryManager->init(); - // Ŵ ʱȭѴ. + // 서버간 통신 매니저를 초기화한다. g_pGameServerManager->init(); __END_CATCH @@ -87,7 +87,7 @@ void TheOneServer::init() throw(Error) { void TheOneServer::start() throw(Error) { __BEGIN_TRY - // Ŵ Ѵ. + // 서버간 통신 매니저를 시작한다. g_pGameServerManager->start(); __END_CATCH @@ -98,9 +98,9 @@ void TheOneServer::start() throw(Error) { // // stop login server // -// stop ϵ . ִ Ŵ -// stop Ѿ Ѵ. ݴ stop ų null pointer -// ߻ ִ. +// stop 순서에 유의하도록 하자. 가장 영향을 많이 주는 매니저부터 +// stop 시켜야 한다. 만일 반대의 순서로 stop 시킬 경우 null pointer +// 같은 현상이 발생할 수 있다. // ////////////////////////////////////////////////////////////////////// void TheOneServer::stop() throw(Error) { diff --git a/src/server/theoneserver/TheOneServer.h b/src/server/theoneserver/TheOneServer.h index c6009555..76118316 100644 --- a/src/server/theoneserver/TheOneServer.h +++ b/src/server/theoneserver/TheOneServer.h @@ -2,14 +2,14 @@ // // Filename : TheOneServer.h // Written By : reiot@ewestsoft.com -// Description : α Ŭ +// Description : 로그인 서버용 메인 클래스 // ////////////////////////////////////////////////////////////////////// #ifndef __THE_ONE_SERVER_H__ #define __THE_ONE_SERVER_H__ -// ԵǸ, α ȴ. +// 이 모듈이 포함되면, 로그인 서버 모듈이 된다. #ifndef __THE_ONE_SERVER__ #define __THE_ONE_SERVER__ #endif @@ -22,7 +22,7 @@ // // class TheOneServer // -// α ü Ÿ Ŭ̴. +// 로그인 서버 자체를 나타내는 클래스이다. // ////////////////////////////////////////////////////////////////////// diff --git a/src/server/theoneserver/ThreadManager.cpp b/src/server/theoneserver/ThreadManager.cpp index f4a3e1f3..5172ae7b 100644 --- a/src/server/theoneserver/ThreadManager.cpp +++ b/src/server/theoneserver/ThreadManager.cpp @@ -23,7 +23,7 @@ ThreadManager::ThreadManager() throw(Error) : m_pZoneGroupThreadPool(NULL) { __BEGIN_TRY - // Ǯ Ѵ. + // 존쓰레드풀을 생성한다. m_pZoneGroupThreadPool = new ThreadPool(); __END_CATCH @@ -34,7 +34,7 @@ ThreadManager::ThreadManager() throw(Error) : m_pZoneGroupThreadPool(NULL) { // // destructor // -// Stop() ʾ Ѿ Ѵ. State ұ? +// Stop()이 되지 않았을 경우 실행시켜야 한다. State 개념을 도입할까? // //-------------------------------------------------------------------------------- ThreadManager::~ThreadManager() throw(Error) { @@ -48,19 +48,19 @@ ThreadManager::~ThreadManager() throw(Error) { //-------------------------------------------------------------------------------- // -// Ŵ ʱȭѴ. +// 쓰레드 매니저를 초기화한다. // -// Ǯ , ϽŲ. +// 하위 쓰레드풀에 쓰레드들을 생성, 등록시킨다. // // *CAUTION* // -// 翬, Ŵ ʱȭϱ , ׷Ŵ ʱȭؾ Ѵ. +// 당연히, 쓰레드 매니저를 초기화하기 전에, 존그룹매니저를 초기화해야 한다. // //-------------------------------------------------------------------------------- void ThreadManager::init() throw(Error) { __BEGIN_TRY - // 带 Ѵ. + // 존 쓰레드를 등록한다. Statement* pStmt = NULL; Result* pResult = NULL; @@ -86,13 +86,13 @@ void ThreadManager::init() throw(Error) { // // activate sub thread pools // -// Ǯ ȰȭŲ. +// 하위 쓰레드 풀을 활성화시킨다. // //-------------------------------------------------------------------------------- void ThreadManager::start() throw(Error) { __BEGIN_TRY - // Zone Thread Pool ȰȭŲ. + // Zone Thread Pool 을 활성화시킨다. m_pZoneGroupThreadPool->start(); __END_CATCH @@ -103,7 +103,7 @@ void ThreadManager::start() throw(Error) { // // deactivate sub thread pools // -// Ǯ Ų. +// 하위 쓰레드 풀을 종료시킨다. // //-------------------------------------------------------------------------------- void ThreadManager::stop() throw(Error) { diff --git a/src/server/theoneserver/ThreadManager.h b/src/server/theoneserver/ThreadManager.h index d31734a0..28aec201 100644 --- a/src/server/theoneserver/ThreadManager.h +++ b/src/server/theoneserver/ThreadManager.h @@ -21,12 +21,12 @@ class ThreadPool; // // class ThreadManager // -// (!) Ǯ Ѵ. Ӽκ init, start, -// stop Ǯ ޽带 ȣѴ. +// 게임 서버상의 모든(!) 쓰레드풀을 관리한다. 게임서버로부터 init, start, +// stop 명령이 떨어지면 하위 쓰레드풀의 같은 메쏘드를 호출한다. // -// init : Ǯ ɼǿ 带 , Ѵ. -// start : Ǯ ϵ Ȱȭ(start)Ų. -// stop : Ǯ ϵ Ȱȭ(stop)Ų. +// init : 각 쓰레드풀에 옵션에서 지정한 개수의 쓰레드를 생성, 등록한다. +// start : 각 쓰레드풀에 등록된 쓰레드들을 활성화(start)시킨다. +// stop : 각 쓰레드풀에 등록된 쓰레드들을 비활성화(stop)시킨다. // ////////////////////////////////////////////////////////////////////// @@ -40,25 +40,25 @@ class ThreadManager { public: - // Ŵ ʱȭѴ. + // 쓰레드 매니저를 초기화한다. void init() throw(Error); // activate sub thread pools - // Ǯ ȰȭŲ. + // 하위 쓰레드 풀을 활성화시킨다. void start() throw(Error); // deactivate sub thread pools - // Ǯ Ų. + // 하위 쓰레드 풀을 종료시킨다. void stop() throw(Error); // #ifdef __NO_COMBAT__ ThreadPool* getThreadPool() { return m_pZoneGroupThreadPool; - } // 漮 + } // 김경석 // #endif private: - // Ǯ + // 쓰레드풀 ThreadPool* m_pZoneGroupThreadPool; }; diff --git a/src/server/theoneserver/ThreadPool.cpp b/src/server/theoneserver/ThreadPool.cpp index ffbb7429..f1ce8ef9 100644 --- a/src/server/theoneserver/ThreadPool.cpp +++ b/src/server/theoneserver/ThreadPool.cpp @@ -22,7 +22,7 @@ ////////////////////////////////////////////////// // -// ̳ʼ ü Ư TID true Ѵ. +// 컨테이너속의 쓰레드 객체가 특정 TID를 갖고 있을 경우 true를 리턴한다. // class isSameTID { public: @@ -53,7 +53,7 @@ ThreadPool::ThreadPool() throw() { ////////////////////////////////////////////////////////////////////// // destructor -// ϰ ִ ü ؾ Ѵ. +// 포함하고 있는 모든 쓰레드 객체를 삭제해야 한다. ////////////////////////////////////////////////////////////////////// ThreadPool::~ThreadPool() throw() { __BEGIN_TRY @@ -69,7 +69,7 @@ ThreadPool::~ThreadPool() throw() { { Thread* temp = *itr; - // ¿ Ѵ. + // 쓰레드는 종료한 상태여야 한다. Assert(temp != NULL && temp->getStatus() == Thread::EXIT); SAFE_DELETE(temp); @@ -84,9 +84,9 @@ ThreadPool::~ThreadPool() throw() { list::iterator itr; while ((itr = m_Threads.begin()) != m_Threads.end()) { - // Ʈ 尡 ִٴ ̴. + // 아직도 리스트에 노드가 남아있다는 뜻이다. - // ¿ Ѵ. + // 쓰레드는 종료한 상태여야 한다. Assert(*itr != NULL && (*itr)->getStatus() == Thread::EXIT); SAFE_DELETE(*itr); @@ -104,7 +104,7 @@ ThreadPool::~ThreadPool() throw() { ////////////////////////////////////////////////////////////////////// -// Ǯȿ ϵ RUNNING · . +// 쓰레드풀안에 등록된 쓰레드들을 RUNNING 상태로 만든다. ////////////////////////////////////////////////////////////////////// void ThreadPool::start() throw(Error) { __BEGIN_TRY @@ -135,8 +135,8 @@ void ThreadPool::start() throw(Error) { ////////////////////////////////////////////////////////////////////// -// Ǯȿ ϵ ߴܽŲ. -// (̴ singal Ȥ cancellation ؾ ϰڴ.) +// 쓰레드풀안에 등록된 모든 쓰레드의 실행을 중단시킨다. +// (이는 singal 혹은 cancellation 으로 구현해야 하겠다.) ////////////////////////////////////////////////////////////////////// void ThreadPool::stop() throw(Error) { __BEGIN_TRY @@ -148,7 +148,7 @@ void ThreadPool::stop() throw(Error) { ////////////////////////////////////////////////////////////////////// -// Ǯ ü Ѵ. +// 쓰레드풀에 쓰레드 객체를 등록한다. ////////////////////////////////////////////////////////////////////// void ThreadPool::addThread(Thread* thread) throw(Error) { __BEGIN_TRY @@ -158,10 +158,10 @@ void ThreadPool::addThread(Thread* thread) throw(Error) { ////////////////////////////////////////////////// m_Mutex.lock(); - // ƴϾ Ѵ. + // 쓰레드는 널이 아니어야 한다. Assert(thread != NULL); - // Ʈ ü Ѵ. + // 리스트의 맨 마지막에 쓰레드 객체를 삽입한다. m_Threads.push_back(thread); string msg = "== " + thread->getName() + " added to thread pool"; @@ -177,7 +177,7 @@ void ThreadPool::addThread(Thread* thread) throw(Error) { ////////////////////////////////////////////////////////////////////// -// Ǯ Ư ü Ѵ. +// 쓰레드풀에서 특정 쓰레드 객체를 삭제한다. ////////////////////////////////////////////////////////////////////// void ThreadPool::deleteThread(TID tid) throw(NoSuchElementException, Error) { __BEGIN_TRY @@ -187,27 +187,27 @@ void ThreadPool::deleteThread(TID tid) throw(NoSuchElementException, Error) { ////////////////////////////////////////////////// m_Mutex.lock(); - // function object Ư TID ü 带 - // iterator ãƳ. + // function object로 특정 TID를 가진 쓰레드 객체가 담긴 노드를 담은 + // iterator를 찾아낸다. list::iterator itr = find_if(m_Threads.begin(), m_Threads.end(), isSameTID(tid)); if (itr != m_Threads.end()) // found! { - // ü ӽ÷ صд. + // 쓰레드 객체를 임시로 저장해둔다. Thread* temp = *itr; - // ¿ Ѵ. - // Ŭ Mutex , getStatus(), setStatus() Mutex ȣǾ Ѵ. + // 쓰레드는 종료한 상태여야 한다. + // 하위 클래스에 Mutex가 존재할 경우, getStatus(), setStatus()는 Mutex로 보호되어야 한다. Assert(temp != NULL && temp->getStatus() == Thread::EXIT); StringStream msg; msg << "== Thread[" << temp->getTID() << "] has been removed from ThreadPool =="; log(LOG_DEBUG_MSG, "", "", msg.toString()); - // ü Ѵ. + // 쓰레드 객체를 삭제한다. SAFE_DELETE(temp); - // 带 Ѵ. + // 노드를 삭제한다. m_Threads.erase(itr); } else // not found { @@ -232,7 +232,7 @@ void ThreadPool::deleteThread(TID tid) throw(NoSuchElementException, Error) { ////////////////////////////////////////////////////////////////////// -// Ǯ Ư ü ãƼ Ѵ. +// 쓰레드풀에서 특정 쓰레드 객체를 찾아서 리턴한다. ////////////////////////////////////////////////////////////////////// Thread* ThreadPool::getThread(TID tid) throw(NoSuchElementException, Error) { __BEGIN_TRY diff --git a/src/server/theoneserver/ThreadPool.h b/src/server/theoneserver/ThreadPool.h index e1fafc2b..cfbb9839 100644 --- a/src/server/theoneserver/ThreadPool.h +++ b/src/server/theoneserver/ThreadPool.h @@ -29,10 +29,10 @@ // // class ThreadPool // -// ü ÷ Ŭ̴. Ȱ -// ߴܽų , Ǯ ü Stop޽带 ϸ ȴ. -// ñ׳̳ ĵ̼ ̴. ׷, ڷᰡ  -// ϰ ִ. ^^; +// 쓰레드 객체들의 컬렉션 클래스이다. 서버 종료시 활동중인 모든 쓰레드들을 +// 중단시킬 때, 쓰레드풀 객체의 Stop메쏘드를 사용하면 된다. 내부적으로 +// 시그널이나 캔슬레이션이 사용될 전망이다. 그런데, 아직은 자료가 없어서 +// 구현을 못하고 있다. ^^; // ////////////////////////////////////////////////////////////////////// @@ -45,7 +45,7 @@ class ThreadPool { ThreadPool() throw(); // destructor - // ϰ ִ ü ؾ Ѵ. + // 포함하고 있는 모든 쓰레드 객체를 삭제해야 한다. virtual ~ThreadPool() throw(); @@ -53,26 +53,26 @@ class ThreadPool { // methods ////////////////////////////////////////////////// public: - // Ǯȿ ϵ RUNNING · . + // 쓰레드풀안에 등록된 쓰레드들을 RUNNING 상태로 만든다. void start() throw(Error); - // Ǯȿ ϵ ߴܽŲ. - //(̴ singal Ȥ cancellation ؾ ϰڴ.) + // 쓰레드풀안에 등록된 모든 쓰레드의 실행을 중단시킨다. + //(이는 singal 혹은 cancellation 으로 구현해야 하겠다.) void stop() throw(Error); - // Ǯ ü Ѵ. + // 쓰레드풀에 쓰레드 객체를 등록한다. void addThread(Thread* thread) throw(Error); - // Ǯ Ư ü Ѵ. + // 쓰레드풀에서 특정 쓰레드 객체를 삭제한다. void deleteThread(TID tid) throw(NoSuchElementException, Error); - // Ǯ Ư ü ãƼ Ѵ. + // 쓰레드풀에서 특정 쓰레드 객체를 찾아서 리턴한다. Thread* getThread(TID tid) throw(NoSuchElementException, Error); // #ifdef __NO_COMBAT__ list getThreads() { return m_Threads; - } // 漮 + } // 김경석 // #endif ////////////////////////////////////////////////// @@ -80,9 +80,9 @@ class ThreadPool { ////////////////////////////////////////////////// private: // - // ü Ϳ Ʈ - // δ Ŭ Ŭ  ȴ. - // Ϲ ϵȴ. + // 쓰레드 객체의 포인터에 대한 리스트 + // 실제로는 쓰레드 클래스의 하위 클래스가 들어가게 된다. + // 일반적으로 같은 종류의 쓰레드들이 등록된다. // // ex> PlayerThreadPool - PlayerThread // NPCThreadPool - NPCThread diff --git a/src/server/theoneserver/UDPManager.cpp b/src/server/theoneserver/UDPManager.cpp index f1a698aa..20b1352a 100644 --- a/src/server/theoneserver/UDPManager.cpp +++ b/src/server/theoneserver/UDPManager.cpp @@ -56,17 +56,17 @@ void UDPManager::sendPacket(const string& host, uint port, DatagramPacket* pPack __BEGIN_DEBUG try { - // ͱ׷ ü ϳ ΰ, peer ȣƮ Ʈ Ѵ. + // 데이터그램 객체를 하나 두고, 전송할 peer 의 호스트와 포트를 지정한다. Datagram datagram; datagram.setHost(host); datagram.setPort(port); - // ͱ׷ Ŷ ͱ׷ ִ´. + // 데이터그램 패킷을 데이터그램에 집어넣는다. datagram.write(pPacket); - // ͱ׷ ؼ ͱ׷ Ѵ. + // 데이터그램 소켓을 통해서 데이터그램을 전송한다. m_pDatagramSocket->send(&datagram); } catch (Throwable& t) { // cerr << "====================================================================" << endl; diff --git a/src/server/theoneserver/UDPManager.h b/src/server/theoneserver/UDPManager.h index a63a1bda..fe013688 100644 --- a/src/server/theoneserver/UDPManager.h +++ b/src/server/theoneserver/UDPManager.h @@ -16,8 +16,8 @@ ////////////////////////////////////////////////////////////////////////////// // class UDPManager; // -// α ϴ ̴. -// ο ͱ׷ ϳ ŷ Ѵ. +// 로그인 서버와의 통신을 전담하는 쓰레드이다. +// 내부에 데이터그램 서버소켓을 하나 가지고 블로킹 기반으로 동작한다. ////////////////////////////////////////////////////////////////////////////// class UDPManager { @@ -32,7 +32,7 @@ class UDPManager { private: - DatagramSocket* m_pDatagramSocket; // UDP + DatagramSocket* m_pDatagramSocket; // UDP 서버 소켓 }; // global variable declaration diff --git a/src/server/theoneserver/main.cpp b/src/server/theoneserver/main.cpp index 822cd05d..2963164a 100644 --- a/src/server/theoneserver/main.cpp +++ b/src/server/theoneserver/main.cpp @@ -2,7 +2,7 @@ // // Filename : main.cpp // Written By : reiot@ewestsoft.com -// Description : Լ +// Description : 절대 서버용 메인 함수 // ////////////////////////////////////////////////////////////////////// @@ -34,34 +34,34 @@ void memoryError() { // ////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { - // ޸ .. Լ Ѵ. + // 메모리 없다.. 함수를 설정한다. set_new_handler(memoryError); cerr << "Processing Arguments..." << endl; if (argc < 3) { - cout << "Usage : theoneserver -f ȯ [-p port]" << endl; + cout << "Usage : theoneserver -f 환경파일 [-p port]" << endl; exit(1); } - // command-line parameter string ȯѴ. ^^; + // command-line parameter를 string 으로 변환한다. ^^; vector Argv; Argv.reserve(argc); for (int i = 0; i < argc; i++) Argv.push_back(argv[i]); - // ȯ оδ. - // $VSHOME/bin, ȯ $VSHOME/conf ؾ Ѵ. - // command line ȯ ֵ Ѵ. + // 환경 파일을 읽어들인다. + // 단 실행 파일은 $VSHOME/bin에, 환경 파일은 $VSHOME/conf 에 존재해야 한다. + // command line 에서 환경 파일을 지정할 수 있도록 한다. try { if (Argv[1] != "-f") { - throw Error("Usage : loginserver -f ȯ [-p port]"); + throw Error("Usage : loginserver -f 환경파일 [-p port]"); } cerr << "Making Properties.." << endl; - // ù° ĶͰ -f , ι° Ķʹ ȯ ġ ȴ. + // 첫번째 파라미터가 -f 일 경우, 두번째 파라미터는 환경파일의 위치가 된다. g_pConfig = new Properties(); g_pConfig->load(Argv[2]); @@ -77,7 +77,7 @@ int main(int argc, char* argv[]) { try { if (argc > 3) { if (argc < 5 || Argv[3] != "-p") - throw Error("Usage : theoneserver -f ȯ [-p port]"); + throw Error("Usage : theoneserver -f 환경파일 [-p port]"); g_pConfig->setProperty("TheOneServerUDPPort", Argv[4]); cout << "TheOneServerUDPPort : " << g_pConfig->getProperty("TheOneServerUDPPort") << endl; @@ -92,7 +92,7 @@ int main(int argc, char* argv[]) { cerr << "Processing Arguments Complete!" << endl; // - // ü ϰ ʱȭ ȰȭŲ. + // 절대 서버 객체를 생성하고 초기화한 후 활성화시킨다. // try { struct rlimit rl; @@ -100,19 +100,19 @@ int main(int argc, char* argv[]) { rl.rlim_max = RLIM_INFINITY; setrlimit(RLIMIT_CORE, &rl); - // ü Ѵ. + // 절대 서버 객체를 생성한다. g_pTheOneServer = new TheOneServer(); - // ü ʱȭѴ. + // 절대 서버 객체를 초기화한다. g_pTheOneServer->init(); - // ü ȰȭŲ. + // 절대 서버 객체를 활성화시킨다. g_pTheOneServer->start(); } catch (Throwable& e) { cerr << e.toString() << endl; - // ߴܽŲ. - // ο Ŵ ߴܵǾ Ѵ. + // 절대 서버를 중단시킨다. + // 이 내부에서 하위 매니저 역시 중단되어야 한다. g_pTheOneServer->stop(); } } diff --git a/src/server/updateserver/UpdateServer.cpp b/src/server/updateserver/UpdateServer.cpp index 89c957b3..2dd172bd 100644 --- a/src/server/updateserver/UpdateServer.cpp +++ b/src/server/updateserver/UpdateServer.cpp @@ -112,25 +112,25 @@ void UpdateServer::run() throw() { const int exitFlagSize = 1; char exitFlag[exitFlagSize]; - // pipe child .. . by sigi. 2002.11.9 + // pipe로 child와 통신.. 허접하지만. by sigi. 2002.11.9 if (pipe(p) < 0) { // cout << "cannot create pipe" << endl; exit(0); } - // nonblock + // nonblock 설정 int flags = fcntl(p[0], F_GETFL, 0); flags |= O_NONBLOCK; fcntl(p[0], F_SETFL, flags); - // client + // 현재 접속중인 client 숫자 int nClient = 0; int maxClient = g_pConfig->getPropertyInt("MaxClient"); int connectClient = 0; int disconnectClient = 0; - // fork Ѱ exception catchҶ by sigi. 2002.11.9 + // fork 한계로 exception catch할때 사용 by sigi. 2002.11.9 bool bBeforeFork = false; int tick = 0; @@ -168,7 +168,7 @@ void UpdateServer::run() throw() { /* pSocket->setNonBlocking(false); - // ۸ ø. + // 소켓의 버퍼를 늘린다. pSocket->setSendBufferSize(60000000); pSocket->setReceiveBufferSize(100000000); */ @@ -197,16 +197,16 @@ void UpdateServer::run() throw() { } - // child ȰŸ üũش. by sigi. 2002.11.9 + // child가 종료된거를 체크해준다. by sigi. 2002.11.9 int nExitClient = 0; while (1) { int nRead = read(p[0], exitFlag, exitFlagSize); - // . + // 읽을게 없는 경우다. if (nRead == -1) break; - // ϳ child ƴٴ . + // 하나의 child가 종료됐다는 얘기다. nExitClient++; disconnectClient++; } @@ -221,7 +221,7 @@ void UpdateServer::run() throw() { getCurrentTime(currentTime); if (nextTime.tv_sec < currentTime.tv_sec) { - // + // 접속지 기록 unordered_map::const_iterator itr = IPs.begin(); for (; itr != IPs.end(); itr++) { const string& IP = itr->first; @@ -247,7 +247,7 @@ void UpdateServer::run() throw() { } - // д. by sigi. 2002.11.9 + // 사용자 제한을 둔다. by sigi. 2002.11.9 if (nClient > maxClient) { // cout << "Not Accept More: " << nClient << "/" << maxClient << endl; delete pSocket; @@ -257,7 +257,7 @@ void UpdateServer::run() throw() { } //-------------------------------------------------------------------------------- - // Ȱ Ʈ ؼ, select fork() ؼ 1:1 Ѵ. + // 원활한 업데이트를 위해서, select 대신 fork()를 사용해서 1:1 서버를 구현한다. //-------------------------------------------------------------------------------- bool bBeforeFork = true; nClient++; @@ -291,8 +291,8 @@ void UpdateServer::run() throw() { // cout << "CHILD PROCESS EXIT" << endl; - //  μ Ѵ. - write(p[1], exitFlag, exitFlagSize); // parent ˸. by sigi. 2002.11.9 + // 루프를 벗어나서 프로세스를 종료한다. + write(p[1], exitFlag, exitFlagSize); // parent에게 알린다. by sigi. 2002.11.9 exit(0); } else { // case of parent @@ -307,9 +307,9 @@ void UpdateServer::run() throw() { } catch (Error& e) { - // fork ȵ + // fork가 안된 경우 if (bBeforeFork) { - // + // 무시 filelog("parentExceptionLog.txt", "%s", e.toString().c_str()); } else { filelog("parentExceptionLog.txt", "%s", e.toString().c_str()); @@ -334,15 +334,15 @@ void UpdateServer::run() throw() { //-------------------------------------------------------------------------------- // -// ý ʱȭ +// 시스템 레벨의 초기화 // //-------------------------------------------------------------------------------- void UpdateServer::sysinit() throw(Error) { __BEGIN_TRY - signal(SIGPIPE, SIG_IGN); // ̰Ŵ ߻ - signal(SIGALRM, SIG_IGN); // ˶ ϴ , ǻ - signal(SIGCHLD, SIG_IGN); // fork ϴ , ǻ + signal(SIGPIPE, SIG_IGN); // 이거는 종종 발생할 듯 + signal(SIGALRM, SIG_IGN); // 알람 하는 경우는 엄따, 예의상 + signal(SIGCHLD, SIG_IGN); // fork 하는 경우는 엄따, 예의상 __END_CATCH } @@ -350,8 +350,8 @@ void UpdateServer::sysinit() throw(Error) { //-------------------------------------------------------------------------------- // -// ߿ ַܼ ʿ䰡 ŭ Ǹ, -// Լ ȣϵ Ѵ. +// 나중에 콘솔로 출력할 필요가 없어질 만큼 안정적이 되면, +// 이 함수를 호출하도록 한다. // //-------------------------------------------------------------------------------- void UpdateServer::goBackground() throw(Error) { diff --git a/src/server/updateserver/UpdateServerPlayer.cpp b/src/server/updateserver/UpdateServerPlayer.cpp index 6365602d..fa4c0bae 100644 --- a/src/server/updateserver/UpdateServerPlayer.cpp +++ b/src/server/updateserver/UpdateServerPlayer.cpp @@ -21,22 +21,22 @@ // // *CAUTION* // -// Ʈ ÷̾ Ŭ̾Ʈ ϱ , -// ÷̾ Ŭ ½Ʈ õ κи ָ ȴ. ֳϸ, -// ũ⸦ ¿ ۸ϰ Ǹ ֱ -// ̴. , ۸ ʴ ؾ ϰڴ. Է κ -// ۸ ص ϴ. +// 업데이트 서버용 플레이어는 파일의 내용을 클라이언트로 전송하기 때문에, 기존의 +// 플레이어 클래스에서 소켓출력스트림과 관련된 부분만을 재정의해주면 된다. 왜냐하면, +// 파일의 크기를 알 수 없는 상태에서 출력을 버퍼링하게 되면 문제가 생길 소지가 있기 +// 때문이다. 따라서, 버퍼링하지 않는 출력 방법을 모색해야 하겠다. 단 입력 부분은 +// 이전과 같이 버퍼링을 해도 무방하다. // -// Ҷ, ٸ ÷̾ Ŭʹ ޸, Player Ŭ ڸ -// ȣ ʴ´. ̴ SocketOutputStream ʴ Player Ʈ ڸ -// ȣϵ ϱ ؼ̴. +// 생성할때, 다른 플레이어 하위 클래스와는 달리, Player 클래스의 생성자를 명시적으로 +// 호출하지 않는다. 이는 SocketOutputStream 이 생성되지 않는 Player의 디폴트 생성자를 +// 호출하도록 하기 위해서이다. // //-------------------------------------------------------------------------------- -// static int maxIdleSec = 60 * 5; // 5. -static int maxIdleSec = 30; // 20 +// static int maxIdleSec = 60 * 5; // 5분. +static int maxIdleSec = 30; // 20초 -// Http ٲ ̻ buffer ʿ ʴ. -// Ȥö SocketInputStream resize Ǵ Ȯ ߰. +// Http 방식으로 바꿨기 때문에 더 이상 buffer는 많이 필요하지 않다. +// 혹시라도 SocketInputStream이 resize 되는지는 확이해 봐야겠지. // by sigi. 2002.11.11 const int clientBufferSize = 1024; @@ -54,7 +54,7 @@ UpdateServerPlayer::UpdateServerPlayer(Socket* pSocket) throw(Error) Assert(m_pOutputStream == NULL); try { - // Է½Ʈ ״ ش. + // 소켓입력스트림은 그대로 생성해준다. m_pInputStream = new SocketInputStream(m_pSocket, clientBufferSize); } catch (Error& t) { filelog("updateServerPlayerBUG.txt", "%s", t.toString().c_str()); @@ -75,8 +75,8 @@ UpdateServerPlayer::UpdateServerPlayer(Socket* pSocket) throw(Error) UpdateServerPlayer::~UpdateServerPlayer() throw(Error) { __BEGIN_TRY - //  ÷̾ ü , ´ α׾ƿ̾ Ѵ. - //  ÷̾ Ű, ¸ α׾ƿ Ѵ. + // 그 어떤 플레이어 객체가 삭제될 때에도, 그 상태는 로그아웃이어야 한다. + // 즉 어떤 플레이어를 접속 종료 시키려면, 그 상태를 로그아웃으로 만들어야 한다. Assert(m_PlayerStatus == USPS_END_SESSION); __END_CATCH @@ -87,7 +87,7 @@ UpdateServerPlayer::~UpdateServerPlayer() throw(Error) { // // parse packet and execute handler for the packet // -// Ŷ丮 ʴ ʿ ̴. -_-; +// 패킷팩토리를 사용하지 않는 이유는 필요없기 때문이다. -_-; // //-------------------------------------------------------------------------------- void UpdateServerPlayer::processCommand() throw(IOException, Error) { @@ -107,7 +107,7 @@ void UpdateServerPlayer::processCommand() throw(IOException, Error) { // try { - // ӽ + // 헤더를 임시저장할 버퍼 생성 char header[szPacketHeader]; PacketID_t packetID; PacketSize_t packetSize; @@ -117,7 +117,7 @@ void UpdateServerPlayer::processCommand() throw(IOException, Error) { } //-------------------------------------------------------------------------------- - // UpdateServerPlayer blocking socket ̶ ! + // UpdateServerPlayer 의 소켓은 blocking socket 이라는 점에 유의할 것! //-------------------------------------------------------------------------------- bool bInsufficientData = false; @@ -151,20 +151,20 @@ void UpdateServerPlayer::processCommand() throw(IOException, Error) { if (m_PlayerStatus != USPS_BEGIN_SESSION) throw InvalidProtocolException("invalid packet order"); - // Է¹۳ Ŷũ⸸ŭ Ÿ ִ ȮѴ. - // ȭ break ϸ ȴ. (⼭ ϴ exception ̴.) + // 입력버퍼내에 패킷크기만큼의 데이타가 들어있는지 확인한다. + // 최적화시 break 를 사용하면 된다. (여기서는 일단 exception을 쓸 것이다.) if (m_pInputStream->length() < szPacketHeader + packetSize) { bInsufficientData = true; goto INSUFFICIENT_DATA; // throw InsufficientDataException(); } - // Ŷ ϳ о, expire time Ѵ. + // 패킷 하나를 읽었으니, expire time 을 연기한다. getCurrentTime(m_ExpireTime); m_ExpireTime.tv_sec += maxIdleSec; - // Packet::read() ȣϸ ο Ŷ . - // ⼭ Ѵ... + // 원래는 Packet::read()를 호출하면 내부에서 패킷 헤더를 날려 주지만. + // 여기서는 직접 날려줘야 한당... m_pInputStream->skip(szPacketHeader); CUBeginUpdate cuBeginUpdate; @@ -201,20 +201,20 @@ void UpdateServerPlayer::processCommand() throw(IOException, Error) { if (m_PlayerStatus != USPS_AFTER_SENDING_UC_UPDATE_LIST && m_PlayerStatus != USPS_AFTER_SENDING_UC_UPDATE) throw InvalidProtocolException("invalid packet order"); - // Է¹۳ Ŷũ⸸ŭ Ÿ ִ ȮѴ. - // ȭ break ϸ ȴ. (⼭ ϴ exception ̴.) + // 입력버퍼내에 패킷크기만큼의 데이타가 들어있는지 확인한다. + // 최적화시 break 를 사용하면 된다. (여기서는 일단 exception을 쓸 것이다.) if (m_pInputStream->length() < szPacketHeader + packetSize) { bInsufficientData = true; goto INSUFFICIENT_DATA; // throw InsufficientDataException(); } - // Ŷ ϳ о, expire time Ѵ. + // 패킷 하나를 읽었으니, expire time 을 연기한다. getCurrentTime(m_ExpireTime); m_ExpireTime.tv_sec += maxIdleSec; - // Packet::read() ȣϸ ο Ŷ . - // ⼭ Ѵ... + // 원래는 Packet::read()를 호출하면 내부에서 패킷 헤더를 날려 주지만. + // 여기서는 직접 날려줘야 한당... m_pInputStream->skip(szPacketHeader); CURequest cuRequest; @@ -239,20 +239,20 @@ void UpdateServerPlayer::processCommand() throw(IOException, Error) { if (m_PlayerStatus != USPS_AFTER_SENDING_UC_UPDATE_LIST || m_PlayerStatus != USPS_AFTER_SENDING_UC_UPDATE) throw InvalidProtocolException("invalid packet order"); - // Է¹۳ Ŷũ⸸ŭ Ÿ ִ ȮѴ. - // ȭ break ϸ ȴ. (⼭ ϴ exception ̴.) + // 입력버퍼내에 패킷크기만큼의 데이타가 들어있는지 확인한다. + // 최적화시 break 를 사용하면 된다. (여기서는 일단 exception을 쓸 것이다.) if (m_pInputStream->length() < szPacketHeader + packetSize) { bInsufficientData = true; goto INSUFFICIENT_DATA; // throw InsufficientDataException(); } - // Ŷ ϳ о, expire time Ѵ. + // 패킷 하나를 읽었으니, expire time 을 연기한다. getCurrentTime(m_ExpireTime); m_ExpireTime.tv_sec += maxIdleSec; - // Packet::read() ȣϸ ο Ŷ . - // ⼭ Ѵ... + // 원래는 Packet::read()를 호출하면 내부에서 패킷 헤더를 날려 주지만. + // 여기서는 직접 날려줘야 한당... m_pInputStream->skip(szPacketHeader); CUEndUpdate cuEndUpdate; @@ -277,20 +277,20 @@ void UpdateServerPlayer::processCommand() throw(IOException, Error) { if (m_PlayerStatus != USPS_BEGIN_SESSION) throw InvalidProtocolException("invalid packet order"); - // Է¹۳ Ŷũ⸸ŭ Ÿ ִ ȮѴ. - // ȭ break ϸ ȴ. (⼭ ϴ exception ̴.) + // 입력버퍼내에 패킷크기만큼의 데이타가 들어있는지 확인한다. + // 최적화시 break 를 사용하면 된다. (여기서는 일단 exception을 쓸 것이다.) if (m_pInputStream->length() < szPacketHeader + packetSize) { bInsufficientData = true; goto INSUFFICIENT_DATA; // throw InsufficientDataException(); } - // Ŷ ϳ о, expire time Ѵ. + // 패킷 하나를 읽었으니, expire time 을 연기한다. getCurrentTime(m_ExpireTime); m_ExpireTime.tv_sec += maxIdleSec; - // Packet::read() ȣϸ ο Ŷ . - // ⼭ Ѵ... + // 원래는 Packet::read()를 호출하면 내부에서 패킷 헤더를 날려 주지만. + // 여기서는 직접 날려줘야 한당... m_pInputStream->skip(szPacketHeader); CURequestLoginMode cuRequestLoginMode; @@ -313,12 +313,12 @@ void UpdateServerPlayer::processCommand() throw(IOException, Error) { // by sigi. 2002.11.9 INSUFFICIENT_DATA: if (bInsufficientData) { - // Ż ̴. ʿ . - // expire time ʰ Ѵ. + // 단지 루프의 탈출 조건일 뿐이다. 상위로 전달할 필요는 없다. + // expire time 을 초과했을 경우 연결을 종료한다. Timeval currentTime; getCurrentTime(currentTime); if (currentTime >= m_ExpireTime) - throw DisconnectException(" ð Է , մϴ."); + throw DisconnectException("일정 시간동안 입력하지 않을 경우, 연결을 종료합니다."); } // __END_DEBUG @@ -328,7 +328,7 @@ void UpdateServerPlayer::processCommand() throw(IOException, Error) { //-------------------------------------------------------------------------------- -// ۸ ʱ , ƹ ͵ ʾƵ ȴ. +// 출력을 버퍼링하지 않기 때문에, 아무 것도 하지 않아도 된다. //-------------------------------------------------------------------------------- void UpdateServerPlayer::processOutput() throw(IOException, Error) { __BEGIN_TRY @@ -354,7 +354,7 @@ void UpdateServerPlayer::sendPacket(Packet* pPacket) throw(ProtocolException, Er PacketSize_t packetSize = pPacket->getPacketSize(); m_pSocket->send(&packetID, szPacketID); m_pSocket->send(&packetSize, szPacketSize); - // Ŷ Ͽ Ѹ. + // 패킷을 소켓에 직접 뿌린다. pPacket->write(m_pSocket); // cout << "Send Packet Size : " << pPacket->getPacketSize() << endl; @@ -373,14 +373,14 @@ void UpdateServerPlayer::disconnect(bool bDisconnected) throw(Error) { __BEGIN_TRY if (bDisconnected == UNDISCONNECTED) { - // ۿ ִ Ÿ Ѵ. + // 출력 버퍼에 남아있는 데이타를 전송한다. m_pOutputStream->flush(); } - // ݴ´. + // 소켓 연결을 닫는다. m_pSocket->close(); - // ÷̾ ¸ α׾ƿ . + // 플레이어의 상태를 로그아웃으로 만든다. Assert(m_PlayerStatus != USPS_END_SESSION); m_PlayerStatus = USPS_END_SESSION; diff --git a/src/server/updateserver/UpdateServerPlayer.h b/src/server/updateserver/UpdateServerPlayer.h index d0b6f90b..1ce88ef5 100644 --- a/src/server/updateserver/UpdateServerPlayer.h +++ b/src/server/updateserver/UpdateServerPlayer.h @@ -21,9 +21,9 @@ // // class UpdateServerPlayer // -// Ʈ ÷̾ Ŭ +// 업데이트 서버용 플레이어 클래스 // -// Է ۸ , ۸ ʴ´. +// 입력은 버퍼링을 하지만, 출력은 버퍼링을 하지 않는다. // //-------------------------------------------------------------------------------- @@ -49,7 +49,7 @@ class UpdateServerPlayer : public Player { virtual void sendPacket(Packet* packet) throw(ProtocolException, Error); // disconnect - // α׾ƿ disconnect(UNDISCONNECTED) + // 정식 로그아웃의 경우 disconnect(UNDISCONNECTED) virtual void disconnect(bool bDisconnected = DISCONNECTED) throw(Error); // get debug string diff --git a/src/server/updateserver/main.cpp b/src/server/updateserver/main.cpp index fe67299a..a8d7a1fb 100644 --- a/src/server/updateserver/main.cpp +++ b/src/server/updateserver/main.cpp @@ -11,7 +11,7 @@ #include "Types.h" #include "UpdateServer.h" -// Ʈ 丮 ĵ +// ¾÷µ¥ÀÌÆ® µð·ºÅ丮 ½ºÄµ °ü·Ã #include #include #include @@ -33,7 +33,7 @@ // seekdir // getcwd // -// // ڿ +// // ¹®ÀÚ¿­ ºñ±³ // strcasecmp( "LISt" , "LIST" ) == 0 class SourceInfo { @@ -105,7 +105,7 @@ class isSameName { bool operator()(VersionInfo* pVersionInfo) throw() { - // ̸ . + // À̸§ÀÌ °°´Ù. if (strcasecmp(m_Name.c_str(), pVersionInfo->getName().c_str()) == 0) { return true; } else { @@ -125,7 +125,7 @@ class isSource { bool operator()(SourceInfo* pSourceInfo) throw() { - // ̸ . + // À̸§ÀÌ °°´Ù. if (strcasecmp(m_Name.c_str(), pSourceInfo->getName().c_str()) == 0) { return true; } else { @@ -153,31 +153,31 @@ void main(void) { } */ /* - // ġ 丮 Ѵ. + // ÆÐÄ¡ µð·ºÅ丮¸¦ ¿ÀÇÂÇÑ´Ù. DIR * pDIR = opendir( patchDir.c_str() ); - // ġ 丮 ¯ Ȯ! + // ÆÐÄ¡ µð·ºÅ丮°¡ ¾øÀ¸¸é ¸»Â¯ È®! Assert( pDIR != NULL ); - // ġ 丮 丮( 丮) оδ. + // ÆÐÄ¡ µð·ºÅ丮ÀÇ ÇÏÀ§ µð·ºÅ丮(¹öÀü µð·ºÅ丮)µéÀ» ÀоîµéÀδÙ. bool sameVersionFound = false; struct dirent * versionDir; while ( ( versionDir = readdir( pDIR ) ) != NULL ) { - // (inode==0) Ѵ... + // ºó ½½¶ù(inode==0)Àº ¹«½ÃÇÑ´Ù... if ( versionDir->d_ino != 0 ) { // - // 丮 v + 0 ä 5ڸ ڿ Ǿ ִ. + // ¹öÀü µð·ºÅ丮´Â v + 0À¸·Î ä¿öÁø 5ÀÚ¸® Á¤¼ö ¹®ÀÚ¿­·Î µÇ¾î ÀÖ´Ù. // ex> v00001/ v00002/ v00003/ ... // string dir = versionDir->d_name; - // v ʴ 丮δ "." ".." ִ. -_-; + // v ·Î ½ÃÀÛÇÏÁö ¾Ê´Â ÇÏÀ§ µð·ºÅ丮·Î´Â "." °ú ".." ÀÌ ÀÖ´Ù. -_-; if ( dir[0] == 'v' ) { - // ϱ ؼ - // κ Ʈ ȯؼ ٽ ȯѴ. + // ¹öÀüÀ» ºñ±³Çϱâ À§Çؼ­´Â + // ¼ýÀÚ ºÎºÐÀ» ½ºÆ®¸µÀ¸·Î º¯È¯Çؼ­ ´Ù½Ã Á¤¼ö·Î º¯È¯ÇÑ´Ù. Version_t version = atoi( dir.substr( 1 , 5 ).c_str() ); if ( version == pPacket->getVersion() ) @@ -247,21 +247,21 @@ void scan_Source(const string& Directory) { SourceInfoList.push_back(pSourceInfo); /* - // ϴ ̸ ִ ã´. + // ÀÏ´Ü °°Àº À̸§ÀÌ ÀÖ´ÂÁö ã´Â´Ù. list::iterator itr = find_if( SourceInfoList.begin(), SourceInfoList.end(), isSameName(pSourceInfo->getName()) ); - // Ȱ ̸ ִٸ ֽ ־ . + // ¶È°°Àº À̸§ÀÌ ÀÖ´Ù¸é ÃֽйöÁ¯À¸·Î ³Ö¾î Áà¾ßÁã. if ( itr != SourceInfoList.end() ) { - //cout << " Ͽ ̸ ߰ Ǿ!" << endl; + //cout << "¿øº» ÆÄÀÏ¿¡¼­ °°Àº À̸§ÀÇ ÆÄÀÏÀÌ ¹ß°ß µÇ¾ú´Ù!" << endl; - //cout << " ִ : " << (*itr)->getDirectory() << ", ̸ : " << + //cout << "¿ø·¡ ÀÖ´ø ÆÄÀÏÀÇ µð·ºÀº : " << (*itr)->getDirectory() << ", ÆÄÀÏ À̸§Àº : " << (*itr)->getName() << endl; - //cout << "ֽ : " << pSourceInfo->getDirectory() << ", ̸ : " << + //cout << "ÃֽŠÆÄÀÏÀÇ ¹öÁ¯Àº : " << pSourceInfo->getDirectory() << ", ÆÄÀÏ À̸§Àº : " << pSourceInfo->getName() << endl; - // . + // °°Àº ÆÄÀÏÀÌ ¾ø´Ù. } else { SourceInfoList.push_back( pSourceInfo ); } @@ -328,33 +328,33 @@ void scan_Version(const string& Directory, int version) { pVersionInfo->setVersion(version); - // ϴ ̸ ִ ã´. + // ÀÏ´Ü °°Àº À̸§ÀÌ ÀÖ´ÂÁö ã´Â´Ù. list::iterator itr = find_if(VersionInfoList.begin(), VersionInfoList.end(), isSameName(pVersionInfo->getName())); - // Ȱ ̸ ִٸ ֽ ־ . + // ¶È°°Àº À̸§ÀÌ ÀÖ´Ù¸é ÃֽйöÁ¯À¸·Î ³Ö¾î Áà¾ßÁã. if (itr != VersionInfoList.end()) { - // cout << " ߰ Ǿ ֽ ġ" << endl; + // cout << "°°Àº ÆÄÀÏÀÌ ¹ß°ß µÇ¾ú´Ù ÃֽйöÁ¯À¸·Î °íÄ¡ÀÚ" << endl; - // cout << " ִ : " << (*itr)->getVersion() << ", ̸ : " << - // (*itr)->getName() << endl; cout << "ֽ : " << pVersionInfo->getVersion() << ", - // ̸ : " << pVersionInfo->getName() << endl; + // cout << "¿ø·¡ ÀÖ´ø ÆÄÀÏÀÇ ¹öÁ¯Àº : " << (*itr)->getVersion() << ", ÆÄÀÏ À̸§Àº : " << + // (*itr)->getName() << endl; cout << "ÃֽŠÆÄÀÏÀÇ ¹öÁ¯Àº : " << pVersionInfo->getVersion() << ", + // ÆÄÀÏ À̸§Àº : " << pVersionInfo->getName() << endl; if ((*itr)->getVersion() < pVersionInfo->getVersion()) { VersionInfo* pTempVersionInfo = (*itr); VersionInfoList.erase(itr); - // cout << " Ѵ." << endl; + // cout << "±âÁ¸ÀÇ ÆÄÀÏÀ» »èÁ¦ÇÑ´Ù." << endl; delete pTempVersionInfo; VersionInfoList.push_back(pVersionInfo); - // cout << " Ʈ ߰Ѵ." << endl; + // cout << "»õ ÆÄÀÏÀ» ¸®½ºÆ®¿¡ Ãß°¡ÇÑ´Ù." << endl; } else { } - // . + // °°Àº ÆÄÀÏÀÌ ¾ø´Ù. } else { VersionInfoList.push_back(pVersionInfo); } @@ -370,7 +370,7 @@ void create_Index() { int beforeVersion = 0; int version = 0; - // ϳ 鼭  ġ ̾Ƴ. + // ¹öÁ¯ÀÎÆ÷¿¡¼­ ÆÄÀÏÀ» Çϳª¾¿ ®¨³»¸é¼­ ÆÄÀÏÀÌ µé¾î°¥ À§Ä¡¸¦ »Ì¾Æ³½´Ù. for (; itr != VersionInfoList.end(); itr++) { StringStream msg1; StringStream msg2; @@ -391,7 +391,7 @@ void create_Index() { ofstream ofile(filename, ios::out | ios::app); - // Ʈ ˾Ƴ . + // ¾÷µ¥ÀÌÆ® °¹¼ö¸¦ ¾Ë¾Æ³»¼­ ¾´´Ù. if (beforeVersion != version) { int Count = 0; list::const_iterator itr2 = VersionInfoList.begin(); @@ -420,12 +420,12 @@ void create_Index() { ofile.close(); } - // ε Ѵ. + // ºó À妽º¸¦ »ý¼ºÇÑ´Ù. for (int i = 0; i <= version; i++) { char filename[256]; sprintf(filename, "%s/v%05d/index.dat", g_pConfig->getProperty("PatchDirectory").c_str(), i); ifstream ifile(filename, ios::in | ios::binary); - // ε Ѵ. + // ÆÄÀÏÀÌ ¾øÀ¸¸é ºó À妽º¸¦ »ý¼ºÇÑ´Ù. if (!ifile) { int Count = 0; @@ -442,32 +442,32 @@ void create_Index() { // // main() // -// UpdateServer +// UpdateServerÀÇ ¸ÞÀÎ ·çÇÁ // //-------------------------------------------------------------------------------- int main(int argc, char* argv[]) { if (argc < 3) { - // cout << "Usage : updateserver -f ȯ" << endl; + // cout << "Usage : updateserver -f ȯ°æÆÄÀÏ" << endl; exit(1); } - // command-line parameter string ȯѴ. ^^; + // command-line parameter¸¦ string À¸·Î º¯È¯ÇÑ´Ù. ^^; string* Argv; Argv = new string[argc]; for (int i = 0; i < argc; i++) Argv[i] = argv[i]; - // ȯ оδ. - // $VSHOME/bin, ȯ $VSHOME/conf ؾ Ѵ. - // command line ȯ ֵ Ѵ. + // ȯ°æ ÆÄÀÏÀ» ÀоîµéÀδÙ. + // ´Ü ½ÇÇà ÆÄÀÏÀº $VSHOME/bin¿¡, ȯ°æ ÆÄÀÏÀº $VSHOME/conf ¿¡ Á¸ÀçÇØ¾ß ÇÑ´Ù.½ + // command line ¿¡¼­ ȯ°æ ÆÄÀÏÀ» ÁöÁ¤ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. try { if (Argv[1] != "-f") { - throw Error("Usage : updateserver -f ȯ"); + throw Error("Usage : updateserver -f ȯ°æÆÄÀÏ"); } - // ù° ĶͰ -f , ι° Ķʹ ȯ ġ ȴ. + // ù¹øÂ° ÆÄ¶ó¹ÌÅͰ¡ -f ÀÏ °æ¿ì, µÎ¹øÂ° ÆÄ¶ó¹ÌÅʹ ȯ°æÆÄÀÏÀÇ À§Ä¡°¡ µÈ´Ù. g_pConfig = new Properties(); g_pConfig->load(Argv[2]); @@ -477,7 +477,7 @@ int main(int argc, char* argv[]) { // cout << e.toString() << endl; } - // ҽ 丮 д´. + // ¼Ò½º µð·ºÅ丮¸¦ Àд´Ù. // scan_Source( g_pConfig->getProperty( "SourceDirectory") ); /* @@ -491,7 +491,7 @@ int main(int argc, char* argv[]) { // scan_Version( g_pConfig->getProperty("PatchDirectory" ), 0 ); /* - // 丮 д´. + // ¹öÁ¯ µð·ºÅ丮¸¦ Àд´Ù. //cout << "============================================================================" << endl; for( list::const_iterator itr = VersionInfoList.begin(); itr != VersionInfoList.end(); itr++ ) { //cout << "Version : " << (*itr)->getVersion() << ",Name : " << (*itr)->getName() << ", Directory : " << @@ -500,12 +500,12 @@ int main(int argc, char* argv[]) { //cout << "============================================================================" << endl; */ - // index.dat ۾ Ѵ. + // index.dat »ý¼ºÀ» À§ÇÑ ÀÛ¾÷À» ÇÑ´Ù. // create_Index(); // - // Ʈ ü ϰ ʱȭ ȰȭŮ. + // ¾÷µ¥ÀÌÆ® ¼­¹ö °´Ã¼¸¦ »ý¼ºÇϰí ÃʱâÈ­ÇÑ ÈÄ È°¼ºÈ­½ÃÅ®´Ù. // try { struct rlimit rl; @@ -513,26 +513,26 @@ int main(int argc, char* argv[]) { rl.rlim_max = RLIM_INFINITY; setrlimit(RLIMIT_CORE, &rl); - // Ʈ ü Ѵ. + // ¾÷µ¥ÀÌÆ® ¼­¹ö °´Ã¼¸¦ »ý¼ºÇÑ´Ù. g_pUpdateServer = new UpdateServer(); - // Ʈ ü ʱȭѴ. + // ¾÷µ¥ÀÌÆ® ¼­¹ö °´Ã¼¸¦ ÃʱâÈ­ÇÑ´Ù. g_pUpdateServer->init(); - // Ʈ ü ȰȭŮ. + // ¾÷µ¥ÀÌÆ® ¼­¹ö °´Ã¼¸¦ Ȱ¼ºÈ­½ÃÅ®´Ù. g_pUpdateServer->start(); } catch (Throwable& e) { - // αװ ̷ 츦 ؼ + // ·Î±×°¡ ÀÌ·ïÁö±â Àü¿¡ ¼­¹ö°¡ ³¡³¯ °æ¿ì¸¦ ´ëºñÇØ¼­ ofstream ofile("../log/instant.log", ios::out); ofile << e.toString() << endl; ofile.close(); - // ǥ ε ش. + // Ç¥ÁØ Ãâ·ÂÀ¸·Îµµ Ãâ·ÂÇØÁØ´Ù. // cout << e.toString() << endl; - // Ʈ ߴܽŮ. - // ο Ŵ ߴܵǾ Ѵ. + // ¾÷µ¥ÀÌÆ® ¼­¹ö¸¦ ÁߴܽÃÅ®´Ù. + // ÀÌ ³»ºÎ¿¡¼­ ÇÏÀ§ ¸Å´ÏÀú ¿ª½Ã ÁߴܵǾî¾ß ÇÑ´Ù. g_pUpdateServer->stop(); } }