companions resist spells if stop damage is enabled
This commit is contained in:
parent
15df5dacd7
commit
1fd47821ea
|
@ -8,4 +8,7 @@ this.modInfo = "Stop friendly fire. Player companions can't damage the player, t
|
||||||
this.author = "Celediel"
|
this.author = "Celediel"
|
||||||
this.version = "1.4.0"
|
this.version = "1.4.0"
|
||||||
|
|
||||||
|
-- debug
|
||||||
|
this.logLevels = {no = 0, small = 1, big = 2}
|
||||||
|
|
||||||
return this
|
return this
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
local common = require("celediel.NoMoreFriendlyFire.common")
|
local common = require("celediel.NoMoreFriendlyFire.common")
|
||||||
|
|
||||||
local currentConfig
|
local currentConfig
|
||||||
local defaultConfig = {stopDamage = true, stopCombat = true, debug = false, ignored = {}}
|
local defaultConfig = {stopDamage = true, stopCombat = true, debugLevel = common.logLevels.no, ignored = {}}
|
||||||
local this = {}
|
local this = {}
|
||||||
|
|
||||||
this.getConfig = function()
|
this.getConfig = function()
|
||||||
|
|
|
@ -8,7 +8,9 @@ pcall(function() mag = require("celediel.MoreAttentiveGuards.interop") end)
|
||||||
local followMatches = {"follow", "together", "travel", "wait", "stay"}
|
local followMatches = {"follow", "together", "travel", "wait", "stay"}
|
||||||
local postDialogueTimer
|
local postDialogueTimer
|
||||||
|
|
||||||
local function log(...) if config.debug then mwse.log("[%s] %s", common.modName, string.format(...)) end end
|
local function log(level, ...)
|
||||||
|
if config.debugLevel >= level then mwse.log("[%s] %s", common.modName, string.format(...)) end
|
||||||
|
end
|
||||||
|
|
||||||
-- keep track of followers
|
-- keep track of followers
|
||||||
local followers = {}
|
local followers = {}
|
||||||
|
@ -22,8 +24,8 @@ local function notActuallyFriend(friend)
|
||||||
local ignoredId = config.ignored[obj.id:lower()]
|
local ignoredId = config.ignored[obj.id:lower()]
|
||||||
local ignoredMod = config.ignored[obj.sourceMod:lower()]
|
local ignoredMod = config.ignored[obj.sourceMod:lower()]
|
||||||
|
|
||||||
log("Friend %s: Is MAG Guard:%s, Ignored id:%s, Ignored mod:%s", obj.name, friend == magGuard,
|
log(common.logLevels.small, "Friend %s: Is MAG Guard:%s, Ignored id:%s, Ignored mod:%s", obj.name,
|
||||||
ignoredId or "false", ignoredMod or "false")
|
friend == magGuard, ignoredId or "false", ignoredMod or "false")
|
||||||
|
|
||||||
return friend == magGuard or ignoredId or ignoredMod
|
return friend == magGuard or ignoredId or ignoredMod
|
||||||
end
|
end
|
||||||
|
@ -44,9 +46,22 @@ local function buildFollowerList()
|
||||||
msg = msg .. friend.object.name .. " "
|
msg = msg .. friend.object.name .. " "
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if msg ~= "" then log("Friends: %s", msg) end
|
if msg ~= "" then log(common.logLevels.small, "Friends: %s", msg) end
|
||||||
return friends
|
return friends
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function isHarmfulSpell(source)
|
||||||
|
-- look for harmful effects in the source spell
|
||||||
|
for i = 1, 8 do
|
||||||
|
local effect = source.effects[i]
|
||||||
|
if effect.object then
|
||||||
|
-- todo: get name of spell effect instead of id
|
||||||
|
log(common.logLevels.big, "effect #%s id:%s: harmful:%s", i, effect.object.id, effect.object.isHarmful)
|
||||||
|
if effect.object.isHarmful then return true end -- found one!
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return false -- found nothing
|
||||||
|
end
|
||||||
-- }}}
|
-- }}}
|
||||||
|
|
||||||
-- {{{ Event functions
|
-- {{{ Event functions
|
||||||
|
@ -58,23 +73,41 @@ eventFunctions.onDamage = function(e)
|
||||||
|
|
||||||
if followerCheck(e.attackerReference, e.reference) then
|
if followerCheck(e.attackerReference, e.reference) then
|
||||||
if config.stopDamage then
|
if config.stopDamage then
|
||||||
log("%s hit %s for %s friendly damage, nullifying", e.attackerReference.object.name,
|
log(common.logLevels.small, "%s hit %s for %s friendly damage, nullifying", e.attackerReference.object.name,
|
||||||
e.reference.object.name, e.damage)
|
e.reference.object.name, e.damage)
|
||||||
e.damage = 0
|
e.damage = 0
|
||||||
return false -- I don't know if this makes a difference or not
|
return false -- I don't know if this makes a difference or not
|
||||||
else
|
else
|
||||||
log("%s hit %s for %s friendly damage", e.attackerReference.object.name, e.reference.object.name, e.damage)
|
log(common.logLevels.small, "%s hit %s for %s friendly damage", e.attackerReference.object.name,
|
||||||
|
e.reference.object.name, e.damage)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
log(common.logLevels.big, "%s hit %s for %s damage", e.attackerReference.object.name, e.reference.object.name,
|
||||||
|
e.damage)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
eventFunctions.onSpellResist = function(e)
|
||||||
|
-- ignore non-targeted magicka or without caster
|
||||||
|
if not e.caster or not e.target then return end
|
||||||
|
-- shortcuts
|
||||||
|
local caster = e.caster
|
||||||
|
local target = e.target
|
||||||
|
local source = e.source
|
||||||
|
|
||||||
|
if followerCheck(caster, target) then
|
||||||
|
log(common.logLevels.small, "%s hit %s with friendly magicka %s", caster, target, source)
|
||||||
|
if config.stopDamage and isHarmfulSpell(e.source) then
|
||||||
|
e.resistedPercent = 100
|
||||||
|
log(common.logLevels.small, "%s spell resist vs harmful %s maxified", target, source)
|
||||||
end
|
end
|
||||||
-- uncomment this to see all damage done by everyone to everyone else
|
|
||||||
-- else
|
|
||||||
-- log("%s hit %s for %s damage", e.attackerReference.object.name, e.reference.object.name, e.damage)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- prevent combat from even happening between friendly actors
|
-- prevent combat from even happening between friendly actors
|
||||||
eventFunctions.onCombatStart = function(e)
|
eventFunctions.onCombatStart = function(e)
|
||||||
if config.stopCombat and followerCheck(e.actor, e.target) then
|
if config.stopCombat and followerCheck(e.actor, e.target) then
|
||||||
log("Friendly combat attempted, putting a stop to it!")
|
log(common.logLevels.small, "Friendly combat attempted, putting a stop to it!")
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -94,10 +127,10 @@ eventFunctions.onInfoResponse = function(e)
|
||||||
if command:match(item) or dialogue:match(item) then
|
if command:match(item) or dialogue:match(item) then
|
||||||
-- wait until game time restarts, and don't set multiple timers
|
-- wait until game time restarts, and don't set multiple timers
|
||||||
if not postDialogueTimer or postDialogueTimer.state ~= timer.active then
|
if not postDialogueTimer or postDialogueTimer.state ~= timer.active then
|
||||||
log("Found %s in dialogue, rebuilding followers", item)
|
log(common.logLevels.big, "Found %s in dialogue, rebuilding followers", item)
|
||||||
postDialogueTimer = timer.start({
|
postDialogueTimer = timer.start({
|
||||||
type = timer.simulate,
|
type = timer.simulate,
|
||||||
duration = 0.5,
|
duration = 0.25,
|
||||||
iteration = 1,
|
iteration = 1,
|
||||||
callback = function() followers = buildFollowerList() end
|
callback = function() followers = buildFollowerList() end
|
||||||
})
|
})
|
||||||
|
@ -108,13 +141,14 @@ end
|
||||||
|
|
||||||
-- rebuild followers list when player casts conjuration, in case its a summon spell
|
-- rebuild followers list when player casts conjuration, in case its a summon spell
|
||||||
-- false positives are okay because we're not doing anything destructive
|
-- false positives are okay because we're not doing anything destructive
|
||||||
|
-- doesn't work if Skill Based Magicka Progression is activated because e.expGainSchool becomes nil
|
||||||
eventFunctions.onSpellCasted = function(e)
|
eventFunctions.onSpellCasted = function(e)
|
||||||
if e.caster == tes3.player and e.expGainSchool == tes3.magicSchool.conjuration then
|
if e.caster == tes3.player and e.expGainSchool == tes3.magicSchool.conjuration then
|
||||||
log("Player cast conjuration spell %s, rebuilding followers list...", e.source.id)
|
log(common.logLevels.big, "Player cast conjuration spell %s, rebuilding followers list...", e.source.id)
|
||||||
-- wait for summon to be loaded
|
-- wait for summon to be loaded
|
||||||
timer.start({
|
timer.start({
|
||||||
type = timer.simulate,
|
type = timer.simulate,
|
||||||
duration = 1,
|
duration = 0.25,
|
||||||
iterations = 1,
|
iterations = 1,
|
||||||
callback = function() followers = buildFollowerList() end
|
callback = function() followers = buildFollowerList() end
|
||||||
})
|
})
|
||||||
|
@ -127,10 +161,10 @@ end
|
||||||
local function onInitialized()
|
local function onInitialized()
|
||||||
for name, func in pairs(eventFunctions) do
|
for name, func in pairs(eventFunctions) do
|
||||||
event.register(name:gsub("on(%u)", string.lower), func)
|
event.register(name:gsub("on(%u)", string.lower), func)
|
||||||
log("%s event registered", name)
|
log(common.logLevels.small, "%s event registered", name)
|
||||||
end
|
end
|
||||||
|
|
||||||
mwse.log("[%s] Successfully initialized%s", common.modName, mag and " with More Attentive Guards interop" or "")
|
log(common.logLevels.no, "Successfully initialized%s", mag and " with More Attentive Guards interop" or "")
|
||||||
end
|
end
|
||||||
|
|
||||||
event.register("modConfigReady", function() mwse.mcm.register(require("celediel.NoMoreFriendlyFire.mcm")) end)
|
event.register("modConfigReady", function() mwse.mcm.register(require("celediel.NoMoreFriendlyFire.mcm")) end)
|
||||||
|
|
|
@ -21,9 +21,14 @@ category:createYesNoButton({
|
||||||
variable = mwse.mcm.createTableVariable({id = "stopCombat", table = config})
|
variable = mwse.mcm.createTableVariable({id = "stopCombat", table = config})
|
||||||
})
|
})
|
||||||
|
|
||||||
category:createYesNoButton({
|
category:createDropdown({
|
||||||
label = "Debug logging",
|
label = "Debug log level",
|
||||||
variable = mwse.mcm.createTableVariable({id = "debug", table = config})
|
options = {
|
||||||
|
{label = "No", value = common.logLevels.no},
|
||||||
|
{label = "Small", value = common.logLevels.small},
|
||||||
|
{label = "Big", value = common.logLevels.big}
|
||||||
|
},
|
||||||
|
variable = mwse.mcm.createTableVariable({id = "debugLevel", table = config})
|
||||||
})
|
})
|
||||||
|
|
||||||
template:createExclusionsPage({
|
template:createExclusionsPage({
|
||||||
|
|
Loading…
Reference in a new issue