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

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



二.天使蝴蝶(用雨衣种天使蝴蝶,为你照亮,电击来犯之敌,可收入物品栏)

	用MT管理器打开游戏目录/assets/DLC0002/scripts/prefabs/raincoat.lua文件,在inst:AddComponent("inspectable")的下一行插入以下内容:

local function OnDeploy (inst, pt)
	local scalewing = SpawnPrefab("raincoat")
	scalewing.Transform:SetPosition(pt.x, pt.y, pt.z)
	scalewing.AnimState:SetBank("butterfly")
	scalewing.AnimState:SetBuild("butterfly_basic")
	scalewing.AnimState:PlayAnimation("idle")
	scalewing.AnimState:SetRayTestOnBB(true);
	scalewing.Transform:SetTwoFaced()
	scalewing.Transform:SetScale(1.5, 1.5, 1.5)
	scalewing.AnimState:SetMultColour(255/255,0/255,115/255,0.8)
	scalewing.AnimState:SetBloomEffectHandle("shaders/anim.ksh")
	scalewing.entity:AddSoundEmitter()
	local shadow = scalewing.entity:AddDynamicShadow()
	shadow:SetSize(.8, .5)
	RemovePhysicsColliders(scalewing)
	scalewing.entity:AddLight()
	scalewing.Light:SetFalloff(1)
	scalewing.Light:SetIntensity(.8)
	scalewing.Light:SetRadius(12)
	scalewing.Light:SetColour(180/255, 195/255, 50/255)
	scalewing.Light:Enable(true)
	scalewing:RemoveComponent("inventoryitem")
	scalewing:RemoveComponent("equippable")
	scalewing:RemoveComponent("waterproofer")
	scalewing:RemoveComponent("fueled")
	scalewing:RemoveComponent("insulator")
	scalewing:RemoveComponent("deployable")
	scalewing:AddComponent("inventoryitem")
	scalewing.components.inventoryitem:ChangeImageName("butterfly")
	scalewing:AddComponent("named")
	scalewing.components.named:SetName("Butterfly")
	scalewing:AddComponent("follower")
	scalewing.components.follower:SetLeader(GetPlayer())
	scalewing:AddComponent("locomotor")
	scalewing.components.locomotor.walkspeed = 8
	scalewing:SetStateGraph("SGbutterfly")
	local brain = require "brains/abigailbrain"
	scalewing:SetBrain(brain)
	scalewing:AddComponent("health")
	scalewing.components.health:SetMaxHealth(10)
	scalewing.components.health:SetInvincible(true)
	scalewing:AddComponent("combat")
	scalewing.components.combat:SetDefaultDamage(0)
	scalewing.components.combat:SetRange(2)
	scalewing.components.combat:SetAttackPeriod(0.5)
	scalewing.components.combat:SetRetargetFunction(1, function(scalewing)
		if not scalewing.components.health:IsDead() then
			return FindEntity(GetPlayer(), 20, function(guy)
				if guy.components.health and not guy.components.health:IsDead() then
				   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")
				end
			end)
		end
	end )
	scalewing.components.combat:SetKeepTargetFunction(function(scalewing, target) return target and target:IsValid() end )
	scalewing:AddTag("duty")
	scalewing.task = scalewing:DoPeriodicTask(0.5, function(scalewing)
		local target = FindEntity(scalewing, 3, function(guy)
			if guy.components.health and not guy.components.health:IsDead() then
			   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")
			end
		end )
		if target then
		   if target.components.combat then target.components.combat:SetTarget(scalewing) end
		   if target.components.locomotor then target.components.locomotor:Stop() end
		   SpawnPrefab("lightning_rod_fx").Transform:SetPosition(target.Transform:GetWorldPosition())
		   scalewing.SoundEmitter:PlaySound("dontstarve/common/lightningrod")
		   target.components.health:DoDelta(-100)
		end
	end )
	scalewing.components.inventoryitem:SetOnDroppedFn(function(scalewing)
		scalewing:AddTag("duty")
		scalewing.Light:Enable(true)
		scalewing.task = scalewing:DoPeriodicTask(0.5, function(scalewing)
			local target = FindEntity(scalewing, 3, function(guy)
				if guy.components.health and not guy.components.health:IsDead() then
				   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")
				end
			end )
			if target then
			   if target.components.combat then target.components.combat:SetTarget(scalewing) end
			   if target.components.locomotor then target.components.locomotor:Stop() end
			   SpawnPrefab("lightning_rod_fx").Transform:SetPosition(target.Transform:GetWorldPosition())
			   scalewing.SoundEmitter:PlaySound("dontstarve/common/lightningrod")
			   target.components.health:DoDelta(-100)
			end
		end )
	end )
	scalewing.components.inventoryitem:SetOnPickupFn(function(scalewing)
		scalewing:RemoveTag("duty")
		scalewing.Light:Enable(false)
		if scalewing.task then scalewing.task:Cancel() scalewing.task = nil end
	end )
	scalewing.components.inventoryitem:SetOnPutInInventoryFn(function(scalewing)
		scalewing:RemoveTag("duty")
		scalewing.Light:Enable(false)
		if scalewing.task then scalewing.task:Cancel() scalewing.task = nil end
	end )
	scalewing:AddTag("scalewings")
	inst:Remove()
end
	inst:AddComponent("deployable")
	inst.components.deployable.ondeploy = OnDeploy
local function onsave(inst, data)
	if inst:HasTag("scalewings") then
		data.scalewings = true
	end
	if inst:HasTag("duty") then
		data.duty = true
	end
end
local function onload(inst, data)
  if data and data.scalewings then
	inst.AnimState:SetBank("butterfly")
	inst.AnimState:SetBuild("butterfly_basic")
	inst.AnimState:PlayAnimation("idle")
	inst.AnimState:SetRayTestOnBB(true);
	inst.Transform:SetTwoFaced()
	inst.Transform:SetScale(1.5, 1.5, 1.5)
	inst.AnimState:SetMultColour(255/255,0/255,115/255,0.8)
	inst.AnimState:SetBloomEffectHandle("shaders/anim.ksh")
	inst.entity:AddSoundEmitter()
	local shadow = inst.entity:AddDynamicShadow()
	shadow:SetSize(.8, .5)
	RemovePhysicsColliders(inst)
	inst.entity:AddLight()
	inst.Light:SetFalloff(1)
	inst.Light:SetIntensity(.8)
	inst.Light:SetRadius(12)
	inst.Light:SetColour(180/255, 195/255, 50/255)
	inst.Light:Enable(true)
	inst:RemoveComponent("inventoryitem")
	inst:RemoveComponent("equippable")
	inst:RemoveComponent("waterproofer")
	inst:RemoveComponent("fueled")
	inst:RemoveComponent("insulator")
	inst:RemoveComponent("deployable")
	inst:AddComponent("inventoryitem")
	inst.components.inventoryitem:ChangeImageName("butterfly")
	inst:AddComponent("named")
	inst.components.named:SetName("Butterfly")
	inst:AddComponent("follower")
	inst.components.follower:SetLeader(GetPlayer())
	inst:AddComponent("locomotor")
	inst.components.locomotor.walkspeed = 8
	inst:SetStateGraph("SGbutterfly")
	local brain = require "brains/abigailbrain"
	inst:SetBrain(brain)
	inst:AddComponent("health")
	inst.components.health:SetMaxHealth(10)
	inst.components.health:SetInvincible(true)
	inst:AddComponent("combat")
	inst.components.combat:SetDefaultDamage(0)
	inst.components.combat:SetRange(2)
	inst.components.combat:SetAttackPeriod(0.5)
	inst.components.combat:SetRetargetFunction(1, function(inst)
		if not inst.components.health:IsDead() then
			return FindEntity(GetPlayer(), 20, function(guy)
				if guy.components.health and not guy.components.health:IsDead() then
				   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")
				end
			end)
		end
	end )
	inst.components.combat:SetKeepTargetFunction(function(inst, target) return target and target:IsValid() end )
	inst.components.inventoryitem:SetOnDroppedFn(function(inst)
		inst:AddTag("duty")
		inst.Light:Enable(true)
		inst.task = inst:DoPeriodicTask(0.5, function(inst)
			local target = FindEntity(inst, 3, function(guy)
				if guy.components.health and not guy.components.health:IsDead() then
				   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")
				end
			end )
			if target then
			   if target.components.combat then target.components.combat:SetTarget(inst) end
			   if target.components.locomotor then target.components.locomotor:Stop() end
			   SpawnPrefab("lightning_rod_fx").Transform:SetPosition(target.Transform:GetWorldPosition())
			   inst.SoundEmitter:PlaySound("dontstarve/common/lightningrod")
			   target.components.health:DoDelta(-100)
			end
		end )
	end )
	inst.components.inventoryitem:SetOnPickupFn(function(inst)
		inst:RemoveTag("duty")
		inst.Light:Enable(false)
		if inst.task then inst.task:Cancel() inst.task = nil end
	end )
	inst.components.inventoryitem:SetOnPutInInventoryFn(function(inst)
		inst:RemoveTag("duty")
		inst.Light:Enable(false)
		if inst.task then inst.task:Cancel() inst.task = nil end
	end )
	inst:AddTag("scalewings")
  end
  if data and data.duty then
	inst:AddTag("duty")
	inst.task = inst:DoPeriodicTask(0.5, function(inst)
		local target = FindEntity(inst, 3, function(guy)
			if guy.components.health and not guy.components.health:IsDead() then
			   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")
			end
		end )
		if target then
		   if target.components.combat then target.components.combat:SetTarget(inst) end
		   if target.components.locomotor then target.components.locomotor:Stop() end
		   SpawnPrefab("lightning_rod_fx").Transform:SetPosition(target.Transform:GetWorldPosition())
		   inst.SoundEmitter:PlaySound("dontstarve/common/lightningrod")
		   target.components.health:DoDelta(-100)
		end
	end )
  end
end
	inst.OnSave = onsave
	inst.OnLoad = onload

	即可用雨衣种天使蝴蝶,会跟随你,为你照亮。任何企图攻击你的敌人,都会遭到天使蝴蝶的电击,杀伤其生命值,并阻止其靠近你。鼠标左键点击天使蝴蝶,可收入物品栏,显示为蝴蝶图标。不想要天使蝴蝶了,在物品栏中对其按鼠标右键即可。雨衣在穿戴选项(画着礼帽)下,用2个触手皮、2个绳子、2个硬骨头制造