From 99fafc47f20f870a8bd27ee859e4009a921c160a Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 30 Jul 2020 14:24:23 -0400 Subject: [PATCH] Bugfixes --- core/src/mindustry/core/Logic.java | 31 ++++++---- core/src/mindustry/mod/Scripts.java | 2 +- core/src/mindustry/type/ItemSeq.java | 30 +++++++++- core/src/mindustry/type/Sector.java | 58 +++++++++---------- .../mindustry/ui/dialogs/ResearchDialog.java | 7 +-- .../mindustry/ui/fragments/HudFragment.java | 3 +- .../world/blocks/campaign/LaunchPad.java | 11 +--- .../world/blocks/distribution/ItemBridge.java | 2 + .../blocks/distribution/OverflowGate.java | 3 + 9 files changed, 88 insertions(+), 59 deletions(-) diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index 674c6f28ac..180e34f8b4 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -2,7 +2,6 @@ package mindustry.core; import arc.*; import arc.math.*; -import arc.struct.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; @@ -88,27 +87,35 @@ public class Logic implements ApplicationListener{ //when loading a 'damaged' sector, propagate the damage Events.on(WorldLoadEvent.class, e -> { - if(state.isCampaign() && state.rules.sector.getSecondsPassed() > 0 && state.rules.sector.hasBase()){ + if(state.isCampaign()){ long seconds = state.rules.sector.getSecondsPassed(); CoreEntity core = state.rules.defaultTeam.core(); - //update correct storage capacity - state.rules.sector.save.meta.secinfo.storageCapacity = core.storageCapacity; - //apply fractional damage based on how many turns have passed for this sector float turnsPassed = seconds / (turnDuration / 60f); - if(state.rules.sector.hasWaves()){ + if(state.rules.sector.hasWaves() && turnsPassed > 0 && state.rules.sector.hasBase()){ SectorDamage.apply(turnsPassed / sectorDestructionTurns); } //add resources based on turns passed if(state.rules.sector.save != null && core != null){ - //add new items recieved - state.rules.sector.calculateRecievedItems().each((item, amount) -> core.items.add(item, amount)); + //update correct storage capacity + state.rules.sector.save.meta.secinfo.storageCapacity = core.storageCapacity; + + //add new items received + state.rules.sector.calculateReceivedItems().each((item, amount) -> core.items.add(item, amount)); //clear received items - state.rules.sector.setReceivedItems(new Seq<>()); + state.rules.sector.setExtraItems(new ItemSeq()); + + //validation + for(Item item : content.items()){ + //ensure positive items + if(core.items.get(item) < 0) core.items.set(item, 0); + //cap the items + if(core.items.get(item) > core.storageCapacity) core.items.set(item, core.storageCapacity); + } } state.rules.sector.setSecondsPassed(0); @@ -262,15 +269,15 @@ public class Logic implements ApplicationListener{ Time.runTask(30f, () -> { Sector origin = sector.save.meta.secinfo.origin; if(origin != null){ - Seq stacks = origin.getReceivedItems(); + ItemSeq stacks = origin.getExtraItems(); //add up all items into list for(Building entity : state.teams.playerCores()){ - entity.items.each((item, amount) -> ItemStack.insert(stacks, item, amount)); + entity.items.each(stacks::add); } //save received items - origin.setReceivedItems(stacks); + origin.setExtraItems(stacks); } //remove all the cores diff --git a/core/src/mindustry/mod/Scripts.java b/core/src/mindustry/mod/Scripts.java index 2fef2522fb..19600763b0 100644 --- a/core/src/mindustry/mod/Scripts.java +++ b/core/src/mindustry/mod/Scripts.java @@ -17,7 +17,7 @@ import java.net.*; import java.util.regex.*; public class Scripts implements Disposable{ - private final Seq blacklist = Seq.with("net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk", + private final Seq blacklist = Seq.with(".net.", "java.net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk", "runtime", "util.os", "rmi", "security", "org.", "sun.", "beans", "sql", "http", "exec", "compiler", "process", "system", ".awt", "socket", "classloader", "oracle", "invoke", "java.util.function", "java.util.stream"); private final Seq whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen."); diff --git a/core/src/mindustry/type/ItemSeq.java b/core/src/mindustry/type/ItemSeq.java index a7d528cf54..af8436bf44 100644 --- a/core/src/mindustry/type/ItemSeq.java +++ b/core/src/mindustry/type/ItemSeq.java @@ -1,13 +1,16 @@ package mindustry.type; import arc.struct.*; +import arc.util.serialization.*; +import arc.util.serialization.Json.*; import mindustry.*; +import mindustry.io.*; import mindustry.world.modules.*; import mindustry.world.modules.ItemModule.*; import java.util.*; -public class ItemSeq implements Iterable{ +public class ItemSeq implements Iterable, Serializable{ private final static ItemStack tmp = new ItemStack(); protected final int[] values; @@ -19,7 +22,7 @@ public class ItemSeq implements Iterable{ public void each(ItemConsumer cons){ for(int i = 0; i < values.length; i++){ - if(values[i] > 0){ + if(values[i] != 0){ cons.accept(Vars.content.item(i), values[i]); } } @@ -28,7 +31,7 @@ public class ItemSeq implements Iterable{ public Seq toSeq(){ Seq out = new Seq<>(); for(int i = 0; i < values.length; i++){ - if(values[i] > 0) out.add(new ItemStack(Vars.content.item(i), values[i])); + if(values[i] != 0) out.add(new ItemStack(Vars.content.item(i), values[i])); } return out; } @@ -78,6 +81,27 @@ public class ItemSeq implements Iterable{ add(item, -amount); } + @Override + public void write(Json json){ + for(Item item : Vars.content.items()){ + if(values[item.id] != 0){ + json.writeValue(item.name, values[item.id]); + } + } + } + + @Override + public void read(Json json, JsonValue jsonData){ + for(Item item : Vars.content.items()){ + values[item.id] = jsonData.getInt(item.name, 0); + } + } + + @Override + public String toString(){ + return JsonIO.write(this); + } + @Override public Iterator iterator(){ return toSeq().iterator(); diff --git a/core/src/mindustry/type/Sector.java b/core/src/mindustry/type/Sector.java index 07b4cf1fff..e6ea50905e 100644 --- a/core/src/mindustry/type/Sector.java +++ b/core/src/mindustry/type/Sector.java @@ -149,12 +149,16 @@ public class Sector{ } //TODO this should be stored in a more efficient structure, and be updated each turn - public Seq getReceivedItems(){ - return Core.settings.getJson(key("received-items"), Seq.class, ItemStack.class, Seq::new); + public ItemSeq getExtraItems(){ + return Core.settings.getJson(key("extra-items"), ItemSeq.class, ItemSeq::new); } - public void setReceivedItems(Seq stacks){ - Core.settings.putJson(key("received-items"), ItemStack.class, stacks); + public void setExtraItems(ItemSeq stacks){ + Core.settings.putJson(key("extra-items"), stacks); + } + + public void addItem(Item item, int amount){ + removeItem(item, -amount); } public void removeItem(Item item, int amount){ @@ -163,16 +167,11 @@ public class Sector{ state.rules.defaultTeam.items().remove(item, amount); } }else{ - Seq recv = getReceivedItems(); + ItemSeq recv = getExtraItems(); - ItemStack fit = recv.find(i -> i.item == item); - if(fit != null){ - fit.amount -= amount; - }else{ - recv.add(new ItemStack(item, amount)); - } + recv.remove(item, amount); - setReceivedItems(recv); + setExtraItems(recv); } } @@ -188,26 +187,9 @@ public class Sector{ count.add(ent.key, ent.value); } - count.add(calculateRecievedItems()); - } + count.add(calculateReceivedItems()); - return count; - } - - public ItemSeq calculateRecievedItems(){ - ItemSeq count = new ItemSeq(); - - if(save != null){ int capacity = save.meta.secinfo.storageCapacity; - long seconds = getSecondsPassed(); - - //add produced items - save.meta.secinfo.production.each((item, stat) -> { - count.add(item, (int)(stat.mean * seconds)); - }); - - //add received items - getReceivedItems().each(stack -> count.add(stack.item, stack.amount)); //validation for(Item item : content.items()){ @@ -221,6 +203,22 @@ public class Sector{ return count; } + public ItemSeq calculateReceivedItems(){ + ItemSeq count = new ItemSeq(); + + if(save != null){ + long seconds = getSecondsPassed(); + + //add produced items + save.meta.secinfo.production.each((item, stat) -> count.add(item, (int)(stat.mean * seconds))); + + //add received items + getExtraItems().each(count::add); + } + + return count; + } + //TODO these methods should maybe move somewhere else and/or be contained in a data object public void setSpawnPosition(int position){ put("spawn-position", position); diff --git a/core/src/mindustry/ui/dialogs/ResearchDialog.java b/core/src/mindustry/ui/dialogs/ResearchDialog.java index ee978543d0..0f7ffedfa2 100644 --- a/core/src/mindustry/ui/dialogs/ResearchDialog.java +++ b/core/src/mindustry/ui/dialogs/ResearchDialog.java @@ -76,7 +76,7 @@ public class ResearchDialog extends BaseDialog{ if(amount < 0){ //remove items from each sector's storage, one by one - //negate amount since it's being *removed* + //negate amount since it's being *removed* - this makes it positive amount = -amount; //% that gets removed from each sector @@ -91,6 +91,7 @@ public class ResearchDialog extends BaseDialog{ //actually remove it from the sector sector.removeItem(item, toRemove); seq.remove(item, toRemove); + counter[0] -= toRemove; }); @@ -513,9 +514,7 @@ public class ResearchDialog extends BaseDialog{ list.image(req.item.icon(Cicon.small)).size(8 * 3).padRight(3); list.add(req.item.localizedName).color(Color.lightGray); Label label = list.label(() -> " " + - (player.team().core() != null ? - UI.formatAmount(Math.min(player.team().core().items.get(req.item), reqAmount)) + " / " : - "") + UI.formatAmount(Math.min(items.get(req.item), reqAmount)) + " / " + UI.formatAmount(reqAmount)).get(); Color targetColor = items.has(req.item) ? Color.lightGray : Color.scarlet; diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java index 585577fa0b..863746a264 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -61,6 +61,7 @@ public class HudFragment extends Fragment{ //TODO full implementation Events.on(ResetEvent.class, e -> { coreItems.resetUsed(); + coreItems.clear(); }); Events.on(TurnEvent.class, e -> { @@ -216,7 +217,7 @@ public class HudFragment extends Fragment{ //core items parent.fill(t -> { t.top().add(coreItems); - t.visible(() -> Core.settings.getBool("coreitems") && !mobile); + t.visible(() -> Core.settings.getBool("coreitems") && !mobile && !state.isPaused()); }); //spawner warning diff --git a/core/src/mindustry/world/blocks/campaign/LaunchPad.java b/core/src/mindustry/world/blocks/campaign/LaunchPad.java index b67589769e..276c27483a 100644 --- a/core/src/mindustry/world/blocks/campaign/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -177,22 +177,17 @@ public class LaunchPad extends Block{ //actually launch the items upon removal if(team() == state.rules.defaultTeam && state.secinfo.origin != null){ - Seq dest = state.secinfo.origin.getReceivedItems(); + ItemSeq dest = state.secinfo.origin.getExtraItems(); for(ItemStack stack : stacks){ - ItemStack sto = dest.find(i -> i.item == stack.item); - if(sto != null){ - sto.amount += stack.amount; - }else{ - dest.add(stack); - } + dest.add(stack); //update export state.secinfo.handleItemExport(stack); Events.fire(new LaunchItemEvent(stack)); } - state.secinfo.origin.setReceivedItems(dest); + state.secinfo.origin.setExtraItems(dest); } } } diff --git a/core/src/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/mindustry/world/blocks/distribution/ItemBridge.java index e051881dc2..86ae676221 100644 --- a/core/src/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ItemBridge.java @@ -134,6 +134,8 @@ public class ItemBridge extends Block{ @Override public void playerPlaced(){ + super.playerPlaced(); + Tile link = findLink(tile.x, tile.y); if(linkValid(tile, link)){ link.build.configure(tile.pos()); diff --git a/core/src/mindustry/world/blocks/distribution/OverflowGate.java b/core/src/mindustry/world/blocks/distribution/OverflowGate.java index 469e268ccf..01462261f6 100644 --- a/core/src/mindustry/world/blocks/distribution/OverflowGate.java +++ b/core/src/mindustry/world/blocks/distribution/OverflowGate.java @@ -128,12 +128,15 @@ public class OverflowGate extends Block{ @Override public void write(Writes write){ + super.write(write); + write.i(lastInput == null ? -1 : lastInput.pos()); } @Override public void read(Reads read, byte revision){ super.read(read, revision); + if(revision == 1){ new DirectionalItemBuffer(25).read(read); }else if(revision == 3){