Make villager stand still if there is near player
[MineClone/MineClone2.git] / mods / ENTITIES / mobs_mc / 2_throwing.lua
blob09595803270cccc6bf27078bd4d276b2273a828d
1 --MCmobs v0.5
2 --maikerumine
3 --made for MC like Survival game
4 --License for code WTFPL and otherwise stated in readmes
6 -- intllib
7 local MP = minetest.get_modpath(minetest.get_current_modname())
8 local S, NS = dofile(MP.."/intllib.lua")
10 --maikerumines throwing code
11 --arrow (weapon)
13 local c = mobs_mc.is_item_variable_overridden
15 minetest.register_node("mobs_mc:arrow_box", {
16 drawtype = "nodebox",
17 node_box = {
18 type = "fixed",
19 fixed = {
20 -- Shaft
21 {-6.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17},
22 --Spitze
23 {-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17},
24 {-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17},
25 --Federn
26 {6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17},
27 {7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17},
28 {7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17},
29 {6.5/17, -1.5/17, -1.5/17, 7.5/17, -2.5/17, -2.5/17},
31 {7.5/17, 2.5/17, 2.5/17, 8.5/17, 3.5/17, 3.5/17},
32 {8.5/17, -3.5/17, 3.5/17, 7.5/17, -2.5/17, 2.5/17},
33 {8.5/17, 3.5/17, -3.5/17, 7.5/17, 2.5/17, -2.5/17},
34 {7.5/17, -2.5/17, -2.5/17, 8.5/17, -3.5/17, -3.5/17},
37 tiles = {"mcl_bows_arrow.png^[transformFX", "mcl_bows_arrow.png^[transformFX", "mcl_bows_arrow_back.png", "mcl_bows_arrow_front.png", "mcl_bows_arrow.png", "mcl_bows_arrow.png^[transformFX"},
38 groups = {not_in_creative_inventory=1},
41 local THROWING_ARROW_ENTITY={
42 physical = false,
43 timer=0,
44 visual = "wielditem",
45 visual_size = {x=0.1, y=0.1},
46 textures = {"mobs_mc:arrow_box"},
47 velocity = 10,
48 lastpos={},
49 collisionbox = {0,0,0,0,0,0},
52 --ARROW CODE
53 THROWING_ARROW_ENTITY.on_step = function(self, dtime)
54 self.timer=self.timer+dtime
55 local pos = self.object:getpos()
56 local node = minetest.get_node(pos)
58 minetest.add_particle({
59 pos = pos,
60 velocity = {x=0, y=0, z=0},
61 acceleration = {x=0, y=0, z=0},
62 expirationtime = .3,
63 size = 1,
64 collisiondetection = false,
65 vertical = false,
66 texture = "mobs_mc_arrow_particle.png",
69 if self.timer>0.2 then
70 local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 1.5)
71 for k, obj in pairs(objs) do
72 if obj:get_luaentity() ~= nil then
73 if obj:get_luaentity().name ~= "mobs_mc:arrow_entity" and obj:get_luaentity().name ~= "__builtin:item" then
74 local damage = 3
75 minetest.sound_play("damage", {pos = pos})
76 obj:punch(self.object, 1.0, {
77 full_punch_interval=1.0,
78 damage_groups={fleshy=damage},
79 }, nil)
80 self.object:remove()
81 end
82 else
83 local damage = 3
84 minetest.sound_play("damage", {pos = pos})
85 obj:punch(self.object, 1.0, {
86 full_punch_interval=1.0,
87 damage_groups={fleshy=damage},
88 }, nil)
89 self.object:remove()
90 end
91 end
92 end
94 if self.lastpos.x~=nil then
95 if node.name ~= "air" then
96 minetest.sound_play("bowhit1", {pos = pos})
97 minetest.add_item(self.lastpos, 'mobs_mc:arrow')
98 self.object:remove()
99 end
101 self.lastpos={x=pos.x, y=pos.y, z=pos.z}
104 minetest.register_entity("mobs_mc:arrow_entity", THROWING_ARROW_ENTITY)
106 local arrows = {
107 {"mobs_mc:arrow", "mobs_mc:arrow_entity" },
110 local throwing_shoot_arrow = function(itemstack, player)
111 for _,arrow in ipairs(arrows) do
112 if player:get_inventory():get_stack("main", player:get_wield_index()+1):get_name() == arrow[1] then
113 if not minetest.settings:get_bool("creative_mode") then
114 player:get_inventory():remove_item("main", arrow[1])
116 local playerpos = player:getpos()
117 local obj = minetest.add_entity({x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, arrow[2]) --mc
118 local dir = player:get_look_dir()
119 obj:setvelocity({x=dir.x*22, y=dir.y*22, z=dir.z*22})
120 obj:setacceleration({x=dir.x*-3, y=-10, z=dir.z*-3})
121 obj:setyaw(player:get_look_yaw()+math.pi)
122 minetest.sound_play("throwing_sound", {pos=playerpos})
123 if obj:get_luaentity().player == "" then
124 obj:get_luaentity().player = player
126 obj:get_luaentity().node = player:get_inventory():get_stack("main", 1):get_name()
127 return true
130 return false
133 if c("arrow") then
134 minetest.register_craftitem("mobs_mc:arrow", {
135 description = S("Arrow"),
136 _doc_items_longdesc = S("Arrows are ammunition for bows."),
137 _doc_items_usagehelp = S("To use arrows as ammunition for a bow, put them in the inventory slot following the bow. Slots are counted left to right, top to bottom."),
138 inventory_image = "mcl_bows_arrow_inv.png",
142 if c("arrow") and c("flint") and c("feather") and c("stick") then
143 minetest.register_craft({
144 output = 'mobs_mc:arrow 4',
145 recipe = {
146 {mobs_mc.items.flint},
147 {mobs_mc.items.stick},
148 {mobs_mc.items.feather},
153 if c("bow") then
154 minetest.register_tool("mobs_mc:bow_wood", {
155 description = S("Bow"),
156 _doc_items_longdesc = S("Bows are ranged weapons to shoot arrows at your foes."),
157 _doc_items_usagehelp = S("To use the bow, you first need to have at least one arrow in slot following the bow. Leftclick to shoot. Each hit deals 3 damage."),
158 inventory_image = "mcl_bows_bow.png",
159 on_use = function(itemstack, user, pointed_thing)
160 if throwing_shoot_arrow(itemstack, user, pointed_thing) then
161 if not minetest.settings:get_bool("creative_mode") then
162 itemstack:add_wear(65535/50)
165 return itemstack
166 end,
169 minetest.register_craft({
170 output = 'mobs_mc:bow_wood',
171 recipe = {
172 {mobs_mc.items.string, mobs_mc.items.stick, ''},
173 {mobs_mc.items.string, '', mobs_mc.items.stick},
174 {mobs_mc.items.string, mobs_mc.items.stick, ''},
179 local how_to_throw = "Hold it in your and and leftclick to throw."
181 -- egg throwing item
182 -- egg entity
183 if c("egg") then
184 local egg_GRAVITY = 9
185 local egg_VELOCITY = 19
187 mobs:register_arrow("mobs_mc:egg_entity", {
188 visual = "sprite",
189 visual_size = {x=.5, y=.5},
190 textures = {"mobs_chicken_egg.png"},
191 velocity = egg_VELOCITY,
193 hit_player = function(self, player)
194 player:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, {
195 full_punch_interval = 1.0,
196 damage_groups = {},
197 }, nil)
198 end,
200 hit_mob = function(self, player)
201 player:punch(minetest.get_player_by_name(self.playername) or self.object, 1.0, {
202 full_punch_interval = 1.0,
203 damage_groups = {},
204 }, nil)
205 end,
207 hit_node = function(self, pos, node)
209 if math.random(1, 10) > 1 then
210 return
213 pos.y = pos.y + 1
215 local nod = minetest.get_node_or_nil(pos)
217 if not nod
218 or not minetest.registered_nodes[nod.name]
219 or minetest.registered_nodes[nod.name].walkable == true then
220 return
223 local mob = minetest.add_entity(pos, "mobs_mc:chicken")
224 local ent2 = mob:get_luaentity()
226 mob:set_properties({
227 visual_size = {
228 x = ent2.base_size.x / 2,
229 y = ent2.base_size.y / 2
231 collisionbox = {
232 ent2.base_colbox[1] / 2,
233 ent2.base_colbox[2] / 2,
234 ent2.base_colbox[3] / 2,
235 ent2.base_colbox[4] / 2,
236 ent2.base_colbox[5] / 2,
237 ent2.base_colbox[6] / 2
241 ent2.child = true
242 ent2.tamed = true
243 ent2.owner = self.playername
247 -- shoot egg
248 local mobs_shoot_egg = function (item, player, pointed_thing)
250 local playerpos = player:getpos()
252 minetest.sound_play("default_place_node_hard", {
253 pos = playerpos,
254 gain = 1.0,
255 max_hear_distance = 5,
258 local obj = minetest.add_entity({
259 x = playerpos.x,
260 y = playerpos.y +1.5,
261 z = playerpos.z
262 }, "mobs_mc:egg_entity")
264 local ent = obj:get_luaentity()
265 local dir = player:get_look_dir()
267 ent.velocity = egg_VELOCITY -- needed for api internal timing
268 ent.switch = 1 -- needed so that egg doesn't despawn straight away
270 obj:setvelocity({
271 x = dir.x * egg_VELOCITY,
272 y = dir.y * egg_VELOCITY,
273 z = dir.z * egg_VELOCITY
276 obj:setacceleration({
277 x = dir.x * -3,
278 y = -egg_GRAVITY,
279 z = dir.z * -3
282 -- pass player name to egg for chick ownership
283 local ent2 = obj:get_luaentity()
284 ent2.playername = player:get_player_name()
286 if not minetest.settings:get_bool("creative_mode") then
287 item:take_item()
290 return item
293 minetest.register_craftitem("mobs_mc:egg", {
294 description = S("Egg"),
295 _doc_items_longdesc = S("Eggs can be thrown and break on impact. There is a small chance that 1 or even 4 chicks will pop out"),
296 _doc_items_usagehelp = how_to_throw,
297 inventory_image = "mobs_chicken_egg.png",
298 on_use = mobs_shoot_egg,
302 -- Snowball
304 local snowball_GRAVITY = 9
305 local snowball_VELOCITY = 19
307 mobs:register_arrow("mobs_mc:snowball_entity", {
308 visual = "sprite",
309 visual_size = {x=.5, y=.5},
310 textures = {"mcl_throwing_snowball.png"},
311 velocity = snowball_VELOCITY,
313 hit_player = function(self, player)
314 -- FIXME: No knockback
315 player:punch(self.object, 1.0, {
316 full_punch_interval = 1.0,
317 damage_groups = {},
318 }, nil)
319 end,
321 hit_mob = function(self, mob)
322 -- Hurt blazes, but not damage to anything else
323 local dmg = {}
324 if mob:get_luaentity().name == "mobs_mc:blaze" then
325 dmg = {fleshy = 3}
327 -- FIXME: No knockback
328 mob:punch(self.object, 1.0, {
329 full_punch_interval = 1.0,
330 damage_groups = dmg,
331 }, nil)
332 end,
336 if c("snowball") then
337 -- shoot snowball
338 local mobs_shoot_snowball = function (item, player, pointed_thing)
340 local playerpos = player:getpos()
342 local obj = minetest.add_entity({
343 x = playerpos.x,
344 y = playerpos.y +1.5,
345 z = playerpos.z
346 }, "mobs_mc:snowball_entity")
348 local ent = obj:get_luaentity()
349 local dir = player:get_look_dir()
351 ent.velocity = snowball_VELOCITY -- needed for api internal timing
352 ent.switch = 1 -- needed so that egg doesn't despawn straight away
354 obj:setvelocity({
355 x = dir.x * snowball_VELOCITY,
356 y = dir.y * snowball_VELOCITY,
357 z = dir.z * snowball_VELOCITY
360 obj:setacceleration({
361 x = dir.x * -3,
362 y = -snowball_GRAVITY,
363 z = dir.z * -3
366 -- pass player name to egg for chick ownership
367 local ent2 = obj:get_luaentity()
368 ent2.playername = player:get_player_name()
370 if not minetest.settings:get_bool("creative_mode") then
371 item:take_item()
374 return item
378 -- Snowball
379 minetest.register_craftitem("mobs_mc:snowball", {
380 description = S("Snowball"),
381 _doc_items_longdesc = S("Snowballs can be thrown at your enemies. A snowball deals 3 damage to blazes, but is harmless to anything else."),
382 _doc_items_usagehelp = how_to_throw,
383 inventory_image = "mcl_throwing_snowball.png",
384 on_use = mobs_shoot_snowball,
388 --end maikerumine code
390 if minetest.settings:get_bool("log_mods") then
391 minetest.log("action", "MC mobs loaded")