Skip to content


This event fires when a crime is witnessed by an actor.

--- @param e crimeWitnessedEventData
local function crimeWitnessedCallback(e)
event.register(tes3.event.crimeWitnessed, crimeWitnessedCallback)


This event can be filtered based on the type event data.


An event can be claimed by setting e.claim to true, or by returning false from the callback. Claiming the event prevents any lower priority callbacks from being called.

Event Data⚓︎

  • position (tes3vector3): Read-only. The position that the crime ocurred at.
  • realTimestamp (number): Read-only. The timestamp that the crime ocurred at.
  • type (string): Read-only. The type of crime that was committed. The type can be "attack", "killing", "stealing", "pickpocket", "theft", "trespass", and "werewolf". Crime "theft" is raised when picking up owned items. Crime "trespass" is raised when lockpicking, probing, using Open magic on owned doors or chests and sleeping in owned beds.
  • value (number): Read-only. The total stolen items value of the crime. Only valid for thefts. See the example below to calculate the bounty incurred on each crime type.
  • victim (tes3actor, tes3faction): Read-only. The victim of the crime, as a general actor base object or faction.
  • victimFaction (tes3faction): Read-only. The faction that the crime was against, assuming the victim is, or is in, one.
  • victimMobile (tes3mobileActor): Read-only. The mobile of the victim, if applicable, giving access to the unique victim.
  • witness (tes3reference): Read-only. The reference that witnessed the crime.
  • witnessMobile (tes3mobileActor): Read-only. The mobile actor of the reference that witnessed the crime.


Example: Getting bounty value after certain crime type

--- This function will return the bounty aquired after a certain
--- crime has been commited. To be used with crimeWitnessed event.
---@param e crimeWitnessedEventData
---@return number bountyValue
local function getBountyValue(e)
    if e.type == "theft"
    or e.type == "stealing" then
        -- Calculate the bounty value for thefts. The default value for fCrimeStealing
        -- is 1, so with vanilla settings it doesn't make a difference, but players
        -- might have mods that alter this GMST, so we need to take it into account.
        return e.value * tes3.findGMST(tes3.gmst.fCrimeStealing).value --[[@as number]]

    elseif e.type == "attack" then
        return tes3.findGMST(tes3.gmst.iCrimeAttack).value --[[@as number]]

    elseif e.type == "killing" then
        return tes3.findGMST(tes3.gmst.iCrimeKilling).value --[[@as number]]

    elseif e.type == "pickpocket" then
        return tes3.findGMST(tes3.gmst.iCrimePickPocket).value --[[@as number]]

    elseif e.type == "trespass" then
        return tes3.findGMST(tes3.gmst.iCrimeTrespass).value --[[@as number]]

    elseif e.type == "werewolf" then
        return tes3.findGMST(tes3.gmst.iWerewolfBounty).value --[[@as number]]

    return 0

---@param e crimeWitnessedEventData
local function onCrimeWitnessed(e)
    local bounty = getBountyValue(e)
    -- ...
event.register(tes3.event.crimeWitnessed, onCrimeWitnessed)