Hello , it’s the first time i’m making a tutorial here (and on lua too) I was working on this for the last 2 day for my mod , an I didn’t seen something similar for now So today i’ll teach you how to make a chest you must open , and then you can obtain item or gold from it (or anything you want idc)

first off , you need to create you chest item in npc_item_custom.txt :

		// General
		"ID"							"1282"														// Here put a unused ID.
		"AbilityBehavior"				"DOTA_ABILITY_BEHAVIOR_CHANNELLED|DOTA_ABILITY_BEHAVIOR_NO_TARGET" // here we define it as a channeled item
		"BaseClass"						"item_datadriven"
		"AbilityTextureName"			"item_present" //Here goes the texture name of the item
		"ItemShareability"				"ITEM_FULLY_SHAREABLE" // make everyone able to use it
		"Model"							"models/props_winter/present.vmdl"
		"ItemKillable"					"0" // the chest can't be destroyed when on ground
		"ItemSellable"					"0" // can't be sold at a shop
		"ItemPurchasable"				"0" //can't be purchased
		"ItemDroppable"					"1" // can be put on the ground (set it to 0 if you don't want allow the player to
		"ItemCost"						"99999" 
		"ItemQuality"					"artifact"
		"AbilityCooldown"				"1.0" //time before the player can open another chest
		"AbilityChannelTime"			"1.0" //time the player must channel to open the chest

		        "ScriptFile"			"lua_datadriven/chest.lua" //create a folder named lua_item in "your_game_mode\scripts\vscripts" and create a text file called chest.lua
				"Function"				"chest_open" // here we call the function
				"chest_name"				"chest_1" // here you can give a name to this chest in case you want more than 1 chest type 
				"gold"				"1" // does this chest give gold or only item ? (0 = no gold , 1 = gold instead of item , 2 = gold + item)
				"gold_amt"				"1500" // how many gold the chest give if it give out
				"gold_rand"				"250" // if you want gold to be random


then your script in lua_datadriven/chest.lua

function chest_open(keys)
	local item_list = LoadKeyValues("scripts/kv/chest_result.kv") --Here we load a kv file where we will put all the item you can find in chest
	local caster = keys.caster
	local Player_ID = caster:GetPlayerOwnerID() 
	local item = keys.ability
	local gold = 0
	if keys.gold >0 then
		gold = keys.gold_amt + math.random(-(keys.gold_rand),(keys.gold_rand))
	caster:RemoveItem(item)--Here we remove the chest
	local chest_name = keys.chest_name

	item_list = item_list[chest_name] --he we load the item list specific to this chest
	--DeepPrintTable (item_list) --undo the commentary to check if your item_list is right
	local len = 0
	for k,v in pairs( item_list ) do
		len = len + 1
	local item_number = 0
	if keys.gold == 1 then
		item_number = math.random(1,(len + 1)) --here we determine the item number (soo here we chose the item), the +1 is to add the gold chance in ,you can change it to 2 or more if you want gold to have higger change of appear
		item_number = math.random(1,len)
	if item_number > len then --in case the player obtaine gold instead of item
	       PlayerResource:ModifyGold(Player_ID, gold, true, 0 ) 
		local item_name = item_list[tostring(item_number)] -- i know it could be better , but i'm not realy used to kv
		local item_reward = CreateItem( item_name, caster, caster )
		if keys.gold == 2 then
			PlayerResource:ModifyGold(Player_ID, gold, true, 0 ) 

and finaly we create our kv file where we put all the item for each chest “scripts/kv/chest_result.kv”

        "1" "item_assault"
        "2" "item_desolator"
        "3" "item_sange_and_yasha"   
        "4" "item_butterfly"
        "1" "item_youritem"

Now you can easely make a chest for your rpg game :D If you want to make the chest loot on ennemy death , look this another tuto from Noya about drop system : https://moddota.com/forums/discussion/257/item-drop-system