diff --git a/core/src/mindustry/editor/data/MapContentView.java b/core/src/mindustry/editor/data/MapContentView.java index e05535436f..224e8b4afb 100644 --- a/core/src/mindustry/editor/data/MapContentView.java +++ b/core/src/mindustry/editor/data/MapContentView.java @@ -82,7 +82,7 @@ public class MapContentView implements AssetView{ list.add().size(h); } - list.button(content.content instanceof UnlockableContent u && (u.uiIcon.found() || u.fullIcon.found()) ? new TextureRegionDrawable(u.uiIcon.found() ? u.uiIcon : u.fullIcon) : + list.button(content.content instanceof UnlockableContent u && u.uiIcon != null && (u.uiIcon.found() || u.fullIcon.found()) ? new TextureRegionDrawable(u.uiIcon.found() ? u.uiIcon : u.fullIcon) : contentIcons.get(content.type, Icon.warning), Styles.graySquarei, iconMed, () -> {}).touchable(Touchable.disabled).size(h); list.button(("[accent]" + content.name + "\n") + "[lightgray]" + Core.bundle.get("content." + content.type), Styles.grayt, () -> { diff --git a/core/src/mindustry/io/TypeIO.java b/core/src/mindustry/io/TypeIO.java index 5f3f4cfd76..001791450a 100644 --- a/core/src/mindustry/io/TypeIO.java +++ b/core/src/mindustry/io/TypeIO.java @@ -630,6 +630,12 @@ public class TypeIO{ int x = read.us(); int y = read.us(); Block block = Vars.content.block(read.us()); + if(block == null){ + // Skip unrecognised block IDs (e.g. from a modded client) + read.b(); // consume rotation byte + readClientPlanConfig(read); // consume config + continue; + } int rotation = (block.rotate ? read.b() : 0); Object config = readClientPlanConfig(read); BuildPlan plan = new BuildPlan(x, y, rotation, block, config); diff --git a/core/src/mindustry/mod/DataPatcher.java b/core/src/mindustry/mod/DataPatcher.java index 2ac173fc97..773ccfdf11 100644 --- a/core/src/mindustry/mod/DataPatcher.java +++ b/core/src/mindustry/mod/DataPatcher.java @@ -197,13 +197,6 @@ public class DataPatcher{ parser.finishParsing(); - for(var errored : dpMod.erroredContent){ - if(errored.minfo.error != null && errored.minfo.asset != null){ - errored.minfo.asset.warnings.add(errored.minfo.error); - } - Vars.content.remove(errored); - } - addedContent.clear(); Seq all = addedContent; @@ -211,6 +204,13 @@ public class DataPatcher{ all.addAll(arr.select(c -> c.minfo.mod == dpMod)); } + for(var errored : dpMod.erroredContent){ + if(errored.minfo.error != null && errored.minfo.asset != null){ + errored.minfo.asset.warnings.add(errored.minfo.error); + } + Vars.content.remove(errored); + } + for(var cont : all){ try{ cont.init(); diff --git a/core/src/mindustry/world/blocks/logic/LogicBlock.java b/core/src/mindustry/world/blocks/logic/LogicBlock.java index 42b5ef55ee..31c86b1bd2 100644 --- a/core/src/mindustry/world/blocks/logic/LogicBlock.java +++ b/core/src/mindustry/world/blocks/logic/LogicBlock.java @@ -575,6 +575,8 @@ public class LogicBlock extends Block{ } public void updateLinks(){ + if(linksVar == null) return; + int valids = links.count(l -> l.valid); executor.links = new Building[valids]; executor.linkIds.clear();