--Minigun custom tool example body = 0 barrel = nil barrelTransform = nil function init() --Register tool and enable it RegisterTool("minigunmall", "loc@MINIGUN", "LEVEL/script/vox/minigun.vox") --SetBool("game.tool.minigun.enabled", true) angle = 0 angVel = 0 coolDown = 0 shootHaptic = LoadHaptic("haptic/minigun_fire.xml") local toolHaptic = LoadHaptic("haptic/minigun_tool.xml") spinSnd = LoadLoop("LEVEL/script/snd/spin.ogg") shootSnd = {} for i=0, 7 do shootSnd[i] = LoadSound("tools/gun"..i..".ogg") end SetToolHaptic("minigunmall", toolHaptic); end --Return a random vector of desired length function rndVec(length) local v = VecNormalize(Vec(math.random(-100,100), math.random(-100,100), math.random(-100,100))) return VecScale(v, length) end function tick(dt) --Check if minigun is selected if GetString("game.player.tool") == "minigunmall" then --Check if firing if GetBool("game.player.canusetool") and InputDown("usetool") and GetInt("game.tool.minigunmall.ammo") > 0 then angVel = math.min(1000, angVel + dt*2000) if angVel == 1000 then if coolDown < 0 then local ct = GetCameraTransform() local p = TransformToParentPoint(ct, Vec(0.25, -0.25, -1.2)) local d = VecAdd(TransformToParentVec(ct, Vec(0,0,-1)), rndVec(0.02)) Shoot(p, d, "bullet", 0.5) --Light, particles and sound local lp = TransformToParentPoint(ct, Vec(0.25, -0.25, -2.0)) PointLight(lp, 1, 0.7, 0.5, 3) local size = 0.4 ParticleReset() ParticleType("smoke") ParticleDrag(0) ParticleGravity(-2, -4) ParticleColor(1, 1, 1) ParticleAlpha(0.5, 0.0, "linear", 0.05) ParticleRadius(0.5 * size, size) ParticleCollide(0, 1) SpawnParticle(p, rndVec(0.1), 0.9) PlaySound(shootSnd[math.random(0,#shootSnd)]) coolDown = 0.07 SetInt("game.tool.minigunmall.ammo", GetInt("game.tool.minigunmall.ammo")-1) end end PlayHaptic(shootHaptic, 1) PlayLoop(spinSnd) else angVel = math.max(0, angVel - dt*1000) end coolDown = coolDown - dt angle = angle + angVel*dt --Move tool a bit to the right and recoil local t = Transform() local recoil = math.max(0, coolDown) t.pos = Vec(0.3, 0, recoil) SetToolTransform(t) --Animate barrel around the attachment point local b = GetToolBody() local voxSize = 0.05 local attach = Transform(Vec(0.5*voxSize, -8.5*voxSize, 0)) if body ~= b then body = b -- Barrel is the second shape in vox file. Remember original position in attachment frame local shapes = GetBodyShapes(b) barrel = shapes[2] barrelTransform = TransformToLocalTransform(attach, GetShapeLocalTransform(barrel)) end attach.rot = QuatEuler(0, 0, angle) t = TransformToParentTransform(attach, barrelTransform) SetShapeLocalTransform(barrel, t) end end