From a677aed268fc333fa4b41864ed8fd2d8a6e572c7 Mon Sep 17 00:00:00 2001 From: GittyMac Date: Sat, 30 Jul 2022 00:01:41 -0400 Subject: [PATCH] Further work on multiplayer and plugin 5. --- A1Emu/A1_FKPlugins/A1_System.cs | 440 +++++++++++++++++++++++++++----- 1 file changed, 376 insertions(+), 64 deletions(-) diff --git a/A1Emu/A1_FKPlugins/A1_System.cs b/A1Emu/A1_FKPlugins/A1_System.cs index ddf1708..a9501c9 100644 --- a/A1Emu/A1_FKPlugins/A1_System.cs +++ b/A1Emu/A1_FKPlugins/A1_System.cs @@ -110,6 +110,9 @@ class A1_System : TcpSession case "u_inv": responses.Add(InvitePlayer(commandInfo[1], commandInfo[2], commandInfo[3], commandInfo[4], commandInfo[5], commandInfo[6])); break; + case "u_inr": + responses.Add(InviteBuddyResponse(commandInfo[1], commandInfo[2], commandInfo[3], commandInfo[4], commandInfo[5], commandInfo[6])); + break; // ---------------------------- Plugin 5 (Soccer) --------------------------- \\ case "cm": @@ -170,6 +173,10 @@ class A1_System : TcpSession responses.Add(MessageOpponent(commandInfo[1], commandInfo[2], routingString[1])); break; + case "pa": + responses.Add(PlayAgain(commandInfo[1], routingString[1])); + break; + default: responses.Add(@""); break; @@ -1212,7 +1219,7 @@ class A1_System : TcpSession conB.Close(); } - var sql = "INSERT INTO mp_5(username, userID, challenge, challenger, challengerInfo, ready) VALUES(@u, @uID, @c, @cf, @ci, @r)"; + var sql = "INSERT INTO mp_5(username, userID, challenge, challenger, challengerInfo, ready, score) VALUES(@u, @uID, @c, @cf, @ci, 0, 0)"; conB.Open(); using (var cmd = new MySqlCommand(sql, conB)) { @@ -1221,7 +1228,6 @@ class A1_System : TcpSession cmd.Parameters.AddWithValue("@c", 1); cmd.Parameters.AddWithValue("@cf", f); cmd.Parameters.AddWithValue("@ci", av + "|0"); - cmd.Parameters.AddWithValue("@r", 0); cmd.Prepare(); cmd.ExecuteNonQuery(); @@ -1245,6 +1251,60 @@ class A1_System : TcpSession return ""; } + string InviteBuddyResponse(string gid, string bid, string p, string a, string t, string f) + { + var responseStream = new MemoryStream(); + XmlWriterSettings settings = new XmlWriterSettings(); + settings.OmitXmlDeclaration = true; + settings.ConformanceLevel = ConformanceLevel.Fragment; + settings.Encoding = Encoding.ASCII; + using (XmlWriter writer = XmlWriter.Create(responseStream, settings)) + { + writer.WriteStartElement("u_inr"); + + writer.WriteAttributeString("r", "0"); + writer.WriteAttributeString("f", f); + writer.WriteAttributeString("t", t); + writer.WriteAttributeString("a", a); + writer.WriteAttributeString("p", p); + + writer.WriteEndElement(); + writer.Flush(); + writer.Close(); + } + + string conID = ""; + + var conB = new MySqlConnection(sqServer); + string sqlB = "SELECT * FROM user WHERE uID=@userID"; + MySqlCommand sqCommandB = new MySqlCommand(sqlB, conB); + sqCommandB.Parameters.AddWithValue("@userID", f); + conB.Open(); + using (MySqlDataReader sqReader = sqCommandB.ExecuteReader()) + { + while (sqReader.Read()) + { + if (Convert.ToInt32(sqReader["isOnline"].ToString()) == 1) + { + conID = sqReader["connectionID"].ToString(); + } + } + + conB.Close(); + } + + a1_Sender.SendToUser(this.Server, conID, System.Text.ASCIIEncoding.ASCII.GetString(responseStream.ToArray())); + + string sql1 = "DELETE FROM mp_5 WHERE userID=@userID"; + MySqlCommand sqCommand1 = new MySqlCommand(sql1, conB); + sqCommand1.Parameters.AddWithValue("@userID", a1_User.userID); + conB.Open(); + sqCommand1.ExecuteNonQuery(); + conB.Close(); + + return ""; + } + // -------------------------------------------------------------------------- \\ // Plugin 2 - Chat \\ // -------------------------------------------------------------------------- \\ @@ -1385,7 +1445,7 @@ class A1_System : TcpSession if(!exists || challenger == 0) { - var sql1 = "INSERT INTO mp_5(username, userID, challenge, connectionID, ready) VALUES(@u, @uID, @c, @cID, @r)"; + var sql1 = "INSERT INTO mp_5(username, userID, challenge, connectionID, playerInfo, ready, score) VALUES(@u, @uID, @c, @cID, @pi, 0, 0)"; con.Open(); using (var cmd = new MySqlCommand(sql1, con)) { @@ -1393,7 +1453,7 @@ class A1_System : TcpSession cmd.Parameters.AddWithValue("@uID", a1_User.userID); cmd.Parameters.AddWithValue("@c", c); cmd.Parameters.AddWithValue("@cID", this.Id); - cmd.Parameters.AddWithValue("@r", 0); + cmd.Parameters.AddWithValue("@pi", pr); cmd.Prepare(); @@ -1403,7 +1463,123 @@ class A1_System : TcpSession con.Close(); } - if(challenge == 1) + if(c == "0" && challenger != 1) + { + string opponentName = ""; + string opponentInfo = ""; + int i = 0; + while(i < 10) + { + string sqlC = "SELECT * FROM mp_5 WHERE userID!=@userID AND challenge=0"; + MySqlCommand sqCommandC = new MySqlCommand(sqlC, con); + sqCommandC.Parameters.AddWithValue("@userID", a1_User.userID.ToString()); + con.Open(); + using (MySqlDataReader sqReader = sqCommandC.ExecuteReader()) + { + + while (sqReader.Read()) + { + opponentUID = int.Parse(sqReader["userID"].ToString()); + opponentConID = sqReader["connectionID"].ToString(); + opponentName = sqReader["username"].ToString(); + opponentInfo = sqReader["playerInfo"].ToString(); + } + + con.Close(); + } + if(opponentConID == "") + { + System.Threading.Thread.Sleep(1000); + i += 1; + }else {i = 10;} + } + + if(opponentConID != "") + { + string sql1 = "UPDATE mp_5 SET challenge = 1 WHERE userID=@userID"; + MySqlCommand sqCommand1 = new MySqlCommand(sql1, con); + sqCommand1.Parameters.AddWithValue("@userID", a1_User.userID); + MySqlCommand sqCommand2 = new MySqlCommand(sql1, con); + sqCommand2.Parameters.AddWithValue("@userID", opponentUID); + con.Open(); + sqCommand1.ExecuteNonQuery(); + sqCommand2.ExecuteNonQuery(); + con.Close(); + + var responseStream1 = new MemoryStream(); + using (XmlWriter writer = XmlWriter.Create(responseStream1, settings)) + { + writer.WriteStartElement("h" + plugin + "_0"); + + writer.WriteStartElement("oj"); + writer.WriteAttributeString("n", a1_User.username); + writer.WriteAttributeString("pr", pr); + writer.WriteEndElement(); + + writer.WriteEndElement(); + writer.Flush(); + writer.Close(); + } + a1_Sender.SendToUser(this.Server, opponentConID, System.Text.ASCIIEncoding.ASCII.GetString(responseStream1.ToArray())); + + var responseStream2 = new MemoryStream(); + using (XmlWriter writer = XmlWriter.Create(responseStream2, settings)) + { + writer.WriteStartElement("h" + plugin + "_0"); + + writer.WriteStartElement("jn"); + writer.WriteAttributeString("r", "0"); + writer.WriteEndElement(); + + writer.WriteStartElement("oj"); + writer.WriteAttributeString("n", opponentName); + writer.WriteAttributeString("pr", opponentInfo); + writer.WriteEndElement(); + + writer.WriteEndElement(); + writer.Flush(); + writer.Close(); + } + return System.Text.ASCIIEncoding.ASCII.GetString(responseStream2.ToArray()); + }else + { + con.Open(); + using (MySqlDataReader sqReader = sqCommand.ExecuteReader()) + { + while (sqReader.Read()) + { + try{ + challenge = int.Parse(sqReader["challenge"].ToString()); + challenger = int.Parse(sqReader["challenger"].ToString()); + }catch{exists = false;} + } + con.Close(); + } + if(challenge == 1) + { + var responseStream2 = new MemoryStream(); + using (XmlWriter writer = XmlWriter.Create(responseStream2, settings)) + { + writer.WriteStartElement("h" + plugin + "_0"); + + writer.WriteStartElement("jn"); + writer.WriteAttributeString("r", "0"); + writer.WriteEndElement(); + + writer.WriteStartElement("oj"); + writer.WriteAttributeString("n", opponentName); + writer.WriteAttributeString("pr", opponentInfo); + writer.WriteEndElement(); + + writer.WriteEndElement(); + writer.Flush(); + writer.Close(); + } + return System.Text.ASCIIEncoding.ASCII.GetString(responseStream2.ToArray()); + }else return ""; + } + + }else if(challenge == 1) { string conID = ""; string opponentName = ""; @@ -1529,78 +1705,103 @@ class A1_System : TcpSession if(plugin == "5") { - writer.WriteStartElement("oc"); - if(teamSide == 5) + if(roundCount < 10) { - if(a1_User.userID < opponentUID) + if(roundCount == 5) { - teamSide = 0; - writer.WriteAttributeString("c", "0"); - }else{ - teamSide = 1; - writer.WriteAttributeString("c", "1"); + writer.WriteStartElement("nr"); + writer.WriteEndElement(); } - }else{ - if(roundCount % 5 == 0) - { - switch(teamSide) + + if(roundCount == 0 || roundCount == 4) + { + writer.WriteStartElement("cc"); + if(teamSide == 5) { - case 0: + if(a1_User.userID < opponentUID) + { teamSide = 1; writer.WriteAttributeString("c", "1"); - break; - case 1: + }else + { teamSide = 0; writer.WriteAttributeString("c", "0"); - break; + } + }else{ + switch(teamSide) + { + case 0: + writer.WriteAttributeString("c", "1"); + break; + case 1: + writer.WriteAttributeString("c", "0"); + break; + } } - }else + writer.WriteEndElement(); + } + + if(roundCount != 5) { - switch(teamSide) + writer.WriteStartElement("nr"); + writer.WriteEndElement(); + } + + + if(roundCount == 0) + { + writer.WriteStartElement("sg"); + writer.WriteEndElement(); + } + + roundCount += 1; + Console.WriteLine(roundCount); + }else + { + int playerScore = 0; + int opponentScore = 0; + + //Get the player's score. + string sql3 = "SELECT score FROM mp_5 WHERE userID=@userID"; + MySqlCommand sqCommand3 = new MySqlCommand(sql3, con); + sqCommand3.Parameters.AddWithValue("@userID", a1_User.userID); + + string sql4 = "SELECT score FROM mp_5 WHERE userID=@userID"; + MySqlCommand sqCommand4 = new MySqlCommand(sql3, con); + sqCommand4.Parameters.AddWithValue("@userID", opponentUID); + + con.Open(); + using (MySqlDataReader sqReader = sqCommand3.ExecuteReader()) + { + while (sqReader.Read()) { - case 0: - writer.WriteAttributeString("c", "0"); - break; - case 1: - writer.WriteAttributeString("c", "1"); - break; + playerScore = int.Parse(sqReader["score"].ToString()); } } - } - writer.WriteEndElement(); - - writer.WriteStartElement("cc"); - if(teamSide == 5) - { - if(a1_User.userID < opponentUID) + using (MySqlDataReader sqReader = sqCommand4.ExecuteReader()) { - writer.WriteAttributeString("c", "1"); + while (sqReader.Read()) + { + opponentScore = int.Parse(sqReader["score"].ToString()); + } + } + con.Close(); + + writer.WriteStartElement("go"); + //The result attribute determines the coin distribution. + if(playerScore > opponentScore) + { + writer.WriteAttributeString("r", "6"); + }else if(playerScore < opponentScore) + { + writer.WriteAttributeString("r", "7"); }else { - writer.WriteAttributeString("c", "0"); - } - }else{ - switch(teamSide) - { - case 0: - writer.WriteAttributeString("c", "0"); - break; - case 1: - writer.WriteAttributeString("c", "1"); - break; + writer.WriteAttributeString("r", "8"); } + + writer.WriteEndElement(); } - writer.WriteEndElement(); - writer.WriteStartElement("nr"); - writer.WriteEndElement(); - - if(isStartingGame) - { - writer.WriteStartElement("sg"); - writer.WriteEndElement(); - } - - roundCount += 1; } writer.WriteEndElement(); @@ -1677,12 +1878,11 @@ class A1_System : TcpSession using (XmlWriter writer = XmlWriter.Create(responseStream, settings)) { writer.WriteStartElement("h" + plugin + "_0"); - writer.WriteStartElement("lv"); - writer.WriteAttributeString("r", "1"); - writer.WriteAttributeString("bid", bid); + writer.WriteStartElement("go"); + writer.WriteAttributeString("r", "5"); + writer.WriteEndElement(); - writer.WriteEndElement(); writer.WriteEndElement(); writer.Flush(); writer.Close(); @@ -1690,6 +1890,11 @@ class A1_System : TcpSession a1_Sender.SendToUser(this.Server, opponentConID, System.Text.ASCIIEncoding.ASCII.GetString(responseStream.ToArray())); + opponentConID = ""; + opponentUID = 0; + teamSide = 5; + roundCount = 0; + var con = new MySqlConnection(sqServer); string sql1 = "DELETE FROM mp_5 WHERE userID=@userID"; @@ -1702,6 +1907,30 @@ class A1_System : TcpSession return ""; } + string PlayAgain(string bid, string plugin) + { + var responseStream = new MemoryStream(); + XmlWriterSettings settings = new XmlWriterSettings(); + settings.OmitXmlDeclaration = true; + settings.ConformanceLevel = ConformanceLevel.Fragment; + settings.Encoding = Encoding.ASCII; + using (XmlWriter writer = XmlWriter.Create(responseStream, settings)) + { + writer.WriteStartElement("h" + plugin + "_0"); + + writer.WriteStartElement("pa"); + + writer.WriteEndElement(); + writer.WriteEndElement(); + writer.Flush(); + writer.Close(); + } + + a1_Sender.SendToUser(this.Server, opponentConID, System.Text.ASCIIEncoding.ASCII.GetString(responseStream.ToArray())); + + return System.Text.ASCIIEncoding.ASCII.GetString(responseStream.ToArray()); + } + // -------------------------------------------------------------------------- \\ // Plugin 5 - Soccer \\ // -------------------------------------------------------------------------- \\ @@ -1772,6 +2001,10 @@ class A1_System : TcpSession string BlockShot(string d, string lx, string m, string c, string bid) { + bool blocked = false; + int playerScore = 0; + int opponentScore = 0; + var responseStream = new MemoryStream(); XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; @@ -1794,6 +2027,67 @@ class A1_System : TcpSession writer.WriteAttributeString("bid", bid); writer.WriteEndElement(); + + switch(c) + { + //Missed (Above net) + case "0": + blocked = true; + break; + //Blocked + case "1": + blocked = true; + break; + //Missed (Beside net) + case "3": + blocked = true; + break; + } + + //Award a point to the winner of the round. + var con = new MySqlConnection(sqServer); + string sql1 = "UPDATE mp_5 SET score = score + 1 WHERE userID=@userID"; + MySqlCommand sqCommand = new MySqlCommand(sql1, con); + if(blocked) + sqCommand.Parameters.AddWithValue("@userID", a1_User.userID); + else + sqCommand.Parameters.AddWithValue("@userID", opponentUID); + + //Get the player's score. + string sql2 = "SELECT score FROM mp_5 WHERE userID=@userID"; + MySqlCommand sqCommand1 = new MySqlCommand(sql2, con); + sqCommand1.Parameters.AddWithValue("@userID", a1_User.userID); + + string sql3 = "SELECT score FROM mp_5 WHERE userID=@userID"; + MySqlCommand sqCommand2 = new MySqlCommand(sql3, con); + sqCommand2.Parameters.AddWithValue("@userID", opponentUID); + + con.Open(); + sqCommand.ExecuteNonQuery(); + using (MySqlDataReader sqReader = sqCommand1.ExecuteReader()) + { + while (sqReader.Read()) + { + playerScore = int.Parse(sqReader["score"].ToString()); + } + } + using (MySqlDataReader sqReader = sqCommand2.ExecuteReader()) + { + while (sqReader.Read()) + { + opponentScore = int.Parse(sqReader["score"].ToString()); + } + } + con.Close(); + + writer.WriteStartElement("ps"); + writer.WriteAttributeString("s", opponentScore.ToString()); + writer.WriteEndElement(); + + writer.WriteStartElement("os"); + writer.WriteAttributeString("s", playerScore.ToString()); + writer.WriteEndElement(); + writer.WriteEndElement(); writer.Flush(); writer.Close(); @@ -1801,7 +2095,25 @@ class A1_System : TcpSession a1_Sender.SendToUser(this.Server, opponentConID, System.Text.ASCIIEncoding.ASCII.GetString(responseStream.ToArray())); - return ""; + var responseStream1 = new MemoryStream(); + using (XmlWriter writer1 = XmlWriter.Create(responseStream1, settings)) + { + writer1.WriteStartElement("h5_0"); + + writer1.WriteStartElement("os"); + writer1.WriteAttributeString("s", opponentScore.ToString()); + writer1.WriteEndElement(); + + writer1.WriteStartElement("ps"); + writer1.WriteAttributeString("s", playerScore.ToString()); + writer1.WriteEndElement(); + + writer1.WriteEndElement(); + writer1.Flush(); + writer1.Close(); + } + + return System.Text.ASCIIEncoding.ASCII.GetString(responseStream1.ToArray()); } // -------------------------------------------------------------------------- \\