FILES ----- debug.macros rendering.config [NEW] achievements\events\bountyquest.event [NEW] achievements\events\killmonster.event [NEW] achievements\events\useitem.event behaviors\monsters\modular\actions\charge.behavior celestial\system\terrestrial\horizon\masks\ocean\22_l.png dungeons\microdungeons\bounty\vault_3.json interface\scripted\bountyboard\bountyboardgui.lua interface\statuses\electric.png items\active\weapons\ranged\unrand\neolaserlauncher\neolaserlauncher.activeitem items\active\weapons\ranged\unrand\neopistol\neopistol.activeitem items\active\weapons\ranged\unrand\neoshotgun\neoshotgun.activeitem items\active\weapons\ranged\unrand\neotommygun\neotommygun.activeitem items\active\weapons\ranged\unrand\neouzi\neouzi.activeitem items\generic\other\orangestim.consumable monsters\monster.lua monsters\boss\apeboss\apeboss.monstertype monsters\boss\crystalboss\crystalboss.monstertype monsters\boss\cultistboss\cultistboss.monstertype monsters\boss\dragonboss\dragonboss.monstertype monsters\boss\eyeboss\eyeboss.monstertype monsters\boss\guardianboss\electricguardianboss.monstertype monsters\boss\guardianboss\fireguardianboss.monstertype monsters\boss\guardianboss\iceguardianboss.monstertype monsters\boss\guardianboss\poisonguardianboss.monstertype monsters\boss\kluexboss\kluexboss.monstertype monsters\boss\robotboss\robotboss.monstertype monsters\boss\spiderboss\spiderboss.monstertype monsters\boss\swansong\swansong.monstertype monsters\crawlers\crustoise\icecrustoise.monstertype monsters\crawlers\iguarmor\iceiguarmor.monstertype monsters\crawlers\oculob\fireoculob.monstertype monsters\crawlers\pulpin\poisonpulpin.monstertype monsters\crawlers\snaggler\icesnaggler.monstertype monsters\crawlers\tintic\electrictintic.monstertype monsters\flyers\agrobat\iceagrobat.monstertype monsters\flyers\batong\poisonbatong.monstertype monsters\flyers\bobfae\poisonbobfae.monstertype monsters\flyers\monopus\firemonopus.monstertype monsters\flyers\paratail\poisonparatail.monstertype monsters\flyers\pteropod\firepteropod.monstertype monsters\flyers\scandroid\cultistscandroid.monstertype monsters\ghosts\gosmet\firegosmet.monstertype monsters\ghosts\ignome\electricignome.monstertype monsters\ghosts\lumoth\firelumoth.monstertype monsters\ghosts\pyromantle\poisonpyromantle.monstertype monsters\ghosts\skimbus\electricskimbus.monstertype monsters\ghosts\spookit\firespookit.monstertype monsters\ghosts\squeem\firesqueem.monstertype monsters\ghosts\wisper\firewisper.monstertype monsters\space\heavydrone\heavydrone.lua monsters\walkers\adultpoptop\albinoadultpoptop.monstertype monsters\walkers\anglure\electricanglure.monstertype monsters\walkers\bobot\firebobot.monstertype monsters\walkers\bulbop\poisonbulbop.monstertype monsters\walkers\capricoat\electriccapricoat.monstertype monsters\walkers\crabcano\icecrabcano.monstertype monsters\walkers\crutter\electriccrutter.monstertype monsters\walkers\fennix\icefennix.monstertype monsters\walkers\gleap\firegleap.monstertype monsters\walkers\hemogoblin\electrichemogoblin.monstertype monsters\walkers\hypnare\icehypnare.monstertype monsters\walkers\lilodon\firelilodon.monstertype monsters\walkers\mandraflora\poisonmandraflora.monstertype monsters\walkers\miasmop\icemiasmop.monstertype monsters\walkers\narfin\icenarfin.monstertype monsters\walkers\nutmidge\poisonnutmidge.monstertype monsters\walkers\oogler\fireoogler.monstertype monsters\walkers\orbide\iceorbide.monstertype monsters\walkers\peblit\icepeblit.monstertype monsters\walkers\petricub\electricpetricub.monstertype monsters\walkers\pipkin\poisonpipkin.monstertype monsters\walkers\poptop\albinopoptop.monstertype monsters\walkers\quagmutt\electricquagmutt.monstertype monsters\walkers\ringram\iceringram.monstertype monsters\walkers\scaveran\poisonscaveran.monstertype monsters\walkers\smoglin\poisonsmoglin.monstertype monsters\walkers\snaunt\electricsnaunt.monstertype monsters\walkers\snuffish\poisonsnuffish.monstertype monsters\walkers\sporgus\poisonsporgus.monstertype monsters\walkers\taroni\firetaroni.monstertype monsters\walkers\toumingo\firetoumingo.monstertype monsters\walkers\trictus\poisontrictus.monstertype monsters\walkers\voltip\electricvoltip.monstertype monsters\walkers\yokat\electricyokat.monstertype npcs\tenants\friendlyguardtenant.npctype objects\protectorate\objects\protectoratedormtoiletroll\protectoratedormtoiletroll.object quests\bounty\assignment.config quests\bounty\bountyassignment.lua quests\bounty\bountyassignment.questtemplate quests\bounty\stages.lua scripts\bountygeneration.lua scripts\player\playerbounty.lua stats\player_primary.lua stats\effects\biomeairless\biomeairless.lua tiles\materials\asphalt.material vehicles\boat\boat.lua vehicles\sportscar\sportscar.animation DIFFS ----- debug.macros 10a11,12 > "/startquest '\"outpostclue\"'", > "/completequest outpostclue", rendering.config 4a5,6 > "preloadTextureChance" : 0.05, > behaviors\monsters\modular\actions\charge.behavior 150,159c150,179 < "title": "vecMultiply", < "type": "action", < "name": "vecMultiply", < "parameters": { < "first": {"key": ""}, < "second": {"value": ["facingDirection", 1]} < }, < "output": { < "vector": "aimDirection" < } --- > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "entityDirection", > "type": "action", > "name": "entityDirection", > "parameters": { > "entity": {"key": "self"}, > "target": {"key": "target"} > }, > "output": { > "direction": "targetDirection" > } > }, > { > "title": "vecMultiply", > "type": "action", > "name": "vecMultiply", > "parameters": { > "first": {"key": ""}, > "second": {"value": ["targetDirection", 1]} > }, > "output": { > "vector": "aimDirection" > } > } > ] dungeons\microdungeons\bounty\vault_3.json [TMX file differences are left out for huge size.] interface\scripted\bountyboard\bountyboardgui.lua 339c339,346 < table.insert(newEventDescriptions, {p.target.name, be.status, be.money or 0, be.rank or 0, be.credits or 0}) --- > table.insert(newEventDescriptions, { > name = p.target.name, > targetType = p.target.type, > status = be.status, > money = be.money or 0, > rank = be.rank or 0, > credits = be.credits or 0 > }) 920,924c927,933 < nameStr = string.format("%s%s\n", nameStr, e[1]) < statusStr = string.format("%s%s\n", statusStr, e[2]) < moneyStr = string.format(e[3] > 0 and "%s+%d\n" or "%s%d\n", moneyStr, math.floor(e[3])) < rankStr = string.format(e[4] > 0 and "%s+%d\n" or "%s%d\n", rankStr, math.floor(e[4])) < creditsStr = string.format(e[5] > 0 and "%s+%d\n" or "%s%d\n", creditsStr, math.floor(e[5])) --- > nameStr = string.format("%s%s\n", nameStr, e.name) > statusStr = string.format("%s%s\n", statusStr, e.status) > moneyStr = string.format(e.money > 0 and "%s+%d\n" or "%s%d\n", moneyStr, math.floor(e.money)) > rankStr = string.format(e.rank > 0 and "%s+%d\n" or "%s%d\n", rankStr, math.floor(e.rank)) > creditsStr = string.format(e.credits > 0 and "%s+%d\n" or "%s%d\n", creditsStr, math.floor(e.credits)) > > player.recordEvent("bountyQuest", {targetType = e.targetType}) items\active\weapons\ranged\unrand\neolaserlauncher\neolaserlauncher.activeitem 9c9 < "level" : 6, --- > "level" : 7, items\active\weapons\ranged\unrand\neopistol\neopistol.activeitem 12c12,13 < "level" : 2, --- > > "fixedLevel" : false, items\active\weapons\ranged\unrand\neoshotgun\neoshotgun.activeitem 12c12,13 < "level" : 2, --- > > "fixedLevel" : false, items\active\weapons\ranged\unrand\neotommygun\neotommygun.activeitem 12c12,13 < "level" : 2, --- > > "fixedLevel" : false, items\active\weapons\ranged\unrand\neouzi\neouzi.activeitem 12c12 < "level" : 2, --- > "fixedLevel" : false, items\generic\other\orangestim.consumable 9d8 < "handPosition" : [8, 0], monsters\monster.lua 99,102d98 < if config.getParameter("facingMode", "control") == "transformation" then < mcontroller.controlFace(1) < end < 177a174,177 > > if config.getParameter("facingMode", "control") == "transformation" then > mcontroller.controlFace(1) > end monsters\boss\apeboss\apeboss.monstertype 1,148c1,150 < { < "type" : "apeboss", < "shortdescription" : "Big Ape", < < "categories" : [ "apeboss" ], < "parts" : [ "body" ], < < "animation" : "apeboss.animation", < "dropPools" : [ < { < "default" : "bigapeTreasure" < } < ], < < "baseParameters" : { < "scripts" : [ < "/monsters/monster.lua" < ], < "initialScriptDelta" : 1, < "behaviorUpdateDelta" : 1, < < "behavior" : "apeboss", < < "behaviorConfig" : { < "fistLauncherGroups" : 4 < }, < < "damageBar" : "None", < < "forceRegions" : { < }, < < "damageParts" : { < }, < < "damageSources" : { < }, < < "knockoutTime" : 0, < "knockoutEffect" : "blink", < "deathParticles" : "", < < "portraitIcon" : "/monsters/boss/apeboss/apeboss.png:stage1.idle.1", < < "metaBoundBox" : [-50, -50, 50, 50], < "scale" : 1.0, < < "selfDamagePoly" : [ ], < < "movementSettings" : { < "gravityEnabled" : false, < "collisionPoly" : [ [2.5, 5.375], [4.5, 3.375], [4.5, -3.375], [2.5, -5.375], [-2.5, -5.375], [-4.5, -3.375], [-4.5, 3.375], [-2.5, 5.375] ], < < "mass" : 4.0, < "walkSpeed" : 5, < "runSpeed" : 13, < "flySpeed" : 11, < "airFriction" : 0.5, < "airForce" : 800.0, < "airJumpProfile" : { < "jumpControlForce" : 0, < "jumpInitialPercentage" : 0 < }, < "physicsEffectCategories" : ["boss"] < }, < < "touchDamage" : { < "poly" : [ [-4, -3], [0, -3], [0, 0], [-4, 0] ], < "damage" : 20, < < "teamType" : "enemy", < "statusEffects" : [ ] < }, < < "statusSettings" : { < "statusProperties" : { < "targetMaterialKind" : "organic" < }, < < "appliesEnvironmentStatusEffects" : false, < "appliesWeatherStatusEffects" : false, < "minimumLiquidStatusEffectPercentage" : 0.1, < < "primaryScriptSources" : [ < "/stats/monster_primary.lua" < ], < "primaryScriptDelta" : 5, < < "stats" : { < "knockbackStunTime" : { < "baseValue" : 0.25 < }, < "grit" : { < "baseValue" : 1.0 < }, < "maxHealth" : { < "baseValue" : 1000 < }, < "protection" : { < "baseValue" : 0 < }, < "healthRegen" : { < "baseValue" : 0.0 < }, < "fireStatusImmunity" : { < "baseValue" : 1.0 < }, < "iceStatusImmunity" : { < "baseValue" : 1.0 < }, < "electricStatusImmunity" : { < "baseValue" : 1.0 < }, < "poisonStatusImmunity" : { < "baseValue" : 1.0 < }, < "specialStatusImmunity" : { < "baseValue" : 1.0 < }, < "healingStatusImmunity" : { < "baseValue" : 1.0 < }, < "stunImmunity" : { < "baseValue" : 1.0 < }, < "powerMultiplier" : { < "baseValue" : 1.0 < } < }, < < "resources" : { < "stunned" : { < "deltaValue" : -1.0, < "initialValue" : 0.0, < "maxValue" : 0.0 < }, < "health" : { < "maxStat" : "maxHealth", < "deltaStat" : "healthRegen", < "defaultPercentage" : 1.0 < } < } < }, < < "mouthOffset" : [1.0, -1.5], < "feetOffset" : [0, -21] < } < } --- > { > "type" : "apeboss", > "shortdescription" : "Big Ape", > > "categories" : [ "apeboss" ], > "parts" : [ "body" ], > > "animation" : "apeboss.animation", > "dropPools" : [ > { > "default" : "bigapeTreasure" > } > ], > > "baseParameters" : { > "monsterClass" : "boss", > > "scripts" : [ > "/monsters/monster.lua" > ], > "initialScriptDelta" : 1, > "behaviorUpdateDelta" : 1, > > "behavior" : "apeboss", > > "behaviorConfig" : { > "fistLauncherGroups" : 4 > }, > > "damageBar" : "None", > > "forceRegions" : { > }, > > "damageParts" : { > }, > > "damageSources" : { > }, > > "knockoutTime" : 0, > "knockoutEffect" : "blink", > "deathParticles" : "", > > "portraitIcon" : "/monsters/boss/apeboss/apeboss.png:stage1.idle.1", > > "metaBoundBox" : [-50, -50, 50, 50], > "scale" : 1.0, > > "selfDamagePoly" : [ ], > > "movementSettings" : { > "gravityEnabled" : false, > "collisionPoly" : [ [2.5, 5.375], [4.5, 3.375], [4.5, -3.375], [2.5, -5.375], [-2.5, -5.375], [-4.5, -3.375], [-4.5, 3.375], [-2.5, 5.375] ], > > "mass" : 4.0, > "walkSpeed" : 5, > "runSpeed" : 13, > "flySpeed" : 11, > "airFriction" : 0.5, > "airForce" : 800.0, > "airJumpProfile" : { > "jumpControlForce" : 0, > "jumpInitialPercentage" : 0 > }, > "physicsEffectCategories" : ["boss"] > }, > > "touchDamage" : { > "poly" : [ [-4, -3], [0, -3], [0, 0], [-4, 0] ], > "damage" : 20, > > "teamType" : "enemy", > "statusEffects" : [ ] > }, > > "statusSettings" : { > "statusProperties" : { > "targetMaterialKind" : "organic" > }, > > "appliesEnvironmentStatusEffects" : false, > "appliesWeatherStatusEffects" : false, > "minimumLiquidStatusEffectPercentage" : 0.1, > > "primaryScriptSources" : [ > "/stats/monster_primary.lua" > ], > "primaryScriptDelta" : 5, > > "stats" : { > "knockbackStunTime" : { > "baseValue" : 0.25 > }, > "grit" : { > "baseValue" : 1.0 > }, > "maxHealth" : { > "baseValue" : 1000 > }, > "protection" : { > "baseValue" : 0 > }, > "healthRegen" : { > "baseValue" : 0.0 > }, > "fireStatusImmunity" : { > "baseValue" : 1.0 > }, > "iceStatusImmunity" : { > "baseValue" : 1.0 > }, > "electricStatusImmunity" : { > "baseValue" : 1.0 > }, > "poisonStatusImmunity" : { > "baseValue" : 1.0 > }, > "specialStatusImmunity" : { > "baseValue" : 1.0 > }, > "healingStatusImmunity" : { > "baseValue" : 1.0 > }, > "stunImmunity" : { > "baseValue" : 1.0 > }, > "powerMultiplier" : { > "baseValue" : 1.0 > } > }, > > "resources" : { > "stunned" : { > "deltaValue" : -1.0, > "initialValue" : 0.0, > "maxValue" : 0.0 > }, > "health" : { > "maxStat" : "maxHealth", > "deltaStat" : "healthRegen", > "defaultPercentage" : 1.0 > } > } > }, > > "mouthOffset" : [1.0, -1.5], > "feetOffset" : [0, -21] > } > } monsters\boss\crystalboss\crystalboss.monstertype 1,192c1,194 < { < "type" : "crystalboss", < "shortdescription" : "Erchius Horror", < < "categories" : [ "crystalboss" ], < "parts" : [ "organs", "shell", "bodyglow", "eye", "beam1", "beam2", "beam3", "beam4"], < < "animation" : "crystalboss.animation", < "reversed" : true, < "dropPools" : [ < { < "default" : "erchiushorrorTreasure" < } < ], < < "baseParameters" : { < "scripts" : [ < "/monsters/boss/bossMonster.lua", < "/monsters/simpleRangedAttack.lua", < "/scripts/stateMachine.lua", < "/scripts/util.lua", < "/scripts/vec2.lua", < < "/monsters/boss/crystalboss/dieState.lua", < "/monsters/boss/crystalboss/idleState.lua", < "/monsters/boss/crystalboss/crystalbossreset.lua" < ], < < "skillCount" : 6, < "skills" : [ "crystalSingleBeamAttack", "crystalDoubleBeamAttack", "crystalSineBeamAttack", "crystalIdleAttack" , "crystalShatterAttack", "crystalMoontantAttack" ], < < "phases" : [ < { < "skills" : ["crystalIdleAttack", "crystalSingleBeamAttack", "crystalIdleAttack", "crystalMoontantAttack"] < }, < { < "trigger" : "healthPercentage", < "healthPercentage" : 0.8, < "enterPhase" : "crystalShatterAttack", < "skills" : [ "crystalIdleAttack", "crystalSineBeamAttack", "crystalIdleAttack", "crystalMoontantAttack" ] < }, < { < "trigger" : "healthPercentage", < "healthPercentage" : 0.4, < "enterPhase" : "crystalShatterAttack", < "skills" : [ "crystalIdleAttack", "crystalDoubleBeamAttack", "crystalIdleAttack", "crystalMoontantAttack" ] < } < ], < < "projectileSourcePosition" : [-2.5, -1.25], < "projectileSourceOffset" : [7, 0], < < "trackTargetDistance" : 50.0, < "switchTargetDistance" : 0, < "keepTargetInSight" : false, < < "knockoutTime" : 0, < "knockoutEffect" : "blink", < "deathParticles" : "", < < "alwaysAggressive" : true, < < "scale" : 1.0, < < "portraitIcon" : "/monsters/boss/crystalboss/crystal/crystalbossicon.png", < < "movementSettings" : { < "gravityEnabled" : false, < < "collisionPoly" : [ [12.5, 0.5], [0, -12.5], [-12.5, 0.5], [0, 12.5] ], < "mass" : 4.0, < "walkSpeed" : 5, < "runSpeed" : 13, < "airForce" : 200, < "airJumpProfile" : { < "jumpControlForce" : 0, < "jumpInitialPercentage" : 0 < }, < "physicsEffectCategories" : ["boss"] < }, < "jumpTargetDistance" : 4, < "jumpTime" : [0.4, 0.7], < < "metaBoundBox" : [-15, -15, 15, 15], < < "blockedSensors" : [ [1.5, -4.5], [1.5, -3.5], [1.5, -2.5], [1.5, -1.5], [1.5, -0.5], [1.5, 0.5] ], < "fallSensors" : [ [2, -3.5], [2, -5.5], [2, -6.5], [4, -4.5], [4, -5.5], [4, -6.5] ], < < "touchDamage" : { < "poly" : [ [-4, -3], [0, -3], [0, 0], [-4, 0] ], < "damage" : 20, < < "teamType" : "enemy", < "damageSourceKind" : "default", < "statusEffects" : [ ] < }, < < "statusSettings" : { < "statusProperties" : { < "targetMaterialKind" : "robotic" < }, < < "appliesEnvironmentStatusEffects" : false, < "appliesWeatherStatusEffects" : false, < "minimumLiquidStatusEffectPercentage" : 0.1, < < "primaryScriptSources" : [ < "/stats/monster_primary.lua" < ], < "primaryScriptDelta" : 5, < < "stats" : { < "knockbackStunTime" : { < "baseValue" : 0.25 < }, < "grit" : { < "baseValue" : 1.0 < }, < "maxHealth" : { < "baseValue" : 6000 < }, < "protection" : { < "baseValue" : 100 < }, < "healthRegen" : { < "baseValue" : 0.0 < }, < "fireStatusImmunity" : { < "baseValue" : 1.0 < }, < "iceStatusImmunity" : { < "baseValue" : 1.0 < }, < "electricStatusImmunity" : { < "baseValue" : 1.0 < }, < "poisonStatusImmunity" : { < "baseValue" : 1.0 < }, < "specialStatusImmunity" : { < "baseValue" : 1.0 < }, < "healingStatusImmunity" : { < "baseValue" : 1.0 < }, < "stunImmunity" : { < "baseValue" : 1.0 < }, < "powerMultiplier" : { < "baseValue" : 1.0 < } < }, < < "resources" : { < "stunned" : { < "deltaValue" : -1.0, < "initialValue" : 0.0, < "maxValue" : 0.0 < }, < "health" : { < "maxStat" : "maxHealth", < "deltaStat" : "healthRegen", < "defaultPercentage" : 100 < } < } < }, < < "projectiles" : { < "deathexplosion" : { < "type" : "regularexplosionknockback", < "config" : { < "speed" : 0.1, < "power" : 2, < < "actionOnReap" : [ < { < "action" : "config", < "file" : "/projectiles/explosions/regularexplosion2/regularexplosionknockback.config" < } < ] < }, < < "fireTime" : 8.0, < "fireInterval" : 0.2, < "cooldown" : 0.1 < } < }, < < "mouthOffset" : [1.0, -1.5], < "feetOffset" : [0, -21] < } < } --- > { > "type" : "crystalboss", > "shortdescription" : "Erchius Horror", > > "categories" : [ "crystalboss" ], > "parts" : [ "organs", "shell", "bodyglow", "eye", "beam1", "beam2", "beam3", "beam4"], > > "animation" : "crystalboss.animation", > "reversed" : true, > "dropPools" : [ > { > "default" : "erchiushorrorTreasure" > } > ], > > "baseParameters" : { > "monsterClass" : "boss", > > "scripts" : [ > "/monsters/boss/bossMonster.lua", > "/monsters/simpleRangedAttack.lua", > "/scripts/stateMachine.lua", > "/scripts/util.lua", > "/scripts/vec2.lua", > > "/monsters/boss/crystalboss/dieState.lua", > "/monsters/boss/crystalboss/idleState.lua", > "/monsters/boss/crystalboss/crystalbossreset.lua" > ], > > "skillCount" : 6, > "skills" : [ "crystalSingleBeamAttack", "crystalDoubleBeamAttack", "crystalSineBeamAttack", "crystalIdleAttack" , "crystalShatterAttack", "crystalMoontantAttack" ], > > "phases" : [ > { > "skills" : ["crystalIdleAttack", "crystalSingleBeamAttack", "crystalIdleAttack", "crystalMoontantAttack"] > }, > { > "trigger" : "healthPercentage", > "healthPercentage" : 0.8, > "enterPhase" : "crystalShatterAttack", > "skills" : [ "crystalIdleAttack", "crystalSineBeamAttack", "crystalIdleAttack", "crystalMoontantAttack" ] > }, > { > "trigger" : "healthPercentage", > "healthPercentage" : 0.4, > "enterPhase" : "crystalShatterAttack", > "skills" : [ "crystalIdleAttack", "crystalDoubleBeamAttack", "crystalIdleAttack", "crystalMoontantAttack" ] > } > ], > > "projectileSourcePosition" : [-2.5, -1.25], > "projectileSourceOffset" : [7, 0], > > "trackTargetDistance" : 50.0, > "switchTargetDistance" : 0, > "keepTargetInSight" : false, > > "knockoutTime" : 0, > "knockoutEffect" : "blink", > "deathParticles" : "", > > "alwaysAggressive" : true, > > "scale" : 1.0, > > "portraitIcon" : "/monsters/boss/crystalboss/crystal/crystalbossicon.png", > > "movementSettings" : { > "gravityEnabled" : false, > > "collisionPoly" : [ [12.5, 0.5], [0, -12.5], [-12.5, 0.5], [0, 12.5] ], > "mass" : 4.0, > "walkSpeed" : 5, > "runSpeed" : 13, > "airForce" : 200, > "airJumpProfile" : { > "jumpControlForce" : 0, > "jumpInitialPercentage" : 0 > }, > "physicsEffectCategories" : ["boss"] > }, > "jumpTargetDistance" : 4, > "jumpTime" : [0.4, 0.7], > > "metaBoundBox" : [-15, -15, 15, 15], > > "blockedSensors" : [ [1.5, -4.5], [1.5, -3.5], [1.5, -2.5], [1.5, -1.5], [1.5, -0.5], [1.5, 0.5] ], > "fallSensors" : [ [2, -3.5], [2, -5.5], [2, -6.5], [4, -4.5], [4, -5.5], [4, -6.5] ], > > "touchDamage" : { > "poly" : [ [-4, -3], [0, -3], [0, 0], [-4, 0] ], > "damage" : 20, > > "teamType" : "enemy", > "damageSourceKind" : "default", > "statusEffects" : [ ] > }, > > "statusSettings" : { > "statusProperties" : { > "targetMaterialKind" : "robotic" > }, > > "appliesEnvironmentStatusEffects" : false, > "appliesWeatherStatusEffects" : false, > "minimumLiquidStatusEffectPercentage" : 0.1, > > "primaryScriptSources" : [ > "/stats/monster_primary.lua" > ], > "primaryScriptDelta" : 5, > > "stats" : { > "knockbackStunTime" : { > "baseValue" : 0.25 > }, > "grit" : { > "baseValue" : 1.0 > }, > "maxHealth" : { > "baseValue" : 6000 > }, > "protection" : { > "baseValue" : 100 > }, > "healthRegen" : { > "baseValue" : 0.0 > }, > "fireStatusImmunity" : { > "baseValue" : 1.0 > }, > "iceStatusImmunity" : { > "baseValue" : 1.0 > }, > "electricStatusImmunity" : { > "baseValue" : 1.0 > }, > "poisonStatusImmunity" : { > "baseValue" : 1.0 > }, > "specialStatusImmunity" : { > "baseValue" : 1.0 > }, > "healingStatusImmunity" : { > "baseValue" : 1.0 > }, > "stunImmunity" : { > "baseValue" : 1.0 > }, > "powerMultiplier" : { > "baseValue" : 1.0 > } > }, > > "resources" : { > "stunned" : { > "deltaValue" : -1.0, > "initialValue" : 0.0, > "maxValue" : 0.0 > }, > "health" : { > "maxStat" : "maxHealth", > "deltaStat" : "healthRegen", > "defaultPercentage" : 100 > } > } > }, > > "projectiles" : { > "deathexplosion" : { > "type" : "regularexplosionknockback", > "config" : { > "speed" : 0.1, > "power" : 2, > > "actionOnReap" : [ > { > "action" : "config", > "file" : "/projectiles/explosions/regularexplosion2/regularexplosionknockback.config" > } > ] > }, > > "fireTime" : 8.0, > "fireInterval" : 0.2, > "cooldown" : 0.1 > } > }, > > "mouthOffset" : [1.0, -1.5], > "feetOffset" : [0, -21] > } > } monsters\boss\cultistboss\cultistboss.monstertype 1,199c1,201 < { < "type" : "cultistboss", < "shortdescription" : "Asra Nox", < "categories" : [ "cultistboss" ], < "parts" : [ "body", "bodylit", "beam" ], < < "animation" : "cultistboss.animation", < "reversed" : false, < < "dropPools" : [ < { < "default" : "asranoxTreasure" < } < ], < < "baseParameters" : { < "scripts" : [ < "/monsters/monster.lua" < ], < "initialScriptDelta" : 1, < "behaviorUpdateDelta" : 1, < < "behavior" : "cultistboss", < < "behaviorConfig" : { < "sphereCollisionPoly" : [ [-0.85, -0.45], [-0.45, -0.85], [0.45, -0.85], [0.85, -0.45], [0.85, 0.45], [0.45, 0.85], [-0.45, 0.85], [-0.85, 0.45] ], < < "endWaitTime" : 8 < }, < < "damageBar" : "None", < < "chatPortrait" : "/interface/chatbubbles/nox.png", < "dialog" : { < "intro" : { < "default" : { < "default" : [ < "Huh... Are you Esther's puppet? So she's gathering underlings again.", < "You know you're in way over your head, don't you?", < "I pity you, in a way. Having your strings pulled by that withered hag..." < ] < } < }, < "start" : { < "default" : { < "default" : [ < "Nevermind; time to die!" < ] < } < }, < "death" : { < "default" : { < "default" : [ < "I guess I underestimated you...", < "So you win this time - 'woe is me.'", < "But it's too late to stop what's happening, let Esther know - there's no hope." < ] < } < } < }, < < "damageSources" : { < "dash" : { < "poly" : [ [-0.75, -2.0], [-0.35, -2.5], [0.35, -2.5], [0.75, -2.0], [0.75, 0.65], [0.35, 1.22], [-0.35, 1.22], [-0.75, 0.65] ], < "damage" : 10.0, < < "teamType" : "enemy", < "damageSourceKind" : "broadsword", < "knockback" : 30 < }, < "sphere" : { < "poly" : [ [-0.875, -1.5], [-0.5, -1.875], [0.5, -1.875], [1.0, -1.5], [1.0, -0.5], [0.5, -0.0], [-0.5, -0.0], [-0.875, -0.5] ], < "damage" : 10.0, < < "teamType" : "enemy", < "damageSourceKind" : "hammer", < "knockback" : 30, < "damageRepeatTimeout" : 0.5 < } < }, < < "damageParts" : { < "beam" : { < "damage" : 10, < < "teamType" : "enemy", < "damageSourceKind" : "plasma", < "knockback" : [30, 0], < "damageRepeatTimeout" : 0.5 < }, < "body" : { < "damage" : 10, < < "teamType" : "enemy", < "damageSourceKind" : "broadsword", < "knockback" : 30 < } < }, < < "flipPartPoly" : false, < "collisionParts" : [ < "body" < ], < < "knockoutTime" : 0.0, < "knockoutEffect" : "blink", < "knockoutAnimationStates" : { < "body" : "idle" < }, < "deathParticles" : "deathPoof", < < "metaBoundBox" : [-2.5, -2.5, 2.5, 2.5], < "scale" : 1.0, < < "selfDamagePoly" : [ [-0.75, -2.0], [-0.35, -2.5], [0.35, -2.5], [0.75, -2.0], [0.75, 0.65], [0.35, 1.22], [-0.35, 1.22], [-0.75, 0.65] ], < < "movementSettings" : { < "collisionPoly" : [ [-0.75, -2.0], [-0.35, -2.5], [0.35, -2.5], [0.75, -2.0], [0.75, 0.65], [0.35, 1.22], [-0.35, 1.22], [-0.75, 0.65] ], < "mass" : 1.0, < "physicsEffectCategories" : ["boss"] < }, < < "statusSettings" : { < "statusProperties" : { < "targetMaterialKind" : "organic", < "effectDirectives" : "?replace=FEFFFFFF=FFFFFFFF?replace=9bd4ffFF=ffea63FF?replace=31a6ffFF=f5bc00FF" < }, < < "appliesEnvironmentStatusEffects" : false, < "appliesWeatherStatusEffects" : false, < "minimumLiquidStatusEffectPercentage" : 0.1, < < "primaryScriptSources" : [ < "/stats/monster_primary.lua" < ], < "primaryScriptDelta" : 5, < < "stats" : { < "knockbackStunTime" : { < "baseValue" : 0.25 < }, < "knockbackThreshold" : { < "baseValue" : 9 < }, < "grit" : { < "baseValue" : 1.0 < }, < "maxHealth" : { < "baseValue" : 500 < }, < "protection" : { < "baseValue" : 0.0 < }, < "healthRegen" : { < "baseValue" : 0.0 < }, < "powerMultiplier" : { < "baseValue" : 1.0 < }, < "fireStatusImmunity" : { < "baseValue" : 1.0 < }, < "iceStatusImmunity" : { < "baseValue" : 1.0 < }, < "electricStatusImmunity" : { < "baseValue" : 1.0 < }, < "poisonStatusImmunity" : { < "baseValue" : 1.0 < }, < "specialStatusImmunity" : { < "baseValue" : 1.0 < }, < "healingStatusImmunity" : { < "baseValue" : 1.0 < }, < "stunImmunity" : { < "baseValue" : 1.0 < } < }, < < "resources" : { < "stunned" : { < "deltaValue" : -1.0, < "initialValue" : 0.0 < }, < "health" : { < "maxStat" : "maxHealth", < "deltaStat" : "healthRegen", < "defaultPercentage" : 100 < } < } < }, < < "mouthOffset" : [0, 7], < "feetOffset" : [0, -21] < } < } --- > { > "type" : "cultistboss", > "shortdescription" : "Asra Nox", > "categories" : [ "cultistboss" ], > "parts" : [ "body", "bodylit", "beam" ], > > "animation" : "cultistboss.animation", > "reversed" : false, > > "dropPools" : [ > { > "default" : "asranoxTreasure" > } > ], > > "baseParameters" : { > "monsterClass" : "boss", > > "scripts" : [ > "/monsters/monster.lua" > ], > "initialScriptDelta" : 1, > "behaviorUpdateDelta" : 1, > > "behavior" : "cultistboss", > > "behaviorConfig" : { > "sphereCollisionPoly" : [ [-0.85, -0.45], [-0.45, -0.85], [0.45, -0.85], [0.85, -0.45], [0.85, 0.45], [0.45, 0.85], [-0.45, 0.85], [-0.85, 0.45] ], > > "endWaitTime" : 8 > }, > > "damageBar" : "None", > > "chatPortrait" : "/interface/chatbubbles/nox.png", > "dialog" : { > "intro" : { > "default" : { > "default" : [ > "Huh... Are you Esther's puppet? So she's gathering underlings again.", > "You know you're in way over your head, don't you?", > "I pity you, in a way. Having your strings pulled by that withered hag..." > ] > } > }, > "start" : { > "default" : { > "default" : [ > "Nevermind; time to die!" > ] > } > }, > "death" : { > "default" : { > "default" : [ > "I guess I underestimated you...", > "So you win this time - 'woe is me.'", > "But it's too late to stop what's happening, let Esther know - there's no hope." > ] > } > } > }, > > "damageSources" : { > "dash" : { > "poly" : [ [-0.75, -2.0], [-0.35, -2.5], [0.35, -2.5], [0.75, -2.0], [0.75, 0.65], [0.35, 1.22], [-0.35, 1.22], [-0.75, 0.65] ], > "damage" : 10.0, > > "teamType" : "enemy", > "damageSourceKind" : "broadsword", > "knockback" : 30 > }, > "sphere" : { > "poly" : [ [-0.875, -1.5], [-0.5, -1.875], [0.5, -1.875], [1.0, -1.5], [1.0, -0.5], [0.5, -0.0], [-0.5, -0.0], [-0.875, -0.5] ], > "damage" : 10.0, > > "teamType" : "enemy", > "damageSourceKind" : "hammer", > "knockback" : 30, > "damageRepeatTimeout" : 0.5 > } > }, > > "damageParts" : { > "beam" : { > "damage" : 10, > > "teamType" : "enemy", > "damageSourceKind" : "plasma", > "knockback" : [30, 0], > "damageRepeatTimeout" : 0.5 > }, > "body" : { > "damage" : 10, > > "teamType" : "enemy", > "damageSourceKind" : "broadsword", > "knockback" : 30 > } > }, > > "flipPartPoly" : false, > "collisionParts" : [ > "body" > ], > > "knockoutTime" : 0.0, > "knockoutEffect" : "blink", > "knockoutAnimationStates" : { > "body" : "idle" > }, > "deathParticles" : "deathPoof", > > "metaBoundBox" : [-2.5, -2.5, 2.5, 2.5], > "scale" : 1.0, > > "selfDamagePoly" : [ [-0.75, -2.0], [-0.35, -2.5], [0.35, -2.5], [0.75, -2.0], [0.75, 0.65], [0.35, 1.22], [-0.35, 1.22], [-0.75, 0.65] ], > > "movementSettings" : { > "collisionPoly" : [ [-0.75, -2.0], [-0.35, -2.5], [0.35, -2.5], [0.75, -2.0], [0.75, 0.65], [0.35, 1.22], [-0.35, 1.22], [-0.75, 0.65] ], > "mass" : 1.0, > "physicsEffectCategories" : ["boss"] > }, > > "statusSettings" : { > "statusProperties" : { > "targetMaterialKind" : "organic", > "effectDirectives" : "?replace=FEFFFFFF=FFFFFFFF?replace=9bd4ffFF=ffea63FF?replace=31a6ffFF=f5bc00FF" > }, > > "appliesEnvironmentStatusEffects" : false, > "appliesWeatherStatusEffects" : false, > "minimumLiquidStatusEffectPercentage" : 0.1, > > "primaryScriptSources" : [ > "/stats/monster_primary.lua" > ], > "primaryScriptDelta" : 5, > > "stats" : { > "knockbackStunTime" : { > "baseValue" : 0.25 > }, > "knockbackThreshold" : { > "baseValue" : 9 > }, > "grit" : { > "baseValue" : 1.0 > }, > "maxHealth" : { > "baseValue" : 500 > }, > "protection" : { > "baseValue" : 0.0 > }, > "healthRegen" : { > "baseValue" : 0.0 > }, > "powerMultiplier" : { > "baseValue" : 1.0 > }, > "fireStatusImmunity" : { > "baseValue" : 1.0 > }, > "iceStatusImmunity" : { > "baseValue" : 1.0 > }, > "electricStatusImmunity" : { > "baseValue" : 1.0 > }, > "poisonStatusImmunity" : { > "baseValue" : 1.0 > }, > "specialStatusImmunity" : { > "baseValue" : 1.0 > }, > "healingStatusImmunity" : { > "baseValue" : 1.0 > }, > "stunImmunity" : { > "baseValue" : 1.0 > } > }, > > "resources" : { > "stunned" : { > "deltaValue" : -1.0, > "initialValue" : 0.0 > }, > "health" : { > "maxStat" : "maxHealth", > "deltaStat" : "healthRegen", > "defaultPercentage" : 100 > } > } > }, > > "mouthOffset" : [0, 7], > "feetOffset" : [0, -21] > } > } monsters\boss\dragonboss\dragonboss.monstertype 1,128c1,130 < { < "type" : "dragonboss", < "shortdescription" : "Bone Dragon", < "categories" : [ "dragonboss" ], < "parts" : [ "body", "head", "headlit" ], < < "animation" : "dragonboss.animation", < "reversed" : false, < < "dropPools" : [ < { < "default" : "bonedragonTreasure" < } < ], < < "baseParameters" : { < "scripts" : [ < "/monsters/monster.lua" < ], < "initialScriptDelta" : 1, < "behaviorUpdateDelta" : 1, < < "behavior" : "dragonboss", < < "damageBar" : "None", < < "metaBoundBox" : [-12.5, -12.5, 12.5, 12.5], < "scale" : 1.0, < < "selfDamagePoly" : [ [-4, -13.5], [4, -13.5], [13, 1], [13, 4], [8, 7], [-8, 7], [-13, 4], [-13, 1] ], < < "movementSettings" : { < "gravityEnabled" : false, < "collisionPoly" : [ [-13, -13.5], [-13, 7], [13, 7], [13, -13.5] ], < "mass" : 1.0, < "flySpeed" : 16, < "airFriction" : 2.0, < "airForce" : 40.0, < "physicsEffectCategories" : ["boss"] < }, < < "knockoutTime" : 0.1, < "knockoutEffect" : "blink", < "deathParticles" : "deathPoof", < < "touchDamage" : { < "poly" : [ [-5, -13.5], [5, -13.5], [5, 5], [-5, 5] ], < "damage" : 20, < < "teamType" : "enemy", < "damageSourceKind" : "default", < "statusEffects" : [ ] < }, < < "statusSettings" : { < "statusProperties" : { < "targetMaterialKind" : "stone" < }, < < "appliesEnvironmentStatusEffects" : false, < "appliesWeatherStatusEffects" : false, < "minimumLiquidStatusEffectPercentage" : 0.1, < < "primaryScriptSources" : [ < "/stats/monster_primary.lua" < ], < "primaryScriptDelta" : 5, < < "stats" : { < "knockbackStunTime" : { < "baseValue" : 0.25 < }, < "grit" : { < "baseValue" : 1.0 < }, < "maxHealth" : { < "baseValue" : 500 < }, < "protection" : { < "baseValue" : 75 < }, < "healthRegen" : { < "baseValue" : 0.0 < }, < "fireStatusImmunity" : { < "baseValue" : 1.0 < }, < "iceStatusImmunity" : { < "baseValue" : 1.0 < }, < "electricStatusImmunity" : { < "baseValue" : 1.0 < }, < "poisonStatusImmunity" : { < "baseValue" : 1.0 < }, < "specialStatusImmunity" : { < "baseValue" : 1.0 < }, < "healingStatusImmunity" : { < "baseValue" : 1.0 < }, < "stunImmunity" : { < "baseValue" : 1.0 < }, < "powerMultiplier" : { < "baseValue" : 1.0 < } < }, < < "resources" : { < "stunned" : { < "deltaValue" : -1.0, < "initialValue" : 0.0, < "maxValue" : 0.0 < }, < "health" : { < "maxStat" : "maxHealth", < "deltaStat" : "healthRegen", < "defaultPercentage" : 1.0 < } < } < }, < < "mouthOffset" : [0, 0], < "feetOffset" : [0, -8] < } < } --- > { > "type" : "dragonboss", > "shortdescription" : "Bone Dragon", > "categories" : [ "dragonboss" ], > "parts" : [ "body", "head", "headlit" ], > > "animation" : "dragonboss.animation", > "reversed" : false, > > "dropPools" : [ > { > "default" : "bonedragonTreasure" > } > ], > > "baseParameters" : { > "monsterClass" : "boss", > > "scripts" : [ > "/monsters/monster.lua" > ], > "initialScriptDelta" : 1, > "behaviorUpdateDelta" : 1, > > "behavior" : "dragonboss", > > "damageBar" : "None", > > "metaBoundBox" : [-12.5, -12.5, 12.5, 12.5], > "scale" : 1.0, > > "selfDamagePoly" : [ [-4, -13.5], [4, -13.5], [13, 1], [13, 4], [8, 7], [-8, 7], [-13, 4], [-13, 1] ], > > "movementSettings" : { > "gravityEnabled" : false, > "collisionPoly" : [ [-13, -13.5], [-13, 7], [13, 7], [13, -13.5] ], > "mass" : 1.0, > "flySpeed" : 16, > "airFriction" : 2.0, > "airForce" : 40.0, > "physicsEffectCategories" : ["boss"] > }, > > "knockoutTime" : 0.1, > "knockoutEffect" : "blink", > "deathParticles" : "deathPoof", > > "touchDamage" : { > "poly" : [ [-5, -13.5], [5, -13.5], [5, 5], [-5, 5] ], > "damage" : 20, > > "teamType" : "enemy", > "damageSourceKind" : "default", > "statusEffects" : [ ] > }, > > "statusSettings" : { > "statusProperties" : { > "targetMaterialKind" : "stone" > }, > > "appliesEnvironmentStatusEffects" : false, > "appliesWeatherStatusEffects" : false, > "minimumLiquidStatusEffectPercentage" : 0.1, > > "primaryScriptSources" : [ > "/stats/monster_primary.lua" > ], > "primaryScriptDelta" : 5, > > "stats" : { > "knockbackStunTime" : { > "baseValue" : 0.25 > }, > "grit" : { > "baseValue" : 1.0 > }, > "maxHealth" : { > "baseValue" : 500 > }, > "protection" : { > "baseValue" : 75 > }, > "healthRegen" : { > "baseValue" : 0.0 > }, > "fireStatusImmunity" : { > "baseValue" : 1.0 > }, > "iceStatusImmunity" : { > "baseValue" : 1.0 > }, > "electricStatusImmunity" : { > "baseValue" : 1.0 > }, > "poisonStatusImmunity" : { > "baseValue" : 1.0 > }, > "specialStatusImmunity" : { > "baseValue" : 1.0 > }, > "healingStatusImmunity" : { > "baseValue" : 1.0 > }, > "stunImmunity" : { > "baseValue" : 1.0 > }, > "powerMultiplier" : { > "baseValue" : 1.0 > } > }, > > "resources" : { > "stunned" : { > "deltaValue" : -1.0, > "initialValue" : 0.0, > "maxValue" : 0.0 > }, > "health" : { > "maxStat" : "maxHealth", > "deltaStat" : "healthRegen", > "defaultPercentage" : 1.0 > } > } > }, > > "mouthOffset" : [0, 0], > "feetOffset" : [0, -8] > } > } monsters\boss\eyeboss\eyeboss.monstertype 1,195c1,197 < { < "type" : "eyeboss", < "shortdescription" : "Heart of Ruin", < "categories" : [ "eyeboss" ], < "parts" : [ "back", "biome", "eye", "eyelit", "heartleft", "heartmiddle", "heartright", "eyelid", "backleft", "backright", "middleleft", "middleright", "tentaclespacing", "frontright", "frontleft", "beam" ], < < "animation" : "eyeboss.animation", < "dropPools" : [ ], < < "baseParameters" : { < "scripts" : [ < "/monsters/monster.lua" < ], < "initialScriptDelta" : 1, < "behaviorUpdateDelta" : 1, < < "behavior" : "eyeboss", < "behaviorConfig" : { < "deathMovementParameters" : { < "gravityEnabled" : true, < "bounceFactor" : 0.1 < } < }, < < "musicStagehands" : [ < "bossmusicleft", < "bossmusicright" < ], < < "monsterQueryRange" : 150, < "monsterSpawnGroups" : [ < { "monsters" : ["gleap", "nutmidge", "poptop"], "biome" : "garden" }, < { "monsters" : ["snaunt", "snaunt"], "biome" : "forest" }, < { "monsters" : ["pulpin", "skimbus", "skimbus"], "biome" : "snow" }, < { "monsters" : ["wisper", "wisper", "pulpin"], "biome" : "ice" }, < { "monsters" : ["capricoat", "monopus", "monopus"], "biome" : "arctic" }, < { "monsters" : ["smoglin", "peblit", "peblit"], "biome" : "savannah" }, < { "monsters" : ["lilodon", "lilodon", "lilodon"], "biome" : "ocean" }, < { "monsters" : ["oculob", "oculob", "pteropod"], "biome" : "toxic" }, < { "monsters" : ["scaveran", "crutter", "crutter"], "biome" : "jungle" }, < { "monsters" : ["voltip", "voltip", "iguarmor"], "biome" : "desert" }, < { "monsters" : ["petricub", "oculob", "scandroid"], "biome" : "alien" }, < { "monsters" : ["spookit", "spookit", "smoglin"], "biome" : "midnight" }, < { "monsters" : ["ringram", "ringram", "capricoat"], "biome" : "alpine" }, < { "monsters" : ["mandraflora", "bulbop", "bulbop", "bulbop"], "biome" : "giantflower" }, < { "monsters" : ["squeem", "squeem", "oculob"], "biome" : "geode" }, < { "monsters" : ["narfin", "narfin", "narfin"], "biome" : "prism" }, < { "monsters" : ["pipkin", "pipkin", "lumoth"], "biome" : "steamspring" }, < { "monsters" : ["anglure"], "biome" : "bioluminescence" }, < { "monsters" : ["trictus", "trictus"], "biome" : "colourful" }, < { "monsters" : ["taroni", "taroni"], "biome" : "tar" }, < { "monsters" : ["toumingo", "toumingo"], "biome" : "oasis" }, < { "monsters" : ["hemogoblin", "hemogoblin"], "biome" : "flesh" }, < { "monsters" : ["sporgus", "sporgus"], "biome" : "mushroompatch" }, < { "monsters" : ["oogler"], "biome" : "bones" }, < { "monsters" : ["fennix", "fennix", "scandroid"], "biome" : "scorchedcity" }, < { "monsters" : ["skimbus", "skimbus", "bobot"], "biome" : "tundra" }, < { "monsters" : ["pyromantle", "pyromantle", "crabcano"], "biome" : "volcanic" }, < { "monsters" : ["quagmutt", "quagmutt", "pteropod"], "biome" : "swamp" }, < { "monsters" : ["bobot", "scandroid"], "biome" : "rust" }, < { "monsters" : ["orbide"], "biome" : "hive" }, < { "monsters" : ["yokat", "yokat"], "biome" : "eyepatch" }, < { "monsters" : ["bobfae", "bobfae", "bobfae", "bobfae", "bobfae"], "biome" : "hellscape" } < ], < "eyeCenterOffset" : [-0.3125, -8.3125], < < "damageBar" : "None", < < "damageParts" : { < "beam" : { < "damage" : 25, < < "teamType" : "enemy", < "damageSourceKind" : "plasma", < "knockback" : 0, < "damageRepeatTimeout" : 1.0, < < "damageTeam" : 0, < < "statusEffects" : [ < { "effect" : "beamburning", "duration" : 2.0 } < ] < } < }, < < "renderLayer" : "Projectile-20", < < "knockoutTime" : 0, < "knockoutEffect" : "blink", < "deathParticles" : "deathPoof", < < "scale" : 1.0, < < "movementSettings" : { < "gravityEnabled" : false, < "collisionPoly" : [ [-8, -20], [-19, -13], [-20, -3], [-13, 4], [-6, 7], [6, 7], [13, 4], [20, -3], [19, -13], [8, -20] ], < < "mass" : 4.0, < "walkSpeed" : 5, < "runSpeed" : 13, < "flySpeed" : 15, < "airFriction" : 0.5, < "airForce" : 400.0, < "airJumpProfile" : { < "jumpControlForce" : 0, < "jumpInitialPercentage" : 0 < }, < "physicsEffectCategories" : ["boss"] < }, < "metaBoundBox" : [-25, -25, 25, 25], < < "touchDamage" : { < "poly" : [ [-4, -3], [0, -3], [0, 0], [-4, 0] ], < "damage" : 37.5, < < "teamType" : "enemy", < "damageSourceKind" : "default", < "statusEffects" : [ ] < }, < < "statusSettings" : { < "statusProperties" : { < "targetMaterialKind" : "organic", < "damageFlashColor" : "ff0000=0.15" < }, < < "appliesEnvironmentStatusEffects" : false, < "appliesWeatherStatusEffects" : false, < "minimumLiquidStatusEffectPercentage" : 0.1, < < "primaryScriptSources" : [ < "/stats/monster_primary.lua" < ], < "primaryScriptDelta" : 5, < < "stats" : { < "knockbackStunTime" : { < "baseValue" : 0.25 < }, < "grit" : { < "baseValue" : 1.0 < }, < "maxHealth" : { < "baseValue" : 5000 < }, < "protection" : { < "baseValue" : 0.0 < }, < "healthRegen" : { < "baseValue" : 0.0 < }, < "fireStatusImmunity" : { < "baseValue" : 1.0 < }, < "iceStatusImmunity" : { < "baseValue" : 1.0 < }, < "electricStatusImmunity" : { < "baseValue" : 1.0 < }, < "poisonStatusImmunity" : { < "baseValue" : 1.0 < }, < "specialStatusImmunity" : { < "baseValue" : 1.0 < }, < "healingStatusImmunity" : { < "baseValue" : 1.0 < }, < "stunImmunity" : { < "baseValue" : 1.0 < }, < "powerMultiplier" : { < "baseValue" : 1.0 < } < }, < < "resources" : { < "stunned" : { < "deltaValue" : -1.0, < "initialValue" : 0.0, < "maxValue" : 0.0 < }, < "health" : { < "maxStat" : "maxHealth", < "deltaStat" : "healthRegen", < "defaultPercentage" : 1.0 < } < } < }, < < "mouthOffset" : [1.0, -1.5], < "feetOffset" : [0, -20] < } < } --- > { > "type" : "eyeboss", > "shortdescription" : "Heart of Ruin", > "categories" : [ "eyeboss" ], > "parts" : [ "back", "biome", "eye", "eyelit", "heartleft", "heartmiddle", "heartright", "eyelid", "backleft", "backright", "middleleft", "middleright", "tentaclespacing", "frontright", "frontleft", "beam" ], > > "animation" : "eyeboss.animation", > "dropPools" : [ ], > > "baseParameters" : { > "monsterClass" : "boss", > > "scripts" : [ > "/monsters/monster.lua" > ], > "initialScriptDelta" : 1, > "behaviorUpdateDelta" : 1, > > "behavior" : "eyeboss", > "behaviorConfig" : { > "deathMovementParameters" : { > "gravityEnabled" : true, > "bounceFactor" : 0.1 > } > }, > > "musicStagehands" : [ > "bossmusicleft", > "bossmusicright" > ], > > "monsterQueryRange" : 150, > "monsterSpawnGroups" : [ > { "monsters" : ["gleap", "nutmidge", "poptop"], "biome" : "garden" }, > { "monsters" : ["snaunt", "snaunt"], "biome" : "forest" }, > { "monsters" : ["pulpin", "skimbus", "skimbus"], "biome" : "snow" }, > { "monsters" : ["wisper", "wisper", "pulpin"], "biome" : "ice" }, > { "monsters" : ["capricoat", "monopus", "monopus"], "biome" : "arctic" }, > { "monsters" : ["smoglin", "peblit", "peblit"], "biome" : "savannah" }, > { "monsters" : ["lilodon", "lilodon", "lilodon"], "biome" : "ocean" }, > { "monsters" : ["oculob", "oculob", "pteropod"], "biome" : "toxic" }, > { "monsters" : ["scaveran", "crutter", "crutter"], "biome" : "jungle" }, > { "monsters" : ["voltip", "voltip", "iguarmor"], "biome" : "desert" }, > { "monsters" : ["petricub", "oculob", "scandroid"], "biome" : "alien" }, > { "monsters" : ["spookit", "spookit", "smoglin"], "biome" : "midnight" }, > { "monsters" : ["ringram", "ringram", "capricoat"], "biome" : "alpine" }, > { "monsters" : ["mandraflora", "bulbop", "bulbop", "bulbop"], "biome" : "giantflower" }, > { "monsters" : ["squeem", "squeem", "oculob"], "biome" : "geode" }, > { "monsters" : ["narfin", "narfin", "narfin"], "biome" : "prism" }, > { "monsters" : ["pipkin", "pipkin", "lumoth"], "biome" : "steamspring" }, > { "monsters" : ["anglure"], "biome" : "bioluminescence" }, > { "monsters" : ["trictus", "trictus"], "biome" : "colourful" }, > { "monsters" : ["taroni", "taroni"], "biome" : "tar" }, > { "monsters" : ["toumingo", "toumingo"], "biome" : "oasis" }, > { "monsters" : ["hemogoblin", "hemogoblin"], "biome" : "flesh" }, > { "monsters" : ["sporgus", "sporgus"], "biome" : "mushroompatch" }, > { "monsters" : ["oogler"], "biome" : "bones" }, > { "monsters" : ["fennix", "fennix", "scandroid"], "biome" : "scorchedcity" }, > { "monsters" : ["skimbus", "skimbus", "bobot"], "biome" : "tundra" }, > { "monsters" : ["pyromantle", "pyromantle", "crabcano"], "biome" : "volcanic" }, > { "monsters" : ["quagmutt", "quagmutt", "pteropod"], "biome" : "swamp" }, > { "monsters" : ["bobot", "scandroid"], "biome" : "rust" }, > { "monsters" : ["orbide"], "biome" : "hive" }, > { "monsters" : ["yokat", "yokat"], "biome" : "eyepatch" }, > { "monsters" : ["bobfae", "bobfae", "bobfae", "bobfae", "bobfae"], "biome" : "hellscape" } > ], > "eyeCenterOffset" : [-0.3125, -8.3125], > > "damageBar" : "None", > > "damageParts" : { > "beam" : { > "damage" : 25, > > "teamType" : "enemy", > "damageSourceKind" : "plasma", > "knockback" : 0, > "damageRepeatTimeout" : 1.0, > > "damageTeam" : 0, > > "statusEffects" : [ > { "effect" : "beamburning", "duration" : 2.0 } > ] > } > }, > > "renderLayer" : "Projectile-20", > > "knockoutTime" : 0, > "knockoutEffect" : "blink", > "deathParticles" : "deathPoof", > > "scale" : 1.0, > > "movementSettings" : { > "gravityEnabled" : false, > "collisionPoly" : [ [-8, -20], [-19, -13], [-20, -3], [-13, 4], [-6, 7], [6, 7], [13, 4], [20, -3], [19, -13], [8, -20] ], > > "mass" : 4.0, > "walkSpeed" : 5, > "runSpeed" : 13, > "flySpeed" : 15, > "airFriction" : 0.5, > "airForce" : 400.0, > "airJumpProfile" : { > "jumpControlForce" : 0, > "jumpInitialPercentage" : 0 > }, > "physicsEffectCategories" : ["boss"] > }, > "metaBoundBox" : [-25, -25, 25, 25], > > "touchDamage" : { > "poly" : [ [-4, -3], [0, -3], [0, 0], [-4, 0] ], > "damage" : 37.5, > > "teamType" : "enemy", > "damageSourceKind" : "default", > "statusEffects" : [ ] > }, > > "statusSettings" : { > "statusProperties" : { > "targetMaterialKind" : "organic", > "damageFlashColor" : "ff0000=0.15" > }, > > "appliesEnvironmentStatusEffects" : false, > "appliesWeatherStatusEffects" : false, > "minimumLiquidStatusEffectPercentage" : 0.1, > > "primaryScriptSources" : [ > "/stats/monster_primary.lua" > ], > "primaryScriptDelta" : 5, > > "stats" : { > "knockbackStunTime" : { > "baseValue" : 0.25 > }, > "grit" : { > "baseValue" : 1.0 > }, > "maxHealth" : { > "baseValue" : 5000 > }, > "protection" : { > "baseValue" : 0.0 > }, > "healthRegen" : { > "baseValue" : 0.0 > }, > "fireStatusImmunity" : { > "baseValue" : 1.0 > }, > "iceStatusImmunity" : { > "baseValue" : 1.0 > }, > "electricStatusImmunity" : { > "baseValue" : 1.0 > }, > "poisonStatusImmunity" : { > "baseValue" : 1.0 > }, > "specialStatusImmunity" : { > "baseValue" : 1.0 > }, > "healingStatusImmunity" : { > "baseValue" : 1.0 > }, > "stunImmunity" : { > "baseValue" : 1.0 > }, > "powerMultiplier" : { > "baseValue" : 1.0 > } > }, > > "resources" : { > "stunned" : { > "deltaValue" : -1.0, > "initialValue" : 0.0, > "maxValue" : 0.0 > }, > "health" : { > "maxStat" : "maxHealth", > "deltaStat" : "healthRegen", > "defaultPercentage" : 1.0 > } > } > }, > > "mouthOffset" : [1.0, -1.5], > "feetOffset" : [0, -20] > } > } monsters\boss\guardianboss\electricguardianboss.monstertype 1,256c1,258 < { < "type" : "electricguardianboss", < "shortdescription" : "Ancient Guardian", < "categories" : [ "guardianboss" ], < "parts" : [ "body", "head", "hip", "lefthand", "swoosh", "righthand", "legs", "shield" ], < < "animation" : "guardianboss.animation", < "reversed" : false, < < "dropPools" : [ { "default" : "guardianTreasure" } ], < < "baseParameters" : { < "scripts" : [ < "/monsters/boss/guardianboss/guardian.lua" < ], < "animationScripts" : [ < "/items/active/effects/chain.lua" < ], < "animationCustom" : { < "sounds" : { < // "groundHazardWindup" : [ "/sfx/melee/staff_charge4_electric.ogg" ], < "groundHazardLoop" : [ "/sfx/npc/boss/guardian_floorhazard_electric_loop.ogg" ], < "groundHazardWinddown" : [ "/sfx/npc/boss/guardian_floorhazard_electric_end.ogg" ], < "dashSwoosh" : [ "/sfx/gun/rocket_electric1.ogg" ] < } < }, < < "colorSwap" : { "da5302" : "6060d6", "fd8f4d" : "8890e3", "fdd14d" : "a1acf7" }, < < "behavior" : "guardian", < "elementalType" : "electric", < < "handBeam" : { < "startSegmentImage" : "/monsters/boss/guardianboss/beams/beamstart.png:", < "segmentImage" : "/monsters/boss/guardianboss/beams/beam.png:", < "endSegmentImage" : "/monsters/boss/guardianboss/beams/beamend.png:", < "segmentSize" : 0.48, < "overdrawLength" : 0.2, < "taper" : 0, < "waveform" : { < "frequency" : 2.5, < "amplitude" : 0.125, < "movement" : 50.0 < }, < "fullbright" : true < }, < "spawnBeam" : { < "startSegmentImage" : "/monsters/boss/guardianboss/beams/spawnbeamstart.png", < "segmentImage" : "/monsters/boss/guardianboss/beams/spawnbeam.png", < "endSegmentImage" : "/monsters/boss/guardianboss/beams/spawnbeamend.png", < "segmentSize" : 0.48, < "overdrawLength" : 0.2, < "taper" : 0, < "waveform" : { < "frequency" : 5.0, < "amplitude" : 0.0625, < "movement" : 50.0 < }, < "fullbright" : true < }, < < "renderLayer" : "Projectile-100", < < "damageBar" : "None", < < "metaBoundBox" : [-80, -50, 80, 50], < "scale" : 1.0, < < "selfDamagePoly" : [ [2.5, 4], [2.5, -4], [-2.5, -4], [-2.5, 4] ], < < "animationDamageParts" : { < "righthand" : { < "anchorPart" : "righthand", < "checkLineCollision" : true, < "bounces" : 0, < "damageSource" : { < "line" : [ [0, -0.5], [0, -100]], < "damage" : 10, < "damageSourceKind" : "electricplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "bouncingbeam" : { < "anchorPart" : "righthand", < "checkLineCollision" : true, < "bounces" : 10, < "damageSource" : { < "line" : [ [0, -0.5], [0, -250]], < "damage" : 10, < "damageSourceKind" : "electricplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "lefthand" : { < "anchorPart" : "lefthand", < "checkLineCollision" : true, < "bounces" : 0, < "damageSource" : { < "line" : [ [-1.0, -0.25], [-1.0, -100]], < "damage" : 10, < "damageSourceKind" : "electricplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "shortrightbeam" : { < "anchorPart" : "righthand", < "checkLineCollision" : true, < "bounces" : 0, < "damageSource" : { < "line" : [ [0, -0.5], [0, -10.5]], < "damage" : 10, < "damageSourceKind" : "electricplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "shortleftbeam" : { < "anchorPart" : "lefthand", < "checkLineCollision" : true, < "bounces" : 0, < "damageSource" : { < "line" : [ [-1.0, -0.25], [-1.0, -10.25]], < "damage" : 10, < "damageSourceKind" : "electricplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "weapon" : { < "anchorPart" : "swoosh", < "damageSource" : { < "poly" : [ [-0.75, 1.875], [0.75, 1.875], [2.5, 0.0], [2.5, -0.5], [0.75, -2.25], [-0.75, -2.25], [-2.25, -0.75], [-2.25, 0.25] ], < "damage" : 10, < "damageSourceKind" : "electrichammer", < "teamType" : "enemy", < "teamNumber" : 2, < "knockback" : [40, 0] < } < } < }, < < "movementSettings" : { < "gravityEnabled" : false, < "collisionPoly" : [ [2, 4], [2, -4], [-2, -4], [-2, 4] ], < "mass" : 1.0, < "flySpeed" : 16, < "airFriction" : 12.0, < "airForce" : 500.0, < "physicsEffectCategories" : ["boss"] < }, < < "knockoutTime" : 0.1, < "knockoutEffect" : "blink", < "deathParticles" : "deathPoof", < < "touchDamage" : { < "poly" : [ [-5, -13.5], [5, -13.5], [5, 5], [-5, 5] ], < "damage" : 20, < < "teamType" : "enemy", < "damageSourceKind" : "hammer", < "statusEffects" : [ ] < }, < < "statusSettings" : { < "statusProperties" : { < "targetMaterialKind" : "stone" < }, < < "appliesEnvironmentStatusEffects" : false, < "appliesWeatherStatusEffects" : false, < "minimumLiquidStatusEffectPercentage" : 0.1, < < "primaryScriptSources" : [ < "/stats/monster_primary.lua" < ], < "primaryScriptDelta" : 5, < < "stats" : { < "knockbackStunTime" : { < "baseValue" : 0.25 < }, < "grit" : { < "baseValue" : 1.0 < }, < "maxHealth" : { < "baseValue" : 2250 < }, < "protection" : { < "baseValue" : 0 < }, < "healthRegen" : { < "baseValue" : 0.0 < }, < "powerMultiplier" : { < "baseValue" : 1.0 < }, < "physicalResistance" : { < "baseValue" : 0.0 < }, < "fireResistance" : { < "baseValue" : 0.0 < }, < "fireStatusImmunity" : { < "baseValue" : 1.0 < }, < "iceResistance" : { < "baseValue" : 0.0 < }, < "iceStatusImmunity" : { < "baseValue" : 1.0 < }, < "electricResistance" : { < "baseValue" : 0.5 < }, < "electricStatusImmunity" : { < "baseValue" : 1.0 < }, < "poisonResistance" : { < "baseValue" : 0.0 < }, < "poisonStatusImmunity" : { < "baseValue" : 1.0 < }, < "specialStatusImmunity" : { < "baseValue" : 1.0 < }, < "healingStatusImmunity" : { < "baseValue" : 1.0 < }, < "stunImmunity" : { < "baseValue" : 1.0 < } < }, < < "resources" : { < "stunned" : { < "deltaValue" : -1.0, < "initialValue" : 0.0, < "maxValue" : 0.0 < }, < "health" : { < "maxStat" : "maxHealth", < "deltaStat" : "healthRegen", < "defaultPercentage" : 1.0 < } < } < }, < < "mouthOffset" : [0, 0], < "feetOffset" : [0, -8] < } < } --- > { > "type" : "electricguardianboss", > "shortdescription" : "Ancient Guardian", > "categories" : [ "guardianboss" ], > "parts" : [ "body", "head", "hip", "lefthand", "swoosh", "righthand", "legs", "shield" ], > > "animation" : "guardianboss.animation", > "reversed" : false, > > "dropPools" : [ { "default" : "guardianTreasure" } ], > > "baseParameters" : { > "monsterClass" : "guardianboss", > > "scripts" : [ > "/monsters/boss/guardianboss/guardian.lua" > ], > "animationScripts" : [ > "/items/active/effects/chain.lua" > ], > "animationCustom" : { > "sounds" : { > // "groundHazardWindup" : [ "/sfx/melee/staff_charge4_electric.ogg" ], > "groundHazardLoop" : [ "/sfx/npc/boss/guardian_floorhazard_electric_loop.ogg" ], > "groundHazardWinddown" : [ "/sfx/npc/boss/guardian_floorhazard_electric_end.ogg" ], > "dashSwoosh" : [ "/sfx/gun/rocket_electric1.ogg" ] > } > }, > > "colorSwap" : { "da5302" : "6060d6", "fd8f4d" : "8890e3", "fdd14d" : "a1acf7" }, > > "behavior" : "guardian", > "elementalType" : "electric", > > "handBeam" : { > "startSegmentImage" : "/monsters/boss/guardianboss/beams/beamstart.png:", > "segmentImage" : "/monsters/boss/guardianboss/beams/beam.png:", > "endSegmentImage" : "/monsters/boss/guardianboss/beams/beamend.png:", > "segmentSize" : 0.48, > "overdrawLength" : 0.2, > "taper" : 0, > "waveform" : { > "frequency" : 2.5, > "amplitude" : 0.125, > "movement" : 50.0 > }, > "fullbright" : true > }, > "spawnBeam" : { > "startSegmentImage" : "/monsters/boss/guardianboss/beams/spawnbeamstart.png", > "segmentImage" : "/monsters/boss/guardianboss/beams/spawnbeam.png", > "endSegmentImage" : "/monsters/boss/guardianboss/beams/spawnbeamend.png", > "segmentSize" : 0.48, > "overdrawLength" : 0.2, > "taper" : 0, > "waveform" : { > "frequency" : 5.0, > "amplitude" : 0.0625, > "movement" : 50.0 > }, > "fullbright" : true > }, > > "renderLayer" : "Projectile-100", > > "damageBar" : "None", > > "metaBoundBox" : [-80, -50, 80, 50], > "scale" : 1.0, > > "selfDamagePoly" : [ [2.5, 4], [2.5, -4], [-2.5, -4], [-2.5, 4] ], > > "animationDamageParts" : { > "righthand" : { > "anchorPart" : "righthand", > "checkLineCollision" : true, > "bounces" : 0, > "damageSource" : { > "line" : [ [0, -0.5], [0, -100]], > "damage" : 10, > "damageSourceKind" : "electricplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "bouncingbeam" : { > "anchorPart" : "righthand", > "checkLineCollision" : true, > "bounces" : 10, > "damageSource" : { > "line" : [ [0, -0.5], [0, -250]], > "damage" : 10, > "damageSourceKind" : "electricplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "lefthand" : { > "anchorPart" : "lefthand", > "checkLineCollision" : true, > "bounces" : 0, > "damageSource" : { > "line" : [ [-1.0, -0.25], [-1.0, -100]], > "damage" : 10, > "damageSourceKind" : "electricplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "shortrightbeam" : { > "anchorPart" : "righthand", > "checkLineCollision" : true, > "bounces" : 0, > "damageSource" : { > "line" : [ [0, -0.5], [0, -10.5]], > "damage" : 10, > "damageSourceKind" : "electricplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "shortleftbeam" : { > "anchorPart" : "lefthand", > "checkLineCollision" : true, > "bounces" : 0, > "damageSource" : { > "line" : [ [-1.0, -0.25], [-1.0, -10.25]], > "damage" : 10, > "damageSourceKind" : "electricplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "weapon" : { > "anchorPart" : "swoosh", > "damageSource" : { > "poly" : [ [-0.75, 1.875], [0.75, 1.875], [2.5, 0.0], [2.5, -0.5], [0.75, -2.25], [-0.75, -2.25], [-2.25, -0.75], [-2.25, 0.25] ], > "damage" : 10, > "damageSourceKind" : "electrichammer", > "teamType" : "enemy", > "teamNumber" : 2, > "knockback" : [40, 0] > } > } > }, > > "movementSettings" : { > "gravityEnabled" : false, > "collisionPoly" : [ [2, 4], [2, -4], [-2, -4], [-2, 4] ], > "mass" : 1.0, > "flySpeed" : 16, > "airFriction" : 12.0, > "airForce" : 500.0, > "physicsEffectCategories" : ["boss"] > }, > > "knockoutTime" : 0.1, > "knockoutEffect" : "blink", > "deathParticles" : "deathPoof", > > "touchDamage" : { > "poly" : [ [-5, -13.5], [5, -13.5], [5, 5], [-5, 5] ], > "damage" : 20, > > "teamType" : "enemy", > "damageSourceKind" : "hammer", > "statusEffects" : [ ] > }, > > "statusSettings" : { > "statusProperties" : { > "targetMaterialKind" : "stone" > }, > > "appliesEnvironmentStatusEffects" : false, > "appliesWeatherStatusEffects" : false, > "minimumLiquidStatusEffectPercentage" : 0.1, > > "primaryScriptSources" : [ > "/stats/monster_primary.lua" > ], > "primaryScriptDelta" : 5, > > "stats" : { > "knockbackStunTime" : { > "baseValue" : 0.25 > }, > "grit" : { > "baseValue" : 1.0 > }, > "maxHealth" : { > "baseValue" : 2250 > }, > "protection" : { > "baseValue" : 0 > }, > "healthRegen" : { > "baseValue" : 0.0 > }, > "powerMultiplier" : { > "baseValue" : 1.0 > }, > "physicalResistance" : { > "baseValue" : 0.0 > }, > "fireResistance" : { > "baseValue" : 0.0 > }, > "fireStatusImmunity" : { > "baseValue" : 1.0 > }, > "iceResistance" : { > "baseValue" : 0.0 > }, > "iceStatusImmunity" : { > "baseValue" : 1.0 > }, > "electricResistance" : { > "baseValue" : 0.5 > }, > "electricStatusImmunity" : { > "baseValue" : 1.0 > }, > "poisonResistance" : { > "baseValue" : 0.0 > }, > "poisonStatusImmunity" : { > "baseValue" : 1.0 > }, > "specialStatusImmunity" : { > "baseValue" : 1.0 > }, > "healingStatusImmunity" : { > "baseValue" : 1.0 > }, > "stunImmunity" : { > "baseValue" : 1.0 > } > }, > > "resources" : { > "stunned" : { > "deltaValue" : -1.0, > "initialValue" : 0.0, > "maxValue" : 0.0 > }, > "health" : { > "maxStat" : "maxHealth", > "deltaStat" : "healthRegen", > "defaultPercentage" : 1.0 > } > } > }, > > "mouthOffset" : [0, 0], > "feetOffset" : [0, -8] > } > } monsters\boss\guardianboss\fireguardianboss.monstertype 1,254c1,256 < { < "type" : "fireguardianboss", < "shortdescription" : "Ancient Guardian", < "categories" : [ "guardianboss" ], < "parts" : [ "body", "head", "hip", "lefthand", "swoosh", "righthand", "legs", "shield" ], < < "animation" : "guardianboss.animation", < "reversed" : false, < < "dropPools" : [ { "default" : "guardianTreasure" } ], < < "baseParameters" : { < "scripts" : [ < "/monsters/boss/guardianboss/guardian.lua" < ], < "animationScripts" : [ < "/items/active/effects/chain.lua" < ], < "animationCustom" : { < "sounds" : { < // "groundHazardWindup" : [ "/sfx/npc/boss/kluexboss_lavaplume.ogg" ], < "groundHazardLoop" : [ "/sfx/npc/boss/guardian_floorhazard_fire_loop.ogg" ], < "groundHazardWinddown" : [ "/sfx/npc/boss/guardian_floorhazard_fire_end.ogg" ], < "dashSwoosh" : [ "/sfx/gun/rocket_fire1.ogg" ] < } < }, < < "behavior" : "guardian", < "elementalType" : "fire", < < "handBeam" : { < "startSegmentImage" : "/monsters/boss/guardianboss/beams/beamstart.png:", < "segmentImage" : "/monsters/boss/guardianboss/beams/beam.png:", < "endSegmentImage" : "/monsters/boss/guardianboss/beams/beamend.png:", < "segmentSize" : 0.48, < "overdrawLength" : 0.2, < "taper" : 0, < "waveform" : { < "frequency" : 2.5, < "amplitude" : 0.125, < "movement" : 50.0 < }, < "fullbright" : true < }, < "spawnBeam" : { < "startSegmentImage" : "/monsters/boss/guardianboss/beams/spawnbeamstart.png", < "segmentImage" : "/monsters/boss/guardianboss/beams/spawnbeam.png", < "endSegmentImage" : "/monsters/boss/guardianboss/beams/spawnbeamend.png", < "segmentSize" : 0.48, < "overdrawLength" : 0.2, < "taper" : 0, < "waveform" : { < "frequency" : 5.0, < "amplitude" : 0.0625, < "movement" : 50.0 < }, < "fullbright" : true < }, < < "renderLayer" : "Projectile-100", < < "damageBar" : "None", < < "metaBoundBox" : [-80, -50, 80, 50], < "scale" : 1.0, < < "selfDamagePoly" : [ [2.5, 4], [2.5, -4], [-2.5, -4], [-2.5, 4] ], < < "animationDamageParts" : { < "righthand" : { < "anchorPart" : "righthand", < "checkLineCollision" : true, < "bounces" : 0, < "damageSource" : { < "line" : [ [0, -0.5], [0, -100]], < "damage" : 10, < "damageSourceKind" : "fireplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "bouncingbeam" : { < "anchorPart" : "righthand", < "checkLineCollision" : true, < "bounces" : 10, < "damageSource" : { < "line" : [ [0, -0.5], [0, -250]], < "damage" : 10, < "damageSourceKind" : "fireplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "lefthand" : { < "anchorPart" : "lefthand", < "checkLineCollision" : true, < "bounces" : 0, < "damageSource" : { < "line" : [ [-1.0, -0.25], [-1.0, -100]], < "damage" : 10, < "damageSourceKind" : "fireplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "shortrightbeam" : { < "anchorPart" : "righthand", < "checkLineCollision" : true, < "bounces" : 0, < "damageSource" : { < "line" : [ [0, -0.5], [0, -10.5]], < "damage" : 10, < "damageSourceKind" : "fireplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "shortleftbeam" : { < "anchorPart" : "lefthand", < "checkLineCollision" : true, < "bounces" : 0, < "damageSource" : { < "line" : [ [-1.0, -0.25], [-1.0, -10.25]], < "damage" : 10, < "damageSourceKind" : "fireplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "weapon" : { < "anchorPart" : "swoosh", < "damageSource" : { < "poly" : [ [-0.75, 1.875], [0.75, 1.875], [2.5, 0.0], [2.5, -0.5], [0.75, -2.25], [-0.75, -2.25], [-2.25, -0.75], [-2.25, 0.25] ], < "damage" : 10, < "damageSourceKind" : "firehammer", < "teamType" : "enemy", < "teamNumber" : 2, < "knockback" : [40, 0] < } < } < }, < < "movementSettings" : { < "gravityEnabled" : false, < "collisionPoly" : [ [2, 4], [2, -4], [-2, -4], [-2, 4] ], < "mass" : 1.0, < "flySpeed" : 16, < "airFriction" : 12.0, < "airForce" : 500.0, < "physicsEffectCategories" : ["boss"] < }, < < "knockoutTime" : 0.1, < "knockoutEffect" : "blink", < "deathParticles" : "deathPoof", < < "touchDamage" : { < "poly" : [ [-5, -13.5], [5, -13.5], [5, 5], [-5, 5] ], < "damage" : 20, < < "teamType" : "enemy", < "damageSourceKind" : "hammer", < "statusEffects" : [ ] < }, < < "statusSettings" : { < "statusProperties" : { < "targetMaterialKind" : "stone" < }, < < "appliesEnvironmentStatusEffects" : false, < "appliesWeatherStatusEffects" : false, < "minimumLiquidStatusEffectPercentage" : 0.1, < < "primaryScriptSources" : [ < "/stats/monster_primary.lua" < ], < "primaryScriptDelta" : 5, < < "stats" : { < "knockbackStunTime" : { < "baseValue" : 0.25 < }, < "grit" : { < "baseValue" : 1.0 < }, < "maxHealth" : { < "baseValue" : 2250 < }, < "protection" : { < "baseValue" : 0 < }, < "healthRegen" : { < "baseValue" : 0.0 < }, < "powerMultiplier" : { < "baseValue" : 1.0 < }, < "physicalResistance" : { < "baseValue" : 0.0 < }, < "fireResistance" : { < "baseValue" : 0.5 < }, < "fireStatusImmunity" : { < "baseValue" : 1.0 < }, < "iceResistance" : { < "baseValue" : 0.0 < }, < "iceStatusImmunity" : { < "baseValue" : 1.0 < }, < "electricResistance" : { < "baseValue" : 0.0 < }, < "electricStatusImmunity" : { < "baseValue" : 1.0 < }, < "poisonResistance" : { < "baseValue" : 0.0 < }, < "poisonStatusImmunity" : { < "baseValue" : 1.0 < }, < "specialStatusImmunity" : { < "baseValue" : 1.0 < }, < "healingStatusImmunity" : { < "baseValue" : 1.0 < }, < "stunImmunity" : { < "baseValue" : 1.0 < } < }, < < "resources" : { < "stunned" : { < "deltaValue" : -1.0, < "initialValue" : 0.0, < "maxValue" : 0.0 < }, < "health" : { < "maxStat" : "maxHealth", < "deltaStat" : "healthRegen", < "defaultPercentage" : 1.0 < } < } < }, < < "mouthOffset" : [0, 0], < "feetOffset" : [0, -8] < } < } --- > { > "type" : "fireguardianboss", > "shortdescription" : "Ancient Guardian", > "categories" : [ "guardianboss" ], > "parts" : [ "body", "head", "hip", "lefthand", "swoosh", "righthand", "legs", "shield" ], > > "animation" : "guardianboss.animation", > "reversed" : false, > > "dropPools" : [ { "default" : "guardianTreasure" } ], > > "baseParameters" : { > "monsterClass" : "guardianboss", > > "scripts" : [ > "/monsters/boss/guardianboss/guardian.lua" > ], > "animationScripts" : [ > "/items/active/effects/chain.lua" > ], > "animationCustom" : { > "sounds" : { > // "groundHazardWindup" : [ "/sfx/npc/boss/kluexboss_lavaplume.ogg" ], > "groundHazardLoop" : [ "/sfx/npc/boss/guardian_floorhazard_fire_loop.ogg" ], > "groundHazardWinddown" : [ "/sfx/npc/boss/guardian_floorhazard_fire_end.ogg" ], > "dashSwoosh" : [ "/sfx/gun/rocket_fire1.ogg" ] > } > }, > > "behavior" : "guardian", > "elementalType" : "fire", > > "handBeam" : { > "startSegmentImage" : "/monsters/boss/guardianboss/beams/beamstart.png:", > "segmentImage" : "/monsters/boss/guardianboss/beams/beam.png:", > "endSegmentImage" : "/monsters/boss/guardianboss/beams/beamend.png:", > "segmentSize" : 0.48, > "overdrawLength" : 0.2, > "taper" : 0, > "waveform" : { > "frequency" : 2.5, > "amplitude" : 0.125, > "movement" : 50.0 > }, > "fullbright" : true > }, > "spawnBeam" : { > "startSegmentImage" : "/monsters/boss/guardianboss/beams/spawnbeamstart.png", > "segmentImage" : "/monsters/boss/guardianboss/beams/spawnbeam.png", > "endSegmentImage" : "/monsters/boss/guardianboss/beams/spawnbeamend.png", > "segmentSize" : 0.48, > "overdrawLength" : 0.2, > "taper" : 0, > "waveform" : { > "frequency" : 5.0, > "amplitude" : 0.0625, > "movement" : 50.0 > }, > "fullbright" : true > }, > > "renderLayer" : "Projectile-100", > > "damageBar" : "None", > > "metaBoundBox" : [-80, -50, 80, 50], > "scale" : 1.0, > > "selfDamagePoly" : [ [2.5, 4], [2.5, -4], [-2.5, -4], [-2.5, 4] ], > > "animationDamageParts" : { > "righthand" : { > "anchorPart" : "righthand", > "checkLineCollision" : true, > "bounces" : 0, > "damageSource" : { > "line" : [ [0, -0.5], [0, -100]], > "damage" : 10, > "damageSourceKind" : "fireplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "bouncingbeam" : { > "anchorPart" : "righthand", > "checkLineCollision" : true, > "bounces" : 10, > "damageSource" : { > "line" : [ [0, -0.5], [0, -250]], > "damage" : 10, > "damageSourceKind" : "fireplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "lefthand" : { > "anchorPart" : "lefthand", > "checkLineCollision" : true, > "bounces" : 0, > "damageSource" : { > "line" : [ [-1.0, -0.25], [-1.0, -100]], > "damage" : 10, > "damageSourceKind" : "fireplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "shortrightbeam" : { > "anchorPart" : "righthand", > "checkLineCollision" : true, > "bounces" : 0, > "damageSource" : { > "line" : [ [0, -0.5], [0, -10.5]], > "damage" : 10, > "damageSourceKind" : "fireplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "shortleftbeam" : { > "anchorPart" : "lefthand", > "checkLineCollision" : true, > "bounces" : 0, > "damageSource" : { > "line" : [ [-1.0, -0.25], [-1.0, -10.25]], > "damage" : 10, > "damageSourceKind" : "fireplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "weapon" : { > "anchorPart" : "swoosh", > "damageSource" : { > "poly" : [ [-0.75, 1.875], [0.75, 1.875], [2.5, 0.0], [2.5, -0.5], [0.75, -2.25], [-0.75, -2.25], [-2.25, -0.75], [-2.25, 0.25] ], > "damage" : 10, > "damageSourceKind" : "firehammer", > "teamType" : "enemy", > "teamNumber" : 2, > "knockback" : [40, 0] > } > } > }, > > "movementSettings" : { > "gravityEnabled" : false, > "collisionPoly" : [ [2, 4], [2, -4], [-2, -4], [-2, 4] ], > "mass" : 1.0, > "flySpeed" : 16, > "airFriction" : 12.0, > "airForce" : 500.0, > "physicsEffectCategories" : ["boss"] > }, > > "knockoutTime" : 0.1, > "knockoutEffect" : "blink", > "deathParticles" : "deathPoof", > > "touchDamage" : { > "poly" : [ [-5, -13.5], [5, -13.5], [5, 5], [-5, 5] ], > "damage" : 20, > > "teamType" : "enemy", > "damageSourceKind" : "hammer", > "statusEffects" : [ ] > }, > > "statusSettings" : { > "statusProperties" : { > "targetMaterialKind" : "stone" > }, > > "appliesEnvironmentStatusEffects" : false, > "appliesWeatherStatusEffects" : false, > "minimumLiquidStatusEffectPercentage" : 0.1, > > "primaryScriptSources" : [ > "/stats/monster_primary.lua" > ], > "primaryScriptDelta" : 5, > > "stats" : { > "knockbackStunTime" : { > "baseValue" : 0.25 > }, > "grit" : { > "baseValue" : 1.0 > }, > "maxHealth" : { > "baseValue" : 2250 > }, > "protection" : { > "baseValue" : 0 > }, > "healthRegen" : { > "baseValue" : 0.0 > }, > "powerMultiplier" : { > "baseValue" : 1.0 > }, > "physicalResistance" : { > "baseValue" : 0.0 > }, > "fireResistance" : { > "baseValue" : 0.5 > }, > "fireStatusImmunity" : { > "baseValue" : 1.0 > }, > "iceResistance" : { > "baseValue" : 0.0 > }, > "iceStatusImmunity" : { > "baseValue" : 1.0 > }, > "electricResistance" : { > "baseValue" : 0.0 > }, > "electricStatusImmunity" : { > "baseValue" : 1.0 > }, > "poisonResistance" : { > "baseValue" : 0.0 > }, > "poisonStatusImmunity" : { > "baseValue" : 1.0 > }, > "specialStatusImmunity" : { > "baseValue" : 1.0 > }, > "healingStatusImmunity" : { > "baseValue" : 1.0 > }, > "stunImmunity" : { > "baseValue" : 1.0 > } > }, > > "resources" : { > "stunned" : { > "deltaValue" : -1.0, > "initialValue" : 0.0, > "maxValue" : 0.0 > }, > "health" : { > "maxStat" : "maxHealth", > "deltaStat" : "healthRegen", > "defaultPercentage" : 1.0 > } > } > }, > > "mouthOffset" : [0, 0], > "feetOffset" : [0, -8] > } > } monsters\boss\guardianboss\iceguardianboss.monstertype 1,256c1,258 < { < "type" : "iceguardianboss", < "shortdescription" : "Ancient Guardian", < "categories" : [ "guardianboss" ], < "parts" : [ "body", "head", "hip", "lefthand", "swoosh", "righthand", "legs", "shield" ], < < "animation" : "guardianboss.animation", < "reversed" : false, < < "dropPools" : [ { "default" : "guardianTreasure" } ], < < "baseParameters" : { < "scripts" : [ < "/monsters/boss/guardianboss/guardian.lua" < ], < "animationScripts" : [ < "/items/active/effects/chain.lua" < ], < "animationCustom" : { < "sounds" : { < // "groundHazardWindup" : [ "/sfx/melee/staff_charge3_ice.ogg" ], < "groundHazardLoop" : [ "/sfx/npc/boss/guardian_floorhazard_ice_loop.ogg" ], < "groundHazardWinddown" : [ "/sfx/npc/boss/guardian_floorhazard_ice_end.ogg" ], < "dashSwoosh" : [ "/sfx/gun/rocket_ice1.ogg" ] < } < }, < < "colorSwap" : { "da5302" : "549ec6", "fd8f4d" : "73bad8", "fdd14d" : "99e2f3" }, < < "behavior" : "guardian", < "elementalType" : "ice", < < "handBeam" : { < "startSegmentImage" : "/monsters/boss/guardianboss/beams/beamstart.png:", < "segmentImage" : "/monsters/boss/guardianboss/beams/beam.png:", < "endSegmentImage" : "/monsters/boss/guardianboss/beams/beamend.png:", < "segmentSize" : 0.48, < "overdrawLength" : 0.2, < "taper" : 0, < "waveform" : { < "frequency" : 2.5, < "amplitude" : 0.125, < "movement" : 50.0 < }, < "fullbright" : true < }, < "spawnBeam" : { < "startSegmentImage" : "/monsters/boss/guardianboss/beams/spawnbeamstart.png", < "segmentImage" : "/monsters/boss/guardianboss/beams/spawnbeam.png", < "endSegmentImage" : "/monsters/boss/guardianboss/beams/spawnbeamend.png", < "segmentSize" : 0.48, < "overdrawLength" : 0.2, < "taper" : 0, < "waveform" : { < "frequency" : 5.0, < "amplitude" : 0.0625, < "movement" : 50.0 < }, < "fullbright" : true < }, < < "renderLayer" : "Projectile-100", < < "damageBar" : "None", < < "metaBoundBox" : [-80, -50, 80, 50], < "scale" : 1.0, < < "selfDamagePoly" : [ [2.5, 4], [2.5, -4], [-2.5, -4], [-2.5, 4] ], < < "animationDamageParts" : { < "righthand" : { < "anchorPart" : "righthand", < "checkLineCollision" : true, < "bounces" : 0, < "damageSource" : { < "line" : [ [0, -0.5], [0, -100]], < "damage" : 10, < "damageSourceKind" : "iceplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "bouncingbeam" : { < "anchorPart" : "righthand", < "checkLineCollision" : true, < "bounces" : 10, < "damageSource" : { < "line" : [ [0, -0.5], [0, -250]], < "damage" : 10, < "damageSourceKind" : "iceplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "lefthand" : { < "anchorPart" : "lefthand", < "checkLineCollision" : true, < "bounces" : 0, < "damageSource" : { < "line" : [ [-1.0, -0.25], [-1.0, -100]], < "damage" : 10, < "damageSourceKind" : "iceplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "shortrightbeam" : { < "anchorPart" : "lefthand", < "checkLineCollision" : true, < "bounces" : 0, < "damageSource" : { < "line" : [ [0, -0.5], [0, -10.5]], < "damage" : 10, < "damageSourceKind" : "iceplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "shortleftbeam" : { < "anchorPart" : "lefthand", < "checkLineCollision" : true, < "bounces" : 0, < "damageSource" : { < "line" : [ [-1.0, -0.25], [-1.0, -10.25]], < "damage" : 10, < "damageSourceKind" : "iceplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "weapon" : { < "anchorPart" : "swoosh", < "damageSource" : { < "poly" : [ [-0.75, 1.875], [0.75, 1.875], [2.5, 0.0], [2.5, -0.5], [0.75, -2.25], [-0.75, -2.25], [-2.25, -0.75], [-2.25, 0.25] ], < "damage" : 10, < "damageSourceKind" : "icehammer", < "teamType" : "enemy", < "teamNumber" : 2, < "knockback" : [40, 0] < } < } < }, < < "movementSettings" : { < "gravityEnabled" : false, < "collisionPoly" : [ [2, 4], [2, -4], [-2, -4], [-2, 4] ], < "mass" : 1.0, < "flySpeed" : 16, < "airFriction" : 12.0, < "airForce" : 500.0, < "physicsEffectCategories" : ["boss"] < }, < < "knockoutTime" : 0.1, < "knockoutEffect" : "blink", < "deathParticles" : "deathPoof", < < "touchDamage" : { < "poly" : [ [-5, -13.5], [5, -13.5], [5, 5], [-5, 5] ], < "damage" : 20, < < "teamType" : "enemy", < "damageSourceKind" : "hammer", < "statusEffects" : [ ] < }, < < "statusSettings" : { < "statusProperties" : { < "targetMaterialKind" : "stone" < }, < < "appliesEnvironmentStatusEffects" : false, < "appliesWeatherStatusEffects" : false, < "minimumLiquidStatusEffectPercentage" : 0.1, < < "primaryScriptSources" : [ < "/stats/monster_primary.lua" < ], < "primaryScriptDelta" : 5, < < "stats" : { < "knockbackStunTime" : { < "baseValue" : 0.25 < }, < "grit" : { < "baseValue" : 1.0 < }, < "maxHealth" : { < "baseValue" : 2250 < }, < "protection" : { < "baseValue" : 0 < }, < "healthRegen" : { < "baseValue" : 0.0 < }, < "powerMultiplier" : { < "baseValue" : 1.0 < }, < "physicalResistance" : { < "baseValue" : 0.0 < }, < "fireResistance" : { < "baseValue" : 0.0 < }, < "fireStatusImmunity" : { < "baseValue" : 1.0 < }, < "iceResistance" : { < "baseValue" : 0.5 < }, < "iceStatusImmunity" : { < "baseValue" : 1.0 < }, < "electricResistance" : { < "baseValue" : 0.0 < }, < "electricStatusImmunity" : { < "baseValue" : 1.0 < }, < "poisonResistance" : { < "baseValue" : 0.0 < }, < "poisonStatusImmunity" : { < "baseValue" : 1.0 < }, < "specialStatusImmunity" : { < "baseValue" : 1.0 < }, < "healingStatusImmunity" : { < "baseValue" : 1.0 < }, < "stunImmunity" : { < "baseValue" : 1.0 < } < }, < < "resources" : { < "stunned" : { < "deltaValue" : -1.0, < "initialValue" : 0.0, < "maxValue" : 0.0 < }, < "health" : { < "maxStat" : "maxHealth", < "deltaStat" : "healthRegen", < "defaultPercentage" : 1.0 < } < } < }, < < "mouthOffset" : [0, 0], < "feetOffset" : [0, -8] < } < } --- > { > "type" : "iceguardianboss", > "shortdescription" : "Ancient Guardian", > "categories" : [ "guardianboss" ], > "parts" : [ "body", "head", "hip", "lefthand", "swoosh", "righthand", "legs", "shield" ], > > "animation" : "guardianboss.animation", > "reversed" : false, > > "dropPools" : [ { "default" : "guardianTreasure" } ], > > "baseParameters" : { > "monsterClass" : "guardianboss", > > "scripts" : [ > "/monsters/boss/guardianboss/guardian.lua" > ], > "animationScripts" : [ > "/items/active/effects/chain.lua" > ], > "animationCustom" : { > "sounds" : { > // "groundHazardWindup" : [ "/sfx/melee/staff_charge3_ice.ogg" ], > "groundHazardLoop" : [ "/sfx/npc/boss/guardian_floorhazard_ice_loop.ogg" ], > "groundHazardWinddown" : [ "/sfx/npc/boss/guardian_floorhazard_ice_end.ogg" ], > "dashSwoosh" : [ "/sfx/gun/rocket_ice1.ogg" ] > } > }, > > "colorSwap" : { "da5302" : "549ec6", "fd8f4d" : "73bad8", "fdd14d" : "99e2f3" }, > > "behavior" : "guardian", > "elementalType" : "ice", > > "handBeam" : { > "startSegmentImage" : "/monsters/boss/guardianboss/beams/beamstart.png:", > "segmentImage" : "/monsters/boss/guardianboss/beams/beam.png:", > "endSegmentImage" : "/monsters/boss/guardianboss/beams/beamend.png:", > "segmentSize" : 0.48, > "overdrawLength" : 0.2, > "taper" : 0, > "waveform" : { > "frequency" : 2.5, > "amplitude" : 0.125, > "movement" : 50.0 > }, > "fullbright" : true > }, > "spawnBeam" : { > "startSegmentImage" : "/monsters/boss/guardianboss/beams/spawnbeamstart.png", > "segmentImage" : "/monsters/boss/guardianboss/beams/spawnbeam.png", > "endSegmentImage" : "/monsters/boss/guardianboss/beams/spawnbeamend.png", > "segmentSize" : 0.48, > "overdrawLength" : 0.2, > "taper" : 0, > "waveform" : { > "frequency" : 5.0, > "amplitude" : 0.0625, > "movement" : 50.0 > }, > "fullbright" : true > }, > > "renderLayer" : "Projectile-100", > > "damageBar" : "None", > > "metaBoundBox" : [-80, -50, 80, 50], > "scale" : 1.0, > > "selfDamagePoly" : [ [2.5, 4], [2.5, -4], [-2.5, -4], [-2.5, 4] ], > > "animationDamageParts" : { > "righthand" : { > "anchorPart" : "righthand", > "checkLineCollision" : true, > "bounces" : 0, > "damageSource" : { > "line" : [ [0, -0.5], [0, -100]], > "damage" : 10, > "damageSourceKind" : "iceplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "bouncingbeam" : { > "anchorPart" : "righthand", > "checkLineCollision" : true, > "bounces" : 10, > "damageSource" : { > "line" : [ [0, -0.5], [0, -250]], > "damage" : 10, > "damageSourceKind" : "iceplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "lefthand" : { > "anchorPart" : "lefthand", > "checkLineCollision" : true, > "bounces" : 0, > "damageSource" : { > "line" : [ [-1.0, -0.25], [-1.0, -100]], > "damage" : 10, > "damageSourceKind" : "iceplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "shortrightbeam" : { > "anchorPart" : "lefthand", > "checkLineCollision" : true, > "bounces" : 0, > "damageSource" : { > "line" : [ [0, -0.5], [0, -10.5]], > "damage" : 10, > "damageSourceKind" : "iceplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "shortleftbeam" : { > "anchorPart" : "lefthand", > "checkLineCollision" : true, > "bounces" : 0, > "damageSource" : { > "line" : [ [-1.0, -0.25], [-1.0, -10.25]], > "damage" : 10, > "damageSourceKind" : "iceplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "weapon" : { > "anchorPart" : "swoosh", > "damageSource" : { > "poly" : [ [-0.75, 1.875], [0.75, 1.875], [2.5, 0.0], [2.5, -0.5], [0.75, -2.25], [-0.75, -2.25], [-2.25, -0.75], [-2.25, 0.25] ], > "damage" : 10, > "damageSourceKind" : "icehammer", > "teamType" : "enemy", > "teamNumber" : 2, > "knockback" : [40, 0] > } > } > }, > > "movementSettings" : { > "gravityEnabled" : false, > "collisionPoly" : [ [2, 4], [2, -4], [-2, -4], [-2, 4] ], > "mass" : 1.0, > "flySpeed" : 16, > "airFriction" : 12.0, > "airForce" : 500.0, > "physicsEffectCategories" : ["boss"] > }, > > "knockoutTime" : 0.1, > "knockoutEffect" : "blink", > "deathParticles" : "deathPoof", > > "touchDamage" : { > "poly" : [ [-5, -13.5], [5, -13.5], [5, 5], [-5, 5] ], > "damage" : 20, > > "teamType" : "enemy", > "damageSourceKind" : "hammer", > "statusEffects" : [ ] > }, > > "statusSettings" : { > "statusProperties" : { > "targetMaterialKind" : "stone" > }, > > "appliesEnvironmentStatusEffects" : false, > "appliesWeatherStatusEffects" : false, > "minimumLiquidStatusEffectPercentage" : 0.1, > > "primaryScriptSources" : [ > "/stats/monster_primary.lua" > ], > "primaryScriptDelta" : 5, > > "stats" : { > "knockbackStunTime" : { > "baseValue" : 0.25 > }, > "grit" : { > "baseValue" : 1.0 > }, > "maxHealth" : { > "baseValue" : 2250 > }, > "protection" : { > "baseValue" : 0 > }, > "healthRegen" : { > "baseValue" : 0.0 > }, > "powerMultiplier" : { > "baseValue" : 1.0 > }, > "physicalResistance" : { > "baseValue" : 0.0 > }, > "fireResistance" : { > "baseValue" : 0.0 > }, > "fireStatusImmunity" : { > "baseValue" : 1.0 > }, > "iceResistance" : { > "baseValue" : 0.5 > }, > "iceStatusImmunity" : { > "baseValue" : 1.0 > }, > "electricResistance" : { > "baseValue" : 0.0 > }, > "electricStatusImmunity" : { > "baseValue" : 1.0 > }, > "poisonResistance" : { > "baseValue" : 0.0 > }, > "poisonStatusImmunity" : { > "baseValue" : 1.0 > }, > "specialStatusImmunity" : { > "baseValue" : 1.0 > }, > "healingStatusImmunity" : { > "baseValue" : 1.0 > }, > "stunImmunity" : { > "baseValue" : 1.0 > } > }, > > "resources" : { > "stunned" : { > "deltaValue" : -1.0, > "initialValue" : 0.0, > "maxValue" : 0.0 > }, > "health" : { > "maxStat" : "maxHealth", > "deltaStat" : "healthRegen", > "defaultPercentage" : 1.0 > } > } > }, > > "mouthOffset" : [0, 0], > "feetOffset" : [0, -8] > } > } monsters\boss\guardianboss\poisonguardianboss.monstertype 1,256c1,258 < { < "type" : "poisonguardianboss", < "shortdescription" : "Ancient Guardian", < "categories" : [ "guardianboss" ], < "parts" : [ "body", "head", "hip", "lefthand", "swoosh", "righthand", "legs", "shield" ], < < "animation" : "guardianboss.animation", < "reversed" : false, < < "dropPools" : [ { "default" : "guardianTreasure" } ], < < "baseParameters" : { < "scripts" : [ < "/monsters/boss/guardianboss/guardian.lua" < ], < "animationScripts" : [ < "/items/active/effects/chain.lua" < ], < "animationCustom" : { < "sounds" : { < // "groundHazardWindup" : [ "/sfx/melee/staff_charge1_poison.ogg" ], < "groundHazardLoop" : [ "/sfx/npc/boss/guardian_floorhazard_poison_loop.ogg" ], < "groundHazardWinddown" : [ "/sfx/npc/boss/guardian_floorhazard_poison_end.ogg" ], < "dashSwoosh" : [ "/sfx/gun/rocket_poison1.ogg" ] < } < }, < < "colorSwap" : { "da5302" : "869e45", "fd8f4d" : "bcd773", "fdd14d" : "e3f4b7" }, < < "behavior" : "guardian", < "elementalType" : "poison", < < "handBeam" : { < "startSegmentImage" : "/monsters/boss/guardianboss/beams/beamstart.png:", < "segmentImage" : "/monsters/boss/guardianboss/beams/beam.png:", < "endSegmentImage" : "/monsters/boss/guardianboss/beams/beamend.png:", < "segmentSize" : 0.48, < "overdrawLength" : 0.2, < "taper" : 0, < "waveform" : { < "frequency" : 2.5, < "amplitude" : 0.125, < "movement" : 50.0 < }, < "fullbright" : true < }, < "spawnBeam" : { < "startSegmentImage" : "/monsters/boss/guardianboss/beams/spawnbeamstart.png", < "segmentImage" : "/monsters/boss/guardianboss/beams/spawnbeam.png", < "endSegmentImage" : "/monsters/boss/guardianboss/beams/spawnbeamend.png", < "segmentSize" : 0.48, < "overdrawLength" : 0.2, < "taper" : 0, < "waveform" : { < "frequency" : 5.0, < "amplitude" : 0.0625, < "movement" : 50.0 < }, < "fullbright" : true < }, < < "renderLayer" : "Projectile-100", < < "damageBar" : "None", < < "metaBoundBox" : [-80, -50, 80, 50], < "scale" : 1.0, < < "selfDamagePoly" : [ [2.5, 4], [2.5, -4], [-2.5, -4], [-2.5, 4] ], < < "animationDamageParts" : { < "righthand" : { < "anchorPart" : "righthand", < "checkLineCollision" : true, < "bounces" : 0, < "damageSource" : { < "line" : [ [0, -0.5], [0, -100]], < "damage" : 10, < "damageSourceKind" : "poisonplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "bouncingbeam" : { < "anchorPart" : "righthand", < "checkLineCollision" : true, < "bounces" : 10, < "damageSource" : { < "line" : [ [0, -0.5], [0, -250]], < "damage" : 10, < "damageSourceKind" : "poisonplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "lefthand" : { < "anchorPart" : "lefthand", < "checkLineCollision" : true, < "bounces" : 0, < "damageSource" : { < "line" : [ [-1.0, -0.25], [-1.0, -100]], < "damage" : 10, < "damageSourceKind" : "poisonplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "shortrightbeam" : { < "anchorPart" : "lefthand", < "checkLineCollision" : true, < "bounces" : 0, < "damageSource" : { < "line" : [ [0, -0.5], [0, -10.5]], < "damage" : 10, < "damageSourceKind" : "poisonplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "shortleftbeam" : { < "anchorPart" : "lefthand", < "checkLineCollision" : true, < "bounces" : 0, < "damageSource" : { < "line" : [ [-1.0, -0.25], [-1.0, -10.25]], < "damage" : 10, < "damageSourceKind" : "poisonplasma", < "teamType" : "enemy", < "teamNumber" : 2 < } < }, < "weapon" : { < "anchorPart" : "swoosh", < "damageSource" : { < "poly" : [ [-0.75, 1.875], [0.75, 1.875], [2.5, 0.0], [2.5, -0.5], [0.75, -2.25], [-0.75, -2.25], [-2.25, -0.75], [-2.25, 0.25] ], < "damage" : 10, < "damageSourceKind" : "poisonhammer", < "teamType" : "enemy", < "teamNumber" : 2, < "knockback" : [40, 0] < } < } < }, < < "movementSettings" : { < "gravityEnabled" : false, < "collisionPoly" : [ [2, 4], [2, -4], [-2, -4], [-2, 4] ], < "mass" : 1.0, < "flySpeed" : 16, < "airFriction" : 12.0, < "airForce" : 500.0, < "physicsEffectCategories" : ["boss"] < }, < < "knockoutTime" : 0.1, < "knockoutEffect" : "blink", < "deathParticles" : "deathPoof", < < "touchDamage" : { < "poly" : [ [-5, -13.5], [5, -13.5], [5, 5], [-5, 5] ], < "damage" : 20, < < "teamType" : "enemy", < "damageSourceKind" : "hammer", < "statusEffects" : [ ] < }, < < "statusSettings" : { < "statusProperties" : { < "targetMaterialKind" : "stone" < }, < < "appliesEnvironmentStatusEffects" : false, < "appliesWeatherStatusEffects" : false, < "minimumLiquidStatusEffectPercentage" : 0.1, < < "primaryScriptSources" : [ < "/stats/monster_primary.lua" < ], < "primaryScriptDelta" : 5, < < "stats" : { < "knockbackStunTime" : { < "baseValue" : 0.25 < }, < "grit" : { < "baseValue" : 1.0 < }, < "maxHealth" : { < "baseValue" : 2250 < }, < "protection" : { < "baseValue" : 0 < }, < "healthRegen" : { < "baseValue" : 0.0 < }, < "powerMultiplier" : { < "baseValue" : 1.0 < }, < "physicalResistance" : { < "baseValue" : 0.0 < }, < "fireResistance" : { < "baseValue" : 0.0 < }, < "fireStatusImmunity" : { < "baseValue" : 1.0 < }, < "iceResistance" : { < "baseValue" : 0.0 < }, < "iceStatusImmunity" : { < "baseValue" : 1.0 < }, < "electricResistance" : { < "baseValue" : 0.0 < }, < "electricStatusImmunity" : { < "baseValue" : 1.0 < }, < "poisonResistance" : { < "baseValue" : 0.5 < }, < "poisonStatusImmunity" : { < "baseValue" : 1.0 < }, < "specialStatusImmunity" : { < "baseValue" : 1.0 < }, < "healingStatusImmunity" : { < "baseValue" : 1.0 < }, < "stunImmunity" : { < "baseValue" : 1.0 < } < }, < < "resources" : { < "stunned" : { < "deltaValue" : -1.0, < "initialValue" : 0.0, < "maxValue" : 0.0 < }, < "health" : { < "maxStat" : "maxHealth", < "deltaStat" : "healthRegen", < "defaultPercentage" : 1.0 < } < } < }, < < "mouthOffset" : [0, 0], < "feetOffset" : [0, -8] < } < } --- > { > "type" : "poisonguardianboss", > "shortdescription" : "Ancient Guardian", > "categories" : [ "guardianboss" ], > "parts" : [ "body", "head", "hip", "lefthand", "swoosh", "righthand", "legs", "shield" ], > > "animation" : "guardianboss.animation", > "reversed" : false, > > "dropPools" : [ { "default" : "guardianTreasure" } ], > > "baseParameters" : { > "monsterClass" : "guardianboss", > > "scripts" : [ > "/monsters/boss/guardianboss/guardian.lua" > ], > "animationScripts" : [ > "/items/active/effects/chain.lua" > ], > "animationCustom" : { > "sounds" : { > // "groundHazardWindup" : [ "/sfx/melee/staff_charge1_poison.ogg" ], > "groundHazardLoop" : [ "/sfx/npc/boss/guardian_floorhazard_poison_loop.ogg" ], > "groundHazardWinddown" : [ "/sfx/npc/boss/guardian_floorhazard_poison_end.ogg" ], > "dashSwoosh" : [ "/sfx/gun/rocket_poison1.ogg" ] > } > }, > > "colorSwap" : { "da5302" : "869e45", "fd8f4d" : "bcd773", "fdd14d" : "e3f4b7" }, > > "behavior" : "guardian", > "elementalType" : "poison", > > "handBeam" : { > "startSegmentImage" : "/monsters/boss/guardianboss/beams/beamstart.png:", > "segmentImage" : "/monsters/boss/guardianboss/beams/beam.png:", > "endSegmentImage" : "/monsters/boss/guardianboss/beams/beamend.png:", > "segmentSize" : 0.48, > "overdrawLength" : 0.2, > "taper" : 0, > "waveform" : { > "frequency" : 2.5, > "amplitude" : 0.125, > "movement" : 50.0 > }, > "fullbright" : true > }, > "spawnBeam" : { > "startSegmentImage" : "/monsters/boss/guardianboss/beams/spawnbeamstart.png", > "segmentImage" : "/monsters/boss/guardianboss/beams/spawnbeam.png", > "endSegmentImage" : "/monsters/boss/guardianboss/beams/spawnbeamend.png", > "segmentSize" : 0.48, > "overdrawLength" : 0.2, > "taper" : 0, > "waveform" : { > "frequency" : 5.0, > "amplitude" : 0.0625, > "movement" : 50.0 > }, > "fullbright" : true > }, > > "renderLayer" : "Projectile-100", > > "damageBar" : "None", > > "metaBoundBox" : [-80, -50, 80, 50], > "scale" : 1.0, > > "selfDamagePoly" : [ [2.5, 4], [2.5, -4], [-2.5, -4], [-2.5, 4] ], > > "animationDamageParts" : { > "righthand" : { > "anchorPart" : "righthand", > "checkLineCollision" : true, > "bounces" : 0, > "damageSource" : { > "line" : [ [0, -0.5], [0, -100]], > "damage" : 10, > "damageSourceKind" : "poisonplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "bouncingbeam" : { > "anchorPart" : "righthand", > "checkLineCollision" : true, > "bounces" : 10, > "damageSource" : { > "line" : [ [0, -0.5], [0, -250]], > "damage" : 10, > "damageSourceKind" : "poisonplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "lefthand" : { > "anchorPart" : "lefthand", > "checkLineCollision" : true, > "bounces" : 0, > "damageSource" : { > "line" : [ [-1.0, -0.25], [-1.0, -100]], > "damage" : 10, > "damageSourceKind" : "poisonplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "shortrightbeam" : { > "anchorPart" : "lefthand", > "checkLineCollision" : true, > "bounces" : 0, > "damageSource" : { > "line" : [ [0, -0.5], [0, -10.5]], > "damage" : 10, > "damageSourceKind" : "poisonplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "shortleftbeam" : { > "anchorPart" : "lefthand", > "checkLineCollision" : true, > "bounces" : 0, > "damageSource" : { > "line" : [ [-1.0, -0.25], [-1.0, -10.25]], > "damage" : 10, > "damageSourceKind" : "poisonplasma", > "teamType" : "enemy", > "teamNumber" : 2 > } > }, > "weapon" : { > "anchorPart" : "swoosh", > "damageSource" : { > "poly" : [ [-0.75, 1.875], [0.75, 1.875], [2.5, 0.0], [2.5, -0.5], [0.75, -2.25], [-0.75, -2.25], [-2.25, -0.75], [-2.25, 0.25] ], > "damage" : 10, > "damageSourceKind" : "poisonhammer", > "teamType" : "enemy", > "teamNumber" : 2, > "knockback" : [40, 0] > } > } > }, > > "movementSettings" : { > "gravityEnabled" : false, > "collisionPoly" : [ [2, 4], [2, -4], [-2, -4], [-2, 4] ], > "mass" : 1.0, > "flySpeed" : 16, > "airFriction" : 12.0, > "airForce" : 500.0, > "physicsEffectCategories" : ["boss"] > }, > > "knockoutTime" : 0.1, > "knockoutEffect" : "blink", > "deathParticles" : "deathPoof", > > "touchDamage" : { > "poly" : [ [-5, -13.5], [5, -13.5], [5, 5], [-5, 5] ], > "damage" : 20, > > "teamType" : "enemy", > "damageSourceKind" : "hammer", > "statusEffects" : [ ] > }, > > "statusSettings" : { > "statusProperties" : { > "targetMaterialKind" : "stone" > }, > > "appliesEnvironmentStatusEffects" : false, > "appliesWeatherStatusEffects" : false, > "minimumLiquidStatusEffectPercentage" : 0.1, > > "primaryScriptSources" : [ > "/stats/monster_primary.lua" > ], > "primaryScriptDelta" : 5, > > "stats" : { > "knockbackStunTime" : { > "baseValue" : 0.25 > }, > "grit" : { > "baseValue" : 1.0 > }, > "maxHealth" : { > "baseValue" : 2250 > }, > "protection" : { > "baseValue" : 0 > }, > "healthRegen" : { > "baseValue" : 0.0 > }, > "powerMultiplier" : { > "baseValue" : 1.0 > }, > "physicalResistance" : { > "baseValue" : 0.0 > }, > "fireResistance" : { > "baseValue" : 0.0 > }, > "fireStatusImmunity" : { > "baseValue" : 1.0 > }, > "iceResistance" : { > "baseValue" : 0.0 > }, > "iceStatusImmunity" : { > "baseValue" : 1.0 > }, > "electricResistance" : { > "baseValue" : 0.0 > }, > "electricStatusImmunity" : { > "baseValue" : 1.0 > }, > "poisonResistance" : { > "baseValue" : 0.5 > }, > "poisonStatusImmunity" : { > "baseValue" : 1.0 > }, > "specialStatusImmunity" : { > "baseValue" : 1.0 > }, > "healingStatusImmunity" : { > "baseValue" : 1.0 > }, > "stunImmunity" : { > "baseValue" : 1.0 > } > }, > > "resources" : { > "stunned" : { > "deltaValue" : -1.0, > "initialValue" : 0.0, > "maxValue" : 0.0 > }, > "health" : { > "maxStat" : "maxHealth", > "deltaStat" : "healthRegen", > "defaultPercentage" : 1.0 > } > } > }, > > "mouthOffset" : [0, 0], > "feetOffset" : [0, -8] > } > } monsters\boss\kluexboss\kluexboss.monstertype 1,188c1,190 < { < "type" : "kluexboss", < "shortdescription" : "Kluex Avatar", < "categories" : [ "kluexboss" ], < "parts" : [ "body", "bodylit", "lavaplume", "spinvortex" ], < < "animation" : "kluexboss.animation", < "dropPools" : [ < { < "default" : "kluexavatarTreasure" < } < ], < < "baseParameters" : { < "scripts" : [ < "/monsters/monster.lua" < ], < "initialScriptDelta" : 1, < "behaviorUpdateDelta" : 1, < < "behavior" : "kluexboss", < < "behaviorConfig" : { < "colorChangeWindup" : 0.4, < "colorChangeWinddown" : 0.4, < < "windupTime" : 0.4, < "fastWindupTime" : 0.15, < < "plasmaAttackFlySpeed" : 50, < "plasmaAttackX" : 20, < "plasmaAttackY" : 15, < "plasmaMinY" : 0 < }, < < "forceRegions" : { < "left" : { < "type" : "DirectionalForceRegion", < "rectRegion" : [-32, -5, -2, 25], < "xTargetVelocity" : 100, < "controlForce" : 80, < "categoryWhitelist" : [ "player" ] < }, < "right" : { < "type" : "DirectionalForceRegion", < "rectRegion" : [2, -5, 32, 25], < "xTargetVelocity" : -100, < "controlForce" : 80, < "categoryWhitelist" : [ "player" ] < } < }, < < "damageParts" : { < "spinvortex" : { < "damage" : 10, < < "teamType" : "enemy", < "damageSourceKind" : "default" < }, < "lavaplume" : { < "damage" : 20, < < "teamType" : "enemy", < "damageSourceKind" : "default" < } < }, < < "damageSources" : { < "windswept" : { < "poly" : [ [-32, -5], [-32, 25], [32, 25], [32, -5] ], < "damage" : 0.0, < < "teamType" : "enemy", < "damageSourceKind" : "hidden", < "statusEffects" : [ "windswept" ], < < "damageRepeatTimeout" : 0.5 < } < }, < < "knockoutTime" : 0, < "knockoutEffect" : "blink", < "deathParticles" : "destroy", < < "portraitIcon" : "/monsters/boss/kluexboss/kluexboss.png:red.idle.1", < < "metaBoundBox" : [-50, -50, 50, 50], < "scale" : 1.0, < < "movementSettings" : { < "gravityEnabled" : false, < "collisionPoly" : [ [ 1.25, -2.75], [2.75, -1.25], [3.5, 4.0], [3.0, 5.0], [-3.0, 5.0], [-3.5, 4.0], [-2.75, -1.25], [-1.25, -2.75] ], < < "mass" : 4.0, < "walkSpeed" : 5, < "runSpeed" : 13, < "flySpeed" : 11, < "airFriction" : 0.5, < "airForce" : 800.0, < "airJumpProfile" : { < "jumpControlForce" : 0, < "jumpInitialPercentage" : 0 < }, < "physicsEffectCategories" : ["boss"] < }, < < "touchDamage" : { < "poly" : [ [-4, -3], [0, -3], [0, 0], [-4, 0] ], < "damage" : 20, < < "teamType" : "enemy", < "statusEffects" : [ ] < }, < < "statusSettings" : { < "statusProperties" : { < "targetMaterialKind" : "stone" < }, < < "appliesEnvironmentStatusEffects" : false, < "appliesWeatherStatusEffects" : false, < "minimumLiquidStatusEffectPercentage" : 0.1, < < "primaryScriptSources" : [ < "/stats/monster_primary.lua" < ], < "primaryScriptDelta" : 5, < < "stats" : { < "knockbackStunTime" : { < "baseValue" : 0.25 < }, < "grit" : { < "baseValue" : 1.0 < }, < "maxHealth" : { < "baseValue" : 1000 < }, < "protection" : { < "baseValue" : 0 < }, < "healthRegen" : { < "baseValue" : 0.0 < }, < "fireStatusImmunity" : { < "baseValue" : 1.0 < }, < "iceStatusImmunity" : { < "baseValue" : 1.0 < }, < "electricStatusImmunity" : { < "baseValue" : 1.0 < }, < "poisonStatusImmunity" : { < "baseValue" : 1.0 < }, < "specialStatusImmunity" : { < "baseValue" : 1.0 < }, < "healingStatusImmunity" : { < "baseValue" : 1.0 < }, < "stunImmunity" : { < "baseValue" : 1.0 < }, < "powerMultiplier" : { < "baseValue" : 1.0 < } < }, < < "resources" : { < "stunned" : { < "deltaValue" : -1.0, < "initialValue" : 0.0, < "maxValue" : 0.0 < }, < "health" : { < "maxStat" : "maxHealth", < "deltaStat" : "healthRegen", < "defaultPercentage" : 1.0 < } < } < }, < < "mouthOffset" : [1.0, -1.5], < "feetOffset" : [0, -21] < } < } --- > { > "type" : "kluexboss", > "shortdescription" : "Kluex Avatar", > "categories" : [ "kluexboss" ], > "parts" : [ "body", "bodylit", "lavaplume", "spinvortex" ], > > "animation" : "kluexboss.animation", > "dropPools" : [ > { > "default" : "kluexavatarTreasure" > } > ], > > "baseParameters" : { > "monsterClass" : "boss", > > "scripts" : [ > "/monsters/monster.lua" > ], > "initialScriptDelta" : 1, > "behaviorUpdateDelta" : 1, > > "behavior" : "kluexboss", > > "behaviorConfig" : { > "colorChangeWindup" : 0.4, > "colorChangeWinddown" : 0.4, > > "windupTime" : 0.4, > "fastWindupTime" : 0.15, > > "plasmaAttackFlySpeed" : 50, > "plasmaAttackX" : 20, > "plasmaAttackY" : 15, > "plasmaMinY" : 0 > }, > > "forceRegions" : { > "left" : { > "type" : "DirectionalForceRegion", > "rectRegion" : [-32, -5, -2, 25], > "xTargetVelocity" : 100, > "controlForce" : 80, > "categoryWhitelist" : [ "player" ] > }, > "right" : { > "type" : "DirectionalForceRegion", > "rectRegion" : [2, -5, 32, 25], > "xTargetVelocity" : -100, > "controlForce" : 80, > "categoryWhitelist" : [ "player" ] > } > }, > > "damageParts" : { > "spinvortex" : { > "damage" : 10, > > "teamType" : "enemy", > "damageSourceKind" : "default" > }, > "lavaplume" : { > "damage" : 20, > > "teamType" : "enemy", > "damageSourceKind" : "default" > } > }, > > "damageSources" : { > "windswept" : { > "poly" : [ [-32, -5], [-32, 25], [32, 25], [32, -5] ], > "damage" : 0.0, > > "teamType" : "enemy", > "damageSourceKind" : "hidden", > "statusEffects" : [ "windswept" ], > > "damageRepeatTimeout" : 0.5 > } > }, > > "knockoutTime" : 0, > "knockoutEffect" : "blink", > "deathParticles" : "destroy", > > "portraitIcon" : "/monsters/boss/kluexboss/kluexboss.png:red.idle.1", > > "metaBoundBox" : [-50, -50, 50, 50], > "scale" : 1.0, > > "movementSettings" : { > "gravityEnabled" : false, > "collisionPoly" : [ [ 1.25, -2.75], [2.75, -1.25], [3.5, 4.0], [3.0, 5.0], [-3.0, 5.0], [-3.5, 4.0], [-2.75, -1.25], [-1.25, -2.75] ], > > "mass" : 4.0, > "walkSpeed" : 5, > "runSpeed" : 13, > "flySpeed" : 11, > "airFriction" : 0.5, > "airForce" : 800.0, > "airJumpProfile" : { > "jumpControlForce" : 0, > "jumpInitialPercentage" : 0 > }, > "physicsEffectCategories" : ["boss"] > }, > > "touchDamage" : { > "poly" : [ [-4, -3], [0, -3], [0, 0], [-4, 0] ], > "damage" : 20, > > "teamType" : "enemy", > "statusEffects" : [ ] > }, > > "statusSettings" : { > "statusProperties" : { > "targetMaterialKind" : "stone" > }, > > "appliesEnvironmentStatusEffects" : false, > "appliesWeatherStatusEffects" : false, > "minimumLiquidStatusEffectPercentage" : 0.1, > > "primaryScriptSources" : [ > "/stats/monster_primary.lua" > ], > "primaryScriptDelta" : 5, > > "stats" : { > "knockbackStunTime" : { > "baseValue" : 0.25 > }, > "grit" : { > "baseValue" : 1.0 > }, > "maxHealth" : { > "baseValue" : 1000 > }, > "protection" : { > "baseValue" : 0 > }, > "healthRegen" : { > "baseValue" : 0.0 > }, > "fireStatusImmunity" : { > "baseValue" : 1.0 > }, > "iceStatusImmunity" : { > "baseValue" : 1.0 > }, > "electricStatusImmunity" : { > "baseValue" : 1.0 > }, > "poisonStatusImmunity" : { > "baseValue" : 1.0 > }, > "specialStatusImmunity" : { > "baseValue" : 1.0 > }, > "healingStatusImmunity" : { > "baseValue" : 1.0 > }, > "stunImmunity" : { > "baseValue" : 1.0 > }, > "powerMultiplier" : { > "baseValue" : 1.0 > } > }, > > "resources" : { > "stunned" : { > "deltaValue" : -1.0, > "initialValue" : 0.0, > "maxValue" : 0.0 > }, > "health" : { > "maxStat" : "maxHealth", > "deltaStat" : "healthRegen", > "defaultPercentage" : 1.0 > } > } > }, > > "mouthOffset" : [1.0, -1.5], > "feetOffset" : [0, -21] > } > } monsters\boss\robotboss\robotboss.monstertype 1,169c1,171 < { < "type" : "robotboss", < "shortdescription" : "Shockhopper MK I", < < "categories" : [ "robotboss_robotic" ], < "parts" : [ "body", "arm" ], < < "animation" : "robotboss.animation", < "reversed" : true, < "dropPools" : [ < { < "default" : "shockhopperDrop" < } < ], < < "baseParameters" : { < "scripts" : [ < "/monsters/boss/bossMonster.lua", < "/scripts/stateMachine.lua", < "/scripts/util.lua", < "/scripts/vec2.lua", < < "/monsters/boss/robotboss/dieState.lua", < "/monsters/boss/robotboss/idleState.lua" < ], < < "renderLayer" : "Projectile-10", < < "skillCount" : 5, < "skills" : [ "robotMissileBarrageAttack", "robotPunchAttack", "robotElectricBurstAttack", "robotFlamethrowerAttack", "robotDashAttack" ], < < "phases" : [ < { < "skills" : [ "robotPunchAttack", "robotMissileBarrageAttack" ] < }, < { < "trigger" : "healthPercentage", < "healthPercentage" : 0.8, < "enterPhase" : "robotElectricBurstAttack", < "skills" : [ "robotFlamethrowerAttack", "robotMissileBarrageAttack", "robotDashAttack" ] < }, < { < "trigger" : "healthPercentage", < "healthPercentage" : 0.5, < "enterPhase" : "robotElectricBurstAttack", < "skills" : [ "robotFlamethrowerAttack", "robotMissileBarrageAttack", "robotDashAttack" ] < }, < { < "trigger" : "healthPercentage", < "healthPercentage" : 0.25, < "enterPhase" : "robotElectricBurstAttack", < "skills" : [ "robotFlamethrowerAttack", "robotMissileBarrageAttack", "robotDashAttack", "robotFlamethrowerAttack" ] < } < ], < < "projectileSourcePosition" : [-2.5, -1.25], < "projectileSourceOffset" : [7, 0], < < "queryTargetDistance" : 50.0, < "trackTargetDistance" : 80.0, < "switchTargetDistance" : 0, < < "knockoutTime" : 0.5, < "knockoutEffect" : "blink", < "deathParticles" : "deathPoof", < < "alwaysAggressive" : true, < < "scale" : 1.0, < < "movementSettings" : { < "collisionPoly" : [ [-2, -4.5], [2, -4.5], [2, 4], [-2, 4] ], < < "mass" : 2.0, < "walkSpeed" : 5, < "runSpeed" : 13, < "physicsEffectCategories" : ["boss"] < }, < "jumpTargetDistance" : 4, < "jumpTime" : [0.4, 0.7], < < "metaBoundBox" : [-1, -5.6, 1, 3], < < "blockedSensors" : [ [1.5, -4.5], [1.5, -3.5], [1.5, -2.5], [1.5, -1.5], [1.5, -0.5], [1.5, 0.5] ], < "fallSensors" : [ [2, -3.5], [2, -5.5], [2, -6.5], [4, -4.5], [4, -5.5], [4, -6.5] ], < < "touchDamage" : { < "poly" : [ [-4, -3], [0, -3], [0, 0], [-4, 0] ], < "damage" : 20, < < "teamType" : "enemy", < "damageSourceKind" : "hammer", < "statusEffects" : [ ] < }, < < "statusSettings" : { < "statusProperties" : { < "targetMaterialKind" : "robotic" < }, < < "appliesEnvironmentStatusEffects" : false, < "appliesWeatherStatusEffects" : false, < "minimumLiquidStatusEffectPercentage" : 0.1, < < "primaryScriptSources" : [ < "/stats/monster_primary.lua" < ], < "primaryScriptDelta" : 5, < < "stats" : { < "knockbackStunTime" : { < "baseValue" : 0.25 < }, < "grit" : { < "baseValue" : 1.0 < }, < "maxHealth" : { < "baseValue" : 1000 < }, < "protection" : { < "baseValue" : 50 < }, < "healthRegen" : { < "baseValue" : 0.0 < }, < "fireStatusImmunity" : { < "baseValue" : 1.0 < }, < "iceStatusImmunity" : { < "baseValue" : 1.0 < }, < "electricStatusImmunity" : { < "baseValue" : 1.0 < }, < "poisonStatusImmunity" : { < "baseValue" : 1.0 < }, < "specialStatusImmunity" : { < "baseValue" : 1.0 < }, < "healingStatusImmunity" : { < "baseValue" : 1.0 < }, < "stunImmunity" : { < "baseValue" : 1.0 < }, < "powerMultiplier" : { < "baseValue" : 1.0 < } < }, < < "resources" : { < "stunned" : { < "deltaValue" : -1.0, < "initialValue" : 0.0, < "maxValue" : 0.0 < }, < "health" : { < "maxStat" : "maxHealth", < "deltaStat" : "healthRegen", < "defaultPercentage" : 100 < } < } < }, < < "mouthOffset" : [1.0, -1.5], < "feetOffset" : [0, -21] < } < } --- > { > "type" : "robotboss", > "shortdescription" : "Shockhopper MK I", > > "categories" : [ "robotboss_robotic" ], > "parts" : [ "body", "arm" ], > > "animation" : "robotboss.animation", > "reversed" : true, > "dropPools" : [ > { > "default" : "shockhopperDrop" > } > ], > > "baseParameters" : { > "monsterClass" : "boss", > > "scripts" : [ > "/monsters/boss/bossMonster.lua", > "/scripts/stateMachine.lua", > "/scripts/util.lua", > "/scripts/vec2.lua", > > "/monsters/boss/robotboss/dieState.lua", > "/monsters/boss/robotboss/idleState.lua" > ], > > "renderLayer" : "Projectile-10", > > "skillCount" : 5, > "skills" : [ "robotMissileBarrageAttack", "robotPunchAttack", "robotElectricBurstAttack", "robotFlamethrowerAttack", "robotDashAttack" ], > > "phases" : [ > { > "skills" : [ "robotPunchAttack", "robotMissileBarrageAttack" ] > }, > { > "trigger" : "healthPercentage", > "healthPercentage" : 0.8, > "enterPhase" : "robotElectricBurstAttack", > "skills" : [ "robotFlamethrowerAttack", "robotMissileBarrageAttack", "robotDashAttack" ] > }, > { > "trigger" : "healthPercentage", > "healthPercentage" : 0.5, > "enterPhase" : "robotElectricBurstAttack", > "skills" : [ "robotFlamethrowerAttack", "robotMissileBarrageAttack", "robotDashAttack" ] > }, > { > "trigger" : "healthPercentage", > "healthPercentage" : 0.25, > "enterPhase" : "robotElectricBurstAttack", > "skills" : [ "robotFlamethrowerAttack", "robotMissileBarrageAttack", "robotDashAttack", "robotFlamethrowerAttack" ] > } > ], > > "projectileSourcePosition" : [-2.5, -1.25], > "projectileSourceOffset" : [7, 0], > > "queryTargetDistance" : 50.0, > "trackTargetDistance" : 80.0, > "switchTargetDistance" : 0, > > "knockoutTime" : 0.5, > "knockoutEffect" : "blink", > "deathParticles" : "deathPoof", > > "alwaysAggressive" : true, > > "scale" : 1.0, > > "movementSettings" : { > "collisionPoly" : [ [-2, -4.5], [2, -4.5], [2, 4], [-2, 4] ], > > "mass" : 2.0, > "walkSpeed" : 5, > "runSpeed" : 13, > "physicsEffectCategories" : ["boss"] > }, > "jumpTargetDistance" : 4, > "jumpTime" : [0.4, 0.7], > > "metaBoundBox" : [-1, -5.6, 1, 3], > > "blockedSensors" : [ [1.5, -4.5], [1.5, -3.5], [1.5, -2.5], [1.5, -1.5], [1.5, -0.5], [1.5, 0.5] ], > "fallSensors" : [ [2, -3.5], [2, -5.5], [2, -6.5], [4, -4.5], [4, -5.5], [4, -6.5] ], > > "touchDamage" : { > "poly" : [ [-4, -3], [0, -3], [0, 0], [-4, 0] ], > "damage" : 20, > > "teamType" : "enemy", > "damageSourceKind" : "hammer", > "statusEffects" : [ ] > }, > > "statusSettings" : { > "statusProperties" : { > "targetMaterialKind" : "robotic" > }, > > "appliesEnvironmentStatusEffects" : false, > "appliesWeatherStatusEffects" : false, > "minimumLiquidStatusEffectPercentage" : 0.1, > > "primaryScriptSources" : [ > "/stats/monster_primary.lua" > ], > "primaryScriptDelta" : 5, > > "stats" : { > "knockbackStunTime" : { > "baseValue" : 0.25 > }, > "grit" : { > "baseValue" : 1.0 > }, > "maxHealth" : { > "baseValue" : 1000 > }, > "protection" : { > "baseValue" : 50 > }, > "healthRegen" : { > "baseValue" : 0.0 > }, > "fireStatusImmunity" : { > "baseValue" : 1.0 > }, > "iceStatusImmunity" : { > "baseValue" : 1.0 > }, > "electricStatusImmunity" : { > "baseValue" : 1.0 > }, > "poisonStatusImmunity" : { > "baseValue" : 1.0 > }, > "specialStatusImmunity" : { > "baseValue" : 1.0 > }, > "healingStatusImmunity" : { > "baseValue" : 1.0 > }, > "stunImmunity" : { > "baseValue" : 1.0 > }, > "powerMultiplier" : { > "baseValue" : 1.0 > } > }, > > "resources" : { > "stunned" : { > "deltaValue" : -1.0, > "initialValue" : 0.0, > "maxValue" : 0.0 > }, > "health" : { > "maxStat" : "maxHealth", > "deltaStat" : "healthRegen", > "defaultPercentage" : 100 > } > } > }, > > "mouthOffset" : [1.0, -1.5], > "feetOffset" : [0, -21] > } > } monsters\boss\spiderboss\spiderboss.monstertype 1,148c1,150 < { < "type" : "spiderboss", < "shortdescription" : "Ixodoom", < "categories" : [ "spiderboss" ], < "parts" : [ "body", "legs", "shell" ], < < "animation" : "spiderboss.animation", < "dropPools" : [ < { < "default" : "ixodoomTreasure" < } < ], < < "baseParameters" : { < "scripts" : [ < "/monsters/monster.lua" < ], < "initialScriptDelta" : 1, < "behaviorUpdateDelta" : 1, < < "behavior" : "spiderboss", < "behaviorConfig" : { < "deathMovementParameters" : { < "gravityEnabled" : true, < "bounceFactor" : 0.1 < } < }, < < "damageBar" : "None", < < "knockoutTime" : 0, < "knockoutEffect" : "blink", < "deathParticles" : "deathPoof", < < "alwaysAggressive" : true, < < "rotationOffset" : -4.71, < "lockFacingDirection" : true, < < "scale" : 1.0, < < "portraitIcon" : "/monsters/boss/spiderboss/spiderbossicon.png", < < "lineSensors" : { < "ground" : [0, -15] < }, < < "movementSettings" : { < "gravityEnabled" : false, < "collisionPoly" : [ [6, 4.5], [6, -4.5], [3, -9], [-3, -9], [-6, -4.5], [-6, 4.5], [-3, 9], [3, 9] ], < < "mass" : 4.0, < "walkSpeed" : 5, < "runSpeed" : 13, < "flySpeed" : 15, < "airFriction" : 0.5, < "airForce" : 400.0, < "airJumpProfile" : { < "jumpControlForce" : 0, < "jumpInitialPercentage" : 0 < }, < "physicsEffectCategories" : ["boss"] < }, < "metaBoundBox" : [-15, -15, 15, 15], < < "touchDamage" : { < "poly" : [ [-4, -3], [0, -3], [0, 0], [-4, 0] ], < "damage" : 20, < < "teamType" : "enemy", < "damageSourceKind" : "default", < "statusEffects" : [ ] < }, < < "statusSettings" : { < "statusProperties" : { < "targetMaterialKind" : "organic" < }, < < "appliesEnvironmentStatusEffects" : false, < "appliesWeatherStatusEffects" : false, < "minimumLiquidStatusEffectPercentage" : 0.1, < < "primaryScriptSources" : [ < "/stats/monster_primary.lua" < ], < "primaryScriptDelta" : 5, < < "stats" : { < "knockbackStunTime" : { < "baseValue" : 0.25 < }, < "grit" : { < "baseValue" : 1.0 < }, < "maxHealth" : { < "baseValue" : 1000 < }, < "protection" : { < "baseValue" : 97 < }, < "healthRegen" : { < "baseValue" : 0.0 < }, < "fireStatusImmunity" : { < "baseValue" : 1.0 < }, < "iceStatusImmunity" : { < "baseValue" : 1.0 < }, < "electricStatusImmunity" : { < "baseValue" : 1.0 < }, < "poisonStatusImmunity" : { < "baseValue" : 1.0 < }, < "specialStatusImmunity" : { < "baseValue" : 1.0 < }, < "healingStatusImmunity" : { < "baseValue" : 1.0 < }, < "stunImmunity" : { < "baseValue" : 1.0 < }, < "powerMultiplier" : { < "baseValue" : 1.0 < } < }, < < "resources" : { < "stunned" : { < "deltaValue" : -1.0, < "initialValue" : 0.0, < "maxValue" : 0.0 < }, < "health" : { < "maxStat" : "maxHealth", < "deltaStat" : "healthRegen", < "defaultPercentage" : 1.0 < } < } < }, < < "mouthOffset" : [1.0, -1.5], < "feetOffset" : [0, -21] < } < } --- > { > "type" : "spiderboss", > "shortdescription" : "Ixodoom", > "categories" : [ "spiderboss" ], > "parts" : [ "body", "legs", "shell" ], > > "animation" : "spiderboss.animation", > "dropPools" : [ > { > "default" : "ixodoomTreasure" > } > ], > > "baseParameters" : { > "monsterClass" : "boss", > > "scripts" : [ > "/monsters/monster.lua" > ], > "initialScriptDelta" : 1, > "behaviorUpdateDelta" : 1, > > "behavior" : "spiderboss", > "behaviorConfig" : { > "deathMovementParameters" : { > "gravityEnabled" : true, > "bounceFactor" : 0.1 > } > }, > > "damageBar" : "None", > > "knockoutTime" : 0, > "knockoutEffect" : "blink", > "deathParticles" : "deathPoof", > > "alwaysAggressive" : true, > > "rotationOffset" : -4.71, > "lockFacingDirection" : true, > > "scale" : 1.0, > > "portraitIcon" : "/monsters/boss/spiderboss/spiderbossicon.png", > > "lineSensors" : { > "ground" : [0, -15] > }, > > "movementSettings" : { > "gravityEnabled" : false, > "collisionPoly" : [ [6, 4.5], [6, -4.5], [3, -9], [-3, -9], [-6, -4.5], [-6, 4.5], [-3, 9], [3, 9] ], > > "mass" : 4.0, > "walkSpeed" : 5, > "runSpeed" : 13, > "flySpeed" : 15, > "airFriction" : 0.5, > "airForce" : 400.0, > "airJumpProfile" : { > "jumpControlForce" : 0, > "jumpInitialPercentage" : 0 > }, > "physicsEffectCategories" : ["boss"] > }, > "metaBoundBox" : [-15, -15, 15, 15], > > "touchDamage" : { > "poly" : [ [-4, -3], [0, -3], [0, 0], [-4, 0] ], > "damage" : 20, > > "teamType" : "enemy", > "damageSourceKind" : "default", > "statusEffects" : [ ] > }, > > "statusSettings" : { > "statusProperties" : { > "targetMaterialKind" : "organic" > }, > > "appliesEnvironmentStatusEffects" : false, > "appliesWeatherStatusEffects" : false, > "minimumLiquidStatusEffectPercentage" : 0.1, > > "primaryScriptSources" : [ > "/stats/monster_primary.lua" > ], > "primaryScriptDelta" : 5, > > "stats" : { > "knockbackStunTime" : { > "baseValue" : 0.25 > }, > "grit" : { > "baseValue" : 1.0 > }, > "maxHealth" : { > "baseValue" : 1000 > }, > "protection" : { > "baseValue" : 97 > }, > "healthRegen" : { > "baseValue" : 0.0 > }, > "fireStatusImmunity" : { > "baseValue" : 1.0 > }, > "iceStatusImmunity" : { > "baseValue" : 1.0 > }, > "electricStatusImmunity" : { > "baseValue" : 1.0 > }, > "poisonStatusImmunity" : { > "baseValue" : 1.0 > }, > "specialStatusImmunity" : { > "baseValue" : 1.0 > }, > "healingStatusImmunity" : { > "baseValue" : 1.0 > }, > "stunImmunity" : { > "baseValue" : 1.0 > }, > "powerMultiplier" : { > "baseValue" : 1.0 > } > }, > > "resources" : { > "stunned" : { > "deltaValue" : -1.0, > "initialValue" : 0.0, > "maxValue" : 0.0 > }, > "health" : { > "maxStat" : "maxHealth", > "deltaStat" : "healthRegen", > "defaultPercentage" : 1.0 > } > } > }, > > "mouthOffset" : [1.0, -1.5], > "feetOffset" : [0, -21] > } > } monsters\boss\swansong\swansong.monstertype 12a13,14 > "monsterClass" : "boss", > monsters\crawlers\crustoise\icecrustoise.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\crawlers\iguarmor\iceiguarmor.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\crawlers\oculob\fireoculob.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\crawlers\pulpin\poisonpulpin.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\crawlers\snaggler\icesnaggler.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\crawlers\tintic\electrictintic.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\flyers\agrobat\iceagrobat.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\flyers\batong\poisonbatong.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\flyers\bobfae\poisonbobfae.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\flyers\monopus\firemonopus.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\flyers\paratail\poisonparatail.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\flyers\pteropod\firepteropod.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\flyers\scandroid\cultistscandroid.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\ghosts\gosmet\firegosmet.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\ghosts\ignome\electricignome.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\ghosts\lumoth\firelumoth.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\ghosts\pyromantle\poisonpyromantle.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\ghosts\skimbus\electricskimbus.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\ghosts\spookit\firespookit.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\ghosts\squeem\firesqueem.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\ghosts\wisper\firewisper.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\space\heavydrone\heavydrone.lua 1,291c1,292 < require "/scripts/util.lua" < require "/scripts/vec2.lua" < require "/scripts/drops.lua" < require "/scripts/status.lua" < < -- Engine callback - called on initialization of entity < function init() < self.shouldDie = true < < if animator.hasSound("deathPuff") then < monster.setDeathSound("deathPuff") < end < if config.getParameter("deathParticles") then < monster.setDeathParticleBurst(config.getParameter("deathParticles")) < end < < monster.setAggressive(true) < < script.setUpdateDelta(5) < < self.outOfSight = {} < self.targets = {} < self.queryRange = config.getParameter("queryRange", 50) < self.keepTargetInRange = config.getParameter("keepTargetInRange", 200) < < -- Listen to damage taken for getting stunned and suppressing damage < self.damageTaken = damageListener("damageTaken", function(notifications) < for _,notification in pairs(notifications) do < if notification.healthLost > 0 then < if not contains(self.targets, notification.sourceEntityId) then < table.insert(self.targets, notification.sourceEntityId) < end < self.damaged = true < end < end < end) < < -- set self.frontgun and self.backgun to coroutines controlling each gun < -- max range will be the lowest range of either gun < self.maxRange = 9999 -- very big number < for _,gunPart in pairs({"frontgun", "backgun"}) do < local gunConfig = config.getParameter(gunPart) < self[gunPart] = coroutine.create(controlGun) < local status, res = coroutine.resume(self[gunPart], < gunPart, < gunConfig.offset, < gunConfig.projectileType, < gunConfig.projectileParameters or {}, < gunConfig.count, < gunConfig.power, < gunConfig.fireInterval, < gunConfig.fireCooldown, < gunConfig.range < ) < if not status then < error(res) < end < < if gunConfig.range < self.maxRange then < self.maxRange = gunConfig.range < end < end < < local approachPadding = config.getParameter("approachPadding", 5) < local tangentialSpeed = config.getParameter("tangentialSpeed", 15) < self.movement = coroutine.create(approachOrbit) < local status, res = coroutine.resume(self.movement, self.maxRange - approachPadding, tangentialSpeed, 20) < if not status then error(res) end < < self.switchAngleTime = config.getParameter("switchAngleTime") < end < < function update(dt) < self.damageTaken:update() < < if status.resourcePositive("stunned") then < animator.setAnimationState("damage", "stunned") < mcontroller.clearControls() < if self.damaged then < self.suppressDamageTimer = config.getParameter("stunDamageSuppression", 0.5) < monster.setDamageOnTouch(false) < end < return < else < animator.setAnimationState("damage", "none") < end < < -- Suppressing touch damage < if self.suppressDamageTimer then < monster.setDamageOnTouch(false) < self.suppressDamageTimer = math.max(self.suppressDamageTimer - dt, 0) < if self.suppressDamageTimer == 0 then < self.suppressDamageTimer = nil < end < elseif status.statPositive("invulnerable") then < monster.setDamageOnTouch(false) < else < monster.setDamageOnTouch(true) < end < < -- query for new targets if there are none < if #self.targets == 0 then < local newTargets = world.entityQuery(mcontroller.position(), self.queryRange, {includedTypes = {"player"}}) < table.sort(newTargets, function(a, b) < return world.magnitude(world.entityPosition(a), mcontroller.position()) < world.magnitude(world.entityPosition(b), mcontroller.position()) < end) < for _,entityId in pairs(newTargets) do < if entity.entityInSight(entityId) then < table.insert(self.targets, entityId) < end < end < end < < -- drop targets out of range and out of sight < repeat < self.target = self.targets[1] < if self.target == nil then break end < < local target = self.target < if not world.entityExists(target) < or world.magnitude(world.entityPosition(target), mcontroller.position()) > self.keepTargetInRange then < table.remove(self.targets, 1) < self.target = nil < end < < if self.target and not entity.entityInSight(target) then < local timer = self.outOfSight[target] or 3.0 < timer = timer - dt < if timer <= 0 then < table.remove(self.targets, 1) < selftarget = nil < else < self.outOfSight[target] = timer < end < end < < if not self.target then < self.outOfSight[target] = nil < end < until #self.targets <= 0 or self.target < < -- update the guns < for _,gunState in pairs({self.frontgun, self.backgun}) do < local status, res = coroutine.resume(gunState) < if not status then < error(res) < end < end < < if self.target then < local toTarget = world.distance(world.entityPosition(self.target), mcontroller.position()) < mcontroller.controlFace(util.toDirection(toTarget[1])) < < local status, res = coroutine.resume(self.movement, dt) < if not status then error(res) end < else < mcontroller.controlApproachVelocity({0, 0}, mcontroller.baseParameters().airForce) < end < end < < -- keeps aiming and firing, run in a coroutine < function controlGun(part, offset, projectileType, params, count, power, interval, cooldown, range) < < -- everything before the first yield is initialization < coroutine.yield() < while true do < local cooldownOffset = math.random() * cooldown < < if self.target then < local center, targetPosition, toTarget < local updateTargetPos = function() < animator.resetTransformationGroup(part) < center = animator.partPoint(part, "rotationCenter") < targetPosition = world.entityPosition(self.target) < if targetPosition == nil then return true end < < toTarget = world.distance(targetPosition, vec2.add(mcontroller.position(), center)) < local rotateAngle = vec2.angle(vec2.mul(toTarget, {mcontroller.facingDirection(), 1})) < animator.rotateTransformationGroup(part, rotateAngle, vec2.mul(center, {mcontroller.facingDirection(), 1})) < end < < updateTargetPos() < while self.target and targetPosition and world.magnitude(targetPosition, mcontroller.position()) < range do < -- update target position during cooldown < util.wait(cooldownOffset, updateTargetPos) < if targetPosition == nil then break end < < local shots = 0 < while shots < count do < local aimVector = vec2.norm(toTarget) < local source = vec2.add(mcontroller.position(), vec2.add(center, vec2.rotate(offset, vec2.angle(toTarget)))) < local scaledPower = power * root.evalFunction("monsterLevelPowerMultiplier", monster.level()) < params.power = scaledPower < world.spawnProjectile(projectileType, source, entity.id(), aimVector, false, params) < shots = shots + 1 < animator.playSound("fire") < < util.wait(interval) < end < < util.wait(cooldown - cooldownOffset, function() < if self.target then < updateTargetPos() < else < return true < end < end) < end < end < < coroutine.yield() < end < end < < function approachOrbit(distance, maxTangential) < local tangentialSpeed = 0 < local dt = coroutine.yield() < while true do < local approachAngle = math.random() * math.pi * 2 < < util.wait(self.switchAngleTime, function() < if not self.target then return true end < local targetPosition = world.entityPosition(self.target) < local targetVelocity = world.entityVelocity(self.target) < < local toTarget = world.distance(targetPosition, mcontroller.position()) < local approachPoint = vec2.add(targetPosition, vec2.mul(toTarget, -1)) < local toApproach = vec2.norm(world.distance(approachPoint, mcontroller.position())) < local approach = vec2.add(vec2.mul(toApproach, math.min(vec2.mag(toApproach) ^ 3, mcontroller.baseParameters().flySpeed)), targetVelocity) < < local toOrbit < if vec2.mag(toTarget) > distance then < local toEdge = math.sqrt((vec2.mag(toTarget) ^ 2) - (distance ^ 2)) < local toEdgeAngle = math.atan(distance, toEdge) < toOrbit = vec2.withAngle(toEdgeAngle) < else < toOrbit = {0, 1} < end < < if world.lineTileCollision(vec2.add(mcontroller.position(), animator.partPoint("frontgun", "rotationCenter")), targetPosition) < or world.lineTileCollision(vec2.add(mcontroller.position(), animator.partPoint("backgun", "rotationCenter")), targetPosition) then < local searchParameters = { < returnBest = false, < mustEndOnGround = false, < maxFScore = 400, < maxNodesToSearch = 70000, < boundBox = mcontroller.boundBox() < } < while world.lineTileCollision(vec2.add(mcontroller.position(), animator.partPoint("frontgun", "rotationCenter")), targetPosition) < or world.lineTileCollision(vec2.add(mcontroller.position(), animator.partPoint("backgun", "rotationCenter")), targetPosition) do < mcontroller.controlPathMove(targetPosition, false, searchParameters) < if mcontroller.pathfinding() then < mcontroller.controlApproachVelocity(vec2.mul(vec2.norm(toTarget), mcontroller.baseParameters().flySpeed), mcontroller.baseParameters().airForce) < end < coroutine.yield() < if not self.target then return true end < targetPosition = world.entityPosition(self.target) < toTarget = world.distance(targetPosition, mcontroller.position()) < approachAngle = vec2.angle(world.distance(mcontroller.position(), targetPosition)) < end < end < < local targetAngle = vec2.angle(toTarget) < local leadDir = util.toDirection(util.angleDiff(targetAngle, approachAngle)) < local tangentialSpeed = leadDir * maxTangential < local tangentialApproach = vec2.mul(vec2.rotate({toOrbit[1], toOrbit[2] * util.toDirection(tangentialSpeed)}, targetAngle), math.abs(tangentialSpeed)) < approach = vec2.add(approach, tangentialApproach) < < mcontroller.controlApproachVelocity(approach, mcontroller.baseParameters().airForce, true) < if approach[1] * mcontroller.facingDirection() > 0 then < animator.setAnimationState("body", "forward") < else < animator.setAnimationState("body", "back") < end < end) < < coroutine.yield() < end < end < < function shouldDie() < return self.shouldDie and status.resource("health") <= 0 < end < < function die() < world.spawnProjectile("mechenergypickup", mcontroller.position()) < spawnDrops() < end < < function uninit() < end --- > require "/scripts/util.lua" > require "/scripts/vec2.lua" > require "/scripts/drops.lua" > require "/scripts/status.lua" > > -- Engine callback - called on initialization of entity > function init() > self.shouldDie = true > > if animator.hasSound("deathPuff") then > monster.setDeathSound("deathPuff") > end > if config.getParameter("deathParticles") then > monster.setDeathParticleBurst(config.getParameter("deathParticles")) > end > > monster.setAggressive(true) > > script.setUpdateDelta(5) > > self.outOfSight = {} > self.targets = {} > self.queryRange = config.getParameter("queryRange", 50) > self.keepTargetInRange = config.getParameter("keepTargetInRange", 200) > > -- Listen to damage taken for getting stunned and suppressing damage > self.damageTaken = damageListener("damageTaken", function(notifications) > for _,notification in pairs(notifications) do > if notification.healthLost > 0 then > if not contains(self.targets, notification.sourceEntityId) then > table.insert(self.targets, notification.sourceEntityId) > end > self.damaged = true > end > end > end) > > -- set self.frontgun and self.backgun to coroutines controlling each gun > -- max range will be the lowest range of either gun > self.maxRange = 9999 -- very big number > for _,gunPart in pairs({"frontgun", "backgun"}) do > local gunConfig = config.getParameter(gunPart) > self[gunPart] = coroutine.create(controlGun) > local status, res = coroutine.resume(self[gunPart], > gunPart, > gunConfig.offset, > gunConfig.projectileType, > gunConfig.projectileParameters or {}, > gunConfig.count, > gunConfig.power, > gunConfig.fireInterval, > gunConfig.fireCooldown, > gunConfig.range > ) > if not status then > error(res) > end > > if gunConfig.range < self.maxRange then > self.maxRange = gunConfig.range > end > end > > local approachPadding = config.getParameter("approachPadding", 5) > local tangentialSpeed = config.getParameter("tangentialSpeed", 15) > self.movement = coroutine.create(approachOrbit) > local status, res = coroutine.resume(self.movement, self.maxRange - approachPadding, tangentialSpeed, 20) > if not status then error(res) end > > self.switchAngleTime = config.getParameter("switchAngleTime") > end > > function update(dt) > self.damageTaken:update() > > if status.resourcePositive("stunned") then > animator.setAnimationState("damage", "stunned") > mcontroller.clearControls() > if self.damaged then > self.suppressDamageTimer = config.getParameter("stunDamageSuppression", 0.5) > monster.setDamageOnTouch(false) > end > return > else > animator.setAnimationState("damage", "none") > end > > -- Suppressing touch damage > if self.suppressDamageTimer then > monster.setDamageOnTouch(false) > self.suppressDamageTimer = math.max(self.suppressDamageTimer - dt, 0) > if self.suppressDamageTimer == 0 then > self.suppressDamageTimer = nil > end > elseif status.statPositive("invulnerable") then > monster.setDamageOnTouch(false) > else > monster.setDamageOnTouch(true) > end > > -- query for new targets if there are none > if #self.targets == 0 then > local newTargets = world.entityQuery(mcontroller.position(), self.queryRange, {includedTypes = {"player"}}) > table.sort(newTargets, function(a, b) > return world.magnitude(world.entityPosition(a), mcontroller.position()) < world.magnitude(world.entityPosition(b), mcontroller.position()) > end) > for _,entityId in pairs(newTargets) do > if entity.entityInSight(entityId) then > table.insert(self.targets, entityId) > end > end > end > > -- drop targets out of range and out of sight > repeat > self.target = self.targets[1] > if self.target == nil then break end > > local target = self.target > if not world.entityExists(target) > or world.magnitude(world.entityPosition(target), mcontroller.position()) > self.keepTargetInRange then > table.remove(self.targets, 1) > self.target = nil > end > > if self.target and not entity.entityInSight(target) then > local timer = self.outOfSight[target] or 5.0 > timer = timer - dt > if timer <= 0 then > table.remove(self.targets, 1) > self.target = nil > else > self.outOfSight[target] = timer > end > end > > if not self.target then > self.outOfSight[target] = nil > end > until #self.targets <= 0 or self.target > > -- update the guns > for _,gunState in pairs({self.frontgun, self.backgun}) do > local status, res = coroutine.resume(gunState) > if not status then > error(res) > end > end > > if self.target then > local toTarget = world.distance(world.entityPosition(self.target), mcontroller.position()) > mcontroller.controlFace(util.toDirection(toTarget[1])) > > local status, res = coroutine.resume(self.movement, dt) > if not status then error(res) end > else > mcontroller.controlApproachVelocity({0, 0}, mcontroller.baseParameters().airForce) > end > end > > -- keeps aiming and firing, run in a coroutine > function controlGun(part, offset, projectileType, params, count, power, interval, cooldown, range) > > -- everything before the first yield is initialization > coroutine.yield() > while true do > local cooldownOffset = math.random() * cooldown > > if self.target then > local center, targetPosition, toTarget > local updateTargetPos = function() > if self.target == nil then > targetPosition = nil > return false > end > animator.resetTransformationGroup(part) > center = animator.partPoint(part, "rotationCenter") > targetPosition = world.entityPosition(self.target) > if targetPosition == nil then return true end > > toTarget = world.distance(targetPosition, vec2.add(mcontroller.position(), center)) > local rotateAngle = vec2.angle(vec2.mul(toTarget, {mcontroller.facingDirection(), 1})) > animator.rotateTransformationGroup(part, rotateAngle, vec2.mul(center, {mcontroller.facingDirection(), 1})) > end > > updateTargetPos() > while self.target and targetPosition and world.magnitude(targetPosition, mcontroller.position()) < range do > -- update target position during cooldown > util.wait(cooldownOffset, updateTargetPos) > if targetPosition == nil then break end > > local shots = 0 > while shots < count do > local aimVector = vec2.norm(toTarget) > local source = vec2.add(mcontroller.position(), vec2.add(center, vec2.rotate(offset, vec2.angle(toTarget)))) > local scaledPower = power * root.evalFunction("monsterLevelPowerMultiplier", monster.level()) > params.power = scaledPower > world.spawnProjectile(projectileType, source, entity.id(), aimVector, false, params) > shots = shots + 1 > animator.playSound("fire") > > util.wait(interval) > end > > util.wait(cooldown - cooldownOffset, function() > if self.target then > updateTargetPos() > else > return true > end > end) > end > end > > coroutine.yield() > end > end > > function approachOrbit(distance, maxTangential) > local tangentialSpeed = 0 > local dt = coroutine.yield() > while true do > local approachAngle = math.random() * math.pi * 2 > > util.wait(self.switchAngleTime, function() > if not self.target then return true end > local targetPosition = world.entityPosition(self.target) > local targetVelocity = world.entityVelocity(self.target) > > local toTarget = world.distance(targetPosition, mcontroller.position()) > local approachPoint = vec2.add(targetPosition, vec2.mul(toTarget, -1)) > local toApproach = vec2.norm(world.distance(approachPoint, mcontroller.position())) > local approach = vec2.add(vec2.mul(toApproach, math.min(vec2.mag(toApproach) ^ 3, mcontroller.baseParameters().flySpeed)), targetVelocity) > > local toOrbit > if vec2.mag(toTarget) > distance then > local toEdge = math.sqrt((vec2.mag(toTarget) ^ 2) - (distance ^ 2)) > local toEdgeAngle = math.atan(distance, toEdge) > toOrbit = vec2.withAngle(toEdgeAngle) > else > toOrbit = {0, 1} > end > > if world.lineTileCollision(vec2.add(mcontroller.position(), animator.partPoint("frontgun", "rotationCenter")), targetPosition) > or world.lineTileCollision(vec2.add(mcontroller.position(), animator.partPoint("backgun", "rotationCenter")), targetPosition) then > local searchParameters = { > returnBest = false, > mustEndOnGround = false, > maxFScore = 400, > maxNodesToSearch = 70000, > boundBox = mcontroller.boundBox() > } > while world.lineTileCollision(vec2.add(mcontroller.position(), animator.partPoint("frontgun", "rotationCenter")), targetPosition) > or world.lineTileCollision(vec2.add(mcontroller.position(), animator.partPoint("backgun", "rotationCenter")), targetPosition) do > mcontroller.controlPathMove(targetPosition, false, searchParameters) > coroutine.yield() > if not self.target then return true end > targetPosition = world.entityPosition(self.target) > toTarget = world.distance(targetPosition, mcontroller.position()) > approachAngle = vec2.angle(world.distance(mcontroller.position(), targetPosition)) > end > end > > local targetAngle = vec2.angle(toTarget) > local leadDir = util.toDirection(util.angleDiff(targetAngle, approachAngle)) > local tangentialSpeed = leadDir * maxTangential > local tangentialApproach = vec2.mul(vec2.rotate({toOrbit[1], toOrbit[2] * util.toDirection(tangentialSpeed)}, targetAngle), math.abs(tangentialSpeed)) > approach = vec2.add(approach, tangentialApproach) > > mcontroller.controlApproachVelocity(approach, mcontroller.baseParameters().airForce, true) > if approach[1] * mcontroller.facingDirection() > 0 then > animator.setAnimationState("body", "forward") > else > animator.setAnimationState("body", "back") > end > end) > > coroutine.yield() > end > end > > function shouldDie() > return self.shouldDie and status.resource("health") <= 0 > end > > function die() > world.spawnProjectile("mechenergypickup", mcontroller.position()) > spawnDrops() > end > > function uninit() > end monsters\walkers\adultpoptop\albinoadultpoptop.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\anglure\electricanglure.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\bobot\firebobot.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\bulbop\poisonbulbop.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\capricoat\electriccapricoat.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\crabcano\icecrabcano.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\crutter\electriccrutter.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\fennix\icefennix.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\gleap\firegleap.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\hemogoblin\electrichemogoblin.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\hypnare\icehypnare.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\lilodon\firelilodon.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\mandraflora\poisonmandraflora.monstertype 14a15,16 > "monsterClass" : "rare", > monsters\walkers\miasmop\icemiasmop.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\narfin\icenarfin.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\nutmidge\poisonnutmidge.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\oogler\fireoogler.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\orbide\iceorbide.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\peblit\icepeblit.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\petricub\electricpetricub.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\pipkin\poisonpipkin.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\poptop\albinopoptop.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\quagmutt\electricquagmutt.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\ringram\iceringram.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\scaveran\poisonscaveran.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\smoglin\poisonsmoglin.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\snaunt\electricsnaunt.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\snuffish\poisonsnuffish.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\sporgus\poisonsporgus.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\taroni\firetaroni.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\toumingo\firetoumingo.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\trictus\poisontrictus.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\voltip\electricvoltip.monstertype 13a14,15 > "monsterClass" : "rare", > monsters\walkers\yokat\electricyokat.monstertype 13a14,15 > "monsterClass" : "rare", > npcs\tenants\friendlyguardtenant.npctype 1,21c1,23 < { < "type" : "friendlyguardtenant", < "baseType" : "friendlyguard", < < "dropPools" : [], < < "scriptConfig" : { < "questGenerator" : { < "pools" : ["common", "tenant", "guard"], < "enableParticipation" : true, < < "timeLimit" : 30, < "nearbyQuestLimit" : 2, < "nearbyQuestRange" : 50, < "chance" : 0.02, < "flags" : { < "guard" : true < } < } < } < } --- > { > "type" : "friendlyguardtenant", > "baseType" : "friendlyguard", > > "levelVariance" : [0, 0], > > "dropPools" : [], > > "scriptConfig" : { > "questGenerator" : { > "pools" : ["common", "tenant", "guard"], > "enableParticipation" : true, > > "timeLimit" : 30, > "nearbyQuestLimit" : 2, > "nearbyQuestRange" : 50, > "chance" : 0.02, > "flags" : { > "guard" : true > } > } > } > } objects\protectorate\objects\protectoratedormtoiletroll\protectoratedormtoiletroll.object 9c9 < "shortdescription" : "Protectorate Toilet Roll Holder.", --- > "shortdescription" : "Protectorate Toilet Roll Holder", quests\bounty\assignment.config 1a2,9 > "rankStationTypes" : [ > "spacestation_peacekeeper1", > "spacestation_peacekeeper2", > "spacestation_peacekeeper3", > "spacestation_peacekeeper4", > "spacestation_peacekeeper5" > ], > quests\bounty\bountyassignment.lua 22c22 < self.stationTypes = config.getParameter("stationTypes", {}) --- > self.stationTypes = root.assetJson("/quests/bounty/assignment.config:rankStationTypes") quests\bounty\bountyassignment.questtemplate 31,38d30 < "stationTypes" : [ < "spacestation_peacekeeper1", < "spacestation_peacekeeper2", < "spacestation_peacekeeper3", < "spacestation_peacekeeper4", < "spacestation_peacekeeper5" < ], < quests\bounty\stages.lua 667a668,671 > if not onQuestWorld() then > return previousStage() > end > 670c674 < if distance > 32 then --- > if distance > 24 then scripts\bountygeneration.lua 218a219 > species = gang.species, scripts\player\playerbounty.lua 2a3 > require "/scripts/async.lua" 43,44c44,51 < if player.hasAcceptedQuest("bountyassignment") and not player.hasActiveQuest("bountyassignment") and bountyData[player.serverUuid()] == nil then < player.startQuest("bountyassignment") --- > bountyData = bountyData[player.serverUuid()] or nil > if player.hasAcceptedQuest("bountyassignment") and not player.hasActiveQuest("bountyassignment") and bountyData == nil then > player.startQuest("bountyassignment") > end > > -- check that the station exists, this can take multiple ticks so keep doing it > if bountyData then > self.checkStation = checkBountyStation() 57c64,133 < end \ No newline at end of file --- > > if self.checkStation then > local status = tick(self.checkStation) > if status == "dead" then > self.checkStation = nil > end > end > end > > function getBountyStation() > local bountyStation = player.getProperty("bountyStation") > return bountyStation[player.serverUuid()] > end > > function getPlayerRank() > local bountyRanks = root.assetJson("/quests/bounty/assignment.config:bountyRanks") > local points = player.getProperty("bountyPoints") or 0 > local playerRank > for i, rank in ipairs(bountyRanks) do > if points >= rank.threshold then > playerRank = i > end > end > return playerRank > end > > function getAssignmentRank() > local bountyData = player.getProperty("bountyData") or {} > bountyData = bountyData[player.serverUuid()] or {} > local assignment = bountyData.assignment > if assignment then > return assignment.rank > else > return getPlayerRank() > end > end > > checkBountyStation = async(function() > -- check if the bounty system is spawned > while not compare(celestial.currentSystem(), getBountyStation().system) do > await(delay(5.0)) > end > > local stationTypes = root.assetJson("/quests/bounty/assignment.config:rankStationTypes") > local rank = getAssignmentRank() > local stationType = stationTypes[rank] > if stationType == nil then > sb.logInfo("ERROR: Peacekeeper station type not defined for assignment rank %s", rank) > return > end > local stationUuid = util.find(celestial.systemObjects(), function(o) > if celestial.objectType(o) == stationType then > return true > else > return false > end > end) > if not stationUuid and player.hasAcceptedQuest("bountyassignment") and not player.hasActiveQuest("bountyassignment") then > local bountyStation = player.getProperty("bountyStation") > local serverStation = bountyStation[player.serverUuid()] > if serverStation then > bountyStation[player.serverUuid()] = { > system = serverStation.system > } > player.setProperty("bountyStation", bountyStation) > end > > player.startQuest("bountyassignment") > end > end) \ No newline at end of file stats\player_primary.lua 39a40,44 > > if entityType == "monster" then > local monsterClass = root.monsterParameters(eventFields.monsterType).monsterClass or "standard" > recordEvent(entity.id(), "killMonster", {monsterClass = monsterClass}) > end stats\effects\biomeairless\biomeairless.lua 1,9c1,13 < function init() < world.sendEntityMessage(entity.id(), "queueRadioMessage", "biomeairless", 5.0) < end < < function update(dt) < end < < function uninit() < end --- > function init() > self.played = false > end > > function update(dt) > if not self.played and not world.breathable(entity.position()) then > world.sendEntityMessage(entity.id(), "queueRadioMessage", "biomeairless", 5.0) > self.played = true > end > end > > function uninit() > end tiles\materials\asphalt.material 11c11 < "footstepSound" : "/sfx/blocks/footstep_mud.ogg", --- > "footstepSound" : "/sfx/blocks/footstep_stone.ogg", vehicles\boat\boat.lua 1,383c1,383 < require "/scripts/vec2.lua" < require "/scripts/util.lua" < < function init() < self.rockingTimer = 0 < self.facingDirection = 1 < self.angle = 0 < animator.setParticleEmitterActive("bubbles", false) < self.damageEmoteTimer = 0 < self.spawnPosition = mcontroller.position() < < self.waterFactor = 0 --how much water are we in right now < < self.rockingInterval = config.getParameter("rockingInterval") < self.maxHealth = config.getParameter("maxHealth") < self.protection = config.getParameter("protection") < < self.damageStateNames = config.getParameter("damageStateNames") < self.damageStateDriverEmotes = config.getParameter("damageStateDriverEmotes") < self.materialKind = config.getParameter("materialKind") < < self.windLevelOffset = config.getParameter("windLevelOffset") < self.rockingWindAngleMultiplier = config.getParameter("rockingWindAngleMultiplier") < self.maxRockingAngle = config.getParameter("maxRockingAngle") < self.angleApproachFactor = config.getParameter("angleApproachFactor") < < self.speedRotationMultiplier = config.getParameter("speedRotationMultiplier") < < self.targetMoveSpeed = config.getParameter("targetMoveSpeed") < self.moveControlForce = config.getParameter("moveControlForce") < < mcontroller.resetParameters(config.getParameter("movementSettings")) < < self.minWaterFactorToFloat = config.getParameter("minWaterFactorToFloat") < self.sinkingBuoyancy = config.getParameter("sinkingBuoyancy") < self.sinkingFriction = config.getParameter("sinkingFriction") < < self.bowWaveParticleNames=config.getParameter("bowWaveParticles") < self.bowWaveMaxEmissionRate=config.getParameter("bowWaveMaxEmissionRate") < < self.splashParticleNames = config.getParameter("splashParticles") < self.splashEpsilon = config.getParameter("splashEpsilon") < < self.maxGroundSearchDistance = config.getParameter("maxGroundSearchDistance") < < local bounds = mcontroller.localBoundBox() < self.frontGroundTestPoint = {bounds[1], bounds[2]} < self.backGroundTestPoint = {bounds[3], bounds[2]} < < --setup the store functionality < self.ownerKey = config.getParameter("ownerKey") < vehicle.setPersistent(self.ownerKey) < < message.setHandler("store", < function(_, _, ownerKey) < local animState=animator.animationState("base") < < if (animState == "idle" or animState == "sinking") then < if (self.ownerKey and self.ownerKey == ownerKey) then < self.spawnPosition = mcontroller.position() < animator.setAnimationState("base", "warpOutPart1") < local localStorable = (self.driver == nil) < return {storable = true, healthFactor = storage.health / self.maxHealth} < end < end < end) < < if (storage.health) then < animator.setAnimationState("base", "idle") < else < local startHealthFactor = config.getParameter("startHealthFactor") < < if (startHealthFactor == nil) then < storage.health = self.maxHealth < else < storage.health = math.min(startHealthFactor * self.maxHealth, self.maxHealth) < end < animator.setAnimationState("base", "warpInPart1") < end < < updateDamageEffects(0, true) < self.maxBuoyancy = mcontroller.parameters().liquidBuoyancy < end < < function update() < if mcontroller.atWorldLimit() then < vehicle.destroy() < return < end < < local animState = animator.animationState("base") < local waterFactor = mcontroller.liquidPercentage() < < if (animState == "warpedOut") then < vehicle.destroy() < elseif (animState == "warpInPart1" or animState == "warpOutPart2") then < -- world.debugText("warping",mcontroller.position(),"red") < < mcontroller.setPosition(self.spawnPosition) < mcontroller.setVelocity({0, 0}) < elseif (animState == "sinking") then < -- world.debugText("sinking", mcontroller.position(), "red") < < self.angle = updateSinking(waterFactor, self.angle, -math.pi * 0.4) < elseif (animState == "idle") then < -- world.debugText("idle", mcontroller.position(), "green") < < local healthFactor = storage.health / self.maxHealth < local waterSurface = self.maxGroundSearchDistance < self.waterBounds = mcontroller.localBoundBox() < < --work out water surface < if (waterFactor > 0) then < waterSurface = (self.waterBounds[4] * waterFactor) + (self.waterBounds[2] * (1.0 - waterFactor)) < end < < self.waterBounds[2] = waterSurface + 0.25 < self.waterBounds[4] = waterSurface + 0.5 < < -- world.debugText(string.format("WaterSurface=%s", self.waterBounds[2]), mcontroller.position(), "yellow") < < local moving, facing = updateDriving() < < --Rocking in the wind, and rotating up when moving < local floating = updateFloating(waterFactor, moving,facing) < updateMovingEffects(floating,moving) < updatePassengers(healthFactor) < < if storage.health <= 0 then < vehicle.setLoungeEnabled("titanicPose", false) < animator.setAnimationState("base", "sinking") < self.sinkTimer = config.getParameter("maxSinkTime") < end < < self.facingDirection = facing < self.waterFactor = waterFactor < end < < --take care of rotating and flipping < animator.resetTransformationGroup("flip") < animator.resetTransformationGroup("rotation") < < if self.facingDirection < 0 then < animator.scaleTransformationGroup("flip", {-1, 1}) < end < < animator.rotateTransformationGroup("rotation", self.angle) < < mcontroller.setRotation(self.angle) < end < < function updateDriving() < local moving = false < local facing = self.facingDirection < < local driverThisFrame = vehicle.entityLoungingIn("drivingSeat") < if (driverThisFrame ~= nil) then < vehicle.setDamageTeam(world.entityDamageTeam(driverThisFrame)) < < if vehicle.controlHeld("drivingSeat", "left") then < if self.waterFactor > 0 then < mcontroller.approachXVelocity(-self.targetMoveSpeed, self.moveControlForce) < moving = true < end < facing = -1 < end < < if vehicle.controlHeld("drivingSeat", "right") then < if self.waterFactor > 0 then < mcontroller.approachXVelocity(self.targetMoveSpeed, self.moveControlForce) < moving = true < end < facing = 1 < end < else < vehicle.setDamageTeam({type = "passive"}) < end < < return moving, facing < end < < function updateSinking(waterFactor, currentAngle, sinkAngle) < self.sinkTimer = self.sinkTimer - script.updateDt() < if self.sinkTimer <= 0 or mcontroller.onGround() then < animator.playSound("changeDamageState") < animator.setParticleEmitterBurstCount("damageShards", config.getParameter("destroyParticleBurstCount")) < animator.burstParticleEmitter("damageShards") < vehicle.destroy() < else < if (waterFactor > self.minWaterFactorToFloat) then < if (currentAngle ~= sinkAngle) then < currentAngle = currentAngle + (sinkAngle - currentAngle) * self.angleApproachFactor < < local lerpFactor = math.cos(currentAngle - sinkAngle) < local finalBuoyancy = (self.maxBuoyancy * (1.0 - lerpFactor)) + (self.sinkingBuoyancy * lerpFactor) < mcontroller.applyParameters({ < liquidBuoyancy = finalBuoyancy, < liquidFriction = self.sinkingFriction, < frictionEnabled = true < }) < end < animator.setParticleEmitterActive("bubbles", true) < end < end < < return currentAngle < end < < function updateFloating(waterFactor, moving, facing) < local floating = waterFactor > self.minWaterFactorToFloat < < local targetAngle < if (floating) then < self.rockingTimer = self.rockingTimer + script.updateDt() < if self.rockingTimer > self.rockingInterval then < self.rockingTImer = self.rockingTimer - self.rockingInterval < end < < local speedAngle = mcontroller.xVelocity() * self.speedRotationMultiplier < < local windPosition = vec2.add(mcontroller.position(), self.windLevelOffset) < local windLevel = world.windLevel(windPosition) < local windMaxAngle = self.rockingWindAngleMultiplier * windLevel < local windAngle = windMaxAngle * (math.sin(self.rockingTimer / self.rockingInterval * (math.pi * 2))) < < targetAngle = windMaxAngle + speedAngle < else < targetAngle = calcGroundCollisionAngle(self.waterBounds[2]) --pass in the water surface < end < < self.angle = self.angle + (targetAngle - self.angle) * self.angleApproachFactor < < if waterFactor > (self.waterFactor + self.splashEpsilon) then < local floatingLiquid = mcontroller.liquidId() < if (floatingLiquid > 0) then < if (floatingLiquid > #self.bowWaveParticleNames) then < floatingLiquid = 1 --off the end, go to "water" as a default < end < < local splashEmitter=self.splashParticleNames[floatingLiquid] < < animator.setParticleEmitterOffsetRegion(splashEmitter,self.waterBounds) < < animator.burstParticleEmitter(splashEmitter) < end < end < return floating < end < < function updateMovingEffects(floating, moving) < if moving then < animator.setAnimationState("propeller", "turning") < if floating then < local floatingLiquid = mcontroller.liquidId() < if (floatingLiquid > 0) then < if (floatingLiquid > #self.bowWaveParticleNames) then < floatingLiquid = 1 --off the end, go to "water" as a default < end < < local bowWaveEmitter = self.bowWaveParticleNames[floatingLiquid] < < local rateFactor = math.abs(mcontroller.xVelocity()) / self.targetMoveSpeed < rateFactor = rateFactor * self.bowWaveMaxEmissionRate < animator.setParticleEmitterEmissionRate(bowWaveEmitter, rateFactor) < < local bowWaveBounds = self.waterBounds < animator.setParticleEmitterOffsetRegion(bowWaveEmitter, bowWaveBounds) < < animator.setParticleEmitterActive(bowWaveEmitter, true) < end < end < else < animator.setAnimationState("propeller", "still") < for i, emitter in ipairs(self.bowWaveParticleNames) do < animator.setParticleEmitterActive(emitter, false) < end < end < end < < --make the driver emote according to the damage state of the vehicle < function updatePassengers(healthFactor) < if healthFactor >= 0 then < --if we have a scared face on because of taking damage < if self.damageEmoteTimer > 0 then < self.damageEmoteTimer = self.damageEmoteTimer - script.updateDt() < if (self.damageEmoteTimer < 0) then < maxDamageState = #self.damageStateDriverEmotes < damageStateIndex = maxDamageState < damageStateIndex = (maxDamageState - math.ceil(healthFactor * maxDamageState)) + 1 < vehicle.setLoungeEmote("drivingSeat", self.damageStateDriverEmotes[damageStateIndex]) < end < end < end < end < < function applyDamage(damageRequest) < local damage = 0 < if damageRequest.damageType == "Damage" then < damage = damage + root.evalFunction2("protection", damageRequest.damage, self.protection) < elseif damageRequest.damageType == "IgnoresDef" then < damage = damage + damageRequest.damage < else < return < end < < updateDamageEffects(damage, false) < < local healthLost = math.min(damage, storage.health) < storage.health = storage.health - healthLost < < return {{ < sourceEntityId = damageRequest.sourceEntityId, < targetEntityId = entity.id(), < position = mcontroller.position(), < damageDealt = damage, < healthLost = healthLost, < hitType = "Hit", < damageSourceKind = damageRequest.damageSourceKind, < targetMaterialKind = self.materialKind, < killed = storage.health <= 0 < }} < end < < function setDamageEmotes() < local damageTakenEmote = config.getParameter("damageTakenEmote") < self.damageEmoteTimer = config.getParameter("damageEmoteTime") < vehicle.setLoungeEmote("drivingSeat", damageTakenEmote) < end < < function updateDamageEffects(damage, initialise) < local maxDamageState = #self.damageStateNames < local healthFactor = (storage.health - damage) / self.maxHealth < local prevhealthFactor = storage.health / self.maxHealth < < local prevDamageStateIndex = util.clamp(maxDamageState - math.ceil(prevhealthFactor * maxDamageState) + 1, 1, maxDamageState) < self.damageStateIndex = util.clamp(maxDamageState - math.ceil(healthFactor * maxDamageState) + 1, 1, maxDamageState) < < if ((self.damageStateIndex > prevDamageStateIndex) or initialise == true) then < animator.setGlobalTag("damageState", self.damageStateNames[self.damageStateIndex]) < < local settingsNameList = config.getParameter("damageMovementSettingNames") < local settingsObject = config.getParameter(settingsNameList[self.damageStateIndex]) < < self.maxBuoyancy = mcontroller.parameters().liquidBuoyancy < < mcontroller.applyParameters(settingsObject) < end < < if (self.damageStateIndex > prevDamageStateIndex) then < setDamageEmotes(healthFactor) < < animator.burstParticleEmitter("damageShards") < animator.playSound("changeDamageState") < end < end < < function calcGroundCollisionAngle(waterSurface) < local frontDistance = math.min(distanceToGround(self.frontGroundTestPoint), waterSurface) < local backDistance = math.min(distanceToGround(self.backGroundTestPoint), waterSurface) < < if frontDistance == self.maxGroundSearchDistance and backDistance == self.maxGroundSearchDistance then < return 0 < else < return -math.atan(backDistance - frontDistance) < end < end < < function distanceToGround(point) < -- to worldspace < point = vec2.rotate(point, self.angle) < point = vec2.add(point, mcontroller.position()) < < local endPoint = vec2.add(point, {0, -self.maxGroundSearchDistance}) < local intPoint = world.lineCollision(point, endPoint) < < if intPoint then < -- world.debugPoint(intPoint, {255, 255, 0, 255}) < return point[2] - intPoint[2] < else < -- world.debugPoint(endPoint, {255, 0, 0, 255}) < return self.maxGroundSearchDistance < end < end --- > require "/scripts/vec2.lua" > require "/scripts/util.lua" > > function init() > self.rockingTimer = 0 > self.facingDirection = 1 > self.angle = 0 > animator.setParticleEmitterActive("bubbles", false) > self.damageEmoteTimer = 0 > self.spawnPosition = mcontroller.position() > > self.waterFactor = 0 --how much water are we in right now > > self.rockingInterval = config.getParameter("rockingInterval") > self.maxHealth = config.getParameter("maxHealth") > self.protection = config.getParameter("protection") > > self.damageStateNames = config.getParameter("damageStateNames") > self.damageStateDriverEmotes = config.getParameter("damageStateDriverEmotes") > self.materialKind = config.getParameter("materialKind") > > self.windLevelOffset = config.getParameter("windLevelOffset") > self.rockingWindAngleMultiplier = config.getParameter("rockingWindAngleMultiplier") > self.maxRockingAngle = config.getParameter("maxRockingAngle") > self.angleApproachFactor = config.getParameter("angleApproachFactor") > > self.speedRotationMultiplier = config.getParameter("speedRotationMultiplier") > > self.targetMoveSpeed = config.getParameter("targetMoveSpeed") > self.moveControlForce = config.getParameter("moveControlForce") > > mcontroller.resetParameters(config.getParameter("movementSettings")) > > self.minWaterFactorToFloat = config.getParameter("minWaterFactorToFloat") > self.sinkingBuoyancy = config.getParameter("sinkingBuoyancy") > self.sinkingFriction = config.getParameter("sinkingFriction") > > self.bowWaveParticleNames=config.getParameter("bowWaveParticles") > self.bowWaveMaxEmissionRate=config.getParameter("bowWaveMaxEmissionRate") > > self.splashParticleNames = config.getParameter("splashParticles") > self.splashEpsilon = config.getParameter("splashEpsilon") > > self.maxGroundSearchDistance = config.getParameter("maxGroundSearchDistance") > > local bounds = mcontroller.localBoundBox() > self.frontGroundTestPoint = {bounds[1], bounds[2]} > self.backGroundTestPoint = {bounds[3], bounds[2]} > > --setup the store functionality > self.ownerKey = config.getParameter("ownerKey") > vehicle.setPersistent(self.ownerKey) > > message.setHandler("store", > function(_, _, ownerKey) > local animState=animator.animationState("base") > > if (animState == "idle" or animState == "sinking") then > if (self.ownerKey and self.ownerKey == ownerKey) then > self.spawnPosition = mcontroller.position() > animator.setAnimationState("base", "warpOutPart1") > local localStorable = (self.driver == nil) > return {storable = true, healthFactor = storage.health / self.maxHealth} > end > end > end) > > if (storage.health) then > animator.setAnimationState("base", "idle") > else > local startHealthFactor = config.getParameter("startHealthFactor") > > if (startHealthFactor == nil) then > storage.health = self.maxHealth > else > storage.health = math.min(startHealthFactor * self.maxHealth, self.maxHealth) > end > animator.setAnimationState("base", "warpInPart1") > end > > updateDamageEffects(0, true) > self.maxBuoyancy = mcontroller.parameters().liquidBuoyancy > end > > function update() > if mcontroller.atWorldLimit() then > vehicle.destroy() > return > end > > local animState = animator.animationState("base") > local waterFactor = mcontroller.liquidPercentage() > > if (animState == "warpedOut") then > vehicle.destroy() > elseif (animState == "warpInPart1" or animState == "warpOutPart2") then > -- world.debugText("warping",mcontroller.position(),"red") > > mcontroller.setPosition(self.spawnPosition) > mcontroller.setVelocity({0, 0}) > elseif (animState == "sinking") then > -- world.debugText("sinking", mcontroller.position(), "red") > > self.angle = updateSinking(waterFactor, self.angle, -math.pi * 0.4) > elseif (animState == "idle") then > -- world.debugText("idle", mcontroller.position(), "green") > > local healthFactor = storage.health / self.maxHealth > local waterSurface = self.maxGroundSearchDistance > self.waterBounds = mcontroller.localBoundBox() > > --work out water surface > if (waterFactor > 0) then > waterSurface = (self.waterBounds[4] * waterFactor) + (self.waterBounds[2] * (1.0 - waterFactor)) > end > > self.waterBounds[2] = waterSurface + 0.25 > self.waterBounds[4] = waterSurface + 0.5 > > -- world.debugText(string.format("WaterSurface=%s", self.waterBounds[2]), mcontroller.position(), "yellow") > > local moving, facing = updateDriving() > > --Rocking in the wind, and rotating up when moving > local floating = updateFloating(waterFactor, moving,facing) > updateMovingEffects(floating,moving) > updatePassengers(healthFactor) > > if storage.health <= 0 then > vehicle.setLoungeEnabled("titanicPose", false) > animator.setAnimationState("base", "sinking") > self.sinkTimer = config.getParameter("maxSinkTime") > end > > self.facingDirection = facing > self.waterFactor = waterFactor > end > > --take care of rotating and flipping > animator.resetTransformationGroup("flip") > animator.resetTransformationGroup("rotation") > > if self.facingDirection < 0 then > animator.scaleTransformationGroup("flip", {-1, 1}) > end > > animator.rotateTransformationGroup("rotation", self.angle) > > mcontroller.setRotation(self.angle) > end > > function updateDriving() > local moving = false > local facing = self.facingDirection > > local driverThisFrame = vehicle.entityLoungingIn("drivingSeat") > if (driverThisFrame ~= nil) then > vehicle.setDamageTeam(world.entityDamageTeam(driverThisFrame)) > > if vehicle.controlHeld("drivingSeat", "left") then > if self.waterFactor > 0 then > mcontroller.approachXVelocity(-self.targetMoveSpeed, self.moveControlForce) > moving = true > end > facing = -1 > end > > if vehicle.controlHeld("drivingSeat", "right") then > if self.waterFactor > 0 then > mcontroller.approachXVelocity(self.targetMoveSpeed, self.moveControlForce) > moving = true > end > facing = 1 > end > else > vehicle.setDamageTeam({type = "passive"}) > end > > return moving, facing > end > > function updateSinking(waterFactor, currentAngle, sinkAngle) > self.sinkTimer = self.sinkTimer - script.updateDt() > if self.sinkTimer <= 0 or mcontroller.onGround() then > animator.playSound("changeDamageState") > animator.setParticleEmitterBurstCount("damageShards", config.getParameter("destroyParticleBurstCount")) > animator.burstParticleEmitter("damageShards") > vehicle.destroy() > else > if (waterFactor > self.minWaterFactorToFloat) then > if (currentAngle ~= sinkAngle) then > currentAngle = currentAngle + (sinkAngle - currentAngle) * self.angleApproachFactor > > local lerpFactor = math.cos(currentAngle - sinkAngle) > local finalBuoyancy = (self.maxBuoyancy * (1.0 - lerpFactor)) + (self.sinkingBuoyancy * lerpFactor) > mcontroller.applyParameters({ > liquidBuoyancy = finalBuoyancy, > liquidFriction = self.sinkingFriction, > frictionEnabled = true > }) > end > animator.setParticleEmitterActive("bubbles", true) > end > end > > return currentAngle > end > > function updateFloating(waterFactor, moving, facing) > local floating = waterFactor > self.minWaterFactorToFloat > > local targetAngle > if (floating) then > self.rockingTimer = self.rockingTimer + script.updateDt() > if self.rockingTimer > self.rockingInterval then > self.rockingTimer = self.rockingTimer - self.rockingInterval > end > > local speedAngle = mcontroller.xVelocity() * self.speedRotationMultiplier > > local windPosition = vec2.add(mcontroller.position(), self.windLevelOffset) > local windLevel = world.windLevel(windPosition) > local windMaxAngle = self.rockingWindAngleMultiplier * windLevel > local windAngle = windMaxAngle * (math.sin(self.rockingTimer / self.rockingInterval * (math.pi * 2))) > > targetAngle = windAngle + speedAngle > else > targetAngle = calcGroundCollisionAngle(self.waterBounds[2]) --pass in the water surface > end > > self.angle = self.angle + (targetAngle - self.angle) * self.angleApproachFactor > > if waterFactor > (self.waterFactor + self.splashEpsilon) then > local floatingLiquid = mcontroller.liquidId() > if (floatingLiquid > 0) then > if (floatingLiquid > #self.bowWaveParticleNames) then > floatingLiquid = 1 --off the end, go to "water" as a default > end > > local splashEmitter=self.splashParticleNames[floatingLiquid] > > animator.setParticleEmitterOffsetRegion(splashEmitter,self.waterBounds) > > animator.burstParticleEmitter(splashEmitter) > end > end > return floating > end > > function updateMovingEffects(floating, moving) > if moving then > animator.setAnimationState("propeller", "turning") > if floating then > local floatingLiquid = mcontroller.liquidId() > if (floatingLiquid > 0) then > if (floatingLiquid > #self.bowWaveParticleNames) then > floatingLiquid = 1 --off the end, go to "water" as a default > end > > local bowWaveEmitter = self.bowWaveParticleNames[floatingLiquid] > > local rateFactor = math.abs(mcontroller.xVelocity()) / self.targetMoveSpeed > rateFactor = rateFactor * self.bowWaveMaxEmissionRate > animator.setParticleEmitterEmissionRate(bowWaveEmitter, rateFactor) > > local bowWaveBounds = self.waterBounds > animator.setParticleEmitterOffsetRegion(bowWaveEmitter, bowWaveBounds) > > animator.setParticleEmitterActive(bowWaveEmitter, true) > end > end > else > animator.setAnimationState("propeller", "still") > for i, emitter in ipairs(self.bowWaveParticleNames) do > animator.setParticleEmitterActive(emitter, false) > end > end > end > > --make the driver emote according to the damage state of the vehicle > function updatePassengers(healthFactor) > if healthFactor >= 0 then > --if we have a scared face on because of taking damage > if self.damageEmoteTimer > 0 then > self.damageEmoteTimer = self.damageEmoteTimer - script.updateDt() > if (self.damageEmoteTimer < 0) then > maxDamageState = #self.damageStateDriverEmotes > damageStateIndex = maxDamageState > damageStateIndex = (maxDamageState - math.ceil(healthFactor * maxDamageState)) + 1 > vehicle.setLoungeEmote("drivingSeat", self.damageStateDriverEmotes[damageStateIndex]) > end > end > end > end > > function applyDamage(damageRequest) > local damage = 0 > if damageRequest.damageType == "Damage" then > damage = damage + root.evalFunction2("protection", damageRequest.damage, self.protection) > elseif damageRequest.damageType == "IgnoresDef" then > damage = damage + damageRequest.damage > else > return > end > > updateDamageEffects(damage, false) > > local healthLost = math.min(damage, storage.health) > storage.health = storage.health - healthLost > > return {{ > sourceEntityId = damageRequest.sourceEntityId, > targetEntityId = entity.id(), > position = mcontroller.position(), > damageDealt = damage, > healthLost = healthLost, > hitType = "Hit", > damageSourceKind = damageRequest.damageSourceKind, > targetMaterialKind = self.materialKind, > killed = storage.health <= 0 > }} > end > > function setDamageEmotes() > local damageTakenEmote = config.getParameter("damageTakenEmote") > self.damageEmoteTimer = config.getParameter("damageEmoteTime") > vehicle.setLoungeEmote("drivingSeat", damageTakenEmote) > end > > function updateDamageEffects(damage, initialise) > local maxDamageState = #self.damageStateNames > local healthFactor = (storage.health - damage) / self.maxHealth > local prevhealthFactor = storage.health / self.maxHealth > > local prevDamageStateIndex = util.clamp(maxDamageState - math.ceil(prevhealthFactor * maxDamageState) + 1, 1, maxDamageState) > self.damageStateIndex = util.clamp(maxDamageState - math.ceil(healthFactor * maxDamageState) + 1, 1, maxDamageState) > > if ((self.damageStateIndex > prevDamageStateIndex) or initialise == true) then > animator.setGlobalTag("damageState", self.damageStateNames[self.damageStateIndex]) > > local settingsNameList = config.getParameter("damageMovementSettingNames") > local settingsObject = config.getParameter(settingsNameList[self.damageStateIndex]) > > self.maxBuoyancy = mcontroller.parameters().liquidBuoyancy > > mcontroller.applyParameters(settingsObject) > end > > if (self.damageStateIndex > prevDamageStateIndex) then > setDamageEmotes(healthFactor) > > animator.burstParticleEmitter("damageShards") > animator.playSound("changeDamageState") > end > end > > function calcGroundCollisionAngle(waterSurface) > local frontDistance = math.min(distanceToGround(self.frontGroundTestPoint), waterSurface) > local backDistance = math.min(distanceToGround(self.backGroundTestPoint), waterSurface) > > if frontDistance == self.maxGroundSearchDistance and backDistance == self.maxGroundSearchDistance then > return 0 > else > return -math.atan(backDistance - frontDistance) > end > end > > function distanceToGround(point) > -- to worldspace > point = vec2.rotate(point, self.angle) > point = vec2.add(point, mcontroller.position()) > > local endPoint = vec2.add(point, {0, -self.maxGroundSearchDistance}) > local intPoint = world.lineCollision(point, endPoint) > > if intPoint then > -- world.debugPoint(intPoint, {255, 255, 0, 255}) > return point[2] - intPoint[2] > else > -- world.debugPoint(endPoint, {255, 0, 0, 255}) > return self.maxGroundSearchDistance > end > end vehicles\sportscar\sportscar.animation 65a66,74 > "warpInPart1" : { > "properties" : { > } > }, > "warpInPart2" : { > "properties" : { > "image" : "sportscarfullbright.png:move." > } > }, 68a78,86 > } > }, > "warpOutPart1" : { > "properties" : { > "image" : "sportscarfullbright.png:move." > } > }, > "warpOutPart2" : { > "properties" : {