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

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