/* * Copyright 2007 Kevin Roe, Daniel McCarney * This file is part of Jriver. * * Jriver is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Jriver is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.jriver.core; import java.net.*; import java.io.*; import java.util.*; import javax.swing.tree.DefaultMutableTreeNode; import org.jriver.lib.Player; import org.jriver.telnet.ConnectionThread; public class MudDriver { private final String CONFIG = "config.properties"; private ThreadGroup tg = new ThreadGroup("connections"); private ArrayList<Player> players = new ArrayList<Player>(); private DefaultMutableTreeNode root; private static MudDriver driver; public MudObject loginRoom; public HeartBeat heartBeat; public Properties configuration = new Properties(); //Our driver configuration public static void main(String[] args) throws IOException { getMudDriver(); } public void addObject(DefaultMutableTreeNode object) { root.add(object); System.out.print("Added object: "); System.out.println(((MudObject)object.getUserObject()).queryName()); } public MudObject getLoginRoom() { return loginRoom; } public static MudDriver getMudDriver() { if(driver == null) driver = new MudDriver(); return driver; } private MudDriver () { Socket socket; ServerSocket serverSocket = null; boolean listening = true; String portString = ""; if(driver == null) driver = this; //Load our configuration properties file from the classpath and use it to //fill a properties object. try { configuration.load(new FileInputStream(CONFIG)); } catch(FileNotFoundException e) { System.err.println("No configuration file found..."); System.exit(-1); } catch(IOException e) { System.err.println("Error loading configuration properties file. "+ e); System.exit(-1); } portString = configuration.getProperty("port", "4444"); try { serverSocket = new ServerSocket(Integer.parseInt(portString)); } catch(NumberFormatException e) { System.err.println("Invalid port specified in configuration."); System.exit(-1); } catch (IOException e) { System.err.println("Could not listen on port: "+ portString); System.exit(-1); } System.out.println("Jriver ["+ configuration.getProperty("mudname", "Unknown MUD") +"] v0.1"); System.out.println("Now accepting connections on port "+ portString); new Thread(heartBeat = HeartBeat.getHeartBeat()).start(); root = new DefaultMutableTreeNode(this); loginRoom = new MudObject(); loginRoom.name = "Room1"; loginRoom.shortDesc = "The world's first room"; loginRoom.longDesc = "This is the central gathering room. The room is fairly\r\n"+ "empty, except for a large table in the center of the room\r\n"+ "that has blueprints and design drawings all over it. The\r\n"+ "floor is made from a smooth wood planking. Two large iron\r\n"+ "braziers hang on the wall which hold lit torches giving the\r\n"+ "room light.\n\r"; while (listening) { try { new Thread(tg, new ConnectionThread( socket = serverSocket.accept())).start(); } catch(IOException e) { e.printStackTrace(); } } try { serverSocket.close(); } catch(IOException e) { e.printStackTrace(); } } public void registerPlayer(Player p) { players.add(p); } public void removePlayer(Player p) { players.remove(p); } public ArrayList<Player> getUsers() { //Don't want people manipulating the actual arraylist return new ArrayList<Player>(players); } public Object toObject(String hashCode) { Object toReturn = null; Enumeration treeEnumeration = root.breadthFirstEnumeration(); while(treeEnumeration.hasMoreElements()) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) treeEnumeration.nextElement(); MudObject obj = (MudObject) node.getUserObject(); if(obj.getID().equals(hashCode)) toReturn = obj; } return toReturn; } public Player findPlayer(String name) { Iterator<Player> playerIterator = players.iterator(); Player found = null; name = name.toLowerCase(); while(playerIterator.hasNext()) { Player tmp = playerIterator.next(); if(tmp.queryName() != null && tmp.queryName().toLowerCase().equals(name)) found = tmp; } return found; } }