Bugfixes
This commit is contained in:
@@ -2,7 +2,6 @@ package mindustry.core;
|
|||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
import arc.struct.*;
|
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import mindustry.annotations.Annotations.*;
|
import mindustry.annotations.Annotations.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
@@ -88,27 +87,35 @@ public class Logic implements ApplicationListener{
|
|||||||
|
|
||||||
//when loading a 'damaged' sector, propagate the damage
|
//when loading a 'damaged' sector, propagate the damage
|
||||||
Events.on(WorldLoadEvent.class, e -> {
|
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();
|
long seconds = state.rules.sector.getSecondsPassed();
|
||||||
CoreEntity core = state.rules.defaultTeam.core();
|
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
|
//apply fractional damage based on how many turns have passed for this sector
|
||||||
float turnsPassed = seconds / (turnDuration / 60f);
|
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);
|
SectorDamage.apply(turnsPassed / sectorDestructionTurns);
|
||||||
}
|
}
|
||||||
|
|
||||||
//add resources based on turns passed
|
//add resources based on turns passed
|
||||||
if(state.rules.sector.save != null && core != null){
|
if(state.rules.sector.save != null && core != null){
|
||||||
//add new items recieved
|
//update correct storage capacity
|
||||||
state.rules.sector.calculateRecievedItems().each((item, amount) -> core.items.add(item, amount));
|
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
|
//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);
|
state.rules.sector.setSecondsPassed(0);
|
||||||
@@ -262,15 +269,15 @@ public class Logic implements ApplicationListener{
|
|||||||
Time.runTask(30f, () -> {
|
Time.runTask(30f, () -> {
|
||||||
Sector origin = sector.save.meta.secinfo.origin;
|
Sector origin = sector.save.meta.secinfo.origin;
|
||||||
if(origin != null){
|
if(origin != null){
|
||||||
Seq<ItemStack> stacks = origin.getReceivedItems();
|
ItemSeq stacks = origin.getExtraItems();
|
||||||
|
|
||||||
//add up all items into list
|
//add up all items into list
|
||||||
for(Building entity : state.teams.playerCores()){
|
for(Building entity : state.teams.playerCores()){
|
||||||
entity.items.each((item, amount) -> ItemStack.insert(stacks, item, amount));
|
entity.items.each(stacks::add);
|
||||||
}
|
}
|
||||||
|
|
||||||
//save received items
|
//save received items
|
||||||
origin.setReceivedItems(stacks);
|
origin.setExtraItems(stacks);
|
||||||
}
|
}
|
||||||
|
|
||||||
//remove all the cores
|
//remove all the cores
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import java.net.*;
|
|||||||
import java.util.regex.*;
|
import java.util.regex.*;
|
||||||
|
|
||||||
public class Scripts implements Disposable{
|
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",
|
"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");
|
".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.");
|
private final Seq<String> whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen.");
|
||||||
|
|||||||
@@ -1,13 +1,16 @@
|
|||||||
package mindustry.type;
|
package mindustry.type;
|
||||||
|
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
|
import arc.util.serialization.*;
|
||||||
|
import arc.util.serialization.Json.*;
|
||||||
import mindustry.*;
|
import mindustry.*;
|
||||||
|
import mindustry.io.*;
|
||||||
import mindustry.world.modules.*;
|
import mindustry.world.modules.*;
|
||||||
import mindustry.world.modules.ItemModule.*;
|
import mindustry.world.modules.ItemModule.*;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class ItemSeq implements Iterable<ItemStack>{
|
public class ItemSeq implements Iterable<ItemStack>, Serializable{
|
||||||
private final static ItemStack tmp = new ItemStack();
|
private final static ItemStack tmp = new ItemStack();
|
||||||
|
|
||||||
protected final int[] values;
|
protected final int[] values;
|
||||||
@@ -19,7 +22,7 @@ public class ItemSeq implements Iterable<ItemStack>{
|
|||||||
|
|
||||||
public void each(ItemConsumer cons){
|
public void each(ItemConsumer cons){
|
||||||
for(int i = 0; i < values.length; i++){
|
for(int i = 0; i < values.length; i++){
|
||||||
if(values[i] > 0){
|
if(values[i] != 0){
|
||||||
cons.accept(Vars.content.item(i), values[i]);
|
cons.accept(Vars.content.item(i), values[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -28,7 +31,7 @@ public class ItemSeq implements Iterable<ItemStack>{
|
|||||||
public Seq<ItemStack> toSeq(){
|
public Seq<ItemStack> toSeq(){
|
||||||
Seq<ItemStack> out = new Seq<>();
|
Seq<ItemStack> out = new Seq<>();
|
||||||
for(int i = 0; i < values.length; i++){
|
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;
|
return out;
|
||||||
}
|
}
|
||||||
@@ -78,6 +81,27 @@ public class ItemSeq implements Iterable<ItemStack>{
|
|||||||
add(item, -amount);
|
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
|
@Override
|
||||||
public Iterator<ItemStack> iterator(){
|
public Iterator<ItemStack> iterator(){
|
||||||
return toSeq().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
|
//TODO this should be stored in a more efficient structure, and be updated each turn
|
||||||
public Seq<ItemStack> getReceivedItems(){
|
public ItemSeq getExtraItems(){
|
||||||
return Core.settings.getJson(key("received-items"), Seq.class, ItemStack.class, Seq::new);
|
return Core.settings.getJson(key("extra-items"), ItemSeq.class, ItemSeq::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setReceivedItems(Seq<ItemStack> stacks){
|
public void setExtraItems(ItemSeq stacks){
|
||||||
Core.settings.putJson(key("received-items"), ItemStack.class, 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){
|
public void removeItem(Item item, int amount){
|
||||||
@@ -163,16 +167,11 @@ public class Sector{
|
|||||||
state.rules.defaultTeam.items().remove(item, amount);
|
state.rules.defaultTeam.items().remove(item, amount);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
Seq<ItemStack> recv = getReceivedItems();
|
ItemSeq recv = getExtraItems();
|
||||||
|
|
||||||
ItemStack fit = recv.find(i -> i.item == item);
|
recv.remove(item, amount);
|
||||||
if(fit != null){
|
|
||||||
fit.amount -= amount;
|
|
||||||
}else{
|
|
||||||
recv.add(new ItemStack(item, amount));
|
|
||||||
}
|
|
||||||
|
|
||||||
setReceivedItems(recv);
|
setExtraItems(recv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,26 +187,9 @@ public class Sector{
|
|||||||
count.add(ent.key, ent.value);
|
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;
|
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
|
//validation
|
||||||
for(Item item : content.items()){
|
for(Item item : content.items()){
|
||||||
@@ -221,6 +203,22 @@ public class Sector{
|
|||||||
return count;
|
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
|
//TODO these methods should maybe move somewhere else and/or be contained in a data object
|
||||||
public void setSpawnPosition(int position){
|
public void setSpawnPosition(int position){
|
||||||
put("spawn-position", position);
|
put("spawn-position", position);
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ public class ResearchDialog extends BaseDialog{
|
|||||||
if(amount < 0){
|
if(amount < 0){
|
||||||
//remove items from each sector's storage, one by one
|
//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;
|
amount = -amount;
|
||||||
|
|
||||||
//% that gets removed from each sector
|
//% that gets removed from each sector
|
||||||
@@ -91,6 +91,7 @@ public class ResearchDialog extends BaseDialog{
|
|||||||
//actually remove it from the sector
|
//actually remove it from the sector
|
||||||
sector.removeItem(item, toRemove);
|
sector.removeItem(item, toRemove);
|
||||||
seq.remove(item, toRemove);
|
seq.remove(item, toRemove);
|
||||||
|
|
||||||
counter[0] -= 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.image(req.item.icon(Cicon.small)).size(8 * 3).padRight(3);
|
||||||
list.add(req.item.localizedName).color(Color.lightGray);
|
list.add(req.item.localizedName).color(Color.lightGray);
|
||||||
Label label = list.label(() -> " " +
|
Label label = list.label(() -> " " +
|
||||||
(player.team().core() != null ?
|
UI.formatAmount(Math.min(items.get(req.item), reqAmount)) + " / "
|
||||||
UI.formatAmount(Math.min(player.team().core().items.get(req.item), reqAmount)) + " / " :
|
|
||||||
"")
|
|
||||||
+ UI.formatAmount(reqAmount)).get();
|
+ UI.formatAmount(reqAmount)).get();
|
||||||
|
|
||||||
Color targetColor = items.has(req.item) ? Color.lightGray : Color.scarlet;
|
Color targetColor = items.has(req.item) ? Color.lightGray : Color.scarlet;
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ public class HudFragment extends Fragment{
|
|||||||
//TODO full implementation
|
//TODO full implementation
|
||||||
Events.on(ResetEvent.class, e -> {
|
Events.on(ResetEvent.class, e -> {
|
||||||
coreItems.resetUsed();
|
coreItems.resetUsed();
|
||||||
|
coreItems.clear();
|
||||||
});
|
});
|
||||||
|
|
||||||
Events.on(TurnEvent.class, e -> {
|
Events.on(TurnEvent.class, e -> {
|
||||||
@@ -216,7 +217,7 @@ public class HudFragment extends Fragment{
|
|||||||
//core items
|
//core items
|
||||||
parent.fill(t -> {
|
parent.fill(t -> {
|
||||||
t.top().add(coreItems);
|
t.top().add(coreItems);
|
||||||
t.visible(() -> Core.settings.getBool("coreitems") && !mobile);
|
t.visible(() -> Core.settings.getBool("coreitems") && !mobile && !state.isPaused());
|
||||||
});
|
});
|
||||||
|
|
||||||
//spawner warning
|
//spawner warning
|
||||||
|
|||||||
@@ -177,22 +177,17 @@ public class LaunchPad extends Block{
|
|||||||
|
|
||||||
//actually launch the items upon removal
|
//actually launch the items upon removal
|
||||||
if(team() == state.rules.defaultTeam && state.secinfo.origin != null){
|
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){
|
for(ItemStack stack : stacks){
|
||||||
ItemStack sto = dest.find(i -> i.item == stack.item);
|
dest.add(stack);
|
||||||
if(sto != null){
|
|
||||||
sto.amount += stack.amount;
|
|
||||||
}else{
|
|
||||||
dest.add(stack);
|
|
||||||
}
|
|
||||||
|
|
||||||
//update export
|
//update export
|
||||||
state.secinfo.handleItemExport(stack);
|
state.secinfo.handleItemExport(stack);
|
||||||
Events.fire(new LaunchItemEvent(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
|
@Override
|
||||||
public void playerPlaced(){
|
public void playerPlaced(){
|
||||||
|
super.playerPlaced();
|
||||||
|
|
||||||
Tile link = findLink(tile.x, tile.y);
|
Tile link = findLink(tile.x, tile.y);
|
||||||
if(linkValid(tile, link)){
|
if(linkValid(tile, link)){
|
||||||
link.build.configure(tile.pos());
|
link.build.configure(tile.pos());
|
||||||
|
|||||||
@@ -128,12 +128,15 @@ public class OverflowGate extends Block{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(Writes write){
|
public void write(Writes write){
|
||||||
|
super.write(write);
|
||||||
|
|
||||||
write.i(lastInput == null ? -1 : lastInput.pos());
|
write.i(lastInput == null ? -1 : lastInput.pos());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void read(Reads read, byte revision){
|
public void read(Reads read, byte revision){
|
||||||
super.read(read, revision);
|
super.read(read, revision);
|
||||||
|
|
||||||
if(revision == 1){
|
if(revision == 1){
|
||||||
new DirectionalItemBuffer(25).read(read);
|
new DirectionalItemBuffer(25).read(read);
|
||||||
}else if(revision == 3){
|
}else if(revision == 3){
|
||||||
|
|||||||
Reference in New Issue
Block a user