From d6d6dc29dc5cca2d702a67e09c78b36b3b84996d Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 26 Dec 2019 22:44:15 -0500 Subject: [PATCH] More plugin customization / Renamed Rectangle --- core/src/mindustry/core/Control.java | 2 +- core/src/mindustry/core/NetClient.java | 10 ++++- core/src/mindustry/core/NetServer.java | 43 +++++++++++-------- core/src/mindustry/core/Renderer.java | 6 +-- core/src/mindustry/editor/MapView.java | 2 +- core/src/mindustry/entities/Damage.java | 6 +-- .../mindustry/entities/EntityCollisions.java | 10 ++--- core/src/mindustry/entities/EntityGroup.java | 8 ++-- core/src/mindustry/entities/Units.java | 6 +-- .../entities/bullet/FlakBulletType.java | 4 +- .../mindustry/entities/effect/Lightning.java | 2 +- .../src/mindustry/entities/effect/Puddle.java | 12 +++--- .../entities/traits/BuilderTrait.java | 2 +- .../mindustry/entities/traits/SolidTrait.java | 4 +- .../src/mindustry/entities/type/BaseUnit.java | 8 ++-- core/src/mindustry/entities/type/Bullet.java | 8 ++-- core/src/mindustry/entities/type/Player.java | 10 ++--- core/src/mindustry/game/EventType.java | 5 ++- core/src/mindustry/game/Rules.java | 2 + .../mindustry/graphics/MinimapRenderer.java | 2 +- .../mindustry/graphics/OverlayRenderer.java | 2 +- core/src/mindustry/input/InputHandler.java | 2 +- core/src/mindustry/io/JsonIO.java | 14 +++++- core/src/mindustry/net/Administration.java | 30 +++++++++++-- core/src/mindustry/ui/Bar.java | 2 +- .../mindustry/ui/dialogs/DeployDialog.java | 2 +- .../mindustry/ui/dialogs/TechTreeDialog.java | 4 +- .../mindustry/ui/layout/BranchTreeLayout.java | 4 +- core/src/mindustry/world/Block.java | 2 +- core/src/mindustry/world/Tile.java | 2 +- .../world/blocks/defense/DeflectorWall.java | 4 +- .../mindustry/world/blocks/defense/Door.java | 2 +- .../world/blocks/units/RepairPoint.java | 4 +- gradle.properties | 2 +- tests/src/test/java/IOTests.java | 28 +++++++++--- 35 files changed, 166 insertions(+), 90 deletions(-) diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index ef31948c82..458cb313ae 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -63,7 +63,7 @@ public class Control implements ApplicationListener, Loadable{ }); Events.on(PlayEvent.class, event -> { - player.setTeam(state.rules.pvp ? netServer.assignTeam(player, playerGroup.all()) : state.rules.defaultTeam); + player.setTeam(netServer.assignTeam(player, playerGroup.all())); player.setDead(true); player.add(); diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index 65c6122d72..96daa07041 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -160,9 +160,17 @@ public class NetClient implements ApplicationListener{ throw new ValidateException(player, "Player has sent a message above the text limit."); } + String original = message; + //check if it's a command CommandResponse response = netServer.clientCommands.handleMessage(message, player); if(response.type == ResponseType.noCommand){ //no command to handle + message = netServer.admins.filterMessage(player, message); + //supress chat message if it's filtered out + if(message == null){ + return; + } + //server console logging Log.info("&y{0}: &lb{1}", player.name, message); @@ -190,7 +198,7 @@ public class NetClient implements ApplicationListener{ } } - Events.fire(new PlayerChatEvent(player, message)); + Events.fire(new PlayerChatEvent(player, message, original)); } public static String colorizeName(int id, String name){ diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 3e325e5b31..c74f14211c 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -33,14 +33,31 @@ import static mindustry.Vars.*; public class NetServer implements ApplicationListener{ private final static int maxSnapshotSize = 430, timerBlockSync = 0; - private final static float serverSyncTime = 12, kickDuration = 30 * 1000, blockSyncTime = 60 * 10; + private final static float serverSyncTime = 12, kickDuration = 30 * 1000, blockSyncTime = 60 * 8; private final static Vec2 vector = new Vec2(); - private final static Rectangle viewport = new Rectangle(); + private final static Rect viewport = new Rect(); /** If a player goes away of their server-side coordinates by this distance, they get teleported back. */ private final static float correctDist = 16f; public final Administration admins = new Administration(); public final CommandHandler clientCommands = new CommandHandler("/"); + public TeamAssigner assigner = (player, players) -> { + if(state.rules.pvp){ + //find team with minimum amount of players and auto-assign player to that. + TeamData re = state.teams.getActive().min(data -> { + int count = 0; + for(Player other : players){ + if(other.getTeam() == data.team && other != player){ + count++; + } + } + return count; + }); + return re == null ? null : re.team; + } + + return state.rules.defaultTeam; + }; private boolean closing = false; private Interval timer = new Interval(); @@ -199,10 +216,8 @@ public class NetServer implements ApplicationListener{ con.player = player; //playing in pvp mode automatically assigns players to teams - if(state.rules.pvp){ - player.setTeam(assignTeam(player, playerGroup.all())); - Log.info("Auto-assigned player {0} to team {1}.", player.name, player.getTeam()); - } + player.setTeam(assignTeam(player, playerGroup.all())); + Log.info("Auto-assigned player {0} to team {1}.", player.name, player.getTeam()); sendWorldData(player); @@ -403,17 +418,7 @@ public class NetServer implements ApplicationListener{ } public Team assignTeam(Player current, Iterable players){ - //find team with minimum amount of players and auto-assign player to that. - TeamData re = state.teams.getActive().min(data -> { - int count = 0; - for(Player other : players){ - if(other.getTeam() == data.team && other != current){ - count++; - } - } - return count; - }); - return re == null ? null : re.team; + return assigner.assign(current, players); } public void sendWorldData(Player player){ @@ -784,4 +789,8 @@ public class NetServer implements ApplicationListener{ e.printStackTrace(); } } + + public interface TeamAssigner{ + Team assign(Player player, Iterable players); + } } diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index 94528a62d8..d4983e992a 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -41,7 +41,7 @@ public class Renderer implements ApplicationListener{ private float camerascale = targetscale; private float landscale = 0f, landTime; private float minZoomScl = Scl.scl(0.01f); - private Rectangle rect = new Rectangle(), rect2 = new Rectangle(); + private Rect rect = new Rect(), rect2 = new Rect(); private float shakeIntensity, shaketime; public Renderer(){ @@ -56,8 +56,8 @@ public class Renderer implements ApplicationListener{ Effects.setEffectProvider((effect, color, x, y, rotation, data) -> { if(effect == Fx.none) return; if(Core.settings.getBool("effects")){ - Rectangle view = camera.bounds(rect); - Rectangle pos = rect2.setSize(effect.size).setCenter(x, y); + Rect view = camera.bounds(rect); + Rect pos = rect2.setSize(effect.size).setCenter(x, y); if(view.overlaps(pos)){ diff --git a/core/src/mindustry/editor/MapView.java b/core/src/mindustry/editor/MapView.java index 4c99ffba61..6787f418ab 100644 --- a/core/src/mindustry/editor/MapView.java +++ b/core/src/mindustry/editor/MapView.java @@ -28,7 +28,7 @@ public class MapView extends Element implements GestureListener{ private boolean grid = false; private GridImage image = new GridImage(0, 0); private Vec2 vec = new Vec2(); - private Rectangle rect = new Rectangle(); + private Rect rect = new Rect(); private Vec2[][] brushPolygons = new Vec2[MapEditor.brushSizes.length][0]; private boolean drawing; diff --git a/core/src/mindustry/entities/Damage.java b/core/src/mindustry/entities/Damage.java index 3c4b130e0d..335ac96385 100644 --- a/core/src/mindustry/entities/Damage.java +++ b/core/src/mindustry/entities/Damage.java @@ -22,8 +22,8 @@ import static mindustry.Vars.*; /** Utility class for damaging in an area. */ public class Damage{ - private static Rectangle rect = new Rectangle(); - private static Rectangle hitrect = new Rectangle(); + private static Rect rect = new Rect(); + private static Rect hitrect = new Rect(); private static Vec2 tr = new Vec2(); private static GridBits bits = new GridBits(30, 30); private static IntQueue propagation = new IntQueue(); @@ -127,7 +127,7 @@ public class Damage{ Cons cons = e -> { e.hitbox(hitrect); - Rectangle other = hitrect; + Rect other = hitrect; other.y -= expand; other.x -= expand; other.width += expand * 2; diff --git a/core/src/mindustry/entities/EntityCollisions.java b/core/src/mindustry/entities/EntityCollisions.java index 6a7fefffd1..72e177d71e 100644 --- a/core/src/mindustry/entities/EntityCollisions.java +++ b/core/src/mindustry/entities/EntityCollisions.java @@ -17,11 +17,11 @@ public class EntityCollisions{ private static final float seg = 1f; //tile collisions - private Rectangle tmp = new Rectangle(); + private Rect tmp = new Rect(); private Vec2 vector = new Vec2(); private Vec2 l1 = new Vec2(); - private Rectangle r1 = new Rectangle(); - private Rectangle r2 = new Rectangle(); + private Rect r1 = new Rect(); + private Rect r2 = new Rect(); //entity collisions private Array arrOut = new Array<>(); @@ -57,7 +57,7 @@ public class EntityCollisions{ public void moveDelta(SolidTrait entity, float deltax, float deltay, boolean x){ - Rectangle rect = r1; + Rect rect = r1; entity.hitboxTile(rect); entity.hitboxTile(r2); rect.x += deltax; @@ -84,7 +84,7 @@ public class EntityCollisions{ entity.setY(entity.getY() + rect.y - r2.y); } - public boolean overlapsTile(Rectangle rect){ + public boolean overlapsTile(Rect rect){ rect.getCenter(vector); int r = 1; diff --git a/core/src/mindustry/entities/EntityGroup.java b/core/src/mindustry/entities/EntityGroup.java index d691949272..8c0ac76442 100644 --- a/core/src/mindustry/entities/EntityGroup.java +++ b/core/src/mindustry/entities/EntityGroup.java @@ -19,13 +19,13 @@ public class EntityGroup{ private final Array entitiesToRemove = new Array<>(false, 32); private final Array entitiesToAdd = new Array<>(false, 32); private final Array intersectArray = new Array<>(); - private final Rectangle intersectRect = new Rectangle(); + private final Rect intersectRect = new Rect(); private IntMap map; private QuadTree tree; private Cons removeListener; private Cons addListener; - private final Rectangle viewport = new Rectangle(); + private final Rect viewport = new Rect(); private int count = 0; public EntityGroup(int id, Class type, boolean useTree){ @@ -34,7 +34,7 @@ public class EntityGroup{ this.type = type; if(useTree){ - tree = new QuadTree<>(new Rectangle(0, 0, 0, 0)); + tree = new QuadTree<>(new Rect(0, 0, 0, 0)); } } @@ -180,7 +180,7 @@ public class EntityGroup{ /** Resizes the internal quadtree, if it is enabled.*/ public void resize(float x, float y, float w, float h){ if(useTree){ - tree = new QuadTree<>(new Rectangle(x, y, w, h)); + tree = new QuadTree<>(new Rect(x, y, w, h)); } } diff --git a/core/src/mindustry/entities/Units.java b/core/src/mindustry/entities/Units.java index 6bcd15e1c5..fac56dcc0e 100644 --- a/core/src/mindustry/entities/Units.java +++ b/core/src/mindustry/entities/Units.java @@ -12,7 +12,7 @@ import static mindustry.Vars.*; /** Utility class for unit and team interactions.*/ public class Units{ - private static Rectangle hitrect = new Rectangle(); + private static Rect hitrect = new Rect(); private static Unit result; private static float cdist; private static boolean boolResult; @@ -188,7 +188,7 @@ public class Units{ } /** Iterates over all units in a rectangle. */ - public static void nearby(Rectangle rect, Cons cons){ + public static void nearby(Rect rect, Cons cons){ nearby(rect.x, rect.y, rect.width, rect.height, cons); } @@ -208,7 +208,7 @@ public class Units{ } /** Iterates over all units that are enemies of this team. */ - public static void nearbyEnemies(Team team, Rectangle rect, Cons cons){ + public static void nearbyEnemies(Team team, Rect rect, Cons cons){ nearbyEnemies(team, rect.x, rect.y, rect.width, rect.height, cons); } diff --git a/core/src/mindustry/entities/bullet/FlakBulletType.java b/core/src/mindustry/entities/bullet/FlakBulletType.java index b68e3af59a..ead19859cc 100644 --- a/core/src/mindustry/entities/bullet/FlakBulletType.java +++ b/core/src/mindustry/entities/bullet/FlakBulletType.java @@ -1,13 +1,13 @@ package mindustry.entities.bullet; -import arc.math.geom.Rectangle; +import arc.math.geom.Rect; import arc.util.Time; import mindustry.content.Fx; import mindustry.entities.Units; import mindustry.entities.type.Bullet; public class FlakBulletType extends BasicBulletType{ - protected static Rectangle rect = new Rectangle(); + protected static Rect rect = new Rect(); protected float explodeRange = 30f; public FlakBulletType(float speed, float damage){ diff --git a/core/src/mindustry/entities/effect/Lightning.java b/core/src/mindustry/entities/effect/Lightning.java index 1e88c29df2..59b7f833fa 100644 --- a/core/src/mindustry/entities/effect/Lightning.java +++ b/core/src/mindustry/entities/effect/Lightning.java @@ -28,7 +28,7 @@ public class Lightning extends TimedEntity implements DrawTrait, TimeTrait{ public static final float lifetime = 10f; private static final RandomXS128 random = new RandomXS128(); - private static final Rectangle rect = new Rectangle(); + private static final Rect rect = new Rect(); private static final Array entities = new Array<>(); private static final IntSet hit = new IntSet(); private static final int maxChain = 8; diff --git a/core/src/mindustry/entities/effect/Puddle.java b/core/src/mindustry/entities/effect/Puddle.java index e2d5d2e10c..132c2d1379 100644 --- a/core/src/mindustry/entities/effect/Puddle.java +++ b/core/src/mindustry/entities/effect/Puddle.java @@ -27,8 +27,8 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai private static final float maxLiquid = 70f; private static final int maxGeneration = 2; private static final Color tmp = new Color(); - private static final Rectangle rect = new Rectangle(); - private static final Rectangle rect2 = new Rectangle(); + private static final Rect rect = new Rect(); + private static final Rect rect2 = new Rect(); private static int seeds; private int loadedPosition = -1; @@ -151,13 +151,13 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai } @Override - public void hitbox(Rectangle rectangle){ - rectangle.setCenter(x, y).setSize(tilesize); + public void hitbox(Rect rect){ + rect.setCenter(x, y).setSize(tilesize); } @Override - public void hitboxTile(Rectangle rectangle){ - rectangle.setCenter(x, y).setSize(0f); + public void hitboxTile(Rect rect){ + rect.setCenter(x, y).setSize(0f); } @Override diff --git a/core/src/mindustry/entities/traits/BuilderTrait.java b/core/src/mindustry/entities/traits/BuilderTrait.java index 2f302be8e6..02ae0bca5b 100644 --- a/core/src/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/mindustry/entities/traits/BuilderTrait.java @@ -343,7 +343,7 @@ public interface BuilderTrait extends Entity, TeamTrait{ return this; } - public Rectangle bounds(Rectangle rect){ + public Rect bounds(Rect rect){ if(breaking){ return rect.set(-100f, -100f, 0f, 0f); }else{ diff --git a/core/src/mindustry/entities/traits/SolidTrait.java b/core/src/mindustry/entities/traits/SolidTrait.java index f799f13cba..afa2efd6b0 100644 --- a/core/src/mindustry/entities/traits/SolidTrait.java +++ b/core/src/mindustry/entities/traits/SolidTrait.java @@ -7,9 +7,9 @@ import mindustry.Vars; public interface SolidTrait extends QuadTreeObject, MoveTrait, VelocityTrait, Entity, Position{ - void hitbox(Rectangle rectangle); + void hitbox(Rect rect); - void hitboxTile(Rectangle rectangle); + void hitboxTile(Rect rect); Vec2 lastPosition(); diff --git a/core/src/mindustry/entities/type/BaseUnit.java b/core/src/mindustry/entities/type/BaseUnit.java index 03b4f2d0de..6062662e9b 100644 --- a/core/src/mindustry/entities/type/BaseUnit.java +++ b/core/src/mindustry/entities/type/BaseUnit.java @@ -352,13 +352,13 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ } @Override - public void hitbox(Rectangle rectangle){ - rectangle.setSize(type.hitsize).setCenter(x, y); + public void hitbox(Rect rect){ + rect.setSize(type.hitsize).setCenter(x, y); } @Override - public void hitboxTile(Rectangle rectangle){ - rectangle.setSize(type.hitsizeTile).setCenter(x, y); + public void hitboxTile(Rect rect){ + rect.setSize(type.hitsizeTile).setCenter(x, y); } @Override diff --git a/core/src/mindustry/entities/type/Bullet.java b/core/src/mindustry/entities/type/Bullet.java index 6afafb5f29..f7e676ecc9 100644 --- a/core/src/mindustry/entities/type/Bullet.java +++ b/core/src/mindustry/entities/type/Bullet.java @@ -246,13 +246,13 @@ public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Pool } @Override - public void hitbox(Rectangle rectangle){ - rectangle.setSize(type.hitSize).setCenter(x, y); + public void hitbox(Rect rect){ + rect.setSize(type.hitSize).setCenter(x, y); } @Override - public void hitboxTile(Rectangle rectangle){ - rectangle.setSize(type.hitSize).setCenter(x, y); + public void hitboxTile(Rect rect){ + rect.setSize(type.hitSize).setCenter(x, y); } @Override diff --git a/core/src/mindustry/entities/type/Player.java b/core/src/mindustry/entities/type/Player.java index a6a74683bb..af5165fc60 100644 --- a/core/src/mindustry/entities/type/Player.java +++ b/core/src/mindustry/entities/type/Player.java @@ -41,7 +41,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ private static final int timerShootRight = 1; private static final float liftoffBoost = 0.2f; - private static final Rectangle rect = new Rectangle(); + private static final Rect rect = new Rect(); //region instance variables @@ -93,13 +93,13 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ } @Override - public void hitbox(Rectangle rectangle){ - rectangle.setSize(mech.hitsize).setCenter(x, y); + public void hitbox(Rect rect){ + rect.setSize(mech.hitsize).setCenter(x, y); } @Override - public void hitboxTile(Rectangle rectangle){ - rectangle.setSize(mech.hitsize * 2f / 3f).setCenter(x, y); + public void hitboxTile(Rect rect){ + rect.setSize(mech.hitsize * 2f / 3f).setCenter(x, y); } @Override diff --git a/core/src/mindustry/game/EventType.java b/core/src/mindustry/game/EventType.java index cf26f06fec..dfa1469fc1 100644 --- a/core/src/mindustry/game/EventType.java +++ b/core/src/mindustry/game/EventType.java @@ -62,10 +62,13 @@ public class EventType{ public static class PlayerChatEvent{ public final Player player; public final String message; + /** The original, unfiltered message. */ + public final String originalMessage; - public PlayerChatEvent(Player player, String message){ + public PlayerChatEvent(Player player, String message, String originalMessage){ this.player = player; this.message = message; + this.originalMessage = originalMessage; } } diff --git a/core/src/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java index d910952021..93ceaf5cfe 100644 --- a/core/src/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -82,6 +82,8 @@ public class Rules{ public Team defaultTeam = Team.sharded; /** team of the enemy in waves/sectors */ public Team waveTeam = Team.crux; + /** special tags for additional info */ + public StringMap tags = new StringMap(); /** Copies this ruleset exactly. Not very efficient at all, do not use often. */ public Rules copy(){ diff --git a/core/src/mindustry/graphics/MinimapRenderer.java b/core/src/mindustry/graphics/MinimapRenderer.java index ffeadc98da..60f3d2974b 100644 --- a/core/src/mindustry/graphics/MinimapRenderer.java +++ b/core/src/mindustry/graphics/MinimapRenderer.java @@ -25,7 +25,7 @@ public class MinimapRenderer implements Disposable{ private Pixmap pixmap; private Texture texture; private TextureRegion region; - private Rectangle rect = new Rectangle(); + private Rect rect = new Rect(); private float zoom = 4; public MinimapRenderer(){ diff --git a/core/src/mindustry/graphics/OverlayRenderer.java b/core/src/mindustry/graphics/OverlayRenderer.java index 3c65c1b9f4..c0cd917952 100644 --- a/core/src/mindustry/graphics/OverlayRenderer.java +++ b/core/src/mindustry/graphics/OverlayRenderer.java @@ -22,7 +22,7 @@ import static mindustry.Vars.*; public class OverlayRenderer{ private static final float indicatorLength = 14f; private static final float spawnerMargin = tilesize*11f; - private static final Rectangle rect = new Rectangle(); + private static final Rect rect = new Rect(); private float buildFadeTime; public void drawBottom(){ diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index b35683c7e2..4a6ffb575b 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -44,7 +44,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ /** Maximum line length. */ final static int maxLength = 100; final static Vec2 stackTrns = new Vec2(); - final static Rectangle r1 = new Rectangle(), r2 = new Rectangle(); + final static Rect r1 = new Rect(), r2 = new Rect(); /** Distance on the back from where items originate. */ final static float backTrns = 3f; diff --git a/core/src/mindustry/io/JsonIO.java b/core/src/mindustry/io/JsonIO.java index 7c570bace8..ef37dd9d65 100644 --- a/core/src/mindustry/io/JsonIO.java +++ b/core/src/mindustry/io/JsonIO.java @@ -20,7 +20,7 @@ public class JsonIO{ @Override public void writeValue(Object value, Class knownType, Class elementType){ - if(value instanceof mindustry.ctype.MappableContent){ + if(value instanceof MappableContent){ try{ getWriter().value(((MappableContent)value).name); }catch(IOException e){ @@ -95,6 +95,18 @@ public class JsonIO{ } }); + json.setSerializer(Team.class, new Serializer(){ + @Override + public void write(Json json, Team object, Class knownType){ + json.writeValue(object.id); + } + + @Override + public Team read(Json json, JsonValue jsonData, Class type){ + return Team.get(jsonData.asInt()); + } + }); + json.setSerializer(Block.class, new Serializer(){ @Override public void write(Json json, Block object, Class knownType){ diff --git a/core/src/mindustry/net/Administration.java b/core/src/mindustry/net/Administration.java index cd490eed04..dabf679d34 100644 --- a/core/src/mindustry/net/Administration.java +++ b/core/src/mindustry/net/Administration.java @@ -1,10 +1,11 @@ package mindustry.net; import arc.*; -import mindustry.annotations.Annotations.*; import arc.struct.*; -import mindustry.Vars; - +import arc.util.ArcAnnotate.*; +import mindustry.*; +import mindustry.annotations.Annotations.*; +import mindustry.entities.type.*; import static mindustry.Vars.headless; import static mindustry.game.EventType.*; @@ -14,6 +15,7 @@ public class Administration{ private ObjectMap playerInfo = new ObjectMap<>(); private Array bannedIPs = new Array<>(); private Array whitelist = new Array<>(); + private Array chatFilters = new Array<>(); public Administration(){ Core.settings.defaults( @@ -24,6 +26,23 @@ public class Administration{ load(); } + /** Adds a chat filter. This will transform the chat messages of every player. + * This functionality can be used to implement things like swear filters and special commands. + * Note that commands (starting with /) are not filtered.*/ + public void addChatFilter(ChatFilter filter){ + chatFilters.add(filter); + } + + /** Filters out a chat message. */ + public @Nullable String filterMessage(Player player, String message){ + String current = message; + for(ChatFilter f : chatFilters){ + current = f.filter(player, message); + if(current == null) return null; + } + return current; + } + public int getPlayerLimit(){ return Core.settings.getInt("playerlimit", 0); } @@ -334,6 +353,11 @@ public class Administration{ } } + public interface ChatFilter{ + /** @return the filtered message; a null string signals that the message should not be sent. */ + @Nullable String filter(Player player, String message); + } + public static class TraceInfo{ public String ip, uuid; public boolean modded, mobile; diff --git a/core/src/mindustry/ui/Bar.java b/core/src/mindustry/ui/Bar.java index c04a25167f..8c23ec0ad3 100644 --- a/core/src/mindustry/ui/Bar.java +++ b/core/src/mindustry/ui/Bar.java @@ -12,7 +12,7 @@ import arc.util.pooling.*; import mindustry.gen.*; public class Bar extends Element{ - private static Rectangle scissor = new Rectangle(); + private static Rect scissor = new Rect(); private Floatp fraction; private String name = ""; diff --git a/core/src/mindustry/ui/dialogs/DeployDialog.java b/core/src/mindustry/ui/dialogs/DeployDialog.java index dda43d0e13..811caca161 100644 --- a/core/src/mindustry/ui/dialogs/DeployDialog.java +++ b/core/src/mindustry/ui/dialogs/DeployDialog.java @@ -33,7 +33,7 @@ public class DeployDialog extends FloatingDialog{ private final float nodeSize = Scl.scl(230f); private ObjectSet nodes = new ObjectSet<>(); private ZoneInfoDialog info = new ZoneInfoDialog(); - private Rectangle bounds = new Rectangle(); + private Rect bounds = new Rect(); private View view = new View(); public DeployDialog(){ diff --git a/core/src/mindustry/ui/dialogs/TechTreeDialog.java b/core/src/mindustry/ui/dialogs/TechTreeDialog.java index 6bbb249a66..0d28af70c5 100644 --- a/core/src/mindustry/ui/dialogs/TechTreeDialog.java +++ b/core/src/mindustry/ui/dialogs/TechTreeDialog.java @@ -31,7 +31,7 @@ public class TechTreeDialog extends FloatingDialog{ private final float nodeSize = Scl.scl(60f); private ObjectSet nodes = new ObjectSet<>(); private TechTreeNode root = new TechTreeNode(TechTree.root, null); - private Rectangle bounds = new Rectangle(); + private Rect bounds = new Rect(); private ItemsDisplay items; private View view; @@ -123,7 +123,7 @@ public class TechTreeDialog extends FloatingDialog{ miny = Math.min(n.y - n.height/2f, miny); maxy = Math.max(n.y + n.height/2f, maxy); } - bounds = new Rectangle(minx, miny, maxx - minx, maxy - miny); + bounds = new Rect(minx, miny, maxx - minx, maxy - miny); bounds.y += nodeSize*1.5f; } diff --git a/core/src/mindustry/ui/layout/BranchTreeLayout.java b/core/src/mindustry/ui/layout/BranchTreeLayout.java index b012d68e71..07c3fb5497 100644 --- a/core/src/mindustry/ui/layout/BranchTreeLayout.java +++ b/core/src/mindustry/ui/layout/BranchTreeLayout.java @@ -66,8 +66,8 @@ public class BranchTreeLayout implements TreeLayout{ } } - public Rectangle getBounds(){ - return new Rectangle(boundsLeft, boundsBottom, boundsRight - boundsLeft, boundsTop - boundsBottom); + public Rect getBounds(){ + return new Rect(boundsLeft, boundsBottom, boundsRight - boundsLeft, boundsTop - boundsBottom); } private void calcSizeOfLevels(TreeNode node, int level){ diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index 9bd64f023a..9bec4cd0f6 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -864,7 +864,7 @@ public class Block extends BlockStorage{ return ((size + 1) % 2) * tilesize / 2f; } - public Rectangle bounds(int x, int y, Rectangle rect){ + public Rect bounds(int x, int y, Rect rect){ return rect.setSize(size * tilesize).setCenter(x * tilesize + offset(), y * tilesize + offset()); } diff --git a/core/src/mindustry/world/Tile.java b/core/src/mindustry/world/Tile.java index c591307176..0572c74286 100644 --- a/core/src/mindustry/world/Tile.java +++ b/core/src/mindustry/world/Tile.java @@ -327,7 +327,7 @@ public class Tile implements Position, TargetTrait{ return tmpArray; } - public Rectangle getHitbox(Rectangle rect){ + public Rect getHitbox(Rect rect){ return rect.setSize(block().size * tilesize).setCenter(drawx(), drawy()); } diff --git a/core/src/mindustry/world/blocks/defense/DeflectorWall.java b/core/src/mindustry/world/blocks/defense/DeflectorWall.java index cf8f54a8ce..ae535ca8a6 100644 --- a/core/src/mindustry/world/blocks/defense/DeflectorWall.java +++ b/core/src/mindustry/world/blocks/defense/DeflectorWall.java @@ -15,8 +15,8 @@ public class DeflectorWall extends Wall{ public static final float hitTime = 10f; protected float maxDamageDeflect = 10f; - protected Rectangle rect = new Rectangle(); - protected Rectangle rect2 = new Rectangle(); + protected Rect rect = new Rect(); + protected Rect rect2 = new Rect(); public DeflectorWall(String name){ super(name); diff --git a/core/src/mindustry/world/blocks/defense/Door.java b/core/src/mindustry/world/blocks/defense/Door.java index 27a0d26bff..df75416207 100644 --- a/core/src/mindustry/world/blocks/defense/Door.java +++ b/core/src/mindustry/world/blocks/defense/Door.java @@ -18,7 +18,7 @@ import java.io.*; import static mindustry.Vars.*; public class Door extends Wall{ - protected final static Rectangle rect = new Rectangle(); + protected final static Rect rect = new Rect(); public final int timerToggle = timers++; public Effect openfx = Fx.dooropen; diff --git a/core/src/mindustry/world/blocks/units/RepairPoint.java b/core/src/mindustry/world/blocks/units/RepairPoint.java index 183404148d..a17fffe1b1 100644 --- a/core/src/mindustry/world/blocks/units/RepairPoint.java +++ b/core/src/mindustry/world/blocks/units/RepairPoint.java @@ -6,7 +6,7 @@ import arc.graphics.Color; import arc.graphics.g2d.*; import arc.math.Angles; import arc.math.Mathf; -import arc.math.geom.Rectangle; +import arc.math.geom.Rect; import arc.util.Time; import mindustry.entities.Units; import mindustry.entities.type.TileEntity; @@ -19,7 +19,7 @@ import mindustry.world.meta.*; import static mindustry.Vars.tilesize; public class RepairPoint extends Block{ - private static Rectangle rect = new Rectangle(); + private static Rect rect = new Rect(); public int timerTarget = timers++; diff --git a/gradle.properties b/gradle.properties index f8748c523a..19101944cf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=29782072a3c824715118f51ebe23c189ba0d9597 +archash=60a9ebe264f92f2c3082596c77b9ab29474c4a7f diff --git a/tests/src/test/java/IOTests.java b/tests/src/test/java/IOTests.java index 240334f6dd..79f7a213cf 100644 --- a/tests/src/test/java/IOTests.java +++ b/tests/src/test/java/IOTests.java @@ -1,11 +1,11 @@ +import arc.util.*; import mindustry.game.*; -import mindustry.io.TypeIO; -import org.junit.jupiter.api.Test; +import mindustry.io.*; +import org.junit.jupiter.api.*; -import java.nio.ByteBuffer; +import java.nio.*; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.*; public class IOTests{ @@ -49,5 +49,23 @@ public class IOTests{ assertEquals(rules.attackMode, res.attackMode); } + @Test + void writeRules2(){ + Rules rules = new Rules(); + rules.attackMode = true; + rules.tags.put("blah", "bleh"); + rules.buildSpeedMultiplier = 99.1f; + String str = JsonIO.write(rules); + Rules res = JsonIO.read(Rules.class, str); + + assertEquals(rules.buildSpeedMultiplier, res.buildSpeedMultiplier); + assertEquals(rules.attackMode, res.attackMode); + assertEquals(rules.tags.get("blah"), res.tags.get("blah")); + + String str2 = JsonIO.write(new Rules(){{ + attackMode = true; + }}); + Log.info(str2); + } }