1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2025-11-06 09:09:26 +02:00

Add player renaming (#428)

* Add player renaming from auto-generated names

* Give admins IDs on name changes
This commit is contained in:
Matthew
2018-11-23 12:08:44 -05:00
committed by Valansch
parent b9e360ce3a
commit 55aaf19b48
5 changed files with 574 additions and 0 deletions

View File

@@ -18,6 +18,8 @@ global.scenario.config.nuke_control.enable_autokick = true
global.scenario.config.nuke_control.enable_autoban = true global.scenario.config.nuke_control.enable_autoban = true
global.scenario.custom_functions = {} global.scenario.custom_functions = {}
global.scenario.config.nuke_control.nuke_min_time_hours = 3 --how long a player must be on the server to be allowed to use the nuke global.scenario.config.nuke_control.nuke_min_time_hours = 3 --how long a player must be on the server to be allowed to use the nuke
global.scenario.config.players_assigned_names = false -- assigns players random names when they first join
global.scenario.config.players_roll_names = false -- allows players to roll random names
global.newline = '\n' global.newline = '\n'
newline = '\n' newline = '\n'

View File

@@ -0,0 +1,159 @@
require 'utils.list_utils'
local Game = require 'utils.game'
local Event = require 'utils.event'
local naming_words = require 'resources.naming_words'
local Utils = require('utils.utils')
global.actual_name = {}
global.silly_names = {}
global.silly_names.count = 0
local name_combinations = #naming_words.adverbs * #naming_words.adjectives * #naming_words.nouns
--- Creates name by combining elements from the passed table
-- @param1 table including adverbs, adjectives, and nouns
-- @returns name as a string
local function create_name(words_table)
local adverb, adjective, noun
adverb = table.get_random(words_table.adverbs)
adjective = table.get_random(words_table.adjectives)
noun = table.get_random(words_table.nouns)
return adverb .. '_' .. adjective .. '_' .. noun
end
--- Calls create_name until a unique name is returned
-- @param1 table including adverbs, adjectives, and nouns
-- @returns name as a string
local function create_unique_name(words_table)
local silly_names = global.silly_names
local name = create_name(words_table)
while table.contains(silly_names, name) do
name = create_name(words_table)
end
return name
end
--- Assigns a player a name, stores their old and silly names
-- @param1 Takes a LuaPlayer
local function name_player(player)
-- Store a player's original name in case they want it back.
if not global.actual_name[player.index] then
global.actual_name[player.index] = player.name
end
-- Because create_unique_name enters a while loop looking for a unique name, ensure we never get stuck.
local ceiling = math.min(name_combinations * 0.25, 10000)
if global.silly_names.count > ceiling then
global.silly_names = {}
global.silly_names.count = 0
end
local name = create_unique_name(naming_words)
table.insert(global.silly_names, name)
global.silly_names.count = global.silly_names.count + 1
local str = player.name .. ' will now be known as: ' .. name
game.print(str)
Utils.print_admins(str .. ' (ID: ' .. player.index .. ')', false)
player.name = name
end
--- Restores a player's actual name
local function restore_name(cmd)
local player = Game.get_player_by_index(cmd.player_index)
player.name = global.actual_name[player.index]
player.print('Your true name has been restored.')
end
--- Passes _event_ on to name_players
local function name_player_event(event)
local player = Game.get_player_by_index(event.player_index)
name_player(player)
end
--- Passes target or player on to name_players
local function name_player_command(cmd)
local player = game.player
local param = cmd.parameter
local target
if param then
target = game.players[param]
if player and not player.admin then
-- Yes param, yes player, no admin/server = fail, non-admins, non-server cannot use command on others
Game.player_print("Sorry you don't have permission to use the roll-name command on other players.")
return
else
-- Yes param, yes admin/server = check target
if target then
-- Yes param, yes admin/server, yes target = change name
name_player(target)
return
else
-- Yes param, yes admin/server, no target = fail, wrong player name
Game.player_print(table.concat {"Sorry, player '", param, "' was not found."})
return
end
end
else
-- No param = check if server
if not player then
-- No param, no player = server trying to change its name
Game.player_print('The server cannot change its name')
return
end
-- No param, not server = change self name
name_player(player)
return
end
end
--- Prints the original name of the target
local function check_name(cmd)
local current_name = cmd.parameter
if not current_name then
Game.player_print('Usage: /name-check <player>')
return
end
local target = game.players[current_name]
if not target then
Game.player_print('player ' .. current_name .. ' not found')
return
end
local actual_name = global.actual_name[target.index]
Game.player_print(target.name .. ' is actually: ' .. actual_name)
end
--- Prints the index of the target
local function get_player_id(cmd)
local player = game.player
-- Check if the player can run the command
if player and not player.admin then
Utils.cant_run(cmd.name)
return
end
-- Check if the target is valid
local target_name = cmd['parameter']
if not target_name then
Game.player_print('Usage: /get-player-id <player>')
return
end
local target_index = game.players[target_name].index
Game.player_print(target_name .. ' -- ' .. target_index)
end
if global.scenario.config.players_assigned_names == true then
Event.add(defines.events.on_player_created, name_player_event)
end
if global.scenario.config.players_roll_names == true then
commands.add_command('name-roll', 'Assigns you a random, silly name', name_player_command)
end
if global.scenario.config.players_roll_names == true or global.scenario.config.players_assigned_names == true then
commands.add_command('name-restore', 'Removes your fun name and gives you back your actual name', restore_name)
commands.add_command('name-check', '<player> Check the original name of a player', check_name)
commands.add_command('get-player-id', 'Gets the ID of a player (Admin only)', get_player_id)
end

View File

@@ -0,0 +1,159 @@
require 'utils.list_utils'
local Game = require 'utils.game'
local Event = require 'utils.event'
local naming_words = require 'resources.naming_words'
local Utils = require('utils.utils')
global.actual_name = {}
global.silly_names = {}
global.silly_names.count = 0
local name_combinations = #naming_words.adverbs * #naming_words.adjectives * #naming_words.nouns
--- Creates name by combining elements from the passed table
-- @param1 table including adverbs, adjectives, and nouns
-- @returns name as a string
local function create_name(words_table)
local adverb, adjective, noun
adverb = table.get_random(words_table.adverbs)
adjective = table.get_random(words_table.adjectives)
noun = table.get_random(words_table.nouns)
return adverb .. '_' .. adjective .. '_' .. noun
end
--- Calls create_name until a unique name is returned
-- @param1 table including adverbs, adjectives, and nouns
-- @returns name as a string
local function create_unique_name(words_table)
local silly_names = global.silly_names
local name = create_name(words_table)
while table.contains(silly_names, name) do
name = create_name(words_table)
end
return name
end
--- Assigns a player a name, stores their old and silly names
-- @param1 Takes a LuaPlayer
local function name_player(player)
-- Store a player's original name in case they want it back.
if not global.actual_name[player.index] then
global.actual_name[player.index] = player.name
end
-- Because create_unique_name enters a while loop looking for a unique name, ensure we never get stuck.
local ceiling = math.min(name_combinations * 0.25, 10000)
if global.silly_names.count > ceiling then
global.silly_names = {}
global.silly_names.count = 0
end
local name = create_unique_name(naming_words)
table.insert(global.silly_names, name)
global.silly_names.count = global.silly_names.count + 1
local str = player.name .. ' will now be known as: ' .. name
game.print(str)
Utils.print_admins(str .. ' (ID: ' .. player.index .. ')', false)
player.name = name
end
--- Restores a player's actual name
local function restore_name(cmd)
local player = Game.get_player_by_index(cmd.player_index)
player.name = global.actual_name[player.index]
player.print('Your true name has been restored.')
end
--- Passes _event_ on to name_players
local function name_player_event(event)
local player = Game.get_player_by_index(event.player_index)
name_player(player)
end
--- Passes target or player on to name_players
local function name_player_command(cmd)
local player = game.player
local param = cmd.parameter
local target
if param then
target = game.players[param]
if player and not player.admin then
-- Yes param, yes player, no admin/server = fail, non-admins, non-server cannot use command on others
Game.player_print("Sorry you don't have permission to use the roll-name command on other players.")
return
else
-- Yes param, yes admin/server = check target
if target then
-- Yes param, yes admin/server, yes target = change name
name_player(target)
return
else
-- Yes param, yes admin/server, no target = fail, wrong player name
Game.player_print(table.concat {"Sorry, player '", param, "' was not found."})
return
end
end
else
-- No param = check if server
if not player then
-- No param, no player = server trying to change its name
Game.player_print('The server cannot change its name')
return
end
-- No param, not server = change self name
name_player(player)
return
end
end
--- Prints the original name of the target
local function check_name(cmd)
local current_name = cmd.parameter
if not current_name then
Game.player_print('Usage: /name-check <player>')
return
end
local target = game.players[current_name]
if not target then
Game.player_print('player ' .. current_name .. ' not found')
return
end
local actual_name = global.actual_name[target.index]
Game.player_print(target.name .. ' is actually: ' .. actual_name)
end
--- Prints the index of the target
local function get_player_id(cmd)
local player = game.player
-- Check if the player can run the command
if player and not player.admin then
Utils.cant_run(cmd.name)
return
end
-- Check if the target is valid
local target_name = cmd['parameter']
if not target_name then
Game.player_print('Usage: /get-player-id <player>')
return
end
local target_index = game.players[target_name].index
Game.player_print(target_name .. ' -- ' .. target_index)
end
if global.scenario.config.players_assigned_names == true then
Event.add(defines.events.on_player_created, name_player_event)
end
if global.scenario.config.players_roll_names == true then
commands.add_command('name-roll', 'Assigns you a random, silly name', name_player_command)
end
if global.scenario.config.players_roll_names == true or global.scenario.config.players_assigned_names == true then
commands.add_command('name-restore', 'Removes your fun name and gives you back your actual name', restore_name)
commands.add_command('name-check', '<player> Check the original name of a player', check_name)
commands.add_command('get-player-id', 'Gets the ID of a player (Admin only)', get_player_id)
end

View File

@@ -139,6 +139,7 @@ local terrain_modules = {
--require 'map_gen.misc.nightfall' --require 'map_gen.misc.nightfall'
--require 'map_gen.misc.creep_spread' --require 'map_gen.misc.creep_spread'
--require 'map_gen.misc.car_body' --require 'map_gen.misc.car_body'
--require 'features.silly_player_names'
if #entity_modules > 0 then if #entity_modules > 0 then
shape = shape or b.full_shape shape = shape or b.full_shape

253
resources/naming_words.lua Normal file
View File

@@ -0,0 +1,253 @@
-- Currently geared towards the winter holidays but we can always revise if needed.
-- (Ex. a table of standard/common words and tables for season-specific words, then combined for specific purposes/use-cases)
local Module = {}
Module.adverbs = {
'Abnormally',
'Accidentally',
'Adventurously',
'Anxiously',
'Arrogantly',
'Awkwardly',
'Bashfully',
'Beautifully',
'Blindly',
'Blissfully',
'Boastfully',
'Boldly',
'Bravely',
'Calmly',
'Carefully',
'Carelessly',
'Cautiously',
'Certainly',
'Cheerfully',
'Clearly',
'Closely',
'Continually',
'Courageously',
'Cruelly',
'Curiously',
'Dearly',
'Deeply',
'Defiantly',
'Deliberately',
'Delightfully',
'Dimly',
'Doubtfully',
'Dreamily',
'Easily',
'Elegantly',
'Energetically',
'Enormously',
'Enthusiastically',
'Especially',
'Eventually',
'Excitedly',
'Extremely',
'Fairly',
'Faithfully',
'Famously',
'Fatally',
'Ferociously',
'Fervently',
'Fiercely',
'Fondly',
'Foolishly',
'Frantically',
'Frightfully',
'Furiously',
'Generally',
'Generously',
'Gently',
'Gladly',
'Gleefully',
'Gracefully',
'Greatly',
'Happily',
'Heavily',
'Helpfully',
'Helplessly',
'Honestly',
'Hopelessly',
'Hungrily',
'Innocently',
'Inquisitively',
'Intensely',
'Interestingly',
'Irritably',
'Jovially',
'Joyfully',
'Kindheartedly',
'Kindly',
'Knowingly',
'Lazily',
'Lively',
'Longingly',
'Loosely',
'Loudly',
'Lovingly',
'Loyally',
'Madly',
'Majestically',
'Merrily',
'Miserably',
'Mockingly',
'Mostly',
'Mysteriously',
'Naturally',
'Nearly',
'Nicely',
'Noisily',
'Obnoxiously',
'Offensively',
'Optimistically',
'Painfully',
'Patiently',
'Perfectly',
'Playfully',
'Politely',
'Positively',
'Powerfully',
'Questionably',
'Quickly',
'Quietly',
'Randomly',
'Rapidly',
'Readily',
'Reluctantly',
'Righteously',
'Safely',
'Seemingly',
'Selfishly',
'Silently',
'Sleepily',
'Stealthily',
'Successfully',
'Suddenly',
'Surprisingly',
'Suspiciously',
'Sweetly',
'Tenderly',
'Thankfully',
'Unbearably',
'Unexpectedly',
'Unfortunately',
'Unimpressively',
'Unnecessarily',
'Urgently',
'Uselessly',
'Vaguely',
'Warmly',
'Wildly',
'Wisely',
'Wrongly',
'Youthfully',
}
Module.adjectives = {
'Amazing',
'Attractive',
'Awesome',
'Beautiful',
'Big',
'Blissful',
'Brave',
'Breathtaking',
'Careful',
'Caroling',
'Chubby',
'Clever',
'Clumsy',
'Dazzling',
'Delightful',
'Eager',
'Excitable',
'Fabulous',
'Faithful',
'Fancy',
'Fantastic',
'Fantastical',
'Fierce',
'Gentle',
'Glamorous',
'Gorgeous',
'Great',
'Grumpy',
'Happy',
'Helpful',
'Interesting',
'Jolly',
'Kind',
'Lazy',
'Magical',
'Magnificent',
'Merry',
'Muscular',
'Mystical',
'Naughty',
'Nice',
'Obedient',
'Peaceful',
'Plump',
'Polite',
'Quaint',
'Remarkable',
'Roasting',
'Scary',
'Silly',
'Small',
'Tender',
'Thoughtful',
'White',
'Witty',
'Wonderful',
}
Module.nouns = {
'Advent',
'Angel',
'Bear',
'Bell',
'Candy Cane',
'Caroler',
'Chestnut',
'Christmas Stocking',
'Decoration',
'Elf',
'Feast',
'Fruit Cake',
'Garland',
'Gift',
'Grinch',
'Ham',
'Helper',
'Holiday Dinner',
'Holiday Sweater',
'Holly',
'Ice Skate',
'Ivy',
'Menora',
'Miracle',
'Mistletoe',
'Ornament',
'Package',
'Party',
'Present',
'Reindeer',
'Ribbon',
'Scarf',
'Scrooge',
'Sleigh',
'Snowball',
'Snowflake',
'Snowman',
'Sugarplum',
'Toy',
'Tree',
'Turkey',
'Wreath',
}
return Module