9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-24 17:39:30 +00:00

Merge pull request #2 from Xiao-MoMi/main

上游更新
This commit is contained in:
jhqwqmc
2025-02-11 23:43:28 +08:00
committed by GitHub
5 changed files with 105 additions and 11 deletions

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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;
}
}
}
}

View File

@@ -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);

View File

@@ -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"));
}