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); }
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); }
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); }
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(); } } } }