代码来源于“易宁”大佬的分享,仅供学习,不要直接复制粘贴。
原帖链接:http://bbs.3dmgame.com/thread-3859071-1-1.html
一八八.口袋蜂箱(用噩梦燃料种口袋蜂箱,放在地上飞出杀人蜂攻击敌人) 用MT管理器打开游戏目录/assets/scripts/prefabs/nightmarefuel.lua文件,在inst:AddComponent("inspectable")的下一行插入以下内容: local killersounds = { takeoff = "dontstarve/bee/killerbee_takeoff", attack = "dontstarve/bee/killerbee_attack", buzz = "dontstarve/bee/killerbee_fly_LP", hit = "dontstarve/bee/killerbee_hurt", death = "dontstarve/bee/killerbee_death", } local function OnDeploy (inst, pt) if GetPlayer().components.inventory:Has("goldnugget", 500) then GetPlayer().components.inventory:ConsumeByName("goldnugget", 500) local box = SpawnPrefab("nightmarefuel") box.Transform:SetPosition(pt.x, pt.y, pt.z) box.AnimState:SetBank("bee_box") box.AnimState:SetBuild("bee_box") box.AnimState:PlayAnimation("idle") box.AnimState:SetMultColour(255/255,0/255,0/255,1) box.Transform:SetScale(0.5, 0.5, 0.5) local sound = box.entity:AddSoundEmitter() local minimap = box.entity:AddMiniMapEntity() minimap:SetIcon( "beebox.png" ) box.components.inventoryitem:ChangeImageName("beebox") box:RemoveComponent("stackable") box:RemoveComponent("fuel") box:RemoveComponent("deployable") box:AddComponent("workable") box.components.workable:SetWorkAction(ACTIONS.HAMMER) box.components.workable:SetWorkLeft(3) box.components.workable:SetOnFinishCallback(function(box) SpawnPrefab("collapse_small").Transform:SetPosition(box.Transform:GetWorldPosition()) box.SoundEmitter:PlaySound("dontstarve/common/destroy_wood") box:Remove() end ) box.task = box:DoPeriodicTask(2, function(box) box.AnimState:SetBloomEffectHandle("shaders/anim.ksh") box:DoTaskInTime(1, function() box.AnimState:SetBloomEffectHandle("") end ) local pos = Vector3(box.Transform:GetWorldPosition()) local ents = TheSim:FindEntities(pos.x,pos.y,pos.z, 30) for k,v in pairs(ents) do if v.components.health and not v.components.health:IsDead() and not v:HasTag("player") then 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 local pt1 = box:GetPosition() local killerbee = SpawnPrefab("nightmarefuel") killerbee.Transform:SetPosition(pt1.x, pt1.y, pt1.z) killerbee.AnimState:SetBank("bee") killerbee.AnimState:SetBuild("bee_angry_build") killerbee.AnimState:PlayAnimation("idle") killerbee.AnimState:SetRayTestOnBB(true) killerbee.AnimState:SetMultColour(255/255,255/255,255/255,1) killerbee.entity:AddSoundEmitter() killerbee.entity:AddLightWatcher() killerbee.entity:AddDynamicShadow() killerbee.DynamicShadow:SetSize( .8, .5 ) killerbee.Transform:SetFourFaced() MakeCharacterPhysics(killerbee, 1, .3) killerbee.Physics:SetCollisionGroup(COLLISION.FLYERS) killerbee.Physics:ClearCollisionMask() killerbee.Physics:CollidesWith(COLLISION.WORLD) killerbee.Physics:CollidesWith(COLLISION.FLYERS) killerbee:AddTag("killerbee") killerbee:AddComponent("locomotor") killerbee.components.locomotor:EnableGroundSpeedMultiplier(false) killerbee.components.locomotor:SetTriggersCreep(false) killerbee:SetStateGraph("SGbee") killerbee:AddComponent("health") killerbee.components.health:SetMaxHealth(200) killerbee:AddComponent("combat") killerbee.components.combat:SetTarget(v) killerbee.components.combat:SetDefaultDamage(20) killerbee.components.combat:SetAttackPeriod(0.1) killerbee.components.combat.hiteffectsymbol = "body" killerbee.components.combat:SetRetargetFunction(1, function(killerbee) if not killerbee.components.health:IsDead() then return FindEntity(box, 30, function(guy) if guy.components.health and not guy.components.health:IsDead() and not guy:HasTag("player") then 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" end end) end end ) local killerbrain = require("brains/killerbeebrain") killerbee:SetBrain(killerbrain) killerbee.sounds = killersounds killerbee:AddComponent("knownlocations") killerbee:ListenForEvent("attacked", function(killerbee, data) killerbee.components.combat:SetTarget(data.attacker) end ) killerbee:RemoveComponent("stackable") killerbee:RemoveComponent("fuel") killerbee:RemoveComponent("deployable") killerbee:RemoveComponent("inventoryitem") killerbee:DoTaskInTime(30, function() killerbee:Remove() end ) v:ListenForEvent("death", function() killerbee:Remove() end ) end end end end ) box.components.inventoryitem:SetOnPutInInventoryFn(function(box) box:RemoveTag("doings") if box.task then box.task:Cancel() box.task = nil end local pos = Vector3(box.Transform:GetWorldPosition()) local ents = TheSim:FindEntities(pos.x,pos.y,pos.z, 3000) for k,v in pairs(ents) do if v:HasTag("killerbee") then v:Remove() end end end ) box.components.inventoryitem:SetOnDroppedFn(function(box) box:AddTag("doings") box.task = box:DoPeriodicTask(2, function(box) box.AnimState:SetBloomEffectHandle("shaders/anim.ksh") box:DoTaskInTime(1, function() box.AnimState:SetBloomEffectHandle("") end ) local pos = Vector3(box.Transform:GetWorldPosition()) local ents = TheSim:FindEntities(pos.x,pos.y,pos.z, 30) for k,v in pairs(ents) do if v.components.health and not v.components.health:IsDead() and not v:HasTag("player") then 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 local pt1 = box:GetPosition() local killerbee = SpawnPrefab("nightmarefuel") killerbee.Transform:SetPosition(pt1.x, pt1.y, pt1.z) killerbee.AnimState:SetBank("bee") killerbee.AnimState:SetBuild("bee_angry_build") killerbee.AnimState:PlayAnimation("idle") killerbee.AnimState:SetRayTestOnBB(true) killerbee.AnimState:SetMultColour(255/255,255/255,255/255,1) killerbee.entity:AddSoundEmitter() killerbee.entity:AddLightWatcher() killerbee.entity:AddDynamicShadow() killerbee.DynamicShadow:SetSize( .8, .5 ) killerbee.Transform:SetFourFaced() MakeCharacterPhysics(killerbee, 1, .3) killerbee.Physics:SetCollisionGroup(COLLISION.FLYERS) killerbee.Physics:ClearCollisionMask() killerbee.Physics:CollidesWith(COLLISION.WORLD) killerbee.Physics:CollidesWith(COLLISION.FLYERS) killerbee:AddTag("killerbee") killerbee:AddComponent("locomotor") killerbee.components.locomotor:EnableGroundSpeedMultiplier(false) killerbee.components.locomotor:SetTriggersCreep(false) killerbee:SetStateGraph("SGbee") killerbee:AddComponent("health") killerbee.components.health:SetMaxHealth(200) killerbee:AddComponent("combat") killerbee.components.combat:SetTarget(v) killerbee.components.combat:SetDefaultDamage(20) killerbee.components.combat:SetAttackPeriod(0.1) killerbee.components.combat.hiteffectsymbol = "body" killerbee.components.combat:SetRetargetFunction(1, function(killerbee) if not killerbee.components.health:IsDead() then return FindEntity(box, 30, function(guy) if guy.components.health and not guy.components.health:IsDead() and not guy:HasTag("player") then 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" end end) end end ) local killerbrain = require("brains/killerbeebrain") killerbee:SetBrain(killerbrain) killerbee.sounds = killersounds killerbee:AddComponent("knownlocations") killerbee:ListenForEvent("attacked", function(killerbee, data) killerbee.components.combat:SetTarget(data.attacker) end ) killerbee:RemoveComponent("stackable") killerbee:RemoveComponent("fuel") killerbee:RemoveComponent("deployable") killerbee:RemoveComponent("inventoryitem") killerbee:DoTaskInTime(30, function() killerbee:Remove() end ) v:ListenForEvent("death", function() killerbee:Remove() end ) end end end end ) end ) box:AddTag("doings") box:AddTag("boxs") end inst.components.stackable:Get():Remove() end inst:AddComponent("deployable") inst.components.deployable.ondeploy = OnDeploy local function onsave(inst, data) if inst:HasTag("boxs") then data.boxs = true end if inst:HasTag("doings") then data.doings = true end if inst:HasTag("killerbee") then data.killerbee = true end end local function onload(inst, data) if data and data.boxs then inst.AnimState:SetBank("bee_box") inst.AnimState:SetBuild("bee_box") inst.AnimState:PlayAnimation("idle") inst.AnimState:SetMultColour(255/255,0/255,0/255,1) inst.Transform:SetScale(0.5, 0.5, 0.5) local sound = inst.entity:AddSoundEmitter() local minimap = inst.entity:AddMiniMapEntity() minimap:SetIcon( "beebox.png" ) inst.components.inventoryitem:ChangeImageName("beebox") inst:RemoveComponent("stackable") inst:RemoveComponent("fuel") inst:RemoveComponent("deployable") inst:AddComponent("workable") inst.components.workable:SetWorkAction(ACTIONS.HAMMER) inst.components.workable:SetWorkLeft(3) inst.components.workable:SetOnFinishCallback(function(inst) SpawnPrefab("collapse_small").Transform:SetPosition(inst.Transform:GetWorldPosition()) inst.SoundEmitter:PlaySound("dontstarve/common/destroy_wood") inst:Remove() end ) inst.components.inventoryitem:SetOnPutInInventoryFn(function(inst) inst:RemoveTag("doings") if inst.task then inst.task:Cancel() inst.task = nil end local pos = Vector3(inst.Transform:GetWorldPosition()) local ents = TheSim:FindEntities(pos.x,pos.y,pos.z, 3000) for k,v in pairs(ents) do if v:HasTag("killerbee") then v:Remove() end end end ) inst.components.inventoryitem:SetOnDroppedFn(function(inst) inst:AddTag("doings") inst.task = inst:DoPeriodicTask(2, function(inst) inst.AnimState:SetBloomEffectHandle("shaders/anim.ksh") inst:DoTaskInTime(1, function() inst.AnimState:SetBloomEffectHandle("") end ) local pos = Vector3(inst.Transform:GetWorldPosition()) local ents = TheSim:FindEntities(pos.x,pos.y,pos.z, 30) for k,v in pairs(ents) do if v.components.health and not v.components.health:IsDead() and not v:HasTag("player") then 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 local pt1 = inst:GetPosition() local killerbee = SpawnPrefab("nightmarefuel") killerbee.Transform:SetPosition(pt1.x, pt1.y, pt1.z) killerbee.AnimState:SetBank("bee") killerbee.AnimState:SetBuild("bee_angry_build") killerbee.AnimState:PlayAnimation("idle") killerbee.AnimState:SetRayTestOnBB(true) killerbee.AnimState:SetMultColour(255/255,255/255,255/255,1) killerbee.entity:AddSoundEmitter() killerbee.entity:AddLightWatcher() killerbee.entity:AddDynamicShadow() killerbee.DynamicShadow:SetSize( .8, .5 ) killerbee.Transform:SetFourFaced() MakeCharacterPhysics(killerbee, 1, .3) killerbee.Physics:SetCollisionGroup(COLLISION.FLYERS) killerbee.Physics:ClearCollisionMask() killerbee.Physics:CollidesWith(COLLISION.WORLD) killerbee.Physics:CollidesWith(COLLISION.FLYERS) killerbee:AddTag("killerbee") killerbee:AddComponent("locomotor") killerbee.components.locomotor:EnableGroundSpeedMultiplier(false) killerbee.components.locomotor:SetTriggersCreep(false) killerbee:SetStateGraph("SGbee") killerbee:AddComponent("health") killerbee.components.health:SetMaxHealth(200) killerbee:AddComponent("combat") killerbee.components.combat:SetTarget(v) killerbee.components.combat:SetDefaultDamage(20) killerbee.components.combat:SetAttackPeriod(0.1) killerbee.components.combat.hiteffectsymbol = "body" killerbee.components.combat:SetRetargetFunction(1, function(killerbee) if not killerbee.components.health:IsDead() then return FindEntity(inst, 30, function(guy) if guy.components.health and not guy.components.health:IsDead() and not guy:HasTag("player") then 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" end end) end end ) local killerbrain = require("brains/killerbeebrain") killerbee:SetBrain(killerbrain) killerbee.sounds = killersounds killerbee:AddComponent("knownlocations") killerbee:ListenForEvent("attacked", function(killerbee, data) killerbee.components.combat:SetTarget(data.attacker) end ) killerbee:RemoveComponent("stackable") killerbee:RemoveComponent("fuel") killerbee:RemoveComponent("deployable") killerbee:RemoveComponent("inventoryitem") killerbee:DoTaskInTime(30, function() killerbee:Remove() end ) v:ListenForEvent("death", function() killerbee:Remove() end ) end end end end ) end ) inst:AddTag("boxs") end if data and data.doings then inst.task = inst:DoPeriodicTask(2, function(inst) inst.AnimState:SetBloomEffectHandle("shaders/anim.ksh") inst:DoTaskInTime(1, function() inst.AnimState:SetBloomEffectHandle("") end ) local pos = Vector3(inst.Transform:GetWorldPosition()) local ents = TheSim:FindEntities(pos.x,pos.y,pos.z, 30) for k,v in pairs(ents) do if v.components.health and not v.components.health:IsDead() and not v:HasTag("player") then 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 local pt1 = inst:GetPosition() local killerbee = SpawnPrefab("nightmarefuel") killerbee.Transform:SetPosition(pt1.x, pt1.y, pt1.z) killerbee.AnimState:SetBank("bee") killerbee.AnimState:SetBuild("bee_angry_build") killerbee.AnimState:PlayAnimation("idle") killerbee.AnimState:SetRayTestOnBB(true) killerbee.AnimState:SetMultColour(255/255,255/255,255/255,1) killerbee.entity:AddSoundEmitter() killerbee.entity:AddLightWatcher() killerbee.entity:AddDynamicShadow() killerbee.DynamicShadow:SetSize( .8, .5 ) killerbee.Transform:SetFourFaced() MakeCharacterPhysics(killerbee, 1, .3) killerbee.Physics:SetCollisionGroup(COLLISION.FLYERS) killerbee.Physics:ClearCollisionMask() killerbee.Physics:CollidesWith(COLLISION.WORLD) killerbee.Physics:CollidesWith(COLLISION.FLYERS) killerbee:AddTag("killerbee") killerbee:AddComponent("locomotor") killerbee.components.locomotor:EnableGroundSpeedMultiplier(false) killerbee.components.locomotor:SetTriggersCreep(false) killerbee:SetStateGraph("SGbee") killerbee:AddComponent("health") killerbee.components.health:SetMaxHealth(200) killerbee:AddComponent("combat") killerbee.components.combat:SetTarget(v) killerbee.components.combat:SetDefaultDamage(20) killerbee.components.combat:SetAttackPeriod(0.1) killerbee.components.combat.hiteffectsymbol = "body" killerbee.components.combat:SetRetargetFunction(1, function(killerbee) if not killerbee.components.health:IsDead() then return FindEntity(inst, 30, function(guy) if guy.components.health and not guy.components.health:IsDead() and not guy:HasTag("player") then 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" end end) end end ) local killerbrain = require("brains/killerbeebrain") killerbee:SetBrain(killerbrain) killerbee.sounds = killersounds killerbee:AddComponent("knownlocations") killerbee:ListenForEvent("attacked", function(killerbee, data) killerbee.components.combat:SetTarget(data.attacker) end ) killerbee:RemoveComponent("stackable") killerbee:RemoveComponent("fuel") killerbee:RemoveComponent("deployable") killerbee:RemoveComponent("inventoryitem") killerbee:DoTaskInTime(30, function() killerbee:Remove() end ) v:ListenForEvent("death", function() killerbee:Remove() end ) end end end end ) inst:AddTag("doings") end if data and data.killerbee then inst:Remove() end end inst.OnSave = onsave inst.OnLoad = onload 即可在攒够500个黄金时,用噩梦燃料种口袋蜂箱,将消费500个黄金,身上黄金数不足时不会种出来。蜂箱放在地上时,如果周围有敌人,会不断飞出杀人蜂攻击敌人,直至敌人死亡为止,且杀人蜂不会攻击主角及同伴(不包括猪人、兔人)。鼠标左键点口袋蜂箱,可将其放入物品栏,显示为蜂箱的图标,所有飞出的杀人蜂将消失。口袋蜂箱类似于导弹防御系统,既可以帮助主角作战,也可以保护基地,无论周围有多少敌人,都会派出足够数量的杀人蜂去攻击,因此只种一个即可,否则对电脑硬件要求较高。可以通过小地图查询口袋蜂箱的位置,显示为蜂箱的图标。不想要口袋蜂箱时,用锤子砸掉即可