]> git.lizzy.rs Git - Crafter.git/blob - mods/jetpack/init.lua
Create custom dtime related move_to velocity api
[Crafter.git] / mods / jetpack / init.lua
1 local minetest,math = minetest,math
2
3 minetest.register_tool("jetpack:jetpack",{
4     description = "Jetpack",
5
6     groups = {chestplate = 1,},
7     inventory_image = "jetpack_item.png",
8     stack_max = 1,
9     wearing_texture = "jetpack.png",
10     tool_capabilities = {
11         full_punch_interval = 0,
12         max_drop_level = 0,
13         groupcaps = {
14         },
15         damage_groups = {
16
17         },
18         punch_attack_uses = 0,
19     }
20 })
21
22 local sound_handling_loop = {}
23
24 minetest.register_globalstep(function(dtime)
25     for _,player in ipairs(minetest.get_connected_players()) do
26         local player_name = player:get_player_name()
27         if player:get_hp() > 0 then
28             if player:get_player_control().jump or player:get_player_control().sneak then
29                 local inv = player:get_inventory()
30                 local stack = inv:get_stack("armor_torso",1)
31                 local name = stack:get_name()
32                 if name ~= "" and name == "jetpack:jetpack" then
33                     --boost
34                     if player:get_player_control().jump and player:get_player_velocity().y < 20 then
35                         player:add_player_velocity(vector.new(0,1,0))
36                         player:set_physics_override({gravity=1.25})
37                     --hover
38                     elseif player:get_player_control().sneak then
39                         local currentvel = player:get_player_velocity()
40                         local goal = 0
41                                     local acceleration = vector.new(0,goal-currentvel.y,0)
42                                     acceleration = vector.multiply(acceleration, 0.05)
43                         player:add_player_velocity(acceleration)
44                         player:set_physics_override({gravity=0})
45                     end
46                     
47                     local particle_pos = player:get_pos()
48                     local yaw = player:get_look_horizontal()
49                     local p_dir = vector.divide(minetest.yaw_to_dir(yaw + math.pi),8)
50                     particle_pos.y = particle_pos.y + 0.7
51                     particle_pos = vector.add(particle_pos,p_dir)
52
53
54                     minetest.add_particle({
55                                                 pos = particle_pos,
56                                                 velocity = {x=0, y=-20+player:get_player_velocity().y , z=0},
57                                                 acceleration = {x=math.random(-1,1), y=0, z=math.random(-1,1)},
58                                                 expirationtime = 1+math.random(),
59                                                 size = 1+math.random(),
60                                                 texture = "smoke.png",
61                                         })
62                     stack:add_wear(5)
63                     inv:set_stack("armor_torso", 1, stack)
64
65                     if not sound_handling_loop[player_name] then
66                         sound_handling_loop[player_name] = minetest.sound_play("jetpack", {object = player,loop=true,gain=0.3})
67                     end
68
69                     if inv:get_stack("armor_torso",1):get_name() == "" then
70                         recalculate_armor(player)
71                         set_armor_gui(player)
72                         player:set_physics_override({gravity=1.25})
73                         if sound_handling_loop[player_name] then
74                             --minetest.sound_play("armor_break",{to_player=player:get_player_name(),gain=1,pitch=math.random(80,100)/100})
75                             --minetest.sound_stop(sound_handling_loop[player_name])
76                             minetest.sound_fade(sound_handling_loop[player_name], -1, 0)
77                             sound_handling_loop[player_name] = nil
78                         end
79                     end
80                 end
81             elseif sound_handling_loop[player_name] then
82                 player:set_physics_override({gravity=1.25})
83                 minetest.sound_stop(sound_handling_loop[player_name])
84                 sound_handling_loop[player_name] = nil
85             end
86         end
87     end
88 end)
89
90 minetest.register_craft({
91     output = "jetpack:jetpack",
92     recipe = {
93         {"main:iron"           , "main:gold"    , "main:iron"          },
94         {"main:iron"           , "main:diamond" , "main:iron"          },
95         {"redstone:piston_off" , "redstone:dust", "redstone:piston_off"}
96     }
97 })