/// <summary>
        /// Updates objects on which the player can to operate.
        /// Such as which the player can supervise switches, ingameGUI or control units.
        /// </summary>
        private void UpdateCurrentPlayerUseObjects()
        {
            Camera camera = RendererWorld.Instance.DefaultCamera;

            Unit playerUnit = GetPlayerUnit();

            float maxDistance = (GetRealCameraType() == CameraType.FPS) ?
                playerUseDistance : playerUseDistanceTPS;

            Ray ray = camera.GetCameraToViewportRay(EngineApp.Instance.MousePosition);
            ray.Direction = ray.Direction.GetNormalize() * maxDistance;

            //currentAttachedGuiObject
            {
                MapObjectAttachedGui attachedGuiObject = null;
                Vec2 screenPosition = Vec2.Zero;

                if (GetRealCameraType() != CameraType.Free && !IsCutSceneEnabled() &&
                    EntitySystemWorld.Instance.Simulation)
                {
                    Map.Instance.GetObjectsAttachedGuiObject(ray,
                        out attachedGuiObject, out screenPosition);
                }

                //ignore empty gui objects
                if (attachedGuiObject != null)
                {
                    In3dControlManager manager = attachedGuiObject.ControlManager;

                    if (manager.Controls.Count == 0 ||
                        (manager.Controls.Count == 1 && !manager.Controls[0].Enable))
                    {
                        attachedGuiObject = null;
                    }
                }

                if (attachedGuiObject != currentAttachedGuiObject)
                {
                    if (currentAttachedGuiObject != null)
                        currentAttachedGuiObject.ControlManager.LostManagerFocus();
                    currentAttachedGuiObject = attachedGuiObject;
                }

                if (currentAttachedGuiObject != null)
                    currentAttachedGuiObject.ControlManager.DoMouseMove(screenPosition);
            }

            //currentFloatSwitch
            {
                ProjectEntities.Switch overSwitch = null;

                Map.Instance.GetObjects(ray, delegate(MapObject obj, float scale)
                {
                    ProjectEntities.Switch s = obj as ProjectEntities.Switch;
                    if (s != null)
                    {
                        if (s.UseAttachedMesh != null)
                        {
                            Sphere sphere = GetSwitchUseAttachedMeshWorldSphere(s.UseAttachedMesh);

                            if (sphere.RayIntersection(ray))
                            {
                                overSwitch = s;
                                return false;
                            }
                        }
                        else
                        {
                            overSwitch = s;
                            return false;
                        }
                    }

                    return true;
                });

                //draw selection border
                if (overSwitch != null)
                {
                    Bounds bounds;
                    if (overSwitch.UseAttachedMesh != null)
                    {
                        Sphere sphere = GetSwitchUseAttachedMeshWorldSphere(overSwitch.UseAttachedMesh);
                        bounds = sphere.ToBounds();
                    }
                    else
                        bounds = overSwitch.MapBounds;
                    DrawObjectSelectionBorder(bounds);
                }

                if (overSwitch != currentSwitch)
                {
                    FloatSwitch floatSwitch = currentSwitch as FloatSwitch;
                    if (floatSwitch != null)
                        floatSwitch.UseEnd();

                    currentSwitch = overSwitch;
                }
            }

            //Use player control unit
            if (playerUnit != null)
            {
                currentSeeUnitAllowPlayerControl = null;

                if (PlayerIntellect.Instance != null &&
                    PlayerIntellect.Instance.MainNotActiveUnit == null &&
                    GetRealCameraType() != CameraType.Free)
                {
                    Ray unitFindRay = ray;

                    //special ray for TPS camera
                    if (GetRealCameraType() == CameraType.TPS)
                    {
                        unitFindRay = new Ray(playerUnit.Position,
                            playerUnit.Rotation * new Vec3(playerUseDistance, 0, 0));
                    }

                    Map.Instance.GetObjects(unitFindRay, delegate(MapObject obj, float scale)
                    {
                        Dynamic dynamic = obj as Dynamic;

                        if (dynamic == null)
                            return true;

                        if (!dynamic.Visible)
                            return true;

                        Unit u = dynamic.GetParentUnit();
                        if (u == null)
                            return true;

                        if (u == GetPlayerUnit())
                            return true;

                        if (!u.Type.AllowPlayerControl)
                            return true;

                        if (u.Intellect != null)
                            return true;

                        if (!u.MapBounds.RayIntersection(unitFindRay))
                            return true;

                        currentSeeUnitAllowPlayerControl = u;

                        return false;
                    });
                }

                //draw selection border
                if (currentSeeUnitAllowPlayerControl != null)
                    DrawObjectSelectionBorder(currentSeeUnitAllowPlayerControl.MapBounds);
            }

            //draw "Press Use" text
            if (currentSwitch != null || currentSeeUnitAllowPlayerControl != null)
            {
                ColorValue color;
                if ((Time % 2) < 1)
                    color = new ColorValue(1, 1, 0);
                else
                    color = new ColorValue(0, 1, 0);

                string text;
                {
                    text = "Press \"Use\"";

                    //get binded keyboard key or mouse button
                    GameControlsManager.GameControlItem controlItem = GameControlsManager.Instance.
                        GetItemByControlKey(GameControlKeys.Use);
                    if (controlItem != null && controlItem.BindedKeyboardMouseValues.Count != 0)
                    {
                        GameControlsManager.SystemKeyboardMouseValue value =
                            controlItem.BindedKeyboardMouseValues[0];
                        text += string.Format(" ({0})", value.ToString());
                    }
                }

                AddTextWithShadow(EngineApp.Instance.ScreenGuiRenderer, text, new Vec2(.5f, .9f), HorizontalAlign.Center,
                    VerticalAlign.Center, color);
            }
        }
Пример #2
0
        /*private void FindNearFlag()
        {
            if (GetPlayerUnit() == null)
                return;

            Bounds volume = new Bounds(GetPlayerUnit().Position);
            volume.Expand(new Vec3(10, 10, 20));

            Body[] result = PhysicsWorld.Instance.VolumeCast(volume,
                (int)ContactGroup.CastOnlyContact);

            foreach (Body body in result)
            {
                MapObject obj = MapSystemWorld.GetMapObjectByBody(body);
                if (obj != null)
                {
                    Flag FindFlag = obj as Flag;
                    if (FindFlag != null)
                    {
                        NearFlag = FindFlag;
                        isNearFlag = true;
                    }
                    else
                        isNearFlag = false;
                }
            }
        }*/

        /// <summary>
        /// Updates objects on which the player can to operate.
        /// Such as which the player can supervise switches, ingameGUI or control units.
        /// </summary>
        private void UpdateCurrentPlayerUseObjects()
        {
            Camera camera = RendererWorld.Instance.DefaultCamera;

            Unit playerUnit = GetPlayerUnit();

            float maxDistance = (GetRealCameraType() == CameraType.FPS) ?
                playerUseDistance : playerUseDistanceTPS;

            Ray ray = camera.GetCameraToViewportRay(new Vec2(.5f, .5f));
            ray.Direction = ray.Direction.GetNormalize() * maxDistance;

            //currentAttachedGuiObject
            {
                MapObjectAttachedGui attachedGuiObject = null;
                Vec2 screenPosition = Vec2.Zero;

                if (GetRealCameraType() != CameraType.Free && !IsCutSceneEnabled() &&
                    EntitySystemWorld.Instance.Simulation)
                {
                    Map.Instance.GetObjectsAttachedGuiObject(ray,
                        out attachedGuiObject, out screenPosition);
                }

                //ignore empty gui objects
                if (attachedGuiObject != null)
                {
                    In3dControlManager manager = attachedGuiObject.ControlManager;

                    if (manager.Controls.Count == 0 ||
                        (manager.Controls.Count == 1 && !manager.Controls[0].Enable))
                    {
                        attachedGuiObject = null;
                    }
                }

                if (attachedGuiObject != currentAttachedGuiObject)
                {
                    if (currentAttachedGuiObject != null)
                        currentAttachedGuiObject.ControlManager.LostManagerFocus();
                    currentAttachedGuiObject = attachedGuiObject;
                }

                if (currentAttachedGuiObject != null)
                    currentAttachedGuiObject.ControlManager.DoMouseMove(screenPosition);
            }

            //currentFloatSwitch
            {
                ProjectEntities.Switch overSwitch = null;

                Map.Instance.GetObjects(ray, delegate(MapObject obj, float scale)
                {
                    ProjectEntities.Switch s = obj as ProjectEntities.Switch;
                    if (s != null)
                    {
                        if (s.UseAttachedMesh != null)
                        {
                            Bounds bounds = ((MapObjectAttachedMesh)s.UseAttachedMesh).SceneNode.
                                GetWorldBounds();

                            if (bounds.RayIntersection(ray))
                            {
                                overSwitch = s;
                                return false;
                            }
                        }
                        else
                        {
                            overSwitch = s;
                            return false;
                        }
                    }

                    return true;
                });

                //draw border
                if (overSwitch != null)
                {
                    camera.DebugGeometry.Color = new ColorValue(1, 1, 1);
                    if (overSwitch.UseAttachedMesh != null)
                    {
                        camera.DebugGeometry.AddBounds(overSwitch.UseAttachedMesh.SceneNode.
                            GetWorldBounds());
                    }
                    else
                        camera.DebugGeometry.AddBounds(overSwitch.MapBounds);
                }

                if (overSwitch != currentSwitch)
                {
                    FloatSwitch floatSwitch = currentSwitch as FloatSwitch;
                    if (floatSwitch != null)
                        floatSwitch.UseEnd();

                    currentSwitch = overSwitch;
                }
            }

            //Use player control unit
            if (playerUnit != null)
            {
                currentSeeUnitAllowPlayerControl = null;

                if (PlayerIntellect.Instance != null &&
                    PlayerIntellect.Instance.MainNotActiveUnit == null &&
                    GetRealCameraType() != CameraType.Free)
                {
                    Ray unitFindRay = ray;

                    //special ray for TPS camera
                    if (GetRealCameraType() == CameraType.TPS)
                    {
                        unitFindRay = new Ray(playerUnit.Position,
                            playerUnit.Rotation * new Vec3(playerUseDistance, 0, 0));
                    }

                    Map.Instance.GetObjects(unitFindRay, delegate(MapObject obj, float scale)
                    {
                        Dynamic dynamic = obj as Dynamic;

                        if (dynamic == null)
                            return true;

                        if (!dynamic.Visible)
                            return true;

                        Unit u = dynamic.GetParentUnit();
                        if (u == null)
                            return true;

                        if (u == GetPlayerUnit())
                            return true;

                        if (!u.Type.AllowPlayerControl)
                            return true;

                        if (u.Intellect != null)
                            return true;

                        if (!u.MapBounds.RayIntersection(unitFindRay))
                            return true;

                        currentSeeUnitAllowPlayerControl = u;

                        return false;
                    });
                }

                //draw border
                if (currentSeeUnitAllowPlayerControl != null)
                {
                    camera.DebugGeometry.Color = new ColorValue(1, 1, 1);
                    camera.DebugGeometry.AddBounds(currentSeeUnitAllowPlayerControl.MapBounds);
                }
            }

            //draw "Press Use" text
            if (currentSwitch != null || currentSeeUnitAllowPlayerControl != null)
            {
                ColorValue color;
                if ((Time % 2) < 1)
                    color = new ColorValue(1, 1, 0);
                else
                    color = new ColorValue(0, 1, 0);

                EngineApp.Instance.ScreenGuiRenderer.AddText("Press \"Use Key Command\n Check Options Menu\"",
                    new Vec2(.5f, .9f), HorizontalAlign.Center, VerticalAlign.Center, color);
            }
        }