add siege hammer

untested
This commit is contained in:
Elkien3 2018-03-25 17:18:20 -05:00
parent 4decb85583
commit 4c77e01461
9 changed files with 222 additions and 0 deletions

21
mods/siege_hammer/LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2018 Coder12a
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,3 @@
ctf_protect
ctf
chatplus?

View File

@ -0,0 +1 @@
Siege hammer breaks down only protected ctf nodes.

196
mods/siege_hammer/init.lua Normal file
View File

@ -0,0 +1,196 @@
material_Strengths = {}
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},
},
on_use = function(itemstack, user, pointed_thing)
local pos = nil
local node = nil
local realNode = nil
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
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
local online = false
local playerslist = minetest.get_connected_players()
for i in pairs(playerslist) do
local player = playerslist[i]
local player_name = player:get_player_name()
local player_team = ctf.player(name).team
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
itemstack:add_wear(100)
local meta = minetest.get_meta(pos)
local health = 1
if meta then
local tmp = meta:to_table()
if tmp then
if not tmp.fields.siege_health then
tmp.fields.siege_health = material_Strengths[realNode.name]
end
-- Damage code.
-- Remove 0.1 hit point.
tmp.fields.siege_health = tmp.fields.siege_health - 0.1
health = tmp.fields.siege_health
meta:from_table(tmp)
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
if realNode.sounds.dug then
minetest.sound_play("default_tool_breaks", {pos = pos, gain = 2.1,max_hear_distance = 127})
end
end
return itemstack
end
end
if realNode then
if realNode.sounds.dug then
minetest.sound_play(realNode.sounds.dug.name, {pos = pos, gain = 1.6,max_hear_distance = 95})
end
end
return itemstack
end,
sound = {breaks = "default_tool_breaks"}
})
minetest.register_craft({
output = "siege_hammer:siege_hammer",
recipe = {
{'default:obsidian','default:obsidian','default:obsidian'},
{'default:obsidian','default:obsidian','default:obsidian'},
{'', 'default:stick', '' } }
})
cac_Material_Strengths()

View File

@ -0,0 +1 @@
name = siege_hammer

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 B