Пример #1
0
        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();
        }
Пример #2
0
        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...");
        }
Пример #3
0
 void send_packet(game_client c, packet p)
 {
     send_packet(c.addr, p);
 }