subgames/mods/mesewars/kits.lua

514 lines
17 KiB
Lua

-- Adds kits to mesewars
kits = {}
local kits_all = {}
local abilitys = {
speed = {
[1] = 25,
[2] = 13,
[3] = 9,
[4] = 7,
[5] = 5
},
slowness = {
[1] = 25,
[2] = 13,
[3] = 9,
[4] = 7,
[5] = 5
},
killkit = {
[1] = 10,
[2] = 5,
[3] = 4,
[4] = 3,
[5] = 2
},
carefull = {
[1] = 10,
[2] = 5,
[3] = 4,
[4] = 3,
[5] = 2
}
}
local storage = minetest.get_mod_storage()
function mesewars.save_kits(name)
if not name then
table_to_modstorage(storage, kits)
else table_to_modstorage(storage, kits[name], name)
end
end
function mesewars.load_kits(name)
if not name then
kits = modstorage_to_table(storage)
else kits[name] = modstorage_to_table(storage, name)
end
end
mesewars.load_kits("register")
-- Creates player's account, if the player doesn't have it.
subgames.register_on_joinplayer(function(player, lobby)
if lobby == "mesewars" then
local name = player:get_player_name()
mesewars.load_kits(name)
if name ~= "register" then
if not kits[name] then
kits[name] = {kit = {}}
end
if not kits[name].kit then
kits[name].kit = {}
end
if not kits[name].abilitys then
kits[name].abilitys = {}
end
else minetest.kick_player(name, "Sorry, but this name is disallowed.")
end
mesewars.create_abilitys(player)
mesewars.save_kits(name)
end
end)
function mesewars.get_player_kits(name)
return kits[name].kit
end
function mesewars.register_kit(kitname, def)
if not kits.register then
kits.register = {}
end
kits.register[kitname] = def
def.name = kitname
table.insert(kits_all, kitname)
mesewars.save_kits("register")
end
function mesewars.add_player_kits(name, kitname)
local def = kits.register[kitname]
if not kits[name].kit then kits[name].kit = {} end
if def and money.get_money(name) >= def.cost then
if kits[name].kit == "" or not table.contains(kits[name].kit, kitname) == true then
money.set_money(name, money.get_money(name)-def.cost)
table.insert(kits[name].kit, kitname)
minetest.chat_send_player(name, "You have buyed the kit " ..kitname.."!")
else minetest.chat_send_player(name, "You already have buyed this Kit!")
end
else minetest.chat_send_player(name, "You don't have enough money!")
end
end
function mesewars.set_player_kit(name, kitname)
if kitname ~= "" and kits[name].kit ~= "" and table.contains(kits[name].kit, kitname) then
kits[name].selected = kitname
elseif kitname ~= "" then
minetest.chat_send_player(name, "You don't have this kit!")
end
end
function mesewars.remove_player_kits(name)
mesewars.load_kits(name)
kits[name] = {}
mesewars.save_kits(name)
end
function mesewars.give_kit_items(name)
if kits[name].selected then
local kitname = kits[name].selected
local def = kits.register[kitname]
local player = minetest.get_player_by_name(name)
local inv = player:get_inventory()
for _,item in ipairs(def.items) do
if inv:room_for_item("main", item) then
inv:add_item("main", item)
end
end
end
end
-- Add a sfinv Kit Formspec
function mesewars.create_kit_form(name)
local selected_id = 1
local selected_buyid = 0
local defitems = ""
if not kits[name] then return end
if type(kits[name].kit) == "table" and #kits[name].kit >= 1 then
for kitnumb,kitname in ipairs(kits[name].kit) do
if kitname == kits[name].selected then
selected_id = kitnumb
end
end
end
if kits[name].buying then
for kitnumb,kitname in ipairs(kits_all) do
if kitname == kits[name].buying then
selected_buyid = kitnumb
end
end
end
if kits.register[kits[name].selected] then
local def = kits.register[kits[name].selected]
if def.items then
defitems = def.items
end
end
local costbuy = ""
if kits[name].buying then
local costbuyb = kits.register[kits[name].buying]
costbuy = costbuyb.cost
end
local itembuy = ""
if kits[name].buying then
local itembuyb = kits.register[kits[name].buying]
itembuy = itembuyb.items
end
return "size[8,9]" ..
"label[0,0;Select your Kit!]" ..
"dropdown[0,0.5;8,1.5;kitlist;"..subgames.concatornil(kits[name].kit)..";"..selected_id.."]" ..
"label[0,1.5;Items: "..subgames.concatornil(defitems).." ]" ..
"label[0,2.5;Here you can buy your kits!]" ..
"label[0,3;Your money: "..money.get_money(name).." Coins]" ..
"dropdown[0,3.5;8,1.5;buylist;"..table.concat(kits_all, ",")..";"..selected_buyid.."]" ..
"label[0,4.5;Cost: "..costbuy.."]" ..
"label[0,5.5;Items: "..subgames.concatornil(itembuy).." ]" ..
"button[4,4.5;3,1;buykit;Buy this Kit!]"
end
function mesewars.kit_on_player_receive_fields(player, context, pressed)
local name = player:get_player_name()
if pressed.buykit then
if kits[name].buying then
mesewars.add_player_kits(name, kits[name].buying)
end
end
if pressed.kitlist then
mesewars.set_player_kit(name, pressed.kitlist)
end
if pressed.buylist then
kits[name].buying = pressed.buylist
end
mesewars.save_kits(name)
end
-- Add a kit tab
sfinv.register_page("mesewars:kits", {
title = "Kits",
get = function(self, player, context)
local name = player:get_player_name()
if player_lobby[name] == "mesewars" then
return sfinv.make_formspec(player, context, mesewars.create_kit_form(name), false)
end
end,
on_player_receive_fields = function(self, player, context, pressed)
local name = player:get_player_name()
if player_lobby[name] == "mesewars" then
mesewars.kit_on_player_receive_fields(player, context, pressed)
sfinv.set_player_inventory_formspec(player)
end
end,
is_in_nav = function(self, player, context)
local name = player:get_player_name()
if player_lobby[name] == "mesewars" then
return true
end
end
})
-- Grant money when kill a player
subgames.register_on_kill_player(function(killer, killed, lobby)
if lobby == "mesewars" then
local killedname = killed:get_player_name()
local killname = killer:get_player_name()
money.set_money(killname, money.get_money(killname)+5)
minetest.chat_send_player(killname, "[CoinSystem] You have receive 5 Coins!")
end
end)
-- Add some kits
mesewars.register_kit("Swordman", {
cost = 300,
items = {"default:sword_stone"},
})
mesewars.register_kit("Blocker", {
cost = 1200,
items = {"default:steelblock 3", "default:sandstone 15"},
})
mesewars.register_kit("Tank", {
cost = 600,
items = {"3d_armor:chestplate_wood", "3d_armor:leggings_wood", "3d_armor:helmet_wood","3d_armor:boots_wood"},
})
mesewars.register_kit("Digger", {
cost = 500,
items = {"default:pick_mese"},
})
mesewars.register_kit("Cactus", {
cost = 800,
items = {"3d_armor:chestplate_cactus", "default:sword_stone"},
})
mesewars.register_kit("Builder", {
cost = 800,
items = {"default:sandstone 10", "default:pick_stone"},
})
mesewars.register_kit("Killer", {
cost = 800,
items = {"default:sword_steel"},
})
mesewars.register_kit("Rabbit", {
cost = 400,
items = {"pep:jumpplus"},
})
mesewars.register_kit("Runner", {
cost = 600,
items = {"pep:speedplus"},
})
mesewars.register_kit("Homer", {
cost = 500,
items = {"mesewars:baseteleport"},
})
-- Add abilitys.
function mesewars.create_abilitys(player)
local name = player:get_player_name()
for key, value in pairs(abilitys) do
if not kits[name].abilitys[key] then
kits[name].abilitys[key] = {level = 0, active = true}
end
if kits[name].abilitys[key].active == nil then
kits[name].abilitys[key].active = true
end
end
end
function mesewars.handle_hit(player, hitter, time_from_last_punch)
local name = player:get_player_name()
local hittername = hitter:get_player_name()
if kits[hittername].abilitys.slowness.active == true and kits[hittername].abilitys.slowness.level > 0 then
if math.random(abilitys.slowness[kits[hittername].abilitys.slowness.level]) == 1 then
playereffects.apply_effect_type("pepspeedminus", 1, player)
end
end
if kits[name].abilitys.speed.active == true and kits[name].abilitys.speed.level > 0 then
if math.random(abilitys.speed[kits[name].abilitys.speed.level]) == 1 then
playereffects.apply_effect_type("pepspeedplus", 3, player)
end
end
end
subgames.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing, lobby)
if lobby == "mesewars" and placer then
local name = placer:get_player_name()
if kits[name] and kits[name].abilitys.carefull.active == true and kits[name].abilitys.carefull.level > 0 then
if math.random(abilitys.carefull[kits[name].abilitys.carefull.level]) == 1 then
itemstack:add_item(newnode.name)
end
end
end
end)
subgames.register_on_kill_player(function(killer, killed, lobby)
if lobby == "mesewars" then
minetest.after(2, function()
if killed:is_player_connected() then
local name = killed:get_player_name()
if kits[name].abilitys.killkit.active == true and kits[name].abilitys.killkit.level > 0 then
if math.random(abilitys.killkit[kits[name].abilitys.killkit.level]) == 1 then
mesewars.give_kit_items(name)
end
end
end
end)
end
end)
local function check_active(value, number, text)
if value >= number then
return core.colorize("green", text)
else return core.colorize("red", text)
end
end
function mesewars.create_ability_form(name)
local speedontool
if kits[name].abilitys.speed.active == true then
speedontool = "Enable!"
else speedontool = "Disable!"
end
local slownessontool
if kits[name].abilitys.slowness.active == true then
slownessontool = "Enable!"
else slownessontool = "Disable!"
end
local killkitontool
if kits[name].abilitys.killkit.active == true then
killkitontool = "Enable!"
else killkitontool = "Disable!"
end
local carefullontool
if kits[name].abilitys.carefull.active == true then
carefullontool = "Enable!"
else carefullontool = "Disable!"
end
return "size[8,9]" ..
"label[0,0.5;Here you can buy abilities for your money.]" ..
"label[0,1;Your money: "..money.get_money(name).." Coins]" ..
"image_button[1,2;1,1;pep_speedplus.png;speedon;]" ..
"tooltip[speedon;"..speedontool.." A chance of getting speedbost when got hitted.]" ..
"checkbox[1,3;speedbox;Active;"..tostring(kits[name].abilitys.speed.active).."]" ..
"button[1,4;1,1;speed1;"..check_active(kits[name].abilitys.speed.level, 1, "4%").."]" ..
"tooltip[speed1;200 Coins]" ..
"button[1,5;1,1;speed2;"..check_active(kits[name].abilitys.speed.level, 2, "8%").."]" ..
"tooltip[speed2;400 Coins]" ..
"button[1,6;1,1;speed3;"..check_active(kits[name].abilitys.speed.level, 3, "12%").."]" ..
"tooltip[speed3;800 Coins]" ..
"button[1,7;1,1;speed4;"..check_active(kits[name].abilitys.speed.level, 4, "16%").."]" ..
"tooltip[speed4;1600 Coins]" ..
"button[1,8;1,1;speed5;"..check_active(kits[name].abilitys.speed.level, 5, "20%").."]" ..
"tooltip[speed5;3200 Coins]" ..
"image_button[2,2;1,1;pep_speedminus.png;slownesson;]" ..
"tooltip[slownesson;"..slownessontool.." A chance of slowing your target down.]" ..
"checkbox[2,3;slownessbox;Active;"..tostring(kits[name].abilitys.slowness.active).."]" ..
"button[2,4;1,1;slowness1;"..check_active(kits[name].abilitys.slowness.level, 1, "4%").."]" ..
"tooltip[slowness1;200 Coins]" ..
"button[2,5;1,1;slowness2;"..check_active(kits[name].abilitys.slowness.level, 2, "8%").."]" ..
"tooltip[slowness2;400 Coins]" ..
"button[2,6;1,1;slowness3;"..check_active(kits[name].abilitys.slowness.level, 3, "12%").."]" ..
"tooltip[slowness3;800 Coins]" ..
"button[2,7;1,1;slowness4;"..check_active(kits[name].abilitys.slowness.level, 4, "16%").."]" ..
"tooltip[slowness4;1600 Coins]" ..
"button[2,8;1,1;slowness5;"..check_active(kits[name].abilitys.slowness.level, 5, "20%").."]" ..
"tooltip[slowness5;3200 Coins]" ..
"image_button[3,2;1,1;default_tool_steelsword.png;killkiton;]" ..
"tooltip[killkiton;"..killkitontool.." A chance of receiving your kit when got killed.]" ..
"checkbox[3,3;killkitbox;Active;"..tostring(kits[name].abilitys.killkit.active).."]" ..
"button[3,4;1,1;killkit1;"..check_active(kits[name].abilitys.killkit.level, 1, "10%").."]" ..
"tooltip[killkit1;200 Coins]" ..
"button[3,5;1,1;killkit2;"..check_active(kits[name].abilitys.killkit.level, 2, "20%").."]" ..
"tooltip[killkit2;400 Coins]" ..
"button[3,6;1,1;killkit3;"..check_active(kits[name].abilitys.killkit.level, 3, "30%").."]" ..
"tooltip[killkit3;800 Coins]" ..
"button[3,7;1,1;killkit4;"..check_active(kits[name].abilitys.killkit.level, 4, "40%").."]" ..
"tooltip[killkit4;1600 Coins]" ..
"button[3,8;1,1;killkit5;"..check_active(kits[name].abilitys.killkit.level, 5, "50%").."]" ..
"tooltip[killkit5;3200 Coins]" ..
"item_image_button[4,2;1,1;default:sandstone;carefullon;]" ..
"tooltip[carefullon;"..carefullontool.." A chance of don't lose your block on place.]" ..
"checkbox[4,3;carefullbox;Active;"..tostring(kits[name].abilitys.carefull.active).."]" ..
"button[4,4;1,1;carefull1;"..check_active(kits[name].abilitys.carefull.level, 1, "10%").."]" ..
"tooltip[carefull1;200 Coins]" ..
"button[4,5;1,1;carefull2;"..check_active(kits[name].abilitys.carefull.level, 2, "20%").."]" ..
"tooltip[carefull2;400 Coins]" ..
"button[4,6;1,1;carefull3;"..check_active(kits[name].abilitys.carefull.level, 3, "30%").."]" ..
"tooltip[carefull3;800 Coins]" ..
"button[4,7;1,1;carefull4;"..check_active(kits[name].abilitys.carefull.level, 4, "40%").."]" ..
"tooltip[carefull4;1600 Coins]" ..
"button[4,8;1,1;carefull5;"..check_active(kits[name].abilitys.carefull.level, 5, "50%").."]" ..
"tooltip[carefull5;3200 Coins]"
end
function mesewars.handle_buy(player, ability, level, cost)
local name = player:get_player_name()
local pmoney = money.get_money(name)
local kitfile = kits[name].abilitys[ability]
if kitfile.level < level then
if kitfile.level +1 == level then
if pmoney >= cost then
money.set_money(name, pmoney -cost)
kitfile.level = kitfile.level +1
minetest.chat_send_player(name, core.colorize("green", "You have buyed Level "..level.." of the Ability "..ability))
else minetest.chat_send_player(name, "You don't have enough money.")
end
else minetest.chat_send_player(name, "You first have to buy the previous Level.")
end
elseif kitfile.level >= level then
minetest.chat_send_player(name, "You already buyed this Level.")
end
end
-- Add a Abilitys tab
sfinv.register_page("mesewars:abilitys", {
title = "Abilities",
get = function(self, player, context)
local name = player:get_player_name()
if player_lobby[name] == "mesewars" then
return sfinv.make_formspec(player, context, mesewars.create_ability_form(name), false)
else return sfinv.make_formspec(player, context, (
"size[8,9]" ..
"label[0,0;Abilitys are not available here!]"
), false)
end
end,
on_player_receive_fields = function(self, player, context, pressed)
local name = player:get_player_name()
if player_lobby[name] == "mesewars" then
if pressed.speedbox then
if pressed.speedbox == "true" then kits[name].abilitys.speed.active = true else kits[name].abilitys.speed.active = false end
elseif pressed.slownessbox then
if pressed.slownessbox == "true" then kits[name].abilitys.slowness.active = true else kits[name].abilitys.slowness.active = false end
elseif pressed.killkitbox then
if pressed.killkitbox == "true" then kits[name].abilitys.killkit.active = true else kits[name].abilitys.killkit.active = false end
elseif pressed.carefullbox then
if pressed.carefullbox == "true" then kits[name].abilitys.carefull.active = true else kits[name].abilitys.carefull.active = false end
elseif pressed.speed1 then
mesewars.handle_buy(player, "speed", 1, 200)
elseif pressed.speed2 then
mesewars.handle_buy(player, "speed", 2, 400)
elseif pressed.speed3 then
mesewars.handle_buy(player, "speed", 3, 800)
elseif pressed.speed4 then
mesewars.handle_buy(player, "speed", 4, 1600)
elseif pressed.speed5 then
mesewars.handle_buy(player, "speed", 5, 3200)
elseif pressed.slowness1 then
mesewars.handle_buy(player, "slowness", 1, 200)
elseif pressed.slowness2 then
mesewars.handle_buy(player, "slowness", 2, 400)
elseif pressed.slowness3 then
mesewars.handle_buy(player, "slowness", 3, 800)
elseif pressed.slowness4 then
mesewars.handle_buy(player, "slowness", 4, 1600)
elseif pressed.slowness5 then
mesewars.handle_buy(player, "slowness", 5, 3200)
elseif pressed.killkit1 then
mesewars.handle_buy(player, "killkit", 1, 200)
elseif pressed.killkit2 then
mesewars.handle_buy(player, "killkit", 2, 400)
elseif pressed.killkit3 then
mesewars.handle_buy(player, "killkit", 3, 800)
elseif pressed.killkit4 then
mesewars.handle_buy(player, "killkit", 4, 1600)
elseif pressed.killkit5 then
mesewars.handle_buy(player, "killkit", 5, 3200)
elseif pressed.carefull1 then
mesewars.handle_buy(player, "carefull", 1, 200)
elseif pressed.carefull2 then
mesewars.handle_buy(player, "carefull", 2, 400)
elseif pressed.carefull3 then
mesewars.handle_buy(player, "carefull", 3, 800)
elseif pressed.carefull4 then
mesewars.handle_buy(player, "carefull", 4, 1600)
elseif pressed.carefull5 then
mesewars.handle_buy(player, "carefull", 5, 3200)
end
mesewars.save_kits(name)
sfinv.set_player_inventory_formspec(player)
end
end,
is_in_nav = function(self, player, context)
local name = player:get_player_name()
if player_lobby[name] == "mesewars" then
return true
end
end
})