void update_clients(IPEndPoint from, packet p) { string key = from.ToString(); game_client gc = null; foreach (var c in clients) { if (c.key() == key) { gc = c; } } if (null == gc) { if (packet_type.connect == p.id) { string unique_id = ((packet_connect)p).name; var status = equ8.session_manager.user_status(unique_id); if (!user_is_allowed_to_play(from, unique_id, status)) { Console.WriteLine( "Client '{0}' not allowed to play (status: {1})", unique_id, status); return; } gc = new game_client(from, unique_id, random.Next(0, 80), random.Next(0, 25)); clients.Add(gc); Console.WriteLine("Client connect '{0}'", unique_id); send_positions(); } return; } switch (p.id) { case packet_type.equ8_data: var payload = ((packet_equ8_data)p).data; Console.WriteLine("EQU8 Received Data: user: '******' size: {1}", gc.unique_id(), payload.Length); equ8.session_manager.on_data_received(gc.unique_id(), payload); break; case packet_type.disconnect: remove_client(gc.key()); return; case packet_type.move: if (null != gc) { gc.move_x(((packet_move)p).speed_x); gc.move_y(((packet_move)p).speed_y); } break; case packet_type.ping: if (null != gc) { gc.ping_ok = true; } return; } send_positions(); }
public void run() { long ping_at = get_ms() + 5000; Console.TreatControlCAsInput = false; Console.CancelKeyPress += new ConsoleCancelEventHandler((object sender, ConsoleCancelEventArgs args) => { args.Cancel = true; exit = true; }); Console.WriteLine("Server waiting for clients... Ctrl-c to exit"); while (!exit) { for (int i = clients.Count - 1; i >= 0; i--) { game_client c = clients[i]; switch (equ8.session_manager.poll_event(c.name, ev)) { case equ8.equ8_event_id.send_request: { Console.WriteLine( "EQU8 Data Send Request: user: '******' size: {1}", c.name, ev.get_send_event_size()); send_packet(c, new packet_equ8_data( ev.duplicate_send_event())); } break; case equ8.equ8_event_id.status: { var action = ev.get_status_action(); if (!user_is_allowed_to_play(c.addr, c.name, action)) { Console.WriteLine("Client '{0}' kicked (action: {1})", c.name, action); remove_client(i); } } break; } } if (get_ms() >= ping_at) { for (int i = clients.Count - 1; i >= 0; i--) { game_client c = clients[i]; if (!c.ping_ok) { Console.WriteLine("Kicking client {0} (late ping reply)", c.name); remove_client(i); } else { c.ping_ok = false; } } send_to_all(new packet_ping()); ping_at = get_ms() + 5000; } Tuple <IPEndPoint, packet> data = read_network(); if (null != data) { update_clients(data.Item1, data.Item2); } } Console.WriteLine("Server is exiting..."); }
void send_packet(game_client c, packet p) { send_packet(c.addr, p); }