From 0f92ac9425b05c60a76c39ebd141c7db96ce5223 Mon Sep 17 00:00:00 2001 From: stujones11 Date: Fri, 13 Dec 2013 19:34:39 +0000 Subject: [PATCH] Update version 0.3.0, shoot nodes at long range --- README.txt | 6 +-- shooter.conf.example | 6 +++ shooter.lua | 99 ++++++++++++++++++++++++++++---------------- 3 files changed, 71 insertions(+), 40 deletions(-) diff --git a/README.txt b/README.txt index b726015..b017051 100644 --- a/README.txt +++ b/README.txt @@ -1,9 +1,9 @@ Minetest Mod - Simple Shooter [shooter] ======================================= -Mod Version: 0.2.0 +Mod Version: 0.3.0 -Minetest Version: 0.4.8 +Minetest Version: 0.4.8-dev d9ef072305 Depends: default @@ -13,8 +13,6 @@ that which is currently being used by the firearms mod. For the most part I think I have achieved this for straight pvp, however, the jury is still out as to whether it is any faster against entities (mobs) -One big downside of this method is that it only works against ordinary nodes -within pointable range of the player. By default this mod is configured to work only against other players in multiplayer (server) mode. This is overridden in singleplayer mode to work diff --git a/shooter.conf.example b/shooter.conf.example index bc44e8c..82e96ab 100644 --- a/shooter.conf.example +++ b/shooter.conf.example @@ -5,6 +5,12 @@ -- Particle texture used when target it hit SHOOTER_EXPLOSION_TEXTURE = "shooter_hit.png" +-- Allow node destruction +SHOOTER_ALLOW_NODES = true + +-- Maximum node rage, applies only if nodes are allowed +SHOOTER_NODE_RANGE = 50 + -- Allow entities in multiplayer mode SHOOTER_ALLOW_ENTITIES = false diff --git a/shooter.lua b/shooter.lua index 1ab4d24..5bea2ec 100644 --- a/shooter.lua +++ b/shooter.lua @@ -1,7 +1,9 @@ shooter = {} SHOOTER_EXPLOSION_TEXTURE = "shooter_hit.png" +SHOOTER_ALLOW_NODES = true SHOOTER_ALLOW_ENTITIES = false +SHOOTER_NODE_RANGE = 50 SHOOTER_OBJECT_RANGE = 50 local modpath = minetest.get_modpath(minetest.get_current_modname()) @@ -44,6 +46,36 @@ local function is_valid_object(object) return false end +local function punch_node(pos, def) + local node = minetest.get_node(pos) + if not node then + return + end + local item = minetest.registered_items[node.name] + if not item.groups then + return + end + for k, v in pairs(def.groups) do + local level = item.groups[k] or 0 + if level >= v then + minetest.remove_node(pos) + local sounds = item.sounds + if sounds then + local soundspec = sounds.dug + if soundspec then + soundspec.pos = pos + minetest.sound_play(soundspec.name, soundspec) + end + end + local tiles = item.tiles + if tiles then + return tiles[1] + end + break + end + end +end + function shooter:fire_weapon(user, pointed_thing, def) local name = user:get_player_name() if shots[name] then @@ -60,37 +92,12 @@ function shooter:fire_weapon(user, pointed_thing, def) {x=0, y=0, z=0}, 0.5, 0.25, false, def.particle ) - if pointed_thing.type == "node" then + if pointed_thing.type == "node" and SHOOTER_ALLOW_NODES == true then local pos = minetest.get_pointed_thing_position(pointed_thing, false) - local node = minetest.get_node(pos) - if not node then - return - end - local item = minetest.registered_items[node.name] - if not item.groups then - return - end - for k, v in pairs(def.groups) do - local level = item.groups[k] or 0 - if level >= v then - minetest.remove_node(pos) - local sounds = item.sounds - if sounds then - local soundspec = sounds.dug - if soundspec then - soundspec.pos = pos - minetest.sound_play(soundspec.name, soundspec) - end - end - local tiles = item.tiles - if tiles then - if tiles[1] then - spawn_particles({x=p1.x, y=p1.y + 0.75, z=p1.z}, - v1, vector.distance(p1, pos), tiles[1]) - end - end - break - end + local texture = punch_node(pos, def) + if texture then + spawn_particles({x=p1.x, y=p1.y + 0.75, z=p1.z}, + v1, vector.distance(p1, pos), texture) end return elseif pointed_thing.type == "object" then @@ -141,20 +148,40 @@ function shooter:fire_weapon(user, pointed_thing, def) target = { object = object, distance = x, - direction = v1, - pos1 = {x=p1.x, z=p1.z, y=p1.y+1}, - pos2 = {x=p2.x, z=p2.z, y=p2.y+1.75}, + pos = {x=p2.x, z=p2.z, y=p2.y+1.75}, } end end end end end + local view_pos = {x=p1.x, y=p1.y + 1.75, z=p1.z} if target.object then - if minetest.line_of_sight(target.pos1, target.pos2, 1) then - target.object:punch(user, nil, def.tool_caps, target.direction) - spawn_particles(target.pos1, target.direction, + local success, pos = minetest.line_of_sight(view_pos, target.pos, 1) + if success then + target.object:punch(user, nil, def.tool_caps, v1) + spawn_particles({x=p1.x, y=p1.y + 0.75, z=p1.z}, v1, target.distance, SHOOTER_EXPLOSION_TEXTURE) + elseif pos and SHOOTER_ALLOW_NODES == true then + local texture = punch_node(pos, def) + if texture then + spawn_particles({x=p1.x, y=p1.y + 0.75, z=p1.z}, + v1, vector.distance(p1, pos), texture) + end + end + elseif SHOOTER_ALLOW_NODES == true then + local d = def.range + if d > SHOOTER_NODE_RANGE then + d = SHOOTER_NODE_RANGE + end + local p2 = vector.add(view_pos, vector.multiply(v1, {x=d, y=d, z=d})) + local success, pos = minetest.line_of_sight(view_pos, p2, 1) + if pos then + local texture = punch_node(pos, def) + if texture then + spawn_particles({x=p1.x, y=p1.y + 0.75, z=p1.z}, + v1, vector.distance(p1, pos), texture) + end end end end