211 lines
6.2 KiB
Lua
Raw Normal View History

2018-03-25 17:18:20 -05:00
material_Strengths = {}
2018-03-27 14:56:01 -07:00
black_list = {"ctf_flag:flag","ctf_flag:flag_captured_top"}
for color, _ in pairs(ctf.flag_colors) do
table.insert(black_list,"ctf_flag:flag_top_"..color)
end
2018-03-25 18:53:30 -07:00
siegehammer_Damage = 1
2018-03-25 17:18:20 -05:00
minetest.register_chatcommand("node_strength", {
params = "<node_name>",
description = "Read HP of node. Example /node_strength default:dirt. To see all nodes strength /node_strength all.",
func = function(name, param)
if material_Strengths[param] then
return true, "HP: " .. tostring(material_Strengths[param])
else if string.lower(param) == "all" then
local list = ""
for i,j in pairs(material_Strengths) do
list = list .. i .. " = " .. tostring(j) .. "\n"
end
return true,list
else
return false,param .. " does not exist."
end
end
end
})
local function div(base,value)
if value then
return base / value
end
return 0
end
local function mul(base,value)
if value then
return base * value
end
return 0
end
local function cac_Material_Strengths()
local list = minetest.registered_nodes
local node = nil
for i in pairs(list) do
node = list[i]
local strength_Pool = 0
local cracky = div(47,node.groups.cracky)
local stone = div(68,node.groups.stone)
local level = mul(150,node.groups.level)
local crumbly = div(25,node.groups.crumbly)
local oddly_breakable_by_hand = mul(5,node.groups.oddly_breakable_by_hand)
local dig_immediate = mul(2,node.groups.dig_immediate)
local choppy = div(35,node.groups.choppy)
local snappy = div(15,node.groups.snappy)
strength_Pool = strength_Pool + cracky
strength_Pool = strength_Pool + stone
strength_Pool = strength_Pool + level
strength_Pool = strength_Pool + crumbly
strength_Pool = strength_Pool - oddly_breakable_by_hand
strength_Pool = strength_Pool - dig_immediate
strength_Pool = strength_Pool + choppy
strength_Pool = strength_Pool + snappy
if strength_Pool < 0 then
strength_Pool = 1
end
-- Round value.
strength_Pool = math.floor(strength_Pool+0.5)
material_Strengths[node.name] = strength_Pool
end
end
-- siege hammer
minetest.register_tool("siege_hammer:siege_hammer", {
description = "Siege Hammer",
image = "siege_hammer.png",
inventory_image = "siege_hammer.png",
tool_capabilities = {
full_punch_interval = 5,
max_drop_level = 0,
range = 1,
groupcaps={
cracky = {times={[1]=8.0, [2]=4.0, [3]=2.0}, uses=30, maxlevel=3},
},
damage_groups = {fleshy=5},
},
2018-04-25 18:51:52 -05:00
on_use = function(itemstack, user, pointed_thing)
2018-03-25 17:18:20 -05:00
local pos = nil
local node = nil
local realNode = nil
2018-03-27 12:47:22 -07:00
local damage_number = siegehammer_Damage
2018-03-25 17:18:20 -05:00
if pointed_thing.under then
pos = pointed_thing.under
end
if pointed_thing.above then
pos = pointed_thing.under
end
if pos then
node = minetest.get_node_or_nil(pos)
realNode = minetest.registered_nodes[node.name]
local name = user:get_player_name()
local team = ctf.get_territory_owner(pos)
local p_team = ctf.player(name).team
2018-03-27 14:56:01 -07:00
for i in pairs(black_list) do
if black_list[i] == node.name then
minetest.chat_send_player(name, "None siegeable block.")
return itemstack
end
end
2018-03-25 17:18:20 -05:00
if not team then
minetest.chat_send_player(name, "This only works in protected areas.")
return itemstack
end
if p_team == team then
minetest.chat_send_player(name, "You can not use a siege hammer on your own team!")
return itemstack
end
if not p_team then
minetest.chat_send_player(name, "You need to be in a team in order to use this siege weapon.")
return itemstack
end
if p_team ~= team then
local state = ctf.diplo.get(p_team,team)
if state ~= "war" then
minetest.chat_send_player(name, "You need to be at war in order to use this siege weapon.")
return itemstack
end
end
2018-08-06 09:23:57 -05:00
local online = false
2018-03-25 17:18:20 -05:00
local playerslist = minetest.get_connected_players()
for i in pairs(playerslist) do
2018-03-25 17:18:20 -05:00
local player = playerslist[i]
local player_name = player:get_player_name()
2018-03-25 16:15:10 -07:00
local player_team = ctf.player(player_name).team
2018-03-25 17:18:20 -05:00
if player_team then
if player_team == team then
online = true
break
end
end
end
if not online then
minetest.chat_send_player(name, "There needs to be at least one member of this team online in order to siege them.")
return itemstack
end
2018-03-25 17:18:20 -05:00
itemstack:add_wear(100)
local meta = minetest.get_meta(pos)
local health = 1
if meta then
local tmp = meta:to_table()
if tmp then
2018-03-27 14:56:01 -07:00
if not tmp.fields.siege_health then
tmp.fields.siege_health = material_Strengths[realNode.name]
2018-03-25 17:18:20 -05:00
end
2018-03-27 14:56:01 -07:00
-- Damage code.
tmp.fields.siege_health = tmp.fields.siege_health - damage_number
health = tmp.fields.siege_health
meta:from_table(tmp)
2018-03-25 17:18:20 -05:00
end
end
if health <= 0 then
local drops = minetest.get_node_drops(minetest.get_node(pos).name, "siege_hammer:siege_hammer")
minetest.remove_node(pos)
nodeupdate(pos)
local dropitem = ItemStack(drops[1])
minetest.add_item(pos, dropitem)
local msg = "Siege alert! Protected node at (" .. tostring(pos.x) .. "," .. tostring(pos.y) .. "," .. tostring(pos.z) .. ")" .. " Was removed by " .. name .. "."
ctf.post(team, {
msg = msg,
icon="flag_red" })
for i in pairs(playerslist) do
local player = playerslist[i]
local player_name = player:get_player_name()
local player_team = ctf.player(player_name).team
if player_team then
if player_team == team then
minetest.chat_send_player(player_name, msg)
end
end
end
if realNode then
2018-03-25 17:11:50 -07:00
if realNode.sounds then
if realNode.sounds.dug then
minetest.sound_play("default_tool_breaks", {pos = pos, gain = 2.1,max_hear_distance = 127})
end
2018-03-25 17:18:20 -05:00
end
end
return itemstack
end
end
if realNode then
2018-03-25 17:11:50 -07:00
if realNode.sounds then
if realNode.sounds.dug then
minetest.sound_play(realNode.sounds.dug.name, {pos = pos, gain = 1.6,max_hear_distance = 95})
end
2018-03-25 17:18:20 -05:00
end
end
return itemstack
2018-04-25 18:51:52 -05:00
end,
2018-03-25 17:18:20 -05:00
sound = {breaks = "default_tool_breaks"}
})
2018-04-25 18:51:52 -05:00
2018-03-25 17:18:20 -05:00
minetest.register_craft({
output = "siege_hammer:siege_hammer",
recipe = {
{'default:obsidian','default:obsidian','default:obsidian'},
{'default:obsidian','default:obsidian','default:obsidian'},
{'', 'default:stick', '' } }
2018-04-25 18:51:52 -05:00
})
2018-03-25 17:18:20 -05:00
cac_Material_Strengths()