specialties/init.lua

260 lines
8.2 KiB
Lua
Raw Permalink Normal View History

2013-01-04 04:18:42 +01:00
--run Files
2013-07-02 16:48:46 +02:00
local modpath = minetest.get_modpath("specialties")
2013-01-04 04:18:42 +01:00
dofile(modpath.."/config.lua")
dofile(modpath.."/tables.lua")
2018-03-25 21:49:37 +02:00
--dofile(modpath.."/externalmodify.lua")
2013-07-05 03:41:34 +02:00
dofile(modpath.."/nodes.lua")
dofile(modpath.."/items.lua")
2013-01-04 04:18:42 +01:00
dofile(modpath.."/xp.lua")
2013-07-02 16:48:46 +02:00
local iplus = minetest.get_modpath("inventory_plus")
2013-01-04 04:18:42 +01:00
--variable used for time keeping for updating xp
2013-07-02 16:48:46 +02:00
local time = 0
2013-01-04 04:18:42 +01:00
local get_specialInfo = function(name, specialty)
2013-07-02 16:48:46 +02:00
local formspec = "size[8,8]"..
"button[2,0;2,0.5;miner;Miner]"..
"button[2,.75;2,0.5;lumberjack;Lumberjack]"..
"button[2,1.5;2,0.5;digger;Digger]"..
"button[2,2.25;2,0.5;farmer;Farmer]"..
"button[2,3;2,0.5;builder;Builder]"..
"list[current_player;main;0,4;8,4;]"
if iplus then
formspec = formspec.."button[0,0;2,0.5;main;Back]"
else
formspec = formspec.."button_exit[0,0;0.75,0.5;close;X]"
end
if specialty ~= "" then
2013-07-02 01:03:07 +02:00
formspec = formspec.."label[4,0;XP: "..specialties.players[name].skills[specialty].."]"..specialties.skills[specialty].menu
2013-01-04 04:18:42 +01:00
end
return formspec
end
minetest.register_on_leaveplayer(function(player)--Called if on a server, if single player than it isn't called
2013-06-30 22:01:07 +02:00
specialties.writeXP(player:get_player_name())
2013-01-04 04:18:42 +01:00
end)
--Initial XP Extraction
--optimizes the amount of calls to files
2013-06-29 22:46:10 +02:00
minetest.register_chatcommand("spec", {
description = "Show Specialties menu",
func = function(name, param)
minetest.show_formspec(name, "specialties:spec", get_specialInfo(name, ""))
2013-06-29 22:46:10 +02:00
end,
})
2013-01-04 04:18:42 +01:00
minetest.register_on_joinplayer(function(player)
player:get_inventory():set_size("pick", 1)
player:get_inventory():set_size("axe", 1)
player:get_inventory():set_size("shovel", 1)
player:get_inventory():set_size("hoe", 1)
2013-07-05 03:41:34 +02:00
player:get_inventory():set_size("transferslotleft", 1)
player:get_inventory():set_size("transferslotright", 1)
player:get_inventory():set_size("transfergrid", 9)
2013-07-02 16:48:46 +02:00
if iplus then
inventory_plus.register_button(player,"specialties","Specialties")
end
local name = player:get_player_name()
2013-01-04 04:18:42 +01:00
specialties.players[name] = {}
2013-07-02 01:03:07 +02:00
specialties.players[name].skills = {}
specialties.players[name].skills = specialties.readXP(name)
2013-07-02 04:03:46 +02:00
specialties.players[name].hud = {}
2013-07-20 05:22:23 +02:00
minetest.after(0.5, function(name)
2013-07-02 01:03:07 +02:00
local Yoffset = 0.02
local y = 0
for skill,num in pairs(specialties.players[name].skills) do
2013-07-02 04:03:46 +02:00
specialties.players[name].hud[skill] = player:hud_add({
2013-07-02 01:03:07 +02:00
hud_elem_type = "text",
position = {x=0, y=0.85+y},
offset = {x=100, y=0},
alignment = {x=1, y=0},
number = 0xFFFFFF ,
text = tostring(num),
})
player:hud_add({
hud_elem_type = "text",
position = {x=0, y=0.85+y},
offset = {x=10, y=0},
alignment = {x=1, y=0},
scale = {x=100, y=50},
number = 0xFFFFFF ,
text = skill,
})
y = y+Yoffset
end
2013-07-20 05:22:23 +02:00
end,
name)
2013-01-04 04:18:42 +01:00
end)
local function show_formspec(name, specialty)
minetest.show_formspec(name, "specialties:spec", get_specialInfo(name, specialty))
2013-06-29 22:46:10 +02:00
end
2013-01-04 04:18:42 +01:00
--Skill Events
local function healTool(player, list, specialty, cost)
local tool = player:get_inventory():get_list(list)[1]
2013-06-29 22:46:10 +02:00
if tool:get_name():find(":"..list) == nil then return end
local name = player:get_player_name()
2013-06-29 22:46:10 +02:00
if tool:get_wear() ~= 0 and specialties.healAmount[tool:get_name()] ~= nil then
if specialties.changeXP(name, specialty, -cost) then
2013-01-04 04:18:42 +01:00
tool:add_wear(-specialties.healAmount[tool:get_name()])
player:get_inventory():set_stack(list, 1, tool)
end
end
show_formspec(name, specialty)
2013-01-04 04:18:42 +01:00
end
local function upgradeTool(player, list, specialty, cost)
local tool = player:get_inventory():get_list(list)[1]
2013-06-29 22:46:10 +02:00
if tool:get_name():find(":"..list) == nil then return end
if specialties.upgradeTree[tool:get_name()] ~= nil then
if specialties.changeXP(player:get_player_name(), specialty, -cost) then
2013-01-04 04:18:42 +01:00
player:get_inventory():set_stack(list, 1, specialties.upgradeTree[tool:get_name()])
end
end
2013-06-29 22:46:10 +02:00
show_formspec(player:get_player_name(), specialty)
2013-01-04 04:18:42 +01:00
end
local function addSpecial2Tool(player, skill, list, specialty, cost)
local tool = player:get_inventory():get_list(list)[1]
local toolname = tool:get_name()
2013-06-29 22:46:10 +02:00
if toolname:find(":"..list) == nil then return end
if toolname:find("_"..skill) ~= nil then return end
local name = player:get_player_name()
if specialties.changeXP(name, specialty, -cost) then
2013-01-04 04:18:42 +01:00
local def = tool:get_definition()
local colonpos = toolname:find(":")
local modname = toolname:sub(0,colonpos-1)
if(modname ~= "specialties") then toolname = "specialties"..toolname:sub(colonpos) end
local name = toolname.."_"..skill
player:get_inventory():set_stack(list, 1, name)
end
show_formspec(name, specialty)
2013-01-04 04:18:42 +01:00
end
--GUI Events
minetest.register_on_player_receive_fields(function(player, formname, fields)
local name = player:get_player_name()
2013-07-02 16:48:46 +02:00
--Inventory Plus support
2013-01-04 04:18:42 +01:00
if fields.specialties then
show_formspec(name, "")
2013-01-04 04:18:42 +01:00
return
end
--MINER
if fields.miner then
show_formspec(name, "miner")
2013-01-04 04:18:42 +01:00
return
end
if fields.healpick then healTool(player, "pick", "miner", 100) return end
if fields.upgradepick then upgradeTool(player, "pick", "miner", 200) return end
if fields.superheatpick then addSpecial2Tool(player, "superheat", "pick", "miner", 500) return end
2013-01-04 04:18:42 +01:00
--LUMBERJACK
if fields.lumberjack then
show_formspec(name, "lumberjack")
2013-01-04 04:18:42 +01:00
return
end
if fields.healaxe then healTool(player, "axe", "lumberjack", 100) return end
if fields.upgradeaxe then upgradeTool(player, "axe", "lumberjack", 200) return end
if fields.superheataxe then addSpecial2Tool(player, "superheat", "axe", "lumberjack", 500) return end
if fields.felleraxe then addSpecial2Tool(player, "feller", "axe", "lumberjack", 750) return end
2013-01-04 04:18:42 +01:00
--DIGGER
if fields.digger then
show_formspec(name, "digger")
2013-01-04 04:18:42 +01:00
return
end
if fields.healshovel then healTool(player, "shovel", "digger", 100) return end
if fields.upgradeshovel then upgradeTool(player, "shovel", "digger", 200) return end
if fields.superheatshovel then addSpecial2Tool(player, "superheat", "shovel", "digger", 500) return end
2013-01-04 04:18:42 +01:00
--FARMER
if fields.farmer then
show_formspec(name, "farmer")
2013-01-04 04:18:42 +01:00
return
end
if fields.healhoe then healTool(player, "hoe", "farmer", 100) return end
if fields.upgradehoe then upgradeTool(player, "hoe", "farmer", 200) return end
if fields.greenthumb then addSpecial2Tool(player, "greenthumb", "hoe", "farmer", 500) return end
2013-01-04 04:18:42 +01:00
--BUILDER
if fields.builder then
show_formspec(name, "builder")
2013-01-04 04:18:42 +01:00
return
end
if fields.grantfast then
if specialties.changeXP(name, "builder", -600) then
local privs = minetest.get_player_privs(name)
if privs.fast == false or privs.fast == nil then
privs.fast = true
end
minetest.set_player_privs(name, privs)
show_formspec(name, "builder")
end
return
end
if fields.grantfly then
if specialties.changeXP(name, "builder", -800) then
local privs = minetest.get_player_privs(name)
if privs.fly == false or privs.fly == nil then
privs.fly = true
end
minetest.set_player_privs(name, privs)
show_formspec(name, "builder")
end
return
end
2013-01-04 04:18:42 +01:00
end)
2013-06-29 22:46:10 +02:00
2013-01-04 04:18:42 +01:00
--XP Events
local node_dig = minetest.node_dig
function minetest.node_dig(pos, oldnode, digger)
node_dig(pos, oldnode, digger)
if digger == nil then
2013-01-04 04:18:42 +01:00
return
end
if digger:get_wielded_item():is_empty() then
2013-01-04 04:18:42 +01:00
return
end
local tool = digger:get_wielded_item():get_name()
local name = digger:get_player_name()
if tool:find("pick") ~= nil then
2013-01-04 04:18:42 +01:00
specialties.changeXP(name, "miner", 1)
end
if tool:find("axe") ~= nil then
2013-01-04 04:18:42 +01:00
specialties.changeXP(name, "lumberjack", 1)
if tool:find("feller") ~= nil and minetest.get_item_group(oldnode.name, "tree") ~= 0 then
local y = 1
local abovepos = {x=pos.x,y=pos.y+y,z=pos.z}
while minetest.get_node(abovepos).name == oldnode.name do
minetest.dig_node(abovepos)
y = y+1
abovepos = {x=pos.x,y=pos.y+y,z=pos.z}
end
2013-06-30 22:01:07 +02:00
specialties.changeXP(name, "lumberjack", y-1)
end
2013-01-04 04:18:42 +01:00
end
if tool:find("shovel") ~= nil then
2013-01-04 04:18:42 +01:00
specialties.changeXP(name, "digger", 1)
end
if oldnode.name:find("farming") ~= nil then
2013-01-04 04:18:42 +01:00
specialties.changeXP(name, "farmer", 5)
end
end
local place_node = minetest.item_place_node
function minetest.item_place_node(itemstack, placer, pointed_thing)
2013-01-04 04:18:42 +01:00
specialties.changeXP(placer:get_player_name(), "builder", 1)
2014-08-13 15:26:55 +02:00
return place_node(itemstack, placer, pointed_thing)
end
2013-01-04 04:18:42 +01:00
minetest.register_globalstep(function(dtime)
if time+dtime < 10 then
2013-01-04 04:18:42 +01:00
time = time+dtime
else
time = 0
for player in pairs(specialties.players)do
specialties.writeXP(player)
2013-01-04 04:18:42 +01:00
end
end
2014-08-13 15:26:55 +02:00
end)