Пример #1
0
    /// <summary>
    /// Refraction RenderTexture
    /// </summary>
    private void DrawRefractionRenderTexture(Camera cam)
    {
        CreateRenderTexAndCam(cam, ref _refractionRenderTex, ref _refractionCamera);
        WaterHelper.CloneCameraModes(cam, _refractionCamera);

        Vector3 pos    = transform.position;
        Vector3 normal = transform.up;

        Matrix4x4 projection = cam.worldToCameraMatrix;

        projection *= Matrix4x4.Scale(new Vector3(1, Mathf.Clamp(1 - RefractionAngle, 0.001f, 1), 1));
        _refractionCamera.worldToCameraMatrix = projection;

        Vector4 clipPlane = WaterHelper.CameraSpacePlane(_refractionCamera, pos, normal, -1.0f, 0);

        projection = cam.projectionMatrix;

        /*projection[2] = clipPlane.x + projection[3];//x
         * projection[6] = clipPlane.y + projection[7];//y
         * projection[10] = clipPlane.z + projection[11];//z
         * projection[14] = clipPlane.w + projection[15];//w*
         * _refractionCamera.projectionMatrix = projection;*/

        _refractionCamera.projectionMatrix = WaterHelper.CalculateObliqueMatrix(projection, clipPlane);


        _refractionCamera.cullingMask   = ~(1 << 4) & Layers.value; // never render water layer
        _refractionCamera.targetTexture = _refractionRenderTex;

        _refractionCamera.transform.position    = cam.transform.position;
        _refractionCamera.transform.eulerAngles = cam.transform.eulerAngles;
        _refractionCamera.Render();
    }
Пример #2
0
 public void AddWaterHelper(WaterHelper help)
 {
     if (waterHelpers == null)
     {
         waterHelpers = new List <WaterHelper>();
     }
     if (!WaterAlreadyAdded(help))
     {
         waterHelpers.Add(help);
     }
 }
Пример #3
0
 public bool WaterAlreadyAdded(WaterHelper check)
 {
     if (waterHelpers == null)
     {
         return(false);
     }
     if (waterHelpers.Contains(check))
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
Пример #4
0
        /// <summary>
        /// 解析详细页面并插入数据库
        /// </summary>
        /// <param name="pageUrl"></param>
        /// <returns></returns>
        public static int ParserPage(string pageUrl)
        {
            //获取目标url
            string targetUrl = CommonParserBusiness.GetUrl(pageUrl);
            //返回结果
            int result = 0;

            //如果目标地址解析成功
            if (targetUrl != "failed")
            {
                bool exist = WaterHelper.QueryUrlExist(targetUrl);
                if (!exist)
                {
                    //获取解析的页面数据
                    string[] waterlevel = new string[6];
                    waterlevel = CommonParserBusiness.GetDataFromTable(targetUrl);
                    if (waterlevel[5] != "failed")
                    {
                        bool sql = WaterHelper.SaveToWaterLevelInfo(waterlevel[0], waterlevel[1], waterlevel[2], waterlevel[3], waterlevel[4]);
                        if (sql)
                        {
                            result = 2;//解析成功,已成功导入到数据库!
                        }
                        else
                        {
                            result = 5;//插入到数据库出错!
                        }
                    }
                    else
                    {
                        result = 4;//详细信息页面解析出错!
                    }
                }
                else
                {
                    result = 1;//"尚未更新!"
                }
            }
            else
            {
                result = 3;//列表信息页面解析出错!
            }
            return(result);
        }
Пример #5
0
    public override void OnInspectorGUI()
    {
        if (!isVisible)
        {
            base.OnInspectorGUI();
            return;
        }

        Material targetMat = target as Material;

        var sourceMaterial = (Material)EditorGUILayout.ObjectField("Copy From", null, typeof(Material), false);

        if (sourceMaterial)
        {
            WaterHelper.CopyWaterProperties(sourceMaterial, targetMat);
        }

        base.OnInspectorGUI();
    }
Пример #6
0
    private void DrawReflectionRenderTexture(Camera cam)
    {
        Vector3 pos    = transform.position;
        Vector3 normal = transform.up;

        CreateRenderTexAndCam(cam, ref _reflectionRenderTex, ref _reflectionCamera);

        WaterHelper.CloneCameraModes(cam, _reflectionCamera);

        float   d = -Vector3.Dot(normal, pos) - reflectClipPlaneOffset;
        Vector4 reflectionPlane = new Vector4(normal.x, normal.y, normal.z, d);


        Matrix4x4 reflection = WaterHelper.CalculateReflectionMatrix(Matrix4x4.zero, reflectionPlane);

        Vector3 oldpos = cam.transform.position;
        Vector3 newpos = reflection.MultiplyPoint(oldpos);

        _reflectionCamera.worldToCameraMatrix = cam.worldToCameraMatrix * reflection;

        // Setup oblique projection matrix so that near plane is our reflection
        // plane. This way we clip everything below/above it for free.
        Vector4 clipPlane = WaterHelper.CameraSpacePlane(_reflectionCamera, pos, normal, 1.0f, reflectClipPlaneOffset);

        Matrix4x4 projection = cam.projectionMatrix;

        projection = WaterHelper.CalculateObliqueMatrix(projection, clipPlane);
        //Matrix4x4 projection = cam.CalculateObliqueMatrix(clipPlane);

        _reflectionCamera.projectionMatrix = projection;

        _reflectionCamera.cullingMask   = ~(1 << 4) & Layers.value; // never render water layer
        _reflectionCamera.targetTexture = _reflectionRenderTex;

        GL.invertCulling = true;
        _reflectionCamera.transform.position = newpos;
        Vector3 euler = cam.transform.eulerAngles;

        _reflectionCamera.transform.eulerAngles = new Vector3(0, euler.y, euler.z);
        _reflectionCamera.Render();
        _reflectionCamera.transform.position = oldpos;
        GL.invertCulling = false;
    }
Пример #7
0
        public bool AreConditionsMets()
        {
            if (!_gotWatchedBlocks)
            {
                SetupWatchedBlocks();
            }

            if (UseConditions == false)
            {
                return(true);
            }

            int usedConditions      = 0;
            int satisfiedConditions = 0;

            if (_behavior == null)
            {
                _behavior = BehaviorManager.GetBehavior(_remoteControl);

                if (_behavior == null)
                {
                    return(false);
                }
            }

            if (CheckAllLoadedModIDs == true)
            {
                usedConditions++;
                bool missingMod = false;

                foreach (var mod in AllModIDsToCheck)
                {
                    if (Utilities.ModIDs.Contains(mod) == false)
                    {
                        Logger.MsgDebug(ProfileSubtypeId + ": Mod ID Not Present", DebugTypeEnum.Condition);
                        missingMod = true;
                        break;
                    }
                }

                if (!missingMod)
                {
                    satisfiedConditions++;
                }
            }

            if (CheckAnyLoadedModIDs == true)
            {
                usedConditions++;

                foreach (var mod in AllModIDsToCheck)
                {
                    if (Utilities.ModIDs.Contains(mod))
                    {
                        Logger.MsgDebug(ProfileSubtypeId + ": A Mod ID was Found: " + mod.ToString(), DebugTypeEnum.Condition);
                        satisfiedConditions++;
                        break;
                    }
                }
            }

            if (CheckTrueBooleans == true)
            {
                usedConditions++;
                bool failedCheck = false;

                foreach (var boolName in TrueBooleans)
                {
                    if (!_settings.GetCustomBoolResult(boolName))
                    {
                        Logger.MsgDebug(ProfileSubtypeId + ": Boolean Not True: " + boolName, DebugTypeEnum.Condition);
                        failedCheck = true;
                        break;
                    }
                }

                if (!failedCheck)
                {
                    satisfiedConditions++;
                }
            }

            if (CheckCustomCounters == true)
            {
                usedConditions++;
                bool failedCheck = false;

                if (CustomCounters.Count == CustomCountersTargets.Count)
                {
                    for (int i = 0; i < CustomCounters.Count; i++)
                    {
                        try {
                            var compareType = CounterCompareEnum.GreaterOrEqual;

                            if (i <= CounterCompareTypes.Count - 1)
                            {
                                compareType = CounterCompareTypes[i];
                            }

                            if (_settings.GetCustomCounterResult(CustomCounters[i], CustomCountersTargets[i], compareType) == false)
                            {
                                Logger.MsgDebug(ProfileSubtypeId + ": Counter Amount Condition Not Satisfied: " + CustomCounters[i], DebugTypeEnum.Condition);
                                failedCheck = true;
                                break;
                            }
                        } catch (Exception e) {
                            Logger.MsgDebug("Exception: ", DebugTypeEnum.Condition);
                            Logger.MsgDebug(e.ToString(), DebugTypeEnum.Condition);
                        }
                    }
                }
                else
                {
                    Logger.MsgDebug(ProfileSubtypeId + ": Counter Names and Targets List Counts Don't Match. Check Your Condition Profile", DebugTypeEnum.Condition);
                    failedCheck = true;
                }

                if (!failedCheck)
                {
                    satisfiedConditions++;
                }
            }

            if (CheckTrueSandboxBooleans == true)
            {
                usedConditions++;
                bool failedCheck = false;

                for (int i = 0; i < TrueSandboxBooleans.Count; i++)
                {
                    try {
                        bool output = false;
                        var  result = MyAPIGateway.Utilities.GetVariable(TrueSandboxBooleans[i], out output);

                        if (!result || !output)
                        {
                            Logger.MsgDebug(ProfileSubtypeId + ": Sandbox Boolean False: " + TrueSandboxBooleans[i], DebugTypeEnum.Condition);
                            failedCheck = true;
                            break;
                        }
                    } catch (Exception e) {
                        Logger.MsgDebug("Exception: ", DebugTypeEnum.Condition);
                        Logger.MsgDebug(e.ToString(), DebugTypeEnum.Condition);
                    }
                }

                if (!failedCheck)
                {
                    satisfiedConditions++;
                }
            }

            if (CheckCustomSandboxCounters == true)
            {
                usedConditions++;
                bool failedCheck = false;

                if (CustomSandboxCounters.Count == CustomSandboxCountersTargets.Count)
                {
                    for (int i = 0; i < CustomSandboxCounters.Count; i++)
                    {
                        try {
                            int counter = 0;
                            var result  = MyAPIGateway.Utilities.GetVariable(CustomSandboxCounters[i], out counter);

                            var compareType = CounterCompareEnum.GreaterOrEqual;

                            if (i <= SandboxCounterCompareTypes.Count - 1)
                            {
                                compareType = SandboxCounterCompareTypes[i];
                            }

                            bool counterResult = false;

                            if (compareType == CounterCompareEnum.GreaterOrEqual)
                            {
                                counterResult = (counter >= CustomSandboxCountersTargets[i]);
                            }

                            if (compareType == CounterCompareEnum.Greater)
                            {
                                counterResult = (counter > CustomSandboxCountersTargets[i]);
                            }

                            if (compareType == CounterCompareEnum.Equal)
                            {
                                counterResult = (counter == CustomSandboxCountersTargets[i]);
                            }

                            if (compareType == CounterCompareEnum.NotEqual)
                            {
                                counterResult = (counter != CustomSandboxCountersTargets[i]);
                            }

                            if (compareType == CounterCompareEnum.Less)
                            {
                                counterResult = (counter < CustomSandboxCountersTargets[i]);
                            }

                            if (compareType == CounterCompareEnum.LessOrEqual)
                            {
                                counterResult = (counter <= CustomSandboxCountersTargets[i]);
                            }

                            if (!result || !counterResult)
                            {
                                Logger.MsgDebug(ProfileSubtypeId + ": Sandbox Counter Amount Condition Not Satisfied: " + CustomSandboxCounters[i], DebugTypeEnum.Condition);
                                failedCheck = true;
                                break;
                            }
                        } catch (Exception e) {
                            Logger.MsgDebug("Exception: ", DebugTypeEnum.Condition);
                            Logger.MsgDebug(e.ToString(), DebugTypeEnum.Condition);
                        }
                    }
                }
                else
                {
                    Logger.MsgDebug(ProfileSubtypeId + ": Sandbox Counter Names and Targets List Counts Don't Match. Check Your Condition Profile", DebugTypeEnum.Condition);
                    failedCheck = true;
                }

                if (!failedCheck)
                {
                    satisfiedConditions++;
                }
            }

            if (CheckGridSpeed == true)
            {
                usedConditions++;
                float speed = (float)_remoteControl.GetShipSpeed();

                if ((MinGridSpeed == -1 || speed >= MinGridSpeed) && (MaxGridSpeed == -1 || speed <= MaxGridSpeed))
                {
                    Logger.MsgDebug(ProfileSubtypeId + ": Grid Speed High Enough", DebugTypeEnum.Condition);
                    satisfiedConditions++;
                }
                else
                {
                    Logger.MsgDebug(ProfileSubtypeId + ": Grid Speed Not High Enough", DebugTypeEnum.Condition);
                }
            }

            if (MESApi.MESApiReady && CheckMESBlacklistedSpawnGroups)
            {
                var blackList = MESApi.GetSpawnGroupBlackList();

                if (SpawnGroupBlacklistContainsAll.Count > 0)
                {
                    usedConditions++;
                    bool failedCheck = false;

                    foreach (var group in SpawnGroupBlacklistContainsAll)
                    {
                        if (blackList.Contains(group) == false)
                        {
                            Logger.MsgDebug(ProfileSubtypeId + ": A Spawngroup was not on MES BlackList: " + group, DebugTypeEnum.Condition);
                            failedCheck = true;
                            break;
                        }
                    }

                    if (!failedCheck)
                    {
                        satisfiedConditions++;
                    }
                }

                if (SpawnGroupBlacklistContainsAny.Count > 0)
                {
                    usedConditions++;
                    foreach (var group in SpawnGroupBlacklistContainsAll)
                    {
                        if (blackList.Contains(group))
                        {
                            Logger.MsgDebug(ProfileSubtypeId + ": A Spawngroup was on MES BlackList: " + group, DebugTypeEnum.Condition);
                            satisfiedConditions++;
                            break;
                        }
                    }
                }
            }

            if (UseAccumulatedDamageWatcher)
            {
                usedConditions++;
                bool failedCheck = false;

                if (MinAccumulatedDamage >= 0 && MinAccumulatedDamage < _settings.TotalDamageAccumulated)
                {
                    failedCheck = true;
                }

                if (MaxAccumulatedDamage >= 0 && MaxAccumulatedDamage > _settings.TotalDamageAccumulated)
                {
                    failedCheck = true;
                }

                if (!failedCheck)
                {
                    satisfiedConditions++;
                }
            }

            if (UseRequiredFunctionalBlocks)
            {
                if (_watchingAllBlocks)
                {
                    usedConditions++;

                    if (_watchedAllBlocksResult)
                    {
                        satisfiedConditions++;
                    }
                }

                if (_watchingAnyBlocks)
                {
                    usedConditions++;

                    if (_watchedAnyBlocksResult)
                    {
                        satisfiedConditions++;
                    }
                }

                if (_watchingNoneBlocks)
                {
                    usedConditions++;

                    if (_watchedNoneBlocksResult)
                    {
                        satisfiedConditions++;
                    }
                }
            }

            if (CheckTargetAltitudeDifference)
            {
                usedConditions++;

                if (_behavior.AutoPilot.Targeting.HasTarget() && _behavior.AutoPilot.InGravity())
                {
                    var planetPos      = _behavior.AutoPilot.CurrentPlanet.PositionComp.WorldAABB.Center;
                    var targetCoreDist = _behavior.AutoPilot.Targeting.Target.Distance(planetPos);
                    var myCoreDist     = Vector3D.Distance(planetPos, _remoteControl.GetPosition());
                    var difference     = targetCoreDist - myCoreDist;

                    if (difference >= this.MinTargetAltitudeDifference && difference <= this.MaxTargetAltitudeDifference)
                    {
                        satisfiedConditions++;
                    }
                }
            }

            if (CheckTargetDistance)
            {
                usedConditions++;

                if (_behavior.AutoPilot.Targeting.HasTarget())
                {
                    var dist = _behavior.AutoPilot.Targeting.Target.Distance(_remoteControl.GetPosition());

                    if ((this.MinTargetDistance == -1 || dist >= this.MinTargetDistance) && (this.MaxTargetDistance == -1 || dist <= this.MaxTargetDistance))
                    {
                        satisfiedConditions++;
                    }
                }
            }

            if (CheckTargetAngleFromForward)
            {
                usedConditions++;

                if (_behavior.AutoPilot.Targeting.HasTarget())
                {
                    var dirToTarget = Vector3D.Normalize(_behavior.AutoPilot.Targeting.GetTargetCoords() - _remoteControl.GetPosition());
                    var myForward   = _behavior.AutoPilot.RefBlockMatrixRotation.Forward;
                    var angle       = VectorHelper.GetAngleBetweenDirections(dirToTarget, myForward);

                    if ((this.MinTargetAngle == -1 || angle >= this.MinTargetAngle) && (this.MaxTargetAngle == -1 || angle <= this.MaxTargetAngle))
                    {
                        satisfiedConditions++;
                    }
                }
            }

            if (CheckIfTargetIsChasing)
            {
                usedConditions++;

                if (_behavior.AutoPilot.Targeting.HasTarget())
                {
                    var dirFromTarget  = Vector3D.Normalize(_remoteControl.GetPosition() - _behavior.AutoPilot.Targeting.GetTargetCoords());
                    var targetVelocity = Vector3D.Normalize(_behavior.AutoPilot.Targeting.Target.CurrentVelocity());

                    if (targetVelocity.IsValid() && targetVelocity.Length() > 0)
                    {
                        var angle = VectorHelper.GetAngleBetweenDirections(dirFromTarget, targetVelocity);

                        if ((this.MinTargetChaseAngle == -1 || angle >= this.MinTargetChaseAngle) && (this.MaxTargetChaseAngle == -1 || angle <= this.MaxTargetChaseAngle))
                        {
                            satisfiedConditions++;
                        }
                    }
                }
            }

            if (CheckIfGridNameMatches)
            {
                usedConditions++;

                if (!string.IsNullOrWhiteSpace(_remoteControl.SlimBlock.CubeGrid.CustomName))
                {
                    bool pass = false;

                    foreach (var name in GridNamesToCheck)
                    {
                        if (AllowPartialGridNameMatches)
                        {
                            if (_remoteControl.SlimBlock.CubeGrid.CustomName.Contains(name))
                            {
                                pass = true;
                            }
                        }
                        else
                        {
                            if (_remoteControl.SlimBlock.CubeGrid.CustomName == name)
                            {
                                pass = true;
                            }
                        }
                    }

                    if (pass)
                    {
                        satisfiedConditions++;
                    }
                }
            }

            if (UnderwaterCheck)
            {
                usedConditions++;

                if (WaterHelper.UnderwaterAndDepthCheck(_remoteControl.GetPosition(), _behavior.AutoPilot.CurrentWater, IsUnderwater, MinDistanceUnderwater, MaxDistanceUnderwater))
                {
                    satisfiedConditions++;
                }
            }

            if (TargetUnderwaterCheck)
            {
                usedConditions++;

                if (WaterHelper.UnderwaterAndDepthCheck(_remoteControl.GetPosition(), _behavior.AutoPilot.CurrentWater, TargetIsUnderwater, MinTargetDistanceUnderwater, MaxTargetDistanceUnderwater))
                {
                    satisfiedConditions++;
                }
            }

            if (BehaviorModeCheck)
            {
                usedConditions++;

                if (_behavior.Mode == CurrentBehaviorMode)
                {
                    satisfiedConditions++;
                }
            }

            if (MatchAnyCondition == false)
            {
                bool result = satisfiedConditions >= usedConditions;
                Logger.MsgDebug(ProfileSubtypeId + ": All Condition Satisfied: " + result.ToString(), DebugTypeEnum.Condition);
                Logger.MsgDebug(string.Format("Used Conditions: {0} // Satisfied Conditions: {1}", usedConditions, satisfiedConditions), DebugTypeEnum.Condition);
                return(result);
            }
            else
            {
                bool result = satisfiedConditions > 0;
                Logger.MsgDebug(ProfileSubtypeId + ": Any Condition(s) Satisfied: " + result.ToString(), DebugTypeEnum.Condition);
                Logger.MsgDebug(string.Format("Used Conditions: {0} // Satisfied Conditions: {1}", usedConditions, satisfiedConditions), DebugTypeEnum.Condition);
                return(result);
            }
        }
Пример #8
0
    private void CreateWaterObjects(Camera currentCamera, out Camera reflectionCamera, out Camera refractionCamera)
    {
        SceneRenderingQuality mode = GetWaterMode();

        reflectionCamera = null;
        refractionCamera = null;

        if (mode >= SceneRenderingQuality.High)
        {
            // 反射相机
            m_ReflectionCameras.TryGetValue(currentCamera, out reflectionCamera);
            if (!reflectionCamera)
            {
                GameObject go = new GameObject("Water Refl Camera id" + GetInstanceID() + " for " + currentCamera.GetInstanceID(), typeof(Camera));
                reflectionCamera = go.GetComponent <Camera>();
                reflectionCamera.transform.SetPosition(transform.position);
                reflectionCamera.transform.rotation = transform.rotation;
                reflectionCamera.gameObject.AddComponent <FlareLayer>();
                reflectionCamera.renderingPath = RenderingPath.VertexLit;

                WaterHelper helper = reflectionCamera.gameObject.AddComponent <WaterHelper>();
                helper.hostWater  = this;
                helper.hostCamera = reflectionCamera;

                WaterCullLayer  = 0;
                WaterCullLayer |= 1 << WaterObjLayer;                                   //反射水物体
                WaterCullLayer |= 1 << LayerMask.NameToLayer(Config.LayerPlayerEnemy);  //反射友方玩家
                WaterCullLayer |= 1 << LayerMask.NameToLayer(Config.LayerPlayerFriend); //反射敌方玩家
                WaterCullLayer |= 1 << LayerMask.NameToLayer(Config.LayerHero);         //反射主角玩家
                reflectionCamera.cullingMask = WaterCullLayer;

                int layer = currentCamera.cullingMask;
                layer = layer & ~(1 << WaterObjLayer);
                currentCamera.cullingMask      = layer;
                reflectionCamera.targetTexture = m_ReflectionTexture;

                go.hideFlags = HideFlags.HideAndDontSave;
                m_ReflectionCameras[currentCamera] = reflectionCamera;
            }

            //反射RT
            if (!m_ReflectionTexture || m_OldReflectionTextureSize != m_TextureSize)
            {
                if (m_ReflectionTexture)
                {
                    DestroyImmediate(m_ReflectionTexture);
                }
                m_ReflectionTexture              = new RenderTexture(m_TextureSize, m_TextureSize, 16);
                m_ReflectionTexture.name         = "__WaterReflection" + GetInstanceID();
                m_ReflectionTexture.isPowerOfTwo = true;
                m_ReflectionTexture.hideFlags    = HideFlags.DontSave;
                m_OldReflectionTextureSize       = m_TextureSize;
                reflectionCamera.targetTexture   = m_ReflectionTexture;
            }
        }

        if (mode >= SceneRenderingQuality.Best)
        {
            // 折射相机
            m_RefractionCameras.TryGetValue(currentCamera, out refractionCamera);
            if (!refractionCamera)
            {
                GameObject go = new GameObject("Water Refr Camera id" + GetInstanceID() + " for " + currentCamera.GetInstanceID(), typeof(Camera));
                refractionCamera = go.GetComponent <Camera>();
                refractionCamera.transform.SetPosition(transform.position);
                refractionCamera.transform.rotation = transform.rotation;
                refractionCamera.gameObject.AddComponent <FlareLayer>();
                refractionCamera.renderingPath = RenderingPath.VertexLit;

                WaterHelper helper = refractionCamera.gameObject.AddComponent <WaterHelper>();
                helper.hostWater  = this;
                helper.hostCamera = refractionCamera;

                refractionCamera.targetTexture = m_RefractionTexture;
                WaterCullLayer  = 0;
                WaterCullLayer |= 1 << WaterObjLayer;                                   //反射水物体
                WaterCullLayer |= 1 << LayerMask.NameToLayer(Config.LayerPlayerEnemy);  //反射友方玩家
                WaterCullLayer |= 1 << LayerMask.NameToLayer(Config.LayerPlayerFriend); //反射敌方玩家
                WaterCullLayer |= 1 << LayerMask.NameToLayer(Config.LayerHero);         //反射主角玩家
                refractionCamera.cullingMask = WaterCullLayer;

                int layer = currentCamera.cullingMask;
                layer = layer & ~(1 << WaterObjLayer);;
                currentCamera.cullingMask = layer;

                go.hideFlags = HideFlags.HideAndDontSave;
                m_RefractionCameras[currentCamera] = refractionCamera;
            }

            // 折射RT
            if (!m_RefractionTexture || m_OldRefractionTextureSize != m_TextureSize)
            {
                if (m_RefractionTexture)
                {
                    DestroyImmediate(m_RefractionTexture);
                }
                m_RefractionTexture              = new RenderTexture(m_TextureSize, m_TextureSize, 16);
                m_RefractionTexture.name         = "__WaterRefraction" + GetInstanceID();
                m_RefractionTexture.isPowerOfTwo = true;
                m_RefractionTexture.hideFlags    = HideFlags.DontSave;
                m_OldRefractionTextureSize       = m_TextureSize;
                refractionCamera.targetTexture   = m_RefractionTexture;
            }
        }
    }
Пример #9
0
        public void VoxelCheckRequest(bool useAsteroidAABB = false)
        {
            if (_collisionSystem.AutoPilot.InGravity())
            {
                var  stepList     = _collisionSystem.AutoPilot.GetPlanetPathSteps(StartPosition, DirectionVector, Distance, true);
                var  planet       = _collisionSystem.AutoPilot.GetCurrentPlanet();
                var  planetCenter = planet.PositionComp.WorldAABB.Center;
                int  index        = -1;
                bool underwater   = false;

                for (int i = 0; i < stepList.Count; i++)
                {
                    var step              = stepList[i];
                    var stepToCore        = Vector3D.Distance(planetCenter, step);
                    var stepSurfaceToCore = Vector3D.Distance(planetCenter, WaterHelper.GetClosestSurface(step, planet, _collisionSystem.AutoPilot.CurrentWater));

                    if (stepToCore < stepSurfaceToCore)
                    {
                        //Logger.MsgDebug("Planet Voxel Found: ", DebugTypeEnum.Collision);
                        index = i == 0 ? 0 : i - 1;
                        break;
                    }
                }

                if (index >= 0)
                {
                    CollisionIsWater = WaterHelper.IsPositionUnderwater(stepList[index], _collisionSystem.AutoPilot.CurrentWater);
                    VoxelEntity      = planet;
                    VoxelCoords      = stepList[index];
                    VoxelDistance    = Vector3D.Distance(StartPosition, stepList[index]);
                }
            }
            else
            {
                MyVoxelBase closestVoxel    = null;
                double      closestDistance = -1;

                /*
                 * //Temp Debug Code Start
                 * _voxelScanList.Clear();
                 * var startCorner = StartPosition + new Vector3D(-2000, -2000, -2000);
                 * var endCorner = StartPosition + new Vector3D(2000, 2000, 2000);
                 * var box = new BoundingBoxD(startCorner, endCorner);
                 * MyGamePruningStructure.GetAllVoxelMapsInBox(ref box, _voxelScanList);
                 */

                foreach (var voxel in _voxelScanList)
                {
                    var planet = voxel as MyPlanet;

                    if (planet != null)
                    {
                        continue;
                    }

                    if (!useAsteroidAABB)
                    {
                        double minDist        = 0;
                        double maxDist        = 0;
                        bool   boxCheckResult = voxel.PositionComp.WorldAABB.Intersect(ref Ray, out minDist, out maxDist);

                        Vector3D startBox    = boxCheckResult ? (minDist - 5) * DirectionVector + StartPosition : StartPosition;
                        Vector3D endBox      = boxCheckResult ? (maxDist + 5) * DirectionVector + StartPosition : EndPosition;
                        Vector3D?hitPosition = null;
                        LineD    voxelLine   = new LineD(startBox, endBox);
                        bool     gotHit      = false;

                        try {
                            using (voxel.Pin()) {
                                gotHit = voxel.GetIntersectionWithLine(ref voxelLine, out hitPosition);
                            }
                        } catch (Exception e) {
                            Logger.WriteLog("Supressed Exception While Checking Voxel Collision");
                            Logger.WriteLog(e.ToString());
                        }

                        if (hitPosition.HasValue)
                        {
                            var hitDist = Vector3D.Distance((Vector3D)hitPosition, StartPosition);

                            if (closestVoxel == null || closestVoxel != null && hitDist < closestDistance)
                            {
                                closestVoxel    = voxel;
                                closestDistance = hitDist;
                            }
                        }
                    }
                    else
                    {
                        if (voxel.PositionComp.WorldAABB.Contains(StartPosition) == ContainmentType.Contains)
                        {
                            var hitDist = Vector3D.Distance(StartPosition, StartPosition + DirectionVector);

                            if (closestVoxel == null || closestVoxel != null && hitDist < closestDistance)
                            {
                                closestVoxel    = voxel;
                                closestDistance = hitDist;
                            }
                        }
                        else
                        {
                            double hitDist = 0;
                            voxel.PositionComp.WorldAABB.Intersects(ref Line, out hitDist);

                            if (closestVoxel == null || closestVoxel != null && hitDist < closestDistance)
                            {
                                closestVoxel    = voxel;
                                closestDistance = hitDist;
                            }
                        }
                    }
                }

                if (closestDistance == -1)
                {
                    return;
                }

                VoxelEntity   = closestVoxel;
                VoxelDistance = closestDistance;
                VoxelCoords   = closestDistance * DirectionVector + StartPosition;
            }
        }
Пример #10
0
        public bool EvaluateTarget(ITarget target, TargetProfile data, bool skipExpensiveChecks = false)
        {
            if (target == null)
            {
                Logger.MsgDebug("Target Is Null, Cannot Evaluate", DebugTypeEnum.TargetEvaluation);
                return(false);
            }

            if (!target.ActiveEntity())
            {
                Logger.MsgDebug("Target Invalid, Cannot Evaluate", DebugTypeEnum.TargetEvaluation);
                return(false);
            }

            Logger.MsgDebug(string.Format(" - Evaluating Target: {0} using profile {1}", target.Name(), data.ProfileSubtypeId), DebugTypeEnum.TargetEvaluation);

            if (!data.BuiltUniqueFilterList)
            {
                foreach (var filter in data.MatchAllFilters)
                {
                    if (!data.AllUniqueFilters.Contains(filter))
                    {
                        data.AllUniqueFilters.Add(filter);
                    }
                }

                foreach (var filter in data.MatchAnyFilters)
                {
                    if (!data.AllUniqueFilters.Contains(filter))
                    {
                        data.AllUniqueFilters.Add(filter);
                    }
                }

                foreach (var filter in data.MatchNoneFilters)
                {
                    if (!data.AllUniqueFilters.Contains(filter))
                    {
                        data.AllUniqueFilters.Add(filter);
                    }
                }

                data.BuiltUniqueFilterList = true;
            }

            List <TargetFilterEnum> FilterHits = new List <TargetFilterEnum>();

            //Distance
            var distance = target.Distance(RemoteControl.GetPosition());

            if (distance > data.MaxDistance)
            {
                return(false);
            }

            //Altitude
            if (data.AllUniqueFilters.Contains(TargetFilterEnum.Altitude))
            {
                var altitude = target.CurrentAltitude();

                if (altitude == -1000000 || (altitude >= data.MinAltitude && altitude <= data.MaxAltitude))
                {
                    FilterHits.Add(TargetFilterEnum.Altitude);
                }

                Logger.MsgDebug(string.Format(" - Evaluated Altitude: {0}", altitude), DebugTypeEnum.TargetEvaluation);
            }

            //Broadcasting
            if (data.AllUniqueFilters.Contains(TargetFilterEnum.Broadcasting))
            {
                var range = target.BroadcastRange(data.BroadcastOnlyAntenna);

                if (range > distance || distance < data.NonBroadcastVisualRange)
                {
                    FilterHits.Add(TargetFilterEnum.Broadcasting);
                }

                Logger.MsgDebug(string.Format(" - Evaluated Broadcast Range vs Distance: {0} / {1}", range, distance), DebugTypeEnum.TargetEvaluation);
            }

            //Faction
            if (data.AllUniqueFilters.Contains(TargetFilterEnum.Faction))
            {
                var faction = target.FactionOwner() ?? "";

                if (data.PrioritizeSpecifiedFactions || data.FactionTargets.Contains(faction))
                {
                    FilterHits.Add(TargetFilterEnum.Faction);
                }

                Logger.MsgDebug(string.Format(" - Evaluated Faction: {0}", faction), DebugTypeEnum.TargetEvaluation);
            }

            //Gravity
            if (data.AllUniqueFilters.Contains(TargetFilterEnum.Gravity))
            {
                var gravity = target.CurrentGravity();

                if (gravity >= data.MinGravity && gravity <= data.MaxGravity)
                {
                    FilterHits.Add(TargetFilterEnum.Gravity);
                }

                Logger.MsgDebug(string.Format(" - Evaluated Gravity: {0}", gravity), DebugTypeEnum.TargetEvaluation);
            }

            //LineOfSight
            if (!skipExpensiveChecks && data.AllUniqueFilters.Contains(TargetFilterEnum.LineOfSight) && _behavior.AutoPilot.Collision.TargetResult.HasTarget())
            {
                bool targetMatch = (target.GetParentEntity().EntityId == _behavior.AutoPilot.Collision.TargetResult.GetCollisionEntity().EntityId);

                if (targetMatch)
                {
                    FilterHits.Add(TargetFilterEnum.MovementScore);
                }
            }

            //MovementScore
            if (data.AllUniqueFilters.Contains(TargetFilterEnum.MovementScore))
            {
                if (distance < data.MaxMovementDetectableDistance || data.MaxMovementDetectableDistance < 0)
                {
                    var score = target.MovementScore();

                    if ((data.MinMovementScore == -1 || score >= data.MinMovementScore) && (data.MaxMovementScore == -1 || score <= data.MaxMovementScore))
                    {
                        FilterHits.Add(TargetFilterEnum.MovementScore);
                    }
                }
            }

            //Name
            if (data.AllUniqueFilters.Contains(TargetFilterEnum.Name))
            {
                var    name        = target.Name();
                string successName = "N/A";

                foreach (var allowedName in data.Names)
                {
                    if (string.IsNullOrWhiteSpace(allowedName))
                    {
                        continue;
                    }

                    if (data.UsePartialNameMatching)
                    {
                        if (name.Contains(allowedName))
                        {
                            successName = allowedName;
                            break;
                        }
                    }
                    else
                    {
                        if (name == allowedName)
                        {
                            successName = allowedName;
                            break;
                        }
                    }
                }

                if (successName != "N/A")
                {
                    FilterHits.Add(TargetFilterEnum.Name);
                }

                Logger.MsgDebug(string.Format(" - Evaluated Name: {0} // {1}", name, successName), DebugTypeEnum.TargetEvaluation);
            }

            //OutsideOfSafezone
            if (data.AllUniqueFilters.Contains(TargetFilterEnum.OutsideOfSafezone))
            {
                bool inZone = target.InSafeZone();

                if (!inZone)
                {
                    FilterHits.Add(TargetFilterEnum.OutsideOfSafezone);
                }

                Logger.MsgDebug(string.Format(" - Evaluated Outside Safezone: {0}", !inZone), DebugTypeEnum.TargetEvaluation);
            }

            //Owner
            if (data.AllUniqueFilters.Contains(TargetFilterEnum.Owner))
            {
                var  owners      = target.OwnerTypes(data.OnlyGetFromEntityOwner, data.GetFromMinorityGridOwners);
                bool gotRelation = false;

                var values = Enum.GetValues(typeof(OwnerTypeEnum)).Cast <OwnerTypeEnum>();

                foreach (var ownerType in values)
                {
                    if (ownerType == OwnerTypeEnum.None)
                    {
                        continue;
                    }

                    if (owners.HasFlag(ownerType) && data.Owners.HasFlag(ownerType))
                    {
                        gotRelation = true;
                        break;
                    }
                }

                if (gotRelation)
                {
                    FilterHits.Add(TargetFilterEnum.Owner);
                }

                Logger.MsgDebug(string.Format(" - Evaluated Owners: Required: {0}", data.Owners.ToString()), DebugTypeEnum.TargetEvaluation);
                Logger.MsgDebug(string.Format(" - Evaluated Owners: Found: {0}", owners.ToString()), DebugTypeEnum.TargetEvaluation);
                Logger.MsgDebug(string.Format(" - Evaluated Target Owners: {0} / Passed: {1}", owners.ToString(), gotRelation), DebugTypeEnum.TargetEvaluation);
            }

            //PlayerControlled
            if (data.AllUniqueFilters.Contains(TargetFilterEnum.PlayerControlled))
            {
                var controlled = target.PlayerControlled();

                if (data.PrioritizePlayerControlled || controlled)
                {
                    FilterHits.Add(TargetFilterEnum.PlayerControlled);
                }

                Logger.MsgDebug(string.Format(" - Evaluated Player Controlled: {0}", controlled), DebugTypeEnum.TargetEvaluation);
            }

            //PlayerKnownLocation
            if (data.AllUniqueFilters.Contains(TargetFilterEnum.PlayerKnownLocation))
            {
                bool inKnownLocation = false;

                if (MESApi.MESApiReady)
                {
                    if (MESApi.IsPositionInKnownPlayerLocation(target.GetPosition(), true, string.IsNullOrWhiteSpace(data.PlayerKnownLocationFactionOverride) ? _behavior.Owner.Faction?.Tag : data.PlayerKnownLocationFactionOverride))
                    {
                        ;
                    }
                    FilterHits.Add(TargetFilterEnum.PlayerKnownLocation);
                }

                Logger.MsgDebug(string.Format(" - Evaluated Player Known Location: {0}", inKnownLocation), DebugTypeEnum.TargetEvaluation);
            }

            //Powered
            if (data.AllUniqueFilters.Contains(TargetFilterEnum.Powered))
            {
                bool powered = target.IsPowered();

                if (powered)
                {
                    FilterHits.Add(TargetFilterEnum.Powered);
                }

                Logger.MsgDebug(string.Format(" - Evaluated Power: {0}", powered), DebugTypeEnum.TargetEvaluation);
            }

            //Relation
            if (data.AllUniqueFilters.Contains(TargetFilterEnum.Relation))
            {
                var  relations   = target.RelationTypes(RemoteControl.OwnerId, data.OnlyGetFromEntityOwner, data.GetFromMinorityGridOwners);
                bool gotRelation = false;

                var values = Enum.GetValues(typeof(RelationTypeEnum)).Cast <RelationTypeEnum>();

                foreach (var relationType in values)
                {
                    if (relationType == RelationTypeEnum.None)
                    {
                        continue;
                    }

                    if (relations.HasFlag(relationType) && data.Relations.HasFlag(relationType))
                    {
                        gotRelation = true;
                        break;
                    }
                }

                if (gotRelation)
                {
                    FilterHits.Add(TargetFilterEnum.Relation);
                }

                Logger.MsgDebug(string.Format(" - Evaluated Relations: Required: {0}", data.Relations.ToString()), DebugTypeEnum.TargetEvaluation);
                Logger.MsgDebug(string.Format(" - Evaluated Relations: Found: {0}", relations.ToString()), DebugTypeEnum.TargetEvaluation);
                Logger.MsgDebug(string.Format(" - Evaluated Relations: {0} / Passed: {1}", relations.ToString(), gotRelation), DebugTypeEnum.TargetEvaluation);
            }

            //Shielded
            if (data.AllUniqueFilters.Contains(TargetFilterEnum.Shielded))
            {
                bool shielded = target.ProtectedByShields();

                if (shielded)
                {
                    FilterHits.Add(TargetFilterEnum.Shielded);
                }

                Logger.MsgDebug(string.Format(" - Evaluated Shields: {0}", shielded), DebugTypeEnum.TargetEvaluation);
            }

            //Speed
            if (data.AllUniqueFilters.Contains(TargetFilterEnum.Speed))
            {
                var speed = target.CurrentSpeed();

                if ((data.MinSpeed < 0 || speed >= data.MinSpeed) && (data.MaxSpeed < 0 || speed <= data.MaxSpeed))
                {
                    FilterHits.Add(TargetFilterEnum.Speed);
                }

                Logger.MsgDebug(string.Format(" - Evaluated Speed: {0}", speed), DebugTypeEnum.TargetEvaluation);
            }

            //Static
            if (data.IsStatic != CheckEnum.Ignore && data.AllUniqueFilters.Contains(TargetFilterEnum.Static))
            {
                var staticGrid = target.IsStatic();

                if ((staticGrid && data.IsStatic == CheckEnum.Yes) || (!staticGrid && data.IsStatic == CheckEnum.No))
                {
                    FilterHits.Add(TargetFilterEnum.Static);
                }

                Logger.MsgDebug(string.Format(" - Evaluated Static Grid: {0}", staticGrid), DebugTypeEnum.TargetEvaluation);
            }

            //TargetValue
            if (data.AllUniqueFilters.Contains(TargetFilterEnum.TargetValue))
            {
                var targetValue = target.TargetValue();

                if (targetValue >= data.MinTargetValue && targetValue <= data.MaxTargetValue)
                {
                    FilterHits.Add(TargetFilterEnum.TargetValue);
                }

                Logger.MsgDebug(string.Format(" - Evaluated Target Value: {0}", targetValue), DebugTypeEnum.TargetEvaluation);
            }

            //Underwater
            if (data.AllUniqueFilters.Contains(TargetFilterEnum.Underwater))
            {
                bool result = false;

                if (WaterHelper.Enabled)
                {
                    result = WaterHelper.UnderwaterAndDepthCheck(target.GetPosition(), _behavior.AutoPilot.CurrentWater, true, Data.MinUnderWaterDepth, Data.MaxUnderWaterDepth);
                }

                if (result)
                {
                    FilterHits.Add(TargetFilterEnum.Underwater);
                }

                Logger.MsgDebug(string.Format(" - Evaluated Underwater: {0}", result), DebugTypeEnum.TargetEvaluation);
            }

            //Any Conditions Check
            bool anyConditionPassed = false;

            if (data.MatchAnyFilters.Count > 0)
            {
                foreach (var filter in data.MatchAnyFilters)
                {
                    if (FilterHits.Contains(filter))
                    {
                        anyConditionPassed = true;
                        break;
                    }
                }
            }
            else
            {
                anyConditionPassed = true;
            }

            if (!anyConditionPassed)
            {
                Logger.MsgDebug(" - Evaluation Condition -Any- Failed", DebugTypeEnum.TargetEvaluation);
                return(false);
            }


            //All Condition Checks
            foreach (var filter in data.MatchAllFilters)
            {
                if (!FilterHits.Contains(filter))
                {
                    Logger.MsgDebug(" - Evaluation Condition -All- Failed", DebugTypeEnum.TargetEvaluation);
                    return(false);
                }
            }

            //None Condition Checks
            foreach (var filter in data.MatchNoneFilters)
            {
                if (FilterHits.Contains(filter))
                {
                    Logger.MsgDebug(" - Evaluation Condition -None- Failed", DebugTypeEnum.TargetEvaluation);
                    return(false);
                }
            }

            Logger.MsgDebug(" - Evaluation Passed", DebugTypeEnum.TargetEvaluation);
            TargetLastKnownCoords = target.GetPosition();
            return(true);
        }
Пример #11
0
        public static void ProcessBehaviors()
        {
            if (DebugDraw)
            {
                for (int i = Behaviors.Count - 1; i >= 0; i--)
                {
                    if (Behaviors[i] == null)
                    {
                        continue;
                    }

                    if (!Behaviors[i].IsClosed() && Behaviors[i].IsAIReady())
                    {
                        Behaviors[i].DebugDrawWaypoints();
                    }
                }
            }

            if (WaterHelper.RequiresUpdate)
            {
                WaterHelper.RefreshWater();
            }

            if (AiNeedsReset)
            {
                AiNeedsReset = false;

                if (ResetAiBlocks.Count > 0)
                {
                    for (int j = ResetAiBlocks.Count - 1; j >= 0; j--)
                    {
                        var behavior = GetBehavior(ResetAiBlocks[j]);

                        if (behavior == null)
                        {
                            continue;
                        }

                        behavior.BehaviorTerminated = true;

                        if (ResetAiBlocks[j].Storage != null && ResetAiBlocks[j].Storage.ContainsKey(new Guid("FF814A67-AEC3-4DF0-ADC4-A9B239FA954F")))
                        {
                            ResetAiBlocks[j].Storage[new Guid("FF814A67-AEC3-4DF0-ADC4-A9B239FA954F")] = "";
                        }

                        Logger.MsgDebug("AI ModStorageComponent Wiped", DebugTypeEnum.BehaviorSetup);
                    }

                    MyAPIGateway.Parallel.Start(() => {
                        for (int i = ResetAiBlocks.Count - 1; i >= 0; i--)
                        {
                            Logger.MsgDebug("Re-Registering AI", DebugTypeEnum.BehaviorSetup);
                            RegisterBehaviorFromRemoteControl(ResetAiBlocks[i]);
                        }

                        ResetAiBlocks.Clear();
                    });
                }
            }

            _barrageCounter++;

            if (Mode != BehaviorManagerMode.None)
            {
                try {
                    ProcessParallelMethods();
                    ProcessMainThreadMethods();
                } catch (Exception e) {
                    Logger.MsgDebug("Exception in Main Behavior Processing", DebugTypeEnum.General);
                    Logger.MsgDebug(e.ToString(), DebugTypeEnum.General);
                }
            }
            else
            {
                _behaviorCounter++;
            }

            if ((_barrageCounter % 10) == 0)
            {
                ProcessWeaponsBarrage();
                _barrageCounter = 0;
            }

            if (_behaviorCounter == 15)
            {
                for (int i = Behaviors.Count - 1; i >= 0; i--)
                {
                    if (Behaviors[i] == null || Behaviors[i].IsClosed() || Behaviors[i].BehaviorTerminated)
                    {
                        Behaviors.RemoveAt(i);
                        continue;
                    }
                }

                //Logger.MsgDebug("Start Parallel For All Behaviors", DebugTypeEnum.General);
                Mode             = BehaviorManagerMode.Parallel;
                _behaviorCounter = 0;
            }
        }
Пример #12
0
        private void CalculateAreaAndPath()
        {
            //Reset Existing Values
            _closestNodeToStart = null;
            _closestNodeToEnd   = null;
            _endPath            = false;
            _goodNodes.Clear();
            _badNodes.Clear();
            _pathWaypoints.Clear();
            _shorelineNodes.Clear();

            if (!EnablePathGeneration)
            {
                _endPath = true;
                return;
            }

            //Create The Grid Of Nodes
            var    up                 = _behavior.AutoPilot.UpDirectionFromPlanet;
            var    forward            = Vector3D.CalculatePerpendicularVector(up);
            var    myPos              = _behavior.RemoteControl.GetPosition();
            var    myMatrix           = MatrixD.CreateWorld(myPos, forward, up);
            double distanceOffsetHalf = (_worldStepDistance * _steps) / 2;
            var    startOffset        = new Vector3D(-distanceOffsetHalf, 0, -distanceOffsetHalf);
            var    startGridCoords    = Vector3D.Transform(startOffset, myMatrix);

            _targetCoords = _behavior.AutoPilot.GetPendingWaypoint();

            for (int x = 0; x <= _steps; x++)
            {
                for (int y = 0; y <= _steps; y++)
                {
                    var gridWorldCellOffset = startOffset;
                    gridWorldCellOffset.X += (x * _worldStepDistance);
                    gridWorldCellOffset.Z += (y * _worldStepDistance);
                    var    gridWorldCoords = Vector3D.Transform(gridWorldCellOffset, myMatrix);
                    double distAboveWater  = 0;
                    var    surfaceCoords   = WaterHelper.GetClosestSurface(gridWorldCoords, _behavior.AutoPilot.CurrentPlanet, _behavior.AutoPilot.CurrentWater, ref distAboveWater);

                    if (x == 0 & y == 0)
                    {
                        _gridStartCoords = surfaceCoords;
                    }

                    if (x == _steps - 1 & y == _steps - 1)
                    {
                        _gridEndCoords = surfaceCoords;
                    }

                    var node = new PathNode(surfaceCoords, x, y);

                    if (distAboveWater > -_minimumDepth)
                    {
                        _badNodes.Add(node);
                        continue;
                    }

                    _goodNodes.Add(node);
                    node.DistanceFromStart = Vector3D.Distance(myPos, surfaceCoords);
                    node.DistanceFromEnd   = Vector3D.Distance(surfaceCoords, _targetCoords);

                    if (_closestNodeToStart == null || node.DistanceFromStart < _closestNodeToStart.DistanceFromStart)
                    {
                        _closestNodeToStart = node;
                    }

                    if (_closestNodeToEnd == null || node.DistanceFromEnd < _closestNodeToEnd.DistanceFromEnd)
                    {
                        _closestNodeToEnd = node;
                    }
                }
            }

            for (int i = _goodNodes.Count - 1; i >= 0; i--)
            {
                if (GetNeighbours(_goodNodes[i], true).Count > 0)
                {
                    _shorelineNodes.Add(_goodNodes[i]);
                    _goodNodes.RemoveAt(i);
                }
            }

            if (_shorelineNodes.Contains(_closestNodeToStart))
            {
                _closestNodeToStart = null;

                foreach (var node in _goodNodes)
                {
                    if (_closestNodeToStart == null || node.DistanceFromStart < _closestNodeToStart.DistanceFromStart)
                    {
                        _closestNodeToStart = node;
                    }
                }
            }

            if (_shorelineNodes.Contains(_closestNodeToEnd))
            {
                _closestNodeToEnd = null;

                foreach (var node in _goodNodes)
                {
                    if (_closestNodeToEnd == null || node.DistanceFromEnd < _closestNodeToEnd.DistanceFromEnd)
                    {
                        _closestNodeToEnd = node;
                    }
                }
            }

            //Logger.MsgDebug("Total Nodes Calculated: " + _goodNodes.Count, DebugTypeEnum.AutoPilot);

            //Calculate the Path
            _pathWaypoints = new List <Vector3D>(FindPath());
        }