1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-05-05 00:44:13 +00:00

Added PocketSpeaker & corrected blockmodel for turtle speaker

This commit is contained in:
Restioson 2017-05-12 20:57:48 +02:00
parent 97a6679510
commit 093d2ea89f
15 changed files with 199 additions and 23 deletions

View File

@ -40,6 +40,7 @@ import dan200.computercraft.shared.peripheral.modem.WirelessNetwork;
import dan200.computercraft.shared.peripheral.printer.TilePrinter; import dan200.computercraft.shared.peripheral.printer.TilePrinter;
import dan200.computercraft.shared.pocket.items.ItemPocketComputer; import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
import dan200.computercraft.shared.pocket.peripherals.PocketModem; import dan200.computercraft.shared.pocket.peripherals.PocketModem;
import dan200.computercraft.shared.pocket.peripherals.PocketSpeaker;
import dan200.computercraft.shared.proxy.ICCTurtleProxy; import dan200.computercraft.shared.proxy.ICCTurtleProxy;
import dan200.computercraft.shared.proxy.IComputerCraftProxy; import dan200.computercraft.shared.proxy.IComputerCraftProxy;
import dan200.computercraft.shared.turtle.blocks.BlockTurtle; import dan200.computercraft.shared.turtle.blocks.BlockTurtle;
@ -132,6 +133,8 @@ public class ComputerCraft
public static int floppySpaceLimit = 125 * 1000; public static int floppySpaceLimit = 125 * 1000;
public static int maximumFilesOpen = 128; public static int maximumFilesOpen = 128;
public static int maxNotesPerTick = 8;
// Blocks and Items // Blocks and Items
public static class Blocks public static class Blocks
{ {
@ -171,6 +174,7 @@ public class ComputerCraft
{ {
public static PocketModem wirelessModem; public static PocketModem wirelessModem;
public static PocketModem advancedModem; public static PocketModem advancedModem;
public static PocketSpeaker pocketSpeaker;
} }
public static class Config { public static class Config {
@ -196,6 +200,8 @@ public class ComputerCraft
public static Property computerSpaceLimit; public static Property computerSpaceLimit;
public static Property floppySpaceLimit; public static Property floppySpaceLimit;
public static Property maximumFilesOpen; public static Property maximumFilesOpen;
public static Property maxNotesPerTick;
} }
// Registries // Registries
@ -287,6 +293,9 @@ public class ComputerCraft
Config.turtlesCanPush = Config.config.get( Configuration.CATEGORY_GENERAL, "turtlesCanPush", turtlesCanPush ); Config.turtlesCanPush = Config.config.get( Configuration.CATEGORY_GENERAL, "turtlesCanPush", turtlesCanPush );
Config.turtlesCanPush.setComment( "If set to true, Turtles will push entities out of the way instead of stopping if there is space to do so" ); Config.turtlesCanPush.setComment( "If set to true, Turtles will push entities out of the way instead of stopping if there is space to do so" );
Config.maxNotesPerTick = Config.config.get( Configuration.CATEGORY_GENERAL, "maxNotesPerTick", maxNotesPerTick );
Config.maxNotesPerTick.setComment( "Maximum amount of sounds a speaker can play at once" );
for (Property property : Config.config.getCategory( Configuration.CATEGORY_GENERAL ).getOrderedValues()) for (Property property : Config.config.getCategory( Configuration.CATEGORY_GENERAL ).getOrderedValues())
{ {
property.setLanguageKey( "gui.computercraft:config." + CaseFormat.LOWER_CAMEL.to( CaseFormat.LOWER_UNDERSCORE, property.getName() ) ); property.setLanguageKey( "gui.computercraft:config." + CaseFormat.LOWER_CAMEL.to( CaseFormat.LOWER_UNDERSCORE, property.getName() ) );
@ -326,6 +335,8 @@ public class ComputerCraft
turtlesObeyBlockProtection = Config.turtlesObeyBlockProtection.getBoolean(); turtlesObeyBlockProtection = Config.turtlesObeyBlockProtection.getBoolean();
turtlesCanPush = Config.turtlesCanPush.getBoolean(); turtlesCanPush = Config.turtlesCanPush.getBoolean();
maximumFilesOpen = Math.max(1, Config.maximumFilesOpen.getInt());
Config.config.save(); Config.config.save();
} }
@ -704,7 +715,7 @@ public class ComputerCraft
public static Iterable<IPocketUpgrade> getVanillaPocketUpgrades() { public static Iterable<IPocketUpgrade> getVanillaPocketUpgrades() {
List<IPocketUpgrade> upgrades = new ArrayList<IPocketUpgrade>(); List<IPocketUpgrade> upgrades = new ArrayList<IPocketUpgrade>();
for(IPocketUpgrade upgrade : pocketUpgrades.values()) { for(IPocketUpgrade upgrade : pocketUpgrades.values()) {
if(upgrade instanceof PocketModem) { if(upgrade instanceof PocketModem || upgrade instanceof PocketSpeaker) {
upgrades.add( upgrade ); upgrades.add( upgrade );
} }
} }

View File

@ -155,6 +155,8 @@ public class CCTurtleProxyClient extends CCTurtleProxyCommon
loadModel( event, "advanced_turtle_modem_on_left" ); loadModel( event, "advanced_turtle_modem_on_left" );
loadModel( event, "advanced_turtle_modem_off_right" ); loadModel( event, "advanced_turtle_modem_off_right" );
loadModel( event, "advanced_turtle_modem_on_right" ); loadModel( event, "advanced_turtle_modem_on_right" );
loadModel( event, "turtle_speaker_upgrade_left" );
loadModel( event, "turtle_speaker_upgrade_right" );
loadSmartModel( event, "turtle_dynamic", m_turtleSmartItemModel ); loadSmartModel( event, "turtle_dynamic", m_turtleSmartItemModel );
} }

View File

@ -6,6 +6,7 @@
package dan200.computercraft.shared.peripheral.speaker; package dan200.computercraft.shared.peripheral.speaker;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IComputerAccess;
@ -21,11 +22,13 @@ public class SpeakerPeripheral implements IPeripheral {
private TileSpeaker m_speaker; private TileSpeaker m_speaker;
private long m_clock; private long m_clock;
private long m_lastPlayTime; private long m_lastPlayTime;
private int m_notesThisTick;
public SpeakerPeripheral() public SpeakerPeripheral()
{ {
m_clock = 0; m_clock = 0;
m_lastPlayTime = 0; m_lastPlayTime = 0;
m_notesThisTick = 0;
} }
public SpeakerPeripheral(TileSpeaker speaker) public SpeakerPeripheral(TileSpeaker speaker)
@ -34,9 +37,9 @@ public class SpeakerPeripheral implements IPeripheral {
m_speaker = speaker; m_speaker = speaker;
} }
public void updateClock() public void update() {
{
m_clock++; m_clock++;
m_notesThisTick = 0;
} }
public World getWorld() public World getWorld()
@ -100,7 +103,7 @@ public class SpeakerPeripheral implements IPeripheral {
{ {
// playsound // playsound
case 0: { case 0: {
return playSound(args); return playSound(args, false);
} }
// playnote // playnote
@ -162,11 +165,15 @@ public class SpeakerPeripheral implements IPeripheral {
throw new LuaException("Expected string, number (optional), number (optional)"); throw new LuaException("Expected string, number (optional), number (optional)");
} }
return playSound(new Object[] {"block.note." + arguments[0], volume, Math.pow(2d, (pitch - 12) / 12d)}); // If the resource location for noteblock notes changes, this method call will need to be updated
Object[] returnValue = playSound(new Object[] {"block.note." + arguments[0], volume, Math.pow(2d, (pitch - 12) / 12d)}, true);
m_notesThisTick++;
return returnValue;
} }
private Object[] playSound(Object[] arguments) throws LuaException private Object[] playSound(Object[] arguments, boolean isNote) throws LuaException
{ {
float volume = 1f; float volume = 1f;
@ -209,7 +216,7 @@ public class SpeakerPeripheral implements IPeripheral {
ResourceLocation resourceName = new ResourceLocation((String) arguments[0]); ResourceLocation resourceName = new ResourceLocation((String) arguments[0]);
if (m_clock - m_lastPlayTime > TileSpeaker.MIN_TICKS_BETWEEN_SOUNDS) if (m_clock - m_lastPlayTime > TileSpeaker.MIN_TICKS_BETWEEN_SOUNDS || ((m_clock - m_lastPlayTime == 0) && (m_notesThisTick < ComputerCraft.maxNotesPerTick) && isNote))
{ {
if (SoundEvent.REGISTRY.containsKey(resourceName)) if (SoundEvent.REGISTRY.containsKey(resourceName))

View File

@ -26,7 +26,7 @@ public class TileSpeaker extends TilePeripheralBase
@Override @Override
public synchronized void update() { public synchronized void update() {
m_peripheral.updateClock(); m_peripheral.update();
} }
// IPeripheralTile implementation // IPeripheralTile implementation

View File

@ -0,0 +1,87 @@
/*
* 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.pocket.peripherals;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.pocket.IPocketAccess;
import dan200.computercraft.api.pocket.IPocketUpgrade;
import dan200.computercraft.shared.peripheral.PeripheralType;
import dan200.computercraft.shared.peripheral.common.PeripheralItemFactory;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class PocketSpeaker implements IPocketUpgrade
{
public PocketSpeaker()
{
}
@Nonnull
@Override
public ResourceLocation getUpgradeID()
{
return new ResourceLocation( "computercraft", "speaker" );
}
@Nonnull
@Override
public String getUnlocalisedAdjective()
{
return "upgrade.computercraft:speaker.adjective";
}
@Nullable
@Override
public ItemStack getCraftingItem()
{
return PeripheralItemFactory.create(PeripheralType.Speaker, null, 1);
}
@Nullable
@Override
public IPeripheral createPeripheral( @Nonnull IPocketAccess access )
{
return new PocketSpeakerPeripheral();
}
@Override
public void update( @Nonnull IPocketAccess access, @Nullable IPeripheral peripheral )
{
if ( peripheral instanceof PocketSpeakerPeripheral )
{
Entity entity = access.getEntity();
PocketSpeakerPeripheral speaker = (PocketSpeakerPeripheral) peripheral;
if ( entity instanceof EntityLivingBase)
{
EntityLivingBase player = (EntityLivingBase) entity;
speaker.setLocation( entity.getEntityWorld(), player.posX, player.posY + player.getEyeHeight(), player.posZ );
}
else if ( entity != null )
{
speaker.setLocation( entity.getEntityWorld(), entity.posX, entity.posY, entity.posZ );
}
speaker.update();
}
}
@Override
public boolean onRightClick(@Nonnull World world, @Nonnull IPocketAccess access, @Nullable IPeripheral peripheral )
{
return false;
}
}

View File

@ -0,0 +1,58 @@
/*
* 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.pocket.peripherals;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.shared.peripheral.speaker.SpeakerPeripheral;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public class PocketSpeakerPeripheral extends SpeakerPeripheral
{
private World m_world;
private BlockPos m_position;
public PocketSpeakerPeripheral()
{
super();
m_world = null;
m_position = new BlockPos( 0.0, 0.0, 0.0 );
}
public void setLocation( World world, double x, double y, double z )
{
m_position = new BlockPos( x, y, z );
if( m_world != world )
{
m_world = world;
}
}
@Override
public World getWorld()
{
return m_world;
}
@Override
public BlockPos getPos()
{
if( m_world != null )
{
return m_position;
}
return null;
}
@Override
public boolean equals( IPeripheral other )
{
// Sufficient because of use case: checking peripherals on individual pocket computers -- there will not be +1
return other instanceof PocketSpeakerPeripheral;
}
}

View File

@ -49,6 +49,7 @@ import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer;
import dan200.computercraft.shared.pocket.items.ItemPocketComputer; import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
import dan200.computercraft.shared.pocket.items.PocketComputerItemFactory; import dan200.computercraft.shared.pocket.items.PocketComputerItemFactory;
import dan200.computercraft.shared.pocket.peripherals.PocketModem; import dan200.computercraft.shared.pocket.peripherals.PocketModem;
import dan200.computercraft.shared.pocket.peripherals.PocketSpeaker;
import dan200.computercraft.shared.pocket.recipes.PocketComputerUpgradeRecipe; import dan200.computercraft.shared.pocket.recipes.PocketComputerUpgradeRecipe;
import dan200.computercraft.shared.turtle.blocks.TileTurtle; import dan200.computercraft.shared.turtle.blocks.TileTurtle;
import dan200.computercraft.shared.turtle.inventory.ContainerTurtle; import dan200.computercraft.shared.turtle.inventory.ContainerTurtle;
@ -453,6 +454,9 @@ public abstract class ComputerCraftProxyCommon implements IComputerCraftProxy
ComputerCraft.PocketUpgrades.advancedModem = new PocketModem( true ); ComputerCraft.PocketUpgrades.advancedModem = new PocketModem( true );
ComputerCraftAPI.registerPocketUpgrade( ComputerCraft.PocketUpgrades.advancedModem ); ComputerCraftAPI.registerPocketUpgrade( ComputerCraft.PocketUpgrades.advancedModem );
ComputerCraft.PocketUpgrades.pocketSpeaker = new PocketSpeaker();
ComputerCraftAPI.registerPocketUpgrade( ComputerCraft.PocketUpgrades.pocketSpeaker );
// Wireless Pocket Computer // Wireless Pocket Computer
GameRegistry.addRecipe( new PocketComputerUpgradeRecipe() ); GameRegistry.addRecipe( new PocketComputerUpgradeRecipe() );

View File

@ -24,7 +24,6 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.vecmath.Matrix4f; import javax.vecmath.Matrix4f;
@ -41,6 +40,12 @@ public class TurtleSpeaker implements ITurtleUpgrade
m_turtle = turtle; m_turtle = turtle;
} }
@Override
public void update()
{
super.update();
}
@Override @Override
public World getWorld() public World getWorld()
{ {
@ -67,9 +72,8 @@ public class TurtleSpeaker implements ITurtleUpgrade
} }
// Members // Members
ResourceLocation m_id; private ResourceLocation m_id;
int m_legacyID; private int m_legacyID;
Peripheral m_peripheral;
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
private ModelResourceLocation m_leftModel; private ModelResourceLocation m_leftModel;
@ -77,7 +81,7 @@ public class TurtleSpeaker implements ITurtleUpgrade
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
private ModelResourceLocation m_rightModel; private ModelResourceLocation m_rightModel;
public TurtleSpeaker(ResourceLocation id, int legacyId ) public TurtleSpeaker(ResourceLocation id, int legacyId)
{ {
m_id = id; m_id = id;
m_legacyID = legacyId; m_legacyID = legacyId;
@ -119,15 +123,14 @@ public class TurtleSpeaker implements ITurtleUpgrade
@Override @Override
public IPeripheral createPeripheral( @Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side ) public IPeripheral createPeripheral( @Nonnull ITurtleAccess turtle, @Nonnull TurtleSide side )
{ {
m_peripheral = new TurtleSpeaker.Peripheral( turtle ); return new TurtleSpeaker.Peripheral(turtle);
return m_peripheral; // TODO does this go in constructor?
} }
@Nonnull @Nonnull
@Override @Override
public TurtleCommandResult useTool(@Nonnull ITurtleAccess turtleAccess, @Nonnull TurtleSide turtleSide, @Nonnull TurtleVerb verb, @Nonnull EnumFacing direction) public TurtleCommandResult useTool(@Nonnull ITurtleAccess turtleAccess, @Nonnull TurtleSide turtleSide, @Nonnull TurtleVerb verb, @Nonnull EnumFacing direction)
{ {
return null; return TurtleCommandResult.failure();
} }
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
@ -161,8 +164,12 @@ public class TurtleSpeaker implements ITurtleUpgrade
} }
@Override @Override
public void update(@Nonnull ITurtleAccess turtleAccess, @Nonnull TurtleSide turtleSide) public void update(@Nonnull ITurtleAccess turtle, @Nonnull TurtleSide turtleSide)
{ {
m_peripheral.updateClock(); if (turtle.getPeripheral(turtleSide) instanceof Peripheral)
{
Peripheral peripheral = (Peripheral) turtle.getPeripheral(turtleSide);
peripheral.update();
}
} }
} }

View File

@ -1,8 +1,8 @@
{ {
"parent": "block/orientable", "parent": "block/orientable",
"textures": { "textures": {
"front": "computercraft:blocks/speakerFront", "front": "computercraft:blocks/speaker_front",
"side": "computercraft:blocks/speakerSide", "side": "computercraft:blocks/speaker_side",
"top": "computercraft:blocks/speakerTop" "top": "computercraft:blocks/speaker_top"
} }
} }

View File

@ -1,6 +1,6 @@
{ {
"parent": "computercraft:block/turtle_upgrade_base_left", "parent": "computercraft:block/turtle_upgrade_base_left",
"textures": { "textures": {
"texture": "computercraft:blocks/speakerFront" "texture": "computercraft:blocks/turtle_speaker_face"
} }
} }

View File

@ -1,6 +1,6 @@
{ {
"parent": "computercraft:block/turtle_upgrade_base_right", "parent": "computercraft:block/turtle_upgrade_base_right",
"textures": { "textures": {
"texture": "computercraft:blocks/speakerFront" "texture": "computercraft:blocks/turtle_speaker_face"
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 B