diff --git a/maps/mountain_fortress_v3/ic/functions.lua b/maps/mountain_fortress_v3/ic/functions.lua index 2d8176d3..7fddc058 100644 --- a/maps/mountain_fortress_v3/ic/functions.lua +++ b/maps/mountain_fortress_v3/ic/functions.lua @@ -8,12 +8,10 @@ local Public = {} local main_tile_name = 'black-refined-concrete' local function validate_entity(entity) - if not entity then - return false - end - if not entity.valid then + if not (entity and entity.valid) then return false end + return true end @@ -39,24 +37,43 @@ local function upperCase(str) return (str:gsub('^%l', string.upper)) end -local function render_owner_text(player, entity) +local function render_owner_text(renders, player, entity, new_owner) local color = { r = player.color.r * 0.6 + 0.25, g = player.color.g * 0.6 + 0.25, b = player.color.b * 0.6 + 0.25, a = 1 } - rendering.draw_text { - text = '## - ' .. player.name .. "'s " .. entity.name .. ' - ##', - surface = entity.surface, - target = entity, - target_offset = {0, -2.6}, - color = color, - scale = 1.05, - font = 'default-large-semibold', - alignment = 'center', - scale_with_zoom = false - } + if renders[player.index] then + rendering.destroy(renders[player.index]) + end + if new_owner then + renders[new_owner.index] = + rendering.draw_text { + text = '## - ' .. new_owner.name .. "'s " .. entity.name .. ' - ##', + surface = entity.surface, + target = entity, + target_offset = {0, -2.6}, + color = color, + scale = 1.05, + font = 'default-large-semibold', + alignment = 'center', + scale_with_zoom = false + } + else + renders[player.index] = + rendering.draw_text { + text = '## - ' .. player.name .. "'s " .. entity.name .. ' - ##', + surface = entity.surface, + target = entity, + target_offset = {0, -2.6}, + color = color, + scale = 1.05, + font = 'default-large-semibold', + alignment = 'center', + scale_with_zoom = false + } + end entity.color = color end @@ -134,18 +151,6 @@ local function get_player_entity(ic, player) return false, false end -local function is_owner_on_car_surface(ic, player) - local cars = ic.cars - for k, car in pairs(cars) do - if validate_entity(car.surface) then - if car.owner == player.index and car.surface.index == player.surface.index then - return true - end - end - end - return false -end - local function get_owner_car_name(ic, player) local cars = ic.cars local saved_surfaces = ic.saved_surfaces @@ -168,8 +173,7 @@ local function get_saved_entity(cars, entity, index) table.concat( { 'The built entity is not the same as the saved one. ', - 'Saved entity is: ' .. - upperCase(car.name) .. ' - Built entity is: ' .. upperCase(entity.name) .. '. ' + 'Saved entity is: ' .. upperCase(car.name) .. ' - Built entity is: ' .. upperCase(entity.name) .. '. ' } ) return false, msg @@ -188,7 +192,6 @@ local function replace_entity(cars, entity, index) cars[unit_number].saved_entity = nil cars[unit_number].transfer_entities = car.transfer_entities cars[k] = nil - break end end end @@ -213,7 +216,7 @@ local function replace_surface(surfaces, entity, index) local unit_number = entity.unit_number if tostring(index.saved_entity) == surface.name then if validate_entity(surface) then - surface.name = unit_number + surface.name = tostring(unit_number) surfaces[unit_number] = surface surfaces[k] = nil end @@ -229,7 +232,7 @@ local function replace_surface_entity(cars, entity, index) local unit_number = entity.unit_number if index and index.saved_entity == car.saved_entity then if validate_entity(car.surface) then - car.surface.name = unit_number + car.surface.name = tostring(unit_number) end end end @@ -313,13 +316,7 @@ local function kick_players_from_surface(ic, car) for _, e in pairs(car.surface.find_entities_filtered({area = car.area})) do if validate_entity(e) and e.name == 'character' and e.player then e.player.teleport( - main_surface.find_non_colliding_position( - 'character', - game.forces.player.get_spawn_position(main_surface), - 3, - 0, - 5 - ), + main_surface.find_non_colliding_position('character', game.forces.player.get_spawn_position(main_surface), 3, 0, 5), main_surface ) end @@ -364,13 +361,7 @@ local function kick_player_from_surface(ic, player, target) target.teleport(p, car.entity.surface) else target.teleport( - main_surface.find_non_colliding_position( - 'character', - game.forces.player.get_spawn_position(main_surface), - 3, - 0, - 5 - ), + main_surface.find_non_colliding_position('character', game.forces.player.get_spawn_position(main_surface), 3, 0, 5), main_surface ) end @@ -385,6 +376,7 @@ local function restore_surface(ic, player, entity) local saved_surfaces = ic.saved_surfaces local cars = ic.cars local door = ic.doors + local renders = ic.renders local surfaces = ic.surfaces local index = saved_surfaces[player.index] if not index then @@ -402,7 +394,7 @@ local function restore_surface(ic, player, entity) replace_surface(surfaces, ce, index) replace_surface_entity(cars, ce, index) saved_surfaces[player.index] = nil - render_owner_text(player, ce) + render_owner_text(renders, player, ce) return true end return false @@ -795,12 +787,11 @@ function Public.create_car(ic, event) end if - get_owner_car_name(ic, player) == 'car' and ce.name == 'tank' or - get_owner_car_name(ic, player) == 'car' and ce.name == 'spidertron' or + get_owner_car_name(ic, player) == 'car' and ce.name == 'tank' or get_owner_car_name(ic, player) == 'car' and ce.name == 'spidertron' or get_owner_car_name(ic, player) == 'tank' and ce.name == 'spidertron' then upgrade_surface(ic, player, ce) - render_owner_text(player, ce) + render_owner_text(ic.renders, player, ce) player.print('Your car-surface has been upgraded!', Color.success) return end @@ -828,7 +819,7 @@ function Public.create_car(ic, event) car.surface = Public.create_room_surface(ic, un) Public.create_car_room(ic, car) - render_owner_text(player, ce) + render_owner_text(ic.renders, player, ce) return car end @@ -887,10 +878,7 @@ function Public.use_door_with_entity(ic, player, door) if owner and owner.valid and player.connected then if not list[player.name] and not player.admin then player.driving = false - return player.print( - 'You have not been approved by ' .. owner.name .. ' to enter their vehicle.', - Color.warning - ) + return player.print('You have not been approved by ' .. owner.name .. ' to enter their vehicle.', Color.warning) end end @@ -960,5 +948,7 @@ end Public.kick_player_from_surface = kick_player_from_surface Public.get_player_surface = get_player_surface Public.get_entity_from_player_surface = get_entity_from_player_surface +Public.get_owner_car_object = get_owner_car_object +Public.render_owner_text = render_owner_text return Public diff --git a/maps/mountain_fortress_v3/ic/gui.lua b/maps/mountain_fortress_v3/ic/gui.lua index 69329ded..dcd38c7a 100644 --- a/maps/mountain_fortress_v3/ic/gui.lua +++ b/maps/mountain_fortress_v3/ic/gui.lua @@ -7,15 +7,21 @@ local Event = require 'utils.event' local Public = {} --! Gui Frames -local save_button_name = Gui.uid_name() -local discard_button_name = Gui.uid_name() +local save_add_player_button_name = Gui.uid_name() +local save_transfer_car_button_name = Gui.uid_name() +local discard_add_player_button_name = Gui.uid_name() +local discard_transfer_car_button_name = Gui.uid_name() local main_frame_name = Gui.uid_name() local draw_add_player_frame_name = Gui.uid_name() +local draw_transfer_car_frame_name = Gui.uid_name() local main_toolbar_name = Gui.uid_name() local add_player_name = Gui.uid_name() +local transfer_car_name = Gui.uid_name() local kick_player_name = Gui.uid_name() local raise_event = script.raise_event +local add_toolbar +local remove_toolbar local function increment(t, k) t[k] = true @@ -35,6 +41,54 @@ local function create_player_table(player) return trust_system[player.index] end +local function does_player_table_exist(player) + local trust_system = ICT.get('trust_system') + if not trust_system[player.index] then + return false + else + return true + end +end + +local function transfer_player_table(player, new_player) + local trust_system = ICT.get('trust_system') + if not trust_system[player.index] then + return false + end + + if player.index == new_player.index then + return false + end + + if not trust_system[new_player.index] then + local Functions = require 'maps.mountain_fortress_v3.ic.functions' + + trust_system[new_player.index] = trust_system[player.index] + local name = new_player.name + + if not trust_system[new_player.index][name] then + increment(trust_system[new_player.index], name) + end + + local cars = ICT.get('cars') + local renders = ICT.get('renders') + local c = Functions.get_owner_car_object(cars, player) + local car = cars[c] + car.owner = new_player.index + + Functions.render_owner_text(renders, player, car.entity, new_player) + + remove_toolbar(player) + add_toolbar(new_player) + + trust_system[player.index] = nil + else + return false + end + + return trust_system[new_player.index] +end + local function remove_main_frame(main_frame) Gui.remove_data_recursively(main_frame) main_frame.destroy() @@ -51,7 +105,7 @@ local function draw_add_player(frame) } ) local main_frame_style = main_frame.style - main_frame_style.width = 325 + main_frame_style.width = 370 main_frame_style.use_header_filler = true local inside_frame = main_frame.add {type = 'frame', style = 'inside_shallow_frame'} @@ -75,20 +129,71 @@ local function draw_add_player(frame) left_flow.style.horizontal_align = 'left' left_flow.style.horizontally_stretchable = true - local close_button = left_flow.add({type = 'button', name = discard_button_name, caption = 'Discard'}) + local close_button = left_flow.add({type = 'button', name = discard_add_player_button_name, caption = 'Discard'}) close_button.style = 'back_button' close_button.style.maximal_width = 100 local right_flow = bottom_flow.add({type = 'flow'}) right_flow.style.horizontal_align = 'right' - local save_button = right_flow.add({type = 'button', name = save_button_name, caption = 'Save'}) + local save_button = right_flow.add({type = 'button', name = save_add_player_button_name, caption = 'Save'}) save_button.style = 'confirm_button' save_button.style.maximal_width = 100 Gui.set_data(save_button, add_player_frame) end +local function draw_transfer_car(frame) + local main_frame = + frame.add( + { + type = 'frame', + name = draw_transfer_car_frame_name, + caption = 'Transfer Car', + direction = 'vertical' + } + ) + local main_frame_style = main_frame.style + main_frame_style.width = 370 + main_frame_style.use_header_filler = true + + local inside_frame = main_frame.add {type = 'frame', style = 'inside_shallow_frame'} + local inside_frame_style = inside_frame.style + inside_frame_style.padding = 0 + local inside_table = inside_frame.add {type = 'table', column_count = 1} + local inside_table_style = inside_table.style + inside_table_style.vertical_spacing = 5 + inside_table_style.top_padding = 10 + inside_table_style.left_padding = 10 + inside_table_style.right_padding = 0 + inside_table_style.bottom_padding = 10 + inside_table_style.width = 325 + + local transfer_car_alert_frame = main_frame.add({type = 'label', caption = "Warning, this action can't be undone!"}) + transfer_car_alert_frame.style.font_color = {r = 255, g = 0, b = 0} + local transfer_car_frame = main_frame.add({type = 'textfield', text = 'Name of the player.'}) + transfer_car_frame.style.width = 140 + + local bottom_flow = main_frame.add({type = 'flow', direction = 'horizontal'}) + + local left_flow = bottom_flow.add({type = 'flow'}) + left_flow.style.horizontal_align = 'left' + left_flow.style.horizontally_stretchable = true + + local close_button = left_flow.add({type = 'button', name = discard_transfer_car_button_name, caption = 'Discard'}) + close_button.style = 'back_button' + close_button.style.maximal_width = 100 + + local right_flow = bottom_flow.add({type = 'flow'}) + right_flow.style.horizontal_align = 'right' + + local save_button = right_flow.add({type = 'button', name = save_transfer_car_button_name, caption = 'Save'}) + save_button.style = 'confirm_button' + save_button.style.maximal_width = 100 + + Gui.set_data(save_button, transfer_car_frame) +end + local function draw_players(data) local player_table = data.player_table local add_player_frame = data.add_player_frame @@ -149,7 +254,7 @@ local function draw_main_frame(player) main_frame.auto_center = true local main_frame_style = main_frame.style - main_frame_style.width = 350 + main_frame_style.width = 400 main_frame_style.use_header_filler = true local inside_frame = main_frame.add {type = 'frame', style = 'inside_shallow_frame'} @@ -166,6 +271,7 @@ local function draw_main_frame(player) inside_table_style.width = 350 local add_player_frame = inside_table.add({type = 'button', caption = 'Add Player', name = add_player_name}) + local transfer_car_frame = inside_table.add({type = 'button', caption = 'Transfer Car', name = transfer_car_name}) local player_table = inside_table.add { @@ -216,6 +322,7 @@ local function draw_main_frame(player) local data = { player_table = player_table, add_player_frame = add_player_frame, + transfer_car_frame = transfer_car_frame, player = player } draw_players(data) @@ -242,7 +349,7 @@ local function toggle(player, recreate) end end -local function add_toolbar(player, remove) +add_toolbar = function(player, remove) if remove then if player.gui.top[main_toolbar_name] then player.gui.top[main_toolbar_name].destroy() @@ -264,7 +371,7 @@ local function add_toolbar(player, remove) ) end -local function remove_toolbar(player) +remove_toolbar = function(player) local screen = player.gui.screen local main_frame = screen[main_frame_name] @@ -301,7 +408,29 @@ Gui.on_click( ) Gui.on_click( - save_button_name, + transfer_car_name, + function(event) + local player = event.player + if not player or not player.valid or not player.character then + return + end + + local screen = player.gui.screen + local frame = screen[main_frame_name] + if not frame or not frame.valid then + return + end + local player_frame = frame[draw_transfer_car_frame_name] + if not player_frame or not player_frame.valid then + draw_transfer_car(frame) + else + player_frame.destroy() + end + end +) + +Gui.on_click( + save_add_player_button_name, function(event) local player = event.player if not player or not player.valid or not player.character then @@ -345,6 +474,58 @@ Gui.on_click( end ) +Gui.on_click( + save_transfer_car_button_name, + function(event) + local player = event.player + if not player or not player.valid or not player.character then + return + end + + local screen = player.gui.screen + local frame = screen[main_frame_name] + local transfer_car_frame = Gui.get_data(event.element) + + if frame and frame.valid then + if transfer_car_frame and transfer_car_frame.valid and transfer_car_frame.text then + local text = transfer_car_frame.text + if not text then + return + end + local player_to_add = game.get_player(text) + if not player_to_add or not player_to_add.valid then + return player.print('Target player was not valid.', Color.warning) + end + + local name = player_to_add.name + local does_player_have_a_car = does_player_table_exist(name) + if does_player_have_a_car then + return player.print(name .. ' already has a vehicle.', Color.warning) + end + + local to_add = game.get_player(name) + if not (to_add and to_add.valid) then + return player.print(name .. ' does not exist.', Color.warning) + end + + local success = transfer_player_table(player, to_add) + if not success then + player.print('Please try again.', Color.warning) + else + player.print('You have successfully transferred your car to ' .. name, Color.success) + to_add.print('You have become the rightfully owner of ' .. player.name .. "'s car!", Color.success) + end + + remove_main_frame(event.element) + + if player.gui.screen[main_frame_name] then + player.gui.screen[main_frame_name].destroy() + end + end + end + end +) + Gui.on_click( kick_player_name, function(event) @@ -394,7 +575,7 @@ Gui.on_click( ) Gui.on_click( - discard_button_name, + discard_add_player_button_name, function(event) local player = event.player if not player or not player.valid or not player.character then @@ -414,6 +595,27 @@ Gui.on_click( end ) +Gui.on_click( + discard_transfer_car_button_name, + function(event) + local player = event.player + if not player or not player.valid or not player.character then + return + end + + local screen = player.gui.screen + local frame = screen[main_frame_name] + if not frame or not frame.valid then + return + end + local player_frame = frame[draw_transfer_car_frame_name] + + if player_frame and player_frame.valid then + player_frame.destroy() + end + end +) + Gui.on_click( main_toolbar_name, function(event) diff --git a/maps/mountain_fortress_v3/ic/table.lua b/maps/mountain_fortress_v3/ic/table.lua index 0bfb9bed..c47d2ded 100644 --- a/maps/mountain_fortress_v3/ic/table.lua +++ b/maps/mountain_fortress_v3/ic/table.lua @@ -30,6 +30,7 @@ function Public.reset() this.restore_on_theft = false this.doors = {} this.cars = {} + this.renders = {} this.saved_surfaces = {} this.allowed_surface = 'nauvis' this.trust_system = {} diff --git a/modules/rpg/settings.lua b/modules/rpg/settings.lua index 33f3769e..d80c97ee 100644 --- a/modules/rpg/settings.lua +++ b/modules/rpg/settings.lua @@ -406,8 +406,7 @@ function Public.extra_settings(player) local conjure_input_style = conjure_input.style conjure_input_style.height = 35 conjure_input_style.vertical_align = 'center' - conjure_gui_input = - create_input_element(conjure_input, 'dropdown', false, names, rpg_t[player.index].dropdown_select_index) + conjure_gui_input = create_input_element(conjure_input, 'dropdown', false, names, rpg_t[player.index].dropdown_select_index) for _, entity in pairs(spells) do if entity.type == 'item' then @@ -482,8 +481,7 @@ function Public.extra_settings(player) local name_input_style = name_input.style name_input_style.height = 35 name_input_style.vertical_align = 'center' - auto_allocate_gui_input = - create_input_element(name_input, 'dropdown', false, names, rpg_t[player.index].allocate_index) + auto_allocate_gui_input = create_input_element(name_input, 'dropdown', false, names, rpg_t[player.index].allocate_index) end local data = { @@ -523,15 +521,13 @@ function Public.extra_settings(player) left_flow.style.horizontal_align = 'left' left_flow.style.horizontally_stretchable = true - local close_button = - left_flow.add({type = 'button', name = discard_button_name, caption = ({'rpg_settings.discard_changes'})}) + local close_button = left_flow.add({type = 'button', name = discard_button_name, caption = ({'rpg_settings.discard_changes'})}) close_button.style = 'back_button' local right_flow = bottom_flow.add({type = 'flow'}) right_flow.style.horizontal_align = 'right' - local save_button = - right_flow.add({type = 'button', name = save_button_name, caption = ({'rpg_settings.save_changes'})}) + local save_button = right_flow.add({type = 'button', name = save_button_name, caption = ({'rpg_settings.save_changes'})}) save_button.style = 'confirm_button' Gui.set_data(save_button, data)