using System.Net.Sockets; using System.Collections.Generic; using System.Threading; namespace WorldOfPeacecraft { public class Backend : IBackend { private Sender Send; private Receiver Rec; private Parser Parse; private TcpClient Client; private Dictionary Dragons; private Dictionary Players; private LinkedList ChatMessages; private Map Map; private Buffer SenderBuffer; private IGui Gui; private int SelfId; private AutoResetEvent InitializedEvent = new AutoResetEvent(false); private bool initialized = false; private Pathwalker Pathwalker = new Pathwalker(); public Backend (IGui gui) { Gui = gui; Dragons = new Dictionary (); Players = new Dictionary (); ChatMessages = new LinkedList (); Client = new TcpClient (); Buffer receiverBuffer = new Buffer(10000); SenderBuffer = new Buffer(100); Parse = new Parser (this, receiverBuffer); Rec = new Receiver (Client, receiverBuffer); Send = new Sender (Client, SenderBuffer); SenderBuffer.AddLine ("get:ents"); SenderBuffer.AddLine ("get:me"); SenderBuffer.AddLine ("get:map"); } public void SetSelfId (int id) { this.SelfId = id; Players[SelfId].LocationChanged += OnPlayerMoved; } public IEnumerable GetDragons () { return Dragons.Values; } public IEnumerable GetPlayers () { return Players.Values; } public void removeDragon (Dragon dragon) { Dragons.Remove (dragon.GetId ()); } public void removePlayer (Player player) { Players.Remove (player.GetId ()); } public void clearPlayers () { Players.Clear (); } public void clearDragons () { Dragons.Clear (); } public Player getPlayer (int playerId) { try { return Players [playerId]; } catch (KeyNotFoundException e) { return null; } } public Dictionary getPlayerList() { return Players; } public Dragon getDragon (int dragonId) { return Dragons[dragonId]; } public Dictionary getDragonList() { return Dragons; } public Map getMapObject () { return Map; } public void SetDragon (Dragon dragon) { Dragons [dragon.GetId ()] = dragon; } public void SetPlayer (Player player) { Players [player.GetId ()] = player; } public void SetMap (Map map) { this.Map = map; InitializedEvent.Set(); } public ITile[,] GetMap () { if (Map == null) { return null; } return Map.GetTiles (); } public void AddChatMessage (Message message) { ChatMessages.AddLast (message); } public IEnumerable GetChatMessages () { return ChatMessages; } public void SendCommand (string command) { SenderBuffer.AddLine (command); } public void SendChatMessage (string message) { SenderBuffer.AddLine ("ask:say:" + message); } public void moveUp() { SenderBuffer.AddLine("ask:mv:up"); } public void moveDown() { SenderBuffer.AddLine("ask:mv:dwn"); } public void moveLeft() { SenderBuffer.AddLine("ask:mv:lft"); } public void moveRight() { SenderBuffer.AddLine("ask:mv:rgt"); } public void MoveTo (int x, int y) { // Hier müsste man locken Pathwalker.Stop(); LinkedList path = Pathfinder.FindPath (Players [SelfId].Coord, new Coordinate (x, y), Map); Pathwalker.SetCoords (path); MoveStep(); } public void MoveStep () { if (Pathwalker.HasMoreSteps ()) { SenderBuffer.AddLine ("ask:" + Pathwalker.NextStep ()); } } public void OnPlayerMoved (int x, int y) { MoveStep(); } public void RefreshGui () { Gui.PerformRefresh (); } private void StartThreads() { Parse.Start (); Rec.Start (); Send.Start (); } public void Stop() { Parse.Stop (); Send.Stop (); Client.Close (); } public void Initialize(){ Client.Connect ("localhost", 9999); StartThreads (); InitializedEvent.WaitOne(); initialized = true; } } }