private static int DeleteMoonGate(Map map, Point3D p) { Queue<Item> m_Queue = new Queue<Item>(); IPooledEnumerable eable = map.GetItemsInRange(p, 0); foreach (Item item in eable) { if (item is PublicMoongate) { int delta = item.Z - p.Z; if (delta >= -12 && delta <= 12) m_Queue.Enqueue(item); } } eable.Free(); int m_Count = m_Queue.Count; while (m_Queue.Count > 0) (m_Queue.Dequeue()).Delete(); return m_Count; }
static void Main(string[] args) { using (var context = new Context(1)) { using (Socket frontend = context.Socket(SocketType.ROUTER), backend = context.Socket(SocketType.ROUTER)) { frontend.Bind("tcp://*:5555"); // For Clients backend.Bind("tcp://*:5556"); // For Workers // Logic of LRU loop // - Poll backend always, frontend only if 1+ worker ready // - If worker replies, queue worker as ready and forward reply // to client if necessary // - If client requests, pop next worker and send request to it // Queue of available workers var workerQueue = new Queue<byte[]>(); // Handle worker activity on backend backend.PollInHandler += (socket, revents) => { var zmsg = new ZMessage(socket); // Use worker address for LRU routing workerQueue.Enqueue(zmsg.Unwrap()); // Forward message to client if it's not a READY if (!Encoding.Unicode.GetString(zmsg.Address).Equals(LRU_READY)) { zmsg.Send(frontend); } }; frontend.PollInHandler += (socket, revents) => { // Now get next client request, route to next worker // Dequeue and drop the next worker address var zmsg = new ZMessage(socket); zmsg.Wrap(workerQueue.Dequeue(), new byte[0]); zmsg.Send(backend); }; while (true) { int rc = Context.Poller(workerQueue.Count > 0 ? new List<Socket>(new Socket[] {frontend, backend}) : new List<Socket>(new Socket[] {backend})); if (rc == -1) { break; } } } } }
static void WebServerOnData(int id, ArraySegment<byte> data) { _bitBuffer.Clear(); _bitBuffer.FromArray(data.Array, data.Count); byte messageId = _bitBuffer.ReadByte(); switch (messageId) { case 1: { uint qX = _bitBuffer.ReadUInt(); uint qY = _bitBuffer.ReadUInt(); PlayerData playerData = _playerDatas[id]; playerData.qX = qX; playerData.qY = qY; // Send this position to everyone next state packet _dataToSend.Enqueue(playerData); break; } case 8: { string name = _bitBuffer.ReadString(); _playerDatas[id].name = name; _handshakenClientCount += 1; // Tell all the players this new client's name _bitBuffer.Clear(); _bitBuffer.AddByte(9); _bitBuffer.AddUShort(_playerDatas[id].id); _bitBuffer.AddString(_playerDatas[id].name); _bitBuffer.ToArray(_buffer); _webServer.SendAll(_connectedIds, new ArraySegment<byte>(_buffer, 0, 23)); break; } case 10: { ushort objectId = _bitBuffer.ReadUShort(); ushort newX = _bitBuffer.ReadUShort(); ushort newY = _bitBuffer.ReadUShort(); _movedObjects[objectId] = new Tuple<ushort, ushort>(newX, newY); break; } case 11: { short pointChange = _bitBuffer.ReadShort(); _playerDatas[id].points += pointChange; Console.WriteLine($"Got point change {id} {pointChange}"); // If points are 0 or less, give builder a point if (pointChange <= 0) { _playerDatas[_builderId].points += 1; } break; } } }
static void WebServerOnData(int id, ArraySegment <byte> data) { _bitBuffer.Clear(); _bitBuffer.FromArray(data.Array, data.Count); byte messageId = _bitBuffer.ReadByte(); switch (messageId) { case 1: { uint qX = _bitBuffer.ReadUInt(); uint qY = _bitBuffer.ReadUInt(); PlayerData playerData = _playerDatas[id]; playerData.qX = qX; playerData.qY = qY; // Send this position to everyone next state packet _dataToSend.Enqueue(playerData); break; } case 8: { string name = _bitBuffer.ReadString(); _playerDatas[id].name = name; _playerDatas[id].handshaked = true; _handshakenClientCount += 1; // Tell new client their id and the game state and everyone's name and points _bitBuffer.Clear(); _bitBuffer.AddByte(2); _bitBuffer.AddUShort((ushort)id); _bitBuffer.AddByte((byte)_currentState); _bitBuffer.AddUShort((ushort)_playerDatas.Count); foreach (var playerData in _playerDatas.Values) { _bitBuffer.AddUShort(playerData.id); _bitBuffer.AddString(playerData.name); _bitBuffer.AddShort(playerData.points); } _bitBuffer.ToArray(_buffer); _webServer.SendOne(id, new ArraySegment <byte>(_buffer, 0, 5 + _playerDatas.Count * 20)); // Tell all the players this new client's name _bitBuffer.Clear(); _bitBuffer.AddByte(9); _bitBuffer.AddUShort(_playerDatas[id].id); _bitBuffer.AddString(_playerDatas[id].name); _bitBuffer.ToArray(_buffer); _webServer.SendAll(_connectedIds, new ArraySegment <byte>(_buffer, 0, 23)); break; } case 10: { ushort objectId = _bitBuffer.ReadUShort(); ushort newX = _bitBuffer.ReadUShort(); ushort newY = _bitBuffer.ReadUShort(); _movedObjects[objectId] = new Tuple <ushort, ushort>(newX, newY); break; } case 11: { short pointChange = _bitBuffer.ReadShort(); _playerDatas[id].points += pointChange; // If points are 0 or less, give builder a point if (pointChange <= 0) { _playerDatas[_builderId].points += 1; } break; } case 12: { _bitBuffer.Clear(); _bitBuffer.AddByte(13); _bitBuffer.AddUShort((ushort)id); _bitBuffer.ToArray(_buffer); _webServer.SendAll(_connectedIds, new ArraySegment <byte>(_buffer, 0, 3)); break; } } }