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

Velocity for balloons

This commit is contained in:
LoJoSho
2023-01-02 14:46:33 -06:00
parent 04bc0d8f99
commit 17d2554e6c
5 changed files with 238 additions and 15 deletions

View File

@@ -2,11 +2,13 @@ package com.hibiscusmc.hmccosmetics.cosmetic.types;
import com.hibiscusmc.hmccosmetics.config.Settings;
import com.hibiscusmc.hmccosmetics.cosmetic.Cosmetic;
import com.hibiscusmc.hmccosmetics.entities.BalloonEntity;
import com.hibiscusmc.hmccosmetics.user.CosmeticUser;
import com.hibiscusmc.hmccosmetics.util.PlayerUtils;
import com.hibiscusmc.hmccosmetics.util.packets.PacketManager;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.spongepowered.configurate.ConfigurationNode;
@@ -26,21 +28,28 @@ public class CosmeticBalloonType extends Cosmetic {
@Override
public void update(CosmeticUser user) {
Player player = Bukkit.getPlayer(user.getUniqueId());
Location currentLocation = user.getBalloonEntity().getLocation().clone();
Location newLocation = player.getLocation().clone().add(Settings.getBalloonOffset()).clone();
if (player == null) return;
if (user.isInWardrobe()) return;
final Location actual = player.getLocation().clone().add(Settings.getBalloonOffset());
if (player.getLocation().getWorld() != user.getBalloonEntity().getLocation().getWorld()) {
user.getBalloonEntity().getModelEntity().teleport(actual);
}
user.getBalloonEntity().getModelEntity().teleport(actual);
List<Player> viewer = PlayerUtils.getNearbyPlayers(player);
viewer.add(player);
PacketManager.sendTeleportPacket(user.getBalloonEntity().getPufferfishBalloonId(), actual, false, viewer);
BalloonEntity balloonEntity = user.getBalloonEntity();
if (player.getLocation().getWorld() != balloonEntity.getLocation().getWorld()) {
balloonEntity.getModelEntity().teleport(newLocation);
PacketManager.sendTeleportPacket(balloonEntity.getPufferfishBalloonId(), newLocation, false, viewer);
return;
}
newLocation.add(player.getVelocity().clone().multiply(-1));
balloonEntity.setLocation(newLocation);
balloonEntity.setVelocity(newLocation.clone().subtract(currentLocation.clone()).toVector());
PacketManager.sendTeleportPacket(balloonEntity.getPufferfishBalloonId(), newLocation, false, viewer);
PacketManager.sendLeashPacket(balloonEntity.getPufferfishBalloonId(), player.getEntityId(), viewer);
}
public String getModelName() {

View File

@@ -3,6 +3,7 @@ package com.hibiscusmc.hmccosmetics.entities;
import com.hibiscusmc.hmccosmetics.config.Settings;
import com.hibiscusmc.hmccosmetics.nms.NMSHandlers;
import com.hibiscusmc.hmccosmetics.util.MessagesUtil;
import com.hibiscusmc.hmccosmetics.util.packets.PacketManager;
import com.ticxo.modelengine.api.ModelEngineAPI;
import com.ticxo.modelengine.api.model.ActiveModel;
import com.ticxo.modelengine.api.model.ModeledEntity;
@@ -21,6 +22,7 @@ public class BalloonEntity {
private final int balloonID;
private final UUID uniqueID;
private final Entity modelEntity;
private ModeledEntity modeledEntity;
public BalloonEntity(Location location) {
this.uniqueID = UUID.randomUUID();
@@ -42,6 +44,7 @@ public class BalloonEntity {
singleModel.getRendererHandler().setColor(color);
});
}
this.modeledEntity = modeledEntity;
}
public void remove() {
@@ -108,7 +111,6 @@ public class BalloonEntity {
public void setLocation(Location location) {
//this.megEntity.teleportTo(location.getX(), location.getY(), location.getZ());
location = location.add(Settings.getBalloonOffset());
this.modelEntity.teleport(location);
}

View File

@@ -104,8 +104,6 @@ public class PlayerGameListener implements Listener {
if (event.getCause().equals(PlayerTeleportEvent.TeleportCause.NETHER_PORTAL) || event.getCause().equals(PlayerTeleportEvent.TeleportCause.END_PORTAL)) return;
if (user.hasCosmeticInSlot(CosmeticSlot.BALLOON)) {
user.getBalloonEntity().setLocation(event.getTo());
Bukkit.getScheduler().runTaskLater(HMCCosmeticsPlugin.getInstance(), () -> {
user.updateCosmetic(CosmeticSlot.BALLOON);
}, 2);

View File

@@ -12,6 +12,7 @@ import com.hibiscusmc.hmccosmetics.util.MessagesUtil;
import com.hibiscusmc.hmccosmetics.util.PlayerUtils;
import com.hibiscusmc.hmccosmetics.util.packets.wrappers.WrapperPlayServerNamedEntitySpawn;
import com.hibiscusmc.hmccosmetics.util.packets.wrappers.WrapperPlayServerPlayerInfo;
import com.hibiscusmc.hmccosmetics.util.packets.wrappers.WrapperPlayServerRelEntityMove;
import it.unimi.dsi.fastutil.ints.IntArrayList;
import org.bukkit.Location;
import org.bukkit.World;
@@ -342,6 +343,14 @@ public class PacketManager extends BasePacket {
for (final Player p : sendTo) sendPacket(p, info.getHandle());
}
public static void sendLeashPacket(
final int leashedEntity,
final int entityId,
final Location location
) {
sendLeashPacket(leashedEntity, entityId, getViewers(location));
}
/**
* Sends a leash packet, useful for balloons!
* @param leashedEntity Entity being leashed (ex. a horse)
@@ -353,10 +362,10 @@ public class PacketManager extends BasePacket {
final int entityId,
final List<Player> sendTo
) {
PacketContainer packet = new PacketContainer(PacketType.Play.Server.ATTACH_ENTITY);
packet.getIntegers().write(0, leashedEntity);
packet.getIntegers().write(1, entityId);
for (final Player p : sendTo) {
PacketContainer packet = new PacketContainer(PacketType.Play.Server.ATTACH_ENTITY);
packet.getIntegers().write(0, leashedEntity);
packet.getIntegers().write(1, entityId);
sendPacket(p, packet);
}
}
@@ -387,6 +396,42 @@ public class PacketManager extends BasePacket {
}
}
/**
* Sends a movement packet from one location to another
* @param entityId Entity this will affect
* @param from Previous location
* @param to New location
* @param onGround If the movement is on the ground
* @param sendTo Whom to send the packet to
*/
public static void sendMovePacket(
final int entityId,
final Location from,
final Location to,
final boolean onGround,
List<Player> sendTo
) {
PacketContainer packet = new PacketContainer(PacketType.Play.Server.REL_ENTITY_MOVE);
WrapperPlayServerRelEntityMove wrapper = new WrapperPlayServerRelEntityMove(packet);
wrapper.setEntityID(entityId);
wrapper.setDx(to.getX() - from.getX());
wrapper.setDy(to.getY() - from.getY());
wrapper.setDz(to.getZ() - from.getZ());
wrapper.setOnGround(onGround);
for (final Player p : sendTo) {
sendPacket(p, wrapper.getHandle());
}
}
public static void sendMovePacket(
final int entityId,
final Location from,
final Location to,
final boolean onGround
) {
sendMovePacket(entityId, from, to, onGround, getViewers(to));
}
private static List<Player> getViewers(Location location) {
ArrayList<Player> viewers = new ArrayList();
if (Settings.getViewDistance() <= 0) {

View File

@@ -0,0 +1,169 @@
package com.hibiscusmc.hmccosmetics.util.packets.wrappers;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
import org.bukkit.World;
import org.bukkit.entity.Entity;
public class WrapperPlayServerRelEntityMove extends AbstractPacket {
public static final PacketType TYPE =
PacketType.Play.Server.REL_ENTITY_MOVE;
public WrapperPlayServerRelEntityMove() {
super(new PacketContainer(TYPE), TYPE);
handle.getModifier().writeDefaults();
}
public WrapperPlayServerRelEntityMove(PacketContainer packet) {
super(packet, TYPE);
}
/**
* Retrieve Entity ID.
* <p>
* Notes: entity's ID
*
* @return The current Entity ID
*/
public int getEntityID() {
return handle.getIntegers().read(0);
}
/**
* Set Entity ID.
*
* @param value - new value.
*/
public void setEntityID(int value) {
handle.getIntegers().write(0, value);
}
/**
* Retrieve the entity of the painting that will be spawned.
*
* @param world - the current world of the entity.
* @return The spawned entity.
*/
public Entity getEntity(World world) {
return handle.getEntityModifier(world).read(0);
}
/**
* Retrieve the entity of the painting that will be spawned.
*
* @param event - the packet event.
* @return The spawned entity.
*/
public Entity getEntity(PacketEvent event) {
return getEntity(event.getPlayer().getWorld());
}
/**
* Retrieve DX.
*
* @return The current DX
*/
public double getDx() {
return handle.getShorts().read(0) / 4096D;
}
/**
* Set DX.
*
* @param value - new value.
*/
public void setDx(double value) {
handle.getShorts().write(0, (short) (value * 4096));
}
/**
* Retrieve DY.
*
* @return The current DY
*/
public double getDy() {
return handle.getShorts().read(1) / 4096D;
}
/**
* Set DY.
*
* @param value - new value.
*/
public void setDy(double value) {
handle.getShorts().write(1, (short) (value * 4096));
}
/**
* Retrieve DZ.
*
* @return The current DZ
*/
public double getDz() {
return handle.getShorts().read(2) / 4096D;
}
/**
* Set DZ.
*
* @param value - new value.
*/
public void setDz(double value) {
handle.getShorts().write(2, (short) (value * 4096));
}
/**
* Retrieve the yaw of the current entity.
*
* @return The current Yaw
*/
public float getYaw() {
return (handle.getBytes().read(0) * 360.F) / 256.0F;
}
/**
* Set the yaw of the current entity.
*
* @param value - new yaw.
*/
public void setYaw(float value) {
handle.getBytes().write(0, (byte) (value * 256.0F / 360.0F));
}
/**
* Retrieve the pitch of the current entity.
*
* @return The current pitch
*/
public float getPitch() {
return (handle.getBytes().read(1) * 360.F) / 256.0F;
}
/**
* Set the pitch of the current entity.
*
* @param value - new pitch.
*/
public void setPitch(float value) {
handle.getBytes().write(1, (byte) (value * 256.0F / 360.0F));
}
/**
* Retrieve On Ground.
*
* @return The current On Ground
*/
public boolean getOnGround() {
return handle.getBooleans().read(0);
}
/**
* Set On Ground.
*
* @param value - new value.
*/
public void setOnGround(boolean value) {
handle.getBooleans().write(0, value);
}
}