Skip to content

Commit ac68fd7

Browse files
committed
Networking part 1
1 parent 56449b9 commit ac68fd7

File tree

86 files changed

+1379
-1850
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+1379
-1850
lines changed

common/src/main/java/generations/gg/generations/core/generationscore/common/GenerationsCore.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import generations.gg.generations.core.generationscore.common.world.item.GenerationsCobblemonInteractions;
2929
import generations.gg.generations.core.generationscore.common.world.item.GenerationsItems;
3030
import generations.gg.generations.core.generationscore.common.world.item.GenerationsTools;
31+
import generations.gg.generations.core.generationscore.common.world.item.components.GenerationsItemComponents;
3132
import generations.gg.generations.core.generationscore.common.world.item.creativetab.GenerationsCreativeTabs;
3233
import generations.gg.generations.core.generationscore.common.world.item.legends.EnchantableItem;
3334
import generations.gg.generations.core.generationscore.common.world.level.block.*;
@@ -37,14 +38,17 @@
3738
import generations.gg.generations.core.generationscore.common.world.recipe.*;
3839
import generations.gg.generations.core.generationscore.common.world.sound.GenerationsSounds;
3940
import generations.gg.generations.core.generationscore.common.world.spawning.ZygardeCellDetail;
41+
import net.minecraft.core.registries.Registries;
4042
import net.minecraft.network.FriendlyByteBuf;
4143
import net.minecraft.network.chat.MutableComponent;
44+
import net.minecraft.resources.ResourceKey;
4245
import net.minecraft.resources.ResourceLocation;
4346
import net.minecraft.server.level.ServerPlayer;
4447
import net.minecraft.server.packs.PackType;
4548
import net.minecraft.world.entity.player.Player;
4649
import net.minecraft.world.item.ItemStack;
4750
import net.minecraft.world.level.storage.loot.*;
51+
import net.minecraft.world.level.storage.loot.entries.NestedLootTable;
4852
import org.apache.logging.log4j.util.TriConsumer;
4953
import org.jetbrains.annotations.NotNull;
5054
import org.slf4j.Logger;
@@ -88,14 +92,16 @@ public static void init(GenerationsImplementation implementation) {
8892
var id = lootId.location();
8993
if(id.getNamespace().equals("minecraft") && id.getPath().contains("chests") && !id.getPath().contains("inject")) {
9094
var inject = ResourceLocation.fromNamespaceAndPath(id.getNamespace(), id.getPath().replace("chests", "chests/inject"));
91-
context.addPool(LootPool.lootPool().add(LootTableReference.lootTableReference(inject)));
95+
context.addPool(LootPool.lootPool().add(NestedLootTable.lootTableReference(ResourceKey.create(Registries.LOOT_TABLE, inject))));
9296
} else if(id.toString().equals("minecraft:blocks/carrots")) {
93-
context.addPool(LootPool.lootPool().add(LootTableReference.lootTableReference(GenerationsCore.id("blocks/calyrex_roots"))));
97+
context.addPool(LootPool.lootPool().add(NestedLootTable.lootTableReference(ResourceKey.create(Registries.LOOT_TABLE, GenerationsCore.id("blocks/calyrex_roots")))));
9498
}
9599
});
96100

97101
SpawnDetail.Companion.registerSpawnType(ZygardeCellDetail.TYPE, ZygardeCellDetail.class);
98102

103+
GenerationsItemComponents.init();
104+
99105
GenerationsCoreEntityDataSerializers.init();
100106
GenerationsSounds.init();
101107
GenerationsBlocks.init();
@@ -168,7 +174,7 @@ public static void initBuiltinPacks(TriConsumer<PackType, ResourceLocation, Muta
168174
public static void onAnvilChange(ItemStack left, ItemStack right, Player player, Consumer<ItemStack> output, IntConsumer cost, IntConsumer materialCost) {
169175
if(player instanceof ServerPlayer serverPlayer && left.getItem() instanceof EnchantableItem enchantableItem && enchantableItem.neededEnchantmentLevel(serverPlayer) > 0 && !EnchantableItem.isEnchanted(left) && !EnchantableItem.isUsed(left) && right.isEmpty()) {
170176
output.accept(EnchantableItem.setEnchanted(left.copy(), true));
171-
cost.accept(100);
177+
cost.accept(Integer.MAX_VALUE);
172178
materialCost.accept(0);
173179
}
174180
}

common/src/main/java/generations/gg/generations/core/generationscore/common/GenerationsDataProvider.java

Lines changed: 0 additions & 146 deletions
This file was deleted.
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package generations.gg.generations.core.generationscore.common
2+
3+
import com.cobblemon.mod.common.api.Priority
4+
import com.cobblemon.mod.common.api.data.DataProvider
5+
import com.cobblemon.mod.common.api.data.DataRegistry
6+
import com.cobblemon.mod.common.api.reactive.SimpleObservable.subscribe
7+
import com.cobblemon.mod.common.platform.events.PlatformEvents
8+
import com.cobblemon.mod.common.platform.events.ServerPlayerEvent.Logout.player
9+
import com.cobblemon.mod.common.util.ifClient
10+
import com.cobblemon.mod.common.util.server
11+
import dev.architectury.platform.Platform
12+
import dev.architectury.utils.Env
13+
import dev.architectury.utils.EnvExecutor
14+
import generations.gg.generations.core.generationscore.common.client.CompiledModelLoader
15+
import generations.gg.generations.core.generationscore.common.network.packets.S2CUnlockReloadPacket
16+
import generations.gg.generations.core.generationscore.common.world.shop.ShopPresets
17+
import generations.gg.generations.core.generationscore.common.world.shop.Shops
18+
import net.minecraft.resources.ResourceLocation
19+
import net.minecraft.server.level.ServerPlayer
20+
import net.minecraft.server.packs.PackType
21+
import net.minecraft.server.packs.resources.ResourceManager
22+
import net.minecraft.server.packs.resources.ResourceManagerReloadListener
23+
import java.util.*
24+
import java.util.function.Consumer
25+
import kotlin.jvm.functions.Function0
26+
import kotlin.jvm.functions.Function0.invoke
27+
28+
class GenerationsDataProvider : DataProvider {
29+
// Both Forge n Fabric keep insertion order so if a registry depends on another simply register it after
30+
internal var canReload = true
31+
// Both Forge n Fabric keep insertion order so if a registry depends on another simply register it after
32+
private val registries = linkedSetOf<DataRegistry>()
33+
private val synchronizedPlayerIds = mutableListOf<UUID>()
34+
35+
private val scheduledActions = mutableMapOf<UUID, MutableList<() -> Unit>>()
36+
37+
fun registerDefaults() {
38+
this.register(Shops)
39+
this.register(ShopPresets)
40+
PlatformEvents.SERVER_PLAYER_LOGOUT.subscribe(Priority.HIGH) {
41+
synchronizedPlayerIds.remove(it.player.uuid)
42+
S2CUnlockReloadPacket().sendToPlayer(it.player)
43+
}
44+
45+
ifClient {
46+
GenerationsCore.implementation.registerResourceReloader(GenerationsCore.id("client_resources"), SimpleResourceReloader(PackType.CLIENT_RESOURCES), PackType.CLIENT_RESOURCES, emptyList())
47+
GenerationsCore.implementation.registerResourceReloader(GenerationsCore.id("model_registry"), CompiledModelLoader(), PackType.CLIENT_RESOURCES, emptyList())
48+
}
49+
50+
GenerationsCore.implementation.registerResourceReloader(GenerationsCore.id("data_resources"), SimpleResourceReloader(PackType.SERVER_DATA), PackType.SERVER_DATA, emptyList())
51+
}
52+
53+
override fun doAfterSync(player: ServerPlayer, action: () -> Unit) {
54+
if (synchronizedPlayerIds.contains(player.uuid)) {
55+
action.invoke()
56+
} else {
57+
scheduledActions.computeIfAbsent(player.uuid) { mutableListOf() }.add(action)
58+
}
59+
}
60+
61+
override fun <T : DataRegistry> register(registry: T): T {
62+
registries.add(registry)
63+
GenerationsCore.LOGGER.info("Registered the {} registry", registry.id)
64+
GenerationsCore.LOGGER.debug("Registered the {} registry of class {}", registry.id, registry.javaClass.canonicalName)
65+
return registry
66+
}
67+
68+
override fun fromIdentifier(registryIdentifier: ResourceLocation): DataRegistry? {
69+
return registries.stream().filter { it: DataRegistry? -> it!!.id == registryIdentifier }.findAny().orElse(null)
70+
}
71+
72+
override fun sync(player: ServerPlayer) {
73+
if (!player.connection.connection.isMemoryConnection) {
74+
registries.forEach(Consumer { registry: DataRegistry? -> registry!!.sync(player) })
75+
}
76+
77+
// CobblemonEvents.DATA_SYNCHRONIZED.emit(player)
78+
val waitingActions = scheduledActions.remove(player.uuid) ?: return
79+
waitingActions.forEach { it() }
80+
}
81+
82+
83+
internal inner class SimpleResourceReloader(private val type: PackType) : ResourceManagerReloadListener {
84+
override fun onResourceManagerReload(manager: ResourceManager) {
85+
// Check for a server running, this is due to the create a world screen triggering datapack reloads, these are fine to happen as many times as needed as players may be in the process of adding their datapacks.
86+
val isInGame = server() != null
87+
if (isInGame && this.type == PackType.SERVER_DATA && !INSTANCE.canReload) {
88+
return
89+
}
90+
91+
registries.stream().filter { it: DataRegistry? -> it!!.type == this.type }
92+
.forEach { it: DataRegistry? -> it!!.reload(manager) }
93+
if (isInGame && this.type == PackType.SERVER_DATA) {
94+
canReload = false
95+
}
96+
}
97+
98+
fun type(): PackType {
99+
return type
100+
}
101+
102+
override fun equals(obj: Any?): Boolean {
103+
if (obj === this) return true
104+
if (obj == null || obj.javaClass != this.javaClass) return false
105+
val that = obj as SimpleResourceReloader
106+
return this.type == that.type
107+
}
108+
109+
override fun hashCode(): Int {
110+
return Objects.hash(type)
111+
}
112+
113+
override fun toString(): String {
114+
return "SimpleResourceReloader[" +
115+
"type=" + type + ']'
116+
}
117+
}
118+
119+
companion object {
120+
@JvmField
121+
val INSTANCE: GenerationsDataProvider = GenerationsDataProvider()
122+
}
123+
}

common/src/main/java/generations/gg/generations/core/generationscore/common/GenerationsImplementation.java

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,19 @@
11
package generations.gg.generations.core.generationscore.common;
22

33
import dev.architectury.registry.registries.DeferredRegister;
4-
import generations.gg.generations.core.generationscore.common.network.ServerNetworkPacketHandler;
5-
import generations.gg.generations.core.generationscore.common.network.packets.GenerationsNetworkPacket;
6-
import generations.gg.generations.core.generationscore.common.network.packets.statue.UpdateStatueHandler;
7-
import generations.gg.generations.core.generationscore.common.network.packets.statue.UpdateStatuePacket;
8-
import kotlin.reflect.KClass;
9-
import kotlin.reflect.KFunction;
104
import net.minecraft.nbt.CompoundTag;
11-
import net.minecraft.network.FriendlyByteBuf;
12-
import net.minecraft.network.protocol.Packet;
13-
import net.minecraft.network.protocol.game.ClientGamePacketListener;
145
import net.minecraft.resources.ResourceLocation;
15-
import net.minecraft.server.level.ServerPlayer;
166
import net.minecraft.server.packs.PackType;
177
import net.minecraft.server.packs.resources.PreparableReloadListener;
188
import net.minecraft.world.entity.Entity;
199
import net.minecraft.world.entity.EquipmentSlot;
20-
import net.minecraft.world.entity.player.Player;
2110
import net.minecraft.world.item.CreativeModeTab;
2211
import net.minecraft.world.item.ItemStack;
2312
import net.minecraft.world.level.ItemLike;
2413
import net.minecraft.world.level.block.Block;
2514
import org.jetbrains.annotations.NotNull;
2615

2716
import java.util.Collection;
28-
import java.util.function.BiConsumer;
29-
import java.util.function.Consumer;
30-
import java.util.function.Function;
3117
import java.util.function.Supplier;
3218

3319
public interface GenerationsImplementation {
@@ -68,27 +54,6 @@ enum ModAPI {
6854
FORGE
6955
}
7056

71-
interface NetworkManager {
72-
73-
void registerClientBound();
74-
75-
void registerServerBound();
76-
77-
<T extends GenerationsNetworkPacket<T>> void createClientBound(ResourceLocation identifier, KClass<T> kClass, BiConsumer<T, FriendlyByteBuf> encoder, Function<FriendlyByteBuf, T> decoder, Consumer<T> handler);
78-
79-
<T extends GenerationsNetworkPacket<T>> void createServerBound(ResourceLocation identifier, KClass<T> kClass, BiConsumer<T, FriendlyByteBuf> encoder, Function<FriendlyByteBuf, T> decoder, ServerNetworkPacketHandler<T> handler);
80-
81-
void sendPacketToPlayer(ServerPlayer player, GenerationsNetworkPacket<?> packet);
82-
83-
void sendPacketToServer(GenerationsNetworkPacket<?> packet);
84-
85-
<T extends GenerationsNetworkPacket<?>> Packet<ClientGamePacketListener> asVanillaClientBound(T packet);
86-
87-
<T extends GenerationsNetworkPacket<?>, V extends Entity> void sendToAllTracking(T packet, V entity);
88-
89-
<T extends GenerationsNetworkPacket<T>> void createBothBound(ResourceLocation identifier, KClass<T> kClass, BiConsumer<T, FriendlyByteBuf> encoder, Function<FriendlyByteBuf, T> decoder, Consumer<T> clientHandler, ServerNetworkPacketHandler<T> serverHandler);
90-
}
91-
9257
enum Environment {
9358
CLIENT,
9459
SERVER

0 commit comments

Comments
 (0)