package handling.channel.handler; import client.MapleCharacter; import client.MapleClient; import client.Skill; import client.SkillFactory; import handling.channel.MapleGuildRanking; import handling.world.WorldGuildService; import handling.world.guild.MapleGuild; import handling.world.guild.MapleGuildResponse; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import server.MapleStatEffect; import tools.FileoutputUtil; import tools.Pair; import tools.StringUtil; import tools.data.input.SeekableLittleEndianAccessor; import tools.packet.GuildPacket; public class GuildHandler { private static final Map<String, Pair<Integer, Long>> invited = new HashMap(); private static long nextPruneTime = System.currentTimeMillis() + 300000L; public static void DenyGuildRequest(String from, MapleClient c) { MapleCharacter cfrom = c.getChannelServer().getPlayerStorage().getCharacterByName(from); if ((cfrom != null) && (invited.remove(c.getPlayer().getName().toLowerCase()) != null)) { cfrom.dropMessage(5, "\"" + c.getPlayer().getName() + "\"拒绝了家族邀请."); // cfrom.getClient().getSession().write(GuildPacket.denyGuildInvitation(c.getPlayer().getName())); } } public static final void JoinGuildRequest(final int guildId, final MapleClient c) { c.getPlayer().setGuildId(guildId); int 添加申请列表 = WorldGuildService.getInstance().addGuildJoinMember(c.getPlayer().getMGC()); if (添加申请列表 == 0) { c.getPlayer().dropMessage(1, "家族成员数已到达最高限制。"); return; } c.getPlayer().setGuildId(0); } public static final void JoinGuildCancel(final MapleClient c) { c.getPlayer().setGuildId(MapleGuild.getJoinGuildId(c.getPlayer().getId())); WorldGuildService.getInstance().removeGuildJoinMember(c.getPlayer().getMGC()); c.getSession().write(GuildPacket.removeGuildJoin(c.getPlayer().getId())); c.getPlayer().setGuildId(0); } public static final void AddGuildMember(final SeekableLittleEndianAccessor slea, final MapleClient c) { slea.readByte(); int memberId = slea.readInt(); MapleCharacter chr = MapleCharacter.getCharacterById(memberId); chr.setGuildId(c.getPlayer().getGuildId()); chr.setGuildRank((byte) 5); int s = WorldGuildService.getInstance().addGuildMember(chr.getMGC()); if (s == 0) { c.getPlayer().dropMessage(1, "家族成员数已到达最高限制。"); chr.setGuildId(0); return; } chr.getClient().getSession().write(GuildPacket.showGuildInfo(chr)); chr.saveGuildStatus(); respawnPlayer(chr); } public static final void DenyGuildJoin(final SeekableLittleEndianAccessor slea, final MapleClient c) { for (int i = 0 ; i < (slea.readByte() & 0xFF) ; i++) { int cid = slea.readInt(); MapleGuild guild = WorldGuildService.getInstance().getGuild(MapleGuild.getJoinGuildId(cid)); guild.setGuildQuest(false, MapleCharacter.getCharacterById(cid)); byte[] packet = GuildPacket.removeGuildJoin(cid); MapleCharacter chr = c.getChannelServer().getPlayerStorage().getCharacterById(cid); if (chr != null) { chr.getClient().getSession().write(packet); } guild.broadcast(packet); } } private static boolean isGuildNameAcceptable(String name) { return WorldGuildService.getInstance().getGuildByName(name) == null; } private static void respawnPlayer(MapleCharacter chr) { if (chr.getMap() == null) { return; } chr.getMap().broadcastMessage(GuildPacket.loadGuildName(chr)); chr.getMap().broadcastMessage(GuildPacket.loadGuildIcon(chr)); } private static String GuildName; public static void Guild(SeekableLittleEndianAccessor slea, MapleClient c) { long currentTime = System.currentTimeMillis(); if (currentTime >= nextPruneTime) { Iterator itr = invited.entrySet().iterator(); while (itr.hasNext()) { Map.Entry inv = (Map.Entry) itr.next(); if (currentTime >= ((Long) ((Pair) inv.getValue()).right)) { itr.remove(); } } nextPruneTime += 300000L; } MapleCharacter chr = c.getPlayer(); byte mode = slea.readByte(); int guildId; String name; int cid; Skill skilli; int eff; switch (mode) { case 0: c.getSession().write(GuildPacket.showGuildInfo(chr)); break; case 0x01: // 接受邀请 if (c.getPlayer().getGuildId() > 0) { return; } case 0x02: // 显示公会 guildId = slea.readInt(); c.getSession().write(GuildPacket.GuildReceipt(guildId)); break; case 0x04: // 创建判断家族名字 GuildName = slea.readMapleAsciiString(); if (!isGuildNameAcceptable(GuildName)) { c.getSession().write(GuildPacket.genericGuildMessage((byte) 0x33)); return; } c.getSession().write(GuildPacket.createGuildNotice(GuildName)); break; case 0x07: // 邀请 if ((chr.getGuildId() <= 0) || (chr.getGuildRank() > 2)) { return; } name = slea.readMapleAsciiString().toLowerCase(); MapleCharacter cfrom = c.getChannelServer().getPlayerStorage().getCharacterByName(name); if (cfrom.getGuildId() > 0) { chr.dropMessage(1, "对方已经加入其它家族了。"); return; } final MapleGuildResponse mgr = MapleGuild.sendInvite(c, name); if (mgr != null) { c.getSession().write(mgr.getPacket()); } else { c.getPlayer().dropMessage(5, "已邀请'" + name + "'加入公会。"); } break; // guildId = chr.getGuildId(); // name = cfrom.getName().toLowerCase(); // Pair gid = (Pair) invited.remove(name); // if ((gid == null) || (guildId != ((Integer) gid.left))) { // break; // } // cfrom.setGuildId(guildId); // cfrom.setGuildRank((byte) 5); // int s = WorldGuildService.getInstance().addGuildMember(cfrom.getMGC()); // if (s == 0) { // chr.dropMessage(1, "家族成员数已到达最高限制。"); // cfrom.setGuildId(0); // return; // } // cfrom.getClient().getSession().write(GuildPacket.showGuildInfo(cfrom)); // cfrom.saveGuildStatus(); // respawnPlayer(cfrom); // if (invited.containsKey(name)) { // chr.dropMessage(5, "玩家 " + name + " 已在邀请中,请等待回应。"); // return; // } // MapleGuildResponse mgr = MapleGuild.sendInvite(c, name); // if (mgr != null) { // c.getSession().write(mgr.getPacket()); // } else { // invited.put(name, new Pair(chr.getGuildId(), currentTime + 300000L)); // } // break; case 0x0B: // 离开 cid = slea.readInt(); name = slea.readMapleAsciiString(); if ((cid != chr.getId()) || (!name.equals(chr.getName())) || (chr.getGuildId() <= 0)) { return; } WorldGuildService.getInstance().leaveGuild(chr.getMGC()); c.getSession().write(GuildPacket.showGuildInfo(null)); break; case 0x0C: // 驱逐 cid = slea.readInt(); name = slea.readMapleAsciiString(); if ((chr.getGuildRank() > 2) || (chr.getGuildId() <= 0)) { return; } WorldGuildService.getInstance().expelMember(chr.getMGC(), name, cid); break; case 0x12: // 修改职位名称 if ((chr.getGuildId() <= 0) || (chr.getGuildRank() != 1)) { return; } String[] ranks = new String[5]; for (int i = 0; i < 5; i++) { ranks[i] = slea.readMapleAsciiString(); } WorldGuildService.getInstance().changeRankTitle(chr.getGuildId(), ranks); break; case 0x13: //修改职位 cid = slea.readInt(); byte newRank = slea.readByte(); if ((newRank <= 1) || (newRank > 5) || (chr.getGuildRank() > 2) || ((newRank <= 2) && (chr.getGuildRank() != 1)) || (chr.getGuildId() <= 0)) { return; } WorldGuildService.getInstance().changeRank(chr.getGuildId(), cid, newRank); break; case 0x14: // 修改图标 if ((chr.getGuildId() <= 0) || (chr.getGuildRank() != 1)) { return; } short bg = slea.readShort(); byte bgcolor = slea.readByte(); short logo = slea.readShort(); byte logocolor = slea.readByte(); WorldGuildService.getInstance().setGuildEmblem(chr.getGuildId(), bg, bgcolor, logo, logocolor); respawnPlayer(c.getPlayer()); break; case 0x11: //更改家族公告 String notice = slea.readMapleAsciiString(); if ((notice.length() > 100) || (chr.getGuildId() <= 0) || (chr.getGuildRank() > 2)) { return; } WorldGuildService.getInstance().setGuildNotice(chr.getGuildId(), notice); break; case 0x1F: cid = slea.readInt(); if ((chr.getGuildId() <= 0) || (chr.getGuildRank() > 1)) { return; } WorldGuildService.getInstance().setGuildLeader(chr.getGuildId(), cid); break; case 0x2D: // 公会搜寻 switch (slea.readByte()) { case 0:// 名字搜寻 String keyWord = slea.readMapleAsciiString(); c.getSession().write(GuildPacket.showSearchGuilds(MapleGuild.searchGuild(keyWord))); break; case 1:// 条件搜寻 int[] keyWords = new int[6]; for (int i = 0 ; i < 6 ; i++) { keyWords[i] = slea.readByte() & 0xFF; } c.getSession().write(GuildPacket.showSearchGuilds(MapleGuild.searchGuild(keyWords))); break; } break; case 0x35: // 家族创建提示 int 创建 = slea.readByte(); // 1 确认 0 取消 if (创建 == 1) { int cost = c.getChannelServer().getCreateGuildCost(); if ((chr.getGuildId() > 0) || (chr.getMapId() != 200000301)) { chr.dropMessage(1, "不能创建家族\r\n已经有家族或没在家族中心"); return; } if (chr.getMeso() < cost) { chr.dropMessage(1, "你没有足够的金币创建一个家族。当前创建家族需要: " + cost + " 的金币。"); return; } guildId = WorldGuildService.getInstance().createGuild(c.getPlayer().getId(), GuildName); if (guildId == 0) { c.getPlayer().dropMessage(1, "创建公会出错\r\n请重试一次。"); return; } c.getPlayer().gainMeso(-cost, true, true); c.getPlayer().setGuildId(guildId); c.getPlayer().setGuildRank((byte) 1); c.getPlayer().saveGuildStatus(); WorldGuildService.getInstance().setGuildMemberOnline(c.getPlayer().getMGC(), true, c.getChannel()); //c.getSession().write(GuildPacket.showGuildInfo(c.getPlayer())); c.getSession().write(GuildPacket.newGuildInfo(c.getPlayer())); WorldGuildService.getInstance().gainGP(c.getPlayer().getGuildId(), 500, c.getPlayer().getId()); MapleGuildRanking.getInstance().load(true); //c.getPlayer().dropMessage(1, "恭喜你成功创建家族."); //respawnPlayer(c.getPlayer()); } else if (创建 == 0) { c.getSession().write(GuildPacket.genericGuildMessage((byte) 0x3B)); } break; default: FileoutputUtil.log("未知家族操作类型: ( 0x" + StringUtil.getLeftPaddedStr(Integer.toHexString(mode).toUpperCase(), '0', 2) + " )" + slea.toString()); } } }