From 1e63236cc40401b29d7616d241fca3854663f55e Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 16 Jan 2018 15:00:46 -0500 Subject: [PATCH] Made friendly fire an option --- build.gradle | 2 +- core/assets-raw/sprites/icon-iron.png | Bin 301 -> 292 bytes core/assets/bundles/bundle.properties | 5 +-- core/assets/sprites/sprites.png | Bin 81432 -> 81433 bytes core/src/io/anuke/mindustry/core/Control.java | 30 ++++++++++++------ .../io/anuke/mindustry/core/NetClient.java | 4 ++- .../io/anuke/mindustry/core/NetServer.java | 12 +++++-- .../io/anuke/mindustry/entities/Player.java | 6 ++++ .../mindustry/{io => net}/NetworkIO.java | 7 ++-- core/src/io/anuke/mindustry/net/Packets.java | 4 +++ .../io/anuke/mindustry/net/Registrator.java | 1 + .../ui/fragments/PlayerListFragment.java | 7 ++++ .../blocks/types/distribution/Conveyor.java | 20 +++++++++--- 13 files changed, 76 insertions(+), 22 deletions(-) rename core/src/io/anuke/mindustry/{io => net}/NetworkIO.java (96%) diff --git a/build.gradle b/build.gradle index 00b308c67f..cfc4e155fb 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ allprojects { appName = "Mindustry" gdxVersion = '1.9.8' aiVersion = '1.8.1' - uCoreVersion = '49d8aecf9c'; + uCoreVersion = 'e6a13f6507'; } repositories { diff --git a/core/assets-raw/sprites/icon-iron.png b/core/assets-raw/sprites/icon-iron.png index 3998196a99c11d1be0c49680324e1e4a7be078c6..46b05fb505485d15e5bd1b3b66b9fabb843dfc89 100644 GIT binary patch delta 222 zcmZ3>w1jDbmf>@TOAP0qCC)p~z`(#+;1OBOz`!jG!i)^F=12eq*-JcqUD+Qo3JB^8 z&d=O`Z(_7YeUGP$V~E7%h=;N zC2glL4s*sx!Cjd?JU}2SD$29{zrmr{`sbfm+ulA`(l;^!TDCz!x_u1?8-v#++X;WX S7e4|zmci52&t;ucLK6W0e^OBZ delta 231 zcmVy{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2jT$^7dr}%>HT?;TPS~(Nkl&+{cAZ!7gb9}zPXkV2D h&)3@kjP#s_LjDymKDwU74=Mlv002ovPDHLkV1gd(TLAz7 diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 43abd9ee43..f7f46f938e 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -32,6 +32,7 @@ text.hosts.discovering=Discovering LAN games text.server.refreshing=Refreshing server text.hosts.none=[lightgray]No LAN games found! text.host.invalid=[scarlet]Can't connect to host. +text.server.friendlyfire=Friendly Fire text.server.add=Add Server text.server.delete=Are you sure you want to delete this server? text.server.hostname=Host: {0} @@ -416,9 +417,9 @@ block.pump.fulldescription=Pumps liquids from a source block- usually water, lav block.fluxpump.name=fluxpump block.fluxpump.fulldescription=An advanced version of the pump. Stores more liquid and pumps liquid faster. block.smelter.name=smelter -block.smelter.fulldescription=The essential crafting block. When inputted 1x iron and 1x coal, outputs one steel. +block.smelter.fulldescription=The essential crafting block. When inputted 1 iron and 1 coal as fuel, outputs one steel. It is advised to input iron and coal on different belts to prevent clogging. block.crucible.name=crucible -block.crucible.fulldescription=An advanced crafting block. When inputted 1x titanium and 1x steel, outputs one dirium. +block.crucible.fulldescription=An advanced crafting block. When inputted 1 titanium, 1 steel and 1 coal as fuel, outputs one dirium. It is advised to input coal, steel and titanium on different belts to prevent clogging. block.coalpurifier.name=coal extractor block.coalpurifier.fulldescription=A basic extractor block. Outputs coal when supplied with large amounts of water and stone. block.titaniumpurifier.name=titanium extractor diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index 0882aaae5a0ed523deebaec573aedee9a25f41a7..f45f6930d127735213b349adfccdef79346c89d5 100644 GIT binary patch delta 14918 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 hO-kII$KtSx%6^a&wG~&5>OR`5s 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 diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 31e62f3f45..06f121405a 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -75,6 +75,7 @@ public class Control extends Module{ float respawntime; InputHandler input; + boolean friendlyFire; private InputProxy proxy; private float controlx, controly; @@ -218,14 +219,6 @@ public class Control extends Module{ saves.load(); } - - public Saves getSaves(){ - return saves; - } - - public boolean showCursor(){ - return controlling; - } public void reset(){ weapons.clear(); @@ -277,7 +270,26 @@ public class Control extends Module{ GameState.set(State.playing); } - + + public Saves getSaves(){ + return saves; + } + + public boolean showCursor(){ + return controlling; + } + + public boolean isFriendlyFire() { + return friendlyFire; + } + + public void setFriendlyFire(boolean friendlyFire) { + if(this.friendlyFire != friendlyFire && Net.active() && Net.server()){ + Vars.netServer.handleFriendlyFireChange(friendlyFire); + } + this.friendlyFire = friendlyFire; + } + public Tile getCore(){ return core; } diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index b2d3ea1c4e..1c53359df0 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -13,7 +13,7 @@ import io.anuke.mindustry.entities.SyncEntity; import io.anuke.mindustry.entities.enemies.Enemy; import io.anuke.mindustry.entities.enemies.EnemyType; import io.anuke.mindustry.graphics.Fx; -import io.anuke.mindustry.io.NetworkIO; +import io.anuke.mindustry.net.NetworkIO; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net.SendMode; import io.anuke.mindustry.net.Packets.*; @@ -319,6 +319,8 @@ public class NetClient extends Module { kicked = true; Gdx.app.postRunnable(ui.restart::show); }); + + Net.handle(FriendlyFireChangePacket.class, packet -> Vars.control.setFriendlyFire(packet.enabled)); } @Override diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index f73b14d351..ad1d7e02af 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.SyncEntity; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.enemies.Enemy; -import io.anuke.mindustry.io.NetworkIO; +import io.anuke.mindustry.net.NetworkIO; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net.SendMode; import io.anuke.mindustry.net.Packets.*; @@ -220,6 +220,15 @@ public class NetServer extends Module{ Gdx.app.postRunnable(() -> Vars.ui.chatfrag.addMessage(message, null)); } + public void handleFriendlyFireChange(boolean enabled){ + FriendlyFireChangePacket packet = new FriendlyFireChangePacket(); + packet.enabled = enabled; + + sendMessage(enabled ? "[accent]Friendly fire enabled." : "[accent]Friendly fire disabled."); + + Net.send(packet, SendMode.tcp); + } + public void handleGameOver(){ Net.send(new GameOverPacket(), SendMode.tcp); Timers.runTask(30f, () -> GameState.set(State.menu)); @@ -303,7 +312,6 @@ public class NetServer extends Module{ current = ByteBuffer.wrap(bytes); //write the group ID so the client knows which group this is current.put((byte)group.getID()); - UCore.log(" Writing new packet: " + i); } SyncEntity entity = (SyncEntity) group.all().get(i); diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index b81b5531c5..e4d84f769f 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -50,6 +50,12 @@ public class Player extends SyncEntity{ @Override public boolean collides(SolidEntity other){ + if(other instanceof Bullet){ + Bullet b = (Bullet)other; + if(!Vars.control.isFriendlyFire() && b.owner instanceof Player){ + return false; + } + } return super.collides(other) && !isAndroid; } diff --git a/core/src/io/anuke/mindustry/io/NetworkIO.java b/core/src/io/anuke/mindustry/net/NetworkIO.java similarity index 96% rename from core/src/io/anuke/mindustry/io/NetworkIO.java rename to core/src/io/anuke/mindustry/net/NetworkIO.java index b4bffa9650..642ded251e 100644 --- a/core/src/io/anuke/mindustry/io/NetworkIO.java +++ b/core/src/io/anuke/mindustry/net/NetworkIO.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.io; +package io.anuke.mindustry.net; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.ByteArray; @@ -19,7 +19,7 @@ import io.anuke.ucore.entities.Entities; import java.io.*; public class NetworkIO { - private static final int fileVersionID = 15; + private static final int fileVersionID = 16; public static void write(int playerID, ByteArray upgrades, OutputStream os){ @@ -38,6 +38,7 @@ public class NetworkIO { stream.writeFloat(Vars.control.getWaveCountdown()); //wave countdown stream.writeInt(Vars.control.enemyGroup.amount()); //enemy amount + stream.writeBoolean(Vars.control.isFriendlyFire()); //friendly fire state stream.writeInt(playerID); //player remap ID //--INVENTORY-- @@ -168,9 +169,11 @@ public class NetworkIO { int wave = stream.readInt(); float wavetime = stream.readFloat(); int enemies = stream.readInt(); + boolean friendlyfire = stream.readBoolean(); Vars.control.setWaveData(enemies, wave, wavetime); Vars.control.setMode(GameMode.values()[mode]); + Vars.control.setFriendlyFire(friendlyfire); int pid = stream.readInt(); diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java index 24eb2b2bd9..0cdabc7280 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -137,4 +137,8 @@ public class Packets { public static class GameOverPacket{ } + + public static class FriendlyFireChangePacket{ + public boolean enabled; + } } diff --git a/core/src/io/anuke/mindustry/net/Registrator.java b/core/src/io/anuke/mindustry/net/Registrator.java index 27904dcc3b..a551a4c87e 100644 --- a/core/src/io/anuke/mindustry/net/Registrator.java +++ b/core/src/io/anuke/mindustry/net/Registrator.java @@ -39,6 +39,7 @@ public class Registrator { EntityRequestPacket.class, ConnectConfirmPacket.class, GameOverPacket.class, + FriendlyFireChangePacket.class, Class.class, byte[].class, diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java index b1a2ce3854..f053a37e01 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java @@ -31,6 +31,13 @@ public class PlayerListFragment implements Fragment{ pane.setScrollingDisabled(true, false); pane.setFadeScrollBars(false); add(pane).grow(); + row(); + new table("pane"){{ + margin(12f); + get().addCheck("$text.server.friendlyfire", b -> { + Vars.control.setFriendlyFire(b); + }).growX().update(i -> i.setChecked(Vars.control.isFriendlyFire())).disabled(b -> Net.client()); + }}.pad(10f).growX().end(); }}.end(); update(t -> { 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 fb6c983217..a21524988e 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 @@ -18,8 +18,6 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.AbstractList; -import java.util.Collections; -import java.util.Comparator; import java.util.List; import static io.anuke.mindustry.Vars.tilesize; @@ -74,6 +72,8 @@ public class Conveyor extends Block{ for(int i = 0; i < entity.convey.size; i ++){ ItemPos pos = pos1.set(entity.convey.get(i)); + + if(pos.item == null) continue; Tmp.v1.set(tilesize, 0).rotate(rotation * 90); Tmp.v2.set(-tilesize / 2, pos.x*tilesize/2).rotate(rotation * 90); @@ -97,6 +97,11 @@ public class Conveyor extends Block{ for(int i = 0; i < entity.convey.size; i ++){ int value = entity.convey.get(i); ItemPos pos = pos1.set(value); + + if(pos.item == null){ + removals.add(value); + continue; + } boolean canmove = i == entity.convey.size - 1 || !(pos2.set(entity.convey.get(i + 1)).y - pos.y < itemSpace * Timers.delta()); @@ -230,10 +235,10 @@ public class Conveyor extends Block{ } }; - Collections.sort(wrapper, new Comparator(){public int compare(Object a, Object b){ return compareItems((Integer)a, (Integer)b); }}); + wrapper.sort(Conveyor::compareItems); } - private static int compareItems(int a, int b){ + private static int compareItems(Integer a, Integer b){ pos1.set(a); pos2.set(b); return Float.compare(pos1.y, pos2.y); @@ -249,7 +254,12 @@ public class Conveyor extends Block{ ItemPos set(int value){ byte[] values = Bits.getBytes(value); - item = Item.getAllItems().get(values[0]); + + if(values[0] > Item.getAllItems().size) + item = null; + else + item = Item.getAllItems().get(values[0]); + x = values[1] / 127f; y = ((int)values[2] + 128) / 255f; seed = values[3];