diff --git a/canonballs.lua b/canonballs.lua index 7adbb5c..d11c61d 100644 --- a/canonballs.lua +++ b/canonballs.lua @@ -128,3 +128,160 @@ local tree={ if enable_fire then canons.register_muni("default:tree",tree) end + +--++++++++++++++++++++++++++++++++++++ +--+ Stone Cannon ball + +--++++++++++++++++++++++++++++++++++++ + + +local ball_wood={ + physical = false, + timer=0, + textures = {"canons_bullet.png"}, + lastpos={}, + damage=20, + range=1, + gravity=10, + velocity=40, + name="canons:stone_bullet", + collisionbox = {-0.25,-0.25,-0.25, 0.25,0.25,0.25}, + on_player_hit = function(self,pos,player) + local playername = player:get_player_name() + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=self.damage}, + }, nil) + self.object:remove() + minetest.chat_send_all(playername .." tried to catch a canonball") + end, + on_mob_hit = function(self,pos,mob) + mob:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=self.damage}, + }, nil) + self.object:remove() + end, + on_node_hit = function(self,pos,node) + if node.name == "default:dirt_with_grass" then + minetest.env:set_node({x=pos.x, y=pos.y, z=pos.z},{name="default:dirt"}) + minetest.sound_play("canons_hit", + {pos = pos, gain = 1.0, max_hear_distance = 32,}) + self.object:remove() + elseif node.name == "default:water_source" then + minetest.sound_play("canons_splash", + {pos = pos, gain = 1.0, max_hear_distance = 32,}) + self.object:remove() + else + minetest.sound_play("canons_hit", + {pos = pos, gain = 1.0, max_hear_distance = 32,}) + self.object:remove() + end + end, + +} +canons.register_muni("canons:canon_ball_wood",ball_wood) + +--++++++++++++++++++++++++++++++++++++ +--+ Stone Cannon ball + +--++++++++++++++++++++++++++++++++++++ + + +local ball_stone={ + physical = false, + timer=0, + textures = {"canons_bullet.png"}, + lastpos={}, + damage=20, + range=2, + gravity=10, + velocity=40, + name="canons:stone_bullet", + collisionbox = {-0.25,-0.25,-0.25, 0.25,0.25,0.25}, + on_player_hit = function(self,pos,player) + local playername = player:get_player_name() + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=self.damage}, + }, nil) + self.object:remove() + minetest.chat_send_all(playername .." tried to catch a canonball") + end, + on_mob_hit = function(self,pos,mob) + mob:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=self.damage}, + }, nil) + self.object:remove() + end, + on_node_hit = function(self,pos,node) + if node.name == "default:dirt_with_grass" then + minetest.env:set_node({x=pos.x, y=pos.y, z=pos.z},{name="default:dirt"}) + minetest.sound_play("canons_hit", + {pos = pos, gain = 1.0, max_hear_distance = 32,}) + self.object:remove() + elseif node.name == "default:water_source" then + minetest.sound_play("canons_splash", + {pos = pos, gain = 1.0, max_hear_distance = 32,}) + self.object:remove() + else + minetest.sound_play("canons_hit", + {pos = pos, gain = 1.0, max_hear_distance = 32,}) + self.object:remove() + end + end, + +} +canons.register_muni("canons:canon_ball_stone",ball_stone) + +--++++++++++++++++++++++++++++++++++++ +--+ Steel Cannon ball + +--++++++++++++++++++++++++++++++++++++ + + +local ball_steel={ + physical = false, + timer=0, + textures = {"canons_bullet_iron.png"}, + lastpos={}, + damage=30, + range=2, + gravity=5, + velocity=50, + name="canons:stone_bullet", + collisionbox = {-0.25,-0.25,-0.25, 0.25,0.25,0.25}, + on_player_hit = function(self,pos,player) + local playername = player:get_player_name() + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=self.damage}, + }, nil) + self.object:remove() + minetest.chat_send_all(playername .." tried to catch a canonball") + end, + on_mob_hit = function(self,pos,mob) + mob:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=self.damage}, + }, nil) + self.object:remove() + end, + on_node_hit = function(self,pos,node) + if node.name == "default:dirt_with_grass" then + minetest.env:set_node({x=pos.x, y=pos.y, z=pos.z},{name="default:dirt"}) + minetest.sound_play("canons_hit", + {pos = pos, gain = 1.0, max_hear_distance = 32,}) + self.object:remove() + elseif node.name == "default:water_source" then + minetest.sound_play("canons_splash", + {pos = pos, gain = 1.0, max_hear_distance = 32,}) + self.object:remove() + else + minetest.sound_play("canons_hit", + {pos = pos, gain = 1.0, max_hear_distance = 32,}) + self.object:remove() + end + end, + +} +canons.register_muni("canons:canon_ball_steel",ball_steel) + diff --git a/init.lua b/init.lua index 2c7c8d8..abc3721 100644 --- a/init.lua +++ b/init.lua @@ -14,4 +14,5 @@ dofile(MODPATH .."/items.lua") dofile(MODPATH .."/canonballs.lua") -minetest.log("action", "[MOD]"..minetest.get_current_modname().." -- loaded from "..minetest.get_modpath(minetest.get_current_modname())) \ No newline at end of file +minetest.log("action", "[MOD]"..minetest.get_current_modname().." -- loaded from "..minetest.get_modpath(minetest.get_current_modname())) + diff --git a/items.lua b/items.lua index ffedeae..8818cc8 100644 --- a/items.lua +++ b/items.lua @@ -1,3 +1,7 @@ +--++++++++++++++++++++++++++++++++++++ +--+ Craft Items + +--++++++++++++++++++++++++++++++++++++ + minetest.register_craftitem("canons:gunpowder", { groups = {gunpowder=1}, description = "Gunpowder", @@ -15,24 +19,6 @@ minetest.register_craftitem("canons:bucket_salt", { stack_max = 300 }) -minetest.register_craft({ - type = "shapeless", - output = 'canons:salt 12', - recipe = { - "canons:bucket_salt" - }, - replacements = { - {"canons:bucket_salt", "bucket:bucket_empty"} - } -}) - -minetest.register_craft({ - type = "cooking", - output = 'canons:bucket_salt', - recipe = 'bucket:bucket_water', - cooktime = 15 -}) - minetest.register_craftitem("canons:iron_barrel", { groups = {canonbarrel=1}, description = "Iron Cannonbarrel", @@ -52,6 +38,34 @@ minetest.register_craftitem("canons:mithrill_barrel", { stack_max = 10 }) +minetest.register_craftitem("canons:stone_bullet", { + Description = "Stone Bullet", + inventory_image = "canons_bullet.png" +}) + + +--++++++++++++++++++++++++++++++++++++ +--+ crafts + +--++++++++++++++++++++++++++++++++++++ + +minetest.register_craft({ + type = "shapeless", + output = 'canons:salt 12', + recipe = { + "canons:bucket_salt" + }, + replacements = { + {"canons:bucket_salt", "bucket:bucket_empty"} + } +}) + +minetest.register_craft({ + type = "cooking", + output = 'canons:bucket_salt', + recipe = 'bucket:bucket_water', + cooktime = 15 +}) + minetest.register_craft({ type = "shapeless", output = 'canons:gunpowder', @@ -60,6 +74,7 @@ minetest.register_craft({ }, }) +-- not needed -- minetest.register_craft({ output = 'canons:iron_barrel', recipe = { @@ -76,27 +91,119 @@ minetest.register_craft({ {"default:cobble", "default:cobble", "default:cobble"} }, }) +-- new crafts -- - -minetest.register_craftitem("canons:stone_bullet", { - Description = "Stone Bullet", - inventory_image = "canons_bullet.png" +minetest.register_craft({ + output = 'canons:canon', + recipe = { + {"default:steelblock", "default:steelblock", "default:steelblock"}, + {"canons:gunpowder", "default:mese_block", ""}, + {"default:steelblock", "default:steelblock", "default:steelblock"} + }, }) +minetest.register_craft({ + output = 'canons:bronze_canon', + recipe = { + {"default:bronzeblock", "default:bronzeblock", "default:bronzeblock"}, + {"canons:gunpowder", "default:mese_block", ""}, + {"default:bronzeblock", "default:bronzeblock", "default:bronzeblock"} + }, +}) + +minetest.register_craft({ + output = 'canons:canon_stand', + recipe = { + {"default:wood", "", "default:wood"}, + {"default:wood", "default:steelblock", "default:wood"}, + {"default:wood", "default:wood", "default:wood"} + }, +}) + +minetest.register_craft({ + type = "shapeless", + output = 'canons:canon_ball_steel_stack', + recipe = { + "canons:canon_ball_steel", "canons:canon_ball_steel", "canons:canon_ball_steel", "canons:canon_ball_steel" + }, +}) + +minetest.register_craft({ + type = "shapeless", + output = 'canons:canon_ball_stone_stack', + recipe = { + "canons:canon_ball_stone", "canons:canon_ball_stone", "canons:canon_ball_stone", "canons:canon_ball_stone" + }, +}) + +minetest.register_craft({ + type = "shapeless", + output = 'canons:canon_ball_wood_stack', + recipe = { + "canons:canon_ball_wood", "canons:canon_ball_wood", "canons:canon_ball_wood", "canons:canon_ball_wood" + }, +}) + +minetest.register_craft({ + output = 'canons:canon_ball_wood 2', + recipe = { + {"default:wood","default:wood"}, + }, +}) + +minetest.register_craft({ + output = 'canons:canon_ball_stone', + recipe = { + {"default:stone"}, + }, +}) + +minetest.register_craft({ + output = 'canons:canon_ball_steel', + recipe = { + {"default:steelblock"} + }, +}) + +-- silly crafts -- + + +--++++++++++++++++++++++++++++++++++++ +--+ cannon stuff + +--++++++++++++++++++++++++++++++++++++ canons.formspec = "size[8,9]".. "list[current_name;gunpowder;2,3;1,1;]".. "list[current_name;muni;2,1;1,1;]".. "list[current_player;main;0,5;8,4;]" - +-- classic cannon -- minetest.register_node("canons:canon", { - description = "Canon", - tiles = {"default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png", - "default_furnace_side.png","cannon_back.png", "cannon_front.png"}, + description = "Cannon", + stack_max = 1, + tiles = {"cannon_cannon_top.png","cannon_cannon_top.png","cannon_cannon_side.png","cannon_cannon_side.png","cannon_cannon_top.png^canons_canons_rim.png","cannon_cannon_side.png"}, + drawtype = "nodebox", + paramtype = "light", paramtype2 = "facedir", - groups = {cracky=2,canon=1}, - legacy_facedir_simple = true, - sounds = default.node_sound_stone_defaults(), + is_ground_content = true, + groups = {cracky=1}, + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.2, 0.2, -0.7, 0.2, -0.2, 0.9}, -- barrle -- + {0.53, -0.1, 0.1, -0.53, 0.1, -0.1}, -- plinth -- + + -- side , top hight , depth , side , bottom, side, + + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.2, 0.2, -0.7, 0.2, -0.2, 0.9}, + {0.53, -0.1, 0.1, -0.53, 0.1, -0.1}, + }, + }, on_punch = canons.punched, on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -153,4 +260,312 @@ minetest.register_node("canons:canon", { }) +-- bronze cannon -- +minetest.register_node("canons:bronze_canon", { + description = "Cannon", + stack_max = 1, + tiles = {"cannon_bronze_cannon_top.png","cannon_bronze_cannon_top.png","cannon_bronze_cannon_side.png","cannon_bronze_cannon_side.png","cannon_bronze_cannon_top.png^canons_canons_rim.png","cannon_bronze_cannon_side.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = true, + groups = {cracky=1}, + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.2, 0.2, -0.7, 0.2, -0.2, 0.9}, -- barrle -- + {0.53, -0.1, 0.1, -0.53, 0.1, -0.1}, -- plinth -- + + -- side , top hight , depth , side , bottom, side, + + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.2, 0.2, -0.7, 0.2, -0.2, 0.9}, + {0.53, -0.1, 0.1, -0.53, 0.1, -0.1}, + }, + }, + on_punch = canons.punched, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", canons.formspec) + meta:set_string("infotext", "Canon has no muni and no gunpowder") + local inv = meta:get_inventory() + inv:set_size("gunpowder", 1) + inv:set_size("muni", 1) + + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + if not inv:is_empty("gunpowder") then + return false + elseif not inv:is_empty("muni") then + return false + else + return true + end + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + stack = stack:to_table() + if listname == "gunpowder" and stack.name == "canons:gunpowder" then + return stack.count + elseif listname == "muni" and canons.is_muni(stack.name) then + return stack.count + else return 0 + end + + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + stack = stack:to_table() + if to_list == "gunpowder" and stack.name == "canons:gunpowder" then + return count + + elseif to_list == "muni" and canons.is_muni(stack.name) then + return count + else + return 0 + end + + end, + on_metadata_inventory_put = canons.inventory_modified, + + on_metadata_inventory_take = canons.inventory_modified, + + on_metadata_inventory_move = canons.inventory_modified, + +}) + +minetest.register_node("canons:canon_stand", { + description = "Cannon Stand", + stack_max = 99, + tiles = {"default_junglewood.png","default_junglewood.png^canons_canons_rim.png","default_junglewood.png^canons_canons_rim.png","default_junglewood.png^canons_canons_rim.png","default_cobble.png","default_junglewood.png^canons_canons_rim.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, -- bottom -- + {-0.5, -0.5, -0.5, -0.35, 1.0, 0.5}, -- side left -- + {0.35, -0.5, -0.5, 0.5, 1.0, 0.5}, -- side right -- + {0.35, -0.5, -0.2, 0.5, 1.2, 0.5}, -- side right -- + {-0.5, -0.5, -0.2, -0.35, 1.2, 0.5}, -- side left -- + + -- side , top , side , side , bottom, side, + + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + }, +}) +minetest.register_node("canons:canon_ball_wood", { + description = "Cannon Ball Stone", + stack_max = 99, + tiles = {"default_wood.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2}, + + -- side , top , side , side , bottom, side, + + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2}, + }, + }, +}) + +minetest.register_node("canons:canon_ball_stone", { + description = "Cannon Ball Stone", + stack_max = 99, + tiles = {"default_stone.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2}, + + -- side , top , side , side , bottom, side, + + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2}, + }, + }, +}) + +minetest.register_node("canons:canon_ball_steel", { + description = "Cannon Ball Wood", + stack_max = 99, + tiles = {"cannon_cannon_top.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2}, + + -- side , top , side , side , bottom, side, + + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2}, + }, + }, +}) + +minetest.register_node("canons:canon_ball_wood_stack", { + description = "Cannon Ball Wood Stack", + stack_max = 99, + tiles = {"default_wood.png"}, + drawtype = "nodebox", + drop = 'canons:canon_ball_wood 4', + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.2, -0.1, -0.2, 0.2, 0.3, 0.2}, -- ball top + {0.1, -0.5, -0.2, 0.2, -0.1, 0.2}, -- ball left + {0.5, -0.5, -0.2, 0.2, -0.1, 0.2}, -- ball left + {-0.2, -0.5, 0.5, 0.0, -0.1, 0.2},-- ball back + {0.0, -0.5, 0.1, -0.4, -0.1, 0.2},--ball back + {-0.2, -0.5, 0.5, -0.4, -0.1, 0.2},-- ball back + {-0.2, -0.5, 0.1, -0.4, -0.1, 0.2},-- ball back + {-0.2, -0.5, -0.1, -0.4, -0.1, -0.5}, + {0.0, -0.5, -0.1, -0.4, -0.1, -0.5}, + + + -- side , top , side , side , bottom, side, + + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.4, -0.5, -0.5, 0.5, 0.3, 0.5}, + }, + }, +}) + + +minetest.register_node("canons:canon_ball_stone_stack", { + description = "Cannon Ball Stone Stack", + stack_max = 99, + tiles = {"default_stone.png"}, + drawtype = "nodebox", + drop = 'canons:canon_ball_stone 4', + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.2, -0.1, -0.2, 0.2, 0.3, 0.2}, -- ball top + {0.1, -0.5, -0.2, 0.2, -0.1, 0.2}, -- ball left + {0.5, -0.5, -0.2, 0.2, -0.1, 0.2}, -- ball left + {-0.2, -0.5, 0.5, 0.0, -0.1, 0.2},-- ball back + {0.0, -0.5, 0.1, -0.4, -0.1, 0.2},--ball back + {-0.2, -0.5, 0.5, -0.4, -0.1, 0.2},-- ball back + {-0.2, -0.5, 0.1, -0.4, -0.1, 0.2},-- ball back + {-0.2, -0.5, -0.1, -0.4, -0.1, -0.5}, + {0.0, -0.5, -0.1, -0.4, -0.1, -0.5}, + + + -- side , top , side , side , bottom, side, + + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.4, -0.5, -0.5, 0.5, 0.3, 0.5}, + }, + }, +}) + +minetest.register_node("canons:canon_ball_steel_stack", { + description = "Cannon Ball Steel Stack", + stack_max = 99, + tiles = {"cannon_cannon_top.png"}, + drawtype = "nodebox", + drop = 'canons:canon_ball_steel 4', + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.2, -0.1, -0.2, 0.2, 0.3, 0.2}, -- ball top + {0.1, -0.5, -0.2, 0.2, -0.1, 0.2}, -- ball left + {0.5, -0.5, -0.2, 0.2, -0.1, 0.2}, -- ball left + {-0.2, -0.5, 0.5, 0.0, -0.1, 0.2},-- ball back + {0.0, -0.5, 0.1, -0.4, -0.1, 0.2},--ball back + {-0.2, -0.5, 0.5, -0.4, -0.1, 0.2},-- ball back + {-0.2, -0.5, 0.1, -0.4, -0.1, 0.2},-- ball back + {-0.2, -0.5, -0.1, -0.4, -0.1, -0.5}, + {0.0, -0.5, -0.1, -0.4, -0.1, -0.5}, + + + -- side , top , side , side , bottom, side, + + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.4, -0.5, -0.5, 0.5, 0.3, 0.5}, + }, + }, +}) + + diff --git a/sounds/canons_hit.ogg b/sounds/canons_hit.ogg index a49efb3..df953f1 100644 Binary files a/sounds/canons_hit.ogg and b/sounds/canons_hit.ogg differ diff --git a/textures/cannon_bronze_cannon_side.png b/textures/cannon_bronze_cannon_side.png new file mode 100644 index 0000000..cac19ad Binary files /dev/null and b/textures/cannon_bronze_cannon_side.png differ diff --git a/textures/cannon_bronze_cannon_top.png b/textures/cannon_bronze_cannon_top.png new file mode 100644 index 0000000..b1e54e0 Binary files /dev/null and b/textures/cannon_bronze_cannon_top.png differ diff --git a/textures/cannon_cannon_side.png b/textures/cannon_cannon_side.png new file mode 100644 index 0000000..0cea091 Binary files /dev/null and b/textures/cannon_cannon_side.png differ diff --git a/textures/cannon_cannon_top.png b/textures/cannon_cannon_top.png new file mode 100644 index 0000000..223dcb6 Binary files /dev/null and b/textures/cannon_cannon_top.png differ diff --git a/textures/canons_bullet - Copy.png b/textures/canons_bullet - Copy.png new file mode 100644 index 0000000..4101283 Binary files /dev/null and b/textures/canons_bullet - Copy.png differ diff --git a/textures/canons_bullet_iron.png b/textures/canons_bullet_iron.png new file mode 100644 index 0000000..a6f6269 Binary files /dev/null and b/textures/canons_bullet_iron.png differ diff --git a/textures/canons_canons_rim.png b/textures/canons_canons_rim.png new file mode 100644 index 0000000..aa9cddd Binary files /dev/null and b/textures/canons_canons_rim.png differ