mirror of
https://github.com/Ellpeck/ActuallyAdditions.git
synced 2024-12-22 19:39:24 +01:00
Add Laser Relay priorities
This commit is contained in:
parent
b355a66c97
commit
53f6ce0a24
5 changed files with 115 additions and 11 deletions
|
@ -10,27 +10,40 @@
|
|||
|
||||
package de.ellpeck.actuallyadditions.mod.blocks;
|
||||
|
||||
import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI;
|
||||
import de.ellpeck.actuallyadditions.api.laser.Network;
|
||||
import de.ellpeck.actuallyadditions.mod.ActuallyAdditions;
|
||||
import de.ellpeck.actuallyadditions.mod.blocks.base.BlockContainerBase;
|
||||
import de.ellpeck.actuallyadditions.mod.inventory.GuiHandler;
|
||||
import de.ellpeck.actuallyadditions.mod.tile.*;
|
||||
import de.ellpeck.actuallyadditions.mod.util.StackUtil;
|
||||
import de.ellpeck.actuallyadditions.mod.util.StringUtil;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.properties.PropertyInteger;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.ScaledResolution;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.EnumRarity;
|
||||
import net.minecraft.item.ItemCompass;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.util.text.TextFormatting;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.Event;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
|
||||
public class BlockLaserRelay extends BlockContainerBase{
|
||||
public class BlockLaserRelay extends BlockContainerBase implements IHudDisplay{
|
||||
|
||||
//This took way too much fiddling around. I'm not good with numbers.
|
||||
private static final float F = 1/16F;
|
||||
|
@ -52,6 +65,27 @@ public class BlockLaserRelay extends BlockContainerBase{
|
|||
this.setSoundType(SoundType.STONE);
|
||||
|
||||
this.type = type;
|
||||
|
||||
if(this.type.ordinal() == 0){
|
||||
MinecraftForge.EVENT_BUS.register(this);
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onBlockRightClick(PlayerInteractEvent.RightClickBlock event){
|
||||
EntityPlayer player = event.getEntityPlayer();
|
||||
World world = event.getWorld();
|
||||
ItemStack stack = event.getItemStack();
|
||||
BlockPos pos = event.getPos();
|
||||
|
||||
if(player != null && world != null && StackUtil.isValid(stack) && pos != null){
|
||||
IBlockState state = event.getWorld().getBlockState(pos);
|
||||
if(state != null && state.getBlock() instanceof BlockLaserRelay){
|
||||
if(stack.getItem() instanceof ItemCompass && player.isSneaking()){
|
||||
event.setUseBlock(Event.Result.ALLOW);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -100,9 +134,29 @@ public class BlockLaserRelay extends BlockContainerBase{
|
|||
|
||||
@Override
|
||||
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack stack, EnumFacing par6, float par7, float par8, float par9){
|
||||
if(player.isSneaking()){
|
||||
TileEntityLaserRelay relay = (TileEntityLaserRelay)world.getTileEntity(pos);
|
||||
if(relay instanceof TileEntityLaserRelayItemWhitelist){
|
||||
TileEntityLaserRelay tile = (TileEntityLaserRelay)world.getTileEntity(pos);
|
||||
if(tile instanceof TileEntityLaserRelayItem){
|
||||
TileEntityLaserRelayItem relay = (TileEntityLaserRelayItem)tile;
|
||||
|
||||
if(StackUtil.isValid(stack) && stack.getItem() instanceof ItemCompass){
|
||||
if(player.isSneaking()){
|
||||
relay.priority--;
|
||||
}
|
||||
else{
|
||||
relay.priority++;
|
||||
}
|
||||
|
||||
Network network = ActuallyAdditionsAPI.connectionHandler.getNetworkFor(relay.getPos(), relay.getWorld());
|
||||
if(network != null){
|
||||
network.changeAmount++;
|
||||
}
|
||||
|
||||
relay.markDirty();
|
||||
relay.sendUpdate();
|
||||
|
||||
return true;
|
||||
}
|
||||
else if(relay instanceof TileEntityLaserRelayItemWhitelist && player.isSneaking()){
|
||||
if(!world.isRemote){
|
||||
player.openGui(ActuallyAdditions.instance, GuiHandler.GuiTypes.LASER_RELAY_ITEM_WHITELIST.ordinal(), world, pos.getX(), pos.getY(), pos.getZ());
|
||||
}
|
||||
|
@ -130,6 +184,29 @@ public class BlockLaserRelay extends BlockContainerBase{
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayHud(Minecraft minecraft, EntityPlayer player, ItemStack stack, RayTraceResult posHit, ScaledResolution resolution){
|
||||
if(posHit != null && posHit.getBlockPos() != null && minecraft.theWorld != null){
|
||||
TileEntity tile = minecraft.theWorld.getTileEntity(posHit.getBlockPos());
|
||||
if(tile instanceof TileEntityLaserRelayItem){
|
||||
TileEntityLaserRelayItem relay = (TileEntityLaserRelayItem)tile;
|
||||
|
||||
String strg = "Priority: "+TextFormatting.DARK_RED+relay.getPriority()+TextFormatting.RESET;
|
||||
minecraft.fontRendererObj.drawStringWithShadow(strg, resolution.getScaledWidth()/2+5, resolution.getScaledHeight()/2+5, StringUtil.DECIMAL_COLOR_WHITE);
|
||||
|
||||
String expl;
|
||||
if(stack != null && stack.getItem() instanceof ItemCompass){
|
||||
expl = TextFormatting.GREEN+"Right-Click to increase! \nSneak-Right-Click to decrease!";
|
||||
}
|
||||
else{
|
||||
expl = TextFormatting.GRAY.toString()+TextFormatting.ITALIC+"Hold a Compass to modify!";
|
||||
}
|
||||
|
||||
StringUtil.drawSplitString(minecraft.fontRendererObj, expl, resolution.getScaledWidth()/2+5, resolution.getScaledHeight()/2+15, Integer.MAX_VALUE, StringUtil.DECIMAL_COLOR_WHITE, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public enum Type{
|
||||
ENERGY_BASIC,
|
||||
ENERGY_ADVANCED,
|
||||
|
|
|
@ -276,17 +276,17 @@ public class TileEntityItemViewer extends TileEntityInventoryBase{
|
|||
|
||||
@Override
|
||||
public int compareTo(GenericItemHandlerInfo other){
|
||||
boolean thisWhitelist = this.relayInQuestion instanceof TileEntityLaserRelayItemWhitelist;
|
||||
boolean otherWhitelist = other.relayInQuestion instanceof TileEntityLaserRelayItemWhitelist;
|
||||
int thisPrio = this.relayInQuestion.getPriority();
|
||||
int otherPrio = other.relayInQuestion.getPriority();
|
||||
|
||||
if(!thisWhitelist && otherWhitelist){
|
||||
return 1;
|
||||
if(thisPrio == otherPrio){
|
||||
return 0;
|
||||
}
|
||||
else if(thisWhitelist && !otherWhitelist){
|
||||
else if(thisPrio > otherPrio){
|
||||
return -1;
|
||||
}
|
||||
else{
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,6 +17,7 @@ import de.ellpeck.actuallyadditions.api.laser.Network;
|
|||
import de.ellpeck.actuallyadditions.mod.tile.TileEntityItemViewer.GenericItemHandlerInfo;
|
||||
import de.ellpeck.actuallyadditions.mod.util.WorldUtil;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
@ -31,6 +32,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||
|
||||
public class TileEntityLaserRelayItem extends TileEntityLaserRelay{
|
||||
|
||||
public int priority;
|
||||
public final Map<BlockPos, IItemHandler> handlersAround = new ConcurrentHashMap<BlockPos, IItemHandler>();
|
||||
|
||||
public TileEntityLaserRelayItem(String name){
|
||||
|
@ -41,6 +43,10 @@ public class TileEntityLaserRelayItem extends TileEntityLaserRelay{
|
|||
this("laserRelayItem");
|
||||
}
|
||||
|
||||
public int getPriority(){
|
||||
return this.priority;
|
||||
}
|
||||
|
||||
public boolean isWhitelisted(ItemStack stack, boolean output){
|
||||
return true;
|
||||
}
|
||||
|
@ -109,4 +115,20 @@ public class TileEntityLaserRelayItem extends TileEntityLaserRelay{
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeSyncableNBT(NBTTagCompound compound, NBTType type){
|
||||
super.writeSyncableNBT(compound, type);
|
||||
if(type != NBTType.SAVE_BLOCK){
|
||||
compound.setInteger("Priority", this.priority);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readSyncableNBT(NBTTagCompound compound, NBTType type){
|
||||
super.readSyncableNBT(compound, type);
|
||||
if(type != NBTType.SAVE_BLOCK){
|
||||
this.priority = compound.getInteger("Priority");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -164,6 +164,11 @@ public class TileEntityLaserRelayItemWhitelist extends TileEntityLaserRelayItem
|
|||
}.setTile(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPriority(){
|
||||
return super.getPriority()+10;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isWhitelisted(ItemStack stack, boolean output){
|
||||
return output ? this.rightFilter.check(stack, this.slots) : this.leftFilter.check(stack, this.slots);
|
||||
|
|
|
@ -994,7 +994,7 @@ booklet.actuallyadditions.chapter.itemStorage.text.5=But how to make a system th
|
|||
booklet.actuallyadditions.chapter.itemStorage.text.6=Here, you can see the use of an <item>Advanced Item Laser Relay<r>. They can have a <imp>whitelist/blacklist configuration<r> for both connections going into them (inbound, the left side in this case) and out of them (outbound, the right side in this case).
|
||||
booklet.actuallyadditions.chapter.itemStorage.text.7=You can also attach these advanced relays to <item>Item Interfaces<r>, which will mean that they will only <imp>have access<r> to certain items from the system. Here, outbound means out of the system, and inbound means into the system.
|
||||
booklet.actuallyadditions.chapter.itemStorage.text.8=What you can do is <imp>take this to the next level<r> and build a fully-fledged <imp>storage system<r> with multiple chests. Pulling out of or inputting into an <item>Item Interface<r> here will pull out of <imp>the entire system<r>.
|
||||
booklet.actuallyadditions.chapter.itemStorage.text.9=Addendum: <n><item>Advanced Item Laser Relays<r> will always <imp>take priority<r>, meaning inventories connected to them will be input into and pulled out of first. This can be useful if you want to make a <imp>storage system<r> with a <imp>last resort<r>-type chest. <n><n>Also, this system isn't only limited to chests, and there can be <imp>way more<r> than just <imp>two<r> <item>Item Interfaces<r>! <n><n><i>Gigantic storage system ahoy!
|
||||
booklet.actuallyadditions.chapter.itemStorage.text.9=To make this system work in more complex situations, the <item>Priority<r> of a Laser Relay can be changed by <imp>holding a Compass<r> and right-clicking on it. A <imp>higher priority<r> means that the Laser Relay will <imp>first receive items<r> and first have them <imp>extracted<r> from it. You could say that it is <i>first in line<r> for being dealt with by an <item>Item Interface<r>. <n>By defualt, the <item>Advanced Item Laser Relay<r> has a priority <imp>of 10<r>. Priorities can be pretty much infinite and even negative!
|
||||
|
||||
booklet.actuallyadditions.chapter.banners.name=Additional Banners
|
||||
booklet.actuallyadditions.chapter.banners.text.1=For <imp>special items<r> in <imp>Actually Additions<r>, there is also special <item>Banner<r> patterns. All of these just require the <imp>item next to the banner<r> in the crafting grid with, optionally, a <imp>color<r>. You can also combine them with a <item>Shield<r> like normal. <n>The items that have a banner pattern are: <n>The <item>Actually Additions Manual<r> <n>The <item>Phantom Connector<r> <n>The <item>Leaf Blower<r> (not the advanced version) <n>The <item>Drill<r> (only the white one works due to the way banners work)
|
||||
|
|
Loading…
Reference in a new issue