Пример #1
0
        private CameraUpdate SetupUpdate(UpdateCameraEventArgs e, CameraTarget target)
        {
            if (target == null)
            {
                return(null);
            }

            var cameraBase   = e.Camera;
            var playerCamera = cameraBase.As <PlayerCamera>();

            if (playerCamera == null)
            {
                return(null);
            }

            var cameraNode = playerCamera.Node;

            if (cameraNode == null)
            {
                return(null);
            }

            var cameraState = playerCamera.State;

            if (cameraState == null)
            {
                return(null);
            }

            var update = new CameraUpdate(this, this.FinalResult, target, playerCamera, cameraNode, cameraState, this.Values);

            return(update);
        }
        private CameraTarget SelectTarget(UpdateCameraEventArgs e)
        {
            var cameraBase = e.Camera;

            if (!(cameraBase is PlayerCamera playerCamera))
            {
                return(null);
            }

            TESObjectREFR target    = null;
            var           refHandle = playerCamera.TargetRefHandle;

            using (var objRef = new ObjectRefHolder(refHandle))
            {
                if (objRef.IsValid)
                {
                    target = objRef.Object;
                }
            }

            var t = CameraTarget.Create(target);

            if (t == null)
            {
                return(null);
            }

            var actor = t.Actor;
            var obj   = t.Object;

            LastActorWasPlayer = actor != null && actor.IsPlayer;
            LastTargetFormId   = obj?.FormId ?? 0;

            return(t);
        }
        private CameraUpdate SetupUpdate(UpdateCameraEventArgs e, CameraTarget target)
        {
            if (target == null)
            {
                return(null);
            }

            var cameraBase = e.Camera;

            if (!(cameraBase is PlayerCamera playerCamera))
            {
                return(null);
            }

            var cameraNode = playerCamera.Node;

            if (cameraNode == null)
            {
                return(null);
            }

            var cameraState = playerCamera.State;

            if (cameraState == null)
            {
                return(null);
            }

            var update = new CameraUpdate(this, FinalResult, target, playerCamera, cameraNode, cameraState, Values);

            return(update);
        }
Пример #4
0
        internal bool Update(UpdateCameraEventArgs e)
        {
            if (e.Camera == null || !e.Camera.Is <PlayerCamera>())
            {
                return(false);
            }

            var target = this.SelectTarget(e);

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

            var update = this.SetupUpdate(e, target);

            if (update != null)
            {
                this.DoUpdate(update);
            }

            return(true);
        }
        internal bool Update(UpdateCameraEventArgs e)
        {
            if (!(e.Camera is PlayerCamera))
            {
                return(false);
            }

            var target = SelectTarget(e);

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

            var update = SetupUpdate(e, target);

            if (update != null)
            {
                DoUpdate(update);
            }

            return(true);
        }
Пример #6
0
        private CameraTarget SelectTarget(UpdateCameraEventArgs e)
        {
            var cameraBase   = e.Camera;
            var playerCamera = cameraBase.As <PlayerCamera>();

            if (playerCamera == null)
            {
                return(null);
            }

            TESObjectREFR target    = null;
            uint          refHandle = playerCamera.TargetRefHandle;

            using (var objRef = new ObjectRefHolder(refHandle))
            {
                if (objRef.IsValid)
                {
                    target = objRef.Object;
                }
            }

            var t = CameraTarget.Create(target);

            if (t == null)
            {
                return(null);
            }

            var actor = t.Actor;
            var obj   = t.Object;

            this.LastActorWasPlayer = actor != null && actor.IsPlayer;
            this.LastTargetFormId   = obj != null ? obj.FormId : 0;

            return(t);
        }
Пример #7
0
        private void Event_UpdatedCamera(UpdateCameraEventArgs e)
        {
            bool   enabled     = false;
            bool   showedDebug = false;
            bool   disabled    = settings.uninstallMode.Value;
            string extraDebug  = null;

            try
            {
                if (disabled)
                {
                    return;
                }

                var camera = e.Camera as PlayerCamera;
                if (camera == null)
                {
                    return;
                }

                var state = camera.State;
                if (state == null)
                {
                    return;
                }

                var id = state.Id;
                if (settings.onlyRegularThird.Value)
                {
                    switch (id)
                    {
                    //case TESCameraStates.Dragon:
                    //case TESCameraStates.Horse:
                    case TESCameraStates.ThirdPerson2:
                        break;

                    case TESCameraStates.ThirdPerson1:
                    case TESCameraStates.Furniture:
                        disabled = true;
                        return;

                    case TESCameraStates.Free:
                        break;

                    default:
                        disabled = true;
                        return;
                    }
                }
                else
                {
                    switch (id)
                    {
                    //case TESCameraStates.Dragon:
                    //case TESCameraStates.Horse:
                    case TESCameraStates.ThirdPerson1:
                    case TESCameraStates.ThirdPerson2:
                        break;

                    case TESCameraStates.Furniture:
                        disabled = true;
                        return;

                    case TESCameraStates.Free:
                        break;

                    default:
                        disabled = true;
                        return;
                    }
                }

                var third = state as ThirdPersonState;
                if (third == null)
                {
                    if (debug_msg)
                    {
                        extraDebug = "third == null";
                    }
                    return;
                }

                if (settings.forceDisableGlobal.Value != null)
                {
                    float fgval = settings.forceDisableGlobal.Value.FloatValue;
                    if (fgval >= 1.5f)
                    {
                        disabled = true;
                        return;
                    }
                    if (fgval >= 0.5f)
                    {
                        return;
                    }
                }

                var plr = PlayerCharacter.Instance;
                if (plr == null)
                {
                    return;
                }

                {
                    // Aiming bow or crossbow.
                    uint flags = NetScriptFramework.Memory.ReadUInt32(plr.Cast <PlayerCharacter>() + 0xC0) >> 28;
                    //if (flags == 0xA)
                    if (flags >= 8)
                    {
                        disabled = true;
                        return;
                    }

                    for (int i = 0; i < 3; i++)
                    {
                        var caster = plr.GetMagicCaster((EquippedSpellSlots)i);
                        if (caster == null)
                        {
                            continue;
                        }

                        var mstate = caster.State;
                        switch (mstate)
                        {
                        case MagicCastingStates.Charged:
                        case MagicCastingStates.Charging:
                        case MagicCastingStates.Concentrating:
                        {
                            disabled = true;
                            return;
                        }
                        }
                    }
                }

                if (this.IsSpecialFurniture)
                {
                    disabled = true;
                    return;
                }

                bool hadpos    = false;
                bool skipAngle = false;

                try
                {
                    var mm = MenuManager.Instance;
                    if (mm != null)
                    {
                        if (mm.IsMenuOpen("Dialogue Menu"))
                        {
                            var menuMgr = NetScriptFramework.Memory.ReadPointer(this.addr_MenuTopicManager);
                            if (menuMgr != null)
                            {
                                uint refHandleId = NetScriptFramework.Memory.ReadUInt32(menuMgr + 0x68);
                                using (var refObj = new ObjectRefHolder(refHandleId))
                                {
                                    var objPtr = refObj.Object;
                                    if (objPtr != null)
                                    {
                                        var root = objPtr.Node;
                                        if (root != null)
                                        {
                                            var head = root.LookupNodeByName("NPCEyeBone") ?? root.LookupNodeByName("NPC Head [Head]");
                                            if (head != null)
                                            {
                                                var hpos = head.WorldTransform.Position;
                                                this.TargetHeadTrack.X = hpos.X;
                                                this.TargetHeadTrack.Y = hpos.Y;
                                                this.TargetHeadTrack.Z = hpos.Z;
                                                hadpos    = true;
                                                skipAngle = true;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                catch
                {
                }

                if (!hadpos)
                {
                    try
                    {
                        var pickData = NetScriptFramework.Memory.ReadPointer(addr_PickData);
                        if (pickData != IntPtr.Zero)
                        {
                            uint refHandleId = NetScriptFramework.Memory.ReadUInt32(pickData + 4);
                            using (var refObj = new ObjectRefHolder(refHandleId))
                            {
                                var objPtr = refObj.Object as Actor;
                                if (objPtr != null && !objPtr.IsDead)
                                {
                                    var root = objPtr.Node;
                                    if (root != null)
                                    {
                                        var head = root.LookupNodeByName("NPCEyeBone") ?? root.LookupNodeByName("NPC Head [Head]");
                                        if (head != null)
                                        {
                                            var hpos = head.WorldTransform.Position;
                                            this.TargetHeadTrack.X = hpos.X;
                                            this.TargetHeadTrack.Y = hpos.Y;
                                            this.TargetHeadTrack.Z = hpos.Z;
                                            hadpos    = true;
                                            skipAngle = true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    catch
                    {
                    }
                }

                double x = 0, y = 0;
                if (!skipAngle)
                {
                    x = (180.0 / Math.PI) * third.XRotationFromLastResetPoint;
                    y = 0.0;

                    {
                        float amount = -plr.Rotation.X;
                        float offset = third.YRotationFromLastResetPoint;
                        y = (180.0 / Math.PI) * (amount + offset);
                    }

                    x = Math.Abs(x);
                    y = Math.Abs(y);

                    if (x < settings.horizontalMinAngle.Value || x > settings.horizontalMaxAngle.Value || y < settings.verticalMinAngle.Value || y > settings.verticalMaxAngle.Value)
                    {
                        return;
                    }
                }

                var node = camera.Node;
                if (node == null)
                {
                    return;
                }

                if (this.IsIFPVMaybe(plr, node.WorldTransform.Position))
                {
                    disabled = true;
                    if (debug_msg)
                    {
                        extraDebug = "ifpv";
                    }
                    return;
                }

                if (!hadpos)
                {
                    node.WorldTransform.Translate(this.TranslateHeadTrack, this.TargetHeadTrack);
                }
                enabled = true;

                if (debug_msg)
                {
                    if (!_timer.IsRunning)
                    {
                        _timer.Start();
                    }
                    if (_timer.Time >= 1000)
                    {
                        NetScriptFramework.Main.WriteDebugMessage("============================================");
                        Action <string, NiPoint3> report = (type, pos) =>
                        {
                            NetScriptFramework.Main.WriteDebugMessage(type + "_x: " + pos.X + "; " + type + "_y: " + pos.Y + "; " + type + "_z: " + pos.Z + "; dist: " + node.WorldTransform.Position.GetDistance(pos));
                        };
                        NetScriptFramework.Main.WriteDebugMessage("rot_x = " + x + "; rot_y = " + y);
                        report("target", this.TargetHeadTrack);
                        report("cam", node.WorldTransform.Position);
                        try
                        {
                            report("head", PlayerCharacter.Instance.GetSkeletonNode(false).LookupNodeByName("NPC Head [Head]").WorldTransform.Position);
                        }
                        catch
                        {
                        }
                        _timer.Restart();
                        debug_msg2 = true;
                    }
                    showedDebug = true;
                }
            }
            finally
            {
                this.SetEnabled(enabled, disabled);

                if (enabled)
                {
                    this.State &= ~states.need_new_target;
                }

                if (!showedDebug && debug_msg)
                {
                    if (!_timer.IsRunning)
                    {
                        _timer.Start();
                    }
                    if (_timer.Time >= 1000)
                    {
                        string dmsg = !string.IsNullOrEmpty(extraDebug) ? extraDebug : "?";
                        NetScriptFramework.Main.WriteDebugMessage(dmsg);
                        _timer.Restart();
                    }
                }
            }
        }