public static void Handle_RegisterItem(ClientConnection Client, PacketReader reader, byte last) { Account User = Client.CurrentAccount; NormalRoom room = Rooms.NormalRoomList.Find(rm => rm.ID == User.CurrentRoomId); //FF C0 02 FF 56 05 CB A3 00 00 7E 41 09 00 00 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 04 int itemnum = reader.ReadLEInt32(); long storage_id = reader.ReadLEInt64(); int unk = reader.ReadLEInt32();//01 00 00 00 int isOrderBy = reader.ReadLEInt32(); int sendcount = reader.ReadLEInt32(); bool isPublic = reader.ReadBoolean(); if (room.ItemNum != -1) { User.Connection.SendAsync(new GameRoom_LockKeepItem(User, room, true, last));//解鎖之前保管了的物品 } if (CheckRegisterItem(User.UserNum, storage_id)) { room.RegisterItem(itemnum, storage_id, isOrderBy, sendcount, isPublic); foreach (Account RoomPlayer in room.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_RegisterSuccess(RoomPlayer, itemnum, storage_id, last)); RoomPlayer.Connection.SendAsync(new GameRoom_GoodsInfo(RoomPlayer, room, last)); } //FF 57 05 03 00 00 00 80 <- Register too many times if (itemnum != -1) { User.Connection.SendAsync(new GameRoom_LockKeepItem(User, room, false, last));//鎖定保管物品 } } }
public static async Task TimeoutLoading(NormalRoom room, int matchtime) { await Task.Delay(60000); if (matchtime == room.MatchTime) { bool isAllSync = room.Players.All(player => player.EndLoading); if (!isAllSync && room.isPlaying) { Account[] Users = room.Players.FindAll(player => !player.EndLoading).ToArray(); foreach (Account KickedPlayer in Users) { KickPlayer(KickedPlayer, room, 0x1); byte RoomMasterIndex = room.RoomMasterIndex; if (KickedPlayer.RoomPos == RoomMasterIndex) { if (room.ItemNum != -1) { KickedPlayer.Connection.SendAsync(new GameRoom_LockKeepItem(KickedPlayer, room, true, 0x1));//解鎖之前保管了的物品 room.RegisterItem(-1, -1, 0, 0, false); } Account newRoomMaster = room.Players.FirstOrDefault(); room.RoomMasterIndex = newRoomMaster.RoomPos; foreach (Account RoomPlayer in room.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_GetRoomMaster(RoomPlayer, newRoomMaster.RoomPos, 0x1)); } } } if (room.Players.Count == 0) { Rooms.NormalRoomList.Remove(room); } else { foreach (Account RoomPlayer in room.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_Hex(RoomPlayer, "FF1203", 0x1)); } } } } }
public static void GameMode_MiniGame_RoundThread(long RoundTime, NormalRoom room) { while (Utility.CurrentTimeMilliseconds() < RoundTime) { if (room.Survival == 0) //next round { break; } //wait all gameover or time } int point = 100 + 50 * room.Round; if (room.PlayingMapNum != 40006) { room.Players.Where(w => w.Attribute != 3 && !w.GameOver) .Join(room.DropItem, p => p.UserNum, d => d.UserNum, (p, d) => new { p, d }) .ToList().ForEach(f => f.d.MiniGamePoint += point); } int isnextround = 1; foreach (Account RoomPlayer in room.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_MiniGame_RoundTime(RoomPlayer, room.Round, isnextround, 1, 0x1)); RoomPlayer.Connection.SendAsync(new GameRoom_MiniGame_UpdatePoint(room, 0x1)); } int nextround = room.Round + 1; int maxround = room.PlayingMapNum == 40003 ? 1 : 3; if (nextround == maxround) //endgame { int laptime = 100; foreach (var p in room.Players.Where(p => p.Attribute != 3) .Join(room.DropItem, p => p.UserNum, d => d.UserNum, (p, d) => new { p, d }) .OrderByDescending(o => o.d.MiniGamePoint).ThenBy(o => o.p.RoomPos)) { if (p.d.MiniGamePoint > 0) { p.d.Rank = room.Rank++; int mylabtime = laptime++; p.p.ServerLapTime = mylabtime; p.p.LapTime = mylabtime; p.d.MiniGameStarPoint = (int)Math.Round(p.d.MiniGamePoint / 4.5, MidpointRounding.AwayFromZero); UpdateUserPoint(p.p.UserNum, 2400, p.d.MiniGameStarPoint); } else { p.d.Rank = 98; p.p.ServerLapTime = 100000; p.p.LapTime = 100000; } } room.Result = GenResult_ForMiniGameMode(room, 0x1); room.RegisterItem(-1, -1, 2, 0x1049F00C, true); foreach (Account RoomPlayer in room.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_GameUpdateEXP(RoomPlayer, 0x1)); } foreach (Account RoomPlayer in room.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_GameResult2(RoomPlayer, room.Result)); RoomPlayer.Connection.SendAsync(new GameRoom_Hex("FF0102", 0x1)); foreach (Account Player in room.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_RoomPosReady(Player.RoomPos, false, 0x1)); } RoomPlayer.Connection.SendAsync(new GameRoom_GoodsInfo(room, 0x1)); } foreach (Account RoomPlayer in room.Players) { //FF2D02A3220000C4C11400CB110000DB0800000E0C00001E0F0000 RoomPlayer.Connection.SendAsync(new GameRoom_UpdateIndividualGameRecord(RoomPlayer, 0x1)); } Thread.Sleep(5000); foreach (Account RoomPlayer in room.Players) { //MoveToGameRoom RoomPlayer.Connection.SendAsync(new MoveToGameRoom(0x1)); //9704 } room.GameEndSetNewRoomMaster(); room.addMatchTime(); room.StartAutoChangeRoomMaster(); //reset room.GameEndReset(); } }
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)); } } } } }
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)); } } } } }