package javastory.channel.handling;
import java.rmi.RemoteException;
import java.util.Collection;
import javastory.channel.ChannelCharacter;
import javastory.channel.ChannelClient;
import javastory.channel.ChannelServer;
import javastory.channel.CharacterTransfer;
import javastory.channel.GuildMember;
import javastory.channel.Messenger;
import javastory.channel.MessengerMember;
import javastory.channel.PartyMember;
import javastory.channel.PlayerBuffValueHolder;
import javastory.channel.client.BuddyListEntry;
import javastory.channel.maps.GameMap;
import javastory.channel.maps.SavedLocationType;
import javastory.client.SimpleCharacterInfo;
import javastory.game.data.SkillInfoProvider;
import javastory.game.quest.QuestStatus;
import javastory.io.PacketFormatException;
import javastory.io.PacketReader;
import javastory.rmi.WorldChannelInterface;
import javastory.server.channel.PlayerStorage;
import javastory.tools.LogUtil;
import javastory.tools.packets.ChannelPackets;
import javastory.tools.packets.FamilyPacket;
import javastory.world.core.CharacterIdChannelPair;
import javastory.world.core.PartyOperation;
public class InterServerHandler {
public static void handleEnterMTS(final ChannelClient c) {
final GameMap map = ChannelServer.getMapFactory().getMap(910000000);
final ChannelCharacter player = c.getPlayer();
if (player.getMapId() < 910000000 || player.getMapId() > 910000022) {
if (player.getLevel() >= 10) {
player.saveLocation(SavedLocationType.FREE_MARKET);
player.changeMap(map, map.getPortal("out00"));
c.write(ChannelPackets.enableActions());
} else {
player.sendNotice(5, "You do not meet the minimum level requirement to access the Trade Shop.");
c.write(ChannelPackets.enableActions());
}
} else {
player.sendNotice(5, "You are already in the FREE MARKET");
c.write(ChannelPackets.enableActions());
}
}
public static void handlePlayerLoggedIn(final int playerId, final ChannelClient client) {
final PlayerStorage playerStorage = ChannelServer.getPlayerStorage();
final int channelId = client.getChannelId();
// Remote hack
if (!playerStorage.checkSession(playerId, client.getSessionIP())) {
client.disconnect(true);
}
ChannelCharacter player;
final CharacterTransfer transfer = playerStorage.getPendingTransfer(playerId);
if (transfer == null) {
// Player isn't in storage, probably isn't CC
player = ChannelCharacter.loadFromDb(playerId, client);
} else {
player = ChannelCharacter.reconstructCharacter(transfer, client);
}
client.setPlayer(player);
client.setAccountId(player.getAccountId());
ChannelServer.addPlayer(player);
client.write(ChannelPackets.getCharInfo(player));
player.getMap().addPlayer(player);
try {
// Start of cooldown, buffs
final WorldChannelInterface world = ChannelServer.getWorldInterface();
final Collection<PlayerBuffValueHolder> buffs = world.getBuffsFromStorage(player.getId());
if (buffs != null) {
player.silentGiveBuffs(buffs);
}
player.giveCooldowns(world.getCooldownsFromStorage(player.getId()));
player.giveSilentDebuff(world.getDiseaseFromStorage(player.getId()));
// Start of buddylist
final int buddyIds[] = player.getBuddyList().getBuddyIds();
world.loggedOn(player.getName(), player.getId(), channelId, buddyIds);
final CharacterIdChannelPair[] onlineBuddies = world.multiBuddyFind(player.getId(), buddyIds);
for (final CharacterIdChannelPair onlineBuddy : onlineBuddies) {
final BuddyListEntry ble = player.getBuddyList().get(onlineBuddy.getCharacterId());
ble.setChannel(onlineBuddy.getChannel());
player.getBuddyList().put(ble);
}
client.write(ChannelPackets.updateBuddyList(player.getBuddyList().getBuddies()));
// Party:
final PartyMember partyMember = player.getPartyMembership();
if (partyMember != null) {
world.updateParty(partyMember.getPartyId(), PartyOperation.LOG_ONOFF, partyMember);
}
// Start of Messenger
final Messenger messenger = player.getMessenger();
final int messenger_pos = player.getMessengerPosition();
if (player.getMessenger() != null && messenger_pos < 4 && messenger_pos > -1) {
final MessengerMember messengerplayer = new MessengerMember(player, messenger_pos);
world.silentJoinMessenger(messenger.getId(), messengerplayer, messenger_pos);
world.updateMessenger(player.getMessenger().getId(), player.getName(), channelId);
}
// Start of Guild and alliance
final GuildMember guildMember = player.getGuildMembership();
if (guildMember != null) {
final int guildId = guildMember.getGuildId();
world.setGuildMemberOnline(guildMember, true, channelId);
client.write(ChannelPackets.showGuildInfo(client, guildId));
}
} catch (final RemoteException e) {
ChannelServer.pingWorld();
} catch (final Exception e) {
LogUtil.outputFileError(LogUtil.Login_Error, e);
}
client.write(FamilyPacket.getFamilyData());
player.getSkillMacros().send(client);
player.showNote();
player.updatePartyMemberHP();
client.write(ChannelPackets.getKeymap(player.getKeyLayout()));
for (final QuestStatus status : player.getStartedQuests()) {
if (status.hasMobKills()) {
client.write(ChannelPackets.updateQuestMobKills(status));
}
}
final SimpleCharacterInfo request = player.getBuddyList().pollPendingRequest();
if (request != null) {
player.getBuddyList().put(new BuddyListEntry(request.Name, request.Id, "ETC", -1, false, request.Level, request.Job));
client.write(ChannelPackets.requestBuddylistAdd(request.Id, request.Name, request.Level, request.Job));
}
player.expirationTask();
if (player.getJobId() == 132) { // DARKKNIGHT
player.checkBerserk();
}
if (player.isGM()) {
SkillInfoProvider.getSkill(9001001).getEffect(1).applyTo(player); // GM
// haste
}
}
public static void handleChannelChange(final PacketReader reader, final ChannelClient c, final ChannelCharacter chr) throws PacketFormatException {
if (!chr.isAlive()) {
c.write(ChannelPackets.enableActions());
return;
}
final int targetChannelId = reader.readByte() + 1;
return;
// TODO: Whoops, we can't do it like this.
// final ChannelServer targetChannel =
// ChannelManager.getInstance(targetChannelId);
//
// if (FieldLimitType.ChannelSwitch.check(chr.getMap().getFieldLimit())
// || targetChannelId == c.getChannelId()) {
// c.disconnect();
// return;
// } else if (targetChannel == null || targetChannel.getStatus() !=
// ServerStatus.ONLINE) {
// c.write(ChannelPackets.serverBlocked(1));
// return;
// }
//
// if (chr.getTrade() != null) {
// Trade.cancelTrade(chr.getTrade());
// }
// if (chr.getPets() != null) {
// chr.unequipAllPets();
// }
// if (chr.getCheatTracker() != null) {
// chr.getCheatTracker().dispose();
// }
// if (chr.getBuffedValue(BuffStat.SUMMON) != null) {
// chr.cancelEffectFromBuffStat(BuffStat.SUMMON);
// }
// if (chr.getBuffedValue(BuffStat.PUPPET) != null) {
// chr.cancelEffectFromBuffStat(BuffStat.PUPPET);
// }
// if (chr.getBuffedValue(BuffStat.MIRROR_TARGET) != null) {
// chr.cancelEffectFromBuffStat(BuffStat.MIRROR_TARGET);
// }
//
// final PlayerShop shop = chr.getPlayerShop();
// if (shop != null) {
// shop.removeVisitor(chr);
// if (shop.isOwner(chr)) {
// shop.setOpen(true);
// }
// }
//
// final ChannelServer ch = ChannelServer.getInstance();
// try {
// final WorldChannelInterface wci = ChannelServer.getWorldInterface();
//
// if (chr.getMessenger() != null) {
// wci.silentLeaveMessenger(chr.getMessenger().getId(), new
// MessengerMember(chr));
// }
// wci.addBuffsToStorage(chr.getId(), chr.getAllBuffs());
// wci.addCooldownsToStorage(chr.getId(), chr.getAllCooldowns());
// wci.addDiseaseToStorage(chr.getId(), chr.getAllDiseases());
// wci.transfer(new CharacterTransfer(chr), chr.getId(),
// targetChannelId);
// } catch (RemoteException e) {
// e.printStackTrace();
// ChannelServer.pingWorld();
// }
// ch.removePlayer(chr);
//
// final String[] socket = ch.getIP(targetChannelId).split(":");
// c.write(ChannelPackets.getChannelChange(Integer.parseInt(socket[1])));
// chr.saveToDb(false);
// chr.getMap().removePlayer(chr);
// c.setPlayer(null);
}
}