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

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



二六九.公车站(用草席卷种公车站,买票坐到下一站)

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

	inst.kind = ""
	inst.soundpath   = "dontstarve/creatures/rook/"
	inst.effortsound = "dontstarve/creatures/rook/steam"
local function OnDeploy (inst, pt)
	local busstation = SpawnPrefab("bedroll_straw")
	busstation.Transform:SetPosition(pt.x, pt.y, pt.z)
	busstation.AnimState:SetBank("sign_home")
	busstation.AnimState:SetBuild("sign_home")
	busstation.AnimState:PlayAnimation("idle")
	busstation.Transform:SetScale(1.5, 1.5, 1.5)
	busstation.AnimState:SetMultColour(255/255,105/255,0/255,0.8)
	local minimap = busstation.entity:AddMiniMapEntity()
	minimap:SetIcon( "sign.png" )
	busstation:RemoveComponent("inventoryitem")
	busstation:RemoveComponent("stackable")
	busstation:RemoveComponent("fuel")
	busstation:RemoveComponent("sleepingbag")
	busstation:RemoveComponent("burnable")
	busstation:RemoveComponent("propagator")
	busstation:RemoveComponent("deployable")
	busstation:AddTag("busstation")
	busstation:AddComponent("workable")
	busstation.components.workable:SetWorkAction(ACTIONS.HAMMER)
	busstation.components.workable:SetWorkLeft(3)
	busstation.components.workable:SetOnFinishCallback(function(busstation)
		SpawnPrefab("collapse_big").Transform:SetPosition(busstation.Transform:GetWorldPosition())
		GetPlayer().SoundEmitter:PlaySound("dontstarve/common/destroy_wood")
		busstation:Remove()
	end )
	busstation:AddComponent("trader")
	busstation.components.trader:SetAcceptTest(function(busstation, item) 
	   if item.prefab == "goldnugget" then
		  return true
	   end
	   return false
	end )
	busstation.components.trader.onaccept = function(busstation, giver, item)
		busstation:AddTag("startingpoint")
		local target = FindEntity(busstation, 3000, function(guy) 
			return guy:HasTag("busstation") and not guy:HasTag("startingpoint")
		end )
		if target then
		   GetPlayer().SoundEmitter:PlaySound("dontstarve/wilson/equip_item_gold")
		   GetPlayer().components.playercontroller:Enable(false)
		   local pt1 = busstation:GetPosition()
		   local bus = SpawnPrefab("bedroll_straw")
		   bus.Transform:SetPosition(pt1.x+15+2, 0, pt1.z-15+2)
		   bus.AnimState:SetBank("rook")
		   bus.AnimState:SetBuild("rook_build")
		   bus.AnimState:PlayAnimation("idle", true)
		   bus.Transform:SetFourFaced()
		   bus.Transform:SetScale(1.2, 1.2, 1.2)
		   bus.AnimState:SetMultColour(255/255,105/255,0/255,1)
		   local sound = bus.entity:AddSoundEmitter()
		   bus:RemoveComponent("inventoryitem")
		   bus:RemoveComponent("stackable")
		   bus:RemoveComponent("fuel")
		   bus:RemoveComponent("sleepingbag")
		   bus:RemoveComponent("burnable")
		   bus:RemoveComponent("propagator")
		   bus:RemoveComponent("deployable")
		   bus:AddTag("goodbye")
		   bus:AddComponent("locomotor")
		   bus.components.locomotor.walkspeed = 5
		   bus.components.locomotor.runspeed =  10
		   bus:SetStateGraph("SGrook")
		   bus:AddComponent("health")
		   bus.components.health:SetMaxHealth(1000)
		   bus.components.health:SetInvincible(true)
		   bus:AddComponent("combat")
		   bus:AddComponent("follower")
		   bus:AddComponent("knownlocations")
		   bus:DoTaskInTime(1, function()
			   bus.components.locomotor:GoToPoint(Point(pt1.x+2, 0, pt1.z+2))
		   end )
		   bus:DoTaskInTime(9, function()
			   GetPlayer():Hide()
			   GetPlayer().components.health:SetInvincible(true)
			   local shadow = GetPlayer().entity:AddDynamicShadow()
			   shadow:SetSize( 0, 0 )
			   bus.components.locomotor:GoToPoint(Point(pt1.x-15+2, 0, pt1.z+15+2))
		   end )
		   GetPlayer():DoTaskInTime(15, function()
			   TheFrontEnd:Fade(false,1)
			   bus:Remove()
			   GetPlayer().Transform:SetPosition(target.Transform:GetWorldPosition())
			   GetPlayer():DoTaskInTime(2, function()
				   TheFrontEnd:Fade(true,1)
				   busstation:RemoveTag("startingpoint")
				   GetPlayer():Show()
				   GetPlayer().components.health:SetInvincible(false)
				   GetPlayer().components.playercontroller:Enable(true)
				   local shadow = GetPlayer().entity:AddDynamicShadow()
				   shadow:SetSize( 1.3, .6 )
			   end )
		   end )
		else
		   SpawnPrefab("goldnugget").Transform:SetPosition(GetPlayer().Transform:GetWorldPosition())
		   busstation:RemoveTag("startingpoint")
		end
	end
	inst.components.stackable:Get():Remove()
end
	inst:AddComponent("deployable")
	inst.components.deployable.ondeploy = OnDeploy
local function onsave(inst, data)
	if inst:HasTag("goodbye") then
		data.goodbye = true
	end
	if inst:HasTag("busstation") then
		data.busstation = true
	end
end
local function onload(inst, data)
  if data and data.goodbye then
	 inst:Remove()
  end
  if data and data.busstation then
	inst.AnimState:SetBank("sign_home")
	inst.AnimState:SetBuild("sign_home")
	inst.AnimState:PlayAnimation("idle")
	inst.Transform:SetScale(1.5, 1.5, 1.5)
	inst.AnimState:SetMultColour(255/255,105/255,0/255,0.8)
	local minimap = inst.entity:AddMiniMapEntity()
	minimap:SetIcon( "sign.png" )
	inst:RemoveComponent("inventoryitem")
	inst:RemoveComponent("stackable")
	inst:RemoveComponent("fuel")
	inst:RemoveComponent("sleepingbag")
	inst:RemoveComponent("burnable")
	inst:RemoveComponent("propagator")
	inst:RemoveComponent("deployable")
	inst:AddTag("busstation")
	inst:AddComponent("workable")
	inst.components.workable:SetWorkAction(ACTIONS.HAMMER)
	inst.components.workable:SetWorkLeft(3)
	inst.components.workable:SetOnFinishCallback(function(inst)
		SpawnPrefab("collapse_big").Transform:SetPosition(inst.Transform:GetWorldPosition())
		GetPlayer().SoundEmitter:PlaySound("dontstarve/common/destroy_wood")
		inst:Remove()
	end )
	inst:AddComponent("trader")
	inst.components.trader:SetAcceptTest(function(inst, item) 
	   if item.prefab == "goldnugget" then
		  return true
	   end
	   return false
	end )
	inst.components.trader.onaccept = function(inst, giver, item)
		inst:AddTag("startingpoint")
		local target = FindEntity(inst, 3000, function(guy) 
			return guy:HasTag("busstation") and not guy:HasTag("startingpoint")
		end )
		if target then
		   GetPlayer().SoundEmitter:PlaySound("dontstarve/wilson/equip_item_gold")
		   GetPlayer().components.playercontroller:Enable(false)
		   local pt1 = inst:GetPosition()
		   local bus = SpawnPrefab("bedroll_straw")
		   bus.Transform:SetPosition(pt1.x+15+2, 0, pt1.z-15+2)
		   bus.AnimState:SetBank("rook")
		   bus.AnimState:SetBuild("rook_build")
		   bus.AnimState:PlayAnimation("idle", true)
		   bus.Transform:SetFourFaced()
		   bus.Transform:SetScale(1.2, 1.2, 1.2)
		   bus.AnimState:SetMultColour(255/255,105/255,0/255,1)
		   local sound = bus.entity:AddSoundEmitter()
		   bus:RemoveComponent("inventoryitem")
		   bus:RemoveComponent("stackable")
		   bus:RemoveComponent("fuel")
		   bus:RemoveComponent("sleepingbag")
		   bus:RemoveComponent("burnable")
		   bus:RemoveComponent("propagator")
		   bus:RemoveComponent("deployable")
		   bus:AddTag("goodbye")
		   bus:AddComponent("locomotor")
		   bus.components.locomotor.walkspeed = 5
		   bus.components.locomotor.runspeed =  10
		   bus:SetStateGraph("SGrook")
		   bus:AddComponent("health")
		   bus.components.health:SetMaxHealth(1000)
		   bus.components.health:SetInvincible(true)
		   bus:AddComponent("combat")
		   bus:AddComponent("follower")
		   bus:AddComponent("knownlocations")
		   bus:DoTaskInTime(1, function()
			   bus.components.locomotor:GoToPoint(Point(pt1.x+2, 0, pt1.z+2))
		   end )
		   bus:DoTaskInTime(9, function()
			   GetPlayer():Hide()
			   GetPlayer().components.health:SetInvincible(true)
			   local shadow = GetPlayer().entity:AddDynamicShadow()
			   shadow:SetSize( 0, 0 )
			   bus.components.locomotor:GoToPoint(Point(pt1.x-15+2, 0, pt1.z+15+2))
		   end )
		   GetPlayer():DoTaskInTime(15, function()
			   TheFrontEnd:Fade(false,1)
			   bus:Remove()
			   GetPlayer().Transform:SetPosition(target.Transform:GetWorldPosition())
			   GetPlayer():DoTaskInTime(2, function()
				   TheFrontEnd:Fade(true,1)
				   inst:RemoveTag("startingpoint")
				   GetPlayer():Show()
				   GetPlayer().components.health:SetInvincible(false)
				   GetPlayer().components.playercontroller:Enable(true)
				   local shadow = GetPlayer().entity:AddDynamicShadow()
				   shadow:SetSize( 1.3, .6 )
			   end )
		   end )
		else
		   SpawnPrefab("goldnugget").Transform:SetPosition(GetPlayer().Transform:GetWorldPosition())
		   inst:RemoveTag("startingpoint")
		end
	end
  end
end
	inst.OnSave = onsave
	inst.OnLoad = onload

	即可在地图的任意两个地点,用草席卷种公车站,给站牌1个黄金(拿着黄金对站牌点鼠标左键),会来公共汽车送你到另一个站牌,方便在两点间快速移动。公车站须种在空旷的地方,以便公共汽车行驶。如果只种了一个公车站,则站牌不会接受你的黄金。公车站在小地图上显示为路牌的图标。不想要公车站时,用锤子砸掉即可。草席卷在生存选项下(画着绳套)下,用6个草、1个绳子制造