FILES ----- player.config items\active\weapons\weapon2.lua items\active\weapons\melee\spear\rarespear.activeitem items\active\weapons\ranged\gun.lua [NEW] items\active\weapons\ranged\gunfire.lua items\active\weapons\ranged\altabilities\altfire.lua items\active\weapons\ranged\altabilities\bouncingshot\bouncingshot.altability items\active\weapons\ranged\altabilities\explosiveburst\explosiveburst.altability items\active\weapons\ranged\altabilities\explosiveburst\explosiveburst.lua items\active\weapons\ranged\altabilities\explosiveshot\explosiveshot.altability items\active\weapons\ranged\altabilities\flashlight\flashlight.lua items\active\weapons\ranged\altabilities\grenadelauncher\grenadelauncher.altability items\active\weapons\ranged\altabilities\guidedrocket\guidedrocket.altability items\active\weapons\ranged\altabilities\guidedrocket\guidedrocket.lua items\active\weapons\ranged\altabilities\homingrocket\homingrocket.altability items\active\weapons\ranged\altabilities\homingrocket\homingrocket.lua items\active\weapons\ranged\altabilities\lance\lance.altability items\active\weapons\ranged\altabilities\lance\lance.lua items\active\weapons\ranged\altabilities\markedshot\markedshot.altability items\active\weapons\ranged\altabilities\markedshot\markedshot.lua items\active\weapons\ranged\altabilities\piercingshot\piercingshot.altability items\active\weapons\ranged\altabilities\spray\spray.altability items\active\weapons\ranged\altabilities\stickyshot\stickyshot.altability items\active\weapons\ranged\assaultrifle\commonassaultrifle.activeitem items\active\weapons\ranged\assaultrifle\rareassaultrifle.activeitem items\active\weapons\ranged\assaultrifle\uncommonassaultrifle.activeitem items\active\weapons\ranged\grenadelauncher\commongrenadelauncher.activeitem items\active\weapons\ranged\grenadelauncher\raregrenadelauncher.activeitem items\active\weapons\ranged\grenadelauncher\uncommongrenadelauncher.activeitem items\active\weapons\ranged\machinepistol\commonmachinepistol.activeitem items\active\weapons\ranged\machinepistol\raremachinepistol.activeitem items\active\weapons\ranged\machinepistol\uncommonmachinepistol.activeitem items\active\weapons\ranged\pistol\commonpistol.activeitem items\active\weapons\ranged\pistol\rarepistol.activeitem items\active\weapons\ranged\pistol\uncommonpistol.activeitem items\active\weapons\ranged\rocketlauncher\commonrocketlauncher.activeitem items\active\weapons\ranged\rocketlauncher\rarerocketlauncher.activeitem items\active\weapons\ranged\rocketlauncher\uncommonrocketlauncher.activeitem items\active\weapons\ranged\shotgun\commonshotgun.activeitem items\active\weapons\ranged\shotgun\rareshotgun.activeitem items\active\weapons\ranged\shotgun\uncommonshotgun.activeitem items\active\weapons\ranged\sniperrifle\commonsniperrifle.activeitem items\active\weapons\ranged\sniperrifle\raresniperrifle.activeitem items\active\weapons\ranged\sniperrifle\uncommonsniperrifle.activeitem objects\generic\mechanicalelevator\mechanicalelevator.animation objects\generic\mechanicalelevator\mechanicalelevatorlong.object objects\generic\mechanicalelevator\mechanicalelevatorlongbottom.png objects\generic\mechanicalelevator\mechanicalelevatorlongicon.png objects\generic\mechanicalelevator\mechanicalelevatorlongstand.png objects\generic\mechanicalelevator\mechanicalelevatorlongtop.png objects\generic\mechanicalelevator\mechanicalelevatorshort.object objects\generic\mechanicalelevator\mechanicalelevatorshortbottom.png objects\generic\mechanicalelevator\mechanicalelevatorshorticon.png objects\generic\mechanicalelevator\mechanicalelevatorshorttop.png objects\generic\mechanicalelevator\platform.png objects\generic\steelelevator\steelelevator.animation objects\generic\steelelevator\steelelevatorlong.object objects\generic\steelelevator\steelelevatorlongicon.png objects\generic\steelelevator\steelelevatorshort.object objects\generic\steelelevator\steelelevatorshorticon.png objects\generic\woodenelevator\woodenelevator.animation objects\generic\woodenelevator\woodenelevatorlongicon.png objects\generic\woodenelevator\woodenelevatorshorticon.png [NEW] objects\wired\movingplatform\movingelevatorlong.objectdisabled [NEW] objects\wired\movingplatform\movingelevatorshort.objectdisabled quests\generated\subquests.config quests\scripts\generated\fetch.lua [NEW] recipes\ironcraftingtable\mechanicalelevatorlong.recipe [NEW] recipes\ironcraftingtable\mechanicalelevatorshort.recipe recipes\ironcraftingtable\steelelevatorlong.recipe recipes\ironcraftingtable\steelelevatorshort.recipe scripts\util.lua [NEW] sfx\objects\mechanical_elevator_hit1.ogg [NEW] sfx\objects\mechanical_elevator_hit2.ogg [NEW] sfx\objects\mechanical_elevator_hit3.ogg [NEW] sfx\objects\mechanical_elevator_hit4.ogg [NEW] sfx\objects\mechanical_elevator_hit5.ogg [NEW] sfx\objects\mechanical_elevator_loop.ogg [NEW] sfx\objects\steel_elevator_hit.ogg [NEW] sfx\objects\steel_elevator_loop.ogg [NEW] sfx\objects\wooden_elevator_hit.ogg [NEW] sfx\objects\wooden_elevator_loop1.ogg [NEW] sfx\objects\wooden_elevator_loop2.ogg [NEW] sfx\objects\wooden_elevator_loop3.ogg tiles\platforms\ruinsplatform.png DIFFS ----- player.config 50,51d49 < { "item" : "woodenelevatorshort" }, < { "item" : "woodenelevatorlong" }, 65a64,70 > { "item" : "woodenelevatorshort" }, > { "item" : "woodenelevatorlong" }, > { "item" : "mechanicalelevatorshort" }, > { "item" : "mechanicalelevatorlong" }, > { "item" : "steelelevatorshort" }, > { "item" : "steelelevatorlong" }, > 186,189d190 < < // STEEL ITEMS < { "item" : "steelelevatorshort" }, < { "item" : "steelelevatorlong" }, items\active\weapons\weapon2.lua 59c59 < self.currentAbility:uninit() --- > self.currentAbility:uninit(true) 197c197 < function getAltAbility() --- > function getAltAbility(elementalType) 203c203 < return setupAltAbility(altAbilityConfig) --- > return setupAltAbility(altAbilityConfig, elementalType) 231a232,265 > > -- Helpers > function rangedWeaponConfig() > local config = {} > math.randomseed(item.instanceValue("seed")) > config.elementalType = item.instanceValue("elementalType") > > config.aimOffset = item.instanceValue("aimOffset") or 0 > config.muzzleOffset = item.instanceValue("muzzleOffset") or {0,0} > > return config > end > > function rangedAttackConfig(config, elementalType) > local parsed = copy(config) > math.randomseed(item.instanceValue("seed")) > > parsed.fireTime = util.randomInRange(config.fireTime) > > parsed.projectileCount = util.randomIntInRange(config.projectileCount or 1) > > parsed.projectileParameters = config.projectileParameters or {} > parsed.projectileParameters.power = ((util.randomInRange(config.baseDps) * parsed.fireTime) / parsed.projectileCount) * root.evalFunction("gunDamageLevelMultiplier", item.instanceValue("level", 1)) > > -- Fire mode > parsed.fireType = util.randomFromList(config.fireType or "auto") > parsed.burstCount = util.randomIntInRange(config.burstCount or 3) > parsed.burstTime = util.randomInRange(config.burstTime or 0.075) > > local elementalTypes = config.elementalProjectiles or {} > parsed.projectileType = util.randomFromList(elementalTypes[elementalType] or config.projectileType) > > return parsed > end \ No newline at end of file items\active\weapons\melee\spear\rarespear.activeitem 116,118c116,118 < //"/items/active/weapons/melee/altabilities/generic/blinkexplosion/blinkexplosion.altability", < //"/items/active/weapons/melee/altabilities/spear/barrier/barrier.altability", < //"/items/active/weapons/melee/altabilities/spear/elementalspin/elementalspin.altability", --- > "/items/active/weapons/melee/altabilities/generic/blinkexplosion/blinkexplosion.altability", > "/items/active/weapons/melee/altabilities/spear/barrier/barrier.altability", > "/items/active/weapons/melee/altabilities/spear/elementalspin/elementalspin.altability", items\active\weapons\ranged\gun.lua 3c3,5 < require "/items/active/weapons/weapon.lua" --- > require "/scripts/interp.lua" > require "/items/active/weapons/weapon2.lua" > require "/items/active/weapons/ranged/gunfire.lua" 6c8 < weapon.setGeneratedRangedStats() --- > self.weapon = Weapon:new(rangedWeaponConfig()) 8,9c10,11 < self.attackTimer = 0 < self.stances = item.instanceValue("stances") --- > self.weapon:addTransformationGroup("weapon", {0,0}, 0) > self.weapon:addTransformationGroup("muzzle", self.weapon.muzzleOffset, 0) 11c13,14 < weapon.setAltAbility() --- > local primaryAttack = GunFire:new(rangedAttackConfig(item.instanceValue("primaryAttack"), self.weapon.elementalType), item.instanceValue("stances")) > self.weapon:addAbility(primaryAttack) 13c16,21 < idle() --- > local secondaryAttack = getAltAbility(self.weapon.elementalType) > if secondaryAttack then > self.weapon:addAbility(secondaryAttack) > end > > self.weapon:init() 17,62c25 < self.attackTimer = math.max(0, self.attackTimer - dt) < < if self.state == "autofire" then < weapon.rangedUpdateAim(false, false) < fire() < if self.attackTimer == 0 then cooldown() end < end < < if self.state == "burstfire" then < weapon.rangedUpdateAim(false, false) < local shots = self.burst(fire) < if shots then < local progress = 1 - (shots / self.burstCount) < self.relativeArmRotation = util.toRadians(self.stances.idle.armRotation) + util.toRadians(progress * self.stances.fire.armRotation) < self.relativeWeaponRotation = util.toRadians(self.stances.idle.weaponRotation) + util.toRadians(progress * self.stances.cooldown.weaponRotation) < else < cooldown() < end < end < < if self.state == "cooldown" then < weapon.rangedUpdateAim(false, true) < < local progress = (self.attackTimer / self.stances.cooldown.duration) < self.relativeArmRotation = util.toRadians(self.stances.idle.armRotation) + util.toRadians(progress * self.stances.cooldown.armRotation) < self.relativeWeaponRotation = util.toRadians(self.stances.idle.weaponRotation) + util.toRadians(progress * self.stances.cooldown.weaponRotation) < < if self.attackTimer == 0 then idle() end < end < < if self.state == "idle" then < weapon.rangedUpdateAim(true, true) < < if self.attackTimer == 0 < and fireMode == "primary" < and not world.lineTileCollision(mcontroller.position(), weapon.firePosition()) < and status.overConsumeResource("energy", self.energyPerShot) then < if self.fireType == "auto" then < autofire() < elseif self.fireType == "burst" then < burstfire() < end < end < end < < weapon.update(dt, fireMode, shiftHeld) --- > self.weapon:update(dt, fireMode, shiftHeld) 66,94c29 < weapon.uninit() < end < < function autofire() < self.attackTimer = self.stances.fire.duration < self.state = "autofire" < end < < < function burstfire() < self.state = "burstfire" < self.burst = coroutine.wrap(weapon.burstFire) < end < < function fire() < weapon.fireProjectile() < < animator.setPartTag("muzzleFlash", "variant", math.random(1, 3)) < animator.setAnimationState("firing", "fire") < animator.burstParticleEmitter("muzzleFlash") < animator.playSound("fire") < < animator.setLightActive("muzzleFlash", true) < end < < function cooldown() < self.attackTimer = self.stances.cooldown.duration < self.state = "cooldown" < weapon.setStance(self.stances.cooldown) --- > self.weapon:uninit() 97,102d31 < function idle() < animator.setLightActive("muzzleFlash", false) < self.state = "idle" < self.attackTimer = self.fireTime - self.stances.cooldown.duration < weapon.setStance(self.stances.idle) < end \ No newline at end of file items\active\weapons\ranged\altabilities\altfire.lua 5c5,6 < local altFireAttack = altAbilityConfig --- > local primary = item.instanceValue("primaryAttack") > local altFireAttack = GunFire:new(rangedAttackConfig(sb.jsonMerge(primary, altAbilityConfig)), altAbilityConfig.stances) 7,8c8,9 < function altFireAttack.init() < altFireAttack.cooldownTimer = 0 --- > function altFireAttack:init() > self.cooldownTimer = self.fireTime 11,12c12,13 < function altFireAttack.update(dt, fireMode, shiftHeld) < altFireAttack.cooldownTimer = math.max(0, altFireAttack.cooldownTimer - dt) --- > function altFireAttack:update(dt, fireMode, shiftHeld) > WeaponAbility.update(self, dt, fireMode, shiftHeld) 14,25c15 < if self.state == "idle" < and fireMode == "alt" < and altFireAttack.cooldownTimer == 0 < and not world.lineTileCollision(mcontroller.position(), altFireAttack.firePosition()) then < local energyUsage = altFireAttack.energyUsageMultiplier * root.evalFunction("gunLevelEnergyCostPerDamage", item.instanceValue("level", 1)) * altFireAttack.damageAmount() < if status.overConsumeResource("energy", energyUsage) then < altFireAttack.fire() < end < end < < if self.state == "altFireAttack.cooldown" then < weapon.rangedUpdateAim(false, false) --- > self.cooldownTimer = math.max(0, self.cooldownTimer - self.dt) 27,32c17,21 < local progress = (self.attackTimer / altFireAttack.stances.cooldown.duration) < self.relativeArmRotation = util.toRadians(self.stances.idle.armRotation) + util.toRadians(progress * altFireAttack.stances.cooldown.armRotation) < self.relativeWeaponRotation = util.toRadians(self.stances.idle.weaponRotation) + util.toRadians(progress * altFireAttack.stances.cooldown.weaponRotation) < < if self.attackTimer == 0 then < altFireAttack.idle() --- > if self.fireMode == "alt" and not self.weapon.currentAbility and self.cooldownTimer == 0 and not status.resourceLocked("energy") then > if self.fireType == "auto" and status.overConsumeResource("energy", self:energyPerShot()) then > self:setState(self.auto) > elseif self.fireType == "burst" then > self:setState(self.burst) 37,55c26,27 < function altFireAttack.damageAmount() < return altFireAttack.power() * activeItem.ownerPowerMultiplier() * self.pCount < end < < function altFireAttack.firePosition() < if altFireAttack.firePositionPart then < return vec2.add(mcontroller.position(), activeItem.handPosition(animator.partPoint(altFireAttack.firePositionPart, "firePosition"))) < else < return weapon.firePosition() < end < end < < function altFireAttack.fireProjectile() < altFireAttack.projectileParameters.power = altFireAttack.power() < weapon.fireProjectile(altFireAttack.projectileType, altFireAttack.projectileParameters, altFireAttack.inaccuracy, altFireAttack.firePosition(), altFireAttack.projectileCount) < end < < function altFireAttack.fire() < if not altFireAttack.hidePrimaryMuzzleFlash then --- > function altFireAttack:muzzleFlash() > if not self.hidePrimaryMuzzleFlash then 60,61c32,37 < animator.burstParticleEmitter("altMuzzleFlash", true) < if altFireAttack.usePrimaryFireSound then --- > > if self.useParticleEmitter == nil or self.useParticleEmitter then > animator.burstParticleEmitter("altMuzzleFlash", true) > end > > if self.usePrimaryFireSound then 66,69d41 < < altFireAttack.fireProjectile() < < altFireAttack.cooldown() 72,84c44,49 < function altFireAttack.idle() < idle() < end < < function altFireAttack.cooldown() < self.state = "altFireAttack.cooldown" < weapon.setStance(altFireAttack.stances.cooldown) < self.attackTimer = altFireAttack.stances.cooldown.duration < altFireAttack.cooldownTimer = altFireAttack.cooldownTime < end < < function altFireAttack.power() < return altFireAttack.baseDamage * root.evalFunction("gunDamageLevelMultiplier", item.instanceValue("level", 1)) / self.pCount --- > function altFireAttack:firePosition() > if self.firePositionPart then > return vec2.add(mcontroller.position(), activeItem.handPosition(animator.partPoint(self.firePositionPart, "firePosition"))) > else > return GunFire.firePosition(self) > end items\active\weapons\ranged\altabilities\bouncingshot\bouncingshot.altability 27a28 > 33c34 < "baseDamage" : 3, --- > "baseDps" : 6, 35c36,37 < "cooldownTime" : 0.5, --- > "fireTime" : 0.5, > 36a39,47 > "fire" : { > "duration" : 0.15, > "armRotation" : 5, > "weaponRotation" : 5, > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false > }, 41c52,55 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\altabilities\explosiveburst\explosiveburst.altability 25a26,27 > > "energyUsageMultiplier" : 1.0, 31d32 < "minDistance" : 5, 34,36c35,40 < "baseDamage" : 6, < "energyUsageMultiplier" : 1.0, < "cooldownTime" : 1.0, --- > "baseDps" : 6, > "fireTime" : 0.2, > "fireType" : "burst", > > "minDistance" : 5, > 42c46,49 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 48c55,58 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\altabilities\explosiveburst\explosiveburst.lua 2a3 > require "/items/active/weapons/ranged/gunfire.lua" 5c6,7 < local burstAttack = altAbilityConfig --- > local primary = item.instanceValue("primaryAttack") > local explosiveBurst = GunFire:new(rangedAttackConfig(sb.jsonMerge(primary, altAbilityConfig)), altAbilityConfig.stances) 7,8c9,10 < function burstAttack.init() < burstAttack.cooldownTimer = 0 --- > function explosiveBurst:init() > self.cooldownTimer = self.fireTime 11,12c13,14 < function burstAttack.update(dt, fireMode, shiftHeld) < burstAttack.cooldownTimer = math.max(0, burstAttack.cooldownTimer - dt) --- > function explosiveBurst:update(dt, fireMode, shiftHeld) > WeaponAbility.update(self, dt, fireMode, shiftHeld) 14,39c16 < if self.state == "idle" < and fireMode == "alt" < and burstAttack.cooldownTimer == 0 < and not world.lineTileCollision(mcontroller.position(), weapon.firePosition()) < and not status.resourceLocked("energy") then < burstAttack.burstfire() < end < < if self.state == "burstAttack.burstfire" then < weapon.rangedUpdateAim(false, false) < < local shots = burstAttack.burst(burstAttack.fire, burstAttack.burstCount, burstAttack.burstTime) < if shots then < local progress = 1 - (shots / burstAttack.burstCount) < activeItem.setArmAngle(self.aimAngle + util.toRadians(self.stances.idle.armRotation) + util.toRadians((progress * burstAttack.stances.fire.armRotation))) < else < burstAttack.cooldown() < end < end < < if self.state == "burstAttack.cooldown" then < weapon.rangedUpdateAim(false, false) < < local progress = (self.attackTimer / burstAttack.stances.cooldown.duration) < self.relativeArmRotation = util.toRadians(self.stances.idle.armRotation) + util.toRadians(progress * burstAttack.stances.cooldown.armRotation) < self.relativeWeaponRotation = util.toRadians(progress * burstAttack.stances.cooldown.weaponRotation) --- > self.cooldownTimer = math.max(0, self.cooldownTimer - self.dt) 41,42c18,22 < if self.attackTimer == 0 then < burstAttack.idle() --- > if self.fireMode == "alt" and not self.weapon.currentAbility and self.cooldownTimer == 0 and not status.resourceLocked("energy") then > if self.fireType == "auto" and status.overConsumeResource("energy", self:energyPerShot()) then > self:setState(self.auto) > elseif self.fireType == "burst" then > self:setState(self.burst) 47,63c27,28 < function burstAttack.fire() < burstAttack.projectileParameters.power = burstAttack.power() < distance = math.max(burstAttack.minDistance, burstAttack.aimDistance * (0.90 + (math.random() * 0.2))) < burstAttack.projectileParameters.timeToLive = distance / burstAttack.projectileParameters.speed < weapon.fireProjectile(burstAttack.projectileType, burstAttack.projectileParameters, burstAttack.inaccuracy) < < animator.setPartTag("muzzleFlash", "variant", math.random(1, 3)) < animator.setAnimationState("firing", "fire") < animator.burstParticleEmitter("altMuzzleFlash", true) < animator.playSound("altFire") < end < < function burstAttack.burstfire() < self.state = "burstAttack.burstfire" < < burstAttack.burst = coroutine.wrap(weapon.burstFire) < burstAttack.aimDistance = world.magnitude(activeItem.ownerAimPosition(), weapon.firePosition()) --- > function explosiveBurst:burst() > self.aimDistance = world.magnitude(activeItem.ownerAimPosition(), self:firePosition()) 65c30 < weapon.setStance(burstAttack.stances.fire) --- > return GunFire.burst(self) 68,77c33,37 < function burstAttack.idle() < idle() < end < < function burstAttack.cooldown() < self.state = "burstAttack.cooldown" < weapon.setStance(burstAttack.stances.cooldown) < self.attackTimer = burstAttack.stances.cooldown.duration < burstAttack.cooldownTimer = burstAttack.cooldownTime < end --- > function explosiveBurst:fireProjectile(...) > local min = math.max(self.minDistance, self.aimDistance * 0.9) / self.projectileParameters.speed > local max = math.max(self.minDistance, self.aimDistance * 1.1) / self.projectileParameters.speed > self.projectileParameters.timeToLive = {min, max} > world.logInfo("self.projectileParameters.timeToLive = %s", self.projectileParameters.timeToLive) 79,80c39 < function burstAttack.power() < return burstAttack.baseDamage * root.evalFunction("gunDamageLevelMultiplier", item.instanceValue("level", 1)) --- > GunFire.fireProjectile(self, ...) 83c42 < return burstAttack --- > return explosiveBurst items\active\weapons\ranged\altabilities\explosiveshot\explosiveshot.altability 27a28 > 30c31 < "baseDamage" : 4, --- > "baseDps" : 4, 32c33 < "cooldownTime" : 1.0, --- > "fireTime" : 1.0, 33a35,36 > "fireType" : "auto", > 34a38,46 > "fire" : { > "duration" : 0.15, > "armRotation" : 5, > "weaponRotation" : 5, > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false > }, 39c51,54 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\altabilities\flashlight\flashlight.lua 2c2 < local flashlight = altAbilityConfig --- > local flashlight = WeaponAbility:new(altAbilityConfig, altAbilityConfig.stances) 4,8c4,5 < function flashlight.init() < -- world.logInfo("Initializing flashlight") < animator.setLightActive("flashlight", false) < animator.setLightActive("flashlightSpread", false) < flashlight.active = false --- > function flashlight:init() > self:reset() 11,15c8,14 < function flashlight.update(dt, fireMode, shiftHeld) < if fireMode == "alt" and flashlight.lastFireMode ~= "alt" then < flashlight.active = not flashlight.active < animator.setLightActive("flashlight", flashlight.active) < animator.setLightActive("flashlightSpread", flashlight.active) --- > function flashlight:update(dt, fireMode, shiftHeld) > WeaponAbility.update(self, dt, fireMode, shiftHeld) > > if self.fireMode == "alt" and self.lastFireMode ~= "alt" then > self.active = not self.active > animator.setLightActive("flashlight", self.active) > animator.setLightActive("flashlightSpread", self.active) 18c17,27 < flashlight.lastFireMode = fireMode --- > self.lastFireMode = fireMode > end > > function flashlight:reset() > animator.setLightActive("flashlight", false) > animator.setLightActive("flashlightSpread", false) > self.active = false > end > > function flashlight:uninit() > self:reset() items\active\weapons\ranged\altabilities\grenadelauncher\grenadelauncher.altability 35a36 > 40c41 < "baseDamage" : 8, --- > "baseDps" : 4, 42c43,45 < "cooldownTime" : 2.0, --- > "fireTime" : 2.0, > "fireType" : "auto", > 44a48 > 45a50,58 > "fire" : { > "duration" : 0.15, > "armRotation" : 5, > "weaponRotation" : 5, > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false > }, 50c63,66 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\altabilities\guidedrocket\guidedrocket.altability 30c30 < "projectileType" : "poisonguidedrocket", --- > 39c39 < "baseDamage" : 7, --- > "baseDps" : 7, 41c41,42 < "cooldownTime" : 1.5, --- > "fireTime" : 1.5, > 45,47c46,52 < "armRotation" : -12.5, < "weaponRotation" : 12.5, < "twoHanded" : true --- > "armRotation" : 0, > "weaponRotation" : 0, > "weaponOffset" : [-0.2, 0], > "twoHanded" : true, > > "allowRotate" : true, > "allowFlip" : true 50,53c55,62 < "duration" : 0.15, < "armRotation" : -12.5, < "weaponRotation" : 12.5, < "twoHanded" : true --- > "duration" : 0.4, > "armRotation" : 0, > "weaponRotation" : 0, > "weaponOffset" : [-0.2, 0], > "twoHanded" : true, > > "allowRotate" : true, > "allowFlip" : true items\active\weapons\ranged\altabilities\guidedrocket\guidedrocket.lua 4,5c4,6 < function setupAltAbility(altAbilityConfig) < local guidedRocket = altAbilityConfig --- > function setupAltAbility(altAbilityConfig, elementalType) > local primary = item.instanceValue("primaryAttack") > local guidedRocket = GunFire:new(rangedAttackConfig(sb.jsonMerge(primary, altAbilityConfig), elementalType), altAbilityConfig.stances) 7,8c8,9 < function guidedRocket.init() < guidedRocket.rocketIds = {} --- > function guidedRocket:init() > self:reset() 10c11,12 < guidedRocket.cooldownTimer = 0 --- > self.rocketIds = {} > self.cooldownTimer = self.fireTime 13,15c15,19 < function guidedRocket.update(dt, fireMode, shiftHeld) < guidedRocket.rocketIds = util.filter(guidedRocket.rocketIds, world.entityExists) < for _,rocketId in pairs(guidedRocket.rocketIds) do --- > function guidedRocket:update(dt, fireMode, shiftHeld) > WeaponAbility.update(self, dt, fireMode, shiftHeld) > > self.rocketIds = util.filter(self.rocketIds, world.entityExists) > for _,rocketId in pairs(self.rocketIds) do 19c23 < guidedRocket.cooldownTimer = math.max(0, guidedRocket.cooldownTimer - dt) --- > self.cooldownTimer = math.max(0, self.cooldownTimer - dt) 21,28c25,30 < if self.state == "idle" < and guidedRocket.cooldownTimer == 0 < and fireMode == "alt" < and not world.lineTileCollision(mcontroller.position(), weapon.firePosition()) then < local energyUsage = guidedRocket.energyUsageMultiplier * root.evalFunction("gunLevelEnergyCostPerDamage", item.instanceValue("level", 1)) * guidedRocket.power() < if status.overConsumeResource("energy", energyUsage) then < guidedRocket.fire() < end --- > if self.fireMode == "alt" > and not self.weapon.currentAbility > and not world.lineTileCollision(mcontroller.position(), self:firePosition()) > and self.cooldownTimer == 0 > and status.overConsumeResource("energy", self:energyPerShot()) then > self:setState(self.fire) 32,36c34,35 < function guidedRocket.fireProjectile() < local projectileType = guidedRocket.elementalProjectiles[self.elementalType] < guidedRocket.projectileParameters.power = guidedRocket.power() < local rocketId = weapon.fireProjectile(projectileType, guidedRocket.projectileParameters, 0) < table.insert(guidedRocket.rocketIds, rocketId) --- > function guidedRocket:fire() > table.insert(self.rocketIds, self:fireProjectile()) 40,41c39 < animator.playSound(self.elementalType.."Guided") < end --- > animator.playSound(self.weapon.elementalType.."Guided") 43,46c41,42 < function guidedRocket.fire() < guidedRocket.fireProjectile() < guidedRocket.cooldownTimer = guidedRocket.cooldownTime < idle() --- > self.cooldownTimer = self.fireTime > self:setState(self.cooldown) 49,50c45 < function guidedRocket.power() < return guidedRocket.baseDamage * root.evalFunction("gunDamageLevelMultiplier", item.instanceValue("level", 1)) --- > function guidedRocket:reset() items\active\weapons\ranged\altabilities\homingrocket\homingrocket.altability 29a30 > 32c33 < "baseDamage" : 7, --- > "baseDps" : 7, 34c35,36 < "cooldownTime" : 1.5, --- > "fireTime" : 1.5, > 36a39 > 40,42c43,49 < "armRotation" : -12.5, < "weaponRotation" : 12.5, < "twoHanded" : true --- > "armRotation" : 0, > "weaponRotation" : 0, > "weaponOffset" : [-0.2, 0], > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 45,48c52,59 < "duration" : 0.15, < "armRotation" : -12.5, < "weaponRotation" : 12.5, < "twoHanded" : true --- > "duration" : 0.4, > "armRotation" : 0, > "weaponRotation" : 0, > "weaponOffset" : [-0.2, 0], > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\altabilities\homingrocket\homingrocket.lua 5c5,6 < local homingRocketAttack = altAbilityConfig --- > local primary = item.instanceValue("primaryAttack") > local homingRocketAttack = GunFire:new(rangedAttackConfig(sb.jsonMerge(primary, altAbilityConfig)), altAbilityConfig.stances) 7,27c8,12 < function homingRocketAttack.init() < homingRocketAttack.cooldownTimer = 0 < homingRocketAttack.activeRockets = {} < homingRocketAttack.newRockets = {} < end < < function homingRocketAttack.update(dt, fireMode, shiftHeld) < homingRocketAttack.updateRockets(dt) < < --Fire scripts < homingRocketAttack.cooldownTimer = math.max(0, homingRocketAttack.cooldownTimer - dt) < < if self.state == "idle" < and fireMode == "alt" < and homingRocketAttack.cooldownTimer == 0 < and not world.lineTileCollision(mcontroller.position(), weapon.firePosition()) then < local energyUsage = homingRocketAttack.energyUsageMultiplier * root.evalFunction("gunLevelEnergyCostPerDamage", item.instanceValue("level", 1)) * homingRocketAttack.power() < if status.overConsumeResource("energy", energyUsage) then < homingRocketAttack.fire() < end < end --- > function homingRocketAttack:init() > self.cooldownTimer = 0 > self.activeRockets = {} > self.newRockets = {} > end 29,35c14,15 < if self.state == "homingRocketAttack.fire" then < weapon.rangedUpdateAim(false, false) < homingRocketAttack.fireProjectile() < if self.attackTimer == 0 then < homingRocketAttack.cooldown() < end < end --- > function homingRocketAttack:update(dt, fireMode, shiftHeld) > WeaponAbility.update(self, dt, fireMode, shiftHeld) 37,38c17 < if self.state == "homingRocketAttack.cooldown" then < weapon.rangedUpdateAim(false, false) --- > self:updateRockets(dt) 40,42c19 < local progress = (self.attackTimer / homingRocketAttack.stances.cooldown.duration) < self.relativeArmRotation = util.toRadians(self.stances.idle.armRotation) + util.toRadians(progress * homingRocketAttack.stances.cooldown.armRotation) < self.relativeWeaponRotation = util.toRadians(self.stances.idle.weaponRotation) + util.toRadians(progress * homingRocketAttack.stances.cooldown.weaponRotation) --- > self.cooldownTimer = math.max(0, self.cooldownTimer - dt) 44,46c21,26 < if self.attackTimer == 0 then < homingRocketAttack.idle() < end --- > if self.fireMode == "alt" > and not self.weapon.currentAbility > and not world.lineTileCollision(mcontroller.position(), self:firePosition()) > and self.cooldownTimer == 0 > and status.overConsumeResource("energy", self:energyPerShot()) then > self:setState(self.fire) 50,53c30,55 < function homingRocketAttack.uninit() < for _,rocketPair in pairs(homingRocketAttack.activeRockets) do < if world.entityExists(rocketPair[2]) then < world.callScriptedEntity(rocketPair[2], "setTarget", nil) --- > function homingRocketAttack:fire() > self.weapon:setStance(self.stances.fire) > self.weapon:updateAim() > > local projectileId = self:fireProjectile() > self.newRockets[projectileId] = self.rocketWindupTime > > animator.setPartTag("muzzleFlash", "variant", math.random(1, 3)) > animator.setAnimationState("firing", "fire") > animator.burstParticleEmitter("altMuzzleFlash", true) > animator.playSound("altFire") > > self:setState(self.cooldown) > end > > function homingRocketAttack:reset() > end > > function homingRocketAttack:uninit(unequipped) > self:reset() > > if unequipped then > for _,rocketPair in pairs(self.activeRockets) do > if world.entityExists(rocketPair[2]) then > world.callScriptedEntity(rocketPair[2], "setTarget", nil) > end 58c60 < function homingRocketAttack.updateRockets(dt) --- > function homingRocketAttack:updateRockets(dt) 60,64c62,73 < for rocketId,timer in pairs(homingRocketAttack.newRockets) do < homingRocketAttack.newRockets[rocketId] = math.max(0, timer - dt) < if timer == 0 and world.entityExists(rocketId) then < if homingRocketAttack.findTarget(rocketId) then < animator.playSound("targetAcquired") --- > for rocketId,timer in pairs(self.newRockets) do > self.newRockets[rocketId] = math.max(0, timer - dt) > if timer == 0 then > if world.entityExists(rocketId) then > if self:findTarget(rocketId) then > animator.playSound("targetAcquired") > self.newRockets[rocketId] = nil > else > self.newRockets[rocketId] = 0.2 > end > else > self.newRockets[rocketId] = nil 66d74 < homingRocketAttack.newRockets[rocketId] = nil 71c79 < homingRocketAttack.activeRockets = util.filter(homingRocketAttack.activeRockets, function(rocketPair) --- > self.activeRockets = util.filter(self.activeRockets, function(rocketPair) 74c82 < local targets = util.map(homingRocketAttack.activeRockets, function(v) return v[2] end) --- > local targets = util.map(self.activeRockets, function(v) return v[2] end) 78,79c86,87 < function homingRocketAttack.findTarget(rocketId) < local nearEntities = world.entityQuery(world.entityPosition(rocketId), homingRocketAttack.queryRange, { --- > function homingRocketAttack:findTarget(rocketId) > local nearEntities = world.entityQuery(world.entityPosition(rocketId), self.queryRange, { 97c105 < table.insert(homingRocketAttack.activeRockets, {rocketId, targetId}) --- > table.insert(self.activeRockets, {rocketId, targetId}) 101,132d108 < end < < function homingRocketAttack.fireProjectile() < homingRocketAttack.projectileParameters.power = homingRocketAttack.power() < local projectileId = weapon.fireProjectile(homingRocketAttack.projectileType, homingRocketAttack.projectileParameters, 0) < < homingRocketAttack.newRockets[projectileId] = homingRocketAttack.rocketWindupTime < < animator.setPartTag("muzzleFlash", "variant", math.random(1, 3)) < animator.setAnimationState("firing", "fire") < animator.burstParticleEmitter("altMuzzleFlash", true) < animator.playSound("altFire") < end < < function homingRocketAttack.fire() < self.state = "homingRocketAttack.fire" < self.attackTimer = homingRocketAttack.stances.fire.duration < end < < function homingRocketAttack.idle() < idle() < end < < function homingRocketAttack.cooldown() < self.state = "homingRocketAttack.cooldown" < weapon.setStance(homingRocketAttack.stances.cooldown) < self.attackTimer = homingRocketAttack.stances.cooldown.duration < homingRocketAttack.cooldownTimer = homingRocketAttack.cooldownTime < end < < function homingRocketAttack.power() < return homingRocketAttack.baseDamage * root.evalFunction("gunDamageLevelMultiplier", item.instanceValue("level", 1)) items\active\weapons\ranged\altabilities\lance\lance.altability 121a122,123 > > "energyUsageMultiplier" : 1.5, 129,133c131,134 < "chargeTime" : 0.1, < "baseDamage" : 4, < "energyUsageMultiplier" : 1.0, < "sustainEnergyRate" : 1.0, < "cooldownTime" : 0.5 --- > "baseDps" : 4, > "fireTime" : 0.5, > > "chargeTime" : 0.1 items\active\weapons\ranged\altabilities\lance\lance.lua 4,5c4,6 < function setupAltAbility(altAbilityConfig) < local lanceAttack = altAbilityConfig --- > function setupAltAbility(altAbilityConfig, elementalType) > local primary = item.instanceValue("primaryAttack") > local lanceAttack = GunFire:new(rangedAttackConfig(sb.jsonMerge(primary, altAbilityConfig), elementalType), altAbilityConfig.stances) 7,10c8,11 < function lanceAttack.init() < animator.setAnimationState("lance", "idle") < animator.setParticleEmitterActive(self.elementalType.."LanceCharge", false) < lanceAttack.cooldownTimer = 0 --- > function lanceAttack:init() > self:reset() > > self.cooldownTimer = 0 13,14c14,15 < function lanceAttack.update(dt, fireMode, shiftHeld) < lanceAttack.cooldownTimer = math.max(0, lanceAttack.cooldownTimer - dt) --- > function lanceAttack:update(dt, fireMode, shiftHeld) > WeaponAbility.update(self, dt, fireMode, shiftHeld) 16,23c17,24 < if self.state == "idle" < and fireMode == "alt" < and lanceAttack.cooldownTimer == 0 < and not world.lineTileCollision(mcontroller.position(), weapon.firePosition()) then < local energyUsage = lanceAttack.energyUsageMultiplier * root.evalFunction("gunLevelEnergyCostPerDamage", item.instanceValue("level", 1)) * lanceAttack.power() < if status.overConsumeResource("energy", energyUsage) then < lanceAttack.charge() < end --- > self.cooldownTimer = math.max(0, self.cooldownTimer - dt) > > if not self.weapon.currentAbility > and self.fireMode == "alt" > and self.cooldownTimer == 0 > and not world.lineTileCollision(mcontroller.position(), self:firePosition()) > and status.overConsumeResource("energy", self:energyPerShot()) then > self:setState(self.charge) 24a26 > end 26,27c28,30 < if self.state == "lanceAttack.charge" then < weapon.rangedUpdateAim(true, true) --- > function lanceAttack:charge() > animator.setParticleEmitterActive(self.weapon.elementalType.."LanceCharge", true) > animator.setAnimationState("lance", "charge") 29,31c32,35 < if world.lineTileCollision(mcontroller.position(), weapon.firePosition()) then < lanceAttack.idle() < end --- > local duration = self.chargeTime > while self.fireMode == "alt" or duration > 0 do > status.setResource("energyRegenBlock", 1.0) > duration = math.max(0, duration - self.dt) 33,38c37,38 < if self.attackTimer == 0 and (fireMode ~= "alt" or not status.overConsumeResource("energy", lanceAttack.sustainEnergyRate * dt)) then < lanceAttack.projectileParameters.power = lanceAttack.power() < weapon.fireProjectile(lanceAttack.elementalProjectiles[self.elementalType], lanceAttack.projectileParameters, 0) < < animator.playSound("lanceFire") < lanceAttack.cooldown() --- > if world.lineTileCollision(mcontroller.position(), self:firePosition()) then > break 39a40 > coroutine.yield() 41d41 < end 43,46d42 < function lanceAttack.uninit() < animator.setAnimationState("lance", "idle") < animator.setParticleEmitterActive(self.elementalType.."LanceCharge", false) < end 48,52c44,48 < function lanceAttack.charge() < self.state = "lanceAttack.charge" < self.attackTimer = lanceAttack.chargeTime < animator.setParticleEmitterActive(self.elementalType.."LanceCharge", true) < animator.setAnimationState("lance", "charge") --- > if not world.lineTileCollision(mcontroller.position(), self:firePosition()) then > self:fireProjectile() > self.cooldownTimer = self.fireTime > animator.playSound("lanceFire") > end 55,56c51 < function lanceAttack.idle() < animator.setParticleEmitterActive(self.elementalType.."LanceCharge", false) --- > function lanceAttack:reset() 58,63c53 < idle() < end < < function lanceAttack.cooldown() < lanceAttack.cooldownTimer = lanceAttack.cooldownTime < lanceAttack.idle() --- > animator.setParticleEmitterActive(self.weapon.elementalType.."LanceCharge", false) 66,67c56,57 < function lanceAttack.power() < return lanceAttack.baseDamage * root.evalFunction("gunDamageLevelMultiplier", item.instanceValue("level", 1)) --- > function lanceAttack:uninit() > self:reset() items\active\weapons\ranged\altabilities\markedshot\markedshot.altability 14a15 > 17,18c18,19 < "baseDamage" : 4, < "energyUsageMultiplier" : 1.5, --- > "baseDps" : 4, > "energyUsageMultiplier" : 1.0, items\active\weapons\ranged\altabilities\markedshot\markedshot.lua 5c5,6 < local markedShot = altAbilityConfig --- > local primary = item.instanceValue("primaryAttack") > local markedShot = GunFire:new(rangedAttackConfig(sb.jsonMerge(primary, altAbilityConfig)), altAbilityConfig.stances) 7,9c8,9 < function markedShot.init() < activeItem.setScriptedAnimationParameter("markerImage", "/items/active/weapons/ranged/altabilities/markedshot/targetoverlay.png") < activeItem.setScriptedAnimationParameter("entities", {}) --- > function markedShot:init() > self:reset() 11c11 < markedShot.cooldownTimer = 0 --- > activeItem.setScriptedAnimationParameter("markerImage", "/items/active/weapons/ranged/altabilities/markedshot/targetoverlay.png") 13c13 < markedShot.targets = {} --- > self.cooldownTimer = self.fireTime 16,17c16,19 < function markedShot.update(dt, fireMode, shiftHeld) < markedShot.cooldownTimer = math.max(0, markedShot.cooldownTimer - dt) --- > function markedShot:update(dt, fireMode, shiftHeld) > WeaponAbility.update(self, dt, fireMode, shiftHeld) > > self.cooldownTimer = math.max(0, self.cooldownTimer - dt) 19,23c21,22 < if self.state == "idle" < and fireMode == "alt" < and markedShot.cooldownTimer == 0 < and not status.resourceLocked("energy") then < markedShot.aim() --- > if self.fireMode == "alt" and not self.weapon.currentAbility and self.cooldownTimer == 0 and not status.resourceLocked("energy") then > self:setState(self.aim) 24a24 > end 26,27c26,27 < if self.state == "markedShot.aim" then < weapon.rangedUpdateAim(true, true) --- > function markedShot:aim() > animator.playSound("enterAimMode") 28a29 > while self.fireMode == "alt" do 31,35c32,36 < markedShot.targets = util.filter(markedShot.targets, world.entityExists) < if #markedShot.targets < markedShot.maxTargets then < local newTarget = markedShot.findTarget() < if newTarget and status.overConsumeResource("energy", markedShot.energyUsage()) then < table.insert(markedShot.targets, newTarget) --- > self.targets = util.filter(self.targets, world.entityExists) > if #self.targets < self.maxTargets then > local newTarget = self:findTarget() > if newTarget and status.overConsumeResource("energy", self:energyPerShot()) then > table.insert(self.targets, newTarget) 38c39 < activeItem.setScriptedAnimationParameter("entities", markedShot.targets) --- > activeItem.setScriptedAnimationParameter("entities", self.targets) 42,49c43 < if fireMode ~= "alt" then < if #markedShot.targets > 0 and not world.lineTileCollision(mcontroller.position(), weapon.firePosition()) then < markedShot.fire() < else < animator.playSound("disengage") < markedShot.idle() < end < end --- > coroutine.yield() 52,61c46,49 < if self.state == "markedShot.cooldown" then < weapon.rangedUpdateAim(false, false) < < local progress = (self.attackTimer / markedShot.stances.cooldown.duration) < self.relativeArmRotation = util.toRadians(self.stances.idle.armRotation) + util.toRadians(progress * markedShot.stances.cooldown.armRotation) < self.relativeWeaponRotation = util.toRadians(self.stances.idle.weaponRotation) + util.toRadians(progress * markedShot.stances.cooldown.weaponRotation) < < if self.attackTimer == 0 then < markedShot.idle() < end --- > if #self.targets > 0 and not world.lineTileCollision(mcontroller.position(), weapon.firePosition()) then > self:setState(self.fire) > else > animator.playSound("disengage") 65,68c53,55 < function markedShot.uninit() < activeItem.setScriptedAnimationParameter("markerImage", "/items/active/weapons/ranged/altabilities/markedshot/targetoverlay.png") < activeItem.setScriptedAnimationParameter("entities", {}) < end --- > function markedShot:fire() > local projectileId = self:fireProjectile() > world.callScriptedEntity(projectileId, "setTargets", self.targets) 70,73c57 < function markedShot.aim() < self.state = "markedShot.aim" < animator.playSound("enterAimMode") < end --- > self:muzzleFlash() 75,78c59 < function markedShot.idle() < activeItem.setScriptedAnimationParameter("entities", {}) < markedShot.targets = {} < idle() --- > self:setState(self.cooldown) 81,86d61 < function markedShot.fire() < local aimVector = {mcontroller.facingDirection() * math.cos(self.aimAngle), math.sin(self.aimAngle)} < local position = weapon.firePosition() < < self.activeProjectile = world.spawnProjectile(markedShot.projectileType, position, activeItem.ownerEntityId(), aimVector, false, {power = markedShot.damageAmount()}) < world.callScriptedEntity(self.activeProjectile, "setTargets", markedShot.targets) 88,100c63,66 < animator.setPartTag("muzzleFlash", "variant", math.random(1, 3)) < animator.setAnimationState("firing", "fire") < animator.playSound("fire") < animator.burstParticleEmitter("muzzleFlash") < < markedShot.cooldown() < end < < function markedShot.cooldown() < self.state = "markedShot.cooldown" < weapon.setStance(markedShot.stances.cooldown) < self.attackTimer = markedShot.stances.cooldown.duration < markedShot.cooldownTimer = markedShot.cooldownTime --- > function markedShot:idle() > activeItem.setScriptedAnimationParameter("entities", {}) > self.targets = {} > idle() 103,104c69,71 < function markedShot.damageAmount() < return markedShot.baseDamage * root.evalFunction("gunDamageLevelMultiplier", item.instanceValue("level", 1)) * activeItem.ownerPowerMultiplier() --- > function markedShot:reset() > activeItem.setScriptedAnimationParameter("entities", {}) > self.targets = {} 107,108c74,75 < function markedShot.energyUsage() < return markedShot.energyUsageMultiplier * root.evalFunction("gunLevelEnergyCostPerDamage", item.instanceValue("level", 1)) * markedShot.damageAmount() --- > function markedShot:uninit() > self:reset() 111,112c78,79 < function markedShot.findTarget() < local nearEntities = world.entityQuery(activeItem.ownerAimPosition(), markedShot.targetQueryDistance, { includedTypes = {"monster", "npc", "player"} }) --- > function markedShot:findTarget() > local nearEntities = world.entityQuery(activeItem.ownerAimPosition(), self.targetQueryDistance, { includedTypes = {"monster", "npc", "player"} }) 114c81 < if contains(markedShot.targets, entityId) then --- > if contains(self.targets, entityId) then items\active\weapons\ranged\altabilities\piercingshot\piercingshot.altability 27a28 > 32,34c33,35 < "baseDamage" : 6, < "energyUsageMultiplier" : 1.0, < "cooldownTime" : 1.0, --- > "baseDps" : 6, > "fireTime" : 1.0, > 35a37,45 > "fire" : { > "duration" : 0.15, > "armRotation" : 5, > "weaponRotation" : 5, > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false > }, 40c50,53 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\altabilities\spray\spray.altability 3,18c3 < "animationCustom" : { < "particleEmitters" : { < "altMuzzleFlash" : { < "active" : false, < "rotationGroup" : "weapon", < "emissionRate" : 8, < "offsetPart" : "muzzleFlash", < "offsetRegion" : [0.5, 1.0, 1.0, 1.5], < "particles" : [ < ] < } < }, < "sounds" : { < "altFire" : [ "/sfx/gun/ar1.ogg" ] < } < }, --- > "animationCustom" : { }, 23,27c8 < "projectileType" : "standardbullet", < "projectileParameters" : { < "speed" : 100 < }, < "baseDamage" : 0.5, --- > 29c10,11 < "cooldownTime" : 0.04, --- > "baseDps" : 15, > "fireTime" : 0.04, 30a13,14 > "fireType" : "auto", > 31a16 > "useParticleEmitter" : false, 32a18,23 > "fire" : { > "duration" : 0.02, > "armRotation" : 2, > "weaponRotation" : 2, > "twoHanded" : true > }, items\active\weapons\ranged\altabilities\stickyshot\stickyshot.altability 22a23,24 > > "fireTime" : 1.0, 28d29 < "baseDamage" : 10, 30c31 < "cooldownTime" : 1.0, --- > 31a33,41 > "fire" : { > "duration" : 0.15, > "armRotation" : 5, > "weaponRotation" : 5, > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false > }, 36c46,49 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\assaultrifle\commonassaultrifle.activeitem 23,35d22 < "fireTime" : [0.11, 0.18], < "baseDps" : [7, 8], < "inaccuracy" : 0.02, < < "burstTime" : 0.075, < "burstCount" : [2,4], < "fireType" : ["auto", "burst"], < < "projectileType" : "standardbullet", < "projectileParameters" : { < "knockback" : 5 < }, < 37a25,39 > "primaryAttack" : { > "fireTime" : [0.11, 0.18], > "baseDps" : [7, 8], > "inaccuracy" : 0.02, > > "burstTime" : 0.075, > "burstCount" : [2,4], > "fireType" : ["auto", "burst"], > > "projectileType" : "standardbullet", > "projectileParameters" : { > "knockback" : 5 > } > }, > 42c44,47 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : true, > "allowFlip" : true 48c53,56 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 54c62,65 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\assaultrifle\rareassaultrifle.activeitem 23,39c23,41 < "fireTime" : [0.11, 0.18], < "baseDps" : [7.5, 8.5], < "inaccuracy" : 0.02, < < "burstTime" : 0.075, < "burstCount" : [2,4], < "fireType" : ["auto", "burst"], < < "projectileType" : "standardbullet", < "elementalProjectiles" : { < "fire" : "fireplasma", < "ice" : "iceplasma", < "electric" : "electricplasma", < "poison" : "poisonplasma" < }, < "projectileParameters" : { < "knockback" : 5 --- > "primaryAttack" : { > "fireTime" : [0.11, 0.18], > "baseDps" : [7.5, 8.5], > "inaccuracy" : 0.02, > > "burstTime" : 0.075, > "burstCount" : [2,4], > "fireType" : ["auto", "burst"], > > "projectileType" : "standardbullet", > "elementalProjectiles" : { > "fire" : "fireplasma", > "ice" : "iceplasma", > "electric" : "electricplasma", > "poison" : "poisonplasma" > }, > "projectileParameters" : { > "knockback" : 5 > } 46c48,51 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : true, > "allowFlip" : true 52c57,60 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 58c66,69 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\assaultrifle\uncommonassaultrifle.activeitem 23,39c23,41 < "fireTime" : [0.11, 0.18], < "baseDps" : [7.5, 8.5], < "inaccuracy" : 0.02, < < "burstTime" : 0.075, < "burstCount" : [2,4], < "fireType" : ["auto", "burst"], < < "projectileType" : "standardbullet", < "elementalProjectiles" : { < "fire" : "fireplasma", < "ice" : "iceplasma", < "electric" : "electricplasma", < "poison" : "poisonplasma" < }, < "projectileParameters" : { < "knockback" : 5 --- > "primaryAttack" : { > "fireTime" : [0.11, 0.18], > "baseDps" : [7.5, 8.5], > "inaccuracy" : 0.02, > > "burstTime" : 0.075, > "burstCount" : [2,4], > "fireType" : ["auto", "burst"], > > "projectileType" : "standardbullet", > "elementalProjectiles" : { > "fire" : "fireplasma", > "ice" : "iceplasma", > "electric" : "electricplasma", > "poison" : "poisonplasma" > }, > "projectileParameters" : { > "knockback" : 5 > } 46c48,51 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : true, > "allowFlip" : true 52c57,60 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 58c66,69 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\grenadelauncher\commongrenadelauncher.activeitem 48,55c48,51 < "fireTime" : [1.0, 3.33], < "baseDps" : [3.75, 4.5], < "inaccuracy" : 0.0, < < "projectileType" : [ "grenade", "impactgrenade", "stickygrenade", "proximitymine" ], < "projectileParameters" : { < "knockback" : 40 < }, --- > "primaryAttack" : { > "fireTime" : [1.0, 3.33], > "baseDps" : [3.75, 4.5], > "inaccuracy" : 0.0, 56a53,58 > "projectileType" : [ "grenade", "impactgrenade", "stickygrenade", "proximitymine" ], > "projectileParameters" : { > "knockback" : 40 > } > }, > 63c65,68 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : true, > "allowFlip" : true 69c74,77 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 75c83,86 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\grenadelauncher\raregrenadelauncher.activeitem 48,50c48,51 < "fireTime" : [1.0, 3.33], < "baseDps" : [4.25, 5], < "inaccuracy" : 0.0, --- > "primaryAttack" : { > "fireTime" : [1.0, 3.33], > "baseDps" : [4.25, 5], > "inaccuracy" : 0.0, 52,56c53,61 < "elementalProjectiles" : { < "fire" : [ "fireplasmagrenade", "fireplasmaimpactgrenade", "firestickygrenade", "fireproximitymine" ], < "electric" : [ "electricplasmagrenade", "electricplasmaimpactgrenade", "electricstickygrenade", "electricproximitymine" ], < "ice" : [ "iceplasmagrenade", "iceplasmaimpactgrenade", "icestickygrenade", "iceproximitymine" ], < "poison" : [ "poisonplasmagrenade", "poisonplasmaimpactgrenade", "poisonstickygrenade", "poisonproximitymine" ] --- > "elementalProjectiles" : { > "fire" : [ "fireplasmagrenade", "fireplasmaimpactgrenade", "firestickygrenade", "fireproximitymine" ], > "electric" : [ "electricplasmagrenade", "electricplasmaimpactgrenade", "electricstickygrenade", "electricproximitymine" ], > "ice" : [ "iceplasmagrenade", "iceplasmaimpactgrenade", "icestickygrenade", "iceproximitymine" ], > "poison" : [ "poisonplasmagrenade", "poisonplasmaimpactgrenade", "poisonstickygrenade", "poisonproximitymine" ] > }, > "projectileParameters" : { > "knockback" : 40 > } 58,60d62 < "projectileParameters" : { < "knockback" : 40 < }, 66c68,71 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : true, > "allowFlip" : true 72c77,80 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 78c86,89 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\grenadelauncher\uncommongrenadelauncher.activeitem 48,50c48,51 < "fireTime" : [1.0, 3.33], < "baseDps" : [4.25, 5], < "inaccuracy" : 0.0, --- > "primaryAttack" : { > "fireTime" : [1.0, 3.33], > "baseDps" : [4.25, 5], > "inaccuracy" : 0.0, 52,56c53,61 < "elementalProjectiles" : { < "fire" : [ "fireplasmagrenade", "fireplasmaimpactgrenade", "firestickygrenade", "fireproximitymine" ], < "electric" : [ "electricplasmagrenade", "electricplasmaimpactgrenade", "electricstickygrenade", "electricproximitymine" ], < "ice" : [ "iceplasmagrenade", "iceplasmaimpactgrenade", "icestickygrenade", "iceproximitymine" ], < "poison" : [ "poisonplasmagrenade", "poisonplasmaimpactgrenade", "poisonstickygrenade", "poisonproximitymine" ] --- > "elementalProjectiles" : { > "fire" : [ "fireplasmagrenade", "fireplasmaimpactgrenade", "firestickygrenade", "fireproximitymine" ], > "electric" : [ "electricplasmagrenade", "electricplasmaimpactgrenade", "electricstickygrenade", "electricproximitymine" ], > "ice" : [ "iceplasmagrenade", "iceplasmaimpactgrenade", "icestickygrenade", "iceproximitymine" ], > "poison" : [ "poisonplasmagrenade", "poisonplasmaimpactgrenade", "poisonstickygrenade", "poisonproximitymine" ] > }, > "projectileParameters" : { > "knockback" : 40 > } 58,61c63 < "projectileParameters" : { < "knockback" : 40 < }, < --- > 66c68,71 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : true, > "allowFlip" : true 72c77,80 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 78c86,89 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\machinepistol\commonmachinepistol.activeitem 23,29c23,31 < "fireTime" : [0.11, 0.18], < "baseDps" : [3.75, 4.5], < "inaccuracy" : 0.06, < < "projectileType" : "standardbullet", < "projectileParameters" : { < "knockback" : 10 --- > "primaryAttack" : { > "fireTime" : [0.11, 0.18], > "baseDps" : [3.75, 4.5], > "inaccuracy" : 0.06, > > "projectileType" : "standardbullet", > "projectileParameters" : { > "knockback" : 10 > } 38c40,43 < "twoHanded" : false --- > "twoHanded" : false, > > "allowRotate" : true, > "allowFlip" : true 44c49,52 < "twoHanded" : false --- > "twoHanded" : false, > > "allowRotate" : false, > "allowFlip" : false 50c58,61 < "twoHanded" : false --- > "twoHanded" : false, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\machinepistol\raremachinepistol.activeitem 23,25c23,26 < "fireTime" : [0.11, 0.18], < "baseDps" : [4.25, 5], < "inaccuracy" : 0.06, --- > "primaryAttack" : { > "fireTime" : [0.11, 0.18], > "baseDps" : [4.25, 5], > "inaccuracy" : 0.06, 27,35c28,37 < "projectileType" : "standardbullet", < "elementalProjectiles" : { < "fire" : "fireplasma", < "ice" : "iceplasma", < "electric" : "electricplasma", < "poison" : "poisonplasma" < }, < "projectileParameters" : { < "knockback" : 10 --- > "projectileType" : "standardbullet", > "elementalProjectiles" : { > "fire" : "fireplasma", > "ice" : "iceplasma", > "electric" : "electricplasma", > "poison" : "poisonplasma" > }, > "projectileParameters" : { > "knockback" : 10 > } 38,39d39 < "elementalType" : "physical", < 44c44,47 < "twoHanded" : false --- > "twoHanded" : false, > > "allowRotate" : true, > "allowFlip" : true 48,50c51,56 < "armRotation" : 4, < "weaponRotation" : 4, < "twoHanded" : false --- > "armRotation" : 2, > "weaponRotation" : 2, > "twoHanded" : false, > > "allowRotate" : false, > "allowFlip" : false 54,56c60,65 < "armRotation" : 4, < "weaponRotation" : 4, < "twoHanded" : false --- > "armRotation" : 2, > "weaponRotation" : 2, > "twoHanded" : false, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\machinepistol\uncommonmachinepistol.activeitem 23,25c23,26 < "fireTime" : [0.11, 0.18], < "baseDps" : [4.25, 5], < "inaccuracy" : 0.06, --- > "primaryAttack" : { > "fireTime" : [0.11, 0.18], > "baseDps" : [4.25, 5], > "inaccuracy" : 0.06, 27,35c28,36 < "projectileType" : "standardbullet", < "elementalProjectiles" : { < "fire" : "fireplasma", < "ice" : "iceplasma", < "electric" : "electricplasma", < "poison" : "poisonplasma" < }, < "projectileParameters" : { < "knockback" : 10 --- > "elementalProjectiles" : { > "fire" : "fireplasma", > "ice" : "iceplasma", > "electric" : "electricplasma", > "poison" : "poisonplasma" > }, > "projectileParameters" : { > "knockback" : 10 > } 38,39d38 < "elementalType" : "physical", < 44c43,46 < "twoHanded" : false --- > "twoHanded" : false, > > "allowRotate" : true, > "allowFlip" : true 48,50c50,55 < "armRotation" : 4, < "weaponRotation" : 4, < "twoHanded" : false --- > "armRotation" : 2, > "weaponRotation" : 2, > "twoHanded" : false, > > "allowRotate" : false, > "allowFlip" : false 54,56c59,64 < "armRotation" : 4, < "weaponRotation" : 4, < "twoHanded" : false --- > "armRotation" : 2, > "weaponRotation" : 2, > "twoHanded" : false, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\pistol\commonpistol.activeitem 23,31d22 < "fireTime" : [0.33, 1.0], < "baseDps" : [3.75, 4.5], < "inaccuracy" : 0.02, < < "projectileType" : "standardbullet", < "projectileParameters" : { < "knockback" : 15 < }, < 33a25,35 > "primaryAttack" : { > "fireTime" : [0.33, 1.0], > "baseDps" : [3.75, 4.5], > "inaccuracy" : 0.02, > > "projectileType" : "standardbullet", > "projectileParameters" : { > "knockback" : 15 > } > }, > 38c40,43 < "twoHanded" : false --- > "twoHanded" : false, > > "allowRotate" : true, > "allowFlip" : true 44c49,52 < "twoHanded" : false --- > "twoHanded" : false, > > "allowRotate" : false, > "allowFlip" : false 50c58,61 < "twoHanded" : false --- > "twoHanded" : false, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\pistol\rarepistol.activeitem 23,25c23,26 < "fireTime" : [0.33, 1.0], < "baseDps" : [4.25, 5], < "inaccuracy" : 0.02, --- > "primaryAttack" : { > "fireTime" : [0.33, 1.0], > "baseDps" : [4.25, 5], > "inaccuracy" : 0.02, 27,35c28,36 < "projectileType" : "standardbullet", < "elementalProjectiles" : { < "fire" : "fireplasma", < "ice" : "iceplasma", < "electric" : "electricplasma", < "poison" : "poisonplasma" < }, < "projectileParameters" : { < "knockback" : 15 --- > "elementalProjectiles" : { > "fire" : "fireplasma", > "ice" : "iceplasma", > "electric" : "electricplasma", > "poison" : "poisonplasma" > }, > "projectileParameters" : { > "knockback" : 15 > } 42c43,46 < "twoHanded" : false --- > "twoHanded" : false, > > "allowRotate" : true, > "allowFlip" : true 48c52,55 < "twoHanded" : false --- > "twoHanded" : false, > > "allowRotate" : false, > "allowFlip" : false 54c61,64 < "twoHanded" : false --- > "twoHanded" : false, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\pistol\uncommonpistol.activeitem 23,25c23,26 < "fireTime" : [0.33, 1.0], < "baseDps" : [4.25, 5], < "inaccuracy" : 0.02, --- > "primaryAttack" : { > "fireTime" : [0.33, 1.0], > "baseDps" : [4.25, 5], > "inaccuracy" : 0.02, 27,35c28,36 < "projectileType" : "standardbullet", < "elementalProjectiles" : { < "fire" : "fireplasma", < "ice" : "iceplasma", < "electric" : "electricplasma", < "poison" : "poisonplasma" < }, < "projectileParameters" : { < "knockback" : 15 --- > "elementalProjectiles" : { > "fire" : "fireplasma", > "ice" : "iceplasma", > "electric" : "electricplasma", > "poison" : "poisonplasma" > }, > "projectileParameters" : { > "knockback" : 15 > } 42c43,46 < "twoHanded" : false --- > "twoHanded" : false, > > "allowRotate" : true, > "allowFlip" : true 48c52,55 < "twoHanded" : false --- > "twoHanded" : false, > > "allowRotate" : false, > "allowFlip" : false 54c61,64 < "twoHanded" : false --- > "twoHanded" : false, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\rocketlauncher\commonrocketlauncher.activeitem 51,59d50 < "fireTime" : [1.11, 2.5], < "baseDps" : [5, 6], < "inaccuracy" : 0.0, < < "projectileType" : "rocketshell", < "projectileParameters" : { < "knockback" : 50 < }, < 61a53,63 > "primaryAttack" : { > "fireTime" : [1.11, 2.5], > "baseDps" : [5, 6], > "inaccuracy" : 0.0, > > "projectileType" : "rocketshell", > "projectileParameters" : { > "knockback" : 50 > } > }, > 66c68,72 < "twoHanded" : true --- > "weaponOffset" : [0, 0], > "twoHanded" : true, > > "allowRotate" : true, > "allowFlip" : true 70,72c76,82 < "armRotation" : -12.5, < "weaponRotation" : 12.5, < "twoHanded" : true --- > "armRotation" : 0, > "weaponRotation" : 0, > "weaponOffset" : [-0.2, 0], > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 76,78c86,92 < "armRotation" : -12.5, < "weaponRotation" : 12.5, < "twoHanded" : true --- > "armRotation" : 0, > "weaponRotation" : 0, > "weaponOffset" : [-0.2, 0], > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 112c126 < "/items/active/weapons/ranged/altabilities/homingrocket/homingrocket.altability", --- > //"/items/active/weapons/ranged/altabilities/homingrocket/homingrocket.altability", items\active\weapons\ranged\rocketlauncher\rarerocketlauncher.activeitem 51,53c51,54 < "fireTime" : [1.11, 2.5], < "baseDps" : [5, 6], < "inaccuracy" : 0.0, --- > "primaryAttack" : { > "fireTime" : [1.11, 2.5], > "baseDps" : [5, 6], > "inaccuracy" : 0.0, 55,59c56,64 < "elementalProjectiles" : { < "fire" : "fireplasmarocket", < "ice" : "iceplasmarocket", < "electric" : "electricplasmarocket", < "poison" : "poisonplasmarocket" --- > "elementalProjectiles" : { > "fire" : "fireplasmarocket", > "ice" : "iceplasmarocket", > "electric" : "electricplasmarocket", > "poison" : "poisonplasmarocket" > }, > "projectileParameters" : { > "knockback" : 50 > } 61,65d65 < "projectileParameters" : { < "knockback" : 50 < }, < < "elementalType" : "physical", 71c71,75 < "twoHanded" : true --- > "weaponOffset" : [0, 0], > "twoHanded" : true, > > "allowRotate" : true, > "allowFlip" : true 75,77c79,85 < "armRotation" : -12.5, < "weaponRotation" : 12.5, < "twoHanded" : true --- > "armRotation" : 0, > "weaponRotation" : 0, > "weaponOffset" : [-0.2, 0], > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 81,83c89,95 < "armRotation" : -12.5, < "weaponRotation" : 12.5, < "twoHanded" : true --- > "armRotation" : 0, > "weaponRotation" : 0, > "weaponOffset" : [-0.2, 0], > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\rocketlauncher\uncommonrocketlauncher.activeitem 51,53c51,54 < "fireTime" : [1.11, 2.5], < "baseDps" : [5, 6], < "inaccuracy" : 0.0, --- > "primaryAttack" : { > "fireTime" : [1.11, 2.5], > "baseDps" : [5, 6], > "inaccuracy" : 0.0, 55,59c56,64 < "elementalProjectiles" : { < "fire" : "fireplasmarocket", < "ice" : "iceplasmarocket", < "electric" : "electricplasmarocket", < "poison" : "poisonplasmarocket" --- > "elementalProjectiles" : { > "fire" : "fireplasmarocket", > "ice" : "iceplasmarocket", > "electric" : "electricplasmarocket", > "poison" : "poisonplasmarocket" > }, > "projectileParameters" : { > "knockback" : 50 > } 61,65d65 < "projectileParameters" : { < "knockback" : 50 < }, < < "elementalType" : "physical", 71c71,75 < "twoHanded" : true --- > "weaponOffset" : [0, 0], > "twoHanded" : true, > > "allowRotate" : true, > "allowFlip" : true 75,77c79,85 < "armRotation" : -12.5, < "weaponRotation" : 12.5, < "twoHanded" : true --- > "armRotation" : 0, > "weaponRotation" : 0, > "weaponOffset" : [-0.2, 0], > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 81,83c89,95 < "armRotation" : -12.5, < "weaponRotation" : 12.5, < "twoHanded" : true --- > "armRotation" : 0, > "weaponRotation" : 0, > "weaponOffset" : [-0.2, 0], > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\shotgun\commonshotgun.activeitem 23,33d22 < "fireTime" : [0.29, 2.0], < "baseDps" : [9, 10], < "rateOfFire" : [0.5, 3.5], < "projectileCount" : [5,8], < "inaccuracy" : 0.13, < < "projectileType" : "standardbullet", < "projectileParameters" : { < "knockback" : 40 < }, < 35a25,36 > "primaryAttack" : { > "fireTime" : [0.29, 2.0], > "baseDps" : [9, 10], > "projectileCount" : [5,8], > "inaccuracy" : 0.13, > > "projectileType" : "standardbullet", > "projectileParameters" : { > "knockback" : 40 > } > }, > 40c41,44 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : true, > "allowFlip" : true 46c50,53 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 52c59,62 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\shotgun\rareshotgun.activeitem 23,27c23,27 < "fireTime" : [0.29, 2.0], < "baseDps" : [9.5, 10.5], < "rateOfFire" : [0.5, 3.5], < "projectileCount" : [5,8], < "inaccuracy" : 0.13, --- > "primaryAttack" : { > "fireTime" : [0.29, 2.0], > "baseDps" : [9.5, 10.5], > "projectileCount" : [5,8], > "inaccuracy" : 0.13, 29,34c29,37 < "projectileType" : "standardbullet", < "elementalProjectiles" : { < "fire" : "fireplasma", < "ice" : "iceplasma", < "electric" : "electricplasma", < "poison" : "poisonplasma" --- > "elementalProjectiles" : { > "fire" : "fireplasma", > "ice" : "iceplasma", > "electric" : "electricplasma", > "poison" : "poisonplasma" > }, > "projectileParameters" : { > "knockback" : 40 > } 36,40d38 < "projectileParameters" : { < "knockback" : 40 < }, < < "elementalType" : "physical", 46c44,47 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : true, > "allowFlip" : true 52c53,56 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 58c62,65 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\shotgun\uncommonshotgun.activeitem 23,27c23,27 < "fireTime" : [0.29, 2.0], < "baseDps" : [9.5, 10.5], < "rateOfFire" : [0.5, 3.5], < "projectileCount" : [5,8], < "inaccuracy" : 0.13, --- > "primaryAttack" : { > "fireTime" : [0.29, 2.0], > "baseDps" : [9.5, 10.5], > "projectileCount" : [5,8], > "inaccuracy" : 0.13, 29,37c29,37 < "projectileType" : "standardbullet", < "elementalProjectiles" : { < "fire" : "fireplasma", < "ice" : "iceplasma", < "electric" : "electricplasma", < "poison" : "poisonplasma" < }, < "projectileParameters" : { < "knockback" : 40 --- > "elementalProjectiles" : { > "fire" : "fireplasma", > "ice" : "iceplasma", > "electric" : "electricplasma", > "poison" : "poisonplasma" > }, > "projectileParameters" : { > "knockback" : 40 > } 40,41d39 < "elementalType" : "physical", < 46c44,47 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : true, > "allowFlip" : true 52c53,56 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 58c62,65 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\sniperrifle\commonsniperrifle.activeitem 23,31d22 < "fireTime" : [0.5, 2.0], < "baseDps" : [5.5, 6.5], < "inaccuracy" : 0.02, < < "projectileType" : "standardbullet", < "projectileParameters" : { < "knockback" : 40 < }, < 33a25,35 > "primaryAttack" : { > "fireTime" : [0.5, 2.0], > "baseDps" : [5.5, 6.5], > "inaccuracy" : 0.02, > > "projectileType" : "standardbullet", > "projectileParameters" : { > "knockback" : 40 > } > }, > 38c40,43 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : true, > "allowFlip" : true 44c49,52 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 50c58,61 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\sniperrifle\raresniperrifle.activeitem 23,25c23,26 < "fireTime" : [0.5, 2.0], < "baseDps" : [5.5, 6.5], < "inaccuracy" : 0.02, --- > "primaryAttack" : { > "fireTime" : [0.5, 2.0], > "baseDps" : [5.5, 6.5], > "inaccuracy" : 0.02, 27,31c28,36 < "elementalProjectiles" : { < "fire" : "fireplasma", < "ice" : "iceplasma", < "electric" : "electricplasma", < "poison" : "poisonplasma" --- > "elementalProjectiles" : { > "fire" : "fireplasma", > "ice" : "iceplasma", > "electric" : "electricplasma", > "poison" : "poisonplasma" > }, > "projectileParameters" : { > "knockback" : 40 > } 33,37d37 < "projectileParameters" : { < "knockback" : 40 < }, < < "elementalType" : "physical", 43c43,46 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : true, > "allowFlip" : true 49c52,55 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 55c61,64 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false items\active\weapons\ranged\sniperrifle\uncommonsniperrifle.activeitem 23,25c23,26 < "fireTime" : [0.5, 2.0], < "baseDps" : [5.5, 6.5], < "inaccuracy" : 0.02, --- > "primaryAttack" : { > "fireTime" : [0.5, 2.0], > "baseDps" : [5.5, 6.5], > "inaccuracy" : 0.02, 27,31c28,36 < "elementalProjectiles" : { < "fire" : "fireplasma", < "ice" : "iceplasma", < "electric" : "electricplasma", < "poison" : "poisonplasma" --- > "elementalProjectiles" : { > "fire" : "fireplasma", > "ice" : "iceplasma", > "electric" : "electricplasma", > "poison" : "poisonplasma" > }, > "projectileParameters" : { > "knockback" : 40 > } 33,37d37 < "projectileParameters" : { < "knockback" : 40 < }, < < "elementalType" : "physical", 43c43,46 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : true, > "allowFlip" : true 49c52,55 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false 55c61,64 < "twoHanded" : true --- > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false objects\generic\mechanicalelevator\mechanicalelevator.animation 14c14 < //"persistentSound" : "/sfx/tech/forcefield_loop.ogg" --- > "persistentSound" : "/sfx/objects/mechanical_elevator_loop.ogg" 63c63 < "pool" : [ "/sfx/blocks/footstep_lightwood.ogg" ] --- > "pool" : [ "/sfx/objects/mechanical_elevator_hit1.ogg", "/sfx/objects/mechanical_elevator_hit2.ogg", "/sfx/objects/mechanical_elevator_hit3.ogg", "/sfx/objects/mechanical_elevator_hit4.ogg", "/sfx/objects/mechanical_elevator_hit5.ogg" ] objects\generic\mechanicalelevator\mechanicalelevatorlong.object 8c8 < "price" : 75, --- > "price" : 300, 10c10 < "description" : "This simple wooden elevator operates on a pulley system.", --- > "description" : "This elevator operates on an elaborate system of clockwork.", 30a31 > "flipImages" : true, 32c33 < "bgAnchors" : [ [0, 1], [0, 24] ], --- > "bgAnchors" : [ [-2, 0], [-1, 0], [0, 0], [1, 0], [2, 0], [-2, 1], [-1, 1], [0, 1], [1, 1], [2, 1], [-2, 2], [-1, 2], [0, 2], [1, 2], [2, 2], [-2, 3], [-1, 3], [0, 3], [1, 3], [2, 3], [-2, 4], [-1, 4], [0, 4], [1, 4], [2, 4], [-2, 5], [-1, 5], [0, 5], [1, 5], [2, 5], [-2, 6], [-1, 6], [0, 6], [1, 6], [2, 6], [-2, 7], [-1, 7], [0, 7], [1, 7], [2, 7], [-2, 8], [-1, 8], [0, 8], [1, 8], [2, 8], [-2, 9], [-1, 9], [0, 9], [1, 9], [2, 9], [-2, 10], [-1, 10], [0, 10], [1, 10], [2, 10], [-2, 11], [-1, 11], [0, 11], [1, 11], [2, 11], [-2, 12], [-1, 12], [0, 12], [1, 12], [2, 12], [-2, 13], [-1, 13], [0, 13], [1, 13], [2, 13], [-2, 14], [-1, 14], [0, 14], [1, 14], [2, 14], [-2, 15], [-1, 15], [0, 15], [1, 15], [2, 15], [-2, 16], [-1, 16], [0, 16], [1, 16], [2, 16], [-2, 17], [-1, 17], [0, 17], [1, 17], [2, 17], [-2, 18], [-1, 18], [0, 18], [1, 18], [2, 18], [-2, 19], [-1, 19], [0, 19], [1, 19], [2, 19], [-2, 20], [-1, 20], [0, 20], [1, 20], [2, 20], [-2, 21], [-1, 21], [0, 21], [1, 21], [2, 21], [-2, 22], [-1, 22], [0, 22], [1, 22], [2, 22], [-2, 23], [-1, 23], [0, 23], [1, 23], [2, 23], [-2, 24], [-1, 24], [0, 24], [1, 24], [2, 24], [-2, 25], [-1, 25], [0, 25], [1, 25], [2, 25] ], 39,40c40,41 < "platformStart" : [0.5, 24.375], < "platformEnd" : [0.5, 1.375], --- > "platformStart" : [0.5, 24.875], > "platformEnd" : [0.5, 0.875], 48c49 < "bgAnchors" : [ [0, 1], [0, 24] ], --- > "bgAnchors" : [ [-2, 0], [-1, 0], [0, 0], [1, 0], [2, 0], [-2, 1], [-1, 1], [0, 1], [1, 1], [2, 1], [-2, 2], [-1, 2], [0, 2], [1, 2], [2, 2], [-2, 3], [-1, 3], [0, 3], [1, 3], [2, 3], [-2, 4], [-1, 4], [0, 4], [1, 4], [2, 4], [-2, 5], [-1, 5], [0, 5], [1, 5], [2, 5], [-2, 6], [-1, 6], [0, 6], [1, 6], [2, 6], [-2, 7], [-1, 7], [0, 7], [1, 7], [2, 7], [-2, 8], [-1, 8], [0, 8], [1, 8], [2, 8], [-2, 9], [-1, 9], [0, 9], [1, 9], [2, 9], [-2, 10], [-1, 10], [0, 10], [1, 10], [2, 10], [-2, 11], [-1, 11], [0, 11], [1, 11], [2, 11], [-2, 12], [-1, 12], [0, 12], [1, 12], [2, 12], [-2, 13], [-1, 13], [0, 13], [1, 13], [2, 13], [-2, 14], [-1, 14], [0, 14], [1, 14], [2, 14], [-2, 15], [-1, 15], [0, 15], [1, 15], [2, 15], [-2, 16], [-1, 16], [0, 16], [1, 16], [2, 16], [-2, 17], [-1, 17], [0, 17], [1, 17], [2, 17], [-2, 18], [-1, 18], [0, 18], [1, 18], [2, 18], [-2, 19], [-1, 19], [0, 19], [1, 19], [2, 19], [-2, 20], [-1, 20], [0, 20], [1, 20], [2, 20], [-2, 21], [-1, 21], [0, 21], [1, 21], [2, 21], [-2, 22], [-1, 22], [0, 22], [1, 22], [2, 22], [-2, 23], [-1, 23], [0, 23], [1, 23], [2, 23], [-2, 24], [-1, 24], [0, 24], [1, 24], [2, 24], [-2, 25], [-1, 25], [0, 25], [1, 25], [2, 25] ], 55,56c56,57 < "platformStart" : [0.5, 1.375], < "platformEnd" : [0.5, 24.375], --- > "platformStart" : [0.5, 0.875], > "platformEnd" : [0.5, 24.875], 83c84 < "inboundNodes" : [[0, 1]] --- > "inboundNodes" : [[0, 0]] objects\generic\mechanicalelevator\mechanicalelevatorshort.object 8c8 < "price" : 50, --- > "price" : 200, 10c10 < "description" : "This simple wooden elevator operates on a pulley system.", --- > "description" : "This elevator operates on an elaborate system of clockwork.", objects\generic\steelelevator\steelelevator.animation 10c10 < "persistentSound" : "/sfx/tech/forcefield_loop.ogg" --- > "persistentSound" : "/sfx/objects/steel_elevator_loop.ogg" 45c45 < "pool" : [ "/sfx/blocks/footstep_lightmetal.ogg" ] --- > "pool" : [ "/sfx/objects/steel_elevator_hit.ogg" ] objects\generic\steelelevator\steelelevatorlong.object 8c8 < "price" : 150, --- > "price" : 300, 10c10 < "description" : "A moving platform.", --- > "description" : "This steel elevator will get the job done.", objects\generic\steelelevator\steelelevatorshort.object 8c8 < "price" : 100, --- > "price" : 200, 10c10 < "description" : "A moving platform.", --- > "description" : "This steel elevator will get the job done.", objects\generic\woodenelevator\woodenelevator.animation 14c14 < //"persistentSound" : "/sfx/tech/forcefield_loop.ogg" --- > "persistentSound" : "/sfx/objects/wooden_elevator_loop1.ogg" 63c63 < "pool" : [ "/sfx/blocks/footstep_lightwood.ogg" ] --- > "pool" : [ "/sfx/objects/wooden_elevator_hit.ogg" ] quests\generated\subquests.config 92a93,95 > }, > "recipes" : { > "type" : "itemList" 102c105,106 < "output" : "craftedItems" --- > "output" : "craftedItems", > "extraMerge" : ["recipes"] 106a111 > ["itemList", "recipes", "item", 1], 173a179,181 > }, > "recipes" : { > "type" : "itemList" 183c191,192 < "output" : "cookedItems" --- > "output" : "cookedItems", > "extraMerge" : ["recipes"] 187a197 > ["itemList", "recipes", "cookedFood", 1], quests\scripts\generated\fetch.lua 11a12,19 > -- If this is a crafting / cooking quest, give the player the necessary > -- blueprints. > if quest.parameters().recipes then > for _,item in ipairs(quest.parameters().recipes.items) do > player.giveBlueprint(item) > end > end > recipes\ironcraftingtable\steelelevatorlong.recipe 3c3 < { "item" : "steelbar", "count" : 6 } --- > { "item" : "steelbar", "count" : 12 } recipes\ironcraftingtable\steelelevatorshort.recipe 3c3 < { "item" : "steelbar", "count" : 4 } --- > { "item" : "steelbar", "count" : 8 } scripts\util.lua 361a362,369 > function util.randomIntInRange(numberRange) > if type(numberRange) == "table" then > return math.random(numberRange[1], numberRange[2]) > else > return numberRange > end > end > 363c371,375 < return list[math.random(1,#list)] --- > if type(list) == "table" then > return list[math.random(1,#list)] > else > return list > end