1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2025-03-11 14:49:59 +02:00

Updated donor features (#1262)

- Team buffs for donators with tier 2 or higher Patreon status
- Tier 2 (coal): +10% team hand mining bonus per online donator, up to a maximum of 10 online donators
- Tier 3 (solid fuel): +10% team hand crafting bonus per online donator, up to a max of 10 online donators
- Tier 4 (rocket fuel): +10% team run speed per online donator, up to a max of 10 online donators
- Tier 5 (nuclear fuel): +5 inventory slots for all. Up to max of 30 extra. Does not reduce down when donator logs off.
This commit is contained in:
Jayefuu 2022-03-30 19:36:18 +01:00 committed by GitHub
parent f421f2543c
commit 69c90069a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 259 additions and 30 deletions

View File

@ -436,6 +436,11 @@ global.config = {
},
spidertron_group_control = {
enabled = true
},
donator = {
donator_perks = {
enabled = true
}
}
}

View File

@ -6,27 +6,62 @@ local Token = require 'utils.token'
local table = require 'utils.table'
local Global = require 'utils.global'
local Task = require 'utils.task'
local DonatorPerks = require 'resources.donator_perks'
local concat = table.concat
local remove = table.remove
local set_data = Server.set_data
local random = math.random
local config = global.config.donator
local donator_data_set = 'donators'
local donators = {} -- global register
local donator_perks_perm = {} -- buffs to the force that will remain even when the donator is offline (T5)
local donator_perks_temp = {} -- buffs to the force that are only applied while the donator is online (T2, T3, T4)
local donator_tiers = {
[1] = {name = "[img=item.wood]", count = 0, max = 10}, -- keeps track of how many have been applied so we can limit the amount of donators contributing to buffs
[2] = {name = "[img=item.coal]", count = 0, max = 10},
[3] = {name = "[img=item.solid-fuel]", count = 0, max = 10},
[4] = {name = "[img=item.rocket-fuel]", count = 0, max = 10},
[5] = {name = "[img=item.nuclear-fuel]", count = 0, max = 6}
}
Global.register(
{
donators = donators
donators = donators,
donator_perks_perm = donator_perks_perm,
donator_perks_temp = donator_perks_temp,
donator_tiers = donator_tiers
},
function(tbl)
donators = tbl.donators
donator_perks_perm = tbl.donator_perks_perm
donator_perks_temp = tbl.donator_perks_temp
donator_tiers = tbl.donator_tiers
config = tbl.global.config.donator.donator_perks
end
)
local Public = {}
--- Checks if a player has a specific donator perk
-- @param player_name <string>
-- @param perf_flag <number>
-- @return <boolean>
function Public.player_has_donator_perk(player_name, perk_flag)
local d = donators[player_name]
if not d then
return false
end
local flags = d.perk_flags
if not flags then
return false
end
return bit32.band(flags, perk_flag) == perk_flag
end
--- Prints the donator message with the color returned from the server
local print_after_timeout =
Token.register(
@ -40,6 +75,18 @@ local print_after_timeout =
end
)
-- Just in case we want to turn it off mid-game, we can use /sc package.loaded['features.donator'].toggle_perks()
function Public.toggle_perks()
config.donator_perks.enabled = not config.donator_perks.enabled
if config.donator_perks.enabled == true then
game.print("Donator perks now enabled")
print("Donator perks now enabled") -- prints to server console
else
game.print("Donator perks now disabled")
print("Donator perks now disabled")
end
end
--- When a player joins, set a 1s timer to retrieve their color before printing their welcome message
local function player_joined(event)
local player = game.get_player(event.player_index)
@ -52,19 +99,117 @@ local function player_joined(event)
return nil
end
local messages = d.welcome_messages
if not messages then
local perk_flag = d.perk_flags
if perk_flag < 2 then
return
end
local count = #messages
if count == 0 then
if Public.player_has_donator_perk(player.name, DonatorPerks.welcome_msg) then
local messages = d.welcome_messages
if messages then
local count = #messages
if count ~= 0 and count then
local message = messages[random(count)]
message = concat({'*** ', message, ' ***'})
Task.set_timeout_in_ticks(60, print_after_timeout, {player = player, message = message})
end
end
end
if not config.donator_perks.enabled then
return
end
local message = messages[random(count)]
message = concat({'*** ', message, ' ***'})
Task.set_timeout_in_ticks(60, print_after_timeout, {player = player, message = message})
local mining_flag = Public.player_has_donator_perk(player.name, DonatorPerks.team_mining)
local crafting_flag = Public.player_has_donator_perk(player.name, DonatorPerks.team_crafting)
local running_flag = Public.player_has_donator_perk(player.name, DonatorPerks.team_run)
local inventory_flag = Public.player_has_donator_perk(player.name, DonatorPerks.team_inventory)
if not mining_flag and not crafting_flag and not running_flag and not inventory_flag then
return
end
-- Update team perks
if not donator_perks_temp[player.name] then -- check they're not already in donator_perks_temp table, this keeps track of bonuses that are added and removed as players join and leave
local donator_perk_msg = concat({"Donator Tier: ",donator_tiers[d.patreon_tier].name, ". Team bonuses applied for ", player.name,": "})
if mining_flag and donator_tiers[2].count < donator_tiers[2].max then -- Apply tier 2 (Coal) reward: +10 % team manual mining bonus per online tier 2+ donator
player.force.manual_mining_speed_modifier = player.force.manual_mining_speed_modifier + 0.1
donator_tiers[2].count = donator_tiers[2].count + 1
donator_perk_msg = concat({donator_perk_msg, "+10% hand mining. "})
end
if crafting_flag and donator_tiers[3].count < donator_tiers[3].max then -- Apply tier 3 (Solid Fuel) reward: + 10 % team manual crafting bonus per online tier 3+ donator
player.force.manual_crafting_speed_modifier = player.force.manual_crafting_speed_modifier + 0.1
donator_tiers[3].count = donator_tiers[3].count + 1
donator_perk_msg = concat({donator_perk_msg, "+10% hand crafting. "})
end
if running_flag and donator_tiers[4].count < donator_tiers[4].max then -- Apply Tier 4 (Rocket Fuel) reward: + 10 % team running speed bonus per online tier 4+ donator
player.force.character_running_speed_modifier = player.force.character_running_speed_modifier + 0.1
donator_tiers[4].count = donator_tiers[4].count + 1
donator_perk_msg = concat({donator_perk_msg, "+10% run speed. "})
end
donator_perks_temp[player.name] = perk_flag
if inventory_flag and not donator_perks_perm[player.name] and donator_tiers[5].count < donator_tiers[5].max then
player.force.character_inventory_slots_bonus = player.force.character_inventory_slots_bonus + 5
donator_tiers[5].count = donator_tiers[5].count + 1
donator_perk_msg = concat({donator_perk_msg, "+5 inventory slots. "})
donator_perks_perm[player.name] = true
elseif donator_perks_perm[player.name] then -- for if they're already in the table. We don't want to apply the perk again but we do want to append the perk to the message.
donator_perk_msg = concat({donator_perk_msg, "+5 inventory slots. "})
end
donator_perk_msg = donator_perk_msg .. " Use /perks to see bonuses."
Task.set_timeout_in_ticks(80, print_after_timeout, {player = player, message = donator_perk_msg})
end
end
local function player_left(event)
local player = game.get_player(event.player_index)
if not player or not player.valid or not config.donator_perks.enabled then
return
end
local d = donators[player.name]
if not donator_perks_temp[player.name] and not d then
return
end
local mining_flag = Public.player_has_donator_perk(player.name, DonatorPerks.team_mining)
local crafting_flag = Public.player_has_donator_perk(player.name, DonatorPerks.team_crafting)
local running_flag = Public.player_has_donator_perk(player.name, DonatorPerks.team_run)
-- To do: What happens if an admin changes the players donator status or flags while they're online?
if not mining_flag and not crafting_flag and not running_flag then
return
end
if donator_perks_temp[player.name] then
if mining_flag then
if player.force.manual_mining_speed_modifier >= 0.1 then
player.force.manual_mining_speed_modifier = player.force.manual_mining_speed_modifier - 0.1
else
player.force.manual_mining_speed_modifier = 0
end
donator_tiers[2].count = donator_tiers[2].count - 1
end
if crafting_flag then
if player.force.manual_crafting_speed_modifier >= 0.1 then
player.force.manual_crafting_speed_modifier = player.force.manual_crafting_speed_modifier - 0.1
else
player.force.manual_crafting_speed_modifier = 0
end
donator_tiers[3].count = donator_tiers[4].count - 1
end
if running_flag and player.force.character_running_speed_modifier >= 0.1 then
if player.force.character_running_speed_modifier >= 0.1 then
player.force.character_running_speed_modifier = player.force.character_running_speed_modifier - 0.1
else
player.force.character_running_speed_modifier = 0
end
donator_tiers[4].count = donator_tiers[4].count - 1
end
donator_perks_temp[player.name] = nil -- remove them from the table
end
end
--- Prints a message on donator death
@ -79,6 +224,9 @@ local function player_died(event)
return nil
end
if not Public.player_has_donator_perk(player.name, DonatorPerks.death_msg) then
return
end
local messages = d.death_messages
if not messages then
return
@ -98,12 +246,48 @@ local function player_died(event)
game.print(message, player.chat_color)
end
local reset_run_speed =
Token.register(
function(player)
if not player.valid then
return
end
player.character_running_speed_modifier = player.character_running_speed_modifier - 1
end
)
local function player_respawned(event)
local player = game.get_player(event.player_index)
if not player or not player.valid or not config.donator_perks.enabled then
return
end
local d = donators[player.name]
if not d then
return nil
end
local respawn_flag = Public.player_has_donator_perk(player.name, DonatorPerks.respawn_boost)
if not respawn_flag then
return
end
player.character_running_speed_modifier = player.character_running_speed_modifier + 1
Task.set_timeout_in_ticks(30*60, reset_run_speed, player)
end
--- Returns the table of donators
-- @return <table>
function Public.get_donators_table()
return donators
end
--- Returns the table of active perks
-- @return <table>
function Public.get_donator_perks_table()
return donator_tiers
end
--- Checks if a player is a donator
-- @param player_name <string>
-- @return <boolean>
@ -111,24 +295,6 @@ function Public.is_donator(player_name)
return donators[player_name] ~= nil
end
--- Checks if a player has a specific donator perk
-- @param player_name <string>
-- @param perf_flag <number>
-- @return <boolean>
function Public.player_has_donator_perk(player_name, perk_flag)
local d = donators[player_name]
if not d then
return false
end
local flags = d.perk_flags
if not flags then
return false
end
return bit32.band(flags, perk_flag) == perk_flag
end
--- Sets the data for a donator, all existing data for the entry is removed
-- @param player_name <string>
-- @param data <table>
@ -244,6 +410,10 @@ Server.on_data_set_changed(
Event.add(defines.events.on_player_joined_game, player_joined)
Event.add(defines.events.on_player_left_game, player_left)
Event.add(defines.events.on_player_died, player_died)
Event.add(defines.events.on_player_respawned, player_respawned)
return Public

View File

@ -3,8 +3,20 @@ local Game = require 'utils.game'
local Command = require 'utils.command'
local Donator = require 'features.donator'
local Color = require 'resources.color_presets'
local Global = require 'utils.global'
local format = string.format
local config = global.config.donator.donator_perks
Global.register(
{
config = config
},
function(tbl)
config = tbl.global.config.donator.donator_perks
end
)
-- Local functions
@ -73,6 +85,26 @@ local function donator_death_message_command(args, player)
command_path_decider(args, player, table_name)
end
-- Prints a list of currently active perks to the player
local function print_perks(_, player)
local print = print
if player and player.valid then -- allows us to call print_perks from the server console OR in-game
print = player.print
end
if not config.enabled then
print("Donator perks have been disabled for this map.")
return
end
local donator_tiers = Donator.get_donator_perks_table()
print("Currently active team perks: +"..(donator_tiers[2].count*10).."% hand mining speed (max +"..(donator_tiers[2].max*10).."%), +"
..(donator_tiers[3].count*10).."% hand crafting speed (max +"..(donator_tiers[3].max*10).."%), +"
..(donator_tiers[4].count*10).."% run speed (max +"..(donator_tiers[4].max*10).."%) and +"
..(donator_tiers[5].count*5).." inventory slots (max +"..(donator_tiers[5].max*5).."%).")
end
-- Commands
Command.add(
@ -98,3 +130,11 @@ Command.add(
},
donator_death_message_command
)
Command.add(
'perks',
{
description = {'command_description.perks'},
},
print_perks
)

View File

@ -14,7 +14,6 @@ crash_site_spy=Spend coins to send a fish to spy on the enemy for a short time.
crash_site_spy_invalid=You need to add a valid location to send a spy fish. e.g /spy [gps=-110,-17,redmew]
crash_site_spy_funds=Training these spy fish ain't cheap! You need more coins!
crash_site_spy_success=__1__ used the /spy command and spent __2__ coins to train a fish to spy on the enemy [gps=__3__,__4__,redmew]
crash_site_airstrike_invalid=Invalid co-ordinates.
crash_site_airstrike=Launch an airstrike against the enemy with poison capsules.
crash_site_airstrike_count=Upgrade the airstrike damage to to level __1__\n\nTo use airstrike place poison capsules in the spawn chest then type /strike followed by a gps position\n\nDamage upgrades increase the number of poison capsules launched by airstrike.\n\nCurrent level: __2__\nCurrent shell count: __3__\nCurrent cost: __4__
@ -108,6 +107,7 @@ quick_bar_load=Loads your quick bars from the server (overwriting existing bars)
quick_bar_delete=Erases your saved quick bars from the server
set_pollution_multiplier=EXPERIMENTAL. An integer which gets multiplied by 0.01 to give the amount of pollution crash site magic crafters emit. Default is 0
get_pollution_multiplier=The current pollution multiplier for crash site. The default is 0.
perks=Lists Patreon donators that are contributing to currently active perks.
[command_custom_help]
tp=<blank|mode|player> 3 different uses: "/tp" to tp to selected entity. "/tp mode" to toggle tp mode. "/tp Newcott" to tp to Newcott.

View File

@ -1,4 +1,18 @@
return {
rank = 0x1,
train = 0x2
rank = 0x1, -- T1
train = 0x2, -- T3. train saviour perk
welcome_msg = 0x4, -- T2. enables a message upon player join
team_mining = 0x8, -- T2. boosts team manual mining speed while player is online
death_msg = 0x10, -- T3. enables a message upon player death
team_crafting = 0x20, -- T3. boosts team manual crafting speed while player is online
team_run = 0x40, -- T4. boosts team run speed while player is online
respawn_boost = 0x80, -- T4. player runs faster for 30 seconds after respawn
team_inventory = 0x160 -- T5. boosts team inventory size for remainder of map
}
-- 2021-12-30
-- Tier 1 = 1
-- Tier 2 = 8 + 4 + 1 = 21
-- Tier 3 = 8 + 4 + 1 + 16 + 32 + 2= 63
-- Tier 4 = 63 + 64 + 128 = 255
-- Tier 5 = 255 + 256 = 511