Reloading, new collison detection method

master
zmv7 2022-08-24 18:45:59 +05:00 committed by GitHub
parent a765f0130c
commit a42c43ef5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 55 additions and 28 deletions

View File

@ -1,5 +1,15 @@
local rocket_radius = tonumber(minetest.settings:get("rocket_launcher_radius")) or 3
minetest.register_chatcommand("rocket-radius", {
local reloading = {}
local function reload(name)
if not reloading[name] then
reloading[name] = true
minetest.after(4,function()
reloading[name] = false
end)
end
end
core.register_chatcommand("rocket-radius", {
description = "Set rocket explosion radius",
params = "<number>",
privs = {server=true},
@ -10,40 +20,50 @@ minetest.register_chatcommand("rocket-radius", {
return true, 'Radius set to '..param
end
end})
minetest.register_craftitem("rocket_launcher:rocket", {
core.register_craftitem("rocket_launcher:rocket", {
wield_scale = {x=1,y=1,z=1.5},
stack_max = 16,
description = "Rocket",
inventory_image = "rocket.png",
})
minetest.register_tool("rocket_launcher:launcher", {
local owner
core.register_tool("rocket_launcher:launcher", {
wield_scale = {x=1,y=1,z=2},
description = "Rocket Launcher",
inventory_image = "rocket_launcher.png",
on_use = function(itemstack, user, pointed_thing)
local creative = minetest.check_player_privs(user:get_player_name(), {creative = true})
local name = user:get_player_name()
local creative = core.check_player_privs(name, {creative = true})
local inv = user:get_inventory()
if inv:contains_item("main", "rocket_launcher:rocket") or creative then
if not creative then inv:remove_item("main", "rocket_launcher:rocket 1") end
if inv:contains_item("main", "rocket_launcher:rocket") or creative then
if not creative then
if reloading[name] then
core.chat_send_player(name, "Rocket launcher is reloading")
return
end
reload(name)
inv:remove_item("main", "rocket_launcher:rocket 1")
end
local pos = user:get_pos()
local dir = user:get_look_dir()
local yaw = user:get_look_horizontal()
if pos and dir then
pos.y = pos.y + 1.5
local obj = minetest.add_entity(pos, "rocket_launcher:rocket")
local obj = core.add_entity(pos, "rocket_launcher:rocket")
if obj then
obj:setvelocity({x=dir.x * 30, y=dir.y * 30, z=dir.z * 30})
obj:set_yaw(yaw)
owner = user
end
end
minetest.sound_play('rocket_launch',{to_player = name, gain=0.5})
core.sound_play('rocket_launch',{to_player = name, gain=0.5})
return itemstack
end
end})
local rocket = {
armor_groups = {immortal = true},
physical = false,
physical = true,
timer = 0,
visual = "mesh",
mesh = 'rocket.obj',
@ -59,10 +79,10 @@ local rocket = {
rocket.on_step = function(self, dtime)
self.timer = self.timer + dtime
local pos = self.object:get_pos()
local node = minetest.get_node(pos)
local node = core.get_node(pos)
local rnd = math.random()
minetest.after(0.1,function()
minetest.add_particle({
core.after(0.1,function()
core.add_particle({
pos = pos,
velocity = {x=rnd,y=rnd,z=rnd},
--acceleration = {x=rnd,y=rnd,z=rnd},
@ -72,44 +92,51 @@ rocket.on_step = function(self, dtime)
vertical = false,
texture = "tnt_smoke.png",
glow = 15,})end)
if self.timer >= 60 then
self.object:remove()
end
if self.timer > 0.2 then
local objs = minetest.get_objects_inside_radius({x = pos.x, y = pos.y-1, z = pos.z}, 1)
local objs = core.get_objects_inside_radius({x = pos.x, y = pos.y-1, z = pos.z}, 1)
for k, obj in pairs(objs) do
if not obj then goto nodes end
local prop = obj:get_properties()
if not prop then goto nodes end
if obj:is_player() or prop.collide_with_objects then
tnt.boom(pos,{radius=rocket_radius})
if obj:is_player() or prop.collide_with_objects == true then
obj:punch(self.object, 1.0, {
full_punch_interval = 1.0,
damage_groups= {fleshy = 20},
}, nil)
if not core.is_protected(self.lastpos,"") then
tnt.boom(pos,{radius=rocket_radius})
end
self.object:remove()
end
end
end
::nodes::
if self.lastpos.x ~= nil then
if minetest.registered_nodes[node.name].walkable then
tnt.boom(self.lastpos,{radius=rocket_radius})
self.object:remove()
end
local velo = self.object:get_velocity()
if not velo then return end
if vector.length(velo) < 28 then
tnt.boom(pos,{radius=rocket_radius})
self.object:remove()
end
self.lastpos= {x = pos.x, y = pos.y, z = pos.z}
end
minetest.register_entity("rocket_launcher:rocket", rocket)
core.register_entity("rocket_launcher:rocket", rocket)
minetest.register_craft({
core.register_craft({
output = "rocket_launcher:rocket",
recipe = {
{"","default:steel_ingot",""},
{"dye:dark_green","default:mese_crystal","dye:dark_green"},
{"default:steel_ingot","default:mese_crystal","default:steel_ingot"},
{"default:steel_ingot","tnt:gunpowder","default:steel_ingot"}
}
})
minetest.register_craft({
core.register_craft({
output = "rocket_launcher:launcher",
recipe = {
{"default:steel_ingot","default:steel_ingot","default:steel_ingot"},
{"","default:mese_crystal","default:obsidian_block"},
{"dye:dark_green","default:mese","default:obsidian_block"},
{"default:steel_ingot","default:steel_ingot","default:steel_ingot"}
}
})