From c57cae73d974e4923f8cfd3bbf3ef0de923af9fe Mon Sep 17 00:00:00 2001 From: npx Date: Tue, 22 Mar 2016 22:22:45 +0100 Subject: [PATCH] Working on weapons --- nssm_api.lua | 9 +-- nssm_weapons.lua | 186 +++++++++++++++++++---------------------------- 2 files changed, 77 insertions(+), 118 deletions(-) diff --git a/nssm_api.lua b/nssm_api.lua index 7dc48d9..9a163a4 100644 --- a/nssm_api.lua +++ b/nssm_api.lua @@ -6,20 +6,15 @@ local c_brick = minetest.get_content_id("default:obsidianbrick") local c_chest = minetest.get_content_id("default:chest_locked") -- get node but use fallback for nil or unknown -local function node_ok(pos, fallback) - +function nssm:node_ok(pos, fallback) fallback = fallback or "default:dirt" - local node = minetest.get_node_or_nil(pos) - if not node then return minetest.registered_nodes[fallback] end - if minetest.registered_nodes[node.name] then return node end - return minetest.registered_nodes[fallback] end @@ -106,7 +101,7 @@ function nssm:explosion(pos, exp_radius, fire) and data[vi] ~= c_brick and data[vi] ~= c_chest then - local n = node_ok(p).name + local n = nssm:node_ok(p).name local on_blast = minetest.registered_nodes[n].on_blast if on_blast then diff --git a/nssm_weapons.lua b/nssm_weapons.lua index e57fa16..8694994 100644 --- a/nssm_weapons.lua +++ b/nssm_weapons.lua @@ -1,27 +1,12 @@ +--Parameters used by some weapons local default_dir = { x = 1, y = 1, z = 1, } -local function node_ok(pos, fallback) - - fallback = fallback or "default:dirt" - - local node = minetest.get_node_or_nil(pos) - - if not node then - return minetest.registered_nodes[fallback] - end - - if minetest.registered_nodes[node.name] then - return node - end - - return minetest.registered_nodes[fallback] -end - -function weapons_shot(itemstack, placer, pointed_thing, velocity, name) +--Function used to shoot: +local function weapons_shot(itemstack, placer, pointed_thing, velocity, name) local dir = placer:get_look_dir(); local playerpos = placer:getpos(); local obj = minetest.env:add_entity({x=playerpos.x+0+dir.x,y=playerpos.y+2+dir.y,z=playerpos.z+0+dir.z}, "nssm:"..name) @@ -30,20 +15,28 @@ function weapons_shot(itemstack, placer, pointed_thing, velocity, name) return itemstack end -function search_on_step(self, dtime, name, max_time, damage, dir, radius, not_transparent, vel, timer) - --local timer = 0 +--on_step function able to follow the mobs +local function search_on_step( + self, + dtime, --used to count time + max_time, --after this amount of time the entity is removec + radius, --radius in which look for entities to follow + vel, --velocity of the projectile + timer) + + local pos = self.object:getpos() - local vel = self.object:getvelocity() + + --Disappear after a certain time minetest.register_globalstep(function(dtime) timer = timer + dtime - --minetest.chat_send_all("Time: = "..timer.." Max_time: "..max_time) if timer>max_time then self.object:remove() end end) - --while going around it damages entities - local objects = minetest.env:get_objects_inside_radius(pos, 30) + --Look for an entity to follow + local objects = minetest.env:get_objects_inside_radius(pos, radius) local min_dist = 100 local obj_min = nil local obj_p = nil @@ -62,7 +55,7 @@ function search_on_step(self, dtime, name, max_time, damage, dir, radius, not_tr end end - + --Found an entity to follow: if obj_min ~= nil then local new_vel = {x=0, y=0, z=0} @@ -82,60 +75,43 @@ function search_on_step(self, dtime, name, max_time, damage, dir, radius, not_tr max_diff = math.abs(vec_min.z) end - vec_min.x = (vec_min.x/max_diff)*4 - vec_min.y = (vec_min.y/max_diff)*4 - vec_min.z = (vec_min.z/max_diff)*4 + vec_min.x = (vec_min.x/max_diff)*vel + vec_min.y = (vec_min.y/max_diff)*vel + vec_min.z = (vec_min.z/max_diff)*vel obj_p = obj_min:getpos() if min_dist < 1 then - local node = node_ok(pos).name + local node = nssm:node_ok(pos).name self.hit_node(self, pos, node) self.object:remove() return else self.object:setvelocity(vec_min) - --[[ - dir = 0 - max_diff = 0 - - if (max_diffmax_time then self.object:remove() end @@ -148,7 +124,7 @@ function default_on_step(self, dtime, name, max_time, damage, dir, radius, not_t elseif (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item") then obj:set_hp(obj:get_hp()-damage) if (obj:get_hp() <= 0) then - if (not obj:is_player()) and obj:get_entity_name() ~= "nssm:"..name then + if (not obj:is_player()) and obj:get_entity_name() ~= self.object:get_luaentity().name then obj:remove() end end @@ -156,23 +132,26 @@ function default_on_step(self, dtime, name, max_time, damage, dir, radius, not_t end local n = minetest.env:get_node(pos).name - --minetest.get_item_group(n, not_transparent)==0 - if n ~=not_transparent or (not_transparent==nil) then - --minetest.env:set_node(pos, {name="air"}) + if n ==not_transparent or (not_transparent==nil) or minetest.get_item_group(n, not_transparent)==1 then + local node = nssm:node_ok(pos).name + self.hit_node(self, pos, node) + self.object:remove() + return + else local vec = self.object:getvelocity() local c=vel/10 --calculate how many blocks around need to be removed local max = 0 local posmax = 0 - if max