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",
80 on_rightclick
= function(self
, clicker
)
82 inv
= minetest
.get_inventory({type="detached", name
="trading_inv"})
84 inv
= minetest
.create_detached_inventory("trading_inv", {
85 allow_take
= function(inv
, listname
, index
, stack
, player
)
86 if listname
== "input" or listname
== "output" then
87 return stack
:get_count()
92 allow_move
= function(inv
, from_list
, from_index
, to_list
, to_index
, count
, player
)
93 if from_list
== "wanted" or from_list
== "offered" or to_list
== "wanted" or to_list
== "offered" then
95 elseif from_list
== "output" and inv
:get_stack(to_list
, to_index
):is_empty() then
97 elseif from_list
== "input" then
103 allow_put
= function(inv
, listname
, index
, stack
, player
)
104 if listname
== "input" then
105 return stack
:get_count()
110 on_put
= function(inv
, listname
, index
, stack
, player
)
111 if inv
:contains_item("input", inv
:get_stack("wanted", 1)) then
112 inv
:set_stack("output", 1, inv
:get_stack("offered", 1))
113 minetest
.sound_play("mobs_mc_villager_accept", {to_player
= player
:get_player_name()})
115 inv
:set_stack("output", 1, ItemStack(""))
116 minetest
.sound_play("mobs_mc_villager_deny", {to_player
= player
:get_player_name()})
119 on_move
= function(inv
, from_list
, from_index
, to_list
, to_index
, count
, player
)
120 if inv
:contains_item("input", inv
:get_stack("wanted", 1)) then
121 inv
:set_stack("output", 1, inv
:get_stack("offered", 1))
122 minetest
.sound_play("mobs_mc_villager_accept", {to_player
= player
:get_player_name()})
124 inv
:set_stack("output", 1, ItemStack(""))
125 minetest
.sound_play("mobs_mc_villager_deny", {to_player
= player
:get_player_name()})
128 on_take
= function(inv
, listname
, index
, stack
, player
)
130 if listname
== "output" then
131 inv
:remove_item("input", inv
:get_stack("wanted", 1))
134 if inv
:contains_item("input", inv
:get_stack("wanted", 1)) then
135 inv
:set_stack("output", 1, inv
:get_stack("offered", 1))
138 inv
:set_stack("output", 1, ItemStack(""))
142 minetest
.sound_play("mobs_mc_villager_accept", {to_player
= player
:get_player_name()})
144 minetest
.sound_play("mobs_mc_villager_deny", {to_player
= player
:get_player_name()})
149 inv
:set_size("input", 2)
150 inv
:set_size("output", 1)
151 inv
:set_size("wanted", 2)
152 inv
:set_size("offered", 1)
155 {"mcl_core:apple 12", "mcl_core:emerald 1"},
156 {"mcl_core:coal_lump 20", "mcl_core:emerald 1"},
157 {"mcl_core:paper 30", "mcl_core:emerald 1"},
158 {"mcl_mobitems:leather 10", "mcl_core:emerald 1"},
159 {"mcl_books:book 2", "mcl_core:emerald 1"},
160 {"mcl_core:emerald 3", "mcl_core:emerald 1"},
161 {"mcl_farming:potato_item 15", "mcl_core:emerald 1"},
162 {"mcl_farming:wheat_item 20", "mcl_core:emerald 1"},
163 {"mcl_farming:carrot_item 15", "mcl_core:emerald 1"},
164 {"mcl_farming:melon_item 8", "mcl_core:emerald 1"},
165 {"mcl_mobitems:rotten_flesh 40","mcl_core:emerald 1"},
166 {"mcl_core:gold_ingot 10", "mcl_core:emerald 1"},
167 {"mcl_wool:white 15", "mcl_core:emerald 1"},
168 {"mcl_farming:pumpkin_face 8", "mcl_core:emerald 1"},
170 {"mcl_core:emerald 1", "mcl_mobitems:cooked_beef 5"},
171 {"mcl_core:emerald 1", "mcl_mobitems:cooked_chicken 7"},
172 {"mcl_core:emerald 1", "mcl_farming:cookie 6"},
173 {"mcl_core:emerald 1", "mcl_bows:arrow 10"},
174 {"mcl_core:emerald 3", "mcl_bows:bow 1"},
175 {"mcl_core:emerald 1", "mcl_cake:cake 1"},
176 {"mcl_core:emerald 10", "mcl_mobitems:saddle 1"},
177 {"mcl_core:emerald 10", "mcl_clock:clock 1"},
178 {"mcl_core:emerald 10", "mcl_compass:compass 1"},
179 {"mcl_core:emerald 1", "mcl_core:glass 5"},
180 {"mcl_core:emerald 1", "mcl_nether:glowstone 3"},
181 {"mcl_core:emerald 3", "mcl_tools:shears 1"},
182 {"mcl_core:emerald 10", "mcl_tools:sword_diamond 1"},
183 {"mcl_core:emerald 20", "3d_armor:chestplate_diamond 1"},
185 local tradenum
= math
.random(#trades
)
186 inv
:set_stack("wanted", 1, ItemStack(trades
[tradenum
][1]))
187 inv
:set_stack("offered", 1, ItemStack(trades
[tradenum
][2]))
191 "background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]"..
192 mcl_vars
.inventory_header
..
193 "list[current_player;main;0,4.5;9,3;9]"..
194 "list[current_player;main;0,7.74;9,1;]"
195 .."list[detached:trading_inv;wanted;2,1;2,1;]"
196 .."list[detached:trading_inv;offered;5.76,1;1,1;]"
197 .."list[detached:trading_inv;input;2,2.5;2,1;]"
198 .."list[detached:trading_inv;output;5.76,2.55;1,1;]"
199 .."listring[detached:trading_inv;output]"
200 .."listring[current_player;main]"
201 .."listring[detached:trading_inv;input]"
202 .."listring[current_player;main]"
203 minetest
.sound_play("mobs_mc_villager_trade", {to_player
= clicker
:get_player_name()})
204 minetest
.show_formspec(clicker
:get_player_name(), "mobs_mc:trade", formspec
)
208 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
)
211 mobs
:alias_mob("mobs:villager", "mobs_mc:villager")
214 mobs
:register_egg("mobs_mc:villager", S("Villager"), "mobs_mc_spawn_icon_villager.png", 0)
216 if minetest
.settings
:get_bool("log_mods") then
217 minetest
.log("action", "MC mobs loaded")