198 lines
6.5 KiB
Lua
198 lines
6.5 KiB
Lua
bounty = {}
|
|
bounty.file = core.get_worldpath() .. '/bounty.txt'
|
|
bounty.data = {}
|
|
bounty.prizes = false --determines if prizes or amount per points game-mechanic is used
|
|
if true then
|
|
bounty.prizes = 'currency:minegeld_100'
|
|
bounty.points_per_prize = 100 --per 100 points you get a default:steel_ingot
|
|
else
|
|
bounty.prizes = {
|
|
[20] = 'default:wood 50', -- for bounties that are higher then 100 iron ingots are given
|
|
[50] = 'default:cobble 50', -- for bounties that are higher then 150 gold ingots are given
|
|
[70] = 'default:stone 40', -- for bounties that are higher then 150 gold ingots are given
|
|
[100] = 'default:steel_ingot 2', -- for bounties that are higher then 150 gold ingots are given
|
|
[200] = 'default:steel_ingot 5' -- etc...
|
|
}
|
|
end
|
|
|
|
bounty.penalize = function(player_name) --set the penalty
|
|
--example of a penalty (revoke all privs ecept interact)
|
|
--core.set_player_privs(player_name, { shout = true })
|
|
bounty.unregister(player_name)
|
|
--end of example
|
|
end
|
|
|
|
bounty.load = function()
|
|
local data_file = io.open(bounty.file, 'r')
|
|
if data_file then
|
|
local data_stri = data_file:read();
|
|
bounty.data = core.parse_json(data_stri)
|
|
if bounty.data == nil then
|
|
bounty.data = {}
|
|
end
|
|
data_file:close()
|
|
end
|
|
end
|
|
bounty.load()
|
|
|
|
bounty.save = function()
|
|
local data_stri = core.write_json(bounty.data)
|
|
local data_file = io.open(bounty.file, 'w')
|
|
if data_file ~= nil then
|
|
data_file:write(data_stri)
|
|
data_file:close()
|
|
else
|
|
core.log('error', '[bounty] Could not open ' .. bounty.file .. ' with write permission')
|
|
end
|
|
end
|
|
|
|
bounty.set_nametag_color = function(player_name)
|
|
local player = minetest.get_player_by_name(player_name)
|
|
local props = player:get_properties()
|
|
if bounty.data[player_name] > 10000 then
|
|
player:set_properties({ nametag_color = "#ffffff" })
|
|
elseif bounty.data[player_name] > 1000 then
|
|
player:set_properties({ nametag_color = "#ff0000" })
|
|
elseif bounty.data[player_name] > 500 then
|
|
player:set_properties({ nametag_color = "#ffa500" })
|
|
elseif bounty.data[player_name] > 100 then
|
|
player:set_properties({ nametag_color = "#ffff00" })
|
|
else
|
|
if not core.check_player_privs(player_name, { fediauth_authorized = true }) then
|
|
player:set_properties({ nametag_color = "#00ff00" })
|
|
else
|
|
player:set_properties({ nametag_color = "#0000ff" })
|
|
end
|
|
end
|
|
end
|
|
|
|
bounty.increase = function(player_name, amount)
|
|
if bounty.data[player_name] then
|
|
bounty.data[player_name] = bounty.data[player_name] + amount
|
|
else
|
|
bounty.register(player_name, amount)
|
|
end
|
|
bounty.save()
|
|
bounty.notify(player_name, amount)
|
|
bounty.set_nametag_color(player_name)
|
|
end
|
|
|
|
bounty.decrease = function(player_name, amount)
|
|
if bounty.data[player_name] then
|
|
if bounty.data[player_name] - amount < 0 then
|
|
else
|
|
bounty.data[player_name] = bounty.data[player_name] - amount
|
|
end
|
|
end
|
|
bounty.notify(player_name, -amount)
|
|
bounty.save()
|
|
bounty.set_nametag_color(player_name)
|
|
end
|
|
|
|
bounty.register = function(player_name, amount)
|
|
bounty.data[player_name] = amount
|
|
bounty.save()
|
|
end
|
|
|
|
bounty.unregister = function(player_name)
|
|
if bounty.data[player_name] then
|
|
bounty.data[player_name] = nil
|
|
bounty.save()
|
|
end
|
|
end
|
|
|
|
bounty.notify = function(player_name, amount)
|
|
if bounty.data[player_name] + amount <= 0 then
|
|
core.chat_send_all(player_name .. " no longer has a bounty")
|
|
end
|
|
if type(bounty.prizes) == 'string' then
|
|
core.chat_send_all(player_name .. "'s bounty is $" .. bounty.get_player_bounty(player_name).split(" ")[1] .. "00")
|
|
else
|
|
for key, value in pairs(bounty.prizes) do
|
|
if bounty.data[player_name] > key and bounty.data[player_name] - amount < key then
|
|
core.chat_send_all(player_name .. "'s bounty has changed to $" ..
|
|
bounty.get_player_bounty(player_name).split(" ")[1] .. "00")
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
bounty.drop_prize = function(player)
|
|
local player_name = player:get_player_name()
|
|
local prize = bounty.get_player_bounty(player_name)
|
|
core.log('info', prize)
|
|
core.item_drop(ItemStack(prize), player, player:get_pos())
|
|
core.log('info', prize)
|
|
bounty.penalize(player_name)
|
|
end
|
|
|
|
bounty.get_player_bounty = function(player_name)
|
|
local prize = ' has no bounty'
|
|
if type(bounty.prizes) == 'string' then
|
|
local amount = math.floor(bounty.data[player_name] / bounty.points_per_prize)
|
|
if bounty.data[player_name] >= bounty.points_per_prize then
|
|
prize = bounty.prizes .. ' ' .. amount
|
|
end
|
|
else
|
|
local order = 0
|
|
for key, value in pairs(bounty.prizes) do
|
|
if order < key and bounty.data[player_name] > key then
|
|
order = key
|
|
prize = bounty.prizes[key]
|
|
end
|
|
end
|
|
end
|
|
return prize
|
|
end
|
|
|
|
bounty.player_exists = function(player_name)
|
|
if not minetest.get_player_by_name(player_name) then
|
|
return false
|
|
else
|
|
return true
|
|
end
|
|
end
|
|
|
|
--chatcommands for testing purposes
|
|
core.register_chatcommand('bounty', {
|
|
description = 'Place bounty on offenders and increasing the bounty by 100',
|
|
privs = { interact = true },
|
|
func = function(name, params)
|
|
if bounty.player_exists(params) then
|
|
local inv = core.get_inventory({ type="player", name=name })
|
|
if inv:contains_item("main", "currency:minegeld_100") then
|
|
inv:remove_item("main", "currency:minegeld_100")
|
|
bounty.increase(params, 100)
|
|
end
|
|
end
|
|
end
|
|
})
|
|
|
|
core.register_chatcommand('forgive', {
|
|
description = 'Forgive offender and decrease bounty by 100',
|
|
privs = { interact = true },
|
|
func = function(name, params)
|
|
if bounty.player_exists(params) then
|
|
bounty.decrease(params, 100)
|
|
end
|
|
end
|
|
})
|
|
|
|
core.register_chatcommand('bounties', {
|
|
params = '',
|
|
description = 'Show all offenders and their bounty',
|
|
privs = { interact = true },
|
|
func = function(name, params)
|
|
for key, value in pairs(bounty.data) do
|
|
core.chat_send_player(name, key .. ' - ' .. bounty.get_player_bounty(key))
|
|
end
|
|
end
|
|
})
|
|
|
|
core.register_on_dieplayer(function(player)
|
|
if bounty.data[player:get_player_name()] then --check if is perpetrator
|
|
bounty.drop_prize(player)
|
|
end
|
|
end)
|