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