9
0
mirror of https://github.com/HibiscusMC/HMCCosmetics.git synced 2025-12-30 04:19:28 +00:00

feat: second iteration of first-person backpacks (focused on other player viewing the backpack)

This commit is contained in:
LoJoSho
2023-07-25 15:06:57 -05:00
parent 12f8b05469
commit 6d814d86b3
16 changed files with 112 additions and 193 deletions

View File

@@ -1,6 +1,7 @@
package com.hibiscusmc.hmccosmetics.cosmetic.types;
import com.hibiscusmc.hmccosmetics.cosmetic.Cosmetic;
import com.hibiscusmc.hmccosmetics.nms.NMSHandlers;
import com.hibiscusmc.hmccosmetics.user.CosmeticUser;
import com.hibiscusmc.hmccosmetics.user.manager.UserBackpackManager;
import com.hibiscusmc.hmccosmetics.util.MessagesUtil;
@@ -9,22 +10,30 @@ import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.AreaEffectCloud;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.spongepowered.configurate.ConfigurationNode;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
public class CosmeticBackpackType extends Cosmetic {
private final String modelName;
private UserBackpackManager.BackpackType backpackType;
private ItemStack firstPersonBackpack;
public CosmeticBackpackType(String id, ConfigurationNode config) {
super(id, config);
modelName = config.node("model").getString();
backpackType = UserBackpackManager.BackpackType.valueOf(config.node("type").getString("NORMAL").toUpperCase());
if (!config.node("firstperson-item").virtual()) {
this.firstPersonBackpack = generateItemStack(config.node("firstperson-item"));
}
//backpackType = UserBackpackManager.BackpackType.valueOf(config.node("type").getString("NORMAL").toUpperCase());
}
@Override
@@ -45,26 +54,27 @@ public class CosmeticBackpackType extends Cosmetic {
}
user.getUserBackpackManager().getArmorStand().teleport(loc);
user.getUserBackpackManager().getArmorStand().setRotation(loc.getYaw(), loc.getPitch());
List<Player> outsideViewers = user.getUserBackpackManager().getCloudManager().refreshViewers(loc);
if (isFirstPersonCompadible()) {
List<Player> owner = List.of(user.getPlayer());
if (user.getUserBackpackManager().getBackpackType().equals(UserBackpackManager.BackpackType.FIRST_PERSON)) {
ArrayList<Integer> particleCloud = user.getUserBackpackManager().getAreaEffectEntityId();
for (int i = 0; i < particleCloud.size(); i++) {
//particleCloud.get(i).teleport(loc);
if (i == 0) {
PacketManager.sendRidingPacket(entity.getEntityId(), particleCloud.get(i), loc);
PacketManager.sendRidingPacket(entity.getEntityId(), particleCloud.get(i), owner);
} else {
PacketManager.sendRidingPacket(particleCloud.get(i - 1), particleCloud.get(i) , loc);
PacketManager.sendRidingPacket(particleCloud.get(i - 1), particleCloud.get(i) , owner);
}
MessagesUtil.sendDebugMessages("num: " + i + " / valid? ");
}
//PacketManager.sendRidingPacket(entity.getEntityId(), user.getUserBackpackManager().getAreaEffectEntityId(), loc);
PacketManager.sendRidingPacket(particleCloud.get(particleCloud.size() - 1), user.getUserBackpackManager().getFirstArmorStandId(), loc);
PacketManager.sendRidingPacket(particleCloud.get(particleCloud.size() - 1), user.getUserBackpackManager().getFirstArmorStandId(), owner);
NMSHandlers.getHandler().equipmentSlotUpdate(user.getUserBackpackManager().getFirstArmorStandId(), EquipmentSlot.HEAD, firstPersonBackpack, owner);
MessagesUtil.sendDebugMessages("ParticleCloud: " + particleCloud.toString());
} else {
PacketManager.sendRidingPacket(entity.getEntityId(), user.getUserBackpackManager().getFirstArmorStandId(), loc);
}
PacketManager.sendRidingPacket(entity.getEntityId(), user.getUserBackpackManager().getFirstArmorStandId(), outsideViewers);
user.getUserBackpackManager().getArmorStand().setRotation(loc.getYaw(), loc.getPitch());
user.getUserBackpackManager().showBackpack();
}
@@ -72,7 +82,7 @@ public class CosmeticBackpackType extends Cosmetic {
return modelName;
}
public UserBackpackManager.BackpackType getBackpackType() {
return backpackType;
public boolean isFirstPersonCompadible() {
return firstPersonBackpack != null;
}
}

View File

@@ -25,8 +25,6 @@ public interface NMSHandler {
Entity spawnBackpack(CosmeticUser user, CosmeticBackpackType cosmeticBackpackType);
Entity spawnHMCParticleCloud(Location location);
Entity spawnDisplayEntity(Location location, String text);
UserBalloonManager spawnBalloon(CosmeticUser user, CosmeticBalloonType cosmeticBalloonType);

View File

@@ -350,7 +350,7 @@ public class CosmeticUser {
public void spawnBackpack(CosmeticBackpackType cosmeticBackpackType) {
if (this.userBackpackManager != null) return;
this.userBackpackManager = new UserBackpackManager(this, cosmeticBackpackType.getBackpackType());
this.userBackpackManager = new UserBackpackManager(this, cosmeticBackpackType.isFirstPersonCompadible());
userBackpackManager.spawnBackpack(cosmeticBackpackType);
}

View File

@@ -0,0 +1,64 @@
package com.hibiscusmc.hmccosmetics.user.manager;
import com.hibiscusmc.hmccosmetics.util.PlayerUtils;
import com.hibiscusmc.hmccosmetics.util.packets.PacketManager;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class UserBackpackCloudManager {
private ArrayList<Integer> ids;
private UUID owner;
private List<Player> viewers = new ArrayList<>();
private Long lastUpdate;
public UserBackpackCloudManager(UUID owner) {
this.ids = new ArrayList<>();
this.owner = owner;
this.lastUpdate = 0L;
}
public ArrayList<Integer> getId() {
return ids;
}
public UUID getOwner() {
return owner;
}
public List<Player> refreshViewers(Location location) {
if (System.currentTimeMillis() - lastUpdate <= 1000) return List.of(); //Prevents mass refreshes
ArrayList<Player> newPlayers = new ArrayList<>();
ArrayList<Player> removePlayers = new ArrayList<>();
List<Player> players = PlayerUtils.getNearbyPlayers(location);
for (Player player : players) {
//if (player.getUniqueId().toString().equalsIgnoreCase(owner.toString())) continue;
if (!viewers.contains(player)) {
viewers.add(player);
newPlayers.add(player);
continue;
}
// bad loopdy loops
for (Player viewerPlayer : viewers) {
if (!players.contains(viewerPlayer)) {
removePlayers.add(viewerPlayer);
PacketManager.sendEntityDestroyPacket(ids, List.of(viewerPlayer)); // prevents random leashes
}
}
}
viewers.removeAll(removePlayers);
lastUpdate = System.currentTimeMillis();
return newPlayers;
}
public void hideEffects() {
PacketManager.sendEntityDestroyPacket(ids, viewers);
viewers.clear();
}
}

View File

@@ -28,12 +28,14 @@ public class UserBackpackManager {
private ArmorStand invisibleArmorStand;
private ArrayList<Integer> particleCloud = new ArrayList<>();
private final CosmeticUser user;
private BackpackType backpackType;
private boolean firstPerson;
private UserBackpackCloudManager cloudManager;
public UserBackpackManager(CosmeticUser user, BackpackType backpackType) {
public UserBackpackManager(CosmeticUser user, boolean firstPersonView) {
this.user = user;
this.hideBackpack = false;
this.backpackType = backpackType;
this.firstPerson = firstPersonView;
this.cloudManager = new UserBackpackCloudManager(user.getUniqueId());
}
public int getFirstArmorStandId() {
@@ -55,16 +57,14 @@ public class UserBackpackManager {
public void spawnBackpack(CosmeticBackpackType cosmeticBackpackType) {
MessagesUtil.sendDebugMessages("spawnBackpack Bukkit - Start");
if (getBackpackType().equals(BackpackType.NORMAL)) {
if (!firstPerson) {
spawnNormalBackpack(cosmeticBackpackType);
}
if (getBackpackType().equals(BackpackType.FIRST_PERSON)) {
} else {
spawnFirstPersonBackpack(cosmeticBackpackType);
}
}
private void spawnNormalBackpack(CosmeticBackpackType cosmeticBackpackType) {
if (this.invisibleArmorStand != null) return;
this.invisibleArmorStand = (ArmorStand) NMSHandlers.getHandler().spawnBackpack(user, cosmeticBackpackType);
@@ -87,27 +87,13 @@ public class UserBackpackManager {
if (this.invisibleArmorStand != null) return;
this.invisibleArmorStand = (ArmorStand) NMSHandlers.getHandler().spawnBackpack(user, cosmeticBackpackType);
for (int i = particleCloud.size(); i < 5; i++) {
int entityId = NMSHandlers.getHandler().getNextEntityId();
PacketManager.sendEntitySpawnPacket(user.getPlayer().getLocation(), entityId, EntityType.AREA_EFFECT_CLOUD, UUID.randomUUID());
PacketManager.sendCloudEffect(entityId, PacketManager.getViewers(user.getPlayer().getLocation()));
this.particleCloud.add(entityId);
//this.particleCloud.add((AreaEffectCloud) NMSHandlers.getHandler().spawnHMCParticleCloud(user.getPlayer().getLocation()));
}
//this.particleCloud = (AreaEffectCloud) NMSHandlers.getHandler().spawnHMCParticleCloud(user.getPlayer().getLocation());
/*
if (cosmeticBackpackType.getModelName() != null && Hooks.isActiveHook("ModelEngine")) {
if (ModelEngineAPI.api.getModelRegistry().getBlueprint(cosmeticBackpackType.getModelName()) == null) {
MessagesUtil.sendDebugMessages("Invalid Model Engine Blueprint " + cosmeticBackpackType.getModelName(), Level.SEVERE);
return;
}
ModeledEntity modeledEntity = ModelEngineAPI.getOrCreateModeledEntity(invisibleArmorStand);
ActiveModel model = ModelEngineAPI.createActiveModel(ModelEngineAPI.getBlueprint(cosmeticBackpackType.getModelName()));
model.setCanHurt(false);
modeledEntity.addModel(model, false);
}
*/
MessagesUtil.sendDebugMessages("spawnBackpackFirstPerson Bukkit - Finish");
}
@@ -144,10 +130,6 @@ public class UserBackpackManager {
hideBackpack = shown;
}
public BackpackType getBackpackType() {
return backpackType;
}
public ArrayList<Integer> getAreaEffectEntityId() {
return particleCloud;
}
@@ -161,6 +143,10 @@ public class UserBackpackManager {
getArmorStand().getEquipment().setHelmet(item);
}
public UserBackpackCloudManager getCloudManager() {
return cloudManager;
}
public enum BackpackType {
NORMAL,
FIRST_PERSON // First person not yet implemented

View File

@@ -280,6 +280,18 @@ public class PacketManager extends BasePacket {
for (final Player p : sendTo) sendPacket(p, packet);
}
/**
* Destroys an entity from a player
* @param sendTo The players the packet should be sent to
*/
public static void sendEntityDestroyPacket(final List<Integer> ids, @NotNull List<Player> sendTo) {
PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY);
IntArrayList entities = new IntArrayList(new int[]{});
for (int id : ids) entities.add(id);
packet.getModifier().write(0, entities);
for (final Player p : sendTo) sendPacket(p, packet);
}
/**
* Sends a camera packet
* @param entityId The Entity ID that camera will go towards