YN172-溜溜球(用陷阱种溜溜球,连续打击多个目标,打完自动回到手中)
代码来源于“易宁”大佬的分享,仅供学习,不要直接复制粘贴。 原帖链接:http://bbs.3dmgame.com/thread-3859071-1-1.html 1 2一七二.溜溜球(用陷阱种溜溜球,连续打击多个目标,打完自动回到手中) 3 4 用MT管理器打开游戏目录/assets/scripts/prefabs/trap.lua文件,在inst:AddComponent("inspectable")的下一行插入以下内容: 5 6local colours= 7{ 8 {198/255,43/255,43/255}, 9 {79/255,153/255,68/255}, 10 {35/255,105/255,235/255}, 11 {233/255,208/255,69/255}, 12 {109/255,50/255,163/255}, 13 {222/255,126/255,39/255}, 14} 15local function OnDeploy (inst, pt) 16 local ball = SpawnPrefab("trap") 17 ball.Transform:SetPosition(pt.x, pt.y, pt.z) 18 ball.AnimState:SetBank("bulb") 19 ball.AnimState:SetBuild("bulb") 20 ball.AnimState:PlayAnimation("idle") 21 ball.AnimState:SetBloomEffectHandle("shaders/anim.ksh") 22 ball:ClearStateGraph() 23 RemovePhysicsColliders(ball) 24 ball.components.inventoryitem:ChangeImageName("lightbulb") 25 ball.colour_idx = math.random(#colours) 26 ball.AnimState:SetMultColour(colours[ball.colour_idx][1],colours[ball.colour_idx][2],colours[ball.colour_idx][3],1) 27 ball:RemoveComponent("finiteuses") 28 ball:RemoveComponent("trap") 29 ball:RemoveComponent("deployable") 30 ball:RemoveTag("trap") 31 ball:AddComponent("weapon") 32 ball.components.weapon:SetDamage(30) 33 ball.components.weapon:SetRange(20, 25) 34 ball:AddComponent("equippable") 35 ball.components.equippable.equipslot = EQUIPSLOTS.HANDS 36 ball.components.equippable:SetOnEquip(function(ball) 37 ball.SoundEmitter:PlaySound("dontstarve/wilson/equip_item_gold") 38 end ) 39 ball:AddComponent("projectile") 40 ball.components.projectile:SetSpeed(25) 41 ball.components.projectile:SetOnHitFn(function(ball, owner, target) 42 GetPlayer().SoundEmitter:PlaySound("dontstarve/wilson/equip_item_gold") 43 local target0 = FindEntity(owner, 25, function(guy) 44 if guy.components.combat and guy.components.health and not guy.components.health:IsDead() and not guy:HasTag("player") then 45 return guy.components.combat.target == owner or owner.components.combat.target == guy or guy:HasTag("monster") 46 end 47 end ) 48 if target0 then 49 ball.components.projectile:Throw(owner, target0) 50 else 51 owner.components.inventory:Equip(ball) 52 end 53 end ) 54 ball.components.projectile:SetOnMissFn(function(ball, owner) 55 owner.components.inventory:Equip(ball) 56 end ) 57 ball:ListenForEvent("onthrown", function(ball) 58 local pt = ball:GetPosition() 59 ball.Transform:SetPosition(pt.x, 2, pt.z) 60 ball.SoundEmitter:PlaySound("dontstarve/wilson/boomerang_throw") 61 end ) 62 ball:AddComponent("workable") 63 ball.components.workable:SetWorkAction(ACTIONS.HAMMER) 64 ball.components.workable:SetWorkLeft(3) 65 ball.components.workable:SetOnFinishCallback(function(ball) 66 SpawnPrefab("ground_chunks_breaking").Transform:SetPosition(ball.Transform:GetWorldPosition()) 67 ball:Remove() 68 end ) 69 ball:AddTag("projectile") 70 ball:AddTag("balls") 71 inst:Remove() 72end 73 inst:AddComponent("deployable") 74 inst.components.deployable.ondeploy = OnDeploy 75local function onsave(inst, data) 76 if inst:HasTag("balls") then 77 data.balls = true 78 end 79 data.colour_idx = inst.colour_idx 80end 81local function onload(inst, data) 82 if data and data.balls then 83 inst.AnimState:SetBank("bulb") 84 inst.AnimState:SetBuild("bulb") 85 inst.AnimState:PlayAnimation("idle") 86 inst.AnimState:SetBloomEffectHandle("shaders/anim.ksh") 87 inst:ClearStateGraph() 88 RemovePhysicsColliders(inst) 89 inst.components.inventoryitem:ChangeImageName("lightbulb") 90 inst:RemoveComponent("finiteuses") 91 inst:RemoveComponent("trap") 92 inst:RemoveComponent("deployable") 93 inst:RemoveTag("trap") 94 inst:AddComponent("weapon") 95 inst.components.weapon:SetDamage(30) 96 inst.components.weapon:SetRange(20, 25) 97 inst:AddComponent("equippable") 98 inst.components.equippable.equipslot = EQUIPSLOTS.HANDS 99 inst.components.equippable:SetOnEquip(function(inst) 100 inst.SoundEmitter:PlaySound("dontstarve/wilson/equip_item_gold") 101 end ) 102 inst:AddComponent("projectile") 103 inst.components.projectile:SetSpeed(25) 104 inst.components.projectile:SetOnHitFn(function(inst, owner, target) 105 GetPlayer().SoundEmitter:PlaySound("dontstarve/wilson/equip_item_gold") 106 local target0 = FindEntity(owner, 25, function(guy) 107 if guy.components.combat and guy.components.health and not guy.components.health:IsDead() and not guy:HasTag("player") then 108 return guy.components.combat.target == owner or owner.components.combat.target == guy or guy:HasTag("monster") 109 end 110 end ) 111 if target0 then 112 inst.components.projectile:Throw(owner, target0) 113 else 114 owner.components.inventory:Equip(inst) 115 end 116 end ) 117 inst.components.projectile:SetOnMissFn(function(inst, owner) 118 owner.components.inventory:Equip(inst) 119 end ) 120 inst:ListenForEvent("onthrown", function(inst) 121 local pt = inst:GetPosition() 122 inst.Transform:SetPosition(pt.x, 2, pt.z) 123 inst.SoundEmitter:PlaySound("dontstarve/wilson/boomerang_throw") 124 end ) 125 inst:AddComponent("workable") 126 inst.components.workable:SetWorkAction(ACTIONS.HAMMER) 127 inst.components.workable:SetWorkLeft(3) 128 inst.components.workable:SetOnFinishCallback(function(inst) 129 SpawnPrefab("ground_chunks_breaking").Transform:SetPosition(inst.Transform:GetWorldPosition()) 130 inst:Remove() 131 end ) 132 inst:AddTag("projectile") 133 inst:AddTag("balls") 134 end 135 if data and data.colour_idx then 136 inst.colour_idx = math.min(#colours, data.colour_idx) 137 inst.AnimState:SetMultColour(colours[inst.colour_idx][1],colours[inst.colour_idx][2],colours[inst.colour_idx][3],1) 138 end 139end 140 inst.OnSave = onsave 141 inst.OnLoad = onload 142 143 即可用陷阱种溜溜球(颜色随机),装备后对敌人按鼠标左键,可以扔出并连续打击附近所有敌人,消灭敌人后自动回到手中,完美代替回旋镖。不想要溜溜球时,用锤子砸掉即可。陷阱在生存选项(画着绳套)下,用2个树枝、6个草制造