Skip to content

Commit

Permalink
Rewrite yeta wrench modes to be dynamic, and restructure yeta overlay
Browse files Browse the repository at this point in the history
  • Loading branch information
tterrag1098 committed Nov 19, 2015
1 parent 75019b2 commit e673385
Show file tree
Hide file tree
Showing 8 changed files with 260 additions and 188 deletions.
240 changes: 195 additions & 45 deletions src/main/java/crazypants/enderio/conduit/ConduitDisplayMode.java
Original file line number Diff line number Diff line change
@@ -1,58 +1,156 @@
package crazypants.enderio.conduit;

import java.util.List;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.MathHelper;

import com.enderio.core.api.client.render.IWidgetIcon;
import com.google.common.base.Predicate;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Lists;

import crazypants.enderio.api.tool.IConduitControl;
import crazypants.enderio.conduit.gas.GasUtil;
import crazypants.enderio.conduit.me.MEUtil;
import crazypants.enderio.conduit.oc.OCUtil;

public enum ConduitDisplayMode {
ALL,
POWER,
REDSTONE,
FLUID,
ITEM,
GAS,
ME,
OC,
NONE;
import crazypants.enderio.conduit.item.IItemConduit;
import crazypants.enderio.conduit.liquid.ILiquidConduit;
import crazypants.enderio.conduit.power.IPowerConduit;
import crazypants.enderio.conduit.redstone.IRedstoneConduit;
import static crazypants.enderio.gui.IconEIO.*;

public static ConduitDisplayMode next(ConduitDisplayMode mode) {
int index = mode.ordinal() + 1;
if (index >= values().length) {
index = 0;
}
ConduitDisplayMode res = values()[index];
if (res == OC && !OCUtil.isOCEnabled()) {
return next(res);
public class ConduitDisplayMode {

public static final ConduitDisplayMode ALL = new ConduitDisplayMode("all", TICK, TICK);
public static final ConduitDisplayMode NONE = new ConduitDisplayMode("none", CROSS, CROSS);

private static final List<ConduitDisplayMode> registrar;

// @formatter:off
static {
registrar = Lists.newArrayList(
NONE,
ALL,
new ConduitDisplayMode(IItemConduit.class, WRENCH_OVERLAY_ITEM, WRENCH_OVERLAY_ITEM_OFF),
new ConduitDisplayMode(ILiquidConduit.class, WRENCH_OVERLAY_FLUID, WRENCH_OVERLAY_FLUID_OFF),
new ConduitDisplayMode(IPowerConduit.class, WRENCH_OVERLAY_POWER, WRENCH_OVERLAY_POWER_OFF),
new ConduitDisplayMode(IRedstoneConduit.class, WRENCH_OVERLAY_REDSTONE, WRENCH_OVERLAY_REDSTONE_OFF)
);
}
// @formatter:on

public static void registerDisplayMode(ConduitDisplayMode mode) {
if (!registrar.contains(mode)) {
registrar.add(mode);
}
if (res == GAS && !GasUtil.isGasConduitEnabled()) {
return next(res);
}

private final Class<? extends IConduit> conduitType;
private final IWidgetIcon widgetSelected, widgetUnselected;

private String overrideName = null;

/**
* Use this constructor if you have custom display logic, it will use
* {@code IConduit.class} as the conduitType, and the passed name as the
* override name.
*
* @see #ConduitDisplayMode(Class, IWidgetIcon, IWidgetIcon)
*
* @param name
* The override name.
* @param widgetSelected
* The widget to render when this type is selected.
* @param widgetUnselected
* The widget to render when this type is unselected.
*/
public ConduitDisplayMode(String name, IWidgetIcon widgetSelected, IWidgetIcon widgetUnselected) {
this(IConduit.class, widgetSelected, widgetUnselected);
setName(name);
}

/**
* Creates a new display mode for any {@link IConduitControl} wrench. Contains
* data about which conduit type this is for, and the icons to render while
* holding the wrench. wrench.
*
* @param conduitType
* The base class for your conduit type, typically an interface (e.g.
* {@code IPowerConduit}).
* @param widgetSelected
* The widget to render when this type is selected.
* @param widgetUnselected
* The widget to render when this type is unselected.
*/
public ConduitDisplayMode(@Nonnull Class<? extends IConduit> conduitType, IWidgetIcon widgetSelected, IWidgetIcon widgetUnselected) {
this.conduitType = conduitType;
this.widgetSelected = widgetSelected;
this.widgetUnselected = widgetUnselected;
}

@Nullable
public Class<? extends IConduit> getConduitType() {
return conduitType;
}

public boolean renderConduit(Class<? extends IConduit> conduitType) {
if (this == ALL) {
return true;
} else if (this == NONE) {
return false;
} else {
return this.conduitType == conduitType;
}
if (res == ME && !MEUtil.isMEEnabled()) {
return next(res);
}

@Nonnull
public String getName() {
return overrideName == null ? conduitType.getSimpleName() : overrideName;
}

/**
* The name is null by default, and will use the simple class name of the
* conduit type.
*
* @param name
* The override name to set.
*/
public void setName(@Nullable String name) {
this.overrideName = name;
}

public IWidgetIcon getWidgetSelected() {
return widgetSelected;
}

public IWidgetIcon getWidgetUnselected() {
return widgetUnselected;
}

public static ConduitDisplayMode next(ConduitDisplayMode mode) {
int index = registrar.indexOf(mode) + 1;
if (index >= registrar.size()) {
index = 0;
}
return res;
return registrar.get(index);
}

public static ConduitDisplayMode previous(ConduitDisplayMode mode) {
int index = mode.ordinal() - 1;
int index = registrar.indexOf(mode) - 1;
if (index < 0) {
index = values().length - 1;
index = registrar.size() - 1;
}
ConduitDisplayMode res = values()[index];
if (res == GAS && !GasUtil.isGasConduitEnabled()) {
return previous(res);
}
if (res == ME && !MEUtil.isMEEnabled()) {
return previous(res);
}
if (res == OC && !OCUtil.isOCEnabled()) {
return previous(res);
return registrar.get(index);
}

public static ConduitDisplayMode fromName(String name) {
for (ConduitDisplayMode mode : registrar) {
if (mode.getName().equals(name)) {
return mode;
}
}
return res;
return null;
}

private static final String NBT_KEY = "enderio.displaymode";
Expand All @@ -62,23 +160,27 @@ public static ConduitDisplayMode getDisplayMode(ItemStack equipped) {
return ALL;
}
initDisplayModeTag(equipped);
int index = equipped.stackTagCompound.getInteger(NBT_KEY);
index = MathHelper.clamp_int(index, 0, ConduitDisplayMode.values().length - 1);
return ConduitDisplayMode.values()[index];
String name = equipped.stackTagCompound.getString(NBT_KEY);
ConduitDisplayMode mode = fromName(name);
if (mode == null) { // backwards compat
setDisplayMode(equipped, ALL);
return ALL;
}
return mode;
}

public static void setDisplayMode(ItemStack equipped, ConduitDisplayMode mode) {
if (mode == null || equipped == null || !(equipped.getItem() instanceof IConduitControl)) {
return;
}
initDisplayModeTag(equipped);
equipped.stackTagCompound.setInteger(NBT_KEY, mode.ordinal());
equipped.stackTagCompound.setString(NBT_KEY, mode.getName());
}

private static void initDisplayModeTag(ItemStack stack) {
if (stack.stackTagCompound == null) {
stack.stackTagCompound = new NBTTagCompound();
stack.stackTagCompound.setInteger(NBT_KEY, ConduitDisplayMode.ALL.ordinal());
stack.stackTagCompound.setString(NBT_KEY, ConduitDisplayMode.ALL.getName());
}
}

Expand All @@ -90,4 +192,52 @@ public ConduitDisplayMode previous() {
return previous(this);
}

public static int registrySize() {
return registrar.size() - 2;
}

public static Iterable<ConduitDisplayMode> getRenderableModes() {
return FluentIterable.from(registrar).filter(new Predicate<ConduitDisplayMode>() {
@Override
public boolean apply(ConduitDisplayMode input) {
return input != ALL && input != NONE;
}
});
}

@Override
public String toString() {
return getName();
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((conduitType == null) ? 0 : conduitType.hashCode());
result = prime * result + ((overrideName == null) ? 0 : overrideName.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ConduitDisplayMode other = (ConduitDisplayMode) obj;
if (conduitType == null) {
if (other.conduitType != null)
return false;
} else if (!conduitType.equals(other.conduitType))
return false;
if (overrideName == null) {
if (other.overrideName != null)
return false;
} else if (!overrideName.equals(other.overrideName))
return false;
return true;
}
}
29 changes: 1 addition & 28 deletions src/main/java/crazypants/enderio/conduit/ConduitUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,8 @@
import crazypants.enderio.api.tool.IHideFacades;
import crazypants.enderio.conduit.IConduitBundle.FacadeRenderState;
import crazypants.enderio.conduit.gas.GasUtil;
import crazypants.enderio.conduit.gas.IGasConduit;
import crazypants.enderio.conduit.item.IItemConduit;
import crazypants.enderio.conduit.liquid.ILiquidConduit;
import crazypants.enderio.conduit.me.IMEConduit;
import crazypants.enderio.conduit.me.MEUtil;
import crazypants.enderio.conduit.oc.IOCConduit;
import crazypants.enderio.conduit.oc.OCConduitNetwork;
import crazypants.enderio.conduit.oc.OCUtil;
import crazypants.enderio.conduit.power.IPowerConduit;
import crazypants.enderio.conduit.redstone.IInsulatedRedstoneConduit;
import crazypants.enderio.conduit.redstone.IRedstoneConduit;
import crazypants.enderio.conduit.redstone.Signal;
Expand Down Expand Up @@ -191,27 +184,7 @@ public static boolean renderConduit(EntityPlayer player, Class<? extends ICondui
return true;
}
ConduitDisplayMode mode = getDisplayMode(player);
switch (mode) {
case ALL:
return true;
case POWER:
return conduitType == IPowerConduit.class;
case REDSTONE:
return conduitType == IRedstoneConduit.class || conduitType == IInsulatedRedstoneConduit.class;
case FLUID:
return conduitType == ILiquidConduit.class;
case ITEM:
return conduitType == IItemConduit.class;
case GAS:
return conduitType == IGasConduit.class;
case ME:
return conduitType == IMEConduit.class;
case OC:
return conduitType == IOCConduit.class;
default:
break;
}
return true;
return mode.renderConduit(conduitType);
}

public static boolean shouldHeldItemHideFacades(EntityPlayer player) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@
import crazypants.enderio.EnderIO;
import crazypants.enderio.ModObject;
import crazypants.enderio.conduit.AbstractItemConduit;
import crazypants.enderio.conduit.ConduitDisplayMode;
import crazypants.enderio.conduit.IConduit;
import crazypants.enderio.conduit.ItemConduitSubtype;
import crazypants.enderio.config.Config;
import crazypants.enderio.gui.IconEIO;

public class ItemGasConduit extends AbstractItemConduit implements IAdvancedTooltipProvider {

Expand All @@ -27,6 +29,7 @@ public static ItemGasConduit create() {
ItemGasConduit result = new ItemGasConduit();
if (GasUtil.isGasConduitEnabled()) {
result.init();
ConduitDisplayMode.registerDisplayMode(new ConduitDisplayMode(IGasConduit.class, IconEIO.WRENCH_OVERLAY_GAS, IconEIO.WRENCH_OVERLAY_GAS_OFF));
}
return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
import appeng.api.AEApi;
import crazypants.enderio.ModObject;
import crazypants.enderio.conduit.AbstractItemConduit;
import crazypants.enderio.conduit.ConduitDisplayMode;
import crazypants.enderio.conduit.IConduit;
import crazypants.enderio.conduit.ItemConduitSubtype;
import crazypants.enderio.gui.IconEIO;

public class ItemMEConduit extends AbstractItemConduit {

Expand All @@ -19,6 +21,7 @@ public static ItemMEConduit create() {
ItemMEConduit result = new ItemMEConduit();
if (MEUtil.isMEEnabled()) {
result.init();
ConduitDisplayMode.registerDisplayMode(new ConduitDisplayMode(IMEConduit.class, IconEIO.WRENCH_OVERLAY_ME, IconEIO.WRENCH_OVERLAY_ME_OFF));
}
return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,22 @@

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import appeng.api.AEApi;
import crazypants.enderio.ModObject;
import crazypants.enderio.conduit.AbstractItemConduit;
import crazypants.enderio.conduit.ConduitDisplayMode;
import crazypants.enderio.conduit.IConduit;
import crazypants.enderio.conduit.ItemConduitSubtype;
import crazypants.enderio.gui.IconEIO;

public class ItemOCConduit extends AbstractItemConduit {

private static ItemConduitSubtype[] subtypes = new ItemConduitSubtype[] { new ItemConduitSubtype(ModObject.itemOCConduit.name(),
"enderio:itemOCConduit") };
private static ItemConduitSubtype[] subtypes = new ItemConduitSubtype[] { new ItemConduitSubtype(ModObject.itemOCConduit.name(), "enderio:itemOCConduit") };

public static ItemOCConduit create() {
ItemOCConduit result = new ItemOCConduit();
if (OCUtil.isOCEnabled()) {
result.init();
ConduitDisplayMode.registerDisplayMode(new ConduitDisplayMode(IOCConduit.class, IconEIO.WRENCH_OVERLAY_OC, IconEIO.WRENCH_OVERLAY_OC_OFF));
}
return result;
}
Expand Down
Loading

0 comments on commit e673385

Please sign in to comment.