Example #1
0
    // UI INTERACTION ================

    public void LoginPressed()
    {
        Text usernameEntered = loginPanel.transform.Find("UsernameField/EnteredText").gameObject.GetComponent <Text>();
        Text passwordEntered = loginPanel.transform.Find("PasswordField/EnteredText").gameObject.GetComponent <Text>();
        Text loginResult     = loginPanel.transform.Find("LoginButton/ResultText").gameObject.GetComponent <Text>();

        // Print button press info to console
        Debug.Log("Called: LoginPressed"
                  + "\nUsername: "******"\nPassword: "******"Username doesn't exist";
        }
        else if (myPhpResponse._userAccounts.Count > 1)
        {
            // Multiple usernames exist, so indicate database error
            loginResult.enabled = true;
            loginResult.text    = "Database error";
        }
        else if ((myPhpResponse._userAccounts[0]._username != usernameEntered.text) ||
                 (myPhpResponse._userAccounts[0]._password != passwordEntered.text))
        {
            // Password doesn't match, so indicate result
            loginResult.enabled = true;
            loginResult.text    = "Username and password don't match";
        }
        else
        {
            // Password does match, so save active user and load next scene
            loginResult.enabled = true;
            loginResult.text    = "Username and password match";

            GameManager gameManager = GameObject.Find("GameManager").GetComponent <GameManager>();
            gameManager.activeUser = usernameEntered.text;

            string name = "StoryScene";
            Debug.Log("Level load requested for: " + name);
            SceneManager.LoadScene(name);
        }
    }
Example #2
0
        public static void ReadCallback(IAsyncResult ar)
        {
            String content = String.Empty;

            // Retrieve the state object and the handler socket
            // from the asynchronous state object.
            StateObject   state        = (StateObject)ar.AsyncState;
            Socket        handler      = state.workSocket;
            List <Player> toDelete     = new List <Player>(); //important so we don't have a "collection modified" error
            Player        thisPlayer   = players.Where(x => x.socket == handler).SingleOrDefault();
            bool          isGameServer = gameServers.Contains(handler);

            string PhpResponse;
            int    bytesRead;

            if (handler.Connected)
            {
                // Read data from the client socket.

                try
                {
                    bytesRead = handler.EndReceive(ar);

                    if (bytesRead > 0)
                    {
                        //Transform the array of bytes received from the user into an
                        //intelligent form of object Data
                        Data   msgReceived = new Data(state.buffer);
                        byte[] message;
                        Player targetPlayer;
                        Data   msgToSend = new Data();
                        msgToSend.cmdCommand = msgReceived.cmdCommand;
                        if (thisPlayer != null)
                        {
                            msgToSend.strName = thisPlayer.name;
                        }
                        msgToSend.strMessage = msgReceived.strMessage;

                        switch (msgReceived.cmdCommand)
                        {
                        case Command.Login:
                            Console.WriteLine("logged in: " + msgReceived.strName);

                            if (msgReceived.strName == "i am a game server") //you can change this to some password or check the server ip here
                            {
                                gameServers.Add(handler);
                                Console.WriteLine("added a game server");

                                SendGroupUpdate(); //TD: send this update only to the new server
                            }
                            else
                            {
                                Player newPlayer = new Player(handler);
                                newPlayer.name = msgReceived.strName;

                                if (CharacterIds.ContainsKey(newPlayer.name))
                                {
                                    newPlayer.id = CharacterIds[newPlayer.name];
                                }

                                if (CharacterClans.ContainsKey(newPlayer.id))
                                {
                                    newPlayer.clan = CharacterClans[newPlayer.id];
                                }
                                if (clanLeaders.Contains(newPlayer.id))
                                {
                                    newPlayer.isClanLeader = true;
                                }


                                players.RemoveAll(x => x.name == newPlayer.name);
                                players.Add(newPlayer);

                                foreach (var group in groups)
                                {
                                    for (int i = 0; i < group.players.Count; i++)
                                    {
                                        if (group.players[i].name == newPlayer.name)
                                        {
                                            group.players[i] = newPlayer;
                                            newPlayer.group  = group;
                                        }
                                    }
                                }

                                if (pendingKicks.ContainsKey(newPlayer.name)) //cancel automatic kick
                                {
                                    pendingKicks[newPlayer.name].Stop();
                                    pendingKicks.Remove(newPlayer.name);
                                }

                                Console.WriteLine("added a player");
                            }

                            break;

                        case Command.Message:

                            if (thisPlayer == null)
                            {
                                break;
                            }

                            Console.WriteLine(thisPlayer.name + ": " + msgReceived.strMessage);

                            message = msgToSend.ToBytes();

                            foreach (Player player in players)
                            {
                                try
                                {
                                    player.socket.Send(message);
                                }
                                catch (SocketException socketException)
                                {
                                    //WSAECONNRESET, the other side closed impolitely
                                    if (socketException.ErrorCode == 10054 ||
                                        ((socketException.ErrorCode != 10004) &&
                                         (socketException.ErrorCode != 10053)))
                                    {
                                        Console.WriteLine("receiver disconnected");
                                    }
                                    else
                                    {
                                        Console.WriteLine(socketException.Message);
                                    }

                                    toDelete.Add(player);
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine(e.Message + "\n" + e.StackTrace);
                                    toDelete.Add(player);
                                }
                            }

                            break;

                        case Command.PrivateMessage:

                            if (thisPlayer == null)
                            {
                                break;
                            }

                            Console.WriteLine(thisPlayer.name + " whispers to " + msgReceived.strName + ": " + msgReceived.strMessage);

                            targetPlayer = players.Where(x => String.Compare(x.name, msgReceived.strName, true) == 0).SingleOrDefault(); //case insensitive

                            if (targetPlayer != null)
                            {
                                message = msgToSend.ToBytes();

                                targetPlayer.socket.Send(message);

                                //send the message to the sender so it appears in the log:

                                thisPlayer.socket.Send(message);
                            }

                            break;

                        case Command.GroupMessage:

                            if (thisPlayer == null || thisPlayer.group == null)
                            {
                                break;
                            }

                            Console.WriteLine("[GROUP] " + thisPlayer.name + ": " + msgReceived.strMessage);
                            message = msgToSend.ToBytes();

                            foreach (Player groupMember in thisPlayer.group.players)
                            {
                                groupMember.socket.Send(message);
                            }

                            break;

                        case Command.ClanMessage:

                            if (thisPlayer == null || thisPlayer.clan == 0)
                            {
                                break;
                            }

                            Console.WriteLine("[CLAN] " + thisPlayer.name + ": " + msgReceived.strMessage);

                            message = msgToSend.ToBytes();

                            foreach (Player clanMember in players.Where(x => x.clan == thisPlayer.clan))
                            {
                                clanMember.socket.Send(message);
                            }

                            break;

                        case Command.GroupInvite:
                            if (thisPlayer == null)
                            {
                                break;
                            }
                            if (thisPlayer.group != null && thisPlayer.group.leader != thisPlayer)
                            {
                                break;                                                                    //if the inviting player is not the group's leader
                            }
                            if (thisPlayer.group != null && thisPlayer.group.players.Count >= maxGroupSize)
                            {
                                break;                                                                             //check max group size
                            }
                            //find the player that we want to invite
                            targetPlayer = players.Where(x => x.name == msgReceived.strName).SingleOrDefault();
                            if (targetPlayer == null || targetPlayer == thisPlayer)
                            {
                                break;
                            }

                            if (targetPlayer.group == null) //if the player is not already in a group
                            {
                                if (targetPlayer.pendingInvite != null)
                                {
                                    break;                                     //check if there's a pending invite
                                }
                                targetPlayer.pendingInvite        = thisPlayer;
                                targetPlayer.hasPendingClanInvite = false;

                                System.Timers.Timer myTimer = new System.Timers.Timer();
                                myTimer.Elapsed += (sender, args) => ClearPendingInvite(sender, targetPlayer);
                                myTimer.Interval = 20000; // 1000 ms is one second
                                myTimer.Start();

                                clearPendingInvites.Add(targetPlayer, myTimer);

                                message = msgToSend.ToBytes();

                                targetPlayer.socket.Send(message);
                            }

                            break;

                        case Command.AcceptInvite:
                            if (thisPlayer == null)
                            {
                                break;
                            }
                            Player invitingPlayer = thisPlayer.pendingInvite;
                            if (invitingPlayer == null || invitingPlayer.clan == 0)
                            {
                                break;
                            }

                            if (thisPlayer.hasPendingClanInvite) //clan
                            {
                                ClearInviteBeforeTick(thisPlayer);

                                if (thisPlayer.clan != 0)
                                {
                                    break;
                                }

                                PhpResponse = SendPhpRequest("mmo_clan_add_character",
                                                             "{\"character_name\":\"" + thisPlayer.name + "\"," +
                                                             "\"clan_id\":\"" + invitingPlayer.clan + "\"}"
                                                             );

                                if (PhpResponse.Contains("OK"))
                                {
                                    UpdateClans();
                                }
                            }
                            else  //group
                            {
                                ClearInviteBeforeTick(thisPlayer);

                                if (thisPlayer.group != null)
                                {
                                    break;
                                }

                                bool joinedGroup = false;

                                if (invitingPlayer.group == null) //create a new group
                                {
                                    Group newGroup = new Group(invitingPlayer, thisPlayer);

                                    joinedGroup = true;

                                    groups.Add(newGroup);
                                }
                                else if (invitingPlayer.group.players.Count < maxGroupSize) //add the new player to the existing group
                                {
                                    invitingPlayer.group.players.Add(thisPlayer);
                                    thisPlayer.group = invitingPlayer.group;
                                    joinedGroup      = true;
                                }

                                if (joinedGroup)
                                {
                                    SendGroupUpdate();
                                }
                            }

                            break;

                        case Command.ClanCreate:

                            if (thisPlayer == null)
                            {
                                break;
                            }

                            PhpResponse = SendPhpRequest("mmo_clan_create",
                                                         "{\"character_name\":\"" + thisPlayer.name + "\"," +
                                                         "\"clan_name\":\"" + msgReceived.strName + "\"}"
                                                         );

                            if (PhpResponse.Contains("OK"))
                            {
                                UpdateClans();
                            }

                            break;

                        case Command.ClanInvite:

                            if (thisPlayer == null || thisPlayer.clan == 0 || !thisPlayer.isClanLeader)
                            {
                                break;                                                                         //check that the player is the clan leader
                            }
                            //find the player that we want to invite
                            targetPlayer = players.Where(x => x.name == msgReceived.strName).SingleOrDefault();
                            if (targetPlayer == null || targetPlayer == thisPlayer)
                            {
                                break;
                            }

                            if (targetPlayer.clan == 0) //if the player is not already in a clan
                            {
                                if (targetPlayer.pendingInvite != null)
                                {
                                    break;                                     //check if there's a pending invite
                                }
                                targetPlayer.pendingInvite        = thisPlayer;
                                targetPlayer.hasPendingClanInvite = true;

                                System.Timers.Timer myTimer = new System.Timers.Timer();
                                myTimer.Elapsed += (sender, args) => ClearPendingInvite(sender, targetPlayer);
                                myTimer.Interval = 20000; // 1000 ms is one second
                                myTimer.Start();

                                clearPendingInvites.Add(targetPlayer, myTimer);
                                msgToSend.strMessage = ClanNames[thisPlayer.clan];
                                Console.WriteLine("clan: " + msgToSend.strMessage);
                                message = msgToSend.ToBytes();

                                targetPlayer.socket.Send(message); //forward the ClanInvite message to the target player
                            }

                            break;

                        case Command.ClanDisband:
                            if (thisPlayer == null || thisPlayer.clan == 0 || !thisPlayer.isClanLeader)
                            {
                                break;
                            }

                            PhpResponse = SendPhpRequest("mmo_clan_disband",
                                                         "{\"character_id\":\"" + thisPlayer.id + "\"}"
                                                         );

                            if (PhpResponse.Contains("OK"))
                            {
                                UpdateClans();
                            }

                            break;

                        case Command.ClanLeave:
                            if (thisPlayer == null || thisPlayer.clan == 0 || thisPlayer.isClanLeader)
                            {
                                break;                                                                        //for now, the leader can't leave the clan
                            }
                            PhpResponse = SendPhpRequest("mmo_clan_remove_character",
                                                         "{\"character_id\":\"" + thisPlayer.id + "\"}"
                                                         );

                            if (PhpResponse.Contains("OK"))
                            {
                                UpdateClans();
                            }

                            break;

                        case Command.ClanKick:
                            if (thisPlayer == null || thisPlayer.clan == 0 || !thisPlayer.isClanLeader)
                            {
                                break;
                            }

                            //find the player that we want to invite
                            targetPlayer = players.Where(x => x.name == msgReceived.strName).SingleOrDefault();

                            if (thisPlayer.clan != targetPlayer.clan)
                            {
                                break;
                            }

                            PhpResponse = SendPhpRequest("mmo_clan_remove_character",
                                                         "{\"character_id\":\"" + targetPlayer.id + "\"}"
                                                         );

                            if (PhpResponse.Contains("OK"))
                            {
                                UpdateClans();
                            }

                            break;

                        case Command.DeclineInvite:
                            if (thisPlayer == null)
                            {
                                break;
                            }
                            Player invitPlayer = thisPlayer.pendingInvite;
                            message = msgToSend.ToBytes();
                            invitPlayer.socket.Send(message);
                            ClearInviteBeforeTick(thisPlayer);

                            break;

                        case Command.GroupLeave:
                            if (thisPlayer == null)
                            {
                                break;
                            }

                            RemoveFromGroup(thisPlayer);

                            break;

                        case Command.GroupKick:
                            if (!isGameServer && (thisPlayer == null || thisPlayer.group == null || thisPlayer.group.leader != thisPlayer))
                            {
                                break;
                            }

                            //find the player that we want to kick
                            targetPlayer = players.Where(x => x.name == msgReceived.strName).SingleOrDefault();

                            if (targetPlayer == null || (!isGameServer && (targetPlayer.group != thisPlayer.group)))
                            {
                                break;
                            }

                            Console.WriteLine("received kick command: " + targetPlayer.name);

                            if (isGameServer) //kick issued by server (because of disconnect), kick after a delay of X seconds
                            {
                                if (!pendingKicks.ContainsKey(targetPlayer.name))
                                {
                                    System.Timers.Timer myTimer = new System.Timers.Timer();
                                    myTimer.Elapsed += (sender, args) => KickAfterDelay(sender, targetPlayer);
                                    myTimer.Interval = 30000; // 1000 ms is one second
                                    myTimer.Start();

                                    pendingKicks.Add(targetPlayer.name, myTimer);
                                }
                            }
                            else
                            {
                                RemoveFromGroup(targetPlayer); //kick issued by group leader, kick immediately

                                //notify the player that they were kicked from the group:
                                message = msgToSend.ToBytes();
                                targetPlayer.socket.Send(message);
                            }

                            break;
                        }

                        // listen again:
                        state.sb.Clear();
                        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                                             new AsyncCallback(ReadCallback), state);
                    }
                }
                catch (SocketException socketException)
                {
                    //WSAECONNRESET, the other side closed impolitely
                    if (socketException.ErrorCode == 10054 ||
                        ((socketException.ErrorCode != 10004) &&
                         (socketException.ErrorCode != 10053)))
                    {
                        Console.WriteLine("remote client disconnected");
                    }
                    else
                    {
                        Console.WriteLine(socketException.Message);
                    }
                    toDelete.Add(thisPlayer);
                    handler = null;
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message + "\n" + e.StackTrace);
                    toDelete.Add(thisPlayer);
                }
            }

            foreach (var playerToDelete in toDelete)
            {
                if (playerToDelete != null)
                {
                    RemoveFromGroup(playerToDelete);
                }

                players.RemoveAll(x => x == playerToDelete);
            }
        }
Example #3
0
    public void RegisterPressed()
    {
        Text usernameEntered = registerPanel.transform.Find("UsernameField/EnteredText").gameObject.GetComponent <Text>();
        Text passwordEntered = registerPanel.transform.Find("PasswordField/EnteredText").gameObject.GetComponent <Text>();
        Text emailEntered    = registerPanel.transform.Find("EmailField/EnteredText").gameObject.GetComponent <Text>();
        Text registerResult  = registerPanel.transform.Find("RegisterButton/ResultText").gameObject.GetComponent <Text>();

        // Print button press info to console
        Debug.Log("Called: RegisterPressed"
                  + "\nUsername: "******"\nPassword: "******"\nEmail: " + emailEntered.text);

        PhpResponse myPhpResponse = ShowUserAccount(usernameEntered.text);

        if (myPhpResponse._userAccounts.Count == 1)
        {
            // Username exists, so indicate result
            registerResult.enabled = true;
            registerResult.text    = "Username already exists";
        }
        else if (myPhpResponse._userAccounts.Count > 1)
        {
            // Multiple usernames exist, so indicate database error
            registerResult.enabled = true;
            registerResult.text    = "Database error";
        }
        else
        {
            // Username doesn't exist, so try to register and confirm after
            myPhpResponse = RegisterUserAccount(usernameEntered.text, passwordEntered.text, emailEntered.text);
            myPhpResponse = ShowUserAccount(usernameEntered.text);
            if (myPhpResponse._userAccounts.Count == 0)
            {
                // Username doesn't exist, so indicate database error
                // so, indicate failure :(
                registerResult.enabled = true;
                registerResult.text    = "Database error";
            }
            else if (myPhpResponse._userAccounts.Count > 1)
            {
                // Multiple usernames exist, so indicate database error
                registerResult.enabled = true;
                registerResult.text    = "Database error";
            }
            else if ((myPhpResponse._userAccounts[0]._username != usernameEntered.text) ||
                     (myPhpResponse._userAccounts[0]._password != passwordEntered.text))
            {
                // Password doesn't match, so indicate database error
                registerResult.enabled = true;
                registerResult.text    = "Database error";
            }
            else
            {
                // Password does match, so save active user and load next scene
                registerResult.enabled = true;
                registerResult.text    = "Username and password match";

                GameManager gameManager = GameObject.Find("GameManager").GetComponent <GameManager>();
                gameManager.activeUser = usernameEntered.text;

                string name = "StoryScene";
                Debug.Log("Level load requested for: " + name);
                SceneManager.LoadScene(name);
            }
        }
    }