Skip to content

Commit

Permalink
Fix a few issues with sound (#5561)
Browse files Browse the repository at this point in the history
* Fix PlayerSounds sometimes having a null player #5560, also fix flame thrower sounds not actually playing

* Add todo comment and remove extra null check

* Cleanup a couple checks in TickHandler

* Cleanup some more tick handler methods

* Only store EntityPlayer as a WeakReference for sound, and sync flamethrower users

* Fix flamethrower idle sound not playing when first holding a flamethrower client side

* Don't lookup the EntityPlayer object if not needed

* make fade up actually fade
  • Loading branch information
pupnewfster committed Jul 20, 2019
1 parent e335220 commit c5fbabe
Show file tree
Hide file tree
Showing 15 changed files with 341 additions and 208 deletions.
2 changes: 1 addition & 1 deletion src/main/java/mekanism/client/ClientPlayerTracker.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class ClientPlayerTracker {

@SubscribeEvent
public void onPlayerChangedDimension(PlayerChangedDimensionEvent event) {
Mekanism.playerState.clearPlayer(event.player);
Mekanism.playerState.clearPlayer(event.player.getUniqueID());
Mekanism.freeRunnerOn.remove(event.player.getUniqueID());
}
}
130 changes: 55 additions & 75 deletions src/main/java/mekanism/client/ClientTickHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;
import java.util.UUID;
import mekanism.api.IClientTicker;
import mekanism.api.gas.GasStack;
import mekanism.client.render.RenderTickHandler;
Expand All @@ -20,7 +21,6 @@
import mekanism.common.item.ItemConfigurator.ConfiguratorMode;
import mekanism.common.item.ItemFlamethrower;
import mekanism.common.item.ItemFreeRunners;
import mekanism.common.item.ItemGasMask;
import mekanism.common.item.ItemJetpack;
import mekanism.common.item.ItemJetpack.JetpackMode;
import mekanism.common.item.ItemScubaTank;
Expand Down Expand Up @@ -67,21 +67,20 @@ public static boolean isJetpackActive(EntityPlayer player) {
if (player != mc.player) {
return Mekanism.playerState.isJetpackOn(player);
}

ItemStack stack = player.inventory.armorInventory.get(2);

if (!stack.isEmpty() && !(player.isCreative() || player.isSpectator())) {
if (stack.getItem() instanceof ItemJetpack) {
ItemJetpack jetpack = (ItemJetpack) stack.getItem();

if (jetpack.getGas(stack) != null) {
if (mc.gameSettings.keyBindJump.isKeyDown() && jetpack.getMode(stack) == JetpackMode.NORMAL && mc.currentScreen == null) {
return true;
} else if (jetpack.getMode(stack) == JetpackMode.HOVER) {
if ((!mc.gameSettings.keyBindJump.isKeyDown() && !mc.gameSettings.keyBindSneak.isKeyDown()) ||
(mc.gameSettings.keyBindJump.isKeyDown() && mc.gameSettings.keyBindSneak.isKeyDown()) || mc.currentScreen != null) {
return !CommonPlayerTickHandler.isOnGround(player);
} else if (mc.gameSettings.keyBindSneak.isKeyDown() && mc.currentScreen == null) {
if (!player.isCreative() && !player.isSpectator()) {
ItemStack chest = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST);
if (!chest.isEmpty() && chest.getItem() instanceof ItemJetpack) {
ItemJetpack jetpack = (ItemJetpack) chest.getItem();
if (jetpack.getGas(chest) != null) {
JetpackMode mode = jetpack.getMode(chest);
if (mode == JetpackMode.NORMAL) {
return mc.currentScreen == null && mc.gameSettings.keyBindJump.isKeyDown();
} else if (mode == JetpackMode.HOVER) {
boolean ascending = mc.gameSettings.keyBindJump.isKeyDown();
boolean descending = mc.gameSettings.keyBindSneak.isKeyDown();
//if ((!ascending && !descending) || (ascending && descending) || mc.currentScreen != null || (descending && mc.currentScreen == null))
//Simplifies to
if (!ascending || descending || mc.currentScreen != null) {
return !CommonPlayerTickHandler.isOnGround(player);
}
return true;
Expand All @@ -96,17 +95,7 @@ public static boolean isGasMaskOn(EntityPlayer player) {
if (player != mc.player) {
return Mekanism.playerState.isGasmaskOn(player);
}
ItemStack tank = player.inventory.armorInventory.get(2);
ItemStack mask = player.inventory.armorInventory.get(3);
if (!tank.isEmpty() && !mask.isEmpty()) {
if (tank.getItem() instanceof ItemScubaTank && mask.getItem() instanceof ItemGasMask) {
ItemScubaTank scubaTank = (ItemScubaTank) tank.getItem();
if (scubaTank.getGas(tank) != null) {
return scubaTank.getFlowing(tank);
}
}
}
return false;
return CommonPlayerTickHandler.isGasMaskOn(player);
}

public static boolean isFreeRunnerOn(EntityPlayer player) {
Expand All @@ -127,25 +116,23 @@ public static boolean isFlamethrowerOn(EntityPlayer player) {
if (player != mc.player) {
return Mekanism.playerState.isFlamethrowerOn(player);
}
if (hasFlamethrower(player)) {
return mc.gameSettings.keyBindUseItem.isKeyDown();
}
return false;
return hasFlamethrower(player) && mc.gameSettings.keyBindUseItem.isKeyDown();
}

public static boolean hasFlamethrower(EntityPlayer player) {
if (!player.inventory.getCurrentItem().isEmpty() && player.inventory.getCurrentItem().getItem() instanceof ItemFlamethrower) {
ItemFlamethrower flamethrower = (ItemFlamethrower) player.inventory.getCurrentItem().getItem();
return flamethrower.getGas(player.inventory.getCurrentItem()) != null;
ItemStack currentItem = player.inventory.getCurrentItem();
if (!currentItem.isEmpty() && currentItem.getItem() instanceof ItemFlamethrower) {
return ((ItemFlamethrower) currentItem.getItem()).getGas(currentItem) != null;
}
return false;
}

public static void portableTeleport(EntityPlayer player, EnumHand hand, Frequency freq) {
if (MekanismConfig.current().general.portableTeleporterDelay.val() == 0) {
int delay = MekanismConfig.current().general.portableTeleporterDelay.val();
if (delay == 0) {
Mekanism.packetHandler.sendToServer(new PortableTeleporterMessage(PortableTeleporterPacketType.TELEPORT, hand, freq));
} else {
portableTeleports.put(player, new TeleportData(hand, freq, mc.world.getWorldTime() + MekanismConfig.current().general.portableTeleporterDelay.val()));
portableTeleports.put(player, new TeleportData(hand, freq, mc.world.getWorldTime() + delay));
}
}

Expand Down Expand Up @@ -179,44 +166,42 @@ public void tickStart() {
}

if (mc.world != null && mc.player != null && !Mekanism.proxy.isPaused()) {
if ((!initHoliday || MekanismClient.ticksPassed % 1200 == 0) && mc.player != null) {
if (!initHoliday || MekanismClient.ticksPassed % 1200 == 0) {
HolidayManager.check();
initHoliday = true;
}

if (Mekanism.freeRunnerOn.contains(mc.player.getUniqueID()) != isFreeRunnerOn(mc.player)) {
if (isFreeRunnerOn(mc.player) && mc.currentScreen == null) {
Mekanism.freeRunnerOn.add(mc.player.getUniqueID());
UUID playerUUID = mc.player.getUniqueID();
boolean freeRunnerOn = isFreeRunnerOn(mc.player);
if (Mekanism.freeRunnerOn.contains(playerUUID) != freeRunnerOn) {
if (freeRunnerOn && mc.currentScreen == null) {
Mekanism.freeRunnerOn.add(playerUUID);
} else {
Mekanism.freeRunnerOn.remove(mc.player.getUniqueID());
Mekanism.freeRunnerOn.remove(playerUUID);
}

Mekanism.packetHandler.sendToServer(new PacketFreeRunnerData.FreeRunnerDataMessage(PacketFreeRunnerData.FreeRunnerPacket.UPDATE,
mc.player.getUniqueID(), isFreeRunnerOn(mc.player)));
Mekanism.packetHandler.sendToServer(new PacketFreeRunnerData.FreeRunnerDataMessage(PacketFreeRunnerData.FreeRunnerPacket.UPDATE, playerUUID, freeRunnerOn));
}

ItemStack bootStack = mc.player.getItemStackFromSlot(EntityEquipmentSlot.FEET);

if (!bootStack.isEmpty() && bootStack.getItem() instanceof ItemFreeRunners && isFreeRunnerOn(mc.player) && !mc.player.isSneaking()) {
if (!bootStack.isEmpty() && bootStack.getItem() instanceof ItemFreeRunners && freeRunnerOn && !mc.player.isSneaking()) {
mc.player.stepHeight = 1.002F;
} else if (mc.player.stepHeight == 1.002F) {
mc.player.stepHeight = 0.6F;
}

// Update player's state for various items; this also automatically notifies server if something changed and
// kicks off sounds as necessary
Mekanism.playerState.setJetpackState(mc.player.getUniqueID(), isJetpackActive(mc.player), true);
Mekanism.playerState.setGasmaskState(mc.player.getUniqueID(), isGasMaskOn(mc.player), true);
Mekanism.playerState.setFlamethrowerState(mc.player.getUniqueID(), isFlamethrowerOn(mc.player), true);
Mekanism.playerState.setJetpackState(playerUUID, isJetpackActive(mc.player), true);
Mekanism.playerState.setGasmaskState(playerUUID, isGasMaskOn(mc.player), true);
Mekanism.playerState.setFlamethrowerState(playerUUID, hasFlamethrower(mc.player), isFlamethrowerOn(mc.player), true);

for (Iterator<Entry<EntityPlayer, TeleportData>> iter = portableTeleports.entrySet().iterator(); iter.hasNext(); ) {
Entry<EntityPlayer, TeleportData> entry = iter.next();

EntityPlayer player = entry.getKey();
for (int i = 0; i < 100; i++) {
double x = entry.getKey().posX + rand.nextDouble() - 0.5D;
double y = entry.getKey().posY + rand.nextDouble() * 2 - 2D;
double z = entry.getKey().posZ + rand.nextDouble() - 0.5D;

double x = player.posX + rand.nextDouble() - 0.5D;
double y = player.posY + rand.nextDouble() * 2 - 2D;
double z = player.posZ + rand.nextDouble() - 0.5D;
mc.world.spawnParticle(EnumParticleTypes.PORTAL, x, y, z, 0, 1, 0);
}

Expand All @@ -233,37 +218,34 @@ public void tickStart() {
MekanismClient.updateKey(mc.gameSettings.keyBindSneak, KeySync.DESCEND);
}

if (isFlamethrowerOn(mc.player)) {
ItemFlamethrower flamethrower = (ItemFlamethrower) mc.player.inventory.getCurrentItem().getItem();
if (!(mc.player.isCreative() || mc.player.isSpectator())) {
if (!mc.player.isCreative() && !mc.player.isSpectator()) {
if (isFlamethrowerOn(mc.player)) {
ItemFlamethrower flamethrower = (ItemFlamethrower) mc.player.inventory.getCurrentItem().getItem();
flamethrower.useGas(mc.player.inventory.getCurrentItem());
}
}

if (isJetpackActive(mc.player)) {
ItemJetpack jetpack = (ItemJetpack) chestStack.getItem();

if (jetpack.getMode(chestStack) == JetpackMode.NORMAL) {
JetpackMode mode = jetpack.getMode(chestStack);
if (mode == JetpackMode.NORMAL) {
mc.player.motionY = Math.min(mc.player.motionY + 0.15D, 0.5D);
mc.player.fallDistance = 0.0F;
} else if (jetpack.getMode(chestStack) == JetpackMode.HOVER) {
if ((!mc.gameSettings.keyBindJump.isKeyDown() && !mc.gameSettings.keyBindSneak.isKeyDown()) ||
(mc.gameSettings.keyBindJump.isKeyDown() && mc.gameSettings.keyBindSneak.isKeyDown()) || mc.currentScreen != null) {
} else if (mode == JetpackMode.HOVER) {
boolean ascending = mc.gameSettings.keyBindJump.isKeyDown();
boolean descending = mc.gameSettings.keyBindSneak.isKeyDown();
if ((!ascending && !descending) || (ascending && descending) || mc.currentScreen != null) {
if (mc.player.motionY > 0) {
mc.player.motionY = Math.max(mc.player.motionY - 0.15D, 0);
} else if (mc.player.motionY < 0) {
if (!CommonPlayerTickHandler.isOnGround(mc.player)) {
mc.player.motionY = Math.min(mc.player.motionY + 0.15D, 0);
}
}
} else {
if (mc.gameSettings.keyBindJump.isKeyDown() && mc.currentScreen == null) {
mc.player.motionY = Math.min(mc.player.motionY + 0.15D, 0.2D);
} else if (mc.gameSettings.keyBindSneak.isKeyDown() && mc.currentScreen == null) {
if (!CommonPlayerTickHandler.isOnGround(mc.player)) {
mc.player.motionY = Math.max(mc.player.motionY - 0.15D, -0.2D);
}
}
} else if (ascending) {
mc.player.motionY = Math.min(mc.player.motionY + 0.15D, 0.2D);
} else if (!CommonPlayerTickHandler.isOnGround(mc.player)) {
mc.player.motionY = Math.max(mc.player.motionY - 0.15D, -0.2D);
}
mc.player.fallDistance = 0.0F;
}
Expand All @@ -280,11 +262,9 @@ public void tickStart() {
mc.player.setAir(mc.player.getAir() + received.amount);
}
if (mc.player.getAir() == max) {
for (Object obj : mc.player.getActivePotionEffects()) {
if (obj instanceof PotionEffect) {
for (int i = 0; i < 9; i++) {
((PotionEffect) obj).onUpdate(mc.player);
}
for (PotionEffect effect : mc.player.getActivePotionEffects()) {
for (int i = 0; i < 9; i++) {
effect.onUpdate(mc.player);
}
}
}
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/mekanism/client/MekanismKeyHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import mekanism.common.item.ItemScubaTank;
import mekanism.common.item.ItemWalkieTalkie;
import mekanism.common.network.PacketFlamethrowerData.FlamethrowerDataMessage;
import mekanism.common.network.PacketFlamethrowerData.FlamethrowerPacket;
import mekanism.common.network.PacketFreeRunnerData;
import mekanism.common.network.PacketFreeRunnerData.FreeRunnerDataMessage;
import mekanism.common.network.PacketItemStack.ItemStackMessage;
Expand Down Expand Up @@ -120,7 +119,7 @@ public void keyDown(KeyBinding kb, boolean isRepeat) {
} else if (player.isSneaking() && item instanceof ItemFlamethrower) {
ItemFlamethrower flamethrower = (ItemFlamethrower) item;
flamethrower.incrementMode(toolStack);
Mekanism.packetHandler.sendToServer(new FlamethrowerDataMessage(FlamethrowerPacket.MODE, EnumHand.MAIN_HAND, null, false));
Mekanism.packetHandler.sendToServer(FlamethrowerDataMessage.MODE_CHANGE(EnumHand.MAIN_HAND));
player.sendMessage(new TextComponentGroup(TextFormatting.GRAY).string(Mekanism.LOG_TAG, TextFormatting.DARK_BLUE).string(" ")
.translation("mekanism.tooltip.flamethrower.modeBump", flamethrower.getMode(toolStack).getTextComponent()));
}
Expand Down
39 changes: 22 additions & 17 deletions src/main/java/mekanism/client/sound/FlamethrowerSound.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package mekanism.client.sound;

import javax.annotation.Nonnull;
import mekanism.client.ClientTickHandler;
import mekanism.common.Mekanism;
import net.minecraft.entity.player.EntityPlayer;
Expand All @@ -10,31 +11,35 @@
@SideOnly(Side.CLIENT)
public class FlamethrowerSound extends PlayerSound {

private static ResourceLocation IDLE_SOUND = new ResourceLocation(Mekanism.MODID, "item.flamethrower.idle");
private static ResourceLocation ON_SOUND = new ResourceLocation(Mekanism.MODID, "item.flamethrower.active");
private static ResourceLocation OFF_SOUND = new ResourceLocation(Mekanism.MODID, "item.flamethrower.active");
private static final ResourceLocation IDLE_SOUND = new ResourceLocation(Mekanism.MODID, "item.flamethrower.idle");
private static final ResourceLocation ON_SOUND = new ResourceLocation(Mekanism.MODID, "item.flamethrower.active");

private boolean inUse;
private boolean active;

public FlamethrowerSound(EntityPlayer player) {
super(player, IDLE_SOUND);
inUse = ClientTickHandler.isFlamethrowerOn(player);
this.positionedSoundLocation = inUse ? ON_SOUND : OFF_SOUND;
private FlamethrowerSound(@Nonnull EntityPlayer player, boolean active) {
super(player, active ? ON_SOUND : IDLE_SOUND);
this.active = active;
}

@Override
public boolean shouldPlaySound() {
boolean hasFlamethrower = ClientTickHandler.hasFlamethrower(player);
boolean isFlamethrowerOn = ClientTickHandler.isFlamethrowerOn(player);

if (!hasFlamethrower) {
public boolean shouldPlaySound(@Nonnull EntityPlayer player) {
if (!ClientTickHandler.hasFlamethrower(player)) {
return false;
}
return ClientTickHandler.isFlamethrowerOn(player) == active;
}

public static class Active extends FlamethrowerSound {

public Active(@Nonnull EntityPlayer player) {
super(player, true);
}
}

public static class Idle extends FlamethrowerSound {

if (inUse != isFlamethrowerOn) {
inUse = isFlamethrowerOn;
this.positionedSoundLocation = inUse ? ON_SOUND : OFF_SOUND;
public Idle(@Nonnull EntityPlayer player) {
super(player, false);
}
return true;
}
}
9 changes: 4 additions & 5 deletions src/main/java/mekanism/client/sound/GasMaskSound.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package mekanism.client.sound;

import javax.annotation.Nonnull;
import mekanism.client.ClientTickHandler;
import mekanism.common.Mekanism;
import mekanism.common.item.ItemGasMask;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.relauncher.Side;
Expand All @@ -13,13 +13,12 @@ public class GasMaskSound extends PlayerSound {

private static final ResourceLocation SOUND = new ResourceLocation(Mekanism.MODID, "item.gasMask");

public GasMaskSound(EntityPlayer player) {
public GasMaskSound(@Nonnull EntityPlayer player) {
super(player, SOUND);
}

@Override
public boolean shouldPlaySound() {
boolean hasGasMask = !player.inventory.armorInventory.get(3).isEmpty() && player.inventory.armorInventory.get(3).getItem() instanceof ItemGasMask;
return hasGasMask && ClientTickHandler.isGasMaskOn(player);
public boolean shouldPlaySound(@Nonnull EntityPlayer player) {
return ClientTickHandler.isGasMaskOn(player);
}
}
5 changes: 3 additions & 2 deletions src/main/java/mekanism/client/sound/JetpackSound.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package mekanism.client.sound;

import javax.annotation.Nonnull;
import mekanism.client.ClientTickHandler;
import mekanism.common.Mekanism;
import net.minecraft.entity.player.EntityPlayer;
Expand All @@ -12,12 +13,12 @@ public class JetpackSound extends PlayerSound {

private static final ResourceLocation SOUND = new ResourceLocation(Mekanism.MODID, "item.jetpack");

public JetpackSound(EntityPlayer player) {
public JetpackSound(@Nonnull EntityPlayer player) {
super(player, SOUND);
}

@Override
public boolean shouldPlaySound() {
public boolean shouldPlaySound(@Nonnull EntityPlayer player) {
return ClientTickHandler.isJetpackActive(player);
}
}

0 comments on commit c5fbabe

Please sign in to comment.