diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index db43e15a7d..8f4d918804 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -51,6 +51,7 @@ public class NetClient extends Module { gotData = false; kicked = false; + ui.chatfrag.clearMessages(); ui.loadfrag.hide(); ui.loadfrag.show("$text.connecting.data"); diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index e17a777246..caa183e5ba 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.utils.*; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.SyncEntity; +import io.anuke.mindustry.game.EventType.GameOverEvent; import io.anuke.mindustry.io.Platform; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net.SendMode; @@ -14,6 +15,7 @@ import io.anuke.mindustry.resource.Upgrade; import io.anuke.mindustry.resource.UpgradeRecipes; import io.anuke.mindustry.resource.Weapon; import io.anuke.mindustry.world.Tile; +import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.Entities; import io.anuke.ucore.entities.EntityGroup; @@ -38,6 +40,8 @@ public class NetServer extends Module{ public NetServer(){ + Events.on(GameOverEvent.class, () -> weapons.clear()); + Net.handleServer(Connect.class, (id, connect) -> {}); Net.handleServer(ConnectPacket.class, (id, packet) -> { @@ -189,7 +193,7 @@ public class NetServer extends Module{ public void update(){ if(!headless && !closing && Net.server() && state.is(State.menu)){ closing = true; - weapons.clear(); + reset(); ui.loadfrag.show("$text.server.closing"); Timers.runTask(5f, () -> { Net.closeServer(); @@ -203,6 +207,10 @@ public class NetServer extends Module{ } } + public void reset(){ + weapons.clear(); + } + void sync(){ if(Timers.get("serverSync", serverSyncTime)){ @@ -291,8 +299,8 @@ public class NetServer extends Module{ if(player == null) continue; int x = Mathf.scl2(player.x, tilesize); int y = Mathf.scl2(player.y, tilesize); - int w = 16; - int h = 12; + int w = 22; + int h = 16; sendBlockSync(id, x, y, w, h); } } diff --git a/core/src/io/anuke/mindustry/entities/BulletType.java b/core/src/io/anuke/mindustry/entities/BulletType.java index cc0811212b..9ad30d67b6 100644 --- a/core/src/io/anuke/mindustry/entities/BulletType.java +++ b/core/src/io/anuke/mindustry/entities/BulletType.java @@ -330,7 +330,7 @@ public abstract class BulletType extends BaseBulletType{ Draw.reset(); } }, - spread = new BulletType(2.4f, 8) { + spread = new BulletType(2.4f, 9) { { lifetime = 70; } @@ -344,10 +344,10 @@ public abstract class BulletType extends BaseBulletType{ Draw.reset(); } }, - cluster = new BulletType(4.4f, 13){ + cluster = new BulletType(4.5f, 12){ { lifetime = 60; - drag = 0.06f; + drag = 0.05f; } public void draw(Bullet b){ @@ -370,10 +370,10 @@ public abstract class BulletType extends BaseBulletType{ Effects.effect(Fx.clusterbomb, b); - DamageArea.damage(!(b.owner instanceof Enemy), b.x, b.y, 22f, damage); + DamageArea.damage(!(b.owner instanceof Enemy), b.x, b.y, 35f, damage); } }, - vulcan = new BulletType(4.5f, 11) { + vulcan = new BulletType(4.5f, 12) { { lifetime = 50; } @@ -395,7 +395,7 @@ public abstract class BulletType extends BaseBulletType{ } } }, - shockshell = new BulletType(5.4f, 10) { + shockshell = new BulletType(5.5f, 11) { { drag = 0.03f; @@ -441,7 +441,7 @@ public abstract class BulletType extends BaseBulletType{ Draw.reset(); } }, - beamlaser = new BulletType(0.001f, 35) { + beamlaser = new BulletType(0.001f, 38) { float length = 230f; { drawSize = length*2f+20f; diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index 0b4942e46d..c6776af197 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -151,8 +151,9 @@ public class Player extends SyncEntity{ stucktime = 0f; } - if(stucktime > 10f){ + if(stucktime > 20f){ damage(health+1); //die instantly + stucktime = 0f; } if(ui.chatfrag.chatOpen()) return; @@ -281,7 +282,7 @@ public class Player extends SyncEntity{ Effects.effect(Fx.dashsmoke, x + Angles.x(), y + Angles.y()); } - if(dashing && Timers.get(this, "dashfx", 3)){ + if(dashing && !dead && Timers.get(this, "dashfx", 3)){ Angles.translation(angle + 180, 3f); Effects.effect(Fx.dashsmoke, x + Angles.x(), y + Angles.y()); } diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index 42ff18eaef..52ac231076 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -47,7 +47,7 @@ public class Net{ public static void setClientLoaded(boolean loaded){ clientLoaded = loaded; - if(loaded && false){ //TODO enable. + if(loaded){ //handle all packets that were skipped while loading for(int i = 0; i < packetQueue.size; i ++){ Log.info("Processing {0} packet post-load.", ClassReflection.getSimpleName(packetQueue.get(i).getClass())); diff --git a/core/src/io/anuke/mindustry/resource/UpgradeRecipes.java b/core/src/io/anuke/mindustry/resource/UpgradeRecipes.java index a3854e9e58..03566c51ee 100644 --- a/core/src/io/anuke/mindustry/resource/UpgradeRecipes.java +++ b/core/src/io/anuke/mindustry/resource/UpgradeRecipes.java @@ -6,11 +6,11 @@ import io.anuke.ucore.util.Mathf; public class UpgradeRecipes { private static final ObjectMap recipes = Mathf.map( - Weapon.triblaster, list(stack(Item.iron, 40), stack(Item.steel, 40)), - Weapon.clustergun, list(stack(Item.iron, 60), stack(Item.steel, 80)), - Weapon.vulcan, list(stack(Item.iron, 60), stack(Item.steel, 120), stack(Item.titanium, 60)), - Weapon.beam, list(stack(Item.steel, 240), stack(Item.titanium, 120), stack(Item.dirium, 80)), - Weapon.shockgun, list(stack(Item.steel, 120), stack(Item.titanium, 120), stack(Item.dirium, 120)) + Weapon.triblaster, list(stack(Item.iron, 60), stack(Item.steel, 80)), + Weapon.clustergun, list(stack(Item.iron, 300), stack(Item.steel, 80)), + Weapon.vulcan, list(stack(Item.iron, 100), stack(Item.steel, 150), stack(Item.titanium, 80)), + Weapon.beam, list(stack(Item.steel, 260), stack(Item.titanium, 160), stack(Item.dirium, 120)), + Weapon.shockgun, list(stack(Item.steel, 240), stack(Item.titanium, 160), stack(Item.dirium, 160)) ); private static final ItemStack[] empty = {}; diff --git a/core/src/io/anuke/mindustry/resource/Weapon.java b/core/src/io/anuke/mindustry/resource/Weapon.java index e8c3940fb2..24ba460a1f 100644 --- a/core/src/io/anuke/mindustry/resource/Weapon.java +++ b/core/src/io/anuke/mindustry/resource/Weapon.java @@ -33,7 +33,7 @@ public class Weapon extends Upgrade{ clustergun = new Weapon("clustergun", 26f, BulletType.cluster){ { effect = Fx.clusterShoot; - inaccuracy = 20f; + inaccuracy = 17f; roundrobin = true; shots = 2; spacing = 0; diff --git a/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java b/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java index e9aab42c13..5c39be6784 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java @@ -14,12 +14,12 @@ import io.anuke.mindustry.net.NetEvents; import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Inputs; import io.anuke.ucore.core.Timers; -import io.anuke.ucore.scene.Scene; import io.anuke.ucore.scene.ui.Label; import io.anuke.ucore.scene.ui.Label.LabelStyle; import io.anuke.ucore.scene.ui.TextField; import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.ui.layout.Unit; +import io.anuke.ucore.util.Log; import static io.anuke.mindustry.Vars.state; import static io.anuke.ucore.core.Core.scene; @@ -57,10 +57,6 @@ public class ChatFragment extends Table implements Fragment{ if(Net.active() && Inputs.keyTap("chat")){ toggle(); } - - if(state.is(State.menu) && messages.size > 0){ - messages.clear(); - } }); setup(); @@ -71,6 +67,10 @@ public class ChatFragment extends Table implements Fragment{ scene.add(this); } + public void clearMessages(){ + messages.clear(); + } + private void setup(){ fieldlabel.setStyle(new LabelStyle(fieldlabel.getStyle())); fieldlabel.getStyle().font = font; @@ -152,15 +152,15 @@ public class ChatFragment extends Table implements Fragment{ } public void toggle(){ - Scene scene = getScene(); + Log.info("open"); - if(!chatOpen && (scene.getKeyboardFocus() == null || !scene.getKeyboardFocus().getParent().isVisible())){ + if(!chatOpen){ scene.setKeyboardFocus(chatfield); chatfield.fireClick(); chatOpen = !chatOpen; lastfade = fadetime; fadetime = messagesShown + 1; - }else if(chatOpen){ + }else{ scene.setKeyboardFocus(null); chatOpen = !chatOpen; fadetime = lastfade; diff --git a/core/src/io/anuke/mindustry/ui/fragments/DebugFragment.java b/core/src/io/anuke/mindustry/ui/fragments/DebugFragment.java index 79b539a700..7bea334bcf 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/DebugFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/DebugFragment.java @@ -2,12 +2,14 @@ package io.anuke.mindustry.ui.fragments; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.files.FileHandle; +import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.mindustry.entities.enemies.EnemyTypes; import io.anuke.mindustry.net.Net; import io.anuke.ucore.scene.builders.button; import io.anuke.ucore.scene.builders.label; import io.anuke.ucore.scene.builders.table; +import io.anuke.ucore.scene.ui.Label; import io.anuke.ucore.scene.ui.ScrollPane; import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.util.Log; @@ -74,7 +76,9 @@ public class DebugFragment implements Fragment { new table("pane") {{ defaults().fillX(); - new label(DebugFragment::debugInfo); + ScrollPane pane = new ScrollPane(new Label(DebugFragment::debugInfo), "clear"); + + add(pane); row(); new button("dump", () -> { try{ @@ -109,7 +113,7 @@ public class DebugFragment implements Fragment { } public static String debugInfo(){ - return join( + StringBuilder result = join( "net.active: " + Net.active(), "net.server: " + Net.server(), Net.client() ? @@ -126,14 +130,46 @@ public class DebugFragment implements Fragment { "state: " + state.getState(), !Net.server() ? clientDebug.getOut() : serverDebug.getOut() ); + + result.append("players: "); + + for(Player player : playerGroup.all()){ + result.append(" name: "); + result.append(player.name); + result.append("\n"); + result.append(" id: "); + result.append(player.id); + result.append("\n"); + result.append(" cid: "); + result.append(player.clientid); + result.append("\n"); + result.append(" dead: "); + result.append(player.isDead()); + result.append("\n"); + result.append(" pos: "); + result.append(player.x); + result.append(", "); + result.append(player.y); + result.append("\n"); + result.append(" android: "); + result.append(player.isAndroid); + result.append("\n"); + result.append(" local: "); + result.append(player.isLocal); + result.append("\n"); + + result.append("\n"); + } + + return result.toString(); } - private static String join(String... strings){ + private static StringBuilder join(String... strings){ StringBuilder builder = new StringBuilder(); for (String string : strings) { builder.append(string); builder.append("\n"); } - return builder.toString(); + return builder; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java index de8a3076b7..47e71f3c33 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java @@ -99,6 +99,8 @@ public class Conveyor extends Block{ long value = entity.convey.get(i); ItemPos pos = pos1.set(value); + pos.y += shift; + if(pos.item == null){ removals.add(value); continue; @@ -110,7 +112,7 @@ public class Conveyor extends Block{ float minmove = 1f / (Short.MAX_VALUE - 2); if(canmove){ - pos.y += Math.max(speed * Timers.delta() + shift, minmove); //TODO fix precision issues when at high FPS? + pos.y += Math.max(speed * Timers.delta(), minmove); //TODO fix precision issues when at high FPS? pos.x = Mathf.lerpDelta(pos.x, 0, 0.06f); }else{ pos.x = Mathf.lerpDelta(pos.x, pos.seed/offsetScl, 0.1f); diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index 0ca6a3f29b..9fda98b551 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -104,6 +104,7 @@ public class ServerControl extends Module { handler.register("stop", "Stop hosting the server.", arg -> { Net.closeServer(); state.set(State.menu); + netServer.reset(); }); handler.register("host", " ", "Open the server with a specific map.", arg -> {