package net.scapeemulator.game.net.game;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import java.io.IOException;
import java.util.ArrayDeque;
import java.util.Queue;
import net.scapeemulator.game.GameServer;
import net.scapeemulator.game.model.Position;
import net.scapeemulator.game.model.player.Player;
import net.scapeemulator.game.model.player.PlayerOption;
import net.scapeemulator.game.msg.Message;
import net.scapeemulator.game.msg.MessageDispatcher;
import net.scapeemulator.game.msg.impl.RegionChangeMessage;
import net.scapeemulator.game.net.RsChannelHandler;
import net.scapeemulator.game.net.Session;
public final class GameSession extends Session {
private final Player player;
private final MessageDispatcher dispatcher;
private final Queue<Message> messages = new ArrayDeque<>();
public GameSession(GameServer server, Channel channel, Player player) {
super(server, channel);
this.player = player;
this.dispatcher = server.getMessageDispatcher();
}
public void init() {
/* set up player for their initial region change */
Position position = player.getPosition();
player.setLastKnownRegion(position);
ChannelFuture future = channel.write(new RegionChangeMessage(position));
future.addListener(new ChannelFutureListener() {
public void operationComplete(ChannelFuture future) {
if (!future.isSuccess()) {
System.err.println(channel.pipeline().get(RsChannelHandler.class));
channel.disconnect();
} else {
startSession();
}
}
});
}
private void startSession() {
player.setSession(this);
/* set up the game interface */
player.getInterfaceSet().init();
player.getPlayerCombatHandler().init();
/* Set all the default options that all players have available */
player.getOption(PlayerOption.FOLLOW_OPTION).setText("Follow");
player.getOption(PlayerOption.TRADE_OPTION).setText("Trade with");
player.refreshOptions();
/* fireEvents skills, inventory, energy, etc. */
player.getInventory().refresh();
player.getEquipment().refresh();
player.getSettings().refresh();
player.getSkillSet().refresh();
player.setEnergy(player.getEnergy());
player.onLogin();
}
@Override
public void messageReceived(Object message) throws IOException {
synchronized (messages) {
messages.add((Message) message);
}
}
@Override
public void channelClosed() {
server.getLoginService().addLogoutRequest(player);
}
public ChannelFuture send(Message message) {
return channel.write(message);
}
public void processMessageQueue() {
synchronized (messages) {
Message message;
while ((message = messages.poll()) != null)
dispatcher.dispatch(player, message);
}
}
}