Compare commits

..

9 Commits

Author SHA1 Message Date
shartte 27b8c5f3ac Plane Connection Refactor (#4556) (#4565)
* Refactors all plane parts to use a common helper for
calculating connections to adjacent planes.
Also fixes problems with updating these connections on neighbor updates.

* Fix conflicting GuiSync ID.

* Slightly refactor PlaneConnectionHelper, and fix an issue where the bounding box was calculated incorrectly by using the wrong up-direction.

(cherry picked from commit 8617dc8340)
2020-08-05 22:39:04 +02:00
shartte 3043887915 Makes formation planes a bit more consistent and less violent. (#4553) (#4564)
* Makes formation planes a bit more consistent and less violent.

Items will now have a slower speed when spawning as well as a narrower area to avoid having them glitch into a wall and be teleported around

* Removed debug output, added clarifying parenthesis and extracted method.

* Fixes various other issues with the formation plane

Also removed now useless code

(cherry picked from commit 12e3fa9127)
2020-08-05 22:25:48 +02:00
yueh e0abe9b9a9 Fixes #4559: Use visual bounding box for overlay (#4562) 2020-08-05 22:08:48 +02:00
shartte e19991f1f9 Fixes #4547: Name clash between ITooltip#getWidth, ITooltip#getHeight and Vanilla Widget methods leads to missing methods at runtime, since the implementing methods will be remapped to SRG names, while referees of the interface will try to call the renamed methods by their name in the interface, leading to an AbstractMethodError. (#4558) 2020-08-05 18:21:13 +02:00
shartte 3d97b1e3ec Fixes #4551: Bounding box of annihilation planes is too small. (#4552) 2020-08-05 17:45:53 +02:00
yueh 6b1bccffb9 Apply the FE tunnel behaviour to the fluid tunnel (#4550) (#4555) 2020-08-04 23:37:15 +02:00
yueh 6fab7b91b7 Fixes 4529: Updated IPart to match new ICapabilityProvider (#4534) (#4536) 2020-08-01 21:57:26 +02:00
shartte 7b6bab4967 Fix #4521: Register RecipeTypes. (#4523) (#4525) 2020-07-31 20:34:44 +02:00
yueh 04766e5325 Limit gradle to 1 worker for 1.15 (#4526) 2020-07-31 18:51:41 +02:00
1427 changed files with 29125 additions and 28276 deletions
+11 -7
View File
@@ -21,11 +21,15 @@ jobs:
with:
path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
- name: Generate Resources
run: ./gradlew generateData
- name: Build
run: ./gradlew build
- uses: actions/upload-artifact@v2
- name: Clean gradle
run: ./gradlew clean --no-daemon --max-workers 1
- name: Validate no assets
run: test ! -d ./src/generated
- name: Generate assets
uses: GabrielBB/xvfb-action@v1.2
with:
name: dist
path: build/libs/
run: ./gradlew runData --no-daemon --max-workers 1
- name: Validate assets
run: test -d ./src/generated -a -f ./src/generated/resources/.cache/cache
- name: Build with Gradle
run: ./gradlew build --no-daemon --max-workers 1
+3 -1
View File
@@ -26,7 +26,9 @@ jobs:
- name: Validate no assets
run: test ! -d ./src/generated
- name: Generate assets
run: ./gradlew runData --no-daemon --max-workers 1
uses: GabrielBB/xvfb-action@v1.2
with:
run: ./gradlew runData --no-daemon --max-workers 1
- name: Validate assets
run: test -d ./src/generated -a -f ./src/generated/resources/.cache/cache
- name: Build with Gradle
+4 -3
View File
@@ -2,8 +2,7 @@ name: 'Build PRs'
on:
pull_request:
branches:
- '*'
branches: [ master ]
jobs:
build:
@@ -27,7 +26,9 @@ jobs:
- name: Validate no assets
run: test ! -d ./src/generated
- name: Generate assets
run: ./gradlew runData --no-daemon --max-workers 1
uses: GabrielBB/xvfb-action@v1.2
with:
run: ./gradlew runData --no-daemon --max-workers 1
- name: Validate assets
run: test -d ./src/generated -a -f ./src/generated/resources/.cache/cache
- name: Build with Gradle
+44 -28
View File
@@ -1,19 +1,26 @@
name: 'Release'
on:
create:
tags:
- fabric/v*
release:
types: [published]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Export current tag as environment variable
- name: Validate semver
env:
TAG: ${{ github.event.ref }}
run: echo "::set-env name=TAG::${TAG}"
TAG: ${{ github.event.release.tag_name }}
run: |
echo $TAG | grep -oP '^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$'
echo "::set-env name=RELEASE::${TAG:1}"
- name: Export keystore
env:
KEY_STORE: ${{ secrets.KEY_STORE }}
run: |
echo $KEY_STORE | base64 -d > $HOME/keystore.jks
echo "::set-env name=KEY_STORE_FILE::$HOME/keystore.jks"
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
@@ -23,36 +30,45 @@ jobs:
run: chmod +x gradlew
- name: Validate no assets
run: test ! -d ./src/generated
- name: Generate resources
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: ./gradlew generateData
- name: Generate assets
uses: GabrielBB/xvfb-action@v1.2
with:
run: ./gradlew runData --no-daemon --max-workers 1
- name: Validate assets
run: test -d ./src/generated -a -f ./src/generated/resources/.cache/cache
- name: Build with Gradle
env:
KEY_STORE_PASS: ${{ secrets.KEY_STORE_PASS }}
KEY_STORE_ALIAS: ${{ secrets.KEY_STORE_ALIAS }}
KEY_STORE_KEY_PASS: ${{ secrets.KEY_STORE_KEY_PASS }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: ./gradlew build
- name: Upload artifacts
uses: actions/upload-artifact@v2
with:
name: dist
path: build/libs/
run: ./gradlew build --no-daemon --max-workers 1
- name: Upload to curseforge
env:
KEY_STORE_PASS: ${{ secrets.KEY_STORE_PASS }}
KEY_STORE_ALIAS: ${{ secrets.KEY_STORE_ALIAS }}
KEY_STORE_KEY_PASS: ${{ secrets.KEY_STORE_KEY_PASS }}
CHANGELOG: ${{ github.event.release.body }}
CURSEFORGE: ${{ secrets.CURSEFORGE }}
run: ./gradlew curseforge --no-daemon --max-workers 1
- name: Publish to github packages
env:
KEY_STORE_PASS: ${{ secrets.KEY_STORE_PASS }}
KEY_STORE_ALIAS: ${{ secrets.KEY_STORE_ALIAS }}
KEY_STORE_KEY_PASS: ${{ secrets.KEY_STORE_KEY_PASS }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: ./gradlew publishMavenPublicationToGitHubPackagesRepository --no-daemon --max-workers 1
- name: Publish to modmaven
env:
KEY_STORE_PASS: ${{ secrets.KEY_STORE_PASS }}
KEY_STORE_ALIAS: ${{ secrets.KEY_STORE_ALIAS }}
KEY_STORE_KEY_PASS: ${{ secrets.KEY_STORE_KEY_PASS }}
MODMAVEN_USER: ${{ secrets.MODMAVEN_USER }}
MODMAVEN_PASSWORD: ${{ secrets.MODMAVEN_PASSWORD }}
run: ./gradlew publishMavenPublicationToModmavenRepository --no-daemon --max-workers 1
- name: Upload to curseforge
run: ./gradlew publish --no-daemon --max-workers 1
- name: Prepare artifact metadata
id: prepare_artifact_metadata
run: |
echo ::set-output name=ARTIFACT_PATH::./build/libs/appliedenergistics2-${RELEASE}.jar
echo ::set-output name=ARTIFACT_NAME::appliedenergistics2-${RELEASE}.jar
- name: Upload Release Artifact
uses: actions/upload-release-asset@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CURSEFORGE: ${{ secrets.CURSEFORGE }}
run: ./gradlew curseforge
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: ${{ steps.prepare_artifact_metadata.outputs.ARTIFACT_PATH }}
asset_name: ${{ steps.prepare_artifact_metadata.outputs.ARTIFACT_NAME }}
asset_content_type: application/zip
+4 -26
View File
@@ -72,41 +72,19 @@ The API for Applied Energistics 2. It is open source to discuss changes, improve
### Maven
Our authoritative Maven repository is Github Packages, which you can also use in your builds. Use of Github Packages
[requires special setup](https://docs.github.com/en/packages/using-github-packages-with-your-projects-ecosystem/configuring-gradle-for-use-with-github-packages#authenticating-to-github-packages)
to authenticate with your personal access token.
AE2 is also available without authentication from Modmaven.
You can use the following snippet as example on how to add a repository to your gradle build file.
We use Github Packages as maven repository now. You can use the following snippet as example on how to add a repository to your gradle build file.
repositories {
maven {
name "Modmaven"
url "https://modmaven.k-4u.nl/"
// For Gradle 5.1 and above, limit it to just AE2
content {
includeGroup 'appeng'
}
}
// Required for libblockattributes
maven {
name = "BuildCraft"
url = "https://mod-buildcraft.com/maven"
content {
includeGroup "alexiil.mc.lib"
}
name "AE2"
url "https://maven.pkg.github.com/AppliedEnergistics/Applied-Energistics-2"
}
}
When compiling against the AE2 API you can use gradle dependencies, just add
dependencies {
modCompileOnly "appeng:appliedenergistics2-fabric:VERSION:api"
// Include only if you want AE2 at runtime
modRuntimeOnly "appeng:appliedenergistics2-fabric:VERSION"
compileOnly "appeng:appliedenergistics2:VERSION:api"
}
or add the `compileOnly` line to your existing dependencies task to your build.gradle.
+106 -284
View File
@@ -16,82 +16,37 @@
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
plugins {
id 'java'
id 'fabric-loom'
id 'maven-publish'
id "com.diffplug.gradle.spotless" version "4.3.0"
id "com.matthewprenger.cursegradle" version "1.4.0"
id "org.sonarqube" version "2.8"
id "jacoco"
buildscript {
repositories {
maven { url = 'https://files.minecraftforge.net/maven' }
jcenter()
mavenCentral()
}
dependencies {
classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true
}
}
plugins {
id "maven-publish"
id "com.diffplug.gradle.spotless" version "4.3.0"
id "com.matthewprenger.cursegradle" version "1.4.0"
id "org.sonarqube" version "2.8"
id "jacoco"
}
apply plugin: 'net.minecraftforge.gradle'
apply plugin: "eclipse"
repositories {
mavenLocal()
jcenter()
mavenCentral()
maven { url = "https://maven.fabricmc.net/" }
maven {
name = "BuildCraft"
url = "https://mod-buildcraft.com/maven"
content {
includeGroup "alexiil.mc.lib"
}
}
maven {
name = "HYWLA"
url = "https://maven.tehnut.info/"
content {
includeGroup "mcp.mobius.waila"
}
}
}
dependencies {
minecraft "com.mojang:minecraft:${project.minecraft_version}"
mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
//Fabric api
modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_version}"
modImplementation "alexiil.mc.lib:libblockattributes-core:${libblockattributes_version}"
modImplementation "alexiil.mc.lib:libblockattributes-items:${libblockattributes_version}"
modImplementation "alexiil.mc.lib:libblockattributes-fluids:${libblockattributes_version}"
include "alexiil.mc.lib:libblockattributes-core:${libblockattributes_version}"
include "alexiil.mc.lib:libblockattributes-items:${libblockattributes_version}"
include "alexiil.mc.lib:libblockattributes-fluids:${libblockattributes_version}"
// Energy API
modApi "teamreborn:energy:${tr_energy_version}"
include "teamreborn:energy:${tr_energy_version}"
modCompileOnly("me.shedaniel:RoughlyEnoughItems:${rei_version}") {
exclude group: "net.fabricmc.fabric-api"
}
modCompileOnly("mcp.mobius.waila:Hwyla:1.16.1-1.9.22-75") {
exclude group: "net.fabricmc.fabric-api"
}
modRuntime("me.shedaniel:RoughlyEnoughItems:${rei_version}") {
exclude group: "net.fabricmc.fabric-api"
}
modRuntime("TechReborn:TechReborn-1.16:3.5.1+build.101") {
exclude group: "net.fabricmc.fabric-api"
}
// modRuntimeOnly "mcp.mobius.waila:Hwyla:1.16.1-1.9.22-75"
implementation 'com.google.code.findbugs:jsr305:3.0.2'
// unit test dependencies
testCompile "junit:junit:4.13"
}
group = artifact_group
archivesBaseName = artifact_basename
sourceCompatibility = targetCompatibility = JavaVersion.VERSION_1_8
compileJava {
sourceCompatibility = targetCompatibility = JavaVersion.VERSION_1_8
options.deprecation = false
}
// ensure everything uses UTF-8 and not some random codepage chosen by gradle
@@ -100,8 +55,8 @@ tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
///////////////////
// Version Number
// Create version number
version = version_major + "." + version_minor + "." + version_patch
ext.pr = System.getenv('PR_NUMBER') ?: ""
if (ext.pr) {
@@ -113,19 +68,15 @@ if (ext.branch) {
version = version + "+branch." + ext.branch
}
ext.tag = System.getenv('TAG') ?: ""
if (ext.tag && ext.tag.startsWith("fabric/v")) {
version = ext.tag.substring("fabric/v".length())
// Validate that the rest is a semver version
if (version ==~ /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/) {
println("::set-env name=VERSION::${version}")
} else {
throw new GradleException("Invalid semver: $version")
}
ext.release = System.getenv('RELEASE') ?: ""
if (ext.release) {
version = ext.release
}
ext.isAlpha = project.version.contains("alpha")
ext.isBeta = project.version.contains("beta")
// Maven group and artifact name
group = artifact_group
archivesBaseName = artifact_basename
sourceSets {
api
@@ -136,139 +87,98 @@ sourceSets {
srcDir 'src/generated/resources'
}
}
datagen {
compileClasspath += sourceSets.api.output
runtimeClasspath += sourceSets.api.output
compileClasspath += sourceSets.main.output
runtimeClasspath += sourceSets.main.output
}
test {
compileClasspath += sourceSets.api.output
runtimeClasspath += sourceSets.api.output
}
siteexport {
compileClasspath += sourceSets.api.output
runtimeClasspath += sourceSets.api.output
compileClasspath += sourceSets.main.output
runtimeClasspath += sourceSets.main.output
java {
exclude '**/*'
}
}
}
configurations {
apiCompile.extendsFrom(compileClasspath)
datagenCompile.extendsFrom(compileClasspath)
siteexportCompile.extendsFrom(compileClasspath)
siteexportRuntime.extendsFrom(runtimeClasspath)
apiCompile.extendsFrom(compile)
}
////////////////////
// Forge/Minecraft
apply from: 'gradle/scripts/dependencies.gradle'
apply from: 'gradle/scripts/spotless.gradle'
minecraft {
accessWidener "src/main/resources/appliedenergistics2.accesswidener"
}
mappings channel: "snapshot", version: project.mcp_mappings
processResources {
inputs.property "version", project.version
accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')
from(sourceSets.main.resources.srcDirs) {
include "fabric.mod.json"
expand "version": project.version
}
from(sourceSets.main.resources.srcDirs) {
exclude "fabric.mod.json"
}
}
//////////////
// Aritfacts
processResources {
exclude '.cache'
}
jar {
finalizedBy 'remapJar'
from sourceSets.main.output.classesDirs
from sourceSets.api.output.classesDirs
from sourceSets.main.output.resourcesDir
from sourceSets.api.output.resourcesDir
manifest {
attributes([
"Specification-Title": "Applied Energistics 2",
"Specification-Vendor": "TeamAppliedEnergistics",
"Specification-Version": "${project.version}",
"Implementation-Title": "${project.name}",
"Implementation-Version": "${project.version}",
"Implementation-Vendor" :"TeamAppliedEnergistics",
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
"MixinConfigs": "appliedenergistics2.mixins.json"
])
}
}
task javadocs(type: Javadoc) {
classpath = sourceSets.main.compileClasspath
source = sourceSets.api.java
include "appeng/api/**"
options.addStringOption('Xdoclint:none', '-quiet')
options.encoding = 'UTF-8'
options.charSet = 'UTF-8'
}
task javadocJar(type: Jar, dependsOn: javadocs) {
classifier = "javadoc"
from javadoc.destinationDir
}
// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
// if it is present.
// If you remove this task, sources will not be generated.
task sourcesJar(type: Jar, dependsOn: classes) {
classifier = "sources"
from sourceSets.main.allSource
from sourceSets.api.allSource
}
task apiJar(type: Jar) {
classifier = "api"
from sourceSets.api.output
include "appeng/api/**"
// TODO: when FG bug is fixed, remove allJava from the api jar.
// https://github.com/MinecraftForge/ForgeGradle/issues/369
// Gradle should be able to pull them from the -sources jar.
from sourceSets.api.allJava
}
artifacts {
archives javadocJar
archives sourcesJar
archives apiJar
}
//////////////////
// Maven publish
publishing {
if (!version.endsWith("-SNAPSHOT")) {
publications {
maven(MavenPublication) {
groupId = project.group
artifactId = 'appliedenergistics2-fabric'
version = project.version
// add all the jars that should be included when publishing to maven
artifact(remapJar) {
builtBy remapJar
runs {
client {
property 'forge.logging.console.level', 'debug'
workingDirectory project.file('run')
mods {
appliedenergistics2 {
source sourceSets.main
source sourceSets.api
}
artifact(sourcesJar) {
builtBy remapSourcesJar
}
artifact javadocJar
artifact apiJar
}
}
server {
property 'forge.logging.console.level', 'debug'
workingDirectory project.file('run')
mods {
appliedenergistics2 {
source sourceSets.main
source sourceSets.api
}
}
}
data {
property 'forge.logging.console.level', 'debug'
workingDirectory project.file('run')
args '--mod', 'appliedenergistics2', '--all', '--output', file('src/generated/resources/')
mods {
appliedenergistics2 {
source sourceSets.main
source sourceSets.api
}
}
}
}
}
def signProps = [:]
if (System.getenv("KEY_STORE_FILE")) {
signProps['keyStore'] = System.getenv("KEY_STORE_FILE")
signProps['storePass'] = System.getenv("KEY_STORE_PASS")
signProps['alias'] = System.getenv("KEY_STORE_ALIAS")
signProps['keyPass'] = System.getenv("KEY_STORE_KEY_PASS")
}
task signJar(type: net.minecraftforge.gradle.common.task.SignJar, dependsOn: 'reobfJar') {
onlyIf { !signProps.isEmpty() }
if (!signProps.isEmpty()) {
keyStore = signProps.keyStore
alias = signProps.alias
storePass = signProps.storePass
keyPass = signProps.keyPass
inputFile = jar.archivePath
outputFile = jar.archivePath
}
}
apply from: 'gradle/scripts/artifacts.gradle'
apply from: 'gradle/scripts/curseforge.gradle'
publishing {
publications {
maven(MavenPublication) {
groupId = project.group
artifactId = project.archivesBaseName
version = project.version
from components.java
artifact sourcesJar
artifact javadocJar
artifact apiJar
}
}
repositories {
maven {
@@ -279,93 +189,5 @@ publishing {
name = "GitHubPackages"
url = "https://maven.pkg.github.com/AppliedEnergistics/Applied-Energistics-2"
}
maven {
credentials {
username System.getenv("MODMAVEN_USER")
password System.getenv("MODMAVEN_PASSWORD")
}
name = "modmaven"
url = "https://modmaven.k-4u.nl/artifactory/local-releases/"
}
}
}
import net.fabricmc.loom.task.RunClientTask;
task generateData(type: RunClientTask, dependsOn: downloadAssets, group: "ae2", description: "Generates various JSON assets for the mod") {
classpath = configurations.runtimeClasspath
classpath sourceSets.api.output
classpath sourceSets.main.output
classpath sourceSets.datagen.output
systemProperty "appeng.generateData", "true"
}
build.dependsOn generateData
task runSiteExport(type: RunClientTask, dependsOn: downloadAssets, group: "ae2", description: "Export game assets for the website") {
classpath = configurations.runtimeClasspath
classpath sourceSets.api.output
classpath sourceSets.main.output
classpath sourceSets.siteexport.output
}
/////////////
// Spotless
spotless {
java {
target 'src/*/java/appeng/**/*.java'
indentWithSpaces()
eclipse().configFile 'codeformat/codeformat.xml'
importOrderFile 'codeformat/ae2.importorder'
}
format 'json', {
target 'src/*/resources/**/*.json'
targetExclude 'src/generated/resources/**'
prettier().config(['parser': 'json'])
}
}
////////////////
// Curse Forge
if (System.getenv("CURSEFORGE") && !version.endsWith("-SNAPSHOT")) {
def cfReleaseType = "release"
if (ext.isAlpha) {
cfReleaseType = "alpha"
} else if (ext.isBeta) {
cfReleaseType = "beta"
}
curseforge {
apiKey = System.getenv("CURSEFORGE")
project {
id = project.curseforge_project
changelogType = "markdown"
changelog = System.getenv("CHANGELOG") ?: "Please visit our [releases](https://github.com/AppliedEnergistics/Applied-Energistics-2/releases) for a changelog"
releaseType = cfReleaseType
addGameVersion project.minecraft_version
addGameVersion "Fabric"
mainArtifact(remapJar.archiveFile) {
displayName = "${project.version} [FABRIC]"
}
}
options {
forgeGradleIntegration = false
}
afterEvaluate {
tasks.getByName("curseforge${project.curseforge_project}").dependsOn remapJar
}
}
}
////////////////
// IntelliJ Project Import
// The Mixin annotation process does not have an obfuscation source when running through the IntelliJ compiler,
// thus we have to prevent it from being activated as part of importing this Gradle project into IntelliJ.
if (System.getProperty("idea.sync.active") == "true") {
afterEvaluate {
tasks.withType(JavaCompile).all {
it.options.annotationProcessorPath = files()
}
}
}
+26 -19
View File
@@ -1,28 +1,35 @@
version=0.0.0-SNAPSHOT
version_major=0
version_minor=0
version_patch=0
artifact_group=appeng
artifact_basename=appliedenergistics2-fabric
artifact_basename=appliedenergistics2
org.gradle.jvmargs=-Xmx2G
#########################################################
# Minecraft Versions #
#########################################################
minecraft_release=1.15
minecraft_version=1.15.2
mcp_mappings=20200715-1.15.1
forge_version=31.2.31
# Fabric Properties
# Check these on https://modmuss50.me/fabric.html
minecraft_version=1.16.3
yarn_mappings=1.16.3+build.11
loader_version=0.9.3+build.207
#Fabric api
fabric_version=0.21.0+build.407-1.16
loom_version=0.5-SNAPSHOT
# Dependencies
libblockattributes_version=0.8.0
tr_energy_version=0.1.0
rei_version=5.2.10
#########################################################
# Provided APIs #
#########################################################
jei_version=6.0.2.12
top_version=2.0.4-5
hwyla_version=1.10.8-B72_1.15.2
ctm_version=MC1.15.2-1.1.0.9
#########################################################
# Deployment #
#########################################################
website_version=1.15.2
curse_versions=1.15.2
curseforge_project=223794
#########################################################
# Gradle #
#########################################################
# Various tasks like runData will fail when run as daemon
org.gradle.daemon=false
+81
View File
@@ -0,0 +1,81 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
processResources {
exclude '.cache'
}
jar {
finalizedBy 'reobfJar'
finalizedBy 'signJar'
from sourceSets.main.output.classesDirs
from sourceSets.api.output.classesDirs
from sourceSets.main.output.resourcesDir
from sourceSets.api.output.resourcesDir
manifest {
attributes([
"Specification-Title": "Applied Energistics 2",
"Specification-Vendor": "TeamAppliedEnergistics",
"Specification-Version": "${project.version}",
"Implementation-Title": "${project.name}",
"Implementation-Version": "${project.version}",
"Implementation-Vendor" :"TeamAppliedEnergistics",
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
])
}
}
task javadocs(type: Javadoc) {
classpath = sourceSets.main.compileClasspath
source = sourceSets.api.java
include "appeng/api/**"
options.addStringOption('Xdoclint:none', '-quiet')
options.encoding = 'UTF-8'
options.charSet = 'UTF-8'
}
task javadocJar(type: Jar, dependsOn: javadocs) {
classifier = "javadoc"
from javadoc.destinationDir
}
task sourcesJar(type: Jar) {
classifier = "sources"
from sourceSets.main.allJava
from sourceSets.api.allJava
}
task apiJar(type: Jar) {
classifier = "api"
from sourceSets.api.output
include "appeng/api/**"
// TODO: when FG bug is fixed, remove allJava from the api jar.
// https://github.com/MinecraftForge/ForgeGradle/issues/369
// Gradle should be able to pull them from the -sources jar.
from sourceSets.api.allJava
}
artifacts {
archives javadocJar
archives sourcesJar
archives apiJar
}
+39
View File
@@ -0,0 +1,39 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2020, TeamAppliedEnergistics, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
*g GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
def isAlpha = project.version.contains("alpha")
def isBeta = project.version.contains("beta")
def cfReleaseType = "release"
if (isAlpha) {
cfReleaseType = "alpha"
} else if (isBeta) {
cfReleaseType = "beta"
}
if (System.getenv("CURSEFORGE")) {
curseforge {
apiKey = System.getenv("CURSEFORGE")
project {
id = project.curseforge_project
changelogType = "markdown"
changelog = System.getenv("CHANGELOG") ?: "Please visit our [releases](https://github.com/AppliedEnergistics/Applied-Energistics-2/releases) for a changelog"
releaseType = cfReleaseType
}
}
}
+42
View File
@@ -0,0 +1,42 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
repositories {
mavenLocal()
maven { // modmaven, maven proxy
name 'modmaven'
url "https://modmaven.k-4u.nl/"
}
}
dependencies {
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
// compile against provided APIs
compileOnly "mezz.jei:jei-${minecraft_version}:${jei_version}:api"
compileOnly "mcjty.theoneprobe:TheOneProbe-${minecraft_release}:${minecraft_release}-${top_version}:api"
// Runtime, Mods
runtimeOnly fg.deobf("mezz.jei:jei-${minecraft_version}:${jei_version}")
runtimeOnly fg.deobf("mcjty.theoneprobe:TheOneProbe-${minecraft_release}:${minecraft_release}-${top_version}")
runtimeOnly fg.deobf("team.chisel.ctm:CTM:${ctm_version}")
// unit test dependencies
testCompile "junit:junit:4.13"
}
+32
View File
@@ -0,0 +1,32 @@
/*
* This file is part of Applied Energistics 2.
* Copyright (c) 2013 - 2020, AlgorithmX2, All rights reserved.
*
* Applied Energistics 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Applied Energistics 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
*g GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/
spotless {
java {
target 'src/*/java/appeng/**/*.java'
indentWithSpaces()
eclipse().configFile 'codeformat/codeformat.xml'
importOrderFile 'codeformat/ae2.importorder'
}
format 'json', {
target 'src/*/resources/**/*.json'
targetExclude 'src/generated/resources/**'
prettier().config(['parser': 'json'])
}
}
Binary file not shown.
+1 -1
View File
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Vendored
+20 -31
View File
@@ -1,21 +1,5 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
@@ -44,7 +28,7 @@ APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
@@ -125,8 +109,8 @@ if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
@@ -154,19 +138,19 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
i=$((i+1))
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
@@ -175,9 +159,14 @@ save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"
Vendored
+1 -20
View File
@@ -1,19 +1,3 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@@ -29,11 +13,8 @@ if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
-15
View File
@@ -1,15 +0,0 @@
pluginManagement {
repositories {
jcenter()
maven {
name = "Fabric"
url = "https://maven.fabricmc.net/"
}
gradlePluginPortal()
}
plugins {
id "fabric-loom" version loom_version
}
}
+3 -3
View File
@@ -27,11 +27,11 @@ import java.lang.annotation.Target;
/**
* Use this annotation on a class in your Mod to have it instantiated during the
* initialization phase of Applied Energistics.
* <p>
*
* The class also needs to implement {@link IAEAddon}.
* <p>
*
* AE expects your class to have a single constructor without any parameters.
* <p>
*
* This is the only way to get access to the public {@link IAppEngApi} instance.
*/
@Target(ElementType.TYPE)
+8 -3
View File
@@ -23,21 +23,26 @@
package appeng.api;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
/**
* Every AE2 addon requiring access to {@link IAppEngApi}, needs to provide at
* least one class implementing this interface.
* <p>
*
* Further it requires the class to be annotated with {@link AEAddon}.
*
*/
public interface IAEAddon {
/**
* This gets called once the API is successfully constructed and ready to be
* used.
* <p>
*
* For now this happens during {@link FMLCommonSetupEvent}.
*
* Each addon is responsible to maintain a reference to {@link IAppEngApi} for
* future use. Otherwise there is no alternative to access it later.
*
*
* @param api The API instance when ready.
*/
void onAPIAvailable(IAppEngApi api);
@@ -28,8 +28,9 @@ import java.util.Map;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import net.minecraft.client.renderer.model.ModelBakery;
import net.minecraft.item.Item;
import net.minecraft.util.Identifier;
import net.minecraft.util.ResourceLocation;
/**
* A registry for 3D models used to render storage cells in the world, when they
@@ -39,51 +40,49 @@ public interface ICellModelRegistry {
/**
* Register a new model for a storage cell item.
*
*
* <p>
* You are responsible for ensuring that the given model is actually loaded by
* the game. See
* {@see net.minecraftforge.client.model.ModelLoader#addSpecialModel}.
* <p>
* This method only maps an {@link Item} to a {@link Identifier} which can be
* looked up from the
* {@link net.minecraft.client.render.model.BakedModelManager}. No validation
* about missing models will be done.
* <p>
*
* This method only maps an {@link Item} to a {@link ResourceLocation} which can
* be looked up from the {@link ModelBakery}. No validation about missing models
* will be done.
*
* Will throw an exception in case a model is already registered for an item.
* <p>
*
* For examples look at our cell part models within the drive model directory.
*
*
* @param item The cell item
* @param model The {@link net.minecraft.util.Identifier} representing the
* model.
* @param model The {@link ResourceLocation} representing the model.
* @return
*/
void registerModel(@Nonnull Item item, @Nonnull Identifier model);
void registerModel(@Nonnull Item item, @Nonnull ResourceLocation model);
/**
* The {@link Identifier} of the model used to render the given storage cell
* {@link Item} when inserted into a drive or similar.
*
* The {@link ResourceLocation} of the model used to render the given storage
* cell {@link Item} when inserted into a drive or similar.
*
* @param item
* @return null, if no model is registered.
*/
@Nullable
Identifier model(@Nonnull Item item);
ResourceLocation model(@Nonnull Item item);
/**
* An unmodifiable map of all registered mappings.
*
*
* @return
*/
@Nonnull
Map<Item, Identifier> models();
Map<Item, ResourceLocation> models();
/**
* Returns the default model, which can be used when no explicit model is
* registered.
*/
@Nonnull
Identifier getDefaultModel();
ResourceLocation getDefaultModel();
}
@@ -25,7 +25,7 @@ package appeng.api.client;
import java.util.List;
import net.minecraft.text.Text;
import net.minecraft.util.text.ITextComponent;
import appeng.api.storage.cells.ICellInventoryHandler;
import appeng.api.storage.data.IAEStack;
@@ -37,11 +37,11 @@ public interface IClientHelper {
* @param handler Cell handler.
* @param lines List of lines to add to.
*/
<T extends IAEStack<T>> void addCellInformation(ICellInventoryHandler<T> handler, List<Text> lines);
<T extends IAEStack<T>> void addCellInformation(ICellInventoryHandler<T> handler, List<ITextComponent> lines);
/**
* A helper to work with clientside related tasks for cells.
*
*
* @return
*/
ICellModelRegistry cells();
+13 -2
View File
@@ -23,15 +23,26 @@
package appeng.api.config;
import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction;
public enum Actionable {
/**
* Perform the intended action.
*/
MODULATE,
MODULATE(FluidAction.EXECUTE),
/**
* Pretend to perform the action.
*/
SIMULATE
SIMULATE(FluidAction.SIMULATE);
private final FluidAction fluidAction;
Actionable(FluidAction fluidAction) {
this.fluidAction = fluidAction;
}
public FluidAction getFluidAction() {
return fluidAction;
}
}
+11 -20
View File
@@ -23,55 +23,46 @@
package appeng.api.config;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TranslationTextComponent;
public enum PowerUnits {
AE("gui.appliedenergistics2.units.appliedenergstics", "AE"), // Native Units - AE Energy
EU("gui.appliedenergistics2.units.ic2", "EU"), // IndustrialCraft 2 - Energy Units
TR("gui.appliedenergistics2.units.tr", "E"); // TR - TechReborn energy
AE("gui.appliedenergistics2.units.appliedenergstics"), // Native Units - AE Energy
EU("gui.appliedenergistics2.units.ic2"), // IndustrialCraft 2 - Energy Units
RF("gui.appliedenergistics2.units.rf"); // RF - Redstone Flux
/**
* unlocalized name for the power unit.
*/
public final String unlocalizedName;
/**
* unlocalized name for the power unit's symbol used to display values.
*/
public final String symbolName;
/**
* please do not edit this value, it is set when AE loads its config files.
*/
public double conversionRatio = 1.0;
PowerUnits(final String un, String symbolName) {
PowerUnits(final String un) {
this.unlocalizedName = un;
this.symbolName = symbolName;
}
/**
* do power conversion using AE's conversion rates.
* <p>
*
* Example: PowerUnits.EU.convertTo( PowerUnits.AE, 32 );
* <p>
*
* will normally returns 64, as it will convert the EU, to AE with AE's power
* settings.
*
* @param target target power unit
* @param value value
*
* @return value converted to target units, from this units.
*/
public double convertTo(final PowerUnits target, final double value) {
return (value * this.conversionRatio) / target.conversionRatio;
}
public Text textComponent() {
return new TranslatableText(unlocalizedName);
}
public String getSymbolName() {
return symbolName;
public ITextComponent textComponent() {
return new TranslationTextComponent(unlocalizedName);
}
}
@@ -23,11 +23,6 @@
package appeng.api.config;
import java.util.Locale;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
/**
* Represent the security systems basic permissions, these are not for
* anti-griefing, they are part of the mod as a gameplay feature.
@@ -63,22 +58,13 @@ public enum SecurityPermissions {
*/
SECURITY;
private final String translationKey = "gui.appliedenergistics2.security." + this.name().toLowerCase(Locale.ROOT);
private final String translationKey = "gui.appliedenergistics2.security." + this.name().toLowerCase();
public String getTranslatedName() {
return this.translationKey + ".name";
}
public Text nameText() {
return new TranslatableText(getTranslatedName());
}
public String getTranslatedTip() {
return this.translationKey + ".tip";
}
public Text tooltipText() {
return new TranslatableText(getTranslatedTip());
}
}
+1 -1
View File
@@ -36,7 +36,7 @@ public enum Settings {
CONDENSER_OUTPUT(EnumSet.allOf(CondenserOutput.class)),
POWER_UNITS(EnumSet.of(PowerUnits.AE, PowerUnits.TR)),
POWER_UNITS(EnumSet.allOf(PowerUnits.class)),
ACCESS(EnumSet.of(AccessRestriction.READ_WRITE, AccessRestriction.READ, AccessRestriction.WRITE)),
@@ -25,8 +25,12 @@ package appeng.api.config;
public enum TunnelType {
ME, // Network Tunnel
IC2_POWER, // EU Tunnel
FE_POWER, // Forge Energy tunnel
REDSTONE, // Redstone Tunnel
FLUID, // Fluid Tunnel
ITEM, // Item Tunnel
LIGHT, // Light Tunnel
BUNDLED_REDSTONE, // Bundled Redstone Tunnel
COMPUTER_MESSAGE // Computer Message Tunnel
}
+15 -18
View File
@@ -33,14 +33,12 @@ import javax.annotation.Nullable;
import com.google.common.base.Preconditions;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.block.Block;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemConvertible;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.IItemProvider;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TranslationTextComponent;
public enum Upgrades {
/**
@@ -55,7 +53,7 @@ public enum Upgrades {
private final int tier;
private final List<Supported> supported = new ArrayList<>();
private List<Text> supportedTooltipLines;
private List<ITextComponent> supportedTooltipLines;
Upgrades(final int tier) {
this.tier = tier;
@@ -69,7 +67,7 @@ public enum Upgrades {
return this.supported;
}
public void registerItem(final ItemConvertible item, final int maxSupported) {
public void registerItem(final IItemProvider item, final int maxSupported) {
this.registerItem(item, maxSupported, null);
}
@@ -83,24 +81,23 @@ public enum Upgrades {
* the items have different maxSupported values, the highest
* will be shown.
*/
public void registerItem(final ItemConvertible item, final int maxSupported, @Nullable String tooltipGroup) {
public void registerItem(final IItemProvider item, final int maxSupported, @Nullable String tooltipGroup) {
Preconditions.checkNotNull(item);
this.supported.add(new Supported(item.asItem(), maxSupported, tooltipGroup));
supportedTooltipLines = null; // Reset tooltip
}
@Environment(EnvType.CLIENT)
public List<Text> getTooltipLines() {
public List<ITextComponent> getTooltipLines() {
if (supportedTooltipLines == null) {
supported.sort(Comparator.comparingInt(o -> o.maxCount));
supportedTooltipLines = new ArrayList<>(supported.size());
// Use a separate set because the final text will include numbers
Set<Text> namesAdded = new HashSet<>();
Set<ITextComponent> namesAdded = new HashSet<>();
for (int i = 0; i < supported.size(); i++) {
Supported supported = this.supported.get(i);
Text name = supported.item.getName();
ITextComponent name = supported.item.getName();
// If the group was already added by a previous item, skip this
if (supported.getTooltipGroup() != null && namesAdded.contains(supported.getTooltipGroup())) {
@@ -111,7 +108,7 @@ public enum Upgrades {
// instead
if (supported.getTooltipGroup() != null) {
for (int j = i + 1; j < this.supported.size(); j++) {
Text otherGroup = this.supported.get(j).getTooltipGroup();
ITextComponent otherGroup = this.supported.get(j).getTooltipGroup();
if (supported.getTooltipGroup().equals(otherGroup)) {
name = supported.getTooltipGroup();
break;
@@ -122,7 +119,7 @@ public enum Upgrades {
if (namesAdded.add(name)) {
// append the supported count only if its > 1
if (supported.maxCount > 1) {
name = name.copy().append(" (" + supported.maxCount + ")");
name = name.deepCopy().appendText(" (" + supported.maxCount + ")");
}
supportedTooltipLines.add(name);
}
@@ -146,8 +143,8 @@ public enum Upgrades {
public Supported(Item item, int maxCount, @Nullable String tooltipGroup) {
this.item = item;
if (item instanceof BlockItem) {
this.block = ((BlockItem) item).getBlock();
if (item.getItem() instanceof BlockItem) {
this.block = ((BlockItem) item.getItem()).getBlock();
} else {
this.block = null;
}
@@ -167,8 +164,8 @@ public enum Upgrades {
return item != null && this.item == item;
}
public Text getTooltipGroup() {
return this.tooltipGroup != null ? new TranslatableText(this.tooltipGroup) : null;
public ITextComponent getTooltipGroup() {
return this.tooltipGroup != null ? new TranslationTextComponent(this.tooltipGroup) : null;
}
}
@@ -27,7 +27,7 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import net.minecraft.item.ItemStack;
import net.minecraft.recipe.CraftingRecipe;
import net.minecraft.item.crafting.ICraftingRecipe;
import net.minecraft.world.World;
import appeng.api.networking.crafting.ICraftingPatternDetails;
@@ -55,8 +55,6 @@ public interface ICraftingHelper {
* pattern that will be overwritten.
* @return A new encoded pattern, or the given stack with the pattern encoded in
* it.
* @throws IllegalArgumentException If either in or out contain only empty
* ItemStacks.
*/
ItemStack encodeProcessingPattern(@Nullable ItemStack stack, ItemStack[] in, ItemStack[] out);
@@ -75,10 +73,8 @@ public interface ICraftingHelper {
* operation by the ME system.
* @param allowSubstitutes Controls whether the ME system will allow the use of
* equivalent items to craft this recipe.
* @throws IllegalArgumentException If either in or out contain only empty
* ItemStacks.
*/
ItemStack encodeCraftingPattern(@Nullable ItemStack stack, CraftingRecipe recipe, ItemStack[] in, ItemStack out,
ItemStack encodeCraftingPattern(@Nullable ItemStack stack, ICraftingRecipe recipe, ItemStack[] in, ItemStack out,
boolean allowSubstitutes);
/**
@@ -98,7 +94,7 @@ public interface ICraftingHelper {
*
* @param itemStack pattern
* @param world world used to access the
* {@link net.minecraft.recipe.RecipeManager}.
* {@link net.minecraft.item.crafting.RecipeManager}.
* @param autoRecovery If true, the method will try to recover from changed
* recipe ids by searching the entire recipe manager for a
* recipe matching the inputs. If this is successful, the
@@ -23,7 +23,7 @@ import java.util.Optional;
import net.minecraft.block.Block;
import net.minecraft.item.BlockItem;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.BlockView;
import net.minecraft.world.IBlockReader;
public interface IBlockDefinition extends IItemDefinition {
/**
@@ -49,7 +49,8 @@ public interface IBlockDefinition extends IItemDefinition {
*
* @param world world of block
* @param pos location
*
* @return if the block is placed in the world at the specific location.
*/
boolean isSameAs(BlockView world, BlockPos pos);
boolean isSameAs(IBlockReader world, BlockPos pos);
}
@@ -32,6 +32,7 @@ public interface IComparableDefinition {
* Compare {@link ItemStack} with this
*
* @param comparableStack compared item
*
* @return true if the item stack is a matching item.
*/
boolean isSameAs(ItemStack comparableStack);
@@ -29,12 +29,12 @@ import java.util.Set;
import javax.annotation.Nonnull;
import net.minecraft.item.Item;
import net.minecraft.item.ItemConvertible;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IItemProvider;
import appeng.api.features.AEFeature;
public interface IItemDefinition extends IComparableDefinition, ItemConvertible {
public interface IItemDefinition extends IComparableDefinition, IItemProvider {
/**
* @return the unique name of the definition which will be used to register the
* underlying structure. Will never be null
@@ -71,6 +71,10 @@ public interface IParts {
IItemDefinition p2PTunnelFluids();
IItemDefinition p2PTunnelEU();
IItemDefinition p2PTunnelFE();
IItemDefinition p2PTunnelLight();
IItemDefinition cableAnchor();
@@ -20,11 +20,11 @@ package appeng.api.definitions;
import java.util.Optional;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.tileentity.TileEntity;
public interface ITileDefinition extends IBlockDefinition {
/**
* @return the {@link BlockEntity} Class if applicable.
* @return the {@link TileEntity} Class if applicable.
*/
Optional<? extends Class<? extends BlockEntity>> maybeEntity();
Optional<? extends Class<? extends TileEntity>> maybeEntity();
}
@@ -1,6 +1,6 @@
package appeng.api.definitions;
import net.minecraft.util.Identifier;
import net.minecraft.util.ResourceLocation;
// Private helper class to create AE2 resource locations
final class IdHelper {
@@ -11,8 +11,8 @@ final class IdHelper {
/**
* Creates a ResourceLocation namespaced to AE2.
*/
static Identifier id(String id) {
return new Identifier("appliedenergistics2", id);
static ResourceLocation id(String id) {
return new ResourceLocation("appliedenergistics2", id);
}
}
@@ -23,28 +23,26 @@
package appeng.api.events;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
import net.minecraftforge.eventbus.api.Event;
import appeng.api.features.ILocatable;
/**
* Input Event:
* <p>
*
* Used to Notify the Location Registry of objects, and their availability.
*/
public interface LocatableEventAnnounce {
public class LocatableEventAnnounce extends Event {
Event<LocatableEventAnnounce> EVENT = EventFactory.createArrayBacked(LocatableEventAnnounce.class,
listeners -> (ILocatable target, LocatableEvent change) -> {
for (LocatableEventAnnounce listener : listeners) {
listener.onLocatableAnnounce(target, change);
}
});
public final ILocatable target;
public final LocatableEvent change;
void onLocatableAnnounce(final ILocatable target, final LocatableEvent change);
public LocatableEventAnnounce(final ILocatable o, final LocatableEvent ev) {
this.target = o;
this.change = ev;
}
enum LocatableEvent {
public enum LocatableEvent {
/**
* Adds the locatable to the registry
*/
@@ -1,8 +0,0 @@
package appeng.api.events;
@FunctionalInterface
public interface LocatableEventCallback {
void onLocatable(LocatableEventAnnounce.LocatableEvent evt);
}
@@ -28,7 +28,7 @@ import appeng.api.networking.IGridNode;
/**
* Exception occurred because of an already existing connection between the two
* {@link IGridNode}s
* <p>
*
* Intended to signal an internal exception and not intended to be thrown by any
* 3rd party module.
*
@@ -27,10 +27,10 @@ import appeng.api.networking.IGridNode;
/**
* Exception indicating a failed connection between two {@link IGridNode}s.
* <p>
*
* Intended to signal an internal exception and not intended to be thrown by any
* 3rd party module.
* <p>
*
* See any subclass for a more specific reason.
*
* @author AlgorithmX2
@@ -25,7 +25,7 @@ package appeng.api.exceptions;
/**
* Exception due to trying to connect one or more null values.
* <p>
*
* Intended to signal an internal exception and not intended to be thrown by any
* 3rd party module.
*
@@ -25,7 +25,7 @@ package appeng.api.exceptions;
/**
* Exception due to trying to connect different security realms.
* <p>
*
* Intended to signal an internal exception and not intended to be thrown by any
* 3rd party module.
*
@@ -33,12 +33,12 @@ import appeng.api.implementations.items.IAEItemPowerStorage;
/**
* A registry to allow mapping {@link Item}s to a specific charge rate when
* being placed inside a charger.
* <p>
*
* The registry is used in favor of an additional method for
* {@link IAEItemPowerStorage} with a fixed value per item. This allows more
* flexibility for other charger like machines to choose their own values when
* needed.
* <p>
*
* There is no guarantee that this is charged per tick, it only represents the
* value per operation. By default this is one charging operation every 10 ticks
* in case of an AE2 charger.
@@ -51,7 +51,7 @@ public interface IChargerRegistry {
/**
* Fetch a charge rate for a specific item.
* <p>
*
* The specific item does not need to have a mapping registered at all. In this
* case it will use a default value of 160 AE.
*
@@ -63,7 +63,7 @@ public interface IChargerRegistry {
/**
* Register a custom charge rate for a specific item.
* <p>
*
* Capped at 16000 to avoid extracting too much energy from a network for each
* operation. This is done silently without any feedback or exception. Further
* the cap is not fixed, it can change at any time in the future should power
@@ -76,7 +76,7 @@ public interface IChargerRegistry {
/**
* Remove the custom rate for a specific item.
* <p>
*
* It will revert to the default value afterwards.
*
* @param item A {@link Item} implementing {@link IAEItemPowerStorage}.
@@ -37,6 +37,7 @@ public interface IItemComparisonProvider {
* supplied item.
*
* @param is item
*
* @return IItemComparison, or null
*/
IItemComparison getComparison(ItemStack is);
@@ -46,6 +47,7 @@ public interface IItemComparisonProvider {
* function. )
*
* @param stack item
*
* @return true, if getComparison will return a valid IItemComparison Object
*/
boolean canHandle(ItemStack stack);
@@ -32,6 +32,7 @@ public interface ILocatableRegistry {
* Gets the {@link ILocatable} with the registered serial, if available
*
* @param serial serial
*
* @return requestedObject, or null, if the object does not exist anymore
*/
ILocatable getLocatableBy(long serial);
@@ -25,7 +25,7 @@ package appeng.api.features;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier;
import net.minecraft.util.ResourceLocation;
public interface IMatterCannonAmmoRegistry {
@@ -45,12 +45,13 @@ public interface IMatterCannonAmmoRegistry {
* @param ammoTag item tag id
* @param weight atomic weight
*/
void registerAmmoTag(Identifier ammoTag, double weight);
void registerAmmoTag(ResourceLocation ammoTag, double weight);
/**
* get the penetration value for a particular ammo, 0 indicates a non-ammo.
*
* @param is ammo
*
* @return 0 or a valid penetration value.
*/
float getPenetration(ItemStack is);
@@ -31,6 +31,7 @@ public interface INetworkEncodable {
* Used to get the current key from the item.
*
* @param item item
*
* @return string key of item
*/
String getEncryptionKey(ItemStack item);
@@ -27,8 +27,7 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import net.minecraft.item.ItemStack;
import alexiil.mc.lib.attributes.Attribute;
import net.minecraftforge.common.capabilities.Capability;
import appeng.api.config.TunnelType;
@@ -49,12 +48,13 @@ public interface IP2PTunnelRegistry {
void addNewAttunement(@Nonnull String ModId, @Nullable TunnelType type);
void addNewAttunement(@Nonnull Attribute<?> attr, @Nullable TunnelType type);
void addNewAttunement(@Nonnull Capability<?> cap, @Nullable TunnelType type);
/**
* returns null if no attunement can be found.
*
* @param trigger attunement trigger
*
* @return null if no attunement can be found or attunement
*/
@Nonnull
@@ -38,18 +38,21 @@ public interface IPlayerRegistry {
/**
* @param gameProfile user game profile
*
* @return user id of a username.
*/
int getID(GameProfile gameProfile);
/**
* @param player player
*
* @return user id of a player entity.
*/
int getID(PlayerEntity player);
/**
* @param playerID to be found player id
*
* @return PlayerEntity, or null if the player could not be found.
*/
@Nullable
@@ -82,6 +82,11 @@ public interface IRegistryContainer {
*/
IPlayerRegistry players();
/**
* get access to the world-gen api.
*/
IWorldGen worldgen();
/**
* Register your IPart models before using them.
*/
@@ -35,6 +35,7 @@ public interface IWirelessTermHandler extends INetworkEncodable {
/**
* @param is wireless terminal
*
* @return true, if usePower, hasPower, etc... can be called for the provided
* item
*/
@@ -46,6 +47,7 @@ public interface IWirelessTermHandler extends INetworkEncodable {
* @param amount is in AE units ( 5 per MJ ), if you return false, the item
* should be dead and return false for hasPower
* @param is wireless terminal
*
* @return true if wireless terminal uses power
*/
boolean usePower(PlayerEntity player, double amount, ItemStack is);
@@ -54,6 +56,7 @@ public interface IWirelessTermHandler extends INetworkEncodable {
* gets the power status of the item.
*
* @param is wireless terminal
*
* @return returns true if there is any power left.
*/
boolean hasPower(PlayerEntity player, double amount, ItemStack is);
@@ -62,6 +65,7 @@ public interface IWirelessTermHandler extends INetworkEncodable {
* Return the config manager for the wireless terminal.
*
* @param is wireless terminal
*
* @return config manager of wireless terminal
*/
IConfigManager getConfigManager(ItemStack is);
@@ -26,7 +26,7 @@ package appeng.api.features;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Hand;
import net.minecraft.world.BlockView;
import net.minecraft.world.IBlockReader;
/**
* Registration record for a Custom Cell handler.
@@ -42,6 +42,7 @@ public interface IWirelessTermRegistry {
/**
* @param is item which might have a handler
*
* @return true if there is a handler for this item
*/
boolean isWirelessTerminal(ItemStack is);
@@ -57,5 +58,5 @@ public interface IWirelessTermRegistry {
* opens the wireless terminal gui, the wireless terminal item, must be in the
* active slot on the tool bar.
*/
void openWirelessTerminalGui(ItemStack item, BlockView world, PlayerEntity player, Hand hand);
void openWirelessTerminalGui(ItemStack item, IBlockReader world, PlayerEntity player, Hand hand);
}
@@ -0,0 +1,43 @@
/*
* The MIT License (MIT)
*
* Copyright (c) 2013 AlgorithmX2
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package appeng.api.features;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.IWorld;
import net.minecraft.world.dimension.Dimension;
public interface IWorldGen {
void disableWorldGenForProviderID(WorldGenType type, Class<? extends Dimension> provider);
void enableWorldGenForDimension(WorldGenType type, ResourceLocation dimID);
void disableWorldGenForDimension(WorldGenType type, ResourceLocation dimID);
boolean isWorldGenEnabled(WorldGenType type, IWorld w);
enum WorldGenType {
CERTUS_QUARTZ, CHARGED_CERTUS_QUARTZ, METEORITES
}
}
@@ -23,7 +23,7 @@
package appeng.api.implementations;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.tileentity.TileEntity;
import appeng.api.config.Upgrades;
import appeng.api.implementations.tiles.ISegmentedInventory;
@@ -39,7 +39,7 @@ public interface IUpgradeableHost extends IConfigurableObject, ISegmentedInvento
/**
* the tile...
*
* @return block entity
* @return tile entity
*/
BlockEntity getTile();
TileEntity getTile();
}
@@ -0,0 +1,38 @@
/*
* The MIT License (MIT)
*
* Copyright (c) 2013 AlgorithmX2
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package appeng.api.implementations;
/**
* Defines the result of performing a transition from the world into a storage
* cell, if its possible, and what the energy usage is.
*/
public class TransitionResult {
public final boolean success;
public final double energyUsage;
public TransitionResult(final boolean success, final double power) {
this.success = success;
this.energyUsage = power;
}
}
@@ -35,6 +35,7 @@ import net.minecraft.world.World;
*/
public interface IGuiItem {
/**
*
* @param is The item used to open the container.
* @param playerInventorySlot The slot in the player's inventory the item is in.
* @param world The world the player is in.
@@ -23,7 +23,7 @@
package appeng.api.implementations.guiobjects;
import alexiil.mc.lib.attributes.item.FixedItemInv;
import net.minecraftforge.items.IItemHandler;
import appeng.api.networking.IGridHost;
@@ -33,5 +33,5 @@ import appeng.api.networking.IGridHost;
public interface INetworkTool extends IGuiItemObject {
IGridHost getGridHost(); // null for most purposes.
FixedItemInv getInventory();
IItemHandler getInventory();
}
@@ -46,6 +46,7 @@ public interface IAEItemPowerStorage {
* return it.
*
* @param amount to be extracted power from device
*
* @return what it could extract
*/
double extractAEPower(ItemStack stack, double amount, Actionable mode);
@@ -38,6 +38,7 @@ public interface IAEWrench {
*
* @param player wrenching player
* @param pos of block.
*
* @return true if wrench can be used
*/
boolean canWrench(ItemStack wrench, PlayerEntity player, BlockPos pos);
@@ -48,6 +48,7 @@ public interface IBiometricCard {
/**
* @param itemStack card
*
* @return the full list of permissions encoded on the card.
*/
EnumSet<SecurityPermissions> getPermissions(ItemStack itemStack);
@@ -56,6 +57,7 @@ public interface IBiometricCard {
* Check if a permission is encoded on the card.
*
* @param permission card
*
* @return true if this permission is set on the card.
*/
boolean hasPermission(ItemStack is, SecurityPermissions permission);
@@ -23,23 +23,13 @@
package appeng.api.implementations.items;
import javax.annotation.Nullable;
import net.minecraft.block.BlockState;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public interface IGrowableCrystal {
ItemStack triggerGrowth(ItemStack is);
/**
* Gets the crystal growth multiplier based on the material it is submerged in.
*
* @param state The blockstate of the block the crystal is currently in.
* @return The multiplier for the growth tick progress. Zero if the crystal
* cannot grow in the current material.
*/
float getMultiplier(BlockState state, @Nullable World world, @Nullable BlockPos pos);
float getMultiplier(Block blk, Material mat);
}
@@ -25,13 +25,13 @@ package appeng.api.implementations.items;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.CompoundNBT;
import appeng.api.util.AEColor;
/**
* Memory Card API
* <p>
*
* AE's Memory Card Item Class implements this interface.
*/
public interface IMemoryCard {
@@ -39,21 +39,21 @@ public interface IMemoryCard {
/**
* Configures the data stored on the memory card, the SettingsName, will be
* localized when displayed.
* <p>
*
* The data can contain an optional string with the key "tooltip", which will be
* used as unlocalized string to display it after the settings name.
* <p>
*
* The data can contain an optional intArray using "colorCode" to be displayed
* on the model itself. It needs to have exactly 8 elements representing the
* ordinal of the matching {@link AEColor}. The first 4 values represent the top
* row, left to right. The second 4 the bottom row.
*
* @param is item
* @param settingsName unlocalized string that represents the block entity.
* @param settingsName unlocalized string that represents the tile entity.
* @param data the NBT tag, refer to the normal comment for special
* keys.
*/
void setMemoryCardContents(ItemStack is, String settingsName, CompoundTag data);
void setMemoryCardContents(ItemStack is, String settingsName, CompoundNBT data);
/**
* returns the settings name provided by a previous call to
@@ -61,24 +61,27 @@ public interface IMemoryCard {
* call to setMemoryCardContents.
*
* @param is item
*
* @return setting name
*/
String getSettingsName(ItemStack is);
/**
* @param is item
*
* @return the NBT Data previously saved by setMemoryCardContents, or an empty
* NBTCompound
*/
CompoundTag getData(ItemStack is);
CompoundNBT getData(ItemStack is);
/**
* This represent as 4x2 grid of {@link AEColor} without transparent/fluix
* color.
* <p>
*
* First 4 colors are used for the top row, second for the bottom one.
*
* @param is item
*
* @return a hash representation of the memory card content
*/
AEColor[] getColorCode(ItemStack is);
@@ -25,8 +25,10 @@ package appeng.api.implementations.items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.world.World;
import net.minecraft.world.dimension.DimensionType;
import appeng.api.implementations.TransitionResult;
import appeng.api.util.WorldCoord;
/**
@@ -36,23 +38,26 @@ public interface ISpatialStorageCell {
/**
* @param is spatial storage cell
*
* @return true if this item is a spatial storage cell
*/
boolean isSpatialStorage(ItemStack is);
/**
* @param is spatial storage cell
*
* @return the maximum size of the spatial storage cell along any given axis
*/
int getMaxStoredDim(ItemStack is);
/**
* get the currently stored spatial storage plot id.
* get the currently stored Dimension id.
*
* @param is spatial storage cell
* @return plot id or -1
*
* @return dimension id or -1
*/
int getAllocatedPlotId(ItemStack is);
DimensionType getStoredDimension(ItemStack is);
/**
* Perform a spatial swap with the contents of the cell, and the world.
@@ -62,7 +67,8 @@ public interface ISpatialStorageCell {
* @param min min coord
* @param max max coord
* @param playerId owner of current grid or -1
* @return success of transition
*
* @return result of transition
*/
boolean doSpatialTransition(ItemStack is, ServerWorld w, WorldCoord min, WorldCoord max, int playerId);
TransitionResult doSpatialTransition(ItemStack is, World w, WorldCoord min, WorldCoord max, int playerId);
}
@@ -38,14 +38,14 @@ import appeng.api.storage.data.IAEStack;
* {@link ICellHandler#getCellInventory(ItemStack, appeng.api.storage.cells.ISaveProvider, IStorageChannel)}
* or {@link ICellHandler#isCell(ItemStack)}. It automatically handles the
* internals and NBT data, which is both nice, and bad for you!
* <p>
*
* Good cause it means you don't have to do anything, bad because you have
* little to no control over it.
* <p>
*
* Limited to {@link Integer} internally for most calculations. E.g. if the used
* or remaining bytes would overflow {@link Integer#MAX_VALUE} the behaviour is
* no longer specified. Even if {@link ICellInventory} is using {@link Long}.
* <p>
*
* The standard AE implementation also only provides 1-63 Types.
*/
public interface IStorageCell<T extends IAEStack<T>> extends ICellWorkbenchItem {
@@ -55,6 +55,7 @@ public interface IStorageCell<T extends IAEStack<T>> extends ICellWorkbenchItem
* ({@link Integer#MAX_VALUE} + 1) / 8.
*
* @param cellItem item
*
* @return number of bytes
*/
int getBytes(@Nonnull ItemStack cellItem);
@@ -63,6 +64,7 @@ public interface IStorageCell<T extends IAEStack<T>> extends ICellWorkbenchItem
* Determines the number of bytes used for any type included on the cell.
*
* @param cellItem item
*
* @return number of bytes
*/
int getBytesPerType(@Nonnull ItemStack cellItem);
@@ -72,6 +74,7 @@ public interface IStorageCell<T extends IAEStack<T>> extends ICellWorkbenchItem
* item.
*
* @param cellItem item
*
* @return number of types
*/
int getTotalTypes(@Nonnull ItemStack cellItem);
@@ -83,6 +86,7 @@ public interface IStorageCell<T extends IAEStack<T>> extends ICellWorkbenchItem
*
* @param cellItem item
* @param requestedAddition requested addition
*
* @return true to preventAdditionOfItem
*/
boolean isBlackListed(@Nonnull ItemStack cellItem, @Nonnull T requestedAddition);
@@ -102,6 +106,7 @@ public interface IStorageCell<T extends IAEStack<T>> extends ICellWorkbenchItem
* Allows an item to selectively enable or disable its status as a storage cell.
*
* @param i item
*
* @return if the ItemStack should behavior as a storage cell.
*/
boolean isStorageCell(@Nonnull ItemStack i);
@@ -37,6 +37,7 @@ public interface IStorageComponent {
* condenser.
*
* @param is item
*
* @return number of bytes
*/
int getBytes(ItemStack is);
@@ -45,6 +46,7 @@ public interface IStorageComponent {
* Just true or false for the item stack.
*
* @param is item
*
* @return true if item is a storage component
*/
boolean isStorageComponent(ItemStack is);
@@ -31,6 +31,7 @@ public interface IUpgradeModule {
/**
* @param itemstack item with potential upgrades
*
* @return null, or a valid upgrade type.
*/
Upgrades getType(ItemStack itemstack);
@@ -26,7 +26,7 @@ package appeng.api.implementations.parts;
import java.util.EnumSet;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.math.Direction;
import net.minecraft.util.Direction;
import appeng.api.networking.IGridHost;
import appeng.api.parts.BusSupport;
@@ -62,13 +62,14 @@ public interface ICablePart extends IPart, IGridHost {
* something.
*
* @param newColor new color
*
* @return if the color change was successful.
*/
boolean changeColor(AEColor newColor, PlayerEntity who);
/**
* Change sides on the cables node.
* <p>
*
* Called by AE, do not invoke.
*
* @param sides sides of cable
@@ -79,6 +80,7 @@ public interface ICablePart extends IPart, IGridHost {
* used to tests if a cable connects to neighbors visually.
*
* @param side neighbor side
*
* @return true if this side is currently connects to an external block.
*/
boolean isConnected(Direction side);
@@ -41,6 +41,7 @@ public interface IChestOrDrive extends ICellContainer, IGridHost, IOrientable {
/**
* @param slot slot index
*
* @return status of the slot, one of the above indices.
*/
CellState getCellStatus(int slot);
@@ -53,6 +54,7 @@ public interface IChestOrDrive extends ICellContainer, IGridHost, IOrientable {
/**
* @param slot slot index
*
* @return is the cell currently blinking to show activity.
*/
boolean isCellBlinking(int slot);
@@ -24,7 +24,7 @@
package appeng.api.implementations.tiles;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.math.Direction;
import net.minecraft.util.Direction;
import appeng.api.util.AEColor;
@@ -24,7 +24,7 @@
package appeng.api.implementations.tiles;
import net.minecraft.inventory.CraftingInventory;
import net.minecraft.util.math.Direction;
import net.minecraft.util.Direction;
import appeng.api.networking.crafting.ICraftingPatternDetails;
@@ -36,6 +36,7 @@ public interface ICraftingMachine {
* @param patternDetails details of pattern
* @param table crafting table
* @param ejectionDirection ejection direction
*
* @return if it was accepted, all or nothing.
*/
boolean pushPattern(ICraftingPatternDetails patternDetails, CraftingInventory table, Direction ejectionDirection);
@@ -23,17 +23,17 @@
package appeng.api.implementations.tiles;
import net.minecraft.util.math.Direction;
import net.minecraft.util.Direction;
/**
* Crank/Crankable API,
* <p>
*
* Tiles that Implement this can receive power, from the crank, and have the
* crank placed on them.
* <p>
*
* Tiles that access other tiles that implement this method can act as Cranks.
* <p>
* This interface must be implemented by a block entity.
*
* This interface must be implemented by a tile entity.
*/
public interface ICrankable {
@@ -23,7 +23,7 @@
package appeng.api.implementations.tiles;
import alexiil.mc.lib.attributes.item.FixedItemInv;
import net.minecraftforge.items.IItemHandler;
public interface ISegmentedInventory {
@@ -33,7 +33,8 @@ public interface ISegmentedInventory {
* duplication.
*
* @param name inventory name
*
* @return inventory with inventory name
*/
FixedItemInv getInventoryByName(String name);
IItemHandler getInventoryByName(String name);
}
@@ -23,7 +23,7 @@
package appeng.api.implementations.tiles;
import alexiil.mc.lib.attributes.item.FixedItemInv;
import net.minecraftforge.items.IItemHandler;
public interface IViewCellStorage {
@@ -32,5 +32,5 @@ public interface IViewCellStorage {
*
* @return inventory with at least 5 slot
*/
FixedItemInv getViewCellStorage();
IItemHandler getViewCellStorage();
}
@@ -23,7 +23,7 @@
package appeng.api.movable;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
@@ -33,27 +33,28 @@ public interface IMovableHandler {
* if you return true from this, your saying you can handle the class, not that
* single entity, you cannot opt out of single entities.
*
* @param myClass block entity class
* @param tile block entity
* @param myClass tile entity class
* @param tile tile entity
*
* @return true if it can handle moving
*/
boolean canHandle(Class<? extends BlockEntity> myClass, BlockEntity tile);
boolean canHandle(Class<? extends TileEntity> myClass, TileEntity tile);
/**
* request that the handler move the the tile from its current location to the
* new one. the tile has already been invalidated, and the blocks have already
* been fully moved.
* <p>
*
* Potential Example:
*
* <pre>
* {
* &#064;code
* Chunk c = world.getChunk(x, z);
* Chunk c = world.getChunkAt(x, z);
* c.setChunkBlockTileEntity(x &amp; 0xF, y + y, z &amp; 0xF, tile);
*
* if (c.isChunkLoaded) {
* world.addBlockEntity(tile);
* world.addTileEntity(tile);
* world.markBlockForUpdate(x, y, z);
* }
* }
@@ -63,5 +64,5 @@ public interface IMovableHandler {
* @param world world of tile
* @param newPosition the new location
*/
void moveTile(BlockEntity tile, World world, BlockPos newPosition);
void moveTile(TileEntity tile, World world, BlockPos newPosition);
}
@@ -24,37 +24,37 @@
package appeng.api.movable;
import net.minecraft.block.Block;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.tileentity.TileEntity;
/**
* Used to determine if a tile is marked as movable, a block will be considered
* movable, if...
* <p>
*
* 1. The Tile or its super classes have been white listed with
* whiteListTileEntity.
* <p>
*
* 2. The Tile implements IMovableTile
* <p>
*
* 3. A IMovableHandler is register that returns canHandle = true for the
* {@link BlockEntity} subclass
* <p>
* <p>
* {@link TileEntity} subclass
*
*
* The movement process is as follows,
* <p>
*
* 1. IMovableTile.prepareToMove() or TileEntity.invalidate() depending on your
* opt-in method. 2. The tile will be removed from the world. 3. Its world,
* coordinates will be changed. *** this can be overridden with a
* IMovableHandler *** 4. It will then be re-added to the world, or a new world.
* 5. TileEntity.cancelRemoval() 6. IMovableTile.doneMoving ( if you implemented
* 5. TileEntity.validate() 6. IMovableTile.doneMoving ( if you implemented
* IMovableTile )
* <p>
*
* Please note, this is a 100% white list only feature, I will never opt in any
* non-vanilla, non-AE blocks. If you do not want to support your tiles being
* moved, you don't have to do anything.
* <p>
*
* I appreciate anyone that takes the effort to get their tiles to work with
* this system to create a better use experience.
* <p>
*
* If you need a build of deobf build of AE for testing, do not hesitate to ask.
*/
public interface IMovableRegistry {
@@ -67,25 +67,26 @@ public interface IMovableRegistry {
void blacklistBlock(Block blk);
/**
* White list your block entity with the registry.
* <p>
* White list your tile entity with the registry.
*
* If you tile is handled with IMovableHandler or IMovableTile you do not need
* to white list it.
*/
void whiteListBlockEntity(Class<? extends BlockEntity> c);
void whiteListTileEntity(Class<? extends TileEntity> c);
/**
* @param te to be moved block entity
* @param te to be moved tile entity
*
* @return true if the tile has accepted your request to move it
*/
boolean askToMove(BlockEntity te);
boolean askToMove(TileEntity te);
/**
* tells the tile you are done moving it.
*
* @param te moved block entity
* @param te moved tile entity
*/
void doneMoving(BlockEntity te);
void doneMoving(TileEntity te);
/**
* add a new handler movable handler.
@@ -97,13 +98,14 @@ public interface IMovableRegistry {
/**
* handlers are used to perform movement, this allows you to override AE's
* internal version.
* <p>
*
* only valid after askToMove(...) = true
*
* @param te block entity
* @return moving handler of block entity
* @param te tile entity
*
* @return moving handler of tile entity
*/
IMovableHandler getHandler(BlockEntity te);
IMovableHandler getHandler(TileEntity te);
/**
* @return a copy of the default handler
@@ -112,6 +114,7 @@ public interface IMovableRegistry {
/**
* @param blk block
*
* @return true if this block is blacklisted
*/
boolean isBlacklisted(Block blk);
@@ -28,9 +28,4 @@ public enum GridNotification {
* the visible connections for this node have changed, useful for cable.
*/
CONNECTIONS_CHANGED,
/**
* the owner of the grid node has changed, and the node needs to be re-saved
*/
OWNER_CHANGED
}
@@ -30,7 +30,7 @@ import appeng.api.util.IReadOnlyCollection;
/**
* Gives you access to Grid based information.
* <p>
*
* Don't Implement.
*/
public interface IGrid {
@@ -39,6 +39,7 @@ public interface IGrid {
* Get Access to various grid modules
*
* @param iface face
*
* @return the IGridCache you requested.
*/
@Nonnull
@@ -48,6 +49,7 @@ public interface IGrid {
* Post an event into the network event bus.
*
* @param ev - event to post
*
* @return returns ev back to original poster
*/
@Nonnull
@@ -57,6 +59,7 @@ public interface IGrid {
* Post an event into the network event bus, but direct it at a single node.
*
* @param ev event to post
*
* @return returns ev back to original poster
*/
@Nonnull
@@ -76,6 +79,7 @@ public interface IGrid {
* Get machines on the network.
*
* @param gridHostClass class of the grid host
*
* @return IMachineSet of all nodes belonging to hosts of specified class.
*/
@Nonnull
@@ -29,7 +29,7 @@ import javax.annotation.Nonnegative;
import javax.annotation.Nonnull;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.Direction;
import net.minecraft.util.Direction;
import appeng.api.parts.IPart;
import appeng.api.util.AEColor;
@@ -37,14 +37,14 @@ import appeng.api.util.DimensionalCoord;
/**
* An Implementation is required to create your node for IGridHost
* <p>
*
* Implement for use with IGridHost
*/
public interface IGridBlock {
/**
* how much power to drain per tick as part of idle network usage.
* <p>
*
* if the value of this changes, you must post a MENetworkPowerIdleChange
*
* @return ae/t to use.
@@ -87,8 +87,7 @@ public interface IGridBlock {
AEColor getGridColor();
/**
* Called by the {@link IGridNode} to notify its {@link IGridBlock} about
* events.
* Notifies your IGridBlock that changes were made to your connections
*/
void onGridNotification(@Nonnull GridNotification notification);
@@ -26,9 +26,9 @@ package appeng.api.networking;
import javax.annotation.Nonnull;
/**
* Allows you to create a network wide service, AE2 uses these for providing
* Allows you to create a network wise service, AE2 uses these for providing
* item, spatial, and tunnel services.
* <p>
*
* Any Class that implements this, should have a public default constructor that
* takes a single argument of type IGrid.
*/
@@ -42,7 +42,7 @@ public interface IGridCache {
/**
* inform your cache, that a machine was removed from the grid.
* <p>
*
* Important: Do not trust the grids state in this method, interact only with
* the node you are passed, if you need to manage other grid information, do it
* on the next updateTick.
@@ -54,7 +54,7 @@ public interface IGridCache {
/**
* informs you cache that a machine was added to the grid.
* <p>
*
* Important: Do not trust the grids state in this method, interact only with
* the node you are passed, if you need to manage other grid information, do it
* on the next updateTick.
@@ -45,6 +45,7 @@ public interface IGridCacheRegistry {
* requests a new INSTANCE of a grid cache for use, used internally
*
* @param grid grid
*
* @return a new Map of IGridCaches from the registry, called from IGrid when
* constructing a new grid.
*/
@@ -29,10 +29,10 @@ import appeng.api.util.AEPartLocation;
/**
* Access to AE's internal grid connections.
* <p>
*
* Messing with connection is generally completely unnecessary, you should be
* able to just use IGridNode.updateState() to have AE manage them for you.
* <p>
*
* Don't Implement.
*/
public interface IGridConnection {
@@ -41,6 +41,7 @@ public interface IGridConnection {
* lets you get the opposing node of the connection by passing your own node.
*
* @param gridNode current grid node
*
* @return the IGridNode which represents the opposite side of the connection.
*/
@Nonnull
@@ -50,6 +51,7 @@ public interface IGridConnection {
* determine the direction of the connection based on your node.
*
* @param gridNode current grid node
*
* @return the direction of the connection, only valid for in world connections.
*/
@Nonnull
@@ -39,11 +39,12 @@ public interface IGridHelper {
/**
* Create a grid node for your {@link IGridHost}
* <p>
*
* The passed {@link IGridBlock} represents the definition for properties like
* connectable sides. Refer to its documentation for further details.
*
* @param block grid block
*
* @return grid node of block
*/
@Nonnull
@@ -51,12 +52,13 @@ public interface IGridHelper {
/**
* Create a direct connection between two {@link IGridNode}.
* <p>
*
* This will be considered as having a distance of 1, regardless of the location
* of both nodes.
*
* @param a to be connected gridnode
* @param b to be connected gridnode
*
* @throws appeng.api.exceptions.FailedConnectionException
*/
@Nonnull
@@ -26,15 +26,15 @@ package appeng.api.networking;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.tileentity.TileEntity;
import appeng.api.parts.IPart;
import appeng.api.util.AECableType;
import appeng.api.util.AEPartLocation;
/**
* Implement to create a networked {@link BlockEntity} or {@link IPart} must be
* implemented for a part, or block entity to become part of a grid.
* Implement to create a networked {@link TileEntity} or {@link IPart} must be
* implemented for a part, or tile entity to become part of a grid.
*/
public interface IGridHost {
@@ -45,6 +45,7 @@ public interface IGridHost {
*
* @param dir feel free to ignore this, most blocks will use the same node for
* every side.
*
* @return a new IGridNode, create these with AEApi.INSTANCE().createGridNode(
* MyIGridBlock )
*/
@@ -27,8 +27,8 @@ import java.util.EnumSet;
import javax.annotation.Nonnull;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.WorldAccess;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.world.IWorld;
import appeng.api.IAppEngApi;
import appeng.api.util.AEPartLocation;
@@ -36,9 +36,9 @@ import appeng.api.util.IReadOnlyCollection;
/**
* Gives you a view into your Nodes connections and information.
* <p>
*
* updateState, getGrid, destroy are required to implement a proper IGridHost.
* <p>
*
* Don't Implement; Acquire from {@link IAppEngApi}.createGridNode
*/
public interface IGridNode {
@@ -54,10 +54,10 @@ public interface IGridNode {
/**
* inform the node that your IGridBlock has changed its internal state, and
* force the node to update.
* <p>
* ALWAYS make sure that your block entity is in the world, and has its node
*
* ALWAYS make sure that your tile entity is in the world, and has its node
* properly saved to be returned from the host before updating state,
* <p>
*
* If your entity is not in the world, or if you IGridHost returns a different
* node for the same side you will likely crash the game.
*/
@@ -89,7 +89,7 @@ public interface IGridNode {
* @return the world the node is located in
*/
@Nonnull
WorldAccess getWorld();
IWorld getWorld();
/**
* @return a set of the connected sides, INTERNAL represents an invisible
@@ -124,13 +124,13 @@ public interface IGridNode {
* this should be called for each node you create, if you have a nodeData
* compound to load from, you can store all your nods on a single compound using
* name.
* <p>
*
* Important: You must call this before updateState.
*
* @param name nbt name
* @param nodeData to be loaded data
*/
void loadFromNBT(@Nonnull String name, @Nonnull CompoundTag nodeData);
void loadFromNBT(@Nonnull String name, @Nonnull CompoundNBT nodeData);
/**
* this should be called for each node you maintain, you can save all your nodes
@@ -140,7 +140,7 @@ public interface IGridNode {
* @param name nbt name
* @param nodeData to be saved data
*/
void saveToNBT(@Nonnull String name, @Nonnull CompoundTag nodeData);
void saveToNBT(@Nonnull String name, @Nonnull CompoundNBT nodeData);
/**
* @return if the node's channel requirements are currently met, use this for
@@ -152,6 +152,7 @@ public interface IGridNode {
* see if this node has a certain flag
*
* @param flag flags
*
* @return true if has flag
*/
boolean hasFlag(@Nonnull GridFlags flag);
@@ -25,15 +25,15 @@ package appeng.api.networking;
import javax.annotation.Nonnull;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.CompoundNBT;
public interface IGridStorage {
/**
* @return an CompoundTag that can be read, and written too.
* @return an CompoundNBT that can be read, and written too.
*/
@Nonnull
CompoundTag dataObject();
CompoundNBT dataObject();
/**
* @return the id for this grid storage object, used internally
@@ -32,11 +32,12 @@ public interface IGridVisitor {
/**
* Called for each node on the network.
* <p>
*
* By returning false your informing the host to stop visiting nodes beyond the
* current node.
*
* @param n the current node.
*
* @return true to continue visiting nodes beyond this node.
*/
boolean visitNode(@Nonnull IGridNode n);
@@ -23,7 +23,7 @@
package appeng.api.networking.crafting;
import net.minecraft.text.Text;
import net.minecraft.util.text.ITextComponent;
import appeng.api.networking.security.IActionSource;
import appeng.api.networking.storage.IBaseMonitor;
@@ -54,5 +54,5 @@ public interface ICraftingCPU extends IBaseMonitor<IAEItemStack> {
/**
* @return a null or the name of the cpu.
*/
Text getName();
ITextComponent getName();
}
@@ -42,6 +42,7 @@ public interface ICraftingGrid extends IGridCache {
* @param world crafting world
* @param slot slot index
* @param details pattern details
*
* @return a collection of crafting patterns for the item in question.
*/
ImmutableCollection<ICraftingPatternDetails> getCraftingFor(IAEItemStack whatToCraft,
@@ -55,6 +56,7 @@ public interface ICraftingGrid extends IGridCache {
* @param actionSrc source
* @param craftWhat result
* @param callback callback -- optional
*
* @return a future which will at an undetermined point in the future get you
* the {@link ICraftingJob} do not wait on this, your be waiting
* forever.
@@ -77,6 +79,7 @@ public interface ICraftingGrid extends IGridCache {
* this will be used for extracting items, should
* usually be the same as the one provided to
* beginCraftingJob.
*
* @return null ( if failed ) or an {@link ICraftingLink} other wise, if you
* send requestingMachine you need to properly keep track of this and
* handle the nbt saving and loading of the object as well as the
@@ -93,6 +96,7 @@ public interface ICraftingGrid extends IGridCache {
/**
* @param what to be requested item
*
* @return true if the item can be requested via a crafting emitter.
*/
boolean canEmitFor(IAEItemStack what);
@@ -101,6 +105,7 @@ public interface ICraftingGrid extends IGridCache {
* is this item being crafted?
*
* @param what item being crafted
*
* @return true if it is being crafting
*/
boolean isRequesting(IAEItemStack what);
@@ -109,6 +114,7 @@ public interface ICraftingGrid extends IGridCache {
* The total amount being requested across all crafting cpus of a grid.
*
* @param what item being requested, ignores stacksize
*
* @return The total amount being requested.
*/
long requesting(IAEItemStack what);
@@ -23,7 +23,7 @@
package appeng.api.networking.crafting;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.CompoundNBT;
public interface ICraftingLink {
@@ -53,7 +53,7 @@ public interface ICraftingLink {
*
* @param tag to be written data
*/
void writeToNBT(CompoundTag tag);
void writeToNBT(CompoundNBT tag);
/**
* @return the crafting ID for this link.
@@ -37,6 +37,7 @@ public interface ICraftingMedium {
*
* @param patternDetails details
* @param table crafting table
*
* @return if the pattern was successfully pushed.
*/
boolean pushPattern(ICraftingPatternDetails patternDetails, CraftingInventory table);
@@ -49,6 +49,7 @@ public interface ICraftingPatternDetails {
* @param slotIndex specific slot index
* @param itemStack item in slot
* @param world crafting world
*
* @return if an item can be used in the specific slot for this pattern.
*/
boolean isValidItemForSlot(int slotIndex, ItemStack itemStack, World world);
@@ -69,7 +70,7 @@ public interface ICraftingPatternDetails {
* The list will be sorted in descending order by stack size. However there is
* no guarantee about maintaining the placement order of the inputs in case of
* equal values.
*
*
* @return an immutable list of inputs without nulls
*/
List<IAEItemStack> getInputs();
@@ -80,11 +81,11 @@ public interface ICraftingPatternDetails {
* <p>
* This should be the preferred way to deal with the list of outputs.
* <p>
* <p>
*
* The list will be sorted in descending order by stack size. However there is
* no guarantee about maintaining the placement order of the outputs in case of
* equal values.
*
*
* @return an immutable list of outputs without nulls
*/
List<IAEItemStack> getOutputs();
@@ -100,7 +101,7 @@ public interface ICraftingPatternDetails {
* <p>
* This can return a copy from the internal structure, so there are no
* guarantees about modifications.
*
*
* @return a list of the inputs, will include nulls.
*/
IAEItemStack[] getSparseInputs();
@@ -116,7 +117,7 @@ public interface ICraftingPatternDetails {
* <p>
* This can return a copy from the internal structure, so there are no
* guarantees about modifications.
*
*
* @return a list of the outputs, will include nulls.
*/
IAEItemStack[] getSparseOutputs();
@@ -132,6 +133,7 @@ public interface ICraftingPatternDetails {
*
* @param craftingInv inventory
* @param world crafting world
*
* @return the crafted ( work bench ) item.
*/
ItemStack getOutput(CraftingInventory craftingInv, World world);
@@ -34,7 +34,7 @@ public interface ICraftingProviderHelper {
/**
* Add new Pattern to AE's crafting cache.
* <p>
*
* This will only accept instances created by
* {@link ICraftingHelper#decodePattern(net.minecraft.item.ItemStack, net.minecraft.world.World)}
*/
@@ -45,6 +45,7 @@ public interface ICraftingRequester extends IActionHost {
*
* @param items item
* @param mode action mode
*
* @return unwanted item
*/
IAEItemStack injectCraftedItems(ICraftingLink link, IAEItemStack items, Actionable mode);
@@ -52,7 +53,7 @@ public interface ICraftingRequester extends IActionHost {
/**
* called when the job changes from in progress, to either complete, or
* canceled.
* <p>
*
* after this call the crafting link is "dead" and should be discarded.
*/
void jobStateChange(ICraftingLink link);
@@ -27,13 +27,13 @@ import appeng.api.storage.data.IAEStack;
/**
* DO NOT IMPLEMENT.
* <p>
*
* Will be injected when adding an {@link ICraftingWatcherHost} to a grid.
*/
public interface ICraftingWatcher {
/**
* Add a specific {@link IAEStack} to watch.
* <p>
*
* Supports multiple values, duplicate ones will not be added.
*
* @param stack
@@ -41,6 +41,7 @@ public interface IAEPowerStorage extends IEnergySource {
*
* @param amt to be injected amount
* @param mode action mode
*
* @return amount of power which was unable to be stored
*/
double injectAEPower(double amt, @Nonnull Actionable mode);
@@ -74,16 +75,16 @@ public interface IAEPowerStorage extends IEnergySource {
/**
* The priority to use this energy storage.
* <p>
*
* A higher value means it is more likely to be extracted from first, and less
* likely to be inserted into first.
* <p>
*
* The value needs to be constant once added to a {@link IGrid}. Should it ever
* need to be changed, it has to be removed from the grid, then update the
* value, and finally added back to the grid.
* <p>
*
* This should never use {@link Integer#MIN_VALUE} or {@link Integer#MAX_VALUE}.
*
*
* @return the priority for this storage
*/
default int getPriority() {
@@ -61,7 +61,7 @@ public interface IEnergyGrid extends IGridCache, IEnergySource, IEnergyGridProvi
* condenses this into a single operation that determines the networks "powered
* state" if the network is considered off-line, your machines should not
* function.
* <p>
*
* {@link MENetworkPowerStatusChange} events are posted when this value changes
* if you need to be notified of the change, most machines can simply test the
* value when they operate.
@@ -73,20 +73,21 @@ public interface IEnergyGrid extends IGridCache, IEnergySource, IEnergyGridProvi
/**
* AE will accept any power, and store it, to maintain sanity please don't send
* more then 10,000 at a time.
* <p>
*
* IMPORTANT: Network power knows no bounds, for less spamy power flow, networks
* can store more then their allotted storage, however, it should be kept to a
* minimum, to help with this, this method returns the networks current
* OVERFLOW, this is not energy you can store some where else, its already
* stored in the network, you can extract it if you want, however it it owned by
* the network, this is different then IAEEnergyStore
* <p>
*
* Another important note, is that if a network that had overflow is deleted,
* its power is gone, this is one of the reasons why keeping overflow to a
* minimum is important.
*
* @param amt power to inject into the network
* @param mode should the action be simulated or performed?
*
* @return the amount of power that the network has OVER the limit.
*/
@Nonnegative
@@ -36,15 +36,15 @@ import appeng.api.config.Actionable;
public interface IEnergyGridProvider {
/**
* internal use only
* <p>
*
* Can return a list of providers behind the current.
* <p>
*
* An example would be something acting as proxy between different
* {@link IEnergyGrid}s.
* <p>
*
* This can contain duplicate entries, AE will ensure that each provider is only
* visited once.
* <p>
*
* internal use only
*/
@Nonnull
@@ -52,9 +52,9 @@ public interface IEnergyGridProvider {
/**
* internal use only
* <p>
*
* Extracts the requested amount from the provider.
* <p>
*
* This should never forward a call to another {@link IEnergyGridProvider},
* instead return them via {@link IEnergyGridProvider#providers()}
*
@@ -65,10 +65,10 @@ public interface IEnergyGridProvider {
/**
* Injects the offered amount into the provider.
* <p>
*
* This should never forward a call to another {@link IEnergyGridProvider},
* instead return them via {@link IEnergyGridProvider#providers()}
* <p>
*
* internal use only
*
* @return the leftover amount
@@ -78,12 +78,13 @@ public interface IEnergyGridProvider {
/**
* internal use only
* <p>
*
* Returns the current demand of an provider.
* <p>
*
* This should never forward a call to another {@link IEnergyGridProvider},
* instead return them via {@link IEnergyGridProvider#providers()}
*
*
* @param d the max amount offered, the demand should never exceed it.
* @return the total amount demanded
*/
@@ -92,29 +93,31 @@ public interface IEnergyGridProvider {
/**
* internal use only
* <p>
*
* AE currently uses this to enqueue the next visited provider.
* <p>
*
* There is no guarantee that this works on in a perfect way. It can be limited
* to the returns of the past {@link IEnergyGridProvider#providers()}, but not
* any future one discovered by visiting further providers.
* <p>
*
* E.g. inject into the the lowest one first or extract from the highest one.
*
* @return the current stored amount.
*
*
*/
@Nonnegative
double getProviderStoredEnergy();
/**
* internal use only
* <p>
*
* AE currently uses this to enqueue the next visited provider.
* <p>
*
* There is no guarantee that this works on in a perfect way. It can be limited
* to the returns of the past {@link IEnergyGridProvider#providers()}, but not
* any future one discovered by visiting further providers.
* <p>
*
* E.g. inject into the the lowest one first or extract from the highest one.
*
* @return the maximum amount stored.
@@ -36,6 +36,7 @@ public interface IEnergySource {
*
* @param amt extracted power
* @param mode should the action be simulated or performed?
*
* @return returns extracted power.
*/
@Nonnegative
@@ -27,13 +27,13 @@ import javax.annotation.Nonnegative;
/**
* DO NOT IMPLEMENT.
* <p>
*
* Will be injected when adding an {@link IEnergyWatcherHost} to a grid.
*/
public interface IEnergyWatcher {
/**
* Add a specific threshold to watch.
* <p>
*
* Supports multiple values, duplicate ones will not be added.
*
* @param amount
@@ -28,7 +28,7 @@ import appeng.api.networking.IGridNode;
/**
* Posted by the network when the booting status of the network goes up or down,
* the change is reflected via {@link IGridNode}.isActive()
* <p>
*
* Note: Most machines just need to check {@link IGridNode}.isActive()
*/
public class MENetworkBootingStatusChange extends MENetworkEvent {
@@ -25,10 +25,10 @@ package appeng.api.networking.events;
/**
* Posted by storage devices to inform AE to refresh its storage structure.
* <p>
*
* This is done in cases such as a storage cell being removed or added to a
* drive.
* <p>
*
* you do not need to send this event when your node is added / removed from the
* grid.
*/
@@ -28,7 +28,7 @@ import appeng.api.networking.IGridHost;
/**
* Posted to the {@link IGridHost} when the channels on the node connections are
* altered.
* <p>
*
* Never posted IGridCaches.
*/
public class MENetworkChannelsChanged extends MENetworkEvent {
@@ -27,7 +27,7 @@ import appeng.api.networking.IGrid;
/**
* Part of AE's Event Bus.
* <p>
*
* Posted via {@link IGrid}.postEvent or {@link IGrid}.postEventTo
*/
public class MENetworkEvent {

Some files were not shown because too many files have changed in this diff Show More