diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..473d8c1 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "Lua.diagnostics.globals": [ + "mwscript", + "mwse", + "event", + "tes3", + "timer" + ] +} \ No newline at end of file diff --git a/MWSE/mods/celediel/MoreAttentiveGuards/combat.lua b/MWSE/mods/celediel/MoreAttentiveGuards/combat.lua index 5f3a7e7..2502426 100644 --- a/MWSE/mods/celediel/MoreAttentiveGuards/combat.lua +++ b/MWSE/mods/celediel/MoreAttentiveGuards/combat.lua @@ -16,19 +16,56 @@ local function isFriendlyActor(actor) return false end -local function alertGuards(aggressor, cell) - -- a wanted player gets no help - if tes3.mobilePlayer.bounty > 0 then - log("Player is wanted, ignoring combat.") - return +local function doChecks(e) + if not config.combatEnable then + return false end + -- if player initiates combat or combat is not against player, do nothing + if e.actor == tes3.mobilePlayer or e.target ~= tes3.mobilePlayer then + return false + end + + -- inCombat is true after player has taken combat actions + -- or after combat has gone on awhile, but hopefully the guards will already be attacking by then + -- should be fine in cities, but will prevent players from provoking NPCs + -- in the wilderness and leading them into town + if tes3.mobilePlayer.inCombat then + log("Player is in combat, not sure who started it, so not helping.") + return false + end + + if config.ignored[e.actor.object.id] or config.ignored[e.actor.object.baseObject.id] then + log("Ignored NPC or creature detected, not helping.") + return false + end + + if isFriendlyActor(e.actor) then + log("Friendly actor, not helping.") + return false + end + + if tes3.mobilePlayer.bounty > 0 then + log("Player is wanted, ignoring combat.") + return false + end + + if e.actor.object.isGuard then + log("Guards don't fight guards!") + return false + end + + -- everything was good + return true +end + +local function alertGuards(aggressor, cell) log("Checking for guards in cell %s to bring justice to %s", cell.name or cell.id, aggressor.object.name) local playerPos = tes3.mobilePlayer.position for npc in cell:iterateReferences(tes3.objectType.npc) do local distance = playerPos:distance(npc.position) - if npc.object.isGuard and distance <= config.combatDistance then + if npc.object.isGuard and npc.mobile and distance <= config.combatDistance then log("Alerting %s, %s units away, to the combat!", npc.object.name, distance) if config.combatDialogue then @@ -48,30 +85,7 @@ end -- {{{ returned event functions this.onCombatStarted = function(e) - if not config.combatEnable then return end - - -- if player initiates combat or combat is not against player, do nothing - if e.actor == tes3.mobilePlayer or e.target ~= tes3.mobilePlayer then return end - - -- inCombat is true after player has taken combat actions - -- or after combat has gone on awhile, but hopefully the guards will already be attacking by then - -- should be fine in cities, but will prevent players from provoking NPCs - -- in the wilderness and leading them into town - if tes3.mobilePlayer.inCombat then - log("Player is in combat, not sure who started it, so not helping.") - return - end - - if config.ignored[e.actor.object.id] or config.ignored[e.actor.object.baseObject.id] then - log("Ignored NPC or creature detected, not helping.") - return - end - - if isFriendlyActor(e.actor) then - log("Friendly actor, not helping.") - return - end - + if not doChecks(e) then return end for _, cell in pairs(tes3.getActiveCells()) do alertGuards(e.actor, cell)