mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-19 15:09:15 +00:00
村民交易支持解析玩家
This commit is contained in:
@@ -25,9 +25,9 @@ import java.util.Optional;
|
||||
public class MerchantTradeFunction<CTX extends Context> extends AbstractConditionalFunction<CTX> {
|
||||
private final String title;
|
||||
private final PlayerSelector<CTX> selector;
|
||||
private final LazyReference<List<MerchantOffer<?>>> offers;
|
||||
private final java.util.function.Function<Player, List<MerchantOffer<?>>> offers;
|
||||
|
||||
public MerchantTradeFunction(List<Condition<CTX>> predicates, @Nullable PlayerSelector<CTX> selector, String title, LazyReference<List<MerchantOffer<?>>> offers) {
|
||||
public MerchantTradeFunction(List<Condition<CTX>> predicates, @Nullable PlayerSelector<CTX> selector, String title, java.util.function.Function<Player, List<MerchantOffer<?>>> offers) {
|
||||
super(predicates);
|
||||
this.title = title;
|
||||
this.selector = selector;
|
||||
@@ -38,12 +38,12 @@ public class MerchantTradeFunction<CTX extends Context> extends AbstractConditio
|
||||
public void runInternal(CTX ctx) {
|
||||
if (this.selector == null) {
|
||||
ctx.getOptionalParameter(DirectContextParameters.PLAYER).ifPresent(it -> {
|
||||
CraftEngine.instance().guiManager().openMerchant(it, this.title == null ? null : AdventureHelper.miniMessage().deserialize(this.title, ctx.tagResolvers()), this.offers.get());
|
||||
CraftEngine.instance().guiManager().openMerchant(it, this.title == null ? null : AdventureHelper.miniMessage().deserialize(this.title, ctx.tagResolvers()), this.offers.apply(it));
|
||||
});
|
||||
} else {
|
||||
for (Player viewer : this.selector.get(ctx)) {
|
||||
RelationalContext relationalContext = ViewerContext.of(ctx, PlayerOptionalContext.of(viewer));
|
||||
CraftEngine.instance().guiManager().openMerchant(viewer, this.title == null ? null : AdventureHelper.miniMessage().deserialize(this.title, relationalContext.tagResolvers()), this.offers.get());
|
||||
CraftEngine.instance().guiManager().openMerchant(viewer, this.title == null ? null : AdventureHelper.miniMessage().deserialize(this.title, relationalContext.tagResolvers()), this.offers.apply(viewer));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -71,27 +71,27 @@ public class MerchantTradeFunction<CTX extends Context> extends AbstractConditio
|
||||
return new TempOffer(cost1, cost2, result, exp);
|
||||
});
|
||||
return new MerchantTradeFunction<>(getPredicates(arguments), PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), title,
|
||||
LazyReference.lazyReference(() -> {
|
||||
(player) -> {
|
||||
List<MerchantOffer<?>> offers = new ArrayList<>(merchantOffers.size());
|
||||
for (TempOffer offer : merchantOffers) {
|
||||
Item cost1 = parseIngredient(offer.cost1);
|
||||
Optional cost2 = Optional.ofNullable(parseIngredient(offer.cost2));
|
||||
Item result = parseIngredient(offer.result);
|
||||
Item cost1 = parseIngredient(offer.cost1, player);
|
||||
Optional cost2 = Optional.ofNullable(parseIngredient(offer.cost2, player));
|
||||
Item result = parseIngredient(offer.result, player);
|
||||
offers.add(new MerchantOffer<>(cost1, cost2, result, false, 0, Integer.MAX_VALUE, offer.exp, 0, 0, 0));
|
||||
}
|
||||
return offers;
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
||||
public record TempOffer(Object cost1, Object cost2, Object result, int exp) {
|
||||
}
|
||||
|
||||
private Item<?> parseIngredient(Object arguments) {
|
||||
private Item<?> parseIngredient(Object arguments, Player player) {
|
||||
if (arguments == null) return null;
|
||||
if (arguments instanceof Map<?,?> map) {
|
||||
Map<String, Object> args = MiscUtils.castToMap(map, false);
|
||||
String itemName = args.getOrDefault("item", "minecraft:stone").toString();
|
||||
Item<Object> item = createSafeItem(itemName);
|
||||
Item<Object> item = createSafeItem(itemName, player);
|
||||
if (args.containsKey("count")) {
|
||||
item.count(ResourceConfigUtils.getAsInt(args.get("count"), "count"));
|
||||
}
|
||||
@@ -104,15 +104,15 @@ public class MerchantTradeFunction<CTX extends Context> extends AbstractConditio
|
||||
return item;
|
||||
} else {
|
||||
String itemName = arguments.toString();
|
||||
return createSafeItem(itemName);
|
||||
return createSafeItem(itemName, player);
|
||||
}
|
||||
}
|
||||
|
||||
private Item<Object> createSafeItem(String itemName) {
|
||||
private Item<Object> createSafeItem(String itemName, Player player) {
|
||||
Key itemId = Key.of(itemName);
|
||||
Item<Object> item = CraftEngine.instance().itemManager().createWrappedItem(itemId, null);
|
||||
Item<Object> item = CraftEngine.instance().itemManager().createWrappedItem(itemId, player);
|
||||
if (item == null) {
|
||||
item = CraftEngine.instance().itemManager().createWrappedItem(ItemKeys.STONE, null);
|
||||
item = CraftEngine.instance().itemManager().createWrappedItem(ItemKeys.STONE, player);
|
||||
assert item != null;
|
||||
item.itemNameComponent(Component.text(itemName).color(NamedTextColor.RED));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user