代码来源于“易宁”大佬的分享,仅供学习,不要直接复制粘贴。

原帖链接: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个黄金,身上黄金数不足时不会种出来。蜂箱放在地上时,如果周围有敌人,会不断飞出杀人蜂攻击敌人,直至敌人死亡为止,且杀人蜂不会攻击主角及同伴(不包括猪人、兔人)。鼠标左键点口袋蜂箱,可将其放入物品栏,显示为蜂箱的图标,所有飞出的杀人蜂将消失。口袋蜂箱类似于导弹防御系统,既可以帮助主角作战,也可以保护基地,无论周围有多少敌人,都会派出足够数量的杀人蜂去攻击,因此只种一个即可,否则对电脑硬件要求较高。可以通过小地图查询口袋蜂箱的位置,显示为蜂箱的图标。不想要口袋蜂箱时,用锤子砸掉即可