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

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



二九六.企鹅养殖场(用蜂巢种企鹅养殖场,买小企鹅,养大后卖出赚黄金)

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

local function penguinshop(inst)
	local pt = inst:GetPosition()
	local peddler = SpawnPrefab("honeycomb")
	peddler.Transform:SetPosition(pt.x, pt.y, pt.z)
	peddler.AnimState:SetBank("wilson")
	peddler.AnimState:SetBuild("willow")
	peddler.AnimState:OverrideSymbol("swap_hat", "hat_straw", "swap_hat")
	peddler.AnimState:Show("HAT")
	peddler.AnimState:Show("HAT_HAIR")
	peddler.AnimState:Hide("HAIR_NOHAT")
	peddler.AnimState:Hide("HAIR")
	peddler.AnimState:OverrideSymbol("swap_body", "armor_grass", "swap_body")
	peddler.AnimState:Hide("ARM_carry") 
	peddler.AnimState:Show("ARM_normal") 
	peddler.Transform:SetFourFaced()
	peddler.AnimState:PlayAnimation("idle")
	peddler:AddTag("peddler")
	peddler:RemoveComponent("stackable")
	peddler:RemoveComponent("tradable")
	peddler:RemoveComponent("inventoryitem")
	local light = peddler.entity:AddLight()
	light:SetFalloff(1)
	light:SetIntensity(.8)
	light:SetRadius(10)
	light:SetColour(180/255, 195/255, 50/255)
	light:Enable(true)
	MakeLargeBurnable(peddler)
	MakeLargePropagator(peddler)
	peddler.components.inspectable.getstatus = function(peddler)
		peddler.AnimState:PlayAnimation("give")
		GetPlayer().SoundEmitter:PlaySound("dontstarve/HUD/get_gold")
		local pos = Vector3(peddler.Transform:GetWorldPosition())
		local ents = TheSim:FindEntities(pos.x,pos.y,pos.z, 10)
		for k,v in pairs(ents) do
			if v:HasTag("penguin_2") then
			   for k = 1, 20 do
				   SpawnPrefab("goldnugget").Transform:SetPosition(v.Transform:GetWorldPosition())
			   end
			   v:Remove()
			end
		end
	end
	peddler:AddComponent("trader")
	peddler.components.trader:SetAcceptTest(function(peddler, item) 
		if GetPlayer().components.inventory:Has("goldnugget", 10) then
		   if item.prefab == "goldnugget" then
			  return true
		   end
		end
		return false
	end )
	peddler.components.trader.onaccept = function(peddler, giver, item)
		peddler.AnimState:PlayAnimation("give")
		GetPlayer().SoundEmitter:PlaySound("dontstarve/HUD/research_available")
		GetPlayer().components.inventory:ConsumeByName("goldnugget", 9)
		local penguin = SpawnPrefab("honeycomb")
		penguin.Transform:SetPosition(pt.x+3.1, 0, pt.z+3.1)
		penguin.AnimState:SetBank("penguin")
		penguin.AnimState:SetBuild("penguin_build")
		penguin.Transform:SetFourFaced()
		penguin.AnimState:PlayAnimation("idle_loop", true)
		penguin.AnimState:SetBloomEffectHandle("shaders/anim.ksh")
	penguin.entity:AddSoundEmitter()
	local minimap = penguin.entity:AddMiniMapEntity()
	minimap:SetIcon( "penguin.png" )
		MakeCharacterPhysics(penguin, 50, .5)
		penguin:AddComponent("follower")
		penguin.components.follower:SetLeader(GetPlayer())
		local brain = require "brains/abigailbrain"
		penguin:SetBrain(brain)
		penguin:AddComponent("locomotor")
		penguin.components.locomotor.walkspeed = 0.75
		penguin.components.locomotor.directdrive = false
		penguin:SetStateGraph("SGpenguin")
		penguin:AddComponent("combat")
		penguin.components.combat.hiteffectsymbol = "body"
		penguin.components.combat:SetAttackPeriod(1)
		penguin.components.combat:SetRange(2.5)
		penguin.components.combat:SetDefaultDamage(1)
		penguin:ListenForEvent("attacked", function(penguin, data) penguin.components.combat:SetTarget(data.attacker) end )
		penguin:AddComponent("health")
		penguin.components.health:SetMaxHealth(50)
		penguin.Transform:SetScale(0.7, 0.7, 0.7)
		penguin:RemoveComponent("stackable")
		penguin:RemoveComponent("tradable")
		penguin:RemoveComponent("inventoryitem")
		penguin:AddTag("retinue")
		penguin:AddTag("penguin_1")
		penguin:AddComponent("lootdropper")
		penguin.components.lootdropper:SetLoot({"smallmeat", "smallmeat"})
		penguin.components.inspectable.getstatus = function(penguin)
			if not penguin:HasTag("retinue") then
			   local brain = require "brains/abigailbrain"
			   penguin:SetBrain(brain)
			   penguin.components.follower:SetLeader(GetPlayer())
			   penguin.AnimState:SetBloomEffectHandle("shaders/anim.ksh")
			   penguin:AddTag("retinue")
			else
			   local brain = require "brains/leifbrain"
			   penguin:SetBrain(brain)
			   penguin.components.follower:SetLeader(nil)
			   penguin.AnimState:SetBloomEffectHandle("")
			   penguin:RemoveTag("retinue")
			end
		end
		penguin:DoTaskInTime(math.random(480,560), function()
			if not penguin:HasTag("penguin_2") then
			   penguin.AnimState:PlayAnimation("taunt")
			   penguin.Transform:SetScale(1, 1, 1)
			   penguin:AddTag("penguin_2")
			   penguin.components.lootdropper:SetLoot({"meat", "meat", "drumstick", "drumstick"})
			end
		end )
		penguin:DoPeriodicTask(math.random(120,180), function()
			if penguin:HasTag("penguin_2") then
			   SpawnPrefab("bird_egg").Transform:SetPosition(penguin.Transform:GetWorldPosition())
			end
		end)
	end
	local ice = SpawnPrefab("honeycomb")
	ice.Transform:SetPosition(pt.x+1, 0, pt.z+1)
	ice.AnimState:SetBank("penguin_ice")
	ice.AnimState:SetBuild("penguin_ice")
	ice.AnimState:PlayAnimation("idle")
	ice.AnimState:SetOrientation( ANIM_ORIENTATION.OnGround )
	ice.AnimState:SetLayer( LAYER_BACKGROUND )
	ice.AnimState:SetSortOrder( 1 )
	ice.Transform:SetRotation( 225 )
	ice:RemoveComponent("stackable")
	ice:RemoveComponent("tradable")
	ice:RemoveComponent("inventoryitem")
	ice:AddTag("goodbye")
	ice:AddTag("NOCLICK")
	MakeLargeBurnable(ice)
	MakeLargePropagator(ice)
	local model1 = SpawnPrefab("honeycomb")
	model1.Transform:SetPosition(pt.x+2-1, 0, pt.z-2-1)
	model1.AnimState:SetBank("penguin")
	model1.AnimState:SetBuild("penguin_build")
	model1.Transform:SetFourFaced()
	model1.AnimState:PlayAnimation("idle_loop", true)
	model1.Transform:SetRotation( 270 )
	model1.Transform:SetScale(2, 2, 2)
	model1:RemoveComponent("stackable")
	model1:RemoveComponent("tradable")
	model1:RemoveComponent("inventoryitem")
	model1.AnimState:SetBloomEffectHandle("shaders/anim.ksh")
	model1:AddTag("goodbye")
	MakeLargeBurnable(model1)
	MakeLargePropagator(model1)
	local model2 = SpawnPrefab("honeycomb")
	model2.Transform:SetPosition(pt.x-2-1, 0, pt.z+2-1)
	model2.AnimState:SetBank("penguin")
	model2.AnimState:SetBuild("penguin_build")
	model2.Transform:SetFourFaced()
	model2.AnimState:PlayAnimation("idle_loop", true)
	model2.Transform:SetRotation( 90 )
	model2.Transform:SetScale(2, 2, 2)
	model2:RemoveComponent("stackable")
	model2:RemoveComponent("tradable")
	model2:RemoveComponent("inventoryitem")
	model2.AnimState:SetBloomEffectHandle("shaders/anim.ksh")
	model2:AddTag("goodbye")
	MakeLargeBurnable(model2)
	MakeLargePropagator(model2)
end

local function OnDeploy (inst, pt)
	penguinshop(inst)
	inst.components.stackable:Get():Remove()
end
	inst:AddComponent("deployable")
	inst.components.deployable.ondeploy = OnDeploy
local function onsave(inst, data)
	if inst:HasTag("peddler") then data.peddler = true end
	if inst:HasTag("goodbye") then data.goodbye = true end
	if inst:HasTag("penguin_1") then data.penguin_1 = true end
	if inst:HasTag("penguin_2") then data.penguin_2 = true end
	if inst:HasTag("retinue") then data.retinue = true end
end
local function onload(inst, data)
	if data and data.peddler then
	   penguinshop(inst)
	   inst:Remove()
	end
	if data and data.goodbye then
	   inst:Remove()
	end
	if data and data.penguin_1 then
		inst.AnimState:SetBank("penguin")
		inst.AnimState:SetBuild("penguin_build")
		inst.Transform:SetFourFaced()
		inst.AnimState:PlayAnimation("idle_loop", true)
	inst.entity:AddSoundEmitter()
	local minimap = inst.entity:AddMiniMapEntity()
	minimap:SetIcon( "penguin.png" )
		MakeCharacterPhysics(inst, 50, .5)
		inst:AddComponent("follower")
		inst.components.follower:SetLeader(nil)
		local brain = require "brains/leifbrain"
		inst:SetBrain(brain)
		inst:AddComponent("locomotor")
		inst.components.locomotor.walkspeed = 0.75
		inst.components.locomotor.directdrive = false
		inst:SetStateGraph("SGpenguin")
		inst:AddComponent("combat")
		inst.components.combat.hiteffectsymbol = "body"
		inst.components.combat:SetAttackPeriod(1)
		inst.components.combat:SetRange(2.5)
		inst.components.combat:SetDefaultDamage(1)
		inst:ListenForEvent("attacked", function(inst, data) inst.components.combat:SetTarget(data.attacker) end )
		inst:AddComponent("health")
		inst.components.health:SetMaxHealth(50)
		inst.Transform:SetScale(0.7, 0.7, 0.7)
		inst:RemoveComponent("stackable")
		inst:RemoveComponent("tradable")
		inst:RemoveComponent("inventoryitem")
		inst:AddTag("penguin_1")
		inst:AddComponent("lootdropper")
		inst.components.lootdropper:SetLoot({"smallmeat", "smallmeat"})
		inst.components.inspectable.getstatus = function(inst)
			if not inst:HasTag("retinue") then
			   local brain = require "brains/abigailbrain"
			   inst:SetBrain(brain)
			   inst.components.follower:SetLeader(GetPlayer())
			   inst.AnimState:SetBloomEffectHandle("shaders/anim.ksh")
			   inst:AddTag("retinue")
			else
			   local brain = require "brains/leifbrain"
			   inst:SetBrain(brain)
			   inst.components.follower:SetLeader(nil)
			   inst.AnimState:SetBloomEffectHandle("")
			   inst:RemoveTag("retinue")
			end
		end
		inst:DoTaskInTime(math.random(480,560), function()
			if not inst:HasTag("penguin_2") then
			   inst.AnimState:PlayAnimation("taunt")
			   inst.Transform:SetScale(1, 1, 1)
			   inst:AddTag("penguin_2")
			   inst.components.lootdropper:SetLoot({"meat", "meat", "drumstick", "drumstick"})
			end
		end )
		inst:DoPeriodicTask(math.random(120,180), function()
			if inst:HasTag("penguin_2") then
			   SpawnPrefab("bird_egg").Transform:SetPosition(inst.Transform:GetWorldPosition())
			end
		end)
	end
	if data and data.penguin_2 then
		inst.Transform:SetScale(1, 1, 1)
		inst:AddTag("penguin_2")
		inst.components.lootdropper:SetLoot({"meat", "meat", "drumstick", "drumstick"})
	end
	if data and data.retinue then
		local brain = require "brains/abigailbrain"
		inst:SetBrain(brain)
		inst.components.follower:SetLeader(GetPlayer())
		inst.AnimState:SetBloomEffectHandle("shaders/anim.ksh")
		inst:AddTag("retinue")
	end
end
	inst.OnSave = onsave
	inst.OnLoad = onload

	即可用蜂巢种企鹅养殖场(手里拿着1个蜂巢对地面点鼠标右键,如果拿着多个蜂巢,则不会种出来),拿着黄金对老板点鼠标左键,可以购买小企鹅,每只10个黄金。小企鹅会跟着你,鼠标左键点企鹅可停止跟随,再点则继续跟随(手里不要拿武器,以免误杀)。把它们带到你建造的企鹅圈,圈养起来吧,如果有淘气的企鹅啄墙,把它带离墙边即可。1-2天后,小企鹅长成大企鹅,并会下蛋,你可以继续养它们获得企鹅蛋,也可以带它们去企鹅养殖场,让它们停在冰面上,鼠标左键点老板,即可卖掉冰面上的大企鹅,收购价每只20个黄金。保护好你的企鹅群,从此作一个快乐的养鹅人吧。如果企鹅走失,可以打开小地图查找,将显示企鹅图标。杀掉小企鹅,会掉2个小肉(修改过“巨型超市”则增加掉落1-2个黄金),杀掉大企鹅会掉2个大肉和2个企鹅腿。不想要企鹅养殖场时烧掉即可