Начинающий
- Статус
- Онлайн
- Регистрация
- 9 Мар 2025
- Сообщения
- 57
- Реакции
- 1
- Выберите загрузчик игры
- Fabric
Салем, YouGame, сливаю под Zenith для вас приколдeльчик,«Пастеры, конечно же, это схавают.»
Пожалуйста, авторизуйтесь для просмотра ссылки.
badtripentity render:
package wtf.dettex.api.mixins;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.entity.LivingEntityRenderer;
import net.minecraft.client.render.entity.state.LivingEntityRenderState;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.LivingEntity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import wtf.dettex.event.EventManager;
import wtf.dettex.event.impl.render.BadTripRenderEvent;
import wtf.dettex.common.QuickImports;
@Mixin(LivingEntityRenderer.class)
public class BadTripEntityRendererMixin implements QuickImports {
@Inject(method = "render(Lnet/minecraft/client/render/entity/state/LivingEntityRenderState;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V",
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;push()V", shift = At.Shift.AFTER))
private void onRenderPre(LivingEntityRenderState renderState, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int light, CallbackInfo ci) {
// Получаем сущность из рендер стейта (может потребоваться дополнительная логика)
if (mc.world != null) {
// Ищем сущность по позиции или другим параметрам
LivingEntity entity = findEntityByRenderState(renderState);
if (entity != null) {
BadTripRenderEvent event = new BadTripRenderEvent(entity);
EventManager.callEvent(event);
// Применяем масштабирование если оно изменено
if (event.getScaleX() != 1.0f || event.getScaleY() != 1.0f || event.getScaleZ() != 1.0f) {
matrixStack.scale(event.getScaleX(), event.getScaleY(), event.getScaleZ());
}
}
}
}
private LivingEntity findEntityByRenderState(LivingEntityRenderState renderState) {
if (mc.world == null) return null;
// Простой поиск по позиции (может быть неточным, но для демонстрации подойдет)
return mc.world.getEntitiesByClass(LivingEntity.class,
new net.minecraft.util.math.Box(renderState.x - 0.1, renderState.y - 0.1, renderState.z - 0.1,
renderState.x + 0.1, renderState.y + 0.1, renderState.z + 0.1),
entity -> true).stream().findFirst().orElse(null);
}
}
badtriprenderevent:
package wtf.dettex.event.impl.render;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.FieldDefaults;
import net.minecraft.entity.LivingEntity;
import wtf.dettex.event.events.Event;
@AllArgsConstructor
@Getter
@Setter
@FieldDefaults(level = AccessLevel.PRIVATE)
public class BadTripRenderEvent implements Event {
LivingEntity entity;
float scaleX;
float scaleY;
float scaleZ;
public BadTripRenderEvent(LivingEntity entity) {
this.entity = entity;
this.scaleX = 1.0f;
this.scaleY = 1.0f;
this.scaleZ = 1.0f;
}
}
badtrip:
package wtf.dettex.modules.impl.misc;
import lombok.AccessLevel;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.sound.PositionedSoundInstance;
import net.minecraft.entity.player.PlayerEntity;
import wtf.dettex.event.impl.player.AttackEvent;
import net.minecraft.sound.SoundEvent;
import net.minecraft.util.Identifier;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import wtf.trollhack.event.EventHandler;
import wtf.trollhack.modules.api.Module;
import wtf.trollhack.modules.api.ModuleCategory;
import wtf.trollhack.modules.setting.implement.BooleanSetting;
import wtf.trollhack.modules.setting.implement.ValueSetting;
import wtf.trollhack.event.impl.render.WorldRenderEvent;
import wtf.trollhack.event.impl.render.BadTripRenderEvent;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@FieldDefaults(level = AccessLevel.PRIVATE)
public class BadTrip extends Module {
BooleanSetting playSound = new BooleanSetting("Play Sound", "Play the Chelovek - Yaica sound")
.setValue(true);
ValueSetting soundVolume = new ValueSetting("Sound Volume", "Volume of the sound")
.setValue(1.0f).range(0.1f, 2.0f).visible(() -> playSound.isValue());
ValueSetting effectIntensity = new ValueSetting("Effect Intensity", "Intensity of the squish effect")
.setValue(0.8f).range(0.1f, 2.0f);
ValueSetting effectDuration = new ValueSetting("Effect Duration", "Duration of the effect in ticks")
.setValue(60).range(20, 200);
BooleanSetting onlyPlayers = new BooleanSetting("Only Players", "Only apply effect to players")
.setValue(true);
// Хранение активных эффектов для каждого игрока
Map<Integer, SquishEffect> activeEffects = new ConcurrentHashMap<>();
SoundEvent customSound = null;
boolean soundPlayed = false; // Флаг для отслеживания проигрывания звука
public BadTrip() {
super("BadTrip", "Bad Trip effect on damage", ModuleCategory.MISC);
setup(playSound, soundVolume, effectIntensity, effectDuration, onlyPlayers);
// Регистрируем кастомный звук
try {
customSound = SoundEvent.of(Identifier.of("dettex", "chelovek_yaica"));
Registry.register(Registries.SOUND_EVENT, customSound.id(), customSound);
} catch (Exception e) {
// Если не удалось зарегистрировать звук, используем стандартный
customSound = null;
}
}
public void onEnable() {
// Проигрываем звук при включении модуля
if (playSound.isValue() && !soundPlayed) {
playCustomSound();
soundPlayed = true;
}
}
public void onDisable() {
// Сбрасываем флаг при выключении модуля
soundPlayed = false;
// Очищаем все активные эффекты
activeEffects.clear();
}
@EventHandler
public void onAttack(AttackEvent event) {
if (mc.world == null || event.getEntity() == null) return;
if (event.getEntity() instanceof PlayerEntity player) {
if (onlyPlayers.isValue() || player == mc.player) {
// Создаем новый эффект сплющивания
activeEffects.put(player.getId(), new SquishEffect(
(int) effectDuration.getValue(),
effectIntensity.getValue()
));
}
}
}
@EventHandler
public void onWorldRender(WorldRenderEvent event) {
if (mc.world == null) return;
// Обновляем все активные эффекты
activeEffects.entrySet().removeIf(entry -> {
SquishEffect effect = entry.getValue();
effect.update();
return effect.isFinished(); // Удаляем завершенные эффекты
});
}
@EventHandler
public void onBadTripRender(BadTripRenderEvent event) {
if (mc.world == null || event.getEntity() == null) return;
// Проверяем есть ли активный эффект для этой сущности
SquishEffect effect = activeEffects.get(event.getEntity().getId());
if (effect != null && !effect.isFinished()) {
float scale = effect.getCurrentScale();
event.setScaleX(2.0f - scale); // Расширяем по X
event.setScaleY(scale); // Сжимаем по Y
event.setScaleZ(2.0f - scale); // Расширяем по Z
}
}
private void playCustomSound() {
if (mc.player == null) return;
try {
if (customSound != null) {
mc.getSoundManager().play(PositionedSoundInstance.master(
customSound,
1.0f,
soundVolume.getValue()
));
}
} catch (Exception e) {
// Если не удалось воспроизвести кастомный звук, используем стандартный
// mc.getSoundManager().play(PositionedSoundInstance.master(SoundEvents.ENTITY_PLAYER_HURT, 1.0f, soundVolume.getValue()));
}
}
@Override
public void deactivate() {
super.deactivate();
// Очищаем все активные эффекты при отключении модуля
activeEffects.clear();
}
// Внутренний класс для управления эффектом сплющивания
private static class SquishEffect {
private final int maxDuration;
private final float intensity;
private int currentTick;
private float originalWidth = -1;
private float originalHeight = -1;
public SquishEffect(int duration, float intensity) {
this.maxDuration = duration;
this.intensity = intensity;
this.currentTick = 0;
}
public void update() {
currentTick++;
}
public boolean isFinished() {
return currentTick >= maxDuration;
}
public float getCurrentScale() {
if (isFinished()) return 1.0f;
float progress = (float) currentTick / maxDuration;
// Создаем плавную анимацию: сначала сжимаем, потом возвращаем
float wave = (float) Math.sin(progress * Math.PI);
return 1.0f - (wave * intensity);
}
public boolean hasOriginalDimensions() {
return originalWidth > 0 && originalHeight > 0;
}
public void setOriginalDimensions(float width, float height) {
if (!hasOriginalDimensions()) {
this.originalWidth = width;
this.originalHeight = height;
}
}
public float getOriginalWidth() {
return originalWidth;
}
public float getOriginalHeight() {
return originalHeight;
}
}
}




