mirror of
https://github.com/HibiscusMC/HMCCosmetics.git
synced 2025-12-30 12:29:16 +00:00
Merge pull request #121 from MomoPewpew/DvZ
Fixed interaction between backpack cosmetics and other passengers
This commit is contained in:
@@ -46,6 +46,8 @@ import org.bukkit.persistence.PersistentDataType;
|
||||
import org.bukkit.potion.PotionEffectType;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.spigotmc.event.entity.EntityDismountEvent;
|
||||
import org.spigotmc.event.entity.EntityMountEvent;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@@ -350,6 +352,30 @@ public class PlayerGameListener implements Listener {
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerMounted(EntityMountEvent event) {
|
||||
if (!event.isCancelled() && event.getEntity() instanceof Player player) {
|
||||
CosmeticUser user = CosmeticUsers.getUser(player);
|
||||
if (user == null) return;
|
||||
|
||||
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(HMCCosmeticsPlugin.getInstance(), ()->{
|
||||
user.respawnBackpack();
|
||||
}, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerDismounted(EntityDismountEvent event) {
|
||||
if (!event.isCancelled() && event.getDismounted() instanceof Player player) {
|
||||
CosmeticUser user = CosmeticUsers.getUser(player);
|
||||
if (user == null) return;
|
||||
|
||||
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(HMCCosmeticsPlugin.getInstance(), ()->{
|
||||
user.respawnBackpack();
|
||||
}, 1);
|
||||
}
|
||||
}
|
||||
|
||||
private void registerInventoryClickListener() {
|
||||
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(HMCCosmeticsPlugin.getInstance(), ListenerPriority.NORMAL, PacketType.Play.Client.WINDOW_CLICK) {
|
||||
@Override
|
||||
|
||||
@@ -66,12 +66,21 @@ public class UserBackpackManager {
|
||||
if (this.invisibleArmorStand != null) return;
|
||||
this.invisibleArmorStand = (ArmorStand) NMSHandlers.getHandler().spawnBackpack(user, cosmeticBackpackType);
|
||||
|
||||
Entity entity = user.getEntity();
|
||||
|
||||
int[] passengerIDs = new int[entity.getPassengers().size() + 1];
|
||||
|
||||
for (int i = 0; i < entity.getPassengers().size(); i++) {
|
||||
passengerIDs[i] = entity.getPassengers().get(i).getEntityId();
|
||||
}
|
||||
|
||||
passengerIDs[passengerIDs.length - 1] = this.getFirstArmorStandId();
|
||||
|
||||
List<Player> outsideViewers = user.getUserBackpackManager().getCloudManager().refreshViewers(user.getEntity().getLocation());
|
||||
PacketManager.sendRidingPacket(user.getEntity().getEntityId(), user.getUserBackpackManager().getFirstArmorStandId(), outsideViewers);
|
||||
PacketManager.sendRidingPacket(user.getEntity().getEntityId(), passengerIDs, outsideViewers);
|
||||
|
||||
ArrayList<Player> owner = new ArrayList<>();
|
||||
if (user.getPlayer() != null) owner.add(user.getPlayer());
|
||||
Entity entity = user.getEntity();
|
||||
|
||||
if (cosmeticBackpackType.isFirstPersonCompadible()) {
|
||||
for (int i = particleCloud.size(); i < 5; i++) {
|
||||
@@ -88,7 +97,7 @@ public class UserBackpackManager {
|
||||
PacketManager.sendRidingPacket(particleCloud.get(particleCloud.size() - 1), user.getUserBackpackManager().getFirstArmorStandId(), owner);
|
||||
if (!user.getHidden()) NMSHandlers.getHandler().equipmentSlotUpdate(user.getUserBackpackManager().getFirstArmorStandId(), EquipmentSlot.HEAD, cosmeticBackpackType.getFirstPersonBackpack(), owner);
|
||||
}
|
||||
PacketManager.sendRidingPacket(entity.getEntityId(), user.getUserBackpackManager().getFirstArmorStandId(), outsideViewers);
|
||||
PacketManager.sendRidingPacket(entity.getEntityId(), passengerIDs, outsideViewers);
|
||||
|
||||
// No one should be using ME because it barely works but some still use it, so it's here
|
||||
if (cosmeticBackpackType.getModelName() != null && Hooks.isActiveHook("ModelEngine")) {
|
||||
|
||||
@@ -250,6 +250,25 @@ public class PacketManager extends BasePacket {
|
||||
sendRidingPacket(mountId, passengerId, getViewers(location));
|
||||
}
|
||||
|
||||
/**
|
||||
* Mostly to deal with backpacks, this deals with entities riding other entities.
|
||||
* @param mountId The entity that is the "mount", ex. a player
|
||||
* @param passengerIds The entities that are riding the mount, ex. a armorstand for a backpack
|
||||
* @param sendTo Whom to send the packet to
|
||||
*/
|
||||
public static void sendRidingPacket(
|
||||
final int mountId,
|
||||
final int[] passengerIds,
|
||||
final @NotNull List<Player> sendTo
|
||||
) {
|
||||
PacketContainer packet = new PacketContainer(PacketType.Play.Server.MOUNT);
|
||||
packet.getIntegers().write(0, mountId);
|
||||
packet.getIntegerArrays().write(0, passengerIds);
|
||||
for (final Player p : sendTo) {
|
||||
sendPacket(p, packet);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mostly to deal with backpacks, this deals with entities riding other entities.
|
||||
* @param mountId The entity that is the "mount", ex. a player
|
||||
@@ -261,12 +280,7 @@ public class PacketManager extends BasePacket {
|
||||
final int passengerId,
|
||||
final @NotNull List<Player> sendTo
|
||||
) {
|
||||
PacketContainer packet = new PacketContainer(PacketType.Play.Server.MOUNT);
|
||||
packet.getIntegers().write(0, mountId);
|
||||
packet.getIntegerArrays().write(0, new int[]{passengerId});
|
||||
for (final Player p : sendTo) {
|
||||
sendPacket(p, packet);
|
||||
}
|
||||
sendRidingPacket(mountId, new int[] {passengerId}, sendTo);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user