1.19.4
This commit is contained in:
parent
a3e5a32548
commit
24a66f91f8
@ -1,6 +1,9 @@
|
||||
Flan 1.8.4.1
|
||||
================
|
||||
- Fabric: Add harvest with ease compat
|
||||
- Update to 1.19.4
|
||||
<i>
|
||||
- Fabric: Add harvest with ease compat
|
||||
</i>
|
||||
|
||||
Flan 1.8.4
|
||||
================
|
||||
|
@ -4,7 +4,7 @@ import com.mojang.datafixers.util.Pair;
|
||||
import io.github.flemmli97.flan.config.ConfigHandler;
|
||||
import io.github.flemmli97.flan.platform.CrossPlatformStuff;
|
||||
import net.minecraft.core.HolderSet;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.world.item.BoneMealItem;
|
||||
@ -70,7 +70,7 @@ public class ObjectToPermissionMap {
|
||||
boolean remove = sub[1].equals("NONE");
|
||||
if (s.startsWith("@")) {
|
||||
ResourceLocation res = new ResourceLocation(sub[0].substring(1));
|
||||
Optional<HolderSet.Named<Item>> t = Registry.ITEM.getTags().filter(p -> p.getFirst().location().equals(res))
|
||||
Optional<HolderSet.Named<Item>> t = BuiltInRegistries.ITEM.getTags().filter(p -> p.getFirst().location().equals(res))
|
||||
.map(Pair::getSecond).findFirst();
|
||||
t.ifPresent(holders -> holders.forEach(i -> {
|
||||
if (remove)
|
||||
@ -90,7 +90,7 @@ public class ObjectToPermissionMap {
|
||||
boolean remove = sub[1].equals("NONE");
|
||||
if (s.startsWith("@")) {
|
||||
ResourceLocation res = new ResourceLocation(sub[0].substring(1));
|
||||
Optional<HolderSet.Named<Block>> t = Registry.BLOCK.getTags().filter(p -> p.getFirst().location().equals(res))
|
||||
Optional<HolderSet.Named<Block>> t = BuiltInRegistries.BLOCK.getTags().filter(p -> p.getFirst().location().equals(res))
|
||||
.map(Pair::getSecond).findFirst();
|
||||
t.ifPresent(holders -> holders.forEach(i -> {
|
||||
if (remove)
|
||||
|
@ -141,13 +141,13 @@ public class Claim implements IPermissionContainer {
|
||||
}
|
||||
|
||||
private BlockPos getInitCenterPos() {
|
||||
BlockPos center = new BlockPos(this.minX + (this.maxX - this.minX) * 0.5, 0, this.minZ + (this.maxZ - this.minZ) * 0.5);
|
||||
BlockPos center = BlockPos.containing(this.minX + (this.maxX - this.minX) * 0.5, 0, this.minZ + (this.maxZ - this.minZ) * 0.5);
|
||||
int y = this.world.getChunk(center.getX() >> 4, center.getZ() >> 4, ChunkStatus.HEIGHTMAPS).getHeight(Heightmap.Types.MOTION_BLOCKING, center.getX() & 15, center.getZ() & 15);
|
||||
return new BlockPos(center.getX(), y + 1, center.getZ());
|
||||
}
|
||||
|
||||
private BlockPos getDefaultCenterPos() {
|
||||
BlockPos center = new BlockPos(this.minX + (this.maxX - this.minX) * 0.5, 0, this.minZ + (this.maxZ - this.minZ) * 0.5);
|
||||
BlockPos center = BlockPos.containing(this.minX + (this.maxX - this.minX) * 0.5, 0, this.minZ + (this.maxZ - this.minZ) * 0.5);
|
||||
return new BlockPos(center.getX(), 255, center.getZ());
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
package io.github.flemmli97.flan.claim;
|
||||
|
||||
import com.mojang.math.Vector3f;
|
||||
import net.minecraft.core.particles.DustParticleOptions;
|
||||
import org.joml.Vector3f;
|
||||
|
||||
public class ParticleIndicators {
|
||||
|
||||
|
@ -497,7 +497,7 @@ public class CommandClaim {
|
||||
private static int adminDelete(CommandContext<CommandSourceStack> context) {
|
||||
CommandSourceStack src = context.getSource();
|
||||
ClaimStorage storage = ClaimStorage.get(src.getLevel());
|
||||
Claim claim = storage.getClaimAt(new BlockPos(src.getPosition()));
|
||||
Claim claim = storage.getClaimAt(BlockPos.containing(src.getPosition()));
|
||||
if (claim == null) {
|
||||
src.sendSuccess(PermHelper.simpleColoredText(ConfigHandler.langManager.get("noClaim"), ChatFormatting.RED), false);
|
||||
return 0;
|
||||
|
@ -47,7 +47,7 @@ public class CommandHelpers {
|
||||
|
||||
public static CompletableFuture<Suggestions> permSuggestions(CommandContext<CommandSourceStack> context, SuggestionsBuilder build, boolean group) {
|
||||
ServerLevel world = context.getSource().getLevel();
|
||||
Claim claim = ClaimStorage.get(world).getClaimAt(new BlockPos(context.getSource().getPosition()));
|
||||
Claim claim = ClaimStorage.get(world).getClaimAt(BlockPos.containing(context.getSource().getPosition()));
|
||||
boolean admin = claim != null && claim.isAdminClaim();
|
||||
List<String> allowedPerms = new ArrayList<>();
|
||||
for (ClaimPermission perm : PermissionRegistry.getPerms()) {
|
||||
|
@ -133,7 +133,7 @@ public class BuySellHandler {
|
||||
ItemEntity itemEntity = player.drop(toGive, false);
|
||||
if (itemEntity != null) {
|
||||
itemEntity.setNoPickUpDelay();
|
||||
itemEntity.setOwner(player.getUUID());
|
||||
itemEntity.setTarget(player.getUUID());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -145,7 +145,7 @@ public class BlockInteractEvents {
|
||||
if (owner instanceof ServerPlayer)
|
||||
player = (ServerPlayer) owner;
|
||||
} else if (entity instanceof ItemEntity) {
|
||||
Entity owner = ((ServerLevel) world).getEntity(((ItemEntity) entity).getThrower());
|
||||
Entity owner = ((ItemEntity) entity).getOwner();
|
||||
if (owner instanceof ServerPlayer)
|
||||
player = (ServerPlayer) owner;
|
||||
}
|
||||
@ -209,7 +209,7 @@ public class BlockInteractEvents {
|
||||
return !claim.canInteract((ServerPlayer) owner, PermissionRegistry.TRAMPLE, pos, true);
|
||||
}
|
||||
} else if (entity instanceof ItemEntity) {
|
||||
Entity owner = serverWorld.getEntity(((ItemEntity) entity).getThrower());
|
||||
Entity owner = ((ItemEntity) entity).getOwner();
|
||||
if (owner instanceof ServerPlayer) {
|
||||
ClaimStorage storage = ClaimStorage.get(serverWorld);
|
||||
IPermissionContainer claim = storage.getForPermissionCheck(pos);
|
||||
|
@ -22,6 +22,7 @@ import net.minecraft.resources.ResourceLocation;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.sounds.SoundEvents;
|
||||
import net.minecraft.tags.DamageTypeTags;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.world.InteractionResult;
|
||||
@ -188,7 +189,7 @@ public class EntityInteractEvents {
|
||||
public static boolean preventDamage(Entity entity, DamageSource source) {
|
||||
if (source.getEntity() instanceof ServerPlayer)
|
||||
return attackSimple((ServerPlayer) source.getEntity(), entity, true) != InteractionResult.PASS;
|
||||
else if (source.isExplosion() && !entity.level.isClientSide && !(entity instanceof ServerPlayer || entity instanceof Enemy)) {
|
||||
else if (source.is(DamageTypeTags.IS_EXPLOSION) && !entity.level.isClientSide && !(entity instanceof ServerPlayer || entity instanceof Enemy)) {
|
||||
IPermissionContainer claim = ClaimStorage.get((ServerLevel) entity.level).getForPermissionCheck(entity.blockPosition());
|
||||
return claim != null && !claim.canInteract(null, PermissionRegistry.EXPLOSIONS, entity.blockPosition());
|
||||
}
|
||||
|
@ -10,8 +10,11 @@ import io.github.flemmli97.flan.player.LogoutTracker;
|
||||
import io.github.flemmli97.flan.player.PlayerClaimData;
|
||||
import net.minecraft.ChatFormatting;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.core.registries.Registries;
|
||||
import net.minecraft.data.worldgen.features.CaveFeatures;
|
||||
import net.minecraft.data.worldgen.features.NetherFeatures;
|
||||
import net.minecraft.resources.ResourceKey;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.entity.Entity;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
@ -20,6 +23,8 @@ import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.level.block.GrassBlock;
|
||||
import net.minecraft.world.level.block.MossBlock;
|
||||
import net.minecraft.world.level.block.state.BlockState;
|
||||
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.NetherForestVegetationConfig;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.TwistingVinesConfig;
|
||||
import net.minecraft.world.level.levelgen.feature.configurations.VegetationPatchConfiguration;
|
||||
@ -53,22 +58,33 @@ public class PlayerEvents {
|
||||
if (!ClaimStorage.get(serverPlayer.getLevel()).getForPermissionCheck(pos).canInteract(serverPlayer, perm, pos, false))
|
||||
return false;
|
||||
int range = 0;
|
||||
Registry<ConfiguredFeature<?, ?>> registry = serverPlayer.level.registryAccess().registryOrThrow(Registries.CONFIGURED_FEATURE);
|
||||
if (state.getBlock() instanceof MossBlock) {
|
||||
VegetationPatchConfiguration cfg = CaveFeatures.MOSS_PATCH_BONEMEAL.value().config();
|
||||
range = cfg.xzRadius.getMaxValue() + 1;
|
||||
pos.set(pos.getX(), pos.getY() + cfg.verticalRange + 1, pos.getZ());
|
||||
VegetationPatchConfiguration cfg = featureRange(registry, CaveFeatures.MOSS_PATCH_BONEMEAL, VegetationPatchConfiguration.class);
|
||||
if (cfg != null) {
|
||||
range = cfg.xzRadius.getMaxValue() + 1;
|
||||
pos.set(pos.getX(), pos.getY() + cfg.verticalRange + 1, pos.getZ());
|
||||
}
|
||||
} else if (state.getBlock() instanceof GrassBlock) {
|
||||
range = 4;
|
||||
} else if (state.is(Blocks.CRIMSON_NYLIUM)) {
|
||||
NetherForestVegetationConfig cfg = NetherFeatures.CRIMSON_FOREST_VEGETATION_BONEMEAL.value().config();
|
||||
range = cfg.spreadWidth;
|
||||
pos.set(pos.getX(), pos.getY() + cfg.spreadHeight + 1, pos.getZ());
|
||||
NetherForestVegetationConfig cfg = featureRange(registry, NetherFeatures.CRIMSON_FOREST_VEGETATION_BONEMEAL, NetherForestVegetationConfig.class);
|
||||
if (cfg != null) {
|
||||
range = cfg.spreadWidth;
|
||||
pos.set(pos.getX(), pos.getY() + cfg.spreadHeight + 1, pos.getZ());
|
||||
}
|
||||
} else if (state.is(Blocks.WARPED_NYLIUM)) {
|
||||
NetherForestVegetationConfig cfg = NetherFeatures.WARPED_FOREST_VEGETATION_BONEMEAL.value().config();
|
||||
NetherForestVegetationConfig cfg2 = NetherFeatures.NETHER_SPROUTS_BONEMEAL.value().config();
|
||||
TwistingVinesConfig cfg3 = NetherFeatures.TWISTING_VINES_BONEMEAL.value().config();
|
||||
range = Math.max(Math.max(cfg.spreadWidth, cfg2.spreadWidth), cfg3.spreadWidth());
|
||||
int y = Math.max(Math.max(cfg.spreadHeight, cfg2.spreadHeight), cfg3.spreadHeight());
|
||||
NetherForestVegetationConfig cfg = featureRange(registry, NetherFeatures.WARPED_FOREST_VEGETATION_BONEMEAL, NetherForestVegetationConfig.class);
|
||||
NetherForestVegetationConfig cfg2 = featureRange(registry, NetherFeatures.NETHER_SPROUTS_BONEMEAL, NetherForestVegetationConfig.class);
|
||||
TwistingVinesConfig cfg3 = featureRange(registry, NetherFeatures.TWISTING_VINES_BONEMEAL, TwistingVinesConfig.class);
|
||||
int w1 = cfg == null ? 0 : cfg.spreadWidth;
|
||||
int w2 = cfg2 == null ? 0 : cfg2.spreadWidth;
|
||||
int w3 = cfg3 == null ? 0 : cfg3.spreadWidth();
|
||||
int h1 = cfg == null ? 0 : cfg.spreadHeight;
|
||||
int h2 = cfg2 == null ? 0 : cfg2.spreadHeight;
|
||||
int h3 = cfg3 == null ? 0 : cfg3.spreadHeight();
|
||||
range = Math.max(Math.max(w1, w2), w3);
|
||||
int y = Math.max(Math.max(h1, h2), h3);
|
||||
pos.set(pos.getX(), pos.getY() + y + 1, pos.getZ());
|
||||
}
|
||||
if (range > 0 && perm != null && !ClaimStorage.get(serverPlayer.getLevel()).canInteract(pos, range, serverPlayer, perm, false)) {
|
||||
@ -94,4 +110,13 @@ public class PlayerEvents {
|
||||
public static boolean canSculkTrigger(BlockPos pos, ServerPlayer player) {
|
||||
return ClaimStorage.get(player.getLevel()).getForPermissionCheck(pos).canInteract(player, PermissionRegistry.SCULK, pos, false);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T extends FeatureConfiguration> T featureRange(Registry<ConfiguredFeature<?, ?>> registry, ResourceKey<ConfiguredFeature<?, ?>> key, Class<T> clss) {
|
||||
return registry.getHolder(key).map(r -> {
|
||||
if (clss.isInstance(r.value().config()))
|
||||
return (T) r.value().config();
|
||||
return null;
|
||||
}).orElse(null);
|
||||
}
|
||||
}
|
||||
|
@ -7,6 +7,8 @@ import io.github.flemmli97.flan.config.Config;
|
||||
import io.github.flemmli97.flan.config.ConfigHandler;
|
||||
import io.github.flemmli97.flan.player.PlayerClaimData;
|
||||
import net.minecraft.ChatFormatting;
|
||||
import net.minecraft.core.Holder;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.nbt.ListTag;
|
||||
import net.minecraft.nbt.StringTag;
|
||||
import net.minecraft.network.chat.Component;
|
||||
@ -102,6 +104,11 @@ public class ServerScreenHelper {
|
||||
}
|
||||
|
||||
public static void playSongToPlayer(ServerPlayer player, SoundEvent event, float vol, float pitch) {
|
||||
player.connection.send(
|
||||
new ClientboundSoundPacket(BuiltInRegistries.SOUND_EVENT.wrapAsHolder(event), SoundSource.PLAYERS, player.position().x, player.position().y, player.position().z, vol, pitch, player.level.getRandom().nextLong()));
|
||||
}
|
||||
|
||||
public static void playSongToPlayer(ServerPlayer player, Holder<SoundEvent> event, float vol, float pitch) {
|
||||
player.connection.send(
|
||||
new ClientboundSoundPacket(event, SoundSource.PLAYERS, player.position().x, player.position().y, player.position().z, vol, pitch, player.level.getRandom().nextLong()));
|
||||
}
|
||||
|
@ -15,7 +15,7 @@ import java.util.function.BiFunction;
|
||||
public class TeleportUtils {
|
||||
|
||||
public static BlockPos roundedBlockPos(Vec3 pos) {
|
||||
return new BlockPos(pos);
|
||||
return BlockPos.containing(pos);
|
||||
}
|
||||
|
||||
public static Vec3 getTeleportPos(ServerPlayer player, Vec3 playerPos, ClaimStorage storage, int[] dim, BlockPos.MutableBlockPos bPos, BiFunction<Claim, BlockPos, Boolean> check) {
|
||||
|
@ -72,9 +72,7 @@ dependencies {
|
||||
|
||||
modCompileOnly "dev.ftb.mods:ftb-ranks-fabric:${rootProject.ftb_ranks}"
|
||||
|
||||
modRuntimeOnly "dev.ftb.mods:ftb-chunks-fabric:${rootProject.ftb_chunks}"
|
||||
|
||||
modRuntimeOnly "dev.ftb.mods:ftb-chunks-fabric:${rootProject.ftb_chunks}"
|
||||
//modRuntimeOnly "dev.ftb.mods:ftb-chunks-fabric:${rootProject.ftb_chunks}"
|
||||
//CompileOnly cause too many dependency
|
||||
modCompileOnly goml_reserved
|
||||
modCompileOnly include("com.jamieswhiteshirt:rtree-3i-lite-fabric:0.3.0")
|
||||
|
@ -4,7 +4,7 @@ import io.github.flemmli97.flan.SimpleRegistryWrapper;
|
||||
import io.github.flemmli97.flan.fabric.FabricRegistryWrapper;
|
||||
import io.github.flemmli97.flan.platform.CrossPlatformStuff;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
import net.minecraft.core.Registry;
|
||||
import net.minecraft.core.registries.BuiltInRegistries;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.world.Container;
|
||||
import net.minecraft.world.WorldlyContainerHolder;
|
||||
@ -25,22 +25,22 @@ public class CrossPlatformStuffImpl implements CrossPlatformStuff {
|
||||
|
||||
@Override
|
||||
public SimpleRegistryWrapper<MobEffect> registryStatusEffects() {
|
||||
return new FabricRegistryWrapper<>(Registry.MOB_EFFECT);
|
||||
return new FabricRegistryWrapper<>(BuiltInRegistries.MOB_EFFECT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SimpleRegistryWrapper<Block> registryBlocks() {
|
||||
return new FabricRegistryWrapper<>(Registry.BLOCK);
|
||||
return new FabricRegistryWrapper<>(BuiltInRegistries.BLOCK);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SimpleRegistryWrapper<Item> registryItems() {
|
||||
return new FabricRegistryWrapper<>(Registry.ITEM);
|
||||
return new FabricRegistryWrapper<>(BuiltInRegistries.ITEM);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SimpleRegistryWrapper<EntityType<?>> registryEntities() {
|
||||
return new FabricRegistryWrapper<>(Registry.ENTITY_TYPE);
|
||||
return new FabricRegistryWrapper<>(BuiltInRegistries.ENTITY_TYPE);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -26,6 +26,6 @@
|
||||
],
|
||||
"depends": {
|
||||
"fabric": ">=0.57.0",
|
||||
"minecraft": ">=1.19"
|
||||
"minecraft": ">=1.19.4"
|
||||
}
|
||||
}
|
||||
|
@ -46,7 +46,7 @@ dependencies {
|
||||
modCompileOnly "dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}"
|
||||
modCompileOnly dicemcmm
|
||||
|
||||
modRuntimeOnly "dev.ftb.mods:ftb-chunks-forge:${rootProject.ftb_chunks}"
|
||||
//modRuntimeOnly "dev.ftb.mods:ftb-chunks-forge:${rootProject.ftb_chunks}"
|
||||
//CompileOnly cause dependencies
|
||||
modCompileOnly "com.ldtteam:minecolonies:${rootProject.minecolonies}"
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
modLoader="javafml"
|
||||
loaderVersion="[41,)"
|
||||
loaderVersion="[45,)"
|
||||
license="All rights reserved"
|
||||
issueTrackerURL="https://github.com/Flemmli97/Flan/issues"
|
||||
[[mods]]
|
||||
@ -13,12 +13,12 @@ description='''Flan (Forge version): A serverside claiming mod'''
|
||||
[[dependencies.flan]]
|
||||
modId="minecraft"
|
||||
mandatory=true
|
||||
versionRange="[1.19,)"
|
||||
versionRange="[1.19.4,)"
|
||||
ordering="NONE"
|
||||
side="BOTH"
|
||||
[[dependencies.flan]]
|
||||
modId="forge"
|
||||
mandatory=true
|
||||
versionRange="[41.1.0,)"
|
||||
versionRange="[45.0.22,)"
|
||||
ordering="NONE"
|
||||
side="BOTH"
|
||||
|
@ -1,12 +1,12 @@
|
||||
org.gradle.jvmargs=-Xmx2G
|
||||
org.gradle.jvmargs=-Xmx3G
|
||||
enabled_platforms=fabric,forge
|
||||
minecraft_version=1.19.2
|
||||
parchment_version=1.19.2:2022.11.27
|
||||
minecraft_version=1.19.4
|
||||
parchment_version=1.19.3:2023.03.12
|
||||
|
||||
# Forge Properties
|
||||
forge_version=1.19.2-43.2.3
|
||||
forge_version=1.19.4-45.0.22
|
||||
# Fabric Properties
|
||||
loader_version=0.14.11
|
||||
loader_version=0.14.17
|
||||
|
||||
# Mod Properties
|
||||
mod_version=1.8.4.1
|
||||
@ -14,20 +14,20 @@ maven_group=io.github.flemmli97
|
||||
archives_base_name=flan
|
||||
|
||||
# Dependencies
|
||||
fabric_version=0.70.0+1.19.2
|
||||
fabric_version=0.76.0+1.19.4
|
||||
fabric_permissions_api=0.2-SNAPSHOT
|
||||
dynmap_fabric=curse.maven:dynmap-59433:4512919
|
||||
diamond_economy=curse.maven:diamondeconomy-534301:4453952
|
||||
harvest_with_ease_fabric=curse.maven:harvestwithease-602171:4487309
|
||||
octo_economy_api=com.github.ExcessiveAmountsOfZombies:OctoEconomyApi:5137175b1c
|
||||
eights_economy=curse.maven:eightseconomy-559967:4520933
|
||||
goml_reserved=curse.maven:goml-572651:4435272
|
||||
minecolonies=1.19.4-1.0.1328-BETA
|
||||
# Not updated
|
||||
player_ability_lib=1.2.2
|
||||
ftb_ranks=1900.1.9-build.42
|
||||
ftb_chunks=1902.3.9-build.168
|
||||
dicemcmm=curse.maven:dicemcmoney-406972:3827507
|
||||
dynmap_fabric=curse.maven:dynmap-59433:3840510
|
||||
diamond_economy=curse.maven:diamondeconomy-534301:3837320
|
||||
harvest_with_ease_fabric=curse.maven:harvestwithease-602171:4442026
|
||||
#
|
||||
octo_economy_api=com.github.ExcessiveAmountsOfZombies:OctoEconomyApi:5137175b1c
|
||||
eights_economy=curse.maven:eightseconomy-559967:3836124
|
||||
goml_reserved=curse.maven:goml-572651:4105762
|
||||
minecolonies=1.19.2-1.0.999-ALPHA
|
||||
|
||||
# Curse properties
|
||||
curse_versions=1.19, 1.19.1, 1.19.2, Java 17
|
||||
|
Loading…
Reference in New Issue
Block a user