From bd40c36582b15aa582505951ebc0f070eaa5c391 Mon Sep 17 00:00:00 2001 From: Fernando Zapata Date: Wed, 20 Jun 2012 19:07:08 -0600 Subject: [PATCH] Easy definition for projectile weapons --- weapon/init.lua | 161 +++++++++++++++++++++++++++ weapon/textures/weapon_at4.png | Bin 0 -> 170 bytes weapon/textures/weapon_at4_b.png | Bin 0 -> 153 bytes weapon/textures/weapon_at4_b_e.png | Bin 0 -> 138 bytes weapon/textures/weapon_rifle.png | Bin 0 -> 151 bytes weapon/textures/weapon_rifle_b.png | Bin 0 -> 106 bytes weapon/textures/weapon_rifle_b_e.png | Bin 0 -> 120 bytes 7 files changed, 161 insertions(+) create mode 100644 weapon/init.lua create mode 100644 weapon/textures/weapon_at4.png create mode 100644 weapon/textures/weapon_at4_b.png create mode 100644 weapon/textures/weapon_at4_b_e.png create mode 100644 weapon/textures/weapon_rifle.png create mode 100644 weapon/textures/weapon_rifle_b.png create mode 100644 weapon/textures/weapon_rifle_b_e.png diff --git a/weapon/init.lua b/weapon/init.lua new file mode 100644 index 0000000..b9fc783 --- /dev/null +++ b/weapon/init.lua @@ -0,0 +1,161 @@ +-------------------------------------------------------------------------------- +-- Weapons Mod +-------------------------------------------------------------------------------- +-- Function for adding projectile weapons + some examples +-- +-- (c)2012 Fernando Zapata +-- Code licensed under GNU GPLv2 +-- http://www.gnu.org/licenses/gpl-2.0.html +-- Content licensed under CC BY-SA 3.0 +-- http://creativecommons.org/licenses/by-sa/3.0/ +-------------------------------------------------------------------------------- + +local function explode( pos, rad, nod ) + nod = nod or 'fire:basic_flame' + for x= -rad, rad do + for y= -rad, rad do + for z= -rad, rad do + if ( x * x + y * y + z * z ) <= ( rad * rad + rad ) then + local np = { x=pos.x+x, y=pos.y+y, z=pos.z+z } + local n = minetest.env:get_node(np) + minetest.env:add_node( np, { name=nod } ) + end + end + end + end +end + +local function register_weapon( mod, name, wrep, brep, D, V, G, rad, exp, nod ) + + exp = exp or false + rad = rad or 1 + G = G or 9 + + local shoot = function( item, user, point ) + + if user:get_inventory():contains_item( 'main', + mod..':'..name..'_b' ) then + + user:get_inventory():remove_item( 'main', + mod..':'..name..'_b' ) + + local pos = user:getpos() + + local obj = minetest.env:add_entity({ + x = pos.x, + y = pos.y + 1.5, + z = pos.z + }, mod..':'..name..'_b_e' ) + + local dir = user:get_look_dir() + + obj:setvelocity( { + x = dir.x * V, + y = dir.y * V, + z = dir.z * V }) + + obj:setacceleration( { + x = dir.x * -3, + y = -G, + z = dir.z * -3 }) + end + return + + end + + local entity_p = { + physical = false, + textures = { mod..'_'..name..'_b_e.png' }, + collisionbox = { 0, 0, 0, 0, 0, 0 }, + timer = 0, + lastpos = {} + } + + entity_p.on_step = function(self, dtime) + + self.timer = self.timer+dtime + local pos = self.object:getpos() + local node = minetest.env:get_node(pos) + + if self.timer > rad/10 then + + local objs = minetest.env:get_objects_inside_radius( pos, rad ) + for k, obj in pairs( objs ) do + obj:set_hp( obj:get_hp() - D) + if obj:get_entity_name() ~= mod..':'..name..'_b_e' then + --if obj:get_hp()<=0 then + -- obj:remove() + --end + --obj:punch( obj ) + if exp then explode( pos, rad ) end + self.object:remove() + end + end + + end + + if self.lastpos.x ~= nil then + if node.name ~= "air" then + if exp then explode( pos, rad, nod ) end + self.object:remove() + end + end + + self.lastpos = pos + + end + + minetest.register_entity( mod..':'..name..'_b_e', entity_p ) + + minetest.register_craftitem( mod..':'..name, { + inventory_image = mod..'_'..name..'.png', + stack_max = 1, + on_use = shoot, + }) + + minetest.register_craftitem( mod..':'..name..'_b', { + inventory_image = mod..'_'..name..'_b.png', + }) + + minetest.register_craft({ + output = mod..':'..name, + recipe = wrep + }) + + minetest.register_craft({ + output = mod .. ':' .. name .. '_b 16', + recipe = brep + }) + +end + +------------------------------------------------------ Register Weapons -------- + +local modname = 'weapon' + +---- Rifle ---- +local rif_rep = { + { 'default:steel_ingot', 'default:steel_ingot', 'default:wood' }, + { '', '', 'default:wood' } +} + +local rifb_rep = { + { 'default:steel_ingot', 'default:coal_lump' } +} +register_weapon( modname, 'rifle', rif_rep, rifb_rep, 5, 25, 1.5 ) +---- Pistol ---- +--register_weapon( modname, 'pistol', 2, 20, 2 ) +---- Anti Tank 4 ---- +local at4_rep = { + { 'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot' }, + { '', '', '' }, + { 'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot' } +} + +local at4b_rep = { + { 'tnt:tnt', 'default:steel_ingot', 'default:coal_lump' } +} + +register_weapon( modname, 'at4', at4_rep, at4b_rep, 30, 15, 2, 3, true ) + +-------------------------------------------------------------------------------- diff --git a/weapon/textures/weapon_at4.png b/weapon/textures/weapon_at4.png new file mode 100644 index 0000000000000000000000000000000000000000..28dff25fb73a9e112d7ef7e2bc4b6d994cb3fbef GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bl>{;v81zicLc@a}aWG8C zi%$dc8B2ovf*Bm1-2ibsJzX3_IIf$XyU5$%z`=Z>j5$c1A=bhD!r$^wheYc<;%+fG zRP^1LeLh!1*x2`yWb~?8BCFJzmWdiY4G8$UvtqAr%u&l3pPe4CFP34`Is0~EImk*+ LS3j3^P62nGhDFn!-Y2{$GHZDR0r^>bP0l+XkKS!Ff% literal 0 HcmV?d00001 diff --git a/weapon/textures/weapon_rifle_b.png b/weapon/textures/weapon_rifle_b.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3357f47c63405066e70618d4983b360fa79b90 GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`hMq2tAr_~T6C_xf`6V`TwzaYU zPftil*irf2Fy_srnZXfPH$O1?`Rwj-1K-67A_6Q7Hy`k@$Ld6F25M&TboFyt=akR{ E0K;@40RR91 literal 0 HcmV?d00001 diff --git a/weapon/textures/weapon_rifle_b_e.png b/weapon/textures/weapon_rifle_b_e.png new file mode 100644 index 0000000000000000000000000000000000000000..8554aa7d09c889bbf161478ae4a1cac0f0910547 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2codrud~5R22v2@7Nlj0}62q8MJW z=r}q%9d7;~oW!wsUgypKv&-d;4Gawaq$eaKEIYFGzx(1^jdTY$rkX{IWEkvLa@x;t S^xF+Iiow&>&t;ucLK6UIUnLR% literal 0 HcmV?d00001