diff --git a/README.md b/README.md index 063cb81..6c23e85 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,8 @@ Adds simple hand grenades. **Depends:** shooter +**Optional Depends:** physics (from capturetheflag) + Adds rocket missiles and launching gun. diff --git a/shooter_rocket/init.lua b/shooter_rocket/init.lua index bda2aa3..27c9cf8 100644 --- a/shooter_rocket/init.lua +++ b/shooter_rocket/init.lua @@ -43,21 +43,17 @@ minetest.register_entity("shooter_rocket:rocket_entity", { self.object:remove() end end, - on_step = function(self, dtime) - self.timer = self.timer + dtime - if self.timer > 0.2 then - local pos = self.object:get_pos() - local above = {x=pos.x, y=pos.y + 1, z=pos.z} - if minetest.get_node(pos).name ~= "air" then - if self.user then - local player = minetest.get_player_by_name(self.user) - if player then - shooter.blast(above, 4, 50, 8, player) - end + on_step = function(self) + local pos = self.object:get_pos() + local above = {x=pos.x, y=pos.y + 1, z=pos.z} + if minetest.get_node(pos).name ~= "air" then + if self.user then + local player = minetest.get_player_by_name(self.user) + if player then + shooter.blast(above, 4, 50, 8, player) end - self.object:remove() end - self.timer = 0 + self.object:remove() end end, get_staticdata = function() @@ -65,46 +61,148 @@ minetest.register_entity("shooter_rocket:rocket_entity", { end, }) +--- Scope functions taken from sniper_rifles mod + +------------------ +-- Private data -- +------------------ + +-- Keep track of players who are scoping in, and their wielded item +local scoped = {} + +-- Timer for scope-check globalstep +local timer = 0.2 + +local physics_overrides = { + speed = 0.3, + jump = 0 +} + +------------- +-- Helpers -- +------------- + +local function show_scope(name, item_name) + local player = minetest.get_player_by_name(name) + if not player then + return + end + + scoped[name] = item_name + player:set_fov(1.1, true) + physics.set(name, "shooter_rocket:scoping", physics_overrides) + player:hud_set_flags({ wielditem = false }) +end + +local function hide_scope(name) + local player = minetest.get_player_by_name(name) + if not player then + return + end + + scoped[name] = nil + player:set_fov(0) + physics.remove(name, "shooter_rocket:scoping") + player:hud_set_flags({ wielditem = true }) + +end + +local function on_rclick(item, placer, pointed_thing) + local name = placer:get_player_name() + + -- Prioritize on "un-scoping", if player is using the scope + if not scoped[name] and pointed_thing.type == "node" then + return minetest.item_place(item, placer, pointed_thing) + end + + if scoped[name] then + hide_scope(name) + else + -- Remove _loaded suffix added to item name by shooter + local item_name = item:get_name():gsub("_loaded", "") + show_scope(name, item_name) + end +end + +------------------ +-- Scope-check -- +------------------ + +-- Hide scope if currently wielded item is not the same item +-- player wielded when scoping + +local time = 0 +if minetest.get_modpath("physics") then + minetest.register_globalstep(function(dtime) + time = time + dtime + if time < timer then + return + end + + time = 0 + for name, original_item in pairs(scoped) do + local player = minetest.get_player_by_name(name) + if not player then + scoped[name] = nil + else + local wielded_item = player:get_wielded_item():get_name():gsub("_loaded", "") + if wielded_item ~= original_item then + hide_scope(name) + end + end + end + end) +end + minetest.register_tool("shooter_rocket:rocket_gun_loaded", { description = "Rocket Gun", inventory_image = "shooter_rocket_gun_loaded.png", groups = {not_in_creative_inventory=1}, + on_place = on_rclick, + on_secondary_use = on_rclick, on_use = function(itemstack, user, pointed_thing) - if not minetest.setting_getbool("creative_mode") then - itemstack:add_wear(65535 / 50) + if not minetest.get_modpath("physics") then + scoped[user:get_player_name()] = true end - itemstack = "shooter_rocket:rocket_gun 1 "..itemstack:get_wear() - if pointed_thing.type ~= "nothing" then - local pointed = minetest.get_pointed_thing_position(pointed_thing) - if vector.distance(user:get_pos(), pointed) < 8 then - shooter.blast(pointed, 2, 50, 7) - return itemstack + if scoped[user:get_player_name()] then + if not minetest.setting_getbool("creative_mode") then + itemstack:add_wear(65535 / 50) end - end - local pos = user:get_pos() - local dir = user:get_look_dir() - local yaw = user:get_look_horizontal() - if pos and dir and yaw then - pos.y = pos.y + user:get_properties().eye_height - local obj = minetest.add_entity(pos, "shooter_rocket:rocket_entity") - if obj then - minetest.sound_play("shooter_rocket_fire", {object=obj}) - obj:set_velocity(vector.multiply(dir, 20)) - obj:set_acceleration({x=dir.x * -3, y=-10, z=dir.z * -3}) - obj:set_yaw(yaw + math.pi / 2) - local ent = obj:get_luaentity() - if ent then - ent.user = user:get_player_name() + itemstack = "shooter_rocket:rocket_gun 1 "..itemstack:get_wear() + if pointed_thing.type ~= "nothing" then + local pointed = minetest.get_pointed_thing_position(pointed_thing) + if vector.distance(user:get_pos(), pointed) < 8 then + shooter.blast(pointed, 2, 50, 7) + return itemstack end end + local pos = user:get_pos() + local dir = user:get_look_dir() + local yaw = user:get_look_horizontal() + if pos and dir and yaw then + pos.y = pos.y + user:get_properties().eye_height + local obj = minetest.add_entity(pos, "shooter_rocket:rocket_entity") + if obj then + minetest.sound_play("shooter_rocket_fire", {object=obj}) + obj:set_velocity(vector.multiply(dir, 20)) + obj:set_acceleration({x=dir.x * -3, y=-10, z=dir.z * -3}) + obj:set_yaw(yaw + math.pi / 2) + local ent = obj:get_luaentity() + if ent then + ent.user = user:get_player_name() + end + end + end + return itemstack end - return itemstack end, }) minetest.register_tool("shooter_rocket:rocket_gun", { description = "Rocket Gun", inventory_image = "shooter_rocket_gun.png", + on_place = on_rclick, + on_secondary_use = on_rclick, on_use = function(itemstack, user) local inv = user:get_inventory() if inv:contains_item("main", "shooter_rocket:rocket") then diff --git a/shooter_rocket/mod.conf b/shooter_rocket/mod.conf index 3a2c75b..14a9e52 100644 --- a/shooter_rocket/mod.conf +++ b/shooter_rocket/mod.conf @@ -1,3 +1,4 @@ name = shooter_rocket description = Adds rocket missiles and launching gun depends = shooter +optional_depends = physics