245 lines
9.7 KiB
Java
245 lines
9.7 KiB
Java
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;
|
|
import me.rigamortis.seppuku.api.value.Value;
|
|
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
|
|
*/
|
|
public final class FreeCamModule extends Module {
|
|
|
|
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);
|
|
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);
|
|
if (mc.player.getRidingEntity() != null) {
|
|
this.riding = mc.player.getRidingEntity();
|
|
mc.player.dismountRidingEntity();
|
|
this.entity.startRiding(this.riding);
|
|
} else {
|
|
this.riding = null;
|
|
}
|
|
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;
|
|
}
|
|
}
|
|
|
|
@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;
|
|
mc.player.jumpMovementFactor = this.speed.getValue();
|
|
|
|
final double[] dir = MathUtil.directionSpeed(this.speed.getValue());
|
|
|
|
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);
|
|
|
|
if (this.view.getValue()) {
|
|
if (!mc.gameSettings.keyBindSneak.isKeyDown() && !mc.gameSettings.keyBindJump.isKeyDown()) {
|
|
mc.player.motionY = (this.speed.getValue() * (-MathUtil.degToRad(mc.player.rotationPitch))) * mc.player.movementInput.moveForward;
|
|
}
|
|
}
|
|
|
|
if (mc.gameSettings.keyBindJump.isKeyDown()) {
|
|
mc.player.motionY += this.speed.getValue();
|
|
}
|
|
|
|
if (mc.gameSettings.keyBindSneak.isKeyDown()) {
|
|
mc.player.motionY -= this.speed.getValue();
|
|
}
|
|
}
|
|
}
|
|
|
|
@Listener
|
|
public void sendPacket(EventSendPacket event) {
|
|
if (event.getStage() == EventStageable.EventStage.PRE) {
|
|
if (Minecraft.getMinecraft().isSingleplayer()) // don't mess up single-player
|
|
return;
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this.packet.getValue()) {
|
|
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) {
|
|
final SPacketSetPassengers packet = (SPacketSetPassengers) event.getPacket();
|
|
final Entity riding = Minecraft.getMinecraft().world.getEntityByID(packet.getEntityId());
|
|
|
|
if (riding != null && riding == this.riding) {
|
|
this.riding = null;
|
|
}
|
|
}
|
|
if (event.getPacket() instanceof SPacketPlayerPosLook) {
|
|
final SPacketPlayerPosLook packet = (SPacketPlayerPosLook) event.getPacket();
|
|
if (this.packet.getValue()) {
|
|
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
|
|
*
|
|
* @param event
|
|
*/
|
|
@Listener
|
|
public void collideWithBlock(EventAddCollisionBox event) {
|
|
if (event.getEntity() == Minecraft.getMinecraft().player) {
|
|
event.setCanceled(true);
|
|
}
|
|
}
|
|
|
|
@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);
|
|
}
|
|
|
|
}
|