MXD-Server/src/handling/channel/handler/BuddyListHandler.java

166 lines
8.4 KiB
Java

package handling.channel.handler;
import client.MapleCharacter;
import tools.FilePrinter;
import client.BuddyList.BuddyOperation;
import client.BuddyList.BuddyAddResult;
import client.BuddyList;
import handling.world.World.Buddy;
import handling.channel.ChannelServer;
import handling.world.World.Find;
import tools.data.LittleEndianAccessor;
import client.BuddyEntry;
import tools.MaplePacketCreator;
import client.MapleClient;
public class BuddyListHandler {
private static void nextPendingRequest(final MapleClient c) {
final BuddyEntry pendingBuddyRequest = c.getPlayer().getBuddylist().pollPendingRequest();
if (pendingBuddyRequest != null) {
c.sendPacket(MaplePacketCreator.requestBuddylistAdd(pendingBuddyRequest.getCharacterId(), pendingBuddyRequest.getName(), pendingBuddyRequest.getLevel(), pendingBuddyRequest.getJob()));
}
}
public static final void BuddyOperationHandler(final LittleEndianAccessor slea, final MapleClient client) {
final MapleCharacter player = client.getPlayer();
final int mode = slea.readByte();
final BuddyList buddyList = player.getBuddylist();
switch (mode) {
case 0: {
final int unknow1 = slea.readInt();
final int unknow2 = slea.readInt();
client.sendPacket(MaplePacketCreator.updateBuddylist(player.getBuddylist().getBuddies()));
break;
}
case 1: {
final String buddyName = slea.readMapleAsciiString();
final String buddyGroup = slea.readMapleAsciiString();
final BuddyEntry oldBuddy = buddyList.get(buddyName);
if (buddyName.length() > 13 || buddyGroup.length() > 16) {
nextPendingRequest(client);
return;
}
if (oldBuddy != null && oldBuddy.getGroup().equals(buddyGroup)) {
client.sendPacket(MaplePacketCreator.buddylistMessage((byte) 11));
nextPendingRequest(client);
return;
}
if (oldBuddy != null) {
oldBuddy.setGroup(buddyGroup);
client.sendPacket(MaplePacketCreator.updateBuddylist(buddyList.getBuddies()));
nextPendingRequest(client);
return;
}
if (buddyList.isFull()) {
client.sendPacket(MaplePacketCreator.buddylistMessage((byte) 11));
return;
}
final int buddyChannel = Find.findChannel(buddyName);
BuddyEntry buddy = null;
BuddyAddResult reqRes = null;
if (buddyChannel > 0) {
final MapleCharacter buddyChar = ChannelServer.getInstance(buddyChannel).getPlayerStorage().getCharacterByName(buddyName);
if (!buddyChar.isGM() || player.isGM()) {
buddy = new BuddyEntry(buddyChar.getName(), buddyChar.getId(), buddyGroup, buddyChannel, false, (int) buddyChar.getLevel(), (int) buddyChar.getJob());
}
} else {
buddy = BuddyEntry.getByNameFromDB(buddyName);
}
if (buddy == null) {
client.sendPacket(MaplePacketCreator.buddylistMessage((byte) 15));
nextPendingRequest(client);
return;
}
if (buddyChannel > 0) {
reqRes = Buddy.requestBuddyAdd(buddyName, client.getChannel(), client.getPlayer().getId(), client.getPlayer().getName(), (int) client.getPlayer().getLevel(), (int) client.getPlayer().getJob());
} else {
final int buddyCount = BuddyList.getBuddyCount(buddy.getCharacterId(), 0);
if (buddyCount == -1) {
throw new RuntimeException("Result set expected");
}
if (buddyCount >= BuddyList.getBuddyCapacity(buddy.getCharacterId())) {
reqRes = BuddyAddResult.BUDDYLIST_FULL;
}
final int pending = BuddyList.getBuddyPending(buddy.getCharacterId(), player.getId());
if (pending > -1) {
reqRes = BuddyAddResult.ALREADY_ON_LIST;
}
}
if (reqRes == BuddyAddResult.BUDDYLIST_FULL) {
client.sendPacket(MaplePacketCreator.buddylistMessage((byte) 12));
break;
}
if (reqRes == BuddyAddResult.ALREADY_ON_LIST && buddyChannel > 0) {
final MapleCharacter buddyChara = ChannelServer.getInstance(buddyChannel).getPlayerStorage().getCharacterByName(buddyName);
notifyRemoteChannel(client, buddyChannel, buddy.getCharacterId(), buddyGroup, BuddyOperation.ADDED);
buddyList.put(new BuddyEntry(buddyName, buddyChara.getId(), buddyGroup, buddyChannel, true, (int) buddyChara.getLevel(), (int) buddyChara.getJob()));
client.sendPacket(MaplePacketCreator.updateBuddylist(buddyList.getBuddies()));
client.sendPacket(MaplePacketCreator.updateBuddyChannel(buddyChara.getId(), buddyChannel - 1));
break;
}
BuddyList.addBuddyToDB(player, buddy);
buddyList.put(buddy);
client.sendPacket(MaplePacketCreator.updateBuddylist(buddyList.getBuddies()));
nextPendingRequest(client);
break;
}
case 2: {
final int buddyCharId = slea.readInt();
if (buddyList.isFull()) {
client.sendPacket(MaplePacketCreator.buddylistMessage((byte) 11));
nextPendingRequest(client);
return;
}
final int buddyChannel2 = Find.findChannel(buddyCharId);
BuddyEntry buddy2;
if (buddyChannel2 < 0) {
buddy2 = BuddyEntry.getByIdfFromDB(buddyCharId);
} else {
final MapleCharacter buddyChar2 = ChannelServer.getInstance(buddyChannel2).getPlayerStorage().getCharacterById(buddyCharId);
buddy2 = new BuddyEntry(buddyChar2.getName(), buddyChar2.getId(), "其他", buddyChannel2, true, (int) buddyChar2.getLevel(), (int) buddyChar2.getJob());
}
if (buddy2 == null) {
client.sendPacket(MaplePacketCreator.buddylistMessage((byte) 11));
} else {
buddyList.put(buddy2);
client.sendPacket(MaplePacketCreator.updateBuddylist(buddyList.getBuddies()));
notifyRemoteChannel(client, buddyChannel2, buddyCharId, "其他", BuddyOperation.ADDED);
}
nextPendingRequest(client);
break;
}
case 3: {
final int buddyCharId = slea.readInt();
final BuddyEntry buddy3 = buddyList.get(buddyCharId);
if (buddy3 != null && buddy3.isVisible()) {
notifyRemoteChannel(client, Find.findChannel(buddyCharId), buddyCharId, buddy3.getGroup(), BuddyOperation.DELETED);
}
buddyList.remove(buddyCharId);
client.sendPacket(MaplePacketCreator.updateBuddylist(player.getBuddylist().getBuddies()));
nextPendingRequest(client);
break;
}
case 82: {
final int unknow1 = slea.readShort();
final int unknow2 = slea.readByte();
client.sendPacket(MaplePacketCreator.updateBuddylist(player.getBuddylist().getBuddies()));
break;
}
case 125: {
break;
}
default: {
FilePrinter.printError("BuddyListHandler.txt", "Unknown Buddylist Operation " + String.valueOf(mode) + " " + slea.toString());
break;
}
}
}
private static void notifyRemoteChannel(final MapleClient c, final int remoteChannel, final int otherCid, final String group, final BuddyOperation operation) {
final MapleCharacter player = c.getPlayer();
if (remoteChannel > 0) {
Buddy.buddyChanged(otherCid, player.getId(), player.getName(), c.getChannel(), operation, (int) player.getLevel(), (int) player.getJob(), group);
}
}
}