3 --made for MC like Survival game
4 --License for code WTFPL and otherwise stated in readmes
7 local MP
= minetest
.get_modpath(minetest
.get_current_modname())
8 local S
, NS
= dofile(MP
.."/intllib.lua")
11 --################### VILLAGER
16 mobs
:register_mob("mobs_mc:villager", {
20 collisionbox
= {-0.3, -0.01, -0.3, 0.3, 1.94, 0.3},
22 mesh
= "mobs_mc_villager.b3d",
25 "mobs_mc_villager.png",
26 "mobs_mc_villager.png", --hat
29 "mobs_mc_villager_farmer.png",
30 "mobs_mc_villager_farmer.png", --hat
33 "mobs_mc_villager_priest.png",
34 "mobs_mc_villager_priest.png", --hat
37 "mobs_mc_villager_librarian.png",
38 "mobs_mc_villager_librarian.png", --hat
41 "mobs_mc_villager_butcher.png",
42 "mobs_mc_villager_butcher.png", --hat
45 "mobs_mc_villager_smith.png",
46 "mobs_mc_villager_smith.png", --hat
49 visual_size
= {x
=3, y
=3},
50 makes_footstep_sound
= true,
55 random = "mobs_mc_villager_noise",
56 death
= "mobs_mc_villager_death",
57 damage
= "mobs_mc_villager_damage",
81 on_rightclick = function(self, clicker)
83 inv = minetest.get_inventory({type="detached", name="trading_inv"})
85 inv = minetest.create_detached_inventory("trading_inv", {
86 allow_take = function(inv, listname, index, stack, player)
87 if listname == "input" or listname == "output" then
88 return stack:get_count()
93 allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
94 if from_list == "wanted" or from_list == "offered" or to_list == "wanted" or to_list == "offered" then
96 elseif from_list == "output" and inv:get_stack(to_list, to_index):is_empty() then
98 elseif from_list == "input" then
104 allow_put = function(inv, listname, index, stack, player)
105 if listname == "input" then
106 return stack:get_count()
111 on_put = function(inv, listname, index, stack, player)
112 if inv:contains_item("input", inv:get_stack("wanted", 1)) then
113 inv:set_stack("output", 1, inv:get_stack("offered", 1))
114 minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()})
116 inv:set_stack("output", 1, ItemStack(""))
117 minetest.sound_play("mobs_mc_villager_deny", {to_player = player:get_player_name()})
120 on_move = function(inv, from_list, from_index, to_list, to_index, count, player)
121 if inv:contains_item("input", inv:get_stack("wanted", 1)) then
122 inv:set_stack("output", 1, inv:get_stack("offered", 1))
123 minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()})
125 inv:set_stack("output", 1, ItemStack(""))
126 minetest.sound_play("mobs_mc_villager_deny", {to_player = player:get_player_name()})
129 on_take = function(inv, listname, index, stack, player)
131 if listname == "output" then
132 inv:remove_item("input", inv:get_stack("wanted", 1))
135 if inv:contains_item("input", inv:get_stack("wanted", 1)) then
136 inv:set_stack("output", 1, inv:get_stack("offered", 1))
139 inv:set_stack("output", 1, ItemStack(""))
143 minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name()})
145 minetest.sound_play("mobs_mc_villager_deny", {to_player = player:get_player_name()})
150 inv:set_size("input", 2)
151 inv:set_size("output", 1)
152 inv:set_size("wanted", 2)
153 inv:set_size("offered", 1)
156 {"mcl_core:apple 12", "mcl_core:emerald 1"},
157 {"mcl_core:coal_lump 20", "mcl_core:emerald 1"},
158 {"mcl_core:paper 30", "mcl_core:emerald 1"},
159 {"mcl_mobitems:leather 10", "mcl_core:emerald 1"},
160 {"mcl_books:book 2", "mcl_core:emerald 1"},
161 {"mcl_core:emerald 3", "mcl_core:emerald 1"},
162 {"mcl_farming:potato_item 15", "mcl_core:emerald 1"},
163 {"mcl_farming:wheat_item 20", "mcl_core:emerald 1"},
164 {"mcl_farming:carrot_item 15", "mcl_core:emerald 1"},
165 {"mcl_farming:melon_item 8", "mcl_core:emerald 1"},
166 {"mcl_mobitems:rotten_flesh 40","mcl_core:emerald 1"},
167 {"mcl_core:gold_ingot 10", "mcl_core:emerald 1"},
168 {"mcl_wool:white 15", "mcl_core:emerald 1"},
169 {"mcl_farming:pumpkin_face 8", "mcl_core:emerald 1"},
171 {"mcl_core:emerald 1", "mcl_mobitems:cooked_beef 5"},
172 {"mcl_core:emerald 1", "mcl_mobitems:cooked_chicken 7"},
173 {"mcl_core:emerald 1", "mcl_farming:cookie 6"},
174 {"mcl_core:emerald 1", "mcl_bows:arrow 10"},
175 {"mcl_core:emerald 3", "mcl_bows:bow 1"},
176 {"mcl_core:emerald 1", "mcl_cake:cake 1"},
177 {"mcl_core:emerald 10", "mcl_mobitems:saddle 1"},
178 {"mcl_core:emerald 10", "mcl_clock:clock 1"},
179 {"mcl_core:emerald 10", "mcl_compass:compass 1"},
180 {"mcl_core:emerald 1", "mcl_core:glass 5"},
181 {"mcl_core:emerald 1", "mcl_nether:glowstone 3"},
182 {"mcl_core:emerald 3", "mcl_tools:shears 1"},
183 {"mcl_core:emerald 10", "mcl_tools:sword_diamond 1"},
184 {"mcl_core:emerald 20", "3d_armor:chestplate_diamond 1"},
186 local tradenum = math.random(#trades)
187 inv:set_stack("wanted", 1, ItemStack(trades[tradenum][1]))
188 inv:set_stack("offered", 1, ItemStack(trades[tradenum][2]))
192 "background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]"..
193 mcl_vars.inventory_header..
194 "list[current_player;main;0,4.5;9,3;9]"..
195 "list[current_player;main;0,7.74;9,1;]"
196 .."list[detached:trading_inv;wanted;2,1;2,1;]"
197 .."list[detached:trading_inv;offered;5.76,1;1,1;]"
198 .."list[detached:trading_inv;input;2,2.5;2,1;]"
199 .."list[detached:trading_inv;output;5.76,2.55;1,1;]"
200 .."listring[detached:trading_inv;output]"
201 .."listring[current_player;main]"
202 .."listring[detached:trading_inv;input]"
203 .."listring[current_player;main]"
204 minetest.sound_play("mobs_mc_villager_trade", {to_player = clicker:get_player_name()})
205 minetest.show_formspec(clicker:get_player_name(), "mobs_mc:trade", formspec)
210 mobs
:spawn_specific("mobs_mc:villager", mobs_mc
.spawn
.village
, {"air"}, 0, minetest
.LIGHT_MAX
+1, 30, 8000, 4, mobs_mc
.spawn_height
.water
+1, mobs_mc
.spawn_height
.overworld_max
)
213 mobs
:alias_mob("mobs:villager", "mobs_mc:villager")
216 mobs
:register_egg("mobs_mc:villager", S("Villager"), "mobs_mc_spawn_icon_villager.png", 0)
218 if minetest
.settings
:get_bool("log_mods") then
219 minetest
.log("action", "MC mobs loaded")