add kill score block
parent
f359e1912b
commit
60d59ea702
1
init.lua
1
init.lua
|
@ -20,6 +20,7 @@ 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")
|
||||
|
|
|
@ -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,
|
||||
})
|
Loading…
Reference in New Issue