Skip to content

Commit

Permalink
Implement blacklisting through modwide JSON and tags.
Browse files Browse the repository at this point in the history
Bump to 1.3.
  • Loading branch information
Overcontrol1 committed Jun 25, 2024
1 parent e115d7e commit 844686a
Show file tree
Hide file tree
Showing 9 changed files with 117 additions and 14 deletions.
14 changes: 13 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,23 @@ dependencies {
include modImplementation("xyz.nucleoid:server-translations-api:${project.server_translations_version}")
}

final String minecraft_version = stonecutter.current.version

processResources {
inputs.property "version", project.version
inputs.property "minecraft_version", minecraft_version
inputs.property "polymer_version", project.property("polymer_version")
inputs.property "server_translations_version", project.property("server_translations_version")



filesMatching("fabric.mod.json") {
expand "version": project.version
expand ([
"version": project.version,
"minecraft_version": minecraft_version,
"polymer_version": project.property("polymer_version"),
"server_translations_version": project.property("server_translations_version")
])
}
}

Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ yarn_mappings=1.20.1+build.10
loader_version=0.15.11

# Mod Properties
mod_version=1.2.1
mod_version=1.3
maven_group=com.overcontrol1.randomfishing
archives_base_name=randomfishing

Expand Down
2 changes: 1 addition & 1 deletion settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ plugins {

stonecutter {
shared {
versions "1.20.1"
vers "1.20.1"
vers "1.20.4"
}

Expand Down
20 changes: 20 additions & 0 deletions src/main/java/com/overcontrol1/randomfishing/RandomFishing.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
package com.overcontrol1.randomfishing;

import com.overcontrol1.randomfishing.data.RandomFishingDataLoader;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.gamerule.v1.GameRuleFactory;
import net.fabricmc.fabric.api.gamerule.v1.GameRuleRegistry;
import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.item.Item;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.registry.entry.RegistryEntry;
import net.minecraft.registry.tag.TagKey;
import net.minecraft.resource.ResourceType;
import net.minecraft.util.Identifier;
import net.minecraft.world.GameRules;

Expand All @@ -16,8 +23,21 @@ public class RandomFishing implements ModInitializer {
public static final GameRules.Key<GameRules.IntRule> MAX_COUNT = GameRuleRegistry.register("randomFishingMaxCount",
GameRules.Category.MISC, GameRuleFactory.createIntRule(64, 1, 64));

public static final TagKey<Item> ITEM_BLACKLIST = TagKey.of(RegistryKeys.ITEM, new Identifier(MOD_ID, "blacklist"));

public static boolean isBlacklisted(RegistryEntry<Item> entry) {
final Identifier id = entry.getKey().orElseThrow().getValue();

if (RandomFishingDataLoader.isBlacklisted(id.getNamespace()))
return true;

return entry.isIn(ITEM_BLACKLIST);
}

@Override
public void onInitialize() {
ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(RandomFishingDataLoader.INSTANCE);

Registry.register(Registries.ENCHANTMENT, new Identifier(MOD_ID, "random_fishing"), ENCHANTMENT);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.overcontrol1.randomfishing.data;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.overcontrol1.randomfishing.RandomFishing;
import it.unimi.dsi.fastutil.objects.ObjectArraySet;
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener;
import net.minecraft.resource.Resource;
import net.minecraft.resource.ResourceManager;
import net.minecraft.util.Identifier;
import net.minecraft.util.profiler.Profiler;

import java.io.IOException;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;

public final class RandomFishingDataLoader implements IdentifiableResourceReloadListener {
public static final RandomFishingDataLoader INSTANCE = new RandomFishingDataLoader();

private static final Identifier ID = new Identifier(RandomFishing.MOD_ID, "data");

private static final Identifier JSON_PATH = new Identifier(RandomFishing.MOD_ID, "blacklist.json");

private static final Set<String> MOD_BLACKLIST = new ObjectOpenHashSet<>();

public static boolean isBlacklisted(String namespace) {
return MOD_BLACKLIST.contains(namespace);
}

@Override
public Identifier getFabricId() {
return ID;
}

@Override
public CompletableFuture<Void> reload(Synchronizer synchronizer, ResourceManager manager, Profiler prepareProfiler, Profiler applyProfiler, Executor prepareExecutor, Executor applyExecutor) {
MOD_BLACKLIST.clear();

final CompletableFuture<Set<String>> gatherer = CompletableFuture.supplyAsync(() -> load(manager));

return gatherer.thenCompose(synchronizer::whenPrepared)
.thenAcceptAsync(MOD_BLACKLIST::addAll);
}

private static Set<String> load(ResourceManager manager) {
final Set<String> result = new ObjectArraySet<>();
for (Resource resource : manager.getAllResources(JSON_PATH)) {
try {
final JsonElement element = JsonParser.parseReader(resource.getReader());
final JsonArray array = element.getAsJsonArray();
array.forEach(jsonElement -> result.add(jsonElement.getAsString()));
} catch (IOException e) {
throw new RuntimeException(e);
}
}

return result;
}

private RandomFishingDataLoader() {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.Entity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.PotionItem;
import net.minecraft.item.TippedArrowItem;
import net.minecraft.item.*;
import net.minecraft.loot.LootTable;
import net.minecraft.loot.context.LootContextParameterSet;
import net.minecraft.loot.context.LootContextParameters;
Expand All @@ -25,7 +22,7 @@

@Mixin(LootTable.class)
public class MixinLootTable {
@Shadow @Final private LootContextType type;
@Shadow @Final LootContextType type;

@ModifyReturnValue(method = "generateLoot(Lnet/minecraft/loot/context/LootContextParameterSet;)Lit/unimi/dsi/fastutil/objects/ObjectArrayList;", at = @At("RETURN"))
public ObjectArrayList<ItemStack> randomfishing$overrideFishingLootIfEnchantmentPresent(ObjectArrayList<ItemStack> original, LootContextParameterSet parameterSet) {
Expand All @@ -43,8 +40,15 @@ public class MixinLootTable {

World world = bobberEntity.getWorld();

Item item = Registries.ITEM.getRandom(world.random).map(RegistryEntry.Reference::value).orElse(null);
assert item != null;
final Item[] compatibleItems = Registries.ITEM.streamEntries()
.filter(entry -> entry.value() != Items.AIR && !RandomFishing.isBlacklisted(entry))
.map(RegistryEntry.Reference::value)
.toArray(Item[]::new);

if (compatibleItems.length == 0)
return original;

final Item item = compatibleItems[world.random.nextInt(compatibleItems.length)];
ItemStack stack = new ItemStack(item, world.random.nextBetween(1, Math.min(item.getMaxCount(), world.getGameRules().getInt(RandomFishing.MAX_COUNT))));

if (item instanceof PotionItem || item instanceof TippedArrowItem)
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/data/randomfishing/blacklist.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[]
8 changes: 5 additions & 3 deletions src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,11 @@
"randomfishing.mixins.json"
],
"depends": {
"fabricloader": ">=0.15.2",
"minecraft": "1.20.1",
"fabricloader": ">=0.15.11",
"minecraft": "${minecraft_version}",
"java": ">=17",
"fabric-api": "*"
"fabric-api": "*",
"polymer": "${polymer_version}",
"server-translations-api": "${server_translations_version}"
}
}
2 changes: 1 addition & 1 deletion stonecutter.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ stonecutter.active "1.20.1" /* [SC] DO NOT EDIT */
stonecutter.registerChiseled tasks.register("chiseledBuild", stonecutter.chiseled) {
setGroup "project"
ofTask "build"
}
}

0 comments on commit 844686a

Please sign in to comment.