From bed25796db005533f57f8bfa3994552f34ce2c64 Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Thu, 3 Aug 2023 17:31:03 +0200 Subject: [PATCH 1/7] Added 'item_cooldown' --- docs/scarpet/api/Entities.md | 9 +++++++ .../java/carpet/script/value/EntityValue.java | 24 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/docs/scarpet/api/Entities.md b/docs/scarpet/api/Entities.md index 713573526e..16244ae92a 100644 --- a/docs/scarpet/api/Entities.md +++ b/docs/scarpet/api/Entities.md @@ -302,6 +302,10 @@ Number of ticks remaining until an entity can use a portal again. Number of ticks an entity sits in a portal. +### `query(e, 'item_cooldown', item)` + +Percentage remaining of item cooldown, e.g., from pearl throwing or horn blowing. + ### `query(e, 'item')` The item triple (name, count, nbt) if its an item or item frame entity, `null` otherwise. @@ -717,6 +721,11 @@ Sets a custom number of ticks remaining until an entity can use a portal again. Sets a custom number of ticks an entity sits in a portal. +### `modify(e, 'item_cooldown', item, ticks)` + +Sets a custom number of cooldown ticks before the item can be used again. +Gives white overlay, like pearl shooting/horn blowing cooldown + ### `modify(e, 'dismount')` Dismounts riding entity. diff --git a/src/main/java/carpet/script/value/EntityValue.java b/src/main/java/carpet/script/value/EntityValue.java index 140c30e639..b248286278 100644 --- a/src/main/java/carpet/script/value/EntityValue.java +++ b/src/main/java/carpet/script/value/EntityValue.java @@ -64,6 +64,7 @@ import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.entity.projectile.WitherSkull; import net.minecraft.world.entity.vehicle.AbstractMinecart; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameType; import net.minecraft.world.level.Level; @@ -503,6 +504,15 @@ public Value get(String what, @Nullable Value arg) put("pickup_delay", (e, a) -> (e instanceof final ItemEntity ie) ? new NumericValue(Vanilla.ItemEntity_getPickupDelay(ie)) : Value.NULL); put("portal_cooldown", (e, a) -> new NumericValue(Vanilla.Entity_getPublicNetherPortalCooldown(e))); put("portal_timer", (e, a) -> new NumericValue(Vanilla.Entity_getPortalTimer(e))); + put("item_cooldown", (e, a)->{ + if(!(e instanceof ServerPlayer player)) + throw new InternalExpressionException("Can only query 'item_cooldown' for players"); + + Item item = NBTSerializableValue.parseItem(a.getString(), e.getServer().registryAccess()).getItem(); + + //The 0.0f here is because for some reason, the method does weird maths distorting the percentage + return NumericValue.of(player.getCooldowns().getCooldownPercent(item, 0.0f)); + }); // ItemEntity -> despawn timer via ssGetAge put("is_baby", (e, a) -> (e instanceof final LivingEntity le) ? BooleanValue.of(le.isBaby()) : Value.NULL); put("target", (e, a) -> { @@ -1436,6 +1446,20 @@ else if (a.isNull()) Vanilla.Entity_setPortalTimer(e, NumericValue.asNumber(v).getInt()); }); + put("item_cooldown", (e, v)->{ + if(!(e instanceof ServerPlayer player)) + throw new InternalExpressionException("Can only modify 'item_cooldown' for players"); + + if(!(v instanceof ListValue lv) || lv.length()!=2) + throw new InternalExpressionException("'item_cooldown' requires 2 parameters, an item and a cooldown duration"); + + List values = lv.getItems(); + Item item = NBTSerializableValue.parseItem(values.get(0).getString(), e.getServer().registryAccess()).getItem(); + int ticks = NumericValue.asNumber(values.get(1), "item cooldown duration").getInt(); + + player.getCooldowns().addCooldown(item, ticks); + }); + put("ai", (e, v) -> { if (e instanceof final Mob mob) From 7edf3662123249db9e7e00c03f197172708af7cd Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Thu, 3 Aug 2023 19:34:59 +0200 Subject: [PATCH 2/7] Added item cooldown ticks Doesn't work tho for some reason --- .../carpet/fakes/ItemCooldownsInterface.java | 7 ++++++ .../CooldownInstance_scarpetEntityMixin.java | 14 +++++++++++ .../ItemCooldowns_scarpetEntityMixin.java | 23 +++++++++++++++++++ .../java/carpet/script/value/EntityValue.java | 9 +++++++- src/main/resources/carpet.accesswidener | 1 + src/main/resources/carpet.mixins.json | 2 ++ 6 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/main/java/carpet/fakes/ItemCooldownsInterface.java create mode 100644 src/main/java/carpet/mixins/CooldownInstance_scarpetEntityMixin.java create mode 100644 src/main/java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java diff --git a/src/main/java/carpet/fakes/ItemCooldownsInterface.java b/src/main/java/carpet/fakes/ItemCooldownsInterface.java new file mode 100644 index 0000000000..4a22185c51 --- /dev/null +++ b/src/main/java/carpet/fakes/ItemCooldownsInterface.java @@ -0,0 +1,7 @@ +package carpet.fakes; + +import net.minecraft.world.item.Item; + +public interface ItemCooldownsInterface { + int getCooldownTicks(Item item); +} diff --git a/src/main/java/carpet/mixins/CooldownInstance_scarpetEntityMixin.java b/src/main/java/carpet/mixins/CooldownInstance_scarpetEntityMixin.java new file mode 100644 index 0000000000..89687fdab8 --- /dev/null +++ b/src/main/java/carpet/mixins/CooldownInstance_scarpetEntityMixin.java @@ -0,0 +1,14 @@ +package carpet.mixins; + +import net.minecraft.world.item.ItemCooldowns; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ItemCooldowns.CooldownInstance.class) +public interface CooldownInstance_scarpetEntityMixin { + @Accessor("startTime") + int getStartTime(); + + @Accessor("endTime") + int getEndTime(); +} diff --git a/src/main/java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java b/src/main/java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java new file mode 100644 index 0000000000..bfd067be73 --- /dev/null +++ b/src/main/java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java @@ -0,0 +1,23 @@ +package carpet.mixins; + +import carpet.fakes.ItemCooldownsInterface; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemCooldowns; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Map; + +@Mixin(ItemCooldowns.class) +public class ItemCooldowns_scarpetEntityMixin implements ItemCooldownsInterface { + + + @Shadow @Final private Map cooldowns; + + @Override + public int getCooldownTicks(Item item) { + var cooldown = ((CooldownInstance_scarpetEntityMixin) cooldowns.get(item)); + return cooldown.getEndTime()-cooldown.getStartTime(); + } +} diff --git a/src/main/java/carpet/script/value/EntityValue.java b/src/main/java/carpet/script/value/EntityValue.java index b248286278..bd2d81edbb 100644 --- a/src/main/java/carpet/script/value/EntityValue.java +++ b/src/main/java/carpet/script/value/EntityValue.java @@ -1,5 +1,7 @@ package carpet.script.value; +import carpet.fakes.ItemCooldownsInterface; +import carpet.mixins.ItemCooldowns_scarpetEntityMixin; import carpet.script.external.Vanilla; import carpet.script.utils.Tracer; import carpet.script.CarpetContext; @@ -10,6 +12,7 @@ import carpet.script.external.Carpet; import carpet.script.utils.EntityTools; import carpet.script.utils.InputValidator; +import carpet.utils.Messenger; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.commands.CommandSourceStack; @@ -65,6 +68,7 @@ import net.minecraft.world.entity.projectile.WitherSkull; import net.minecraft.world.entity.vehicle.AbstractMinecart; import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemCooldowns; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameType; import net.minecraft.world.level.Level; @@ -511,7 +515,10 @@ public Value get(String what, @Nullable Value arg) Item item = NBTSerializableValue.parseItem(a.getString(), e.getServer().registryAccess()).getItem(); //The 0.0f here is because for some reason, the method does weird maths distorting the percentage - return NumericValue.of(player.getCooldowns().getCooldownPercent(item, 0.0f)); + float perc = player.getCooldowns().getCooldownPercent(item, 0.0f); + int ticks = ((ItemCooldownsInterface) player.getCooldowns()).getCooldownTicks(item); + Messenger.m(player, "c perc: "+perc); + return NumericValue.of(ticks); }); // ItemEntity -> despawn timer via ssGetAge put("is_baby", (e, a) -> (e instanceof final LivingEntity le) ? BooleanValue.of(le.isBaby()) : Value.NULL); diff --git a/src/main/resources/carpet.accesswidener b/src/main/resources/carpet.accesswidener index ebfed8ee50..3ee3473ba7 100644 --- a/src/main/resources/carpet.accesswidener +++ b/src/main/resources/carpet.accesswidener @@ -9,6 +9,7 @@ accessible class net/minecraft/world/level/border/WorldBorder$StaticBorderExtent accessible class net/minecraft/server/MinecraftServer$ReloadableResources accessible class net/minecraft/world/level/biome/Biome$ClimateSettings accessible class net/minecraft/world/level/block/entity/SculkSensorBlockEntity$VibrationUser +accessible class net/minecraft/world/item/ItemCooldowns$CooldownInstance accessible method net/minecraft/world/level/border/WorldBorder getListeners ()Ljava/util/List; diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index f9daa6206f..b8416fa4e8 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -81,6 +81,8 @@ "PieceGeneratorSupplier_plopMixin", "ServerGamePacketListenerImpl_scarpetEventsMixin", "ServerPlayerGameMode_scarpetEventsMixin", + "ItemCooldowns_scarpetEntityMixin", + "CooldownInstance_scarpetEntityMixin", "Player_parrotMixin", "SaplingBlock_desertShrubsMixin", "EntityMixin", From 6ee06f6d787331c194cdd199414d77645533c538 Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Fri, 4 Aug 2023 11:08:41 +0200 Subject: [PATCH 3/7] Fixed item exceptions I have genuinely no idea what I did, but it works now, and I'm not gonna mess with it. --- docs/scarpet/api/Entities.md | 2 +- ...scarpetEntityMixin.java => CooldownInstanceAccessor.java} | 2 +- .../java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java | 4 +--- src/main/java/carpet/script/value/EntityValue.java | 5 +---- src/main/resources/carpet.mixins.json | 2 +- 5 files changed, 5 insertions(+), 10 deletions(-) rename src/main/java/carpet/mixins/{CooldownInstance_scarpetEntityMixin.java => CooldownInstanceAccessor.java} (84%) diff --git a/docs/scarpet/api/Entities.md b/docs/scarpet/api/Entities.md index 16244ae92a..9b0913f44a 100644 --- a/docs/scarpet/api/Entities.md +++ b/docs/scarpet/api/Entities.md @@ -304,7 +304,7 @@ Number of ticks an entity sits in a portal. ### `query(e, 'item_cooldown', item)` -Percentage remaining of item cooldown, e.g., from pearl throwing or horn blowing. +Ticks remaining of item usage cooldown, e.g., from pearl throwing or horn blowing. ### `query(e, 'item')` diff --git a/src/main/java/carpet/mixins/CooldownInstance_scarpetEntityMixin.java b/src/main/java/carpet/mixins/CooldownInstanceAccessor.java similarity index 84% rename from src/main/java/carpet/mixins/CooldownInstance_scarpetEntityMixin.java rename to src/main/java/carpet/mixins/CooldownInstanceAccessor.java index 89687fdab8..ee194d6669 100644 --- a/src/main/java/carpet/mixins/CooldownInstance_scarpetEntityMixin.java +++ b/src/main/java/carpet/mixins/CooldownInstanceAccessor.java @@ -5,7 +5,7 @@ import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(ItemCooldowns.CooldownInstance.class) -public interface CooldownInstance_scarpetEntityMixin { +public interface CooldownInstanceAccessor { @Accessor("startTime") int getStartTime(); diff --git a/src/main/java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java b/src/main/java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java index bfd067be73..814c291280 100644 --- a/src/main/java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java +++ b/src/main/java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java @@ -11,13 +11,11 @@ @Mixin(ItemCooldowns.class) public class ItemCooldowns_scarpetEntityMixin implements ItemCooldownsInterface { - - @Shadow @Final private Map cooldowns; @Override public int getCooldownTicks(Item item) { - var cooldown = ((CooldownInstance_scarpetEntityMixin) cooldowns.get(item)); + var cooldown = ((CooldownInstanceAccessor) cooldowns.get(item)); return cooldown.getEndTime()-cooldown.getStartTime(); } } diff --git a/src/main/java/carpet/script/value/EntityValue.java b/src/main/java/carpet/script/value/EntityValue.java index bd2d81edbb..2a219cb217 100644 --- a/src/main/java/carpet/script/value/EntityValue.java +++ b/src/main/java/carpet/script/value/EntityValue.java @@ -513,11 +513,8 @@ public Value get(String what, @Nullable Value arg) throw new InternalExpressionException("Can only query 'item_cooldown' for players"); Item item = NBTSerializableValue.parseItem(a.getString(), e.getServer().registryAccess()).getItem(); - - //The 0.0f here is because for some reason, the method does weird maths distorting the percentage - float perc = player.getCooldowns().getCooldownPercent(item, 0.0f); int ticks = ((ItemCooldownsInterface) player.getCooldowns()).getCooldownTicks(item); - Messenger.m(player, "c perc: "+perc); + return NumericValue.of(ticks); }); // ItemEntity -> despawn timer via ssGetAge diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index b8416fa4e8..17b9154309 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -82,7 +82,7 @@ "ServerGamePacketListenerImpl_scarpetEventsMixin", "ServerPlayerGameMode_scarpetEventsMixin", "ItemCooldowns_scarpetEntityMixin", - "CooldownInstance_scarpetEntityMixin", + "CooldownInstanceAccessor", "Player_parrotMixin", "SaplingBlock_desertShrubsMixin", "EntityMixin", From b020b7dd41f121a5aeff96125d36876bc22d430f Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Fri, 4 Aug 2023 15:21:52 +0200 Subject: [PATCH 4/7] Calculating actual ticks remaining --- .../java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java b/src/main/java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java index 814c291280..dd87738122 100644 --- a/src/main/java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java +++ b/src/main/java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java @@ -13,9 +13,11 @@ public class ItemCooldowns_scarpetEntityMixin implements ItemCooldownsInterface { @Shadow @Final private Map cooldowns; + @Shadow private int tickCount; + @Override public int getCooldownTicks(Item item) { var cooldown = ((CooldownInstanceAccessor) cooldowns.get(item)); - return cooldown.getEndTime()-cooldown.getStartTime(); + return cooldown.getEndTime()-tickCount; } } From 0f8f791aa1bdde392d664e34988f3c68272d0e7a Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Fri, 4 Aug 2023 15:22:46 +0200 Subject: [PATCH 5/7] Remove redundant accessor --- src/main/java/carpet/mixins/CooldownInstanceAccessor.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/carpet/mixins/CooldownInstanceAccessor.java b/src/main/java/carpet/mixins/CooldownInstanceAccessor.java index ee194d6669..df8fab2357 100644 --- a/src/main/java/carpet/mixins/CooldownInstanceAccessor.java +++ b/src/main/java/carpet/mixins/CooldownInstanceAccessor.java @@ -6,9 +6,6 @@ @Mixin(ItemCooldowns.CooldownInstance.class) public interface CooldownInstanceAccessor { - @Accessor("startTime") - int getStartTime(); - @Accessor("endTime") int getEndTime(); } From 65f8e6d98f44bd526864992ba8de5ec3e3312f93 Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Fri, 4 Aug 2023 15:23:59 +0200 Subject: [PATCH 6/7] Checking if item is actually on cooldown --- .../java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java b/src/main/java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java index dd87738122..5f042cb28e 100644 --- a/src/main/java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java +++ b/src/main/java/carpet/mixins/ItemCooldowns_scarpetEntityMixin.java @@ -17,6 +17,8 @@ public class ItemCooldowns_scarpetEntityMixin implements ItemCooldownsInterface @Override public int getCooldownTicks(Item item) { + if(!cooldowns.containsKey(item)) return 0; + var cooldown = ((CooldownInstanceAccessor) cooldowns.get(item)); return cooldown.getEndTime()-tickCount; } From 744caa7e061187142ab176941883a6edcf9cdf5f Mon Sep 17 00:00:00 2001 From: Ghoulboy Date: Sat, 5 Aug 2023 11:34:20 +0200 Subject: [PATCH 7/7] Removing redundant imports --- src/main/java/carpet/script/value/EntityValue.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/carpet/script/value/EntityValue.java b/src/main/java/carpet/script/value/EntityValue.java index 2a219cb217..15f6e0b2da 100644 --- a/src/main/java/carpet/script/value/EntityValue.java +++ b/src/main/java/carpet/script/value/EntityValue.java @@ -1,7 +1,6 @@ package carpet.script.value; import carpet.fakes.ItemCooldownsInterface; -import carpet.mixins.ItemCooldowns_scarpetEntityMixin; import carpet.script.external.Vanilla; import carpet.script.utils.Tracer; import carpet.script.CarpetContext; @@ -12,7 +11,6 @@ import carpet.script.external.Carpet; import carpet.script.utils.EntityTools; import carpet.script.utils.InputValidator; -import carpet.utils.Messenger; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.commands.CommandSourceStack; @@ -68,7 +66,6 @@ import net.minecraft.world.entity.projectile.WitherSkull; import net.minecraft.world.entity.vehicle.AbstractMinecart; import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemCooldowns; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameType; import net.minecraft.world.level.Level;