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

原帖链接:http://bbs.3dmgame.com/thread-3859071-1-1.html


  1
  2.天使蝴蝶(用雨衣种天使蝴蝶,为你照亮,电击来犯之敌,可收入物品栏)
  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个硬骨头制造