代码来源于“易宁”大佬的分享,仅供学习,不要直接复制粘贴。
原帖链接:http://bbs.3dmgame.com/thread-3859071-1-1.html
1
2二0二.天使蝴蝶(用雨衣种天使蝴蝶,为你照亮,电击来犯之敌,可收入物品栏)
3
4 用MT管理器打开游戏目录/assets/DLC0002/scripts/prefabs/raincoat.lua文件,在inst:AddComponent("inspectable")的下一行插入以下内容:
5
6local function OnDeploy (inst, pt)
7 local scalewing = SpawnPrefab("raincoat")
8 scalewing.Transform:SetPosition(pt.x, pt.y, pt.z)
9 scalewing.AnimState:SetBank("butterfly")
10 scalewing.AnimState:SetBuild("butterfly_basic")
11 scalewing.AnimState:PlayAnimation("idle")
12 scalewing.AnimState:SetRayTestOnBB(true);
13 scalewing.Transform:SetTwoFaced()
14 scalewing.Transform:SetScale(1.5, 1.5, 1.5)
15 scalewing.AnimState:SetMultColour(255/255,0/255,115/255,0.8)
16 scalewing.AnimState:SetBloomEffectHandle("shaders/anim.ksh")
17 scalewing.entity:AddSoundEmitter()
18 local shadow = scalewing.entity:AddDynamicShadow()
19 shadow:SetSize(.8, .5)
20 RemovePhysicsColliders(scalewing)
21 scalewing.entity:AddLight()
22 scalewing.Light:SetFalloff(1)
23 scalewing.Light:SetIntensity(.8)
24 scalewing.Light:SetRadius(12)
25 scalewing.Light:SetColour(180/255, 195/255, 50/255)
26 scalewing.Light:Enable(true)
27 scalewing:RemoveComponent("inventoryitem")
28 scalewing:RemoveComponent("equippable")
29 scalewing:RemoveComponent("waterproofer")
30 scalewing:RemoveComponent("fueled")
31 scalewing:RemoveComponent("insulator")
32 scalewing:RemoveComponent("deployable")
33 scalewing:AddComponent("inventoryitem")
34 scalewing.components.inventoryitem:ChangeImageName("butterfly")
35 scalewing:AddComponent("named")
36 scalewing.components.named:SetName("Butterfly")
37 scalewing:AddComponent("follower")
38 scalewing.components.follower:SetLeader(GetPlayer())
39 scalewing:AddComponent("locomotor")
40 scalewing.components.locomotor.walkspeed = 8
41 scalewing:SetStateGraph("SGbutterfly")
42 local brain = require "brains/abigailbrain"
43 scalewing:SetBrain(brain)
44 scalewing:AddComponent("health")
45 scalewing.components.health:SetMaxHealth(10)
46 scalewing.components.health:SetInvincible(true)
47 scalewing:AddComponent("combat")
48 scalewing.components.combat:SetDefaultDamage(0)
49 scalewing.components.combat:SetRange(2)
50 scalewing.components.combat:SetAttackPeriod(0.5)
51 scalewing.components.combat:SetRetargetFunction(1, function(scalewing)
52 if not scalewing.components.health:IsDead() then
53 return FindEntity(GetPlayer(), 20, function(guy)
54 if guy.components.health and not guy.components.health:IsDead() then
55 return guy.components.combat.target == GetPlayer() or GetPlayer().components.combat.target == guy or guy.components.combat.target == scalewing or scalewing.components.combat.target == guy or guy:HasTag("monster")
56 end
57 end)
58 end
59 end )
60 scalewing.components.combat:SetKeepTargetFunction(function(scalewing, target) return target and target:IsValid() end )
61 scalewing:AddTag("duty")
62 scalewing.task = scalewing:DoPeriodicTask(0.5, function(scalewing)
63 local target = FindEntity(scalewing, 3, function(guy)
64 if guy.components.health and not guy.components.health:IsDead() then
65 return guy.components.combat.target == GetPlayer() or GetPlayer().components.combat.target == guy or guy.components.combat.target == scalewing or scalewing.components.combat.target == guy or guy:HasTag("monster")
66 end
67 end )
68 if target then
69 if target.components.combat then target.components.combat:SetTarget(scalewing) end
70 if target.components.locomotor then target.components.locomotor:Stop() end
71 SpawnPrefab("lightning_rod_fx").Transform:SetPosition(target.Transform:GetWorldPosition())
72 scalewing.SoundEmitter:PlaySound("dontstarve/common/lightningrod")
73 target.components.health:DoDelta(-100)
74 end
75 end )
76 scalewing.components.inventoryitem:SetOnDroppedFn(function(scalewing)
77 scalewing:AddTag("duty")
78 scalewing.Light:Enable(true)
79 scalewing.task = scalewing:DoPeriodicTask(0.5, function(scalewing)
80 local target = FindEntity(scalewing, 3, function(guy)
81 if guy.components.health and not guy.components.health:IsDead() then
82 return guy.components.combat.target == GetPlayer() or GetPlayer().components.combat.target == guy or guy.components.combat.target == scalewing or scalewing.components.combat.target == guy or guy:HasTag("monster")
83 end
84 end )
85 if target then
86 if target.components.combat then target.components.combat:SetTarget(scalewing) end
87 if target.components.locomotor then target.components.locomotor:Stop() end
88 SpawnPrefab("lightning_rod_fx").Transform:SetPosition(target.Transform:GetWorldPosition())
89 scalewing.SoundEmitter:PlaySound("dontstarve/common/lightningrod")
90 target.components.health:DoDelta(-100)
91 end
92 end )
93 end )
94 scalewing.components.inventoryitem:SetOnPickupFn(function(scalewing)
95 scalewing:RemoveTag("duty")
96 scalewing.Light:Enable(false)
97 if scalewing.task then scalewing.task:Cancel() scalewing.task = nil end
98 end )
99 scalewing.components.inventoryitem:SetOnPutInInventoryFn(function(scalewing)
100 scalewing:RemoveTag("duty")
101 scalewing.Light:Enable(false)
102 if scalewing.task then scalewing.task:Cancel() scalewing.task = nil end
103 end )
104 scalewing:AddTag("scalewings")
105 inst:Remove()
106end
107 inst:AddComponent("deployable")
108 inst.components.deployable.ondeploy = OnDeploy
109local function onsave(inst, data)
110 if inst:HasTag("scalewings") then
111 data.scalewings = true
112 end
113 if inst:HasTag("duty") then
114 data.duty = true
115 end
116end
117local function onload(inst, data)
118 if data and data.scalewings then
119 inst.AnimState:SetBank("butterfly")
120 inst.AnimState:SetBuild("butterfly_basic")
121 inst.AnimState:PlayAnimation("idle")
122 inst.AnimState:SetRayTestOnBB(true);
123 inst.Transform:SetTwoFaced()
124 inst.Transform:SetScale(1.5, 1.5, 1.5)
125 inst.AnimState:SetMultColour(255/255,0/255,115/255,0.8)
126 inst.AnimState:SetBloomEffectHandle("shaders/anim.ksh")
127 inst.entity:AddSoundEmitter()
128 local shadow = inst.entity:AddDynamicShadow()
129 shadow:SetSize(.8, .5)
130 RemovePhysicsColliders(inst)
131 inst.entity:AddLight()
132 inst.Light:SetFalloff(1)
133 inst.Light:SetIntensity(.8)
134 inst.Light:SetRadius(12)
135 inst.Light:SetColour(180/255, 195/255, 50/255)
136 inst.Light:Enable(true)
137 inst:RemoveComponent("inventoryitem")
138 inst:RemoveComponent("equippable")
139 inst:RemoveComponent("waterproofer")
140 inst:RemoveComponent("fueled")
141 inst:RemoveComponent("insulator")
142 inst:RemoveComponent("deployable")
143 inst:AddComponent("inventoryitem")
144 inst.components.inventoryitem:ChangeImageName("butterfly")
145 inst:AddComponent("named")
146 inst.components.named:SetName("Butterfly")
147 inst:AddComponent("follower")
148 inst.components.follower:SetLeader(GetPlayer())
149 inst:AddComponent("locomotor")
150 inst.components.locomotor.walkspeed = 8
151 inst:SetStateGraph("SGbutterfly")
152 local brain = require "brains/abigailbrain"
153 inst:SetBrain(brain)
154 inst:AddComponent("health")
155 inst.components.health:SetMaxHealth(10)
156 inst.components.health:SetInvincible(true)
157 inst:AddComponent("combat")
158 inst.components.combat:SetDefaultDamage(0)
159 inst.components.combat:SetRange(2)
160 inst.components.combat:SetAttackPeriod(0.5)
161 inst.components.combat:SetRetargetFunction(1, function(inst)
162 if not inst.components.health:IsDead() then
163 return FindEntity(GetPlayer(), 20, function(guy)
164 if guy.components.health and not guy.components.health:IsDead() then
165 return guy.components.combat.target == GetPlayer() or GetPlayer().components.combat.target == guy or guy.components.combat.target == inst or inst.components.combat.target == guy or guy:HasTag("monster")
166 end
167 end)
168 end
169 end )
170 inst.components.combat:SetKeepTargetFunction(function(inst, target) return target and target:IsValid() end )
171 inst.components.inventoryitem:SetOnDroppedFn(function(inst)
172 inst:AddTag("duty")
173 inst.Light:Enable(true)
174 inst.task = inst:DoPeriodicTask(0.5, function(inst)
175 local target = FindEntity(inst, 3, function(guy)
176 if guy.components.health and not guy.components.health:IsDead() then
177 return guy.components.combat.target == GetPlayer() or GetPlayer().components.combat.target == guy or guy.components.combat.target == inst or inst.components.combat.target == guy or guy:HasTag("monster")
178 end
179 end )
180 if target then
181 if target.components.combat then target.components.combat:SetTarget(inst) end
182 if target.components.locomotor then target.components.locomotor:Stop() end
183 SpawnPrefab("lightning_rod_fx").Transform:SetPosition(target.Transform:GetWorldPosition())
184 inst.SoundEmitter:PlaySound("dontstarve/common/lightningrod")
185 target.components.health:DoDelta(-100)
186 end
187 end )
188 end )
189 inst.components.inventoryitem:SetOnPickupFn(function(inst)
190 inst:RemoveTag("duty")
191 inst.Light:Enable(false)
192 if inst.task then inst.task:Cancel() inst.task = nil end
193 end )
194 inst.components.inventoryitem:SetOnPutInInventoryFn(function(inst)
195 inst:RemoveTag("duty")
196 inst.Light:Enable(false)
197 if inst.task then inst.task:Cancel() inst.task = nil end
198 end )
199 inst:AddTag("scalewings")
200 end
201 if data and data.duty then
202 inst:AddTag("duty")
203 inst.task = inst:DoPeriodicTask(0.5, function(inst)
204 local target = FindEntity(inst, 3, function(guy)
205 if guy.components.health and not guy.components.health:IsDead() then
206 return guy.components.combat.target == GetPlayer() or GetPlayer().components.combat.target == guy or guy.components.combat.target == inst or inst.components.combat.target == guy or guy:HasTag("monster")
207 end
208 end )
209 if target then
210 if target.components.combat then target.components.combat:SetTarget(inst) end
211 if target.components.locomotor then target.components.locomotor:Stop() end
212 SpawnPrefab("lightning_rod_fx").Transform:SetPosition(target.Transform:GetWorldPosition())
213 inst.SoundEmitter:PlaySound("dontstarve/common/lightningrod")
214 target.components.health:DoDelta(-100)
215 end
216 end )
217 end
218end
219 inst.OnSave = onsave
220 inst.OnLoad = onload
221
222 即可用雨衣种天使蝴蝶,会跟随你,为你照亮。任何企图攻击你的敌人,都会遭到天使蝴蝶的电击,杀伤其生命值,并阻止其靠近你。鼠标左键点击天使蝴蝶,可收入物品栏,显示为蝴蝶图标。不想要天使蝴蝶了,在物品栏中对其按鼠标右键即可。雨衣在穿戴选项(画着礼帽)下,用2个触手皮、2个绳子、2个硬骨头制造