mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-24 17:39:30 +00:00
@@ -319,8 +319,6 @@ templates:
|
||||
loot_table:ore:
|
||||
pools:
|
||||
- rolls: 1
|
||||
conditions:
|
||||
- type: survives_explosion
|
||||
entries:
|
||||
- type: alternatives
|
||||
children:
|
||||
@@ -329,13 +327,14 @@ templates:
|
||||
conditions:
|
||||
- type: enchantment
|
||||
predicate: minecraft:silk_touch>=1
|
||||
- type: item
|
||||
item: "{ore_drop}"
|
||||
functions:
|
||||
- type: apply_bonus
|
||||
enchantment: minecraft:fortune
|
||||
formula: ore_drops
|
||||
- type: explosion_decay
|
||||
- type: item
|
||||
item: "{ore_drop}"
|
||||
functions:
|
||||
- type: apply_bonus
|
||||
enchantment: minecraft:fortune
|
||||
formula:
|
||||
type: ore_drops
|
||||
- type: explosion_decay
|
||||
loot_table:leaves:
|
||||
pools:
|
||||
- rolls: 1
|
||||
|
||||
@@ -12,6 +12,7 @@ import net.momirealms.craftengine.core.block.EmptyBlock;
|
||||
import net.momirealms.craftengine.core.block.ImmutableBlockState;
|
||||
import net.momirealms.craftengine.core.block.PushReaction;
|
||||
import net.momirealms.craftengine.core.block.properties.Property;
|
||||
import net.momirealms.craftengine.core.entity.player.InteractionHand;
|
||||
import net.momirealms.craftengine.core.item.Item;
|
||||
import net.momirealms.craftengine.core.loot.parameter.LootParameters;
|
||||
import net.momirealms.craftengine.core.plugin.config.ConfigManager;
|
||||
@@ -116,10 +117,12 @@ public class BlockEventListener implements Listener {
|
||||
return;
|
||||
}
|
||||
|
||||
BukkitServerPlayer serverPlayer = plugin.adapt(player);
|
||||
// drop items
|
||||
ContextHolder.Builder builder = ContextHolder.builder();
|
||||
builder.withParameter(LootParameters.LOCATION, vec3d);
|
||||
builder.withParameter(LootParameters.PLAYER, plugin.adapt(player));
|
||||
builder.withParameter(LootParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND));
|
||||
for (Item<Object> item : state.getDrops(builder, world)) {
|
||||
world.dropItemNaturally(vec3d, item);
|
||||
}
|
||||
|
||||
@@ -4,12 +4,25 @@ import net.momirealms.craftengine.core.item.Enchantment;
|
||||
import net.momirealms.craftengine.core.item.Item;
|
||||
import net.momirealms.craftengine.core.loot.LootContext;
|
||||
import net.momirealms.craftengine.core.loot.condition.LootCondition;
|
||||
import net.momirealms.craftengine.core.loot.condition.LootConditions;
|
||||
import net.momirealms.craftengine.core.loot.parameter.LootParameters;
|
||||
import net.momirealms.craftengine.core.loot.provider.FixedNumberProvider;
|
||||
import net.momirealms.craftengine.core.loot.provider.NumberProviderFactory;
|
||||
import net.momirealms.craftengine.core.loot.provider.UniformNumberProvider;
|
||||
import net.momirealms.craftengine.core.registry.BuiltInRegistries;
|
||||
import net.momirealms.craftengine.core.registry.Holder;
|
||||
import net.momirealms.craftengine.core.registry.Registries;
|
||||
import net.momirealms.craftengine.core.registry.WritableRegistry;
|
||||
import net.momirealms.craftengine.core.util.Key;
|
||||
import net.momirealms.craftengine.core.util.MiscUtils;
|
||||
import net.momirealms.craftengine.core.util.RandomUtils;
|
||||
import net.momirealms.craftengine.core.util.ResourceKey;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
public class ApplyBonusCountFunction<T> extends AbstractLootConditionalFunction<T> {
|
||||
public static final Factory<?> FACTORY = new Factory<>();
|
||||
@@ -26,7 +39,7 @@ public class ApplyBonusCountFunction<T> extends AbstractLootConditionalFunction<
|
||||
protected Item<T> applyInternal(Item<T> item, LootContext context) {
|
||||
Optional<Item<?>> itemInHand = context.getOptionalParameter(LootParameters.TOOL);
|
||||
int level = itemInHand.map(value -> value.getEnchantment(this.enchantment).map(Enchantment::level).orElse(0)).orElse(0);
|
||||
int newCount = formula.apply(item.count(), level);
|
||||
int newCount = this.formula.apply(item.count(), level);
|
||||
item.count(newCount);
|
||||
return item;
|
||||
}
|
||||
@@ -38,9 +51,21 @@ public class ApplyBonusCountFunction<T> extends AbstractLootConditionalFunction<
|
||||
|
||||
public static class Factory<T> implements LootFunctionFactory<T> {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public LootFunction<T> create(Map<String, Object> arguments) {
|
||||
return null;
|
||||
String enchantment = (String) arguments.get("enchantment");
|
||||
if (enchantment == null || enchantment.isEmpty()) {
|
||||
throw new IllegalArgumentException("enchantment is required");
|
||||
}
|
||||
Map<String, Object> formulaMap = MiscUtils.castToMap(arguments.get("formula"), true);
|
||||
if (formulaMap == null) {
|
||||
throw new IllegalArgumentException("formula is required");
|
||||
}
|
||||
List<LootCondition> conditions = Optional.ofNullable(arguments.get("conditions"))
|
||||
.map(it -> LootConditions.fromMapList((List<Map<String, Object>>) it))
|
||||
.orElse(Collections.emptyList());
|
||||
return new ApplyBonusCountFunction<>(conditions, Key.from(enchantment), Formulas.fromMap(formulaMap));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,4 +74,67 @@ public class ApplyBonusCountFunction<T> extends AbstractLootConditionalFunction<
|
||||
|
||||
Key type();
|
||||
}
|
||||
|
||||
public interface FormulaFactory {
|
||||
|
||||
Formula create(Map<String, Object> arguments);
|
||||
}
|
||||
|
||||
public static class Formulas {
|
||||
public static final Key ORE_DROPS = Key.of("craftengine:ore_drops");
|
||||
|
||||
static {
|
||||
register(ORE_DROPS, OreDrops.FACTORY);
|
||||
}
|
||||
|
||||
public static void register(Key key, FormulaFactory factory) {
|
||||
Holder.Reference<FormulaFactory> holder = ((WritableRegistry<FormulaFactory>) BuiltInRegistries.FORMULA_FACTORY)
|
||||
.registerForHolder(new ResourceKey<>(Registries.FORMULA_FACTORY.location(), key));
|
||||
holder.bindValue(factory);
|
||||
}
|
||||
|
||||
public static Formula fromMap(Map<String, Object> map) {
|
||||
String type = (String) map.get("type");
|
||||
if (type == null) {
|
||||
throw new NullPointerException("number type cannot be null");
|
||||
}
|
||||
Key key = Key.withDefaultNamespace(type, "craftengine");
|
||||
FormulaFactory factory = BuiltInRegistries.FORMULA_FACTORY.getValue(key);
|
||||
if (factory == null) {
|
||||
throw new IllegalArgumentException("Unknown formula type: " + type);
|
||||
}
|
||||
return factory.create(map);
|
||||
}
|
||||
}
|
||||
|
||||
public static class OreDrops implements Formula {
|
||||
public static final Factory FACTORY = new Factory();
|
||||
private static final OreDrops INSTANCE = new OreDrops();
|
||||
|
||||
@Override
|
||||
public int apply(int initialCount, int enchantmentLevel) {
|
||||
if (enchantmentLevel > 0) {
|
||||
int i = ThreadLocalRandom.current().nextInt(enchantmentLevel + 2) - 1;
|
||||
if (i < 0) {
|
||||
i = 0;
|
||||
}
|
||||
return initialCount * (i + 1);
|
||||
} else {
|
||||
return initialCount;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Key type() {
|
||||
return Formulas.ORE_DROPS;
|
||||
}
|
||||
|
||||
public static class Factory implements FormulaFactory {
|
||||
|
||||
@Override
|
||||
public Formula create(Map<String, Object> arguments) {
|
||||
return INSTANCE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory;
|
||||
import net.momirealms.craftengine.core.item.recipe.RecipeFactory;
|
||||
import net.momirealms.craftengine.core.loot.condition.LootConditionFactory;
|
||||
import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory;
|
||||
import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction;
|
||||
import net.momirealms.craftengine.core.loot.function.LootFunctionFactory;
|
||||
import net.momirealms.craftengine.core.loot.provider.NumberProviderFactory;
|
||||
import net.momirealms.craftengine.core.pack.model.ItemModelFactory;
|
||||
@@ -37,6 +38,7 @@ public class BuiltInRegistries {
|
||||
public static final Registry<ConditionPropertyFactory> CONDITION_PROPERTY_FACTORY = createRegistry(Registries.CONDITION_PROPERTY_FACTORY);
|
||||
public static final Registry<SelectPropertyFactory> SELECT_PROPERTY_FACTORY = createRegistry(Registries.SELECT_PROPERTY_FACTORY);
|
||||
public static final Registry<RecipeFactory<?>> RECIPE_FACTORY = createRegistry(Registries.RECIPE_FACTORY);
|
||||
public static final Registry<ApplyBonusCountFunction.FormulaFactory> FORMULA_FACTORY = createRegistry(Registries.FORMULA_FACTORY);
|
||||
|
||||
private static <T> Registry<T> createRegistry(ResourceKey<? extends Registry<T>> key) {
|
||||
return new MappedRegistry<>(key);
|
||||
|
||||
@@ -7,6 +7,7 @@ import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory;
|
||||
import net.momirealms.craftengine.core.item.recipe.RecipeFactory;
|
||||
import net.momirealms.craftengine.core.loot.condition.LootConditionFactory;
|
||||
import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory;
|
||||
import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction;
|
||||
import net.momirealms.craftengine.core.loot.function.LootFunctionFactory;
|
||||
import net.momirealms.craftengine.core.loot.provider.NumberProviderFactory;
|
||||
import net.momirealms.craftengine.core.pack.model.ItemModelFactory;
|
||||
@@ -38,4 +39,5 @@ public class Registries {
|
||||
public static final ResourceKey<Registry<ConditionPropertyFactory>> CONDITION_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("condition_property_factory"));
|
||||
public static final ResourceKey<Registry<SelectPropertyFactory>> SELECT_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("select_property_factory"));
|
||||
public static final ResourceKey<Registry<RecipeFactory<?>>> RECIPE_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_factory"));
|
||||
public static final ResourceKey<Registry<ApplyBonusCountFunction.FormulaFactory>> FORMULA_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("formula_factory"));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user