More GUI work, extended 'tinker' system

This commit is contained in:
MachineMuse 2012-12-28 06:19:05 -07:00
parent 4fef905a94
commit 5ad9e2eaf0
26 changed files with 578 additions and 241 deletions

BIN
icons.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -5,13 +5,12 @@ import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import net.machinemuse.powersuits.gui.MuseGui;
import net.machinemuse.powersuits.trash.PowerModule;
import net.machinemuse.powersuits.gui.MuseIcon;
import net.minecraft.client.model.PositionTextureVertex;
import net.minecraft.client.model.TexturedQuad;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.Vec3;
import net.minecraftforge.client.ForgeHooksClient;
@ -453,14 +452,16 @@ public abstract class MuseRenderer {
GL11.glEnable(GL11.GL_LIGHTING);
}
public static void drawModuleAt(int x, int y, MuseGui gui,
PowerModule module, NBTTagCompound moduleTag, Colour colour) {
public static void drawIconAt(int x, int y, MuseGui gui,
MuseIcon icon, Colour colour) {
GL11.glPushMatrix();
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glDisable(GL11.GL_CULL_FACE);
GL11.glDisable(GL11.GL_DEPTH_TEST);
texturelessOff();
smoothingOn();
ForgeHooksClient.bindTexture(module.getIconFile(), 0);
ForgeHooksClient.bindTexture(icon.getTexturefile(), 0);
if (colour != null)
{
@ -470,8 +471,8 @@ public abstract class MuseRenderer {
Tessellator tess = Tessellator.instance;
tess.startDrawingQuads();
float r = 0.0625f;
float u = (module.getIconIndex() % 16) * r;
float v = (module.getIconIndex() / 16) * r;
float u = (icon.getIconIndex() % 16) * r;
float v = (icon.getIconIndex() / 16) * r;
tess.addVertexWithUV(
x, y, 0,
u, v);
@ -490,6 +491,7 @@ public abstract class MuseRenderer {
GL11.glEnable(GL11.GL_CULL_FACE);
// GL11.glDepthFunc(GL11.GL_LEQUAL);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glPopMatrix();
}

View file

@ -3,9 +3,7 @@ package net.machinemuse.powersuits.client;
import net.machinemuse.powersuits.block.TileEntityTinkerTable;
import net.machinemuse.powersuits.common.CommonProxy;
import net.machinemuse.powersuits.common.PlayerTickHandler;
import net.machinemuse.powersuits.common.PowersuitsMod;
import net.machinemuse.powersuits.network.MusePacketHandler;
import net.minecraft.item.Item;
import net.minecraftforge.client.MinecraftForgeClient;
import cpw.mods.fml.client.registry.ClientRegistry;
import cpw.mods.fml.common.registry.TickRegistry;
@ -26,11 +24,7 @@ public class ClientProxy extends CommonProxy {
*/
@Override
public void registerRenderers() {
for (Item i : PowersuitsMod.allItems) {
MinecraftForgeClient.registerItemRenderer(
i.shiftedIndex, eRenderer);
}
// for (Item i : PowersuitsMod.allBlocks) {
// for (Item i : PowersuitsMod.allItems) {
// MinecraftForgeClient.registerItemRenderer(
// i.shiftedIndex, eRenderer);
// }

View file

@ -3,11 +3,14 @@ package net.machinemuse.powersuits.common;
import java.util.HashMap;
import java.util.Map;
import net.machinemuse.powersuits.item.TinkerAction;
import net.machinemuse.powersuits.gui.MuseIcon;
import net.machinemuse.powersuits.item.*;
import net.minecraft.block.Block;
import net.minecraft.block.StepSound;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.Configuration;
/**
@ -21,6 +24,11 @@ public class Config extends Configuration {
private static final int[] assignedItemIDs = new int[Items.values().length];
private static final int[] assignedBlockIDs = new int[Blocks.values().length];
private static final Map<String, TinkerAction> tinkerings = new HashMap();
public static Map<String, TinkerAction> getTinkerings() {
return tinkerings;
}
private static Configuration config;
/**
@ -100,10 +108,78 @@ public class Config extends Configuration {
return assignedBlockIDs[block.ordinal()];
}
public static void addTinkerAction(TinkerAction action) {
tinkerings.put(action.getName(), action);
}
/**
* Load all the tinkerings in the config file into memory.
* Load all the tinkerings in the config file into memory. Eventually. For
* now, they are hardcoded.
*/
public void loadTinkerings() {
public static void loadTinkerings() {
boolean[] ARMORONLY = { true, true, true, true, false };
boolean[] TOOLONLY = { false, false, false, false, true };
boolean[] ALLITEMS = { true, true, true, true, true };
addTinkerAction(new TinkerAction("Add armor plating", ARMORONLY)
.addCost(new ItemStack(Item.ingotIron))
.addEffect(
new TinkerEffectAdditive(
IModularItem.ARMOR_VALUE, 1.0, 2.0))
.addEffect(
new TinkerEffectAdditive(
IModularItem.ARMOR_DURABILITY, 1.0, 2.0))
.addEffect(
new TinkerEffectAdditive(
IModularItem.ARMOR_WEIGHT, 1.0, 2.0))
.setDescription(
"By adding some iron plating, you might be able to make this armor more protective.")
.setIcon(new MuseIcon("/icons.png", 1)));
addTinkerAction(new TinkerAction("Lighten armor plating", ARMORONLY)
.addCost(new ItemStack(Item.lightStoneDust))
.addEffect(
new TinkerEffectMultiplicative(
IModularItem.ARMOR_VALUE, .95, 1))
.addEffect(
new TinkerEffectMultiplicative(
IModularItem.ARMOR_DURABILITY, .95, 1))
.addEffect(
new TinkerEffectMultiplicative(
IModularItem.ARMOR_WEIGHT, .9, .95))
.addRequirement(
new TinkerRequirement(IModularItem.ARMOR_VALUE, '>', 2))
.addRequirement(
new TinkerRequirement(IModularItem.ARMOR_WEIGHT, '>', 2))
.setDescription(
"Using the lightening effects of glowstone, you might be able to reduce the weight of this armor.")
.setIcon(new MuseIcon("/icons.png", 4)));
addTinkerAction(new TinkerAction("Install a battery", ALLITEMS)
.addCost(new ItemStack(Item.redstone))
.addEffect(
new TinkerEffectAdditive(
IModularItem.MAXIMUM_ENERGY, 10000.0, 20000.0))
.addEffect(
new TinkerEffectAdditive(
IModularItem.ARMOR_WEIGHT, 0.5, 1))
.addRequirement(
new TinkerRequirement(
IModularItem.MAXIMUM_ENERGY, '=', 0))
.setDescription(
"By adding a battery, you might be able to have a source of energy on hand at all times.")
.setIcon(new MuseIcon("/icons.png", 5)));
addTinkerAction(new TinkerAction("Lighten the battery", ALLITEMS)
.addCost(new ItemStack(Item.redstone))
.addEffect(
new TinkerEffectMultiplicative(
IModularItem.MAXIMUM_ENERGY, .95, 1))
.addEffect(
new TinkerEffectMultiplicative(
IModularItem.ARMOR_WEIGHT, .9, .95))
.addRequirement(
new TinkerRequirement(
IModularItem.MAXIMUM_ENERGY, '>', 10000))
.setDescription(
"Using lapis instead of redstone might allow you to store the same amount of energy in a smaller frame.")
.setIcon(new MuseIcon("/icons.png", 9)));
}
/**

View file

@ -3,7 +3,6 @@
*/
package net.machinemuse.powersuits.common;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;
@ -28,8 +27,11 @@ public class NBTTagAccessor extends NBTTagCompound {
* Will likely need to be updated every time the obfuscation changes.
*
* @return
* @throws SecurityException
* @throws NoSuchMethodException
*/
public static Method getTagAccessor() {
public static Method getTagAccessor() throws NoSuchMethodException,
SecurityException {
if (mTagAccessor == null) {
try {
mTagAccessor = NBTTagCompound.class.getDeclaredMethod(
@ -37,40 +39,23 @@ public class NBTTagAccessor extends NBTTagCompound {
mTagAccessor.setAccessible(true);
return mTagAccessor;
} catch (NoSuchMethodException e) {
MuseLogger.logError("4");
try {
mTagAccessor = NBTTagCompound.class.getDeclaredMethod(
"a", NBTTagCompound.class);
mTagAccessor.setAccessible(true);
return mTagAccessor;
} catch (NoSuchMethodException e1) {
MuseLogger.logError("1");
e1.printStackTrace();
} catch (SecurityException e1) {
MuseLogger.logError("2");
e1.printStackTrace();
}
} catch (SecurityException e) {
MuseLogger.logError("3");
e.printStackTrace();
mTagAccessor = NBTTagCompound.class.getDeclaredMethod(
"a", NBTTagCompound.class);
mTagAccessor.setAccessible(true);
return mTagAccessor;
}
} else {
return mTagAccessor;
}
MuseLogger.logError("Error 1: Unable to access nbt tag map!");
return null;
}
public static Map getMap(NBTTagCompound nbt) {
try {
return (Map) getTagAccessor().invoke(null, nbt);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
return (Map) getTagAccessor().invoke(nbt, nbt);
} catch (Exception e) {
e.printStackTrace();
}
MuseLogger.logError("Error 2: Unable to access nbt tag map!");
MuseLogger.logError("Unable to access nbt tag map!");
return null;
}
}

View file

@ -83,6 +83,7 @@ public class PowersuitsMod {
event.getSuggestedConfigurationFile()));
}
public static Config config;
/**
* A static handle for the blocks and items. We only want one instance of
* each of them.
@ -127,6 +128,9 @@ public class PowersuitsMod {
ItemPowerTool tool = new ItemPowerTool();
allItems.add(tool);
Config.loadTinkerings();
}
/**

View file

@ -1,15 +1,14 @@
package net.machinemuse.powersuits.gui;
import java.util.ArrayList;
import java.util.List;
import net.machinemuse.general.geometry.Colour;
import net.machinemuse.general.geometry.MuseRenderer;
import net.machinemuse.general.geometry.Point2D;
import net.machinemuse.powersuits.trash.ModuleUtils;
import net.machinemuse.powersuits.trash.PowerModule;
import net.minecraft.client.Minecraft;
import net.machinemuse.powersuits.item.TinkerAction;
import net.machinemuse.powersuits.item.TinkerEffect;
import net.minecraft.client.renderer.RenderEngine;
import net.minecraft.nbt.NBTTagCompound;
/**
* Extends the Clickable class to make a clickable Augmentation; note that this
@ -18,31 +17,46 @@ import net.minecraft.nbt.NBTTagCompound;
* @author MachineMuse
*/
public class ClickableTinkerAction extends Clickable {
protected PowerModule module;
protected NBTTagCompound moduleTag;
protected TinkerAction action;
/**
* @param vaug
*/
public ClickableTinkerAction(PowerModule module, Point2D position) {
public ClickableTinkerAction(TinkerAction action, Point2D position) {
super(position);
this.module = module;
this.moduleTag = module.newModuleTag();
this.action = action;
}
/**
* @param vaug
*/
public ClickableTinkerAction(NBTTagCompound moduleTag, Point2D position) {
super(position);
this.moduleTag = moduleTag;
this.module = ModuleUtils.getModuleFromNBT(moduleTag);
public List<String> wrapString(String str, int length) {
List<String> strlist = new ArrayList();
int i = 0;
while (i + length < str.length()) {
int j = str.lastIndexOf(" ", i + length);
if (j == -1) {
j = str.indexOf(" ", i + length);
}
if (j == -1) {
break;
}
strlist.add(str.substring(i, j));
i = j;
}
strlist.add(str.substring(i));
return strlist;
}
@Override
public List<String> getToolTip() {
return module.getTooltip(
Minecraft.getMinecraft().thePlayer, moduleTag);
List<String> toolTipText = new ArrayList();
toolTipText.add(action.name);
toolTipText.addAll(wrapString(action.description, 30));
for (TinkerEffect effect : action.getEffects()) {
toolTipText.add(effect.toString());
}
return toolTipText;
}
@Override
@ -53,7 +67,8 @@ public class ClickableTinkerAction extends Clickable {
Colour c1 = new Colour(1.0F, 0.2F, 0.6F, 1.0F);
Colour c2 = new Colour(0.6F, 0.2F, 1.0F, 1.0F);
MuseRenderer.drawModuleAt(x - 8, y - 8, gui, module, moduleTag, null);
Colour.getGreyscale(1.0f, 1.0f).doGL();
MuseRenderer.drawIconAt(x - 8, y - 8, gui, action.getIcon(), null);
}

View file

@ -9,6 +9,7 @@ import net.machinemuse.general.geometry.FlyFromMiddlePoint2D;
import net.machinemuse.general.geometry.MuseRenderer;
import net.machinemuse.general.geometry.Point2D;
import net.machinemuse.powersuits.item.ItemUtils;
import net.machinemuse.powersuits.item.TinkerAction;
import net.machinemuse.powersuits.network.MusePacketTinkerRequest;
import net.minecraft.client.entity.EntityClientPlayerMP;
import net.minecraft.item.ItemStack;
@ -24,12 +25,11 @@ public class GuiTinkerTable extends MuseGui {
protected EntityClientPlayerMP player;
protected List<ClickableItem> itemButtons;
protected int selectedItemStack = -1;
protected List<ClickableTinkerAction> augButtons;
protected int selectedAugClickable = -1;
protected List<ClickableTinkerAction> tinkeringButtons;
protected int selectedTinkerAction = -1;
protected List<ItemStack> workingUpgradeCost;
protected List<ItemStack> workingDowngradeRefund;
protected ClickableButton upgradeButton;
protected ClickableButton downgradeButton;
protected ClickableButton applyTinkerButton;
protected StatsFrame statsFrame;
/**
@ -64,8 +64,8 @@ public class GuiTinkerTable extends MuseGui {
.getModularItemSlotsInInventory(player.inventory);
List<Point2D> points = this.pointsInLine(slots.size(),
new Point2D(-0.9F, -0.9F),
new Point2D(-0.9F, 0.9F));
new Point2D(-0.9F, 0.9F),
new Point2D(-0.9F, -0.9F));
Iterator<Integer> slotiterator = slots.iterator();
Iterator<Point2D> pointiterator = points.iterator();
@ -80,24 +80,28 @@ public class GuiTinkerTable extends MuseGui {
}
protected void loadAugList(ClickableItem itemClicked) {
protected void loadTinkersList(ClickableItem itemClicked) {
statsFrame = new StatsFrame(
absX(-0.7f), absY(-0.9f),
absX(0.3f), absY(0.9f),
absX(0f), absY(-0.9f),
absX(0.9f), absY(0.9f),
Colour.LIGHTBLUE.withAlpha(0.8),
Colour.DARKBLUE.withAlpha(0.8),
itemClicked.getItem());
// augButtons = new ArrayList<ClickableTinkering>();
// List<NBTTagCompound> workingAugs = ItemUtils
// .getItemModulesWithPadding(itemClicked
// .getItem());
// List<Point2D> points = this.pointsInLine(workingAugs.size(),
// new Point2D(-0.7F, -0.9F),
// new Point2D(-0.7F, 0.9F));
// Iterator<Point2D> pointiter = points.iterator();
// for (NBTTagCompound aug : workingAugs) {
// augButtons.add(new ClickableTinkering(aug, pointiter.next()));
// }
tinkeringButtons = new ArrayList();
List<TinkerAction> workingTinkers = ItemUtils
.getValidTinkersForItem(player, itemClicked
.getItem());
if (workingTinkers.size() > 0) {
List<Point2D> points = this.pointsInLine(workingTinkers.size(),
new Point2D(-0.7F, -0.9F),
new Point2D(-0.7F, 0.9F));
Iterator<Point2D> pointiter = points.iterator();
for (TinkerAction tinker : workingTinkers) {
tinkeringButtons.add(new ClickableTinkerAction(tinker,
pointiter
.next()));
}
}
}
// public void drawNthItem(ItemStack stack, int n) {
@ -115,12 +119,12 @@ public class GuiTinkerTable extends MuseGui {
10);
}
if (selectedAugClickable != -1) {
if (selectedTinkerAction != -1) {
MuseRenderer
.drawCircleAround(
absX(augButtons.get(selectedAugClickable)
absX(tinkeringButtons.get(selectedTinkerAction)
.getPosition().x()),
absY(augButtons.get(selectedAugClickable)
absY(tinkeringButtons.get(selectedTinkerAction)
.getPosition().y()),
10);
@ -153,47 +157,29 @@ public class GuiTinkerTable extends MuseGui {
if (statsFrame != null) {
statsFrame.draw();
}
// drawClickables(this.augButtons);
// drawUpgradeDowngrade();
drawClickables(this.tinkeringButtons);
drawApplyTinkerFrame();
drawToolTip();
}
/**
* Draws the upgrade/downgrade cost, buttons, and labels.
*/
public void drawUpgradeDowngrade() {
public void drawApplyTinkerFrame() {
if (workingUpgradeCost != null && workingUpgradeCost.size() > 0) {
this.drawString(fontRenderer, "Cost:", absX(0.4F),
absY(-0.7F),
new Colour(0.5F, 1.0F, 0.5F, 1.0F).getInt());
MuseRenderer.drawString("Cost:", absX(-0.6F),
absY(0.5F),
new Colour(0.5F, 1.0F, 0.5F, 1.0F));
List<Point2D> points = this.pointsInLine(workingUpgradeCost.size(),
new Point2D(0.4F, -0.5F),
new Point2D(0.9F, -0.5F));
new Point2D(-0.4F, 0.7F),
new Point2D(-0.8F, 0.7F));
Iterator<Point2D> pointiter = points.iterator();
for (ItemStack item : workingUpgradeCost) {
Point2D next = pointiter.next();
MuseRenderer.drawItemAt(absX(next.x()), absY(next.y()), this,
item);
}
upgradeButton.draw(this.getRenderEngine(), this);
}
if (workingDowngradeRefund != null && workingDowngradeRefund.size() > 0) {
MuseRenderer.on2D();
this.drawString(fontRenderer, "Refund:", absX(0.4F),
absY(0.3F),
new Colour(1.0F, 0.6F, 0.2F, 1.0F).getInt());
MuseRenderer.off2D();
List<Point2D> points = this.pointsInLine(
workingDowngradeRefund.size(),
new Point2D(0.4F, 0.5F),
new Point2D(0.9F, 0.5F));
Iterator<Point2D> pointiter = points.iterator();
for (ItemStack item : workingDowngradeRefund) {
Point2D next = pointiter.next();
MuseRenderer.drawItemAt(absX(next.x()), absY(next.y()), this,
item);
}
downgradeButton.draw(this.getRenderEngine(), this);
applyTinkerButton.draw(this.getRenderEngine(), this);
}
}
@ -202,11 +188,10 @@ public class GuiTinkerTable extends MuseGui {
* Clear all the UI stuff that's there.
*/
protected void clearSelections() {
this.selectedAugClickable = -1;
this.selectedTinkerAction = -1;
this.workingUpgradeCost = null;
this.workingDowngradeRefund = null;
this.upgradeButton = null;
this.downgradeButton = null;
this.applyTinkerButton = null;
}
/**
@ -218,22 +203,18 @@ public class GuiTinkerTable extends MuseGui {
if (button == 0) // Left Mouse Button
{
int itemClicked = hitboxClickables(x, y, this.itemButtons);
int augClicked = hitboxClickables(x, y, this.augButtons);
int augClicked = hitboxClickables(x, y, this.tinkeringButtons);
if (itemClicked != -1) {
clearSelections();
this.selectedItemStack = itemClicked;
loadAugList(itemButtons.get(itemClicked));
loadTinkersList(itemButtons.get(itemClicked));
} else if (augClicked != -1) {
this.selectedAugClickable = augClicked;
this.selectedTinkerAction = augClicked;
refreshUpgrades();
} else if (upgradeButton != null
&& upgradeButton.enabled
&& upgradeButton.hitBox(x, y, this)) {
doUpgrade();
} else if (downgradeButton != null
&& downgradeButton.enabled
&& downgradeButton.hitBox(x, y, this)) {
doDowngrade();
} else if (applyTinkerButton != null
&& applyTinkerButton.enabled
&& applyTinkerButton.hitBox(x, y, this)) {
doTinker();
}
}
}
@ -250,7 +231,7 @@ public class GuiTinkerTable extends MuseGui {
* Performs all the functions associated with the upgrade button. This
* requires communicating with the server.
*/
private void doUpgrade() {
private void doTinker() {
if (ItemUtils.hasInInventory(workingUpgradeCost, player.inventory)) {
// ItemUtils.deleteFromInventory(workingUpgradeCost,
// player.inventory);
@ -260,7 +241,7 @@ public class GuiTinkerTable extends MuseGui {
new MusePacketTinkerRequest(
(Player) player,
itemButtons.get(selectedItemStack).inventorySlot,
augButtons.get(selectedAugClickable).module
tinkeringButtons.get(selectedTinkerAction).action
.getName()
).getPacket()
);
@ -268,23 +249,26 @@ public class GuiTinkerTable extends MuseGui {
}
}
static boolean refreshing = false;
/**
* Updates the upgrade/downgrade buttons. May someday also include repairs.
*/
private void refreshUpgrades() {
if (selectedAugClickable != -1) {
if (selectedTinkerAction != -1
&& tinkeringButtons.size() > selectedTinkerAction) {
this.workingUpgradeCost =
augButtons.get(selectedAugClickable).module.getCost(player,
augButtons.get(selectedAugClickable).moduleTag);
tinkeringButtons.get(selectedTinkerAction).action
.getCosts();
if (workingUpgradeCost != null) {
this.upgradeButton = new ClickableButton("Upgrade",
new Point2D(0.6F, -0.2F),
new Point2D(0.25F, 0.05F), true);
this.applyTinkerButton = new ClickableButton("Apply",
new Point2D(-.25F, 0.8F),
new Point2D(0.20F, 0.05F), true);
if (ItemUtils.hasInInventory(workingUpgradeCost,
player.inventory)) {
upgradeButton.enabled = true;
applyTinkerButton.enabled = true;
} else {
upgradeButton.enabled = false;
applyTinkerButton.enabled = false;
}
}
}
@ -300,9 +284,9 @@ public class GuiTinkerTable extends MuseGui {
if (itemHover > -1) {
hitTip = itemButtons.get(itemHover).getToolTip();
}
int augHover = hitboxClickables(x, y, this.augButtons);
int augHover = hitboxClickables(x, y, this.tinkeringButtons);
if (augHover > -1) {
hitTip = augButtons.get(augHover).getToolTip();
hitTip = tinkeringButtons.get(augHover).getToolTip();
}
return hitTip;
}
@ -311,7 +295,7 @@ public class GuiTinkerTable extends MuseGui {
public void refresh() {
loadItems();
if (selectedItemStack != -1 && selectedItemStack < itemButtons.size()) {
loadAugList(itemButtons.get(selectedItemStack));
loadTinkersList(itemButtons.get(selectedItemStack));
}
refreshUpgrades();
}

View file

@ -0,0 +1,53 @@
package net.machinemuse.powersuits.gui;
import java.util.List;
import net.machinemuse.general.geometry.Colour;
import net.machinemuse.general.geometry.MuseRenderer;
import net.machinemuse.powersuits.item.IModularItem;
import net.machinemuse.powersuits.item.ItemUtils;
import net.machinemuse.powersuits.item.TinkerAction;
import net.minecraft.item.ItemStack;
import org.lwjgl.opengl.GL11;
public class ItemInfoFrame extends GuiFrame {
protected ItemStack stack;
protected TinkerAction previewAction;
public ItemInfoFrame(int left, int top, int right, int bottom,
Colour borderColour, Colour insideColour, ItemStack itemStack) {
super(left, top, right, bottom, borderColour, insideColour);
this.stack = itemStack;
this.left *= 2.0;
this.right *= 2.0;
this.top *= 2.0;
this.bottom *= 2.0;
}
public void draw() {
GL11.glPushMatrix();
GL11.glScaled(0.50, 0.50, 0.50);
drawBackground();
int xoffset = 8;
int yoffset = 8;
int i = 0;
List<String> info = ((IModularItem) stack.getItem()).getLongInfo();
for (String propName : propertiesToList) {
double propValue = ItemUtils.getDoubleOrZero(
ItemUtils.getItemModularProperties(stack), propName);
String propValueString = String.format("%.2f", propValue);
int strlen = MuseGui.getFontRenderer().getStringWidth(
propValueString);
MuseRenderer.drawString(propName, left + xoffset,
top + yoffset + i * 10, borderColour);
MuseRenderer.drawString(propValueString, right - xoffset
- strlen - 40,
top + yoffset + i * 10, borderColour);
i++;
}
GL11.glPopMatrix();
}
}

View file

@ -1,9 +1,29 @@
package net.machinemuse.powersuits.gui;
public class MuseIcon {
String texturefile;
int index;
public MuseIcon() {
// TODO Auto-generated constructor stub
public MuseIcon(String texturefile, int index) {
super();
this.texturefile = texturefile;
this.index = index;
}
public String getTexturefile() {
return texturefile;
}
public void setTexturefile(String texturefile) {
this.texturefile = texturefile;
}
public int getIconIndex() {
return index;
}
public void setIconIndex(int index) {
this.index = index;
}
}

View file

@ -1,33 +1,43 @@
package net.machinemuse.powersuits.gui;
import java.util.List;
import java.util.Set;
import net.machinemuse.general.geometry.Colour;
import net.machinemuse.general.geometry.MuseRenderer;
import net.machinemuse.powersuits.common.NBTTagAccessor;
import net.machinemuse.powersuits.item.ItemUtils;
import net.machinemuse.powersuits.item.TinkerAction;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import org.lwjgl.opengl.GL11;
public class StatsFrame extends GuiFrame {
protected NBTTagCompound properties;
protected ItemStack stack;
protected List<String> propertiesToList;
protected Set<String> propertiesToList;
protected TinkerAction previewAction;
public StatsFrame(int left, int top, int right, int bottom,
Colour borderColour, Colour insideColour, ItemStack itemStack) {
super(left, top, right, bottom, borderColour, insideColour);
this.stack = itemStack;
this.properties = ItemUtils.getItemModularProperties(stack);
this.propertiesToList = ItemUtils.getAsModular(stack.getItem())
.getValidProperties();
this.propertiesToList = NBTTagAccessor.getMap(properties).keySet();
this.left *= 2.0;
this.right *= 2.0;
this.top *= 2.0;
this.bottom *= 2.0;
}
public void draw() {
GL11.glPushMatrix();
GL11.glScaled(0.50, 0.50, 0.50);
drawBackground();
int xoffset = 8;
int yoffset = 8;
for (int i = 0; i < propertiesToList.size(); i++) {
String propName = propertiesToList.get(i);
int i = 0;
for (String propName : propertiesToList) {
double propValue = ItemUtils.getDoubleOrZero(properties, propName);
String propValueString = String.format("%.2f", propValue);
int strlen = MuseGui.getFontRenderer().getStringWidth(
@ -35,10 +45,11 @@ public class StatsFrame extends GuiFrame {
MuseRenderer.drawString(propName, left + xoffset,
top + yoffset + i * 10, borderColour);
MuseRenderer.drawString(propValueString, right - xoffset
- strlen,
- strlen - 40,
top + yoffset + i * 10, borderColour);
i++;
}
GL11.glPopMatrix();
}
}

View file

@ -4,7 +4,6 @@ import java.util.List;
import net.machinemuse.powersuits.common.Config;
/**
* Interface for ItemPowerArmor and ItemPowerTool to share.
*
@ -12,6 +11,14 @@ import net.machinemuse.powersuits.common.Config;
*/
public interface IModularItem {
public static final String MAXIMUM_ENERGY = "Maximum Energy";
public static final String CURRENT_ENERGY = "Current Energy";
public static final String BATTERY_WEIGHT = "Battery Weight";
public static final String ARMOR_WEIGHT = "Armor Weight";
public static final String ARMOR_DURABILITY = "Armor Durability";
public static final String ARMOR_VALUE = "Armor Value";
public static final String PASSIVE_SHIELDING = "Passive Shielding";
public Config.Items getItemType();
public List<String> getValidProperties();

View file

@ -13,6 +13,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.DamageSource;
import net.minecraftforge.common.ISpecialArmor;
import universalelectricity.core.electricity.ElectricInfo;
import universalelectricity.core.implement.IItemElectric;
/**
@ -37,6 +38,7 @@ public abstract class ItemPowerArmor extends ItemArmor
public ItemPowerArmor(int id, EnumArmorMaterial material,
int renderIndex, int armorType) {
super(id, material, renderIndex, armorType);
setTextureFile("/icons.png");
setMaxStackSize(1);
setCreativeTab(Config.getCreativeTab());
}
@ -73,7 +75,26 @@ public abstract class ItemPowerArmor extends ItemArmor
*/
@Override
public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) {
return 4;
double totalarmor = 0;
NBTTagCompound props = ItemUtils.getItemModularProperties(armor);
double physArmor = ItemUtils.getDoubleOrZero(props,
IModularItem.ARMOR_VALUE);
double armorDura = ItemUtils.getDoubleOrZero(props,
IModularItem.ARMOR_DURABILITY);
if (armorDura > 0) {
totalarmor += physArmor;
}
double elecArmor = ItemUtils.getDoubleOrZero(props,
IModularItem.PASSIVE_SHIELDING);
double energy = ItemUtils.getDoubleOrZero(props,
IModularItem.CURRENT_ENERGY);
if (energy > 0) {
totalarmor += elecArmor;
}
return (int) totalarmor;
}
/**
@ -111,10 +132,11 @@ public abstract class ItemPowerArmor extends ItemArmor
@Override
public double onReceive(double amps, double voltage, ItemStack itemStack) {
double stored = getJoules(itemStack);
double received = Math.min(amps * voltage, stored
- getMaxJoules(itemStack));
double receivable = ElectricInfo.getJoules(amps, voltage, 1);
double received = Math.min(receivable,
getMaxJoules(itemStack) - stored);
setJoules(stored + received, itemStack);
return received;
return receivable - received;
}
@Override
@ -143,20 +165,23 @@ public abstract class ItemPowerArmor extends ItemArmor
public double getJoules(Object... data) {
NBTTagCompound itemProperties = ItemUtils
.getItemModularProperties(getStackFromData(data));
return ItemUtils.getDoubleOrZero(itemProperties, "Current energy");
return ItemUtils.getDoubleOrZero(itemProperties,
IModularItem.CURRENT_ENERGY);
}
@Override
public void setJoules(double joules, Object... data) {
NBTTagCompound itemProperties = ItemUtils
.getItemModularProperties(getStackFromData(data));
itemProperties.setDouble("Current energy", joules);
itemProperties.setDouble(IModularItem.CURRENT_ENERGY, joules);
}
@Override
public double getMaxJoules(Object... data) {
return 0;
NBTTagCompound itemProperties = ItemUtils
.getItemModularProperties(getStackFromData(data));
return ItemUtils.getDoubleOrZero(itemProperties,
IModularItem.MAXIMUM_ENERGY);
}
@Override
@ -165,7 +190,7 @@ public abstract class ItemPowerArmor extends ItemArmor
}
/**
* Helper function to deal with varargs
* Helper function to deal with UE's use of varargs
*
* @param data
* @return

View file

@ -22,8 +22,7 @@ public class ItemPowerArmorFeet extends ItemPowerArmor {
3); // armor type. 0=head, 1=torso, 2=legs, 3=feet
itemType = Config.Items.PowerArmorFeet;
setItemName(itemType.idName);
setIconIndex(63);
LanguageRegistry.addName(this, itemType.englishName);
}
}

View file

@ -12,6 +12,7 @@ public class ItemPowerArmorHead extends ItemPowerArmor {
0); // armor type. 0=head, 1=torso, 2=legs, 3=feet
itemType = Config.Items.PowerArmorHead;
setItemName(itemType.idName);
setIconIndex(15);
LanguageRegistry.addName(this, itemType.englishName);
}

View file

@ -12,7 +12,7 @@ public class ItemPowerArmorLegs extends ItemPowerArmor {
2); // armor type. 0=head, 1=torso, 2=legs, 3=feet
itemType = Config.Items.PowerArmorLegs;
setItemName(itemType.idName);
setIconIndex(47);
LanguageRegistry.addName(this, itemType.englishName);
}

View file

@ -12,7 +12,7 @@ public class ItemPowerArmorTorso extends ItemPowerArmor {
1); // armor type.
itemType = Config.Items.PowerArmorTorso;
setItemName(itemType.idName);
setIconIndex(31);
LanguageRegistry.addName(this, itemType.englishName);
}

View file

@ -14,6 +14,7 @@ import net.minecraft.item.ItemTool;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import universalelectricity.core.electricity.ElectricInfo;
import universalelectricity.core.implement.IItemElectric;
import cpw.mods.fml.common.registry.LanguageRegistry;
import cpw.mods.fml.relauncher.Side;
@ -29,19 +30,6 @@ public class ItemPowerTool extends ItemTool
IModularItem,
IItemElectric {
/**
* Copied the comment for reference
*/
// /** Array of blocks the tool has extra effect against. */
// private Block[] blocksEffectiveAgainst;
// public float efficiencyOnProperMaterial = 4.0F;
//
// /** Damage versus entities. */
// public int damageVsEntity;
//
// /** The material this tool is made from. */
// protected EnumToolMaterial toolMaterial;
/**
* Constructor. Takes information from the Config.Items enum.
*/
@ -60,7 +48,8 @@ public class ItemPowerTool extends ItemTool
setMaxDamage(0);
this.damageVsEntity = 1;
setCreativeTab(Config.getCreativeTab());
setIconIndex(Config.Items.PowerTool.iconIndex);
setIconIndex(9);
setTextureFile("/icons.png");
setItemName(Config.Items.PowerTool.idName);
LanguageRegistry.addName(this, Config.Items.PowerTool.englishName);
}
@ -178,8 +167,8 @@ public class ItemPowerTool extends ItemTool
@Override
public List<String> getValidProperties() {
return Arrays.asList(
"Max Energy",
"Current Energy",
IModularItem.CURRENT_ENERGY,
IModularItem.MAXIMUM_ENERGY,
"Shovel Level",
"Axe Level",
"Pick level");
@ -188,10 +177,11 @@ public class ItemPowerTool extends ItemTool
@Override
public double onReceive(double amps, double voltage, ItemStack itemStack) {
double stored = getJoules(itemStack);
double received = Math.min(amps * voltage, stored
- getMaxJoules(itemStack));
double receivable = ElectricInfo.getJoules(amps, voltage, 1);
double received = Math.min(receivable,
getMaxJoules(itemStack) - stored);
setJoules(stored + received, itemStack);
return received;
return receivable - received;
}
@Override
@ -220,20 +210,23 @@ public class ItemPowerTool extends ItemTool
public double getJoules(Object... data) {
NBTTagCompound itemProperties = ItemUtils
.getItemModularProperties(getStackFromData(data));
return ItemUtils.getDoubleOrZero(itemProperties, "Current energy");
return ItemUtils.getDoubleOrZero(itemProperties,
IModularItem.CURRENT_ENERGY);
}
@Override
public void setJoules(double joules, Object... data) {
NBTTagCompound itemProperties = ItemUtils
.getItemModularProperties(getStackFromData(data));
itemProperties.setDouble("Current energy", joules);
itemProperties.setDouble(IModularItem.CURRENT_ENERGY, joules);
}
@Override
public double getMaxJoules(Object... data) {
return 0;
NBTTagCompound itemProperties = ItemUtils
.getItemModularProperties(getStackFromData(data));
return ItemUtils.getDoubleOrZero(itemProperties,
IModularItem.MAXIMUM_ENERGY);
}
@Override

View file

@ -5,6 +5,7 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import net.machinemuse.powersuits.common.Config;
import net.machinemuse.powersuits.trash.IPowerModuleWeight;
import net.machinemuse.powersuits.trash.ModuleUtils;
import net.machinemuse.powersuits.trash.PowerModule;
@ -16,6 +17,18 @@ import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
public class ItemUtils {
public static List<TinkerAction> getValidTinkersForItem(
EntityPlayer player, ItemStack stack) {
List<TinkerAction> validActions = new ArrayList();
for (TinkerAction action : Config.getTinkerings().values()) {
if (action.validate(player, stack)) {
validActions.add(action);
}
}
return validActions;
}
public static NBTTagCompound getItemModularProperties(ItemStack stack) {
NBTTagCompound properties = null;
if (stack.hasTagCompound()) {

View file

@ -4,7 +4,11 @@ import java.util.ArrayList;
import java.util.List;
import net.machinemuse.powersuits.gui.MuseIcon;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
public class TinkerAction {
public String name;
@ -13,12 +17,55 @@ public class TinkerAction {
public List<ItemStack> costs;
public MuseIcon icon;
public String description;
public boolean[] validSlots;
public TinkerAction(String name) {
public TinkerAction(String name, boolean[] validSlots) {
this.name = name;
requirements = new ArrayList();
effects = new ArrayList();
costs = new ArrayList();
this.validSlots = validSlots;
}
public boolean validate(EntityPlayer player, ItemStack stack) {
boolean slot = validForItemType(stack.getItem());
boolean req = validateRequirements(ItemUtils
.getItemModularProperties(stack));
boolean cost = validateCost(player.inventory);
return slot && req && cost;
}
public boolean validForItemType(Item item) {
if (item instanceof ItemPowerArmorHead) {
return validSlots[0];
}
if (item instanceof ItemPowerArmorTorso) {
return validSlots[1];
}
if (item instanceof ItemPowerArmorLegs) {
return validSlots[2];
}
if (item instanceof ItemPowerArmorFeet) {
return validSlots[3];
}
if (item instanceof ItemPowerTool) {
return validSlots[4];
}
return false;
}
public boolean validateRequirements(NBTTagCompound nbt) {
for (TinkerRequirement requirement : requirements) {
if (!requirement.test(nbt)) {
return false;
}
}
return true;
}
public boolean validateCost(InventoryPlayer inventory) {
return ItemUtils.hasInInventory(costs, inventory);
}
public String getName() {
@ -29,40 +76,52 @@ public class TinkerAction {
return requirements;
}
public void addRequirement(TinkerRequirement requirement) {
public TinkerAction addRequirement(TinkerRequirement requirement) {
this.requirements.add(requirement);
return this;
}
public List<TinkerEffect> getEffects() {
return effects;
}
public void addEffect(TinkerEffect effect) {
public TinkerAction addEffect(TinkerEffect effect) {
this.effects.add(effect);
return this;
}
public List<ItemStack> getCosts() {
return costs;
}
public void addCosts(ItemStack cost) {
public TinkerAction addCost(ItemStack cost) {
this.costs.add(cost);
return this;
}
public MuseIcon getIcon() {
return icon;
}
public void setIcon(MuseIcon icon) {
public TinkerAction setIcon(MuseIcon icon) {
this.icon = icon;
return this;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
public TinkerAction setDescription(String description) {
this.description = description;
return this;
}
public void apply(ItemStack stack) {
NBTTagCompound tag = ItemUtils.getItemModularProperties(stack);
for (TinkerEffect effect : this.effects) {
effect.applyEffect(tag);
}
}
}

View file

@ -1,27 +1,14 @@
package net.machinemuse.powersuits.item;
import java.util.Random;
import net.minecraft.nbt.NBTTagCompound;
public class TinkerEffect {
public static Random random = new Random();
public String propertyAffected;
public double minimumEffect;
public double maximumEffect;
public abstract class TinkerEffect {
public abstract void applyEffect(NBTTagCompound properties);
public TinkerEffect(String propertyAffected, double minimumEffect,
double maximumEffect) {
super();
this.propertyAffected = propertyAffected;
this.minimumEffect = minimumEffect;
this.maximumEffect = maximumEffect;
}
public abstract double simEffectMin(NBTTagCompound properties);
public void applyEffect(NBTTagCompound properties) {
double prev = ItemUtils.getDoubleOrZero(properties, propertyAffected);
double effect = (maximumEffect - minimumEffect) * random.nextDouble()
+ minimumEffect;
properties.setDouble(propertyAffected, Math.max(0, prev + effect));
}
public abstract double simEffectMax(NBTTagCompound properties);
@Override
public abstract String toString();
}

View file

@ -0,0 +1,54 @@
package net.machinemuse.powersuits.item;
import java.text.DecimalFormat;
import java.util.Random;
import net.minecraft.nbt.NBTTagCompound;
public class TinkerEffectAdditive extends TinkerEffect {
public static Random random = new Random();
public String propertyAffected;
public double minimumEffect;
public double maximumEffect;
public TinkerEffectAdditive(String propertyAffected, double minimumEffect,
double maximumEffect) {
super();
this.propertyAffected = propertyAffected;
this.minimumEffect = minimumEffect;
this.maximumEffect = maximumEffect;
}
@Override
public void applyEffect(NBTTagCompound properties) {
double prev = ItemUtils.getDoubleOrZero(properties, propertyAffected);
double effect = (maximumEffect - minimumEffect) * random.nextDouble()
+ minimumEffect;
if (prev + effect <= 0) {
properties.removeTag(propertyAffected);
} else {
properties.setDouble(propertyAffected, prev + effect);
}
}
@Override
public String toString() {
DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance();
format.setPositivePrefix("+");
format.setMaximumFractionDigits(2);
return this.propertyAffected + " " + format.format(minimumEffect)
+ "~" + format.format(maximumEffect);
}
@Override
public double simEffectMin(NBTTagCompound properties) {
return ItemUtils.getDoubleOrZero(properties, propertyAffected)
+ minimumEffect;
}
@Override
public double simEffectMax(NBTTagCompound properties) {
return ItemUtils.getDoubleOrZero(properties, propertyAffected)
+ maximumEffect;
}
}

View file

@ -0,0 +1,56 @@
package net.machinemuse.powersuits.item;
import java.text.DecimalFormat;
import java.util.Random;
import net.minecraft.nbt.NBTTagCompound;
public class TinkerEffectMultiplicative extends TinkerEffect {
public static Random random = new Random();
public String propertyAffected;
public double minimumEffect;
public double maximumEffect;
public TinkerEffectMultiplicative(String propertyAffected,
double minimumEffect,
double maximumEffect) {
super();
this.propertyAffected = propertyAffected;
this.minimumEffect = minimumEffect;
this.maximumEffect = maximumEffect;
}
@Override
public void applyEffect(NBTTagCompound properties) {
double prev = ItemUtils.getDoubleOrZero(properties, propertyAffected);
double effect = (maximumEffect - minimumEffect) * random.nextDouble()
+ minimumEffect;
if (prev == 0) {
properties.removeTag(propertyAffected);
} else {
properties.setDouble(propertyAffected, prev * effect);
}
}
@Override
public String toString() {
DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance();
format.setPositivePrefix("+");
format.setMaximumFractionDigits(2);
return this.propertyAffected + " "
+ format.format((minimumEffect - 1) * 100)
+ "-" + format.format((maximumEffect - 1) * 100) + "%%";
}
@Override
public double simEffectMin(NBTTagCompound properties) {
return ItemUtils.getDoubleOrZero(properties, propertyAffected)
* minimumEffect;
}
@Override
public double simEffectMax(NBTTagCompound properties) {
return ItemUtils.getDoubleOrZero(properties, propertyAffected)
* maximumEffect;
}
}

View file

@ -25,9 +25,11 @@ public class TinkerRequirement {
return testvalue < value;
case '>':
return testvalue > value;
case '=':
return testvalue == value;
default:
throw new IllegalArgumentException(
"Invalid operator; must be one of < or >");
"Invalid operator; must be one of <, =, or >");
}
}

View file

@ -5,7 +5,6 @@ package net.machinemuse.powersuits.network;
import java.io.DataInputStream;
import net.machinemuse.powersuits.common.MuseLogger;
import net.machinemuse.powersuits.gui.MuseGui;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityClientPlayerMP;
@ -52,7 +51,6 @@ public class MusePacketInventoryRefresh extends MusePacket {
public void handleClient(EntityClientPlayerMP player) {
IInventory inventory = player.inventory;
inventory.setInventorySlotContents(slot, stack);
MuseLogger.logDebug("Received slot " + slot);
GuiScreen playerscreen = Minecraft.getMinecraft().currentScreen;
if (playerscreen != null && playerscreen instanceof MuseGui) {
((MuseGui) playerscreen).refresh();

View file

@ -7,9 +7,9 @@ import java.io.DataInputStream;
import java.io.IOException;
import java.util.List;
import net.machinemuse.powersuits.common.Config;
import net.machinemuse.powersuits.item.ItemUtils;
import net.machinemuse.powersuits.trash.ModuleUtils;
import net.machinemuse.powersuits.trash.PowerModule;
import net.machinemuse.powersuits.item.TinkerAction;
import net.minecraft.client.entity.EntityClientPlayerMP;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.entity.player.InventoryPlayer;
@ -30,23 +30,23 @@ import cpw.mods.fml.relauncher.Side;
*/
public class MusePacketTinkerRequest extends MusePacket {
protected ItemStack stack;
protected int slot;
protected String moduleName;
protected int itemSlot;
protected String tinkerName;
/**
* Constructor for sending this packet.
*
* @param player
* Player making the request
* @param slotToUpgrade
* @param itemSlot
* Slot containing the item for which the upgrade is requested
* @param augToUpgrade
* @param tinkerName
*/
public MusePacketTinkerRequest(Player player, int slotToUpgrade,
String augToUpgrade) {
public MusePacketTinkerRequest(Player player, int itemSlot,
String tinkerName) {
super(player);
writeInt(slotToUpgrade);
writeString(augToUpgrade);
writeInt(itemSlot);
writeString(tinkerName);
}
/**
@ -59,31 +59,30 @@ public class MusePacketTinkerRequest extends MusePacket {
*/
public MusePacketTinkerRequest(DataInputStream data, Player player) {
super(player, data);
slot = readInt();
moduleName = readString(64);
itemSlot = readInt();
tinkerName = readString(64);
Side side = FMLCommonHandler.instance().getEffectiveSide();
if (side == Side.SERVER) {
EntityPlayerMP srvplayer = (EntityPlayerMP) player;
stack = srvplayer.inventory.getStackInSlot(slot);
stack = srvplayer.inventory.getStackInSlot(itemSlot);
}
}
@Override
public void handleServer(EntityPlayerMP playerEntity) {
if (moduleName != null) {
if (tinkerName != null) {
InventoryPlayer inventory = playerEntity.inventory;
int entityId = playerEntity.entityId;
PowerModule moduleType = ModuleUtils.getModuleByID(moduleName);
NBTTagCompound moduleTag = ModuleUtils.getItemModules(stack)
TinkerAction tinkerType = Config.getTinkerings().get(tinkerName);
NBTTagCompound itemTag = ItemUtils
.getItemModularProperties(stack)
.getCompoundTag(
moduleName);
List<ItemStack> cost = moduleType.getCost(playerEntity,
moduleTag);
if (ItemUtils.hasInInventory(cost, inventory)) {
tinkerName);
if (tinkerType.validate(playerEntity, stack)) {
List<Integer> slots = ItemUtils.deleteFromInventory(
cost, inventory);
moduleType.onUpgrade(playerEntity, moduleTag);
slots.add(this.slot);
tinkerType.getCosts(), inventory);
tinkerType.apply(stack);
slots.add(this.itemSlot);
for (Integer slotiter : slots) {
MusePacket reply = new MusePacketInventoryRefresh(
player,