commit 1c681797497a892a2d5fa5a044d8b94858bc3eb1 Author: Ginger88895 Date: Tue Sep 22 06:18:24 2015 +0000 Init diff --git a/bettertnt/depends.txt b/bettertnt/depends.txt new file mode 100644 index 0000000..633d6c6 --- /dev/null +++ b/bettertnt/depends.txt @@ -0,0 +1,2 @@ +str_helpers +default \ No newline at end of file diff --git a/bettertnt/init.lua b/bettertnt/init.lua new file mode 100644 index 0000000..84c4a6d --- /dev/null +++ b/bettertnt/init.lua @@ -0,0 +1,371 @@ +local tnt_tables = {["bettertnt:tnt1"] = {r=6}, + ["bettertnt:tnt2"] = {r=1}, + ["bettertnt:tnt3"] = {r=2}, + ["bettertnt:tnt4"] = {r=4}, + ["bettertnt:tnt5"] = {r=6}, + ["bettertnt:tnt6"] = {r=8}, + ["bettertnt:tnt7"] = {r=10}, + ["bettertnt:tnt8"] = {r=12}, + ["bettertnt:tnt9"] = {r=14}, + ["bettertnt:tnt10"] = {r=16}, + ["bettertnt:tnt11"] = {r=18}, + ["bettertnt:tnt12"] = {r=20}, + ["bettertnt:tnt13"] = {r=22}, + ["bettertnt:tnt14"] = {r=25}, + ["bettertnt:tnt15"] = {r=30}, + ["bettertnt:tnt16"] = {r=35}, + ["bettertnt:tnt17"] = {r=40}, + ["bettertnt:tnt18"] = {r=45}, + ["bettertnt:tnt19"] = {r=50}, + ["bettertnt:tnt20"] = {r=55}, + ["bettertnt:tnt21"] = {r=60}, + ["bettertnt:tnt22"] = {r=65}, + ["bettertnt:tnt23"] = {r=70}, + ["bettertnt:tnt24"] = {r=75}, + ["bettertnt:tnt25"] = {r=80}, + ["bettertnt:tnt26"] = {r=85}, + ["bettertnt:tnt27"] = {r=90}, + ["bettertnt:tnt28"] = {r=95}, + ["bettertnt:tnt29"] = {r=100}, + ["bettertnt:tnt30"] = {r=105}, + ["bettertnt:tnt31"] = {r=110}, + ["bettertnt:tnt32"] = {r=115}, + ["bettertnt:tnt33"] = {r=120}, + ["bettertnt:tnt34"] = {r=125}, + ["bettertnt:tnt35"] = {r=130}, + ["bettertnt:tnt36"] = {r=135}, + ["bettertnt:tnt37"] = {r=140}, + ["bettertnt:tnt38"] = {r=145}, + ["bettertnt:tnt39"] = {r=150}, + ["bettertnt:tnt40"] = {r=160}, +} + + +tnt = {} +tnt.force = {} +tnt.accl = {} + +local function is_tnt(name) + if tnt_tables[name]~=nil then return true end + return false +end + +local function combine_texture(texture_size, frame_count, texture, ani_texture) + local l = frame_count + local px = 0 + local combine_textures = ":0,"..px.."="..texture + while l ~= 0 do + combine_textures = combine_textures..":0,"..px.."="..texture + px = px+texture_size + l = l-1 + end + return ani_texture.."^[combine:"..texture_size.."x"..texture_size*frame_count..":"..combine_textures.."^"..ani_texture +end + +local animated_tnt_texture = combine_texture(16, 4, "default_tnt_top.png", "bettertnt_top_burning_animated.png") + +tnt_c_tnt = {} +tnt_c_tnt_burning = {} +tnt_types_int = {} + +for name,data in pairs(tnt_tables) do + + tnt_types_int[#tnt_types_int] = name + + minetest.register_node(name, { + description = "TNT ("..name..")", + tiles = {"default_tnt_top.png", "default_tnt_bottom.png", "default_tnt_side.png"}, + groups = {dig_immediate=2, mesecon=2}, + sounds = default.node_sound_wood_defaults(), + + on_punch = function(pos, node, puncher) + if puncher:get_wielded_item():get_name() == "default:torch" then + if minetest.is_protected(pos, puncher:get_player_name()) then + print(puncher:get_player_name() .. " tried to light TNT at " .. minetest.pos_to_string(pos)) + minetest.record_protection_violation(pos, puncher:get_player_name()) + return + end + minetest.sound_play("bettertnt_ignite", {pos=pos}) + boom(pos, 4, puncher) + minetest.set_node(pos, {name=name.."_burning"}) + end + end, + + mesecons = { + effector = { + action_on = function(pos, node) + boom(pos, 0) + end + }, + }, + }) + + minetest.register_node(name.."_burning", { + tiles = {{name=animated_tnt_texture, animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1}}, + "default_tnt_bottom.png", "default_tnt_side.png"}, + light_source = 5, + drop = "", + sounds = default.node_sound_wood_defaults(), + }) + + local prev = "bettertnt:tnt"..tonumber(strs:rem_from_start(name, "bettertnt:tnt"))-1 + if prev=="bettertnt:tnt0" then prev="" end + --print(name .. " is made from " .. prev) + + minetest.register_craft({ + output = name, + recipe = { + {"", "bettertnt:gunpowder", "" }, + {"bettertnt:gunpowder", prev, "bettertnt:gunpowder" }, + {"", "bettertnt:gunpowder", "" } + } + }) + + tnt_c_tnt[#tnt_c_tnt + 1] = minetest.get_content_id(name) + tnt_c_tnt_burning[#tnt_c_tnt_burning + 1] = minetest.get_content_id(name.."_burning") + +end + + +local function get_tnt_random(pos) + return PseudoRandom(math.abs(pos.x+pos.y*3+pos.z*5)+15) +end + + + + + +function boom(pos, time, player) + local id = minetest.get_node(pos).name + boom_id(pos, time, player, id) +end + +function boom_id(pos, time, player, id) + minetest.after(time, function(pos) + + local tnt_range = tnt_tables[id].r * 2 + + local t1 = os.clock() + pr = get_tnt_random(pos) + minetest.sound_play("bettertnt_explode", {pos=pos, gain=1.5, max_hear_distance=tnt_range*64}) + + minetest.remove_node(pos) + +-- local manip = minetest.get_voxel_manip() +-- local width = tnt_range +-- local emerged_pos1, emerged_pos2 = manip:read_from_map({x=pos.x-width, y=pos.y-width, z=pos.z-width}, +-- {x=pos.x+width, y=pos.y+width, z=pos.z+width}) +-- area = VoxelArea:new{MinEdge=emerged_pos1, MaxEdge=emerged_pos2} +-- nodes = manip:get_data() +-- +-- local p_pos = area:index(pos.x, pos.y, pos.z) +-- nodes[p_pos] = tnt_c_air + minetest.add_particle(pos, {x=0,y=0,z=0}, {x=0,y=0,z=0}, 0.5, 16, false, "bettertnt_boom.png") + --minetest.set_node(pos, {name="tnt:boom"}) + + local objects = minetest.get_objects_inside_radius(pos, tnt_range/2) + for _,obj in ipairs(objects) do + if obj:is_player() or (obj:get_luaentity() and obj:get_luaentity().name ~= "__builtin:item") then + local obj_p = obj:getpos() + local vec = {x=obj_p.x-pos.x, y=obj_p.y-pos.y, z=obj_p.z-pos.z} + local dist = (vec.x^2+vec.y^2+vec.z^2)^0.5 + local damage = 0 + if dist < tnt_range/3.0 then damage = tnt_range end + obj:punch(obj, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damage}, + }, vec) + end + end + + local storedPoses = {} + + if id~="bettertnt:tnt1" then + for dx=-tnt_range,tnt_range do + for dz=-tnt_range,tnt_range do + for dy=-tnt_range,tnt_range do + local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} + ---------------------------------------- + local dist = (dx^2) + (dy^2) + (dz^2) + dist = dist^(1/2.0) + if dist <= tnt_range then + --local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} + --vector.add(p, dir) + ---------------------------------------- + -- local p_node = area:index(p.x, p.y, p.z) + -- local d_p_node = nodes[p_node] + local node = minetest.get_node(p) + local nodename = node.name + if is_tnt(nodename)==true then + minetest.remove_node(p) + boom_id(p, 0.5, player, nodename) -- was {x=p.x, y=p.y, z=p.z} + elseif nodename~="air" then + --if math.abs(dx)