Local multiplayer initial commit

This commit is contained in:
Anuken
2018-05-11 07:59:10 -07:00
parent 90b9ba71de
commit 959f756ff5
11 changed files with 350 additions and 299 deletions

View File

@@ -143,7 +143,7 @@ public class Vars{
public static NetServer netServer; public static NetServer netServer;
public static NetClient netClient; public static NetClient netClient;
public static Player player; public static Player[] players;
public static final EntityGroup<Player> playerGroup = Entities.addGroup(Player.class).enableMapping(); public static final EntityGroup<Player> playerGroup = Entities.addGroup(Player.class).enableMapping();
public static final EntityGroup<TileEntity> tileGroup = Entities.addGroup(TileEntity.class, false); public static final EntityGroup<TileEntity> tileGroup = Entities.addGroup(TileEntity.class, false);

View File

@@ -26,6 +26,7 @@ import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.modules.Module; import io.anuke.ucore.modules.Module;
import io.anuke.ucore.scene.ui.layout.Unit; import io.anuke.ucore.scene.ui.layout.Unit;
import io.anuke.ucore.util.Atlas; import io.anuke.ucore.util.Atlas;
import io.anuke.ucore.util.Input;
import io.anuke.ucore.util.InputProxy; import io.anuke.ucore.util.InputProxy;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
@@ -43,8 +44,7 @@ public class Control extends Module{
private Saves saves; private Saves saves;
private float respawntime; private InputHandler[] inputs;
private InputHandler input;
private InputProxy proxy; private InputProxy proxy;
private float controlx, controly; private float controlx, controly;
@@ -58,12 +58,6 @@ public class Control extends Module{
Gdx.input.setCatchBackKey(true); Gdx.input.setCatchBackKey(true);
if(mobile){
input = new AndroidInput();
}else{
input = new DesktopInput();
}
proxy = new InputProxy(Gdx.input){ proxy = new InputProxy(Gdx.input){
@Override @Override
public int getY() { public int getY() {
@@ -86,8 +80,6 @@ public class Control extends Module{
} }
}; };
Inputs.addProcessor(input);
Effects.setShakeFalloff(10000f); Effects.setShakeFalloff(10000f);
Core.atlas = new Atlas("sprites.atlas"); Core.atlas = new Atlas("sprites.atlas");
@@ -110,7 +102,6 @@ public class Control extends Module{
Settings.defaultList( Settings.defaultList(
"ip", "localhost", "ip", "localhost",
"port", port+"", "port", port+"",
"name", mobile || gwt ? "player" : UCore.getProperty("user.name"),
"servers", "", "servers", "",
"color", Color.rgba8888(playerColors[8]), "color", Color.rgba8888(playerColors[8]),
"lastBuild", 0 "lastBuild", 0
@@ -118,11 +109,7 @@ public class Control extends Module{
KeyBinds.load(); KeyBinds.load();
player = new Player(); addPlayer(0);
player.name = Settings.getString("name");
player.mech = mobile ? Mechs.standardShip : Mechs.standard;
player.color.set(Settings.getInt("color"));
player.isLocal = true;
saves.load(); saves.load();
@@ -133,23 +120,20 @@ public class Control extends Module{
}); });
Events.on(PlayEvent.class, () -> { Events.on(PlayEvent.class, () -> {
player.set(world.getSpawnX(), world.getSpawnY()); for(Player player : players){
player.set(world.getSpawnX(), world.getSpawnY());
}
Core.camera.position.set(player.x, player.y, 0); Core.camera.position.set(world.getSpawnX(), world.getSpawnY(), 0);
state.set(State.playing); state.set(State.playing);
}); });
Events.on(ResetEvent.class, () -> { Events.on(ResetEvent.class, () -> {
player.weapon = Weapons.blaster; for(Player player : players){
player.team = Team.blue; player.reset();
player.inventory.clear(); }
player.upgrades.clear();
player.add();
player.heal();
respawntime = -1;
hiscore = false; hiscore = false;
ui.hudfrag.fadeRespawn(false); ui.hudfrag.fadeRespawn(false);
@@ -173,20 +157,35 @@ public class Control extends Module{
Effects.shake(5, 6, Core.camera.position.x, Core.camera.position.y); Effects.shake(5, 6, Core.camera.position.x, Core.camera.position.y);
//TODO effects??? //TODO game over effect
//Sounds.play("corexplode");
/*
for(int i = 0; i < 16; i ++){
Timers.run(i*2, ()-> Effects.effect(Fx.explosion, world.getCore().worldx()+Mathf.range(40), world.getCore().worldy()+Mathf.range(40)));
}
Effects.effect(Fx.coreexplosion, world.getCore().worldx(), world.getCore().worldy());*/
ui.restart.show(); ui.restart.show();
Timers.runTask(30f, () -> state.set(State.menu)); Timers.runTask(30f, () -> state.set(State.menu));
}); });
} }
//TODO drop player method
public void addPlayer(int index){
Player player = new Player();
player.name = Settings.getString("name-" + index, "player");
player.mech = mobile ? Mechs.standardShip : Mechs.standard;
player.color.set(Settings.getInt("color"));
player.isLocal = true;
player.playerIndex = index;
players[index] = player;
InputHandler input;
if(mobile){
input = new AndroidInput(player);
}else{
input = new DesktopInput(player);
}
inputs[index] = input;
Inputs.addProcessor(input);
}
//FIXME figure out what's causing this problem in the first place //FIXME figure out what's causing this problem in the first place
public void triggerInputUpdate(){ public void triggerInputUpdate(){
Gdx.input = proxy; Gdx.input = proxy;
@@ -204,8 +203,8 @@ public class Control extends Module{
return controlling; return controlling;
} }
public InputHandler input(){ public InputHandler input(int index){
return input; return inputs[index];
} }
public void playMap(Map map){ public void playMap(Map map){
@@ -225,14 +224,6 @@ public class Control extends Module{
return hiscore; return hiscore;
} }
public float getRespawnTime(){
return respawntime;
}
public void setRespawnTime(float respawntime){
this.respawntime = respawntime;
}
public Tutorial tutorial(){ public Tutorial tutorial(){
return tutorial; return tutorial;
} }
@@ -319,7 +310,9 @@ public class Control extends Module{
saves.update(); saves.update();
if(!state.is(State.menu)){ if(!state.is(State.menu)){
input.update(); for(InputHandler input : inputs){
input.update();
}
if(Inputs.keyTap("pause") && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){ if(Inputs.keyTap("pause") && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){
state.set(state.is(State.playing) ? State.paused : State.playing); state.set(state.is(State.playing) ? State.paused : State.playing);
@@ -343,19 +336,6 @@ public class Control extends Module{
Entities.update(effectGroup); Entities.update(effectGroup);
Entities.update(groundEffectGroup); Entities.update(groundEffectGroup);
if(respawntime > 0){
respawntime -= Timers.delta();
if(respawntime <= 0){
player.set(world.getSpawnX(), world.getSpawnY());
player.heal();
player.add();
Effects.sound("respawn");
ui.hudfrag.fadeRespawn(false);
}
}
if(tutorial.active()){ if(tutorial.active()){
tutorial.update(); tutorial.update();
} }

View File

@@ -168,9 +168,12 @@ public class NetClient extends Module {
Placement.placeBlock(placer.team, packet.x, packet.y, Block.getByID(packet.block), packet.rotation, true, Timers.get("placeblocksound", 10)); Placement.placeBlock(placer.team, packet.x, packet.y, Block.getByID(packet.block), packet.rotation, true, Timers.get("placeblocksound", 10));
if(packet.playerid == player.id){ for(Player player : players) {
Tile tile = world.tile(packet.x, packet.y); if (packet.playerid == player.id) {
if(tile != null) Block.getByID(packet.block).placed(tile); Tile tile = world.tile(packet.x, packet.y);
if (tile != null) Block.getByID(packet.block).placed(tile);
break;
}
} }
}); });
@@ -272,7 +275,9 @@ public class NetClient extends Module {
Weapon weapon = Upgrade.getByID(packet.id); Weapon weapon = Upgrade.getByID(packet.id);
state.inventory.removeItems(UpgradeRecipes.get(weapon)); state.inventory.removeItems(UpgradeRecipes.get(weapon));
player.upgrades.add(weapon); for(Player player : players) {
player.upgrades.add(weapon);
}
Effects.sound("purchase"); Effects.sound("purchase");
}); });
} }
@@ -329,9 +334,11 @@ public class NetClient extends Module {
requests = 0; requests = 0;
if(timer.get(0, playerSyncTime)){ if(timer.get(0, playerSyncTime)){
PositionPacket packet = new PositionPacket(); for(Player player : players) {
packet.player = player; PositionPacket packet = new PositionPacket();
Net.send(packet, SendMode.udp); packet.player = player;
Net.send(packet, SendMode.udp);
}
} }
if(timer.get(1, 60)){ if(timer.get(1, 60)){

View File

@@ -23,10 +23,7 @@ import io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect;
import io.anuke.mindustry.entities.units.BaseUnit; import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.game.TeamInfo.TeamData; import io.anuke.mindustry.game.TeamInfo.TeamData;
import io.anuke.mindustry.graphics.BlockRenderer; import io.anuke.mindustry.graphics.*;
import io.anuke.mindustry.graphics.Layer;
import io.anuke.mindustry.graphics.MinimapRenderer;
import io.anuke.mindustry.graphics.Shaders;
import io.anuke.mindustry.input.InputHandler; import io.anuke.mindustry.input.InputHandler;
import io.anuke.mindustry.input.PlaceMode; import io.anuke.mindustry.input.PlaceMode;
import io.anuke.mindustry.ui.fragments.ToolFragment; import io.anuke.mindustry.ui.fragments.ToolFragment;
@@ -59,8 +56,10 @@ public class Renderer extends RendererModule{
private FloatArray shieldHits = new FloatArray(); private FloatArray shieldHits = new FloatArray();
private Array<Callable> shieldDraws = new Array<>(); private Array<Callable> shieldDraws = new Array<>();
private Rectangle rect = new Rectangle(), rect2 = new Rectangle(); private Rectangle rect = new Rectangle(), rect2 = new Rectangle();
private Vector2 avgPosition = new Vector2();
private BlockRenderer blocks = new BlockRenderer(); private BlockRenderer blocks = new BlockRenderer();
private MinimapRenderer minimap = new MinimapRenderer(); private MinimapRenderer minimap = new MinimapRenderer();
private OverlayRenderer overlays = new OverlayRenderer();
public Renderer() { public Renderer() {
Lines.setCircleVertices(14); Lines.setCircleVertices(14);
@@ -139,7 +138,9 @@ public class Renderer extends RendererModule{
if(Mathf.in(camera.zoom, targetzoom, 0.005f)){ if(Mathf.in(camera.zoom, targetzoom, 0.005f)){
camera.zoom = 1f; camera.zoom = 1f;
Graphics.setCameraScale(targetscale); Graphics.setCameraScale(targetscale);
control.input().resetCursor(); for(Player player : players) {
control.input(player.playerIndex).resetCursor();
}
} }
}else{ }else{
camera.zoom = Mathf.lerpDelta(camera.zoom, 1f, 0.2f); camera.zoom = Mathf.lerpDelta(camera.zoom, 1f, 0.2f);
@@ -150,15 +151,17 @@ public class Renderer extends RendererModule{
}else{ }else{
boolean smoothcam = Settings.getBool("smoothcam"); boolean smoothcam = Settings.getBool("smoothcam");
Vector2 position = averagePosition();
if(!smoothcam){ if(!smoothcam){
setCamera(player.x, player.y); setCamera(position.x, position.y);
}else{ }else{
smoothCamera(player.x, player.y, mobile ? 0.3f : 0.14f); smoothCamera(position.x, position.y, mobile ? 0.3f : 0.14f);
} }
if(Settings.getBool("pixelate")) if(Settings.getBool("pixelate") && players.length == 1) {
limitCamera(4f, player.x, player.y); limitCamera(4f, position.x, position.y);
}
float prex = camera.position.x, prey = camera.position.y; float prex = camera.position.x, prey = camera.position.y;
updateShake(0.75f); updateShake(0.75f);
@@ -167,11 +170,6 @@ public class Renderer extends RendererModule{
float deltax = camera.position.x - prex, deltay = camera.position.y - prey; float deltax = camera.position.x - prex, deltay = camera.position.y - prey;
if(mobile){
player.x += camera.position.x - prevx;
player.y += camera.position.y - prevy;
}
float lastx = camera.position.x, lasty = camera.position.y; float lastx = camera.position.x, lasty = camera.position.y;
if(snapCamera && smoothcam && Settings.getBool("pixelate")){ if(snapCamera && smoothcam && Settings.getBool("pixelate")){
@@ -229,7 +227,7 @@ public class Renderer extends RendererModule{
//drawShield(); //drawShield();
drawOverlay(); overlays.draw();
if(pixelate) if(pixelate)
Graphics.flushSurface(); Graphics.flushSurface();
@@ -267,8 +265,10 @@ public class Renderer extends RendererModule{
@Override @Override
public void resize(int width, int height){ public void resize(int width, int height){
super.resize(width, height); super.resize(width, height);
control.input().resetCursor(); for(Player player : players) {
camera.position.set(player.x, player.y, 0); control.input(player.playerIndex).resetCursor();
}
camera.position.set(players[0].x, players[0].y, 0);
} }
@Override @Override
@@ -276,6 +276,14 @@ public class Renderer extends RendererModule{
background.dispose(); background.dispose();
} }
public Vector2 averagePosition(){
avgPosition.setZero();
for(Player player : players){
avgPosition.add(player.x, player.y);
}
return avgPosition;
}
public MinimapRenderer minimap() { public MinimapRenderer minimap() {
return minimap; return minimap;
} }
@@ -412,193 +420,6 @@ public class Renderer extends RendererModule{
shieldDraws.add(call); shieldDraws.add(call);
} }
void drawOverlay(){
//draw config selected block
if(ui.configfrag.isShown()){
Tile tile = ui.configfrag.getSelectedTile();
tile.block().drawConfigure(tile);
}
int tilex = control.input().getBlockX();
int tiley = control.input().getBlockY();
if(mobile){
Vector2 vec = Graphics.world(Gdx.input.getX(0), Gdx.input.getY(0));
tilex = Mathf.scl2(vec.x, tilesize);
tiley = Mathf.scl2(vec.y, tilesize);
}
InputHandler input = control.input();
//draw placement box
if((input.recipe != null && state.inventory.hasItems(input.recipe.requirements) && (!ui.hasMouse() || mobile)
&& control.input().drawPlace())){
input.placeMode.draw(control.input().getBlockX(), control.input().getBlockY(),
control.input().getBlockEndX(), control.input().getBlockEndY());
if(input.breakMode == PlaceMode.holdDelete)
input.breakMode.draw(tilex, tiley, 0, 0);
}else if(input.breakMode.delete && control.input().drawPlace()
&& (input.recipe == null || !state.inventory.hasItems(input.recipe.requirements))
&& (input.placeMode.delete || input.breakMode.both || !mobile)){
if(input.breakMode == PlaceMode.holdDelete)
input.breakMode.draw(tilex, tiley, 0, 0);
else
input.breakMode.draw(control.input().getBlockX(), control.input().getBlockY(),
control.input().getBlockEndX(), control.input().getBlockEndY());
}
if(ui.toolfrag.confirming){
ToolFragment t = ui.toolfrag;
PlaceMode.areaDelete.draw(t.px, t.py, t.px2, t.py2);
}
Draw.reset();
//draw selected block bars and info
if(input.recipe == null && !ui.hasMouse() && !ui.configfrag.isShown()){
Tile tile = world.tileWorld(Graphics.mouseWorld().x, Graphics.mouseWorld().y);
if(tile != null && tile.block() != Blocks.air){
Tile target = tile;
if(tile.isLinked())
target = tile.getLinked();
if(showBlockDebug && target.entity != null){
Draw.color(Color.RED);
Lines.crect(target.drawx(), target.drawy(), target.block().size * tilesize, target.block().size * tilesize);
Vector2 v = new Vector2();
Draw.tcolor(Color.YELLOW);
Draw.tscl(0.25f);
Array<Object> arr = target.block().getDebugInfo(target);
StringBuilder result = new StringBuilder();
for(int i = 0; i < arr.size/2; i ++){
result.append(arr.get(i*2));
result.append(": ");
result.append(arr.get(i*2 + 1));
result.append("\n");
}
Draw.textc(result.toString(), target.drawx(), target.drawy(), v);
Draw.color(0f, 0f, 0f, 0.5f);
Fill.rect(target.drawx(), target.drawy(), v.x, v.y);
Draw.textc(result.toString(), target.drawx(), target.drawy(), v);
Draw.tscl(fontscale);
Draw.reset();
}
if(Inputs.keyDown("block_info") && target.block().isAccessible()){
Draw.color(Colors.get("accent"));
Lines.crect(target.drawx(), target.drawy(), target.block().size * tilesize, target.block().size * tilesize);
Draw.color();
}
if(target.entity != null) {
int bot = 0, top = 0;
for (BlockBar bar : target.block().bars.list()) {
float offset = Mathf.sign(bar.top) * (target.block().size / 2f * tilesize + 3f + 4f * ((bar.top ? top : bot))) +
(bar.top ? -1f : 0f);
float value = bar.value.get(target);
if(MathUtils.isEqual(value, -1f)) continue;
drawBar(bar.type.color, target.drawx(), target.drawy() + offset, value);
if (bar.top)
top++;
else
bot++;
}
}
target.block().drawSelect(target);
}
}
if(control.input().isDroppingItem()){
Vector2 v = Graphics.mouseWorld();
float size = 8;
Draw.rect(player.inventory.getItem().item.region, v.x, v.y, size, size);
Draw.color("accent");
Lines.circle(v.x, v.y, 6 + Mathf.absin(Timers.time(), 5f, 1f));
Draw.reset();
Tile tile = world.tileWorld(v.x, v.y);
if(tile != null) tile = tile.target();
if(tile != null && tile.block().acceptStack(player.inventory.getItem().item, player.inventory.getItem().amount, tile, player) > 0){
Draw.color("place");
Lines.square(tile.drawx(), tile.drawy(), tile.block().size*tilesize/2f + 1 + Mathf.absin(Timers.time(), 5f, 1f));
Draw.color();
}
}
if((!debug || showUI) && Settings.getBool("healthbars")){
for(TeamData ally : (debug ? state.teams.getTeams() : state.teams.getTeams(true))){
for(Unit e : unitGroups[ally.team.ordinal()].all()){
drawStats(e);
}
}
for(Unit e : playerGroup.all()){
drawStats(e);
}
}
}
void drawStats(Unit unit){
if(unit.isDead()) return;
float x = unit.getDrawPosition().x;
float y = unit.getDrawPosition().y;
if(unit == player && snapCamera && Settings.getBool("smoothcam") && Settings.getBool("pixelate")) {
x = (int)x;
y = (int)y;
}
drawEncloser(x, y - 8f, 2f);
drawBar(Color.SCARLET, x, y - 8f, unit.health / unit.maxhealth);
drawBar(Color.valueOf("32cf6d"), x, y - 9f, unit.inventory.totalAmmo() / (float) unit.inventory.ammoCapacity());
}
public void drawBar(Color color, float x, float y, float finion){
finion = Mathf.clamp(finion);
if(finion > 0) finion = Mathf.clamp(finion + 0.2f, 0.24f, 1f);
float len = 3;
float w = (int) (len * 2 * finion) + 0.5f;
x -= 0.5f;
y += 0.5f;
Draw.color(Color.BLACK);
Lines.line(x - len + 1, y, x + len + 0.5f, y);
Draw.color(color);
if(w >= 1)
Lines.line(x - len + 1, y, x - len + w, y);
Draw.reset();
}
public void drawEncloser(float x, float y, float height){
x -= 0.5f;
y += 0.5f - (height-1f)/2f;
float len = 3;
Lines.stroke(2f + height);
Draw.color(Color.SLATE);
Lines.line(x - len - 0.5f, y, x + len + 1.5f, y, CapStyle.none);
Draw.reset();
}
public void setCameraScale(int amount){ public void setCameraScale(int amount){
targetscale = amount; targetscale = amount;
clampScale(); clampScale();

View File

@@ -49,9 +49,11 @@ public class Player extends Unit{
public boolean dashing = false; public boolean dashing = false;
public int clientid = -1; public int clientid = -1;
public int playerIndex = 0;
public boolean isLocal = false; public boolean isLocal = false;
public Timer timer = new Timer(4); public Timer timer = new Timer(4);
public float walktime; public float walktime;
public float respawntime;
private Vector2 movement = new Vector2(); private Vector2 movement = new Vector2();
@@ -66,7 +68,7 @@ public class Player extends Unit{
@Override @Override
public void onRemoteShoot(BulletType type, float x, float y, float rotation, short data) { public void onRemoteShoot(BulletType type, float x, float y, float rotation, short data) {
Weapon weapon = Upgrade.getByID(Bits.getLeftByte(data)); Weapon weapon = Upgrade.getByID(Bits.getLeftByte(data));
weapon.shoot(player, x, y, rotation, Bits.getRightByte(data) == 1); weapon.shoot(this, x, y, rotation, Bits.getRightByte(data) == 1);
} }
@Override @Override
@@ -114,8 +116,7 @@ public class Player extends Unit{
DamageArea.dynamicExplosion(x, y, flammability, explosiveness, 0f, getSize()/2f, Palette.darkFlame); DamageArea.dynamicExplosion(x, y, flammability, explosiveness, 0f, getSize()/2f, Palette.darkFlame);
Effects.sound("die", this); Effects.sound("die", this);
control.setRespawnTime(respawnduration); respawntime = respawnduration;
ui.hudfrag.fadeRespawn(true);
super.onDeath(); super.onDeath();
} }
@@ -217,6 +218,18 @@ public class Player extends Unit{
return; return;
} }
if(respawntime > 0){
respawntime -= Timers.delta();
if(respawntime <= 0){
set(world.getSpawnX(), world.getSpawnY());
heal();
add();
Effects.sound("respawn");
}
}
if(isDead()) return; if(isDead()) return;
if(mech.flying){ if(mech.flying){
@@ -229,6 +242,17 @@ public class Player extends Unit{
y = Mathf.clamp(y, 0, world.height() * tilesize); y = Mathf.clamp(y, 0, world.height() * tilesize);
} }
public void reset(){
weapon = Weapons.blaster;
team = Team.blue;
respawntime = -1;
inventory.clear();
upgrades.clear();
add();
heal();
}
protected void updateMech(){ protected void updateMech(){
Tile tile = world.tileWorld(x, y); Tile tile = world.tileWorld(x, y);
@@ -266,8 +290,8 @@ public class Player extends Unit{
boolean shooting = control.input().canShoot() && control.input().isShooting() && inventory.hasAmmo(); boolean shooting = control.input().canShoot() && control.input().isShooting() && inventory.hasAmmo();
if(shooting){ if(shooting){
weapon.update(player, true); weapon.update(this, true);
weapon.update(player, false); weapon.update(this, false);
} }
movement.limit(speed); movement.limit(speed);
@@ -320,6 +344,7 @@ public class Player extends Unit{
stream.writeBoolean(isLocal); stream.writeBoolean(isLocal);
if(isLocal){ if(isLocal){
stream.writeInt(playerIndex);
super.writeSave(stream); super.writeSave(stream);
stream.writeByte(upgrades.size); stream.writeByte(upgrades.size);
@@ -334,7 +359,8 @@ public class Player extends Unit{
boolean local = stream.readBoolean(); boolean local = stream.readBoolean();
if(local){ if(local){
player.readSaveSuper(stream); int index = stream.readInt();
players[index].readSaveSuper(stream);
} }
} }

View File

@@ -0,0 +1,218 @@
package io.anuke.mindustry.graphics;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Colors;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.game.TeamInfo.TeamData;
import io.anuke.mindustry.input.InputHandler;
import io.anuke.mindustry.input.PlaceMode;
import io.anuke.mindustry.ui.fragments.ToolFragment;
import io.anuke.mindustry.world.BlockBar;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Graphics;
import io.anuke.ucore.core.Inputs;
import io.anuke.ucore.core.Settings;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.CapStyle;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Fill;
import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.*;
import static io.anuke.mindustry.Vars.playerGroup;
public class OverlayRenderer {
public void draw(){
//draw config selected block
if(ui.configfrag.isShown()){
Tile tile = ui.configfrag.getSelectedTile();
tile.block().drawConfigure(tile);
}
int tilex = control.input().getBlockX();
int tiley = control.input().getBlockY();
if(mobile){
Vector2 vec = Graphics.world(Gdx.input.getX(0), Gdx.input.getY(0));
tilex = Mathf.scl2(vec.x, tilesize);
tiley = Mathf.scl2(vec.y, tilesize);
}
InputHandler input = control.input();
//draw placement box
if((input.recipe != null && state.inventory.hasItems(input.recipe.requirements) && (!ui.hasMouse() || mobile)
&& control.input().drawPlace())){
input.placeMode.draw(control.input().getBlockX(), control.input().getBlockY(),
control.input().getBlockEndX(), control.input().getBlockEndY());
if(input.breakMode == PlaceMode.holdDelete)
input.breakMode.draw(tilex, tiley, 0, 0);
}else if(input.breakMode.delete && control.input().drawPlace()
&& (input.recipe == null || !state.inventory.hasItems(input.recipe.requirements))
&& (input.placeMode.delete || input.breakMode.both || !mobile)){
if(input.breakMode == PlaceMode.holdDelete)
input.breakMode.draw(tilex, tiley, 0, 0);
else
input.breakMode.draw(control.input().getBlockX(), control.input().getBlockY(),
control.input().getBlockEndX(), control.input().getBlockEndY());
}
if(ui.toolfrag.confirming){
ToolFragment t = ui.toolfrag;
PlaceMode.areaDelete.draw(t.px, t.py, t.px2, t.py2);
}
Draw.reset();
//draw selected block bars and info
if(input.recipe == null && !ui.hasMouse() && !ui.configfrag.isShown()){
Tile tile = world.tileWorld(Graphics.mouseWorld().x, Graphics.mouseWorld().y);
if(tile != null && tile.block() != Blocks.air){
Tile target = tile;
if(tile.isLinked())
target = tile.getLinked();
if(showBlockDebug && target.entity != null){
Draw.color(Color.RED);
Lines.crect(target.drawx(), target.drawy(), target.block().size * tilesize, target.block().size * tilesize);
Vector2 v = new Vector2();
Draw.tcolor(Color.YELLOW);
Draw.tscl(0.25f);
Array<Object> arr = target.block().getDebugInfo(target);
StringBuilder result = new StringBuilder();
for(int i = 0; i < arr.size/2; i ++){
result.append(arr.get(i*2));
result.append(": ");
result.append(arr.get(i*2 + 1));
result.append("\n");
}
Draw.textc(result.toString(), target.drawx(), target.drawy(), v);
Draw.color(0f, 0f, 0f, 0.5f);
Fill.rect(target.drawx(), target.drawy(), v.x, v.y);
Draw.textc(result.toString(), target.drawx(), target.drawy(), v);
Draw.tscl(fontscale);
Draw.reset();
}
if(Inputs.keyDown("block_info") && target.block().isAccessible()){
Draw.color(Colors.get("accent"));
Lines.crect(target.drawx(), target.drawy(), target.block().size * tilesize, target.block().size * tilesize);
Draw.color();
}
if(target.entity != null) {
int bot = 0, top = 0;
for (BlockBar bar : target.block().bars.list()) {
float offset = Mathf.sign(bar.top) * (target.block().size / 2f * tilesize + 3f + 4f * ((bar.top ? top : bot))) +
(bar.top ? -1f : 0f);
float value = bar.value.get(target);
if(MathUtils.isEqual(value, -1f)) continue;
drawBar(bar.type.color, target.drawx(), target.drawy() + offset, value);
if (bar.top)
top++;
else
bot++;
}
}
target.block().drawSelect(target);
}
}
if(control.input().isDroppingItem()){
Vector2 v = Graphics.mouseWorld();
float size = 8;
Draw.rect(player.inventory.getItem().item.region, v.x, v.y, size, size);
Draw.color("accent");
Lines.circle(v.x, v.y, 6 + Mathf.absin(Timers.time(), 5f, 1f));
Draw.reset();
Tile tile = world.tileWorld(v.x, v.y);
if(tile != null) tile = tile.target();
if(tile != null && tile.block().acceptStack(player.inventory.getItem().item, player.inventory.getItem().amount, tile, player) > 0){
Draw.color("place");
Lines.square(tile.drawx(), tile.drawy(), tile.block().size*tilesize/2f + 1 + Mathf.absin(Timers.time(), 5f, 1f));
Draw.color();
}
}
if((!debug || showUI) && Settings.getBool("healthbars")){
for(TeamData ally : (debug ? state.teams.getTeams() : state.teams.getTeams(true))){
for(Unit e : unitGroups[ally.team.ordinal()].all()){
drawStats(e);
}
}
for(Unit e : playerGroup.all()){
drawStats(e);
}
}
}
void drawStats(Unit unit){
if(unit.isDead()) return;
float x = unit.getDrawPosition().x;
float y = unit.getDrawPosition().y;
if(unit == players[0] && players.length == 1 && snapCamera && Settings.getBool("smoothcam") && Settings.getBool("pixelate")) {
x = (int)x;
y = (int)y;
}
drawEncloser(x, y - 8f, 2f);
drawBar(Color.SCARLET, x, y - 8f, unit.health / unit.maxhealth);
drawBar(Color.valueOf("32cf6d"), x, y - 9f, unit.inventory.totalAmmo() / (float) unit.inventory.ammoCapacity());
}
public void drawBar(Color color, float x, float y, float finion){
finion = Mathf.clamp(finion);
if(finion > 0) finion = Mathf.clamp(finion + 0.2f, 0.24f, 1f);
float len = 3;
float w = (int) (len * 2 * finion) + 0.5f;
x -= 0.5f;
y += 0.5f;
Draw.color(Color.BLACK);
Lines.line(x - len + 1, y, x + len + 0.5f, y);
Draw.color(color);
if(w >= 1)
Lines.line(x - len + 1, y, x - len + w, y);
Draw.reset();
}
public void drawEncloser(float x, float y, float height){
x -= 0.5f;
y += 0.5f - (height-1f)/2f;
float len = 3;
Lines.stroke(2f + height);
Draw.color(Color.SLATE);
Lines.line(x - len - 0.5f, y, x + len + 1.5f, y, CapStyle.none);
Draw.reset();
}
}

View File

@@ -4,6 +4,7 @@ import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.input.GestureDetector; import com.badlogic.gdx.input.GestureDetector;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.NetEvents; import io.anuke.mindustry.net.NetEvents;
import io.anuke.mindustry.resource.ItemStack; import io.anuke.mindustry.resource.ItemStack;
@@ -26,7 +27,8 @@ public class AndroidInput extends InputHandler{
private float warmup; private float warmup;
private float warmupDelay = 20; private float warmupDelay = 20;
public AndroidInput(){ public AndroidInput(Player player){
super(player);
Inputs.addProcessor(new GestureDetector(20, 0.5f, 2, 0.15f, new GestureHandler(this))); Inputs.addProcessor(new GestureDetector(20, 0.5f, 2, 0.15f, new GestureHandler(this)));
} }

View File

@@ -3,6 +3,7 @@ package io.anuke.mindustry.input;
import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.NetEvents; import io.anuke.mindustry.net.NetEvents;
import io.anuke.mindustry.resource.Weapon; import io.anuke.mindustry.resource.Weapon;
@@ -23,7 +24,10 @@ public class DesktopInput extends InputHandler{
float endx, endy; float endx, endy;
private boolean enableHold = false; private boolean enableHold = false;
private boolean beganBreak; private boolean beganBreak;
private boolean rotated = false, rotatedAlt, zoomed;
public DesktopInput(Player player){
super(player);
}
@Override public float getCursorEndX(){ return endx; } @Override public float getCursorEndX(){ return endx; }
@Override public float getCursorEndY(){ return endy; } @Override public float getCursorEndY(){ return endy; }
@@ -75,27 +79,13 @@ public class DesktopInput extends InputHandler{
if(Inputs.getAxisActive("zoom") && (Inputs.keyDown("zoom_hold") || controller) if(Inputs.getAxisActive("zoom") && (Inputs.keyDown("zoom_hold") || controller)
&& !state.is(State.menu) && !ui.hasDialog()){ && !state.is(State.menu) && !ui.hasDialog()){
if((!zoomed || !controller)) { renderer.scaleCamera((int) Inputs.getAxisTapped("zoom"));
renderer.scaleCamera((int) Inputs.getAxis("zoom"));
}
zoomed = true;
}else{
zoomed = false;
} }
renderer.minimap().zoomBy(-(int)Inputs.getAxisTapped("zoom_minimap")); renderer.minimap().zoomBy(-(int)Inputs.getAxisTapped("zoom_minimap"));
if(!rotated) { rotation += Inputs.getAxisTapped("rotate_alt");
rotation += Inputs.getAxis("rotate_alt"); rotation += Inputs.getAxis("rotate");
rotated = true;
}
if(!Inputs.getAxisActive("rotate_alt")) rotated = false;
if(!rotatedAlt) {
rotation += Inputs.getAxis("rotate");
rotatedAlt = true;
}
if(!Inputs.getAxisActive("rotate")) rotatedAlt = false;
rotation = Mathf.mod(rotation, 4); rotation = Mathf.mod(rotation, 4);
@@ -192,7 +182,7 @@ public class DesktopInput extends InputHandler{
} }
if(recipe != null){ if(recipe != null){
showCursor = validPlace(tilex(), tiley(), control.input().recipe.result) && control.input().cursorNear(); showCursor = validPlace(tilex(), tiley(), recipe.result) && cursorNear();
} }
if(canBeginShoot){ if(canBeginShoot){

View File

@@ -5,6 +5,7 @@ import com.badlogic.gdx.InputAdapter;
import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.math.Interpolation;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.entities.ItemAnimationEffect; import io.anuke.mindustry.entities.ItemAnimationEffect;
import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.NetEvents; import io.anuke.mindustry.net.NetEvents;
import io.anuke.mindustry.resource.ItemStack; import io.anuke.mindustry.resource.ItemStack;
@@ -25,6 +26,7 @@ public abstract class InputHandler extends InputAdapter{
public float breaktime = 0; public float breaktime = 0;
public Recipe recipe; public Recipe recipe;
public int rotation; public int rotation;
public Player player;
public PlaceMode placeMode = mobile ? PlaceMode.cursor : PlaceMode.hold; public PlaceMode placeMode = mobile ? PlaceMode.cursor : PlaceMode.hold;
public PlaceMode breakMode = mobile ? PlaceMode.none : PlaceMode.holdDelete; public PlaceMode breakMode = mobile ? PlaceMode.none : PlaceMode.holdDelete;
public PlaceMode lastPlaceMode = placeMode; public PlaceMode lastPlaceMode = placeMode;
@@ -35,6 +37,10 @@ public abstract class InputHandler extends InputAdapter{
private Translator stackTrns = new Translator(); private Translator stackTrns = new Translator();
public InputHandler(Player player){
this.player = player;
}
public abstract void update(); public abstract void update();
public abstract float getCursorX(); public abstract float getCursorX();
public abstract float getCursorY(); public abstract float getCursorY();

View File

@@ -176,7 +176,7 @@ public class NetworkIO {
public static ByteBuffer writeServerData(){ public static ByteBuffer writeServerData(){
int maxlen = 32; int maxlen = 32;
String host = (headless ? "Server" : player.name); String host = (headless ? "Server" : players[0].name);
String map = world.getMap().name; String map = world.getMap().name;
host = host.substring(0, Math.min(host.length(), maxlen)); host = host.substring(0, Math.min(host.length(), maxlen));

View File

@@ -85,9 +85,10 @@ public class Packets {
public static class ConnectPacket implements Packet{ public static class ConnectPacket implements Packet{
public int version; public int version;
public String name; public int players;
public String[] names;
public boolean android; public boolean android;
public int color; public int[] colors;
public byte[] uuid; public byte[] uuid;
@Override @Override