Skip to content

Instantly share code, notes, and snippets.

@arnhav
Created October 9, 2022 01:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save arnhav/8ca46dec1279b7ab543e8a2628deb215 to your computer and use it in GitHub Desktop.
Save arnhav/8ca46dec1279b7ab543e8a2628deb215 to your computer and use it in GitHub Desktop.
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.ProtocolManager;
import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketEvent;
import net.runeage.simplesteeds.objects.SteedAttributes;
import net.runeage.simplesteeds.objects.SteedType;
import net.runeage.simplesteeds.objects.WrapperPlayClientSteerVehicle;
import net.runeage.simplesteeds.util.ControllerUtil;
import net.runeage.simplesteeds.util.SteedUtil;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.Vector;
import java.util.List;
public class LandMountController {
List<EntityType> ignoredMobTypes = List.of(EntityType.HORSE, EntityType.SKELETON_HORSE, EntityType.ZOMBIE_HORSE);
public LandMountController(JavaPlugin plugin) {
ProtocolManager manager = ProtocolLibrary.getProtocolManager();
manager.addPacketListener(getPacketAdapter(plugin));
}
private PacketAdapter getPacketAdapter(JavaPlugin plugin) {
return new PacketAdapter(plugin, ListenerPriority.NORMAL, PacketType.Play.Client.STEER_VEHICLE) {
@Override
public void onPacketReceiving(PacketEvent event) {
if (event.getPacketType() != PacketType.Play.Client.STEER_VEHICLE) return;
Player player = event.getPlayer();
WrapperPlayClientSteerVehicle packet = new WrapperPlayClientSteerVehicle(event.getPacket());
Entity vehicle = player.getVehicle();
if (vehicle == null) return;
if (!(vehicle instanceof LivingEntity)) return;
if (!SteedUtil.isSteed(vehicle)) return;
if (SteedUtil.getSteedType(vehicle) != SteedType.LAND) return;
if (packet.isUnmount()) {
vehicle.addScoreboardTag("EJECT");
return;
}
if (ignoredMobTypes.contains(vehicle.getType())) return;
if (isRunningIntoJumpableBlock((LivingEntity) vehicle) && vehicle.isOnGround()) {
((LivingEntity) vehicle).setJumping(true);
return;
}
SteedAttributes attributes = new SteedAttributes((LivingEntity) vehicle);
if (packet.isJump() && vehicle.isOnGround()) {
vehicle.setVelocity(vehicle.getVelocity().add(new Vector(0.0, attributes.getCurrentJump(), 0.0)));
}
Vector vel = ControllerUtil.getVelocityVector(vehicle.getVelocity(), player, packet.getForward(),
packet.getSideways(), attributes.getCurrentSpeed());
vehicle.setVelocity(vel);
vehicle.setRotation(player.getEyeLocation().getYaw(), player.getEyeLocation().getPitch());
}
};
}
private boolean isRunningIntoJumpableBlock(LivingEntity vehicle) {
Location eyeLocation = vehicle.getEyeLocation();
eyeLocation.setPitch(0);
Vector lookVector = eyeLocation.getDirection().clone();
Location checkLoc = vehicle.getLocation().add(lookVector.clone());
Block block = checkLoc.getBlock();
Block above = block.getRelative(BlockFace.UP);
Block aboveAbove = above.getRelative(BlockFace.UP);
return !block.isPassable() && (above.isPassable() && aboveAbove.isPassable());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment