banana-mc/config/soundattract-common.toml

472 lines
76 KiB
TOML
Raw Normal View History

2025-09-13 22:31:53 +02:00
#Internal schema version for config migrations. Do not change.
[internal]
#Range: > 0
configSchemaVersion = 5
#Sound Attract Mod Configuration
[general]
#Enable debug logging for troubleshooting.
debugLogging = false
#Maximum number of sounds any single mob can track simultaneously.
#Range: 1 ~ 1000000
maxSoundsTracked = 20
#Switching threshold factor (0.01.0]. A mob will switch if newWeight > currentWeight × soundSwitchRatio.
#Example: 0.5 means a new sound beating 70% of the current weight will trigger a switch (more eager switching).
#Set closer to 1.0 for conservative switching; closer to 0.0 for very eager switching.
#Range: 0.0 ~ 1.0
soundSwitchRatio = 0.5
#A small weight bonus given to very new sounds to make mobs more likely to switch to them.
#This helps break ties and makes mobs seem more 'alert' to new threats.
#Set to 0.0 to disable.
#Range: 0.0 ~ 10.0
soundNoveltyBonusWeight = 9.5
#How long (in ticks) a sound is considered 'new' for the novelty bonus to apply.
#20 ticks = 1 second.
#Range: 1 ~ 200
soundNoveltyTimeTicks = 100
#Mob grouping and squad behavior
[groups]
#Enables smarter behavior for mobs at the edge of their hearing range (e.g. pathing closer to investigate further)
edgeMobSmartBehavior = true
#How long a sound event remains 'interesting' to a mob, in ticks (20 ticks = 1 second).
#Range: 20 ~ 1000000
soundLifetimeTicks = 1200
#How close a mob needs to get to a sound source to consider it 'reached'.
#Range: 1.0 ~ 100.0
arrivalDistance = 6.0
#Base speed multiplier for mobs moving towards a sound.
#Range: 0.1 ~ 3.0
mobMoveSpeed = 1.0
#Maximum number of mobs allowed in a group for group AI behavior. Default: 64
#Range: 1 ~ 128
maxGroupSize = 64
#Radius (in blocks) used to group mobs under a leader for group AI behavior. Default: 64.0
#Range: 1.0 ~ 128.0
leaderGroupRadius = 64.0
#Maximum distance (in blocks) for mobs to consider themselves part of a group for group behaviors. Used in AI such as FollowLeaderGoal.
#Range: 1.0 ~ 256.0
groupDistance = 128.0
#Multiplier for spacing between mob leaders in a group. Default: 1.0
#Range: 0.1 ~ 10.0
leaderSpacingMultiplier = 1.0
#Number of edge sectors for group detection (AI). Default: 4
#Range: 1 ~ 64
numEdgeSectors = 4
#Interval (in ticks) between group AI updates. Default: 200
#Range: 1 ~ 20000
groupUpdateInterval = 200
#Maximum number of group leaders tracked for AI grouping. Default: 16
#Range: 1 ~ 64
maxLeaders = 16
#Maximum number of edge mobs to select per angular sector. Default: 4
#Range: 1 ~ 64
edgeMobsPerSector = 1
#Sprint speed multiplier used when followers rally/advance during RAID and when edge mobs return to the leader.
#Range: 1.0 ~ 5.0
sprintMultiplier = 1.1
#Distance (in blocks) within which an edge mob considers itself 'returned' to its leader.
#Range: 0.5 ~ 16.0
leaderReturnArrivalDistance = 2.0
#Countdown duration (in ticks) before a RAID advances to the target. 20 ticks = 1 second.
#Range: 20 ~ 72000
raidCountdownTicks = 100
#Performance-tuning options. Adjust these to balance responsiveness and server load.
[performance]
#Delay in ticks before the first mob group computation is run after server startup.
#This helps prevent lag on world load by giving the server time to stabilize.
#20 ticks = 1 second. Default: 50 (2.5 seconds)
#Range: 0 ~ 72000
initialGroupComputationDelay = 50
#Number of background worker threads used for off-thread computations (e.g., group building).
#Increase for large servers; decrease if you observe contention.
#Range: 1 ~ 64
workerThreads = 2
#Soft per-task time budget in milliseconds for worker computations before yielding.
#Higher values allow more work per batch but can increase latency to apply results.
#Range: 1 ~ 1000
workerTaskBudgetMs = 10
#Minimum time in ticks between mob scans for new sounds. Higher values can improve performance but reduce responsiveness.
#Range: 1 ~ 1000000
scanCooldownTicks = 25
#How many ticks to add to the base scan cooldown for each active mob.
#This directly controls how much the cooldown increases with more mobs.
#A higher value means more cooldown per mob, slowing down scans more aggressively.
#Example: 0.25 means 100 mobs will add (100 * 0.15) = 15 ticks to the base cooldown.
#Range: 0.0 ~ 10.0
cooldownTicksPerMob = 0.15
#TPS below which scanCooldownTicks is dynamically increased to save performance. Set to 0 to disable.
#Range: 0.0 ~ 20.0
minTpsForScanCooldown = 15.0
#TPS above which scanCooldownTicks is dynamically decreased (down to its minimum defined value). Set to 21 to disable.
#Range: 0.0 ~ 21.0
maxTpsForScanCooldown = 19.0
#Cooldown (in ticks) per mob between async sound scoring submissions when candidates/target are unchanged.
#Range: 0 ~ 10000
soundScoringSubmitCooldownTicks = 1
#Time-to-live (in ticks) for cached async sound scoring results before considered stale.
#Range: 1 ~ 10000
asyncResultTtlTicks = 10
#Enable caching for raycast results to improve performance. Disable if experiencing issues with sound obstruction detection.
enableRaycastCache = true
#Time-to-live (in ticks) for raycast cache entries before they are considered expired.
#Range: 1 ~ 1000000
raycastCacheTtlTicks = 200
#Maximum number of entries stored in the raycast cache. Oldest entries are evicted when exceeded.
#Range: 100 ~ 1000000
raycastCacheMaxEntries = 5000
["Enchanced AI Integration"]
#Enable mobs running AttractionGoal to break blocks to reach their destination when stuck. Requires EnhancedAI to be installed for block blacklists/rules.
enableBlockBreaking = false
#Multiplier for the time a mob takes to break a block. E.g., 2.0 means it takes twice as long. Uses EnhancedAI's config value if installed and this is set to -1.
#Range: -1.0 ~ 100.0
blockBreakingTimeMultiplier = 1.5
#If true, mobs will only attempt to break blocks if they are holding a tool (e.g. pickaxe) in their offhand.
blockBreakingToolOnly = false
#If true, mobs will only break blocks if their tool is the 'proper' tool for that block (e.g., pickaxe for stone).
blockBreakingProperToolOnly = false
[Mobs]
#List of mobs that will be attracted to sounds. Example: ['minecraft:zombie', 'minecraft:skeleton'].
attractedEntities = ["minecraft:cave_spider", "minecraft:creeper", "minecraft:drowned", "minecraft:endermite", "minecraft:evoker", "minecraft:guardian", "minecraft:hoglin", "minecraft:husk", "minecraft:magma_cube", "minecraft:phantom", "minecraft:piglin", "minecraft:piglin_brute", "minecraft:pillager", "minecraft:ravager", "minecraft:shulker", "minecraft:silverfish", "minecraft:skeleton", "minecraft:slime", "minecraft:spider", "minecraft:stray", "minecraft:vex", "minecraft:vindicator", "minecraft:witch", "minecraft:wither_skeleton", "minecraft:zoglin", "minecraft:zombie", "minecraft:zombie_villager", "scguns:cog_knight", "scguns:cog_minion", "scguns:blunderer", "scguns:hive", "scguns:dissident", "scguns:hornlin", "scguns:redcoat", "scguns:cog_knight", "scguns:sky_carrier", "scguns:supply_scamp", "scguns:swarm", "scguns:zombified_hornlin", "spore:braiomil", "spore:braurei", "spore:brot", "spore:brute", "spore:busser", "spore:inf_construct", "spore:delusioner", "spore:gastgaber", "spore:gazenbreacher", "spore:griefer", "spore:hevoker", "spore:hidenburg", "spore:howitzer", "spore:howler", "spore:hvindicator", "spore:illusion", "spore:inf_drownded", "spore:inf_evoker", "spore:inf_hazmat", "spore:husk", "spore:inf_pillager", "spore:inf_player", "spore:inf_villager", "spore:inf_vindicator", "spore:inf_wanderer", "spore:inf_witch", "spore:inf_human", "spore:inquisitor", "spore:jagd", "spore:knight", "spore:lacerator", "spore:leaper", "spore:mound", "spore:nuclea", "spore:ogre", "spore:plagued", "spore:proto", "spore:reconstructor", "spore:scamper", "spore:scavenger", "spore:scent", "spore:sieger", "spore:specter", "spore:spitter", "spore:stalker", "spore:thorn", "spore:umarmed", "spore:usurper", "spore:verva", "spore:vigil", "spore:volatile", "spore:wendigo", "sculkhorde:sculk_zombie", "sculkhorde:sculk_witch", "sculkhorde:sculk_vindicator", "sculkhorde:sculk_vex", "sculkhorde:sculk_squid", "sculkhorde:sculk_spore_spewer", "sculkhorde:sculk_spitter", "sculkhorde:sculk_soul_reaper", "sculkhorde:sculk_sheep", "sculkhorde:sculk_salmon", "sculkhorde:sculk_ravager", "sculkhorde:sculk_pufferfish", "sculkhorde:sculk_phantom", "sculkhorde:sculk_mite_aggressor", "sculkhorde:sculk_mite", "sculkhorde:sculk_metamorphosis_pod", "sculkhorde:sculk_hatcher", "sculkhorde:sculk_guardian", "sculkhorde:sculk_ghast", "sculkhorde:sculk_enderman", "sculkhorde:sculk_creeper", "sculkhorde:sculk_broodling", "sculkhorde:sculk_brood_hatcher", "sculkhorde:sculk_bee_infector", "sculkhorde:sculk_bee_harvester", "sculkhorde:golem_of_wrath"]
#A list of entity resource IDs to PREVENT from receiving the attraction AI goals.
#This acts as a blacklist. Mobs on this list will never be attracted to sounds, regardless of other settings.
#Format: ['minecraft:pig', 'modid:some_other_mob']
mobBlacklist = ["minecraft:pig"]
["Sounds White List"]
#If not empty, only sound event IDs in this list will be considered by mobs.
soundIdWhitelist = ["minecraft:item.crossbow.shoot", "minecraft:item.crossbow.loading_start", "minecraft:item.crossbow.loading_middle", "minecraft:item.crossbow.loading_end", "minecraft:item.crossbow.quick_charge_1", "minecraft:item.crossbow.quick_charge_2", "minecraft:item.crossbow.quick_charge_3", "minecraft:entity.arrow.shoot", "minecraft:item.shield.block", "minecraft:block.lever.click", "minecraft:block.wooden_trapdoor.open", "minecraft:block.wooden_trapdoor.close", "minecraft:block.bamboo_wood_trapdoor.open", "minecraft:block.bamboo_wood_trapdoor.close", "minecraft:block.cherry_wood_trapdoor.open", "minecraft:block.cherry_wood_trapdoor.close", "minecraft:block.iron_trapdoor.open", "minecraft:block.iron_trapdoor.close", "minecraft:block.wooden_door.open", "minecraft:block.wooden_door.close", "minecraft:block.bamboo_wood_door.open", "minecraft:block.bamboo_wood_door.close", "minecraft:block.cherry_wood_door.open", "minecraft:block.cherry_wood_door.close", "minecraft:block.iron_door.open", "minecraft:block.iron_door.close", "minecraft:block.fence_gate.open", "minecraft:block.fence_gate.close", "minecraft:block.piston.extend", "minecraft:block.piston.contract", "minecraft:block.dispenser.dispense", "minecraft:block.dispenser.launch", "minecraft:block.anvil.land", "minecraft:block.anvil.use", "minecraft:block.anvil.destroy", "minecraft:block.sand.fall", "minecraft:block.gravel.fall", "minecraft:block.grass.break", "minecraft:block.scaffolding.break", "tacz:target_block_hit", "minecraft:entity.boat.paddle_water", "minecraft:ambient.underwater.enter", "minecraft:ambient.underwater.exit", "minecraft:block.chest.open", "minecraft:block.chest.close", "minecraft:block.barrel.open", "minecraft:block.barrel.close", "minecraft:block.ender_chest.open", "minecraft:block.ender_chest.close", "minecraft:block.shulker_box.open", "minecraft:block.shulker_box.close", "minecraft:block.bell.use", "minecraft:block.bell.resonate", "minecraft:block.furnace.fire_crackle", "minecraft:entity.generic.explode", "minecraft:entity.firework_rocket.launch", "minecraft:entity.firework_rocket.blast", "minecraft:entity.firework_rocket.large_blast", "minecraft:entity.player.hurt", "parcool:grabbing", "parcool:wallrun_and_running", "parcool:jumping", "parcool:sliding_1", "parcool:sliding_2", "parcool:sliding_3", "parcool:roll_and_dodge", "parcool:landing", "minecraft:random/anvil_land", "entity/leashknot/place1", "minecraft:entity.player.sprint", "minecraft:entity.player.jump", "minecraft:entity.player.sneak", "tacz:gun", "soundattract:voice_chat", "musketmod:musket_fire", "musketmod:blunderbuss_fire", "musketmod:pistol_fire", "cgm:item.shotgun.fire", "cgm:item.shotgun.silenced_fire", "cgm:item.shotgun.enchanted_fire", "cgm:item.shotgun.cock", "cgm:item.rifle.fire", "cgm:item.rifle.silenced_fire", "cgm:item.rifle.enchanted_fire", "cgm:item.rifle.cock", "cgm:item.pistol.fire", "cgm:item.pistol.silenced_fire", "cgm:item.pistol.enchanted_fire", "cgm:item.pistol.reload", "cgm:item.pistol.cock", "cgm:item.assault_rifle.fire", "cgm:item.assault_rifle.silenced_fire", "cgm:item.assault_rifle.enchanted_fire", "cgm:item.assault_rifle.cock", "cgm:item.grenade_launcher.fire", "cgm:item.bazooka.fire", "cgm:item.mini_gun.fire", "cgm:item.mini_gun.enchanted_fire", "cgm:item.machine_pistol.fire", "cgm:item.machine_pistol.silenced_fire", "cgm:item.machine_pistol.enchanted_fire", "cgm:item.heavy_rifle.fire", "cgm:item.heavy_rifle.silenced_fire", "cgm:item.heavy_rifle.enchanted_fire", "cgm:item.heavy_rifle.cock", "cgm:item.grenade.pin", "cgm:entity.stun_grenade.explosion", "cgm:entity.stun_grenade.ring", "scguns:item.makeshift_rifle.cock", "scguns:item.pistol.cock", "scguns:item.flamethrower.reload", "scguns:item.gauss.reload", "scguns:item.pistol.reload", "scguns:item.airgun.fire", "scguns:item.beam.fire", "scguns:item.blackpowder.fire", "scguns:item.boomstick.fire", "scguns:item.brass_pistol.fire", "scguns:item.brass_revolver.fire", "scguns:item.brass_shotgun.fire", "scguns:item.bruiser.fire", "scguns:item.combat_shotgun.fire", "scguns:item.cowboy.fire", "scguns:item.fl
#Minimum sound level (0.0-1.0) for player-emitted sounds to be considered. Higher values mean only louder sounds are tracked.
#Range: 0.0 ~ 1.0
minSoundLevelForPlayer = 0.1
#Minimum sound level (0.0-1.0) for mob-emitted sounds to be considered.
#Range: 0.0 ~ 1.0
minSoundLevelForMob = 0.15
#Default Sound Properties
[sound_defaults]
#List of default sound properties. Format: 'sound_id;range;weight'
#Example: 'minecraft:item.crossbow.shoot;16.0;4.0'
soundDefaults = ["minecraft:item.crossbow.shoot;16;4", "minecraft:item.crossbow.loading_start;6;2", "minecraft:item.crossbow.loading_middle;6;2", "minecraft:item.crossbow.loading_end;6;2", "minecraft:item.crossbow.quick_charge_1;6;2", "minecraft:item.crossbow.quick_charge_2;6;2", "minecraft:item.crossbow.quick_charge_3;6;2", "minecraft:entity.arrow.shoot;14;4", "minecraft:item.shield.block;12;3", "minecraft:block.lever.click;5;3", "minecraft:block.wooden_trapdoor.open;8;3", "minecraft:block.wooden_trapdoor.close;8;3", "minecraft:block.bamboo_wood_trapdoor.open;10;3", "minecraft:block.bamboo_wood_trapdoor.close;10;3", "minecraft:block.cherry_wood_trapdoor.open;10;3", "minecraft:block.cherry_wood_trapdoor.close;10;3", "minecraft:block.iron_trapdoor.open;15;4", "minecraft:block.iron_trapdoor.close;15;4", "minecraft:block.wooden_door.open;12;4", "minecraft:block.wooden_door.close;12;4", "minecraft:block.bamboo_wood_door.open;15;4", "minecraft:block.bamboo_wood_door.close;15;4", "minecraft:block.cherry_wood_door.open;15;4", "minecraft:block.cherry_wood_door.close;15;4", "minecraft:block.iron_door.open;20;5", "minecraft:block.iron_door.close;20;5", "minecraft:block.fence_gate.open;10;3", "minecraft:block.fence_gate.close;10;3", "minecraft:block.piston.extend;20;4", "minecraft:block.piston.contract;20;4", "minecraft:block.dispenser.dispense;12;4", "minecraft:block.dispenser.launch;12;4", "minecraft:block.anvil.land;25;5", "minecraft:block.anvil.use;25;5", "minecraft:block.anvil.destroy;25;5", "minecraft:block.sand.fall;6;3", "minecraft:block.gravel.fall;6;3", "minecraft:block.grass.break;3;2", "minecraft:block.scaffolding.break;3;2", "tacz:target_block_hit;6;3", "minecraft:entity.boat.paddle_water;8;3", "minecraft:ambient.underwater.enter;4;2", "minecraft:ambient.underwater.exit;4;2", "minecraft:block.chest.open;5;2", "minecraft:block.chest.close;5;2", "minecraft:block.barrel.open;5;2", "minecraft:block.barrel.close;5;2", "minecraft:block.ender_chest.open;6;2", "minecraft:block.ender_chest.close;6;2", "minecraft:block.shulker_box.open;6;2", "minecraft:block.shulker_box.close;6;2", "minecraft:block.bell.use;30;5", "minecraft:block.bell.resonate;15;4", "minecraft:block.furnace.fire_crackle;8;3", "minecraft:entity.generic.explode;50;7", "minecraft:entity.firework_rocket.launch;10;3", "minecraft:entity.firework_rocket.blast;20;5", "minecraft:entity.firework_rocket.large_blast;30;6", "musketmod:musket_fire;155;8", "musketmod:blunderbuss_fire;154;7", "musketmod:pistol_fire;164;5", "cgm:item.shotgun.fire;156;15", "cgm:item.shotgun.silenced_fire;131;13", "cgm:item.shotgun.enchanted_fire;156;15", "cgm:item.shotgun.cock;90;6", "cgm:item.rifle.fire;162;16", "cgm:item.rifle.silenced_fire;137;13", "cgm:item.rifle.enchanted_fire;162;16", "cgm:item.rifle.cock;90;6", "cgm:item.pistol.fire;164;16", "cgm:item.pistol.silenced_fire;139;13", "cgm:item.pistol.enchanted_fire;164;16", "cgm:item.pistol.reload;85;7", "cgm:item.pistol.cock;90;6", "cgm:item.assault_rifle.fire;159;16", "cgm:item.assault_rifle.silenced_fire;134;13", "cgm:item.assault_rifle.enchanted_fire;159;16", "cgm:item.assault_rifle.cock;90;6", "cgm:item.grenade_launcher.fire;172;17", "cgm:item.bazooka.fire;184;17", "cgm:item.mini_gun.fire;180;17", "cgm:item.mini_gun.enchanted_fire;180;17", "cgm:item.machine_pistol.fire;160;16", "cgm:item.machine_pistol.silenced_fire;135;13", "cgm:item.machine_pistol.enchanted_fire;160;16", "cgm:item.heavy_rifle.fire;165;16", "cgm:item.heavy_rifle.silenced_fire;140;13", "cgm:item.heavy_rifle.enchanted_fire;165;16", "cgm:item.heavy_rifle.cock;90;6", "cgm:item.grenade.pin;72;6", "cgm:entity.stun_grenade.explosion;175;18", "cgm:entity.stun_grenade.ring;104;10", "scguns:item.makeshift_rifle.cock;10;1.0", "scguns:item.pistol.cock;5;0.5", "scguns:item.flamethrower.reload;10;1.0", "scguns:item.gauss.reload;25;2.5", "scguns:item.pistol.reload;10;1.0", "scguns:item.airgun.fire;80;8.0", "scguns:item.beam.fire;100;10.0", "scguns:item.blackpowder.fire;115;11.5", "scguns:item.boomstick.fire;120;12.0", "scguns:item.brass_pistol.fire;105;10.5", "scguns:item.brass_re
#====================================================================
# Sound Attract Mod - Stealth & Detection Configuration
#====================================================================
[sound_attract_main]
#--- Field of View Settings ---
[sound_attract_main.fov]
#The default horizontal Field of View for all mobs not in the override list.
#Represents the width of the vision cone in degrees.
#Range: 0.0 ~ 360.0
defaultHorizontalFov = 200.0
#The default vertical Field of View for all mobs not in the override list.
#Represents the height of the vision cone in degrees.
#Range: 0.0 ~ 360.0
defaultVerticalFov = 135.0
#A list of custom FOV (Field of View) overrides for specific mobs.
#This gives you direct control over the vision cone for any mob.
#Format: "modid:mob_id, horizontal_fov, vertical_fov"
#SPECIAL VALUE: A horizontal FOV of 360 or more grants the mob 360-degree vision (omni-directional).
#Any mob NOT in this list will use the default FOV (200 horizontal, 135 vertical).
customFovOverrides = ["minecraft:spider, 360.0, 360.0", "minecraft:cave_spider, 360.0, 360.0", "minecraft:phantom, 200.0, 280.0", "minecraft:vex, 200.0, 280.0", "minecraft:allay, 200.0, 280.0", "minecraft:bat, 20.0, 20.0", "minecraft:parrot, 200.0, 280.0", "minecraft:ghast, 200.0, 280.0", "minecraft:blaze, 200.0, 280.0", "minecraft:axolotl, 270.0, 90.0", "minecraft:camel, 270.0, 90.0", "minecraft:chicken, 270.0, 90.0", "minecraft:cow, 270.0, 90.0", "minecraft:donkey, 270.0, 90.0", "minecraft:goat, 270.0, 90.0", "minecraft:horse, 270.0, 90.0", "minecraft:mule, 270.0, 90.0", "minecraft:mooshroom, 270.0, 90.0", "minecraft:panda, 270.0, 90.0", "minecraft:pig, 270.0, 90.0", "minecraft:rabbit, 270.0, 90.0", "minecraft:sheep, 270.0, 90.0", "minecraft:sniffer, 270.0, 90.0", "minecraft:strider, 270.0, 90.0", "minecraft:turtle, 270.0, 90.0", "minecraft:villager, 270.0, 90.0", "minecraft:wandering_trader, 270.0, 90.0", "minecraft:slime, 270.0, 120.0", "minecraft:magma_cube, 270.0, 120.0", "minecraft:cod, 300.0, 100.0", "minecraft:pufferfish, 300.0, 100.0", "minecraft:salmon, 300.0, 100.0", "minecraft:squid, 300.0, 100.0", "minecraft:glow_squid, 300.0, 100.0", "minecraft:tadpole, 300.0, 100.0", "minecraft:tropical_fish, 300.0, 100.0", "minecraft:cat, 140.0, 140.0", "minecraft:ocelot, 140.0, 140.0", "minecraft:wolf, 140.0, 140.0", "minecraft:polar_bear, 140.0, 140.0", "minecraft:fox, 140.0, 140.0", "minecraft:frog, 140.0, 140.0", "minecraft:zombie, 200.0, 135.0", "minecraft:husk, 200.0, 135.0", "minecraft:drowned, 200.0, 135.0", "minecraft:skeleton, 200.0, 135.0", "minecraft:stray, 200.0, 135.0", "minecraft:pillager, 200.0, 135.0", "minecraft:vindicator, 200.0, 135.0", "minecraft:evoker, 200.0, 135.0", "minecraft:witch, 200.0, 135.0", "minecraft:piglin, 200.0, 135.0", "minecraft:piglin_brute, 200.0, 135.0", "minecraft:iron_golem, 200.0, 135.0", "minecraft:creeper, 90.0, 90.0", "minecraft:enderman, 180.0, 240.0", "minecraft:guardian, 320.0, 180.0", "minecraft:elder_guardian, 320.0, 180.0", "minecraft:ravager, 160.0, 100.0", "minecraft:hoglin, 160.0, 100.0", "minecraft:zoglin, 160.0, 100.0", "minecraft:shulker, 270.0, 45.0"]
#A list of mobs that will COMPLETELY IGNORE the FOV system.
#Use this for bosses or mobs from other mods with special AI that might break.
#Format: "modid:mob_id"
#Note: Certain vanilla mobs like the Warden are always excluded for stability and cannot be removed.
fovExclusionList = ["minecraft:warden"]
#Blocks in this allowlist are treated as see-through for line-of-sight checks (e.g., modded glass).
#Format: ['modid:block_id']
nonBlockingVisionAllowList = []
#General Stealth System Settings
[sound_attract_main.general_stealth_settings]
#Master switch for all custom stealth mechanics. If false, mobs use vanilla detection (modified only by maxStealthDetectionRange if set).
enableStealthMechanics = true
#How often (in ticks) the server checks ongoing stealth situations (e.g., for grace period). Lower is more responsive but higher performance cost.
#20 ticks = 1 second.
#Range: 5 ~ 100
stealthCheckInterval = 40
#How long (in ticks) a mob will keep targeting a player after losing direct detection (due to stealth) before giving up.
#Set to 0 for no grace period (immediate de-aggro if stealth conditions met).
#Range: 0 ~ 200
stealthGracePeriodTicks = 100
#Base detection ranges for players based on their stance.
#These are modified by all other factors (light, camo, etc.).
[sound_attract_main.player_stance_detection_ranges]
#Base detection range (in blocks) when a player is standing.
#Range: 0.0 ~ 128.0
standingDetectionRangePlayer = 48.0
#Base detection range (in blocks) when a player is sneaking (crouching).
#Range: 0.0 ~ 128.0
sneakingDetectionRangePlayer = 20.0
#Base detection range (in blocks) when a player is crawling (e.g., in a 1-block high gap).
#Range: 0.0 ~ 128.0
crawlingDetectionRangePlayer = 4.0
#How environmental conditions affect stealth.
[sound_attract_main.environmental_factors]
#Light level effects on detection.
[sound_attract_main.environmental_factors.light_level]
#The light level (0-15) considered neutral (no bonus or penalty to detection).
#Range: 0 ~ 15
neutralLightLevel = 7
#Modifier strength per point of light difference from 'neutralLightLevel'. Higher = more impact.
#Positive values increase detection in bright light / decrease in dark. Negative values would invert this.
#Range: 0.0 ~ 0.5
lightLevelSensitivity = 0.3
#Minimum multiplier that can be applied due to light levels (e.g., 0.2 for max 80% range reduction in total darkness).
#Range: 0.01 ~ 1.0
minLightFactor = 0.2
#Maximum multiplier that can be applied due to light levels (e.g., 2.0 for max 100% range increase in full brightness).
#Range: 1.0 ~ 5.0
maxLightFactor = 3.0
#Horizontal radius (blocks) around player to sample for average/effective light level.
#Range: 0 ~ 5
lightSampleRadiusHorizontal = 2
#Vertical radius (blocks) around player to sample for average/effective light level.
#Range: 0 ~ 3
lightSampleRadiusVertical = 1
#Weather effects on detection.
[sound_attract_main.environmental_factors.weather]
#Detection range multiplier when raining (e.g., 0.8 for 20% range reduction).
#Range: 0.1 ~ 1.0
rainStealthFactor = 0.8
#Detection range multiplier when thundering (overrides rain factor if active).
#Range: 0.1 ~ 1.0
thunderStealthFactor = 0.6
#How player actions affect their detectability.
[sound_attract_main.player_actions]
#Movement effects on detection.
[sound_attract_main.player_actions.movement]
#Detection range multiplier when player is moving (not sneaking/crawling). >1.0 means easier to detect.
#Set to 1.0 for no penalty.
#Range: 1.0 ~ 3.0
movementStealthPenalty = 1.2
#Detection range multiplier if player is NOT moving above threshold (e.g. 0.8 for 20% harder to detect).
#Set to 1.0 for no bonus when stationary. Applies unless sprinting/crawling.
#Range: 0.1 ~ 1.0
stationaryStealthBonusFactor = 0.8
#Squared distance threshold to consider a player as 'moving' per stealth check interval.
#Range: 1.0E-4 ~ 0.1
movementThreshold = 0.003
#Invisibility potion effect.
[sound_attract_main.player_actions.invisibility]
#Detection range multiplier when player has Invisibility effect (e.g., 0.1 for 90% range reduction).
#Range: 0.0 ~ 1.0
invisibilityStealthFactor = 0.1
#Settings for item, armor and environmental camouflage.
[sound_attract_main.camouflage_system]
#Master switch for all camouflage effects (item-based and environmental).
enableCamouflage = true
#Enable to penalize players for holding items in their hands, making them more detectable.
enableHeldItemPenalty = true
#Factor by which detection range is multiplied if the player is holding any item in main or off-hand (e.g., 1.1 = 10% more detectable per occupied hand). This is applied before enchantment penalties on held items.
#Range: 1.0 ~ 2.0
heldItemPenaltyFactor = 1.1
#Enable to penalize players for wearing enchanted armor or holding enchanted items.
enableEnchantmentPenalty = true
#Factor by which detection range is multiplied for *each* piece of visibly enchanted armor (not concealed) (e.g., 1.05 = 5% more detectable per piece).
#Range: 1.0 ~ 2.0
armorEnchantmentPenaltyFactor = 1.15
#Factor by which detection range is multiplied if a visibly enchanted item (not concealed) is held in main or off-hand (e.g., 1.1 = 10% more detectable per enchanted held item).
#Range: 1.0 ~ 2.0
heldItemEnchantmentPenaltyFactor = 1.15
#Camouflage provided by wearing specific armor items.
[sound_attract_main.camouflage_system.item_camouflage]
#List of item IDs (e.g., 'modid:godly_helmet') basically a set that will work everywhere.
camouflageArmorItems = []
#If true, 'fullArmorStealthBonus' applies only if wearing a complete set of 4 armor pieces, ALL of which are from 'camouflageArmorItems'.
#If false, benefits are gained per piece (see per-slot effectiveness) or via 'fullArmorStealthBonus' if a full set of *any* 4 listed items is worn.
requireFullSetForCamouflageBonus = false
#Stealth effectiveness factor (0.0 to 1.0) if wearing a 'full set' of listed camouflage items.
#Final range *= (1.0 - bonus). E.g., 0.2 = 20% detection range reduction.
#Range: 0.0 ~ 1.0
fullArmorStealthBonus = 0.85
#Effectiveness of a listed helmet if per-piece bonuses apply.
#Range: 0.0 ~ 1.0
helmetCamouflageEffectiveness = 0.15
#Effectiveness of a listed chestplate if per-piece bonuses apply.
#Range: 0.0 ~ 1.0
chestplateCamouflageEffectiveness = 0.3
#Effectiveness of a listed leggings if per-piece bonuses apply.
#Range: 0.0 ~ 1.0
leggingsCamouflageEffectiveness = 0.25
#Effectiveness of a listed boots if per-piece bonuses apply.
#Range: 0.0 ~ 1.0
bootsCamouflageEffectiveness = 0.15
#Maximum total effectiveness (0.0 to 1.0) from all item camouflage sources (full set or sum of pieces). Prevents range from becoming too small.
#Range: 0.0 ~ 0.99
maxCamouflageEffectivenessCap = 0.85
#If 'requireFullSetForCamouflageBonus' is TRUE, but player isn't wearing a full set of listed items, should per-piece bonuses still apply for the listed items they ARE wearing?
allowPartialBonusIfFullSetRequired = true
#Camouflage based on matching armor color to the surrounding environment.
[sound_attract_main.camouflage_system.environmental_camouflage]
#Enable camouflage based on armor color matching the environment.
enableEnvironmentalCamouflage = true
#If true, significantly mismatched armor/environment colors will INCREASE detection range.
enableEnvironmentalMismatchPenalty = true
#Maximum effectiveness factor (0.0 to 1.0) if armor color perfectly matches environment.
#Final range *= (1.0 - effectiveness).
#Range: 0.0 ~ 1.0
environmentalCamouflageMaxEffectiveness = 0.7
#Tolerance for color matching (sum of absolute RGB differences). Lower = stricter match needed.
#Range: 0 ~ 765
environmentalCamouflageColorMatchThreshold = 90
#Detection range multiplier if armor color SIGNIFICANTLY mismatches the environment (e.g., 1.5 for 50% INCREASED range).
#Applies if color difference exceeds 'environmentalMismatchThreshold'. Set to 1.0 to disable penalty.
#Range: 1.0 ~ 3.0
environmentalMismatchPenaltyFactor = 1.3
#Color difference threshold beyond which the 'environmentalMismatchPenaltyFactor' applies.
#Should be greater than 'environmentalCamouflageColorMatchThreshold'. E.g., if match threshold is 90, mismatch could be 200.
#Range: 0 ~ 765
environmentalMismatchThreshold = 100
#If true, only dyed leather armor contributes its color. If false, uses 'customArmorColors' for non-leather/undyed items.
environmentalCamouflageOnlyDyedLeather = false
#Map of item ID to average hex color (e.g., 'minecraft:iron_chestplate;#A0A0A0').
#Used for environmental camouflage if 'environmentalCamouflageOnlyDyedLeather' is false.
customArmorColors = ["minecraft:leather_helmet;#804F27", "minecraft:leather_chestplate;#804F27", "minecraft:leather_leggings;#804F27", "minecraft:leather_boots;#804F27", "minecraft:chainmail_helmet;#58585A", "minecraft:chainmail_chestplate;#58585A", "minecraft:chainmail_leggings;#58585A", "minecraft:chainmail_boots;#58585A", "minecraft:iron_helmet;#CACACA", "minecraft:iron_chestplate;#CACACA", "minecraft:iron_leggings;#CACACA", "minecraft:iron_boots;#CACACA", "minecraft:golden_helmet;#F5E54C", "minecraft:golden_chestplate;#F5E54C", "minecraft:golden_leggings;#F5E54C", "minecraft:golden_boots;#F5E54C", "minecraft:diamond_helmet;#39D5CD", "minecraft:diamond_chestplate;#39D5CD", "minecraft:diamond_leggings;#39D5CD", "minecraft:diamond_boots;#39D5CD", "minecraft:netherite_helmet;#403B3B", "minecraft:netherite_chestplate;#403B3B", "minecraft:netherite_leggings;#403B3B", "minecraft:netherite_boots;#403B3B", "minecraft:turtle_helmet;#7B8834"]
#Radius (blocks) around player to sample for average environmental color.
#Range: 0 ~ 3
envColorSampleRadius = 1
#Starting Y-offset relative to player pos for env color sampling (e.g., 0 for player's feet level).
#Range: -2 ~ 2
envColorSampleYOffsetStart = 0
#Ending Y-offset relative to player pos for env color sampling (e.g., -1 for blocks at feet and one below). Must be <= YOffsetStart.
#Range: -2 ~ 2
envColorSampleYOffsetEnd = -1
#Absolute min/max detection ranges after all modifiers are applied.
[sound_attract_main.detection_range_limits]
#The absolute minimum detection range (in blocks). Player cannot be harder to detect than this, regardless of modifiers.
#Set > 0 to prevent mobs from being completely blind unless intended by other mechanics.
#Range: 0.0 ~ 64.0
minStealthDetectionRange = 0.5
#The absolute maximum detection range (in blocks). Player cannot be easier to detect than this.
#Also used as default range if 'enableStealthMechanics' is false.
#Range: 1.0 ~ 256.0
maxStealthDetectionRange = 64.0
#Tacz Integration Configuration
[tacz]
#Enable Tacz gun integration
enableTaczIntegration = true
#Tacz reload sound range (fallback, calculated as shootDb/20.0 for known guns)
#Range: 1.0 ~ 128.0
taczReloadRange = 9.0
#Tacz reload sound weight (fallback, calculated as (shootDb/10.0)/2.0 for known guns)
#Range: 0.0 ~ 10.0
taczReloadWeight = 1.0
#Tacz shoot sound range (fallback, calculated as db for known guns)
#Range: 1.0 ~ 256.0
taczShootRange = 140.0
#Tacz shoot sound weight (fallback, calculated as db/10.0 for known guns)
#Range: 0.0 ~ 10.0
taczShootWeight = 10.0
#Tacz gun shoot decibels. Format: 'modid:item;decibels'. Example: 'tacz:akm;120.0'
taczGunShootDecibels = ["suffuse:aks74u;157.0", "suffuse:python;155.0", "suffuse:tec9;160.0", "suffuse:tt33;158.0", "tacz:deagle_golder;164.0", "suffuse:tti2011;158.0", "tacz:m1911;157.0", "suffuse:trapper50cal;172.0", "tacz:deagle;164.0", "tacz:cz75;157.0", "tacz:p320;157.0", "suffuse:viper2011;158.0", "tacz:m700;160.0", "tacz:m107;171.0", "tacz:m95;172.0", "tacz:ai_awp;170.0", "suffuse:aw50;173.0", "suffuse:gm6;172.0", "suffuse:m200;173.0", "suffuse:xm7;165.0", "suffuse:qbu191;164.0", "suffuse:n4;161.0", "suffuse:qbz951;160.0", "suffuse:ash12;165.0", "suffuse:qbz951s;160.0", "suffuse:qbz192;159.0", "suffuse:an94;161.0", "tacz:sks_tactical;159.0", "tacz:ak47;159.0", "tacz:type_81;158.0", "tacz:qbz_95;160.0", "tacz:hk416d;161.0", "tacz:m4a1;159.0", "tacz:m16a1;159.0", "tacz:hk_g3;161.0", "tacz:m16a4;159.0", "tacz:mk14;162.0", "tacz:scar_l;161.0", "tacz:scar_h;162.0", "tacz:aug;160.0", "tacz:db_short;165.0", "tacz:db_long;166.0", "tacz:m870;165.0", "tacz:aa12;161.0", "tacz:ump45;158.0", "tacz:hk_mp5a5;158.0", "tacz:uzi;157.0", "suffuse:pp19;157.0", "tacz:vector45;158.0", "tacz:p90;156.0", "tacz:rpg7;180.0", "tacz:m320;172.0", "suffuse:m79;172.0", "suffuse:pkp;165.0", "tacz:m249;165.0", "tacz:rpk;164.0", "tacz:g36k;135.0", "tacz:spr15hb;140.0", "tacz:b93r;125.0", "tacz:glock_17;125.0"]
#Tacz attachment sound reduction. Format: 'modid:item;reduction'. Example: 'tacz:suppressor;15.0'
taczAttachmentReductions = ["tacz:muzzle_brake_cthulhu;-3.0", "tacz:muzzle_brake_pioneer;-3.0", "tacz:muzzle_brake_cyclone_d2;-3.0", "tacz:muzzle_brake_trex;-5.0", "tacz:muzzle_silencer_mirage;35.0", "tacz:muzzle_silencer_vulture;45.0", "tacz:muzzle_silencer_knight_qd;40.0", "tacz:muzzle_silencer_ursus;30.0", "tacz:muzzle_silencer_ptilopsis;30.0", "tacz:muzzle_silencer_phantom_s1;30.0", "tacz:muzzle_compensator_trident;-2.0", "tacz:deagle_golden_long_barrel;20.0"]
#Default reduction value for Tacz attachments if the attachment id is not in the list.
#Range: -300.0 ~ 300.0
taczAttachmentReductionDefault = 20.0
#The base visual detection range (in blocks) when a gunshot occurs, before muzzle attachments are factored in.
#Range: 16.0 ~ 512.0
gunshotBaseDetectionRange = 128.0
#How long (in ticks) the increased detection from a gunshot lasts. 20 ticks = 1 second.
#Range: 1 ~ 200
gunshotDetectionDurationTicks = 60
#Tacz attachment VISUAL FLASH reduction. A positive value reduces flash range, a negative value INCREASES it (e.g., for muzzle brakes)., Format: 'modid:item;reduction_amount'
taczMuzzleFlashReductions = ["tacz:muzzle_silencer_mirage;100.0", "tacz:muzzle_silencer_vulture;110.0", "tacz:muzzle_silencer_knight_qd;105.0", "tacz:muzzle_silencer_ursus;90.0", "tacz:muzzle_silencer_ptilopsis;90.0", "tacz:muzzle_silencer_phantom_s1;90.0", "tacz:muzzle_brake_cthulhu;-10.0", "tacz:muzzle_brake_pioneer;-10.0", "tacz:muzzle_brake_cyclone_d2;-10.0", "tacz:muzzle_brake_trex;-15.0", "tacz:muzzle_compensator_trident;-5.0"]
["Simple VC"]
#Enable Simple Voice Chat (SVC) integration.
#When enabled, voice chat frames generate a dynamic sound whose range scales with the audio's peak level (dBFS).
#Optional: Only takes effect if SVC is installed.
enableVoiceChatIntegration = true
#Base range used when the player is whispering in SVC (before applying dB multiplier).
#Range: 1 ~ 64
voiceChatWhisperRange = 16
#Base range used for normal speaking in SVC (before applying dB multiplier).
#Range: 1 ~ 128
voiceChatNormalRange = 32
#Weight assigned to the generated SVC sound event.
#Range: 0.0 ~ 10.0
voiceChatWeight = 9.0
#Mapping from normalized dB thresholds to range multipliers for SVC.
#Normalized dB is in [0..127], where 0 = silence and 127 = max peak (0 dBFS).
#Each entry format: 'threshold:multiplier'. Entries are evaluated from highest threshold to lowest.
#Defaults replicate the built-in behavior: >=50 -> 1.0, >=30 -> 0.7, >=10 -> 0.3.
voiceChatDbThresholdMap = ["110:2.0", "90:1.8", "75:1.5", "50:1.0", "30:0.7", "10:0.3", "0:0.05"]
#Muffling settings for different block types.
[muffling]
#Enable/disable block muffling effects on sound range/weight.
enableBlockMuffling = true
#Maximum number of blocks to check for muffling between sound source and mob. Higher values are more accurate but more performance intensive.
#Range: 8 ~ 256
maxMufflingBlocksToCheck = 16
#Sound muffling factor for wool blocks. Default: 0.15
#Range: 0.0 ~ 1.0
mufflingFactorWool = 0.15
#Sound muffling factor for solid blocks. Default: 0.35
#Range: 0.0 ~ 1.0
mufflingFactorSolid = 0.35
#Sound muffling factor for non-solid blocks. Default: 0.7
#Range: 0.0 ~ 1.0
mufflingFactorNonSolid = 0.7
#Sound muffling factor for thin blocks (e.g., carpets, panes). Default: 0.9
#Range: 0.0 ~ 1.0
mufflingFactorThin = 0.9
#Sound muffling factor for liquid blocks. Default: 0.5
#Range: 0.0 ~ 1.0
mufflingFactorLiquid = 0.5
#Sound muffling factor for air blocks. Default: 1.0
#Range: 0.0 ~ 1.0
mufflingFactorAir = 1.0
#List of custom wool block IDs for sound muffling. Format: 'modid:blockid'. Default: empty list.
customWoolBlocks = []
#List of custom solid block IDs for sound muffling. Format: 'modid:blockid'. Default: empty list.
customSolidBlocks = []
#List of custom non-solid block IDs for sound muffling. Format: 'modid:blockid'. Default: empty list.
customNonSolidBlocks = []
#List of custom thin block IDs for sound muffling. Format: 'modid:blockid'. Default: empty list.
customThinBlocks = []
#List of custom liquid block IDs for sound muffling. Format: 'modid:blockid'. Default: empty list.
customLiquidBlocks = []
#List of custom air block IDs for sound muffling. Format: 'modid:blockid'. Default: empty list.
customAirBlocks = []
[profiles]
#List of special mob profiles. Each profile is a string with 5 parts separated by ';'.
#Format: profileName;mobId;nbtMatcher;soundOverridesString;detectionOverridesString
#- profileName: A unique name (e.g., 'AlphaZombie').
#- mobId: Mob's resource location (e.g., 'minecraft:zombie'). Make sure it is in attractedEntities. Use '*' or empty to match any mob if NBT is specific.
#- nbtMatcher: Any compound NBT (e.g., '{IsAlpha:1b}'). Leave empty for no NBT matching.
#- soundOverrides: Comma-separated 'soundId:range:weight' (e.g., 'minecraft:entity.player.hurt:30.0:2.0,minecraft:block.chest.open:25.0:1.5'). Leave empty for no overrides, and make sure the sound IDs are in the soundIdWhitelist.
#- detectionOverrides: Comma-separated 'stanceName:value' (e.g., 'standing:50.0,sneaking:25.0'). Stances: standing, sneaking, crawling. Leave empty for no overrides.
#Example: AlphaZombie;minecraft:zombie;{IsAlpha:1b};minecraft:entity.player.hurt:30.0:2.0;standing:50.0,sneaking:25.0
#To add more profiles, just add more strings to the list.
specialMobProfilesRaw = ["GreedyGoblin;minecraft:piglin;;minecraft:block.chest.open:30.0:2.5,minecraft:entity.player.death:50.0:3.0;standing:40.0,sneaking:20.0,crawling:10.0", "SmartZombie;minecraft:zombie;{IsAlpha:1b};minecraft:entity.player.hurt:30.0:2.0;standing:80.0,sneaking:45.0,crawling:15.0", "InsaneVillager;minecraft:villager;;minecraft:wooden_door.open:25.0:1.5,minecraft:block.barrel.open:20.0:1.0;"]
#List of special player profiles. Each string has 3 parts separated by ';'.
#Format: profileName;nbtMatcher;detectionOverridesString
#- profileName: A unique name (e.g., 'FelineOrigin').
#- nbtMatcher: Any compound NBT to match on the player (capabilities included). Use valid SNBT. Keys containing ':' must be quoted (e.g., '{"ForgeCaps":{"origins:origins":{"Origins":{"origins:origin":"origins:feline"}}}}'). Leave empty to match all players.
#- detectionOverridesString: Comma-separated 'stanceName:value' (e.g., 'standing:40.0,sneaking:20.0,crawling:10.0'). Valid stances: standing, sneaking, crawling.
#Example: FelineOrigin;{"ForgeCaps":{"origins:origins":{"Origins":{"origins:origin":"origins:feline"}}}};standing:24.0,sneaking:10.0,crawling:3.0
specialPlayerProfilesRaw = ["FelineOrigin;{\"ForgeCaps\":{\"origins:origins\":{\"Origins\":{\"origins:origin\":\"origins:feline\"}}}};standing:24.0,sneaking:10.0,crawling:3.0", "DinosaurHatched;{\"ForgeCaps\":{\"fossil:player\":{\"HatchedDinosaur\":1b}}};standing:50.0"]