Merge branch 'master' of https://github.com/Anuken/Mindustry into 4.0

# Conflicts:
#	core/assets/sprites/sprites.atlas
#	core/assets/sprites/sprites.png
#	core/assets/version.properties
#	core/src/io/anuke/mindustry/ui/fragments/DebugFragment.java
This commit is contained in:
Anuken
2018-02-27 19:58:34 -05:00
59 changed files with 2419 additions and 1120 deletions

View File

@@ -0,0 +1,65 @@
package io.anuke.mindustry.ui.dialogs;
import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.NetConnection;
import io.anuke.mindustry.net.NetEvents;
import io.anuke.ucore.scene.ui.ScrollPane;
import io.anuke.ucore.scene.ui.layout.Table;
import static io.anuke.mindustry.Vars.*;
public class AdminsDialog extends FloatingDialog {
public AdminsDialog(){
super("$text.server.admins");
addCloseButton();
setup();
shown(this::setup);
}
private void setup(){
content().clear();
if(gwt) return;
float w = 400f, h = 80f;
Table table = new Table();
ScrollPane pane = new ScrollPane(table, "clear");
pane.setFadeScrollBars(false);
if(netServer.admins.getAdmins().size == 0){
table.add("$text.server.admins.none");
}
for(String ip : netServer.admins.getAdmins()){
Table res = new Table("button");
res.margin(14f);
res.labelWrap("[LIGHT_GRAY]" + netServer.admins.getLastName(ip)).width(w - h - 24f);
res.add().growX();
res.addImageButton("icon-cancel", 14*3, () -> {
ui.showConfirm("$text.confirm", "$text.confirmunadmin", () -> {
netServer.admins.unAdminPlayer(ip);
for(Player player : playerGroup.all()){
NetConnection c = Net.getConnection(player.clientid);
if(c != null){
NetEvents.handleAdminSet(player, false);
break;
}
}
setup();
});
}).size(h).pad(-14f);
table.add(res).width(w).height(h);
table.row();
}
content().add(pane);
}
}

View File

@@ -0,0 +1,55 @@
package io.anuke.mindustry.ui.dialogs;
import io.anuke.ucore.scene.ui.ScrollPane;
import io.anuke.ucore.scene.ui.layout.Table;
import static io.anuke.mindustry.Vars.*;
public class BansDialog extends FloatingDialog {
public BansDialog(){
super("$text.server.bans");
addCloseButton();
setup();
shown(this::setup);
}
private void setup(){
content().clear();
if(gwt) return;
float w = 400f, h = 80f;
Table table = new Table();
ScrollPane pane = new ScrollPane(table, "clear");
pane.setFadeScrollBars(false);
if(netServer.admins.getBanned().size == 0){
table.add("$text.server.bans.none");
}
for(String ip : netServer.admins.getBanned()){
Table res = new Table("button");
res.margin(14f);
res.labelWrap("IP: [LIGHT_GRAY]" + ip + "\n[]Name: [LIGHT_GRAY]" + netServer.admins.getLastName(ip)).width(w - h - 24f);
res.add().growX();
res.addImageButton("icon-cancel", 14*3, () -> {
ui.showConfirm("$text.confirm", "$text.confirmunban", () -> {
netServer.admins.unbanPlayer(ip);
setup();
});
}).size(h).pad(-14f);
table.add(res).width(w).height(h);
table.row();
}
content().add(pane);
}
}

View File

@@ -14,7 +14,6 @@ import java.io.IOException;
import static io.anuke.mindustry.Vars.player;
import static io.anuke.mindustry.Vars.ui;
//TODO add port specification
public class HostDialog extends FloatingDialog{
float w = 300;
@@ -31,13 +30,13 @@ public class HostDialog extends FloatingDialog{
Settings.put("name", text);
Settings.save();
ui.listfrag.rebuild();
}).grow().pad(8);
}).grow().pad(8).get().setMaxLength(40);
ImageButton button = t.addImageButton("white", 40, () -> {
new ColorPickDialog().show(color -> {
player.color.set(color);
Settings.putInt("color", Color.rgba8888(color));
Settings.save();;
Settings.save();
});
}).size(50f, 54f).get();
button.update(() -> button.getStyle().imageUpColor = player.getColor());
@@ -50,6 +49,7 @@ public class HostDialog extends FloatingDialog{
Timers.runTask(5f, () -> {
try{
Net.host(Vars.port);
player.isAdmin = true;
}catch (IOException e){
ui.showError(Bundles.format("text.server.error", Strings.parseException(e, false)));
}
@@ -58,19 +58,4 @@ public class HostDialog extends FloatingDialog{
});
}).width(w).height(70f);
}
/*
showTextInput("$text.hostserver", "$text.server.port", Vars.port + "", new DigitsOnlyFilter(), text -> {
int result = Strings.parseInt(text);
if(result == Integer.MIN_VALUE || result >= 65535){
ui.showError("$text.server.invalidport");
}else{
try{
Net.host(result);
}catch (IOException e){
ui.showError(Bundles.format("text.server.error", Strings.parseException(e, false)));
}
}
});
*/
}

View File

@@ -56,7 +56,6 @@ public class JoinDialog extends FloatingDialog {
setupRemote();
refreshRemote();
}else{
//renaming.port = Strings.parseInt(Settings.getString("port"));
renaming.ip = Settings.getString("ip");
saveServers();
setupRemote();
@@ -85,7 +84,7 @@ public class JoinDialog extends FloatingDialog {
TextButton button = buttons[0] = remote.addButton("[accent]"+server.ip, "clear", () -> {
if(!buttons[0].childrenPressed()) connect(server.ip, Vars.port);
}).width(w).height(120f).pad(4f).get();
}).width(w).height(140f).pad(4f).get();
button.getLabel().setWrap(true);
@@ -134,10 +133,14 @@ public class JoinDialog extends FloatingDialog {
Net.pingHost(server.ip, server.port, host -> {
server.content.clear();
server.content.add("[lightgray]" + Bundles.format("text.server.hostname", host.name)).pad(4);
server.content.add("[lightgray]" + Bundles.format("text.server.hostname", host.name)).left();
server.content.row();
server.content.add("[lightgray]" + (host.players != 1 ? Bundles.format("text.players", host.players) :
Bundles.format("text.players.single", host.players)));
Bundles.format("text.players.single", host.players))).left();
server.content.row();
server.content.add("[lightgray]" + Bundles.format("text.save.map", host.mapname)).left();
server.content.row();
server.content.add("[lightgray]" + Bundles.format("text.save.wave", host.wave)).left();
}, e -> {
server.content.clear();
server.content.add("$text.host.invalid");
@@ -175,7 +178,7 @@ public class JoinDialog extends FloatingDialog {
Vars.player.name = text;
Settings.put("name", text);
Settings.save();
}).grow().pad(8);
}).grow().pad(8).get().setMaxLength(40);
ImageButton button = t.addImageButton("white", 40, () -> {
new ColorPickDialog().show(color -> {

View File

@@ -32,18 +32,18 @@ public class SettingsMenuDialog extends SettingsDialog{
public SettingsMenuDialog(){
setStyle(Core.skin.get("dialog", WindowStyle.class));
hidden(()->{
hidden(() -> {
if(!state.is(State.menu)){
if(!wasPaused || Net.active())
state.set(State.playing);
}
});
shown(()->{
shown(() -> {
if(!state.is(State.menu)){
wasPaused = state.is(State.paused);
if(menu.getScene() != null){
wasPaused = ((PausedDialog)menu).wasPaused;
if(ui.paused.getScene() != null){
wasPaused = ui.paused.wasPaused;
}
if(!Net.active()) state.set(State.paused);
ui.paused.hide();

View File

@@ -0,0 +1,53 @@
package io.anuke.mindustry.ui.dialogs;
import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.net.TraceInfo;
import io.anuke.ucore.scene.ui.layout.Table;
import io.anuke.ucore.util.Bundles;
public class TraceDialog extends FloatingDialog {
public TraceDialog(){
super("$text.trace");
addCloseButton();
}
public void show(Player player, TraceInfo info){
content().clear();
Table table = new Table("button");
table.margin(14);
table.defaults().pad(1);
table.defaults().left();
table.add(Bundles.format("text.trace.playername", player.name));
table.row();
table.add(Bundles.format("text.trace.ip", info.ip));
table.row();
table.add(Bundles.format("text.trace.modclient", info.modclient));
table.row();
table.add().pad(5);
table.row();
table.add(Bundles.format("text.trace.totalblocksbroken", info.totalBlocksBroken));
table.row();
table.add(Bundles.format("text.trace.structureblocksbroken", info.structureBlocksBroken));
table.row();
table.add(Bundles.format("text.trace.lastblockbroken", info.lastBlockBroken.formalName));
table.row();
table.add().pad(5);
table.row();
table.add(Bundles.format("text.trace.totalblocksplaced", info.totalBlocksPlaced));
table.row();
table.add(Bundles.format("text.trace.lastblockplaced", info.lastBlockPlaced.formalName));
table.row();
content().add(table);
show();
}
}

View File

@@ -24,13 +24,14 @@ public class BackgroundFragment implements Fragment {
Core.batch.draw(back, w/2 - back.getRegionWidth()*backscl/2 +240f, h/2 - back.getRegionHeight()*backscl/2 + 250f,
back.getRegionWidth()*backscl, back.getRegionHeight()*backscl);
float logoscl = (int)Unit.dp.scl(7);
boolean portrait = Gdx.graphics.getWidth() < Gdx.graphics.getHeight();
float logoscl = (int)Unit.dp.scl(7) * (portrait ? 5f/7f : 1f);
TextureRegion logo = Core.skin.getRegion("logotext");
float logow = logo.getRegionWidth()*logoscl;
float logoh = logo.getRegionHeight()*logoscl;
Draw.color();
Core.batch.draw(logo, w/2 - logow/2, h - logoh + 15, logow, logoh);
Core.batch.draw(logo, w/2 - logow/2, h - logoh + 15 + (portrait ? -Unit.dp.scl(30f) : 0f), logow, logoh);
}).visible(() -> state.is(State.menu)).grow();
}
}

View File

@@ -57,11 +57,22 @@ public class DebugFragment implements Fragment {
row();
new button("wave", () -> state.wavetime = 0f);
row();
new button("time 0", () -> Timers.resetTime(0f));
row();
new button("time max", () -> Timers.resetTime(1080000 - 60*10));
row();
new button("clear", () -> {
enemyGroup.clear();
state.enemies = 0;
netClient.clearRecieved();
});
row();
new button("spawn", () -> {
for(int i = 0; i < 30; i ++){
new Enemy(EnemyTypes.healer).set(player.x + Mathf.range(50f), player.y + Mathf.range(50f)).add();
}
});
row();
}}.end();
row();

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

@@ -214,6 +214,7 @@ public class PlacementFragment implements Fragment{
breaktable.getParent().swapActor(breaktable, next);
if(!show){
control.input().breakMode = PlaceMode.none;
breaktable.actions(Actions.translateBy(-breaktable.getWidth() - 5, 0, dur, in), Actions.call(() -> shown = false));
}else{
shown = true;

View File

@@ -1,16 +1,21 @@
package io.anuke.mindustry.ui.fragments;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.NetConnection;
import io.anuke.mindustry.net.NetEvents;
import io.anuke.mindustry.net.Packets.AdminAction;
import io.anuke.mindustry.net.Packets.KickReason;
import io.anuke.mindustry.ui.BorderImage;
import io.anuke.ucore.core.Inputs;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.scene.Element;
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.event.Touchable;
import io.anuke.ucore.scene.ui.ScrollPane;
import io.anuke.ucore.scene.ui.layout.Stack;
import io.anuke.ucore.scene.ui.layout.Table;
@@ -40,10 +45,20 @@ public class PlayerListFragment implements Fragment{
row();
new table("pane"){{
margin(12f);
get().addCheck("$text.server.friendlyfire", b -> {
state.friendlyFire = b;
NetEvents.handleFriendlyFireChange(b);
}).growX().update(i -> i.setChecked(state.friendlyFire)).disabled(b -> Net.client());
}).growX().update(i -> i.setChecked(state.friendlyFire)).disabled(b -> Net.client()).padRight(5);
new button("$text.server.bans", () -> {
ui.bans.show();
}).padTop(-12).padBottom(-12).fillY().cell.disabled(b -> Net.client());
new button("$text.server.admins", () -> {
ui.admins.show();
}).padTop(-12).padBottom(-12).padRight(-12).fillY().cell.disabled(b -> Net.client());
}}.pad(10f).growX().end();
}}.end();
@@ -69,9 +84,13 @@ public class PlayerListFragment implements Fragment{
public void rebuild(){
content.clear();
float h = 60f;
float h = 74f;
for(Player player : playerGroup.all()){
NetConnection connection = gwt ? null : Net.getConnection(player.clientid);
if(connection == null && Net.server() && !player.isLocal) continue;
Table button = new Table("button");
button.left();
button.margin(5).marginBottom(10);
@@ -93,19 +112,68 @@ public class PlayerListFragment implements Fragment{
}
});
}
button.add(stack).size(h);
button.add("[#" + player.getColor().toString().toUpperCase() + "]" + player.name).pad(10);
button.labelWrap("[#" + player.getColor().toString().toUpperCase() + "]" + player.name).width(170f).pad(10);
button.add().grow();
if(Net.server() && !player.isLocal){
button.addImage("icon-admin").size(14*2).visible(() -> player.isAdmin && !(!player.isLocal && Net.server())).padRight(5);
if((Net.server() || Vars.player.isAdmin) && !player.isLocal && (!player.isAdmin || Net.server())){
button.add().growY();
button.addImageButton("icon-cancel", 14*3, () ->
Net.kickConnection(player.clientid, KickReason.kick)
).pad(-5).padBottom(-10).size(h+10, h+14);
float bs = (h + 14)/2f;
button.table(t -> {
t.defaults().size(bs - 1, bs + 3);
t.addImageButton("icon-ban", 14*2, () -> {
ui.showConfirm("$text.confirm", "$text.confirmban", () -> {
if(Net.server()) {
netServer.admins.banPlayer(connection.address);
Net.kickConnection(player.clientid, KickReason.banned);
}else{
NetEvents.handleAdministerRequest(player, AdminAction.ban);
}
});
}).padBottom(-5.1f);
t.addImageButton("icon-cancel", 14*2, () -> {
if(Net.server()) {
Net.kickConnection(player.clientid, KickReason.kick);
}else{
NetEvents.handleAdministerRequest(player, AdminAction.kick);
}
}).padBottom(-5.1f);
t.row();
t.addImageButton("icon-admin", "toggle", 14*2, () -> {
if(Net.client()) return;
if(netServer.admins.isAdmin(connection.address)){
ui.showConfirm("$text.confirm", "$text.confirmunadmin", () -> {
netServer.admins.unAdminPlayer(connection.address);
NetEvents.handleAdminSet(player, false);
});
}else{
ui.showConfirm("$text.confirm", "$text.confirmadmin", () -> {
netServer.admins.adminPlayer(connection.address);
NetEvents.handleAdminSet(player, true);
});
}
}).update(b ->{
b.setChecked(player.isAdmin);
b.setDisabled(Net.client());
}).get().setTouchable(() -> Net.client() ? Touchable.disabled : Touchable.enabled);
t.addImageButton("icon-zoom-small", 14*2, () -> NetEvents.handleTraceRequest(player));
}).padRight(12).padTop(-5).padLeft(0).padBottom(-10).size(bs + 10f, bs);
}
content.add(button).padBottom(-5).width(350f);
content.add(button).padBottom(-6).width(350f).maxHeight(h + 14);
content.row();
}