Skip to content

Commit

Permalink
Add LootTableFilter
Browse files Browse the repository at this point in the history
  • Loading branch information
LLytho committed Aug 3, 2024
1 parent ccad3cf commit 8d5007e
Show file tree
Hide file tree
Showing 7 changed files with 87 additions and 7 deletions.
12 changes: 12 additions & 0 deletions example_scripts/loot_table_filter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
LootJS.modifiers(event => {
event.addTableModifier(LootType.CHEST, /minecraft:entities.*/).customAction(() => {
console.log("Triggerd LootJS.modifiers for Chests and all entities");
})
});

LootJS.lootTables(event => {
console.log("All Chest and Entity loot tables: ")
for (let lt of event.modifyLootTables(LootType.CHEST, /minecraft:entities.*/)) {
console.log(" - " + lt.location)
}
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.almostreliable.lootjs.core.filters;

import com.almostreliable.lootjs.core.LootType;
import com.almostreliable.lootjs.loot.extension.LootContextExtension;
import net.minecraft.world.level.storage.loot.LootContext;
import net.minecraft.world.level.storage.loot.LootTable;

public interface LootTableFilter {

boolean test(LootTable table);

boolean test(LootContext context);

record ByIdFilter(IdFilter filter) implements LootTableFilter {

@Override
public boolean test(LootTable table) {
return filter.test(table.getLootTableId());
}

@Override
public boolean test(LootContext context) {
return filter.test(context.getQueriedLootTableId());
}
}

record ByLootType(LootType type) implements LootTableFilter {

@Override
public boolean test(LootTable lootTable) {
return type == LootType.getLootType(lootTable.getParamSet());
}

@Override
public boolean test(LootContext context) {
return LootContextExtension.cast(context).lootjs$isType(type);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.almostreliable.lootjs.core.entry.SingleLootEntry;
import com.almostreliable.lootjs.core.filters.IdFilter;
import com.almostreliable.lootjs.core.filters.ItemFilter;
import com.almostreliable.lootjs.core.filters.LootTableFilter;
import com.almostreliable.lootjs.kube.wrappers.*;
import com.almostreliable.lootjs.loot.LootCondition;
import com.almostreliable.lootjs.loot.LootFunction;
Expand Down Expand Up @@ -93,6 +94,7 @@ public void registerTypeWrappers(TypeWrapperRegistry registry) {
registry.register(EntitySubPredicate.class, BasicWrapper::ofEntitySubPredicate);

registry.register(IdFilter.class, BasicWrapper::ofIdFilter);
registry.register(LootTableFilter.class, BasicWrapper::ofLootTableFilter);
registry.register(ItemFilter.class, ItemFilterWrapper::ofItemFilter);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.almostreliable.lootjs.kube.wrappers;

import com.almostreliable.lootjs.core.LootType;
import com.almostreliable.lootjs.core.filters.IdFilter;
import com.almostreliable.lootjs.core.filters.LootTableFilter;
import com.almostreliable.lootjs.util.BlockFilter;
import com.almostreliable.lootjs.util.Utils;
import com.mojang.serialization.MapCodec;
Expand Down Expand Up @@ -168,4 +170,12 @@ public static IdFilter ofIdFilter(Object o) {
default -> throw new IllegalArgumentException("Invalid resource location filter: " + o);
};
}

public static LootTableFilter ofLootTableFilter(Object o) {
if (o instanceof LootType lootType) {
return new LootTableFilter.ByLootType(lootType);
}

return new LootTableFilter.ByIdFilter(ofIdFilter(o));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
import com.almostreliable.lootjs.LootModificationsAPI;
import com.almostreliable.lootjs.core.LootType;
import com.almostreliable.lootjs.core.filters.IdFilter;
import com.almostreliable.lootjs.core.filters.LootTableFilter;
import com.almostreliable.lootjs.loot.modifier.LootModifier;
import com.almostreliable.lootjs.util.BlockFilter;
import com.almostreliable.lootjs.util.Utils;
import com.google.common.base.Preconditions;
import dev.latvian.mods.kubejs.script.ConsoleJS;
import dev.latvian.mods.rhino.util.HideFromJS;
import net.minecraft.core.HolderSet;
import net.minecraft.resources.ResourceLocation;
Expand Down Expand Up @@ -57,7 +59,7 @@ public void disableLootModification(IdFilter... filters) {
LootModificationsAPI.FILTERS.addAll(Arrays.asList(filters));
}

public LootModifier.Builder addTableModifier(IdFilter... filters) {
public LootModifier.Builder addTableModifier(LootTableFilter... filters) {
if (filters.length == 0) {
throw new IllegalArgumentException("No loot table were given.");
}
Expand All @@ -68,7 +70,9 @@ public LootModifier.Builder addTableModifier(IdFilter... filters) {
return builder;
}

@Deprecated(forRemoval = true)
public LootModifier.Builder addTypeModifier(LootType... types) {
ConsoleJS.SERVER.error("LootJS: `addTypeModifier` is deprecated. Use `addTableModifier` with LootType instead.");
if (types.length == 0) {
throw new IllegalArgumentException("No loot type were given.");
}
Expand Down
17 changes: 15 additions & 2 deletions src/main/java/com/almostreliable/lootjs/loot/LootTableEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

import com.almostreliable.lootjs.core.LootType;
import com.almostreliable.lootjs.core.filters.IdFilter;
import com.almostreliable.lootjs.core.filters.LootTableFilter;
import com.almostreliable.lootjs.loot.table.LootTableList;
import com.almostreliable.lootjs.loot.table.MutableLootTable;
import com.mojang.serialization.Lifecycle;
import dev.latvian.mods.kubejs.script.ConsoleJS;
import net.minecraft.core.RegistrationInfo;
import net.minecraft.core.WritableRegistry;
import net.minecraft.core.registries.BuiltInRegistries;
Expand Down Expand Up @@ -89,10 +91,18 @@ public MutableLootTable getEntityTable(EntityType<?> entityType) {
return getLootTable(entityType.getDefaultLootTable());
}

public LootTableList modifyLootTables(IdFilter filter) {
public LootTableList modifyLootTables(LootTableFilter... filters) {
var tables = registry()
.stream()
.filter(lootTable -> filter.test(lootTable.getLootTableId()))
.filter(lootTable -> {
for (var f : filters) {
if (f.test(lootTable)) {
return true;
}
}

return false;
})
.map(MutableLootTable::new)
.toList();
return new LootTableList(tables);
Expand All @@ -116,7 +126,10 @@ public LootTableList modifyEntityTables(IdFilter filter) {
return new LootTableList(tables);
}

@Deprecated(forRemoval = true)
public LootTableList modifyLootTypeTables(LootType... types) {
ConsoleJS.SERVER.error(
"LootJS: `modifyLootTypeTables` is deprecated. Use `modifyLootTables` with LootType instead.");
Set<LootType> asSet = new HashSet<>(Arrays.asList(types));

var tables = registry().stream().filter(lootTable -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

import com.almostreliable.lootjs.core.LootBucket;
import com.almostreliable.lootjs.core.LootType;
import com.almostreliable.lootjs.core.filters.IdFilter;
import com.almostreliable.lootjs.core.filters.ItemFilter;
import com.almostreliable.lootjs.core.filters.LootTableFilter;
import com.almostreliable.lootjs.loot.extension.LootContextExtension;
import net.minecraft.core.HolderSet;
import net.minecraft.world.entity.Entity;
Expand Down Expand Up @@ -62,12 +62,12 @@ public LootModifier build() {
}
}

public record TableFiltered(IdFilter[] filters) implements Predicate<LootContext> {
public record TableFiltered(LootTableFilter[] filters) implements Predicate<LootContext> {

@Override
public boolean test(LootContext context) {
for (IdFilter filter : filters) {
if (filter.test(context.getQueriedLootTableId())) {
for (var filter : filters) {
if (filter.test(context)) {
return true;
}
}
Expand Down

0 comments on commit 8d5007e

Please sign in to comment.