Skip to content

Commit d06fa6f

Browse files
committed
Merge remote-tracking branch 'origin/main'
2 parents 31858a2 + 947dcb1 commit d06fa6f

19 files changed

+269
-94
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Thumbs.db
77

88
## ForgeGradle
99
/run
10+
/runServer
1011

1112
## eclipse
1213
/.settings

build.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ mod_name=Zeta
55
mc_version=1.20.1
66
mapping_channel=official
77
mod_id=zeta
8-
build_number=27
8+
build_number=29
99
dir_output=../Build Output/Zeta/

changelog.txt

+10-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,10 @@
1-
- this update should fix a (not so) rare concurrency issue during modules init when having disabled modules
1+
- Implement `@ModuleInstance` (MehVahdJukaar)
2+
- Complain when mods return null from `IForgeItem#getCraftingRemainingItem` and try to move on instead of crashing b/c I'm sick of fielding issue reports about it lol (quat)
3+
- Pressing Escape backs up only 1 level from config screens instead of kicking you out (quat)
4+
- Try and fix the Quark config being perpetually "incorrect"; had to do with anti-overlap comments (quat)
5+
- Change how config loading works; ensure everything is loaded on the correct threads at the correct times, ignore config change requests that happen too early, lots of verbose logging. (quat)
6+
7+
Changes from older versions (which were mistakenly uploaded as 1.20.0 so you might not have seen them)
8+
9+
- fixed an issue with piston and sticky blocks (MehVahdJukaar)
10+
- Some fixes for the config loading race condition (MehVahdJukaar)

src/main/java/org/violetmoon/zeta/Zeta.java

+29-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.violetmoon.zeta;
22

3+
import java.util.function.Supplier;
4+
35
import com.google.common.base.Stopwatch;
46
import net.minecraft.core.BlockPos;
57
import net.minecraft.world.InteractionHand;
@@ -21,15 +23,23 @@
2123
import org.violetmoon.zeta.module.ZetaCategory;
2224
import org.violetmoon.zeta.module.ZetaModuleManager;
2325
import org.violetmoon.zeta.network.ZetaNetworkHandler;
24-
import org.violetmoon.zeta.registry.*;
25-
import org.violetmoon.zeta.util.*;
26+
import org.violetmoon.zeta.registry.BrewingRegistry;
27+
import org.violetmoon.zeta.registry.CraftingExtensionsRegistry;
28+
import org.violetmoon.zeta.registry.DyeablesRegistry;
29+
import org.violetmoon.zeta.registry.PottedPlantRegistry;
30+
import org.violetmoon.zeta.registry.RenderLayerRegistry;
31+
import org.violetmoon.zeta.registry.VariantRegistry;
32+
import org.violetmoon.zeta.registry.ZetaRegistry;
33+
import org.violetmoon.zeta.util.NameChanger;
34+
import org.violetmoon.zeta.util.RaytracingUtil;
35+
import org.violetmoon.zeta.util.RegistryUtil;
36+
import org.violetmoon.zeta.util.ZetaCommonProxy;
37+
import org.violetmoon.zeta.util.ZetaSide;
2638
import org.violetmoon.zeta.util.handler.FuelHandler;
2739
import org.violetmoon.zeta.util.zetalist.IZeta;
2840
import org.violetmoon.zeta.util.zetalist.ZetaList;
2941
import org.violetmoon.zeta.world.EntitySpawnHandler;
3042

31-
import java.util.function.Supplier;
32-
3343
/**
3444
* do not touch forge OR quark from this package, it will later be split off
3545
*/
@@ -41,6 +51,7 @@ public Zeta(String modid, Logger log, ZetaSide side, boolean isProduction) {
4151
this.modid = modid;
4252
this.side = side;
4353
this.isProduction = isProduction; //TODO: either have all these constants or static helpers here or in Utils. Not both
54+
this.proxy = createProxy(side);
4455

4556
this.modules = createModuleManager();
4657
this.registry = createRegistry();
@@ -78,6 +89,7 @@ public Zeta(String modid, Logger log, ZetaSide side, boolean isProduction) {
7889
// Be careful when using this. Load bus will only fire stuff to this zeta events. Play bus however will not as it delegate to forge bus
7990
public final ZetaEventBus<IZetaPlayEvent> playBus; //common mod event bus. Each zeta will have their own object for now but internally they all delegate to the same internal bus
8091
public final ZetaModuleManager modules;
92+
public final ZetaCommonProxy proxy;
8193

8294
//registry
8395
//TODO: make private
@@ -135,6 +147,7 @@ public final void loadModules(@Nullable Iterable<ZetaCategory> categories, @Null
135147

136148
this.configManager = new ConfigManager(this, rootPojo);
137149
this.configInternals = makeConfigInternals(configManager.getRootConfig());
150+
asZeta().log.info("Doing super early config setup for {}", asZeta().modid);
138151
this.configManager.onReload();
139152

140153
this.modules.doFinalize();
@@ -153,6 +166,18 @@ public <T> T modIntegration(String compatWith, Supplier<Supplier<T>> yes, Suppli
153166
}
154167
}
155168

169+
// proxy
170+
public ZetaCommonProxy createProxy(ZetaSide effectiveSide) {
171+
try {
172+
if(effectiveSide == ZetaSide.CLIENT)
173+
return (ZetaCommonProxy) Class.forName("org.violetmoon.zeta.client.ZetaClientProxy")
174+
.getConstructor(Zeta.class).newInstance(this);
175+
else return new ZetaCommonProxy(this);
176+
} catch (Exception e) {
177+
throw new RuntimeException("Failed to construct proxy", e);
178+
}
179+
}
180+
156181
// config
157182
public abstract IZetaConfigInternals makeConfigInternals(SectionDefinition rootSection);
158183

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.violetmoon.zeta.client;
2+
3+
import net.minecraft.client.Minecraft;
4+
import org.violetmoon.zeta.Zeta;
5+
import org.violetmoon.zeta.util.ZetaCommonProxy;
6+
7+
public class ZetaClientProxy extends ZetaCommonProxy {
8+
public ZetaClientProxy(Zeta zeta) {
9+
super(zeta);
10+
}
11+
12+
@Override
13+
public void tryToExecuteOnMainThread(Runnable runnable) {
14+
Minecraft.getInstance().execute(runnable);
15+
}
16+
}

src/main/java/org/violetmoon/zeta/client/config/screen/ZetaConfigHomeScreen.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ private Component componentForSaveButton() {
120120

121121
public void commit(Button button) {
122122
changeSet.applyAllChanges();
123-
returnToParent();
123+
onClose();
124124
}
125125

126126
@Override

src/main/java/org/violetmoon/zeta/client/config/screen/ZetaScreen.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,13 @@ public ZetaScreen(ZetaClient zc, Screen parent) {
2525
this(zc, Component.empty(), parent);
2626
}
2727

28-
public void returnToParent() {
28+
@Override
29+
public void onClose() {
2930
minecraft.setScreen(parent);
3031
}
32+
33+
@Deprecated(forRemoval = true) //unnecessary distinction, vanilla screens return to parent on onClose as well
34+
public void returnToParent() {
35+
onClose();
36+
}
3137
}

src/main/java/org/violetmoon/zeta/client/config/widget/DefaultDiscardDone.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,6 @@ public void discard(Button b) {
4949
}
5050

5151
public void done(Button b) {
52-
screen.returnToParent();
52+
screen.onClose();
5353
}
5454
}

src/main/java/org/violetmoon/zeta/config/IZetaConfigInternals.java

-5
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,4 @@ public interface IZetaConfigInternals {
55
<T> void set(ValueDefinition<T> definition, T value);
66

77
void flush();
8-
9-
//for debouncing Forge ConfigChangedEvent cause its glitchy af
10-
default long debounceTime() {
11-
return 0;
12-
}
138
}

src/main/java/org/violetmoon/zeta/module/TentativeModule.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package org.violetmoon.zeta.module;
22

3-
import org.apache.commons.lang3.text.WordUtils;
4-
import org.violetmoon.zeta.util.ZetaSide;
5-
3+
import java.util.List;
64
import java.util.Locale;
7-
import java.util.Set;
5+
import java.util.SortedSet;
6+
import java.util.TreeSet;
87
import java.util.function.Function;
98

9+
import org.apache.commons.lang3.text.WordUtils;
10+
import org.violetmoon.zeta.util.ZetaSide;
11+
1012
/**
1113
* performs some common data-munging of the data straight off a ZetaLoadModule annotation
1214
*/
@@ -18,7 +20,7 @@ public record TentativeModule(
1820
String displayName,
1921
String lowercaseName,
2022
String description,
21-
Set<String> antiOverlap,
23+
SortedSet<String> antiOverlap,
2224
boolean enabledByDefault,
2325

2426
boolean clientReplacement,
@@ -62,7 +64,7 @@ public static TentativeModule from(ZetaLoadModuleAnnotationData data, Function<S
6264
displayName,
6365
lowercaseName,
6466
data.description(),
65-
Set.of(data.antiOverlap()),
67+
new TreeSet<>(List.of(data.antiOverlap())),
6668
data.enabledByDefault(),
6769
clientReplacement,
6870
data.loadPhase()

src/main/java/org/violetmoon/zeta/module/ZetaModule.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package org.violetmoon.zeta.module;
22

3+
import java.util.List;
4+
import java.util.SortedSet;
5+
import java.util.TreeSet;
6+
37
import org.jetbrains.annotations.ApiStatus;
48
import org.violetmoon.zeta.Zeta;
59
import org.violetmoon.zeta.event.bus.LoadEvent;
610
import org.violetmoon.zeta.event.load.ZGatherHints;
711

8-
import java.util.List;
9-
import java.util.Set;
10-
1112
public class ZetaModule {
1213

1314
//all these are just to notify that these will go package private soon. Should be read only! Cant make them final because module is initialized with reflections
@@ -24,7 +25,8 @@ public class ZetaModule {
2425
@Deprecated(forRemoval = true)
2526
public String description = "";
2627

27-
protected Set<String> antiOverlap = Set.of();
28+
//This gets dumped into a config comment; ordering must be consistent lest Forge complain the config file is "incorrect"
29+
protected SortedSet<String> antiOverlap = new TreeSet<>();
2830

2931
@Deprecated(forRemoval = true)
3032
public boolean enabled = false;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.violetmoon.zeta.util;
2+
3+
import net.minecraft.server.MinecraftServer;
4+
import net.minecraftforge.server.ServerLifecycleHooks;
5+
import org.violetmoon.zeta.Zeta;
6+
7+
public class ZetaCommonProxy {
8+
public ZetaCommonProxy(Zeta zeta) {
9+
this.zeta = zeta;
10+
}
11+
12+
protected Zeta zeta;
13+
14+
/**
15+
* Try and execute something on "the main thread". On the physical client this is well-defined (the render thread),
16+
* but on the physical server... make a best-effort to use the server thread, and otherwise yolo
17+
*/
18+
public void tryToExecuteOnMainThread(Runnable runnable) {
19+
MinecraftServer server = ServerLifecycleHooks.getCurrentServer();
20+
if(server != null)
21+
server.execute(runnable);
22+
else {
23+
zeta.log.warn("Using thread '{}' instead of the server thread", Thread.currentThread().getName());
24+
runnable.run();
25+
}
26+
}
27+
}

src/main/java/org/violetmoon/zeta/util/handler/RecipeCrawlHandler.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,15 @@ private static void digest(Recipe<?> recipe, RegistryAccess access) {
156156
for (Ingredient ingredient : ingredients) {
157157
for (ItemStack inStack : ingredient.getItems()) {
158158
//don't include catalyst items. This includes partial ones like buckets and such
159-
if (inStack.getCraftingRemainingItem().isEmpty()) {
159+
ItemStack remaining = inStack.getCraftingRemainingItem();
160+
161+
if(remaining == null) {
162+
//sigh. let's at least not make this into our problem
163+
ZetaMod.LOGGER.error("Item {} returned NULL from getCraftingRemainingItem. This is wrong and will cause problems down the line", inStack.getItem());
164+
continue;
165+
}
166+
167+
if (remaining.isEmpty()) {
160168
vanillaRecipeDigestion.put(inStack.getItem(), out);
161169
backwardsVanillaDigestion.put(outItem, inStack);
162170
}

src/main/java/org/violetmoon/zetaimplforge/ForgeZeta.java

+17-28
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,11 @@
33
import net.minecraft.core.BlockPos;
44
import net.minecraft.world.InteractionHand;
55
import net.minecraft.world.entity.player.Player;
6-
import net.minecraft.world.item.ItemStack;
7-
import net.minecraft.world.level.Level;
86
import net.minecraft.world.level.block.Blocks;
97
import net.minecraft.world.level.block.FlowerPotBlock;
10-
import net.minecraft.world.level.block.entity.BlockEntity;
118
import net.minecraft.world.phys.BlockHitResult;
12-
import net.minecraftforge.client.event.RegisterColorHandlersEvent;
139
import net.minecraftforge.common.ForgeConfigSpec;
1410
import net.minecraftforge.common.MinecraftForge;
15-
import net.minecraftforge.event.AttachCapabilitiesEvent;
1611
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
1712
import net.minecraftforge.eventbus.api.Event;
1813
import net.minecraftforge.eventbus.api.EventPriority;
@@ -26,46 +21,35 @@
2621
import org.violetmoon.zeta.Zeta;
2722
import org.violetmoon.zeta.block.ext.BlockExtensionFactory;
2823
import org.violetmoon.zeta.capability.ZetaCapabilityManager;
29-
import org.violetmoon.zeta.client.event.load.*;
30-
import org.violetmoon.zeta.client.event.play.*;
3124
import org.violetmoon.zeta.config.IZetaConfigInternals;
3225
import org.violetmoon.zeta.config.SectionDefinition;
33-
import org.violetmoon.zeta.event.bus.*;
34-
import org.violetmoon.zeta.event.load.*;
35-
import org.violetmoon.zeta.event.play.*;
36-
import org.violetmoon.zeta.event.play.entity.*;
37-
import org.violetmoon.zeta.event.play.entity.living.*;
38-
import org.violetmoon.zeta.event.play.entity.player.*;
39-
import org.violetmoon.zeta.event.play.loading.*;
26+
import org.violetmoon.zeta.event.bus.IZetaLoadEvent;
27+
import org.violetmoon.zeta.event.bus.IZetaPlayEvent;
28+
import org.violetmoon.zeta.event.bus.ZResult;
29+
import org.violetmoon.zeta.event.bus.ZetaEventBus;
4030
import org.violetmoon.zeta.item.ext.ItemExtensionFactory;
4131
import org.violetmoon.zeta.network.ZetaNetworkHandler;
42-
import org.violetmoon.zeta.registry.*;
32+
import org.violetmoon.zeta.registry.BrewingRegistry;
33+
import org.violetmoon.zeta.registry.CraftingExtensionsRegistry;
34+
import org.violetmoon.zeta.registry.CreativeTabManager;
35+
import org.violetmoon.zeta.registry.PottedPlantRegistry;
36+
import org.violetmoon.zeta.registry.ZetaRegistry;
4337
import org.violetmoon.zeta.util.RaytracingUtil;
4438
import org.violetmoon.zeta.util.ZetaSide;
45-
import org.violetmoon.zetaimplforge.api.ForgeZGatherAdvancementModifiers;
4639
import org.violetmoon.zetaimplforge.block.IForgeBlockBlockExtensions;
4740
import org.violetmoon.zetaimplforge.capability.ForgeCapabilityManager;
48-
import org.violetmoon.zetaimplforge.client.event.load.*;
49-
import org.violetmoon.zetaimplforge.client.event.play.*;
5041
import org.violetmoon.zetaimplforge.config.ConfigEventDispatcher;
5142
import org.violetmoon.zetaimplforge.config.ForgeBackedConfig;
5243
import org.violetmoon.zetaimplforge.config.TerribleForgeConfigHackery;
5344
import org.violetmoon.zetaimplforge.event.ForgeZetaEventBus;
54-
import org.violetmoon.zetaimplforge.event.load.*;
55-
import org.violetmoon.zetaimplforge.event.play.*;
56-
import org.violetmoon.zetaimplforge.event.play.entity.*;
57-
import org.violetmoon.zetaimplforge.event.play.entity.living.*;
58-
import org.violetmoon.zetaimplforge.event.play.entity.player.*;
59-
import org.violetmoon.zetaimplforge.event.play.loading.*;
45+
import org.violetmoon.zetaimplforge.event.load.ForgeZRegister;
6046
import org.violetmoon.zetaimplforge.item.IForgeItemItemExtensions;
6147
import org.violetmoon.zetaimplforge.network.ForgeZetaNetworkHandler;
6248
import org.violetmoon.zetaimplforge.registry.ForgeBrewingRegistry;
6349
import org.violetmoon.zetaimplforge.registry.ForgeCraftingExtensionsRegistry;
6450
import org.violetmoon.zetaimplforge.registry.ForgeZetaRegistry;
6551
import org.violetmoon.zetaimplforge.util.ForgeRaytracingUtil;
6652

67-
import java.util.function.Function;
68-
6953
/**
7054
* ideally do not touch quark from this package, it will later be split off
7155
*/
@@ -165,9 +149,14 @@ public void start() {
165149
//load
166150
IEventBus modbus = FMLJavaModLoadingContext.get().getModEventBus();
167151

168-
modbus.addListener(EventPriority.LOWEST, CreativeTabManager::buildContents);
169-
modbus.addListener(ConfigEventDispatcher::configChanged);
152+
//hook up config events
153+
ConfigEventDispatcher configEventDispatcher = new ConfigEventDispatcher(this);
154+
modbus.addListener(configEventDispatcher::modConfigReloading);
155+
modbus.addListener(configEventDispatcher::commonSetup);
156+
MinecraftForge.EVENT_BUS.addListener(configEventDispatcher::serverAboutToStart);
170157

158+
//other stuff
159+
modbus.addListener(EventPriority.LOWEST, CreativeTabManager::buildContents);
171160
modbus.addListener(EventPriority.HIGHEST, this::registerHighest);
172161
}
173162

src/main/java/org/violetmoon/zetaimplforge/client/ForgeZetaClient.java

-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import org.violetmoon.zeta.client.ClientRegistryExtension;
2020
import org.violetmoon.zeta.client.HumanoidArmorModelGetter;
2121
import org.violetmoon.zeta.client.ZetaClient;
22-
import org.violetmoon.zeta.event.bus.StandaloneZetaEventBus;
2322
import org.violetmoon.zetaimplforge.mixin.mixins.client.AccessorBlockColors;
2423
import org.violetmoon.zetaimplforge.mixin.mixins.client.AccessorItemColors;
2524

0 commit comments

Comments
 (0)