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> {
|
public class MerchantTradeFunction<CTX extends Context> extends AbstractConditionalFunction<CTX> {
|
||||||
private final String title;
|
private final String title;
|
||||||
private final PlayerSelector<CTX> selector;
|
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);
|
super(predicates);
|
||||||
this.title = title;
|
this.title = title;
|
||||||
this.selector = selector;
|
this.selector = selector;
|
||||||
@@ -38,12 +38,12 @@ public class MerchantTradeFunction<CTX extends Context> extends AbstractConditio
|
|||||||
public void runInternal(CTX ctx) {
|
public void runInternal(CTX ctx) {
|
||||||
if (this.selector == null) {
|
if (this.selector == null) {
|
||||||
ctx.getOptionalParameter(DirectContextParameters.PLAYER).ifPresent(it -> {
|
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 {
|
} else {
|
||||||
for (Player viewer : this.selector.get(ctx)) {
|
for (Player viewer : this.selector.get(ctx)) {
|
||||||
RelationalContext relationalContext = ViewerContext.of(ctx, PlayerOptionalContext.of(viewer));
|
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 TempOffer(cost1, cost2, result, exp);
|
||||||
});
|
});
|
||||||
return new MerchantTradeFunction<>(getPredicates(arguments), PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), title,
|
return new MerchantTradeFunction<>(getPredicates(arguments), PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), title,
|
||||||
LazyReference.lazyReference(() -> {
|
(player) -> {
|
||||||
List<MerchantOffer<?>> offers = new ArrayList<>(merchantOffers.size());
|
List<MerchantOffer<?>> offers = new ArrayList<>(merchantOffers.size());
|
||||||
for (TempOffer offer : merchantOffers) {
|
for (TempOffer offer : merchantOffers) {
|
||||||
Item cost1 = parseIngredient(offer.cost1);
|
Item cost1 = parseIngredient(offer.cost1, player);
|
||||||
Optional cost2 = Optional.ofNullable(parseIngredient(offer.cost2));
|
Optional cost2 = Optional.ofNullable(parseIngredient(offer.cost2, player));
|
||||||
Item result = parseIngredient(offer.result);
|
Item result = parseIngredient(offer.result, player);
|
||||||
offers.add(new MerchantOffer<>(cost1, cost2, result, false, 0, Integer.MAX_VALUE, offer.exp, 0, 0, 0));
|
offers.add(new MerchantOffer<>(cost1, cost2, result, false, 0, Integer.MAX_VALUE, offer.exp, 0, 0, 0));
|
||||||
}
|
}
|
||||||
return offers;
|
return offers;
|
||||||
}));
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public record TempOffer(Object cost1, Object cost2, Object result, int exp) {
|
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 == null) return null;
|
||||||
if (arguments instanceof Map<?,?> map) {
|
if (arguments instanceof Map<?,?> map) {
|
||||||
Map<String, Object> args = MiscUtils.castToMap(map, false);
|
Map<String, Object> args = MiscUtils.castToMap(map, false);
|
||||||
String itemName = args.getOrDefault("item", "minecraft:stone").toString();
|
String itemName = args.getOrDefault("item", "minecraft:stone").toString();
|
||||||
Item<Object> item = createSafeItem(itemName);
|
Item<Object> item = createSafeItem(itemName, player);
|
||||||
if (args.containsKey("count")) {
|
if (args.containsKey("count")) {
|
||||||
item.count(ResourceConfigUtils.getAsInt(args.get("count"), "count"));
|
item.count(ResourceConfigUtils.getAsInt(args.get("count"), "count"));
|
||||||
}
|
}
|
||||||
@@ -104,15 +104,15 @@ public class MerchantTradeFunction<CTX extends Context> extends AbstractConditio
|
|||||||
return item;
|
return item;
|
||||||
} else {
|
} else {
|
||||||
String itemName = arguments.toString();
|
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);
|
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) {
|
if (item == null) {
|
||||||
item = CraftEngine.instance().itemManager().createWrappedItem(ItemKeys.STONE, null);
|
item = CraftEngine.instance().itemManager().createWrappedItem(ItemKeys.STONE, player);
|
||||||
assert item != null;
|
assert item != null;
|
||||||
item.itemNameComponent(Component.text(itemName).color(NamedTextColor.RED));
|
item.itemNameComponent(Component.text(itemName).color(NamedTextColor.RED));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user