Пример #1
0
        public void HandleInput(GraphicsDevice device, MouseState mouse, KeyboardState kb, float dT)
        {
            //the screenshot key should work regardless of anything
            #region screenshot
            if (kb.IsKeyDown(Keys.F12) && PreviousKbState.IsKeyUp(Keys.F12))
            {
                TakeScreenshot(device);
            }

            #endregion
            bool KeyboardHandled = WindowManager.FocusedText != null;

            #region all keyboard stuff

            if (!KeyboardHandled)
            {
                #region game windows
                if (kb.IsKeyDown(Keys.E) && PreviousKbState.IsKeyUp(Keys.E))
                {
                    ToggleWindow("inventory", new GameplayAssets.Windows.InventoryWindow(WindowManager, World.Player));
                }

                if (kb.IsKeyDown(Keys.R) && PreviousKbState.IsKeyUp(Keys.R))
                {
                    ToggleWindow("equipment", new GameplayAssets.Windows.EquipWindow(WindowManager, World.Player));
                }

                if (kb.IsKeyDown(Keys.T) && PreviousKbState.IsKeyUp(Keys.T))
                {
                    ToggleWindow("skills", new GameplayAssets.Windows.SkillTreeWindow(WindowManager, World.Player, abilities));
                }



                #endregion

                #region map controls
                if (kb.IsKeyDown(Keys.Add) && PreviousKbState.IsKeyUp(Keys.Add))
                {
                    MapZoomLevel++;
                    if (MapZoomLevel > 4)
                    {
                        MapZoomLevel = 4;
                    }
                }
                if (kb.IsKeyDown(Keys.Subtract) && PreviousKbState.IsKeyUp(Keys.Subtract))
                {
                    MapZoomLevel--;
                    if (MapZoomLevel < 1)
                    {
                        MapZoomLevel = 1;
                    }
                }
                if (kb.IsKeyDown(Keys.Multiply) && PreviousKbState.IsKeyUp(Keys.Multiply))
                {
                    RotateMap = !RotateMap;
                }
                #endregion

                #region tabbing
                if (kb.IsKeyDown(Keys.Tab) && PreviousKbState.IsKeyUp(Keys.Tab))
                {
                    float          Range   = 50f;
                    List <Monster> removes = new List <Monster>();
                    List <Monster> adds    = new List <Monster>();
                    foreach (Monster m in Tablist)
                    {
                        if (m.IsDead)
                        {
                            removes.Add(m);
                            continue; //no need to add twice
                        }
                        Vector3 dist = (m.Position - World.Player.Position);
                        if (dist.Length() > Range)
                        {
                            removes.Add(m);
                        }
                    }
                    List <MapEntity> mm = World.LocateNearby(World.Player);
                    foreach (MapEntity e in mm)
                    {
                        if ((e as Monster) != null)
                        {
                            Vector3 dist = (e.Position - World.Player.Position);
                            if (dist.Length() < Range)
                            {
                                adds.Add((e as Monster));
                            }
                        }
                    }
                    adds = adds.OrderBy(v => ((Vector3)(v.Position - World.Player.Position)).Length()).ToList();

                    foreach (Monster r in removes)
                    {
                        Tablist.Remove(r);
                    }
                    Tablist.Clear();
                    foreach (Monster a in adds)
                    {
                        // if (!Tablist.Contains(a))
                        Tablist.Add(a);
                    }
                    if (Tablist.Count <= 0)
                    {
                        return;
                    }
                    if (World.Player.Target == null)
                    {
                        Tablistindex = 0;
                    }
                    else
                    {
                        Tablistindex++;
                    }
                    if (Tablistindex >= Tablist.Count)
                    {
                        Tablistindex = 0;
                    }
                    World.Player.Target = Tablist[Tablistindex];
                }

                #endregion

                #region skills
                //later on target requirement also goes away as each skill checks individually

                if (kb.IsKeyDown(Keys.F1) && World.Player.Target != null)
                {
                    InvokeFBind(0);
                }
                if (kb.IsKeyDown(Keys.F2) && World.Player.Target != null)
                {
                    InvokeFBind(1);
                }
                if (kb.IsKeyDown(Keys.F3) && World.Player.Target != null)
                {
                    InvokeFBind(2);
                }
                if (kb.IsKeyDown(Keys.F4) && World.Player.Target != null)
                {
                    InvokeFBind(3);
                }
                if (kb.IsKeyDown(Keys.F5) && World.Player.Target != null)
                {
                    InvokeFBind(4);
                }
                if (kb.IsKeyDown(Keys.F6) && World.Player.Target != null)
                {
                    InvokeFBind(5);
                }
                if (kb.IsKeyDown(Keys.F7) && World.Player.Target != null)
                {
                    InvokeFBind(6);
                }
                if (kb.IsKeyDown(Keys.F8) && World.Player.Target != null)
                {
                    InvokeFBind(7);
                }

                #endregion

                #region gravity debug
                if (kb.IsKeyDown(Keys.F) && PreviousKbState.IsKeyUp(Keys.F))
                {
                    World.Player.Gravity = !World.Player.Gravity;
                }
                if (kb.IsKeyDown(Keys.F10) && PreviousKbState.IsKeyUp(Keys.F10))
                {
                    World.Entities.Clear();
                    World.Entities.Clear();
                }
                #endregion

                #region jumping
                if (kb.IsKeyDown(Keys.Space) && (PreviousKbState.IsKeyUp(Keys.Space)))
                {
                    if (!World.Player.Gravity)
                    {
                        World.Player.Position.Y += 1.1f;
                    }
                    else
                    {
                        World.Player.Jump();
                    }
                }
                #endregion

                #region WASD and forced walking
                if (World.Player.Executor == null)
                {
                    if (kb.IsKeyDown(Keys.D))
                    {
                        World.Player.Walking = false;
                        World.Player.Speed   = World.Player.GetMovementSpeed();

                        World.Player.Heading             = World.Camera.Yaw - 180f;
                        World.Player.AnimationMultiplier = World.Player.Speed / 10f;
                        World.Player.Model.ApplyAnimation("Walk");
                    }
                    else if (kb.IsKeyDown(Keys.A))
                    {
                        World.Player.Walking = false;
                        World.Player.Speed   = World.Player.GetMovementSpeed();

                        World.Player.Heading             = World.Camera.Yaw - 0f;
                        World.Player.AnimationMultiplier = World.Player.Speed / 10f;
                        World.Player.Model.ApplyAnimation("Walk");
                    }


                    else if (kb.IsKeyDown(Keys.S))
                    {
                        World.Player.Walking = false;
                        World.Player.Speed   = World.Player.GetMovementSpeed();

                        World.Player.Heading             = World.Camera.Yaw - 90f;
                        World.Player.AnimationMultiplier = World.Player.Speed / 10f;
                        World.Player.Model.ApplyAnimation("Walk");
                    }
                    else if (kb.IsKeyDown(Keys.W))
                    {
                        World.Player.Walking = false;

                        World.Player.Speed = World.Player.GetMovementSpeed();

                        World.Player.Heading             = World.Camera.Yaw + 90f;
                        World.Player.AnimationMultiplier = World.Player.Speed / 10f;
                        World.Player.Model.ApplyAnimation("Walk");
                    }
                    else if (World.Player.Walking)
                    {
                        //World.Player.Speed = World.Player.GetMovementSpeed() ;
                        World.Player.AnimationMultiplier = World.Player.Speed / 10f;
                        World.Player.Model.ApplyAnimation("Walk");
                    }
                    else
                    {
                        World.Player.Speed = 0;
                        World.Player.AnimationMultiplier = 1f;
                        if (!World.Player.LetPlayOnce)
                        {
                            World.Player.Model.ApplyAnimation("Straighten");
                        }
                    }
                }
                else
                {
                    // World.Player.AnimationMultiplier = 1f;
                    if (!World.Player.LetPlayOnce)
                    {
                        World.Player.Model.ApplyAnimation("Straighten");
                    }
                }
                #endregion


                #region zooming
                if (kb.IsKeyDown(Keys.Up))
                {
                    World.Camera.Distance *= 0.99f;
                }
                if (kb.IsKeyDown(Keys.Down))
                {
                    World.Camera.Distance /= 0.99f;
                }
                World.Camera.Distance = MathHelper.Clamp(World.Camera.Distance, 0.01f, 1010f);
                //World.Player.Position += mv;
                #endregion
            }

            #endregion

            /* idk wtf this is
             * if (kb.IsKeyUp(Keys.W) && kb.IsKeyUp(Keys.S))
             *  Accel -=0.25f*(Accel>=0?1:-1);
             * Vector3 mv= -World.Camera.GetMoveVector() * dT * Accel;
             * if (mv.Length() > 1f)
             * {
             *  mv.X += 0.0f;
             * }
             * else if(Accel>20f)
             * {
             *  mv.Y += 0.0f;
             * }
             * //*/
            #region mouse code!!
            WindowManager.MouseX = mouse.X;
            WindowManager.MouseY = mouse.Y;
            bool MouseHandled = WindowManager.HandleMouse(mouse, dT);

            Vector3 r0 = device.Viewport.Unproject(new Vector3(mouse.X, mouse.Y, 0), World.Camera.GetProjection(device), World.Camera.GetView(), Matrix.Identity);

            Vector3 r1 = device.Viewport.Unproject(new Vector3(mouse.X, mouse.Y, 1), World.Camera.GetProjection(device), World.Camera.GetView(), Matrix.Identity);
            Vector3 vc = (r0 - r1);

            vc.Normalize();

            Ray MouseRay = new Ray(r0, -vc);

            BoundingSphere bs;

            if (!MouseHandled)
            {
                List <MapEntity> targets   = World.LocateNearby(World.Player);
                float            closest   = 9999;
                float?           intersect = null;
                MapEntity        Target    = null;
                foreach (MapEntity t in targets)
                {
                    bs        = new BoundingSphere(t.Position.WRT(World.Player.Position), 1);
                    intersect = bs.Intersects(MouseRay);
                    if (intersect.HasValue && intersect.GetValueOrDefault(0) < closest)
                    {
                        Target = t;
                    }
                }
                HoverTarget = Target;
                targets     = null;

                WorldPosition check = MouseRay.Position;
                check.Normalize();
                WorldPosition campos = World.Player.Position + ((Vector3)World.Player.Camera.GetCamVector() - World.Camera.Position.Truncate());
                check.BX = World.Player.Position.BX;
                check.BY = World.Player.Position.BY;
                //*
                check.BX = campos.BX;
                check.BY = campos.BY;
                //*/
                if (mouse.LeftButton == ButtonState.Pressed && PreviousMouseState.LeftButton == ButtonState.Released)
                {
                    if (HoverTarget != null)
                    {
                        if (World.Player.Target == HoverTarget)
                        {
                            HoverTarget.DoubleClick(World.Player);
                            if (World.Player.Target is NPC npc)
                            {
                                GUI.Window w = new Scenes.GameplayAssets.Windows.NPCWindow(Main.CurrentScene.WindowManager, npc, World.Player);
                                WindowManager.Add(w);
                                w.Visible = true;
                            }
                        }

                        else
                        {
                            HoverTarget.Click(World.Player);
                        }
                    }
                    else //if(kb.IsKeyDown(Keys.LeftShift))
                    {
                        for (int i = 0; i < 1000; i++)
                        {
                            check += MouseRay.Direction / 1;
                            float th = World.Terrain.GetHeight(check.Truncate(), check.Reference()) == 0 ? -127f : (float)World.Terrain.GetHeight(check.Truncate(), check.Reference());
                            if (check.Y - 0 < th)
                            {
                                TerrainClick(check);
                                break;
                            }
                        }
                    }
                }
            }


            if (mouse.RightButton == ButtonState.Pressed && !MouseHandled)
            {
                // this.IsMouseVisible = false;
                //  Volatile.WindowManager.MovingWindow = null;
                //mouselook
                float DX = mouse.X - PreviousMouseState.X;
                float DY = mouse.Y - PreviousMouseState.Y;
                World.Camera.Yaw   += DX * dT * 3.0f;
                World.Camera.Pitch -= DY * dT * 3.0f;
                World.Camera.Pitch  = MathHelper.Clamp(World.Camera.Pitch, -89.0f, 89.0f);


                Mouse.SetPosition(PreviousMouseState.X, PreviousMouseState.Y);
                // Mouse.SetPosition(device.Viewport.Width / 2, device.Viewport.Height / 2);
            }


            else
            {
                //this.IsMouseVisible = true;
            }
            #endregion

            PreviousKbState    = Keyboard.GetState();
            PreviousMouseState = Mouse.GetState();
        }