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

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



三一0.疯狂躲避球(用浣熊尾巴种躲避球场,在圈内60秒不被球打到,赢50个黄金)

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

local function makecourt(inst)
	local pt = inst:GetPosition()
	local caddie = SpawnPrefab("coontail")
	caddie.Transform:SetPosition(pt.x, pt.y, pt.z)
	caddie.AnimState:SetBank("wilson")
	caddie.AnimState:SetBuild("wes")
	caddie.AnimState:OverrideSymbol("swap_hat", "hat_football", "swap_hat")
	caddie.AnimState:OverrideSymbol("swap_body", "armor_sweatervest", "swap_body")
	caddie.AnimState:Show("HAT")
	caddie.AnimState:Show("HAT_HAIR")
	caddie.AnimState:Hide("HAIR_NOHAT")
	caddie.AnimState:Hide("HAIR")
	caddie.AnimState:Hide("ARM_carry")
	caddie.AnimState:Show("ARM_normal")
	caddie.Transform:SetFourFaced()
	caddie.AnimState:PlayAnimation("idle")
	caddie:RemoveComponent("inventoryitem")
	caddie:RemoveComponent("stackable")
	caddie:RemoveComponent("deployable")
	caddie:RemoveTag("cattoy")
	caddie:AddComponent("workable")
	caddie.components.workable:SetWorkAction(ACTIONS.HAMMER)
	caddie.components.workable:SetWorkLeft(1)
	caddie.components.workable:SetOnFinishCallback(function(caddie)
		SpawnPrefab("collapse_big").Transform:SetPosition(caddie.Transform:GetWorldPosition())
		GetPlayer().SoundEmitter:PlaySound("dontstarve/common/destroy_wood")
		GetPlayer().SoundEmitter:KillSound("beavermusic")
		local pos = Vector3(caddie.Transform:GetWorldPosition())
		local ents = TheSim:FindEntities(pos.x,pos.y,pos.z, 10)
		for k,v in pairs(ents) do
			if v:HasTag("border") or v:HasTag("landmine") then
			   SpawnPrefab("collapse_big").Transform:SetPosition(v.Transform:GetWorldPosition())
			   v:Remove()
			end
		end
		caddie:Remove()
	end )
	caddie:AddComponent("named")
	caddie.components.named:SetName("Pitcher")
	caddie:AddComponent("talker")
	caddie:AddComponent("trader")
	caddie.components.trader:SetAcceptTest(function(caddie, item)
		if not caddie:HasTag("startgame") then
		   if GetPlayer().components.inventory:Has("goldnugget", 10) then
			  if item.prefab == "goldnugget" then
				 return true
			  end
		   end
		end
		return false
	end )
	caddie.components.trader.onaccept = function(caddie, giver, item)
		caddie:AddTag("startgame")
		GetPlayer().components.inventory:ConsumeByName("goldnugget", 9)
		GetPlayer().SoundEmitter:PlaySound("dontstarve/HUD/research_available")
		caddie.components.talker:Say("Are you ready ?", 3, false)
		GetPlayer().SoundEmitter:PlaySound("dontstarve/music/music_hoedown", "beavermusic")
		for k = 1, 10 do
			local landmine = SpawnPrefab("coontail")
			landmine.Transform:SetPosition(pt.x+(math.random(7)-math.random(7)), 0, pt.z+(math.random(7)-math.random(7)))
			landmine.AnimState:SetBank("bee_mine")
			landmine.AnimState:SetBuild("bee_mine")
			landmine.AnimState:PlayAnimation("idle")
			landmine.Transform:SetScale(1.2, 1.2, 1.2)
			landmine.AnimState:SetMultColour(255/255,105/255,0/255,1)
			landmine.AnimState:SetBloomEffectHandle("shaders/anim.ksh")
			landmine:RemoveComponent("inventoryitem")
			landmine:RemoveComponent("stackable")
			landmine:RemoveComponent("deployable")
			landmine:RemoveTag("cattoy")
			landmine.persists = false
		landmine:DoPeriodicTask(0.01, function()
				local pos0 = Vector3(landmine.Transform:GetWorldPosition())
				local ents0 = TheSim:FindEntities(pos0.x,pos0.y,pos0.z, 1)
				for k,v in pairs(ents0) do
					if v and v:HasTag("player") and not v:HasTag("pain")then
					   v:AddTag("pain")
					   v.sg:GoToState("hit")
					   if v.components.health then v.components.health:DoDelta(-3) end
					   v:DoTaskInTime(0.5, function() v:RemoveTag("pain") end )
					end
				end
		end )
			landmine:AddTag("landmine")
		end
		caddie:DoTaskInTime(3, function()
			caddie.components.talker:Say("Go !", 1, false)
			GetPlayer().SoundEmitter:PlaySound("dontstarve/wilson/equip_item_gold")
			caddie.task = caddie:DoPeriodicTask(0.4, function(caddie)
				local target = FindEntity(caddie, 9, function(guy) 
					return guy:HasTag("player")
				end )
				if target then
				   caddie.Transform:SetRotation(GetPlayer().Transform:GetRotation() - 180)
				   caddie.AnimState:PlayAnimation("give")
				   local dodgeball = SpawnPrefab("coontail")
				   dodgeball.AnimState:SetBank("bulb")
				   dodgeball.AnimState:SetBuild("bulb")
				   dodgeball.AnimState:PlayAnimation("idle")
				   dodgeball.Transform:SetPosition(pt.x, 0, pt.z)
				   dodgeball:RemoveComponent("inventoryitem")
				   dodgeball:RemoveComponent("stackable")
				   dodgeball:RemoveComponent("deployable")
				   dodgeball:RemoveTag("cattoy")
				   dodgeball.persists = false
			   dodgeball:AddComponent("complexprojectile")
			   dodgeball.components.complexprojectile.yOffset = 1
				   if math.random()<.5 then
					  local targetpos = target:GetPosition()
					  dodgeball.components.complexprojectile:Launch(targetpos)
				   else
					  dodgeball.components.complexprojectile:Launch(Point(pt.x+(math.random(9)-math.random(9)), 0, pt.z+(math.random(9)-math.random(9))))
				   end
			   dodgeball.components.complexprojectile:SetOnHit(function()
					   SpawnPrefab("small_puff").Transform:SetPosition(dodgeball.Transform:GetWorldPosition())
					   dodgeball:Remove()
				   end )
			   dodgeball:DoPeriodicTask(0.01, function()
					   local pos = Vector3(dodgeball.Transform:GetWorldPosition())
					   local ents = TheSim:FindEntities(pos.x,pos.y,pos.z, 1)
					   for k,v in pairs(ents) do
						   if v and v:HasTag("player") then
							  v.sg:GoToState("hit")
							  if caddie.task then caddie.task:Cancel() caddie.task = nil end
							  if caddie.task2 then caddie.task2:Cancel() caddie.task2 = nil end
							  caddie.Transform:SetRotation( 0 )
							  caddie.AnimState:PlayAnimation("idle_onemanband1_loop",true)
							  caddie:DoTaskInTime(2, function() caddie.AnimState:PlayAnimation("idle") end )
							  caddie.components.talker:Say("Game over !", 3, false)
							  GetPlayer().SoundEmitter:PlaySound("dontstarve/creatures/eyeballturret/shotexplo")
							  GetPlayer().SoundEmitter:KillSound("beavermusic")
							  SpawnPrefab("collapse_small").Transform:SetPosition(dodgeball.Transform:GetWorldPosition())
							  dodgeball:Remove()
							  local pos1 = Vector3(caddie.Transform:GetWorldPosition())
							  local ents1 = TheSim:FindEntities(pos1.x,pos1.y,pos1.z, 10)
							  for k,v in pairs(ents1) do
								  if v:HasTag("landmine") then
									 v:Remove()
								  end
							  end
							  caddie:RemoveTag("startgame")
						   end
					   end
			   end )
				else
				   if caddie.task then caddie.task:Cancel() caddie.task = nil end
				   if caddie.task2 then caddie.task2:Cancel() caddie.task2 = nil end
				   caddie.Transform:SetRotation( 0 )
				   caddie.AnimState:PlayAnimation("idle_onemanband1_loop",true)
				   caddie:DoTaskInTime(2, function() caddie.AnimState:PlayAnimation("idle") end )
				   caddie.components.talker:Say("Game over !", 3, false)
				   GetPlayer().SoundEmitter:PlaySound("dontstarve/creatures/eyeballturret/shotexplo")
				   GetPlayer().SoundEmitter:KillSound("beavermusic")
				   local pos1 = Vector3(caddie.Transform:GetWorldPosition())
				   local ents1 = TheSim:FindEntities(pos1.x,pos1.y,pos1.z, 10)
				   for k,v in pairs(ents1) do
					   if v:HasTag("landmine") then
						  v:Remove()
					   end
				   end
				   caddie:RemoveTag("startgame")
				end
			end )
		end )
		caddie.task2 = caddie:DoTaskInTime(63, function()
			if caddie:HasTag("startgame") then
			   if caddie.task then caddie.task:Cancel() caddie.task = nil end
			   if caddie.task2 then caddie.task2:Cancel() caddie.task2 = nil end
			   caddie.Transform:SetRotation( 0 )
			   caddie.AnimState:PlayAnimation("give")
			   caddie.components.talker:Say("You win !", 3, false)
			   GetPlayer().SoundEmitter:KillSound("beavermusic")
			   caddie:StartThread(function()
				   for k = 1, 10 do
					   GetPlayer().SoundEmitter:PlaySound("dontstarve/wilson/equip_item_gold")
					   Sleep(0.15)
				   end
			   end )
			   for k = 1, 50 do
				   local goldnugget = SpawnPrefab("goldnugget")
				   GetPlayer().components.inventory:GiveItem(goldnugget)
			   end
			   local pos1 = Vector3(caddie.Transform:GetWorldPosition())
			   local ents1 = TheSim:FindEntities(pos1.x,pos1.y,pos1.z, 10)
			   for k,v in pairs(ents1) do
				   if v:HasTag("landmine") then
					  v:Remove()
				   end
			   end
			   caddie:RemoveTag("startgame")
			end
		end )
	end
	caddie:AddTag("caddie")
	for k = 1, 50 do
		local result_offset = FindValidPositionByFan(1 * 2 * PI, 8.5, 50, function(offset)
			local x,y,z = (pt + offset):Get()
			local ents = TheSim:FindEntities(x,y,z , 1)
			return not next(ents) 
		end)
		if result_offset then
		   local border = SpawnPrefab("coontail")
		   border.Transform:SetPosition((pt + result_offset):Get())
		   border.AnimState:SetBank("bulb")
		   border.AnimState:SetBuild("bulb")
		   border.AnimState:PlayAnimation("idle")
		   border.Transform:SetScale(1.2, 1.2, 1.2)
		   border.AnimState:SetMultColour(255/255,0/255,0/255,1)
		   border.AnimState:SetOrientation( ANIM_ORIENTATION.OnGround )
		   border.AnimState:SetLayer( LAYER_BACKGROUND )
		   border.AnimState:SetSortOrder( 1 )
		   border:RemoveComponent("inventoryitem")
		   border:RemoveComponent("stackable")
		   border:RemoveComponent("deployable")
		   border:RemoveTag("cattoy")
		   border:DoPeriodicTask(2, function(shopsign)
			   border.AnimState:SetMultColour(0/255,255/255,0/255,1)
			   border:DoTaskInTime(1, function() border.AnimState:SetMultColour(255/255,0/255,0/255,1) end )
		   end )
		   border:AddTag("NOCLICK")
		   border:AddTag("border")
		end
	end
end
local function OnDeploy (inst, pt)
	makecourt(inst)
	inst.components.stackable:Get():Remove()
end
	inst:AddComponent("deployable")
	inst.components.deployable.ondeploy = OnDeploy
local function onsave(inst, data)
	if inst:HasTag("caddie") then
	   data.caddie = true
	end
	if inst:HasTag("border") then
	   data.border = true
	end
end
local function onload(inst, data)
  if data and data.caddie then
	 makecourt(inst)
	 inst:Remove()
  end
  if data and data.border then
	 inst:Remove()
  end
end
	inst.OnSave = onsave
	inst.OnLoad = onload

	即可在空旷的地上,用浣熊尾巴种躲避球场(拿着1个浣熊尾巴对地面点鼠标右键,如果拿着多个,则不会种出来)。给投手10个黄金玩一次(拿着黄金对投手点鼠标左键),他会不断向你扔球,在不跑出圆圈边界、不被砸到的情况下,坚持60秒,就可赢得50个黄金的奖励。球场内会随机出现障碍物,碰到会被扎伤(减3点血),绕着点跑吧。不想要躲避球场了,用锤子砸投手即可