示例#1
0
    public LocationUpdate(GameClient client, ReceivablePacket packet)
    {
        // Read data.
        float posX       = (float)packet.ReadDouble(); // TODO: Client WriteFloat
        float posY       = (float)packet.ReadDouble(); // TODO: Client WriteFloat
        float posZ       = (float)packet.ReadDouble(); // TODO: Client WriteFloat
        float heading    = (float)packet.ReadDouble(); // TODO: Client WriteFloat
        int   animState  = packet.ReadShort();
        int   waterState = packet.ReadByte();

        // Update player location.
        Player         player   = client.GetActiveChar();
        LocationHolder location = player.GetLocation();

        location.SetX(posX);
        location.SetY(posY);
        location.SetZ(posZ);
        location.SetHeading(heading);

        // Broadcast movement.
        foreach (Player nearby in WorldManager.GetVisiblePlayers(player))
        {
            nearby.ChannelSend(new MoveToLocation(player, heading, animState, waterState));
        }
    }
示例#2
0
    public AccountAuthenticationRequest(GameClient client, ReceivablePacket packet)
    {
        // Read data.
        double clientVersion = packet.ReadDouble();
        string accountName   = packet.ReadString().ToLowerInvariant();
        string passwordHash  = packet.ReadString();

        // Client version check.
        if (clientVersion != Config.CLIENT_VERSION)
        {
            client.ChannelSend(new AccountAuthenticationResult(STATUS_INCORRECT_CLIENT));
            return;
        }

        // Replace illegal characters.
        foreach (char c in Util.ILLEGAL_CHARACTERS)
        {
            accountName = accountName.Replace(c, '\'');
        }

        // Account name checks.
        if ((accountName.Length < 2) || (accountName.Length > 20) || accountName.Contains("'") || (passwordHash.Length == 0)) // 20 should not happen, checking it here in case of client cheat.
        {
            client.ChannelSend(new AccountAuthenticationResult(STATUS_NOT_FOUND));
            return;
        }

        // Get data from database.
        string storedPassword = "";
        int    status         = STATUS_NOT_FOUND;

        try
        {
            MySqlConnection con = DatabaseManager.GetConnection();
            MySqlCommand    cmd = new MySqlCommand(ACCOUNT_INFO_QUERY, con);
            cmd.Parameters.AddWithValue("account", accountName);
            MySqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                storedPassword = reader.GetString("password");
                status         = reader.GetInt32("status");
            }
            con.Close();
        }
        catch (Exception e)
        {
            LogManager.Log(e.ToString());
        }

        // In case of auto create accounts configuration.
        if ((status == 0) && Config.ACCOUNT_AUTO_CREATE)
        {
            // Create account.
            try
            {
                MySqlConnection con = DatabaseManager.GetConnection();
                MySqlCommand    cmd = new MySqlCommand(ACCOUNT_CREATE_QUERY, con);
                cmd.Parameters.AddWithValue("account", accountName);
                cmd.Parameters.AddWithValue("password", passwordHash);
                cmd.ExecuteNonQuery();
                con.Close();
            }
            catch (Exception e)
            {
                LogManager.Log(e.ToString());
            }
            LogManager.Log("Created account " + accountName + ".");
        }
        else // Account status issue.
        {
            // 0 does not exist, 1 banned, 2 requires activation, 3 wrong password, 4 too many online, 100 authenticated
            if (status < STATUS_WRONG_PASSWORD)
            {
                client.ChannelSend(new AccountAuthenticationResult(status));
                return;
            }

            // Wrong password.
            if (!passwordHash.Equals(storedPassword))
            {
                client.ChannelSend(new AccountAuthenticationResult(STATUS_WRONG_PASSWORD));
                return;
            }
        }

        // Kick existing logged client.
        GameClient existingClient = WorldManager.GetClientByAccountName(accountName);

        if (existingClient != null)
        {
            existingClient.ChannelSend(new Logout(accountName));
            client.ChannelSend(new AccountAuthenticationResult(STATUS_ALREADY_ONLINE));
            return;
        }

        // Too many online users.
        if (WorldManager.GetOnlineCount() >= Config.MAXIMUM_ONLINE_USERS)
        {
            client.ChannelSend(new AccountAuthenticationResult(STATUS_TOO_MANY_ONLINE));
            return;
        }

        // Authentication was successful.
        WorldManager.AddClient(client);
        client.SetAccountName(accountName);
        client.ChannelSend(new AccountAuthenticationResult(STATUS_AUTHENTICATED));

        // Update last login date and IP address.
        try
        {
            MySqlConnection con = DatabaseManager.GetConnection();
            MySqlCommand    cmd = new MySqlCommand(ACCOUNT_INFO_UPDATE_QUERY, con);
            cmd.Parameters.AddWithValue("last_active", DateTimeOffset.Now.ToUnixTimeSeconds());
            cmd.Parameters.AddWithValue("ip", client.GetIp());
            cmd.Parameters.AddWithValue("account", accountName);
            cmd.ExecuteNonQuery();
            con.Close();
        }
        catch (Exception e)
        {
            LogManager.Log(e.ToString());
        }
    }
示例#3
0
    public static void Handle(GameClient client, ReceivablePacket packet)
    {
        /*
         * switch (packet.ReadShort()) // Packet id.
         * {
         *  case 1:
         *      new AccountAuthenticationRequest(client, packet);
         *      break;
         *
         *  case 2:
         *      new CharacterSelectionInfoRequest(client, packet);
         *      break;
         *
         *  case 3:
         *      new CharacterCreationRequest(client, packet);
         *      break;
         *
         *  case 4:
         *      new CharacterDeletionRequest(client, packet);
         *      break;
         *
         *  case 5:
         *      new CharacterSlotUpdate(client, packet);
         *      break;
         *
         *  case 6:
         *      new CharacterSelectUpdate(client, packet);
         *      break;
         *
         *  case 7:
         *      new EnterWorldRequest(client, packet);
         *      break;
         *
         *  case 8:
         *      new ExitWorldRequest(client, packet);
         *      break;
         *
         *  case 9:
         *      new LocationUpdateRequest(client, packet);
         *      break;
         *
         *  case 10:
         *      new AnimatorUpdateRequest(client, packet);
         *      break;
         *
         *  case 11:
         *      new ObjectInfoRequest(client, packet);
         *      break;
         *
         *  case 12:
         *      new PlayerOptionsUpdate(client, packet);
         *      break;
         *
         *  case 13:
         *      new ChatRequest(client, packet);
         *      break;
         * }
         */

        // Test receive.
        LogManager.Log("" + packet.ReadByte());
        LogManager.Log("" + packet.ReadShort());
        LogManager.Log("" + packet.ReadInt());
        LogManager.Log("" + packet.ReadLong());
        LogManager.Log("" + packet.ReadFloat());
        LogManager.Log("" + packet.ReadDouble());
        LogManager.Log("" + packet.ReadString());

        // Test send.
        SendablePacket send = new SendablePacket();

        send.WriteShort(1); // id
        send.WriteString("All is good!");
        client.ChannelSend(send);
    }