/// <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); } }
/*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); } }