diff --git a/core/assets-raw/sprites/blocks/logic/world-switch-on.png b/core/assets-raw/sprites/blocks/logic/world-switch-on.png new file mode 100644 index 0000000000..54f03c820c Binary files /dev/null and b/core/assets-raw/sprites/blocks/logic/world-switch-on.png differ diff --git a/core/assets-raw/sprites/blocks/logic/world-switch.png b/core/assets-raw/sprites/blocks/logic/world-switch.png new file mode 100644 index 0000000000..b7c65601a9 Binary files /dev/null and b/core/assets-raw/sprites/blocks/logic/world-switch.png differ diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index 268f751481..c222cc0c38 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -348,15 +348,15 @@ command.rebuild = Reconstrueix command.assist = Assisteix al jugador command.move = Mou command.boost = Sobrevola -command.loadUnits = Load Units -command.loadBlocks = Load Blocks -command.unloadPayload = Unload Payload -stance.stop = Cancel Orders -stance.shoot = Stance: Shoot -stance.holdfire = Stance: Hold Fire -stance.pursuetarget = Stance: Pursue Target -stance.patrol = Stance: Patrol Path -stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding +command.loadUnits = Carrega unitats +command.loadBlocks = Carrega blocs +command.unloadPayload = Descarrega +stance.stop = Cancel·la les ordres +stance.shoot = Comportament: Dispara +stance.holdfire = Comportament: Mantén el foc +stance.pursuetarget = Comportament: Persegueix l’objectiu +stance.patrol = Comportament: Patrulla el camí +stance.ram = Comportament: Senzill\n[lightgray]Mou-te en línia recta, sense encaminador openlink = Obre l’enllaç copylink = Copia l’enllaç back = Enrere @@ -655,7 +655,7 @@ marker.shapetext.name = Forma del text marker.minimap.name = Minimapa marker.shape.name = Forma marker.text.name = Text -marker.line.name = Line +marker.line.name = Línia marker.background = Fons marker.outline = Contorn @@ -970,9 +970,9 @@ ability.movelightning = Moviment llampec ability.shieldarc = Escut de descàrregues ability.suppressionfield = Regen Suppression Field ability.energyfield = Camp de força -ability.energyfield.sametypehealmultiplier = [lightgray]Same Type Healing: [white]{0}% -ability.energyfield.maxtargets = [lightgray]Max Targets: [white]{0} -ability.regen = Regeneration +ability.energyfield.sametypehealmultiplier = [lightgray]Mateix tipus de guarició: [white]{0} % +ability.energyfield.maxtargets = [lightgray]Objectius màx.: [white]{0} +ability.regen = Regeneració bar.onlycoredeposit = Només es permet depositar al nucli. bar.drilltierreq = Cal una perforadora millor. @@ -1067,7 +1067,7 @@ setting.backgroundpause.name = Pausa automàtica quan s’estigui en segon pla setting.buildautopause.name = Pausa automàtica quan es construeixi setting.doubletapmine.name = Dos tocs/clics per a extreure recursos setting.commandmodehold.name = Mantén per al mode de comandament -setting.distinctcontrolgroups.name = Limit One Control Group Per Unit +setting.distinctcontrolgroups.name = Limita a un grup de control per unitat setting.modcrashdisable.name = Desactiva els mods quan no es pugui iniciar el joc setting.animatedwater.name = Animacions del terreny setting.animatedshields.name = Animacions dels escuts @@ -1114,7 +1114,7 @@ setting.position.name = Mostra la posició del jugador setting.mouseposition.name = Mostra la posició del ratolí setting.musicvol.name = Volum de la música setting.atmosphere.name = Mostra l’atmosfera del planeta -setting.drawlight.name = Draw Darkness/Lighting +setting.drawlight.name = Dibuixa la foscor/llum setting.ambientvol.name = Volum del so ambiental setting.mutemusic.name = Silencia la música setting.sfxvol.name = Volums dels efectes de so @@ -1141,7 +1141,7 @@ keybind.title = Personalització dels controls keybinds.mobile = [scarlet]La majoria de dreceres no estan disponibles en les versions per a pantalles tàctils. Només està inclòs el moviment bàsic. category.general.name = General category.view.name = Control de la vista i altres -category.command.name = Unit Command +category.command.name = Ordre d’unitat category.multiplayer.name = Multijugador category.blocks.name = Selecció d’estructures per construir placement.blockselectkeys = \n[lightgray]Tecles: [{0}, @@ -1159,23 +1159,23 @@ keybind.mouse_move.name = Segueix el ratolí keybind.pan.name = Desplaça la vista keybind.boost.name = Sobrevola keybind.command_mode.name = Mode de comandament -keybind.command_queue.name = Unit Command Queue -keybind.create_control_group.name = Create Control Group -keybind.cancel_orders.name = Cancel Orders -keybind.unit_stance_shoot.name = Unit Stance: Shoot -keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire -keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target -keybind.unit_stance_patrol.name = Unit Stance: Patrol -keybind.unit_stance_ram.name = Unit Stance: Ram -keybind.unit_command_move = Unit Command: Move -keybind.unit_command_repair = Unit Command: Repair -keybind.unit_command_rebuild = Unit Command: Rebuild -keybind.unit_command_assist = Unit Command: Assist -keybind.unit_command_mine = Unit Command: Mine -keybind.unit_command_boost = Unit Command: Boost -keybind.unit_command_load_units = Unit Command: Load Units -keybind.unit_command_load_blocks = Unit Command: Load Blocks -keybind.unit_command_unload_payload = Unit Command: Unload Payload +keybind.command_queue.name = Cua d’ordres d’unitat +keybind.create_control_group.name = Crea un grup de control +keybind.cancel_orders.name = Cancel·la les ordres +keybind.unit_stance_shoot.name = Comportament: Dispara +keybind.unit_stance_hold_fire.name = Comportament: Mantén el foc +keybind.unit_stance_pursue_target.name = Comportament: Persegueix l’objectiu +keybind.unit_stance_patrol.name = Comportament: Patrulla +keybind.unit_stance_ram.name = Comportament: Senzill +keybind.unit_command_move = Comportament: Mou +keybind.unit_command_repair = Comportament: Repara +keybind.unit_command_rebuild = Comportament: Reconstrueix +keybind.unit_command_assist = Comportament: Assisteix +keybind.unit_command_mine = Comportament: Extrau +keybind.unit_command_boost = Comportament: Sobrevola +keybind.unit_command_load_units = Comportament: Carrega unitats +keybind.unit_command_load_blocks = Comportament: Carrega blocs +keybind.unit_command_unload_payload = Comportament: Descarrega keybind.rebuild_select.name = Reconstrueix la regió keybind.schematic_select.name = Selecciona una regió keybind.schematic_menu.name = Menú de plànols @@ -1239,7 +1239,7 @@ mode.pvp.description = Lluiteu contra altres jugadors localment.\n[gray]Cal que mode.attack.name = Atac mode.attack.description = Destruïu la base enemiga. \n[gray]Cal que al mapa hi hagi un nucli vermell. mode.custom = Regles personalitzades -rules.invaliddata = Invalid clipboard data. +rules.invaliddata = Dades del porta-retalls no vàlides. rules.hidebannedblocks = Amaga els blocs no permesos rules.infiniteresources = Recursos infinits @@ -2274,10 +2274,10 @@ lst.cutscene = Manipula la càmera del jugador. lst.setflag = Estableix un senyal global que es podrà llegir en tots els processadors. lst.getflag = Obtén un senyal global. lst.setprop = Estableix una propietat d’una unitat o estructura. -lst.effect = Create a particle effect. -lst.sync = Sync a variable across the network.\nOnly invoked 10 times a second at most. -lst.makemarker = Create a new logic marker in the world.\nAn ID to identify this marker must be provided.\nMarkers currently limited to 20,000 per world. -lst.setmarker = Set a property for a marker.\nThe ID used must be the same as in the Make Marker instruction. +lst.effect = Crea un efecte de particula. +lst.sync = Sincronitza una variable a través de la xarxa.\nS’invoca com a molt 10 vegades per segon. +lst.makemarker = Crea una marca lògica al món.\nS’ha de donar un ID per a identificar-la.\nEs poden establir fins a 20.000 marcadors per món. +lst.setmarker = Estableix una propietat per a la marca.\nL’ID que es faci servir ha de ser el mateix que el de la instrucció de crear la marca. logic.nounitbuild = [red]Aquí no es permet construir blocs de tipus lògic. diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index b1a6b32aca..d72941dee9 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -586,3 +586,4 @@ 63096=fast|status-fast-ui 63095=ranai|ranai 63094=cat|cat +63093=world-switch|block-world-switch-ui diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index f7b63bc6a4..6d7f4623f4 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -160,7 +160,7 @@ public class Blocks{ //logic message, switchBlock, microProcessor, logicProcessor, hyperProcessor, largeLogicDisplay, logicDisplay, memoryCell, memoryBank, canvas, reinforcedMessage, - worldProcessor, worldCell, worldMessage, + worldProcessor, worldCell, worldMessage, worldSwitch, //campaign launchPad, interplanetaryAccelerator @@ -5944,6 +5944,13 @@ public class Blocks{ privileged = true; }}; + worldSwitch = new SwitchBlock("world-switch"){{ + requirements(Category.logic, BuildVisibility.editorOnly, with()); + + targetable = false; + privileged = true; + }}; + //endregion } } diff --git a/core/src/mindustry/world/blocks/logic/SwitchBlock.java b/core/src/mindustry/world/blocks/logic/SwitchBlock.java index 8ed7723abf..c3e579e456 100644 --- a/core/src/mindustry/world/blocks/logic/SwitchBlock.java +++ b/core/src/mindustry/world/blocks/logic/SwitchBlock.java @@ -8,6 +8,8 @@ import mindustry.gen.*; import mindustry.world.*; import mindustry.world.meta.*; +import static mindustry.Vars.state; + public class SwitchBlock extends Block{ public Sound clickSound = Sounds.click; @@ -25,7 +27,26 @@ public class SwitchBlock extends Block{ config(Boolean.class, (SwitchBuild entity, Boolean b) -> entity.enabled = b); } + public boolean accessible(){ + return !privileged || state.rules.editor; + } + + @Override + public boolean canBreak(Tile tile){ + return accessible(); + } + public class SwitchBuild extends Building{ + @Override + public void damage(float damage){ + if(privileged) return; + super.damage(damage); + } + + @Override + public boolean collide(Bullet other){ + return !privileged; + } @Override public boolean configTapped(){ diff --git a/server/src/mindustry/server/ServerControl.java b/server/src/mindustry/server/ServerControl.java index a26507d857..e6ab76fb7a 100644 --- a/server/src/mindustry/server/ServerControl.java +++ b/server/src/mindustry/server/ServerControl.java @@ -910,6 +910,37 @@ public class ServerControl implements ApplicationListener{ } }); + handler.register("loadautosave", "Loads the last auto-save.", arg -> { + if(state.isGame()){ + err("Already hosting. Type 'stop' to stop hosting first."); + return; + } + + Fi newestSave = saveDirectory.findAll(f -> f.name().startsWith("auto_")).min(Fi::lastModified); + + if(newestSave == null){ + err("No auto-saves found! Type `config autosave true` to enable auto-saves."); + return; + } + + if(!SaveIO.isSaveValid(newestSave)){ + err("No (valid) save data found for slot."); + return; + } + + Core.app.post(() -> { + try{ + SaveIO.load(newestSave); + state.rules.sector = null; + info("Save loaded."); + state.set(State.playing); + netServer.openServer(); + }catch(Throwable t){ + err("Failed to load save. Outdated or corrupt file."); + } + }); + }); + handler.register("load", "", "Load a save from a slot.", arg -> { if(state.isGame()){ err("Already hosting. Type 'stop' to stop hosting first."); diff --git a/servers_v7.json b/servers_v7.json index b9b87c8b62..0738a81b52 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -89,7 +89,7 @@ }, { "name": "Chaotic Neutral", - "address": ["c-n.ddns.net:7012", "c-n.ddns.net:7013", "c-n.ddns.net:7014", "c-n.ddns.net:7015", "c-n.ddns.net:7016", "c-n.ddns.net:7017", "37.187.73.180:7021"] + "address": ["c-n.ddns.net:7012", "c-n.ddns.net:7013", "c-n.ddns.net:7014", "c-n.ddns.net:7015", "c-n.ddns.net:7016", "c-n.ddns.net:7017", "c-n.ddns.net:7003", "37.187.73.180:7021"] }, { "name": "io", @@ -121,7 +121,7 @@ }, { "name": "Fish", - "address": ["162.248.101.95", "162.248.100.98", "162.248.100.133", "162.248.102.204"] + "address": ["162.248.101.95", "162.248.100.98", "162.248.100.133", "162.248.102.204", "c-n.ddns.net:7003"] }, { "name": "The Devil", @@ -210,7 +210,7 @@ }, { "name": "Cyandustry", - "address": ["91.218.66.162:8000","91.218.66.162:7000", "91.218.66.162:7500", "91.218.66.162:7600"] + "address": ["136.243.14.186:7000","136.243.14.186:7001", "136.243.14.186:7002", "136.243.14.186:7003", "136.243.14.186:7004", "136.243.14.186:7005", "136.243.14.186:7006"] }, { "name": "Four Family", @@ -255,5 +255,9 @@ { "name": "MineCore", "address": ["194.247.42.11:27792"] + }, + { + "name": "Atomic", + "address": ["129.146.33.189:25709", "atomic-lab.ddns.net:30315"] } ]