diff --git a/src/main/java/dan200/computercraft/ComputerCraft.java b/src/main/java/dan200/computercraft/ComputerCraft.java index 210af293e..18b951fde 100644 --- a/src/main/java/dan200/computercraft/ComputerCraft.java +++ b/src/main/java/dan200/computercraft/ComputerCraft.java @@ -164,6 +164,7 @@ public class ComputerCraft public static TurtleAxe diamondAxe; public static TurtleHoe diamondHoe; public static TurtleModem advancedModem; + public static TurtleSpeaker turtleSpeaker; } public static class PocketUpgrades diff --git a/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java b/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java index bf096a422..78ce71267 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java @@ -13,6 +13,8 @@ import dan200.computercraft.api.peripheral.IPeripheral; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvent; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; public class SpeakerPeripheral implements IPeripheral { @@ -20,18 +22,33 @@ public class SpeakerPeripheral implements IPeripheral { private long m_clock; private long m_lastPlayTime; - public SpeakerPeripheral(TileSpeaker speaker) + public SpeakerPeripheral() { - m_speaker = speaker; m_clock = 0; m_lastPlayTime = 0; } - void updateClock() + public SpeakerPeripheral(TileSpeaker speaker) + { + this(); + m_speaker = speaker; + } + + public void updateClock() { m_clock++; } + public World getWorld() + { + return m_speaker.getWorld(); + } + + public BlockPos getPos() + { + return m_speaker.getPos(); + } + /* IPeripheral implementations */ @Override @@ -197,7 +214,7 @@ public class SpeakerPeripheral implements IPeripheral { if (SoundEvent.REGISTRY.containsKey(resourceName)) { - m_speaker.getWorld().playSound(null, m_speaker.getPos(), new SoundEvent(resourceName), SoundCategory.RECORDS, volume, pitch); + getWorld().playSound(null, getPos(), new SoundEvent(resourceName), SoundCategory.RECORDS, volume, pitch); m_lastPlayTime = m_clock; return new Object[]{true}; // Success, return true } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/speaker/TileSpeaker.java b/src/main/java/dan200/computercraft/shared/peripheral/speaker/TileSpeaker.java index b74ac4a47..94a2b2243 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/speaker/TileSpeaker.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/speaker/TileSpeaker.java @@ -6,18 +6,17 @@ package dan200.computercraft.shared.peripheral.speaker; -import dan200.computercraft.api.peripheral.IComputerAccess; -import dan200.computercraft.api.peripheral.IPeripheral; -import dan200.computercraft.shared.peripheral.common.TilePeripheralBase; -import net.minecraft.util.EnumFacing; + import dan200.computercraft.api.peripheral.IPeripheral; + import dan200.computercraft.shared.peripheral.common.TilePeripheralBase; + import net.minecraft.util.EnumFacing; public class TileSpeaker extends TilePeripheralBase { // Statics - public static final int MIN_TICKS_BETWEEN_SOUNDS = 1; + static final int MIN_TICKS_BETWEEN_SOUNDS = 1; // Members - private SpeakerPeripheral m_peripheral; + private SpeakerPeripheral m_peripheral; // TODO what happens when multiple computers wrap one peripheral? public TileSpeaker() { diff --git a/src/main/java/dan200/computercraft/shared/proxy/CCTurtleProxyCommon.java b/src/main/java/dan200/computercraft/shared/proxy/CCTurtleProxyCommon.java index 784633e16..f36f8eaf8 100644 --- a/src/main/java/dan200/computercraft/shared/proxy/CCTurtleProxyCommon.java +++ b/src/main/java/dan200/computercraft/shared/proxy/CCTurtleProxyCommon.java @@ -10,6 +10,7 @@ import dan200.computercraft.ComputerCraft; import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.items.ComputerItemFactory; +import dan200.computercraft.shared.peripheral.speaker.SpeakerPeripheral; import dan200.computercraft.shared.turtle.blocks.BlockTurtle; import dan200.computercraft.shared.turtle.blocks.TileTurtle; import dan200.computercraft.shared.turtle.blocks.TileTurtleAdvanced; @@ -124,7 +125,7 @@ public abstract class CCTurtleProxyCommon implements ICCTurtleProxy public static boolean isUpgradeVanilla( ITurtleUpgrade upgrade ) { - return upgrade instanceof TurtleTool || upgrade instanceof TurtleModem || upgrade instanceof TurtleCraftingTable; + return upgrade instanceof TurtleTool || upgrade instanceof TurtleModem || upgrade instanceof TurtleCraftingTable || upgrade instanceof TurtleSpeaker; } public static boolean isUpgradeSuitableForFamily( ComputerFamily family, ITurtleUpgrade upgrade ) @@ -404,8 +405,12 @@ public abstract class CCTurtleProxyCommon implements ICCTurtleProxy ComputerCraft.Upgrades.diamondHoe = new TurtleHoe( new ResourceLocation( "minecraft", "diamond_hoe" ), 7, "upgrade.minecraft:diamond_hoe.adjective", Items.DIAMOND_HOE ); registerTurtleUpgradeInternal( ComputerCraft.Upgrades.diamondHoe ); - ComputerCraft.Upgrades.advancedModem = new TurtleModem( true, new ResourceLocation( "computercraft", "advanced_modem" ), -1 ); + ComputerCraft.Upgrades.advancedModem = new TurtleModem( true, new ResourceLocation( "computercraft", "advanced_modem" ), -1 ); registerTurtleUpgradeInternal( ComputerCraft.Upgrades.advancedModem ); + + ComputerCraft.Upgrades.turtleSpeaker = new TurtleSpeaker( new ResourceLocation( "computercraft", "speaker" ), 8 ); + registerTurtleUpgradeInternal( ComputerCraft.Upgrades.turtleSpeaker ); + } @Override diff --git a/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSpeaker.java b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSpeaker.java new file mode 100644 index 000000000..a83e5f193 --- /dev/null +++ b/src/main/java/dan200/computercraft/shared/turtle/upgrades/TurtleSpeaker.java @@ -0,0 +1,168 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2016. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ + + +package dan200.computercraft.shared.turtle.upgrades; + +import dan200.computercraft.api.peripheral.IPeripheral; +import dan200.computercraft.api.turtle.*; +import dan200.computercraft.shared.peripheral.PeripheralType; +import dan200.computercraft.shared.peripheral.common.PeripheralItemFactory; +import dan200.computercraft.shared.peripheral.speaker.SpeakerPeripheral; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.client.renderer.block.model.ModelManager; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.apache.commons.lang3.tuple.Pair; + +import javax.annotation.Nonnull; +import javax.vecmath.Matrix4f; + +public class TurtleSpeaker implements ITurtleUpgrade +{ + private static class Peripheral extends SpeakerPeripheral + { + // Members + ITurtleAccess m_turtle; + + public Peripheral(ITurtleAccess turtle) + { + super(); + m_turtle = turtle; + } + + @Override + public World getWorld() + { + return m_turtle.getWorld(); + } + + @Override + public BlockPos getPos() + { + return m_turtle.getPosition(); + } + + @Override + public boolean equals(IPeripheral other) + { + if (other instanceof Peripheral) + { + Peripheral otherPeripheral = (Peripheral) other; + return otherPeripheral.m_turtle == m_turtle; + } + + return false; + } + } + + // Members + ResourceLocation m_id; + int m_legacyID; + Peripheral m_peripheral; + + @SideOnly( Side.CLIENT ) + private ModelResourceLocation m_leftModel; + + @SideOnly( Side.CLIENT ) + private ModelResourceLocation m_rightModel; + + public TurtleSpeaker(ResourceLocation id, int legacyId ) + { + m_id = id; + m_legacyID = legacyId; + } + + @Nonnull + @Override + public ResourceLocation getUpgradeID() + { + return m_id; + } + + @Override + public int getLegacyUpgradeID() + { + return m_legacyID; + } + + @Nonnull + @Override + public String getUnlocalisedAdjective() + { + return "upgrade.computercraft:speaker.adjective"; + } + + @Nonnull + @Override + public TurtleUpgradeType getType() + { + return TurtleUpgradeType.Peripheral; + } + + @Override + public ItemStack getCraftingItem() + { + return PeripheralItemFactory.create( PeripheralType.Speaker, null, 1 ); + } + + @Override + public IPeripheral createPeripheral( @Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side ) + { + m_peripheral = new TurtleSpeaker.Peripheral( turtle ); + return m_peripheral; // TODO does this go in constructor? + } + + @Nonnull + @Override + public TurtleCommandResult useTool(@Nonnull ITurtleAccess turtleAccess, @Nonnull TurtleSide turtleSide, @Nonnull TurtleVerb verb, @Nonnull EnumFacing direction) + { + return null; + } + + @SideOnly( Side.CLIENT ) + private void loadModelLocations() + { + if( m_leftModel == null ) + { + m_leftModel = new ModelResourceLocation( "computercraft:turtle_speaker_upgrade_left", "inventory" ); + m_rightModel = new ModelResourceLocation( "computercraft:turtle_speaker_upgrade_right", "inventory" ); + } + } + + @Nonnull + @Override + @SideOnly( Side.CLIENT ) + public Pair getModel(ITurtleAccess turtle, @Nonnull TurtleSide side ) { + + loadModelLocations(); + ModelManager modelManager = Minecraft.getMinecraft().getRenderItem().getItemModelMesher().getModelManager(); + + if (side == TurtleSide.Left) + { + return Pair.of(modelManager.getModel( m_leftModel ), null); + } + + else + { + return Pair.of(modelManager.getModel( m_rightModel ), null); + } + + } + + @Override + public void update(@Nonnull ITurtleAccess turtleAccess, @Nonnull TurtleSide turtleSide) + { + m_peripheral.updateClock(); + } +} diff --git a/src/main/resources/assets/computercraft/lang/en_US.lang b/src/main/resources/assets/computercraft/lang/en_US.lang index 11e5c0693..c336c33b4 100644 --- a/src/main/resources/assets/computercraft/lang/en_US.lang +++ b/src/main/resources/assets/computercraft/lang/en_US.lang @@ -37,6 +37,7 @@ upgrade.minecraft:diamond_hoe.adjective=Farming upgrade.computercraft:wireless_modem.adjective=Wireless upgrade.minecraft:crafting_table.adjective=Crafty upgrade.computercraft:advanced_modem.adjective=Ender +upgrade.computercraft:speaker.adjective=Noisy gui.computercraft:wired_modem.peripheral_connected=Peripheral "%s" connected to network gui.computercraft:wired_modem.peripheral_disconnected=Peripheral "%s" disconnected from network