/************************************* 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); }
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); } } }