//---------------------------------------------------------------------- // // GSModifyGuildMemberHandler::execute() // //---------------------------------------------------------------------- void GSModifyGuildMemberHandler::execute (GSModifyGuildMember* pPacket, Player* pPlayer ) throw(ProtocolException , Error ) { __BEGIN_TRY __BEGIN_DEBUG_EX #ifdef __SHARED_SERVER__ //cout << "GSModifyGuildMember received" << endl; 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; if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_WAIT && pPacket->getGuildMemberRank() == GuildMember::GUILDMEMBER_RANK_NORMAL ) { /////////////////////////////////////////////////////////////////////////////////////// // 길드 멤버 가입을 승인한 경우, DB에 Slayer, Vampire, Ousters 테이블의 GuildID 를 바꾼다. /////////////////////////////////////////////////////////////////////////////////////// Statement* pStmt = NULL; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN" )->createStatement(); if (pGuild->getRace() == Guild::GUILD_RACE_SLAYER ) { pStmt->executeQuery("UPDATE Slayer SET GuildID = %d WHERE Name = '%s'", pGuild->getID(), pGuildMember->getName().c_str()); pStmt->executeQuery("INSERT INTO Messages (Receiver, Message ) VALUES ('%s', '%s' )", pGuildMember->getName().c_str(), g_pStringPool->c_str(STRID_TEAM_JOIN_ACCEPT )); } else if (pGuild->getRace() == Guild::GUILD_RACE_VAMPIRE ) { pStmt->executeQuery("UPDATE Vampire SET GuildID = %d WHERE Name = '%s'", pGuild->getID(), pGuildMember->getName().c_str()); pStmt->executeQuery("INSERT INTO Messages (Receiver, Message ) VALUES ('%s', '%s' )", pGuildMember->getName().c_str(), g_pStringPool->c_str(STRID_CLAN_JOIN_ACCEPT )); } else if (pGuild->getRace() == Guild::GUILD_RACE_OUSTERS ) { pStmt->executeQuery("UPDATE Ousters SET GuildID = %d WHERE Name = '%s'", pGuild->getID(), pGuildMember->getName().c_str()); pStmt->executeQuery("INSERT INTO Messages (Receiver, Message ) VALUES ('%s', '%s' )", pGuildMember->getName().c_str(), g_pStringPool->c_str(STRID_CLAN_JOIN_ACCEPT )); } SAFE_DELETE(pStmt); } END_DB(pStmt) // Guild Member 정보를 변경한다. pGuild->modifyMemberRank(pGuildMember->getName(), pPacket->getGuildMemberRank()); }
void CGSelectGuildMemberHandler::execute (CGSelectGuildMember* pPacket , Player* pPlayer) throw(Error) { __BEGIN_TRY __BEGIN_DEBUG_EX #ifdef __GAME_SERVER__ Assert(pPacket != NULL); Assert(pPlayer != NULL); SYSTEM_ASSERT(SYSTEM_GUILD); GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pPlayer); Assert(pGamePlayer != NULL); PlayerCreature* pPlayerCreature = dynamic_cast<PlayerCreature*>(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) return; GCShowGuildMemberInfo gcShowGuildMemberInfo; gcShowGuildMemberInfo.setGuildID(pGuildMember->getGuildID()); gcShowGuildMemberInfo.setName(pGuildMember->getName()); gcShowGuildMemberInfo.setGuildMemberRank(pGuildMember->getRank()); gcShowGuildMemberInfo.setGuildMemberIntro(pGuildMember->getIntro()); pPlayer->sendPacket(&gcShowGuildMemberInfo); #endif // __GAME_SERVER__ __END_DEBUG_EX __END_CATCH }
//---------------------------------------------------------------------- // // SGModifyGuildOKHandler::execute() // //---------------------------------------------------------------------- void SGModifyGuildOKHandler::execute (SGModifyGuildOK* pPacket ) throw(ProtocolException , Error ) { __BEGIN_TRY __BEGIN_DEBUG_EX #ifdef __GAME_SERVER__ Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); Assert(pGuild != NULL); if (pGuild->getState() == Guild::GUILD_STATE_WAIT && pPacket->getGuildState() == Guild::GUILD_STATE_ACTIVE ) { ///////////////////////////////////////////////////////////// // 존 추가 ///////////////////////////////////////////////////////////// /* if (pGuild->getServerGroupID() == g_pConfig->getPropertyInt("ServerID" ) ) { // 이 게임 서버에 길드 아지트를 만든다. ////////////// // Zone Info ////////////// ZoneInfo* pZoneInfo = new ZoneInfo(); pZoneInfo->setZoneID(pGuild->getZoneID()); pZoneInfo->setZoneGroupID(2); pZoneInfo->setZoneType("NPC_SHOP"); pZoneInfo->setZoneLevel(0); pZoneInfo->setZoneAccessMode("PUBLIC"); pZoneInfo->setZoneOwnerID(""); pZoneInfo->setPayPlay(""); if (pGuild->getRace() == Guild::GUILD_RACE_SLAYER ) { pZoneInfo->setSMPFilename("team_hdqrs.smp"); pZoneInfo->setSSIFilename("team_hdqrs.ssi"); string Name = "team - " + pGuild->getName(); pZoneInfo->setFullName(Name); pZoneInfo->setShortName(Name); } else if (pGuild->getRace() == Guild::GUILD_RACE_VAMPIRE ) { pZoneInfo->setSMPFilename("clan_hdqrs.smp"); pZoneInfo->setSSIFilename("clan_hdqrs.ssi"); string Name = "clan - " + pGuild->getName(); pZoneInfo->setFullName(Name); pZoneInfo->setShortName(Name); } g_pZoneInfoManager->addZoneInfo(pZoneInfo); ///////// // Zone ///////// Zone* pZone = new Zone(pGuild->getZoneID()); Assert(pZone != NULL); ZoneGroup* pZoneGroup = g_pZoneGroupManager->getZoneGroup(2); Assert(pZoneGroup != NULL); pZone->setZoneGroup(pZoneGroup); pZoneGroup->addZone(pZone); pZone->init(); } */ // 정식 길드로 변경 pGuild->setState(Guild::GUILD_STATE_ACTIVE); HashMapGuildMember& Members = pGuild->getMembers(); HashMapGuildMemberItor itr = Members.begin(); for (; itr != Members.end(); itr++ ) { GuildMember* pGuildMember = itr->second; // 멤버가 접속해 있다면 __ENTER_CRITICAL_SECTION((*g_pPCFinder)) Creature* pCreature = g_pPCFinder->getCreature_LOCKED(pGuildMember->getName()); if (pCreature != NULL && pCreature->isPC() ) { Player* pPlayer = pCreature->getPlayer(); Assert(pPlayer != NULL); PlayerCreature* pPlayerCreature = dynamic_cast<PlayerCreature*>(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); GCOtherModifyInfo gcOtherModifyInfo; gcOtherModifyInfo.setObjectID(pCreature->getObjectID()); gcOtherModifyInfo.addShortData(MODIFY_GUILDID, pPlayerCreature->getGuildID()); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcOtherModifyInfo, pCreature); // 정식 길드가 되었음을 알림 Statement* pStmt = NULL; Result* pResult = NULL; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN" )->createStatement(); pResult = pStmt->executeQuery("SELECT Message FROM Messages WHERE Receiver = '%s'", pGuildMember->getName().c_str()); while (pResult->next() ) { GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(pResult->getString(1)); pPlayer->sendPacket(&gcSystemMessage); } pStmt->executeQuery("DELETE FROM Messages WHERE Receiver = '%s'", pGuildMember->getName().c_str()); SAFE_DELETE(pStmt); } END_DB(pStmt) } __LEAVE_CRITICAL_SECTION((*g_pPCFinder)) }
//---------------------------------------------------------------------- // // GSExpelGuildMemberHandler::execute() // //---------------------------------------------------------------------- void GSExpelGuildMemberHandler::execute (GSExpelGuildMember* pPacket, Player* pPlayer ) throw(ProtocolException , Error ) { __BEGIN_TRY __BEGIN_DEBUG_EX #ifdef __SHARED_SERVER__ //cout << "GSExpelGuildMember received" << endl; 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 를 바꾼다. /////////////////////////////////////////////////////////////////// Statement* pStmt = NULL; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN" )->createStatement(); if (pGuild->getRace() == Guild::GUILD_RACE_SLAYER ) { pStmt->executeQuery("UPDATE Slayer SET GuildID = 99 WHERE Name = '%s'", pGuildMember->getName().c_str()); } else if (pGuild->getRace() == Guild::GUILD_RACE_VAMPIRE ) { pStmt->executeQuery("UPDATE Vampire SET GuildID = 0 WHERE Name = '%s'", pGuildMember->getName().c_str()); } else if (pGuild->getRace() == Guild::GUILD_RACE_OUSTERS ) { pStmt->executeQuery("UPDATE Ousters SET GuildID = 66 WHERE Name = '%s'", pGuildMember->getName().c_str()); } SAFE_DELETE(pStmt); } END_DB(pStmt) // Guild Member 를 expire 시킨다. pGuildMember->expire(); // Guild 에서 삭제한다. pGuild->deleteMember(pGuildMember->getName()); // 게임 서버로 보낼 패킷을 만든다. SGExpelGuildMemberOK sgExpelGuildMemberOK; sgExpelGuildMemberOK.setGuildID(pGuild->getID()); sgExpelGuildMemberOK.setName(pPacket->getName()); sgExpelGuildMemberOK.setSender(pPacket->getSender()); // 게임 서버로 패킷을 보낸다. g_pGameServerManager->broadcast(&sgExpelGuildMemberOK); // 길드 인원이 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 HashMapGuildMember& Members = pGuild->getMembers(); HashMapGuildMemberItor itr = Members.begin(); BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN" )->createStatement(); for (; itr != Members.end(); itr++ ) { GuildMember* pGuildMember = itr->second; /////////////////////////////////////////////////////////////////// // DB에 Slayer, Vampire, Ousters 테이블의 GuildID 를 바꾼다. /////////////////////////////////////////////////////////////////// if (pGuild->getRace() == Guild::GUILD_RACE_SLAYER ) { pStmt->executeQuery("UPDATE Slayer SET GuildID = 99 WHERE Name = '%s'", pGuildMember->getName().c_str()); } else if (pGuild->getRace() == Guild::GUILD_RACE_VAMPIRE ) { pStmt->executeQuery("UPDATE Vampire SET GuildID = 0 WHERE Name = '%s'", pGuildMember->getName().c_str()); } else if (pGuild->getRace() == Guild::GUILD_RACE_OUSTERS ) { pStmt->executeQuery("UPDATE Ousters SET GuildID = 66 WHERE Name = '%s'", pGuildMember->getName().c_str()); } // 길드 멤버를 expire 시킨다. pGuildMember->expire(); // 완전히 DB에서 제거한다. //pGuildMember->destroy(); // 길드 멤버를 삭제 SAFE_DELETE(pGuildMember); } SAFE_DELETE(pStmt); } END_DB(pStmt) Members.clear(); // 길드를 삭제한다 pGuild->setState(Guild::GUILD_STATE_BROKEN); pGuild->save(); SAFE_DELETE(pGuild); g_pGuildManager->deleteGuild(pPacket->getGuildID()); // 길드를 삭제하도록 패킷을 보낸다. SGDeleteGuildOK sgDeleteGuildOK; sgDeleteGuildOK.setGuildID(pPacket->getGuildID()); g_pGameServerManager->broadcast(&sgDeleteGuildOK); }
//---------------------------------------------------------------------- // // SGDeleteGuildOKHandler::execute() // //---------------------------------------------------------------------- void SGDeleteGuildOKHandler::execute (SGDeleteGuildOK* pPacket ) throw(ProtocolException , Error ) { __BEGIN_TRY #ifdef __GAME_SERVER__ // 길드 아지트에 있는 멤버를 warp 시킨다. // 길드 아지트를 삭제한다. // 멤버 warp와 길드 아지트 삭제 시 다른 쓰레드에서 ZoneGroup Thread 내부에서 일어나게 해야 별탈이 없을 듯 하다. // 일단은 걍 둔다. Portal 이 막히므로 다시 들어갈 수 없을 것이다. Assert(pPacket != NULL); // 길드를 가져온다. Guild* pGuild = g_pGuildManager->getGuild(pPacket->getGuildID()); try { Assert(pGuild != NULL); } catch (Throwable& ) { return; } // 길드 활동 중인 상태에서의 해체인지 대기 중인 상태에서의 해체인지 구별한다. if (pGuild->getState() == Guild::GUILD_STATE_ACTIVE ) { HashMapGuildMember& Members = pGuild->getMembers(); HashMapGuildMemberItor itr = Members.begin(); for (; itr != Members.end(); itr++ ) { GuildMember* pGuildMember = itr->second; // 접속해 있으면 __ENTER_CRITICAL_SECTION((*g_pPCFinder)) Creature* pCreature = g_pPCFinder->getCreature_LOCKED(pGuildMember->getName()); if (pCreature != NULL && pCreature->isPC() ) { Player* pPlayer = pCreature->getPlayer(); Assert(pPlayer != NULL); PlayerCreature* pPlayerCreature = dynamic_cast<PlayerCreature*>(pCreature); Assert(pPlayerCreature != NULL); // Slayer, Vampire 의 길드 아이디를 바꾼다. if (pPlayerCreature->isSlayer() ) { 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 // 클라이언트에 길드 아이디가 바꼈음을 알린다. 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 // 클라이언트에 길드 아이디가 바꼈음을 알린다. GCModifyGuildMemberInfo gcModifyGuildMemberInfo; gcModifyGuildMemberInfo.setGuildID(pPlayerCreature->getGuildID()); gcModifyGuildMemberInfo.setGuildName(""); gcModifyGuildMemberInfo.setGuildMemberRank(GuildMember::GUILDMEMBER_RANK_DENY); pPlayer->sendPacket(&gcModifyGuildMemberInfo); } // 주위에 클라이언트에 길드 아이디가 바꼈음을 알린다. GCOtherModifyInfo gcOtherModifyInfo; gcOtherModifyInfo.setObjectID(pCreature->getObjectID()); gcOtherModifyInfo.addShortData(MODIFY_GUILDID, pPlayerCreature->getGuildID()); Zone* pZone = pCreature->getZone(); Assert(pZone != NULL); pZone->broadcastPacket(pCreature->getX(), pCreature->getY(), &gcOtherModifyInfo, pCreature); } __LEAVE_CRITICAL_SECTION((*g_pPCFinder)) // 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(); HashMapGuildMemberItor itr = Members.begin(); Statement* pStmt = NULL; Result* pResult = NULL; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN" )->createStatement(); for (; itr != Members.end(); itr++ ) { GuildMember* pGuildMember = itr->second; // 접속해 있으면 __ENTER_CRITICAL_SECTION((*g_pPCFinder)) Creature* pCreature = g_pPCFinder->getCreature_LOCKED(pGuildMember->getName()); if (pCreature != NULL && pCreature->isPC() ) { Player* pPlayer = pCreature->getPlayer(); Assert(pPlayer != NULL); PlayerCreature* pPlayerCreature = dynamic_cast<PlayerCreature*>(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); } else if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_SUBMASTER ) { Gold = min((uint64_t)(Gold + RETURN_SLAYER_SUBMASTER_GOLD), (uint64_t)2000000000); } pPlayerCreature->setGoldEx(Gold); GCModifyInformation gcModifyInformation; gcModifyInformation.addLongData(MODIFY_GOLD, Gold); pPlayer->sendPacket(&gcModifyInformation); // 메시지를 보낸다. pResult = pStmt->executeQuery("SELECT Message FROM Messages WHERE Receiver = '%s'", pCreature->getName().c_str()); while (pResult->next() ) { GCSystemMessage message; message.setMessage(pResult->getString(1)); pPlayer->sendPacket(&message); } pStmt->executeQuery("DELETE FROM Messages WHERE Receiver = '%s'", pCreature->getName().c_str()); } __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); } END_DB(pStmt) }
//---------------------------------------------------------------------- // // SGAddGuildMemberOKHandler::execute() // //---------------------------------------------------------------------- void SGAddGuildMemberOKHandler::execute (SGAddGuildMemberOK* pPacket ) throw(ProtocolException , Error ) { __BEGIN_TRY __BEGIN_DEBUG_EX #ifdef __GAME_SERVER__ // 길드 멤버 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()); if (pCreature != NULL && pCreature->isPC() ) { Player* pPlayer = pCreature->getPlayer(); Assert(pPlayer != NULL); if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_MASTER || pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_SUBMASTER ) // 길드마스터나 서브마스터일 경우 { PlayerCreature* pPlayerCreature = dynamic_cast<PlayerCreature*>(pCreature); Assert(pPlayerCreature != NULL); Gold_t Fee; if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_MASTER ) Fee = REQUIRE_SLAYER_MASTER_GOLD; else if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_SUBMASTER ) Fee = REQUIRE_SLAYER_SUBMASTER_GOLD; else Fee = 0; Gold_t CurMoney = pPlayerCreature->getGold(); if (CurMoney < Fee ) { // 큰일났군 CurMoney = 0; } else CurMoney -= Fee; pPlayerCreature->setGoldEx(CurMoney); if (Fee != 0 ) { 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 )); else if (pGuild->getRace() == Guild::GUILD_RACE_VAMPIRE ) gcSystemMessage.setMessage(g_pStringPool->getString(STRID_CLAN_JOIN_ACCEPTED )); else if (pGuild->getRace() == Guild::GUILD_RACE_OUSTERS ) gcSystemMessage.setMessage(g_pStringPool->getString(STRID_CLAN_JOIN_ACCEPTED )); 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 )); else if (pGuild->getRace() == Guild::GUILD_RACE_VAMPIRE ) gcSystemMessage.setMessage(g_pStringPool->getString(STRID_CLAN_JOIN_TRY )); else if (pGuild->getRace() == Guild::GUILD_RACE_OUSTERS ) gcSystemMessage.setMessage(g_pStringPool->getString(STRID_CLAN_JOIN_TRY )); pPlayer->sendPacket(&gcSystemMessage); } } else { // 접속이 안되어 있다. // 마스터나 서브마스터일 경우 // DB 에서 돈을 까도록 한다. if ((pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_MASTER || pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_SUBMASTER ) // 길드마스터나 서브마스터일 경우 && pPacket->getServerGroupID() == g_pConfig->getPropertyInt("ServerID" ) ) // 이 게임 서버에서 추가한 길드원인가? { Gold_t Fee; if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_MASTER ) Fee = REQUIRE_SLAYER_MASTER_GOLD; else if (pGuildMember->getRank() == GuildMember::GUILDMEMBER_RANK_SUBMASTER ) Fee = REQUIRE_SLAYER_SUBMASTER_GOLD; else Fee = 0; string table = ""; if (pGuild->getRace() == Guild::GUILD_RACE_SLAYER ) { table = "Slayer"; } else if (pGuild->getRace() == Guild::GUILD_RACE_VAMPIRE ) { table = "Vampire"; } else if (pGuild->getRace() == Guild::GUILD_RACE_OUSTERS ) { table = "Ousters"; } if (table != "" && Fee != 0 ) { Statement* pStmt = NULL; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); pStmt->executeQuery("UPDATE %s SET Gold = IF (%u > Gold , 0, Gold - %u ) WHERE Name = '%s'", table.c_str(), Fee, Fee, pGuildMember->getName().c_str()); } END_DB(pStmt) } }