YN202-天使蝴蝶(用雨衣种天使蝴蝶,为你照亮,电击来犯之敌,可收入物品栏)
代码来源于“易宁”大佬的分享,仅供学习,不要直接复制粘贴。 原帖链接: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个硬骨头制造