Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

Визуальная часть Badtrip ZENITH (no recode)

Начинающий
Начинающий
Статус
Онлайн
Регистрация
9 Мар 2025
Сообщения
57
Реакции
1
Выберите загрузчик игры
  1. Fabric
Салем, YouGame, сливаю под Zenith для вас приколдeльчик,«Пастеры, конечно же, это схавают.»

Пожалуйста, авторизуйтесь для просмотра ссылки.



badtripentity render:
Expand Collapse Copy
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:
Expand Collapse Copy
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:
Expand Collapse Copy
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;
        }
    }
}
 
Салем, YouGame, сливаю под Zenith для вас приколдeльчик,«Пастеры, конечно же, это схавают.»

Пожалуйста, авторизуйтесь для просмотра ссылки.



badtripentity render:
Expand Collapse Copy
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:
Expand Collapse Copy
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:
Expand Collapse Copy
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;
        }
    }
}
1762585177018.png

// Создаем плавную анимацию: сначала сжимаем, потом возвращаем
// Внутренний класс для управления эффектом сплющивания
пастеры схавают, а сам как далеко от пастеров ушел?:roflanEbalo:
 
Салем, YouGame, сливаю под Zenith для вас приколдeльчик,«Пастеры, конечно же, это схавают.»

Пожалуйста, авторизуйтесь для просмотра ссылки.



badtripentity render:
Expand Collapse Copy
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:
Expand Collapse Copy
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:
Expand Collapse Copy
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;
        }
    }
}
// Регистрируем кастомный звук
// Создаем плавную анимацию: сначала сжимаем, потом возвращаем
// Внутренний класс для управления эффектом сплющивания
и еще много :pepe11:
 
// Регистрируем кастомный звук
// Создаем плавную анимацию: сначала сжимаем, потом возвращаем
// Внутренний класс для управления эффектом сплющивания
и еще много :pepe11:
И этот человек думает что "пастерам" нужен этот гпт код
 
И этот человек думает что "пастерам" нужен этот гпт код
больше вопрос кто это бля будет использовать это даже визуал настолько нищиебские что нахуй он вообще нужен
 
больше вопрос кто это бля будет использовать это даже визуал настолько нищиебские что нахуй он вообще нужен
Не,типо в вегалайне том же это очень круто сделанно,анимация очень динамичная и небольшая,приятная,тут пиздец это полный
 
«Пастеры, конечно же, это схавают.»
Молодец! высрал никому не нужный гпт код, Чем ты отличаешься от "Пастеров" Когда ты по сути AI "кодер" (Вставьте это во все возможное скобки) Не смог сам сделать даже такую хуйню. Браво некропсикс. Браво
 
Назад
Сверху Снизу