From 6dc6a42bda4a8366281e9e2d1e1ee9ab16350196 Mon Sep 17 00:00:00 2001 From: gnembon Date: Tue, 8 Dec 2020 19:15:33 -0400 Subject: [PATCH 1/8] client function, duh. --- src/main/java/carpet/script/api/Auxiliary.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/carpet/script/api/Auxiliary.java b/src/main/java/carpet/script/api/Auxiliary.java index 367fe2d1..eeefd681 100644 --- a/src/main/java/carpet/script/api/Auxiliary.java +++ b/src/main/java/carpet/script/api/Auxiliary.java @@ -530,7 +530,7 @@ public class Auxiliary { if (pVal instanceof FormattedTextValue) title = ((FormattedTextValue) pVal).getText(); else - title = Text.of(pVal.getString()); + title = new LiteralText(pVal.getString()); } TitleS2CPacket timesPacket; if (lv.size() > 3) From 97971322e578907413720345cbf776bab55f0a16 Mon Sep 17 00:00:00 2001 From: gnembon Date: Fri, 11 Dec 2020 00:14:11 -0400 Subject: [PATCH 2/8] better death messages for fake players and handling idling. Fixes #619 --- .../carpet/mixins/PlayerManager_fakePlayersMixin.java | 2 +- src/main/java/carpet/patches/EntityPlayerMPFake.java | 10 ++++++++-- .../java/carpet/patches/NetHandlerPlayServerFake.java | 5 +++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/carpet/mixins/PlayerManager_fakePlayersMixin.java b/src/main/java/carpet/mixins/PlayerManager_fakePlayersMixin.java index faee9ef4..1b5f6be8 100644 --- a/src/main/java/carpet/mixins/PlayerManager_fakePlayersMixin.java +++ b/src/main/java/carpet/mixins/PlayerManager_fakePlayersMixin.java @@ -69,7 +69,7 @@ public abstract class PlayerManager_fakePlayersMixin ServerPlayerEntity serverPlayerEntity_3 = (ServerPlayerEntity) var5.next(); if(serverPlayerEntity_3 instanceof EntityPlayerMPFake) { - serverPlayerEntity_3.kill(); + ((EntityPlayerMPFake)serverPlayerEntity_3).kill(new TranslatableText("multiplayer.disconnect.duplicate_login")); continue; } serverPlayerEntity_3.networkHandler.disconnect(new TranslatableText("multiplayer.disconnect.duplicate_login")); diff --git a/src/main/java/carpet/patches/EntityPlayerMPFake.java b/src/main/java/carpet/patches/EntityPlayerMPFake.java index 9befa9db..e7932250 100644 --- a/src/main/java/carpet/patches/EntityPlayerMPFake.java +++ b/src/main/java/carpet/patches/EntityPlayerMPFake.java @@ -9,6 +9,7 @@ import net.minecraft.network.packet.s2c.play.PlayerListS2CPacket; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.player.HungerManager; import net.minecraft.network.NetworkSide; +import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.server.MinecraftServer; import net.minecraft.server.ServerTask; @@ -95,9 +96,14 @@ public class EntityPlayerMPFake extends ServerPlayerEntity @Override public void kill() + { + kill(Messenger.s("Killed")); + } + + public void kill(Text reason) { this.server.send(new ServerTask(this.server.getTicks(), () -> { - this.networkHandler.onDisconnected(Messenger.s("Killed")); + this.networkHandler.onDisconnected(reason); })); } @@ -120,7 +126,7 @@ public class EntityPlayerMPFake extends ServerPlayerEntity super.onDeath(cause); setHealth(20); this.hungerManager = new HungerManager(); - kill(); + kill(this.getDamageTracker().getDeathMessage()); } @Override diff --git a/src/main/java/carpet/patches/NetHandlerPlayServerFake.java b/src/main/java/carpet/patches/NetHandlerPlayServerFake.java index af85ff30..330cb54d 100644 --- a/src/main/java/carpet/patches/NetHandlerPlayServerFake.java +++ b/src/main/java/carpet/patches/NetHandlerPlayServerFake.java @@ -6,6 +6,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; +import net.minecraft.text.TranslatableText; public class NetHandlerPlayServerFake extends ServerPlayNetworkHandler { @@ -22,6 +23,10 @@ public class NetHandlerPlayServerFake extends ServerPlayNetworkHandler @Override public void disconnect(Text message) { + if (player instanceof EntityPlayerMPFake && message instanceof TranslatableText && ((TranslatableText) message).getKey().equals("multiplayer.disconnect.idling")) + { + ((EntityPlayerMPFake) player).kill(new TranslatableText(((TranslatableText) message).getKey())); + } } } From 2be4ac8ee024acdd2fca11de8221000dedc110d3 Mon Sep 17 00:00:00 2001 From: Kevin Delugan Date: Fri, 11 Dec 2020 05:19:06 +0100 Subject: [PATCH 3/8] Added onTrade Scarpet Event --- docs/scarpet/api/Events.md | 7 +++- .../TradeOutputSlot_scarpetEventMixin.java | 33 +++++++++++++++++++ .../java/carpet/script/CarpetEventServer.java | 18 ++++++++++ .../assets/carpet/scripts/event_test.sc | 11 +++++++ src/main/resources/carpet.mixins.json | 1 + 5 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 src/main/java/carpet/mixins/TradeOutputSlot_scarpetEventMixin.java diff --git a/docs/scarpet/api/Events.md b/docs/scarpet/api/Events.md index 18e3f2ba..d2f6e4b2 100644 --- a/docs/scarpet/api/Events.md +++ b/docs/scarpet/api/Events.md @@ -114,7 +114,12 @@ adjusted. ### `__on_player_interacts_with_entity(player, entity, hand)` Triggered when player right clicks (interacts) with an entity, even if the entity has no vanilla interaction with the player or the item they are holding. The event is invoked after receiving a packet from the client, before anything happens server side -with that interaction +with that interaction. + +### `__on_player_trades(player, entity, buy, buyB, sell)` +Triggered when player trades with a merchant. The event is invoked after the server allow the trade, but before the inventory +changes and merchant updates its trade-uses counter. +The parameter `entity` can be `null` if the merchant is not an entity. ### `__on_player_collides_with_entity(player, entity)` Triggered every time a player - entity collisions are calculated, before effects of collisions are applied in the game. diff --git a/src/main/java/carpet/mixins/TradeOutputSlot_scarpetEventMixin.java b/src/main/java/carpet/mixins/TradeOutputSlot_scarpetEventMixin.java new file mode 100644 index 00000000..7cf0ff2b --- /dev/null +++ b/src/main/java/carpet/mixins/TradeOutputSlot_scarpetEventMixin.java @@ -0,0 +1,33 @@ +package carpet.mixins; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.TradeOutputSlot; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.village.Merchant; +import net.minecraft.village.TradeOffer; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import static carpet.script.CarpetEventServer.Event.PLAYER_TRADES; + +@Mixin(value = TradeOutputSlot.class) +public abstract class TradeOutputSlot_scarpetEventMixin { + @Shadow @Final private Merchant merchant; + + @Inject(method = "onTakeItem", require = 0, at = @At(value = "INVOKE", + target = "Lnet/minecraft/village/Merchant;trade(Lnet/minecraft/village/TradeOffer;)V"), + locals = LocalCapture.CAPTURE_FAILHARD + ) + private void onTrade(PlayerEntity player, ItemStack stack, CallbackInfoReturnable cir, TradeOffer tradeOffer) { + if(PLAYER_TRADES.isNeeded() && !this.merchant.getMerchantWorld().isClient()) + { + PLAYER_TRADES.onTrade((ServerPlayerEntity) player, merchant, tradeOffer); + } + } +} diff --git a/src/main/java/carpet/script/CarpetEventServer.java b/src/main/java/carpet/script/CarpetEventServer.java index 11e89c03..4b6b31b6 100644 --- a/src/main/java/carpet/script/CarpetEventServer.java +++ b/src/main/java/carpet/script/CarpetEventServer.java @@ -18,6 +18,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.block.BlockState; import net.minecraft.entity.EntityType; import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.passive.MerchantEntity; import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.entity.Entity; @@ -35,6 +36,8 @@ import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; +import net.minecraft.village.Merchant; +import net.minecraft.village.TradeOffer; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import org.apache.commons.lang3.tuple.Pair; @@ -548,6 +551,20 @@ public class CarpetEventServer ), player::getCommandSource); } }; + public static final Event PLAYER_TRADES = new Event("player_trades", 5, false) + { + @Override + public void onTrade(ServerPlayerEntity player, Merchant merchant, TradeOffer tradeOffer) + { + handler.call( () -> Arrays.asList( + new EntityValue(player), + merchant instanceof MerchantEntity ? new EntityValue((MerchantEntity) merchant) : Value.NULL, + ValueConversions.of(tradeOffer.getOriginalFirstBuyItem()), + ValueConversions.of(tradeOffer.getSecondBuyItem()), + ValueConversions.of(tradeOffer.getSellItem()) + ), player::getCommandSource); + } + }; public static final Event PLAYER_PICKS_UP_ITEM = new Event("player_picks_up_item", 2, false) { @Override @@ -926,6 +943,7 @@ public class CarpetEventServer public void onDamage(Entity target, float amount, DamageSource source) { } public void onRecipeSelected(ServerPlayerEntity player, Identifier recipe, boolean fullStack) {} public void onSlotSwitch(ServerPlayerEntity player, int from, int to) {} + public void onTrade(ServerPlayerEntity player, Merchant merchant, TradeOffer tradeOffer) {} public void onWorldEvent(ServerWorld world, BlockPos pos) { } diff --git a/src/main/resources/assets/carpet/scripts/event_test.sc b/src/main/resources/assets/carpet/scripts/event_test.sc index 3c6c989e..91fccdac 100644 --- a/src/main/resources/assets/carpet/scripts/event_test.sc +++ b/src/main/resources/assets/carpet/scripts/event_test.sc @@ -292,3 +292,14 @@ __on_player_picks_up_item(player, item) -> print(' Player '+player+' injects '+item); ); +__on_player_trades(player, entity, buy, buyB, sell) -> +( + print(''); + print('__on_player_trades(player, item)'); + print('player trades:'); + print(' - player: '+player); + print(' - entity: '+ entity); + print(' - buy: '+ buy); + print(' - buyB: '+ buyB); + print(' - sell: '+ sell); +); diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index 024e8f8e..1551b661 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -164,6 +164,7 @@ "BlockItem_scarpetEventMixin", "PlayerManager_scarpetEventsMixin", "PlayerInventory_scarpetEventMixin", + "TradeOutputSlot_scarpetEventMixin", "ChunkTicketManager_scarpetMixin", "StatType_scarpetMixin", From 5e98fbef6618c1f3ac29c6bd87b76aaf1942dcb2 Mon Sep 17 00:00:00 2001 From: gnembon <41132274+gnembon@users.noreply.github.com> Date: Sat, 12 Dec 2020 00:42:03 -0400 Subject: [PATCH 4/8] Update src/main/java/carpet/mixins/TradeOutputSlot_scarpetEventMixin.java --- .../java/carpet/mixins/TradeOutputSlot_scarpetEventMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/carpet/mixins/TradeOutputSlot_scarpetEventMixin.java b/src/main/java/carpet/mixins/TradeOutputSlot_scarpetEventMixin.java index 7cf0ff2b..8c6e57c1 100644 --- a/src/main/java/carpet/mixins/TradeOutputSlot_scarpetEventMixin.java +++ b/src/main/java/carpet/mixins/TradeOutputSlot_scarpetEventMixin.java @@ -20,7 +20,7 @@ import static carpet.script.CarpetEventServer.Event.PLAYER_TRADES; public abstract class TradeOutputSlot_scarpetEventMixin { @Shadow @Final private Merchant merchant; - @Inject(method = "onTakeItem", require = 0, at = @At(value = "INVOKE", + @Inject(method = "onTakeItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/village/Merchant;trade(Lnet/minecraft/village/TradeOffer;)V"), locals = LocalCapture.CAPTURE_FAILHARD ) From 0e41ce44273991ef67aeb16601fead1ae455da24 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 12 Dec 2020 04:43:35 +0000 Subject: [PATCH 5/8] Merge docs for 'Merge pull request #623 from BisUmTo/onTrade-Scarpet-Event Added onTrade Scarpet Event' --- docs/scarpet/Full.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/scarpet/Full.md b/docs/scarpet/Full.md index 14f87168..3485a4bb 100644 --- a/docs/scarpet/Full.md +++ b/docs/scarpet/Full.md @@ -4051,7 +4051,12 @@ adjusted. ### `__on_player_interacts_with_entity(player, entity, hand)` Triggered when player right clicks (interacts) with an entity, even if the entity has no vanilla interaction with the player or the item they are holding. The event is invoked after receiving a packet from the client, before anything happens server side -with that interaction +with that interaction. + +### `__on_player_trades(player, entity, buy, buyB, sell)` +Triggered when player trades with a merchant. The event is invoked after the server allow the trade, but before the inventory +changes and merchant updates its trade-uses counter. +The parameter `entity` can be `null` if the merchant is not an entity. ### `__on_player_collides_with_entity(player, entity)` Triggered every time a player - entity collisions are calculated, before effects of collisions are applied in the game. From 34ee6784a45962ce4b34b5afee22f0fdaa3ad8b0 Mon Sep 17 00:00:00 2001 From: gnembon Date: Sun, 13 Dec 2020 06:07:13 -0400 Subject: [PATCH 6/8] values close to zero don't round nicely with bigdecs --- src/main/java/carpet/script/value/NumericValue.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/carpet/script/value/NumericValue.java b/src/main/java/carpet/script/value/NumericValue.java index caec9776..26b6ec56 100644 --- a/src/main/java/carpet/script/value/NumericValue.java +++ b/src/main/java/carpet/script/value/NumericValue.java @@ -15,6 +15,7 @@ import java.math.RoundingMode; import java.util.Locale; import static java.lang.Math.abs; +import static java.lang.Math.signum; public class NumericValue extends Value { @@ -57,6 +58,7 @@ public class NumericValue extends Value { if (value.isInfinite()) return "INFINITY"; if (value.isNaN()) return "NaN"; + if (abs(value) < epsilon) return (signum(value) < 0)?"-0":"0"; //zero rounding fails with big decimals // dobules have 16 point precision, 12 is plenty to display return BigDecimal.valueOf(value).round(displayRounding).stripTrailingZeros().toPlainString(); } From 7bacea181071a7e0af10f49ebfd5b419fa88c420 Mon Sep 17 00:00:00 2001 From: gnembon Date: Sun, 13 Dec 2020 06:29:42 -0400 Subject: [PATCH 7/8] range now handles better long long chains, as well as float values. --- docs/scarpet/language/Containers.md | 2 + .../script/language/DataStructures.java | 16 +++--- .../carpet/script/value/LazyListValue.java | 55 +++++++++++++++++-- .../carpet/script/value/NumericValue.java | 5 ++ src/main/java/carpet/script/value/Value.java | 10 ++-- 5 files changed, 71 insertions(+), 17 deletions(-) diff --git a/docs/scarpet/language/Containers.md b/docs/scarpet/language/Containers.md index 1f4759d9..8b07497c 100644 --- a/docs/scarpet/language/Containers.md +++ b/docs/scarpet/language/Containers.md @@ -215,6 +215,8 @@ map(range(10),_*_) => [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] reduce(range(10),_a+_, 0) => 45 range(5,10) => [5, 6, 7, 8, 9] range(20, 10, -2) => [20, 18, 16, 14, 12] +range(-0.3, 0.3, 0.1) => [-0.3, -0.2, -0.1, 0, 0.1, 0.2] +range(0.3, -0.3, -0.1) => [0.3, 0.2, 0.1, -0, -0.1, -0.2] ## Map operations diff --git a/src/main/java/carpet/script/language/DataStructures.java b/src/main/java/carpet/script/language/DataStructures.java index c61f5d42..10c21c94 100644 --- a/src/main/java/carpet/script/language/DataStructures.java +++ b/src/main/java/carpet/script/language/DataStructures.java @@ -135,23 +135,25 @@ public class DataStructures { expression.addFunction("range", (lv) -> { - long from = 0; - long to = 0; - long step = 1; + NumericValue from = Value.ZERO; + NumericValue to; + NumericValue step = Value.ONE; int argsize = lv.size(); if (argsize == 0 || argsize > 3) throw new InternalExpressionException("'range' accepts from 1 to 3 arguments, not "+argsize); - to = NumericValue.asNumber(lv.get(0)).getLong(); + to = NumericValue.asNumber(lv.get(0)); if (lv.size() > 1) { from = to; - to = NumericValue.asNumber(lv.get(1)).getLong(); + to = NumericValue.asNumber(lv.get(1)); if (lv.size() > 2) { - step = NumericValue.asNumber(lv.get(2)).getLong(); + step = NumericValue.asNumber(lv.get(2)); } } - return LazyListValue.range(from, to, step); + return (from.isInteger() && to.isInteger() && step.isInteger()) + ? LazyListValue.rangeLong(from.getLong(), to.getLong(), step.getLong()) + : LazyListValue.rangeDouble(from.getDouble(), to.getDouble(), step.getDouble()); }); expression.addLazyFunction("m", -1, (c, t, llv) -> diff --git a/src/main/java/carpet/script/value/LazyListValue.java b/src/main/java/carpet/script/value/LazyListValue.java index 2edd637d..5c68a75a 100644 --- a/src/main/java/carpet/script/value/LazyListValue.java +++ b/src/main/java/carpet/script/value/LazyListValue.java @@ -11,7 +11,7 @@ import java.util.Locale; public abstract class LazyListValue extends AbstractListValue implements Iterator { - public static LazyListValue range(long from, long to, long step) + public static LazyListValue rangeDouble(double from, double to, double step) { return new LazyListValue() { @@ -23,10 +23,10 @@ public abstract class LazyListValue extends AbstractListValue implements Iterato this.limit = to; this.stepp = step; } - private long start; - private long current; - private long limit; - private long stepp; + private final double start; + private double current; + private final double limit; + private final double stepp; @Override public Value next() { @@ -50,7 +50,50 @@ public abstract class LazyListValue extends AbstractListValue implements Iterato @Override public String getString() { - return String.format(Locale.ROOT, "[%d, %d, ..., %d)",start, start+stepp, limit); + return String.format(Locale.ROOT, "[%s, %s, ..., %s)",NumericValue.of(start).getString(), NumericValue.of(start+stepp).getString(), NumericValue.of( limit).getString()); + } + }; + } + public static LazyListValue rangeLong(long from, long to, long step) + { + return new LazyListValue() + { + { + if (step == 0) + throw new InternalExpressionException("Range will never end with a zero step"); + this.start = from; + this.current = this.start; + this.limit = to; + this.stepp = step; + } + private final long start; + private long current; + private final long limit; + private final long stepp; + @Override + public Value next() + { + Value val = new NumericValue(current); + current += stepp; + return val; + } + + @Override + public void reset() + { + current = start; + } + + @Override + public boolean hasNext() + { + return stepp > 0?(current < limit):(current > limit); + } + + @Override + public String getString() + { + return String.format(Locale.ROOT, "[%s, %s, ..., %s)",NumericValue.of(start).getString(), NumericValue.of(start+stepp).getString(), NumericValue.of( limit).getString()); } }; } diff --git a/src/main/java/carpet/script/value/NumericValue.java b/src/main/java/carpet/script/value/NumericValue.java index 26b6ec56..00a506f4 100644 --- a/src/main/java/carpet/script/value/NumericValue.java +++ b/src/main/java/carpet/script/value/NumericValue.java @@ -308,4 +308,9 @@ public class NumericValue extends Value if (longValue != null) return new NumericValue(-longValue); return new NumericValue(-value); } + + public boolean isInteger() + { + return longValue!= null || getDouble() == (double)getLong(); + } } diff --git a/src/main/java/carpet/script/value/Value.java b/src/main/java/carpet/script/value/Value.java index 91e3e893..679a9263 100644 --- a/src/main/java/carpet/script/value/Value.java +++ b/src/main/java/carpet/script/value/Value.java @@ -13,10 +13,12 @@ import java.util.regex.PatternSyntaxException; public abstract class Value implements Comparable, Cloneable { - public static Value FALSE = new NumericValue(0); - public static Value TRUE = new NumericValue(1); - public static Value ZERO = FALSE; - public static Value NULL = new NullValue(); + public static NumericValue FALSE = new NumericValue(0); + public static NumericValue TRUE = new NumericValue(1); + public static NumericValue ZERO = FALSE; + public static NumericValue ONE = TRUE; + + public static NullValue NULL = new NullValue(); public String boundVariable; From 6f28425eaffad233b061e12bf1fe53d9fcf2e579 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 13 Dec 2020 06:30:40 +0000 Subject: [PATCH 8/8] Merge docs for 'Merge branch 'master' of https://github.com/gnembon/fabric-carpet' --- docs/scarpet/Full.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/scarpet/Full.md b/docs/scarpet/Full.md index 3485a4bb..5753b3c2 100644 --- a/docs/scarpet/Full.md +++ b/docs/scarpet/Full.md @@ -1710,6 +1710,8 @@ map(range(10),_*_) => [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] reduce(range(10),_a+_, 0) => 45 range(5,10) => [5, 6, 7, 8, 9] range(20, 10, -2) => [20, 18, 16, 14, 12] +range(-0.3, 0.3, 0.1) => [-0.3, -0.2, -0.1, 0, 0.1, 0.2] +range(0.3, -0.3, -0.1) => [0.3, 0.2, 0.1, -0, -0.1, -0.2] ## Map operations