// vim:ts=4 sw=4 #include "stdafx.h" #include "ClientManager.h" #include "Main.h" #include "Config.h" #include "DBManager.h" #include "QID.h" #include "GuildManager.h" void CClientManager::GuildCreate(CPeer * peer, DWORD dwGuildID) { sys_log(0, "GuildCreate %u", dwGuildID); ForwardPacket(HEADER_DG_GUILD_LOAD, &dwGuildID, sizeof(DWORD)); CGuildManager::instance().Load(dwGuildID); } void CClientManager::GuildChangeGrade(CPeer* peer, TPacketGuild* p) { sys_log(0, "GuildChangeGrade %u %u", p->dwGuild, p->dwInfo); ForwardPacket(HEADER_DG_GUILD_CHANGE_GRADE, p, sizeof(TPacketGuild)); } void CClientManager::GuildAddMember(CPeer* peer, TPacketGDGuildAddMember * p) { CGuildManager::instance().TouchGuild(p->dwGuild); sys_log(0, "GuildAddMember %u %u", p->dwGuild, p->dwPID); char szQuery[512]; snprintf(szQuery, sizeof(szQuery), "INSERT INTO guild_member%s VALUES(%u, %u, %d, 0, 0)", GetTablePostfix(), p->dwPID, p->dwGuild, p->bGrade); std::unique_ptr pmsg_insert(CDBManager::instance().DirectQuery(szQuery)); snprintf(szQuery, sizeof(szQuery), "SELECT pid, grade, is_general, offer, level, job, name FROM guild_member%s, player%s WHERE guild_id = %u and pid = id and pid = %u", GetTablePostfix(), GetTablePostfix(), p->dwGuild, p->dwPID); std::unique_ptr pmsg(CDBManager::instance().DirectQuery(szQuery)); if (pmsg->Get()->uiNumRows == 0) { sys_err("Query failed when getting guild member data %s", pmsg->stQuery.c_str()); return; } MYSQL_ROW row = mysql_fetch_row(pmsg->Get()->pSQLResult); if (!row[0] || !row[1]) return; TPacketDGGuildMember dg; dg.dwGuild = p->dwGuild; str_to_number(dg.dwPID, row[0]); str_to_number(dg.bGrade, row[1]); str_to_number(dg.isGeneral, row[2]); str_to_number(dg.dwOffer, row[3]); str_to_number(dg.bLevel, row[4]); str_to_number(dg.bJob, row[5]); strncpy(dg.szName, row[6], sizeof(dg.szName)); ForwardPacket(HEADER_DG_GUILD_ADD_MEMBER, &dg, sizeof(TPacketDGGuildMember)); } void CClientManager::GuildRemoveMember(CPeer* peer, TPacketGuild* p) { sys_log(0, "GuildRemoveMember %u %u", p->dwGuild, p->dwInfo); char szQuery[512]; snprintf(szQuery, sizeof(szQuery), "DELETE FROM guild_member%s WHERE pid=%u and guild_id=%u", GetTablePostfix(), p->dwInfo, p->dwGuild); CDBManager::instance().AsyncQuery(szQuery); snprintf(szQuery, sizeof(szQuery), "REPLACE INTO quest%s (dwPID, szName, szState, lValue) VALUES(%u, 'guild_manage', 'withdraw_time', %u)", GetTablePostfix(), p->dwInfo, (DWORD) GetCurrentTime()); CDBManager::instance().AsyncQuery(szQuery); ForwardPacket(HEADER_DG_GUILD_REMOVE_MEMBER, p, sizeof(TPacketGuild)); } void CClientManager::GuildSkillUpdate(CPeer* peer, TPacketGuildSkillUpdate* p) { sys_log(0, "GuildSkillUpdate %d", p->amount); ForwardPacket(HEADER_DG_GUILD_SKILL_UPDATE, p, sizeof(TPacketGuildSkillUpdate)); } void CClientManager::GuildExpUpdate(CPeer* peer, TPacketGuildExpUpdate* p) { sys_log(0, "GuildExpUpdate %d", p->amount); ForwardPacket(HEADER_DG_GUILD_EXP_UPDATE, p, sizeof(TPacketGuildExpUpdate), 0, peer); } void CClientManager::GuildChangeMemberData(CPeer* peer, TPacketGuildChangeMemberData* p) { sys_log(0, "GuildChangeMemberData %u %u %d %d", p->pid, p->offer, p->level, p->grade); ForwardPacket(HEADER_DG_GUILD_CHANGE_MEMBER_DATA, p, sizeof(TPacketGuildChangeMemberData), 0, peer); } void CClientManager::GuildDisband(CPeer* peer, TPacketGuild* p) { sys_log(0, "GuildDisband %u", p->dwGuild); char szQuery[512]; snprintf(szQuery, sizeof(szQuery), "DELETE FROM guild%s WHERE id=%u", GetTablePostfix(), p->dwGuild); CDBManager::instance().AsyncQuery(szQuery); snprintf(szQuery, sizeof(szQuery), "DELETE FROM guild_grade%s WHERE guild_id=%u", GetTablePostfix(), p->dwGuild); CDBManager::instance().AsyncQuery(szQuery); snprintf(szQuery, sizeof(szQuery), "REPLACE INTO quest%s (dwPID, szName, szState, lValue) SELECT pid, 'guild_manage', 'withdraw_time', %u FROM guild_member%s WHERE guild_id = %u", GetTablePostfix(), (DWORD) GetCurrentTime(), GetTablePostfix(), p->dwGuild); CDBManager::instance().AsyncQuery(szQuery); snprintf(szQuery, sizeof(szQuery), "DELETE FROM guild_member%s WHERE guild_id=%u", GetTablePostfix(), p->dwGuild); CDBManager::instance().AsyncQuery(szQuery); snprintf(szQuery, sizeof(szQuery), "DELETE FROM guild_comment%s WHERE guild_id=%u", GetTablePostfix(), p->dwGuild); CDBManager::instance().AsyncQuery(szQuery); ForwardPacket(HEADER_DG_GUILD_DISBAND, p, sizeof(TPacketGuild)); } const char* __GetWarType(int n) { switch (n) { case 0 : return "ÆпÕ"; case 1 : return "¸ÍÀå"; case 2 : return "¼öÈ£"; default : return "¾ø´Â ¹øÈ£"; } } void CClientManager::GuildWar(CPeer* peer, TPacketGuildWar* p) { switch (p->bWar) { case GUILD_WAR_SEND_DECLARE: sys_log(0, "GuildWar: GUILD_WAR_SEND_DECLARE type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo); CGuildManager::instance().AddDeclare(p->bType, p->dwGuildFrom, p->dwGuildTo); break; case GUILD_WAR_REFUSE: sys_log(0, "GuildWar: GUILD_WAR_REFUSE type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo); CGuildManager::instance().RemoveDeclare(p->dwGuildFrom, p->dwGuildTo); break; /* case GUILD_WAR_WAIT_START: CGuildManager::instance().RemoveDeclare(p->dwGuildFrom, p->dwGuildTo); if (!CGuildManager::instance().WaitStart(p)) p->bWar = GUILD_WAR_CANCEL; break; */ case GUILD_WAR_WAIT_START: sys_log(0, "GuildWar: GUILD_WAR_WAIT_START type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo); case GUILD_WAR_RESERVE: // ±æµåÀü ¿¹¾à if (p->bWar != GUILD_WAR_WAIT_START) sys_log(0, "GuildWar: GUILD_WAR_RESERVE type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo); CGuildManager::instance().RemoveDeclare(p->dwGuildFrom, p->dwGuildTo); if (!CGuildManager::instance().ReserveWar(p)) p->bWar = GUILD_WAR_CANCEL; else p->bWar = GUILD_WAR_RESERVE; break; case GUILD_WAR_ON_WAR: // ±æµåÀüÀ» ½ÃÀÛ ½ÃŲ´Ù. (ÇʵåÀüÀº ¹Ù·Î ½ÃÀÛ µÊ) sys_log(0, "GuildWar: GUILD_WAR_ON_WAR type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo); CGuildManager::instance().RemoveDeclare(p->dwGuildFrom, p->dwGuildTo); CGuildManager::instance().StartWar(p->bType, p->dwGuildFrom, p->dwGuildTo); break; case GUILD_WAR_OVER: // ±æµåÀü Á¤»ó Á¾·á sys_log(0, "GuildWar: GUILD_WAR_OVER type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo); CGuildManager::instance().RecvWarOver(p->dwGuildFrom, p->dwGuildTo, p->bType, p->lWarPrice); break; case GUILD_WAR_END: // ±æµåÀü ºñÁ¤»ó Á¾·á sys_log(0, "GuildWar: GUILD_WAR_END type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo); CGuildManager::instance().RecvWarEnd(p->dwGuildFrom, p->dwGuildTo); return; // NOTE: RecvWarEnd¿¡¼­ ÆÐŶÀ» º¸³»¹Ç·Î µû·Î ºê·Îµåij½ºÆà ÇÏÁö ¾Ê´Â´Ù. case GUILD_WAR_CANCEL : sys_log(0, "GuildWar: GUILD_WAR_CANCEL type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo); CGuildManager::instance().CancelWar(p->dwGuildFrom, p->dwGuildTo); break; } ForwardPacket(HEADER_DG_GUILD_WAR, p, sizeof(TPacketGuildWar)); } void CClientManager::GuildWarScore(CPeer* peer, TPacketGuildWarScore * p) { CGuildManager::instance().UpdateScore(p->dwGuildGainPoint, p->dwGuildOpponent, p->lScore, p->lBetScore); } void CClientManager::GuildChangeLadderPoint(TPacketGuildLadderPoint* p) { sys_log(0, "GuildChangeLadderPoint Recv %u %d", p->dwGuild, p->lChange); CGuildManager::instance().ChangeLadderPoint(p->dwGuild, p->lChange); } void CClientManager::GuildUseSkill(TPacketGuildUseSkill* p) { sys_log(0, "GuildUseSkill Recv %u %d", p->dwGuild, p->dwSkillVnum); CGuildManager::instance().UseSkill(p->dwGuild, p->dwSkillVnum, p->dwCooltime); SendGuildSkillUsable(p->dwGuild, p->dwSkillVnum, false); } void CClientManager::SendGuildSkillUsable(DWORD guild_id, DWORD dwSkillVnum, bool bUsable) { sys_log(0, "SendGuildSkillUsable Send %u %d %s", guild_id, dwSkillVnum, bUsable?"true":"false"); TPacketGuildSkillUsableChange p; p.dwGuild = guild_id; p.dwSkillVnum = dwSkillVnum; p.bUsable = bUsable; ForwardPacket(HEADER_DG_GUILD_SKILL_USABLE_CHANGE, &p, sizeof(TPacketGuildSkillUsableChange)); } void CClientManager::GuildChangeMaster(TPacketChangeGuildMaster* p) { if (CGuildManager::instance().ChangeMaster(p->dwGuildID, p->idFrom, p->idTo) == true) { TPacketChangeGuildMaster packet; packet.dwGuildID = p->dwGuildID; packet.idFrom = 0; packet.idTo = 0; ForwardPacket(HEADER_DG_ACK_CHANGE_GUILD_MASTER, &packet, sizeof(packet)); } }