diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a3f6959f..2ffa8e6f4 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ NOTE: Worlds that used Refined Storage 1.5.x are fully compatible with Refined S - Rewrote autocrafting (raoulvdberge) - Autocrafting tasks that take longer than 5 seconds to calculate are automatically stopped to avoid server strain (raoulvdberge) - Added new storage disk system where the storage disk data (items, fluids) are stored off the disk itself, in another file (refinedstorage_disks.dat). The disk itself only stores its ID (raoulvdberge) +- Added /createdisk command which creates a disk based on the disk ID. Turn on advanced tooltips to see the disk ID on a disk item (raoulvdberge) - Changed fluid storage progression to be 64k - 256k - 1024k - 4096k (raoulvdberge) - You can no longer put a Filter in filter slots to gain additional filter slots (raoulvdberge) - You can now re-insert Processing Patterns in the Pattern Grid and have the inputs and outputs be completed (raoulvdberge) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RS.java b/src/main/java/com/raoulvdberge/refinedstorage/RS.java index 18fccd1a3..6cdf11a5e 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/RS.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RS.java @@ -1,5 +1,6 @@ package com.raoulvdberge.refinedstorage; +import com.raoulvdberge.refinedstorage.command.CommandCreateDisk; import com.raoulvdberge.refinedstorage.proxy.ProxyCommon; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.ItemStack; @@ -9,10 +10,7 @@ import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.Mod.Instance; import net.minecraftforge.fml.common.SidedProxy; -import net.minecraftforge.fml.common.event.FMLFingerprintViolationEvent; -import net.minecraftforge.fml.common.event.FMLInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.event.*; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; @@ -60,6 +58,11 @@ public final class RS { PROXY.postInit(e); } + @EventHandler + public void onServerStarting(FMLServerStartingEvent e) { + e.registerServerCommand(new CommandCreateDisk()); + } + @EventHandler public void onFingerprintViolation(FMLFingerprintViolationEvent e) { FMLLog.bigWarning("Invalid fingerprint detected for the Refined Storage jar file! The file " + e.getSource().getName() + " may have been tampered with. This version will NOT be supported!"); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/disk/IStorageDiskManager.java b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/disk/IStorageDiskManager.java index d1156c77a..a7d1143f8 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/disk/IStorageDiskManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/disk/IStorageDiskManager.java @@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.api.storage.disk; import net.minecraft.item.ItemStack; import javax.annotation.Nullable; +import java.util.Map; import java.util.UUID; /** @@ -27,6 +28,11 @@ public interface IStorageDiskManager { @Nullable IStorageDisk getByStack(ItemStack disk); + /** + * @return a map of all storage disks + */ + Map getAll(); + /** * Sets a storage disk. * diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskManager.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskManager.java index 923e95361..e58a9daf6 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskManager.java @@ -56,6 +56,11 @@ public class StorageDiskManager extends WorldSavedData implements IStorageDiskMa return get(provider.getId(disk)); } + @Override + public Map getAll() { + return disks; + } + @Override public void set(UUID id, IStorageDisk disk) { if (id == null) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/command/CommandCreateDisk.java b/src/main/java/com/raoulvdberge/refinedstorage/command/CommandCreateDisk.java new file mode 100644 index 000000000..a785a5f4c --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/command/CommandCreateDisk.java @@ -0,0 +1,90 @@ +package com.raoulvdberge.refinedstorage.command; + +import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk; +import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskProvider; +import com.raoulvdberge.refinedstorage.apiimpl.API; +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.command.WrongUsageException; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.SoundEvents; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.math.BlockPos; + +import javax.annotation.Nullable; +import java.util.Collections; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +public class CommandCreateDisk extends CommandBase { + @Override + public String getName() { + return "createdisk"; + } + + @Override + public String getUsage(ICommandSender sender) { + return "commands.refinedstorage.createdisk.usage"; + } + + @Override + public int getRequiredPermissionLevel() { + return 2; + } + + @Override + public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { + if (args.length < 4) { + throw new WrongUsageException("commands.refinedstorage.createdisk.usage"); + } else { + EntityPlayer player = getPlayer(server, sender, args[0]); + Item item = getItemByText(sender, args[1]); + int metadata = parseInt(args[2]); + + UUID id; + try { + id = UUID.fromString(args[3]); + } catch (IllegalArgumentException e) { + throw new CommandException("commands.refinedstorage.createdisk.error.diskNotFound", args[3]); + } + + if (!(item instanceof IStorageDiskProvider)) { + throw new CommandException("commands.refinedstorage.createdisk.error.notADisk"); + } + + IStorageDisk disk = API.instance().getStorageDiskManager(sender.getEntityWorld()).get(id); + if (disk == null) { + throw new CommandException("commands.refinedstorage.createdisk.error.diskNotFound", args[3]); + } + + ItemStack diskStack = new ItemStack(item, 1, metadata); + ((IStorageDiskProvider) item).setId(diskStack, id); + + if (player.inventory.addItemStackToInventory(diskStack)) { + // From CommandGive + player.world.playSound(null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, 0.2F, ((player.getRNG().nextFloat() - player.getRNG().nextFloat()) * 0.7F + 1.0F) * 2.0F); + player.inventoryContainer.detectAndSendChanges(); + } + + notifyCommandListener(sender, this, "commands.refinedstorage.createdisk.success", args[3], player.getName()); + } + } + + @Override + public List getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, @Nullable BlockPos targetPos) { + if (args.length == 1) { + return getListOfStringsMatchingLastWord(args, server.getOnlinePlayerNames()); + } else if (args.length == 2) { + return getListOfStringsMatchingLastWord(args, Item.REGISTRY.getKeys()); + } else if (args.length == 4) { + return getListOfStringsMatchingLastWord(args, API.instance().getStorageDiskManager(sender.getEntityWorld()).getAll().keySet().stream().map(UUID::toString).collect(Collectors.toList())); + } + + return Collections.emptyList(); + } +} diff --git a/src/main/resources/assets/refinedstorage/lang/en_us.lang b/src/main/resources/assets/refinedstorage/lang/en_us.lang index f0faa364d..02b0ad247 100644 --- a/src/main/resources/assets/refinedstorage/lang/en_us.lang +++ b/src/main/resources/assets/refinedstorage/lang/en_us.lang @@ -297,6 +297,11 @@ item.refinedstorage:network_card.name=Network Card item.refinedstorage:security_card.name=Security Card item.refinedstorage:security_card.owner=Bound to: %s +commands.refinedstorage.createdisk.usage=/createdisk +commands.refinedstorage.createdisk.error.notADisk=The given disk item is not a disk. +commands.refinedstorage.createdisk.error.diskNotFound=Disk %s was not found. +commands.refinedstorage.createdisk.success=Successfully gave disk %s to %s. + advancements.refinedstorage:controlling.description=Craft a Controller advancements.refinedstorage:connecting=Connecting advancements.refinedstorage:connecting.description=You can place all the devices next to each other to connect them up, or, use Cable