public static void Handle_LeaveRoom(ClientConnection Client, PacketReader reader, byte last) { Account User = Client.CurrentAccount; if (User.CurrentRoomId != 0 && User.InGame) { byte roompos = User.RoomPos; NormalRoom normalRoom = Rooms.NormalRoomList.Find(room => room.ID == User.CurrentRoomId); bool isRemoved = true; if (normalRoom.Players.Count == 1) { if (normalRoom.ItemNum != -1) { User.Connection.SendAsync(new GameRoom_LockKeepItem(User, normalRoom, true, last));//解鎖之前保管了的物品 } Rooms.NormalRoomList.Remove(normalRoom); } else { //加回位置id normalRoom.Players.Remove(User); normalRoom.PosList.Add(roompos); isRemoved = false; } byte RoomMasterIndex = normalRoom.RoomMasterIndex; User.InGame = false; User.CurrentRoomId = 0; User.EndLoading = false; User.RoomPos = 0; Client.SendAsync(new GameRoom_LeaveRoomUser_0XA9(User, roompos, last)); Client.SendAsync(new GameRoom_Hex(User, "FFA80500000000", last)); //Client.SendAsync(new GameRoom_Hex(User, "FF6405F703000002000000", last)); if (!isRemoved) { foreach (Account RoomPlayer in normalRoom.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_RemoveRoomUser(RoomPlayer, roompos, last)); } if (roompos == RoomMasterIndex) { if (normalRoom.ItemNum != -1) { User.Connection.SendAsync(new GameRoom_LockKeepItem(User, normalRoom, true, last));//解鎖之前保管了的物品 normalRoom.RegisterItem(-1, -1, 0, 0, false); foreach (Account RoomPlayer in normalRoom.Players) { //RoomPlayer.Connection.SendAsync(new GameRoom_RegisterSuccess(User, -1, -1, last)); RoomPlayer.Connection.SendAsync(new GameRoom_GoodsInfo(User, normalRoom, last)); } } Account newRoomMaster = normalRoom.Players.FirstOrDefault(); normalRoom.RoomMasterIndex = newRoomMaster.RoomPos; foreach (Account RoomPlayer in normalRoom.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_GetRoomMaster(RoomPlayer, newRoomMaster.RoomPos, last)); } } bool isAllSync = normalRoom.Players.All(player => player.EndLoading); if (isAllSync) { foreach (Account RoomPlayer in normalRoom.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_Hex(RoomPlayer, "FF1203", last)); } } } } }
private static byte[] GenResult(NormalRoom room, byte last) { if (room.Players.Exists(p => p.GameEndType == 0 && p.Attribute != 3)) { foreach (Account player in room.Players.Where(p => p.GameEndType == 0 && p.Attribute != 3).OrderBy(o => o.RaceDistance)) { long CurrentTime = Utility.CurrentTimeMilliseconds(); player.LapTime = (int)(CurrentTime + 200000 - room.StartTime); player.ServerLapTime = player.LapTime; player.Rank = 99;//99 = TIME OVER, 98 = GAME OVER Calc_DropItem(player, room, player.Rank, last); //await Task.Run(() => Calc_DropItem(player, room, player.Rank, last)); } } PacketWriter ns = new PacketWriter(); ns = PacketWriter.CreateInstance(16, true); ns.Write((byte)0xFF); ns.Write((short)0x381); ns.Write((byte)room.RoomKindID); ns.Fill(0xB); int playercount = room.Players.Count(p => p.Attribute != 3); ns.Write((byte)playercount); //count? ns.Fill(0x6); foreach (var p in room.Players.Where(p => p.Attribute != 3) .Join(room.DropItem, p => p.UserNum, d => d.UserNum, (p, d) => new { player = p, droplist = d }) .OrderBy(o => o.droplist.Rank).ThenByDescending(o => o.player.RaceDistance).ThenBy(o => o.player.RoomPos)) { ns.Write(p.player.ServerLapTime); ns.Write(p.player.LapTime); ns.Write(p.droplist.Rank); ns.Write(p.player.RoomPos); ns.Write(p.droplist.EXP); ns.Write(0); ns.Write(p.droplist.TR); ns.Write(0); ns.Fill(0xC); ns.Write(p.droplist.BounsEXP); ns.Write(p.droplist.BounsTR); int bounsweight = 0; if (p.droplist.BounsTR > 0) { bounsweight += 4; } if (p.droplist.BounsEXP > 0) { bounsweight += 8; } ns.Write(bounsweight); // 0C 00 00 00 ns.Write(playercount); //02 00 00 00 player count? int count = p.droplist.CardID.Count; ns.Write(count); //card count foreach (var card in p.droplist.CardID) { ns.Write(card); } ns.WriteHex("00BA8B19000000000000000000000000000000000000000000C5B01B000000000000"); } bool hasgavegoods = SendRegisterGoods(room, out byte[] getgoodsnickname, last); if (hasgavegoods) { Account roomMaster = room.Players.Find(p => p.RoomPos == room.RoomMasterIndex); roomMaster.Connection.SendAsync(new GameRoom_DeleteKeepItem(roomMaster, room, last)); } ns.Write((short)0); ns.Write(2); ns.Write(0x3EA); ns.Write(!hasgavegoods ? 0x11 : 0x11 + getgoodsnickname.Length); ns.Write(room.ItemNum); if (!hasgavegoods) { ns.Write(-1L); ns.Write((byte)0); ns.Write(1); } else { ns.Write(0x3b1c32); //32 1C 3B 00 ns.Write(2); ns.Write(getgoodsnickname, 0, getgoodsnickname.Length); //B5 A3 B8 DC B6 5D A4 48 ns.Write((byte)0); ns.Write(getgoodsnickname.Length + 1); } ns.Write(0x3F6); ns.Write(4); ns.Write(0); //ns.WriteHex("000002000000EA03000011000000FFFFFFFFFFFFFFFFFFFFFFFF0001000000F60300000400000000000000"); ns.Write(last); byte[] ret = ns.ToArray(); PacketWriter.ReleaseInstance(ns); ns = null; //Console.WriteLine("Result packet: " + Utility.ByteArrayToString(ret)); return(ret); }
public static void EnterRoom(ClientConnection Client, NormalRoom room, string pw, byte last) { Account User = Client.CurrentAccount; int MaxPlayer; if (room.is8Player) { MaxPlayer = room.SlotCount; } else { MaxPlayer = room.MaxPlayersCount; } if (room.isPlaying) { Client.SendAsync(new GameRoom_EnterRoomError(User, 5, (byte)room.RoomKindID, last)); return; } if (room.Players.Count(p => p.Attribute != 3) < MaxPlayer || User.Attribute == 3) { //room.Players.Add(User); // User.IsRoomMaster = false; if (room.Players.Exists(p => p.Attribute == 3) && User.Attribute == 3) { Client.SendAsync(new GameRoom_EnterRoomError(User, 9, (byte)room.RoomKindID, last)); return; } if (room.Password != pw && User.Attribute == 0) { Client.SendAsync(new GameRoom_EnterRoomError(User, 7, (byte)room.RoomKindID, last)); return; } DateTime kickedtime; if (room.KickedList.TryGetValue(User, out kickedtime)) { bool cantenter = DateTime.Compare(DateTime.Now, kickedtime.AddSeconds(60)) < 0; if (cantenter) { Client.SendAsync(new GameRoom_EnterRoomError(User, 6, (byte)room.RoomKindID, last)); return; } room.KickedList.Remove(User); } User.InGame = true; User.CurrentRoomId = room.ID; User.IsReady = false; //取得當前第一個位置id User.RoomPos = (byte)(User.Attribute == 3 ? 100 : room.PosList.FirstOrDefault()); //Console.WriteLine("User.RoomPos: "+ User.RoomPos); room.PosList.Remove(User.RoomPos); //Client.SendAsync(new GameRoom_RegisterSuccess(User, room.ItemNum, room.Storage_Id, last)); Client.SendAsync(new GameRoom_GoodsInfo(User, room, last)); Client.SendAsync(new GameRoom_SendRoomInfo(User, room, last, User.RoomPos)); //Send自己info俾其他roomuser foreach (Account roomUser in room.Players) { roomUser.Connection.SendAsync(new GameRoom_SendPlayerInfo(User, last)); if (room.IsTeamPlay == 2) { User.Team = 1; roomUser.Connection.SendAsync(new GameRoom_RoomPosTeam(User, last)); } } room.Players.Add(User); //Send roomuser info俾自己 foreach (Account roomUser in room.Players) { Client.SendAsync(new GameRoom_SendPlayerInfo(roomUser, last)); Client.SendAsync(new GameRoom_RoomPosReady(roomUser, roomUser.RoomPos, roomUser.IsReady, last)); if (room.IsTeamPlay == 2) { Client.SendAsync(new GameRoom_RoomPosTeam(roomUser, last)); } if (User.Attribute == 3) { room.setRoomMasterIndex(100); byte africapos = room.RoomMasterIndex; //room.Players.Find(player => player.IsRoomMaster).RoomPos; roomUser.Connection.SendAsync(new GameRoom_GetRoomMaster(roomUser, africapos, last)); } } if (User.Attribute != 3) { byte roommasterpos = room.RoomMasterIndex; //room.Players.Find(player => player.IsRoomMaster).RoomPos; Client.SendAsync(new GameRoom_GetRoomMaster(User, roommasterpos, last)); } } else { Client.SendAsync(new GameRoom_EnterRoomError(User, 1, (byte)room.RoomKindID, last)); } }
public static int Calc_EXP(Account User, NormalRoom room, byte rank, out short BounsEXP) { int PlayerCount = room.Players.Count(p => p.Attribute != 3); //room.Players.FindAll(p => p.Attribute != 3).Count; int initexp = (int)Math.Round(12 * PlayerCount * (float)(1 - (((decimal)rank / 10) - (decimal)0.1)), MidpointRounding.AwayFromZero); int exptotal = 0; float exppercent = 0; float expnormal = 0; Random rnd = new Random(); foreach (var a in User.WearAvatarItemAttr.Where(w => w.Attr == 2 || w.Attr == 38 || w.Attr == 52)) { switch (a.Attr) { case 2: exppercent += a.AttrValue; break; case 38: expnormal += a.AttrValue; break; case 52: expnormal += rnd.Next(Convert.ToInt32(a.AttrValue)); break; default: break; } } //avon if (User.costumeMode == 1) { foreach (var a in User.WearCosAvatarItemAttr.Where(w => w.Attr == 2 || w.Attr == 38 || w.Attr == 52)) { switch (a.Attr) { case 2: exppercent += a.AttrValue; break; case 38: expnormal += a.AttrValue; break; case 52: expnormal += rnd.Next(Convert.ToInt32(a.AttrValue)); break; default: break; } } } if (User.AvatarItems.Any(i => i.itemdescnum == 47635)) //優越童話通行証BUFF { exppercent += (float)1.5; } //exptotal = initexp + (initexp * exppercent) + expnormal; exptotal = (int)Math.Round(initexp + (initexp * exppercent) + expnormal, MidpointRounding.AwayFromZero); BounsEXP = (short)(exptotal - initexp); return(exptotal); }
public static int Calc_TR(Account User, NormalRoom room, byte rank, out short BounsTR) { int PlayerCount = room.Players.Count(p => p.Attribute != 3); //room.Players.FindAll(p => p.Attribute != 3).Count; //float inittr = 12 * PlayerCount * ((110 - (rank * 10)) / 100); int inittr = (int)Math.Round(12 * PlayerCount * (float)(1 - (((decimal)rank / 10) - (decimal)0.1)), MidpointRounding.AwayFromZero); int trtotal = 0; float trpercent = 0; float trnormal = 0; Random rnd = new Random(); foreach (var a in User.WearAvatarItemAttr.Where(w => w.Attr == 1 || w.Attr == 37 || w.Attr == 51)) { switch (a.Attr) { case 1: trpercent += a.AttrValue; break; case 37: trnormal += a.AttrValue; break; case 51: trnormal += rnd.Next(Convert.ToInt32(a.AttrValue)); break; default: break; } } //avon if (User.costumeMode == 1) { foreach (var a in User.WearCosAvatarItemAttr.Where(w => w.Attr == 1 || w.Attr == 37 || w.Attr == 51)) { switch (a.Attr) { case 1: trpercent += a.AttrValue; break; case 37: trnormal += a.AttrValue; break; case 51: trnormal += rnd.Next(Convert.ToInt32(a.AttrValue)); break; default: break; } } } if (User.AvatarItems.Any(i => i.itemdescnum == 47635)) //優越童話通行証BUFF { trpercent += 1; } trtotal = (int)Math.Round((inittr + (inittr * trpercent) + trnormal), MidpointRounding.AwayFromZero); //trtotal = inittr + (inittr * trpercent) + trnormal; BounsTR = (short)(trtotal - inittr); return(trtotal); }
public static async Task Execute_GameEnd(NormalRoom room, long EndTime, byte last) { room.addMatchTime(); while (Utility.CurrentTimeMilliseconds() < EndTime) { if (room.Players.Where(p => p.Attribute != 3).All(p => p.GameEndType > 0)) { foreach (Account player in room.Players.Where(p => p.GameEndType > 2 && p.Attribute != 3) .OrderBy(o => o.GameEndType).ThenByDescending(o => o.RaceDistance)) { if (player.GameEndType == 4) { player.Rank = 98; } else { player.Rank = 99; } Calc_DropItem(player, room, player.Rank, last); //await Task.Run(() => Calc_DropItem(player, room, player.Rank, last)); } break; } await Task.Delay(500); } ; await Task.Delay(4000); room.Result = GenResult(room, last); room.RegisterItem(-1, -1, 2, 0x1049F00C, true); try { foreach (Account RoomPlayer in room.Players) //更新自己EXP { RoomPlayer.Connection.SendAsync(new GameRoom_GameUpdateEXP(RoomPlayer, last)); } foreach (Account RoomPlayer in room.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_GameResult2(RoomPlayer, room.Result)); RoomPlayer.Connection.SendAsync(new GameRoom_Hex(RoomPlayer, "FF0102", last)); foreach (Account Player in room.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_RoomPosReady(RoomPlayer, Player.RoomPos, false, last)); } RoomPlayer.Connection.SendAsync(new GameRoom_GoodsInfo(RoomPlayer, room, last)); } foreach (Account RoomPlayer in room.Players) { //RoomPlayer.Connection.SendAsync(new GameRoom_Hex(RoomPlayer, "FF2D02000000000000000000000000000800000000000000000000", last)); //FF2D02A3220000C4C11400CB110000DB0800000E0C00001E0F0000 RoomPlayer.Connection.SendAsync(new GameRoom_UpdateIndividualGameRecord(RoomPlayer, last)); } await Task.Delay(6000); foreach (Account RoomPlayer in room.Players) { //MoveToGameRoom RoomPlayer.Connection.SendAsync(new GameRoom_Hex(RoomPlayer, "FF9503", last)); //9704 } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } //reset room.Rank = 1; room.Result = null; room.DropItem.Clear(); room.isPlaying = false; foreach (Account RoomPlayer in room.Players) { RoomPlayer.IsReady = false; RoomPlayer.EndLoading = false; RoomPlayer.GameEndType = 0; } }
public static void DisconnectRoom(Account User) { if (User.CurrentRoomId != 0 && User.InGame) { byte roompos = User.RoomPos; NormalRoom normalRoom = Rooms.NormalRoomList.Find(room => room.ID == User.CurrentRoomId); bool isRemoved = true; if (normalRoom.Players.Count == 1) { if (normalRoom.ItemNum != -1) { User.Connection.SendAsync(new GameRoom_LockKeepItem(User, normalRoom, true, 0x1));//解鎖之前保管了的物品 } Rooms.NormalRoomList.Remove(normalRoom); } else { //加回位置id normalRoom.Players.Remove(User); normalRoom.PosList.Add(roompos); isRemoved = false; if (normalRoom.isPlaying) { normalRoom.Survival -= 1; if (normalRoom.Survival == 1 && normalRoom.RuleType == 2) //生存mode { byte alivepos = normalRoom.Players.Find(f => f.GameEndType == 0 && f.Attribute != 3).RoomPos; foreach (Account RoomPlayer in normalRoom.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_alive(RoomPlayer, alivepos, 0x01)); } } else if (normalRoom.Survival == 0 && normalRoom.RuleType == 3) //Hardcore { long EndTime = Utility.CurrentTimeMilliseconds() + 2000; Task.Run(() => Execute_GameEnd(normalRoom, EndTime, 0x1)); } } } byte RoomMasterIndex = normalRoom.RoomMasterIndex; if (!isRemoved) { foreach (Account RoomPlayer in normalRoom.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_RemoveRoomUser(RoomPlayer, roompos, 0x1)); } if (User.RoomPos == RoomMasterIndex) { if (normalRoom.ItemNum != -1) { User.Connection.SendAsync(new GameRoom_LockKeepItem(User, normalRoom, true, 0x1));//解鎖之前保管了的物品 normalRoom.RegisterItem(-1, -1, 0, 0, false); foreach (Account RoomPlayer in normalRoom.Players) { //RoomPlayer.Connection.SendAsync(new GameRoom_RegisterSuccess(User, -1, -1, 0x1)); RoomPlayer.Connection.SendAsync(new GameRoom_GoodsInfo(User, normalRoom, 0x1)); } } Account newRoomMaster = normalRoom.Players.FirstOrDefault(); normalRoom.RoomMasterIndex = newRoomMaster.RoomPos; foreach (Account RoomPlayer in normalRoom.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_GetRoomMaster(RoomPlayer, newRoomMaster.RoomPos, 0x1)); } } } } }
public SendFarmInfo(Account User, NormalRoom room, int farmindex, byte last) { int FarmTypeNum = 0, TotalVisitedCount = 0, TodaysVisitorCount = 0, farmExp = 0; string FarmName = "", MasterName = "", Password = ""; long ExpireDateTime = 0, CreateDateTime = 0; using (var con = new MySqlConnection(Conf.Connstr)) { con.Open(); var cmd = new MySqlCommand(string.Empty, con); cmd.Parameters.Clear(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "usp_Farm_GetFarmInfo"; cmd.Parameters.Add("pFarmUniqueNum", MySqlDbType.Int32).Value = farmindex; MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow); if (reader.HasRows) { reader.Read(); FarmTypeNum = Convert.ToInt32(reader["FarmTypeNum"]); FarmName = reader["FarmName"].ToString(); MasterName = reader["MasterName"].ToString(); ExpireDateTime = Convert.IsDBNull(reader["ExpireDateTime"]) ? 0x68BB6671178CB : Utility.ConvertToTimestamp(Convert.ToDateTime(reader["ExpireDateTime"])); CreateDateTime = Convert.IsDBNull(reader["CreateDateTime"]) ? 0x68BB6671178CB : Utility.ConvertToTimestamp(Convert.ToDateTime(reader["CreateDateTime"])); Password = reader["Password"].ToString(); TotalVisitedCount = Convert.ToInt32(reader["TotalVisitedCount"]); TodaysVisitorCount = Convert.ToInt32(reader["TodaysVisitorCount"]); farmExp = Convert.ToInt32(reader["farmExp"]); } cmd.Dispose(); reader.Close(); con.Close(); } ns.Write((byte)0xA5); ns.Write(0); ns.Write((byte)room.RoomKindID); ns.WriteBIG5Fixed_intSize(room.Name); ns.Write((byte)0x16); ns.WriteBIG5Fixed_intSize(room.Password);//password ns.Write(2); ns.Write(room.ID); ns.Write(User.RoomPos); ns.Write(room.MapNum); ns.Write(0x1E); ns.Write(room.IsTeamPlay); ns.Write(room.IsStepOn); ns.Write(room.ItemType); ns.Write(0); ns.Write(Utility.CurrentTimeMilliseconds()); ns.Write(room.PosWeight); ns.Write(farmindex); ns.Write(0); ns.Write(1); ns.Write(FarmTypeNum); ns.WriteBIG5Fixed_intSize(FarmName); ns.WriteBIG5Fixed_intSize(MasterName); //Farm Master?? ns.Write(ExpireDateTime); //farm expire date time ns.Write(CreateDateTime); //farm create date time ns.Write((short)1); ns.Write(TotalVisitedCount); //total count ns.Write(TodaysVisitorCount); //today visitor count ns.Write((byte)0); ns.Write(0x68BB6671178CB); //datetime null ns.Fill(0x10); ns.Write(last); }