代码来源于“易宁”大佬的分享,仅供学习,不要直接复制粘贴。
原帖链接:http://bbs.3dmgame.com/thread-3859071-1-1.html
1 2一八八.口袋蜂箱(用噩梦燃料种口袋蜂箱,放在地上飞出杀人蜂攻击敌人) 3 4 用MT管理器打开游戏目录/assets/scripts/prefabs/nightmarefuel.lua文件,在inst:AddComponent("inspectable")的下一行插入以下内容: 5 6local killersounds = 7{ 8 takeoff = "dontstarve/bee/killerbee_takeoff", 9 attack = "dontstarve/bee/killerbee_attack", 10 buzz = "dontstarve/bee/killerbee_fly_LP", 11 hit = "dontstarve/bee/killerbee_hurt", 12 death = "dontstarve/bee/killerbee_death", 13} 14local function OnDeploy (inst, pt) 15 if GetPlayer().components.inventory:Has("goldnugget", 500) then 16 GetPlayer().components.inventory:ConsumeByName("goldnugget", 500) 17 local box = SpawnPrefab("nightmarefuel") 18 box.Transform:SetPosition(pt.x, pt.y, pt.z) 19 box.AnimState:SetBank("bee_box") 20 box.AnimState:SetBuild("bee_box") 21 box.AnimState:PlayAnimation("idle") 22 box.AnimState:SetMultColour(255/255,0/255,0/255,1) 23 box.Transform:SetScale(0.5, 0.5, 0.5) 24 local sound = box.entity:AddSoundEmitter() 25 local minimap = box.entity:AddMiniMapEntity() 26 minimap:SetIcon( "beebox.png" ) 27 box.components.inventoryitem:ChangeImageName("beebox") 28 box:RemoveComponent("stackable") 29 box:RemoveComponent("fuel") 30 box:RemoveComponent("deployable") 31 box:AddComponent("workable") 32 box.components.workable:SetWorkAction(ACTIONS.HAMMER) 33 box.components.workable:SetWorkLeft(3) 34 box.components.workable:SetOnFinishCallback(function(box) 35 SpawnPrefab("collapse_small").Transform:SetPosition(box.Transform:GetWorldPosition()) 36 box.SoundEmitter:PlaySound("dontstarve/common/destroy_wood") 37 box:Remove() 38 end ) 39 box.task = box:DoPeriodicTask(2, function(box) 40 box.AnimState:SetBloomEffectHandle("shaders/anim.ksh") 41 box:DoTaskInTime(1, function() box.AnimState:SetBloomEffectHandle("") end ) 42 local pos = Vector3(box.Transform:GetWorldPosition()) 43 local ents = TheSim:FindEntities(pos.x,pos.y,pos.z, 30) 44 for k,v in pairs(ents) do 45 if v.components.health and not v.components.health:IsDead() and not v:HasTag("player") then 46 if v.components.combat.target == GetPlayer() or GetPlayer().components.combat.target == v or v:HasTag("monster") or v.prefab == "beefalo" or v.prefab == "bunnyman" or v.prefab == "pigman" or v.prefab == "pigguard" or v.prefab == "merm" or v.prefab == "monkey" or v.prefab == "tallbird" or v.prefab == "walrus" or v.prefab == "little_walrus" or v.prefab == "wasphive" then 47 local pt1 = box:GetPosition() 48 local killerbee = SpawnPrefab("nightmarefuel") 49 killerbee.Transform:SetPosition(pt1.x, pt1.y, pt1.z) 50 killerbee.AnimState:SetBank("bee") 51 killerbee.AnimState:SetBuild("bee_angry_build") 52 killerbee.AnimState:PlayAnimation("idle") 53 killerbee.AnimState:SetRayTestOnBB(true) 54 killerbee.AnimState:SetMultColour(255/255,255/255,255/255,1) 55 killerbee.entity:AddSoundEmitter() 56 killerbee.entity:AddLightWatcher() 57 killerbee.entity:AddDynamicShadow() 58 killerbee.DynamicShadow:SetSize( .8, .5 ) 59 killerbee.Transform:SetFourFaced() 60 MakeCharacterPhysics(killerbee, 1, .3) 61 killerbee.Physics:SetCollisionGroup(COLLISION.FLYERS) 62 killerbee.Physics:ClearCollisionMask() 63 killerbee.Physics:CollidesWith(COLLISION.WORLD) 64 killerbee.Physics:CollidesWith(COLLISION.FLYERS) 65 killerbee:AddTag("killerbee") 66 killerbee:AddComponent("locomotor") 67 killerbee.components.locomotor:EnableGroundSpeedMultiplier(false) 68 killerbee.components.locomotor:SetTriggersCreep(false) 69 killerbee:SetStateGraph("SGbee") 70 killerbee:AddComponent("health") 71 killerbee.components.health:SetMaxHealth(200) 72 killerbee:AddComponent("combat") 73 killerbee.components.combat:SetTarget(v) 74 killerbee.components.combat:SetDefaultDamage(20) 75 killerbee.components.combat:SetAttackPeriod(0.1) 76 killerbee.components.combat.hiteffectsymbol = "body" 77 killerbee.components.combat:SetRetargetFunction(1, function(killerbee) 78 if not killerbee.components.health:IsDead() then 79 return FindEntity(box, 30, function(guy) 80 if guy.components.health and not guy.components.health:IsDead() and not guy:HasTag("player") then 81 return guy.components.combat.target == GetPlayer() or GetPlayer().components.combat.target == guy or guy:HasTag("monster") or guy.prefab == "beefalo" or guy.prefab == "bunnyman" or guy.prefab == "pigman" or guy.prefab == "pigguard" or guy.prefab == "merm" or guy.prefab == "monkey" or guy.prefab == "tallbird" or guy.prefab == "walrus" or guy.prefab == "little_walrus" or guy.prefab == "wasphive" 82 end 83 end) 84 end 85 end ) 86 local killerbrain = require("brains/killerbeebrain") 87 killerbee:SetBrain(killerbrain) 88 killerbee.sounds = killersounds 89 killerbee:AddComponent("knownlocations") 90 killerbee:ListenForEvent("attacked", function(killerbee, data) killerbee.components.combat:SetTarget(data.attacker) end ) 91 killerbee:RemoveComponent("stackable") 92 killerbee:RemoveComponent("fuel") 93 killerbee:RemoveComponent("deployable") 94 killerbee:RemoveComponent("inventoryitem") 95 killerbee:DoTaskInTime(30, function() killerbee:Remove() end ) 96 v:ListenForEvent("death", function() killerbee:Remove() end ) 97 end 98 end 99 end 100 end ) 101 box.components.inventoryitem:SetOnPutInInventoryFn(function(box) 102 box:RemoveTag("doings") 103 if box.task then box.task:Cancel() box.task = nil end 104 local pos = Vector3(box.Transform:GetWorldPosition()) 105 local ents = TheSim:FindEntities(pos.x,pos.y,pos.z, 3000) 106 for k,v in pairs(ents) do 107 if v:HasTag("killerbee") then 108 v:Remove() 109 end 110 end 111 end ) 112 box.components.inventoryitem:SetOnDroppedFn(function(box) 113 box:AddTag("doings") 114 box.task = box:DoPeriodicTask(2, function(box) 115 box.AnimState:SetBloomEffectHandle("shaders/anim.ksh") 116 box:DoTaskInTime(1, function() box.AnimState:SetBloomEffectHandle("") end ) 117 local pos = Vector3(box.Transform:GetWorldPosition()) 118 local ents = TheSim:FindEntities(pos.x,pos.y,pos.z, 30) 119 for k,v in pairs(ents) do 120 if v.components.health and not v.components.health:IsDead() and not v:HasTag("player") then 121 if v.components.combat.target == GetPlayer() or GetPlayer().components.combat.target == v or v:HasTag("monster") or v.prefab == "beefalo" or v.prefab == "bunnyman" or v.prefab == "pigman" or v.prefab == "pigguard" or v.prefab == "merm" or v.prefab == "monkey" or v.prefab == "tallbird" or v.prefab == "walrus" or v.prefab == "little_walrus" or v.prefab == "wasphive" then 122 local pt1 = box:GetPosition() 123 local killerbee = SpawnPrefab("nightmarefuel") 124 killerbee.Transform:SetPosition(pt1.x, pt1.y, pt1.z) 125 killerbee.AnimState:SetBank("bee") 126 killerbee.AnimState:SetBuild("bee_angry_build") 127 killerbee.AnimState:PlayAnimation("idle") 128 killerbee.AnimState:SetRayTestOnBB(true) 129 killerbee.AnimState:SetMultColour(255/255,255/255,255/255,1) 130 killerbee.entity:AddSoundEmitter() 131 killerbee.entity:AddLightWatcher() 132 killerbee.entity:AddDynamicShadow() 133 killerbee.DynamicShadow:SetSize( .8, .5 ) 134 killerbee.Transform:SetFourFaced() 135 MakeCharacterPhysics(killerbee, 1, .3) 136 killerbee.Physics:SetCollisionGroup(COLLISION.FLYERS) 137 killerbee.Physics:ClearCollisionMask() 138 killerbee.Physics:CollidesWith(COLLISION.WORLD) 139 killerbee.Physics:CollidesWith(COLLISION.FLYERS) 140 killerbee:AddTag("killerbee") 141 killerbee:AddComponent("locomotor") 142 killerbee.components.locomotor:EnableGroundSpeedMultiplier(false) 143 killerbee.components.locomotor:SetTriggersCreep(false) 144 killerbee:SetStateGraph("SGbee") 145 killerbee:AddComponent("health") 146 killerbee.components.health:SetMaxHealth(200) 147 killerbee:AddComponent("combat") 148 killerbee.components.combat:SetTarget(v) 149 killerbee.components.combat:SetDefaultDamage(20) 150 killerbee.components.combat:SetAttackPeriod(0.1) 151 killerbee.components.combat.hiteffectsymbol = "body" 152 killerbee.components.combat:SetRetargetFunction(1, function(killerbee) 153 if not killerbee.components.health:IsDead() then 154 return FindEntity(box, 30, function(guy) 155 if guy.components.health and not guy.components.health:IsDead() and not guy:HasTag("player") then 156 return guy.components.combat.target == GetPlayer() or GetPlayer().components.combat.target == guy or guy:HasTag("monster") or guy.prefab == "beefalo" or guy.prefab == "bunnyman" or guy.prefab == "pigman" or guy.prefab == "pigguard" or guy.prefab == "merm" or guy.prefab == "monkey" or guy.prefab == "tallbird" or guy.prefab == "walrus" or guy.prefab == "little_walrus" or guy.prefab == "wasphive" 157 end 158 end) 159 end 160 end ) 161 local killerbrain = require("brains/killerbeebrain") 162 killerbee:SetBrain(killerbrain) 163 killerbee.sounds = killersounds 164 killerbee:AddComponent("knownlocations") 165 killerbee:ListenForEvent("attacked", function(killerbee, data) killerbee.components.combat:SetTarget(data.attacker) end ) 166 killerbee:RemoveComponent("stackable") 167 killerbee:RemoveComponent("fuel") 168 killerbee:RemoveComponent("deployable") 169 killerbee:RemoveComponent("inventoryitem") 170 killerbee:DoTaskInTime(30, function() killerbee:Remove() end ) 171 v:ListenForEvent("death", function() killerbee:Remove() end ) 172 end 173 end 174 end 175 end ) 176 end ) 177 box:AddTag("doings") 178 box:AddTag("boxs") 179 end 180 inst.components.stackable:Get():Remove() 181end 182 inst:AddComponent("deployable") 183 inst.components.deployable.ondeploy = OnDeploy 184local function onsave(inst, data) 185 if inst:HasTag("boxs") then 186 data.boxs = true 187 end 188 if inst:HasTag("doings") then 189 data.doings = true 190 end 191 if inst:HasTag("killerbee") then 192 data.killerbee = true 193 end 194end 195local function onload(inst, data) 196 if data and data.boxs then 197 inst.AnimState:SetBank("bee_box") 198 inst.AnimState:SetBuild("bee_box") 199 inst.AnimState:PlayAnimation("idle") 200 inst.AnimState:SetMultColour(255/255,0/255,0/255,1) 201 inst.Transform:SetScale(0.5, 0.5, 0.5) 202 local sound = inst.entity:AddSoundEmitter() 203 local minimap = inst.entity:AddMiniMapEntity() 204 minimap:SetIcon( "beebox.png" ) 205 inst.components.inventoryitem:ChangeImageName("beebox") 206 inst:RemoveComponent("stackable") 207 inst:RemoveComponent("fuel") 208 inst:RemoveComponent("deployable") 209 inst:AddComponent("workable") 210 inst.components.workable:SetWorkAction(ACTIONS.HAMMER) 211 inst.components.workable:SetWorkLeft(3) 212 inst.components.workable:SetOnFinishCallback(function(inst) 213 SpawnPrefab("collapse_small").Transform:SetPosition(inst.Transform:GetWorldPosition()) 214 inst.SoundEmitter:PlaySound("dontstarve/common/destroy_wood") 215 inst:Remove() 216 end ) 217 inst.components.inventoryitem:SetOnPutInInventoryFn(function(inst) 218 inst:RemoveTag("doings") 219 if inst.task then inst.task:Cancel() inst.task = nil end 220 local pos = Vector3(inst.Transform:GetWorldPosition()) 221 local ents = TheSim:FindEntities(pos.x,pos.y,pos.z, 3000) 222 for k,v in pairs(ents) do 223 if v:HasTag("killerbee") then 224 v:Remove() 225 end 226 end 227 end ) 228 inst.components.inventoryitem:SetOnDroppedFn(function(inst) 229 inst:AddTag("doings") 230 inst.task = inst:DoPeriodicTask(2, function(inst) 231 inst.AnimState:SetBloomEffectHandle("shaders/anim.ksh") 232 inst:DoTaskInTime(1, function() inst.AnimState:SetBloomEffectHandle("") end ) 233 local pos = Vector3(inst.Transform:GetWorldPosition()) 234 local ents = TheSim:FindEntities(pos.x,pos.y,pos.z, 30) 235 for k,v in pairs(ents) do 236 if v.components.health and not v.components.health:IsDead() and not v:HasTag("player") then 237 if v.components.combat.target == GetPlayer() or GetPlayer().components.combat.target == v or v:HasTag("monster") or v.prefab == "beefalo" or v.prefab == "bunnyman" or v.prefab == "pigman" or v.prefab == "pigguard" or v.prefab == "merm" or v.prefab == "monkey" or v.prefab == "tallbird" or v.prefab == "walrus" or v.prefab == "little_walrus" or v.prefab == "wasphive" then 238 local pt1 = inst:GetPosition() 239 local killerbee = SpawnPrefab("nightmarefuel") 240 killerbee.Transform:SetPosition(pt1.x, pt1.y, pt1.z) 241 killerbee.AnimState:SetBank("bee") 242 killerbee.AnimState:SetBuild("bee_angry_build") 243 killerbee.AnimState:PlayAnimation("idle") 244 killerbee.AnimState:SetRayTestOnBB(true) 245 killerbee.AnimState:SetMultColour(255/255,255/255,255/255,1) 246 killerbee.entity:AddSoundEmitter() 247 killerbee.entity:AddLightWatcher() 248 killerbee.entity:AddDynamicShadow() 249 killerbee.DynamicShadow:SetSize( .8, .5 ) 250 killerbee.Transform:SetFourFaced() 251 MakeCharacterPhysics(killerbee, 1, .3) 252 killerbee.Physics:SetCollisionGroup(COLLISION.FLYERS) 253 killerbee.Physics:ClearCollisionMask() 254 killerbee.Physics:CollidesWith(COLLISION.WORLD) 255 killerbee.Physics:CollidesWith(COLLISION.FLYERS) 256 killerbee:AddTag("killerbee") 257 killerbee:AddComponent("locomotor") 258 killerbee.components.locomotor:EnableGroundSpeedMultiplier(false) 259 killerbee.components.locomotor:SetTriggersCreep(false) 260 killerbee:SetStateGraph("SGbee") 261 killerbee:AddComponent("health") 262 killerbee.components.health:SetMaxHealth(200) 263 killerbee:AddComponent("combat") 264 killerbee.components.combat:SetTarget(v) 265 killerbee.components.combat:SetDefaultDamage(20) 266 killerbee.components.combat:SetAttackPeriod(0.1) 267 killerbee.components.combat.hiteffectsymbol = "body" 268 killerbee.components.combat:SetRetargetFunction(1, function(killerbee) 269 if not killerbee.components.health:IsDead() then 270 return FindEntity(inst, 30, function(guy) 271 if guy.components.health and not guy.components.health:IsDead() and not guy:HasTag("player") then 272 return guy.components.combat.target == GetPlayer() or GetPlayer().components.combat.target == guy or guy:HasTag("monster") or guy.prefab == "beefalo" or guy.prefab == "bunnyman" or guy.prefab == "pigman" or guy.prefab == "pigguard" or guy.prefab == "merm" or guy.prefab == "monkey" or guy.prefab == "tallbird" or guy.prefab == "walrus" or guy.prefab == "little_walrus" or guy.prefab == "wasphive" 273 end 274 end) 275 end 276 end ) 277 local killerbrain = require("brains/killerbeebrain") 278 killerbee:SetBrain(killerbrain) 279 killerbee.sounds = killersounds 280 killerbee:AddComponent("knownlocations") 281 killerbee:ListenForEvent("attacked", function(killerbee, data) killerbee.components.combat:SetTarget(data.attacker) end ) 282 killerbee:RemoveComponent("stackable") 283 killerbee:RemoveComponent("fuel") 284 killerbee:RemoveComponent("deployable") 285 killerbee:RemoveComponent("inventoryitem") 286 killerbee:DoTaskInTime(30, function() killerbee:Remove() end ) 287 v:ListenForEvent("death", function() killerbee:Remove() end ) 288 end 289 end 290 end 291 end ) 292 end ) 293 inst:AddTag("boxs") 294 end 295 if data and data.doings then 296 inst.task = inst:DoPeriodicTask(2, function(inst) 297 inst.AnimState:SetBloomEffectHandle("shaders/anim.ksh") 298 inst:DoTaskInTime(1, function() inst.AnimState:SetBloomEffectHandle("") end ) 299 local pos = Vector3(inst.Transform:GetWorldPosition()) 300 local ents = TheSim:FindEntities(pos.x,pos.y,pos.z, 30) 301 for k,v in pairs(ents) do 302 if v.components.health and not v.components.health:IsDead() and not v:HasTag("player") then 303 if v.components.combat.target == GetPlayer() or GetPlayer().components.combat.target == v or v:HasTag("monster") or v.prefab == "beefalo" or v.prefab == "bunnyman" or v.prefab == "pigman" or v.prefab == "pigguard" or v.prefab == "merm" or v.prefab == "monkey" or v.prefab == "tallbird" or v.prefab == "walrus" or v.prefab == "little_walrus" or v.prefab == "wasphive" then 304 local pt1 = inst:GetPosition() 305 local killerbee = SpawnPrefab("nightmarefuel") 306 killerbee.Transform:SetPosition(pt1.x, pt1.y, pt1.z) 307 killerbee.AnimState:SetBank("bee") 308 killerbee.AnimState:SetBuild("bee_angry_build") 309 killerbee.AnimState:PlayAnimation("idle") 310 killerbee.AnimState:SetRayTestOnBB(true) 311 killerbee.AnimState:SetMultColour(255/255,255/255,255/255,1) 312 killerbee.entity:AddSoundEmitter() 313 killerbee.entity:AddLightWatcher() 314 killerbee.entity:AddDynamicShadow() 315 killerbee.DynamicShadow:SetSize( .8, .5 ) 316 killerbee.Transform:SetFourFaced() 317 MakeCharacterPhysics(killerbee, 1, .3) 318 killerbee.Physics:SetCollisionGroup(COLLISION.FLYERS) 319 killerbee.Physics:ClearCollisionMask() 320 killerbee.Physics:CollidesWith(COLLISION.WORLD) 321 killerbee.Physics:CollidesWith(COLLISION.FLYERS) 322 killerbee:AddTag("killerbee") 323 killerbee:AddComponent("locomotor") 324 killerbee.components.locomotor:EnableGroundSpeedMultiplier(false) 325 killerbee.components.locomotor:SetTriggersCreep(false) 326 killerbee:SetStateGraph("SGbee") 327 killerbee:AddComponent("health") 328 killerbee.components.health:SetMaxHealth(200) 329 killerbee:AddComponent("combat") 330 killerbee.components.combat:SetTarget(v) 331 killerbee.components.combat:SetDefaultDamage(20) 332 killerbee.components.combat:SetAttackPeriod(0.1) 333 killerbee.components.combat.hiteffectsymbol = "body" 334 killerbee.components.combat:SetRetargetFunction(1, function(killerbee) 335 if not killerbee.components.health:IsDead() then 336 return FindEntity(inst, 30, function(guy) 337 if guy.components.health and not guy.components.health:IsDead() and not guy:HasTag("player") then 338 return guy.components.combat.target == GetPlayer() or GetPlayer().components.combat.target == guy or guy:HasTag("monster") or guy.prefab == "beefalo" or guy.prefab == "bunnyman" or guy.prefab == "pigman" or guy.prefab == "pigguard" or guy.prefab == "merm" or guy.prefab == "monkey" or guy.prefab == "tallbird" or guy.prefab == "walrus" or guy.prefab == "little_walrus" or guy.prefab == "wasphive" 339 end 340 end) 341 end 342 end ) 343 local killerbrain = require("brains/killerbeebrain") 344 killerbee:SetBrain(killerbrain) 345 killerbee.sounds = killersounds 346 killerbee:AddComponent("knownlocations") 347 killerbee:ListenForEvent("attacked", function(killerbee, data) killerbee.components.combat:SetTarget(data.attacker) end ) 348 killerbee:RemoveComponent("stackable") 349 killerbee:RemoveComponent("fuel") 350 killerbee:RemoveComponent("deployable") 351 killerbee:RemoveComponent("inventoryitem") 352 killerbee:DoTaskInTime(30, function() killerbee:Remove() end ) 353 v:ListenForEvent("death", function() killerbee:Remove() end ) 354 end 355 end 356 end 357 end ) 358 inst:AddTag("doings") 359 end 360 if data and data.killerbee then 361 inst:Remove() 362 end 363end 364 inst.OnSave = onsave 365 inst.OnLoad = onload 366 367 即可在攒够500个黄金时,用噩梦燃料种口袋蜂箱,将消费500个黄金,身上黄金数不足时不会种出来。蜂箱放在地上时,如果周围有敌人,会不断飞出杀人蜂攻击敌人,直至敌人死亡为止,且杀人蜂不会攻击主角及同伴(不包括猪人、兔人)。鼠标左键点口袋蜂箱,可将其放入物品栏,显示为蜂箱的图标,所有飞出的杀人蜂将消失。口袋蜂箱类似于导弹防御系统,既可以帮助主角作战,也可以保护基地,无论周围有多少敌人,都会派出足够数量的杀人蜂去攻击,因此只种一个即可,否则对电脑硬件要求较高。可以通过小地图查询口袋蜂箱的位置,显示为蜂箱的图标。不想要口袋蜂箱时,用锤子砸掉即可