Compare commits

...

5 Commits

Author SHA1 Message Date
BuckarooBanzay 4dc9009511 add "highscore_load" block 2020-08-03 16:09:21 +02:00
BuckarooBanzay 86742991ea skip highscore save for epic_builder and priv players
fixes #2
2020-06-01 17:50:40 +02:00
BuckarooBanzay 7ce245dabb update formspec on update 2020-03-26 15:46:00 +01:00
BuckarooBanzay e5aa4f4d34 better item score formspec 2020-03-26 14:49:52 +01:00
BuckarooBanzay 60d59ea702 add kill score block 2020-03-24 11:26:49 +01:00
5 changed files with 218 additions and 8 deletions

62
highscore_load.lua Normal file
View File

@ -0,0 +1,62 @@
local update_formspec = function(meta)
local topic = meta:get_string("topic")
meta:set_string("infotext", "Score load block: ''" .. topic .. "'")
meta:set_string("formspec", "size[8,2;]" ..
-- col 1
"field[0.2,0.5;8,1;topic;Topic;" .. topic .. "]" ..
-- col 2
"button_exit[0.1,1.5;8,1;save;Save]" ..
"")
end
minetest.register_node("epic_score:load", {
description = "Epic score load block, loads a previously saved highscore",
tiles = {
"epic_node_bg.png",
"epic_node_bg.png",
"epic_node_bg.png",
"epic_node_bg.png",
"epic_node_bg.png",
"epic_node_bg.png^epic_dollar_2.png",
},
paramtype2 = "facedir",
groups = {cracky=3,oddly_breakable_by_hand=3,epic=1},
on_rotate = screwdriver.rotate_simple,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("topic", "Example quest")
update_formspec(meta, pos)
end,
on_receive_fields = function(pos, _, fields, sender)
local meta = minetest.get_meta(pos);
if not sender or minetest.is_protected(pos, sender:get_player_name()) then
-- not allowed
return
end
if fields.save then
meta:set_string("topic", fields.topic or "")
update_formspec(meta, pos)
end
end,
epic = {
on_enter = function(_, meta, player, ctx)
local player_meta = player:get_meta()
local topic = meta:get_string("topic")
-- retrieve score from per-player store
local score = player_meta:get_int("epic_highscore:" .. topic)
player_meta:set_int("epic_score", score)
ctx.next()
end
}
})

View File

@ -48,14 +48,24 @@ minetest.register_node("epic_score:save", {
epic = {
on_enter = function(_, meta, player, ctx)
local player_meta = player:get_meta()
local score = player_meta:get_int("epic_score") or 0
local is_builder = minetest.check_player_privs(player, "epic_builder");
local is_admin = minetest.check_player_privs(player, "priv");
local topic = meta:get_string("topic")
if topic and score > 0 then
epic_score.update_score(topic, player:get_player_name(), score)
if not is_builder and not is_admin then
-- only save highscore if this is a "normal" player
local player_meta = player:get_meta()
local score = player_meta:get_int("epic_score") or 0
local topic = meta:get_string("topic")
if topic and score > 0 then
-- on disk store
epic_score.update_score(topic, player:get_player_name(), score)
-- per player store
player_meta:set_int("epic_highscore:" .. topic, score)
end
else
minetest.chat_send_player(player:get_player_name(), "[epic] skipping highscore saving because of elevated privs!")
end
ctx.next()
end
}

View File

@ -20,9 +20,11 @@ dofile(MP.."/hud.lua")
dofile(MP.."/add_score.lua")
dofile(MP.."/set_score.lua")
dofile(MP.."/periodic_add.lua")
dofile(MP.."/kill.lua")
dofile(MP.."/inventory_item_score.lua")
dofile(MP.."/highscore.lua")
dofile(MP.."/highscore_save.lua")
dofile(MP.."/highscore_load.lua")
-- webhooks
if epic_score.http then

View File

@ -7,7 +7,7 @@ local update_formspec = function(meta)
meta:set_string("formspec", "size[8,6;]" ..
"list[context;main;0,0.5;1,1;]" ..
"field[1,0.5;6,1;amount;Amount;" .. amount .. "]" ..
"field[1.5,1;4.5,1;amount;Amount;" .. amount .. "]" ..
"button_exit[6,0.5;2,1;save;Save]" ..
"list[current_player;main;0,2;8,4;]" ..
@ -36,7 +36,7 @@ minetest.register_node("epic_score:inventory_item_score", {
local inv = meta:get_inventory()
inv:set_size("main", 1)
update_formspec(meta, pos)
update_formspec(meta)
end,
on_receive_fields = function(pos, _, fields, sender)
@ -48,6 +48,7 @@ minetest.register_node("epic_score:inventory_item_score", {
if fields.save then
local meta = minetest.get_meta(pos);
meta:set_int("amount", tonumber(fields.amount or "0"))
update_formspec(meta)
end
end,

135
kill.lua Normal file
View File

@ -0,0 +1,135 @@
local update_formspec = function(meta)
local amount = meta:get_string("amount")
meta:set_string("infotext", "Kill score block: " .. amount .. " points / kill")
meta:set_string("formspec", "size[8,2;]" ..
"field[0.2,0.5;8,1;amount;Amount;" .. amount .. "]" ..
"button_exit[0,1.5;8,1;save;Save]"
)
end
-- playername => amount
local active_counters = {}
minetest.register_node("epic_score:kill", {
description = "Epic kill score block",
tiles = {
"epic_node_bg.png",
"epic_node_bg.png",
"epic_node_bg.png",
"epic_node_bg.png",
"epic_node_bg.png",
"epic_node_bg.png^epic_dollar.png",
},
paramtype2 = "facedir",
groups = {cracky=3,oddly_breakable_by_hand=3,epic=1},
on_rotate = screwdriver.rotate_simple,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_int("amount", 1)
update_formspec(meta, pos)
end,
on_receive_fields = function(pos, _, fields, sender)
local meta = minetest.get_meta(pos);
if not sender or minetest.is_protected(pos, sender:get_player_name()) then
-- not allowed
return
end
if fields.save then
meta:set_int("amount", tonumber(fields.amount or "1"))
update_formspec(meta, pos)
end
end,
epic = {
on_enter = function(_, meta, player, ctx)
local amount = meta:get_int("amount")
local playername = player:get_player_name()
if amount == 0 then
-- disable counter
active_counters[playername] = nil
else
-- set counter
active_counters[playername] = amount
end
ctx.next()
end
}
})
-- players
minetest.register_on_punchplayer(function(player, hitter, _, _, _, damage)
-- player got hit by another player
if not hitter or not hitter:is_player() then
return
end
local name = hitter:get_player_name()
if not active_counters[name] or active_counters[name] == 0 then
return
end
if damage >= player:get_hp() and player:get_hp() > 0 then
local player_meta = hitter:get_meta()
local score = player_meta:get_int("epic_score")
score = score + active_counters[name]
player_meta:set_int("epic_score", score)
end
end)
-- mobs
minetest.register_on_mods_loaded(function()
for _,entity in pairs(minetest.registered_entities) do
if entity.hp_min or entity.hp_min then -- Probably a mobs_redo mob
local originalPunch = entity.on_punch
local originalDie = entity.on_die
entity.on_punch = function(self, hitter, time_from_last_punch, tool_capabilities, direction)
-- Save the name of the attacker
if hitter:is_player() then
local name = hitter:get_player_name()
self.attacker = name
end
if originalPunch then
return originalPunch(self, hitter, time_from_last_punch, tool_capabilities, direction)
end
end
entity.on_die = function(self, pos) -- Use the saved name to increase the killer's kill count when the mob dies
if self.attacker and active_counters[self.attacker] then
local hitter = minetest.get_player_by_name(self.attacker)
local player_meta = hitter:get_meta()
local score = player_meta:get_int("epic_score")
score = score + active_counters[self.attacker]
player_meta:set_int("epic_score", score)
end
if originalDie then
originalDie(self, pos)
end
end
end
end
end)
-- clear counters on epic abort/exit
epic.register_hook({
-- called on epic exit
on_epic_exit = function(playername)
active_counters[playername] = nil
end,
on_epic_abort = function(playername)
active_counters[playername] = nil
end,
})