Bugfixes
This commit is contained in:
@@ -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<ItemStack> 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
|
||||
|
||||
@@ -17,7 +17,7 @@ import java.net.*;
|
||||
import java.util.regex.*;
|
||||
|
||||
public class Scripts implements Disposable{
|
||||
private final Seq<String> blacklist = Seq.with("net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk",
|
||||
private final Seq<String> 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<String> whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen.");
|
||||
|
||||
@@ -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<ItemStack>{
|
||||
public class ItemSeq implements Iterable<ItemStack>, Serializable{
|
||||
private final static ItemStack tmp = new ItemStack();
|
||||
|
||||
protected final int[] values;
|
||||
@@ -19,7 +22,7 @@ public class ItemSeq implements Iterable<ItemStack>{
|
||||
|
||||
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<ItemStack>{
|
||||
public Seq<ItemStack> toSeq(){
|
||||
Seq<ItemStack> 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<ItemStack>{
|
||||
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<ItemStack> iterator(){
|
||||
return toSeq().iterator();
|
||||
|
||||
@@ -149,12 +149,16 @@ public class Sector{
|
||||
}
|
||||
|
||||
//TODO this should be stored in a more efficient structure, and be updated each turn
|
||||
public Seq<ItemStack> 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<ItemStack> 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<ItemStack> 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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<ItemStack> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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){
|
||||
|
||||
Reference in New Issue
Block a user