seppuku/src/main/java/me/rigamortis/seppuku/impl/module/player/FreeCamModule.java

245 lines
9.7 KiB
Java
Raw Normal View History

2019-10-27 15:45:44 +00:00
package me.rigamortis.seppuku.impl.module.player;
import me.rigamortis.seppuku.api.event.EventStageable;
import me.rigamortis.seppuku.api.event.gui.EventRenderHelmet;
import me.rigamortis.seppuku.api.event.network.EventReceivePacket;
import me.rigamortis.seppuku.api.event.network.EventSendPacket;
import me.rigamortis.seppuku.api.event.player.*;
import me.rigamortis.seppuku.api.event.render.EventRenderOverlay;
import me.rigamortis.seppuku.api.event.world.EventAddCollisionBox;
import me.rigamortis.seppuku.api.event.world.EventLiquidCollisionBB;
import me.rigamortis.seppuku.api.event.world.EventSetOpaqueCube;
import me.rigamortis.seppuku.api.module.Module;
import me.rigamortis.seppuku.api.util.MathUtil;
2019-11-30 01:44:31 +00:00
import me.rigamortis.seppuku.api.value.Value;
2019-10-27 15:45:44 +00:00
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityOtherPlayerMP;
import net.minecraft.entity.Entity;
import net.minecraft.network.play.client.*;
import net.minecraft.network.play.server.SPacketPlayerPosLook;
import net.minecraft.network.play.server.SPacketSetPassengers;
import net.minecraft.util.math.Vec3d;
import team.stiff.pomelo.impl.annotated.handler.annotation.Listener;
/**
* @author Seth
* @author noil
2019-10-27 15:45:44 +00:00
*/
public final class FreeCamModule extends Module {
2022-10-02 13:20:19 +00:00
public final Value<Float> speed = new Value<Float>("Speed", new String[]{"Spd"}, "Speed of freecam flight, higher number equals quicker motion", 1.0f, 0.0f, 10.0f, 0.1f);
public final Value<Boolean> view = new Value<Boolean>("3D", new String[]{"View"}, "The old Nodus client style free-cam, kind of like an elytra. (Hold forward key & move the mouse to turn)", false);
public final Value<Boolean> packet = new Value<Boolean>("Packet", new String[]{"Pack"}, "Disables any player position or rotation packets from being sent during free-cam if enabled", true);
public final Value<Boolean> allowDismount = new Value<Boolean>("AllowDismount", new String[]{"Dismount", "Dis", "AllowDis"}, "Allow dismounting of the riding entity", true);
2019-10-27 15:45:44 +00:00
private Entity riding;
private EntityOtherPlayerMP entity;
private Vec3d position;
private float yaw;
private float pitch;
public FreeCamModule() {
super("FreeCam", new String[]{"FreeCamera"}, "Out of body experience", "NONE", -1, ModuleType.PLAYER);
}
@Override
public void onEnable() {
super.onEnable();
final Minecraft mc = Minecraft.getMinecraft();
if (mc.world != null) {
this.entity = new EntityOtherPlayerMP(mc.world, mc.session.getProfile());
this.entity.copyLocationAndAnglesFrom(mc.player);
2019-10-27 15:45:44 +00:00
if (mc.player.getRidingEntity() != null) {
this.riding = mc.player.getRidingEntity();
mc.player.dismountRidingEntity();
this.entity.startRiding(this.riding);
} else {
this.riding = null;
2019-10-27 15:45:44 +00:00
}
this.entity.rotationYaw = mc.player.rotationYaw;
this.entity.rotationYawHead = mc.player.rotationYawHead;
this.entity.inventory.copyInventory(mc.player.inventory);
mc.world.addEntityToWorld(69420, this.entity);
this.position = mc.player.getPositionVector();
this.yaw = mc.player.rotationYaw;
this.pitch = mc.player.rotationPitch;
mc.player.noClip = true;
}
}
@Override
public void onDisable() {
super.onDisable();
final Minecraft mc = Minecraft.getMinecraft();
if (mc.world != null) {
if (this.riding != null) {
mc.player.startRiding(this.riding, true);
}
if (this.entity != null) {
mc.world.removeEntity(this.entity);
}
if (this.position != null) {
mc.player.setPosition(this.position.x, this.position.y, this.position.z);
}
mc.player.rotationYaw = this.yaw;
mc.player.rotationPitch = this.pitch;
mc.player.noClip = false;
mc.player.motionX = 0;
mc.player.motionY = 0;
mc.player.motionZ = 0;
2019-10-27 15:45:44 +00:00
}
}
@Listener
public void onMove(EventMove event) {
Minecraft.getMinecraft().player.noClip = true;
}
@Listener
public void onWalkingUpdate(EventUpdateWalkingPlayer event) {
if (event.getStage() == EventStageable.EventStage.PRE) {
final Minecraft mc = Minecraft.getMinecraft();
mc.player.setVelocity(0, 0, 0);
mc.player.renderArmPitch = 5000;
2019-11-30 01:44:31 +00:00
mc.player.jumpMovementFactor = this.speed.getValue();
2019-10-27 15:45:44 +00:00
2019-11-30 01:44:31 +00:00
final double[] dir = MathUtil.directionSpeed(this.speed.getValue());
2019-10-27 15:45:44 +00:00
if (mc.player.movementInput.moveStrafe != 0 || mc.player.movementInput.moveForward != 0) {
mc.player.motionX = dir[0];
mc.player.motionZ = dir[1];
} else {
mc.player.motionX = 0;
mc.player.motionZ = 0;
}
mc.player.setSprinting(false);
2019-11-30 01:44:31 +00:00
if (this.view.getValue()) {
2019-10-27 15:45:44 +00:00
if (!mc.gameSettings.keyBindSneak.isKeyDown() && !mc.gameSettings.keyBindJump.isKeyDown()) {
2019-11-30 01:44:31 +00:00
mc.player.motionY = (this.speed.getValue() * (-MathUtil.degToRad(mc.player.rotationPitch))) * mc.player.movementInput.moveForward;
2019-10-27 15:45:44 +00:00
}
}
if (mc.gameSettings.keyBindJump.isKeyDown()) {
2019-11-30 01:44:31 +00:00
mc.player.motionY += this.speed.getValue();
2019-10-27 15:45:44 +00:00
}
if (mc.gameSettings.keyBindSneak.isKeyDown()) {
2019-11-30 01:44:31 +00:00
mc.player.motionY -= this.speed.getValue();
2019-10-27 15:45:44 +00:00
}
}
}
@Listener
public void sendPacket(EventSendPacket event) {
if (event.getStage() == EventStageable.EventStage.PRE) {
if (!Minecraft.getMinecraft().isSingleplayer()) // don't mess up single-player
return;
2019-10-27 15:45:44 +00:00
if (Minecraft.getMinecraft().world != null) {
if (!this.allowDismount.getValue()) {
if (event.getPacket() instanceof CPacketInput) {
event.setCanceled(true);
}
if (event.getPacket() instanceof CPacketEntityAction) {
CPacketEntityAction packetEntityAction = (CPacketEntityAction) event.getPacket();
if (packetEntityAction.getAction().equals(CPacketEntityAction.Action.START_SNEAKING)) {
event.setCanceled(true);
}
}
}
2019-11-30 01:44:31 +00:00
if (this.packet.getValue()) {
2019-10-27 15:45:44 +00:00
if (event.getPacket() instanceof CPacketPlayer) {
event.setCanceled(true);
}
} else {
if (!(event.getPacket() instanceof CPacketUseEntity) && !(event.getPacket() instanceof CPacketPlayerTryUseItem) && !(event.getPacket() instanceof CPacketPlayerTryUseItemOnBlock) && !(event.getPacket() instanceof CPacketPlayer) && !(event.getPacket() instanceof CPacketVehicleMove) && !(event.getPacket() instanceof CPacketChatMessage) && !(event.getPacket() instanceof CPacketKeepAlive)) {
event.setCanceled(true);
}
}
}
}
}
@Listener
public void receivePacket(EventReceivePacket event) {
if (event.getStage() == EventStageable.EventStage.PRE) {
if (!Minecraft.getMinecraft().isSingleplayer()) // don't mess up single-player
return;
if (event.getPacket() instanceof SPacketSetPassengers) {
2019-10-27 15:45:44 +00:00
final SPacketSetPassengers packet = (SPacketSetPassengers) event.getPacket();
final Entity riding = Minecraft.getMinecraft().world.getEntityByID(packet.getEntityId());
if (riding != null && riding == this.riding) {
2019-10-27 15:45:44 +00:00
this.riding = null;
}
}
if (event.getPacket() instanceof SPacketPlayerPosLook) {
final SPacketPlayerPosLook packet = (SPacketPlayerPosLook) event.getPacket();
2019-11-30 01:44:31 +00:00
if (this.packet.getValue()) {
2019-10-27 15:45:44 +00:00
if (this.entity != null) {
this.entity.setPositionAndRotation(packet.getX(), packet.getY(), packet.getZ(), packet.getYaw(), packet.getPitch());
}
this.position = new Vec3d(packet.getX(), packet.getY(), packet.getZ());
Minecraft.getMinecraft().player.connection.sendPacket(new CPacketConfirmTeleport(packet.getTeleportId()));
event.setCanceled(true);
} else {
event.setCanceled(true);
}
}
}
}
/**
* Deprecated
2021-04-27 19:08:13 +00:00
*
* @param event
*/
2019-10-27 15:45:44 +00:00
@Listener
public void collideWithBlock(EventAddCollisionBox event) {
if (event.getEntity() == Minecraft.getMinecraft().player) {
2019-10-27 15:45:44 +00:00
event.setCanceled(true);
}
2019-10-27 15:45:44 +00:00
}
@Listener
public void getLiquidCollisionBB(EventLiquidCollisionBB event) {
event.setBoundingBox(Block.NULL_AABB);
event.setCanceled(true);
}
@Listener
public void setOpaqueCube(EventSetOpaqueCube event) {
event.setCanceled(true);
}
@Listener
public void renderOverlay(EventRenderOverlay event) {
event.setCanceled(true);
}
@Listener
public void renderHelmet(EventRenderHelmet event) {
event.setCanceled(true);
}
@Listener
public void pushOutOfBlocks(EventPushOutOfBlocks event) {
event.setCanceled(true);
}
@Listener
public void pushedByWater(EventPushedByWater event) {
event.setCanceled(true);
}
@Listener
public void applyCollision(EventApplyCollision event) {
event.setCanceled(true);
}
}