package javastory.channel; import java.rmi.RemoteException; import java.util.Map; import javastory.channel.server.Trade; import javastory.channel.shops.PlayerShop; import javastory.client.GameClient; import javastory.cryptography.AesTransform; import javastory.rmi.WorldChannelInterface; import javastory.scripting.NpcScriptManager; import javastory.tools.LogUtil; import javastory.world.core.PartyOperation; import javax.script.ScriptEngine; import org.apache.mina.core.session.IoSession; import com.google.common.collect.Maps; public final class ChannelClient extends GameClient { private ChannelCharacter player; private final boolean transition = false; private final Map<String, ScriptEngine> engines = Maps.newHashMap(); public ChannelClient(final AesTransform clientCrypto, final AesTransform serverCrypto, final IoSession session) { super(clientCrypto, serverCrypto, session); } public ChannelCharacter getPlayer() { return this.player; } public void setPlayer(final ChannelCharacter player) { this.player = player; } public final void removalTask() { try { if (!this.player.getAllBuffs().isEmpty()) { this.player.clearAllBuffEffects(); } if (!this.player.getAllDiseases().isEmpty()) { this.player.cancelAllDebuffs(); } if (this.player.getTrade() != null) { Trade.cancelTrade(this.player.getTrade()); } NpcScriptManager.getInstance().dispose(this); if (this.player.getEventInstance() != null) { this.player.getEventInstance().playerDisconnected(this.player); } this.player.getCheatTracker().dispose(); if (this.player.getMap() != null) { this.player.getMap().removePlayer(this.player); } final PlayerShop shop = this.player.getPlayerShop(); if (shop != null) { shop.removeVisitor(this.player); if (shop.isOwner(this.player)) { shop.setOpen(true); } } } catch (final Throwable e) { LogUtil.outputFileError(LogUtil.Acc_Stuck, e); } } public final void getDebugMessage(final StringBuilder sb) { sb.append(this.getSession().getRemoteAddress()); sb.append(" Connected: "); sb.append(this.getSession().isConnected()); sb.append(" Closing: "); sb.append(this.getSession().isClosing()); sb.append(" ClientKeySet: "); sb.append(this.getSession().getAttribute(GameClient.CLIENT_KEY) != null); sb.append(" has char: "); sb.append(this.getPlayer() != null); } public final void setScriptEngine(final String name, final ScriptEngine e) { this.engines.put(name, e); } public final ScriptEngine getScriptEngine(final String name) { return this.engines.get(name); } public final void removeScriptEngine(final String name) { this.engines.remove(name); } @Override public final void disconnect(final boolean force) { if (!force) { this.removalTask(); this.player.saveToDb(true); final ChannelServer channel = ChannelServer.getInstance(); try { final WorldChannelInterface world = ChannelServer.getWorldInterface(); if (this.player.getMessenger() != null) { world.leaveMessenger(this.player.getMessenger().getId(), new MessengerMember(this.player)); this.player.setMessenger(null); } final PartyMember partyMember = this.player.getPartyMembership(); if (partyMember != null) { partyMember.setOnline(false); world.updateParty(partyMember.getPartyId(), PartyOperation.LOG_ONOFF, partyMember); } if (!this.transition) { world.loggedOff(this.player.getName(), this.player.getId(), super.getChannelId(), this.player.getBuddyList().getBuddyIds()); } else { // Change channel world.loggedOn(this.player.getName(), this.player.getId(), super.getChannelId(), this.player.getBuddyList().getBuddyIds()); } if (this.player.getGuildId() > 0) { world.setGuildMemberOnline(this.player.getGuildMembership(), false, -1); } } catch (final RemoteException e) { ChannelServer.pingWorld(); this.player.setMessenger(null); } catch (final Exception e) { System.err.println(getLogMessage(this, "ERROR") + e); } finally { if (channel != null) { ChannelServer.removePlayer(this.player); } this.player = null; } } super.getSession().close(force); } public static String getLogMessage(final ChannelClient cfor, final String message) { return getLogMessage(cfor, message, new Object[0]); } public static String getLogMessage(final ChannelClient cfor, final String message, final Object... parms) { final StringBuilder builder = new StringBuilder(); if (cfor != null) { final ChannelCharacter player = cfor.getPlayer(); if (player != null) { builder.append("<"); builder.append(player.getName().toUpperCase()); builder.append(" (cid: "); builder.append(player.getId()); builder.append(")> "); } if (cfor.getAccountName() != null) { builder.append("(Account: "); builder.append(cfor.getAccountName()); builder.append(") "); } } builder.append(message); int start; for (final Object parm : parms) { start = builder.indexOf("{}"); builder.replace(start, start + 2, parm.toString()); } return builder.toString(); } public static String getLogMessage(final ChannelCharacter cfor, final String message) { return getLogMessage(cfor == null ? null : cfor.getClient(), message); } public static String getLogMessage(final ChannelCharacter cfor, final String message, final Object... parms) { return getLogMessage(cfor == null ? null : cfor.getClient(), message, parms); } }