mirror of
https://github.com/HibiscusMC/HibiscusCommons.git
synced 2025-12-19 15:09:26 +00:00
feat: add sendToastPacket
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package me.lojosho.hibiscuscommons.nms;
|
package me.lojosho.hibiscuscommons.nms;
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.ints.IntList;
|
import it.unimi.dsi.fastutil.ints.IntList;
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.entity.Display;
|
import org.bukkit.entity.Display;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
@@ -74,4 +75,6 @@ public interface NMSPackets {
|
|||||||
int blockLight, int skyLight, float viewRange, float width, float height,
|
int blockLight, int skyLight, float viewRange, float width, float height,
|
||||||
ItemDisplay.ItemDisplayTransform transform, ItemStack itemStack,
|
ItemDisplay.ItemDisplayTransform transform, ItemStack itemStack,
|
||||||
List<Player> sendTo);
|
List<Player> sendTo);
|
||||||
|
|
||||||
|
void sendToastPacket(Player player, ItemStack icon, Component title, Component description);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,23 @@
|
|||||||
package me.lojosho.hibiscuscommons.nms.v1_20_R3;
|
package me.lojosho.hibiscuscommons.nms.v1_20_R3;
|
||||||
|
|
||||||
|
import com.google.gson.JsonDeserializationContext;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
import com.mojang.datafixers.util.Pair;
|
import com.mojang.datafixers.util.Pair;
|
||||||
|
import com.mojang.serialization.JsonOps;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
import it.unimi.dsi.fastutil.ints.IntList;
|
import it.unimi.dsi.fastutil.ints.IntList;
|
||||||
|
import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin;
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||||
|
import net.minecraft.advancements.Advancement;
|
||||||
|
import net.minecraft.advancements.AdvancementHolder;
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
import net.minecraft.network.protocol.Packet;
|
import net.minecraft.network.protocol.Packet;
|
||||||
import net.minecraft.network.protocol.game.*;
|
import net.minecraft.network.protocol.game.*;
|
||||||
import net.minecraft.network.syncher.EntityDataSerializers;
|
import net.minecraft.network.syncher.EntityDataSerializers;
|
||||||
import net.minecraft.network.syncher.SynchedEntityData;
|
import net.minecraft.network.syncher.SynchedEntityData;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.server.MinecraftServer;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.world.entity.EquipmentSlot;
|
import net.minecraft.world.entity.EquipmentSlot;
|
||||||
import net.minecraft.world.entity.player.Inventory;
|
import net.minecraft.world.entity.player.Inventory;
|
||||||
@@ -26,6 +36,7 @@ import org.bukkit.entity.EntityType;
|
|||||||
import org.bukkit.entity.ItemDisplay;
|
import org.bukkit.entity.ItemDisplay;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.joml.Quaternionf;
|
import org.joml.Quaternionf;
|
||||||
import org.joml.Vector3f;
|
import org.joml.Vector3f;
|
||||||
|
|
||||||
@@ -295,4 +306,9 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.
|
|||||||
ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues);
|
ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues);
|
||||||
for (Player p : sendTo) sendPacket(p, packet);
|
for (Player p : sendTo) sendPacket(p, packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendToastPacket(Player player, ItemStack icon, Component title, Component description) {
|
||||||
|
throw new UnsupportedOperationException("Not implemented in this version.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,22 @@
|
|||||||
package me.lojosho.hibiscuscommons.nms.v1_20_R4;
|
package me.lojosho.hibiscuscommons.nms.v1_20_R4;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
import com.mojang.datafixers.util.Pair;
|
import com.mojang.datafixers.util.Pair;
|
||||||
|
import com.mojang.serialization.JsonOps;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
import it.unimi.dsi.fastutil.ints.IntList;
|
import it.unimi.dsi.fastutil.ints.IntList;
|
||||||
|
import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin;
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||||
|
import net.minecraft.advancements.Advancement;
|
||||||
|
import net.minecraft.advancements.AdvancementHolder;
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
import net.minecraft.network.protocol.Packet;
|
import net.minecraft.network.protocol.Packet;
|
||||||
import net.minecraft.network.protocol.game.*;
|
import net.minecraft.network.protocol.game.*;
|
||||||
import net.minecraft.network.syncher.EntityDataSerializers;
|
import net.minecraft.network.syncher.EntityDataSerializers;
|
||||||
import net.minecraft.network.syncher.SynchedEntityData;
|
import net.minecraft.network.syncher.SynchedEntityData;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.server.MinecraftServer;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.world.entity.EquipmentSlot;
|
import net.minecraft.world.entity.EquipmentSlot;
|
||||||
import net.minecraft.world.entity.player.Inventory;
|
import net.minecraft.world.entity.player.Inventory;
|
||||||
@@ -26,6 +35,7 @@ import org.bukkit.entity.EntityType;
|
|||||||
import org.bukkit.entity.ItemDisplay;
|
import org.bukkit.entity.ItemDisplay;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.joml.Quaternionf;
|
import org.joml.Quaternionf;
|
||||||
import org.joml.Vector3f;
|
import org.joml.Vector3f;
|
||||||
|
|
||||||
@@ -293,4 +303,73 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.
|
|||||||
ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues);
|
ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues);
|
||||||
for (Player p : sendTo) sendPacket(p, packet);
|
for (Player p : sendTo) sendPacket(p, packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendToastPacket(Player player, ItemStack icon, Component title, Component description) {
|
||||||
|
final var key = new ResourceLocation("hibiscuscommons", UUID.randomUUID().toString());
|
||||||
|
|
||||||
|
JsonObject json = new JsonObject();
|
||||||
|
|
||||||
|
// Creating the "criteria" object
|
||||||
|
JsonObject impossibleCriteria = new JsonObject();
|
||||||
|
JsonObject impossible = new JsonObject();
|
||||||
|
impossible.addProperty("trigger", "minecraft:impossible");
|
||||||
|
impossibleCriteria.add("impossible", impossible);
|
||||||
|
json.add("criteria", impossibleCriteria);
|
||||||
|
|
||||||
|
// Creating the "display" object
|
||||||
|
JsonObject display = new JsonObject();
|
||||||
|
JsonObject iconObj = new JsonObject();
|
||||||
|
iconObj.addProperty("id", icon.getType().getKey().toString());
|
||||||
|
|
||||||
|
if (icon.hasItemMeta()) {
|
||||||
|
ItemMeta meta = icon.getItemMeta();
|
||||||
|
JsonObject components = new JsonObject();
|
||||||
|
|
||||||
|
if (!meta.getEnchants().isEmpty()) {
|
||||||
|
components.addProperty("minecraft:enchantment_glint_override", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (meta.hasCustomModelData()) {
|
||||||
|
components.addProperty("minecraft:custom_model_data", meta.getCustomModelData());
|
||||||
|
}
|
||||||
|
|
||||||
|
iconObj.add("components", components);
|
||||||
|
}
|
||||||
|
|
||||||
|
display.add("icon", iconObj);
|
||||||
|
display.add("title", GsonComponentSerializer.gson().serializeToTree(title));
|
||||||
|
display.add("description", GsonComponentSerializer.gson().serializeToTree(description));
|
||||||
|
display.addProperty("description", "Toast Description");
|
||||||
|
display.addProperty("frame", "task");
|
||||||
|
display.addProperty("announce_to_chat", false);
|
||||||
|
display.addProperty("show_toast", true);
|
||||||
|
display.addProperty("hidden", true);
|
||||||
|
|
||||||
|
json.add("display", display);
|
||||||
|
|
||||||
|
final var advancement = Advancement.CODEC.parse(MinecraftServer.getServer().registryAccess().createSerializationContext(JsonOps.INSTANCE), json);
|
||||||
|
final var advancementHolder = new AdvancementHolder(key, advancement.result().orElseThrow());
|
||||||
|
|
||||||
|
final var nmsPlayer = ((CraftPlayer) player).getHandle();
|
||||||
|
final var progress = nmsPlayer.getAdvancements().getOrStartProgress(advancementHolder);
|
||||||
|
MinecraftServer.getServer().getAdvancements().tree().addAll(Set.of(advancementHolder));
|
||||||
|
progress.getRemainingCriteria().forEach(criteria -> nmsPlayer.getAdvancements().award(advancementHolder, criteria));
|
||||||
|
|
||||||
|
Bukkit.getScheduler().runTaskLater(HibiscusCommonsPlugin.getInstance(), () -> {
|
||||||
|
progress.getRemainingCriteria().forEach(criteria -> nmsPlayer.getAdvancements().revoke(advancementHolder, criteria));
|
||||||
|
MinecraftServer.getServer().getAdvancements().tree().remove(Set.of(key));
|
||||||
|
|
||||||
|
// Remove the advancement from the player's client to prevent it from being displayed again
|
||||||
|
// Was not working without this?
|
||||||
|
ClientboundUpdateAdvancementsPacket removePacket = new ClientboundUpdateAdvancementsPacket(
|
||||||
|
false,
|
||||||
|
Collections.emptyList(),
|
||||||
|
Set.of(key),
|
||||||
|
Map.of()
|
||||||
|
);
|
||||||
|
|
||||||
|
sendPacket(player, removePacket);
|
||||||
|
}, 2L);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,23 @@
|
|||||||
package me.lojosho.hibiscuscommons.nms.v1_21_R1;
|
package me.lojosho.hibiscuscommons.nms.v1_21_R1;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
import com.mojang.datafixers.kinds.Const;
|
import com.mojang.datafixers.kinds.Const;
|
||||||
import com.mojang.datafixers.util.Pair;
|
import com.mojang.datafixers.util.Pair;
|
||||||
|
import com.mojang.serialization.JsonOps;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
import it.unimi.dsi.fastutil.ints.IntList;
|
import it.unimi.dsi.fastutil.ints.IntList;
|
||||||
|
import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin;
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||||
|
import net.minecraft.advancements.Advancement;
|
||||||
|
import net.minecraft.advancements.AdvancementHolder;
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
import net.minecraft.network.protocol.Packet;
|
import net.minecraft.network.protocol.Packet;
|
||||||
import net.minecraft.network.protocol.game.*;
|
import net.minecraft.network.protocol.game.*;
|
||||||
import net.minecraft.network.syncher.EntityDataSerializers;
|
import net.minecraft.network.syncher.EntityDataSerializers;
|
||||||
import net.minecraft.network.syncher.SynchedEntityData;
|
import net.minecraft.network.syncher.SynchedEntityData;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.server.MinecraftServer;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.world.entity.EquipmentSlot;
|
import net.minecraft.world.entity.EquipmentSlot;
|
||||||
import net.minecraft.world.entity.player.Inventory;
|
import net.minecraft.world.entity.player.Inventory;
|
||||||
@@ -27,6 +36,7 @@ import org.bukkit.entity.EntityType;
|
|||||||
import org.bukkit.entity.ItemDisplay;
|
import org.bukkit.entity.ItemDisplay;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.joml.Quaternionf;
|
import org.joml.Quaternionf;
|
||||||
import org.joml.Vector3f;
|
import org.joml.Vector3f;
|
||||||
|
|
||||||
@@ -302,4 +312,73 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.
|
|||||||
ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues);
|
ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues);
|
||||||
for (Player p : sendTo) sendPacket(p, packet);
|
for (Player p : sendTo) sendPacket(p, packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendToastPacket(Player player, ItemStack icon, Component title, Component description) {
|
||||||
|
final var key = ResourceLocation.fromNamespaceAndPath("hibiscuscommons", UUID.randomUUID().toString());
|
||||||
|
|
||||||
|
JsonObject json = new JsonObject();
|
||||||
|
|
||||||
|
// Creating the "criteria" object
|
||||||
|
JsonObject impossibleCriteria = new JsonObject();
|
||||||
|
JsonObject impossible = new JsonObject();
|
||||||
|
impossible.addProperty("trigger", "minecraft:impossible");
|
||||||
|
impossibleCriteria.add("impossible", impossible);
|
||||||
|
json.add("criteria", impossibleCriteria);
|
||||||
|
|
||||||
|
// Creating the "display" object
|
||||||
|
JsonObject display = new JsonObject();
|
||||||
|
JsonObject iconObj = new JsonObject();
|
||||||
|
iconObj.addProperty("id", icon.getType().getKey().toString());
|
||||||
|
|
||||||
|
if (icon.hasItemMeta()) {
|
||||||
|
ItemMeta meta = icon.getItemMeta();
|
||||||
|
JsonObject components = new JsonObject();
|
||||||
|
|
||||||
|
if (!meta.getEnchants().isEmpty()) {
|
||||||
|
components.addProperty("minecraft:enchantment_glint_override", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (meta.hasCustomModelData()) {
|
||||||
|
components.addProperty("minecraft:custom_model_data", meta.getCustomModelData());
|
||||||
|
}
|
||||||
|
|
||||||
|
iconObj.add("components", components);
|
||||||
|
}
|
||||||
|
|
||||||
|
display.add("icon", iconObj);
|
||||||
|
display.add("title", GsonComponentSerializer.gson().serializeToTree(title));
|
||||||
|
display.add("description", GsonComponentSerializer.gson().serializeToTree(description));
|
||||||
|
display.addProperty("description", "Toast Description");
|
||||||
|
display.addProperty("frame", "task");
|
||||||
|
display.addProperty("announce_to_chat", false);
|
||||||
|
display.addProperty("show_toast", true);
|
||||||
|
display.addProperty("hidden", true);
|
||||||
|
|
||||||
|
json.add("display", display);
|
||||||
|
|
||||||
|
final var advancement = Advancement.CODEC.parse(MinecraftServer.getServer().registryAccess().createSerializationContext(JsonOps.INSTANCE), json);
|
||||||
|
final var advancementHolder = new AdvancementHolder(key, advancement.result().orElseThrow());
|
||||||
|
|
||||||
|
final var nmsPlayer = ((CraftPlayer) player).getHandle();
|
||||||
|
final var progress = nmsPlayer.getAdvancements().getOrStartProgress(advancementHolder);
|
||||||
|
MinecraftServer.getServer().getAdvancements().tree().addAll(Set.of(advancementHolder));
|
||||||
|
progress.getRemainingCriteria().forEach(criteria -> nmsPlayer.getAdvancements().award(advancementHolder, criteria));
|
||||||
|
|
||||||
|
Bukkit.getScheduler().runTaskLater(HibiscusCommonsPlugin.getInstance(), () -> {
|
||||||
|
progress.getRemainingCriteria().forEach(criteria -> nmsPlayer.getAdvancements().revoke(advancementHolder, criteria));
|
||||||
|
MinecraftServer.getServer().getAdvancements().tree().remove(Set.of(key));
|
||||||
|
|
||||||
|
// Remove the advancement from the player's client to prevent it from being displayed again
|
||||||
|
// Was not working without this?
|
||||||
|
ClientboundUpdateAdvancementsPacket removePacket = new ClientboundUpdateAdvancementsPacket(
|
||||||
|
false,
|
||||||
|
Collections.emptyList(),
|
||||||
|
Set.of(key),
|
||||||
|
Map.of()
|
||||||
|
);
|
||||||
|
|
||||||
|
sendPacket(player, removePacket);
|
||||||
|
}, 2L);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,22 @@
|
|||||||
package me.lojosho.hibiscuscommons.nms.v1_21_R2;
|
package me.lojosho.hibiscuscommons.nms.v1_21_R2;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
import com.mojang.datafixers.util.Pair;
|
import com.mojang.datafixers.util.Pair;
|
||||||
|
import com.mojang.serialization.JsonOps;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
import it.unimi.dsi.fastutil.ints.IntList;
|
import it.unimi.dsi.fastutil.ints.IntList;
|
||||||
|
import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin;
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||||
|
import net.minecraft.advancements.Advancement;
|
||||||
|
import net.minecraft.advancements.AdvancementHolder;
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
import net.minecraft.network.protocol.Packet;
|
import net.minecraft.network.protocol.Packet;
|
||||||
import net.minecraft.network.protocol.game.*;
|
import net.minecraft.network.protocol.game.*;
|
||||||
import net.minecraft.network.syncher.EntityDataSerializers;
|
import net.minecraft.network.syncher.EntityDataSerializers;
|
||||||
import net.minecraft.network.syncher.SynchedEntityData;
|
import net.minecraft.network.syncher.SynchedEntityData;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.server.MinecraftServer;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.world.entity.EquipmentSlot;
|
import net.minecraft.world.entity.EquipmentSlot;
|
||||||
import net.minecraft.world.entity.PositionMoveRotation;
|
import net.minecraft.world.entity.PositionMoveRotation;
|
||||||
@@ -29,6 +38,7 @@ import org.bukkit.entity.ItemDisplay;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.joml.Quaternionf;
|
import org.joml.Quaternionf;
|
||||||
import org.joml.Vector3f;
|
import org.joml.Vector3f;
|
||||||
|
|
||||||
@@ -281,4 +291,73 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.
|
|||||||
ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues);
|
ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues);
|
||||||
for (Player p : sendTo) sendPacket(p, packet);
|
for (Player p : sendTo) sendPacket(p, packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendToastPacket(Player player, ItemStack icon, Component title, Component description) {
|
||||||
|
final var key = ResourceLocation.fromNamespaceAndPath("hibiscuscommons", UUID.randomUUID().toString());
|
||||||
|
|
||||||
|
JsonObject json = new JsonObject();
|
||||||
|
|
||||||
|
// Creating the "criteria" object
|
||||||
|
JsonObject impossibleCriteria = new JsonObject();
|
||||||
|
JsonObject impossible = new JsonObject();
|
||||||
|
impossible.addProperty("trigger", "minecraft:impossible");
|
||||||
|
impossibleCriteria.add("impossible", impossible);
|
||||||
|
json.add("criteria", impossibleCriteria);
|
||||||
|
|
||||||
|
// Creating the "display" object
|
||||||
|
JsonObject display = new JsonObject();
|
||||||
|
JsonObject iconObj = new JsonObject();
|
||||||
|
iconObj.addProperty("id", icon.getType().getKey().toString());
|
||||||
|
|
||||||
|
if (icon.hasItemMeta()) {
|
||||||
|
ItemMeta meta = icon.getItemMeta();
|
||||||
|
JsonObject components = new JsonObject();
|
||||||
|
|
||||||
|
if (!meta.getEnchants().isEmpty()) {
|
||||||
|
components.addProperty("minecraft:enchantment_glint_override", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (meta.hasCustomModelData()) {
|
||||||
|
components.addProperty("minecraft:custom_model_data", meta.getCustomModelData());
|
||||||
|
}
|
||||||
|
|
||||||
|
iconObj.add("components", components);
|
||||||
|
}
|
||||||
|
|
||||||
|
display.add("icon", iconObj);
|
||||||
|
display.add("title", GsonComponentSerializer.gson().serializeToTree(title));
|
||||||
|
display.add("description", GsonComponentSerializer.gson().serializeToTree(description));
|
||||||
|
display.addProperty("description", "Toast Description");
|
||||||
|
display.addProperty("frame", "task");
|
||||||
|
display.addProperty("announce_to_chat", false);
|
||||||
|
display.addProperty("show_toast", true);
|
||||||
|
display.addProperty("hidden", true);
|
||||||
|
|
||||||
|
json.add("display", display);
|
||||||
|
|
||||||
|
final var advancement = Advancement.CODEC.parse(MinecraftServer.getServer().registryAccess().createSerializationContext(JsonOps.INSTANCE), json);
|
||||||
|
final var advancementHolder = new AdvancementHolder(key, advancement.result().orElseThrow());
|
||||||
|
|
||||||
|
final var nmsPlayer = ((CraftPlayer) player).getHandle();
|
||||||
|
final var progress = nmsPlayer.getAdvancements().getOrStartProgress(advancementHolder);
|
||||||
|
MinecraftServer.getServer().getAdvancements().tree().addAll(Set.of(advancementHolder));
|
||||||
|
progress.getRemainingCriteria().forEach(criteria -> nmsPlayer.getAdvancements().award(advancementHolder, criteria));
|
||||||
|
|
||||||
|
Bukkit.getScheduler().runTaskLater(HibiscusCommonsPlugin.getInstance(), () -> {
|
||||||
|
progress.getRemainingCriteria().forEach(criteria -> nmsPlayer.getAdvancements().revoke(advancementHolder, criteria));
|
||||||
|
MinecraftServer.getServer().getAdvancements().tree().remove(Set.of(key));
|
||||||
|
|
||||||
|
// Remove the advancement from the player's client to prevent it from being displayed again
|
||||||
|
// Was not working without this?
|
||||||
|
ClientboundUpdateAdvancementsPacket removePacket = new ClientboundUpdateAdvancementsPacket(
|
||||||
|
false,
|
||||||
|
Collections.emptyList(),
|
||||||
|
Set.of(key),
|
||||||
|
Map.of()
|
||||||
|
);
|
||||||
|
|
||||||
|
sendPacket(player, removePacket);
|
||||||
|
}, 2L);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,22 @@
|
|||||||
package me.lojosho.hibiscuscommons.nms.v1_21_R3;
|
package me.lojosho.hibiscuscommons.nms.v1_21_R3;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
import com.mojang.datafixers.util.Pair;
|
import com.mojang.datafixers.util.Pair;
|
||||||
|
import com.mojang.serialization.JsonOps;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
import it.unimi.dsi.fastutil.ints.IntList;
|
import it.unimi.dsi.fastutil.ints.IntList;
|
||||||
|
import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin;
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||||
|
import net.kyori.adventure.text.serializer.json.JSONComponentSerializer;
|
||||||
|
import net.minecraft.advancements.*;
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
import net.minecraft.network.protocol.Packet;
|
import net.minecraft.network.protocol.Packet;
|
||||||
import net.minecraft.network.protocol.game.*;
|
import net.minecraft.network.protocol.game.*;
|
||||||
import net.minecraft.network.syncher.EntityDataSerializers;
|
import net.minecraft.network.syncher.EntityDataSerializers;
|
||||||
import net.minecraft.network.syncher.SynchedEntityData;
|
import net.minecraft.network.syncher.SynchedEntityData;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.server.MinecraftServer;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.world.entity.EquipmentSlot;
|
import net.minecraft.world.entity.EquipmentSlot;
|
||||||
import net.minecraft.world.entity.PositionMoveRotation;
|
import net.minecraft.world.entity.PositionMoveRotation;
|
||||||
@@ -29,6 +38,7 @@ import org.bukkit.entity.ItemDisplay;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.joml.Quaternionf;
|
import org.joml.Quaternionf;
|
||||||
import org.joml.Vector3f;
|
import org.joml.Vector3f;
|
||||||
|
|
||||||
@@ -42,6 +52,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.
|
|||||||
static Constructor<ClientboundSetEntityLinkPacket> linkConstructor;
|
static Constructor<ClientboundSetEntityLinkPacket> linkConstructor;
|
||||||
static Constructor<ClientboundSetCameraPacket> cameraConstructor;
|
static Constructor<ClientboundSetCameraPacket> cameraConstructor;
|
||||||
static Constructor<ClientboundPlayerLookAtPacket> lookAtConstructor;
|
static Constructor<ClientboundPlayerLookAtPacket> lookAtConstructor;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
try {
|
try {
|
||||||
passengerConstructor = ClientboundSetPassengersPacket.class.getDeclaredConstructor(FriendlyByteBuf.class);
|
passengerConstructor = ClientboundSetPassengersPacket.class.getDeclaredConstructor(FriendlyByteBuf.class);
|
||||||
@@ -281,4 +292,72 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.
|
|||||||
ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues);
|
ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues);
|
||||||
for (Player p : sendTo) sendPacket(p, packet);
|
for (Player p : sendTo) sendPacket(p, packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void sendToastPacket(Player player, ItemStack icon, Component title, Component description) {
|
||||||
|
final var key = ResourceLocation.fromNamespaceAndPath("hibiscuscommons", UUID.randomUUID().toString());
|
||||||
|
|
||||||
|
JsonObject json = new JsonObject();
|
||||||
|
|
||||||
|
// Creating the "criteria" object
|
||||||
|
JsonObject impossibleCriteria = new JsonObject();
|
||||||
|
JsonObject impossible = new JsonObject();
|
||||||
|
impossible.addProperty("trigger", "minecraft:impossible");
|
||||||
|
impossibleCriteria.add("impossible", impossible);
|
||||||
|
json.add("criteria", impossibleCriteria);
|
||||||
|
|
||||||
|
// Creating the "display" object
|
||||||
|
JsonObject display = new JsonObject();
|
||||||
|
JsonObject iconObj = new JsonObject();
|
||||||
|
iconObj.addProperty("id", icon.getType().getKey().toString());
|
||||||
|
|
||||||
|
if (icon.hasItemMeta()) {
|
||||||
|
ItemMeta meta = icon.getItemMeta();
|
||||||
|
JsonObject components = new JsonObject();
|
||||||
|
|
||||||
|
if (!meta.getEnchants().isEmpty()) {
|
||||||
|
components.addProperty("minecraft:enchantment_glint_override", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (meta.hasCustomModelData()) {
|
||||||
|
components.addProperty("minecraft:custom_model_data", meta.getCustomModelData());
|
||||||
|
}
|
||||||
|
|
||||||
|
iconObj.add("components", components);
|
||||||
|
}
|
||||||
|
|
||||||
|
display.add("icon", iconObj);
|
||||||
|
display.add("title", GsonComponentSerializer.gson().serializeToTree(title));
|
||||||
|
display.add("description", GsonComponentSerializer.gson().serializeToTree(description));
|
||||||
|
display.addProperty("description", "Toast Description");
|
||||||
|
display.addProperty("frame", "task");
|
||||||
|
display.addProperty("announce_to_chat", false);
|
||||||
|
display.addProperty("show_toast", true);
|
||||||
|
display.addProperty("hidden", true);
|
||||||
|
|
||||||
|
json.add("display", display);
|
||||||
|
|
||||||
|
final var advancement = Advancement.CODEC.parse(MinecraftServer.getServer().registryAccess().createSerializationContext(JsonOps.INSTANCE), json);
|
||||||
|
final var advancementHolder = new AdvancementHolder(key, advancement.result().orElseThrow());
|
||||||
|
|
||||||
|
final var nmsPlayer = ((CraftPlayer) player).getHandle();
|
||||||
|
final var progress = nmsPlayer.getAdvancements().getOrStartProgress(advancementHolder);
|
||||||
|
MinecraftServer.getServer().getAdvancements().tree().addAll(Set.of(advancementHolder));
|
||||||
|
progress.getRemainingCriteria().forEach(criteria -> nmsPlayer.getAdvancements().award(advancementHolder, criteria));
|
||||||
|
|
||||||
|
Bukkit.getScheduler().runTaskLater(HibiscusCommonsPlugin.getInstance(), () -> {
|
||||||
|
progress.getRemainingCriteria().forEach(criteria -> nmsPlayer.getAdvancements().revoke(advancementHolder, criteria));
|
||||||
|
MinecraftServer.getServer().getAdvancements().tree().remove(Set.of(key));
|
||||||
|
|
||||||
|
// Remove the advancement from the player's client to prevent it from being displayed again
|
||||||
|
// Was not working without this?
|
||||||
|
ClientboundUpdateAdvancementsPacket removePacket = new ClientboundUpdateAdvancementsPacket(
|
||||||
|
false,
|
||||||
|
Collections.emptyList(),
|
||||||
|
Set.of(key),
|
||||||
|
Map.of()
|
||||||
|
);
|
||||||
|
|
||||||
|
sendPacket(player, removePacket);
|
||||||
|
}, 2L);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user