local assets=
{ 
    Asset("ANIM", "anim/koi_knife.zip"),--这个是放在地上的动画文件
    Asset("ANIM", "anim/koi_knife_swap.zip"), --这个是手上动画
    Asset("ATLAS", "images/inventoryimages/koi_knife.xml"),--物品栏图标的xml
    Asset("IMAGE", "images/inventoryimages/koi_knife.tex"),--物品栏图标的图片
}
--目前我还弄不清楚下面这代码的具体意义，但就先这样空着吧，不能随意乱删，因为有一定的格式要求
local prefabs = 
{
}

local function OnEquip(inst, owner) --当你把武器装备到手上时，会触发这个函数
    owner.AnimState:OverrideSymbol("swap_object", "koi_knife_swap", "koi_knife_swap")--这句话的含义是，用swap_myitem_build这个文件里的swap_myitem这个symbol，覆盖人物的swap_object这个symbol。swap_object，是人物身上的一个symbol，swap_myitem_build，则是我们之前准备好的，用于手持武器的build，swap_myitem就是存放手持武器的图片的文件夹的名字，mod tools自动把它输出为一个symbol。
    owner.AnimState:Show("ARM_carry") --显示持物手
    owner.AnimState:Hide("ARM_normal") --隐藏普通的手
	inst.components.weapon:SetDamage(15 + 25 * TUNING.PW)
end

local function OnUnequip(inst, owner) 
    owner.AnimState:Hide("ARM_carry") --隐藏持物手
    owner.AnimState:Show("ARM_normal") --显示普通的手
	inst.isunfolded = true
	inst.components.weapon:SetRange(0, 0)
	inst.components.weapon:SetDamage(15 + 25 * TUNING.PW)
end

local function mary(inst)
	local owner = inst.components.inventoryitem.owner
	if inst.isunfolded and owner:HasTag("koishi") then
		if TUNING.LANG == 1 then
			owner.components.talker:Say("Hello, hello! This is Ms Mary!", 3, false)
		else
			owner.components.talker:Say("喂喂！你好，我是玛丽小姐!", 3, false)
		end
		owner.SoundEmitter:PlaySound("dontstarve/common/staff_blink")
		inst.components.weapon:SetRange(10, 10)
		inst.isunfolded = false
	else
		if TUNING.LANG == 1 then
			owner.components.talker:Say("OK. Bye!", 3, false)
		else
			owner.components.talker:Say("好的! 再见!", 3, false)
		end
		owner.SoundEmitter:PlaySound("dontstarve/common/staff_blink") 
		inst.components.weapon:SetRange(0, 0)
		inst.isunfolded = true
	end
	
	inst.components.useableitem.inuse = false
end

local function onattack(inst, attacker, target)
	if inst.isunfolded == false then
		if TUNING.LANG == 1 then
			attacker.components.talker:Say("Now, I'm Right behind You!", 3, false)
		else
			attacker.components.talker:Say("现在，我啊，就在你的后面哦！", 3, false)
		end		
		target.components.health:DoDelta(-50 * attacker.components.combat.damagemultiplier)
		attacker.components.hunger:DoDelta(-30 + 10*TUNING.PW)
		local pt1 = attacker:GetPosition()
        local pt2 = target:GetPosition()
		attacker.Transform:SetPosition((pt2.x-pt1.x)*0.2+pt2.x, 0, (pt2.z-pt1.z)*0.2+pt2.z)
		inst.isunfolded = true
		inst.components.weapon:SetRange(0, 0)
	end
end

local function fn()--这个函数就是实际创建物体的函数，上面所有定义到的函数，变量，都需要直接或者间接地在这个函数中使用，才能起作用
    local inst = CreateEntity()
	
    inst.entity:AddTransform()
    inst.entity:AddAnimState()
    inst.entity:AddNetwork()
     
    MakeInventoryPhysics(inst)   
      
    inst.AnimState:SetBank("koi_knife")
    inst.AnimState:SetBuild("koi_knife")
    inst.AnimState:PlayAnimation("idle")

	if not TheWorld.ismastersim then
        return inst
    end
	
	inst:AddComponent("inspectable")
 
    inst.entity:SetPristine()

    inst:AddComponent("inventoryitem")--添加物品栏物品组件，只有有了这个组件，你才能把这个物品捡起放到物品栏里。
    inst.components.inventoryitem.imagename = "koi_knife" --物品栏图片的名字
    inst.components.inventoryitem.atlasname = "images/inventoryimages/koi_knife.xml"--物品栏图片的xml文件。为什么会有这么两句呢？在单个文件下也许会迷惑，但如果换成一个张大图就容易理解了。举个例子，游戏的操作界面,HUD，你可以在data\images下找到HUD.tex，用textool打开就会看到是一整张大的图片，包含了整个操作界面的所有图片，xml就是用来切割分块这张大的图片，并分别给它们重新命名的，新的命名就会被前面的imagename 使用。
	inst.components.inventoryitem.keepondeath = true
	
    inst:AddComponent("equippable")--添加可装备组件，有了这个组件，你才能装备物品
    inst.components.equippable:SetOnEquip( OnEquip ) -- 设定物品在装备和卸下时执行的函数。在前面定义的两个函数是OnEquip，OnUnequip里，我们主要是围绕着改变人物外形设定了一些基本代码。 在装上的时候，会让人物的持物手显示出来，普通手隐藏，卸下时则反过来。需要注意的是，OnEquip，OnUnequip都是本地函数，要想让它们发挥作用，就必须要通过这里的组件接口来实现。
    inst.components.equippable:SetOnUnequip( OnUnequip )
	
	inst:AddComponent("weapon")     
	inst.components.weapon:SetDamage(15 + 25 * TUNING.PW)--设置武器的攻击力damage
	inst.components.weapon:SetOnAttack(onattack)
	inst.isunfolded = true
	
	inst:AddComponent("useableitem")
    inst.components.useableitem:SetOnUseFn(mary)

	--local  broomRecipe = Recipe("broom", {Ingredient("cutgrass", 6),Ingredient("twigs", 3)}, RECIPETABS.MARISA_TAB, TECH.NONE)
	--broomRecipe.atlas = "images/inventoryimages/broom.xml"--设置制作栏里的图片，对于新物品来说，没有这一条的话，会造成出错。
	
	if not inst.components.characterspecific then
		inst:AddComponent("characterspecific")
	end
 
	inst.components.characterspecific:SetOwner("koishi")
	inst.components.characterspecific:SetStorable(true)
	inst.components.characterspecific:SetComment("I can't handle this mysterious power.") 
    return inst
end

if TUNING.LANG == 1 then
	STRINGS.NAMES.KOI_KNIFE = "Koishi's Knife"
	STRINGS.CHARACTERS.GENERIC.DESCRIBE.KOI_KNIFE = "I'm Right Behind You!"
	STRINGS.RECIPE_DESC.KOI_KNIFE = "For Back Stabbing\n Written as Fruit Knife, Read as Butcher Knife." 
else
	STRINGS.NAMES.KOI_KNIFE = "恋恋的小刀"
	STRINGS.CHARACTERS.GENERIC.DESCRIBE.KOI_KNIFE = "现在我就在你身后哦！"
	STRINGS.RECIPE_DESC.KOI_KNIFE = "背刺专用\n 写作水果刀，读作屠刀." 
end

return Prefab("common/inventory/koi_knife", fn, assets, prefabs)--最后，返回这个实体到modmain里注册。Prefab这个函数，第一个参数只需要看最后一个/后面的部分，视为这个prefab的ID，fn则是上面定义的fn，是这个物品的创建函数，assets，对应上面的assets，主要是用于注册美术资源，如果你在这里注册了相应的美术资源，就不需要在modmain里再注册一次。prefabs，目前还未明确具体的作用。