From 314bcb40327a84c25db43c0be3fff3b7ac75e597 Mon Sep 17 00:00:00 2001 From: Jenny Date: Sun, 23 Mar 2025 05:15:40 +0100 Subject: [PATCH] s2c packet for current mana amount, mana display in xp bar (prototype) --- gradle.properties | 2 +- src/main/java/com/jenny/magic/Magic.java | 2 + .../jenny/magic/blocks/mana/ManaClient.java | 6 ++ .../magic/blocks/networking/networking.java | 44 +++++++++++++ .../networking/packets/ManaAmountS2C.java | 33 ++++++++++ .../java/com/jenny/magic/items/BaseItem.java | 7 ++ .../java/com/jenny/magic/items/BaseWand.java | 9 +++ .../magic/items/TeleportScrollBiome.java | 20 ++++-- .../java/com/jenny/magic/items/items.java | 6 +- .../jenny/magic/mixins/ExperienceToMana.java | 61 ++++++++++++++++++ .../resources/assets/magic/lang/en_us.json | 6 +- .../minecraft/textures/gui/icons_mana.png | Bin 0 -> 2508 bytes src/main/resources/magic.mixins.json | 1 + 13 files changed, 188 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/jenny/magic/blocks/mana/ManaClient.java create mode 100644 src/main/java/com/jenny/magic/blocks/networking/networking.java create mode 100644 src/main/java/com/jenny/magic/blocks/networking/packets/ManaAmountS2C.java create mode 100644 src/main/java/com/jenny/magic/mixins/ExperienceToMana.java create mode 100644 src/main/resources/assets/minecraft/textures/gui/icons_mana.png diff --git a/gradle.properties b/gradle.properties index f3a7fdb..8504233 100644 --- a/gradle.properties +++ b/gradle.properties @@ -44,6 +44,6 @@ mod_version=0.0.1 # See https://maven.apache.org/guides/mini/guide-naming-conventions.html mod_group_id=com.jenny # The authors of the mod. This is a simple text string that is used for display purposes in the mod list. -mod_authors= +mod_authors=xJenny69 # The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. mod_description= diff --git a/src/main/java/com/jenny/magic/Magic.java b/src/main/java/com/jenny/magic/Magic.java index 027aadc..93dba0c 100644 --- a/src/main/java/com/jenny/magic/Magic.java +++ b/src/main/java/com/jenny/magic/Magic.java @@ -3,6 +3,7 @@ package com.jenny.magic; import com.jenny.magic.blocks.blocks; import com.jenny.magic.blocks.conditions.conditions; import com.jenny.magic.blocks.entities.blockEntities; +import com.jenny.magic.blocks.networking.networking; import com.jenny.magic.config.ConfigServer; import com.jenny.magic.entities.entities; import com.jenny.magic.items.items; @@ -47,6 +48,7 @@ public class Magic { @SubscribeEvent public static void onCommonSetup(FMLCommonSetupEvent event) { conditions.register(); + networking.register(); } } } diff --git a/src/main/java/com/jenny/magic/blocks/mana/ManaClient.java b/src/main/java/com/jenny/magic/blocks/mana/ManaClient.java new file mode 100644 index 0000000..4207140 --- /dev/null +++ b/src/main/java/com/jenny/magic/blocks/mana/ManaClient.java @@ -0,0 +1,6 @@ +package com.jenny.magic.blocks.mana; + +public class ManaClient { + public static int mana = 100; + public static long lastUse = 0; +} diff --git a/src/main/java/com/jenny/magic/blocks/networking/networking.java b/src/main/java/com/jenny/magic/blocks/networking/networking.java new file mode 100644 index 0000000..c9dac0b --- /dev/null +++ b/src/main/java/com/jenny/magic/blocks/networking/networking.java @@ -0,0 +1,44 @@ +package com.jenny.magic.blocks.networking; + +import com.jenny.magic.blocks.networking.packets.ManaAmountS2C; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.network.NetworkDirection; +import net.minecraftforge.network.NetworkRegistry; +import net.minecraftforge.network.PacketDistributor; +import net.minecraftforge.network.simple.SimpleChannel; + +import static com.jenny.magic.Magic.MODID; + +public class networking { + private static SimpleChannel INSTANCE; + private static int packetID = 0; + + private static int id() { + return packetID; + } + + public static void register() { + SimpleChannel net = NetworkRegistry.ChannelBuilder + .named(new ResourceLocation(MODID, "messages")) + .networkProtocolVersion(() -> "1.0") + .clientAcceptedVersions(s -> true) + .serverAcceptedVersions(s -> true) + .simpleChannel(); + INSTANCE = net; + + net.messageBuilder(ManaAmountS2C.class, id(), NetworkDirection.PLAY_TO_CLIENT) + .decoder(ManaAmountS2C::new) + .encoder(ManaAmountS2C::toBytes) + .consumerMainThread(ManaAmountS2C::handle) + .add(); + } + + public static void sendToServer(MSG message) { + INSTANCE.sendToServer(message); + } + + public static void sendToPlayer(MSG message, ServerPlayer player) { + INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), message); + } +} diff --git a/src/main/java/com/jenny/magic/blocks/networking/packets/ManaAmountS2C.java b/src/main/java/com/jenny/magic/blocks/networking/packets/ManaAmountS2C.java new file mode 100644 index 0000000..479bcb4 --- /dev/null +++ b/src/main/java/com/jenny/magic/blocks/networking/packets/ManaAmountS2C.java @@ -0,0 +1,33 @@ +package com.jenny.magic.blocks.networking.packets; + +import com.jenny.magic.blocks.mana.ManaClient; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class ManaAmountS2C { + private final int mana; + + public ManaAmountS2C(int mana) { + this.mana = mana; + } + + public ManaAmountS2C(FriendlyByteBuf buf) { + this.mana = buf.getByte(2); + } + + public void toBytes(FriendlyByteBuf buf) { + buf.writeByte(0); + buf.writeByte(this.mana); + } + + public boolean handle(Supplier supplier) { + NetworkEvent.Context context = supplier.get(); + context.enqueueWork(() -> { + ManaClient.mana = this.mana; + System.out.println("test187 " + this.mana); + }); + return true; + } +} diff --git a/src/main/java/com/jenny/magic/items/BaseItem.java b/src/main/java/com/jenny/magic/items/BaseItem.java index 699ab16..a02f9bd 100644 --- a/src/main/java/com/jenny/magic/items/BaseItem.java +++ b/src/main/java/com/jenny/magic/items/BaseItem.java @@ -1,9 +1,12 @@ package com.jenny.magic.items; +import com.jenny.magic.blocks.networking.networking; +import com.jenny.magic.blocks.networking.packets.ManaAmountS2C; import net.minecraft.ChatFormatting; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.RandomSource; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -53,4 +56,8 @@ abstract class BaseItem extends Item { INWARD, OUTWARD } + + protected void manaUpdate(ServerPlayer player) { + networking.sendToPlayer(new ManaAmountS2C(5), player); + } } diff --git a/src/main/java/com/jenny/magic/items/BaseWand.java b/src/main/java/com/jenny/magic/items/BaseWand.java index db7b477..ea0e68b 100644 --- a/src/main/java/com/jenny/magic/items/BaseWand.java +++ b/src/main/java/com/jenny/magic/items/BaseWand.java @@ -1,6 +1,8 @@ package com.jenny.magic.items; +import com.jenny.magic.blocks.mana.ManaClient; import com.jenny.magic.entities.BaseWandProjectile; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; @@ -19,6 +21,13 @@ abstract class BaseWand extends BaseItem { BaseWandProjectile projectile = newProjectile(pLevel); projectile.shootFromRotation(pPlayer, pPlayer.getXRot(), pPlayer.getYRot(), 0.0F, 2.0F); pLevel.addFreshEntity(projectile); + + if (!pLevel.isClientSide) { + manaUpdate((ServerPlayer) pPlayer); + } else { + ManaClient.lastUse = System.currentTimeMillis(); + } + return InteractionResultHolder.success(itemstack); } diff --git a/src/main/java/com/jenny/magic/items/TeleportScrollBiome.java b/src/main/java/com/jenny/magic/items/TeleportScrollBiome.java index 4e27b77..b25a839 100644 --- a/src/main/java/com/jenny/magic/items/TeleportScrollBiome.java +++ b/src/main/java/com/jenny/magic/items/TeleportScrollBiome.java @@ -5,27 +5,31 @@ import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.Biome; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.util.Objects; +import java.util.List; import java.util.function.Predicate; import static com.jenny.magic.Magic.MODID; public class TeleportScrollBiome extends BaseItem { - private final Biome biome; + private final ResourceKey biome; private final ChatFormatting color; - public TeleportScrollBiome(Properties pProperties, Biome biome, ChatFormatting color) { + public TeleportScrollBiome(Properties pProperties, ResourceKey biome, ChatFormatting color) { super(pProperties); this.biome = biome; this.color = color; @@ -48,7 +52,7 @@ public class TeleportScrollBiome extends BaseItem { Predicate> predicate = new Predicate>() { @Override public boolean test(@NotNull Holder biomeHolder) { - return Objects.equals(biomeHolder.get().toString(), biome.toString()); + return biomeHolder.is(biome); } }; Pair> pair = ((ServerLevel) player.level()).findClosestBiome3d(predicate, player.blockPosition(), 69000, 32, 64); @@ -61,6 +65,14 @@ public class TeleportScrollBiome extends BaseItem { itemStack.shrink(1); } + @Override + public void appendHoverText(@NotNull ItemStack pStack, @Nullable Level pLevel, @NotNull List pTooltipComponents, @NotNull TooltipFlag pIsAdvanced) { + String key = String.format("tooltip.%s.scroll_teleport_biome", MODID); + MutableComponent toolTip = Component.translatable(key); + toolTip = toolTip.append(Component.translatable("biome." + biome.location().toLanguageKey()).withStyle(color)); + pTooltipComponents.add(toolTip.withStyle(ChatFormatting.DARK_BLUE)); + } + protected void MessageBiomeNotFound(Player player) { player.sendSystemMessage(Component.translatable(String.format("message.%s.scroll_teleport_biome.not_found", MODID))); } diff --git a/src/main/java/com/jenny/magic/items/items.java b/src/main/java/com/jenny/magic/items/items.java index 5637c6c..66373d6 100644 --- a/src/main/java/com/jenny/magic/items/items.java +++ b/src/main/java/com/jenny/magic/items/items.java @@ -1,6 +1,8 @@ package com.jenny.magic.items; +import net.minecraft.ChatFormatting; import net.minecraft.world.item.Item; +import net.minecraft.world.level.biome.Biomes; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; @@ -14,8 +16,8 @@ public class items { public static final RegistryObject SCROLL_TELEPORT = ITEMS.register("scroll_teleport", () -> new TeleportScrollPersistent(new Item.Properties().stacksTo(1))); public static final RegistryObject SCROLL_TELEPORT_BRITTLE = ITEMS.register("scroll_teleport_brittle", () -> new TeleportScrollConsumable(new Item.Properties().stacksTo(16))); public static final RegistryObject SCROLL_TELEPORT_RANDOM = ITEMS.register("scroll_teleport_random", () -> new TeleportScrollRandom(new Item.Properties().stacksTo(1))); - public static final RegistryObject SCROLL_TELEPORT_RANDOM_BIOME = ITEMS.register("scroll_teleport_random_biome", () -> new TeleportScrollRandomBiome(new Item.Properties().stacksTo(16))); - + //public static final RegistryObject SCROLL_TELEPORT_RANDOM_BIOME = ITEMS.register("scroll_teleport_random_biome", () -> new TeleportScrollRandomBiome(new Item.Properties().stacksTo(16))); + public static final RegistryObject SCROLL_TELEPORT_BIOME_PLAINS = ITEMS.register("scroll_teleport_biome_plains", () -> new TeleportScrollBiome(new Item.Properties().stacksTo(16), Biomes.PLAINS, ChatFormatting.GREEN)); public static void register(IEventBus bus) { ITEMS.register(bus); diff --git a/src/main/java/com/jenny/magic/mixins/ExperienceToMana.java b/src/main/java/com/jenny/magic/mixins/ExperienceToMana.java new file mode 100644 index 0000000..a86b079 --- /dev/null +++ b/src/main/java/com/jenny/magic/mixins/ExperienceToMana.java @@ -0,0 +1,61 @@ +package com.jenny.magic.mixins; + +import com.jenny.magic.blocks.mana.ManaClient; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.resources.ResourceLocation; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Gui.class) +public class ExperienceToMana { + @Shadow + protected int screenHeight; + @Unique + private float experienceProgress; + @Unique + private int experienceLevel; + @Unique + private ResourceLocation guiIconsLocation = new ResourceLocation("textures/gui/icons_mana.png"); + + @Unique + private Gui self() { + return (Gui) (Object) this; + } + + @Unique + private boolean manaMode() { + return System.currentTimeMillis() - ManaClient.lastUse < 1000; + } + + + /** + * @author xJenny69 + * @reason display mana instead of xp bar + */ + @Inject(method = "renderExperienceBar", at = @At("HEAD")) + public void renderExperienceBarHead(GuiGraphics pGuiGraphics, int pX, CallbackInfo ci) { + if (manaMode()) { + experienceLevel = Minecraft.getInstance().player.experienceLevel; + experienceProgress = Minecraft.getInstance().player.experienceProgress; + + Minecraft.getInstance().player.experienceLevel = ManaClient.mana; + Minecraft.getInstance().player.experienceProgress = (float) ManaClient.mana / 100; + } + } + + @Inject(method = "renderExperienceBar", at = @At("TAIL")) + public void renderExperienceBarTail(GuiGraphics pGuiGraphics, int pX, CallbackInfo ci) { + if (manaMode()) { + int l = this.screenHeight - 32 + 3; + pGuiGraphics.blit(guiIconsLocation, pX, l, 0, 64, 182, 5); + Minecraft.getInstance().player.experienceLevel = experienceLevel; + Minecraft.getInstance().player.experienceProgress = experienceProgress; + } + } +} diff --git a/src/main/resources/assets/magic/lang/en_us.json b/src/main/resources/assets/magic/lang/en_us.json index 5eb2c9e..e7c6349 100644 --- a/src/main/resources/assets/magic/lang/en_us.json +++ b/src/main/resources/assets/magic/lang/en_us.json @@ -5,8 +5,10 @@ "tooltip.magic.scroll_teleport.unset": "No location set", "tooltip.magic.scroll_teleport.set": "Teleports to: ", "tooltip.magic.scroll_teleport_random": "Using it a second time teleports you back", - "tooltip.magic.scroll_teleport_random.back": "Will teleport you back to: ", + "tooltip.magic.scroll_teleport_random.back": "Will teleport you back to ", + "tooltip.magic.scroll_teleport_biome": "teleports you to the Biome ", "message.magic.scroll_teleport.set": "Location set.", "message.magic.scroll_teleport.dim": "You're not in the same dimension.", - "message.magic.scroll_teleport.dist": "You're too far away" + "message.magic.scroll_teleport.dist": "You're too far away", + "message.magic.scroll_teleport_biome.not_found": "The biome could not be located, try again elsewhere." } \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/textures/gui/icons_mana.png b/src/main/resources/assets/minecraft/textures/gui/icons_mana.png new file mode 100644 index 0000000000000000000000000000000000000000..5abd9f7656388ae70e8c7d8f561f9cb3095acd5f GIT binary patch literal 2508 zcmYjT3s6&68V+ny2^~v@hIN#RDcgkb5bDJif`~+UNzy2fq_P6Ca7lI$Sv7)SdDvJh zrdDA?5<()VETSf*8gy$!t%|Hkd1Q4fE+ec(O9GMw*9cXfd(O=bm>DL+$$!7||KInW z@7$wXdGSl#SGW@hgr%DkVv-32muUFs_6}I-u4=jfzFfq~@f!&(Js*q^2;{Ff$FNh2 zHUAx8AJ6!NLi*=>uD!SN*fs^(+xXG3I%1P?f5r3$<&*WIV*VvWf8mLIV#AHHH`ASu zJxb@E{eXRT%+HLr_YIfqulK$(75U4hhNAf;grYqzu9u?9=4O=@^ThIb`{=BBjmmae z_t#Iu@+M0B^w_W4C0$gXHof$zrH&PTaw(;9$d#Dw&qk4s?lt1ZICCqg`eO~vODq=O z%K0>!rg)c9*+i_46?(<~qrd-X{=sP7@9D;)X&wC^kUTzz)#+eqzJ?|rSf$NHR8K8@ zF?g&uiJm~;RZz3h#Rsnm3W1xnH;GUFoABkfcsb2a2sWWc>au@F%r=0fE%HT-Mhs&$ zr%LLZQ}EuH@g29jd%;%MiPfeRLiuGwQmC~LJn};jo7WW}RqwPIbDb!&4C8Z_id$4J z7>N>r#g%+XDwQM_H&WgEtMPeD$i6av_u!L&yz5f1R+viOn=MG{PY+#k0(KV+2H@GayGm#`vlJ;qJ_pYW|bc1Ti-Dq`d&R771qV8!;T%x7wu1ud#)g>ON%Spd+R zv<|>&vLp!5Cove3+(`>So#pTUO+Ve(%w?!U+{YpzhyLt4t(apboq`W5Y3@EM+l&s0 za1<0&@w>Xat8e2^~zC%SffSv|&L`kwy`Yrqe{l2>{HEEZ<*P3UXr!Qm&wwDrxuRGWH!atv>4 z!=!2S^QKWcNp5%Zrqwj96-Cl`f+Pu{bQ9UPEfy1fKY~|Wn+anJ8bmyXY`q%#E3xX7 z?hLb5?JeKR)HqFeyn>9>eHXQbAVo1tc&iQW;mp?ooJrV^Q%5;EH`Z`;s z1_P`2BHnRxVihm;b_*CD(8OdDZk`7Iu3P3aV2vvbDt1ct5~v^duJoZ*B{S`XopQ*& zJ7xR_7Enaxp}73_=7H}G_wy%85S4AJ3lrCfO4S@oTt?ap+^~Yj04u_aIbfwmB7GI1 z4zP8>S|(z#B*Td@=T`vJf@lHOe6Ieerw zuRDzEcH=T}Sw)DV$L4xT&>p0|_ zQ#!_XQlX$5hmY7FS_evajJ6yhP-E#lBOzA^JTzenAa{I=voWA2vZ|j7pJ;-@AP+Ff zsHDf1xbLFIohclvq@9eqJ6`AAEoktQ6&k@7x}gwuT5WTNdFM0D)ETNSwxi| zrPZXPU0t}p6rSjz`yN)Uxy`QOPI4h-S1QQ*osP}|d+>+}qPuOvJeEi~ICK_d(u2W6 z=edeneoOfHuPj{7WXamzkxer#nDO<;pns%akk5cKH-*XrzwuruyO`?WOH={(`^f+=@E2o3wj6Fqw>K@F^gTH%7@T0MOQ3qR5cPh!?KEzB?A@Se_q z?<33$O_hqAGLEX?2Fe+5(Cu9&RPP1N>$twJk~+F?8f5T5j~W+l3wzp-)Ly<82DAY@ znMkQ$BnzRt-KshNb{rHg!c{(i(WTsq?Ivn`&r;l;9FFl6U#kwz7JbDkyYOLMoIH6f6sW38K~ft>Z=olCB1k4J6*RZ;JBc z&H|9{nR%EK4v>)xDPKM)63AAPkr6 zdhsy!jxreDxT@##hW%E<&(H@EFX=`mV1=c!eFguA?+-P!-7av6?iM|`>i#hQ=<@p) RTfplXVRI}mre$N6