Skip to content

Commit

Permalink
most of the minecart levitation sounds
Browse files Browse the repository at this point in the history
  • Loading branch information
MBatt1 committed Nov 12, 2024
1 parent 47d58e1 commit 2255eb8
Show file tree
Hide file tree
Showing 14 changed files with 167 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package net.id.paradiselost.client.sound;

import net.id.paradiselost.component.ParadiseLostComponents;
import net.id.paradiselost.util.ParadiseLostSoundEvents;
import net.minecraft.client.sound.MovingSoundInstance;
import net.minecraft.client.sound.SoundInstance;
import net.minecraft.entity.vehicle.AbstractMinecartEntity;
import net.minecraft.sound.SoundCategory;
import net.minecraft.util.math.MathHelper;

public class LevitaMovingMinecartSoundInstance extends MovingSoundInstance {
private final AbstractMinecartEntity minecart;
private float distance = 0.0F;

public LevitaMovingMinecartSoundInstance(AbstractMinecartEntity minecart) {
super(ParadiseLostSoundEvents.ENTITY_MINECART_ROLLING_LEVITATING, SoundCategory.NEUTRAL, SoundInstance.createRandom());
this.minecart = minecart;
this.repeat = true;
this.repeatDelay = 0;
this.volume = 0.0F;
this.x = ((float)minecart.getX());
this.y = ((float)minecart.getY());
this.z = ((float)minecart.getZ());
}

@Override
public boolean canPlay() {
return !this.minecart.isSilent();
}

@Override
public boolean shouldAlwaysPlay() {
return true;
}

@Override
public void tick() {
if (this.minecart.isRemoved()) {
this.setDone();
} else {
this.x = this.minecart.getX();
this.y = this.minecart.getY();
this.z = this.minecart.getZ();
float f = (float) this.minecart.getVelocity().horizontalLength();
var floatingComponent = ParadiseLostComponents.FLOATING_KEY.get(minecart);
if (f >= 0.01F && this.minecart.getWorld().getTickManager().shouldTick() && floatingComponent.getFloating()) {
this.distance = MathHelper.clamp(this.distance + 0.0025F, 0.0F, 1.0F);
this.volume = MathHelper.lerp(MathHelper.clamp(f, 0.0F, 0.5F), 0.0F, 0.7F);
} else {
this.distance = 0.0F;
this.volume = 0.0F;
}
}
}

}
14 changes: 14 additions & 0 deletions src/main/java/net/id/paradiselost/component/FloatingComponent.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
package net.id.paradiselost.component;

import net.minecraft.block.AbstractRailBlock;
import net.minecraft.block.BlockState;
import net.minecraft.entity.vehicle.AbstractMinecartEntity;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.registry.RegistryWrapper;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import org.ladysnake.cca.api.v3.component.sync.AutoSyncedComponent;
import org.spongepowered.asm.mixin.Unique;

public class FloatingComponent implements AutoSyncedComponent {

Expand Down Expand Up @@ -47,4 +53,12 @@ public void tick() {
}
}

public boolean isCartOnRail(AbstractMinecartEntity minecart) {
int i = MathHelper.floor(minecart.getX());
int j = MathHelper.floor(minecart.getY());
int k = MathHelper.floor(minecart.getZ());
BlockState blockState = minecart.getWorld().getBlockState(new BlockPos(i, j, k));
return AbstractRailBlock.isRail(blockState);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package net.id.paradiselost.mixin.client.network;

import net.id.paradiselost.client.sound.LevitaMovingMinecartSoundInstance;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientCommonNetworkHandler;
import net.minecraft.client.network.ClientConnectionState;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.entity.Entity;
import net.minecraft.entity.vehicle.AbstractMinecartEntity;
import net.minecraft.network.ClientConnection;
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;

@Mixin(ClientPlayNetworkHandler.class)
public abstract class ClientPlayNetworkHandlerMixin extends ClientCommonNetworkHandler {

public ClientPlayNetworkHandlerMixin(MinecraftClient client, ClientConnection connection, ClientConnectionState connectionState) {
super(client, connection, connectionState);
}

@Inject(method = "playSpawnSound", at = @At("HEAD"))
private void playSpawnSound(Entity entity, CallbackInfo ci) {
if (entity instanceof AbstractMinecartEntity abstractMinecartEntity) {
this.client.getSoundManager().play(new LevitaMovingMinecartSoundInstance(abstractMinecartEntity));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package net.id.paradiselost.mixin.client.sound;

import net.id.paradiselost.component.ParadiseLostComponents;
import net.minecraft.block.AbstractRailBlock;
import net.minecraft.block.BlockState;
import net.minecraft.client.sound.MovingMinecartSoundInstance;
import net.minecraft.client.sound.MovingSoundInstance;
import net.minecraft.entity.vehicle.AbstractMinecartEntity;
import net.minecraft.entity.vehicle.VehicleEntity;
import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvent;
import net.minecraft.util.math.random.Random;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(MovingMinecartSoundInstance.class)
public abstract class MovingMinecartSoundInstanceMixin extends MovingSoundInstance {

@Shadow
@Final
private AbstractMinecartEntity minecart;

protected MovingMinecartSoundInstanceMixin(SoundEvent soundEvent, SoundCategory soundCategory, Random random) {
super(soundEvent, soundCategory, random);
}

@Inject(method = "tick", at = @At("TAIL"))
public void tick(CallbackInfo ci) {
if (!this.minecart.isRemoved()) {
var floatingComponent = ParadiseLostComponents.FLOATING_KEY.get(this.minecart);
if (floatingComponent.getFloating()) {
this.volume = 0.0F;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,21 @@

import net.id.paradiselost.client.rendering.particle.ParadiseLostParticles;
import net.id.paradiselost.component.ParadiseLostComponents;
import net.minecraft.block.AbstractRailBlock;
import net.minecraft.block.BlockState;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.MovementType;
import net.minecraft.entity.vehicle.AbstractMinecartEntity;
import net.minecraft.entity.vehicle.VehicleEntity;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.sound.SoundEvents;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
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.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
Expand All @@ -25,10 +29,10 @@ public AbstractMinecartEntityMixin(EntityType<?> entityType, World world) {
}

@Shadow
private boolean onRail;
protected abstract double getMaxSpeed();

@Shadow
protected abstract double getMaxSpeed();
public abstract boolean isOnRail();

@Inject(method = "moveOffRail", at = @At("HEAD"), cancellable = true)
protected void moveOffRail(CallbackInfo ci) {
Expand All @@ -45,10 +49,10 @@ protected void moveOffRail(CallbackInfo ci) {
}
}

@Inject(method = "tick", at = @At("HEAD"))
@Inject(method = "tick", at = @At("RETURN"))
public void tick(CallbackInfo ci) {
var floatingComponent = ParadiseLostComponents.FLOATING_KEY.get(this);
if (this.getWorld().isClient && !this.onRail && floatingComponent.getFloating()) {
if (this.getWorld().isClient && !floatingComponent.isCartOnRail((AbstractMinecartEntity) (VehicleEntity) this) && floatingComponent.getFloating()) {
var pos = this.getPos();
var rightParticlePos = pos.add(this.getVelocity().normalize().multiply(0.35F).rotateY(1.57F));
var leftParticlePos = pos.add(this.getVelocity().normalize().multiply(0.35F).rotateY(-1.57F));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ public final class ParadiseLostSoundEvents {
public static final SoundEvent ENTITY_ENVOY_ENLIGHTENED_DEATH = register(("entity.envoy.enlightened.death"));
public static final SoundEvent ENTITY_ENVOY_ENLIGHTENED_STEP = register(("entity.envoy.enlightened.step"));

public static final SoundEvent ENTITY_MINECART_INSIDE_LEVITATING = register(("entity.minecart.inside_levitating"));
public static final SoundEvent ENTITY_MINECART_ROLLING_LEVITATING = register(("entity.minecart.rolling_levitating"));

public static final SoundEvent ENTITY_NITRA_THROW = register("entity.nitra.throw");

public static final SoundEvent MUSIC_PARADISE_LOST = register("music.paradise");
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/asset_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ def generate_slab_block(block_id, base_block_id, texture):



generate_standard_block("floestone_redstone_ore")
generate_standard_item("totem_of_levitation")



2 changes: 2 additions & 0 deletions src/main/resources/assets/paradise_lost/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,8 @@
"subtitles.paradise_lost.entity.envoy.enlightened.hurt": "Enlightened hurts",
"subtitles.paradise_lost.entity.envoy.enlightened.death": "Enlightened dies",

"subtitles.paradise_lost.entity.minecart.inside_levitating": "Minecart twinkles",
"subtitles.paradise_lost.entity.minecart.rolling_levitating": "Minecart twinkles",


"subtitles.paradise_lost.entity.nitra.throw": "Nitra Flies",
Expand Down
12 changes: 12 additions & 0 deletions src/main/resources/assets/paradise_lost/sounds.json
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,18 @@
],
"subtitle": "subtitles.paradise_lost.entity.envoy.enlightened.death"
},
"entity.minecart.inside_levitating": {
"sounds": [
"paradise_lost:entity/minecart/inside_levitating"
],
"subtitle": "subtitles.paradise_lost.entity.minecart.inside_levitating"
},
"entity.minecart.rolling_levitating": {
"sounds": [
"paradise_lost:entity/minecart/rolling_levitating"
],
"subtitle": "subtitles.paradise_lost.entity.minecart.rolling_levitating"
},



Expand Down
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
2 changes: 2 additions & 0 deletions src/main/resources/paradise_lost.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
"client.ClientWorldMixin",
"client.MinecraftClientMixin",
"client.network.ClientPlayerEntityMixin",
"client.network.ClientPlayNetworkHandlerMixin",
"client.render.BackgroundRendererMixin",
"client.render.ClientWorldPropertiesMixin",
"client.render.CloudRendererMixin",
Expand All @@ -53,6 +54,7 @@
"client.render.NativeImageAccessor",
"client.render.PlayerHeldItemFeatureRendererMixin",
"client.render.WorldRendererMixin",
"client.sound.MovingMinecartSoundInstanceMixin",
"devel.client.HandledScreenMixin"
],
"injectors": {
Expand Down

0 comments on commit 2255eb8

Please sign in to comment.