From 4284984439cd3cd5236ec985ce1b52a0c85603a0 Mon Sep 17 00:00:00 2001 From: LemADEC Date: Sat, 23 Aug 2014 12:27:38 +0200 Subject: [PATCH] Merging DarkholmeTenk & cleanup Updating chunkloader block Addind decorative block Updated registries to static (?) Reverted interfaces back in main mod Updated formating in TileEntityParticleBooster Renamed BlockBeacon to BlockTransportBeacon for consistency --- src/assets/warpdrive/lang/en_US.lang | 13 +- .../warpdrive/textures/blocks/chunkLoader.png | Bin 0 -> 3976 bytes .../warpdrive/textures/blocks/chunkLoader.psd | Bin 0 -> 35326 bytes .../textures/blocks/decorativeNetwork.png | Bin 0 -> 4176 bytes .../textures/blocks/decorativeNetwork.psd | Bin 0 -> 35026 bytes .../textures/blocks/decorativePlain.png | Bin 0 -> 3430 bytes .../textures/blocks/decorativePlain.psd | Bin 0 -> 31218 bytes .../textures/blocks/upgradeEnergy.png | Bin 0 -> 3521 bytes .../textures/blocks/upgradePower.png | Bin 0 -> 3546 bytes .../textures/blocks/upgradeRange.png | Bin 0 -> 3453 bytes .../textures/blocks/upgradeSpeed.png | Bin 0 -> 3601 bytes .../warpdrive/textures/blocks/upgrades.psd | Bin 0 -> 41356 bytes src/cr0s/WarpDrive/WarpDrive.java | 135 +++++---- .../api}/IBlockUpdateDetector.java | 2 +- src/cr0s/WarpDrive/api/IUpgradable.java | 13 + src/cr0s/WarpDrive/block/BlockDecorative.java | 90 +++++- ...kBeacon.java => BlockTransportBeacon.java} | 5 +- .../WarpDrive/block/ItemBlockDecorative.java | 40 +++ src/cr0s/WarpDrive/data/EnumUpgradeTypes.java | 6 + src/cr0s/WarpDrive/item/ItemWarpArmor.java | 5 - .../WarpDrive/item/ItemWarpComponent.java | 1 - src/cr0s/WarpDrive/item/ItemWarpUpgrade.java | 129 ++++++++- .../WarpDrive/machines/BlockChunkLoader.java | 37 +++ .../WarpDrive/machines/BlockPowerLaser.java | 3 - .../WarpDrive/machines/BlockPowerReactor.java | 3 - .../WarpDrive/machines/BlockTransporter.java | 22 +- .../machines/TileEntityChunkLoader.java | 257 ++++++++++++++++++ .../TileEntityCloakingDeviceCore.java | 12 +- .../machines/TileEntityMiningLaser.java | 86 +++--- .../machines/TileEntityParticleBooster.java | 68 ++--- .../machines/TileEntityPowerLaser.java | 2 +- .../machines/TileEntityPowerReactor.java | 2 +- .../machines/TileEntityTransporter.java | 114 ++++++-- .../machines/WarpBlockContainer.java | 51 +++- src/cr0s/WarpDrive/machines/WarpChunkTE.java | 47 +++- src/cr0s/WarpDrive/machines/WarpEnergyTE.java | 51 +++- src/cr0s/WarpDriveCore/IUpgradable.java | 9 - 37 files changed, 993 insertions(+), 210 deletions(-) create mode 100644 src/assets/warpdrive/textures/blocks/chunkLoader.png create mode 100644 src/assets/warpdrive/textures/blocks/chunkLoader.psd create mode 100644 src/assets/warpdrive/textures/blocks/decorativeNetwork.png create mode 100644 src/assets/warpdrive/textures/blocks/decorativeNetwork.psd create mode 100644 src/assets/warpdrive/textures/blocks/decorativePlain.png create mode 100644 src/assets/warpdrive/textures/blocks/decorativePlain.psd create mode 100644 src/assets/warpdrive/textures/blocks/upgradeEnergy.png create mode 100644 src/assets/warpdrive/textures/blocks/upgradePower.png create mode 100644 src/assets/warpdrive/textures/blocks/upgradeRange.png create mode 100644 src/assets/warpdrive/textures/blocks/upgradeSpeed.png create mode 100644 src/assets/warpdrive/textures/blocks/upgrades.psd rename src/cr0s/{WarpDriveCore => WarpDrive/api}/IBlockUpdateDetector.java (73%) create mode 100644 src/cr0s/WarpDrive/api/IUpgradable.java rename src/cr0s/WarpDrive/block/{BlockBeacon.java => BlockTransportBeacon.java} (92%) create mode 100644 src/cr0s/WarpDrive/block/ItemBlockDecorative.java create mode 100644 src/cr0s/WarpDrive/data/EnumUpgradeTypes.java create mode 100644 src/cr0s/WarpDrive/machines/BlockChunkLoader.java create mode 100644 src/cr0s/WarpDrive/machines/TileEntityChunkLoader.java delete mode 100644 src/cr0s/WarpDriveCore/IUpgradable.java diff --git a/src/assets/warpdrive/lang/en_US.lang b/src/assets/warpdrive/lang/en_US.lang index 15b11cf6..8bd3e416 100644 --- a/src/assets/warpdrive/lang/en_US.lang +++ b/src/assets/warpdrive/lang/en_US.lang @@ -9,6 +9,12 @@ item.warpdrive.crafting.InterfacePower.name=Power Interface item.warpdrive.crafting.PowerCore.name=Energy Core item.warpdrive.crafting.AirCanisterEmpty.name=Empty Air Canister +item.warpdrive.upgrade.Power.name=Power Upgrade +item.warpdrive.upgrade.Speed.name=Speed Upgrade +item.warpdrive.upgrade.Range.name=Range Upgrade +item.warpdrive.upgrade.Energy.name=Energy Upgrade + +item.warpdrive.items.ReactorLaserFocus.name=Reactor Laser Focus item.warpdrive.items.AirCanisterFull.name=Air Canister item.warpdrive.armor.Helmet.name=Warp Helmet @@ -16,7 +22,11 @@ tile.warpdrive.blocks.Air.name=Air Block tile.warpdrive.blocks.Gas.name=Gas Block tile.warpdrive.blocks.WarpIsolation.name=Warp-field Isolation Block tile.warpdrive.blocks.IridiumBlock.name=Iridium Block -item.warpdrive.items.ReactorLaserFocus.name=Reactor Laser Focus + +tile.warpdrive.decorative.Plain.name=Plain Block +tile.warpdrive.decorative.Energized.name=Energized Block +tile.warpdrive.decorative.Network.name=Network Block + tile.warpdrive.power.Reactor.name=Enantiomorphic Reactor tile.warpdrive.power.Laser.name=Aurbis Reactor Stabilisation Laser tile.warpdrive.power.Store.name=Anuic Energy Store @@ -36,4 +46,5 @@ tile.warpdrive.machines.LaserLift.name=Laser Lift tile.warpdrive.machines.Transporter.name=Transporter tile.warpdrive.machines.Scanner.name=Ship Scanner tile.warpdrive.machines.AirGenerator.name=Air Generator +tile.warpdrive.machines.ChunkLoader.name=Chunk Loader tile.warpdrive.machines.LaserReactorMonitor.name=Laser Reactor Monitor diff --git a/src/assets/warpdrive/textures/blocks/chunkLoader.png b/src/assets/warpdrive/textures/blocks/chunkLoader.png new file mode 100644 index 0000000000000000000000000000000000000000..4de2e952cd446451553b8699d53790bf2450f041 GIT binary patch literal 3976 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 literal 0 HcmV?d00001 diff --git a/src/assets/warpdrive/textures/blocks/decorativeNetwork.png b/src/assets/warpdrive/textures/blocks/decorativeNetwork.png new file mode 100644 index 0000000000000000000000000000000000000000..0e48177ffbf645ec22d3734c514c2be251de9c46 GIT binary patch literal 4176 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 AOaK4? literal 0 HcmV?d00001 diff --git a/src/assets/warpdrive/textures/blocks/decorativePlain.png b/src/assets/warpdrive/textures/blocks/decorativePlain.png new file mode 100644 index 0000000000000000000000000000000000000000..56a71921f5e739d36a8cde6db870640284784ed2 GIT binary patch literal 3430 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 IM6N<$g0ewr-v9sr literal 0 HcmV?d00001 diff --git a/src/assets/warpdrive/textures/blocks/decorativePlain.psd b/src/assets/warpdrive/textures/blocks/decorativePlain.psd new file mode 100644 index 0000000000000000000000000000000000000000..8c5dc32ea4f642f09e78856e6b14658ebcbdd61c GIT binary patch literal 31218 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 OW(bLJ|NsAV|Njr~bn=n_ literal 0 HcmV?d00001 diff --git a/src/assets/warpdrive/textures/blocks/upgradeEnergy.png b/src/assets/warpdrive/textures/blocks/upgradeEnergy.png new file mode 100644 index 0000000000000000000000000000000000000000..2ba8f1052129f9949df768e4f45cf822a530a18a GIT binary patch literal 3521 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 literal 0 HcmV?d00001 diff --git a/src/assets/warpdrive/textures/blocks/upgradeRange.png b/src/assets/warpdrive/textures/blocks/upgradeRange.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c04533923c4d4217399731634f0760459ba09f GIT binary patch literal 3453 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 literal 0 HcmV?d00001 diff --git a/src/assets/warpdrive/textures/blocks/upgradeSpeed.png b/src/assets/warpdrive/textures/blocks/upgradeSpeed.png new file mode 100644 index 0000000000000000000000000000000000000000..8b595967b164bab1eec760ce081f0253401bd75f GIT binary patch literal 3601 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 W_FCAlxw(b5ZRZi;(czIgMgAXHaQCAC literal 0 HcmV?d00001 diff --git a/src/cr0s/WarpDrive/WarpDrive.java b/src/cr0s/WarpDrive/WarpDrive.java index 335ed11d..be4dbeaf 100644 --- a/src/cr0s/WarpDrive/WarpDrive.java +++ b/src/cr0s/WarpDrive/WarpDrive.java @@ -35,9 +35,12 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.EnumArmorMaterial; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; import net.minecraft.world.biome.BiomeGenBase; import net.minecraftforge.common.Configuration; import net.minecraftforge.common.DimensionManager; @@ -88,9 +91,12 @@ public class WarpDrive implements LoadingCallback { public static Block iridiumBlock; public static Block transportBeaconBlock; + public static Block chunkLoaderBlock; + public static BlockDecorative decorativeBlock; public static Item reactorLaserFocusItem; public static ItemWarpComponent componentItem; + public static ItemWarpUpgrade upgradeItem; public static EnumArmorMaterial armorMaterial = EnumHelper.addArmorMaterial("WARP", 5, new int[]{1, 3, 2, 1}, 15); public static ItemWarpArmor helmetItem; @@ -113,12 +119,11 @@ public class WarpDrive implements LoadingCallback { @SidedProxy(clientSide = "cr0s.WarpDrive.client.ClientProxy", serverSide = "cr0s.WarpDrive.CommonProxy") public static CommonProxy proxy; - public WarpCoresRegistry warpCores; - public JumpgatesRegistry jumpgates; - - public CloakManager cloaks; + public static WarpCoresRegistry warpCores; + public static JumpgatesRegistry jumpgates; + public static CloakManager cloaks; - public CamRegistry cams; + public static CamRegistry cams; public boolean isOverlayEnabled = false; public int overlayType = 0; public String debugMessage = ""; @@ -127,8 +132,7 @@ public class WarpDrive implements LoadingCallback { public static String defHelpStr = "help(\"functionName\"): returns help for the function specified"; public static String defEnergyStr = "energy(): returns currently contained energy, max contained energy"; - - private LinkedList warpTickets = new LinkedList(); + public static String defUpgradeStr = "upgrades(): returns a list of currently installed upgrades"; @EventHandler public void preInit(FMLPreInitializationEvent event) { @@ -288,13 +292,9 @@ public class WarpDrive implements LoadingCallback { GameRegistry.registerTileEntity(TileEntityLaserReactorMonitor.class,"reactorMonitor"); // TRANSPORT BEACON - /*transportBeaconBlock = new BlockTransportBeacon(WarpDriveConfig.transportBeaconID) - .setHardness(0.5F) - .setStepSound(Block.soundMetalFootstep) - .setCreativeTab(CreativeTabs.tabRedstone) - .setUnlocalizedName("warpdrive.blocks.TransporterBeacon"); + transportBeaconBlock = new BlockTransportBeacon(WarpDriveConfig.transportBeaconID); - GameRegistry.registerBlock(transportBeaconBlock, "transportBeacon");*/ + GameRegistry.registerBlock(transportBeaconBlock, "transportBeacon"); // POWER STUFF powerReactorBlock = new BlockPowerReactor(WarpDriveConfig.powerReactorID); @@ -307,6 +307,15 @@ public class WarpDrive implements LoadingCallback { GameRegistry.registerBlock(powerStoreBlock,"powerStore"); GameRegistry.registerTileEntity(TileEntityPowerStore.class, "powerStore"); + // CHUNK LOADER + chunkLoaderBlock = new BlockChunkLoader(WarpDriveConfig.chunkLoaderID); + GameRegistry.registerBlock(chunkLoaderBlock, "chunkLoader"); + GameRegistry.registerTileEntity(TileEntityChunkLoader.class, "chunkLoader"); + + // DECORATIVE + decorativeBlock = new BlockDecorative(WarpDriveConfig.decorativeID); + GameRegistry.registerBlock(decorativeBlock, ItemBlockDecorative.class, "decorative"); + // REACTOR LASER FOCUS reactorLaserFocusItem = new ItemReactorLaserFocus(WarpDriveConfig.reactorLaserFocusID); GameRegistry.registerItem(reactorLaserFocusItem, "reactorLaserFocus"); @@ -321,6 +330,9 @@ public class WarpDrive implements LoadingCallback { airCanisterItem = new ItemWarpAirCanister(WarpDriveConfig.airCanisterID); GameRegistry.registerItem(airCanisterItem, "airCanisterFull"); + upgradeItem = new ItemWarpUpgrade(WarpDriveConfig.upgradeID); + GameRegistry.registerItem(upgradeItem, "upgrade"); + proxy.registerEntities(); ForgeChunkManager.setForcedChunkLoadingCallback(instance, instance); @@ -366,6 +378,9 @@ public class WarpDrive implements LoadingCallback { private static void initVanillaRecipes() { componentItem.registerRecipes(); + decorativeBlock.initRecipes(); + upgradeItem.initRecipes(); + //WarpCore GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(warpCore), false, "ipi", "ici", "idi", 'i', Item.ingotIron, @@ -478,14 +493,14 @@ public class WarpDrive implements LoadingCallback { 'n', Item.goldNugget)); //Power Laser - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(powerLaserBlock), false, "iii","ilg","ici", + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(powerLaserBlock), false, "iii", "ilg", "ici", 'i', Item.ingotIron, 'g', Block.glass, 'c', componentItem.getIS(5), 'l', componentItem.getIS(3))); //Power Reactor - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(powerReactorBlock), false, "ipi","gog","ici", + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(powerReactorBlock), false, "ipi", "gog", "ici", 'i', Item.ingotIron, 'g', Block.glass, 'o', componentItem.getIS(4), @@ -493,12 +508,19 @@ public class WarpDrive implements LoadingCallback { 'p', componentItem.getIS(6))); //Power Store - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(powerStoreBlock), false, "ipi","isi","ici", + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(powerStoreBlock), false, "ipi", "isi", "ici", 'i', Item.ingotIron, 's', componentItem.getIS(7), 'c', componentItem.getIS(5), 'p', componentItem.getIS(6))); + //Chunk Loader + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(chunkLoaderBlock), false, "ipi", "ici", "ifi", + 'i', Item.ingotIron, + 'p', componentItem.getIS(6), + 'c', componentItem.getIS(0), + 'f', componentItem.getIS(5))); + //Helmet GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(helmetItem), false, "iii", "iwi", "gcg", 'i', Item.ingotIron, @@ -701,45 +723,12 @@ public class WarpDrive implements LoadingCallback { event.registerServerCommand(new DebugCommand()); } - private ArrayList worldTickets(World worldObj) { - ArrayList worldTicks = new ArrayList(warpTickets.size()); - for(Ticket t: warpTickets) { - if (t.world.equals(worldObj)) { - worldTicks.add(t); - } - } - return worldTicks; - } - public Ticket registerChunkLoadTE(WarpChunkTE te, boolean refreshLoading) { World worldObj = te.worldObj; - ArrayList worldTicks = worldTickets(worldObj); - boolean isWorldTicketed = worldTicks.size() != 0; - if(isWorldTicketed) - { - if(ForgeChunkManager.ticketCountAvailableFor(this, worldObj) > 0) - { - Ticket t = ForgeChunkManager.requestTicket(this, worldObj, Type.NORMAL); - if(t != null) - { - te.giveTicket(t); // FIXME calling the caller is a bad idea - if(refreshLoading) - te.refreshLoading(); - return t; - } - else { - WarpDrive.debugPrint("Ticket not granted"); - } - } - else { - WarpDrive.debugPrint("No tickets left!"); - } - } - else + if (ForgeChunkManager.ticketCountAvailableFor(this, worldObj) > 0) { Ticket t = ForgeChunkManager.requestTicket(this, worldObj, Type.NORMAL); - if(t != null) - { + if (t != null) { te.giveTicket(t); // FIXME calling the caller is a bad idea if(refreshLoading) te.refreshLoading(); @@ -750,31 +739,57 @@ public class WarpDrive implements LoadingCallback { WarpDrive.debugPrint("Ticket not granted"); } } + else + { + WarpDrive.debugPrint("No tickets left!"); + } return null; } public Ticket registerChunkLoadTE(WarpChunkTE te) { - return registerChunkLoadTE(te,true); + return registerChunkLoadTE(te, true); } public Ticket getTicket(WarpChunkTE te) { - return registerChunkLoadTE(te,false); + return registerChunkLoadTE(te, false); } - public void removeTicket(Ticket t) - { - for(Ticket ticket:warpTickets) - if(t.equals(ticket)) - warpTickets.remove(ticket); - } - @Override public void ticketsLoaded(List tickets, World world) { for (Ticket ticket : tickets) + { + NBTTagCompound data = ticket.getModData(); + if(data != null) + { + int w = data.getInteger("ticketWorldObj"); + int x = data.getInteger("ticketX"); + int y = data.getInteger("ticketY"); + int z = data.getInteger("ticketZ"); + if(w != 0 || x != 0 || y != 0 || z != 0) + { + WorldServer ws = DimensionManager.getWorld(w); + if(ws != null) + { + TileEntity te = ws.getBlockTileEntity(x, y, z); + if(te != null && te instanceof WarpChunkTE) + { + if(((WarpChunkTE)te).shouldChunkLoad()) + { + WarpDrive.debugPrint("[TicketCallback] Regiving Ticket!"); + ((WarpChunkTE)te).giveTicket(ticket); + ((WarpChunkTE)te).refreshLoading(true); + return; + } + } + } + } + } + ForgeChunkManager.releaseTicket(ticket); + } } diff --git a/src/cr0s/WarpDriveCore/IBlockUpdateDetector.java b/src/cr0s/WarpDrive/api/IBlockUpdateDetector.java similarity index 73% rename from src/cr0s/WarpDriveCore/IBlockUpdateDetector.java rename to src/cr0s/WarpDrive/api/IBlockUpdateDetector.java index bbb372a7..1ddca042 100644 --- a/src/cr0s/WarpDriveCore/IBlockUpdateDetector.java +++ b/src/cr0s/WarpDrive/api/IBlockUpdateDetector.java @@ -1,4 +1,4 @@ -package cr0s.WarpDriveCore; +package cr0s.WarpDrive.api; public interface IBlockUpdateDetector { diff --git a/src/cr0s/WarpDrive/api/IUpgradable.java b/src/cr0s/WarpDrive/api/IUpgradable.java new file mode 100644 index 00000000..2b691b1a --- /dev/null +++ b/src/cr0s/WarpDrive/api/IUpgradable.java @@ -0,0 +1,13 @@ +package cr0s.WarpDrive.api; + +import java.util.HashMap; +import java.util.Map; + +import cr0s.WarpDrive.data.EnumUpgradeTypes; +import net.minecraft.item.ItemStack; + +public interface IUpgradable +{ + public boolean takeUpgrade(EnumUpgradeTypes upgradeType,boolean simulate); + public Map getInstalledUpgrades(); +} diff --git a/src/cr0s/WarpDrive/block/BlockDecorative.java b/src/cr0s/WarpDrive/block/BlockDecorative.java index 8ca14a1b..6ee13676 100644 --- a/src/cr0s/WarpDrive/block/BlockDecorative.java +++ b/src/cr0s/WarpDrive/block/BlockDecorative.java @@ -1,14 +1,98 @@ package cr0s.WarpDrive.block; +import java.util.List; + +import cpw.mods.fml.common.registry.GameRegistry; + +import cr0s.WarpDrive.WarpDrive; + import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Icon; +import net.minecraftforge.oredict.ShapedOreRecipe; public class BlockDecorative extends Block { - - public BlockDecorative(int par1, Material par2Material) + public static enum decorativeTypes { Plain , Energized , Network }; + private ItemStack[] isCache = new ItemStack[decorativeTypes.values().length]; + private Icon[] iconBuffer = new Icon[decorativeTypes.values().length]; + + public BlockDecorative(int par1) { - super(par1, par2Material); + super(par1, Material.iron); + setHardness(0.5f); + setStepSound(Block.soundMetalFootstep); + setCreativeTab(WarpDrive.warpdriveTab); + } + + public boolean isValidDamage(int damage) + { + return damage >= 0 && damage < decorativeTypes.values().length; + } + + @Override + public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) + { + for(decorativeTypes val: decorativeTypes.values()) + par3List.add(new ItemStack(par1, 1, val.ordinal())); + } + + @Override + public void registerIcons(IconRegister ir) + { + for(decorativeTypes val: decorativeTypes.values()) + iconBuffer[val.ordinal()] = ir.registerIcon("warpdrive:decorative" + val.toString()); + } + + @Override + public Icon getIcon(int side, int damage) + { + if(isValidDamage(damage)) + return iconBuffer[damage]; + return iconBuffer[0]; + } + + @Override + public int damageDropped(int damage) + { + return damage; + } + + public ItemStack getIS(int damage) + { + if(!isValidDamage(damage)) + return null; + + if(isCache[damage] == null) + isCache[damage] = getISNoCache(damage); + return isCache[damage]; + } + + public ItemStack getISNoCache(int damage, int amount) + { + if(!isValidDamage(damage)) + return null; + + return new ItemStack(WarpDrive.decorativeBlock,amount,damage); + } + + public ItemStack getISNoCache(int damage) + { + return getISNoCache(damage,1); + } + + public void initRecipes() + { + GameRegistry.addRecipe(new ShapedOreRecipe(getISNoCache(0,8),false, "sss","scs","sss", + 's', Block.stone, + 'c', WarpDrive.componentItem.getIS(0))); + + GameRegistry.addRecipe(new ShapedOreRecipe(getISNoCache(2,8),false, "sss","scs","sss", + 's', getIS(0), + 'c', WarpDrive.componentItem.getIS(5))); } } diff --git a/src/cr0s/WarpDrive/block/BlockBeacon.java b/src/cr0s/WarpDrive/block/BlockTransportBeacon.java similarity index 92% rename from src/cr0s/WarpDrive/block/BlockBeacon.java rename to src/cr0s/WarpDrive/block/BlockTransportBeacon.java index 7bde4d5e..074ee688 100644 --- a/src/cr0s/WarpDrive/block/BlockBeacon.java +++ b/src/cr0s/WarpDrive/block/BlockTransportBeacon.java @@ -6,14 +6,15 @@ import cr0s.WarpDrive.WarpDrive; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.creativetab.CreativeTabs; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; -public class BlockBeacon extends Block +public class BlockTransportBeacon extends Block { - public BlockBeacon(int par1) + public BlockTransportBeacon(int par1) { super(par1, Material.iron); setHardness(0.5F); diff --git a/src/cr0s/WarpDrive/block/ItemBlockDecorative.java b/src/cr0s/WarpDrive/block/ItemBlockDecorative.java new file mode 100644 index 00000000..45c1c4c8 --- /dev/null +++ b/src/cr0s/WarpDrive/block/ItemBlockDecorative.java @@ -0,0 +1,40 @@ +package cr0s.WarpDrive.block; + +import java.util.List; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class ItemBlockDecorative extends ItemBlock +{ + + public ItemBlockDecorative(int par1) + { + super(par1); + setHasSubtypes(true); + setUnlocalizedName("warpdrive.block.decorative"); + } + + @Override + public int getMetadata (int damage) + { + return damage; + } + + @Override + public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List) + { + for(int i = 0; i < BlockDecorative.decorativeTypes.values().length;i++) + par3List.add(new ItemStack(par1,1,i)); + } + + @Override + public String getUnlocalizedName(ItemStack itemstack) + { + if(itemstack == null) + return getUnlocalizedName(); + return "tile.warpdrive.decorative." + BlockDecorative.decorativeTypes.values()[itemstack.getItemDamage()].toString(); + } + +} diff --git a/src/cr0s/WarpDrive/data/EnumUpgradeTypes.java b/src/cr0s/WarpDrive/data/EnumUpgradeTypes.java new file mode 100644 index 00000000..53652609 --- /dev/null +++ b/src/cr0s/WarpDrive/data/EnumUpgradeTypes.java @@ -0,0 +1,6 @@ +package cr0s.WarpDrive.data; + +public enum EnumUpgradeTypes +{ + Power, Energy, Speed, Range; +} diff --git a/src/cr0s/WarpDrive/item/ItemWarpArmor.java b/src/cr0s/WarpDrive/item/ItemWarpArmor.java index e3ee56ba..67fe3487 100644 --- a/src/cr0s/WarpDrive/item/ItemWarpArmor.java +++ b/src/cr0s/WarpDrive/item/ItemWarpArmor.java @@ -1,19 +1,14 @@ package cr0s.WarpDrive.item; -import java.util.Random; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import cr0s.WarpDrive.WarpDrive; -import cr0s.WarpDrive.WarpDriveConfig; import cr0s.WarpDrive.api.IAirCanister; import cr0s.WarpDrive.api.IBreathingHelmet; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.item.EnumArmorMaterial; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; import net.minecraft.util.Icon; diff --git a/src/cr0s/WarpDrive/item/ItemWarpComponent.java b/src/cr0s/WarpDrive/item/ItemWarpComponent.java index a40ebd09..9f8e3555 100644 --- a/src/cr0s/WarpDrive/item/ItemWarpComponent.java +++ b/src/cr0s/WarpDrive/item/ItemWarpComponent.java @@ -23,7 +23,6 @@ public class ItemWarpComponent extends Item implements IAirCanister { public ItemWarpComponent(int par1) { super(par1); setHasSubtypes(true); - //this.setMaxDamage(potentialUnlocalized.length); setUnlocalizedName("warpdrive.crafting.Malformed"); setCreativeTab(WarpDrive.warpdriveTab); diff --git a/src/cr0s/WarpDrive/item/ItemWarpUpgrade.java b/src/cr0s/WarpDrive/item/ItemWarpUpgrade.java index ff4a46dd..179d295d 100644 --- a/src/cr0s/WarpDrive/item/ItemWarpUpgrade.java +++ b/src/cr0s/WarpDrive/item/ItemWarpUpgrade.java @@ -1,14 +1,137 @@ package cr0s.WarpDrive.item; +import java.util.List; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import cr0s.WarpDrive.WarpDrive; +import cr0s.WarpDrive.data.EnumUpgradeTypes; + +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Icon; +import net.minecraftforge.oredict.ShapedOreRecipe; -public class ItemWarpUpgrade extends Item { - - public static enum upgradeTypes { POWER, ENERGY, SPEED, RANGE }; +public class ItemWarpUpgrade extends Item +{ + private ItemStack[] isCache = new ItemStack[EnumUpgradeTypes.values().length]; + private Icon[] iconBuffer = new Icon[EnumUpgradeTypes.values().length]; public ItemWarpUpgrade(int par1) { super(par1); + setHasSubtypes(true); + setUnlocalizedName("warpdrive.upgrade.Malformed"); + setCreativeTab(WarpDrive.warpdriveTab); + } + + private boolean isValidDamage(int damage) + { + return damage >= 0 && damage < EnumUpgradeTypes.values().length; + } + + public ItemStack getIS(int damage) + { + if(!isValidDamage(damage)) + return null; + + if(isCache[damage] == null) + isCache[damage] = getISNoCache(damage); + return isCache[damage]; + } + + public ItemStack getISNoCache(int damage) + { + if(!isValidDamage(damage)) + return null; + + return new ItemStack(WarpDrive.upgradeItem,1,damage); + } + + @Override + public String getUnlocalizedName(ItemStack is) + { + if(is == null) + return null; + + int damage = is.getItemDamage(); + if(isValidDamage(damage)) + return "item.warpdrive.upgrade." + EnumUpgradeTypes.values()[damage].toString(); + + return null; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List) + { + for(int i=0;i= 0 && damage < EnumUpgradeTypes.values().length) + return iconBuffer[damage]; + return iconBuffer[0]; } } diff --git a/src/cr0s/WarpDrive/machines/BlockChunkLoader.java b/src/cr0s/WarpDrive/machines/BlockChunkLoader.java new file mode 100644 index 00000000..7a9e1c97 --- /dev/null +++ b/src/cr0s/WarpDrive/machines/BlockChunkLoader.java @@ -0,0 +1,37 @@ +package cr0s.WarpDrive.machines; + +import cr0s.WarpDrive.machines.WarpBlockContainer; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Icon; +import net.minecraft.world.World; + +public class BlockChunkLoader extends WarpBlockContainer +{ + Icon iconBuffer; + + public BlockChunkLoader(int par1) + { + super(par1); + setUnlocalizedName("warpdrive.machines.ChunkLoader"); + } + + @Override + public TileEntity createNewTileEntity(World world) + { + return new TileEntityChunkLoader(); + } + + @Override + public void registerIcons(IconRegister ir) + { + iconBuffer = ir.registerIcon("warpdrive:chunkLoader"); + } + + @Override + public Icon getIcon(int side, int damage) + { + return iconBuffer; + } + +} diff --git a/src/cr0s/WarpDrive/machines/BlockPowerLaser.java b/src/cr0s/WarpDrive/machines/BlockPowerLaser.java index 9cdb47e8..9fe0be60 100644 --- a/src/cr0s/WarpDrive/machines/BlockPowerLaser.java +++ b/src/cr0s/WarpDrive/machines/BlockPowerLaser.java @@ -2,9 +2,6 @@ package cr0s.WarpDrive.machines; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; diff --git a/src/cr0s/WarpDrive/machines/BlockPowerReactor.java b/src/cr0s/WarpDrive/machines/BlockPowerReactor.java index 8955fb98..0b1a39dd 100644 --- a/src/cr0s/WarpDrive/machines/BlockPowerReactor.java +++ b/src/cr0s/WarpDrive/machines/BlockPowerReactor.java @@ -2,9 +2,6 @@ package cr0s.WarpDrive.machines; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import cr0s.WarpDrive.WarpDrive; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; diff --git a/src/cr0s/WarpDrive/machines/BlockTransporter.java b/src/cr0s/WarpDrive/machines/BlockTransporter.java index 285bda6d..35b0c219 100644 --- a/src/cr0s/WarpDrive/machines/BlockTransporter.java +++ b/src/cr0s/WarpDrive/machines/BlockTransporter.java @@ -6,22 +6,18 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import cr0s.WarpDrive.WarpDrive; import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; import net.minecraft.world.World; -public class BlockTransporter extends BlockContainer { +public class BlockTransporter extends WarpBlockContainer { private Icon[] iconBuffer; public BlockTransporter(int par1, Material par2Material) { super(par1, par2Material); - setHardness(0.5F); - setStepSound(Block.soundMetalFootstep); - setCreativeTab(WarpDrive.warpdriveTab); setUnlocalizedName("warpdrive.machines.Transporter"); } @@ -48,20 +44,4 @@ public class BlockTransporter extends BlockContainer { return iconBuffer[2]; } - - /** - * Returns the quantity of items to drop on block destruction. - */ - @Override - public int quantityDropped(Random par1Random) { - return 1; - } - - /** - * Returns the ID of the items to drop on destruction. - */ - @Override - public int idDropped(int par1, Random par2Random, int par3) { - return this.blockID; - } } \ No newline at end of file diff --git a/src/cr0s/WarpDrive/machines/TileEntityChunkLoader.java b/src/cr0s/WarpDrive/machines/TileEntityChunkLoader.java new file mode 100644 index 00000000..8cd6af25 --- /dev/null +++ b/src/cr0s/WarpDrive/machines/TileEntityChunkLoader.java @@ -0,0 +1,257 @@ +package cr0s.WarpDrive.machines; + +import java.util.Map; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.chunk.Chunk; +import cr0s.WarpDrive.data.EnumUpgradeTypes; +import cr0s.WarpDrive.WarpDrive; +import cr0s.WarpDrive.WarpDriveConfig; +import cr0s.WarpDrive.api.IUpgradable; +import dan200.computercraft.api.lua.ILuaContext; +import dan200.computercraft.api.peripheral.IComputerAccess; +import dan200.computercraft.api.peripheral.IPeripheral; + +public class TileEntityChunkLoader extends WarpChunkTE implements IPeripheral, IUpgradable +{ + private boolean canLoad = false; + private boolean shouldLoad = false; + + private boolean inited = false; + private ChunkCoordIntPair myChunk; + + int negDX, posDX, negDZ, posDZ; + int area = 1; + + private String[] methodArray = { + "energy", + "radius", + "bounds", + "active", + "upgrades", + "help" + }; + + { + negDX = 0; + negDZ = 0; + posDX = 0; + posDZ = 0; + } + + @Override + public int getMaxEnergyStored() + { + return WarpDriveConfig.CL_MAX_ENERGY; + } + + @Override + public boolean shouldChunkLoad() + { + return shouldLoad && canLoad; + } + + @Override + public void updateEntity() + { + super.updateEntity(); + + if(!inited) + { + inited = true; + myChunk = worldObj.getChunkFromBlockCoords(xCoord, zCoord).getChunkCoordIntPair(); + changedDistance(); + } + + if(shouldLoad) + { + canLoad = consumeEnergy(area * WarpDriveConfig.CL_RF_PER_CHUNKTICK, false); + } + else + { + canLoad = consumeEnergy(area * WarpDriveConfig.CL_RF_PER_CHUNKTICK, true); + } + } + + private int clampDistance(int dis) + { + return clamp(dis,0,WarpDriveConfig.CL_MAX_DISTANCE); + } + + private void changedDistance() + { + if(worldObj == null) { + return; + } + if (myChunk == null) { + Chunk aChunk = worldObj.getChunkFromBlockCoords(xCoord, zCoord); + if (aChunk != null) { + myChunk = aChunk.getChunkCoordIntPair(); + } else { + return; + } + } + negDX = -clampDistance(negDX); + posDX = clampDistance(posDX); + negDZ = -clampDistance(negDZ); + posDZ = clampDistance(posDZ); + minChunk = new ChunkCoordIntPair(myChunk.chunkXPos+negDX,myChunk.chunkZPos+negDZ); + maxChunk = new ChunkCoordIntPair(myChunk.chunkXPos+posDX,myChunk.chunkZPos+posDZ); + area = (posDX - negDX + 1) * (posDZ - negDZ + 1); + refreshLoading(true); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) + { + super.readFromNBT(nbt); + negDX = nbt.getInteger("negDX"); + negDZ = nbt.getInteger("negDZ"); + posDX = nbt.getInteger("posDX"); + posDZ = nbt.getInteger("posDZ"); + + changedDistance(); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) + { + super.writeToNBT(nbt); + nbt.setInteger("negDX", negDX); + nbt.setInteger("negDZ", negDZ); + nbt.setInteger("posDX", posDX); + nbt.setInteger("posDZ", posDZ); + } + + @Override + public String getType() + { + return "warpdriveChunkloader"; + } + + @Override + public String[] getMethodNames() + { + return methodArray; + } + + private String helpStr(Object[] args) + { + if(args.length == 1) + { + String m = args[0].toString().toLowerCase(); + if(m.equals("energy")) + return WarpDrive.defEnergyStr; + else if(m.equals("radius")) + return "radius(int): sets the radius in chunks"; + else if(m.equals("bounds")) + return "bounds(int,int,int,int): sets the bounds of chunks to load\nbounds(): returns the 4 bounds\nFormat is -X, +X, -Z, +Z"; + else if(m.equals("active")) + return "active(): returns whether active or not\nactive(boolean): sets whether it should be active or not"; + else if(m.equals("upgrades")) + return WarpDrive.defUpgradeStr; + } + return WarpDrive.defHelpStr; + } + + @Override + public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws Exception + { + String meth = methodArray[method]; + + if(meth.equals("energy")) + return getEnergyObject(); + else if(meth.equals("radius")) + { + if(arguments.length == 1) + { + int dist = toInt(arguments[0]); + negDX = dist; + negDZ = dist; + posDX = dist; + posDZ = dist; + changedDistance(); + return new Object[] { true }; + } + return new Object[] { false }; + } + else if(meth.equals("bounds")) + { + if(arguments.length == 4) + { + negDX = toInt(arguments[0]); + posDX = toInt(arguments[1]); + negDZ = toInt(arguments[2]); + posDZ = toInt(arguments[3]); + changedDistance(); + } + return new Object[] { negDX, posDX, negDZ, posDZ }; + } + else if(meth.equals("active")) + { + if(arguments.length == 1) + shouldLoad = toBool(arguments[0]); + return new Object[] { shouldChunkLoad() }; + } + else if(meth.equals("upgrades")) + { + return getUpgrades(); + } + else if(meth.equals("help")) + { + return new Object[] {helpStr(arguments) }; + } + + return null; + } + + @Override + public void attach(IComputerAccess computer) + { + } + + @Override + public void detach(IComputerAccess computer) + { + } + + @Override + public boolean equals(IPeripheral other) + { + return false; + } + + @Override + public boolean takeUpgrade(EnumUpgradeTypes upgradeType, boolean simulate) + { + int max = 0; + if(upgradeType == EnumUpgradeTypes.Energy) + max = 2; + else if(upgradeType == EnumUpgradeTypes.Power) + max = 2; + + if(max == 0) + return false; + + if(upgrades.containsKey(upgradeType)) + if(upgrades.get(upgradeType) >= max) + return false; + + if(!simulate) + { + int c = 0; + if(upgrades.containsKey(upgradeType)) + c = upgrades.get(upgradeType); + upgrades.put(upgradeType, c+1); + } + return true; + } + + @Override + public Map getInstalledUpgrades() + { + return upgrades; + } + +} diff --git a/src/cr0s/WarpDrive/machines/TileEntityCloakingDeviceCore.java b/src/cr0s/WarpDrive/machines/TileEntityCloakingDeviceCore.java index 80dca1c7..aa68d3f1 100644 --- a/src/cr0s/WarpDrive/machines/TileEntityCloakingDeviceCore.java +++ b/src/cr0s/WarpDrive/machines/TileEntityCloakingDeviceCore.java @@ -70,7 +70,7 @@ public class TileEntityCloakingDeviceCore extends WarpEnergyTE implements IPerip updateTicks = ((tier == 1) ? 20 : (tier == 2) ? 10 : 20) * WarpDriveConfig.CD_FIELD_REFRESH_INTERVAL_SECONDS; // resetting timer isValid = validateAssembly(); - isCloaking = WarpDrive.instance.cloaks.isAreaExists(worldObj, xCoord, yCoord, zCoord); + isCloaking = WarpDrive.cloaks.isAreaExists(worldObj, xCoord, yCoord, zCoord); if (!isEnabled) {// disabled if (isCloaking) {// disabled, cloaking => stop cloaking WarpDrive.debugPrint("" + this + " Disabled, cloak field going down..."); @@ -85,14 +85,14 @@ public class TileEntityCloakingDeviceCore extends WarpEnergyTE implements IPerip setCoilsState(true); // Register cloak - WarpDrive.instance.cloaks.addCloakedAreaWorld(worldObj, minX, minY, minZ, maxX, maxY, maxZ, xCoord, yCoord, zCoord, tier); + WarpDrive.cloaks.addCloakedAreaWorld(worldObj, minX, minY, minZ, maxX, maxY, maxZ, xCoord, yCoord, zCoord, tier); if (!soundPlayed) { soundPlayed = true; worldObj.playSoundEffect(xCoord + 0.5f, yCoord + 0.5f, zCoord + 0.5f, "warpdrive:cloak", 4F, 1F); } // Refresh the field - CloakedArea area = WarpDrive.instance.cloaks.getCloakedArea(worldObj, xCoord, yCoord, zCoord); + CloakedArea area = WarpDrive.cloaks.getCloakedArea(worldObj, xCoord, yCoord, zCoord); if (area != null) { area.sendCloakPacketToPlayersEx(false); // recloak field } @@ -108,7 +108,7 @@ public class TileEntityCloakingDeviceCore extends WarpEnergyTE implements IPerip if (hasEnoughPower) {// enabled, cloaking and able to // IDLE // Refresh the field !!! LemTest 2014-07-12 - CloakedArea area = WarpDrive.instance.cloaks.getCloakedArea(worldObj, xCoord, yCoord, zCoord); + CloakedArea area = WarpDrive.cloaks.getCloakedArea(worldObj, xCoord, yCoord, zCoord); if (area != null) { area.sendCloakPacketToPlayersEx(false); // recloak field } @@ -228,8 +228,8 @@ public class TileEntityCloakingDeviceCore extends WarpEnergyTE implements IPerip public void disableCloakingField() { setCoilsState(false); - if (WarpDrive.instance.cloaks.isAreaExists(worldObj, xCoord, yCoord, zCoord)) { - WarpDrive.instance.cloaks.removeCloakedArea(worldObj, xCoord, yCoord, zCoord); + if (WarpDrive.cloaks.isAreaExists(worldObj, xCoord, yCoord, zCoord)) { + WarpDrive.cloaks.removeCloakedArea(worldObj, xCoord, yCoord, zCoord); if (!soundPlayed) { soundPlayed = true; diff --git a/src/cr0s/WarpDrive/machines/TileEntityMiningLaser.java b/src/cr0s/WarpDrive/machines/TileEntityMiningLaser.java index 80ee8f2a..7680c870 100644 --- a/src/cr0s/WarpDrive/machines/TileEntityMiningLaser.java +++ b/src/cr0s/WarpDrive/machines/TileEntityMiningLaser.java @@ -9,6 +9,7 @@ import dan200.computercraft.api.peripheral.IPeripheral; import java.util.ArrayList; import java.util.List; +import cofh.api.transport.IItemConduit; import net.minecraft.block.Block; import net.minecraft.block.BlockFluid; import net.minecraft.entity.item.EntityItem; @@ -17,6 +18,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.inventory.IInventory; import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fluids.FluidRegistry; import appeng.api.WorldCoord; @@ -243,13 +245,28 @@ public class TileEntityMiningLaser extends TileEntity implements IPeripheral, IG List stacks = getItemStackFromBlock(valuable.intX(), valuable.intY(), valuable.intZ(), blockID, blockMeta); if (stacks != null) { boolean overflow = false; + int qtyLeft = 0; + ItemStack stackLeft = null; for (ItemStack stack : stacks) { - if (grid != null && AENetworkReady) { - putInGrid(stack); - } else { - if (!putInChest(findChest(), stack)) { - WarpDrive.debugPrint("" + this + " Overflow detected"); - overflow = true; + qtyLeft = putInGrid(stack); +/* if (qtyLeft > 0) { // FIXME: untested + stackLeft = copyWithSize(stack, qtyLeft); + qtyLeft = putInPipe(stackLeft); + }/**/ + if (qtyLeft > 0) { + stackLeft = copyWithSize(stack, qtyLeft); + qtyLeft = putInChest(findChest(), stackLeft); + } + if (qtyLeft > 0) { + WarpDrive.debugPrint("" + this + " Overflow detected"); + overflow = true; + int transfer; + while (qtyLeft > 0) { + transfer = Math.min(qtyLeft, stack.getMaxStackSize()); + ItemStack dropItemStack = copyWithSize(stack, transfer); + EntityItem itemEnt = new EntityItem(worldObj, xCoord + 0.5D, yCoord + 1.0D, zCoord + 0.5D, dropItemStack); + worldObj.spawnEntityInWorld(itemEnt); + qtyLeft -= transfer; } } } @@ -345,23 +362,38 @@ public class TileEntityMiningLaser extends TileEntity implements IPeripheral, IG return block.getBlockDropped(worldObj, i, j, k, blockMeta, 0); } - public int putInGrid(ItemStack itemStackSource) - { - int transferred = itemStackSource.stackSize; - IMEInventoryHandler cellArray = grid.getCellArray(); - if (cellArray != null) - { - IAEItemStack ret = cellArray.addItems(Util.createItemStack(itemStackSource)); - if (ret != null) - transferred -= ret.getStackSize(); - } - return transferred; + private int putInGrid(ItemStack itemStackSource) { + int qtyLeft = itemStackSource.stackSize; + if (grid != null && AENetworkReady) { + IMEInventoryHandler cellArray = grid.getCellArray(); + if (cellArray != null) { + IAEItemStack ret = cellArray.addItems(Util.createItemStack(itemStackSource)); + if (ret != null) { + qtyLeft -= ret.getStackSize(); + } + } + } + return qtyLeft; } - public boolean putInChest(IInventory inventory, ItemStack itemStackSource) { + private int putInPipe(ItemStack itemStackSource) { + ItemStack itemStackLeft = itemStackSource.copy(); + for(ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { + TileEntity te = worldObj.getBlockTileEntity(xCoord + direction.offsetX, yCoord + direction.offsetY, zCoord + direction.offsetZ); + if (te != null && te instanceof IItemConduit) { + WarpDrive.debugPrint("dumping to pipe"); + itemStackLeft = ((IItemConduit)te).insertItem(direction.getOpposite(), itemStackLeft); + if (itemStackLeft == null) { + return 0; + } + } + } + return itemStackLeft.stackSize; + } + + private int putInChest(IInventory inventory, ItemStack itemStackSource) { if (itemStackSource == null) { - stop(); - return false; + return 0; } int qtyLeft = itemStackSource.stackSize; @@ -383,7 +415,7 @@ public class TileEntityMiningLaser extends TileEntity implements IPeripheral, IG itemStack.stackSize += transfer; qtyLeft -= transfer; if (qtyLeft <= 0) { - return true; + return 0; } } @@ -404,20 +436,12 @@ public class TileEntityMiningLaser extends TileEntity implements IPeripheral, IG qtyLeft -= transfer; if (qtyLeft <= 0) { - return true; + return 0; } } } - - while (qtyLeft > 0) { - transfer = Math.min(qtyLeft, itemStackSource.getMaxStackSize()); - ItemStack dropItemStack = copyWithSize(itemStackSource, transfer); - EntityItem itemEnt = new EntityItem(worldObj, xCoord + 0.5D, yCoord + 1.0D, zCoord + 0.5D, dropItemStack); - worldObj.spawnEntityInWorld(itemEnt); - qtyLeft -= transfer; - } - return false; + return qtyLeft; } public static ItemStack copyWithSize(ItemStack itemStack, int newSize) diff --git a/src/cr0s/WarpDrive/machines/TileEntityParticleBooster.java b/src/cr0s/WarpDrive/machines/TileEntityParticleBooster.java index 3b9068ed..6870f54d 100644 --- a/src/cr0s/WarpDrive/machines/TileEntityParticleBooster.java +++ b/src/cr0s/WarpDrive/machines/TileEntityParticleBooster.java @@ -6,49 +6,49 @@ import net.minecraftforge.common.ForgeDirection; import cr0s.WarpDrive.*; public class TileEntityParticleBooster extends WarpEnergyTE { - private int ticks = 0; + private int ticks = 0; - @Override - public void updateEntity() { + @Override + public void updateEntity() { if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { return; } super.updateEntity(); ticks++; - if (ticks > 20) { - ticks = 0; - - int metadata = Math.max(0, Math.min(10, Math.round((getEnergyStored() * 10) / WarpDriveConfig.PB_MAX_ENERGY_VALUE))); - if (getBlockMetadata() != metadata) { - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, metadata, 3); - } - } - } + if (ticks > 20) { + ticks = 0; - @Override - public void readFromNBT(NBTTagCompound tag) { - super.readFromNBT(tag); - } + int metadata = Math.max(0, Math.min(10, Math.round((getEnergyStored() * 10) / getMaxEnergyStored()))); + if (getBlockMetadata() != metadata) { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, metadata, 3); + } + } + } - @Override - public void writeToNBT(NBTTagCompound tag) { - super.writeToNBT(tag); - } + @Override + public void readFromNBT(NBTTagCompound tag) { + super.readFromNBT(tag); + } - // IEnergySink methods implementation - @Override - public int getMaxEnergyStored() { - return WarpDriveConfig.PB_MAX_ENERGY_VALUE; - } + @Override + public void writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); + } - @Override - public int getMaxSafeInput() { - return Integer.MAX_VALUE; - } - - @Override - public boolean canInputEnergy(ForgeDirection from) { - return true; - } + // IEnergySink methods implementation + @Override + public int getMaxEnergyStored() { + return WarpDriveConfig.PB_MAX_ENERGY_VALUE; + } + + @Override + public int getMaxSafeInput() { + return Integer.MAX_VALUE; + } + + @Override + public boolean canInputEnergy(ForgeDirection from) { + return true; + } } diff --git a/src/cr0s/WarpDrive/machines/TileEntityPowerLaser.java b/src/cr0s/WarpDrive/machines/TileEntityPowerLaser.java index 15a70125..5544aa5d 100644 --- a/src/cr0s/WarpDrive/machines/TileEntityPowerLaser.java +++ b/src/cr0s/WarpDrive/machines/TileEntityPowerLaser.java @@ -1,8 +1,8 @@ package cr0s.WarpDrive.machines; +import cr0s.WarpDrive.api.IBlockUpdateDetector; import cr0s.WarpDrive.data.Vector3; import cr0s.WarpDrive.WarpDrive; -import cr0s.WarpDriveCore.IBlockUpdateDetector; import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IPeripheral; diff --git a/src/cr0s/WarpDrive/machines/TileEntityPowerReactor.java b/src/cr0s/WarpDrive/machines/TileEntityPowerReactor.java index a6951b37..7353905e 100644 --- a/src/cr0s/WarpDrive/machines/TileEntityPowerReactor.java +++ b/src/cr0s/WarpDrive/machines/TileEntityPowerReactor.java @@ -7,7 +7,7 @@ import java.util.Set; import cpw.mods.fml.common.FMLCommonHandler; import cr0s.WarpDrive.WarpDrive; import cr0s.WarpDrive.WarpDriveConfig; -import cr0s.WarpDriveCore.IBlockUpdateDetector; +import cr0s.WarpDrive.api.IBlockUpdateDetector; import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.peripheral.IComputerAccess; diff --git a/src/cr0s/WarpDrive/machines/TileEntityTransporter.java b/src/cr0s/WarpDrive/machines/TileEntityTransporter.java index 573f1837..1123c121 100644 --- a/src/cr0s/WarpDrive/machines/TileEntityTransporter.java +++ b/src/cr0s/WarpDrive/machines/TileEntityTransporter.java @@ -2,7 +2,10 @@ package cr0s.WarpDrive.machines; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import cr0s.WarpDrive.api.IUpgradable; +import cr0s.WarpDrive.data.EnumUpgradeTypes; import cr0s.WarpDrive.data.Vector3; import cr0s.WarpDrive.WarpDrive; import cr0s.WarpDrive.WarpDriveConfig; @@ -20,11 +23,13 @@ import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.peripheral.IPeripheral; -public class TileEntityTransporter extends WarpEnergyTE implements IPeripheral +public class TileEntityTransporter extends WarpEnergyTE implements IPeripheral, IUpgradable { private double scanRange=2; private int scanDist = 4; + + private double beaconEffect = 0; private double powerBoost = 1; private double baseLockStrength=-1; private double lockStrengthMul = 1; @@ -46,6 +51,7 @@ public class TileEntityTransporter extends WarpEnergyTE implements IPeripheral "energy", "powerBoost", "energyCost", + "upgrades", "help" }; @Override @@ -94,6 +100,10 @@ public class TileEntityTransporter extends WarpEnergyTE implements IPeripheral return "powerBoost(boostAmount): sets the level of power to use (1 being default), returns the level of power\npowerBoost(): returns the level of power"; } else if(fun.equals("energycost")) { return "energyCost(): returns the amount of energy it will take for a single entity to transport with the current settings"; + } else if(fun.equals("upgrades")) { + return WarpDrive.defUpgradeStr; + } else if(fun.equals("energy")) { + return WarpDrive.defEnergyStr; } } return WarpDrive.defHelpStr; @@ -243,32 +253,61 @@ public class TileEntityTransporter extends WarpEnergyTE implements IPeripheral ent.attackEntityFrom(teleDam, 1); } } - - private double beaconScan(int xV, int yV, int zV) // FIXME: never used + + private double beaconScan(int xV, int yV, int zV) { + WarpDrive.debugPrint("BeaconScan:" + xV + ","+yV + "," + zV); double beacon = 0; - for(int x=xV-scanDist;x<=xV+scanDist;x++) + int beaconCount = 0; + int xL = xV - scanDist; + int xU = xV + scanDist; + int yL = yV - scanDist; + int yU = yV + scanDist; + int zL = zV - scanDist; + int zU = zV + scanDist; + for(int x=xL;x<=xU;x++) { - for(int y=yV-scanDist;y<=yV+scanDist;y++) + for(int y=yL;y<=yU;y++) { - if(y < 0 || y > 254) + if(y < 0 || y > 254) { continue; + } - for(int z=xV-scanDist;z<=xV+scanDist;z++) + for(int z=zL;z<=zU;z++) { - if(worldObj.getBlockId(x, y, z) != WarpDriveConfig.transportBeaconID) + if(worldObj.getBlockId(x, y, z) != WarpDriveConfig.transportBeaconID) { continue; - double dist = Math.abs(x - xV) + Math.abs(y - yV) + Math.abs(z - zV); - - if(worldObj.getBlockMetadata(x, y, z) == 0) + } + double dist = 1 + Math.abs(x - xV) + Math.abs(y - yV) + Math.abs(z - zV); + beaconCount++; + if (worldObj.getBlockMetadata(x, y, z) == 0) { beacon += 1/dist; - else + } else { beacon -= 1/dist; + } } } } + if (beaconCount > 0) { + beacon /= Math.sqrt(beaconCount); + } return beacon; } + + private double beaconScan(Vector3 s, Vector3 d) + { + s = absoluteVector(s); + d = absoluteVector(d); + return beaconScan(toInt(s.x),toInt(s.y),toInt(s.z)) + beaconScan(toInt(d.x),toInt(d.y),toInt(d.z)); + } + + private Vector3 absoluteVector(Vector3 a) + { + if(WarpDriveConfig.TR_RELATIVE_COORDS) + return a.clone().translate(new Vector3(this)); + else + return a; + } private double calculatePower(Vector3 d) { @@ -283,7 +322,7 @@ public class TileEntityTransporter extends WarpEnergyTE implements IPeripheral private static double calculatePower(Vector3 s, Vector3 d) { double dist = s.distanceTo(d); - return clamp(Math.pow(Math.E, -dist / 100) * (1/dist),0,1); + return clamp(Math.pow(Math.E, -dist / 300), 0, 1); } private static double min(double... ds) @@ -296,8 +335,11 @@ public class TileEntityTransporter extends WarpEnergyTE implements IPeripheral private double getLockStrength() { if (isLocked) { - return clamp(baseLockStrength * lockStrengthMul * Math.pow(2, powerBoost - 1), 0, 1); - } + double upgradeBoost = 1; + if (upgrades.containsKey(EnumUpgradeTypes.Range)) + upgradeBoost = Math.pow(1.2, upgrades.get(EnumUpgradeTypes.Range)); + return clamp(baseLockStrength * lockStrengthMul * Math.pow(2, powerBoost-1) * upgradeBoost * (1 + beaconEffect), 0, 1); + } return -1; } @@ -309,6 +351,8 @@ public class TileEntityTransporter extends WarpEnergyTE implements IPeripheral private double lock(Vector3 source,Vector3 dest) { if (source != null && dest != null) { double basePower = min(calculatePower(source),calculatePower(dest),calculatePower(source,dest)); + beaconEffect = beaconScan(source, dest); + WarpDrive.debugPrint("BEACON:" + beaconEffect); baseLockStrength = basePower; lockStrengthMul = 1; isLocked = true; @@ -361,7 +405,11 @@ public class TileEntityTransporter extends WarpEnergyTE implements IPeripheral @Override public int getMaxEnergyStored() { - return WarpDriveConfig.TR_MAX_ENERGY; + int max = WarpDriveConfig.TR_MAX_ENERGY; + if (upgrades.containsKey(EnumUpgradeTypes.Energy)) { + max = (int) Math.floor(max * Math.pow(1.2, upgrades.get(EnumUpgradeTypes.Energy))); + } + return max; } @Override @@ -412,4 +460,38 @@ public class TileEntityTransporter extends WarpEnergyTE implements IPeripheral public boolean equals(IPeripheral other) { return other == this; } + + @Override + public boolean takeUpgrade(EnumUpgradeTypes upgradeType, boolean simulate) + { + int max = 0; + if(upgradeType == EnumUpgradeTypes.Energy) + max = 2; + else if(upgradeType == EnumUpgradeTypes.Power) + max = 4; + else if(upgradeType == EnumUpgradeTypes.Range) + max = 4; + + if(max == 0) + return false; + + if(upgrades.containsKey(upgradeType)) + if(upgrades.get(upgradeType) >= max) + return false; + + if(!simulate) + { + int c = 0; + if(upgrades.containsKey(upgradeType)) + c = upgrades.get(upgradeType); + upgrades.put(upgradeType, c+1); + } + return true; + } + + @Override + public Map getInstalledUpgrades() + { + return upgrades; + } } diff --git a/src/cr0s/WarpDrive/machines/WarpBlockContainer.java b/src/cr0s/WarpDrive/machines/WarpBlockContainer.java index 0340b296..df15dbf2 100644 --- a/src/cr0s/WarpDrive/machines/WarpBlockContainer.java +++ b/src/cr0s/WarpDrive/machines/WarpBlockContainer.java @@ -1,10 +1,17 @@ package cr0s.WarpDrive.machines; +import cpw.mods.fml.common.FMLCommonHandler; import cr0s.WarpDrive.WarpDrive; -import cr0s.WarpDriveCore.IBlockUpdateDetector; +import cr0s.WarpDrive.api.IBlockUpdateDetector; +import cr0s.WarpDrive.api.IUpgradable; +import cr0s.WarpDrive.data.EnumUpgradeTypes; +import cr0s.WarpDrive.item.ItemWarpUpgrade; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -15,10 +22,6 @@ public abstract class WarpBlockContainer extends BlockContainer { protected WarpBlockContainer(int par1, Material m) { super(par1, m); - } - - //lazy constructor method. Shhhhh, everything's fine. - { setHardness(0.5F); setStepSound(Block.soundMetalFootstep); setCreativeTab(WarpDrive.warpdriveTab); @@ -33,6 +36,44 @@ public abstract class WarpBlockContainer extends BlockContainer { } } + /* FIXME untested + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9) + { + if (FMLCommonHandler.instance().getEffectiveSide().isClient()) { + return false; + } + + boolean hasResponse = false; + TileEntity te = world.getBlockTileEntity(x, y, z); + if(te != null && te instanceof IUpgradable) + { + IUpgradable upgradable = (IUpgradable)te; + ItemStack is = player.inventory.getCurrentItem(); + if(is != null) + { + Item i = is.getItem(); + if(i instanceof ItemWarpUpgrade) + { + if(upgradable.takeUpgrade(EnumUpgradeTypes.values()[is.getItemDamage()],false)) + { + if(!player.capabilities.isCreativeMode) + player.inventory.decrStackSize(player.inventory.currentItem, 1); + player.addChatMessage("Upgrade accepted"); + } + else + { + player.addChatMessage("Upgrade declined"); + } + hasResponse = true; + } + } + } + + return hasResponse; + } + /**/ + @Override public void onNeighborBlockChange(World w, int x, int y, int z, int b) { super.onNeighborBlockChange(w, x, y, z, b); diff --git a/src/cr0s/WarpDrive/machines/WarpChunkTE.java b/src/cr0s/WarpDrive/machines/WarpChunkTE.java index 154f895f..275b1258 100644 --- a/src/cr0s/WarpDrive/machines/WarpChunkTE.java +++ b/src/cr0s/WarpDrive/machines/WarpChunkTE.java @@ -1,10 +1,11 @@ package cr0s.WarpDrive.machines; import java.util.ArrayList; + import com.google.common.collect.ImmutableSet; import cr0s.WarpDrive.WarpDrive; - +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.ChunkCoordIntPair; import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.ForgeChunkManager.Ticket; @@ -18,7 +19,6 @@ public abstract class WarpChunkTE extends WarpEnergyTE protected ChunkCoordIntPair maxChunk = null; protected boolean areChunksLoaded = false; - private boolean isRefreshing = false; // OVERRIDES @Override @@ -73,7 +73,6 @@ public abstract class WarpChunkTE extends WarpEnergyTE } ForgeChunkManager.releaseTicket(ticket); - WarpDrive.instance.removeTicket(ticket); } ticketList.clear(); areChunksLoaded = false; @@ -88,6 +87,11 @@ public abstract class WarpChunkTE extends WarpEnergyTE } public void giveTicket(Ticket t) { + NBTTagCompound nbt = t.getModData(); + nbt.setInteger("ticketWorldObj", worldObj.provider.dimensionId); + nbt.setInteger("ticketX", xCoord); + nbt.setInteger("ticketY", yCoord); + nbt.setInteger("ticketZ", zCoord); ticketList.add(t); } @@ -163,6 +167,43 @@ public abstract class WarpChunkTE extends WarpEnergyTE return chunkList; } + @Override + public void writeToNBT(NBTTagCompound t) + { + super.writeToNBT(t); + if(minChunk == null) + minChunk = worldObj.getChunkFromBlockCoords(xCoord, zCoord).getChunkCoordIntPair(); + + if(maxChunk == null) + maxChunk = worldObj.getChunkFromBlockCoords(xCoord, zCoord).getChunkCoordIntPair(); + t.setInteger("minChunkX", minChunk.chunkXPos); + t.setInteger("minChunkZ", minChunk.chunkZPos); + t.setInteger("maxChunkX", maxChunk.chunkXPos); + t.setInteger("maxChunkZ", maxChunk.chunkZPos); + } + + @Override + public void readFromNBT(NBTTagCompound t) + { + super.readFromNBT(t); + if(t.hasKey("minChunkX")) + { + int mx = t.getInteger("minChunkX"); + int mz = t.getInteger("minChunkZ"); + minChunk = new ChunkCoordIntPair(mx,mz); + mx = t.getInteger("maxChunkX"); + mz = t.getInteger("maxChunkZ"); + maxChunk = new ChunkCoordIntPair(mx,mz); + } + } + + @Override + public void invalidate() { + super.invalidate(); + for(Ticket t : ticketList) { + ForgeChunkManager.releaseTicket(t); + } + } public ArrayList getChunksToLoad() { diff --git a/src/cr0s/WarpDrive/machines/WarpEnergyTE.java b/src/cr0s/WarpDrive/machines/WarpEnergyTE.java index b8a12786..837c4037 100644 --- a/src/cr0s/WarpDrive/machines/WarpEnergyTE.java +++ b/src/cr0s/WarpDrive/machines/WarpEnergyTE.java @@ -9,7 +9,8 @@ import ic2.api.energy.tile.IEnergySource; import cofh.api.energy.IEnergyHandler; import cpw.mods.fml.common.FMLCommonHandler; import cr0s.WarpDrive.WarpDrive; -import cr0s.WarpDriveCore.IBlockUpdateDetector; +import cr0s.WarpDrive.api.IBlockUpdateDetector; +import cr0s.WarpDrive.data.EnumUpgradeTypes; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; @@ -23,6 +24,20 @@ public abstract class WarpEnergyTE extends WarpTE implements IEnergyHandler, IEn private int scanTickCount = -1; private IEnergyHandler[] TE_energyHandlers = new IEnergyHandler[ForgeDirection.VALID_DIRECTIONS.length]; + protected HashMap upgrades = new HashMap(); + + public Object[] getUpgrades() + { + Object[] retVal = new Object[EnumUpgradeTypes.values().length]; + for(EnumUpgradeTypes type : EnumUpgradeTypes.values()) + { + int am = 0; + if(upgrades.containsKey(type)) + am = upgrades.get(type); + retVal[type.ordinal()] = type.toString() + ":" + am; + } + return retVal; + } // WarpDrive methods protected static int convertInternalToRF(int energy) { @@ -69,6 +84,23 @@ public abstract class WarpEnergyTE extends WarpTE implements IEnergyHandler, IEn protected boolean consumeEnergy(int amount, boolean simulate) { + int amountUpgraded = amount; + if (upgrades.containsKey(EnumUpgradeTypes.Power)) { + double valueMul = Math.pow(0.8,upgrades.get(EnumUpgradeTypes.Power)); + amountUpgraded = (int) Math.ceil(valueMul * amountUpgraded); + } + + if (upgrades.containsKey(EnumUpgradeTypes.Range)) { + double valueMul = Math.pow(1.2,upgrades.get(EnumUpgradeTypes.Range)); + amountUpgraded = (int) Math.ceil(valueMul * amountUpgraded); + } + + if (upgrades.containsKey(EnumUpgradeTypes.Speed)) { + double valueMul = Math.pow(1.2,upgrades.get(EnumUpgradeTypes.Speed)); + amountUpgraded = (int) Math.ceil(valueMul * amountUpgraded); + } + // FIXME: upgrades balancing & implementation to be done... + if (getEnergyStored() >= amount) { if (!simulate) { energyStored_internal -= amount; @@ -272,6 +304,14 @@ public abstract class WarpEnergyTE extends WarpTE implements IEnergyHandler, IEn if (energyStored_internal > getMaxEnergyStored()) { energyStored_internal = getMaxEnergyStored(); } + if (tag.hasKey("upgrades")) { + NBTTagCompound upgradeTag = tag.getCompoundTag("upgrades"); + for(EnumUpgradeTypes type : EnumUpgradeTypes.values()) { + if (upgradeTag.hasKey(type.toString()) && upgradeTag.getInteger(type.toString()) != 0) { + upgrades.put(type, upgradeTag.getInteger(type.toString())); + } + } + } } @Override @@ -281,6 +321,15 @@ public abstract class WarpEnergyTE extends WarpTE implements IEnergyHandler, IEn energyStored_internal = 0; } tag.setInteger("energy", this.energyStored_internal); + if (upgrades.size() > 0) { + NBTTagCompound upgradeTag = new NBTTagCompound(); + for(EnumUpgradeTypes type : EnumUpgradeTypes.values()) { + if (upgrades.containsKey(type)) { + upgradeTag.setInteger(type.toString(), upgrades.get(type)); + } + } + tag.setCompoundTag("upgrades", upgradeTag); + } } // WarpDrive overrides diff --git a/src/cr0s/WarpDriveCore/IUpgradable.java b/src/cr0s/WarpDriveCore/IUpgradable.java deleted file mode 100644 index aa54662a..00000000 --- a/src/cr0s/WarpDriveCore/IUpgradable.java +++ /dev/null @@ -1,9 +0,0 @@ -package cr0s.WarpDriveCore; - -import java.util.Map; - -public interface IUpgradable -{ - public boolean takeUpgrade(int upgradeType,boolean simulate); //returns whether or not the upgrade should be installed - public Map installedUpgrades(); //returns a map in the form -}