380 lines
15 KiB
Lua
380 lines
15 KiB
Lua
bedwars.upgrades = {red = {}, green = {}, blue = {}, yellow = {}}
|
|
|
|
bedwars.item_shop_fs = "size[6,7]" ..
|
|
"item_image_button[1,1;1,1;default:sword_steel;steelsword;]item_image_button[2,1;1,1;default:sword_diamond;diamondsword;]item_image_button[3,1;1,1;knockback:stick;kbstick;]" ..
|
|
"item_image_button[1,2;1,1;bow:bow_empty;bow;]item_image_button[2,2;1,1;bow:arrow;arrow;]" ..
|
|
"item_image_button[1,3;1,1;default:apple;apple;]item_image_button[2,3;1,1;tnt:tnt;tnt;]item_image_button[3,3;1,1;default:pick_steel;steelpick;]item_image_button[4,3;1,1;default:pick_diamond;diamondpick;]" ..
|
|
"item_image_button[1,4;1,1;wool:white;wool;]item_image_button[2,4;1,1;default:obsidian;obsidian;]item_image_button[3,4;1,1;default:wood;wood;]item_image_button[4,4;1,1;default:axe_steel;steelaxe;]" ..
|
|
"item_image_button[1,5;1,1;potions:speed;speedpotion;]item_image_button[2,5;1,1;potions:jump;jumppotion;]item_image_button[3,5;1,1;potions:antigravity;antigravitypotion;]"
|
|
|
|
minetest.register_node("bedwars:shop_item", {
|
|
description = "Item shop",
|
|
drawtype = "nodebox",
|
|
tiles = {"shop_item_side.png", "shop_item_side.png", "shop_item_side.png", "shop_item_side.png", "shop_item_side.png", "shop_item_front.png"},
|
|
paramtype = "light",
|
|
paramtype2 = "facedir",
|
|
is_ground_content = false,
|
|
sunlight_propagates = false,
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
|
|
},
|
|
},
|
|
groups = {snappy = 3},
|
|
on_construct = function(pos)
|
|
minetest.get_meta(pos):set_string("formspec", bedwars.item_shop_fs)
|
|
end,
|
|
on_receive_fields = function(pos, formname, fields, sender)
|
|
local itemstack = ItemStack("")
|
|
local wielded = sender:get_wielded_item()
|
|
if wielded:get_name() == "default:steel_ingot" or wielded:get_name() == "default:gold_ingot" or wielded:get_name() == "default:mese_crystal" then
|
|
minetest.chat_send_player(sender:get_player_name(), "Do not wield currency")
|
|
return
|
|
end
|
|
local reqstack = ItemStack("")
|
|
if fields.steelsword then
|
|
reqstack:set_count(7)
|
|
reqstack:set_name("default:gold_ingot")
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 7 gold to buy this item")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
itemstack:set_count(1)
|
|
itemstack:set_name("default:sword_steel")
|
|
elseif fields.diamondsword then
|
|
reqstack:set_count(6)
|
|
reqstack:set_name("default:mese_crystal")
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 6 mese to buy this item")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
itemstack:set_count(1)
|
|
itemstack:set_name("default:sword_diamond")
|
|
elseif fields.kbstick then
|
|
reqstack:set_count(10)
|
|
reqstack:set_name("default:gold_ingot")
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 10 gold to buy this item")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
itemstack:set_count(1)
|
|
itemstack:set_name("knockback:stick")
|
|
elseif fields.bow then
|
|
reqstack:set_count(8)
|
|
reqstack:set_name("default:mese_crystal")
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 8 mese to buy this item")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
itemstack:set_count(1)
|
|
itemstack:set_name("bow:bow_empty")
|
|
elseif fields.arrow then
|
|
reqstack:set_count(4)
|
|
reqstack:set_name("default:gold_ingot")
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 4 gold to buy this item")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
itemstack:set_count(8)
|
|
itemstack:set_name("bow:arrow")
|
|
elseif fields.apple then
|
|
reqstack:set_count(2)
|
|
reqstack:set_name("default:gold_ingot")
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 2 gold to buy this item")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
itemstack:set_count(1)
|
|
itemstack:set_name("default:apple")
|
|
elseif fields.tnt then
|
|
reqstack:set_count(8)
|
|
reqstack:set_name("default:gold_ingot")
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 8 gold to buy this item")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
itemstack:set_count(1)
|
|
itemstack:set_name("tnt:tnt")
|
|
elseif fields.steelpick then
|
|
reqstack:set_count(10)
|
|
reqstack:set_name("default:gold_ingot")
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 10 gold to buy this item")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
itemstack:set_count(1)
|
|
itemstack:set_name("default:pick_steel")
|
|
elseif fields.diamondpick then
|
|
reqstack:set_count(24)
|
|
reqstack:set_name("default:gold_ingot")
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 24 gold to buy this item")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
itemstack:set_count(1)
|
|
itemstack:set_name("default:pick_diamond")
|
|
elseif fields.wool then
|
|
reqstack:set_count(4)
|
|
reqstack:set_name("default:steel_ingot")
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 4 steel to buy this item")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
itemstack:set_count(16)
|
|
itemstack:set_name("wool:" .. bedwars.get_player_team(sender:get_player_name()))
|
|
elseif fields.obsidian then
|
|
reqstack:set_count(4)
|
|
reqstack:set_name("default:mese_crystal")
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 4 mese to buy this item")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
itemstack:set_count(4)
|
|
itemstack:set_name("default:obsidian")
|
|
elseif fields.wood then
|
|
reqstack:set_count(12)
|
|
reqstack:set_name("default:gold_ingot")
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 12 gold to buy this item")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
itemstack:set_count(16)
|
|
itemstack:set_name("default:wood")
|
|
elseif fields.steelaxe then
|
|
reqstack:set_count(24)
|
|
reqstack:set_name("default:gold_ingot")
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 24 gold to buy this item")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
itemstack:set_count(1)
|
|
itemstack:set_name("default:axe_steel")
|
|
elseif fields.speedpotion then
|
|
reqstack:set_count(3)
|
|
reqstack:set_name("default:mese_crystal")
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 3 mese to buy this item")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
itemstack:set_count(1)
|
|
itemstack:set_name("potions:speed")
|
|
elseif fields.jumppotion then
|
|
reqstack:set_count(3)
|
|
reqstack:set_name("default:mese_crystal")
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 3 mese to buy this item")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
itemstack:set_count(1)
|
|
itemstack:set_name("potions:jump")
|
|
elseif fields.antigravitypotion then
|
|
reqstack:set_count(3)
|
|
reqstack:set_name("default:mese_crystal")
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 3 mese to buy this item")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
itemstack:set_count(1)
|
|
itemstack:set_name("potions:antigravity")
|
|
end
|
|
sender:set_wielded_item(wielded)
|
|
sender:get_inventory():add_item("main", itemstack)
|
|
end,
|
|
})
|
|
|
|
bedwars.team_shop_fs = "size[5,4]" ..
|
|
"item_image_button[1,1;1,1;default:furnace;forge;]item_image_button[2,1;1,1;default:sword_steel;sharpness;]item_image_button[3,1;1,1;default:flint;dragonbuff;]" ..
|
|
"item_image_button[1,2;1,1;default:brick;armour;]item_image_button[2,2;1,1;doors:trapdoor_steel;trap;]item_image_button[3,2;1,1;default:meselamp;healpool;]"
|
|
|
|
minetest.register_node("bedwars:shop_team", {
|
|
description = "Team shop",
|
|
drawtype = "nodebox",
|
|
tiles = {"shop_team_side.png", "shop_team_side.png", "shop_team_side.png", "shop_team_side.png", "shop_team_side.png", "shop_team_front.png"},
|
|
paramtype = "light",
|
|
paramtype2 = "facedir",
|
|
is_ground_content = false,
|
|
sunlight_propagates = false,
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
|
|
},
|
|
},
|
|
groups = {snappy = 3},
|
|
on_construct = function(pos)
|
|
minetest.get_meta(pos):set_string("formspec", bedwars.team_shop_fs)
|
|
end,
|
|
on_receive_fields = function(pos, formname, fields, sender)
|
|
local wielded = sender:get_wielded_item()
|
|
if wielded:get_name() == "default:diamond" then
|
|
minetest.chat_send_player(sender:get_player_name(), "Do not wield currency")
|
|
return
|
|
end
|
|
local team = bedwars.get_player_team(sender:get_player_name())
|
|
local reqstack = ItemStack("default:diamond")
|
|
if fields.forge then
|
|
if (bedwars.upgrades[team].forge or 0) >= 4 then
|
|
minetest.chat_send_player(sender:get_player_name(), "The maximum forge upgrade is already active")
|
|
return
|
|
end
|
|
reqstack:set_count(4 * ((bedwars.upgrades[team].forge or 0) + 1))
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need " .. tostring(4 * ((bedwars.upgrades[team].forge or 0) + 1)) .. " diamonds to activate this upgrade")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
bedwars.upgrades[team].forge = (bedwars.upgrades[team].forge or 0) + 1
|
|
elseif fields.sharpness then
|
|
if bedwars.upgrades[team].sharpness then
|
|
minetest.chat_send_player(sender:get_player_name(), "The sharpness upgrade is already active")
|
|
return
|
|
end
|
|
reqstack:set_count(8)
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 8 diamonds to activate this upgrade")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
bedwars.upgrades[team].sharpness = true
|
|
elseif fields.dragonbuff then
|
|
if bedwars.upgrades[team].dragonbuff then
|
|
minetest.chat_send_player(sender:get_player_name(), "The dragon buff upgrade is already active")
|
|
return
|
|
end
|
|
reqstack:set_count(5)
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 5 diamonds to activate this upgrade")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
bedwars.upgrades[team].dragonbuff = true
|
|
elseif fields.armour then
|
|
if (bedwars.upgrades[team].armour or 0) >= 4 then
|
|
minetest.chat_send_player(sender:get_player_name(), "The maximum armour upgrade is already active")
|
|
return
|
|
end
|
|
local costs = {5, 10, 20, 30}
|
|
reqstack:set_count(costs[(bedwars.upgrades[team].armour or 0) + 1])
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need " .. tostring(costs[(bedwars.upgrades[team].armour or 0) + 1]) .. " diamonds to activate this upgrade")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
bedwars.upgrades[team].armour = (bedwars.upgrades[team].armour or 0) + 1
|
|
elseif fields.trap then
|
|
if bedwars.upgrades[team].trap then
|
|
minetest.chat_send_player(sender:get_player_name(), "The trap upgrade is already active")
|
|
return
|
|
end
|
|
reqstack:set_count(1)
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 1 diamond to activate this upgrade")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
bedwars.upgrades[team].trap = true
|
|
elseif fields.healpool then
|
|
if bedwars.upgrades[team].healpool then
|
|
minetest.chat_send_player(sender:get_player_name(), "The healpool upgrade is already active")
|
|
return
|
|
end
|
|
reqstack:set_count(3)
|
|
if not sender:get_inventory():contains_item("main", reqstack) then
|
|
minetest.chat_send_player(sender:get_player_name(), "You need 3 diamonds to activate this upgrade")
|
|
return
|
|
end
|
|
sender:get_inventory():remove_item("main", reqstack)
|
|
bedwars.upgrades[team].healpool = true
|
|
end
|
|
sender:set_wielded_item(wielded)
|
|
end,
|
|
})
|
|
|
|
minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing)
|
|
if newnode and newnode.name == "tnt:tnt" then
|
|
tnt.burn(pos)
|
|
end
|
|
end)
|
|
|
|
minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
|
|
local newdamage = damage / 2
|
|
if hitter:is_player() and bedwars.upgrades[bedwars.get_player_team(hitter:get_player_name())].sharpness then
|
|
player:set_hp(player:get_hp() - newdamage - 2 + (bedwars.upgrades[bedwars.get_player_team(player:get_player_name())].armour or 0))
|
|
return true
|
|
elseif not hitter:is_player() then
|
|
if player:get_hp() - newdamage + (bedwars.upgrades[bedwars.get_player_team(player:get_player_name())].armour or 0) < player:get_hp() then
|
|
player:set_hp(player:get_hp() - newdamage + (bedwars.upgrades[bedwars.get_player_team(player:get_player_name())].armour or 0))
|
|
return true
|
|
end
|
|
end
|
|
end)
|
|
|
|
minetest.register_abm({
|
|
label = "trap",
|
|
nodenames = {"beds:bed_bottom"},
|
|
interval = 1,
|
|
chance = 1,
|
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
|
local team = bedwars.get_team_by_pos(pos)
|
|
if not bedwars.upgrades[team].trap then return end
|
|
local objs = minetest.get_objects_inside_radius(pos, 7)
|
|
for _, obj in ipairs(objs) do
|
|
if obj:is_player() and bedwars.get_player_team(obj:get_player_name()) ~= team then
|
|
for _, name in ipairs(bedwars.teams[team]) do
|
|
minetest.chat_send_player(name, "Your trap has been set off")
|
|
bedwars.upgrades[team].trap = false
|
|
end
|
|
end
|
|
end
|
|
end,
|
|
})
|
|
|
|
minetest.register_abm({
|
|
label = "healpool",
|
|
nodenames = {"beds:bed_bottom"},
|
|
interval = 6,
|
|
chance = 1,
|
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
|
local team = bedwars.get_team_by_pos(pos)
|
|
if not bedwars.upgrades[team].healpool then return end
|
|
local objs = minetest.get_objects_inside_radius(pos, 7)
|
|
for _, obj in ipairs(objs) do
|
|
if obj:is_player() and bedwars.get_player_team(obj:get_player_name()) == team then
|
|
obj:set_hp(obj:get_hp() + 1)
|
|
end
|
|
end
|
|
end,
|
|
})
|
|
|
|
minetest.register_abm({
|
|
label = "regeneration",
|
|
nodenames = {"beds:bed_bottom"},
|
|
interval = 12,
|
|
chance = 1,
|
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
|
local objs = minetest.get_objects_inside_radius(pos, 7)
|
|
for _, obj in ipairs(objs) do
|
|
if obj:is_player() then
|
|
obj:set_hp(obj:get_hp() + 1)
|
|
end
|
|
end
|
|
end,
|
|
})
|