/
area/
classes/net/sourceforge/pain/logic/
classes/net/sourceforge/pain/logic/event/
classes/net/sourceforge/pain/logic/fn/util/
classes/net/sourceforge/pain/network/console/
classes/net/sourceforge/pain/plugin/
classes/net/sourceforge/pain/plugin/reset/
classes/net/sourceforge/pain/plugin/shutdown/
classes/net/sourceforge/pain/plugin/social/
classest/net/sourceforge/pain/db/data/
doc/
doc/paindb/resources/
src/net/sourceforge/pain/logic/
src/net/sourceforge/pain/logic/event/
src/net/sourceforge/pain/logic/fn/util/
src/net/sourceforge/pain/network/console/
src/net/sourceforge/pain/network/console/telnet/
src/net/sourceforge/pain/plugin/
src/net/sourceforge/pain/plugin/command/
src/net/sourceforge/pain/plugin/reset/
src/net/sourceforge/pain/plugin/shutdown/
src/net/sourceforge/pain/plugin/social/
src/net/sourceforge/pain/util/
tests/
tests/net/sourceforge/pain/db/data/
package net.sourceforge.pain.logic.fn;


import net.sourceforge.pain.*;
import net.sourceforge.pain.network.console.*;
import net.sourceforge.pain.data.*;
import net.sourceforge.pain.data.type.*;
import net.sourceforge.pain.util.*;


public final class ConsoleFn {

	public static void logoutUser(Console console) {
		_logoutUser(console, false);
	}

	private static void _logoutUser(Console console, boolean silent) {
		Player p = console.getPlayer();
		removePlayerFromActive(p);
		final Located ploc = p.asLocated();
		p.setQuitSpace(ploc.getLocation());
		RelocateFn.relocate(ploc, Core.getWorld().getPlayersQuitSpace());

		if (!silent) {
			MessageOutFn.outln(console, "Good bye!");
			MessageOutFn.outSpace(p, "$n leaves the game", p, null);
		}
		Core.consoleByOwner.remove(p);
		console.setPlayer(null);
		ConsoleManager.closeConsole(console);
	}

	private static void removePlayerFromActive(Player p) {
		Player prev = p.getPrevActivePlayer();
		Player next = p.getNextActivePlayer();
		final World world = Core.getWorld();
		final Player firstActivePlayer = world.getFirstActivePlayer();

		if (prev != p) {//prev is never null, if prev ==p that was last active player
			if (next != null) {
				next.setPrevActivePlayer(prev);
			} else { //p is last in list
				firstActivePlayer.setPrevActivePlayer(prev);
			}
			if (p != firstActivePlayer) {
				prev.setNextActivePlayer(next);
			} else {
				world.setFirstActivePlayer(next);
			}

		} else {
			world.setFirstActivePlayer(null);
		}


		p.setPrevActivePlayer(null);
		p.setNextActivePlayer(null);
	}


	public static void loginUser(final Console console, final Player player) {
		if (console.getPlayer() != null || ConsoleFn.getConsole(player) != null) {
			throw new RuntimeException("console.getPlayer() == null && ConsoleFn.getConsole(player) == null violated");
		}
		Log.debug("ConsoleFn: logging user in:" + player.getLogin());
		final World world = Core.getWorld();
		Player firstActive = world.getFirstActivePlayer();
		player.setNextActivePlayer(null);
		if (firstActive == null) {
			player.setPrevActivePlayer(player);
			world.setFirstActivePlayer(player);
		} else {
			final Player prev = firstActive.getPrevActivePlayer();
			firstActive.setPrevActivePlayer(player);
			player.setPrevActivePlayer(prev);
			prev.setNextActivePlayer(player);
		}
		// relocation playe from default logout-players container
		// to the player quit space
		final Located ploc = player.asLocated();
		final Space quitSpace = player.getQuitSpace();
		if (quitSpace!=null) {
			RelocateFn.relocate(ploc, quitSpace);
		} else { //player was disconnected with rollback -> todo: disconnect post checker to be shure that disconnected player in world.quitSpace
			//do nothing
		}
//		player.setQuitSpace(null);

		Core.consoleByOwner.put(player, console);
		console.setPlayer(player);
		console.setCommandMode();

		MessageOutFn.outln(console, "Hello {w" + player.getName() + "{x !\n ");
		MessageOutFn.outSpace(player, "$n enters the game", player);
		ShowFn.showSpace(player.asReceptive(), player.asLocated().getLocation());
		Log.debug("ConsoleFn: user logged in:" + player.getLogin());
	}

	/** forces console to disconnect */
	public static void forceDisconnect(Console c) {
		Player p = c.getPlayer();
		if (p != null) {
			_logoutUser(c, true);
		} else {
			ConsoleManager.closeConsole(c);
		}
	}

	public static Console getConsole(LogicalObject obj) {
		return (Console) Core.consoleByOwner.get(obj.getRole(Player.class));
	}
}