public async static void Handle_GameEndInfo(ClientConnection Client, PacketReader reader, byte last) { Account User = Client.CurrentAccount; User.RaceDistance = reader.ReadLESingle(); float MapDistance = reader.ReadLESingle(); User.GameEndType = reader.ReadLEInt16(); long CurrentTime = Utility.CurrentTimeMilliseconds(); Log.Debug("Game End - Nickname: {0}, GameEndType: {1}, RaceDistance: {2}", User.NickName, User.GameEndType, User.RaceDistance); if (User.GameEndType > 1) { NormalRoom room = Rooms.NormalRoomList.Find(rm => rm.ID == User.CurrentRoomId); if (room.GameMode == 38) //小遊戲 { return; } //GameEndType 2 = alive //GameEndType 3 = timeover //GameEndType 4 = gameover if (User.GameEndType == 2) { User.LapTime = (int)(CurrentTime - room.StartTime); User.ServerLapTime = User.LapTime; User.Rank = room.Rank++; Task calctask = Task.Run(() => GameRoomEvent.Calc_DropItem(User, room, User.Rank, last)); long EndTime = Utility.CurrentTimeMilliseconds() + 2000; await Task.Run(() => GameRoomEvent.Execute_GameEnd(room, EndTime, last)); } else if (User.GameEndType == 3) { User.LapTime = (int)(CurrentTime + 200000 - room.StartTime); User.ServerLapTime = User.LapTime; } else if (User.GameEndType == 4) { User.LapTime = (int)(CurrentTime + 240000 - room.StartTime); User.ServerLapTime = User.LapTime; room.Survival -= 1; byte mypos = User.RoomPos; foreach (Account RoomPlayer in room.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_GameOver(RoomPlayer, mypos, last)); if (room.Survival == 1 && room.RuleType == 2) //生存mode { byte alivepos = room.Players.Find(f => f.GameEndType == 0 && f.Attribute != 3).RoomPos; RoomPlayer.Connection.SendAsync(new GameRoom_alive(RoomPlayer, alivepos, last)); } } if (room.Survival == 0 && room.RuleType == 3) //Hardcore { long EndTime = Utility.CurrentTimeMilliseconds() + 2000; await Task.Run(() => GameRoomEvent.Execute_GameEnd(room, EndTime, last)); } } } }
public async static void Handle_GoalInData(ClientConnection Client, PacketReader reader, byte last) { Account User = Client.CurrentAccount; NormalRoom room = Rooms.NormalRoomList.Find(rm => rm.ID == User.CurrentRoomId); if (room.GameMode == 38) //小遊戲 { return; } //FF C0 02 FF 52 03 User.LapTime = reader.ReadLEInt32(); //11 31 02 00 goal time User.ServerLapTime = (int)(Utility.CurrentTimeMilliseconds() - room.StartTime); reader.ReadLEUInt32(); //54 6A 02 00 //User.RaceDistance = reader.ReadLESingle(); //6F C3 DE 47 RaceDistance float 114054.867188 //00 00 00 00 flag? long EndTime = Utility.CurrentTimeMilliseconds() + 13000; User.Rank = room.Rank++; if (!room.isGoal) { MapHolder.MapInfos.TryGetValue(room.PlayingMapNum, out MapInfo mapinfo); if (mapinfo.GoalInLimitTime * 1000 < User.ServerLapTime) { Console.WriteLine("GoalIn"); foreach (Account RoomPlayer in room.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_GoalInData(User, User.LapTime, last)); RoomPlayer.Connection.SendAsync(new GameRoom_StartTimeOutCount(RoomPlayer, User.LapTime + 2000, last)); //FF 7C 03 E1 38 02 00 0A room.isGoal = true; } //await Task.Run(() => GameRoomEvent.Execute_GameEnd(room, EndTime, last)); Task calctask = Task.Run(() => GameRoomEvent.Calc_DropItem(User, room, User.Rank, last)); await Task.Run(() => GameRoomEvent.Execute_GameEnd(room, EndTime, last)); } else { Console.WriteLine("GoalInError"); Client.SendAsync(new GameRoom_GoalInError(User, last)); } } else { foreach (Account RoomPlayer in room.Players) { RoomPlayer.Connection.SendAsync(new GameRoom_GoalInData(User, User.LapTime, last)); } //GameRoomEvent.Calc_DropItem(User, room, User.Rank, last); Task calctask = Task.Run(() => GameRoomEvent.Calc_DropItem(User, room, User.Rank, last)); } }
public static void GameMode_FootStep_GoalIn(ClientConnection Client, PacketReader reader, byte last) { //FF C0 02 FF 4E 03 BA 52 02 00 01 01 Console.WriteLine("FootStep_GoalIn"); Account User = Client.CurrentAccount; if (User.GameEndType == 0) { NormalRoom room = Rooms.GetRoom(User.CurrentRoomId); int laptime = reader.ReadLEInt32(); byte unk = reader.ReadByte();//flag? User.LapTime = laptime; User.ServerLapTime = room.GetCurrentTime(); //User.Rank = room.Rank++; if (!room.isGoal) { room.isGoal = true; if (room.RuleType == 8) { foreach (Account RoomPlayer in room.Players) { RoomPlayer.Connection.SendAsync(new FootStep_GoalIn(User.RoomPos, 1, last)); RoomPlayer.Connection.SendAsync(new Amsan_LapTimeControl(room.GetCurrentTime(), 10000, 0, false, last)); RoomPlayer.LastLapTime = User.ServerLapTime; RoomPlayer.CurrentLapTime = 10000; } Client.SendAsync(new GameRoom_GoalInData(User.RoomPos, User.LapTime, 1, last)); } else { foreach (Account RoomPlayer in room.Players) { RoomPlayer.Connection.SendAsync(new FootStep_GoalIn_CountDown(laptime, 10000, last)); RoomPlayer.Connection.SendAsync(new FootStep_GoalIn(User.RoomPos, 1, last)); RoomPlayer.Connection.SendAsync(new GameRoom_GoalInData(User.RoomPos, User.LapTime, 1, last)); RoomPlayer.Connection.SendAsync(new GameRoom_StartTimeOutCount(User.LapTime + 2000, last)); } } long EndTime = Utility.CurrentTimeMilliseconds() + 15000; Task.Run(() => GameRoomEvent.Execute_GameEnd(room, EndTime, last)); //Task.Run(() => GameRoomEvent.Calc_DropItem(User, room, User.Rank, last)); } else { if (room.RuleType == 8) { foreach (Account RoomPlayer in room.Players) { RoomPlayer.Connection.SendAsync(new FootStep_GoalIn(User.RoomPos, 1, last)); } Client.SendAsync(new GameRoom_GoalInData(User.RoomPos, User.LapTime, 1, last)); } else { foreach (Account RoomPlayer in room.Players) { RoomPlayer.Connection.SendAsync(new FootStep_GoalIn(User.RoomPos, 1, last)); RoomPlayer.Connection.SendAsync(new GameRoom_GoalInData(User.RoomPos, User.LapTime, 1, last)); } } //Task.Run(() => GameRoomEvent.Calc_DropItem(User, room, User.Rank, last)); } } }