Better net error messages, bugfixes, new command handler

This commit is contained in:
Anuken 2018-02-23 21:42:05 -05:00
parent de340255fe
commit 9985a19e6a
9 changed files with 89 additions and 84 deletions

View File

@ -25,7 +25,7 @@ allprojects {
appName = 'Mindustry'
gdxVersion = '1.9.8'
aiVersion = '1.8.1'
uCoreVersion = 'f484468'
uCoreVersion = '1b29d6c'
getVersionString = {
String buildVersion = getBuildVersion()

View File

@ -18,7 +18,7 @@ text.public = Öffentlich
text.players = {0} Spieler online
text.players.single = {0} Spieler online
text.server.mismatch = Paketfehler: Mögliche Client / Server-Version stimmt nicht überein. Stell sicher, dass du und der Host die neueste Version von Mindustry haben!
text.server.closing = [accent] Server wird geschlossen...
.server.closing = [accent] Server wird geschlossen...
text.server.kicked.kick = Du wurdest vom Server gekickt!
text.server.kicked.invalidPassword = Falsches Passwort.
text.server.connected = {0} ist beigetreten
@ -94,18 +94,18 @@ text.editor.badsize = [orange]Ungültige Bildabmessungen! [] Gültige Kartenabme
text.editor.errorimageload = Fehler beim Laden des Bildes: [orange] {0}
text.editor.errorimagesave = Fehler beim Speichern des Bildes: [orange] {0}
text.editor.generate = Generieren
text.editor.resize = Größe anpassen
text.editor.loadmap = Karte laden
text.editor.savemap = Karte speichern
text.editor.loadimage = Bild laden
text.editor.saveimage = Bild speichern
text.editor.resize = Grösse\nanpassen
text.editor.loadmap = Karte\nladen
text.editor.savemap = Karte\nspeichern
text.editor.loadimage = Bild\nladen
text.editor.saveimage = Bild\nspeichern
text.editor.unsaved = [crimson] Du hast Änderungen nicht gespeichert [] Möchtest du wirklich aufhören?
text.editor.brushsize = Pinselgröße: {0}
text.editor.brushsize = Pinselgrösse: {0}
text.editor.noplayerspawn = Diese Karte hat keinen Spielerspawnpunkt!
text.editor.manyplayerspawns = Maps können nicht mehr als einen Spawnpunkt des Spielers haben!
text.editor.manyenemyspawns = Kann nicht mehr als {0} feindliche Spawnpunkte haben!
text.editor.resizemap = Größe der Karte ändern
text.editor.resizebig = [crimson] Warnung! [] Karten, die größer als 256 Einheiten sind, können ruckeln und instabil sein.
text.editor.resizemap = Grösse der Karte ändern
text.editor.resizebig = [crimson] Warnung! [] Karten, die grösser als 256 Einheiten sind, können ruckeln und instabil sein.
text.editor.mapname = Map Name
text.editor.overwrite = [accent] Warnung! Dies überschreibt eine vorhandene Map.
text.editor.failoverwrite = [crimson] Die Standardkarte kann nicht überschrieben werden!
@ -155,7 +155,7 @@ text.blocks.powerdraindamage = Energieabnahme / Schaden
text.blocks.shieldradius = Schildradius
text.blocks.itemspeedsecond = Gegenstands Geschwindigkeit / Sekunde
text.blocks.range = Reichweite
text.blocks.size = Größe
text.blocks.size = Grösse
text.blocks.powerliquid = Energie / Flüssigkeit
text.blocks.maxliquidsecond = Max Flüssigkeit / Sekunde
text.blocks.liquidcapacity = Flüssigkeitskapazität
@ -229,9 +229,9 @@ map.tundra.name = Kältesteppe
map.spiral.name = Spirale
map.tutorial.name = Tutorial
tutorial.intro.text = [gelb] Willkommen zum Tutorial [] Um zu beginnen, drücke 'weiter'.
tutorial.moveDesktop.text = Verwende zum Verschieben die Tasten [orange] [[WASD] []. Halte [orange] Shift [] gedrückt, um zu erhöhen. Halte [orange] CTRL/STRG [] gedrückt, während du das [orange] Scrollrad [] zum Vergrößern oder Verkleinern verwendest.
tutorial.shoot.text = Ziele mit der Maus, halte die [orange] linke Maustaste [] gedrückt, um zu schießen. Versuche es mit dem [gelben] Ziel [].
tutorial.moveAndroid.text = Um die Ansicht zu verschieben, ziehe einen Finger über den Bildschirm. Drücke und ziehe, um zu vergrößern oder zu verkleinern.
tutorial.moveDesktop.text = Verwende zum Verschieben die Tasten [orange] [[WASD] []. Halte [orange] Shift [] gedrückt, um zu erhöhen. Halte [orange] CTRL/STRG [] gedrückt, während du das [orange] Scrollrad [] zum Vergrössern oder Verkleinern verwendest.
tutorial.shoot.text = Ziele mit der Maus, halte die [orange] linke Maustaste [] gedrückt, um zu schiessen. Versuche es mit dem [gelben] Ziel [].
tutorial.moveAndroid.text = Um die Ansicht zu verschieben, ziehe einen Finger über den Bildschirm. Drücke und ziehe, um zu vergrössern oder zu verkleinern.
tutorial.placeSelect.text = Versuche, ein [gelbes] Förderband [] aus dem Blockmenü unten rechts auszuwählen.
tutorial.placeConveyorDesktop.text = Verwende das [orange] [[scrollwheel] [], um das Förderband nach vorne zu bewegen [orange] vorwärts [], und platziere es dann an der [gelben] markierten Stelle [] mit [orange] [[linke Maustaste] [].
tutorial.placeConveyorAndroid.text = Verwende die [orange] [[rotieren-Taste] [], um das Förderband nach vorne [orange] zu drehen [], ziehe es mit einem Finger in Position und platziere es dann an der [gelben] markierten Stelle [] mit der [Orange] [[Häkchen][].
@ -245,19 +245,19 @@ tutorial.drillInfo.text = Verschiedene Erze benötigen unterschiedliche Bohrer.
tutorial.drillPlaced2.text = Wenn du Gegenstände in den Kern verschiebst, steckst du sie in dein [gelbes] Inventar [] oben links. Das Platzieren von Blöcken verwendet Gegenstände aus deinem Inventar.
tutorial.moreDrills.text = Du kannst so viele Bohrer und Förderer miteinander verbinden wie du lust hast.
tutorial.deleteBlock.text = Du kannst Blöcke löschen, indem du mit der [orange] rechte Maustaste [] auf dem Block klickst, den du löschen möchtest. Versuche, dieses Förderband zu löschen.
tutorial.deleteBlockAndroid.text = Du kannst Blöcke löschen, indem du [orange] das Fadenkreuz [] im [orange] Pausenmodusmenü [] links unten auswählst und auf einen Block tippst. Versuche, dieses Fließband zu löschen.
tutorial.deleteBlockAndroid.text = Du kannst Blöcke löschen, indem du [orange] das Fadenkreuz [] im [orange] Pausenmodusmenü [] links unten auswählst und auf einen Block tippst. Versuche, dieses Fliessband zu löschen.
tutorial.placeTurret.text = Wähle nun einen [gelben] Turm [] an der [gelben] markierten Stelle [] und platziere ihn.
tutorial.placedTurretAmmo.text = Dieser Turm nimmt nun [gelbe] Munition [] vom Förderband an. Du kannst sehen, wie viel Munition es hat, indem du darüber schweben und den [grünen] grünen Balken [] prüfen.
tutorial.turretExplanation.text = Geschütze schießen automatisch auf den nächsten Feind in Reichweite, solange sie genug Munition haben.
tutorial.turretExplanation.text = Geschütze schiessen automatisch auf den nächsten Feind in Reichweite, solange sie genug Munition haben.
tutorial.waves.text = Jede [yellow] 60 [] Sekunden wird eine Welle von [coral] Feinden [] an einem bestimmten Orten erscheinen und versuchen, den Kern zu zerstören.
tutorial.coreDestruction.text = Dein Ziel ist es, den Kern [yellow] zu verteidigen. Wenn der Kern zerstört wird, verlierst du [coral] das Spiel [].
tutorial.pausingDesktop.text = Wenn du jemals eine Pause machen möchtest, drücke die [orange] Pause-Taste [] oben links oder [orange]space[], um das Spiel anzuhalten. Du kannst auch Blöcke immer noch auswählen und platzieren, während du das Spiel pausiert ist, aber Sie können sich nicht bewegen oder schießen.
tutorial.pausingDesktop.text = Wenn du jemals eine Pause machen möchtest, drücke die [orange] Pause-Taste [] oben links oder [orange]space[], um das Spiel anzuhalten. Du kannst auch Blöcke immer noch auswählen und platzieren, während du das Spiel pausiert ist, aber Sie können sich nicht bewegen oder schiessen.
tutorial.pausingAndroid.text = Wenn du jemals eine Pause machen willst, drück einfach die [orange] Pause-Taste [] oben links, um das Spiel anzuhalten. Sie können immer noch Sachen auswählen und Blöcke während der Pause platzieren.
tutorial.purchaseWeapons.text = Du kannst neue [yellow] Waffen [] für deinen Mech kaufen, indem du das Verbesserungs-Menü unten links öffnest.
tutorial.switchWeapons.text = Schalte Waffen, indem du entweder auf das Symbol unten links klickst oder Nummern verwendest [orange] [[1-9] [].
tutorial.spawnWave.text = Hier kommt die erste Welle. Zerstöre sie.
tutorial.pumpDesc.text = In späteren Wellen müsst du möglicherweise [yellow] Pumpen [] verwenden, um Flüssigkeiten für Generatoren oder Extraktoren zu verteilen.
tutorial.pumpPlace.text = Pumpen arbeiten ähnlich wie Bohrer, außer dass sie anstelle von Gegenständen Flüssigkeiten produzieren. Versuch mal, eine Pumpe auf das [yellow] gekennzeichnete Öl [] zu setzen.
tutorial.pumpPlace.text = Pumpen arbeiten ähnlich wie Bohrer, ausser dass sie anstelle von Gegenständen Flüssigkeiten produzieren. Versuch mal, eine Pumpe auf das [yellow] gekennzeichnete Öl [] zu setzen.
tutorial.conduitUse.text = Stellen Sie nun eine [orange] Leitungsrohr [] von der Pumpe weg.
tutorial.conduitUse2.text = Und noch ein paar mehr ...
tutorial.conduitUse3.text = Und noch ein paar mehr ...
@ -275,7 +275,7 @@ keybind.move_x.name = bewege_x
keybind.move_y.name = bewege_y
keybind.select.name = wählen
keybind.break.name = Unterbrechung
keybind.shoot.name = Schieß
keybind.shoot.name = Schiess
keybind.zoom_hold.name = zoomen_halten
keybind.zoom.name = zoomen
keybind.menu.name = Menü
@ -295,17 +295,17 @@ mode.freebuild.name = Freier Bau
upgrade.standard.name = Standard
upgrade.standard.description = Der Standardmech.
upgrade.blaster.name = Blaster
upgrade.blaster.description = Schießt eine langsame, schwache Kugel.
upgrade.blaster.description = Schiesst eine langsame, schwache Kugel.
upgrade.triblaster.name = Dreifach-Blaster
upgrade.triblaster.description = Schießt 3 Kugeln in einer Ausbreitung.
upgrade.triblaster.description = Schiesst 3 Kugeln in einer Ausbreitung.
upgrade.clustergun.name = Klumpen-Waffe
upgrade.clustergun.description = Schießt eine ungenaue Verbreitung von explosiven Granaten.
upgrade.clustergun.description = Schiesst eine ungenaue Verbreitung von explosiven Granaten.
upgrade.beam.name = Strahlkanone
upgrade.beam.description = Schießt einen weitreichenden durchdringenden Laserstrahl.
upgrade.beam.description = Schiesst einen weitreichenden durchdringenden Laserstrahl.
upgrade.vulcan.name = Vulkan
upgrade.vulcan.description = Schießt eine Flut von schnellen Kugeln.
upgrade.vulcan.description = Schiesst eine Flut von schnellen Kugeln.
upgrade.shockgun.name = Schock-Waffe
upgrade.shockgun.description = Erschießt eine verheerende Explosion von geladenen Granatsplittern.
upgrade.shockgun.description = Erschiesst eine verheerende Explosion von geladenen Granatsplittern.
item.stone.name = Stein
item.iron.name = Eisen
item.coal.name = Kohle
@ -358,12 +358,12 @@ block.titaniumwall.fulldescription = Eine starke Abwehrblockade. Bietet Schutz v
block.duriumwall.name = Diriumwand
block.duriumwall.fulldescription = Eine sehr starke Abwehrblockade. Bietet guten Schutz vor Feinden.
block.compositewall.name = Verbundende Wand
block.steelwall-large.name = große Stahlwand
block.steelwall-large.fulldescription = Ein Standard-Verteidigungsblock. Mehrere Blöcke groß.
block.titaniumwall-large.name = große Titanwand
block.titaniumwall-large.fulldescription = Eine starke Abwehrblockade. Mehrere Blöcke groß.
block.duriumwall-large.name = große Diriumwand
block.duriumwall-large.fulldescription = Eine sehr starke Abwehrblockade. Mehrere Blöcke groß.
block.steelwall-large.name = grosse Stahlwand
block.steelwall-large.fulldescription = Ein Standard-Verteidigungsblock. Mehrere Blöcke gross.
block.titaniumwall-large.name = grosse Titanwand
block.titaniumwall-large.fulldescription = Eine starke Abwehrblockade. Mehrere Blöcke gross.
block.duriumwall-large.name = grosse Diriumwand
block.duriumwall-large.fulldescription = Eine sehr starke Abwehrblockade. Mehrere Blöcke gross.
block.titaniumshieldwall.name = geschützte Wand
block.titaniumshieldwall.fulldescription = Ein starker Abwehrblock mit einem extra eingebauten Schild. Benötigt Energie. Verwendet Energie, um feindliche Kugeln zu absorbieren. Es wird empfohlen, Verstärker zu verwenden, um diesem Block Energie zuzuführen.
block.repairturret.name = Reparaturgeschütz
@ -374,8 +374,8 @@ block.shieldgenerator.name = Schildgenerator
block.shieldgenerator.fulldescription = Ein fortgeschrittener Verteidigungsblock. Schützt alle Blöcke in einem Radius vor Angriffen. Bei keinem Betrieb langsamer Strom verbrauch, verliert bei Kugelkontakt jedoch schnell Energie.
block.door.name = Tür
block.door.fulldescription = Ein Block, der durch Antippen geöffnet und geschlossen werden kann.
block.door-large.name = große Tür
block.door-large.fulldescription = Ein Block der mehrere Felder groß ist und der durch Antippen geöffnet und geschlossen werden kann.
block.door-large.name = grosse Tür
block.door-large.fulldescription = Ein Block der mehrere Felder gross ist und der durch Antippen geöffnet und geschlossen werden kann.
block.conduit.name = Leitungsrohr
block.conduit.fulldescription = Grundlegender Flüssigkeitstransportblock. Funktioniert wie ein Förderband, aber mit Flüssigkeiten. Am besten mit Pumpen oder anderen Leitungen verwenden. Kann als Brücke für Gegner und Spieler verwendet werden.
block.pulseconduit.name = Pulsleitungsrohr
@ -393,7 +393,7 @@ block.router.fulldescription = Akzeptiert Objekte aus einer Richtung und gibt si
block.junction.name = Kreuzung
block.junction.fulldescription = Fungiert als Brücke für zwei kreuzende Förderbänder. Nützlich in Situationen mit zwei verschiedenen Förderbänder, die unterschiedliche Materialien zu verschiedenen Orten transportieren.
block.conveyortunnel.name = Förderbandtunnel
block.conveyortunnel.fulldescription = Transportiert Artikel unter Blöcken. Verwendung für einen Tunnel, der in den zu untertunnelnden Block führt, und einen auf der anderen Seite. Stellen Sie sicher, dass beide Tunnel in entgegengesetzte Richtungen weisen, das heißt das die Tunnel voneinander weggucken.
block.conveyortunnel.fulldescription = Transportiert Artikel unter Blöcken. Verwendung für einen Tunnel, der in den zu untertunnelnden Block führt, und einen auf der anderen Seite. Stellen Sie sicher, dass beide Tunnel in entgegengesetzte Richtungen weisen, das heisst das die Tunnel voneinander weggucken.
block.liquidjunction.name = flüssigkeite Kreuzung
block.liquidjunction.fulldescription = Funktioniert als Brücke für zwei kreuzende Leitungsrohre. Nützlich in Situationen mit zwei verschiedenen Leitungen, die unterschiedliche Flüssigkeiten zu verschiedenen Orten transportieren.
block.liquiditemjunction.name = Flüssigkeit-Gegenstand-Kreuzung
@ -420,13 +420,13 @@ block.smelter.fulldescription = Der essentielle Bastelblock. Wenn 1x Eisen und 1
block.crucible.name = Tiegel
block.crucible.fulldescription = Ein fortgeschrittener Handwerksblock. Braucht Kohle um zu funktionieren. Wenn 1x Titan und 1x Stahl eingegeben wird, wird 1x Dirium ausgegeben.
block.coalpurifier.name = Kohle-Extraktor
block.coalpurifier.fulldescription = Ein einfacher Extraktorblock. Gibt Kohle aus, wenn der Block mit großen Mengen Wasser und Stein gefüllt wird.
block.coalpurifier.fulldescription = Ein einfacher Extraktorblock. Gibt Kohle aus, wenn der Block mit grossen Mengen Wasser und Stein gefüllt wird.
block.titaniumpurifier.name = Titan-Extraktor
block.titaniumpurifier.fulldescription = Ein Standard-Extraktorblock. Gibt Titan aus wenn er mit großen Mengen Wasser und Eisen gefüllt wird.
block.titaniumpurifier.fulldescription = Ein Standard-Extraktorblock. Gibt Titan aus wenn er mit grossen Mengen Wasser und Eisen gefüllt wird.
block.oilrefinery.name = Ölraffinerie
block.oilrefinery.fulldescription = Veredelt große Mengen Öl zu Kohle. Nützlich für die Betankung von Blöcken die Kohle benutzen wie z.b. Waffentürme, wenn Kohleadern knapp sind.
block.oilrefinery.fulldescription = Veredelt grosse Mengen Öl zu Kohle. Nützlich für die Betankung von Blöcken die Kohle benutzen wie z.b. Waffentürme, wenn Kohleadern knapp sind.
block.stoneformer.name = Steinformer
block.stoneformer.fulldescription = Verfestigt flüssige Lava zu Stein. Nützlich für die Herstellung von großen Mengen von Stein für Kohle-Extraktor.
block.stoneformer.fulldescription = Verfestigt flüssige Lava zu Stein. Nützlich für die Herstellung von grossen Mengen von Stein für Kohle-Extraktor.
block.lavasmelter.name = Lava-Schmelzer
block.lavasmelter.fulldescription = Verwendet Lava, um Eisen zu Stahl schmelzen. Eine Alternative zum Schmelzer. Nützlich in Situationen, in denen Kohle knapp ist.
block.stonedrill.name = Steinbohrer
@ -450,21 +450,21 @@ block.combustiongenerator.fulldescription = Erzeugt Energie aus Öl. Gibt Energi
block.rtgenerator.name = RTG-Generator
block.rtgenerator.fulldescription = Erzeugt geringe Mengen an Energie aus dem radioaktiven Zerfall von Uran. Gibt Energie als Laser an seine 4 Seiten aus.
block.nuclearreactor.name = Kernreaktor
block.nuclearreactor.fulldescription = Eine erweiterte Version des RTG-Generators und der ultimative Energie Generator. Erzeugt Strom aus Uran. Erfordert konstante Wasserkühlung. Sehr heiß; explodiert heftig, wenn zu wenig Kühlmittel zugeführt wird.
block.nuclearreactor.fulldescription = Eine erweiterte Version des RTG-Generators und der ultimative Energie Generator. Erzeugt Strom aus Uran. Erfordert konstante Wasserkühlung. Sehr heiss; explodiert heftig, wenn zu wenig Kühlmittel zugeführt wird.
block.turret.name = Geschütz
block.turret.fulldescription = Ein einfacher, billiger Turm. Verwendet Stein für Munition. Hat etwas mehr Reichweite als das Doppelgeschütz.
block.doubleturret.name = Doppelgeschütz
block.doubleturret.fulldescription = Eine etwas stärkere Version des Geschützes. Verwendet Stein für Munition. Hat deutlich mehr Schaden, hat aber eine geringere Reichweite. Schießt zwei Kugeln.
block.doubleturret.fulldescription = Eine etwas stärkere Version des Geschützes. Verwendet Stein für Munition. Hat deutlich mehr Schaden, hat aber eine geringere Reichweite. Schiesst zwei Kugeln.
block.machineturret.name = Gatling Geschütz
block.machineturret.fulldescription = Ein Standard-Allround-Turm. Verwendet Eisen für Munition. Hat eine schnelle Feuerrate mit gutem Schaden.
block.shotgunturret.name = Splittergeschütz
block.shotgunturret.fulldescription = Ein Standard-Turm. Verwendet Eisen für Munition. Schießt 7 Kugeln auf einmal. Geringere Reichweite, aber höhere Schadensleistung als das Gatling Geschütz
block.shotgunturret.fulldescription = Ein Standard-Turm. Verwendet Eisen für Munition. Schiesst 7 Kugeln auf einmal. Geringere Reichweite, aber höhere Schadensleistung als das Gatling Geschütz
block.flameturret.name = Flammenwerfer
block.flameturret.fulldescription = Fortschrittlicher Nahbereichswaffe. Verwendet Kohle für Munition. Hat eine sehr geringe Reichweite, aber sehr hohen Schaden. Gut für Nahkampf. Empfohlen für den Einsatz hinter Mauern.
block.sniperturret.name = Schienenkanone
block.sniperturret.fulldescription = Fortschrittliches Reichweitengeschütz. Verwendet Stahl für Munition. Sehr hoher Schaden, aber niedrige Feuerrate. Teuer zu verwenden, kann aber aufgrund seiner Reichweite weit entfernt von den feindlichen Linien platziert werden.
block.mortarturret.name = Flakgeschütz
block.mortarturret.fulldescription = Fortschrittlicher Flächen-Schaden Turm. Verwendet Kohle für Munition. Sehr langsame Feuerrate und Geschosse, aber sehr hoher Einzelziel- und Flächenschaden. Nützlich gegen große Mengen von Feinden.
block.mortarturret.fulldescription = Fortschrittlicher Flächen-Schaden Turm. Verwendet Kohle für Munition. Sehr langsame Feuerrate und Geschosse, aber sehr hoher Einzelziel- und Flächenschaden. Nützlich gegen grosse Mengen von Feinden.
block.laserturret.name = Laserturm
block.laserturret.fulldescription = Fortschrittlicher Einzelziel-Turm. Verwendet Strom. Guter Allround-Revolver für mittlere Reichweiten. Nur Einzelziel. Verfehlt nie.
block.waveturret.name = Teslakanone
@ -472,8 +472,8 @@ block.waveturret.fulldescription = Erweiterter Mehrfach-Ziele-Turm. Verwendet St
block.plasmaturret.name = Plasmageschütz
block.plasmaturret.fulldescription = Hochentwickelte Version des Flammenwerfers. Verwendet Kohle als Munition. Sehr hoher Schaden, niedriger bis mittlerer Reichweite.
block.chainturret.name = Kettengeschütz
block.chainturret.fulldescription = Die ultimative Schnellfeuer Waffe. Verwendet Uran als Munition. Schießt große Kugeln mit hoher Feuerrate. Mittlere Reichweite. Mehrere Felder groß. Hält extrem viel aus.
block.chainturret.fulldescription = Die ultimative Schnellfeuer Waffe. Verwendet Uran als Munition. Schiesst grosse Kugeln mit hoher Feuerrate. Mittlere Reichweite. Mehrere Felder gross. Hält extrem viel aus.
block.titancannon.name = Titan Kanone
block.titancannon.fulldescription = Die ultimative Langstrecken Kanone. Verwendet Uran als Munition. Schießt große Flächen-Schadenden-Granaten mit einer mittleren Feuerrate ab. Lange Reichweite. Ist mehrere Felder groß. Hält extrem viel aus.
block.titancannon.fulldescription = Die ultimative Langstrecken Kanone. Verwendet Uran als Munition. Schiesst grosse Flächen-Schadenden-Granaten mit einer mittleren Feuerrate ab. Lange Reichweite. Ist mehrere Felder gross. Hält extrem viel aus.
block.playerspawn.name = Spielerspawn
block.enemyspawn.name = Gegnerspawn

View File

@ -1,7 +1,7 @@
#Autogenerated file. Do not modify.
#Fri Feb 23 15:06:51 EST 2018
#Fri Feb 23 21:37:45 EST 2018
version=release
androidBuildCode=267
androidBuildCode=275
name=Mindustry
code=3.3
build=28
build=custom build

View File

@ -329,12 +329,6 @@ public class NetClient extends Module {
}
}
//TODO remove.
public void test(){
gotData = false;
connecting = true;
}
public boolean hasData(){
return gotData;
}

View File

@ -17,6 +17,7 @@ import io.anuke.ucore.core.Graphics;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Strings;
@ -82,6 +83,12 @@ public class EnemyType {
Graphics.flush();
if(isCalculating(enemy)){
Draw.color(Color.SKY);
Lines.polySeg(20, 0, 5, enemy.x, enemy.y, 11f, Timers.time() * 2f + enemy.id*52153f);
Draw.color();
}
if(showPaths){
Draw.tscl(0.25f);
Draw.text((int)enemy.idletime + " " + enemy.node + " " + enemy.id + "\n" + Strings.toFixed(enemy.totalMove.x, 2) + ", "
@ -157,6 +164,8 @@ public class EnemyType {
Tile core = world.getCore();
if(core == null) return;
if(enemy.idletime > maxIdleLife && enemy.node > 0){
enemy.onDeath();
return;
@ -190,7 +199,7 @@ public class EnemyType {
}else if(dst < avoidRange){
calc.set((enemy.x - other.x), (enemy.y - other.y)).setLength(avoidSpeed);
shift.add(calc.scl(1.1f));
}else if(dst < attractRange && !nearCore){
}else if(dst < attractRange && !nearCore && !isCalculating(enemy)){
calc.set((enemy.x - other.x), (enemy.y - other.y)).setLength(avoidSpeed);
shift.add(calc.scl(-1));
}
@ -268,6 +277,10 @@ public class EnemyType {
}
}
public boolean isCalculating(Enemy enemy){
return enemy.node < 0 && !Net.client();
}
public static EnemyType getByID(byte id){
return types.get(id);
}

View File

@ -210,7 +210,7 @@ public class Net{
}
/**Pings a host in an new thread. If an error occured, failed() should be called with the exception. */
public static void pingHost(String address, int port, Consumer<Host> valid, Consumer<IOException> failed){
public static void pingHost(String address, int port, Consumer<Host> valid, Consumer<Exception> failed){
clientProvider.pingHost(address, port, valid, failed);
}
@ -285,7 +285,7 @@ public class Net{
* Callback should be run on libGDX main thread.*/
void discover(Consumer<Array<Host>> callback);
/**Ping a host. If an error occured, failed() should be called with the exception. */
void pingHost(String address, int port, Consumer<Host> valid, Consumer<IOException> failed);
void pingHost(String address, int port, Consumer<Host> valid, Consumer<Exception> failed);
/**Close all connections.*/
void dispose();
}

View File

@ -16,10 +16,10 @@ import static io.anuke.mindustry.Vars.*;
public class MenuFragment implements Fragment{
public void build(){
if(!android){
//menu table
new table(){{
new table(){{
visible(() -> state.is(State.menu));
if(!android){
new table(){{
PressGroup group = new PressGroup();
@ -53,37 +53,32 @@ public class MenuFragment implements Fragment{
}
get().margin(16);
}}.end();
visible(() -> state.is(State.menu));
}}.end();
}else{
new table(){{
new table(){{
}else {
new table() {{
defaults().size(120f).pad(5);
float isize = 14f*4;
float isize = 14f * 4;
new imagebutton("icon-play-2", isize, ui.levels::show).text("$text.play").padTop(4f);
new imagebutton("icon-tutorial", isize, () -> control.playMap(world.maps().getMap("tutorial"))).text("$text.tutorial").padTop(4f);
new imagebutton("icon-load", isize, ui.load::show).text("$text.load").padTop(4f);
new imagebutton("icon-add", isize, ui.join::show).text("$text.joingame").padTop(4f);
row();
new imagebutton("icon-editor", isize, ui.editor::show).text("$text.editor").padTop(4f);
new imagebutton("icon-tools", isize, ui.settings::show).text("$text.settings").padTop(4f);
new imagebutton("icon-info", isize, ui.about::show).text("$text.about.button").padTop(4f);
new imagebutton("icon-donate", isize, Platform.instance::openDonations).text("$text.donate").padTop(4f);
visible(() -> state.is(State.menu));
}}.end();
}}.end();
}
}
}}.end();
//extra icons in top right
new table(){{

View File

@ -13,6 +13,7 @@ import io.anuke.mindustry.net.Net.SendMode;
import io.anuke.mindustry.net.Packets.Connect;
import io.anuke.mindustry.net.Packets.Disconnect;
import io.anuke.ucore.function.Consumer;
import io.anuke.ucore.util.Strings;
import java.io.IOException;
import java.net.DatagramPacket;
@ -140,7 +141,7 @@ public class KryoClient implements ClientProvider{
}
@Override
public void pingHost(String address, int port, Consumer<Host> valid, Consumer<IOException> invalid){
public void pingHost(String address, int port, Consumer<Host> valid, Consumer<Exception> invalid){
runAsync(() -> {
try {
DatagramSocket socket = new DatagramSocket();
@ -162,7 +163,7 @@ public class KryoClient implements ClientProvider{
} else {
Gdx.app.postRunnable(() -> invalid.accept(new IOException("Outdated server.")));
}
} catch (IOException e) {
} catch (Exception e) {
Gdx.app.postRunnable(() -> invalid.accept(e));
}
});
@ -209,7 +210,7 @@ public class KryoClient implements ClientProvider{
if(e instanceof KryoNetException){
Gdx.app.postRunnable(() -> Net.showError("$text.server.mismatch"));
}else{
//TODO better exception handling.
Net.showError(Strings.parseException(e, true));
disconnect();
}
}

View File

@ -99,7 +99,7 @@ public class ServerControl extends Module {
handler.register("help", "Displays this command list.", arg -> {
info("Commands:");
for(Command command : handler.getCommandList()){
print(" &y" + command.text + (command.params.isEmpty() ? "" : " ") + command.params + " - &lm" + command.description);
print(" &y" + command.text + (command.paramText.isEmpty() ? "" : " ") + command.paramText + " - &lm" + command.description);
}
});
@ -184,7 +184,7 @@ public class ServerControl extends Module {
}
});
handler.register("say", "<message>", "Send a message to all players.", arg -> {
handler.register("say", "<message...>", "Send a message to all players.", arg -> {
if(!state.is(State.playing)) {
err("Not hosting. Host a game first.");
return;
@ -192,7 +192,7 @@ public class ServerControl extends Module {
netCommon.sendMessage("[GRAY][[Server]:[] " + arg[0]);
info("&lyServer: &lb{0}", arg[0]);
}).mergeArgs();
});
handler.register("difficulty", "<difficulty>", "Set game difficulty.", arg -> {
try{
@ -355,8 +355,10 @@ public class ServerControl extends Module {
if (response.type == ResponseType.unknownCommand) {
err("Invalid command. Type 'help' for help.");
} else if (response.type == ResponseType.invalidArguments) {
err("Invalid command arguments. Usage: " + response.command.text + " " + response.command.params);
}else if (response.type == ResponseType.fewArguments) {
err("Too few command arguments. Usage: " + response.command.text + " " + response.command.paramText);
}else if (response.type == ResponseType.manyArguments) {
err("Too many command arguments. Usage: " + response.command.text + " " + response.command.paramText);
}
});
}