コード例 #1
0
ファイル: Connection.cs プロジェクト: mizzouse/FreeInfantry
        /// <summary>
        /// Handles the servers's state packet
        /// </summary>
        static public void Handle_SC_State(SC_State pkt, Client client)
        {               //Consider the connection started now, time to send our login info..
            Database db = ((client as Client <Database>)._obj);

            db._syncStart.Set();

            //Prepare our login packet
            CS_Auth <Database> auth = new CS_Auth <Database>();

            auth.zoneID          = db._config["zoneid"].intValue;
            auth.password        = db._config["password"].Value;
            auth.zoneName        = db._server._config["server/zoneName"].Value;
            auth.zoneDescription = db._server._config["server/zoneDescription"].Value;
            auth.zoneIsAdvanced  = db._server._config["server/zoneIsAdvanced"].boolValue;
            auth.zoneIP          = db._server._config["server/bindIP"].Value;
            auth.zonePort        = db._server._config["server/bindPort"].intValue;

            client.sendReliable(auth);
        }
コード例 #2
0
        /// <summary>
        /// Creates a new packet based on the typeID and the received content
        /// inside the buffer. The user has to create an own implementation
        /// of this interface.
        /// </summary>
        public PacketBase createPacket(NetworkClient client, ushort typeID, byte[] buffer, int offset, int size)
        {               //Ready our packet base
            PacketBase packet = null;

            size--;

            //Was it a system packet?
            if (buffer[offset++] == 0)
            {
                //Yes, find the appropriate type
                return(createSystemPacket(typeID, buffer, offset, size));
            }

            //So what was the typeid?
            switch (typeID)
            {
            case CS_Auth <T> .TypeID:
                packet = new CS_Auth <T>(typeID, buffer, offset, size);
                break;

            case CS_PlayerLogin <T> .TypeID:
                packet = new CS_PlayerLogin <T>(typeID, buffer, offset, size);
                break;

            case CS_PlayerUpdate <T> .TypeID:
                packet = new CS_PlayerUpdate <T>(typeID, buffer, offset, size);
                break;

            case CS_PlayerLeave <T> .TypeID:
                packet = new CS_PlayerLeave <T>(typeID, buffer, offset, size);
                break;

            case CS_PlayerBanner <T> .TypeID:
                packet = new CS_PlayerBanner <T>(typeID, buffer, offset, size);
                break;

            case CS_PlayerStatsRequest <T> .TypeID:
                packet = new CS_PlayerStatsRequest <T>(typeID, buffer, offset, size);
                break;

            case CS_Whisper <T> .TypeID:
                packet = new CS_Whisper <T>(typeID, buffer, offset, size);
                break;

            case CS_JoinChat <T> .TypeID:
                packet = new CS_JoinChat <T>(typeID, buffer, offset, size);
                break;

            case CS_LeaveChat <T> .TypeID:
                packet = new CS_LeaveChat <T>(typeID, buffer, offset, size);
                break;

            case CS_PrivateChat <T> .TypeID:
                packet = new CS_PrivateChat <T>(typeID, buffer, offset, size);
                break;

            case CS_ModCommand <T> .TypeID:
                packet = new CS_ModCommand <T>(typeID, buffer, offset, size);
                break;

            case CS_Squads <T> .TypeID:
                packet = new CS_Squads <T>(typeID, buffer, offset, size);
                break;

            case CS_ChatQuery <T> .TypeID:
                packet = new CS_ChatQuery <T>(typeID, buffer, offset, size);
                break;

            case Disconnect <T> .TypeID:
                packet = new Disconnect <T>(typeID, buffer, offset, size);
                break;

            case CS_Ban <T> .TypeID:
                packet = new CS_Ban <T>(typeID, buffer, offset, size);
                break;

            case CS_SquadMatch <T> .TypeID:
                packet = new CS_SquadMatch <T>(typeID, buffer, offset, size);
                break;

            case CS_ModQuery <T> .TypeID:
                packet = new CS_ModQuery <T>(typeID, buffer, offset, size);
                break;

            case CS_ChatCommand <T> .TypeID:
                packet = new CS_ChatCommand <T>(typeID, buffer, offset, size);
                break;

            case CS_StatsUpdate <T> .TypeID:
                packet = new CS_StatsUpdate <T>(typeID, buffer, offset, size);
                break;

            case CS_ArenaUpdate <T> .TypeID:
                packet = new CS_ArenaUpdate <T>(typeID, buffer, offset, size);
                break;

            default:
                //An undefined packet.
                packet = new PacketDummy(typeID, buffer, offset, size);
                break;
            }

            return(packet);
        }
コード例 #3
0
ファイル: Login.cs プロジェクト: mizzouse/FreeInfantry
        /// <summary>
        /// Handles the zone login request packet
        /// </summary>
        static public void Handle_CS_Auth(CS_Auth <Zone> pkt, Client <Zone> client)
        {               //Note the login request
            Log.write(TLog.Normal, "Login request from ({0}): {1} / {2}", client._ipe, pkt.zoneID, pkt.password);

            //Attempt to find the associated zone
            DBServer server = client._handler as DBServer;

            Data.DB.zone dbZone;

            using (InfantryDataContext db = server.getContext())
                dbZone = db.zones.SingleOrDefault(z => z.id == pkt.zoneID);

            //Does the zone exist?
            if (dbZone == null)
            {                   //Reply with failure
                SC_Auth <Zone> reply = new SC_Auth <Zone>();

                reply.result  = SC_Auth <Zone> .LoginResult.Failure;
                reply.message = "Invalid zone.";
                client.sendReliable(reply);
                return;
            }

            //Are the passwords a match?
            if (dbZone.password != pkt.password)
            {                   //Oh dear.
                SC_Auth <Zone> reply = new SC_Auth <Zone>();
                reply.result = SC_Auth <Zone> .LoginResult.BadCredentials;
                client.sendReliable(reply);
                return;
            }

            //Great! Escalate our client object to a zone
            Zone zone = new Zone(client, server, dbZone);

            client._obj = zone;

            server._zones.Add(zone);

            //Called on connection close / timeout
            zone._client.Destruct += delegate(NetworkClient nc)
            {
                zone.destroy();
            };

            //Success!
            SC_Auth <Zone> success = new SC_Auth <Zone>();

            success.result  = SC_Auth <Zone> .LoginResult.Success;
            success.message = dbZone.notice;

            client.sendReliable(success);

            using (InfantryDataContext db = zone._server.getContext())
            {
                //Update and activate the zone for our directory server
                //TODO: Don't know why it only works like this,
                //modifying dbZone and submitting changes doesn't reflect
                //in the database right away
                Data.DB.zone zoneentry = db.zones.SingleOrDefault(z => z.id == pkt.zoneID);
                zoneentry.name        = pkt.zoneName;
                zoneentry.description = pkt.zoneDescription;
                zoneentry.ip          = pkt.zoneIP;
                zoneentry.port        = pkt.zonePort;
                zoneentry.advanced    = Convert.ToInt16(pkt.zoneIsAdvanced);
                zoneentry.active      = 1;
                db.SubmitChanges();
            }
            Log.write("Successful login from {0} ({1})", dbZone.name, client._ipe);
        }