Skip to content

Commit

Permalink
Merge pull request #121 from MomoPewpew/DvZ
Browse files Browse the repository at this point in the history
Fixed interaction between backpack cosmetics and other passengers
  • Loading branch information
LoJoSho authored Aug 2, 2023
2 parents 59479fc + 6ec47c3 commit fced771
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@
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.*;

Expand Down Expand Up @@ -350,6 +352,30 @@ public void onPlayerCosemticEquip(PlayerCosmeticPostEquipEvent event) {
}
}

@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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,21 @@ private void spawn(CosmeticBackpackType cosmeticBackpackType) {
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++) {
Expand All @@ -88,7 +97,7 @@ private void spawn(CosmeticBackpackType cosmeticBackpackType) {
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")) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -253,22 +253,36 @@ public static void sendRidingPacket(
/**
* Mostly to deal with backpacks, this deals with entities riding other entities.
* @param mountId The entity that is the "mount", ex. a player
* @param passengerId The entity that is riding the mount, ex. a armorstand for a backpack
* @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 passengerId,
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, new int[]{passengerId});
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
* @param passengerId The entity that is 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 passengerId,
final @NotNull List<Player> sendTo
) {
sendRidingPacket(mountId, new int[] {passengerId}, sendTo);
}

/**
* Destroys an entity from a player
* @param entityId The entity to delete for a player
Expand Down

0 comments on commit fced771

Please sign in to comment.