void CGModifyGuildMemberIntroHandler::execute (CGModifyGuildMemberIntro* 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); Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); PlayerCreature* pPlayerCreature = dynamic_cast<PlayerCreature*>(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; pGuildMember->saveIntro(pPacket->getGuildMemberIntro()); #endif // __GAME_SERVER__ __END_DEBUG_EX __END_CATCH }
//---------------------------------------------------------------------- // // 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 GuildShell::guildMemberUpdate(const uint8_t* data, size_t len) { const GuildMemberUpdate* gmu = (const GuildMemberUpdate*)data; QString memberName = QString::fromUtf8(gmu->name); // find the member GuildMember* member = m_members[memberName]; // update the guild members information if (member) { member->update(gmu); emit updated(member); } else { #ifdef GUILDSHELL_DIAG seqDebug("GuildShell::guildMemberUpdate(): Failed to find '%s'(%d)!", (const char*)memberName, memberName.length()); #if GUILDSHELL_DIAG > 1 seqDebug("%d in members dict.", m_members.count()); GuildMemberDictIterator it(m_members); // See QDictIterator for( ; it.current(); ++it ) seqDebug("'%s'(%d): '%s'(%d)", (const char*)it.currentKey(), it.currentKey().length(), (const char*)it.current()->name(), it.current()->name().length()); #endif // GUILDSHELL_DIAG > 1 #endif // GUILDSHELL_DIAG } }
void Guild::WithdrawMoney(WorldSession * pClient, uint32 uAmount) { GuildMember * pMember = pClient->GetPlayer()->m_playerInfo->guildMember; if (pMember == NULL) return; // sanity checks if (pMember->pRank->iGoldLimitPerDay > 0) { if (pMember->CalculateAvailableAmount() < uAmount) { pClient->SystemMessage("You have already withdrawn too much today."); return; } } if (pMember->pRank->iGoldLimitPerDay == 0) { pClient->SystemMessage("You don't have permission to do that."); return; } if (m_bankBalance < uAmount) return; if (sWorld.GoldCapEnabled) { if ((pClient->GetPlayer()->GetUInt32Value(PLAYER_FIELD_COINAGE) + uAmount) > sWorld.GoldLimit) { pClient->GetPlayer()->GetItemInterface()->BuildInventoryChangeError(NULL, NULL, INV_ERR_TOO_MUCH_GOLD); return; } } // update his bank state pMember->OnMoneyWithdraw(uAmount); // give the gold! GM PLS GOLD PLS 1 COIN pClient->GetPlayer()->ModUnsigned32Value(PLAYER_FIELD_COINAGE, (uint32)uAmount); // subtract the balance m_bankBalance -= uAmount; // update in db CharacterDatabase.Execute("UPDATE guilds SET bankBalance = %u WHERE guildId = %u", (m_bankBalance > 0) ? m_bankBalance : 0, m_guildId); // notify everyone with the new balance char buf[20]; snprintf(buf, 20, I64FMT, (uint64)m_bankBalance); LogGuildEvent(GUILD_EVENT_SETNEWBALANCE, 1, buf); // log it! LogGuildBankActionMoney(GUILD_BANK_LOG_EVENT_WITHDRAW_MONEY, pClient->GetPlayer()->GetLowGUID(), uAmount); }
void Guild::WithdrawMoney(WorldSession * pClient, uint32 uAmount) { PlayerInfo * pPlayer = pClient->GetPlayer()->m_playerInfo; GuildMember * pMember = pClient->GetPlayer()->m_playerInfo->guildMember; if(pMember==NULL) return; if(uAmount == 0) return; if(m_bankBalance < uAmount) { pClient->SystemMessage("You cannot withdraw more money then the account holds."); return; } // sanity checks (execpt for guildmasters) if( pPlayer->guildRank->iId !=0 ) { if(pMember->pRank->iGoldLimitPerDay > 0 && pMember->CalculateAvailableAmount() < uAmount ) { pClient->SystemMessage("You have already withdrawn too much today."); return; } if(pMember->pRank->iGoldLimitPerDay == 0 ) { pClient->SystemMessage("You don't have permission to withdraw money."); return; } } // update his bank state pMember->OnMoneyWithdraw(uAmount); // give the gold! GM PLS GOLD PLS 1 COIN pClient->GetPlayer()->ModUnsigned32Value(PLAYER_FIELD_COINAGE, (uint32)uAmount); // subtract the balance m_bankBalance -= uAmount; // update in db CharacterDatabase.Execute("UPDATE guilds SET bankBalance = %u WHERE guildId = %u", (m_bankBalance>0)?m_bankBalance:0, m_guildId); // notify everyone with the new balance char buf[20]; snprintf(buf, 20, I64FMT, (long long unsigned int)m_bankBalance); LogGuildEvent(GUILD_EVENT_SETNEWBALANCE, 1, buf); // log it! LogGuildBankActionMoney(GUILD_BANK_LOG_EVENT_WITHDRAW_MONEY, pClient->GetPlayer()->GetLowGUID(), uAmount); }
void Guild::WithdrawMoney(WorldSession* pClient, uint32 uAmount) { GuildMember* pMember = pClient->GetPlayer()->getPlayerInfo()->guildMember; if(pMember == NULL) return; // sanity checks if(pMember->pRank->iGoldLimitPerDay > 0) { if(pMember->CalculateAvailableAmount() < uAmount) { pClient->SystemMessage("You have already withdrawn too much today."); return; } } if(pMember->pRank->iGoldLimitPerDay == 0) { pClient->SystemMessage("You don't have permission to do that."); return; } if(m_bankBalance < uAmount) return; // Check they dont have more than the max gold if(sWorld.GoldCapEnabled) { if((pClient->GetPlayer()->GetGold() + uAmount) > sWorld.GoldLimit) { pClient->GetPlayer()->GetItemInterface()->BuildInventoryChangeError(NULL, NULL, INV_ERR_TOO_MUCH_GOLD); return; } } // update his bank state pMember->OnMoneyWithdraw(uAmount); // give the gold! GM PLS GOLD PLS 1 COIN pClient->GetPlayer()->ModGold((uint32)uAmount); SpendMoney(uAmount); // log it! LogGuildBankActionMoney(GUILD_BANK_LOG_EVENT_WITHDRAW_MONEY, pClient->GetPlayer()->GetLowGUID(), uAmount); }
void GuildShell::dumpMembers(QTextStream& out) { QDateTime dt; GuildMemberDictIterator it(m_members); GuildMember* member; QString format("%1 %2 %3 %4 %5 %6"); QString dateFormat("ddd MMM dd hh:mm:ss yyyy"); // calculate the maximum class name width size_t maxClassNameLength = 0; for (uint8_t i = 1; i <= PLAYER_CLASSES; i++) if (classString(i).length() > maxClassNameLength) maxClassNameLength = classString(i).length(); out << "Guild has " << m_members.count() << " members: " << endl; int nameFieldWidth = - m_maxNameLength; int classFieldWidth = - maxClassNameLength; out << format.arg("Members", nameFieldWidth) .arg("Lv", 2).arg("Class", classFieldWidth) .arg("R", 1) .arg("Last On", -24) .arg("Zone", -18); out << " Public Note" << endl; QString zone; while ((member = it.current())) { dt.setTime_t(member->lastOn()); zone = zoneString(member->zoneId()); if (member->zoneInstance()) zone += ":" + QString::number(member->zoneInstance()); out << format.arg(member->name(), nameFieldWidth) .arg(member->level(), 2).arg(member->classString(), classFieldWidth) .arg(member->guildRankString(), 1) .arg(dt.toString(dateFormat), -24) .arg(zone, -18); out << " " << member->publicNote() << endl; ++it; } }
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 }
void GuildManager::updateList() { Guild *guild = Guild::getGuild(1); if (guild) { guild->setServerGuild(false); StringVectCIter it = mTempList.begin(); StringVectCIter it_end = mTempList.end(); int i = 0; while (it != it_end) { std::string name = *it; if (name.size() > 1) { int status = atoi(name.substr(name.size() - 1).c_str()); name = name.substr(0, name.size() - 1); GuildMember *m = guild->addMember(i, 0, name); if (m) { m->setOnline(status & 1); m->setGender(GENDER_UNSPECIFIED); if (status & 2) m->setPos(10); else m->setPos(0); if (player_node && name == player_node->getName()) { mHavePower = (status & 2); m->setOnline(true); } } } ++ it; i ++; } guild->sort(); createTab(guild); if (actorSpriteManager) { actorSpriteManager->updatePlayerGuild(); actorSpriteManager->updatePlayerColors(); } } mTempList.clear(); mSentInfoRequest = false; mGotInfo = true; }
void CGModifyGuildMemberHandler::execute (CGModifyGuildMember* pPacket , Player* pPlayer) throw(Error) { __BEGIN_TRY __BEGIN_DEBUG_EX #ifdef __GAME_SERVER__ //cout << "CGModifyGuildMember received." << endl; Assert(pPacket != NULL); Assert(pPlayer != NULL); SYSTEM_ASSERT(SYSTEM_GUILD); GamePlayer* pGamePlayer = dynamic_cast<GamePlayer*>(pPlayer); Assert(pGamePlayer != NULL); Creature* pCreature = pGamePlayer->getCreature(); Assert(pCreature != NULL); PlayerCreature* pPlayerCreature = dynamic_cast<PlayerCreature*>(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) return; //cout << "get guild" << endl; if (pPacket->getGuildMemberRank() == GuildMember::GUILDMEMBER_RANK_DENY ) { //////////////////////////////////////////////////////// // 길드 멤버를 추방한다. //////////////////////////////////////////////////////// // 마스터가 아니면 추방할 수 없다. if (pGuildMember->getRank() != GuildMember::GUILDMEMBER_RANK_MASTER ) return; if (g_pGuildManager->hasActiveWar(pGuild->getID() ) ) { GCSystemMessage msg; msg.setMessage(g_pStringPool->getString(STRID_CANNOT_KICK_DURING_WAR )); pPlayer->sendPacket(&msg); return; } GSExpelGuildMember gsExpelGuildMember; gsExpelGuildMember.setGuildID(pGuild->getID()); gsExpelGuildMember.setName(pPacket->getName()); gsExpelGuildMember.setSender(pPlayerCreature->getName()); //cout << "send GSExpelGuildMember" << endl; g_pSharedServerManager->sendPacket(&gsExpelGuildMember); } else { if (pGuild->getActiveMemberCount() >= MAX_GUILDMEMBER_ACTIVE_COUNT ) { GCSystemMessage msg; msg.setMessage(g_pStringPool->getString(STRID_CANNOT_ACCEPT_MORE_JOIN )); pPlayer->sendPacket(&msg); return; } /////////////////////////////////////////////////////// // 길드 가입을 승인한다. /////////////////////////////////////////////////////// // 마스터나 서브마스터 이어야 한다. if (pGuildMember->getRank() != GuildMember::GUILDMEMBER_RANK_MASTER && pGuildMember->getRank() != GuildMember::GUILDMEMBER_RANK_SUBMASTER ) return; if (g_pGuildManager->hasActiveWar(pGuild->getID() ) ) { GCSystemMessage msg; msg.setMessage(g_pStringPool->getString(STRID_CANNOT_ACCEPT_DURING_WAR )); pPlayer->sendPacket(&msg); return; } GSModifyGuildMember gsModifyGuildMember; gsModifyGuildMember.setGuildID(pGuild->getID()); gsModifyGuildMember.setName(pPacket->getName()); gsModifyGuildMember.setGuildMemberRank(pPacket->getGuildMemberRank()); gsModifyGuildMember.setSender(pPlayerCreature->getName()); //cout << "send GSModifyGuildMember" << endl; g_pSharedServerManager->sendPacket(&gsModifyGuildMember); } #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); }
void GuildShell::guildMemberList(const uint8_t* data, size_t len) { // clear out any existing member data emit cleared(); m_members.clear(); m_maxNameLength = 0; // construct a netstream object on the data NetStream gml(data, len); // read the player name from the front of the stream QString player = gml.readText(); // read the player count from the stream uint32_t count; count = gml.readUInt32(); #ifdef GUILDSHELL_DIAG seqDebug("Guild has %d members:", count); #endif GuildMember* member; #ifdef GUILDSHELL_DIAG QDateTime dt; #endif // GUILDSHELL_DIAG // iterate over the data until we reach the end of it while (!gml.end()) { // create a new guildmember initializing it from the NetStream member = new GuildMember(gml); // insert the new member into the dictionary m_members.insert(member->name(), member); // check for new longest member name if (member->name().length() > m_maxNameLength) m_maxNameLength = member->name().length(); emit added(member); #ifdef GUILDSHELL_DIAG dt.setTime_t(member->lastOn()); seqDebug("%-64s\t%d\t%s\t%d\t%s\t'%s'\t%s:%d", (const char*)member->name(), member->level(), (const char*)classString(member->classVal()), member->guildRank(), (const char*)dt.toString(), (const char*)member->publicNote(), (const char*)m_zoneMgr->zoneNameFromID(member->zoneId()), member->zoneInstance()); #endif } emit loaded(); #ifdef GUILDSHELL_DIAG seqDebug("Finished processing %d guildmates. %d chars in longest name.", m_members.count(), m_maxNameLength); #endif // }
//---------------------------------------------------------------------- // // 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) } }
bool GuildManager::process(std::string msg) { if (msg.size() > 4 && msg[0] == '#' && msg[1] == '#') msg = msg.substr(3); bool haveNick = (msg.find(": ") != std::string::npos); if (!haveNick && findCutLast(msg, " is now Offline.")) { Guild *guild = createGuild(); if (!guild) return false; if (msg.size() < 4) return false; if (msg[0] == '#' && msg[1] == '#') msg = msg.substr(3); GuildMember *m = guild->addMember(msg); if (m) m->setOnline(false); guild->sort(); mRequest = false; return true; } else if (!haveNick && findCutLast(msg, " is now Online.")) { Guild *guild = createGuild(); if (!guild) return false; if (msg.size() < 4) return false; if (msg[0] == '#' && msg[1] == '#') msg = msg.substr(3); GuildMember *m = guild->addMember(msg); if (m) m->setOnline(true); guild->sort(); mRequest = false; return true; } else if (findCutFirst(msg, "Welcome to the ")) { Guild *guild = createGuild(); if (!guild) return false; // logger->log("welcome message: %s", msg.c_str()); size_t pos = msg.find("! ("); if (pos == std::string::npos) return false; msg = msg.substr(0, pos); guild->setName(msg); if (player_node) player_node->setGuildName(msg); mGotName = true; mSentNameRequest = false; mRequest = false; return true; } else if (findCutFirst(msg, "Player name: ")) { Guild *guild = createGuild(); if (!guild) return false; size_t pos = msg.find("Access Level: "); if (pos == std::string::npos) return false; msg = msg.substr(pos); if (!findCutFirst(msg, "Access Level: ")) return false; pos = msg.find(", Guild:"); if (pos == std::string::npos) return false; int level = atoi(msg.substr(0, pos).c_str()); if (level >= 10) mHavePower = true; else mHavePower = false; msg = msg.substr(pos + strlen(", Guild:")); pos = msg.find(", No. Of Online Players: "); if (pos == std::string::npos) return false; msg = msg.substr(0, pos); // logger->log("guild name: %s", msg.c_str()); guild->setName(msg); if (player_node) player_node->setGuildName(msg); mGotName = true; mSentNameRequest = false; mRequest = false; return true; } else if (findCutFirst(msg, "OL#")) { // logger->log("OL"); mTempList.clear(); splitToStringVector(mTempList, msg, '#'); if (msg.size() < 1 || msg[msg.size() - 1] != '#') updateList(); mRequest = false; return true; } else if (findCutFirst(msg, "oL#")) { // logger->log("oL"); splitToStringVector(mTempList, msg, '#'); if (msg.size() < 1 || msg[msg.size() - 1] != '#') updateList(); mRequest = false; return true; } else if (msg == "You are currently not in a guild. For more information " "or to discuss the possibility of adding you own guild " "please contact Jero.") { mRequest = true; return true; } else if (findCutFirst(msg, "You have been invited to the ") && findCutLast(msg, " guild chat. If you would like to accept " "this invitation please reply \"yes\" and if not then \"no\" .")) { if (socialWindow) socialWindow->showGuildInvite(msg, 1, ""); return true; } else if (!haveNick && (findCutLast(msg, " has been removed " "from the Guild.") || findCutLast(msg, " has left the Guild."))) { Guild *guild = createGuild(); if (!guild) return false; if (msg.size() < 4) return false; if (msg[0] == '#' && msg[1] == '#') msg = msg.substr(3); if (actorSpriteManager) { Being *b = actorSpriteManager->findBeingByName( msg, Being::PLAYER); if (b) { b->clearGuilds(); b->setGuildName(""); b->updateColors(); } } guild->removeMember(msg); return true; } else if (msg == "You have been removed from the Guild" || msg == "You have left the Guild") { return afterRemove(); } else { Guild *guild = createGuild(); if (!guild) return false; if (!mTab) { createTab(guild); } if (mTab) { size_t pos = msg.find(": ", 0); if (pos != std::string::npos) { std::string sender_name = ((pos == std::string::npos) ? "" : msg.substr(0, pos)); if (!guild->getMember(sender_name)) { mTab->chatLog(msg); return true; } msg.erase(0, pos + 2); if (msg.size() > 3 && msg[0] == '#' && msg[1] == '#') msg.erase(0, 3); trim(msg); mTab->chatLog(sender_name, msg); } else { mTab->chatLog(msg); } return true; } } return false; }