/************************************* Serialisation of Packets *************************************/
        /// <summary>
        /// Player Serialisation
        /// </summary>
        //public byte[] SerializeCustomPlayer(object o)
        //{
        //    Player customObject = o as Player; // casting
        //    if (customObject == null) { return null; } // no obj

        //    // start conversion to byte array
        //    byte[] store;
        //    using (var s = new MemoryStream())
        //    {
        //        using (var bw = new BinaryWriter(s))
        //        {
        //            // Write Player Data here ( call custom obj serialise as its the same )
        //            store = SerializeCustomObjects(customObject);
        //            // add to s to convert to byte array
        //            return ConCatArray(store, s.ToArray());
        //        }
        //    }
        //}

        /// <summary>
        /// Custom Objects Serialisation
        /// </summary>
        public byte[] SerializeCustomObjects(object o)
        {
            CustomObjectBase customObject = o as CustomObjectBase; // casting

            if (customObject == null)
            {
                return(null);
            }                                          // if no obj

            // conversion to byte array
            using (var s = new MemoryStream())
            {
                using (var bw = new BinaryWriter(s))
                {
                    // Target Packet
                    bw.Write(customObject.GetTargetPacket());

                    // Name
                    bw.Write(customObject.GetName());

                    // Position
                    bw.Write(customObject.GetPosition().x);
                    bw.Write(customObject.GetPosition().y);
                    bw.Write(customObject.GetPosition().z);

                    // Rotation
                    bw.Write(customObject.GetRotation().x);
                    bw.Write(customObject.GetRotation().y);
                    bw.Write(customObject.GetRotation().z);

                    // Health
                    bw.Write(customObject.GetHealth());

                    // isinGrid
                    bw.Write(customObject.GetGrid());

                    return(s.ToArray()); // this will start conversion
                }
            }
        }
        /************************************* De - Serialisation of Packets *************************************/
        /// <summary>
        /// Player Deseialisation
        /// </summary>
        //public object DeserializeCustomPlayer(byte[] bytes)
        //{
        //    Player customObject = new Player(); // create new obj
        //    if (customObject == null) { return null; }

        //    // start to construct back to custom type ( byte packets )
        //    using (var s = new MemoryStream(bytes))
        //    {
        //        using (var br = new BinaryReader(s))
        //        {
        //            // Target Packet
        //            customObject.SetTargetPacket(br.ReadString());

        //            // Name
        //            customObject.SetName(br.ReadString());

        //            // Position
        //            customObject.SetPositionX(br.ReadSingle());
        //            customObject.SetPositionY(br.ReadSingle());
        //            customObject.SetPositionZ(br.ReadSingle());

        //            // Rotation
        //            customObject.SetRotationX(br.ReadSingle());
        //            customObject.SetRotationY(br.ReadSingle());
        //            customObject.SetRotationZ(br.ReadSingle());

        //            // HEalth
        //            customObject.SetHealth(br.ReadInt32());

        //            // isinGrid
        //            customObject.SetGrid(br.ReadBoolean());
        //        }
        //    }
        //    return customObject;
        //}

        /// <summary>
        /// Custom Object Type Deserialisation
        /// </summary>
        public object DeserializeCustomObjects(byte[] bytes)
        {
            CustomObjectBase customObject = new CustomObjectBase(); // create new obj

            if (customObject == null)
            {
                return(null);
            }

            // start to construct back to custom type ( byte packets )
            using (var s = new MemoryStream(bytes))
            {
                using (var br = new BinaryReader(s))
                {
                    // Target Packet
                    customObject.SetTargetPacket(br.ReadString());

                    // Name
                    customObject.SetName(br.ReadString());

                    // Position
                    customObject.SetPositionX(br.ReadSingle());
                    customObject.SetPositionY(br.ReadSingle());
                    customObject.SetPositionZ(br.ReadSingle());

                    // Rotation
                    customObject.SetRotationX(br.ReadSingle());
                    customObject.SetRotationY(br.ReadSingle());
                    customObject.SetRotationZ(br.ReadSingle());

                    // HEalth
                    customObject.SetHealth(br.ReadInt32());

                    // isinGrid
                    customObject.SetGrid(br.ReadBoolean());
                }
            }
            return(customObject);
        }
Exemple #3
0
        public override void OnRaiseEvent(IRaiseEventCallInfo info)
        {
            try
            {
                base.OnRaiseEvent(info);
            }
            catch (Exception e)
            {
                this.PluginHost.BroadcastErrorInfoEvent(e.ToString(), info);
                return;
            }

            // Deserialise Packet received from Client
            CustomObjectBase data = null;

            try
            {
                data = Packet_Deserialisation.GetInstance().DeserializeCustomObjects((byte[])info.Request.Data) as CustomObjectBase;
            }
            catch (Exception e)
            {
                this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                               senderActor: 0,
                                               targetGroup: 0,
                                               data: new Dictionary <byte, object>()
                {
                    { (byte)245, "Exception : " + e.ToString() }
                },
                                               evCode: (byte)99,
                                               cacheOp: 0);
            }

            #region Assignment 1
            // Successful Hook
            if (info.Request.EvCode == 1) // simple plugin test
            {
                /// Convert from string to char array
                string playerName = Encoding.Default.GetString((byte[])info.Request.Data);
                /// Query statement
                sql = "INSERT INTO users (name, date_created) VALUES ('" + playerName + "', now())";
                MySqlCommand cmd = new MySqlCommand(sql, conn);
                cmd.ExecuteNonQuery();

                /// When Clicked, increase count and annouce
                ++this.CallsCount;
                int    cnt           = this.CallsCount;
                string ReturnMessage = info.Nickname + " clicked the button. Now the count is " + cnt.ToString();
                this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                               senderActor: 0,
                                               targetGroup: 0,
                                               data: new Dictionary <byte, object>()
                {
                    { (byte)245, ReturnMessage }
                },
                                               evCode: info.Request.EvCode,
                                               cacheOp: 0);
            }
            else if (info.Request.EvCode == 2) // Login of Viking
            {
                /// Getting info from client and saving to SQL
                string playerInfo = Encoding.Default.GetString((byte[])info.Request.Data); /// Convert from string to char array
                string playerPassword = "", playerName = "";
                bool   isPassword = false;

                /// Seperate name and password
                for (int i = 0; i < playerInfo.Length; ++i)
                {
                    if (playerInfo[i] == ',')
                    {
                        isPassword = true;
                        continue;
                    }

                    /// Set name and password
                    if (!isPassword)
                    {
                        playerName += playerInfo[i];
                    }
                    else
                    {
                        playerPassword += playerInfo[i];
                    }
                }

                /// Check using playerName for existing accounts
                if (!NameExist(playerName, info.Request.EvCode))
                {
                    /// Query statement
                    sql          = "INSERT INTO users (name, password, date_created) VALUES ('" + playerName + "','" + playerPassword + "', now())";
                    ServerString = "New Account created";
                }
                else
                {
                    /// Check if the password is correct
                    if (!PasswordMatch(playerName, playerPassword))
                    {
                        sql          = "UPDATE users SET password='******' WHERE name='" + playerName + "'";
                        ServerString = "password is updated";
                    }
                    else
                    {
                        /// if username and password exists, send login is ok
                        ServerString = "Login Result = OK";
                    }
                }

                MySqlCommand cmd = new MySqlCommand(sql, conn);
                cmd.ExecuteNonQuery();

                /// send back message to server
                this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                               senderActor: 0,
                                               targetGroup: 0,
                                               data: new Dictionary <byte, object>()
                {
                    { (byte)245, ServerString }
                },
                                               evCode: info.Request.EvCode,
                                               cacheOp: 0);
            }

            else if (info.Request.EvCode == 3)                                             // Variables of Viking
            {
                string playerInfo = Encoding.Default.GetString((byte[])info.Request.Data); /// Convert from string to char array
                string playerPos = "", playerName = "";
                int    playerHealth = 0, playerScore = 0;

                string[] m_storeInfo = playerInfo.Split(',');
                playerName   = m_storeInfo[0];
                playerPos    = m_storeInfo[1];
                playerHealth = int.Parse(m_storeInfo[2]);
                playerScore  = int.Parse(m_storeInfo[3]);

                /// Check using playerName for existing accounts
                if (!NameExist(playerName, info.Request.EvCode))
                {
                    /// Query statement
                    sql = "INSERT INTO user_position (name, position, health, score) VALUES ('" + playerName + "','" + playerPos + "','" + playerHealth + "','" + playerScore + "')";
                }
                else
                {
                    sql = "UPDATE user_position SET position='" + playerPos + "', health='" + playerHealth.ToString() + "', score='" + playerScore.ToString() + "' WHERE name='" + playerName + "'";
                }

                MySqlCommand cmd = new MySqlCommand(sql, conn);
                cmd.ExecuteNonQuery();

                /// send back message to server
                this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                               senderActor: 0,
                                               targetGroup: 0,
                                               data: new Dictionary <byte, object>()
                {
                    { (byte)245, null }
                },
                                               evCode: info.Request.EvCode,
                                               cacheOp: 0);
            }

            else if (info.Request.EvCode == 4)                                             // Get position of player
            {
                string playerInfo = Encoding.Default.GetString((byte[])info.Request.Data); /// Convert from string to char array
                string playerName = playerInfo;

                if (NameExist(playerName, 3))
                {
                    /// Query statement
                    sql = "SELECT position FROM user_position WHERE name='" + playerName + "'";

                    MySqlCommand cmd      = new MySqlCommand(sql, conn);
                    object       position = cmd.ExecuteScalar();


                    /// send back message to server
                    this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                                   senderActor: 0,
                                                   targetGroup: 0,
                                                   data: new Dictionary <byte, object>()
                    {
                        { (byte)245, position }
                    },
                                                   evCode: info.Request.EvCode,
                                                   cacheOp: 0);
                }
                else
                {
                    /// send back message to server
                    this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                                   senderActor: 0,
                                                   targetGroup: 0,
                                                   data: new Dictionary <byte, object>()
                    {
                        { (byte)245, null }
                    },
                                                   evCode: info.Request.EvCode,
                                                   cacheOp: 0);
                }
            }

            else if (info.Request.EvCode == 5)                                             // get health of player
            {
                string playerInfo = Encoding.Default.GetString((byte[])info.Request.Data); /// Convert from string to char array
                string playerName = playerInfo;

                if (NameExist(playerName, 3))
                {
                    /// Query statement
                    sql = "SELECT health FROM user_position WHERE name='" + playerName + "'";

                    MySqlCommand cmd = new MySqlCommand(sql, conn);
                    object       hp  = cmd.ExecuteScalar();

                    /// send back message to server
                    this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                                   senderActor: 0,
                                                   targetGroup: 0,
                                                   data: new Dictionary <byte, object>()
                    {
                        { (byte)245, hp }
                    },
                                                   evCode: info.Request.EvCode,
                                                   cacheOp: 0);
                }
                else
                {
                    /// send back message to server
                    this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                                   senderActor: 0,
                                                   targetGroup: 0,
                                                   data: new Dictionary <byte, object>()
                    {
                        { (byte)245, null }
                    },
                                                   evCode: info.Request.EvCode,
                                                   cacheOp: 0);
                }
            }

            else if (info.Request.EvCode == 6)                                               // Add friends to vikings
            {
                string   playerInfo = Encoding.Default.GetString((byte[])info.Request.Data); /// Convert from string to char array
                string[] store      = playerInfo.Split(',');
                string   playerName = store[0];
                string   friendName = store[1];

                sql = "INSERT INTO user_friends (name, friend_name) VALUES ('" + playerName + "','" + friendName + "')";

                MySqlCommand cmd = new MySqlCommand(sql, conn);
                cmd.ExecuteNonQuery();

                /// send back message to server
                this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                               senderActor: 0,
                                               targetGroup: 0,
                                               data: new Dictionary <byte, object>()
                {
                    { (byte)245, null }
                },
                                               evCode: info.Request.EvCode,
                                               cacheOp: 0);
            }

            else if (info.Request.EvCode == 7)                                             // get score of player
            {
                string playerInfo = Encoding.Default.GetString((byte[])info.Request.Data); /// Convert from string to char array
                string playerName = playerInfo;

                if (NameExist(playerName, 3))
                {
                    /// Query statement
                    sql = "SELECT score FROM user_position WHERE name='" + playerName + "'";

                    MySqlCommand cmd   = new MySqlCommand(sql, conn);
                    object       score = cmd.ExecuteScalar();

                    /// send back message to server
                    this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                                   senderActor: 0,
                                                   targetGroup: 0,
                                                   data: new Dictionary <byte, object>()
                    {
                        { (byte)245, score }
                    },
                                                   evCode: info.Request.EvCode,
                                                   cacheOp: 0);
                }
                else
                {
                    /// send back message to server
                    this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                                   senderActor: 0,
                                                   targetGroup: 0,
                                                   data: new Dictionary <byte, object>()
                    {
                        { (byte)245, null }
                    },
                                                   evCode: info.Request.EvCode,
                                                   cacheOp: 0);
                }
            }


            else if (info.Request.EvCode == 8)                                             // Add friends to vikings
            {
                string playerInfo = Encoding.Default.GetString((byte[])info.Request.Data); /// Convert from string to char array
                string playerName = playerInfo;

                if (NameExist(playerName, 4))
                {
                    sql = "SELECT GROUP_CONCAT(friend_name) FROM user_friends WHERE name='" + playerName + "'";

                    MySqlCommand cmd      = new MySqlCommand(sql, conn);
                    object       Friends  = cmd.ExecuteScalar();
                    string       toreturn = playerName + " " + Friends.ToString();
                    /// send back message to server
                    this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                                   senderActor: 0,
                                                   targetGroup: 0,
                                                   data: new Dictionary <byte, object>()
                    {
                        { (byte)245, toreturn }
                    },
                                                   evCode: info.Request.EvCode,
                                                   cacheOp: 0);
                }
                else
                {
                    /// send back message to server
                    this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                                   senderActor: 0,
                                                   targetGroup: 0,
                                                   data: new Dictionary <byte, object>()
                    {
                        { (byte)245, null }
                    },
                                                   evCode: info.Request.EvCode,
                                                   cacheOp: 0);
                }
            }

            else if (info.Request.EvCode == 9)                                               // Add friends to vikings
            {
                string   playerInfo = Encoding.Default.GetString((byte[])info.Request.Data); /// Convert from string to char array
                string[] store      = playerInfo.Split(',');
                string   playerName = store[0];
                string   partyName  = store[1];

                sql = "INSERT INTO user_party (name, party_name) VALUES ('" + playerName + "','" + partyName + "')";

                MySqlCommand cmd = new MySqlCommand(sql, conn);
                cmd.ExecuteNonQuery();

                /// send back message to server
                this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                               senderActor: 0,
                                               targetGroup: 0,
                                               data: new Dictionary <byte, object>()
                {
                    { (byte)245, null }
                },
                                               evCode: info.Request.EvCode,
                                               cacheOp: 0);
            }

            else if (info.Request.EvCode == 10)                                            // Add friends to vikings
            {
                string playerInfo = Encoding.Default.GetString((byte[])info.Request.Data); /// Convert from string to char array
                string playerName = playerInfo;

                if (NameExist(playerName, 5))
                {
                    sql = "SELECT GROUP_CONCAT(party_name) FROM user_party WHERE name='" + playerName + "'";

                    MySqlCommand cmd      = new MySqlCommand(sql, conn);
                    object       Party    = cmd.ExecuteScalar();
                    string       toreturn = playerName + " " + Party.ToString();

                    /// send back message to server
                    this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                                   senderActor: 0,
                                                   targetGroup: 0,
                                                   data: new Dictionary <byte, object>()
                    {
                        { (byte)245, toreturn }
                    },
                                                   evCode: info.Request.EvCode,
                                                   cacheOp: 0);
                }
                else
                {
                    this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                                   senderActor: 0,
                                                   targetGroup: 0,
                                                   data: new Dictionary <byte, object>()
                    {
                        { (byte)245, null }
                    },
                                                   evCode: info.Request.EvCode,
                                                   cacheOp: 0);
                }
            }
            #endregion
            // ************************************** Assignment 2
            else if (info.Request.EvCode == 11) // when player login, client send info over and server stores them to player obj which is added to list
            {
                //CustomObjectBase addPlayer = (CustomObjectBase)Packet_Deserialisation.GetInstance().DeserializeCustomObjects((byte[])info.Request.Data); // breaks here
                if (data == null)
                {
                    this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                                   senderActor: 0,
                                                   targetGroup: 0,
                                                   evCode: (byte)99,
                                                   data: new Dictionary <byte, object>()
                    {
                        { (byte)245, "data data data is null" }
                    },
                                                   cacheOp: 0);
                    return;
                }

                // Check for duplicates when list is not empty
                if (m_playerList.Count > 0)
                {
                    foreach (Player player in m_playerList)
                    {
                        if (player.GetName() == data.GetName())
                        {
                            this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                                           senderActor: 0,
                                                           targetGroup: 0,
                                                           evCode: (byte)99,
                                                           data: new Dictionary <byte, object>()
                            {
                                { (byte)245, "Player Name already in list : "
                                  + player.GetName() }
                            },
                                                           cacheOp: 0);
                            return;
                        }
                    }
                }

                // Add to list
                m_playerList.Add(data as Player);
                //foreach(Player player in m_playerList)
                //{
                this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                               senderActor: 0,
                                               targetGroup: 0,
                                               evCode: (byte)99,
                                               data: new Dictionary <byte, object>()
                {
                    { (byte)245, "Player list: " + m_playerList.Count }
                },
                                               cacheOp: 0);
                //}
            }
            else if (info.Request.EvCode == 12) // sending enemy info so that client can spawn them
            {
                // ensure AI_Manager is running to continue
                while (AI_Manager.GetInstance() == null)
                {
                    Thread.Sleep(100);
                }

                this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                               senderActor: 0,
                                               targetGroup: 0,
                                               evCode: (byte)99,
                                               data: new Dictionary <byte, object>()
                {
                    { (byte)245, "Thread Info: " + thread.IsAlive + " / " + thread.ThreadState
                      + " / " + thread.Name }
                },
                                               cacheOp: 0);

                try
                {
                    if (AI_Manager.GetInstance().GetAIList() == null)
                    {
                        this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                                       senderActor: 0,
                                                       targetGroup: 0,
                                                       evCode: (byte)99,
                                                       data: new Dictionary <byte, object>()
                        {
                            { (byte)245, "Enemy list is null" }
                        },
                                                       cacheOp: 0);
                    }

                    // send information to client about each Enemy AI
                    foreach (EnemyAI enemy in AI_Manager.GetInstance().GetAIList())
                    {
                        enemy.SetTargetPacket(data.GetName()); // player's name
                        this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                                       senderActor: 0,
                                                       targetGroup: 0,
                                                       evCode: (byte)99,
                                                       data: new Dictionary <byte, object>()
                        {
                            { (byte)245, "Enemy target packet: " + enemy.GetTargetPacket() }
                        },
                                                       cacheOp: 0);

                        byte[] store = Packet_Serialisation.GetInstance().SerializeCustomAI((object)enemy);
                        //if (store != null)
                        //{
                        //    this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                        //            senderActor: 0,
                        //            targetGroup: 0,
                        //            evCode: 99,
                        //            data: new Dictionary<byte, object>() { { (byte)245, "this is store that is not null " + store.Length + " / " + enemy.GetName() } },
                        //            cacheOp: 0); // send to client each enemy in AI list
                        //}
                        //else
                        //{
                        //    this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                        //            senderActor: 0,
                        //            targetGroup: 0,
                        //            evCode: 99,
                        //            data: new Dictionary<byte, object>() { { (byte)245, "this is store that is null" } },
                        //            cacheOp: 0); // send to client each enemy in AI list
                        //}

                        this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                                       senderActor: 0,
                                                       targetGroup: 0,
                                                       evCode: info.Request.EvCode,
                                                       data: new Dictionary <byte, object>()
                        {
                            { (byte)245, store }
                        },
                                                       cacheOp: 0); // send to client each enemy in AI list
                    }
                }
                catch (Exception e)
                {
                    this.PluginHost.BroadcastEvent(target: ReciverGroup.All,
                                                   senderActor: 0,
                                                   targetGroup: 0,
                                                   evCode: (byte)99,
                                                   data: new Dictionary <byte, object>()
                    {
                        { (byte)245, "Exception : " + e.ToString() }
                    },
                                                   cacheOp: 0);
                }
            }
        }