示例#1
0
 public static void HandleWindowItems(IPacket _packet, MultiplayerClient client)
 {
     var packet = (WindowItemsPacket)_packet;
     if (packet.WindowID == 0)
         client.Inventory.SetSlots(packet.Items);
     else
         client.CurrentWindow.SetSlots(packet.Items);
 }
示例#2
0
 public static void HandlePositionAndLook(IPacket _packet, MultiplayerClient client)
 {
     var packet = (SetPlayerPositionPacket)_packet;
     client._Position = new Vector3(packet.X, packet.Y, packet.Z);
     client.QueuePacket(packet);
     client.LoggedIn = true;
     // TODO: Pitch and yaw
 }
示例#3
0
 public static void HandleHandshake(IPacket _packet, MultiplayerClient client)
 {
     var packet = (HandshakeResponsePacket)_packet;
     if (packet.ConnectionHash != "-")
     {
         Console.WriteLine("Online mode is not supported");
         Process.GetCurrentProcess().Kill();
     }
     // TODO: Authentication
     client.QueuePacket(new LoginRequestPacket(PacketReader.Version, client.User.Username));
 }
示例#4
0
        public static void RegisterHandlers(MultiplayerClient client)
        {
            client.RegisterPacketHandler(new HandshakeResponsePacket().ID, HandleHandshake);
            client.RegisterPacketHandler(new ChatMessagePacket().ID, HandleChatMessage);
            client.RegisterPacketHandler(new SetPlayerPositionPacket().ID, HandlePositionAndLook);
            client.RegisterPacketHandler(new LoginResponsePacket().ID, HandleLoginResponse);

            client.RegisterPacketHandler(new ChunkPreamblePacket().ID, ChunkHandler.HandleChunkPreamble);
            client.RegisterPacketHandler(new ChunkDataPacket().ID, ChunkHandler.HandleChunkData);
            client.RegisterPacketHandler(new BlockChangePacket().ID, ChunkHandler.HandleBlockChange);
        }
示例#5
0
 public static void HandleOpenWindowPacket(IPacket _packet, MultiplayerClient client)
 {
     var packet = (OpenWindowPacket)_packet;
     IWindow window = null;
     switch (packet.Type)
     {
         case 1: // Crafting bench window
             window = new CraftingBenchWindow(client.CraftingRepository, client.Inventory);
             break;
     }
     window.ID = packet.WindowID;
     client.CurrentWindow = window;
 }
        public ChatInterface(MultiplayerClient client, KeyboardComponent keyboard, FontRenderer font)
        {
            Client = client;
            Keyboard = keyboard;
            Font = font;

            Input = string.Empty;
            Messages = new List<ChatMessage>();
            DummyTexture = new Texture2D(keyboard.Game.GraphicsDevice, 1, 1);
            DummyTexture.SetData(new[] { Color.White });

            Client.ChatMessage += OnChatMessage;
            Keyboard.KeyDown += OnKeyDown;
        }
示例#7
0
        private void mouseTimerTick(MultiplayerClient client)
        {
            int curX = System.Windows.Forms.Cursor.Position.X;
            int curY = System.Windows.Forms.Cursor.Position.Y;

            if (lastX != -1)
            {
                float velX = curX - lastX;
                float velY = curY - lastY;
                client.clientPos += new Vector3(velX / 10f, 0, velY / 10f);
                client.PacketSender.UpdatePlayerLocation(client.clientPos, Quaternion.identity, Quaternion.identity, Optional <VehicleModel> .Empty(), Optional <String> .Empty());
            }
            lastX = curX;
            lastY = curY;
        }
        public void TestStartWithCountdown()
        {
            ClickButtonWhenEnabled <MultiplayerReadyButton>();
            AddUntilStep("countdown button shown", () => this.ChildrenOfType <MultiplayerCountdownButton>().SingleOrDefault()?.IsPresent == true);
            ClickButtonWhenEnabled <MultiplayerCountdownButton>();
            AddStep("click the first countdown button", () =>
            {
                var popoverButton = this.ChildrenOfType <Popover>().Single().ChildrenOfType <OsuButton>().First();
                InputManager.MoveMouseTo(popoverButton);
                InputManager.Click(MouseButton.Left);
            });

            AddStep("finish countdown", () => MultiplayerClient.SkipToEndOfCountdown());
            AddUntilStep("match started", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.WaitingForLoad);
        }
        public void TestBecomeHostWhileReady()
        {
            AddStep("add host", () =>
            {
                MultiplayerClient.AddUser(new APIUser {
                    Id = 2, Username = "******"
                });
                MultiplayerClient.TransferHost(2);
            });

            ClickButtonWhenEnabled <MultiplayerReadyButton>();
            AddStep("make user host", () => MultiplayerClient.TransferHost(MultiplayerClient.Room?.Users[0].UserID ?? 0));

            verifyGameplayStartFlow();
        }
        public void TestReadyButtonDisabledWhenNotHostAndUsersReady()
        {
            AddStep("add user and transfer host", () =>
            {
                MultiplayerClient.AddUser(new APIUser {
                    Id = PLAYER_1_ID
                });
                MultiplayerClient.TransferHost(PLAYER_1_ID);
            });

            AddStep("set user ready", () => MultiplayerClient.ChangeUserState(PLAYER_1_ID, MultiplayerUserState.Ready));

            ClickButtonWhenEnabled <MultiplayerSpectateButton>();
            assertReadyButtonEnablement(false);
        }
示例#11
0
 public static void HandleSetSlot(IPacket _packet, MultiplayerClient client)
 {
     var packet = (SetSlotPacket)_packet;
     IWindow window = null;
     if (packet.WindowID == 0)
         window = client.Inventory;
     else
         window = client.CurrentWindow;
     if (window != null)
     {
         if (packet.SlotIndex >= 0 && packet.SlotIndex < window.Length)
         {
             window[packet.SlotIndex] = new ItemStack(packet.ItemID, packet.Count, packet.Metadata);
         }
     }
 }
        public void TestToggleStateWhenNotHost()
        {
            AddStep("add second user as host", () =>
            {
                MultiplayerClient.AddUser(new APIUser {
                    Id = 2, Username = "******"
                });
                MultiplayerClient.TransferHost(2);
            });

            ClickButtonWhenEnabled <MultiplayerReadyButton>();
            AddUntilStep("user is ready", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Ready);

            ClickButtonWhenEnabled <MultiplayerReadyButton>();
            AddUntilStep("user is idle", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Idle);
        }
示例#13
0
        public void TestCountdownWhileSpectating()
        {
            AddStep("set spectating", () => MultiplayerClient.ChangeUserState(API.LocalUser.Value.OnlineID, MultiplayerUserState.Spectating));
            AddUntilStep("local user is spectating", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Spectating);

            AddAssert("countdown button is visible", () => this.ChildrenOfType <MultiplayerCountdownButton>().Single().IsPresent);
            AddAssert("countdown button enabled", () => this.ChildrenOfType <MultiplayerCountdownButton>().Single().Enabled.Value);

            AddStep("add second user", () => MultiplayerClient.AddUser(new APIUser {
                Id = 2, Username = "******"
            }));
            AddAssert("countdown button enabled", () => this.ChildrenOfType <MultiplayerCountdownButton>().Single().Enabled.Value);

            AddStep("set second user ready", () => MultiplayerClient.ChangeUserState(2, MultiplayerUserState.Ready));
            AddAssert("countdown button enabled", () => this.ChildrenOfType <MultiplayerCountdownButton>().Single().Enabled.Value);
        }
示例#14
0
        public override void Execute(MultiplayerClient client, string[] args)
        {
            Console.WriteLine("Mouse is now attached. Press any key to exit");
            Timer mouseTimer = new Timer();

            mouseTimer.Elapsed += delegate
            {
                MouseTimerTick(client);
            };
            mouseTimer.Interval = 50;
            mouseTimer.Start();
            Console.ReadKey();
            lastX = -1;
            lastY = -1;
            mouseTimer.Stop();
        }
        private void verifyGameplayStartFlow()
        {
            AddUntilStep("user is ready", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Ready);
            ClickButtonWhenEnabled <MultiplayerReadyButton>();
            AddUntilStep("user waiting for load", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.WaitingForLoad);

            AddAssert("ready button disabled", () => !button.ChildrenOfType <OsuButton>().Single().Enabled.Value);
            AddStep("transitioned to gameplay", () => readyClickOperation.Dispose());

            AddStep("finish gameplay", () =>
            {
                MultiplayerClient.ChangeUserState(MultiplayerClient.Room?.Users[0].UserID ?? 0, MultiplayerUserState.Loaded);
                MultiplayerClient.ChangeUserState(MultiplayerClient.Room?.Users[0].UserID ?? 0, MultiplayerUserState.FinishedPlay);
            });

            AddUntilStep("ready button enabled", () => button.ChildrenOfType <OsuButton>().Single().Enabled.Value);
        }
示例#16
0
        public static void RegisterHandlers(MultiplayerClient client)
        {
            client.RegisterPacketHandler(new HandshakeResponsePacket().ID, HandleHandshake);
            client.RegisterPacketHandler(new ChatMessagePacket().ID, HandleChatMessage);
            client.RegisterPacketHandler(new SetPlayerPositionPacket().ID, HandlePositionAndLook);
            client.RegisterPacketHandler(new LoginResponsePacket().ID, HandleLoginResponse);
            client.RegisterPacketHandler(new UpdateHealthPacket().ID, HandleUpdateHealth);

            client.RegisterPacketHandler(new ChunkPreamblePacket().ID, ChunkHandlers.HandleChunkPreamble);
            client.RegisterPacketHandler(new ChunkDataPacket().ID, ChunkHandlers.HandleChunkData);
            client.RegisterPacketHandler(new BlockChangePacket().ID, ChunkHandlers.HandleBlockChange);

            client.RegisterPacketHandler(new WindowItemsPacket().ID, InventoryHandlers.HandleWindowItems);
            client.RegisterPacketHandler(new SetSlotPacket().ID, InventoryHandlers.HandleSetSlot);
            client.RegisterPacketHandler(new CloseWindowPacket().ID, InventoryHandlers.HandleCloseWindowPacket);
            client.RegisterPacketHandler(new OpenWindowPacket().ID, InventoryHandlers.HandleOpenWindowPacket);
        }
示例#17
0
        private void MouseTimerTick(MultiplayerClient client)
        {
            int curX = System.Windows.Forms.Cursor.Position.X;
            int curY = System.Windows.Forms.Cursor.Position.Y;

            if (lastX != -1)
            {
                float   velX     = curX - lastX;
                float   velY     = curY - lastY;
                Vector3 velocity = new Vector3(velX / 10f, 0, velY / 10f);
                client.ClientPos += velocity;
                playerBroadcaster.UpdateLocation(client.ClientPos, velocity, Quaternion.identity, Quaternion.identity, Optional <VehicleModel> .Empty(), Optional <string> .Empty());
            }

            lastX = curX;
            lastY = curY;
        }
        public void TestManyUsers()
        {
            AddStep("add many users", () =>
            {
                for (int i = 0; i < 20; i++)
                {
                    MultiplayerClient.AddUser(new APIUser
                    {
                        Id                 = i,
                        Username           = $"User {i}",
                        RulesetsStatistics = new Dictionary <string, UserStatistics>
                        {
                            {
                                Ruleset.Value.ShortName,
                                new UserStatistics {
                                    GlobalRank = RNG.Next(1, 100000),
                                }
                            }
                        },
                        CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg",
                    });

                    MultiplayerClient.ChangeUserState(i, (MultiplayerUserState)RNG.Next(0, (int)MultiplayerUserState.Results + 1));

                    if (RNG.NextBool())
                    {
                        var beatmapState = (DownloadState)RNG.Next(0, (int)DownloadState.LocallyAvailable + 1);

                        switch (beatmapState)
                        {
                        case DownloadState.NotDownloaded:
                            MultiplayerClient.ChangeUserBeatmapAvailability(i, BeatmapAvailability.NotDownloaded());
                            break;

                        case DownloadState.Downloading:
                            MultiplayerClient.ChangeUserBeatmapAvailability(i, BeatmapAvailability.Downloading(RNG.NextSingle()));
                            break;

                        case DownloadState.Importing:
                            MultiplayerClient.ChangeUserBeatmapAvailability(i, BeatmapAvailability.Importing());
                            break;
                        }
                    }
                }
            });
        }
示例#19
0
        public void TestHostGetsPinnedToTop()
        {
            AddStep("add user", () => MultiplayerClient.AddUser(new APIUser
            {
                Id       = 3,
                Username = "******",
                CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg",
            }));

            AddStep("make second user host", () => MultiplayerClient.TransferHost(3));
            AddAssert("second user above first", () =>
            {
                var first  = this.ChildrenOfType <ParticipantPanel>().ElementAt(0);
                var second = this.ChildrenOfType <ParticipantPanel>().ElementAt(1);
                return(second.Y < first.Y);
            });
        }
示例#20
0
        public static void RegisterHandlers(MultiplayerClient client)
        {
            client.RegisterPacketHandler(new HandshakeResponsePacket().ID, HandleHandshake);
            client.RegisterPacketHandler(new ChatMessagePacket().ID, HandleChatMessage);
            client.RegisterPacketHandler(new SetPlayerPositionPacket().ID, HandlePositionAndLook);
            client.RegisterPacketHandler(new LoginResponsePacket().ID, HandleLoginResponse);
            client.RegisterPacketHandler(new UpdateHealthPacket().ID, HandleUpdateHealth);

            client.RegisterPacketHandler(new ChunkPreamblePacket().ID, ChunkHandlers.HandleChunkPreamble);
            client.RegisterPacketHandler(new ChunkDataPacket().ID, ChunkHandlers.HandleChunkData);
            client.RegisterPacketHandler(new BlockChangePacket().ID, ChunkHandlers.HandleBlockChange);

            client.RegisterPacketHandler(new WindowItemsPacket().ID, InventoryHandlers.HandleWindowItems);
            client.RegisterPacketHandler(new SetSlotPacket().ID, InventoryHandlers.HandleSetSlot);
            client.RegisterPacketHandler(new CloseWindowPacket().ID, InventoryHandlers.HandleCloseWindowPacket);
            client.RegisterPacketHandler(new OpenWindowPacket().ID, InventoryHandlers.HandleOpenWindowPacket);
        }
示例#21
0
        public override void Execute(MultiplayerClient client, string[] args)
        {
            if (args.Length < 1)
            {
                CommandManager.NotEnoughArgumentsMessage(1, Syntax);
                return;
            }

            if (args.Length >= 2)
            {
                client.PacketSender.SendChatMessage(String.Join(" ", args)); //does not support double spaces!
            }
            else
            {
                client.PacketSender.SendChatMessage(args[0]);
            }
        }
示例#22
0
        public void TestQueueTabCount()
        {
            assertQueueTabCount(1);

            addItemStep();
            assertQueueTabCount(2);

            addItemStep();
            assertQueueTabCount(3);

            AddStep("finish current item", () => MultiplayerClient.FinishCurrentItem().WaitSafely());
            assertQueueTabCount(2);

            AddStep("leave room", () => RoomManager.PartRoom());
            AddUntilStep("wait for room part", () => !RoomJoined);
            assertQueueTabCount(0);
        }
        public void TestCrownChangesStateWhenHostTransferred()
        {
            AddStep("add user", () => MultiplayerClient.AddUser(new APIUser
            {
                Id       = 3,
                Username = "******",
                CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg",
            }));

            AddUntilStep("first user crown visible", () => this.ChildrenOfType <ParticipantPanel>().ElementAt(0).ChildrenOfType <SpriteIcon>().First().Alpha == 1);
            AddUntilStep("second user crown hidden", () => this.ChildrenOfType <ParticipantPanel>().ElementAt(1).ChildrenOfType <SpriteIcon>().First().Alpha == 0);

            AddStep("make second user host", () => MultiplayerClient.TransferHost(3));

            AddUntilStep("first user crown hidden", () => this.ChildrenOfType <ParticipantPanel>().ElementAt(0).ChildrenOfType <SpriteIcon>().First().Alpha == 0);
            AddUntilStep("second user crown visible", () => this.ChildrenOfType <ParticipantPanel>().ElementAt(1).ChildrenOfType <SpriteIcon>().First().Alpha == 1);
        }
        public void TestRemoveUser()
        {
            APIUser secondUser = null;

            AddStep("add a user", () =>
            {
                MultiplayerClient.AddUser(secondUser = new APIUser
                {
                    Id       = 3,
                    Username = "******",
                    CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg",
                });
            });

            AddStep("remove host", () => MultiplayerClient.RemoveUser(API.LocalUser.Value));

            AddAssert("single panel is for second user", () => this.ChildrenOfType <ParticipantPanel>().Single().User.User == secondUser);
        }
        public void TestTaikoOnlyMod()
        {
            AddStep("add playlist item", () =>
            {
                SelectedRoom.Value.Playlist.Add(new PlaylistItem(new TestBeatmap(new TaikoRuleset().RulesetInfo).BeatmapInfo)
                {
                    RulesetID   = new TaikoRuleset().RulesetInfo.OnlineID,
                    AllowedMods = new[] { new APIMod(new TaikoModSwap()) }
                });
            });

            ClickButtonWhenEnabled <MultiplayerMatchSettingsOverlay.CreateOrUpdateButton>();

            AddUntilStep("wait for join", () => RoomJoined);

            AddStep("select swap mod", () => MultiplayerClient.ChangeUserMods(API.LocalUser.Value.OnlineID, new[] { new TaikoModSwap() }));
            AddUntilStep("participant panel has mod", () => this.ChildrenOfType <ParticipantPanel>().Any(p => p.ChildrenOfType <ModIcon>().Any(m => m.Mod is TaikoModSwap)));
        }
示例#26
0
        public void TestButtonEnableStateChanges()
        {
            IDisposable joiningRoomOperation = null;

            assertButtonEnableState(true);

            AddStep("begin joining room", () => joiningRoomOperation = OngoingOperationTracker.BeginOperation());
            assertButtonEnableState(false);

            AddStep("end joining room", () => joiningRoomOperation.Dispose());
            assertButtonEnableState(true);

            AddStep("disconnect client", () => MultiplayerClient.Disconnect());
            assertButtonEnableState(false);

            AddStep("re-connect client", () => MultiplayerClient.Connect());
            assertButtonEnableState(true);
        }
示例#27
0
 public static void HandleBlockChange(IPacket _packet, MultiplayerClient client)
 {
     var packet = (BlockChangePacket)_packet;
     var coordinates = new Coordinates3D(packet.X, packet.Y, packet.Z);
     Coordinates3D adjusted;
     IChunk chunk;
     try
     {
         adjusted = client.World.World.FindBlockPosition(coordinates, out chunk);
     }
     catch (ArgumentException)
     {
         // Relevant chunk is not loaded - ignore packet
         return;
     }
     chunk.SetBlockID(adjusted, packet.ID);
     chunk.SetMetadata(adjusted, (byte)packet.Metadata);
     client.OnChunkModified(new ChunkEventArgs(new ReadOnlyChunk(chunk)));
 }
        public void TestToggleStateWhenHost(bool allReady)
        {
            AddStep("setup", () =>
            {
                MultiplayerClient.TransferHost(MultiplayerClient.Room?.Users[0].UserID ?? 0);

                if (!allReady)
                {
                    MultiplayerClient.AddUser(new APIUser {
                        Id = 2, Username = "******"
                    });
                }
            });

            ClickButtonWhenEnabled <MultiplayerReadyButton>();
            AddUntilStep("user is ready", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Ready);

            verifyGameplayStartFlow();
        }
        public void TestLoseHostWhileReady()
        {
            AddStep("setup", () =>
            {
                MultiplayerClient.TransferHost(MultiplayerClient.Room?.Users[0].UserID ?? 0);
                MultiplayerClient.AddUser(new APIUser {
                    Id = 2, Username = "******"
                });
            });

            ClickButtonWhenEnabled <MultiplayerReadyButton>();
            AddUntilStep("user is ready", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Ready);

            AddStep("transfer host", () => MultiplayerClient.TransferHost(MultiplayerClient.Room?.Users[1].UserID ?? 0));

            ClickButtonWhenEnabled <MultiplayerReadyButton>();
            AddUntilStep("user is idle (match not started)", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Idle);
            AddAssert("ready button enabled", () => button.ChildrenOfType <OsuButton>().Single().Enabled.Value);
        }
        public void TestKickButtonOnlyPresentWhenHost()
        {
            AddStep("add user", () => MultiplayerClient.AddUser(new APIUser
            {
                Id       = 3,
                Username = "******",
                CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg",
            }));

            AddUntilStep("kick buttons visible", () => this.ChildrenOfType <ParticipantPanel.KickButton>().Count(d => d.IsPresent) == 1);

            AddStep("make second user host", () => MultiplayerClient.TransferHost(3));

            AddUntilStep("kick buttons not visible", () => this.ChildrenOfType <ParticipantPanel.KickButton>().Count(d => d.IsPresent) == 0);

            AddStep("make local user host again", () => MultiplayerClient.TransferHost(API.LocalUser.Value.Id));

            AddUntilStep("kick buttons visible", () => this.ChildrenOfType <ParticipantPanel.KickButton>().Count(d => d.IsPresent) == 1);
        }
        public new void Setup() => Schedule(() =>
        {
            AvailabilityTracker.SelectedItem.BindTo(selectedItem);

            beatmaps.Import(TestResources.GetQuickTestBeatmapForImport()).WaitSafely();
            importedSet   = beatmaps.GetAllUsableBeatmapSets().First();
            Beatmap.Value = beatmaps.GetWorkingBeatmap(importedSet.Beatmaps.First());

            selectedItem.Value = new PlaylistItem(Beatmap.Value.BeatmapInfo)
            {
                RulesetID = Beatmap.Value.BeatmapInfo.Ruleset.OnlineID
            };

            if (button != null)
            {
                Remove(button);
            }

            Add(button = new MultiplayerReadyButton
            {
                Anchor       = Anchor.Centre,
                Origin       = Anchor.Centre,
                Size         = new Vector2(200, 50),
                OnReadyClick = () =>
                {
                    readyClickOperation = OngoingOperationTracker.BeginOperation();

                    Task.Run(async() =>
                    {
                        if (MultiplayerClient.IsHost && MultiplayerClient.LocalUser?.State == MultiplayerUserState.Ready)
                        {
                            await MultiplayerClient.StartMatch();
                            return;
                        }

                        await MultiplayerClient.ToggleReady();

                        readyClickOperation.Dispose();
                    });
                }
            });
        });
示例#32
0
        public static void HandleBlockChange(IPacket _packet, MultiplayerClient client)
        {
            var           packet      = (BlockChangePacket)_packet;
            var           coordinates = new Coordinates3D(packet.X, packet.Y, packet.Z);
            Coordinates3D adjusted;
            IChunk        chunk;

            try
            {
                adjusted = client.World.World.FindBlockPosition(coordinates, out chunk);
            }
            catch (ArgumentException)
            {
                // Relevant chunk is not loaded - ignore packet
                return;
            }
            chunk.SetBlockID(adjusted, packet.ID);
            chunk.SetMetadata(adjusted, (byte)packet.Metadata);
            client.OnChunkModified(new ChunkEventArgs(new ReadOnlyChunk(chunk)));
        }
示例#33
0
        public void TestReadyAndUnReadyDuringCountdown()
        {
            AddStep("add second user as host", () =>
            {
                MultiplayerClient.AddUser(new APIUser {
                    Id = 2, Username = "******"
                });
                MultiplayerClient.TransferHost(2);
            });

            AddStep("start with countdown", () => MultiplayerClient.SendMatchRequest(new StartMatchCountdownRequest {
                Duration = TimeSpan.FromMinutes(2)
            }).WaitSafely());

            ClickButtonWhenEnabled <MultiplayerReadyButton>();
            AddUntilStep("user is ready", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Ready);

            ClickButtonWhenEnabled <MultiplayerReadyButton>();
            AddUntilStep("user is idle", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Idle);
        }
示例#34
0
        public void TestRange(int min, int max)
        {
            AddStep("add users", () =>
            {
                MultiplayerClient.AddUser(new APIUser
                {
                    Id         = 2,
                    Statistics = { GlobalRank = min }
                });

                MultiplayerClient.AddUser(new APIUser
                {
                    Id         = 3,
                    Statistics = { GlobalRank = max }
                });

                // Remove the local user so only the ones above are displayed.
                MultiplayerClient.RemoveUser(API.LocalUser.Value);
            });
        }
        public void TestBeatmapDownloadingStates()
        {
            AddStep("set to no map", () => MultiplayerClient.ChangeBeatmapAvailability(BeatmapAvailability.NotDownloaded()));
            AddStep("set to downloading map", () => MultiplayerClient.ChangeBeatmapAvailability(BeatmapAvailability.Downloading(0)));

            checkProgressBarVisibility(true);

            AddRepeatStep("increment progress", () =>
            {
                float progress = this.ChildrenOfType <ParticipantPanel>().Single().User.BeatmapAvailability.DownloadProgress ?? 0;
                MultiplayerClient.ChangeBeatmapAvailability(BeatmapAvailability.Downloading(progress + RNG.NextSingle(0.1f)));
            }, 25);

            AddAssert("progress bar increased", () => this.ChildrenOfType <ProgressBar>().Single().Current.Value > 0);

            AddStep("set to importing map", () => MultiplayerClient.ChangeBeatmapAvailability(BeatmapAvailability.Importing()));
            checkProgressBarVisibility(false);

            AddStep("set to available", () => MultiplayerClient.ChangeBeatmapAvailability(BeatmapAvailability.LocallyAvailable()));
        }
示例#36
0
        public static void HandleSetSlot(IPacket _packet, MultiplayerClient client)
        {
            var     packet = (SetSlotPacket)_packet;
            IWindow window = null;

            if (packet.WindowID == 0)
            {
                window = client.Inventory;
            }
            else
            {
                window = client.CurrentWindow;
            }
            if (window != null)
            {
                if (packet.SlotIndex >= 0 && packet.SlotIndex < window.Length)
                {
                    window[packet.SlotIndex] = new ItemStack(packet.ItemID, packet.Count, packet.Metadata);
                }
            }
        }
示例#37
0
        public override void Execute(MultiplayerClient client, string[] args)
        {
            assertMinimumArgs(args, 2);

            AnimChangeState state;

            if (args[1] == "on" || args[1] == "1" || args[1] == "true")
            {
                state = AnimChangeState.ON;
            }
            else if (args[1] == "off" || args[1] == "0" || args[1] == "false")
            {
                state = AnimChangeState.OFF;
            }
            else
            {
                state = AnimChangeState.UNSET;
            }

            localPlayer.AnimationChange((AnimChangeType)int.Parse(args[0]), state);
        }
        public void TestUserWithMods()
        {
            AddStep("add user", () =>
            {
                MultiplayerClient.AddUser(new APIUser
                {
                    Id                 = 0,
                    Username           = "******",
                    RulesetsStatistics = new Dictionary <string, UserStatistics>
                    {
                        {
                            Ruleset.Value.ShortName,
                            new UserStatistics {
                                GlobalRank = RNG.Next(1, 100000),
                            }
                        }
                    },
                    CoverUrl = @"https://osu.ppy.sh/images/headers/profile-covers/c3.jpg",
                });

                MultiplayerClient.ChangeUserMods(0, new Mod[]
                {
                    new OsuModHardRock(),
                    new OsuModDifficultyAdjust {
                        ApproachRate = { Value = 1 }
                    }
                });
            });

            for (var i = MultiplayerUserState.Idle; i < MultiplayerUserState.Results; i++)
            {
                var state = i;
                AddStep($"set state: {state}", () => MultiplayerClient.ChangeUserState(0, state));
            }

            AddStep("set state: downloading", () => MultiplayerClient.ChangeUserBeatmapAvailability(0, BeatmapAvailability.Downloading(0)));

            AddStep("set state: locally available", () => MultiplayerClient.ChangeUserBeatmapAvailability(0, BeatmapAvailability.LocallyAvailable()));
        }
示例#39
0
        public override void Execute(MultiplayerClient client, string[] args)
        {
            assertMinimumArgs(args, 1);

            IEnumerable <object> numericArgs = args
                                               .Skip(1)
                                               .Select(x =>
            {
                float r;
                if (float.TryParse(x, out r))
                {
                    return((object)r);
                }
                throw new InvalidArgumentException($"{x} is not a number!");
            });

            numericArgs = numericArgs.Concat(Enumerable.Repeat((object)1f, 5 - numericArgs.Count()));

            PlayerStats playerStats = (PlayerStats)Activator.CreateInstance(typeof(PlayerStats), new object[] { args[0] }.Concat(numericArgs).ToArray());

            client.PacketSender.Send(playerStats);
        }
示例#40
0
 public static void HandleCloseWindowPacket(IPacket _packet, MultiplayerClient client)
 {
     client.CurrentWindow = null;
 }
示例#41
0
 public static void HandleTimeUpdate(IPacket _packet, MultiplayerClient client)
 {
     var packet = (TimeUpdatePacket)_packet;
     var time = packet.Time / 20.0;
     client.World.World.BaseTime = DateTime.UtcNow - TimeSpan.FromSeconds(time);
 }
示例#42
0
 public static void HandleUpdateHealth(IPacket _packet, MultiplayerClient client)
 {
     var packet = (UpdateHealthPacket)_packet;
     client.Health = packet.Health;
 }
示例#43
0
 public static void HandleLoginResponse(IPacket _packet, MultiplayerClient client)
 {
     var packet = (LoginResponsePacket)_packet;
     client.EntityID = packet.EntityID;
     client.QueuePacket(new PlayerGroundedPacket());
 }
示例#44
0
 public static void HandleLoginResponse(IPacket _packet, MultiplayerClient client)
 {
     client.QueuePacket(new PlayerGroundedPacket());
 }
示例#45
0
 public static void HandleChunkPreamble(IPacket _packet, MultiplayerClient client)
 {
     var packet = (ChunkPreamblePacket)_packet;
     var coords = new Coordinates2D(packet.X, packet.Z);
     client.World.SetChunk(coords, new Chunk(coords));
 }
示例#46
0
 public static void HandleChatMessage(IPacket _packet, MultiplayerClient client)
 {
     var packet = (ChatMessagePacket)_packet;
     client.OnChatMessage(new ChatMessageEventArgs(packet.Message));
 }
 public DebugInterface(MultiplayerClient client, FontRenderer font)
 {
     Client = client;
     Font = font;
 }
示例#48
0
        public static void HandleChunkData(IPacket _packet, MultiplayerClient client)
        {
            var packet = (ChunkDataPacket)_packet;
            var data = ZlibStream.UncompressBuffer(packet.CompressedData);
            IChunk chunk;
            var adjustedCoords = client.World.World.FindBlockPosition(
                 new Coordinates3D(packet.X, packet.Y, packet.Z), out chunk);

            if (packet.Width == Chunk.Width
                && packet.Height == Chunk.Height
                && packet.Depth == Chunk.Depth) // Fast path
            {
                // Block IDs
                Buffer.BlockCopy(data, 0, chunk.Blocks, 0, chunk.Blocks.Length);
                // Block metadata
                Buffer.BlockCopy(data, chunk.Blocks.Length, chunk.Metadata.Data, 0, chunk.Metadata.Data.Length);
                // Block light
                Buffer.BlockCopy(data, chunk.Blocks.Length + chunk.Metadata.Data.Length,
                    chunk.BlockLight.Data, 0, chunk.BlockLight.Data.Length);
                // Sky light
                Buffer.BlockCopy(data, chunk.Blocks.Length + chunk.Metadata.Data.Length + chunk.BlockLight.Data.Length,
                    chunk.SkyLight.Data, 0, chunk.SkyLight.Data.Length);
            }
            else // Slow path
            {
                int x = adjustedCoords.X, y = adjustedCoords.Y, z = adjustedCoords.Z;
                int fullLength = packet.Width * packet.Height * packet.Depth; // Length of full sized byte section
                int nibbleLength = fullLength / 2; // Length of nibble sections
                for (int i = 0; i < fullLength; i++) // Iterate through block IDs
                {
                    chunk.SetBlockID(new Coordinates3D(x, y, z), data[i]);
                    y++;
                    if (y >= packet.Height)
                    {
                        y = 0;
                        z++;
                        if (z >= packet.Depth)
                        {
                            z = 0;
                            x++;
                            if (x >= packet.Width)
                            {
                                x = 0;
                            }
                        }
                    }
                }
                x = adjustedCoords.X; y = adjustedCoords.Y; z = adjustedCoords.Z;
                for (int i = fullLength; i < nibbleLength; i++) // Iterate through metadata
                {
                    byte m = data[i];
                    chunk.SetMetadata(new Coordinates3D(x, y, z), (byte)(m & 0xF));
                    chunk.SetMetadata(new Coordinates3D(x, y + 1, z), (byte)(m & 0xF0 << 8));
                    y += 2;
                    if (y >= packet.Height)
                    {
                        y = 0;
                        z++;
                        if (z >= packet.Depth)
                        {
                            z = 0;
                            x++;
                            if (x >= packet.Width)
                            {
                                x = 0;
                            }
                        }
                    }
                }
                // TODO: Lighting
            }
            chunk.UpdateHeightMap();
            client.OnChunkLoaded(new ChunkEventArgs(new ReadOnlyChunk(chunk)));
        }