From 0ddee379ca4465a2dda11380e815fa0886632350 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 21 Aug 2018 10:56:06 -0400 Subject: [PATCH 1/9] Added mode-specific respawn time --- core/src/io/anuke/mindustry/Vars.java | 2 -- core/src/io/anuke/mindustry/game/GameMode.java | 2 ++ core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index df44910612..bc7386e2a5 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -28,8 +28,6 @@ import io.anuke.ucore.util.Translator; import java.util.Locale; public class Vars{ - //respawn time in frames - public static final float respawnduration = 60 * 4; //time between waves in frames (on normal mode) public static final float wavespace = 60 * 60 * 1.5f; //set ridiculously high for now diff --git a/core/src/io/anuke/mindustry/game/GameMode.java b/core/src/io/anuke/mindustry/game/GameMode.java index 5f7ccac4c7..c45b241587 100644 --- a/core/src/io/anuke/mindustry/game/GameMode.java +++ b/core/src/io/anuke/mindustry/game/GameMode.java @@ -21,10 +21,12 @@ public enum GameMode{ isPvp = true; hidden = true; enemyCoreBuildRadius = 600f; + respawnTime = 60 * 10; }}; public boolean infiniteResources, disableWaveTimer, disableWaves, hidden, autoSpawn, isPvp; public float enemyCoreBuildRadius = 400f; + public float respawnTime = 60 * 4; public String description(){ return Bundles.get("mode." + name() + ".description"); diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java index bcbebc69e3..abbfb90dfe 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java @@ -195,7 +195,7 @@ public class CoreBlock extends StorageBlock{ if(entity.currentUnit != null){ entity.heat = Mathf.lerpDelta(entity.heat, 1f, 0.1f); entity.time += Timers.delta(); - entity.progress += 1f / (entity.currentUnit instanceof Player ? respawnduration : droneRespawnDuration) * Timers.delta(); + entity.progress += 1f / (entity.currentUnit instanceof Player ? state.mode.respawnTime : droneRespawnDuration) * Timers.delta(); //instant build for fast testing. if(debug){ From 9c532047d37eed2e0f3b8c6fc549e2ea805e19b4 Mon Sep 17 00:00:00 2001 From: Prosta4okua <31485341+Prosta4okua@users.noreply.github.com> Date: Tue, 21 Aug 2018 20:27:09 +0300 Subject: [PATCH 2/9] [Complete]Update bundle_uk_UA.properties (#201) * Update bundle_uk_UA.properties * Update bundle_uk_UA.properties * Update bundle_uk_UA.properties --- core/assets/bundles/bundle_uk_UA.properties | 24 +++++++++++---------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index a77949a373..56766d3302 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -375,14 +375,14 @@ content.unit-type.name=Бойові одиниці content.recipe.name=Блоки item.stone.name=Камінь item.stone.description=Загальна сировина. Використовується для розділення та переробки в інші матеріали або плавки в лаву. -item.tungsten.name=Вольфрам -item.tungsten.description=Звичайний, але дуже корисний структурнй матеріал. Використовується в свердлах та термостійких блоках, таких як генератори та плавильні. +item.copper.name=Мідь +item.copper.description=Корисний структурний матеріал. Широко використовується у всіх типах блоків. item.lead.name=Свинець item.lead.description=Базовий стартовий матеріал. Широко використовується в блоках електроніки та транспорту рідини. item.coal.name=Вугілля item.coal.description=Загальне та легкодоступне паливо. -item.carbide.name=Карбід -item.carbide.description=Жорсткий сплав з вольфрамом та карбідом. Використовується в передових транспортних блоках та високорівневих свердлах. +item.dense-alloy.name=Щільний сплав +item.dense-alloy.description=Жорсткий сплав з свинцем та міддю. Використовується в передових транспортних блоках та високорівневих свердлах. item.titanium.name=Титан item.titanium.description=Рідкий суперлегкий метал широко використовується в рідкому транспорті, свердлах та літальних апаратах. item.thorium.name=Торій @@ -430,10 +430,12 @@ block.shrub.name=кущ block.rock.name=кругляк block.blackrock.name=чорний-кругляк block.icerock.name=льодяний-кругляк -block.tungsten-wall.name=Вольфрамова стіна -block.tungsten-wall-large.name=Велика вольфрамова стіна -block.carbide-wall.name=Карбідна стіна -block.carbide-wall-large.name=Велика карбідна стіна +block.copper-wall.name=Мідна стіна +block.copper-wall-large.name=Велика мідна стіна +block.composite-wall.name=Композитна стіна +block.composite-wall-large.name=Велика композитна стіна +block.phase-wall.name=Композитна стінка +block.phase-wall-large.name=Велика фазова стіна block.thorium-wall.name=Торієва стіна block.thorium-wall-large.name=Велика Торієва стіна block.door.name=Двері @@ -474,8 +476,8 @@ block.battery.name=Акумулятор block.battery-large.name=Великий акумулятор block.combustion-generator.name=Генератор горіння block.turbine-generator.name=Турбогенератор -block.tungsten-drill.name=Вольфрамовий дриль -block.carbide-drill.name=Карбідовий дриль +block.mechanical-drill.name=Механічний дриль +block.pneumatic-drill.name=Пневматичний дриль block.laser-drill.name=Лазерний дриль block.water-extractor.name=Екстрактор води block.cultivator.name=Культиватор @@ -525,7 +527,7 @@ block.liquid-tank.name=Рідкий резервуар block.liquid-junction.name=Рідкий з'єднання block.bridge-conduit.name=Мостовий водопровід block.rotary-pump.name=Роторний насос -block.nuclear-reactor.name=Ядерний реактор +block.thorium-reactor.name=Торієвий реактор block.command-center.name=Командний центр block.mass-driver.name=Електромагнітна катапульта block.blast-drill.name=Бурова установка From b0103d1ce354a562340af96bbd5645275d59196f Mon Sep 17 00:00:00 2001 From: Prosta4okua <31485341+Prosta4okua@users.noreply.github.com> Date: Tue, 21 Aug 2018 20:27:20 +0300 Subject: [PATCH 3/9] [Complete]Update bundle_ru.properties (#199) * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties --- core/assets/bundles/bundle_ru.properties | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 04e1466047..447fe31bbe 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -375,14 +375,14 @@ content.unit-type.name=Боевые единицы content.recipe.name=Блоки item.stone.name=Камень item.stone.description=Обычное сырьё. Используется для разделения и переработки в другие материалы или плавления в лаву. -item.tungsten.name=Вольфрам -item.tungsten.description=Обычный, но очень полезный строительный материал . Используется в бурах и теплостойких блоках, таких как генераторы и плавильные печи. +item.copper.name=Медь +item.copper.description=Полезный строительный материал. Широко используется во всех типах блоков. item.lead.name=Свинец item.lead.description=Основной начальный материал. Широко используется в блоках электроники и транспортировки жидкости. item.coal.name=Уголь item.coal.description=Распространённое и легкодоступное топливо. -item.carbide.name=Карбид -item.carbide.description=Жёсткий сплав, изготовленный из вольфрама и угля. Используется в передовых транспортных блоках и высокоуровневых бурах. +item.dense-alloy.name=Плотный сплав +item.dense-alloy.description=Жёсткий сплав, изготовленный из свинца и меди. Используется в передовых транспортных блоках и высокоуровневых бурах. item.titanium.name=Титан item.titanium.description=Редкий сверхлёгкий металл широко используется в транспортировке, бурах и самолётах. item.thorium.name=Торий @@ -430,10 +430,12 @@ block.shrub.name=Куст block.rock.name=Булыжник block.blackrock.name=Чёрный булыжник block.icerock.name=Ледяной булыжник -block.tungsten-wall.name=Вольфрамовая стена -block.tungsten-wall-large.name=Большая вольфрамовая стена -block.carbide-wall.name=Карбидная стена -block.carbide-wall-large.name=Большая карбидная стена +block.copper-wall.name=Медная стена +block.copper-wall-large.name=Большая медная стена +block.composite-wall.name=Композитная стена +block.composite-wall-large.name=Большая композитная стена +block.phase-wall.name=Фазовая стена +block.phase-wall-large.name=Большая фазовая стена block.thorium-wall.name=Ториевая стена block.thorium-wall-large.name=Большая ториевая стена block.door.name=Дверь @@ -474,8 +476,8 @@ block.battery.name=Аккумулятор block.battery-large.name=Большой аккумулятор block.combustion-generator.name=Генератор внутреннего сгорания block.turbine-generator.name=Турбинный генератор -block.tungsten-drill.name=Вольфрамовый бур -block.carbide-drill.name=Карбидовый бур +block.mechanical-drill.name=Механический бур +block.pneumatic-drill.name=Пневматический бур block.laser-drill.name=Лазерный бур block.water-extractor.name=Экстрактор воды block.cultivator.name=Культиватор @@ -525,7 +527,7 @@ block.liquid-tank.name=Жидкостный резервуар block.liquid-junction.name=Жидкостный перекрёсток block.bridge-conduit.name=Мостовой трубопровод block.rotary-pump.name=Роторный насос -block.nuclear-reactor.name=Ядерный реактор +block.thorium-reactor.name=Ториевый реактор block.command-center.name=Командный центр block.mass-driver.name=Электромагнитная катапульта block.blast-drill.name=Буровая установка From 3aedc07ad099c8509d327c502cd7c60d0b74b50d Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 21 Aug 2018 16:37:57 -0400 Subject: [PATCH 4/9] Initial continuous server implementation --- core/src/io/anuke/mindustry/core/Logic.java | 2 - .../io/anuke/mindustry/core/NetClient.java | 59 +++++++++++++------ .../io/anuke/mindustry/core/NetServer.java | 22 +++---- .../mindustry/entities/units/BaseUnit.java | 2 +- .../src/io/anuke/mindustry/net/NetworkIO.java | 2 + core/src/io/anuke/mindustry/ui/ItemImage.java | 4 +- .../world/blocks/storage/CoreBlock.java | 6 -- .../anuke/mindustry/server/ServerControl.java | 41 ++++++++++--- 8 files changed, 89 insertions(+), 49 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index c703bce362..cbc0b61a87 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -66,8 +66,6 @@ public class Logic extends Module{ } } - - Events.fire(PlayEvent.class); } diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index ae883975c0..b3dc579d96 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -80,18 +80,8 @@ public class NetClient extends Module{ player.isAdmin = false; - Net.setClientLoaded(false); - removed.clear(); - timeoutTime = 0f; - connecting = true; - quiet = false; - lastSent = 0; - lastSnapshotBase = null; - currentSnapshot = null; - currentSnapshotID = -1; - lastSnapshotBaseID = -1; + reset(); - ui.chatfrag.clearMessages(); ui.loadfrag.hide(); ui.loadfrag.show("$text.connecting.data"); @@ -102,8 +92,6 @@ public class NetClient extends Module{ Net.disconnect(); }); - Entities.clear(); - ConnectPacket c = new ConnectPacket(); c.name = player.name; c.mobile = mobile; @@ -161,6 +149,29 @@ public class NetClient extends Module{ ui.loadfrag.hide(); } + @Remote(variants = Variant.both) + public static void onInfoMessage(String message){ + threads.runGraphics(() -> ui.showInfo(message)); + } + + @Remote(variants = Variant.both) + public static void onWorldDataBegin(){ + Entities.clear(); + ui.chatfrag.clearMessages(); + Net.setClientLoaded(false); + + threads.runGraphics(() -> { + ui.loadfrag.show("$text.connecting.data"); + + ui.loadfrag.setButton(() -> { + ui.loadfrag.hide(); + netClient.connecting = false; + netClient.quiet = true; + Net.disconnect(); + }); + }); + } + @Remote(variants = Variant.one) public static void onPositionSet(float x, float y){ players[0].x = x; @@ -285,7 +296,6 @@ public class NetClient extends Module{ //go through each entity for(int j = 0; j < amount; j++){ - int position = netClient.byteStream.position(); //save position to check read/write correctness int id = input.readInt(); byte typeID = input.readByte(); @@ -304,11 +314,6 @@ public class NetClient extends Module{ //read the entity entity.read(input, timestamp); - byte readLength = input.readByte(); - //if(netClient.byteStream.position() - position - 1 != readLength){ - // throw new RuntimeException("Error reading entity of type '" + group.getType() + "': Read length mismatch [write=" + readLength + ", read=" + (netClient.byteStream.position() - position - 1) + "]"); - //} - if(add){ entity.add(); netClient.addRemovedEntity(entity.getID()); @@ -352,6 +357,22 @@ public class NetClient extends Module{ Timers.runTask(40f, Platform.instance::updateRPC); } + private void reset(){ + Net.setClientLoaded(false); + removed.clear(); + timeoutTime = 0f; + connecting = true; + quiet = false; + lastSent = 0; + lastSnapshotBase = null; + currentSnapshot = null; + currentSnapshotID = -1; + lastSnapshotBaseID = -1; + + Entities.clear(); + ui.chatfrag.clearMessages(); + } + public void beginConnecting(){ connecting = true; } diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index d792d56d9b..ae8f41b2fb 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -190,15 +190,7 @@ public class NetServer extends Module{ trace.playerid = player.id; - //TODO try DeflaterOutputStream - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - DeflaterOutputStream def = new DeflaterOutputStream(stream); - NetworkIO.writeWorld(player, def); - WorldStream data = new WorldStream(); - data.stream = new ByteArrayInputStream(stream.toByteArray()); - Net.sendStream(id, data); - - Log.info("Packed {0} uncompressed bytes of WORLD data.", stream.size()); + sendWorldData(player, id); Platform.instance.updateRPC(); }); @@ -317,6 +309,17 @@ public class NetServer extends Module{ } } + public void sendWorldData(Player player, int clientID){ + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + DeflaterOutputStream def = new DeflaterOutputStream(stream); + NetworkIO.writeWorld(player, def); + WorldStream data = new WorldStream(); + data.stream = new ByteArrayInputStream(stream.toByteArray()); + Net.sendStream(clientID, data); + + Log.info("Packed {0} compressed bytes of world data.", stream.size()); + } + public static void onDisconnect(Player player){ if(player.con.hasConnected){ Call.sendMessage("[accent]" + player.name + "[accent] has disconnected."); @@ -483,7 +486,6 @@ public class NetServer extends Module{ int length = syncStream.position() - position; //length must always be less than 127 bytes if(length > 127) throw new RuntimeException("Write size for entity of type " + group.getType() + " must not exceed 127!"); - dataStream.writeByte(length); } } } diff --git a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java index 29465610d6..e661ab6590 100644 --- a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java @@ -320,7 +320,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ if(target != null) behavior(); - if(!isWave){ + if(!isWave && !isFlying()){ x = Mathf.clamp(x, 0, world.width() * tilesize); y = Mathf.clamp(y, 0, world.height() * tilesize); } diff --git a/core/src/io/anuke/mindustry/net/NetworkIO.java b/core/src/io/anuke/mindustry/net/NetworkIO.java index 17d4024396..b7de7e5a82 100644 --- a/core/src/io/anuke/mindustry/net/NetworkIO.java +++ b/core/src/io/anuke/mindustry/net/NetworkIO.java @@ -118,6 +118,8 @@ public class NetworkIO{ i += consecutives; } + stream.write(Team.all.length); + //write team data for(Team team : Team.all){ TeamData data = state.teams.get(team); diff --git a/core/src/io/anuke/mindustry/ui/ItemImage.java b/core/src/io/anuke/mindustry/ui/ItemImage.java index 5dab85a67d..2ef09241ad 100644 --- a/core/src/io/anuke/mindustry/ui/ItemImage.java +++ b/core/src/io/anuke/mindustry/ui/ItemImage.java @@ -14,7 +14,7 @@ public class ItemImage extends Stack{ public ItemImage(TextureRegion region, Supplier text){ Table t = new Table().left().bottom(); - t.label(text).color(Color.DARK_GRAY).padBottom(-22).get().setFontScale(Unit.dp.scl(0.5f)); + t.label(text).color(Color.DARK_GRAY).padBottom(-21).get().setFontScale(Unit.dp.scl(0.5f)); t.row(); t.label(text).get().setFontScale(Unit.dp.scl(0.5f)); @@ -25,7 +25,7 @@ public class ItemImage extends Stack{ public ItemImage(ItemStack stack){ Table t = new Table().left().bottom(); - t.add(stack.amount + "").color(Color.DARK_GRAY).padBottom(-22).get().setFontScale(Unit.dp.scl(0.5f)); + t.add(stack.amount + "").color(Color.DARK_GRAY).padBottom(-21).get().setFontScale(Unit.dp.scl(0.5f)); t.row(); t.add(stack.amount + "").get().setFontScale(Unit.dp.scl(0.5f)); diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java index abbfb90dfe..0f818edd42 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java @@ -1,7 +1,6 @@ package io.anuke.mindustry.world.blocks.storage; import com.badlogic.gdx.graphics.g2d.TextureRegion; -import com.badlogic.gdx.math.Rectangle; import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Remote; import io.anuke.mindustry.Vars; @@ -38,12 +37,7 @@ import java.io.IOException; import static io.anuke.mindustry.Vars.*; public class CoreBlock extends StorageBlock{ - private static Rectangle rect = new Rectangle(); - - protected int timerSupply = timers++; - protected float supplyRadius = 50f; - protected float supplyInterval = 5f; protected float droneRespawnDuration = 60 * 6; protected UnitType droneType = UnitTypes.drone; diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index e063d664f9..365a43fde9 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -9,13 +9,16 @@ import io.anuke.mindustry.game.Difficulty; import io.anuke.mindustry.game.EventType.GameOverEvent; import io.anuke.mindustry.game.GameMode; import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.maps.Map; -import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.game.Version; -import io.anuke.mindustry.net.*; +import io.anuke.mindustry.gen.Call; +import io.anuke.mindustry.io.SaveIO; +import io.anuke.mindustry.maps.Map; +import io.anuke.mindustry.net.Administration; import io.anuke.mindustry.net.Administration.PlayerInfo; +import io.anuke.mindustry.net.EditLog; +import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Packets.KickReason; +import io.anuke.mindustry.net.TraceInfo; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.ItemType; import io.anuke.mindustry.ui.fragments.DebugFragment; @@ -87,9 +90,9 @@ public class ServerControl extends Module{ Events.on(GameOverEvent.class, () -> { info("Game over!"); - netServer.kickAll(KickReason.gameover); if(mode != ShuffleMode.off){ + Call.onInfoMessage("Game over!"); if(world.getSector() == null){ if(world.maps().all().size > 0){ Array maps = mode == ShuffleMode.both ? world.maps().all() : @@ -103,9 +106,9 @@ public class ServerControl extends Module{ info("Selected next map to be {0}.", map.name); - logic.reset(); - world.loadMap(map); - state.set(State.playing); + Map fmap = map; + + play(() -> world.loadMap(fmap)); } }else{ if(gameOvers >= 2){ @@ -118,6 +121,7 @@ public class ServerControl extends Module{ info("Re-trying sector map: {0} {1}", Settings.getInt("sector_x"), Settings.getInt("sector_y")); } }else{ + netServer.kickAll(KickReason.gameover); state.set(State.menu); Net.closeServer(); } @@ -845,8 +849,26 @@ public class ServerControl extends Module{ if(world.sectors().get(x, y) == null){ world.sectors().createSector(x, y); } - world.loadSector(world.sectors().get(x, y)); + + world.sectors().get(x, y).completedMissions = 0; + + play(() -> world.loadSector(world.sectors().get(x, y))); + } + + private void play(Runnable run){ + Array players = new Array<>(); + for(Player p : playerGroup.all()){ + players.add(p); + p.setDead(true); + } + logic.reset(); + Call.onWorldDataBegin(); + run.run(); logic.play(); + for(Player p : players){ + p.add(); + netServer.sendWorldData(p, p.con.id); + } } private void host(){ @@ -864,6 +886,7 @@ public class ServerControl extends Module{ if(state.is(State.playing) && world.getSector() != null){ //all assigned missions are complete if(world.getSector().completedMissions >= world.getSector().missions.size){ + Log.info("Mission complete."); world.sectors().completeSector(world.getSector().x, world.getSector().y); world.sectors().save(); gameOvers = 0; From b745d88299e0930b9cf9c11f8a8558e9f1bb1ee0 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 21 Aug 2018 17:23:17 -0400 Subject: [PATCH 5/9] Player State reset / Improved messages / Round end time --- .../io/anuke/mindustry/core/NetClient.java | 2 +- .../io/anuke/mindustry/entities/Player.java | 2 +- .../anuke/mindustry/server/ServerControl.java | 62 ++++++++++++------- 3 files changed, 43 insertions(+), 23 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index b3dc579d96..839e6aab10 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -151,7 +151,7 @@ public class NetClient extends Module{ @Remote(variants = Variant.both) public static void onInfoMessage(String message){ - threads.runGraphics(() -> ui.showInfo(message)); + threads.runGraphics(() -> ui.showText("", message)); } @Remote(variants = Variant.both) diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index 7a276a74dc..7013c4c8b6 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -664,7 +664,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra dead = true; trail.clear(); health = maxHealth(); - mech = (mobile ? Mechs.starterMobile : Mechs.starterDesktop); + mech = (isMobile ? Mechs.starterMobile : Mechs.starterDesktop); placeQueue.clear(); add(); diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index 365a43fde9..5905bf5b6b 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -39,10 +39,12 @@ import static io.anuke.mindustry.Vars.*; import static io.anuke.ucore.util.Log.*; public class ServerControl extends Module{ + private static final int roundExtraTime = 12; + private final CommandHandler handler = new CommandHandler(""); private ShuffleMode mode; - //consecutive sector losses private int gameOvers; + private boolean inExtraRound; public ServerControl(String[] args){ Settings.defaultList( @@ -89,10 +91,10 @@ public class ServerControl extends Module{ } Events.on(GameOverEvent.class, () -> { + if(inExtraRound) return; info("Game over!"); if(mode != ShuffleMode.off){ - Call.onInfoMessage("Game over!"); if(world.getSector() == null){ if(world.maps().all().size > 0){ Array maps = mode == ShuffleMode.both ? world.maps().all() : @@ -104,13 +106,18 @@ public class ServerControl extends Module{ while(map == previous) map = maps.random(); } + Call.onInfoMessage("[SCARLET]Game over![]\nNext selected map:[accent] "+map.name+"[]" + + (map.meta.author() != null ? " by[accent] " + map.meta.author() + "[]" : "") + "."+ + "\nNew game begins in " + roundExtraTime + " seconds."); + info("Selected next map to be {0}.", map.name); Map fmap = map; - play(() -> world.loadMap(fmap)); + play(true, () -> world.loadMap(fmap)); } }else{ + Call.onInfoMessage("Sector has been lost.\nRe-deploying in " + roundExtraTime + " seconds."); if(gameOvers >= 2){ Settings.putInt("sector_y", Settings.getInt("sector_y") < 0 ? Settings.getInt("sector_y") + 1 : Settings.getInt("sector_y") - 1); Settings.save(); @@ -197,7 +204,7 @@ public class ServerControl extends Module{ }else{ Log.info("&ly&fiNo map specified. Loading sector {0}, {1}.", Settings.getInt("sector_x"), Settings.getInt("sector_y")); - playSectorMap(); + playSectorMap(false); } info("Map loaded."); @@ -845,6 +852,10 @@ public class ServerControl extends Module{ } private void playSectorMap(){ + playSectorMap(true); + } + + private void playSectorMap(boolean wait){ int x = Settings.getInt("sector_x"), y = Settings.getInt("sector_y"); if(world.sectors().get(x, y) == null){ world.sectors().createSector(x, y); @@ -852,22 +863,32 @@ public class ServerControl extends Module{ world.sectors().get(x, y).completedMissions = 0; - play(() -> world.loadSector(world.sectors().get(x, y))); + play(wait, () -> world.loadSector(world.sectors().get(x, y))); } - private void play(Runnable run){ - Array players = new Array<>(); - for(Player p : playerGroup.all()){ - players.add(p); - p.setDead(true); - } - logic.reset(); - Call.onWorldDataBegin(); - run.run(); - logic.play(); - for(Player p : players){ - p.add(); - netServer.sendWorldData(p, p.con.id); + private void play(boolean wait, Runnable run){ + inExtraRound = true; + Runnable r = () -> { + Array players = new Array<>(); + for(Player p : playerGroup.all()){ + players.add(p); + p.setDead(true); + } + logic.reset(); + Call.onWorldDataBegin(); + run.run(); + logic.play(); + for(Player p : players){ + p.reset(); + netServer.sendWorldData(p, p.con.id); + } + inExtraRound = false; + }; + + if(wait){ + Timers.runTask(60f * roundExtraTime, r); + }else{ + r.run(); } } @@ -891,11 +912,10 @@ public class ServerControl extends Module{ world.sectors().save(); gameOvers = 0; Settings.putInt("sector_x", world.getSector().x + world.getSector().size); - Settings.save(); - netServer.kickAll(KickReason.sectorComplete); - logic.reset(); + Call.onInfoMessage("[accent]Sector conquered![]\n" + roundExtraTime + " seconds until deployment in next sector."); + playSectorMap(); }else if(world.getSector().currentMission().isComplete()){ //increment completed missions, check next index next frame From 5aa76639d10e207e08a0b68c5b4901b27c9c8a44 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 21 Aug 2018 18:54:11 -0400 Subject: [PATCH 6/9] Changed noise octaves with non-detailed worldgen --- core/src/io/anuke/mindustry/core/Control.java | 2 +- .../io/anuke/mindustry/maps/generation/WorldGenerator.java | 4 ++-- .../src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 6111ed6fc4..f9bcbdd97d 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -352,7 +352,7 @@ public class Control extends Module{ throw new RuntimeException(error); } - if(Inputs.keyTap("console")){ + if(debug && Inputs.keyTap("console")){ console = !console; } diff --git a/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java b/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java index d37668a9f3..69d7abf0c3 100644 --- a/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java +++ b/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java @@ -248,7 +248,7 @@ public class WorldGenerator{ double iceridge = rid.getValue(x+99999, y, 1f / 300f) + sim3.octaveNoise2D(2, 1f, 1f/14f, x, y)/11f; double elevation = elevationOf(x, y, detailed); double temp = vn.noise(x, y, 1f / 300f) * sim3.octaveNoise2D(detailed ? 2 : 1, 1, 1f / 13f, x, y)/13f - + sim3.octaveNoise2D(detailed ? 12 : 6, 0.6, 1f / 920f, x, y); + + sim3.octaveNoise2D(detailed ? 12 : 9, 0.6, 1f / 920f, x, y); int lerpDst = 20; lerpDst *= lerpDst; @@ -317,7 +317,7 @@ public class WorldGenerator{ double elevationOf(int x, int y, boolean detailed){ double ridge = rid.getValue(x, y, 1f / 400f); - return sim.octaveNoise2D(detailed ? 7 : 2, 0.62, 1f / 640, x, y) * 6.1 - 1 - ridge; + return sim.octaveNoise2D(detailed ? 7 : 4, 0.62, 1f / 640, x, y) * 6.1 - 1 - ridge; } public static class GenResult{ diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java index f8962ae760..a7895fa6a8 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java @@ -43,7 +43,7 @@ public class ConsumeLiquid extends Consume{ @Override public boolean valid(Block block, TileEntity entity){ - return entity.liquids.get(liquid) >= use(block); + return entity != null && entity.liquids != null && entity.liquids.get(liquid) >= use(block); } @Override From bb7e2c7cee9d4d3d94977ce9813edd249fbaeaf6 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 21 Aug 2018 19:01:35 -0400 Subject: [PATCH 7/9] Commit #2000 --- core/src/io/anuke/mindustry/Vars.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index bc7386e2a5..037dd2e436 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -31,7 +31,7 @@ public class Vars{ //time between waves in frames (on normal mode) public static final float wavespace = 60 * 60 * 1.5f; //set ridiculously high for now - public static final float coreBuildRange = 800999f; + public static final float coreBuildRange = 999999f; //team of the player by default public static final Team defaultTeam = Team.blue; //team of the enemy in waves From a75994cbbf23b0819cf545d48baf5f7d59b233a5 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 22 Aug 2018 12:42:19 -0400 Subject: [PATCH 8/9] Updates to iOS build --- build.gradle | 18 ++++++++---------- ios/robovm.properties | 2 +- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index 22d677a674..0cccf249f3 100644 --- a/build.gradle +++ b/build.gradle @@ -127,24 +127,22 @@ project(":ios") { apply plugin: "robovm" task copyGen{ - doFirst{ - copy{ - from ("../core/build/classes/java/main/io/anuke/mindustry/gen/"){ - include "**/*.java" - } - - into "../core/src/io/anuke/mindustry/gen" + copy{ + from ("core/build/classes/java/main/io/anuke/mindustry/gen/"){ + include "**/*.java" } + + into "ios/src/io/anuke/mindustry/gen" } - doLast{ + doFirst{ delete{ - delete "../core/src/io/anuke/mindustry/gen/" + delete "ios/src/io/anuke/mindustry/gen/" } } } - build.finalizedBy(copyGen) + build.dependsOn(copyGen) dependencies { compile project(":core") diff --git a/ios/robovm.properties b/ios/robovm.properties index 215c08b0c3..46c15b0f5c 100644 --- a/ios/robovm.properties +++ b/ios/robovm.properties @@ -2,5 +2,5 @@ app.version=4.0 app.id=io.anuke.mindustry app.mainclass=io.anuke.mindustry.IOSLauncher app.executable=IOSLauncher -app.build=20 +app.build=22 app.name=Mindustry From 6613e4ec42af657689ef56ae6f18161495a98f57 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 23 Aug 2018 23:26:45 -0400 Subject: [PATCH 9/9] Generaor changes --- .../mindustry/maps/generation/WorldGenerator.java | 12 ++++-------- .../io/anuke/mindustry/desktop/DesktopPlatform.java | 6 +++--- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java b/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java index 69d7abf0c3..31c313e376 100644 --- a/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java +++ b/core/src/io/anuke/mindustry/maps/generation/WorldGenerator.java @@ -272,6 +272,10 @@ public class WorldGenerator{ floor = Blocks.water; }else if(elevation < 0.85){ floor = Blocks.sand; + }else if(temp < 0.42){ + floor = Blocks.snow; + }else if(temp < 0.5){ + floor = Blocks.stone; }else if(temp < 0.55){ floor = Blocks.grass; }else if(temp < 0.6){ @@ -288,14 +292,6 @@ public class WorldGenerator{ floor = Blocks.blackstone; } - if(temp < 0.6f){ - if(elevation > 3){ - floor = Blocks.snow; - }else if(elevation > 2.5){ - floor = Blocks.stone; - } - } - if(elevation > 3.3 && iceridge > 0.25 && temp < 0.6f){ elevation ++; floor = Blocks.ice; diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java b/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java index ba55af64f6..bbece0d916 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopPlatform.java @@ -119,7 +119,7 @@ public class DesktopPlatform extends Platform{ @Override public boolean isDebug(){ //honestly I'm just putting this ridiculous """anti-debug""" mess here to see if anyone bothers solving it without editing source - return args.length > 0 && args[0].equals(("-debug_" + getUUID().hashCode() + "_" + return args.length > 0 && args[0].equals(("-debug_" + "12312333_" + " " + System.getProperty("os.arch") + "nice" + (int)(Math.sin(System.getProperty("user.dir").hashCode()) * 100) + Thread.currentThread().getStackTrace()[1].toString()).hashCode() + "") && new File("../../desktop/build/").exists(); } @@ -133,8 +133,7 @@ public class DesktopPlatform extends Platform{ try{ Enumeration e = NetworkInterface.getNetworkInterfaces(); NetworkInterface out; - for(out = e.nextElement(); out.getHardwareAddress() == null && e.hasMoreElements() && validAddress(out.getHardwareAddress()); out = e.nextElement()) - ; + for(out = e.nextElement(); out.getHardwareAddress() == null && e.hasMoreElements() && validAddress(out.getHardwareAddress()); out = e.nextElement()) ; byte[] bytes = out.getHardwareAddress(); byte[] result = new byte[8]; @@ -151,6 +150,7 @@ public class DesktopPlatform extends Platform{ } private boolean validAddress(byte[] bytes){ + if(bytes == null) return false; byte[] result = new byte[8]; System.arraycopy(bytes, 0, result, 0, bytes.length); return !new String(Base64Coder.encode(result)).equals("AAAAAAAAAOA=");