v3.8
This commit is contained in:
1 parent
4d30a16a6a
commit
bab752c589
21 files changed
+500
-38
No files matched your search
+6
-5
@@ -1,4 +1,4 @@
|
||||
# v3.7
|
||||
# v3.8
|
||||
|
||||
## novedades
|
||||
|
||||
@@ -6,13 +6,14 @@
|
||||
|
||||
#### módulos nuevos:
|
||||
|
||||
- trazos: dibuja líneas apuntando a entidades cercanas
|
||||
- desync de hitbox: exploit chino para meterse en bloques
|
||||
- recorrido: muestra tu recorrido
|
||||
- retroceso: modifica el retroceso a tomar
|
||||
|
||||
### arreglos / mejoras
|
||||
|
||||
- la config. ya funciona de nuevo
|
||||
- la escucha de eventos ha sido arreglada, arreglando cosas como la ruedita del zoom y algunos comandos
|
||||
- selección de minado ya no crashea al no usar pico
|
||||
- rotar, de andamios, ahora solo rota server-side
|
||||
- mostrar últimos bloques colocados en andamios
|
||||
|
||||
## problemas reconocidos
|
||||
|
||||
|
||||
+1
-1
@@ -10,6 +10,6 @@ fabric_api_version=0.140.2+1.21.11
|
||||
|
||||
neutrino_version=1.1.0
|
||||
|
||||
mod_version=3.7
|
||||
mod_version=3.8
|
||||
maven_group=me.retucio
|
||||
archives_base_name=sputnik
|
||||
@@ -59,6 +59,7 @@ public class Sputnik implements ClientModInitializer {
|
||||
public static final Sputnik INSTANCE = new Sputnik();
|
||||
public static final EventBus EVENT_BUS = new EventBus();
|
||||
public static final Logger LOGGER = LogManager.getLogger(Sputnik.class);
|
||||
public static final long LAUNCH_TIME = System.currentTimeMillis();
|
||||
public static MinecraftClient mc;
|
||||
|
||||
// id y versión
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
package me.retucio.sputnik.event.interact;
|
||||
|
||||
import com.github.retucio.neutrino.Event;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
|
||||
public class KnockbackEvent extends Event {
|
||||
|
||||
private double strength;
|
||||
private double x, z;
|
||||
private final LivingEntity target;
|
||||
|
||||
public KnockbackEvent(LivingEntity target, double z, double x, double strength) {
|
||||
this.target = target;
|
||||
this.z = z;
|
||||
this.x = x;
|
||||
this.strength = strength;
|
||||
}
|
||||
|
||||
public double getStrength() {
|
||||
return strength;
|
||||
}
|
||||
|
||||
public void setStrength(double strength) {
|
||||
this.strength = strength;
|
||||
}
|
||||
|
||||
public double getX() {
|
||||
return x;
|
||||
}
|
||||
|
||||
public void setX(double x) {
|
||||
this.x = x;
|
||||
}
|
||||
|
||||
public double getZ() {
|
||||
return z;
|
||||
}
|
||||
|
||||
public void setZ(double z) {
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
public LivingEntity getTarget() {
|
||||
return target;
|
||||
}
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
package me.retucio.sputnik.mixin.accessors;
|
||||
|
||||
import net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Mutable;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
@Mixin(EntityVelocityUpdateS2CPacket.class)
|
||||
public interface EntityVelocityUpdateS2CPacketAccessor {
|
||||
|
||||
@Mutable @Accessor("velocity")
|
||||
void setVelocity(Vec3d velocity);
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package me.retucio.sputnik.mixin.accessors;
|
||||
|
||||
import net.minecraft.network.packet.s2c.play.ExplosionS2CPacket;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Mutable;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@Mixin(ExplosionS2CPacket.class)
|
||||
public interface ExplosionS2CPacketAccessor {
|
||||
|
||||
@Mutable @Accessor("playerKnockback")
|
||||
void setKnockback(Optional<Vec3d> kb);
|
||||
}
|
||||
@@ -2,12 +2,14 @@ package me.retucio.sputnik.mixin.mixins.entity;
|
||||
|
||||
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
|
||||
import me.retucio.sputnik.event.render.ChangeRotationEvent;
|
||||
import me.retucio.sputnik.module.Module;
|
||||
import me.retucio.sputnik.module.ModuleManager;
|
||||
import me.retucio.sputnik.module.modules.camera.Freecam;
|
||||
import me.retucio.sputnik.module.modules.camera.Freelook;
|
||||
import me.retucio.sputnik.module.modules.camera.Rotations;
|
||||
import me.retucio.sputnik.module.modules.misc.AntiInvis;
|
||||
import me.retucio.sputnik.module.modules.movement.BoatFly;
|
||||
import me.retucio.sputnik.module.modules.movement.Velocity;
|
||||
import me.retucio.sputnik.module.modules.render.Nametags;
|
||||
import net.minecraft.entity.*;
|
||||
import net.minecraft.entity.passive.TameableEntity;
|
||||
@@ -20,6 +22,8 @@ import net.minecraft.world.World;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||
import org.spongepowered.asm.mixin.gen.Invoker;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
@@ -169,4 +173,10 @@ public abstract class EntityMixin {
|
||||
cir.setReturnValue(boatFly.stepHeight.getFloatValue());
|
||||
}
|
||||
}
|
||||
|
||||
@Inject(method = "pushAwayFrom", at = @At("HEAD"), cancellable = true)
|
||||
private void onPushed(Entity entity, CallbackInfo ci) {
|
||||
Velocity velocity = ModuleManager.INSTANCE.getModuleByClass(Velocity.class);
|
||||
if (velocity.isEnabled() && !velocity.push.getValue() && (Object) this == mc.player) ci.cancel();
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,16 @@
|
||||
package me.retucio.sputnik.mixin.mixins.entity;
|
||||
|
||||
import com.llamalad7.mixinextras.sugar.Local;
|
||||
import me.retucio.sputnik.module.ModuleManager;
|
||||
import me.retucio.sputnik.module.modules.movement.ElytraBounce;
|
||||
import me.retucio.sputnik.module.modules.movement.Step;
|
||||
import me.retucio.sputnik.module.modules.movement.Velocity;
|
||||
import net.minecraft.client.network.ClientPlayerEntity;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.sound.SoundCategory;
|
||||
import net.minecraft.sound.SoundEvents;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Shadow;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
@@ -56,4 +60,18 @@ public abstract class LivingEntityMixin {
|
||||
Step step = ModuleManager.INSTANCE.getModuleByClass(Step.class);
|
||||
if (step.isEnabled()) cir.setReturnValue(step.height.getFloatValue());
|
||||
}
|
||||
|
||||
@Inject(method = "takeKnockback", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;setVelocity(DDD)V"), cancellable = true)
|
||||
private void onTakeKb(double strength, double x, double z, CallbackInfo ci, @Local(ordinal = 0) Vec3d vec3d, @Local(ordinal = 1) Vec3d vec3d2) {
|
||||
Velocity velocity = ModuleManager.INSTANCE.getModuleByClass(Velocity.class);
|
||||
if (!velocity.isEnabled() || velocity.hits.getValue()) return;
|
||||
boolean onGround = ((LivingEntity) (Object) this).isOnGround();
|
||||
|
||||
double kbX = (velocity.xPercentage.getValue() / 100) * (vec3d.x / 2 - vec3d2.x);
|
||||
double kbY = (velocity.yPercentage.getValue() / 100) * ((onGround ? Math.min(0.4, vec3d.y / 2 + strength) : vec3d.y));
|
||||
double kbZ = (velocity.zPercentage.getValue() / 100) * (vec3d.z / 2 - vec3d2.z);
|
||||
|
||||
ci.cancel();
|
||||
((Entity) (Object) this).addVelocity(kbX, kbY, kbZ);
|
||||
}
|
||||
}
|
||||
@@ -112,6 +112,7 @@ public class ModuleManager {
|
||||
add(new ElytraBounce());
|
||||
add(new ElytraFly());
|
||||
add(new Headhitters());
|
||||
add(new HitboxDesync());
|
||||
add(new InfiniteElytra());
|
||||
add(new Jesus());
|
||||
add(new ReverseStep());
|
||||
@@ -120,6 +121,7 @@ public class ModuleManager {
|
||||
add(new Slippy());
|
||||
add(new Step());
|
||||
add(new TridentBoost());
|
||||
add(new Velocity());
|
||||
}
|
||||
|
||||
private void addNetwork() {
|
||||
@@ -149,6 +151,7 @@ public class ModuleManager {
|
||||
private void addRender() {
|
||||
add(new BlockESP());
|
||||
add(new BlockOutline());
|
||||
add(new Breadcrumbs());
|
||||
add(new BreakingProgress());
|
||||
add(new CritsPlus());
|
||||
add(new DamageOverlay());
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
package me.retucio.sputnik.module.modules.movement;
|
||||
|
||||
import me.retucio.sputnik.module.Category;
|
||||
import me.retucio.sputnik.module.Module;
|
||||
import net.minecraft.util.math.Box;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
|
||||
|
||||
/**
|
||||
* @link <a href="https://github.com/mioclient/hitbox-desync"></a>
|
||||
* @author retucio
|
||||
*/
|
||||
|
||||
public class HitboxDesync extends Module {
|
||||
|
||||
private final double MAGIC_OFFSET = 0.200009968835369999878673424677777777777761;
|
||||
|
||||
public HitboxDesync() {
|
||||
super("desync de hitbox", "exploit chino", Category.MOVEMENT);
|
||||
keyMode.setDefaultValue(KeyModes.HOLD);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTick() {
|
||||
if (mc.world == null || mc.player == null) return;
|
||||
|
||||
Direction dir = mc.player.getFacing();
|
||||
Box box = mc.player.getBoundingBox();
|
||||
Vec3d center = box.getCenter();
|
||||
Vec3d offset = new Vec3d(dir.getOffsetX(), dir.getOffsetY(), dir.getOffsetZ());
|
||||
Vec3d posVec = merge(new Vec3d(Math.floor(center.x) + 0.5, Math.floor(center.y), Math.floor(center.z) + 0.5)
|
||||
.add(new Vec3d(
|
||||
offset.x * MAGIC_OFFSET,
|
||||
offset.y * MAGIC_OFFSET,
|
||||
offset.z * MAGIC_OFFSET
|
||||
)), dir);
|
||||
|
||||
mc.player.setPos(posVec.x == 0 ? mc.player.getX() : posVec.x, mc.player.getY(), posVec.z == 0 ? mc.player.getZ() : posVec.z);
|
||||
toggle();
|
||||
}
|
||||
|
||||
private Vec3d merge(Vec3d a, Direction facing) {
|
||||
return new Vec3d(a.x * Math.abs(facing.getOffsetX()), a.y * Math.abs(facing.getOffsetY()), a.z * Math.abs(facing.getOffsetZ()));
|
||||
}
|
||||
}
|
||||
@@ -10,10 +10,7 @@ import me.retucio.sputnik.module.Module;
|
||||
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||
import me.retucio.sputnik.module.setting.settings.*;
|
||||
|
||||
import me.retucio.sputnik.util.Colors;
|
||||
import me.retucio.sputnik.util.InventoryUtil;
|
||||
import me.retucio.sputnik.util.Lists;
|
||||
import me.retucio.sputnik.util.NetworkUtil;
|
||||
import me.retucio.sputnik.util.*;
|
||||
import me.retucio.sputnik.util.render.RenderUtil;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.FallingBlock;
|
||||
@@ -25,6 +22,9 @@ import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Box;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
|
||||
import java.awt.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
public class Scaffold extends Module {
|
||||
@@ -79,7 +79,7 @@ public class Scaffold extends Module {
|
||||
0,
|
||||
4,
|
||||
0.1
|
||||
));
|
||||
)).visibility(extend::getValue);
|
||||
|
||||
|
||||
/* torre */
|
||||
@@ -97,13 +97,13 @@ public class Scaffold extends Module {
|
||||
0,
|
||||
1,
|
||||
0.01
|
||||
));
|
||||
)).visibility(tower::getValue);
|
||||
|
||||
private final BooleanSetting towerWhileMoving = sgBridge.add(new BooleanSetting(
|
||||
"torre moviéndose",
|
||||
"te permite hacer una torre mientras te mueves",
|
||||
false
|
||||
));
|
||||
)).visibility(tower::getValue);
|
||||
|
||||
|
||||
/* otros */
|
||||
@@ -140,7 +140,7 @@ public class Scaffold extends Module {
|
||||
"color a usar al renderizar el contorno",
|
||||
Colors.mainColor,
|
||||
false
|
||||
));
|
||||
)).visibility(outlines::getValue);
|
||||
|
||||
private final NumberSetting lineWidth = sgRender.add(new NumberSetting(
|
||||
"grosor de línea",
|
||||
@@ -149,7 +149,7 @@ public class Scaffold extends Module {
|
||||
0.1,
|
||||
10,
|
||||
0.1
|
||||
));
|
||||
)).visibility(outlines::getValue);
|
||||
|
||||
private final BooleanSetting fillings = sgRender.add(new BooleanSetting(
|
||||
"relleno",
|
||||
@@ -162,35 +162,44 @@ public class Scaffold extends Module {
|
||||
"color a uisar al renderizar el relleno",
|
||||
Colors.withAlpha(Colors.mainColor, 60),
|
||||
false
|
||||
)).visibility(fillings::getValue);
|
||||
|
||||
private final BooleanSetting showLastPlaced = sgRender.add(new BooleanSetting(
|
||||
"mostrar últimos bloques",
|
||||
"mostrar los últimos bloques colocados",
|
||||
true
|
||||
));
|
||||
|
||||
private final BooleanSetting fade = sgRender.add(new BooleanSetting(
|
||||
"gradiente",
|
||||
"gradiente de opacidad de los últimos bloques colocados",
|
||||
true
|
||||
)).visibility(showLastPlaced::getValue);
|
||||
|
||||
private final NumberSetting lifeTime = sgRender.add(new NumberSetting(
|
||||
"esperanza de vida",
|
||||
"esperanza de vida de los últimos bloques colocados (renderizado)",
|
||||
1,
|
||||
0,
|
||||
5,
|
||||
0.1
|
||||
)).visibility(showLastPlaced::getValue);
|
||||
|
||||
|
||||
private final BlockPos.Mutable bp = new BlockPos.Mutable();
|
||||
private final List<PlacedBlock> lastPlacedBlocks = new ArrayList<>();
|
||||
private Integer mjY = null;
|
||||
|
||||
|
||||
public Scaffold() {
|
||||
super("andamios", "pone bloques bajo tus pies de manera automática", Category.MOVEMENT);
|
||||
|
||||
extend.onUpdate(extendDistance::visibility);
|
||||
|
||||
tower.onUpdate(v -> {
|
||||
towerSpeed.visibility(v);
|
||||
towerWhileMoving.visibility(v);
|
||||
});
|
||||
|
||||
outlines.onUpdate(v -> {
|
||||
outlineColor.visibility(v);
|
||||
lineWidth.visibility(v);
|
||||
});
|
||||
|
||||
fillings.onUpdate(fillingColor::visibility);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
mjY = null;
|
||||
super.onDisable();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -205,6 +214,11 @@ public class Scaffold extends Module {
|
||||
pos = pos.add(dir.x, 0, dir.z);
|
||||
}
|
||||
|
||||
lastPlacedBlocks.removeIf(block -> {
|
||||
block.age++;
|
||||
return block.age >= block.lifeTime;
|
||||
});
|
||||
|
||||
// seleccionar nivel Y
|
||||
double y;
|
||||
if (mjBridge.getValue() && mjY != null && isMoving()) {
|
||||
@@ -233,7 +247,7 @@ public class Scaffold extends Module {
|
||||
if (tower.getValue()
|
||||
&& mc.options.jumpKey.isPressed()
|
||||
&& !mc.options.sneakKey.isPressed()
|
||||
&& !mc.player.getInventory().getSelectedStack().isEmpty()
|
||||
&& mc.player.getInventory().getSelectedStack().getItem() instanceof BlockItem
|
||||
&& !mc.world.isAir(mc.player.getBlockPos().down())) {
|
||||
Vec3d velocity = mc.player.getVelocity();
|
||||
Box playerBox = mc.player.getBoundingBox();
|
||||
@@ -252,8 +266,25 @@ public class Scaffold extends Module {
|
||||
|
||||
@EventListener
|
||||
private void onRenderWorld(Render3DEvent event) {
|
||||
if (outlines.getValue()) RenderUtil.drawBlockOutline(event.getMatrices(), bp, outlineColor.getValue(), lineWidth.getFloatValue(), false);
|
||||
if (fillings.getValue()) RenderUtil.drawBlockFilled(event.getMatrices(), bp, fillingColor.getValue(), false);
|
||||
if (outlines.getValue()) RenderUtil.drawBlockOutline(event.getMatrices(), bp, outlineColor.getValue(), lineWidth.getFloatValue(), false);
|
||||
|
||||
if (!showLastPlaced.getValue()) return;
|
||||
for (PlacedBlock block : lastPlacedBlocks) {
|
||||
if (bp.asVector3i().equals(block.pos.asVector3i())) continue;
|
||||
if (fillings.getValue()) {
|
||||
Color fc = fade.getValue()
|
||||
? Colors.withAlpha(fillingColor.getValue(), (int) ((1 - ((float) block.age / (float) block.lifeTime)) * fillingColor.getA()))
|
||||
: fillingColor.getValue();
|
||||
RenderUtil.drawBlockFilled(event.getMatrices(), block.pos, fc, false);
|
||||
}
|
||||
if (outlines.getValue()) {
|
||||
Color oc = fade.getValue()
|
||||
? Colors.withAlpha(outlineColor.getValue(), (int) ((1 - ((float) block.age / (float) block.lifeTime)) * outlineColor.getA()))
|
||||
: outlineColor.getValue();
|
||||
RenderUtil.drawBlockOutline(event.getMatrices(), block.pos, oc, lineWidth.getFloatValue(), false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventListener
|
||||
@@ -292,15 +323,30 @@ public class Scaffold extends Module {
|
||||
mc.player.getInventory().setSelectedSlot(slot);
|
||||
}
|
||||
|
||||
|
||||
// colocar bloque
|
||||
NetworkUtil.placeBlock(
|
||||
if (NetworkUtil.placeBlock(
|
||||
pos, Hand.MAIN_HAND,
|
||||
mc.player.getInventory().getSelectedSlot(),
|
||||
rotate.getValue(),
|
||||
false,
|
||||
true,
|
||||
true
|
||||
);
|
||||
)) {
|
||||
lastPlacedBlocks.add(new PlacedBlock(pos.toImmutable(), lifeTime.getIntValue() * 20));
|
||||
}
|
||||
}
|
||||
|
||||
private static class PlacedBlock {
|
||||
BlockPos pos;
|
||||
final int lifeTime;
|
||||
int age;
|
||||
|
||||
PlacedBlock(BlockPos pos, int lifeTime) {
|
||||
this.pos = pos;
|
||||
this.lifeTime = lifeTime;
|
||||
this.age = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// método helper para ver si un bloque cumple con el filtro
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
package me.retucio.sputnik.module.modules.movement;
|
||||
|
||||
import com.github.retucio.neutrino.EventListener;
|
||||
import me.retucio.sputnik.event.network.PacketEvent;
|
||||
import me.retucio.sputnik.mixin.accessors.EntityVelocityUpdateS2CPacketAccessor;
|
||||
import me.retucio.sputnik.mixin.accessors.ExplosionS2CPacketAccessor;
|
||||
import me.retucio.sputnik.module.Category;
|
||||
import me.retucio.sputnik.module.Module;
|
||||
import me.retucio.sputnik.module.setting.SettingGroup;
|
||||
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||
import net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket;
|
||||
import net.minecraft.network.packet.s2c.play.ExplosionS2CPacket;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
|
||||
/** continúa en:
|
||||
* @see me.retucio.sputnik.mixin.mixins.entity.EntityMixin
|
||||
* @see me.retucio.sputnik.mixin.mixins.entity.LivingEntityMixin
|
||||
*
|
||||
* @author retucio
|
||||
*/
|
||||
|
||||
public class Velocity extends Module {
|
||||
|
||||
private final SettingGroup sgTypes = addSg(new SettingGroup("tipos", true));
|
||||
|
||||
public final NumberSetting xPercentage = sgGeneral.add(new NumberSetting(
|
||||
"X (%)",
|
||||
"porcentaje de retroceso en el eje X a tomar",
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
1
|
||||
));
|
||||
|
||||
public final NumberSetting yPercentage = sgGeneral.add(new NumberSetting(
|
||||
"Y (%)",
|
||||
"porcentaje de retroceso vertical (Y) a tomar",
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
1
|
||||
));
|
||||
|
||||
public final NumberSetting zPercentage = sgGeneral.add(new NumberSetting(
|
||||
"horizontal (%)",
|
||||
"porcentaje de retroceso en el eje Z a tomar",
|
||||
0,
|
||||
0,
|
||||
100,
|
||||
1
|
||||
));
|
||||
|
||||
private final BooleanSetting explosions = sgGeneral.add(new BooleanSetting(
|
||||
"explosiones",
|
||||
"tomar retroceso de explosiones",
|
||||
false
|
||||
));
|
||||
|
||||
public final BooleanSetting hits = sgTypes.add(new BooleanSetting(
|
||||
"hits",
|
||||
"tomar retroceso de golpes",
|
||||
false
|
||||
));
|
||||
|
||||
public final BooleanSetting push = sgTypes.add(new BooleanSetting(
|
||||
"empujar",
|
||||
"tomar retroceso de cuando te empuja una entidad",
|
||||
false
|
||||
));
|
||||
|
||||
public Velocity() {
|
||||
super("retroceso", "te hace estar gordo", Category.MOVEMENT);
|
||||
}
|
||||
|
||||
@EventListener
|
||||
private void onReceivePacket(PacketEvent.Receive event) {
|
||||
if (event.getPacket() instanceof ExplosionS2CPacket explosionPacket && !explosions.getValue()) {
|
||||
explosionPacket.playerKnockback().ifPresent(kb -> ((ExplosionS2CPacketAccessor) (Object) explosionPacket).setKnockback(Optional.of(new Vec3d(
|
||||
kb.x * xPercentage.getValue() / 100,
|
||||
kb.y * yPercentage.getValue() / 100,
|
||||
kb.z * zPercentage.getValue() / 100
|
||||
))));
|
||||
} else if (event.getPacket() instanceof EntityVelocityUpdateS2CPacket velocityPacket) {
|
||||
Vec3d kb = velocityPacket.getVelocity();
|
||||
((EntityVelocityUpdateS2CPacketAccessor) velocityPacket).setVelocity(new Vec3d(
|
||||
kb.x * xPercentage.getValue() / 100,
|
||||
kb.y * yPercentage.getValue() / 100,
|
||||
kb.z * zPercentage.getValue() / 100
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
package me.retucio.sputnik.module.modules.render;
|
||||
|
||||
import com.github.retucio.neutrino.EventListener;
|
||||
import me.retucio.sputnik.event.render.Render3DEvent;
|
||||
import me.retucio.sputnik.module.Category;
|
||||
import me.retucio.sputnik.module.Module;
|
||||
import me.retucio.sputnik.module.setting.settings.BooleanSetting;
|
||||
import me.retucio.sputnik.module.setting.settings.ColorSetting;
|
||||
import me.retucio.sputnik.module.setting.settings.NumberSetting;
|
||||
import me.retucio.sputnik.util.Colors;
|
||||
import me.retucio.sputnik.util.MiscUtil;
|
||||
import me.retucio.sputnik.util.render.RenderUtil;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
|
||||
import java.awt.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* @author retucio
|
||||
*/
|
||||
|
||||
public class Breadcrumbs extends Module {
|
||||
|
||||
private final NumberSetting lifeTime = sgGeneral.add(new NumberSetting(
|
||||
"esperanza de vida",
|
||||
"cuánto duran los trazos",
|
||||
10,
|
||||
0.1,
|
||||
40,
|
||||
0.1
|
||||
));
|
||||
|
||||
private final ColorSetting color = sgGeneral.add(new ColorSetting(
|
||||
"color",
|
||||
"color a usar",
|
||||
Colors.withAlpha(Colors.mainColor, 102),
|
||||
true
|
||||
));
|
||||
|
||||
private final NumberSetting lineWidth = sgGeneral.add(new NumberSetting(
|
||||
"grosor",
|
||||
"grosor de las líneas",
|
||||
1,
|
||||
0.1,
|
||||
10,
|
||||
0.1
|
||||
));
|
||||
|
||||
private final BooleanSetting fade = sgGeneral.add(new BooleanSetting(
|
||||
"gradiente",
|
||||
"gradiente de opacidad del recorrido basado en el tiempo pasado",
|
||||
true
|
||||
));
|
||||
|
||||
private final List<Breadcrumb> crumbs = new ArrayList<>();
|
||||
private Vec3d lastPos = null;
|
||||
|
||||
public Breadcrumbs() {
|
||||
super("recorrido", "muestra tu recorrido", Category.RENDER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
crumbs.clear();
|
||||
lastPos = null;
|
||||
super.onDisable();
|
||||
}
|
||||
|
||||
@EventListener
|
||||
private void onRenderWorld(Render3DEvent event) {
|
||||
Iterator<Breadcrumb> iterator = crumbs.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
Breadcrumb crumb = iterator.next();
|
||||
|
||||
Color c = fade.getValue() ? Colors.withAlpha(color.getValue(), (int) ((1 - ((float) crumb.age / (float) crumb.lifeTime)) * 255)) : color.getValue();
|
||||
RenderUtil.drawLine(event.getMatrices(), crumb.from, crumb.to, c, lineWidth.getFloatValue());
|
||||
|
||||
crumb.age++;
|
||||
if (crumb.age >= crumb.lifeTime) {
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
|
||||
if (lastPos != null) {
|
||||
crumbs.add(new Breadcrumb(lastPos, mc.player.getEntityPos(), (int) (lifeTime.getValue() * 20)));
|
||||
}
|
||||
lastPos = mc.player.getEntityPos();
|
||||
}
|
||||
|
||||
|
||||
private static class Breadcrumb {
|
||||
Vec3d from, to;
|
||||
int lifeTime, age;
|
||||
|
||||
public Breadcrumb(Vec3d from, Vec3d to, int lifeTime) {
|
||||
this.from = from;
|
||||
this.to = to;
|
||||
this.lifeTime = lifeTime;
|
||||
this.age = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -97,7 +97,7 @@ public class Tracers extends Module {
|
||||
for (Entity entity : mc.world.getEntities()) {
|
||||
Color color = getColor(entity);
|
||||
if (color == null) continue;
|
||||
Vec3d interpolatedPos = entity.getLerpedPos(event.getTickDelta());
|
||||
Vec3d interpolatedPos = entity.getLerpedPos(event.getTickDelta()).add(0, mc.player.getEyeHeight(mc.player.getPose()), 0);
|
||||
RenderUtil.drawTracer(event.getMatrices(), interpolatedPos, color, lineWidth.getFloatValue());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,9 +34,10 @@ public class HudRenderer {
|
||||
addElement(new FpsElement(), positions, visibilities);
|
||||
addElement(new TpsElement(), positions, visibilities);
|
||||
addElement(new CustomTextElement(), positions, visibilities);
|
||||
addElement(new TimeElement(), positions, visibilities);
|
||||
addElement(new PingElement(), positions, visibilities);
|
||||
addElement(new RotationElement(), positions, visibilities);
|
||||
addElement(new TimeElement(), positions, visibilities);
|
||||
addElement(new UptimeElement(), positions, visibilities);
|
||||
|
||||
addElement(new DynoElement(), positions, visibilities);
|
||||
addElement(new EchestElement(), positions, visibilities);
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
package me.retucio.sputnik.ui.hud.elements;
|
||||
|
||||
import me.retucio.sputnik.Sputnik;
|
||||
import me.retucio.sputnik.module.ModuleManager;
|
||||
import me.retucio.sputnik.module.modules.client.HUD;
|
||||
import me.retucio.sputnik.ui.hud.TextHudElement;
|
||||
import net.minecraft.text.Text;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class UptimeElement extends TextHudElement {
|
||||
|
||||
public UptimeElement() {
|
||||
super("uptime", mc.getWindow().getScaledWidth() - 50, mc.getWindow().getScaledHeight() - 2 * (mc.textRenderer.fontHeight + 2));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getText(float delta, HUD hud) {
|
||||
long seconds = (System.currentTimeMillis() - Sputnik.LAUNCH_TIME) / 1000;
|
||||
int minutes = (int) seconds / 60;
|
||||
int hours = minutes / 60;
|
||||
seconds %= 60;
|
||||
minutes %= 60;
|
||||
|
||||
return String.format("%sh %smin %ss", hours, minutes, seconds);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPreviewText() {
|
||||
return getText(mc.getRenderTickCounter().getDynamicDeltaTicks(), ModuleManager.INSTANCE.getModuleByClass(HUD.class));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Text> getTooltip() {
|
||||
return List.of(Text.of("tiempo jugando"));
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,7 @@ import me.retucio.sputnik.module.modules.client.HUD;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import org.joml.Vector3d;
|
||||
import org.joml.Vector3f;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
|
||||
import java.time.Instant;
|
||||
@@ -97,4 +98,13 @@ public class MiscUtil {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static Vec3d vec3dOf(Vector3f v) {
|
||||
return new Vec3d(v.x, v.y, v.z);
|
||||
}
|
||||
|
||||
public static Vector3f vec3fOf(Vec3d v) {
|
||||
return new Vector3f((float) v.x, (float) v.y, (float) v.z);
|
||||
}
|
||||
}
|
||||
@@ -126,8 +126,7 @@ public class NetworkUtil {
|
||||
int prevSlot = mc.player.getInventory().getSelectedSlot();
|
||||
|
||||
if (rotate) {
|
||||
mc.player.setYaw((float) EntityUtil.getYaw(hitPos));
|
||||
mc.player.setPitch((float) EntityUtil.getPitch(hitPos));
|
||||
EntityUtil.lookAtServer(hitPos);
|
||||
}
|
||||
|
||||
InventoryUtil.swapWithHotbar(mc.player.getInventory().getSelectedSlot(), slot);
|
||||
|
||||
@@ -19,6 +19,16 @@ public class RenderUtil {
|
||||
|
||||
/* líneas */
|
||||
|
||||
public static void drawLine(MatrixStack matrices, Vec3d from, Vec3d to, Color color, float lineWidth) {
|
||||
BufferBuilder buffer = tessellator.begin(VertexFormat.DrawMode.LINES, VertexFormats.POSITION_COLOR_NORMAL_LINE_WIDTH);
|
||||
Vec3d cam = mc.gameRenderer.getCamera().getCameraPos();
|
||||
|
||||
buffer.vertex(matrices.peek(), (float) (from.x - cam.x), (float) (from.y - cam.y), (float) (from.z - cam.z)).color(color.getRGB()).normal(-1, -1, -1).lineWidth(lineWidth);
|
||||
buffer.vertex(matrices.peek(), (float) (to.x - cam.x), (float) (to.y - cam.y), (float) (to.z - cam.z)).color(color.getRGB()).normal(-1, -1, -1).lineWidth(lineWidth);
|
||||
|
||||
Layers.lines().draw(buffer.end());
|
||||
}
|
||||
|
||||
// https://github.com/TheF1xer/GateClient-1.12.2/blob/main/src/main/java/me/thef1xer/gateclient/util/RenderUtil.java
|
||||
public static void drawTracer(MatrixStack matrices, Vec3d pos, Color color, float lineWidth) {
|
||||
BufferBuilder buffer = tessellator.begin(VertexFormat.DrawMode.LINES, VertexFormats.POSITION_COLOR_NORMAL_LINE_WIDTH);
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"el prepu"
|
||||
],
|
||||
"contact": {
|
||||
"homepage": "https://github.com/retuci0",
|
||||
"homepage": "https://retucio.me/projects/sputnik.html",
|
||||
"sources": "https://github.com/retuci0/sputnik"
|
||||
},
|
||||
"license": "CC0-1.0",
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"mixins": [
|
||||
"accessors.AbstractBlockAccessor",
|
||||
"accessors.ConfirmServerResourcePackScreenAccessor",
|
||||
"accessors.EntityVelocityUpdateS2CPacketAccessor",
|
||||
"accessors.ExplosionS2CPacketAccessor",
|
||||
"accessors.FishingBobberEntityAccessor",
|
||||
"accessors.PackAccessor",
|
||||
"accessors.StatusEffectInstanceAccessor",
|
||||
|
||||
Reference in new issue
Block a user