Add waila support (#42)

* Remove pneumaticCraft API

* Add WAILA support.
* Mix of backport from 1.12 + I'm Looking At Blood mod (MIT)
This commit is contained in:
Jason Mitchell authored and GitHub committed 2023-02-13 09:36:54 +01:00
1 parent 33f1f1bfef
commit b0c07ebfc6
57 files changed
+738 -2364

No files matched your search

+179 -6
View File
@@ -1,4 +1,4 @@
//version: 1675110695
//version: 1676031737
/*
DO NOT CHANGE THIS FILE!
Also, you may replace this file at any time if there is an update available.
@@ -9,11 +9,15 @@
import com.diffplug.blowdryer.Blowdryer
import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import com.gtnewhorizons.retrofuturagradle.ObfuscationAttribute
import com.gtnewhorizons.retrofuturagradle.mcp.ReobfuscatedJar
import com.gtnewhorizons.retrofuturagradle.minecraft.RunMinecraftTask
import com.matthewprenger.cursegradle.CurseArtifact
import com.matthewprenger.cursegradle.CurseRelation
import com.modrinth.minotaur.dependencies.ModDependency
import com.modrinth.minotaur.dependencies.VersionDependency
import cpw.mods.fml.relauncher.Side
import org.gradle.api.tasks.options.Option;
import org.gradle.internal.logging.text.StyledTextOutput.Style
import org.gradle.internal.logging.text.StyledTextOutputFactory
import org.jetbrains.gradle.ext.*
@@ -23,6 +27,7 @@ import java.nio.file.Paths
import java.util.concurrent.TimeUnit
import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream
import javax.inject.Inject
buildscript {
repositories {
@@ -66,7 +71,7 @@ plugins {
id 'com.diffplug.spotless' version '6.7.2' apply false
id 'com.modrinth.minotaur' version '2.+' apply false
id 'com.matthewprenger.cursegradle' version '1.4.0' apply false
id 'com.gtnewhorizons.retrofuturagradle' version '1.1.2'
id 'com.gtnewhorizons.retrofuturagradle' version '1.1.6'
}
boolean settingsupdated = verifySettingsGradle()
settingsupdated = verifyGitAttributes() || settingsupdated
@@ -186,11 +191,21 @@ configurations {
}
if (enableModernJavaSyntax.toBoolean()) {
repositories {
mavenCentral {
mavenContent {
includeGroup("me.eigenraven.java8unsupported")
}
}
}
dependencies {
annotationProcessor 'com.github.bsideup.jabel:jabel-javac-plugin:1.0.0'
compileOnly('com.github.bsideup.jabel:jabel-javac-plugin:1.0.0') {
transitive = false // We only care about the 1 annotation class
}
// Allow using jdk.unsupported classes like sun.misc.Unsafe in the compiled code, working around JDK-8206937.
patchedMinecraft('me.eigenraven.java8unsupported:java-8-unsupported-shim:1.0.0')
}
tasks.withType(JavaCompile).configureEach {
@@ -401,6 +416,16 @@ configurations.configureEach {
}
}
}
def obfuscationAttr = it.attributes.getAttribute(ObfuscationAttribute.OBFUSCATION_ATTRIBUTE)
if (obfuscationAttr != null && obfuscationAttr.name == ObfuscationAttribute.SRG) {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
// Remap CoFH core cursemaven dev jar to the obfuscated version for runObfClient/Server
if (details.requested.group == 'curse.maven' && details.requested.name.endsWith('-69162') && details.requested.version == '2388751') {
details.useVersion '2388750'
details.because 'Pick obfuscated jar'
}
}
}
}
// Ensure tests have access to minecraft classes
@@ -520,20 +545,20 @@ dependencies {
annotationProcessor('org.ow2.asm:asm-debug-all:5.0.3')
annotationProcessor('com.google.guava:guava:24.1.1-jre')
annotationProcessor('com.google.code.gson:gson:2.8.6')
annotationProcessor('com.gtnewhorizon:gtnhmixins:2.1.10:processor')
annotationProcessor('com.gtnewhorizon:gtnhmixins:2.1.12:processor')
if (usesMixinDebug.toBoolean()) {
runtimeOnlyNonPublishable('org.jetbrains:intellij-fernflower:1.2.1.16')
}
}
if (usesMixins.toBoolean() || forceEnableMixins.toBoolean()) {
implementation('com.gtnewhorizon:gtnhmixins:2.1.10')
implementation('com.gtnewhorizon:gtnhmixins:2.1.12')
}
}
pluginManager.withPlugin('org.jetbrains.kotlin.kapt') {
if (usesMixins.toBoolean()) {
dependencies {
kapt('com.gtnewhorizon:gtnhmixins:2.1.10:processor')
kapt('com.gtnewhorizon:gtnhmixins:2.1.12:processor')
}
}
}
@@ -633,9 +658,142 @@ tasks.named("processResources", ProcessResources).configure {
if (usesMixins.toBoolean()) {
from refMap
dependsOn("compileJava", "compileScala")
}
}
ext.java17Toolchain = (JavaToolchainSpec spec) -> {
spec.languageVersion.set(JavaLanguageVersion.of(17))
spec.vendor.set(JvmVendorSpec.matching("jetbrains"))
}
ext.java17DependenciesCfg = configurations.create("java17Dependencies")
ext.java17PatchDependenciesCfg = configurations.create("java17PatchDependencies")
dependencies {
def lwjgl3ifyVersion = '1.1.21'
def asmVersion = '9.4'
if (modId != 'lwjgl3ify') {
java17Dependencies("com.github.GTNewHorizons:lwjgl3ify:${lwjgl3ifyVersion}")
}
if (modId != 'hodgepodge') {
java17Dependencies('com.github.GTNewHorizons:Hodgepodge:2.0.31')
}
java17PatchDependencies('net.minecraft:launchwrapper:1.15') {transitive = false}
java17PatchDependencies("org.ow2.asm:asm:${asmVersion}")
java17PatchDependencies("org.ow2.asm:asm-commons:${asmVersion}")
java17PatchDependencies("org.ow2.asm:asm-tree:${asmVersion}")
java17PatchDependencies("org.ow2.asm:asm-analysis:${asmVersion}")
java17PatchDependencies("org.ow2.asm:asm-util:${asmVersion}")
java17PatchDependencies('org.ow2.asm:asm-deprecated:7.1')
java17PatchDependencies("org.apache.commons:commons-lang3:3.12.0")
java17PatchDependencies("com.github.GTNewHorizons:lwjgl3ify:${lwjgl3ifyVersion}:forgePatches")
}
ext.java17JvmArgs = [
// Java 9+ support
"--illegal-access=warn",
"-Dfile.encoding=UTF-8",
"-Djava.security.manager=allow",
"--add-opens", "java.base/jdk.internal.loader=ALL-UNNAMED",
"--add-opens", "java.base/java.net=ALL-UNNAMED",
"--add-opens", "java.base/java.nio=ALL-UNNAMED",
"--add-opens", "java.base/java.io=ALL-UNNAMED",
"--add-opens", "java.base/java.lang=ALL-UNNAMED",
"--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED",
"--add-opens", "java.base/java.text=ALL-UNNAMED",
"--add-opens", "java.base/java.util=ALL-UNNAMED",
"--add-opens", "java.base/jdk.internal.reflect=ALL-UNNAMED",
"--add-opens", "java.base/sun.nio.ch=ALL-UNNAMED",
"--add-opens", "java.desktop/sun.awt.image=ALL-UNNAMED",
"--add-modules", "jdk.dynalink",
"--add-opens", "jdk.dynalink/jdk.dynalink.beans=ALL-UNNAMED",
"--add-modules", "java.sql.rowset",
"--add-opens", "java.sql.rowset/javax.sql.rowset.serial=ALL-UNNAMED"
]
ext.hotswapJvmArgs = [
// DCEVM advanced hot reload
"-XX:+AllowEnhancedClassRedefinition",
"-XX:HotswapAgent=fatjar"
]
ext.setupHotswapAgentTask = tasks.register("setupHotswapAgent") {
group = "GTNH Buildscript"
description = "Installs a recent version of HotSwapAgent into the Java 17 JetBrains runtime directory"
def hsaUrl = 'https://github.com/HotswapProjects/HotswapAgent/releases/download/1.4.2-SNAPSHOT/hotswap-agent-1.4.2-SNAPSHOT.jar'
def targetFolderProvider = javaToolchains.launcherFor(java17Toolchain).map {it.metadata.installationPath.dir("lib/hotswap")}
def targetFilename = "hotswap-agent.jar"
onlyIf {
!targetFolderProvider.get().file(targetFilename).asFile.exists()
}
doLast {
def targetFolder = targetFolderProvider.get()
targetFolder.asFile.mkdirs()
download.run {
src hsaUrl
dest targetFolder.file(targetFilename).asFile
overwrite false
tempAndMove true
}
}
}
public abstract class RunHotswappableMinecraftTask extends RunMinecraftTask {
// IntelliJ doesn't seem to allow commandline arguments so we also support an env variable
private boolean enableHotswap = Boolean.valueOf(System.getenv("HOTSWAP"));
@Input
public boolean getEnableHotswap() { return enableHotswap }
@Option(option = "hotswap", description = "Enables HotSwapAgent for enhanced class reloading under a debugger")
public boolean setEnableHotswap(boolean enable) { enableHotswap = enable }
@Inject
public RunHotswappableMinecraftTask(Side side, String superTask) {
super(side)
this.lwjglVersion = 3
this.javaLauncher = project.javaToolchains.launcherFor(project.java17Toolchain)
this.extraJvmArgs.addAll(project.java17JvmArgs)
this.extraJvmArgs.addAll(project.provider(() -> enableHotswap ? project.hotswapJvmArgs : []))
this.classpath(project.java17PatchDependenciesCfg)
if (side == Side.CLIENT) {
this.classpath(project.minecraftTasks.lwjgl3Configuration)
}
// Use a raw provider instead of map to not create a dependency on the task
this.classpath(project.provider(() -> project.tasks.named(superTask, RunMinecraftTask).get().classpath))
this.classpath.filter { file ->
!file.path.contains("2.9.4-nightly-20150209") // Remove lwjgl2
}
this.classpath(project.java17DependenciesCfg)
if (!(project.usesMixins.toBoolean() || project.forceEnableMixins.toBoolean())) {
this.extraArgs.addAll("--tweakClass", "org.spongepowered.asm.launch.MixinTweaker")
}
}
}
def runClient17Task = tasks.register("runClient17", RunHotswappableMinecraftTask, Side.CLIENT, "runClient")
runClient17Task.configure {
setup(project)
group = "Modded Minecraft"
description = "Runs the modded client using Java 17, lwjgl3ify and Hodgepodge"
dependsOn(setupHotswapAgentTask, mcpTasks.launcherSources.classesTaskName, minecraftTasks.taskDownloadVanillaAssets, mcpTasks.taskPackagePatchedMc, 'jar')
mainClass = "GradleStart"
}
def runServer17Task = tasks.register("runServer17", RunHotswappableMinecraftTask, Side.SERVER, "runServer")
runServer17Task.configure {
setup(project)
group = "Modded Minecraft"
description = "Runs the modded server using Java 17, lwjgl3ify and Hodgepodge"
dependsOn(setupHotswapAgentTask, mcpTasks.launcherSources.classesTaskName, minecraftTasks.taskDownloadVanillaAssets, mcpTasks.taskPackagePatchedMc, 'jar')
mainClass = "GradleStartServer"
extraArgs.add("nogui")
}
def getManifestAttributes() {
def manifestAttributes = [:]
if (!containsMixinsAndOrCoreModOnly.toBoolean() && (usesMixins.toBoolean() || coreModClass)) {
@@ -705,7 +863,7 @@ if (usesShadowedDependencies.toBoolean()) {
javaComponent.withVariantsFromConfiguration(configurations.shadowRuntimeElements) {
skip()
}
for (runTask in ["runClient", "runServer"]) {
for (runTask in ["runClient", "runServer", "runClient17", "runServer17"]) {
tasks.named(runTask).configure {
dependsOn("shadowJar")
}
@@ -743,6 +901,7 @@ idea {
module {
downloadJavadoc = true
downloadSources = true
inheritOutputDirs = true
}
project {
settings {
@@ -753,6 +912,20 @@ idea {
"2. Run Server"(Gradle) {
taskNames = ["runServer"]
}
"1a. Run Client (Java 17)"(Gradle) {
taskNames = ["runClient17"]
}
"2a. Run Server (Java 17)"(Gradle) {
taskNames = ["runServer17"]
}
"1b. Run Client (Java 17, Hotswap)"(Gradle) {
taskNames = ["runClient17"]
envs = ["HOTSWAP": "true"]
}
"2b. Run Server (Java 17, Hotswap)"(Gradle) {
taskNames = ["runServer17"]
envs = ["HOTSWAP": "true"]
}
"3. Run Obfuscated Client"(Gradle) {
taskNames = ["runObfClient"]
}
+39 -36
View File
@@ -1,40 +1,43 @@
// Add your dependencies here
/*
* Add your dependencies here. Supported configurations:
* - api("group:name:version:classifier"): if you use the types from this dependency in the public API of this mod
* Available at runtime and compiletime for mods depending on this mod
* - implementation("g:n:v:c"): if you need this for internal implementation details of the mod, but none of it is visible via the public API
* Available at runtime but not compiletime for mods depending on this mod
* - compileOnly("g:n:v:c"): if the mod you're building doesn't need this dependency during runtime at all, e.g. for optional mods
* Not available at all for mods depending on this mod, only visible at compiletime for this mod
* - runtimeOnly("g:n:v:c"): if you don't need this at compile time, but want it to be present at runtime
* Available at runtime for mods depending on this mod
* - annotationProcessor("g:n:v:c"): mostly for java compiler plugins, if you know you need this, use it, otherwise don't worry
* - testCONFIG("g:n:v:c") - replace CONFIG by one of the above (except api), same as above but for the test sources instead of main
*
* - shadowImplementation("g:n:v:c"): effectively the same as API, but the dependency is included in your jar under a renamed package name
* Requires you to enable usesShadowedDependencies in gradle.properties
*
* - compile("g:n:v:c"): deprecated, replace with "api" (works like the old "compile") or "implementation" (can be more efficient)
*
* You can exclude transitive dependencies (dependencies of the chosen dependency) by appending { transitive = false } if needed,
* but use this sparingly as it can break using your mod as another mod's dependency if you're not careful.
*
* For more details, see https://docs.gradle.org/7.6/userguide/java_library_plugin.html#sec:java_library_configurations_graph
*/
dependencies {
api("com.github.GTNewHorizons:waila:1.5.22:dev")
api("com.github.GTNewHorizons:CodeChickenLib:1.1.5.7:dev")
api("com.github.GTNewHorizons:NotEnoughItems:2.3.21-GTNH:dev")
compileOnly("com.github.GTNewHorizons:GT5-Unofficial:5.09.41.242:dev") {transitive = false }
compileOnly("com.github.GTNewHorizons:Botania:1.9.14-GTNH:api") {transitive = false }
compileOnly("com.github.GTNewHorizons:ForestryMC:4.5.6:api") {transitive = false }
compileOnly("com.github.GTNewHorizons:ForgeMultipart:1.3.1:dev") {transitive = false }
compileOnly("com.github.GTNewHorizons:Chisel:2.10.16-GTNH:api") {transitive = false }
compileOnly("com.github.GTNewHorizons:ZenScript:1.0.0-GTNH") {transitive = false }
compileOnly("com.github.GTNewHorizons:CraftTweaker:3.2.9:dev") {transitive = false }
compileOnly("com.github.GTNewHorizons:GT5-Unofficial:5.09.41.242:dev") {
transitive = false
}
compileOnly("com.github.GTNewHorizons:Botania:1.9.14-GTNH:api") {
transitive = false
}
compileOnly("com.github.GTNewHorizons:ForestryMC:4.5.6:api") {
transitive = false
}
compileOnly("com.github.GTNewHorizons:ForgeMultipart:1.3.1:dev") {
transitive = false
}
compile("com.github.GTNewHorizons:CodeChickenLib:1.1.5.7:dev")
compileOnly("com.github.GTNewHorizons:NotEnoughItems:2.3.21-GTNH:dev") {
transitive = false
}
compileOnly("com.github.GTNewHorizons:Chisel:2.10.16-GTNH:api") {
transitive = false
}
compileOnly("com.github.GTNewHorizons:ZenScript:1.0.0-GTNH") {
transitive = false
}
compileOnly("com.github.GTNewHorizons:CraftTweaker:3.2.9:dev") {
transitive = false
}
compileOnly("thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev") {
transitive = false
}
compileOnly("curse.maven:guide-api-228832:2287185") {
transitive = false
}
compileOnly("thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev") {transitive = false }
compileOnly("curse.maven:guide-api-228832:2287185") {transitive = false }
}
@@ -1,84 +0,0 @@
package pneumaticCraft.api;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
/**
* DO NOT IMPLEMENT THIS CLASS YOURSELF! Use PneumaticRegistry.getInstance().getHeatExchangerLogic() !
*
* @author MineMaarten www.minemaarten.com
*/
public interface IHeatExchangerLogic {
/**
* Call this to tick this logic, and make the heat disperse itself.
*/
public void update();
/**
* When called (preferably on tile entity load and neighbor block/tile entity change) this will add all
* IHeatExchanger neighbor TileEntities as connected heat exchangers. It will also take care of blocks like Lava.
*
* You don't _have_ to call this method, if this heat exchanger is not connected to the outside world (for example
* the heat of the liquid plastic in the Plastic Mixer).
*
* @param world
* @param x
* @param y
* @param z
* @param validSides Can be left out as vararg, meaning every side can be connected. When one or more sides are
* specified this will constrain this heat exchanger to only connect to other heat exchangers on
* these sides.
*/
public void initializeAsHull(World world, int x, int y, int z, ForgeDirection... validSides);
/**
* When called, this will connect these two heat exchangers. You should only call this on one of the two heat
* exchangers.
*
* @param exchanger
*/
public void addConnectedExchanger(IHeatExchangerLogic exchanger);
public void removeConnectedExchanger(IHeatExchangerLogic exchanger);
/**
* A heat exchanger starts with 295 degrees Kelvin (20 degrees Celcius) by default.
*
* @param temperature in degrees Kelvin
*/
public void setTemperature(double temperature);
public double getTemperature();
/**
* The higher the thermal resistance, the slower the heat disperses.
*
* @param thermalResistance By default it's 1.
*/
public void setThermalResistance(double thermalResistance);
public double getThermalResistance();
/**
* The higher the capacity, the more heat can be 'stored'. This means that an object with a high capacity can heat
* up an object with a lower capacity without losing any significant amount of temperature.
*
* @param capacity
*/
public void setThermalCapacity(double capacity);
public double getThermalCapacity();
public void writeToNBT(NBTTagCompound tag);
public void readFromNBT(NBTTagCompound tag);
/**
* Adds heat (= deltaT * Thermal Capacity) to this exchanger. negative values will remove heat.
*
* @param amount
*/
public void addHeat(double amount);
}
@@ -1,178 +0,0 @@
package pneumaticCraft.api;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityCreature;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraftforge.fluids.Fluid;
import pneumaticCraft.api.client.pneumaticHelmet.IBlockTrackEntry;
import pneumaticCraft.api.client.pneumaticHelmet.IEntityTrackEntry;
import pneumaticCraft.api.client.pneumaticHelmet.IHackableBlock;
import pneumaticCraft.api.client.pneumaticHelmet.IHackableEntity;
import pneumaticCraft.api.drone.ICustomBlockInteract;
import pneumaticCraft.api.drone.IPathfindHandler;
import pneumaticCraft.api.item.IInventoryItem;
/**
* This class can be used to register and access various things to and from the mod.
*/
public class PneumaticRegistry {
/**
* This field, which is initialized in PneumaticCraft's preInit, will give you access to various registration and
* access options.
*
* @deprecated This field isn't going to be removed, but it'll be marked private. use getInstance().
*/
@Deprecated
public static IPneumaticCraftInterface instance;
public static IPneumaticCraftInterface getInstance() {
return instance;
}
public static void init(IPneumaticCraftInterface inter) {
if (instance == null) instance = inter; // only allow initialization once; by PneumaticCraft
}
public static interface IPneumaticCraftInterface {
/*
* ------------- Pneumatic Helmet --------------
*/
public void registerEntityTrackEntry(Class<? extends IEntityTrackEntry> entry);
public void registerBlockTrackEntry(IBlockTrackEntry entry);
public void addHackable(Class<? extends Entity> entityClazz, Class<? extends IHackableEntity> iHackable);
public void addHackable(Block block, Class<? extends IHackableBlock> iHackable);
/**
* Returns a list of all current successful hacks of a given entity. This is used for example in Enderman
* hacking, so the user can only hack an enderman once (more times wouldn't have any effect). This is mostly
* used for display purposes.
*
* @param entity
* @return empty list if no hacks.
*/
public List<IHackableEntity> getCurrentEntityHacks(Entity entity);
/*
* ------------- Drones --------------
*/
/**
* Normally drones will pathfind through any block that doesn't have any collisions (Block#getBlocksMovement
* returns true). With this method you can register custom blocks to allow the drone to pathfind through them.
* If the block requires any special handling, like allow pathfinding on certain conditions, you can pass a
* IPathFindHandler with the registry.
*
* @param block
* @param handler can be null, to always allow pathfinding through this block.
*/
public void addPathfindableBlock(Block block, IPathfindHandler handler);
/**
* This will add a puzzle piece that has only a Area white- and blacklist parameter (similar to a GoTo piece).
* It will do the specified behaviour. This can be used to create energy import/export widgets.
*
* @param interactor
*/
public void registerCustomBlockInteractor(ICustomBlockInteract interactor);
/**
* Will spawn in a Drone a distance away from the given coordinate. The drone is programmed to travel to go to 5
* blocks above the specified y level, and drop the deliveredStacks. When there isn't a clear path for the items
* to fall these 5 blocks the Drone will deliver at a y level above the specified y that _is_ clear. If no clear
* blocks can be found (when there are only solid blocks), the Drone will drop the items very high up in the air
* instead, and drop them there.
*
* When the Drone is tried to be catched by a player (by wrenching it), the drone will only the drop the items
* that it was delivering (or none if it dropped those items already). The Drone itself never will be dropped.
*
* @param x
* @param y
* @param z
* @param deliveredStacks stacks that are delivered by the drone. When no stacks, or more than 65 stacks are
* given, this will generate a IllegalArgumentException.
* @return the drone. You can use this to set a custom name for example (defaults to "Amazon Delivery Drone").
*/
public EntityCreature deliverItemsAmazonStyle(World world, int x, int y, int z, ItemStack... deliveredStacks);
/*
* --------------- Items -------------------
*/
/**
* See {@link pneumaticCraft.api.item.IInventoryItem}
*
* @param handler
*/
public void registerInventoryItem(IInventoryItem handler);
/*
* ----------------- Heat System --------------
*/
public IHeatExchangerLogic getHeatExchangerLogic();
public void registerBlockExchanger(Block block, double temperature, double thermalResistance);
/*
* ---------------- Power Generation -----------
*/
/**
* Adds a burnable liquid to the Liquid Compressor's available burnable fuels.
*
* @param fluid
* @param mLPerBucket the amount of mL generated for 1000mB of the fuel. As comparison, one piece of coal
* generates 16000mL in an Air Compressor.
*/
public void registerFuel(Fluid fluid, int mLPerBucket);
/*
* --------------- Misc -------------------
*/
/**
* Returns the amount of Security Stations that disallow interaction with the given coordinate for the given
* player. Usually you'd disallow interaction when this returns > 0.
*
* @param world
* @param x
* @param y
* @param z
* @param player
* @param showRangeLines When true, any Security Station that prevents interaction will show the line grid
* (server --> client update is handled internally).
* @return The amount of Security Stations that disallow interaction for the given player. This method throws an
* IllegalArgumentException when tried to be called from the client side!
*/
public int getProtectingSecurityStations(World world, int x, int y, int z, EntityPlayer player,
boolean showRangeLines);
/**
* Use this to register ISimpleBlockRenderHandler render id's of full blocks, those of which should be able to
* be used for the Pneumatic Door Base camouflage.
*
* @param id
*/
public void registerConcealableRenderId(int id);
/**
* Used to register a liquid that represents liquid XP (like MFR mob essence, OpenBlocks liquid XP). This is
* used in the Aerial Interface to pump XP in/out of the player.
*
* @param fluid
* @param liquidToPointRatio The amount of liquid (in mB) used to get one XP point. In OpenBlocks this is 20
* (mB/point).
*/
public void registerXPLiquid(Fluid fluid, int liquidToPointRatio);
}
}
@@ -1,36 +0,0 @@
package pneumaticCraft.api.actuator;
import java.util.List;
import net.minecraft.tileentity.TileEntity;
public interface IActuator {
/**
* Same as {@link pneumaticCraft.api.universalSensor.ISensorSetting#getSensorPath()}
*
* @return
*/
public String getSensorPath();
/**
* When returned true, the GUI will enable the textbox writing, otherwise not.
*
* @return
*/
public boolean needsTextBox();
/**
* Should return the description of this sensor displayed in the GUI stat. Information should at least include when
* this sensor emits redstone and how (analog (1 through 15), or digital).
*
* @return
*/
public List<String> getDescription();
/**
*
* @param universalActuator
*/
public void actuate(TileEntity universalActuator);
}
@@ -1,34 +0,0 @@
package pneumaticCraft.api.block;
import net.minecraft.block.Block;
import cpw.mods.fml.common.registry.GameRegistry;
public class BlockSupplier {
// private static Class blockClass;
/**
* @param blockName
* @return
*/
public static Block getBlock(String blockName) {
return GameRegistry.findBlock("PneumaticCraft", blockName);
/*
* try { if(blockClass == null) blockClass = Class.forName("pneumaticCraft.common.block.Blockss"); return
* (Block)blockClass.getField(blockName).get(null); } catch(Exception e) {
* System.err.println("[PneumaticCraft API] Block supply failed for block: " + blockName); return null; }
*/
}
/*
* The following is a list of all the block names that can be passed as argument in getBlock(String) to get a
* PneumaticCraft block. pressureTube meta = tube type airCompressor airCannon pressureChamberWall meta < 6 ? wall :
* window pressureChamberValve pressureChamberInterface squidPlant fireFlower creeperPlant slimePlant rainPlant
* enderPlant lightningPlant adrenalinePlant burstPlant potionPlant repulsionPlant heliumPlant flyingFlower
* musicPlant propulsionPlant chopperPlant chargingStation elevatorBase elevatorFrame vacuumPump pneumaticDoorBase
* pneumaticDoor assemblyPlatform assemblyIOUnit assemblyDrill assemblyLaser assemblyController advancedPressureTube
* meta = tube type (like 'pressureTube') compressedIron uvLightBox etchingAcid securityStation universalSensor
* pneumaticGenerator electricCompressor pneumaticEngine kineticCompressor aerialInterface electrostaticCompressor
* aphorismTile omnidirectionalHopper
*/
}
@@ -1,14 +0,0 @@
package pneumaticCraft.api.block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
/**
* Should be implemented by any block that allows to be rotated by a Pneumatic Wrench. It uses almost the same rotate
* method as the Vanilla (Forge) method. However it uses energy to rotate (when rotateBlock() return true).
*/
public interface IPneumaticWrenchable {
public boolean rotateBlock(World world, EntityPlayer player, int x, int y, int z, ForgeDirection side);
}
@@ -1,62 +0,0 @@
package pneumaticCraft.api.client;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.item.ItemStack;
/**
* With this class you can retrieve new instances of the PneumaticCraft's IGuiAnimatedStat implementation. You can use
* these in Gui's as well as anywhere you like. When you use these in Gui's you need to pass a valid GuiScreen instance,
* if you don't you can just pass null.
*/
public class GuiAnimatedStatSupplier {
private static Class animatedStatClass;
public static IGuiAnimatedStat getAnimatedStat(GuiScreen gui, int backgroundColor) {
return getAnimatedStat(new Class[] { GuiScreen.class, int.class }, gui, backgroundColor);
}
/**
* Returns a GuiAnimatedStat which uses an itemstack as static icon.
*
* @param gui
* @param iconStack
* @param backgroundColor
* @return
*/
public static IGuiAnimatedStat getAnimatedStat(GuiScreen gui, ItemStack iconStack, int backgroundColor) {
return getAnimatedStat(
new Class[] { GuiScreen.class, int.class, ItemStack.class },
gui,
backgroundColor,
iconStack);
}
/**
* Returns a GuiAnimatedStat which uses a texture location as static icon.
*
* @param gui
* @param iconTexture / text
* @param backgroundColor
* @return
*/
public static IGuiAnimatedStat getAnimatedStat(GuiScreen gui, String iconTexture, int backgroundColor) {
return getAnimatedStat(
new Class[] { GuiScreen.class, int.class, String.class },
gui,
backgroundColor,
iconTexture);
}
private static IGuiAnimatedStat getAnimatedStat(Class[] constructorClasses, Object... constructorParameters) {
try {
if (animatedStatClass == null)
animatedStatClass = Class.forName("pneumaticCraft.client.gui.widget.GuiAnimatedStat");
return (IGuiAnimatedStat) animatedStatClass.getConstructor(constructorClasses)
.newInstance(constructorParameters);
} catch (Exception e) {
System.err.println("Failed to retrieve an GuiAnimatedStat instance from PneumaticCraft.");
}
return null;
}
}
@@ -1,57 +0,0 @@
package pneumaticCraft.api.client;
import java.lang.reflect.Method;
import net.minecraft.client.gui.FontRenderer;
public class GuiElementRenderer {
private static Method drawGaugeMethod;
/**
* Draws a Pressure Gauge, the same which is also used in many PneumaticCraft applications.
*
* @param fontRenderer fontrenderer used to draw the numbers of the pressure gauge.
* @param minPressure The minimal pressure that needs to be displayed (this is -1 in most applications).
* @param maxPressure The maximal pressure that needs to be rendererd (this is 7 for tier one machines, and
* 25 for tier two).
* @param dangerPressure The transition pressure from green to red (this is 5 for tier one, and 29 for tier two
* machines).
* @param minWorkingPressure The transition pressure from yellow to green (variates per machine).
* @param currentPressure The pressure that the needle should point to.
* @param xPos x position of the gauge.
* @param yPos y position of the gauge.
* @param zLevel z position of the gauge (Gui#zLevel, -90, for in normal GUI's).
*/
public static void drawPressureGauge(FontRenderer fontRenderer, float minPressure, float maxPressure,
float dangerPressure, float minWorkingPressure, float currentPressure, int xPos, int yPos, float zLevel) {
try {
if (drawGaugeMethod == null) {
drawGaugeMethod = Class.forName("pneumaticCraft.client.gui.GuiUtils").getMethod(
"drawPressureGauge",
FontRenderer.class,
float.class,
float.class,
float.class,
float.class,
float.class,
int.class,
int.class,
float.class);
}
drawGaugeMethod.invoke(
null,
fontRenderer,
minPressure,
maxPressure,
dangerPressure,
minWorkingPressure,
currentPressure,
xPos,
yPos,
zLevel);
} catch (Exception e) {
System.err.println("Failed to render a Pressure Gauge from PneumaticCraft.");
}
}
}
@@ -1,197 +0,0 @@
package pneumaticCraft.api.client;
import java.awt.Rectangle;
import java.util.List;
/**
* This interface doesn't have to be implemented. In PneumaticCraft there already is one class which implements this
* interface which is used many times in PneumaticCraft (GUI stats, Pneumatic Helmet 2D and 3D stats). You can get an
* instance of this class as well. Information about this you can find in GuiAnimatedStatSupplier.java. Implementing
* your own version of animated stats can be implemented as well via this interface, and they will interact with the
* PneumaticCraft GuiAnimatedStats if you implement it correctly.
*/
public interface IGuiAnimatedStat {
/**
* When you call this method with a set of coordinates representing the button location and dimensions, you'll get
* these parameters back scaled to the GuiAnimatedStat's scale.
*
* @param origX Button start X.
* @param origY Button start Y.
* @param width Button width.
* @param height Button height.
* @return rectangle containing the new location and dimensions.
*/
public Rectangle getButtonScaledRectangle(int origX, int origY, int width, int height);
/**
* When passed 0.5F for example, the text of the stat will be half as big (so more text can fit into a certain
* area).
*
* @param scale
*/
public void scaleTextSize(float scale);
/**
* Returns true if the statistic expands to the left.
*
* @return
*/
public boolean isLeftSided();
/**
* Returns true if the statistic is done with expanding (when text will be displayed).
*
* @return
*/
public boolean isDoneExpanding();
/**
* Pass true if the statistic should expand to the left, otherwise false.
*
* @param leftSided
*/
public void setLeftSided(boolean leftSided);
/**
* Sets the main text of this stat. Every line should be stored in a seperate list element. Upon rendering,
* EnumChatFormattings will be respected. When you call this method, Too long lines will be divided into multiple
* shorter ones to fit in the GUI.
*
* @param text
* @return this, so you can chain calls.
*/
public IGuiAnimatedStat setText(List<String> text);
/**
* Sets the line to a single line. Upon rendering, EnumChatFormattings will be respected. When you call this method,
* Too long lines will be divided into multiple shorter ones to fit in the GUI.
*
* @param text
* @return this, so you can chain calls.
*/
public IGuiAnimatedStat setText(String text);
/**
* Sets the main text of this stat. Every line should be stored in a seperate list element. Upon rendering,
* EnumChatFormattings will be respected. This version of the text setting doesn't handle too long lines.
*
* @param text
*/
public void setTextWithoutCuttingString(List<String> text);
/**
* Sets the title of this stat. It will automatically get the yellow color assigned.
*
* @param title
*/
public void setTitle(String title);
/**
* Returns the title of this stat (obviously without color prefix).
*
* @return
*/
public String getTitle();
/**
* Defines what dimensions the stat should have when it is not expanded (default 17x17) and resets the stat to these
* dimensions. Used in PneumaticCraft by the block/entity tracker stats, they are 0x0 when not expanded so it looks
* like they expand (and appear) from nothing.
*
* @param minWidth
* @param minHeight
*/
public void setMinDimensionsAndReset(int minWidth, int minHeight);
/**
* When this stat gets a parent stat assigned, the y of this stat will be the same as the parent's plus this stat's
* baseY. This will cause this stat to move up and down when the parent's stat expands/moves.
*
* @param stat
*/
public void setParentStat(IGuiAnimatedStat stat);
/**
* Sets the x location of this stat.
*
* @param x
*/
public void setBaseX(int x);
/**
* Sets the base Y of this stat.
*
* @param y
*/
public void setBaseY(int y);
/**
* Returns the real Y of this stat. This is the same as getBaseY when there is no parent stat, but if there is this
* method returns the value described in setParentStat(IGuiAnimatedStat stat).
*
* @return
*/
public int getAffectedY();
public int getBaseX();
public int getBaseY();
/**
* Returns the Y size of this stat.
*
* @return
*/
public int getHeight();
/**
* Returns the X size of this stat.
*
* @return
*/
public int getWidth();
public Rectangle getBounds();
/**
* This method should be called every game tick to update the logic of the stat (expanding of the stat).
*/
public void update();
/**
* Should be called every render tick when and where you want to render the stat.
*
* @param mouseX
* @param mouseY
* @param partialTicks
*/
public void render(int mouseX, int mouseY, float partialTicks);
/**
* This method will handle mouse clicks. This will handle open/closing of the stat when the mouse clicks it.
*
* @param x
* @param y
* @param button
* @return
*/
public void onMouseClicked(int x, int y, int button);
/**
* Forces the stat to close.
*/
public void closeWindow();
/**
* Forces the stat to expand.
*/
public void openWindow();
/**
* Returns true if the stat is expanding.
*
* @return
*/
public boolean isClicked();
}
@@ -1,60 +0,0 @@
package pneumaticCraft.api.client.assemblymachine;
import java.util.HashMap;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
public class AssemblyRenderOverriding {
public static final HashMap<Integer, IAssemblyRenderOverriding> renderOverrides = new HashMap<Integer, IAssemblyRenderOverriding>();
public static void addRenderOverride(Block block, IAssemblyRenderOverriding renderOverride) {
renderOverrides.put(Block.getIdFromBlock(block), renderOverride);
}
public static void addRenderOverride(Item item, IAssemblyRenderOverriding renderOverride) {
renderOverrides.put(Item.getIdFromItem(item), renderOverride);
}
public static interface IAssemblyRenderOverriding {
/**
* This method will be called just before the IO Unit's held stack is being rendered. You can insert GL11 calls
* here to rotate the model for example. push and pop matrices are not needed, this is done for you. You can
* also choose to do the whole rendering yourself, you'll need to return false then to indicate that
* PneumaticCraft shouldn't render the item.
*
* @param renderedStack itemStack that is being rendered
* @return true if PneumaticCraft should render the item (after your changes), or false to cancel rendering.
*/
public boolean applyRenderChangeIOUnit(ItemStack renderedStack);
/**
* Same deal as with the applyRenderChangeIOUnit(), but now for the Assembly Platform.
*
* @param renderedStack itemStack that is being rendered
* @return true if PneumaticCraft should render the item (after your changes), or false to cancel rendering.
*/
public boolean applyRenderChangePlatform(ItemStack renderedStack);
/**
* Should return the distance the claw travels before it is gripped to the stack. By default it's 0.0875F for
* items and 0.00625F for blocks, 0.09375 when the claw is completely closed.
*
* @param renderedStack
* @return
*/
public float getIOUnitClawShift(ItemStack renderedStack);
/**
* Should return the distance the claw travels before it is gripped to the stack. By default it's 0.0875F for
* items and 0.00625F for blocks, 0.09375 when the claw is completely closed.
*
* @param renderedStack
* @return
*/
public float getPlatformClawShift(ItemStack renderedStack);
}
}
@@ -1,66 +0,0 @@
package pneumaticCraft.api.client.pneumaticHelmet;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public interface IBlockTrackEntry {
/**
* This method should return true if the coordinate checked is one that should be tracked. Most entries will just
* return true when the blockID is the one that they track.
*
* @param world The world that is examined.
* @param x The x coordinate of the block examined.
* @param y The y coordinate of the block examined.
* @param z The z coordinate of the block examined.
* @param block The block of the current coordinate. This will save you a call to World.getBlock().
* @param te The TileEntity at this x,y,z.
* @return true if the coordinate should be tracked by this BlockTrackEntry.
*/
public boolean shouldTrackWithThisEntry(IBlockAccess world, int x, int y, int z, Block block, TileEntity te);
/**
* This method defines if the block should be updated by the server (each 5 seconds). This is specifically aimed at
* Tile Entities, as the server will send an NBT packet. This method returns true at for instance Chests and Mob
* Spawners, to get the inventory at the client side and the time to the next spawn respectively.
*
* @param te The TileEntity at the currently checked location.
*
* @return true if the Tile Entity should be updated, or false when it doesn't have to.
*/
public boolean shouldBeUpdatedFromServer(TileEntity te);
/**
* The return of this method defines at how many tracked blocks of this type the HUD should stop displaying text at
* the tracked blocks of this type.
*
* @return amount of blocks the HUD should stop displaying the block info.
*/
public int spamThreshold();
/**
* This method is called each render tick to retrieve the blocks additional information. The method behaves the same
* as the addInformation method in the Item class. This method only will be called if shouldTrackWithThisEntry()
* returned true and the player hovers over the coordinate.
*
* @param world The world the block is in.
* @param x The x coordinate the block is at.
* @param y The y coordinate the block is at.
* @param z The z coordinate the block is at.
* @param te The TileEntity at the x,y,z.
* @param infoList The list of lines to display.
*/
public void addInformation(World world, int x, int y, int z, TileEntity te, List<String> infoList);
/**
* This method is called when displaying the currently tracked blocks. Will be tried to be mapped to the
* localization file first.
*
* @return the name of the group of this entry.
*/
public String getEntryName();
}
@@ -1,56 +0,0 @@
package pneumaticCraft.api.client.pneumaticHelmet;
import java.util.List;
import net.minecraft.entity.Entity;
/**
* Implement this class and register it by adding it to the entityTrackEntries class. There needs to be a parameterless
* constructor. For every entity that's applicable for this definition, an instance is created.
*/
public interface IEntityTrackEntry {
/**
* Return true if you want to add a tooltip for the given entity.
*
* @param entity
* @return
*/
public boolean isApplicable(Entity entity);
/**
* Add info to the tab. This is only called when isApplicable returned true.
*
* @param entity
* @param curInfo
*/
public void addInfo(Entity entity, List<String> curInfo);
/**
* Update is called every (client) tick, and can be used to update something like a timer (used for the Creeper
* countdown).
*
* @param entity
*/
public void update(Entity entity);
/**
* Called every render tick, this method can be used to render additional info. Used for Drone AI visualisation.
*
* @param entity
* @param partialTicks TODO
*/
public void render(Entity entity, float partialTicks);
/**
* Just a basic implementation class that can be used if an update and render method isn't needed.
*/
public abstract static class EntityTrackEntry implements IEntityTrackEntry {
@Override
public void update(Entity entity) {}
@Override
public void render(Entity entity, float partialTicks) {}
}
}
@@ -1,16 +0,0 @@
package pneumaticCraft.api.client.pneumaticHelmet;
import java.util.List;
import net.minecraft.client.gui.FontRenderer;
/**
* Just an interface to give access to GuiSreen#buttonList and GuiScreen#fontRenderer. An instance of this class can
* safely be casted to GuiSreen if needed.
*/
public interface IGuiScreen {
public List getButtonList();
public FontRenderer getFontRenderer();
}
@@ -1,76 +0,0 @@
package pneumaticCraft.api.client.pneumaticHelmet;
import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
/**
* Use this interface to specify any hackable block. When it's your block, you can simply implement this interface in
* the block's class. If you don't have access to the class (vanilla blocks), you can implement this interface in a
* separate class and register it using PneumaticRegistry.registry.addHackable(blockClass, IHackableBlockClass). With
* the former way there will be one instance only per type. In the latter, there will be an IHackableBlock instance for
* every block.
*/
public interface IHackableBlock {
/**
* Should return a unique id to represent this hackable. Used in NBT saving to be able to trigger the afterHackTime
* after a server restart. Null is a valid return: afterHackTick will not be triggered at all in that case.
*
* CURRENTLY THIS ISN'T IMPLEMENTED.
*
* @return
*/
public String getId();
/**
* Returning true will allow the player to hack this block. This can be used to only allow hacking on certain
* conditions.
*/
public boolean canHack(IBlockAccess world, int x, int y, int z, EntityPlayer player);
/**
* Add info that is displayed on the tracker tooltip here. Text like "Hack to explode" can be added. This method is
* only called when canHack(World, int, int, int) returned true. The added lines automatically will be tried to get
* localized.
*/
public void addInfo(World world, int x, int y, int z, List<String> curInfo, EntityPlayer player);
/**
* Add info that is being displayed after hacking, as long as 'afterHackTick' is returning true. Things like
* "Neutralized". The added lines automatically will be tried to get localized.
*
* @param entity
* @param curInfo
* @param player
*/
public void addPostHackInfo(World world, int x, int y, int z, List<String> curInfo, EntityPlayer player);
/**
* Return the time it takes to hack this block in ticks. For more powerful hacks, a longer required hacking time is
* adviced.
*/
public int getHackTime(IBlockAccess world, int x, int y, int z, EntityPlayer player);
/**
* When the player hacked the block for getHackTime(World, int, int, int) ticks this will be called on both server
* and client side.
*/
public void onHackFinished(World world, int x, int y, int z, EntityPlayer player);
/**
* Called every tick after the hacking finished (on both server and client side). Returning true will keep this
* going (for mob spawners, to keep them neutralized), or false to stop ticking (for door/lever hacking).
*
* CURRENTLY THIS METHOD WILL STOP GETTING INVOKED AFTER A SERVER RESTART!
*
* @param world
* @param x
* @param y
* @param z
* @return
*/
public boolean afterHackTick(World world, int x, int y, int z);
}
@@ -1,63 +0,0 @@
package pneumaticCraft.api.client.pneumaticHelmet;
import java.util.List;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
/**
* Use this interface to specify any hackable entity. When it's your entity, you can simply implement this interface in
* the entity's class. If you don't have access to the class (vanilla entities), you can implement this interface in a
* separate class and register it using PneumaticRegistry.registry.addHackable(entityClass, IHackableEntityClass). In
* both ways there will be an IHackableEntity instance for every entity.
*/
public interface IHackableEntity {
/**
* Should return a unique id to represent this hackable. Used in NBT saving to be able to trigger the afterHackTime
* after a server restart. Null is a valid return: afterHackTick will not be triggered at all in that case.
*
* @return
*/
public String getId();
/**
* Returning true will allow the player to hack this entity. This can be used to only allow hacking on certain
* conditions.
*/
public boolean canHack(Entity entity, EntityPlayer player);
/**
* Add info that is displayed on the tracker tooltip here. Text like "Hack to explode" can be added. This method is
* only called when canHack(Entity) returned true. The added lines automatically will be tried to get localized.
*/
public void addInfo(Entity entity, List<String> curInfo, EntityPlayer player);
/**
* Add info that is being displayed after hacking, as long as 'afterHackTick' is returning true. Things like
* "Neutralized". The added lines automatically will be tried to get localized.
*
* @param entity
* @param curInfo
* @param player
*/
public void addPostHackInfo(Entity entity, List<String> curInfo, EntityPlayer player);
/**
* Return the time it takes to hack this entity in ticks. For more powerful hacks, a longer required hacking time is
* adviced.
*/
public int getHackTime(Entity entity, EntityPlayer player);
/**
* When the player hacked the entity for getHackTime(Entity) ticks this will be called on both client and server
* side.
*/
public void onHackFinished(Entity entity, EntityPlayer player);
/**
* Called every tick after the hacking finished. Returning true will keep this going (for mob spawners, to keep them
* neutralized), or false to stop ticking (for door/lever hacking).
*/
public boolean afterHackTick(Entity entity);
}
@@ -1,50 +0,0 @@
package pneumaticCraft.api.client.pneumaticHelmet;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
/**
* The Option Page is the page you see when you press 'F' (by default) with a Pneumatic Helmet equipped. You can
* register this class by returning a new instance of this class at {@link IUpgradeRenderHandler#getGuiOptionsPage()}
*/
public interface IOptionPage {
/**
* This string is used in the text of the button of this page.
*
* @return
*/
public String getPageName();
/**
* Here you can initialize your buttons and stuff like with a GuiScreen. For buttons, don't use button id 100 and
* up, as they will be used as selection buttons for other option pages in the main GuiScreen.
*
* @param gui
*/
public void initGui(IGuiScreen gui);
/**
* Same as GuiScreen#actionPerformed(GuiButton).
*
* @param button
*/
public void actionPerformed(GuiButton button);
/**
* Same as {@link GuiScreen#drawScreen(int, int, float)} Here you can render additional things like text.
*
* @param x
* @param y
* @param partialTicks
*/
public void drawScreen(int x, int y, float partialTicks);
/**
* Same as GuiScreen#keyTyped(char, int).
*
* @param ch
* @param key
*/
public void keyTyped(char ch, int key);
}
@@ -1,104 +0,0 @@
package pneumaticCraft.api.client.pneumaticHelmet;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.config.Configuration;
import pneumaticCraft.api.client.IGuiAnimatedStat;
/**
* To add upgrades for in the Pneumatic Helmet implement this interface. You can add members to this class, however
* these can only be client sided members as this class will be used as singleton. Therefore, only one of these
* instances exist at the server side so any member that is used server side will affect every player.
*
*/
public interface IUpgradeRenderHandler {
/**
* Return here the name of the upgrade. This is displayed in the formatting [upgradeName] + " " + "found"/"not
* found" on initialization of the helmet.
*
* @return
*/
public String getUpgradeName();
/**
* Being called from PneumaticCraft's config handler, you can use this method to read settings like stat positions
*
* @param config PneumaticCraft's config file.
*/
public void initConfig(Configuration config);
/**
* When called this should save the settings to the config file. Called when changed a setting. When you want to use
* PneumaticCraft's config file, save a reference of it somewhere in this class when the config gets passed in the
* initConfig() method (this always will be called first).
*/
public void saveToConfig();
/**
* This method will be called every client tick, and should be used to update logic like the tracking and velocities
* of stuff.
*
* @param player
* @param rangeUpgrades amount of range upgrades installed in the helmet.
*/
public void update(EntityPlayer player, int rangeUpgrades);
/**
* Called in the 3D render stage (renderWorldLastEvent)
*
* @param partialTicks
*/
public void render3D(float partialTicks);
/**
* Called in the 2D render stage (Render Tick Handler)
*
* @param partialTicks
* @param helmetEnabled is true when isEnabled() returned true earlier. Can be used to close AnimatedStats for
* instance. However this is already handled if you return an AnimatedStat in
* getAnimatedStat().
*/
public void render2D(float partialTicks, boolean helmetEnabled);
/**
* You can return a GuiAnimatedStat here, that the HUDHandler will pick up and render. It also automatically opens
* and closes the stat when needed. The GuiMoveStat uses this method to retrieve the to be moved stat.
*
* @return null if no stat used.
*/
public IGuiAnimatedStat getAnimatedStat();
/**
* Should return true if this upgrade handler is enabled for the given stacks placed in the helmet.
*
* @param upgradeStacks
* @return
*/
public boolean isEnabled(ItemStack[] upgradeStacks);
/**
* Returns the usage in mL/tick when this upgrade handler is enabled.
*
* @param rangeUpgrades amount of range upgrades installed in the helmet.
* @param player
* @return usage in mL/tick
*/
public float getEnergyUsage(int rangeUpgrades, EntityPlayer player);
/**
* Called when (re-)equipped the helmet this method should be used to clear information like current tracked
* entities. So clearing lists and other references as this handler should re-acquire when reinstalled.
*/
public void reset();
/**
* When you have some options for your upgrade handler you could return a new instance of an IOptionsPage. When you
* do so, it will automatically get picked up by the options handler, and it will be added to the options GUI when
* this upgrade returns true when calling isEnabled(). Returning null is valid.
*
* @return
*/
public IOptionPage getGuiOptionsPage();
}
@@ -1,12 +0,0 @@
package pneumaticCraft.api.client.pneumaticHelmet;
import java.util.List;
public class RenderHandlerRegistry {
/**
* With this field you can register your render handlers. This field is initialized in the PreInit phase of
* PneumaticCraft's loading phase.
*/
public static List<IUpgradeRenderHandler> renderHandlers;
}
@@ -1,12 +0,0 @@
package pneumaticCraft.api.drone;
import cpw.mods.fml.common.eventhandler.Event;
public class DroneConstructingEvent extends Event {
public IDrone drone;
public DroneConstructingEvent(IDrone drone) {
this.drone = drone;
}
}
@@ -1,26 +0,0 @@
package pneumaticCraft.api.drone;
/**
* DON'T IMPLEMENT, just use
*/
public interface IBlockInteractHandler {
/**
* Returns a boolean[6] of all sides. when true, this side is accessible
*
* @return
*/
public boolean[] getSides();
public boolean useCount();
public void decreaseCount(int count);
public int getRemainingCount();
/**
* When invoked, the drone will abort searching the area. Could be used to abort early when full of RF energy for
* example, when importing RF. (It's useless to search any further)
*/
public void abort();
}
@@ -1,54 +0,0 @@
package pneumaticCraft.api.drone;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.ChunkPosition;
/**
* Implement this and register it to PneumaticRegistry.registerCustomBlockInteractor(). This will add a puzzle piece
* that has only a Area white- and blacklist parameter (similar to a GoTo piece). It will do the specified behaviour.
* This can be used to create energy import/export widgets.
*/
public interface ICustomBlockInteract {
/**
* Should return a unique Id, used in NBT saving and localization.
*/
public String getName();
/**
* Should return the puzzle piece texture. Should be a multiple of 80x64 (width x height). I'd recommend starting
* out with copying the Go To widget texture.
*
* @return
*/
public ResourceLocation getTexture();
/**
* The actual interaction.
*
* For every position in the selected area the drone will visit every block (ordered from closest to furthest). It
* will call this method with 'simulate = true'. If this method returns true, the drone will navigate to this
* location, and call this method again with 'simulate = false' It will keep doing this until this method returns
* false.
*
* When interactHandler.useCount() returns true: In the interface of the puzzle piece users can specify a 'use
* count' and fill in the maximum count they want to use. When not simulating, you should only import/export up to
* interactHandler.getRemainingCount(), and you should notify the removed/added count by doing
* interactHandler.decreaseCount(int count).
*
* @param pos current visited location
* @param drone
* @param interactHandler object you can use to use to get accessible sides and give feedback about counts.
* @param simulate will be true when trying to figure out whether or not the drone should navigate to this
* block, false when next to this block.
* @return
*/
public boolean doInteract(ChunkPosition pos, IDrone drone, IBlockInteractHandler interactHandler, boolean simulate);
/**
* Used for crafting, categorizes the puzzle piece.
*
* @return
*/
public int getCraftingColorIndex();
}
@@ -1,63 +0,0 @@
package pneumaticCraft.api.drone;
import net.minecraft.entity.Entity;
import net.minecraft.entity.ai.EntityAITasks;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import net.minecraftforge.common.IExtendedEntityProperties;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.IFluidTank;
import pneumaticCraft.api.item.IPressurizable;
public interface IDrone extends IPressurizable {
/**
*
* @param upgradeIndex metadata value of the upgrade item
* @return amount of inserted upgrades in the drone
*/
public int getUpgrades(int upgradeIndex);
public World getWorld();
public IFluidTank getTank();
public IInventory getInventory();
public Vec3 getPosition();
public IPathNavigator getPathNavigator();
public void sendWireframeToClient(int x, int y, int z);
public EntityPlayerMP getFakePlayer();
public boolean isBlockValidPathfindBlock(int x, int y, int z);
public void dropItem(ItemStack stack);
public void setDugBlock(int x, int y, int z);
public EntityAITasks getTargetAI();
public IExtendedEntityProperties getProperty(String key);
public void setProperty(String key, IExtendedEntityProperties property);
public void setEmittingRedstone(ForgeDirection orientation, int emittingRedstone);
public void setName(String string);
public void setCarryingEntity(Entity entity);
public Entity getCarryingEntity();
public boolean isAIOverriden();
public void onItemPickupEvent(EntityItem curPickingUpEntity, int stackSize);
}
@@ -1,12 +0,0 @@
package pneumaticCraft.api.drone;
import net.minecraft.entity.Entity;
public interface IPathNavigator {
public boolean moveToXYZ(double x, double y, double z);
public boolean moveToEntity(Entity entity);
public boolean hasNoPath();
}
@@ -1,28 +0,0 @@
package pneumaticCraft.api.drone;
import net.minecraft.world.World;
public interface IPathfindHandler {
/**
* When returned true, the drone can pathfind through this block. When false it can't.
*
* @param world
* @param x
* @param y
* @param z
* @return
*/
public boolean canPathfindThrough(World world, int x, int y, int z);
/**
* CURRENTLY NOT IMPLEMENTED! Will be called every tick as long as the drone is < 1 block away from the given
* coordinate. can be used to open a door for a drone for example.
*
* @param world
* @param x
* @param y
* @param z
*/
public void onPathingThrough(World world, int x, int y, int z);
}
@@ -1,64 +0,0 @@
package pneumaticCraft.api.drone;
import net.minecraft.item.ItemStack;
import net.minecraft.world.ChunkPosition;
import cpw.mods.fml.common.eventhandler.Event;
/**
* Fired when a Drone is trying to get a special coordinate, by accessing a variable with '$' prefix. These event are
* posted on the MinecraftForge.EVENT_BUS.
*/
public abstract class SpecialVariableRetrievalEvent extends Event {
/**
* The special variable name, with the '$' stripped away.
*/
public final String specialVarName;
/**
* The returning coordinate
*/
public SpecialVariableRetrievalEvent(String specialVarName) {
this.specialVarName = specialVarName;
}
public abstract static class CoordinateVariable extends SpecialVariableRetrievalEvent {
public ChunkPosition coordinate;
public CoordinateVariable(String specialVarName) {
super(specialVarName);
}
public static class Drone extends CoordinateVariable {
public final IDrone drone;
public Drone(IDrone drone, String specialVarName) {
super(specialVarName);
this.drone = drone;
}
}
}
public abstract static class ItemVariable extends SpecialVariableRetrievalEvent {
public ItemStack item;
public ItemVariable(String specialVarName) {
super(specialVarName);
}
public static class Drone extends ItemVariable {
public final IDrone drone;
public Drone(IDrone drone, String specialVarName) {
super(specialVarName);
this.drone = drone;
}
}
}
}
@@ -1,21 +0,0 @@
package pneumaticCraft.api.item;
import java.util.List;
import net.minecraft.item.ItemStack;
/**
* Implement this interface for your items that have an inventory. When you don't have access to the item, just create
* any old class that implements this interface and register an instance of it in PneumaticRegistry. This will then will
* be used in the Pneumatic Helmet's item search.
*
*/
public interface IInventoryItem {
/**
* @parm stack: Item that potentially has an inventory.
* @parm curStacks: List of all currently added stacks for this item. Add more stacks in here in your implementation
* when found the right item.
*/
public void getStacksInItem(ItemStack stack, List<ItemStack> curStacks);
}
@@ -1,35 +0,0 @@
package pneumaticCraft.api.item;
import net.minecraft.item.ItemStack;
/**
* Any item implementing this interface will be able to (dis)charge in a Charging Station.
*/
public interface IPressurizable {
/**
* This method should return the current pressure of the ItemStack given.
*
* @param iStack Stack the pressure is asked from.
* @return Pressure in bar.
*/
public float getPressure(ItemStack iStack);
/**
* this method is used to charge or discharge a pneumatic item. when the value is negative the item should be
* discharging
*
* @param iStack the ItemStack which has to be (dis)charged.
* @param amount amount in mL that the item is (dis)charging.
*/
public void addAir(ItemStack iStack, int amount);
/**
* This method should return the maximum pressure of a pneumatic item. If it has reached this maximum, it won't
* explode, but it wouldn't (try to) charge either.
*
* @param iStack the stack from which the maximum pressure is asked.
* @return maximum pressure in bar.
*/
public float maxPressure(ItemStack iStack);
}
@@ -1,37 +0,0 @@
package pneumaticCraft.api.item;
import net.minecraft.item.ItemStack;
/**
* Implement this for items that can get programmed in a Programmer. For now the only thing you can do with this is make
* program storages, later more interaction with programming puzzles is planned. Puzzle pieces will be written onto the
* implementer's itemstack NBT, using the "progWidget" tag.
*/
public interface IProgrammable {
/**
* When returned true, this stack is allowed to be programmed. Used to allow certain damage values to be programmed
* while others can't.
*
* @param stack
* @return
*/
public boolean canProgram(ItemStack stack);
/**
* When returned true, Programming Puzzles are needed to program this item. When returned false, it's free to
* program. Drones and Network API's return true in PneumaticCraft, Network Storages return false.
*
* @param stack
* @return
*/
public boolean usesPieces(ItemStack stack);
/**
* When returned true, the implementing item will get a tooltip added of the summary of puzzles used in the stored
* program.
*
* @return
*/
public boolean showProgramTooltip();
}
@@ -1,25 +0,0 @@
package pneumaticCraft.api.item;
import net.minecraft.item.Item;
import cpw.mods.fml.common.registry.GameRegistry;
public class ItemSupplier {
public static Item getItem(String itemName) {
return GameRegistry.findItem("PneumaticCraft", itemName);
}
/*
* The following is a list of all the item names that can be passed as argument in getItem(String) to get a
* PneumaticCraft item. GPSTool Currently tracked coordinated is stored in NBT, with 'x', 'y', 'z' being the tag
* names for the x,y and z positions respectively. machineUpgrade damage value = upgrade type. ingotIronCompressed
* pressureGauge stoneBase cannonBarrel turbineBlade plasticPlant damage value = plant type. Mapped the same as
* Vanilla dye in terms of color. plastic damage value = plastic type. Mapped the same as Vanilla dye in terms of
* color. airCanister implements IPressurizable vortexCannon implements IPressurizable pneumaticCylinder
* pneumaticHelmet implements IPressurizable manometer implements IPressurizable turbineRotor assemblyProgram damage
* value = program type. emptyPCB unassembledPCB PCBBlueprint bucketEtchingAcid transistor capacitor
* printedCircuitBoard failedPCB networkComponent damage value = network component type. stopWorm nukeVirus
* compressedIronGear pneumaticWrench implements IPressurizable
*/
}
@@ -1,4 +0,0 @@
@API(apiVersion = "1.0", owner = "PneumaticCraft", provides = "PneumaticCraftApi")
package pneumaticCraft.api;
import cpw.mods.fml.common.API;
@@ -1,49 +0,0 @@
package pneumaticCraft.api.recipe;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
public class AssemblyRecipe {
public static List<AssemblyRecipe> drillRecipes = new ArrayList<AssemblyRecipe>();
public static List<AssemblyRecipe> laserRecipes = new ArrayList<AssemblyRecipe>();
public static List<AssemblyRecipe> drillLaserRecipes = new ArrayList<AssemblyRecipe>();
private final ItemStack input;
private final ItemStack output;
public AssemblyRecipe(ItemStack input, ItemStack output) {
this.input = input;
this.output = output;
}
public ItemStack getInput() {
return input;
}
public ItemStack getOutput() {
return output;
}
public static void addDrillRecipe(Object input, Object output) {
drillRecipes.add(new AssemblyRecipe(getStackFromObject(input), getStackFromObject(output)));
}
public static void addLaserRecipe(Object input, Object output) {
laserRecipes.add(new AssemblyRecipe(getStackFromObject(input), getStackFromObject(output)));
}
private static ItemStack getStackFromObject(Object object) {
if (object instanceof Block) {
return new ItemStack((Block) object);
} else if (object instanceof Item) {
return new ItemStack((Item) object);
} else {
return (ItemStack) object;
}
}
}
@@ -1,40 +0,0 @@
package pneumaticCraft.api.recipe;
import net.minecraft.item.ItemStack;
public interface IPressureChamberRecipe {
/**
* Returns the threshold which is minimal to craft the recipe. Negative pressures also work.
*
* @return threshold pressure
*/
public float getCraftingPressure();
/**
* This method should return the used items in the recipe when the right items are provided to craft this recipe.
*
* @param inputStacks
* @return usedStacks, return null when the inputStacks aren't valid for this recipe.
*/
public ItemStack[] isValidRecipe(ItemStack[] inputStacks);
/**
* When returned true, only the exact same references of the stacks returned by isValidRecipe() will be removed.
* This is useful to remove stacks with a certain NBT value (like Enchanted Books). Return false for normal
* behaviour.
*
* @return true if exact stacks should be removed only.
*/
public boolean shouldRemoveExactStacks();
/**
* This method will be called when the recipe should output its items. the stacks the recipe output, may be
* dependent on the input stacks.
*
* @param removedStacks same reference to the stacks returned by isValidRecipe.
* @param inputStacks. These stacks can be modified (like adding/removing NBT data eg.)
* @return outputStacks. Stacks that will pop 'out of the chamber'
*/
public ItemStack[] craftRecipe(ItemStack[] inputStacks, ItemStack[] removedStacks);
}
@@ -1,24 +0,0 @@
package pneumaticCraft.api.recipe;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.item.ItemStack;
public class PressureChamberRecipe {
public static List<PressureChamberRecipe> chamberRecipes = new ArrayList<PressureChamberRecipe>();
public static List<IPressureChamberRecipe> specialRecipes = new ArrayList<IPressureChamberRecipe>();
public final ItemStack[] input;
public final ItemStack[] output;
public final float pressure;
public final boolean outputAsBlock;
public PressureChamberRecipe(ItemStack[] input, float pressureRequired, ItemStack[] output, boolean outputAsBlock) {
this.input = input;
this.output = output;
pressure = pressureRequired;
this.outputAsBlock = outputAsBlock;
}
}
@@ -1,57 +0,0 @@
package pneumaticCraft.api.tileentity;
import java.lang.reflect.Constructor;
public class AirHandlerSupplier {
private static Constructor airHandlerConstructor;
public static IAirHandler getTierOneAirHandler(int volume) {
return getAirHandler(5F, 7F, volume);
}
public static IAirHandler getTierTwoAirHandler(int volume) {
return getAirHandler(20F, 25F, volume);
}
/**
* Returns a new instance of an IAirHandler. This handler handles everything pressurized air related: Air
* dispersion, blowing up when the pressure gets too high, providing a method for releasing air into the
* atmosphere... PROVIDED THAT THE FOLLOWING METHODS ARE FORWARDED TO THIS INSTANCE:
* {@link net.minecraft.tileentity.TileEntity#updateEntity()},
* {@link net.minecraft.tileentity.TileEntity#writeToNBT(net.minecraft.nbt.NBTTagCompound)}
* {@link net.minecraft.tileentity.TileEntity#readFromNBT(net.minecraft.nbt.NBTTagCompound)}
* {@link net.minecraft.tileentity.TileEntity#validate()}
*
* @param dangerPressure minimal pressure on which this machine can explode (the yellow to red transition)
* @param criticalPressure the absolute maximum pressure the machine can take 7 bar in tier 1 machines.
* @param maxFlow maximum mL/tick that this machine can disperse. Tier one machines do 50mL/tick while Tier
* two have 200mL/tick.
* @param volume Volume of the machine's internal storage. These vary from 1000mL for small machines to
* 10,000mL for the big ones. The higher the volume the slower the machine will
* charge/discharge.
* @return
*/
public static IAirHandler getAirHandler(float dangerPressure, float criticalPressure, int volume) {
IAirHandler airHandler = null;
try {
if (airHandlerConstructor == null)
airHandlerConstructor = Class.forName("pneumaticCraft.common.tileentity.TileEntityPneumaticBase")
.getConstructor(float.class, float.class, int.class);
airHandler = (IAirHandler) airHandlerConstructor.newInstance(dangerPressure, criticalPressure, volume);
} catch (Exception e) {
System.err.println(
"[PneumaticCraft API] An error has occured whilst trying to get an AirHandler. Here's a stacktrace:");
e.printStackTrace();
}
return airHandler;
}
/**
* Use the version with integer parameters
*/
@Deprecated
public static IAirHandler getAirHandler(float dangerPressure, float criticalPressure, float maxFlow, float volume) {
return getAirHandler(dangerPressure, criticalPressure, (int) volume);
}
}
@@ -1,123 +0,0 @@
package pneumaticCraft.api.tileentity;
import java.util.List;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
import org.apache.commons.lang3.tuple.Pair;
/**
* A way for you to access about everything you need from a pneumatic machine. DO NOT IMPLEMENT THIS YOURSELF! Use
* AirHandlerSupplier to get an instance for your TileEntity, and implement IPneumaticMachine instead.
*/
public interface IAirHandler extends IManoMeasurable {
/**
* -----------Needs to be forwarded by the implementing TileEntity's updateEntity() method. Updates the pneumatic
* machine's logic like air dispersion and checking if it needs to explode.
*/
public void updateEntityI();
/**
* -----------Needs to be forwarded by the implementing TileEntity.
*
* @param nbt
*/
public void readFromNBTI(NBTTagCompound nbt);
/**
* -----------Needs to be forwarded by the implementing TileEntity.
*
* @param nbt
*/
public void writeToNBTI(NBTTagCompound nbt);
/**
* -----------Needs to be forwarded by the implementing TileEntity with itself as parameter.
*
* @param parent TileEntity that is referencing this air handler.
*/
public void validateI(TileEntity parent);
/**
* Method to release air in the air. It takes air from a specific side, plays a sound effect, and spawns smoke
* particles. It automatically detects if it needs to release air (when under pressure), suck air (when in vacuum)
* or do nothing.
*
* @param side
*/
public void airLeak(ForgeDirection side);
/**
* Returns a list of all the connecting pneumatics. It takes sides in account.
*/
public List<Pair<ForgeDirection, IPneumaticMachine>> getConnectedPneumatics();
/**
* Adds air to the tank of the given side of this TE. It also updates clients where needed (when they have a GUI
* opened). Deprecated: use the version with the integer parameter now.
*
* @param amount
* @param side
*/
@Deprecated
public void addAir(float amount, ForgeDirection side);
public void addAir(int amount, ForgeDirection side);
/**
* Sets the volume of this TE's air tank. When the volume decreases the pressure will remain the same, meaning air
* will be lost. When the volume increases, the air remains the same, meaning the pressure will drop. Used in the
* Volume Upgrade calculations. Deprecated: use the version with the integer parameter now.
*
* @param newVolume
*/
@Deprecated
public void setVolume(float newVolume);
public void setVolume(int newVolume);
public int getVolume();
/**
* Returns the pressure at which this TE will explode.
*
* @return
*/
public float getMaxPressure();
public float getPressure(ForgeDirection sideRequested);
/**
* Returns the amount of air (that has a relation to the pressure: air = pressure * volume)
*
* @param sideRequested
* @return
*/
public int getCurrentAir(ForgeDirection sideRequested);
/**
* When your TileEntity is implementing IInventory and has slots that accept PneumaticCraft upgrades, register these
* slots to the air handler by calling this method once on initialization of the TileEntity. Then they'll
* automatically be used to get Volume/Security upgrades.
*
* @param upgradeSlots all upgrade slots stored in an array.
*/
public void setUpgradeSlots(int... upgradeSlots);
public int[] getUpgradeSlots();
public int getXCoord();
public int getYCoord();
public int getZCoord();
/**
* Needs to be forwarded from the implementing _Block_! Forward the Block's "onNeighborChange" method to this
* handler.
*/
public void onNeighborChange();
}
@@ -1,25 +0,0 @@
package pneumaticCraft.api.tileentity;
import net.minecraftforge.common.util.ForgeDirection;
import pneumaticCraft.api.IHeatExchangerLogic;
/**
* Implemented by TileEntities or Blocks which transport heat. Keep in mind that when a Block is implementing it you
* only can give off a constant resistance/temperature (like Lava and Ice).
*
* @author MineMaarten www.minemaarten.com
*/
public interface IHeatExchanger {
/**
* Get an instance of IHeatExchangerLogic from PneumaticRegistry.getInstance().getHeatExchangerLogic() and keep a
* global reference. Then return it in this method. You can return different exchanger logics for different sides.
* Keep in mind that when you change a returned logic, you need to create a neighbor block change to notify the
* differences. You can return null to indicate no heat can be exchanged on that side.
*
* @param side
* @return
*/
public IHeatExchangerLogic getHeatExchangerLogic(ForgeDirection side);
}
@@ -1,17 +0,0 @@
package pneumaticCraft.api.tileentity;
import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
public interface IManoMeasurable {
/**
* This method is invoked by the Manometer when a player right-clicks a TE or Entity with this interface
* implemented.
*
* @param player that rightclicks the measurable TE, and therefore needs to get the message
* @param curInfo list you can append info to. If you don't append any info no air will be used.
*/
public void printManometerMessage(EntityPlayer player, List<String> curInfo);
}
@@ -1,33 +0,0 @@
package pneumaticCraft.api.tileentity;
import net.minecraftforge.common.util.ForgeDirection;
public interface IPneumaticMachine {
/**
* In your TileEntity class which is implementing this interface you should keep a reference of an IAirHandler. You
* can retrieve one by calling
* {@link AirHandlerSupplier#getAirHandler(net.minecraft.tileentity.TileEntity, float, float, float, float)}. Do
* this when your TileEntity is initialized, i.e. xCoord,yCoord,zCoord and worldObj have a value. In this method you
* need to return this reference.
*
* IMPORTANT: You need to forward the {@link net.minecraft.tileentity.TileEntity#updateEntity()},
* {@link net.minecraft.tileentity.TileEntity#writeToNBT(net.minecraft.nbt.NBTTagCompound)} ,
* {@link net.minecraft.tileentity.TileEntity#readFromNBT(net.minecraft.nbt.NBTTagCompound)} and
* {@link net.minecraft.tileentity.TileEntity#validate()} (with the implementing TileEntity as additional parameter)
* to the IAirHandler. Apart from that you'll need to forward
* {@link net.minecraft.block.Block#onNeighborChange(net.minecraft.world.IBlockAccess, int, int, int, int, int, int)}
* from the implementing block to the IAirHandler.
*
* @return
*/
public IAirHandler getAirHandler();
/**
* Returns true if the pneumatic logic is connected to the given side.
*
* @param side
* @return
*/
public boolean isConnectedTo(ForgeDirection side);
}
@@ -1,36 +0,0 @@
package pneumaticCraft.api.universalSensor;
import java.util.List;
import net.minecraft.entity.Entity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
public abstract class EntityPollSensor implements IPollSensorSetting {
@Override
public String getSensorPath() {
return "entityTracker";
}
@Override
public int getPollFrequency() {
return 1;
}
@Override
public int getRedstoneValue(World world, int x, int y, int z, int sensorRange, String textBoxText) {
AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(
x - sensorRange,
y - sensorRange,
z - sensorRange,
x + 1 + sensorRange,
y + 1 + sensorRange,
z + 1 + sensorRange);
return getRedstoneValue(world.getEntitiesWithinAABB(getEntityTracked(), aabb), textBoxText);
}
public abstract Class getEntityTracked();
public abstract int getRedstoneValue(List<Entity> entities, String textBoxText);
}
@@ -1,67 +0,0 @@
package pneumaticCraft.api.universalSensor;
import java.util.List;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.tileentity.TileEntity;
import org.lwjgl.util.Rectangle;
import cpw.mods.fml.common.eventhandler.Event;
public interface IBlockAndCoordinateEventSensor {
/**
* See {@link ISensorSetting#getSensorPath()}
*
* @return
*/
public String getSensorPath();
/**
* Extended version of the normal emitRedstoneOnEvent. This method will only invoke with a valid GPS tool, and when
* the coordinate is within range.
*
* @param event
* @param sensor
* @param range
* @param toolX
* @param toolY
* @param toolZ
* @return
*/
public int emitRedstoneOnEvent(Event event, TileEntity sensor, int range, int toolX, int toolY, int toolZ);
/**
* See {@link IEventSensorSetting#getRedstonePulseLength()}
*
* @return
*/
public int getRedstonePulseLength();
/**
* See {@link ISensorSetting#needsTextBox()}
*
* @return
*/
public boolean needsTextBox();
/**
* See {@link ISensorSetting#needsSlot()}
*/
public Rectangle needsSlot();
/**
* See {@link ISensorSetting#getDescription()}
*
* @return
*/
public List<String> getDescription();
/**
* Called by GuiScreen#drawScreen this method can be used to render additional things like status/info text.
*
* @param fontRenderer
*/
public void drawAdditionalInfo(FontRenderer fontRenderer);
}
@@ -1,72 +0,0 @@
package pneumaticCraft.api.universalSensor;
import java.util.List;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.world.World;
import org.lwjgl.util.Rectangle;
public interface IBlockAndCoordinatePollSensor {
/**
* See {@link ISensorSetting#getSensorPath()}
*
* @return
*/
public String getSensorPath();
/**
* See {@link ISensorSetting#needsTextBox()}
*
* @return
*/
public boolean needsTextBox();
/**
* See {@link ISensorSetting#needsSlot()}
*
* @return
*/
public Rectangle needsSlot();
/**
* See {@link ISensorSetting#getDescription()}
*
* @return
*/
public List<String> getDescription();
/**
* See {@link IPollSensorSetting#getRedstoneValue(World, int, int, int, int, String)} , but this has the GPS tracked
* coordinates as extra parameters. This method will only be called when the coordinate is within the Universal
* Sensor's range.
*
* @param world
* @param x
* @param y
* @param z
* @param sensorRange
* @param textBoxText
* @param toolX
* @param toolY
* @param toolZ
* @return
*/
public int getRedstoneValue(World world, int x, int y, int z, int sensorRange, String textBoxText, int toolX,
int toolY, int toolZ);
/**
* See {@link IPollSensorSetting#getPollFrequency()}
*
* @return
*/
public int getPollFrequency();
/**
* Called by GuiScreen#drawScreen this method can be used to render additional things like status/info text.
*
* @param fontRenderer
*/
public void drawAdditionalInfo(FontRenderer fontRenderer);
}
@@ -1,26 +0,0 @@
package pneumaticCraft.api.universalSensor;
import net.minecraft.tileentity.TileEntity;
import cpw.mods.fml.common.eventhandler.Event;
public interface IEventSensorSetting extends ISensorSetting {
/**
* This method is only invoked when a subscribed event is triggered.
*
* @param event
* @param sensor
* @param range
* @param textboxText
* @return Redstone strength for the given event.
*/
public int emitRedstoneOnEvent(Event event, TileEntity sensor, int range, String textboxText);
/**
* Should return how long a pulse should hold in ticks. By default this is 5 ticks (1/4 second).
*
* @return
*/
public int getRedstonePulseLength();
}
@@ -1,28 +0,0 @@
package pneumaticCraft.api.universalSensor;
import net.minecraft.world.World;
public interface IPollSensorSetting extends ISensorSetting {
/**
* The value returned here is the interval between every check in ticks (the interval of calling
* getRedstoneValue()). Consider increasing the interval when your sensor method is resource intensive.
*
* @return
*/
public int getPollFrequency();
/**
* The base method. This method should return the outputted redstone value 0-15 of this sensor. When this sensor is
* digital, just return 0 or 15.
*
* @param world
* @param x
* @param y
* @param z
* @param sensorRange Range of the sensor, based on the amount of Range Upgrades inserted in the Universal Sensor.
* @param textBoxText The text typed in the textbox of the Universal Sensor.
* @return
*/
public int getRedstoneValue(World world, int x, int y, int z, int sensorRange, String textBoxText);
}
@@ -1,58 +0,0 @@
package pneumaticCraft.api.universalSensor;
import java.util.List;
import net.minecraft.client.gui.FontRenderer;
import org.lwjgl.util.Rectangle;
public interface ISensorSetting {
/**
* Should return the button path the player has to follow in which this setting is stored. For instance, when the
* sensor should be located in player and is called speed, you should return "entityTracker/player/speed".
* "entityTracker" indicates that this sensor needs an Entity Tracker upgrade to run. You can choose from the
* following upgrades:
*
* -entityTracker -blockTracker -gpsTool (so you can use a certain coordinate (within range) to measure on) -volume
* -dispenser -speed -itemLife -itemSearch -coordinateTracker -range -security
*
* You can allow only sensors to work by more than one upgrade, by seperating the upgrades with a '_'. For example,
* "entityTracker_speed" will only let the sensor be chosen when both an Entity Tracker and a Speed Upgrade are
* inserted.
*
* @return
*/
public String getSensorPath();
/**
* When returned true, the GUI will enable the textbox writing, otherwise not.
*
* @return
*/
public boolean needsTextBox();
/**
* Called by GuiScreen#drawScreen this method can be used to render additional things like status/info text.
*
* @param fontRenderer
*/
public void drawAdditionalInfo(FontRenderer fontRenderer);
/**
* Should return the description of this sensor displayed in the GUI stat. Information should at least include when
* this sensor emits redstone and how (analog (1 through 15), or digital).
*
* @return
*/
public List<String> getDescription();
/**
* Not being used at the moment, I recommend returning null for now. It is going to be used to allow sensors to
* decide their status on a item which can be inserted in a slot in the GUI if this method returns a rectangle with
* the coordinates of the slot.
*
* @return
*/
public Rectangle needsSlot();
}
@@ -1,35 +0,0 @@
package pneumaticCraft.api.universalSensor;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.event.entity.player.PlayerEvent;
import cpw.mods.fml.common.eventhandler.Event;
public abstract class PlayerEventSensor implements IEventSensorSetting {
@Override
public String getSensorPath() {
return "entityTracker/Player";
}
@Override
public int emitRedstoneOnEvent(Event event, TileEntity sensor, int range, String textboxText) {
if (event instanceof PlayerEvent) {
EntityPlayer player = ((PlayerEvent) event).entityPlayer;
if (Math.abs(player.posX - sensor.xCoord + 0.5D) < range + 0.5D
&& Math.abs(player.posY - sensor.yCoord + 0.5D) < range + 0.5D
&& Math.abs(player.posZ - sensor.zCoord + 0.5D) < range + 0.5D) {
return emitRedstoneOnEvent((PlayerEvent) event, sensor, range);
}
}
return 0;
}
public abstract int emitRedstoneOnEvent(PlayerEvent event, TileEntity sensor, int range);
@Override
public int getRedstonePulseLength() {
return 5;
}
}
@@ -1,39 +0,0 @@
package pneumaticCraft.api.universalSensor;
/**
* With this class you can register your own sensors.
*/
public class SensorRegistrator {
/**
* This field will be initialized in the PreInit phase of PneumaticCraft's loading phase. With this field you can
* register every Universal Sensor sensor you want. Just pass a new instance to one of the registerSensor methods.
* Sensors are singletons.
*/
public static ISensorRegistrator sensorRegistrator;
public static interface ISensorRegistrator {
/**
* Registry for IPollSensorSetting, EntityPollSensor and IEventSensorSetting, and any other instance of
* ISensorSetting.
*
* @param sensor
*/
public void registerSensor(ISensorSetting sensor);
/**
* Registry for IBlockAndCoordinateEventSensor
*
* @param sensor
*/
public void registerSensor(IBlockAndCoordinateEventSensor sensor);
/**
* Registry for IBlockAndCoordinatePollSensor
*
* @param sensor
*/
public void registerSensor(IBlockAndCoordinatePollSensor sensor);
}
}
@@ -55,10 +55,21 @@ import WayofTime.alchemicalWizardry.api.items.ShapelessBloodOrbRecipe;
import WayofTime.alchemicalWizardry.api.rituals.Rituals;
import WayofTime.alchemicalWizardry.api.sacrifice.PlayerSacrificeHandler;
import WayofTime.alchemicalWizardry.api.soulNetwork.ComplexNetworkHandler;
import WayofTime.alchemicalWizardry.api.spell.*;
import WayofTime.alchemicalWizardry.api.spell.SpellEffectRegistry;
import WayofTime.alchemicalWizardry.api.spell.SpellParadigmMelee;
import WayofTime.alchemicalWizardry.api.spell.SpellParadigmProjectile;
import WayofTime.alchemicalWizardry.api.spell.SpellParadigmSelf;
import WayofTime.alchemicalWizardry.api.spell.SpellParadigmTool;
import WayofTime.alchemicalWizardry.api.summoningRegistry.SummoningRegistry;
import WayofTime.alchemicalWizardry.client.nei.IMCForNEI;
import WayofTime.alchemicalWizardry.common.*;
import WayofTime.alchemicalWizardry.common.AlchemicalWizardryEventHooks;
import WayofTime.alchemicalWizardry.common.AlchemicalWizardryFuelHandler;
import WayofTime.alchemicalWizardry.common.ClientToServerPacketHandler;
import WayofTime.alchemicalWizardry.common.CommonProxy;
import WayofTime.alchemicalWizardry.common.LifeBucketHandler;
import WayofTime.alchemicalWizardry.common.LifeEssence;
import WayofTime.alchemicalWizardry.common.ModLivingDropsEvent;
import WayofTime.alchemicalWizardry.common.NewPacketHandler;
import WayofTime.alchemicalWizardry.common.achievements.ModAchievements;
import WayofTime.alchemicalWizardry.common.alchemy.CombinedPotionRegistry;
import WayofTime.alchemicalWizardry.common.block.ArmourForge;
@@ -70,13 +81,39 @@ import WayofTime.alchemicalWizardry.common.compress.BaseCompressionHandler;
import WayofTime.alchemicalWizardry.common.compress.StorageBlockCraftingManager;
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.DemonPacketMinorGrunt;
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.DemonPacketRegistry;
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon.*;
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon.EntityMinorDemonGrunt;
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon.EntityMinorDemonGruntEarth;
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon.EntityMinorDemonGruntFire;
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon.EntityMinorDemonGruntGuardian;
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon.EntityMinorDemonGruntGuardianEarth;
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon.EntityMinorDemonGruntGuardianFire;
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon.EntityMinorDemonGruntGuardianIce;
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon.EntityMinorDemonGruntGuardianWind;
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon.EntityMinorDemonGruntIce;
import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.demon.EntityMinorDemonGruntWind;
import WayofTime.alchemicalWizardry.common.demonVillage.loot.DemonVillageLootRegistry;
import WayofTime.alchemicalWizardry.common.demonVillage.tileEntity.TEDemonChest;
import WayofTime.alchemicalWizardry.common.demonVillage.tileEntity.TEDemonPortal;
import WayofTime.alchemicalWizardry.common.entity.mob.*;
import WayofTime.alchemicalWizardry.common.entity.mob.EntityAirElemental;
import WayofTime.alchemicalWizardry.common.entity.mob.EntityBileDemon;
import WayofTime.alchemicalWizardry.common.entity.mob.EntityBoulderFist;
import WayofTime.alchemicalWizardry.common.entity.mob.EntityEarthElemental;
import WayofTime.alchemicalWizardry.common.entity.mob.EntityFallenAngel;
import WayofTime.alchemicalWizardry.common.entity.mob.EntityFireElemental;
import WayofTime.alchemicalWizardry.common.entity.mob.EntityHolyElemental;
import WayofTime.alchemicalWizardry.common.entity.mob.EntityIceDemon;
import WayofTime.alchemicalWizardry.common.entity.mob.EntityLowerGuardian;
import WayofTime.alchemicalWizardry.common.entity.mob.EntityShade;
import WayofTime.alchemicalWizardry.common.entity.mob.EntityShadeElemental;
import WayofTime.alchemicalWizardry.common.entity.mob.EntitySmallEarthGolem;
import WayofTime.alchemicalWizardry.common.entity.mob.EntityWaterElemental;
import WayofTime.alchemicalWizardry.common.entity.mob.EntityWingedFireDemon;
import WayofTime.alchemicalWizardry.common.guide.RecipeHolder;
import WayofTime.alchemicalWizardry.common.harvest.*;
import WayofTime.alchemicalWizardry.common.harvest.AgriCraftCropHarvestHandler;
import WayofTime.alchemicalWizardry.common.harvest.BloodMagicHarvestHandler;
import WayofTime.alchemicalWizardry.common.harvest.CactusReedHarvestHandler;
import WayofTime.alchemicalWizardry.common.harvest.GourdHarvestHandler;
import WayofTime.alchemicalWizardry.common.harvest.PamHarvestCompatRegistry;
import WayofTime.alchemicalWizardry.common.items.ItemIncense;
import WayofTime.alchemicalWizardry.common.items.ItemMailOrderCatalogue;
import WayofTime.alchemicalWizardry.common.items.ItemRitualDiviner;
@@ -84,24 +121,179 @@ import WayofTime.alchemicalWizardry.common.items.armour.OmegaArmour;
import WayofTime.alchemicalWizardry.common.items.forestry.ItemBloodFrame;
import WayofTime.alchemicalWizardry.common.items.sigil.holding.HoldingPacketHandler;
import WayofTime.alchemicalWizardry.common.items.thaumcraft.ItemSanguineArmour;
import WayofTime.alchemicalWizardry.common.omega.*;
import WayofTime.alchemicalWizardry.common.potion.*;
import WayofTime.alchemicalWizardry.common.omega.OmegaParadigmEarth;
import WayofTime.alchemicalWizardry.common.omega.OmegaParadigmFire;
import WayofTime.alchemicalWizardry.common.omega.OmegaParadigmWater;
import WayofTime.alchemicalWizardry.common.omega.OmegaParadigmWind;
import WayofTime.alchemicalWizardry.common.omega.OmegaRegistry;
import WayofTime.alchemicalWizardry.common.potion.PotionAmphibian;
import WayofTime.alchemicalWizardry.common.potion.PotionBoost;
import WayofTime.alchemicalWizardry.common.potion.PotionDeaf;
import WayofTime.alchemicalWizardry.common.potion.PotionDemonCloak;
import WayofTime.alchemicalWizardry.common.potion.PotionDrowning;
import WayofTime.alchemicalWizardry.common.potion.PotionFeatherFall;
import WayofTime.alchemicalWizardry.common.potion.PotionFireFuse;
import WayofTime.alchemicalWizardry.common.potion.PotionFlameCloak;
import WayofTime.alchemicalWizardry.common.potion.PotionFlight;
import WayofTime.alchemicalWizardry.common.potion.PotionHeavyHeart;
import WayofTime.alchemicalWizardry.common.potion.PotionIceCloak;
import WayofTime.alchemicalWizardry.common.potion.PotionInhibit;
import WayofTime.alchemicalWizardry.common.potion.PotionPlanarBinding;
import WayofTime.alchemicalWizardry.common.potion.PotionProjectileProtect;
import WayofTime.alchemicalWizardry.common.potion.PotionReciprocation;
import WayofTime.alchemicalWizardry.common.potion.PotionSoulFray;
import WayofTime.alchemicalWizardry.common.potion.PotionSoulHarden;
import WayofTime.alchemicalWizardry.common.renderer.AlchemyCircleRenderer;
import WayofTime.alchemicalWizardry.common.rituals.*;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.earth.*;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.fire.*;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.ice.*;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.wind.*;
import WayofTime.alchemicalWizardry.common.spell.simple.*;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectAnimalGrowth;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectAutoAlchemy;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectBinding;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectBiomeChanger;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectContainment;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectCrafting;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectCrushing;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectDemonPortal;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectEllipsoid;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectEvaporation;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectExpulsion;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectFeatheredEarth;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectFeatheredKnife;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectFlight;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectFullStomach;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectGrowth;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectHarvest;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectHealing;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectInterdiction;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectItemRouting;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectItemSuction;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectJumping;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectLava;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectLeap;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectLifeConduit;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectMagnetic;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectOmegaStalling;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectOmegaTest;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectSpawnWard;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectSphereCreator;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectSummonMeteor;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectSupression;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectUnbinding;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectVeilOfEvil;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectWater;
import WayofTime.alchemicalWizardry.common.rituals.RitualEffectWellOfSuffering;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.earth.CSEMeleeDefaultEarth;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.earth.CSEMeleeDefensiveEarth;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.earth.CSEMeleeEnvironmentalEarth;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.earth.CSEMeleeOffensiveEarth;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.earth.CSEProjectileDefaultEarth;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.earth.CSEProjectileDefensiveEarth;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.earth.CSEProjectileEnvironmentalEarth;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.earth.CSEProjectileOffensiveEarth;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.earth.CSESelfDefaultEarth;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.earth.CSESelfDefensiveEarth;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.earth.CSESelfEnvironmentalEarth;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.earth.CSESelfOffensiveEarth;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.earth.CSEToolDefaultEarth;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.earth.CSEToolDefensiveEarth;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.earth.CSEToolEnvironmentalEarth;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.earth.CSEToolOffensiveEarth;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.fire.CSEMeleeDefaultFire;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.fire.CSEMeleeDefensiveFire;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.fire.CSEMeleeEnvironmentalFire;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.fire.CSEMeleeOffensiveFire;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.fire.CSEProjectileDefaultFire;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.fire.CSEProjectileDefensiveFire;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.fire.CSEProjectileEnvironmentalFire;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.fire.CSEProjectileOffensiveFire;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.fire.CSESelfDefaultFire;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.fire.CSESelfDefensiveFire;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.fire.CSESelfEnvironmentalFire;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.fire.CSESelfOffensiveFire;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.fire.CSEToolDefaultFire;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.fire.CSEToolDefensiveFire;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.fire.CSEToolEnvironmentalFire;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.fire.CSEToolOffensiveFire;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.ice.CSEMeleeDefaultIce;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.ice.CSEMeleeDefensiveIce;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.ice.CSEMeleeEnvironmentalIce;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.ice.CSEMeleeOffensiveIce;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.ice.CSEProjectileDefaultIce;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.ice.CSEProjectileDefensiveIce;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.ice.CSEProjectileEnvironmentalIce;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.ice.CSEProjectileOffensiveIce;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.ice.CSESelfDefaultIce;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.ice.CSESelfDefensiveIce;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.ice.CSESelfEnvironmentalIce;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.ice.CSESelfOffensiveIce;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.ice.CSEToolDefaultIce;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.ice.CSEToolDefensiveIce;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.ice.CSEToolEnvironmentalIce;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.ice.CSEToolOffensiveIce;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.wind.CSEMeleeDefaultWind;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.wind.CSEMeleeDefensiveWind;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.wind.CSEMeleeEnvironmentalWind;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.wind.CSEMeleeOffensiveWind;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.wind.CSEProjectileDefaultWind;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.wind.CSEProjectileDefensiveWind;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.wind.CSEProjectileEnvironmentalWind;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.wind.CSEProjectileOffensiveWind;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.wind.CSESelfDefaultWind;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.wind.CSESelfDefensiveWind;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.wind.CSESelfEnvironmentalWind;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.wind.CSESelfOffensiveWind;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.wind.CSEToolDefaultWind;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.wind.CSEToolDefensiveWind;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.wind.CSEToolEnvironmentalWind;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.cse.wind.CSEToolOffensiveWind;
import WayofTime.alchemicalWizardry.common.spell.simple.HomSpellRegistry;
import WayofTime.alchemicalWizardry.common.spell.simple.SpellEarthBender;
import WayofTime.alchemicalWizardry.common.spell.simple.SpellExplosions;
import WayofTime.alchemicalWizardry.common.spell.simple.SpellFireBurst;
import WayofTime.alchemicalWizardry.common.spell.simple.SpellFrozenWater;
import WayofTime.alchemicalWizardry.common.spell.simple.SpellHolyBlast;
import WayofTime.alchemicalWizardry.common.spell.simple.SpellLightningBolt;
import WayofTime.alchemicalWizardry.common.spell.simple.SpellTeleport;
import WayofTime.alchemicalWizardry.common.spell.simple.SpellWateryGrave;
import WayofTime.alchemicalWizardry.common.spell.simple.SpellWindGust;
import WayofTime.alchemicalWizardry.common.summoning.SummoningHelperAW;
import WayofTime.alchemicalWizardry.common.summoning.meteor.Meteor;
import WayofTime.alchemicalWizardry.common.tileEntity.*;
import WayofTime.alchemicalWizardry.common.tileEntity.TEAlchemicCalcinator;
import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar;
import WayofTime.alchemicalWizardry.common.tileEntity.TEBellJar;
import WayofTime.alchemicalWizardry.common.tileEntity.TEConduit;
import WayofTime.alchemicalWizardry.common.tileEntity.TECrucible;
import WayofTime.alchemicalWizardry.common.tileEntity.TEHomHeart;
import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone;
import WayofTime.alchemicalWizardry.common.tileEntity.TEMimicBlock;
import WayofTime.alchemicalWizardry.common.tileEntity.TEOrientable;
import WayofTime.alchemicalWizardry.common.tileEntity.TEPedestal;
import WayofTime.alchemicalWizardry.common.tileEntity.TEPlinth;
import WayofTime.alchemicalWizardry.common.tileEntity.TEReagentConduit;
import WayofTime.alchemicalWizardry.common.tileEntity.TESchematicSaver;
import WayofTime.alchemicalWizardry.common.tileEntity.TESocket;
import WayofTime.alchemicalWizardry.common.tileEntity.TESpectralBlock;
import WayofTime.alchemicalWizardry.common.tileEntity.TESpectralContainer;
import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock;
import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEnhancementBlock;
import WayofTime.alchemicalWizardry.common.tileEntity.TESpellModifierBlock;
import WayofTime.alchemicalWizardry.common.tileEntity.TESpellParadigmBlock;
import WayofTime.alchemicalWizardry.common.tileEntity.TETeleposer;
import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable;
import WayofTime.alchemicalWizardry.common.tileEntity.gui.GuiHandler;
import WayofTime.alchemicalWizardry.common.tweaker.MineTweakerIntegration;
import cpw.mods.fml.common.*;
import WayofTime.alchemicalWizardry.compat.BloodMagicWailaPlugin;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.event.*;
import cpw.mods.fml.common.ModContainer;
import cpw.mods.fml.common.Optional;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLInterModComms;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.event.FMLServerStartingEvent;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
@@ -527,6 +719,7 @@ public class AlchemicalWizardry {
proxy.registerEntities();
proxy.registerEntityTrackers();
proxy.registerEvents();
BloodMagicWailaPlugin.init();
// ItemStacks used for crafting go here
ItemStack lapisStack = new ItemStack(Items.dye, 1, 4);
@@ -6,11 +6,8 @@ import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import pneumaticCraft.api.PneumaticRegistry;
import WayofTime.alchemicalWizardry.AlchemicalWizardry;
import WayofTime.alchemicalWizardry.common.book.BloodMagicGuide;
import amerifrance.guideapi.api.GuideRegistry;
import cpw.mods.fml.common.Optional;
public class MailOrderEntityItem extends EntityItem {
@@ -48,32 +45,18 @@ public class MailOrderEntityItem extends EntityItem {
if (!worldObj.isRemote && this.ticksExisted > 100 && !this.isDead) {
worldObj.addWeatherEffect(new EntityLightningBolt(worldObj, this.posX, this.posY, this.posZ));
if (AlchemicalWizardry.isPneumaticCraftLoaded) {
this.deliverItemViaDrone(this.posX, this.posY, this.posZ);
} else {
EntityItem entity = new BookEntityItem(
worldObj,
this.posX,
this.posY,
this.posZ,
GuideRegistry.getItemStackForBook(BloodMagicGuide.bloodMagicGuide));
entity.lifespan = 6000;
entity.delayBeforeCanPickup = 20;
entity.motionY = 1;
worldObj.spawnEntityInWorld(entity);
}
EntityItem entity = new BookEntityItem(
worldObj,
this.posX,
this.posY,
this.posZ,
GuideRegistry.getItemStackForBook(BloodMagicGuide.bloodMagicGuide));
entity.lifespan = 6000;
entity.delayBeforeCanPickup = 20;
entity.motionY = 1;
worldObj.spawnEntityInWorld(entity);
this.setDead();
}
}
@Optional.Method(modid = "PneumaticCraft")
public void deliverItemViaDrone(double x, double y, double z) {
PneumaticRegistry.getInstance().deliverItemsAmazonStyle(
worldObj,
(int) x,
(int) y,
(int) z,
GuideRegistry.getItemStackForBook(BloodMagicGuide.bloodMagicGuide));
}
}
@@ -1,9 +1,14 @@
package WayofTime.alchemicalWizardry.common.tileEntity;
import java.text.NumberFormat;
import java.util.List;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
@@ -14,6 +19,7 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidContainerRegistry;
@@ -34,8 +40,10 @@ import WayofTime.alchemicalWizardry.common.NewPacketHandler;
import WayofTime.alchemicalWizardry.common.bloodAltarUpgrade.AltarUpgradeComponent;
import WayofTime.alchemicalWizardry.common.bloodAltarUpgrade.UpgradedAltars;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper;
import WayofTime.alchemicalWizardry.compat.BloodMagicWailaPlugin;
import WayofTime.alchemicalWizardry.compat.IBloodMagicWailaProvider;
public class TEAltar extends TEInventory implements IFluidTank, IFluidHandler, IBloodAltar {
public class TEAltar extends TEInventory implements IFluidTank, IFluidHandler, IBloodAltar, IBloodMagicWailaProvider {
public static final int sizeInv = 1;
@@ -941,4 +949,61 @@ public class TEAltar extends TEInventory implements IFluidTank, IFluidHandler, I
this.cooldownAfterCrafting = amount;
}
}
@Override
public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
IWailaConfigHandler config) {
if (!accessor.getNBTData().hasKey("altar") || !config.getConfig(BloodMagicWailaPlugin.WAILA_CONFIG_ALTAR))
return;
final NBTTagCompound altarData = accessor.getNBTData().getCompoundTag("altar");
final NumberFormat numberFormat = NumberFormat.getIntegerInstance();
if (altarData.hasKey("stored")) {
currenttip.add(
StatCollector.translateToLocal("tooltip.waila.currentFluid")
+ numberFormat.format(altarData.getInteger("stored")));
} else {
currenttip.add(StatCollector.translateToLocal("tooltip.waila.noFluid"));
}
currenttip.add(
StatCollector.translateToLocal("tooltip.waila.altarCapacity")
+ numberFormat.format(altarData.getInteger("capacity")));
currenttip.add(StatCollector.translateToLocal("tooltip.waila.tier") + altarData.getInteger("tier"));
if (altarData.hasKey("progress")) {
currenttip.add(
StatCollector.translateToLocal("tooltip.waila.altarProgress") + altarData.getInteger("progress")
+ "%");
currenttip.add(StatCollector.translateToLocal("tooltip.waila.crafting") + altarData.getString("crafting"));
}
}
@Override
public void getWailaNBTData(final EntityPlayerMP player, final TileEntity tile, final NBTTagCompound tag,
final World world, int x, int y, int z) {
NBTTagCompound altarData = new NBTTagCompound();
altarData.setInteger("tier", this.getTier());
altarData.setInteger("capacity", this.getCapacity());
final int blood = this.getCurrentBlood();
if (blood > 0) altarData.setInteger("stored", blood);
if (this.getStackInSlot(0) != null && progress > 0) {
altarData.setInteger(
"progress",
(int) (((double) this.getProgress() / (double) this.liquidRequired * 100)
/ this.getStackInSlot(0).stackSize));
ItemStack result = AltarRecipeRegistry.getItemForItemAndTier(this.getStackInSlot(0), this.upgradeLevel);
if (result != null) {
altarData.setString("crafting", result.getDisplayName());
}
}
tag.setTag("altar", altarData);
}
}
@@ -1,10 +1,15 @@
package WayofTime.alchemicalWizardry.common.tileEntity;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
@@ -14,6 +19,7 @@ import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.Constants;
@@ -32,9 +38,11 @@ import WayofTime.alchemicalWizardry.api.rituals.RitualBreakMethod;
import WayofTime.alchemicalWizardry.api.rituals.Rituals;
import WayofTime.alchemicalWizardry.api.soulNetwork.SoulNetworkHandler;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper;
import WayofTime.alchemicalWizardry.compat.BloodMagicWailaPlugin;
import WayofTime.alchemicalWizardry.compat.IBloodMagicWailaProvider;
import cpw.mods.fml.common.eventhandler.Event;
public class TEMasterStone extends TileEntity implements IMasterRitualStone {
public class TEMasterStone extends TileEntity implements IMasterRitualStone, IBloodMagicWailaProvider {
private String currentRitualString;
private boolean isActive;
@@ -638,4 +646,35 @@ public class TEMasterStone extends TileEntity implements IMasterRitualStone {
public void setLocalStorage(LocalRitualStorage storage) {
this.storage = storage;
}
@Override
public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
IWailaConfigHandler config) {
if (!config.getConfig(BloodMagicWailaPlugin.WAILA_CONFIG_RITUAL)) return;
final NBTTagCompound tag = accessor.getNBTData();
if (tag.hasKey("owner")) {
currenttip.add(StatCollector.translateToLocal("tooltip.waila.owner") + tag.getString("owner"));
}
currenttip.add(
StatCollector.translateToLocal("tooltip.waila." + (tag.getBoolean("active") ? "active" : "notActive")));
if (tag.hasKey("currentRitual")) {
currenttip
.add(StatCollector.translateToLocal("tooltip.waila.ritualString") + tag.getString("currentRitual"));
}
}
@Override
public void getWailaNBTData(final EntityPlayerMP player, final TileEntity tile, final NBTTagCompound tag,
final World world, int x, int y, int z) {
if (!getOwner().isEmpty()) {
tag.setString("owner", getOwner());
}
if (!getCurrentRitual().isEmpty()) {
tag.setString("currentRitual", Rituals.getNameOfRitual(getCurrentRitual()));
}
tag.setBoolean("active", isActive);
}
}
@@ -3,11 +3,16 @@ package WayofTime.alchemicalWizardry.common.tileEntity;
import java.util.Iterator;
import java.util.List;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.Packet;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
@@ -17,8 +22,10 @@ import WayofTime.alchemicalWizardry.common.block.BlockTeleposer;
import WayofTime.alchemicalWizardry.common.items.EnergyItems;
import WayofTime.alchemicalWizardry.common.items.TelepositionFocus;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper;
import WayofTime.alchemicalWizardry.compat.BloodMagicWailaPlugin;
import WayofTime.alchemicalWizardry.compat.IBloodMagicWailaProvider;
public class TETeleposer extends TEInventory {
public class TETeleposer extends TEInventory implements IBloodMagicWailaProvider {
public static final int sizeInv = 1;
@@ -277,4 +284,18 @@ public class TETeleposer extends TEInventory {
public boolean isItemValidForSlot(int slot, ItemStack itemstack) {
return itemstack.getItem() instanceof TelepositionFocus;
}
@Override
public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
IWailaConfigHandler config) {
if (!config.getConfig(BloodMagicWailaPlugin.WAILA_CONFIG_TELEPOSER)) return;
final ItemStack contained = getStackInSlot(0);
if (contained != null) {
currenttip.add(contained.getDisplayName());
}
}
@Override
public void getWailaNBTData(final EntityPlayerMP player, final TileEntity tile, final NBTTagCompound tag,
final World world, int x, int y, int z) {}
}
@@ -1,10 +1,19 @@
package WayofTime.alchemicalWizardry.common.tileEntity;
import java.util.List;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.oredict.OreDictionary;
@@ -22,8 +31,10 @@ import WayofTime.alchemicalWizardry.common.alchemy.CombinedPotionRegistry;
import WayofTime.alchemicalWizardry.common.alchemy.ICombinationalCatalyst;
import WayofTime.alchemicalWizardry.common.items.potion.AlchemyFlask;
import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper;
import WayofTime.alchemicalWizardry.compat.BloodMagicWailaPlugin;
import WayofTime.alchemicalWizardry.compat.IBloodMagicWailaProvider;
public class TEWritingTable extends TEInventory implements ISidedInventory {
public class TEWritingTable extends TEInventory implements ISidedInventory, IBloodMagicWailaProvider {
public static final int sizeInv = 7;
@@ -715,4 +726,30 @@ public class TEWritingTable extends TEInventory implements ISidedInventory {
public boolean canExtractItem(int slot, ItemStack stack, int side) {
return slot == 6;
}
@Override
public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
IWailaConfigHandler config) {
if (!config.getConfig(BloodMagicWailaPlugin.WAILA_CHEMISTRY_SET)) return;
final NBTTagCompound tag = accessor.getNBTData();
final int curProgress = tag.getInteger("progress");
if (curProgress > 0) {
currenttip.add(StatCollector.translateToLocal("tooltip.waila.altarProgress") + curProgress + "%");
}
if (tag.hasKey("crafting")) {
currenttip.add(StatCollector.translateToLocal("tooltip.waila.crafting") + tag.getString("crafting"));
}
}
@Override
public void getWailaNBTData(final EntityPlayerMP player, final TileEntity tile, final NBTTagCompound tag,
final World world, int x, int y, int z) {
tag.setInteger("progress", progress);
final ItemStack result = getResultingItemStack();
if (result != null) {
tag.setString("crafting", result.getDisplayName());
}
}
}
@@ -0,0 +1,42 @@
package WayofTime.alchemicalWizardry.compat;
import mcp.mobius.waila.api.IWailaDataProvider;
import mcp.mobius.waila.api.IWailaRegistrar;
import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar;
import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone;
import WayofTime.alchemicalWizardry.common.tileEntity.TETeleposer;
import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable;
import cpw.mods.fml.common.event.FMLInterModComms;
public class BloodMagicWailaPlugin {
public static final String WAILA_CONFIG_ALTAR = "bm.bloodAltar";
public static final String WAILA_CONFIG_TELEPOSER = "bm.teleposer";
public static final String WAILA_CONFIG_RITUAL = "bm.ritualController";
public static final String WAILA_CHEMISTRY_SET = "bm.chemistrySet";
public static void callbackRegister(IWailaRegistrar register) {
final IWailaDataProvider wailaProvider = new BloodMagicWailaProvider();
register.registerBodyProvider(wailaProvider, TEAltar.class);
register.registerNBTProvider(wailaProvider, TEAltar.class);
register.addConfig("Blood Magic", WAILA_CONFIG_ALTAR, true);
register.registerBodyProvider(wailaProvider, TETeleposer.class);
register.addConfig("Blood Magic", WAILA_CONFIG_TELEPOSER, true);
register.registerBodyProvider(wailaProvider, TEMasterStone.class);
register.registerNBTProvider(wailaProvider, TEMasterStone.class);
register.addConfig("Blood Magic", WAILA_CONFIG_RITUAL, true);
register.registerBodyProvider(wailaProvider, TEWritingTable.class);
register.registerNBTProvider(wailaProvider, TEWritingTable.class);
register.registerTailProvider(wailaProvider, TEWritingTable.class);
register.addConfig("Blood Magic", WAILA_CHEMISTRY_SET, true);
}
public static void init() {
FMLInterModComms.sendMessage("Waila", "register", BloodMagicWailaPlugin.class.getName() + ".callbackRegister");
}
}
@@ -0,0 +1,54 @@
package WayofTime.alchemicalWizardry.compat;
import java.util.List;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
import mcp.mobius.waila.api.IWailaDataProvider;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
public class BloodMagicWailaProvider implements IWailaDataProvider {
@Override
public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) {
return null;
}
@Override
public List<String> getWailaHead(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
IWailaConfigHandler config) {
return currenttip;
}
@Override
public List<String> getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
IWailaConfigHandler config) {
final TileEntity tile = accessor.getTileEntity();
if (tile instanceof IBloodMagicWailaProvider) {
((IBloodMagicWailaProvider) tile).getWailaBody(itemStack, currenttip, accessor, config);
}
return currenttip;
}
@Override
public List<String> getWailaTail(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
IWailaConfigHandler config) {
return currenttip;
}
@Override
public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x,
int y, int z) {
if (tile instanceof IBloodMagicWailaProvider) {
((IBloodMagicWailaProvider) tile).getWailaNBTData(player, tile, tag, world, x, y, z);
}
return tag;
}
}
@@ -0,0 +1,21 @@
package WayofTime.alchemicalWizardry.compat;
import java.util.List;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
public interface IBloodMagicWailaProvider {
default void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
IWailaConfigHandler config) {}
default void getWailaNBTData(final EntityPlayerMP player, final TileEntity tile, final NBTTagCompound tag,
final World world, int x, int y, int z) {}
}
@@ -607,3 +607,21 @@ bm.versioning.error=An error has occurred while downloading the mod!
bm.versioning.downloadedAlready=You have the latest version already, reload your game to update!
bm.versioning.downloadingAlready=It's downloading! Be patient!
bm.versioning.disabled=This feature is disabled.
# Waila localizations
tooltip.waila.currentFluid=Life Essence:
tooltip.waila.noFluid=There is no Life Essence in the altar
tooltip.waila.tier=Altar Tier:
tooltip.waila.altarProgress=Altar Progress:
tooltip.waila.crafting=Crafting:
tooltip.waila.altarCapacity=Altar Capacity:
tooltip.waila.chemistrySetProgress=Item Progress:
tooltip.waila.owner=Owner:
tooltip.waila.ritualString=Current Ritual:
tooltip.waila.active=Ritual Active
tooltip.waila.notActive=Ritual Not Active
option.bm.bloodAltar=Blood Altar
option.bm.ritualController=Ritual Stones
option.bm.teleposer=Teleposer
option.bm.chemistrySet=Alchemical Chemistry Set