Added portable jukebox

This commit is contained in:
Ellpeck 2016-12-06 16:28:42 +01:00
parent 28eb55582f
commit a924004f10
17 changed files with 373 additions and 11 deletions

View file

@ -34,8 +34,7 @@ import de.ellpeck.actuallyadditions.mod.material.InitToolMaterials;
import de.ellpeck.actuallyadditions.mod.misc.BannerHelper;
import de.ellpeck.actuallyadditions.mod.misc.apiimpl.LaserRelayConnectionHandler;
import de.ellpeck.actuallyadditions.mod.misc.apiimpl.MethodHandler;
import de.ellpeck.actuallyadditions.mod.misc.SoundHandler;
import de.ellpeck.actuallyadditions.mod.misc.apiimpl.farmer.DefaultFarmerBehavior;
import de.ellpeck.actuallyadditions.mod.misc.sound.SoundHandler;
import de.ellpeck.actuallyadditions.mod.network.PacketHandler;
import de.ellpeck.actuallyadditions.mod.ore.InitOreDict;
import de.ellpeck.actuallyadditions.mod.proxy.IProxy;

View file

@ -14,6 +14,7 @@ import de.ellpeck.actuallyadditions.mod.blocks.BlockColoredLamp;
import de.ellpeck.actuallyadditions.mod.blocks.InitBlocks;
import de.ellpeck.actuallyadditions.mod.blocks.metalists.TheMiscBlocks;
import de.ellpeck.actuallyadditions.mod.config.values.ConfigBoolValues;
import de.ellpeck.actuallyadditions.mod.crafting.recipe.RecipeKeepDataShaped;
import de.ellpeck.actuallyadditions.mod.items.InitItems;
import de.ellpeck.actuallyadditions.mod.items.metalists.TheCrystals;
import de.ellpeck.actuallyadditions.mod.items.metalists.TheMiscItems;

View file

@ -11,6 +11,10 @@
package de.ellpeck.actuallyadditions.mod.crafting;
import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI;
import de.ellpeck.actuallyadditions.mod.crafting.recipe.RecipeKeepDataShaped;
import de.ellpeck.actuallyadditions.mod.crafting.recipe.RecipeKeepDataShapeless;
import de.ellpeck.actuallyadditions.mod.crafting.recipe.RecipePotionRingCharging;
import de.ellpeck.actuallyadditions.mod.crafting.recipe.RecipeSwitchJukeboxDisc;
import de.ellpeck.actuallyadditions.mod.fluids.InitFluids;
import de.ellpeck.actuallyadditions.mod.items.InitItems;
import de.ellpeck.actuallyadditions.mod.items.metalists.TheMiscItems;
@ -48,9 +52,11 @@ public final class InitCrafting{
RecipeSorter.register(ModUtil.MOD_ID+":recipeKeepDataShaped", RecipeKeepDataShaped.class, RecipeSorter.Category.SHAPED, "after:minecraft:shaped");
RecipeSorter.register(ModUtil.MOD_ID+":recipeKeepDataShapeless", RecipeKeepDataShapeless.class, RecipeSorter.Category.SHAPELESS, "after:minecraft:shapeless");
RecipeSorter.register(ModUtil.MOD_ID+":recipePotionRingCharging", RecipePotionRingCharging.class, RecipeSorter.Category.SHAPELESS, "after:minecraft:shapeless");
RecipeSorter.register(ModUtil.MOD_ID+":recipeSwitchJukeboxDisc", RecipeSwitchJukeboxDisc.class, RecipeSorter.Category.SHAPELESS, "after:minecraft:shapeless");
GameRegistry.addRecipe(new RecipePotionRingCharging());
RecipeSorter.register(ModUtil.MOD_ID+":recipePotionRingCharging", RecipePotionRingCharging.class, RecipeSorter.Category.SHAPELESS, "after:minecraft:shapeless");
GameRegistry.addRecipe(new RecipeSwitchJukeboxDisc());
}
}

View file

@ -15,6 +15,8 @@ import de.ellpeck.actuallyadditions.mod.blocks.metalists.TheColoredLampColors;
import de.ellpeck.actuallyadditions.mod.blocks.metalists.TheMiscBlocks;
import de.ellpeck.actuallyadditions.mod.config.values.ConfigBoolValues;
import de.ellpeck.actuallyadditions.mod.config.values.ConfigStringListValues;
import de.ellpeck.actuallyadditions.mod.crafting.recipe.RecipeKeepDataShaped;
import de.ellpeck.actuallyadditions.mod.crafting.recipe.RecipeKeepDataShapeless;
import de.ellpeck.actuallyadditions.mod.items.InitItems;
import de.ellpeck.actuallyadditions.mod.items.metalists.*;
import de.ellpeck.actuallyadditions.mod.util.RecipeUtil;

View file

@ -8,7 +8,7 @@
* © 2015-2016 Ellpeck
*/
package de.ellpeck.actuallyadditions.mod.crafting;
package de.ellpeck.actuallyadditions.mod.crafting.recipe;
import de.ellpeck.actuallyadditions.mod.util.ItemUtil;
import de.ellpeck.actuallyadditions.mod.util.StackUtil;

View file

@ -8,7 +8,7 @@
* © 2015-2016 Ellpeck
*/
package de.ellpeck.actuallyadditions.mod.crafting;
package de.ellpeck.actuallyadditions.mod.crafting.recipe;
import de.ellpeck.actuallyadditions.mod.util.ItemUtil;
import de.ellpeck.actuallyadditions.mod.util.StackUtil;

View file

@ -8,7 +8,7 @@
* © 2015-2016 Ellpeck
*/
package de.ellpeck.actuallyadditions.mod.crafting;
package de.ellpeck.actuallyadditions.mod.crafting.recipe;
import de.ellpeck.actuallyadditions.mod.items.ItemPotionRing;
import de.ellpeck.actuallyadditions.mod.util.StackUtil;
@ -78,7 +78,7 @@ public class RecipePotionRingCharging implements IRecipe{
@Override
public int getRecipeSize(){
return 0;
return 5;
}
@Override

View file

@ -0,0 +1,145 @@
/*
* This file ("RecipeSwitchJukeboxDisc.java") is part of the Actually Additions mod for Minecraft.
* It is created and owned by Ellpeck and distributed
* under the Actually Additions License to be found at
* http://ellpeck.de/actaddlicense
* View the source code at https://github.com/Ellpeck/ActuallyAdditions
*
* © 2015-2016 Ellpeck
*/
package de.ellpeck.actuallyadditions.mod.crafting.recipe;
import de.ellpeck.actuallyadditions.mod.items.ItemPortableJukebox;
import de.ellpeck.actuallyadditions.mod.util.ItemUtil;
import de.ellpeck.actuallyadditions.mod.util.StackUtil;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.Item;
import net.minecraft.item.ItemRecord;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
public class RecipeSwitchJukeboxDisc implements IRecipe{
@Override
public boolean matches(InventoryCrafting inv, World world){
ItemStack juke = StackUtil.getNull();
boolean foundDisc = false;
for(int i = 0; i < inv.getSizeInventory(); i++){
ItemStack stack = inv.getStackInSlot(i);
if(StackUtil.isValid(stack)){
if(stack.getItem() instanceof ItemPortableJukebox){
if(!StackUtil.isValid(juke)){
juke = stack;
}
else{
return false;
}
}
else if(stack.getItem() instanceof ItemRecord){
if(!foundDisc){
foundDisc = true;
}
else{
return false;
}
}
else{
return false;
}
}
}
if(StackUtil.isValid(juke)){
String disc = ItemPortableJukebox.getDisc(juke);
return (disc == null || disc.isEmpty()) == foundDisc;
}
else{
return false;
}
}
@Override
public ItemStack getCraftingResult(InventoryCrafting inv){
ItemStack disc = StackUtil.getNull();
ItemStack juke = StackUtil.getNull();
for(int i = 0; i < inv.getSizeInventory(); i++){
ItemStack stack = inv.getStackInSlot(i);
if(StackUtil.isValid(stack)){
if(stack.getItem() instanceof ItemPortableJukebox){
juke = stack.copy();
}
else{
disc = stack;
}
}
}
if(StackUtil.isValid(juke)){
if(StackUtil.isValid(disc)){
ResourceLocation reg = disc.getItem().getRegistryName();
if(reg != null){
ItemPortableJukebox.setDisc(juke, reg.toString());
}
}
else{
String onJuke = ItemPortableJukebox.getDisc(juke);
if(onJuke != null && !onJuke.isEmpty()){
Item itemOnJuke = Item.REGISTRY.getObject(new ResourceLocation(onJuke));
if(itemOnJuke != null){
disc = new ItemStack(itemOnJuke);
}
}
return disc;
}
}
return juke;
}
@Override
public int getRecipeSize(){
return 5;
}
@Override
public ItemStack getRecipeOutput(){
return StackUtil.getNull();
}
@Override
public NonNullList<ItemStack> getRemainingItems(InventoryCrafting inv){
NonNullList<ItemStack> remain = NonNullList.withSize(inv.getSizeInventory(), StackUtil.getNull());
int jukePlace = -1;
ItemStack juke = StackUtil.getNull();
boolean foundDisc = false;
for(int i = 0; i < inv.getSizeInventory(); i++){
ItemStack stack = inv.getStackInSlot(i);
if(StackUtil.isValid(stack)){
if(stack.getItem() instanceof ItemPortableJukebox){
juke = stack;
jukePlace = i;
}
else if(stack.getItem() instanceof ItemRecord){
foundDisc = true;
break;
}
}
}
if(!foundDisc && jukePlace >= 0 && StackUtil.isValid(juke)){
ItemStack copy = juke.copy();
ItemPortableJukebox.setDisc(copy, null);
remain.set(jukePlace, copy);
}
return remain;
}
}

View file

@ -166,6 +166,7 @@ public class CreativeTab extends CreativeTabs{
this.add(InitItems.itemSpawnerChanger);
this.add(InitItems.itemWaterBowl);
this.add(InitItems.itemPortableJukebox);
this.add(InitItems.itemDrill);
this.add(InitItems.itemDrillUpgradeSpeed);
this.add(InitItems.itemDrillUpgradeSpeedII);

View file

@ -193,10 +193,12 @@ public final class InitItems{
public static Item itemBag;
public static Item itemVoidBag;
public static Item itemFillingWand;
public static Item itemPortableJukebox;
public static void init(){
ModUtil.LOGGER.info("Initializing Items...");
itemPortableJukebox = new ItemPortableJukebox("item_portable_jukebox");
itemFillingWand = new ItemFillingWand("item_filling_wand");
itemBag = new ItemBag("item_bag", false);
itemVoidBag = new ItemBag("item_void_bag", true);

View file

@ -0,0 +1,122 @@
/*
* This file ("ItemPortableJukebox.java") is part of the Actually Additions mod for Minecraft.
* It is created and owned by Ellpeck and distributed
* under the Actually Additions License to be found at
* http://ellpeck.de/actaddlicense
* View the source code at https://github.com/Ellpeck/ActuallyAdditions
*
* © 2015-2016 Ellpeck
*/
package de.ellpeck.actuallyadditions.mod.items;
import de.ellpeck.actuallyadditions.mod.items.base.ItemBase;
import de.ellpeck.actuallyadditions.mod.network.PacketHandler;
import de.ellpeck.actuallyadditions.mod.network.PacketServerToClient;
import de.ellpeck.actuallyadditions.mod.util.ItemUtil;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemRecord;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.List;
public class ItemPortableJukebox extends ItemBase{
public ItemPortableJukebox(String name){
super(name);
this.setMaxStackSize(1);
}
@Override
@SideOnly(Side.CLIENT)
public boolean hasEffect(ItemStack stack){
return ItemUtil.isEnabled(stack);
}
@Override
public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand){
ItemStack stack = player.getHeldItem(hand);
if(!world.isRemote){
if(player.isSneaking()){
String disc = getDisc(stack);
if(disc != null && !disc.isEmpty()){
ItemUtil.changeEnabled(player, hand);
if(ItemUtil.isEnabled(stack)){
int slot = -1;
for(int i = 0; i < player.inventory.getSizeInventory(); i++){
if(player.inventory.getStackInSlot(i) == stack){
slot = i;
}
}
if(slot >= 0){
playSoundToAllAround(player, disc, slot);
}
}
}
}
}
return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, stack);
}
private static void playSoundToAllAround(EntityPlayer player, String disc, int slot){
NBTTagCompound compound = new NBTTagCompound();
compound.setString("Disc", disc);
compound.setUniqueId("PlayerId", player.getUniqueID());
compound.setInteger("Slot", slot);
PacketHandler.theNetwork.sendToAllAround(new PacketServerToClient(compound, PacketHandler.SEND_PORTABLE_JUKEBOX_SOUND_HANDLER), new NetworkRegistry.TargetPoint(player.world.provider.getDimension(), player.posX, player.posY, player.posZ, 32));
}
public static String getDisc(ItemStack stack){
if(stack.hasTagCompound()){
return stack.getTagCompound().getString("Disc");
}
return null;
}
public static void setDisc(ItemStack stack, String disc){
boolean hasTag = stack.hasTagCompound();
if(disc != null){
if(!hasTag){
stack.setTagCompound(new NBTTagCompound());
}
stack.getTagCompound().setString("Disc", disc);
}
else{
if(hasTag){
stack.getTagCompound().removeTag("Disc");
}
}
}
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, EntityPlayer playerIn, List<String> tooltip, boolean advanced){
String disc = getDisc(stack);
if(disc != null && !disc.isEmpty()){
Item item = Item.REGISTRY.getObject(new ResourceLocation(disc));
if(item instanceof ItemRecord){
tooltip.add("Disc: "+((ItemRecord)item).getRecordNameLocal());
return;
}
}
tooltip.add("No Disc");
}
}

View file

@ -0,0 +1,52 @@
/*
* This file ("MovingPlayerSound.java") is part of the Actually Additions mod for Minecraft.
* It is created and owned by Ellpeck and distributed
* under the Actually Additions License to be found at
* http://ellpeck.de/actaddlicense
* View the source code at https://github.com/Ellpeck/ActuallyAdditions
*
* © 2015-2016 Ellpeck
*/
package de.ellpeck.actuallyadditions.mod.misc.sound;
import de.ellpeck.actuallyadditions.mod.items.ItemPortableJukebox;
import de.ellpeck.actuallyadditions.mod.util.ItemUtil;
import de.ellpeck.actuallyadditions.mod.util.StackUtil;
import net.minecraft.client.audio.MovingSound;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@SideOnly(Side.CLIENT)
public class MovingPlayerSound extends MovingSound{
private final EntityPlayer player;
private final int playerInvSlot;
public MovingPlayerSound(SoundEvent sound, SoundCategory category, EntityPlayer player, int playerInvSlot){
super(sound, category);
this.player = player;
this.playerInvSlot = playerInvSlot;
}
@Override
public void update(){
if(!this.player.isDead){
ItemStack stack = this.player.inventory.getStackInSlot(this.playerInvSlot);
if(StackUtil.isValid(stack) && stack.getItem() instanceof ItemPortableJukebox){
if(ItemUtil.isEnabled(stack)){
this.xPosF = (float)this.player.posX;
this.yPosF = (float)this.player.posY;
this.zPosF = (float)this.player.posZ;
return;
}
}
}
this.donePlaying = true;
}
}

View file

@ -8,7 +8,7 @@
* © 2015-2016 Ellpeck
*/
package de.ellpeck.actuallyadditions.mod.misc;
package de.ellpeck.actuallyadditions.mod.misc.sound;
import de.ellpeck.actuallyadditions.mod.util.ModUtil;
import net.minecraft.util.ResourceLocation;

View file

@ -11,6 +11,7 @@
package de.ellpeck.actuallyadditions.mod.network;
import de.ellpeck.actuallyadditions.mod.data.PlayerData;
import de.ellpeck.actuallyadditions.mod.misc.sound.MovingPlayerSound;
import de.ellpeck.actuallyadditions.mod.network.gui.IButtonReactor;
import de.ellpeck.actuallyadditions.mod.network.gui.INumberReactor;
import de.ellpeck.actuallyadditions.mod.network.gui.IStringReactor;
@ -21,8 +22,13 @@ import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.item.Item;
import net.minecraft.item.ItemRecord;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
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;
import net.minecraftforge.common.DimensionManager;
@ -121,6 +127,31 @@ public final class PacketHandler{
}
}
};
public static final IDataHandler SEND_PORTABLE_JUKEBOX_SOUND_HANDLER = new IDataHandler(){
@Override
@SideOnly(Side.CLIENT)
public void handleData(NBTTagCompound compound){
String disc = compound.getString("Disc");
UUID playerId = compound.getUniqueId("PlayerId");
int slot = compound.getInteger("Slot");
Minecraft mc = Minecraft.getMinecraft();
EntityPlayer player = mc.world.getPlayerEntityByUUID(playerId);
if(player != null){
Item item = Item.REGISTRY.getObject(new ResourceLocation(disc));
if(item instanceof ItemRecord){
ItemRecord record = (ItemRecord)item;
SoundEvent sound = record.getSound();
if(sound != null){
mc.getSoundHandler().playSound(new MovingPlayerSound(sound, SoundCategory.RECORDS, player, slot));
mc.ingameGUI.setRecordPlayingMessage(record.getRecordNameLocal());
}
}
}
}
};
public static SimpleNetworkWrapper theNetwork;
public static void init(){
@ -135,5 +166,6 @@ public final class PacketHandler{
DATA_HANDLERS.add(GUI_NUMBER_TO_TILE_HANDLER);
DATA_HANDLERS.add(CHANGE_PLAYER_DATA_HANDLER);
DATA_HANDLERS.add(GUI_BUTTON_TO_CONTAINER_HANDLER);
DATA_HANDLERS.add(SEND_PORTABLE_JUKEBOX_SOUND_HANDLER);
}
}

View file

@ -14,7 +14,7 @@ import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI;
import de.ellpeck.actuallyadditions.api.internal.IAtomicReconstructor;
import de.ellpeck.actuallyadditions.api.lens.ILensItem;
import de.ellpeck.actuallyadditions.api.lens.Lens;
import de.ellpeck.actuallyadditions.mod.misc.SoundHandler;
import de.ellpeck.actuallyadditions.mod.misc.sound.SoundHandler;
import de.ellpeck.actuallyadditions.mod.util.AssetUtil;
import de.ellpeck.actuallyadditions.mod.util.StackUtil;
import de.ellpeck.actuallyadditions.mod.util.WorldUtil;

View file

@ -14,7 +14,7 @@ import de.ellpeck.actuallyadditions.api.recipe.CoffeeIngredient;
import de.ellpeck.actuallyadditions.mod.items.InitItems;
import de.ellpeck.actuallyadditions.mod.items.ItemCoffee;
import de.ellpeck.actuallyadditions.mod.items.metalists.TheMiscItems;
import de.ellpeck.actuallyadditions.mod.misc.SoundHandler;
import de.ellpeck.actuallyadditions.mod.misc.sound.SoundHandler;
import de.ellpeck.actuallyadditions.mod.network.gui.IButtonReactor;
import de.ellpeck.actuallyadditions.mod.util.StackUtil;
import de.ellpeck.actuallyadditions.mod.util.Util;

View file

@ -11,7 +11,7 @@
package de.ellpeck.actuallyadditions.mod.tile;
import de.ellpeck.actuallyadditions.mod.misc.SoundHandler;
import de.ellpeck.actuallyadditions.mod.misc.sound.SoundHandler;
import de.ellpeck.actuallyadditions.mod.network.gui.IButtonReactor;
import de.ellpeck.actuallyadditions.mod.recipe.CrusherRecipeRegistry;
import de.ellpeck.actuallyadditions.mod.util.StackUtil;