1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2025-03-17 21:08:08 +02:00

Refactoring + Locales + Welcome message fix

This commit is contained in:
SimonFlapse 2019-10-06 14:53:51 +02:00
parent dcf66d3bac
commit 199c824ad7
4 changed files with 183 additions and 76 deletions

View File

@ -167,7 +167,7 @@ global.config = {
-- prints messages when the player joins
join_messages = {
'Welcome to this map created by the RedMew team. You can join our discord at: redmew.com/discord',
'Click the question mark in the top left corner for server information and map details.'
'Click the infomation icon in the top left corner for server information and map details.'
},
cutscene = false,
-- format is a table: {{message, weight}, {message, weight}}, where a higher weight has more chance to be shown

View File

@ -126,3 +126,18 @@ switch_msg=Go ahead and pick a quadrant you'd like to help out!
force_sync_research=New research complete:
train_notice1=## - Your items have been returned to __1__ at:
# locale linked to concrete jungle
[concrete_jungle]
welcome_popup_title=Welcome to Concrete jungle
welcome_popup_player_name=Hello __1__
welcome_popup_line_1=Most items can't be placed on the ground!
welcome_popup_line_2=Place stone brick, concrete or reinforced concrete on the ground,\nbefore placing items and machines!
welcome_popup_line_3=More information can be found in the __1__ tab\nin __3__ __2__
blueprint=blueprint
blueprint_not_enough_ground_support=Some parts of this __1__ cannot be placed here, they need better ground support!
entity_not_enough_ground_support=__1__ requires at least: __2__
anti_grief_kick_reason=Spilling too many items on the ground
anti_grief_jail_reason=You have spilled too many items on the ground, contact an admin

View File

@ -7,6 +7,8 @@ local Color = require 'resources.color_presets'
local Retailer = require 'features.retailer'
local Task = require 'utils.task'
local Popup = require 'features.gui.popup'
local Global = require 'utils.global'
local Report = require 'features.report'
local redmew_config = global.config
@ -43,6 +45,16 @@ if concrete_unlocker then
)
end
local times_spilled = {}
Global.register(
{
times_spilled = times_spilled
},
function(tbl)
times_spilled = tbl.times_spilled
end
)
local ScenarioInfo = require 'features.gui.info'
ScenarioInfo.set_map_name('Concrete Jungle')
@ -195,6 +207,7 @@ Thanks to Sangria_Louie for the map suggestion!
)
RestrictEntities.set_tile_bp()
RestrictEntities.enable_spill()
--- The logic for checking that there are the correct ground support under the entity's position
RestrictEntities.set_keep_alive_callback(
@ -230,6 +243,56 @@ RestrictEntities.set_keep_alive_callback(
)
)
local clean_cursor_delay =
Token.register(
function(params)
params.player.clean_cursor()
end
)
--- Anti griefing
local anti_grief_tries = 3 -- Change this number to change how many 'shots' a player has got
local forgiveness_time = 432000 -- Time before previous offences are forgiven, in ticks (60 ticks/sec)
local anti_grief_kick_tries = math.ceil(anti_grief_tries / 2) -- Tries before kick warning
RestrictEntities.set_anti_grief_callback(
Token.register(
function(_, player)
Popup.player(player, [[
Look out!
You are trying to replace entities which have items inside!
This is causing the items to spill out on the ground.
Please be careful!
]], nil, nil, 'entity_placement_restriction_inventory_warning')
local player_stat = times_spilled[player.index]
local number_of_spilled = player_stat and player_stat.count or 0
local last_offence = player_stat and player_stat.tick or 0
local time_since_last_offence = game.tick - last_offence
if (last_offence > 0 and time_since_last_offence >= forgiveness_time) then
game.print('Forgiven!')
number_of_spilled = 0
end
if number_of_spilled >= anti_grief_tries then
Report.jail(player, nil)
player.print({'', '[color=yellow]', {'concrete_jungle.anti_grief_jail_reason'}, '[/color]'})
Report.report(nil, player, 'Spilling too many items on the ground')
times_spilled[player.index] = nil
return
elseif number_of_spilled == anti_grief_kick_tries then
game.kick_player(player, {'concrete_jungle.anti_grief_kick_reason'})
end
times_spilled[player.index] = {count = number_of_spilled + 1, tick = game.tick}
Task.set_timeout_in_ticks(1, clean_cursor_delay, {player = player})
end
)
)
local function print_floating_text(player, entity, text, color)
color = color or Color.white
local surface = player.surface
@ -259,17 +322,17 @@ local function on_destroy(event)
if p and p.valid then
if not (name == 'blueprint') then
local tier = '[tile=stone-path] stone path'
local tier = {'item-name.stone-path'}
if (entity_tiers[name] == 2) then
tier = '[tile=concrete] concrete'
tier = {'item-name.concrete'}
elseif (entity_tiers[name] == 3) then
tier = '[tile=refined-concrete] refined concrete'
tier = {'item-name.refined-concrete'}
end
local text = '[item=' .. name .. '] requires at least ' .. tier
local text = {'concrete_jungle.entity_not_enough_ground_support', '[item=' .. name .. ']', tier}
--local text = '[color=yellow]This [/color][item=' .. name .. '][color=yellow] cannot be placed here, it needs ground support of at least [/color]' .. tier
print_floating_text(p, entity, text)
else
p.print('[color=yellow]Some parts of this [/color][color=red]blueprint[/color][color=yellow] cannot be placed here, they need better ground support![/color]')
p.print({'', '[color=yellow]', {'concrete_jungle.blueprint_not_enough_ground_support', {'', '[/color][color=red]', {'concrete_jungle.blueprint'}, '[/color][color=yellow]'}}, '[/color]'})
end
end
end
@ -361,32 +424,44 @@ local function player_built_tile(event)
end
end
local function first_time(event)
local p = game.get_player(event.player_index)
Popup.player(p, '[color=yellow]Hello ' .. p.name .. '[/color]' ..
[[
Most items can't be placed on the ground!
Place stone brick, concrete or reinforced concrete on the ground,
before placing items and machines!
More information can be found in the [color=red]Map Info[/color] tab
in [virtual-signal=signal-info] [color=red]Redmew Info[/color]
]],
'Welcome to Concrete Jungle', nil, 'concrete_jungle_intro')
end
local first_time =
Token.register(
function(params)
local p = game.get_player(params.event.player_index)
Popup.player(
p,
{
'',
'[color=yellow]',
{'concrete_jungle.welcome_popup_player_name', p.name},
'[/color]\n\n',
{'concrete_jungle.welcome_popup_line_1'},
'\n\n',
{'concrete_jungle.welcome_popup_line_2'},
'\n\n',
{'concrete_jungle.welcome_popup_line_3', '[color=red]Map Info[/color]', '[color=red]Redmew Info[/color]', '[virtual-signal=signal-info]'}
},
{'concrete_jungle.welcome_popup_title'},
nil,
'concrete_jungle_intro'
)
end
)
Event.add(RestrictEntities.events.on_pre_restricted_entity_destroyed, on_destroy)
Event.add(defines.events.on_player_mined_tile, player_mined_tile)
Event.add(defines.events.on_marked_for_deconstruction, marked_for_deconstruction)
Event.add(defines.events.on_player_built_tile, player_built_tile)
Event.add(defines.events.on_robot_built_tile, player_built_tile)
Event.add(defines.events.on_player_created, first_time)
Event.add(
defines.events.on_player_created,
function(event)
Task.set_timeout_in_ticks(900, first_time, {event = event})
end
)
Event.on_init(on_init)
--Creating the starting circle
--- Creating the starting circle (Map_gen)
local circle = b.circle(6)
local square = b.rectangle(3, 3)
local concrete_square = b.change_tile(square, true, 'hazard-concrete-left')

View File

@ -44,8 +44,6 @@ local Event = require 'utils.event'
local Global = require 'utils.global'
local Token = require 'utils.token'
local table = require 'utils.table'
local Popup = require 'features.gui.popup'
local Report = require 'features.report'
-- Localized functions
local raise_event = script.raise_event
@ -87,30 +85,65 @@ local primitives = {
event = nil, -- if the event is registered or not
refund = true, -- if we issue a refund or not
prevent_tile_bp = false, -- prevents players from placing blueprints with tiles
keep_alive_callback = nil -- the function to process entities through
spill = false, -- spills items from entities with inventories to prevent destroying items when upgrading
keep_alive_callback = nil, -- the token registered function to process entities through
anti_grief_callback = nil -- the token registered function to process anti griefing through
}
local times_spilled = {}
Global.register(
{
allowed_entities = allowed_entities,
banned_entities = banned_entities,
primitives = primitives,
times_spilled = times_spilled
primitives = primitives
},
function(tbl)
allowed_entities = tbl.allowed_entities
banned_entities = tbl.banned_entities
primitives = tbl.primitives
times_spilled = tbl.times_spilled
end
)
-- Local functions
--- Spill items stacks
-- @param entity <LuaEntity> the entity from which the items should be spilled
-- @param item <ItemStackSpecification> the item stack that should be spilled
local function spill_item_stack(entity, item)
entity.surface.spill_item_stack(entity.position, item, true, entity.force, false)
end
--- Checks if entity has an inventory with items inside, and spills them on the ground
local function entities_with_inventory(entity, player)
if primitives.spill and entity.has_items_inside() then
local type = entity.type
if type == 'container' or type == 'logistic-container' then
for item, count in pairs(entity.get_inventory(defines.inventory.chest).get_contents()) do
spill_item_stack(entity, {name = item, count = count})
end
elseif type == 'furnace' then
for item, count in pairs(entity.get_inventory(defines.inventory.fuel).get_contents()) do
spill_item_stack(entity, {name = item, count = count})
end
for item, count in pairs(entity.get_inventory(defines.inventory.furnace_result).get_contents()) do
spill_item_stack(entity, {name = item, count = count})
end
for item, count in pairs(entity.get_inventory(defines.inventory.furnace_source).get_contents()) do
spill_item_stack(entity, {name = item, count = count})
end
elseif type == 'assembling-machine' then
for item, count in pairs(entity.get_inventory(defines.inventory.assembling_machine_input).get_contents()) do
spill_item_stack(entity, {name = item, count = count})
end
for item, count in pairs(entity.get_inventory(defines.inventory.assembling_machine_modules).get_contents()) do
spill_item_stack(entity, {name = item, count = count})
end
for item, count in pairs(entity.get_inventory(defines.inventory.assembling_machine_output).get_contents()) do
spill_item_stack(entity, {name = item, count = count})
end
end
Token.get(primitives.anti_grief_callback)(entity, player)
end
end
--- Token for the on_built event callback, checks if an entity should be destroyed.
local on_built_token =
@ -170,49 +203,8 @@ local on_built_token =
-- Need to revalidate the entity since we sent it to the raised event
if entity.valid then
local type = entity.type
if entity.has_items_inside() then
if type == 'container' or type == 'logistic-container' then
for item, count in pairs(entity.get_inventory(defines.inventory.chest).get_contents()) do
spill_item_stack(entity, {name = item, count = count})
end
elseif type == 'furnace' then
for item, count in pairs(entity.get_inventory(defines.inventory.fuel).get_contents()) do
spill_item_stack(entity, {name = item, count = count})
end
for item, count in pairs(entity.get_inventory(defines.inventory.furnace_result).get_contents()) do
spill_item_stack(entity, {name = item, count = count})
end
for item, count in pairs(entity.get_inventory(defines.inventory.furnace_source).get_contents()) do
spill_item_stack(entity, {name = item, count = count})
end
elseif type == 'assembling-machine' then
for item, count in pairs(entity.get_inventory(defines.inventory.assembling_machine_input).get_contents()) do
spill_item_stack(entity, {name = item, count = count})
end
for item, count in pairs(entity.get_inventory(defines.inventory.assembling_machine_modules).get_contents()) do
spill_item_stack(entity, {name = item, count = count})
end
for item, count in pairs(entity.get_inventory(defines.inventory.assembling_machine_output).get_contents()) do
spill_item_stack(entity, {name = item, count = count})
end
end
Popup.player(player, [[
Look out!
You are trying to replace entities which have items inside!
This is causing the items to spill out on the ground.
Please be careful!
]], nil, nil, 'entity_placement_restriction_inventory_warning')
local number_of_spilled = times_spilled[player.index] or 0
times_spilled[player.index] = number_of_spilled + 1
if number_of_spilled >= 3 then
Report.jail(player, nil)
player.print('[color=yellow]You have spilled too many items on the ground, contact an admin[/color]')
Report.report(nil, player, 'Spilling too many items on the ground')
end
end
-- Checking if the entity has an inventory and spills the content on the ground to prevent destroying those too
entities_with_inventory(entity, player)
entity.destroy()
end
@ -275,6 +267,21 @@ function Public.remove_keep_alive_callback()
check_event_status()
end
--- Sets the anti_grief_callback function. This function is used to provide
-- logic on what entities should and should not be destroyed.
-- @param anti_grief_callback <function>
function Public.set_anti_grief_callback(anti_grief_callback)
if type(anti_grief_callback) ~= 'number' then
error('Sending a non-token function')
end
primitives.anti_grief_callback = anti_grief_callback
end
--- Removes the anti_grief_callback function
function Public.remove_anti_grief_callback()
primitives.anti_grief_callback = nil
end
--- Adds to the list of allowed entities
-- @param ents <table> array of string entity names
function Public.add_allowed(ents)
@ -333,14 +340,24 @@ function Public.set_refund()
primitives.refund = false
end
--- Enables the returning of items that are destroyed by this module
--- Enables the ability to blueprint tiles (Landfill always enabled)
function Public.enable_tile_bp()
primitives.prevent_tile_bp = false
end
--- Disables the returning of items that are destroyed by this module
--- Disables the ability to blueprint tiles (Landfill always enabled)
function Public.set_tile_bp()
primitives.prevent_tile_bp = true
end
--- Enables the spill function
function Public.enable_spill()
primitives.spill = true
end
--- Disables the spill function
function Public.set_spill()
primitives.spill = false
end
return Public