Compare commits

..

6 Commits

Author SHA1 Message Date
PrototypeTrousers 7d1c502b41 workss 2022-04-04 15:44:22 -03:00
PrototypeTrousers 63653c1833 added packets for missing items report 2022-04-04 03:55:51 -03:00
PrototypeTrousers 6cadfbdcdc 3 2022-04-01 19:30:18 -03:00
PrototypeTrousers d054c6ab91 2 2022-04-01 19:30:18 -03:00
PrototypeTrousers 234b1c5dc6 meh. crafting gets stuck if the output loops 2022-04-01 19:30:18 -03:00
PrototypeTrousers 8cc29734a2 positive loop support 2022-04-01 19:30:18 -03:00
1225 changed files with 110889 additions and 99051 deletions
-25
View File
@@ -1,25 +0,0 @@
name: Build mod
on: [ push, pull_request, workflow_dispatch ]
jobs:
build:
name: Build mod
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v2
with:
distribution: 'adopt'
java-version: '8'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew -Pnet.minecraftforge.gradle.disableUpdateChecker=true build
- name: Upload artifacts
uses: actions/upload-artifact@v2
with:
name: appliedenergistics2
path: build/libs
+15
View File
@@ -0,0 +1,15 @@
name: 'Lock threads'
on:
schedule:
- cron: '0 0 * * *'
jobs:
lock:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v2
with:
github-token: ${{ github.token }}
issue-lock-inactive-days: '180'
pr-lock-inactive-days: '180'
-1
View File
@@ -8,7 +8,6 @@
!gradlew.bat !gradlew.bat
!build.gradle !build.gradle
!gradle.properties !gradle.properties
!settings.gradle
!.travis.yml !.travis.yml
# include markdowns # include markdowns
+6 -9
View File
@@ -1,21 +1,17 @@
This is a fork of AE2 i made for trying to solve issues for the [Omnifactory](https://www.curseforge.com/minecraft/modpacks/omnifactory) modpack. This is a fork of AE2 i made for trying to solve issues for the [Omnifactory](https://www.curseforge.com/minecraft/modpacks/omnifactory) modpack.
See [AE2-Omnifactory](https://github.com/PrototypeTrousers/Applied-Energistics-2/tree/AE2-Omnifactory) branch for commits and [Releases](https://github.com/PrototypeTrousers/Applied-Energistics-2/releases) for the compiled jars. See https://github.com/PrototypeTrousers/Applied-Energistics-2/tree/AE2-Omnifactory branch for commits
and
https://github.com/PrototypeTrousers/Applied-Energistics-2/releases for the compiled jars.
# Applied Energistics 2 (PrototypeTrousers fork for Omnifactory) # Applied Energistics 2 (PrototypeTrousers fork for Omnifactory)
## About ## About
A Mod about Matter, Energy and using them to conquer the world.
## RecipeStages A Mod about Matter, Energy and using them to conquer the world..
You need to add the following into a CraftTweaker script:
```
mods.recipestages.Recipes.setPackageStage("appeng", allStages);
```
The second argument allows you to customize which stages exactly you want to be craftable with AE2. Idk why would you like to restrict any, but you can.
## License ## License
* Applied Energistics 2 API * Applied Energistics 2 API
- (c) 2013 - 2018 AlgorithmX2 et al - (c) 2013 - 2018 AlgorithmX2 et al
- [![License](https://img.shields.io/badge/License-MIT-red.svg?style=flat-square)](http://opensource.org/licenses/MIT) - [![License](https://img.shields.io/badge/License-MIT-red.svg?style=flat-square)](http://opensource.org/licenses/MIT)
@@ -29,6 +25,7 @@ The second argument allows you to customize which stages exactly you want to be
- [![License](https://img.shields.io/badge/License-No%20Restriction-green.svg?style=flat-square)](https://creativecommons.org/publicdomain/zero/1.0/) - [![License](https://img.shields.io/badge/License-No%20Restriction-green.svg?style=flat-square)](https://creativecommons.org/publicdomain/zero/1.0/)
## Credits ## Credits
Thanks to Thanks to
* Notch et al for Minecraft * Notch et al for Minecraft
+79 -985
View File
File diff suppressed because it is too large Load Diff
+5 -119
View File
@@ -3,6 +3,8 @@ aechannel=stable
aebuild=7 aebuild=7
aegroup=appeng aegroup=appeng
aebasename=appliedenergistics2 aebasename=appliedenergistics2
extended=extended_life
extendedversion=v52b
######################################################### #########################################################
# Versions # # Versions #
######################################################### #########################################################
@@ -20,7 +22,9 @@ jei_version=4.16.1.302
tesla_version=1.0.63 tesla_version=1.0.63
ic2_version=2.8.73-ex112 ic2_version=2.8.73-ex112
top_version=1.12-1.4.23-16 top_version=1.12-1.4.23-16
crafttweaker_version=4.1.20.684 cofhcore_version=1.12.2-4.5.2.19
crafttweaker_version=4.1.8.9
inventorytweaks_version=1.63
ctm_version=MC1.12.2-0.3.1.16 ctm_version=MC1.12.2-0.3.1.16
forestry_version=5.8.2.387 forestry_version=5.8.2.387
######################################################### #########################################################
@@ -28,121 +32,3 @@ forestry_version=5.8.2.387
######################################################### #########################################################
website_version=1.12.2 website_version=1.12.2
curse_versions=1.12.2 curse_versions=1.12.2
mapping_channel=snapshot
mapping_version=20171003
# Run Configurations
minecraft_username=Developer
extra_jvm_args=
modName=Applied Energistics 2
# This is a case-sensitive string to identify your mod. Convention is to use lower case.
modId=appliedenergistics2
modGroup=appeng
# Version of your mod.
# This field can be left empty if you want your mod's version to be determined by the latest git tag instead.
modVersion=rv6-stable-7-extended_life-v0.55.21
# Whether to use the old jar naming structure (modid-mcversion-version) instead of the new version (modid-version)
includeMCVersionJar=false
# The name of your jar when you produce builds, not including any versioning info
modArchivesBaseName=appliedenergistics2
# Will update your build.gradle automatically whenever an update is available
autoUpdateBuildScript=false
minecraftVersion=1.12.2
# Select a username for testing your mod with breakpoints. You may leave this empty for a random username each time you
# restart Minecraft in development. Choose this dependent on your mod:
# Do you need consistent player progressing (for example Thaumcraft)? -> Select a name
# Do you need to test how your custom blocks interacts with a player that is not the owner? -> leave name empty
# Alternatively this can be set with the 'DEV_USERNAME' environment variable.
developmentEnvironmentUserName=Developer
# Enables using modern java syntax (up to version 17) via Jabel, while still targeting JVM 8.
# See https://github.com/bsideup/jabel for details on how this works.
# Using this requires that you use a Java 17 JDK for development.
enableModernJavaSyntax=true
# Generate a class with String fields for the mod id, name and version named with the fields below
generateGradleTokenClass=appeng.Tags
gradleTokenModId=
gradleTokenModName=
gradleTokenVersion=VERSION
# In case your mod provides an API for other mods to implement you may declare its package here. Otherwise, you can
# leave this property empty.
# Example value: apiPackage = api + modGroup = com.myname.mymodid -> com.myname.mymodid.api
apiPackage=api
# Specify the configuration file for Forge's access transformers here. It must be placed into /src/main/resources/
# There can be multiple files in a comma-separated list.
# Example value: mymodid_at.cfg,jei_at.cfg
accessTransformersFile=appliedenergistics2_at.cfg
# Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled!
usesMixins=false
# Specify the package that contains all of your Mixins. You may only place Mixins in this package or the build will fail!
mixinsPackage=
# Specify the core mod entry class if you use a core mod. This class must implement IFMLLoadingPlugin!
# Example value: coreModClass = asm.FMLPlugin + modGroup = com.myname.mymodid -> com.myname.mymodid.asm.FMLPlugin
coreModClass=core.AE2ELCore
# If your project is only a consolidation of mixins or a core mod and does NOT contain a 'normal' mod (meaning that
# there is no class annotated with @Mod) you want this to be true. When in doubt: leave it on false!
containsMixinsAndOrCoreModOnly=false
# Enables Mixins even if this mod doesn't use them, useful if one of the dependencies uses mixins.
forceEnableMixins=false
# Adds CurseMaven, Modrinth Maven, BlameJared maven, and some more well-known 1.12.2 repositories
includeWellKnownRepositories=true
# Adds JEI and TheOneProbe to your development environment. Adds them as 'implementation', meaning they will
# be available at compiletime and runtime for your mod (in-game and in-code).
# Overrides the above setting to be always true, as these repositories are needed to fetch the mods
includeCommonDevEnvMods=true
# If enabled, you may use 'shadowCompile' for dependencies. They will be integrated in your jar. It is your
# responsibility check the licence and request permission for distribution, if required.
usesShadowedDependencies=false
# If disabled, won't remove unused classes from shaded dependencies. Some libraries use reflection to access
# their own classes, making the minimization unreliable.
minimizeShadowedDependencies=true
# If disabled, won't rename the shadowed classes.
relocateShadowedDependencies=true
# Publishing to modrinth requires you to set the MODRINTH_API_KEY environment variable to your current modrinth API token.
# The project's ID on Modrinth. Can be either the slug or the ID.
# Leave this empty if you don't want to publish on Modrinth.
# Alternatively this can be set with the 'MODRINTH_PROJECT_ID' environment variable.
modrinthProjectId=
# The project's relations on Modrinth. You can use this to refer to other projects on Modrinth.
# Syntax: scope1-type1:name1;scope2-type2:name2;...
# Where scope can be one of [required, optional, incompatible, embedded],
# type can be one of [project, version],
# and the name is the Modrinth project or version slug/id of the other mod.
# Example: required-project:jei;optional-project:top;incompatible-project:gregtech
modrinthRelations=
# Publishing to CurseForge requires you to set the CURSEFORGE_API_KEY environment variable to one of your CurseForge API tokens.
# The project's numeric ID on CurseForge. You can find this in the About Project box.
# Leave this empty if you don't want to publish on CurseForge.
# Alternatively this can be set with the 'CURSEFORGE_PROJECT_ID' environment variable.
curseForgeProjectId=
# The project's relations on CurseForge. You can use this to refer to other projects on CurseForge.
# Syntax: type1:name1;type2:name2;...
# Where type can be one of [requiredDependency, embeddedLibrary, optionalDependency, tool, incompatible],
# and the name is the CurseForge project slug of the other mod.
# Example: requiredDependency:railcraft;embeddedLibrary:cofhlib;incompatible:buildcraft
curseForgeRelations=
# This project's release type on CurseForge and/or Modrinth
# Allowed types: release, beta, alpha
releaseType=beta
# Generate a default changelog for releases. Requires git to be installed, as it uses it to generate a changelog of
# commits since the last tagged release.
generateDefaultChangelog=false
# Prevent the source code from being published
noPublishedSources=false
# Enable spotless checks
# Enforces code formatting on your source code
# By default this will use the files found here: https://github.com/GregTechCEu/Buildscripts/tree/master/spotless
# to format your code. However, you can create your own version of these files and place them in your project's
# root directory to apply your own formatting options instead.
enableSpotless=false
# Enable JUnit testing platform used for testing your code.
# Uses JUnit 5. See guide and documentation here: https://junit.org/junit5/docs/current/user-guide/
enableJUnit=true
# Deployment debug setting
# Uncomment this to test deployments to CurseForge and Modrinth
# Alternatively, you can set the 'DEPLOYMENT_DEBUG' environment variable.
deploymentDebug=false
# Gradle Settings
# Effectively applies the '--stacktrace' flag by default
org.gradle.logging.stacktrace=all
# Sets default memory used for gradle commands. Can be overridden by user or command line properties.
# This is required to provide enough memory for the Minecraft decompilation process.
org.gradle.jvmargs=-Xmx3G
+67
View File
@@ -0,0 +1,67 @@
/*
* 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>.
*/
// Suppresses warnings/errors when building javadocs
allprojects {
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
}
}
javadoc {
options.encoding = 'UTF-8'
options.charSet = 'UTF-8'
}
task javadocs(type: Javadoc) {
source = sourceSets.api.java
include "appeng/api/**"
// Due to ForgeGradle having to be a special snowflake,
// we have to add some custom configurations to the normal compile configuration and hope it does not break.
classpath = configurations.compile + configurations.forgeGradleMc + configurations.forgeGradleMcDeps
}
task javadocJar(type: Jar, dependsOn: javadocs) {
from javadoc.destinationDir
classifier = 'javadoc'
}
task apiJar(type: Jar) {
from sourceSets.api.java
include "appeng/api/**"
from sourceSets.api.output
include "appeng/api/**"
classifier = 'api'
}
task sourceJar(type: Jar, overwrite: true) {
from sourceSets.api.allSource
from sourceSets.main.allSource
classifier = 'sources'
}
artifacts {
archives apiJar
archives javadocJar
archives sourceJar
}
+19 -31
View File
@@ -19,15 +19,6 @@
repositories { repositories {
mavenLocal() mavenLocal()
maven {
url "https://cursemaven.com"
}
maven {
name = "CurseForge"
url = "https://minecraft.curseforge.com/api/maven/"
}
maven { maven {
name "Mobius" name "Mobius"
url "http://mobiusstrip.eu/maven" url "http://mobiusstrip.eu/maven"
@@ -38,6 +29,11 @@ repositories {
url "http://dvs1.progwml6.com/files/maven" url "http://dvs1.progwml6.com/files/maven"
} }
maven {
name = "Tesla repo"
url "https://maven.mcmoddev.com"
}
maven { maven {
name "Ellpeck" name "Ellpeck"
url "https://maven.ellpeck.de" url "https://maven.ellpeck.de"
@@ -72,6 +68,11 @@ repositories {
// name 'modmaven' // name 'modmaven'
// url "https://modmaven.k-4u.nl/" // url "https://modmaven.k-4u.nl/"
//} //}
maven {
name = "CurseForge"
url = "https://minecraft.curseforge.com/api/maven/"
}
} }
configurations { configurations {
@@ -79,42 +80,29 @@ configurations {
} }
dependencies { dependencies {
// deobfCompile "gregtechce:gregtech:1.12.2:1.15.1.735" deobfCompile "gregtechce:gregtech:1.12.2:1.15.1.735"
// installable runtime dependencies // installable runtime dependencies
implementation rfg.deobf("curse.maven:gregtechceu-557242:4429261") mods "mcp.mobius.waila:Hwyla:${hwyla_version}"
compileOnly "curse.maven:chisel-235279:2915375"
implementation rfg.deobf("curse.maven:baubles-227083:2518667")
//mods "mcp.mobius.waila:Hwyla:${hwyla_version}"
mods "curse.maven:hwyla-253449:2568751"
mods "net.industrial-craft:industrialcraft-2:${ic2_version}:dev" mods "net.industrial-craft:industrialcraft-2:${ic2_version}:dev"
mods "mcjty.theoneprobe:TheOneProbe-${minecraft_version}:${top_version}" mods "mcjty.theoneprobe:TheOneProbe-${minecraft_version}:${top_version}"
// compile against provided APIs // compile against provided APIs
compileOnly "mezz.jei:jei_${minecraft_version}:${jei_version}:api" compileOnly "mezz.jei:jei_${minecraft_version}:${jei_version}:api"
//compileOnly "mcp.mobius.waila:Hwyla:${hwyla_version}" compileOnly "mcp.mobius.waila:Hwyla:${hwyla_version}"
compileOnly "curse.maven:hwyla-253449:2568751"
//Code chicken lib, GTCE dependency
implementation rfg.deobf("curse.maven:CCL-242818:2779848")
compileOnly "curse.maven:recipe-stages-280554:3405072"
compileOnly "curse.maven:item-stages-280316:2696769"
compileOnly "curse.maven:game-stages-268655:2951844"
compileOnly "net.darkhax.tesla:Tesla-1.12.2:${tesla_version}" compileOnly "net.darkhax.tesla:Tesla-1.12.2:${tesla_version}"
compileOnly "net.industrial-craft:industrialcraft-2:${ic2_version}:api" compileOnly "net.industrial-craft:industrialcraft-2:${ic2_version}:api"
compileOnly "mcjty.theoneprobe:TheOneProbe-1.12:${top_version}:api" compileOnly "mcjty.theoneprobe:TheOneProbe-1.12:${top_version}:api"
compileOnly "curse.maven:CoFHCore-69162:2920433" compileOnly "cofh:CoFHCore:${cofhcore_version}:deobf"
compileOnly "CraftTweaker2:CraftTweaker2-API:${crafttweaker_version}" compileOnly "CraftTweaker2:CraftTweaker2-API:${crafttweaker_version}"
compileOnly "curse.maven:inventory-tweaks-223094:2482482" compileOnly "inventory-tweaks:InventoryTweaks:${inventorytweaks_version}:api"
compileOnly "curse.maven:inventory-bogo-sorter-632327:4399738"
compileOnly "team.chisel.ctm:CTM:${ctm_version}" compileOnly "team.chisel.ctm:CTM:${ctm_version}"
compileOnly "de.ellpeck.actuallyadditions:ActuallyAdditions:1.12.2-r152.16:api" compileOnly "de.ellpeck.actuallyadditions:ActuallyAdditions:1.12.2-r152.16:api"
implementation rfg.deobf("net.sengir.forestry:forestry_${minecraft_version}:$forestry_version") deobfCompile "net.sengir.forestry:forestry_${minecraft_version}:$forestry_version"
// at runtime, use the full JEI jar // at runtime, use the full JEI jar
runtimeOnly "mezz.jei:jei_${minecraft_version}:${jei_version}" runtime "mezz.jei:jei_${minecraft_version}:${jei_version}"
// unit test dependencies // unit test dependencies
testImplementation "junit:junit:4.12" testCompile "junit:junit:4.12"
} }
+19 -18
View File
@@ -16,39 +16,40 @@
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>. * along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
*/ */
// HWYLA task wrapper(type: Wrapper) {
tasks.register('installHwyla', Copy) { gradleVersion = "2.14"
dependsOn "deinstallHwyla"
from { configurations.mods }
include "**/*Hwyla*.jar"
into file("/run/mods")
} }
tasks.register('deinstallHwyla', Delete) { // HWYLA
delete fileTree(dir: "/run/mods", include: "*Hwyla*.jar") task installHwyla(type: Copy, dependsOn: "deinstallHwyla") {
from { configurations.mods }
include "**/*Hwyla*.jar"
into file(minecraft.runDir + "/mods")
}
task deinstallHwyla(type: Delete) {
delete fileTree(dir: minecraft.runDir + "/mods", include: "*Hwyla*.jar")
} }
// IC2 // IC2
tasks.register('installIC2', Copy) { task installIC2(type: Copy, dependsOn: "deinstallIC2") {
dependsOn "deinstallIC2"
from { configurations.mods } from { configurations.mods }
include "**/*industrialcraft-2*.jar" include "**/*industrialcraft-2*.jar"
into file("/run/mods") into file(minecraft.runDir + "/mods")
} }
tasks.register('deinstallIC2', Delete) { task deinstallIC2(type: Delete) {
delete fileTree(dir: "/run/mods", include: "*industrialcraft-2*.jar") delete fileTree(dir: minecraft.runDir + "/mods", include: "*industrialcraft-2*.jar")
} }
// TOP // TOP
tasks.register('installTop', Copy) { task installTop(type: Copy, dependsOn: ["deinstallTop"]) {
dependsOn["deinstallTop"]
from { configurations.mods } from { configurations.mods }
include "**/*TheOneProbe*.jar" include "**/*TheOneProbe*.jar"
into file("/run/mods") into file(minecraft.runDir + "/mods")
} }
tasks.register('deinstallTop', Delete) { task deinstallTop(type: Delete) {
delete fileTree(dir: "/run/mods", include: "*TheOneProbe*.jar") delete fileTree(dir: minecraft.runDir + "/mods", include: "*TheOneProbe*.jar")
} }
Binary file not shown.
+1 -2
View File
@@ -1,6 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-all.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.8-bin.zip
Vendored
+110 -182
View File
@@ -1,129 +1,78 @@
#!/bin/sh #!/usr/bin/env sh
#
# Copyright © 2015-2021 the original 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 POSIX generated by Gradle. ## Gradle start up script for UN*X
# ##
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
############################################################################## ##############################################################################
# Attempt to set APP_HOME # Attempt to set APP_HOME
# Resolve links: $0 may be a link # Resolve links: $0 may be a link
app_path=$0 PRG="$0"
# Need this for relative symlinks.
# Need this for daisy-chained symlinks. while [ -h "$PRG" ] ; do
while ls=`ls -ld "$PRG"`
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path link=`expr "$ls" : '.*-> \(.*\)$'`
[ -h "$app_path" ] if expr "$link" : '/.*' > /dev/null; then
do PRG="$link"
ls=$( ls -ld "$app_path" ) else
link=${ls#*' -> '} PRG=`dirname "$PRG"`"/$link"
case $link in #( fi
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
# This is normally unused APP_NAME="Gradle"
# shellcheck disable=SC2034 APP_BASE_NAME=`basename "$0"`
APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. # 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. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD="maximum"
warn () { warn () {
echo "$*" echo "$*"
} >&2 }
die () { die () {
echo echo
echo "$*" echo "$*"
echo echo
exit 1 exit 1
} >&2 }
# OS specific support (must be 'true' or 'false'). # OS specific support (must be 'true' or 'false').
cygwin=false cygwin=false
msys=false msys=false
darwin=false darwin=false
nonstop=false nonstop=false
case "$( uname )" in #( case "`uname`" in
CYGWIN* ) cygwin=true ;; #( CYGWIN* )
Darwin* ) darwin=true ;; #( cygwin=true
MSYS* | MINGW* ) msys=true ;; #( ;;
NONSTOP* ) nonstop=true ;; Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM. # Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables # IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java JAVACMD="$JAVA_HOME/jre/sh/java"
else else
JAVACMD=$JAVA_HOME/bin/java JAVACMD="$JAVA_HOME/bin/java"
fi fi
if [ ! -x "$JAVACMD" ] ; then if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -132,7 +81,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi fi
else else
JAVACMD=java JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the Please set the JAVA_HOME variable in your environment to match the
@@ -140,105 +89,84 @@ location of your Java installation."
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
case $MAX_FD in #( MAX_FD_LIMIT=`ulimit -H -n`
max*) if [ $? -eq 0 ] ; then
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
# shellcheck disable=SC3045 MAX_FD="$MAX_FD_LIMIT"
MAX_FD=$( ulimit -H -n ) || fi
warn "Could not query maximum file descriptor limit" ulimit -n $MAX_FD
esac if [ $? -ne 0 ] ; then
case $MAX_FD in #( warn "Could not set maximum file descriptor limit: $MAX_FD"
'' | soft) :;; #( fi
*) else
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
# shellcheck disable=SC3045 fi
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi fi
# Collect all arguments for the java command, stacking in reverse order: # For Darwin, add options to specify how the application appears in the dock
# * args from the command line if $darwin; then
# * the main class name GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but # For Cygwin, switch paths to Windows format before running java
# possibly modified. if $cygwin ; then
# APP_HOME=`cygpath --path --mixed "$APP_HOME"`
# NB: a `for` loop captures its iteration list before it begins, so CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
# changing the positional parameters here affects neither the number of JAVACMD=`cygpath --unix "$JAVACMD"`
# iterations, nor the values presented in `arg`.
shift # remove old arg # We build the pattern for arguments to be converted via cygpath
set -- "$@" "$arg" # push replacement arg ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
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" ;;
esac
fi fi
# Collect all arguments for the java command; # Escape application args
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of save () {
# shell script including quotes and variable substitutions, so put them in for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
# double quotes to make sure that they get re-expanded; and echo " "
# * put everything else in single quotes, so that it's not re-expanded. }
APP_ARGS=$(save "$@")
set -- \ # Collect all arguments for the java command, following the shell quoting and substitution rules
"-Dorg.gradle.appname=$APP_BASE_NAME" \ eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available. # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if ! command -v xargs >/dev/null 2>&1 if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
then cd "$(dirname "$0")"
die "xargs is not available"
fi fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@" exec "$JAVACMD" "$@"
-26
View File
@@ -1,26 +0,0 @@
pluginManagement {
repositories {
maven {
// RetroFuturaGradle
name 'GTNH Maven'
//noinspection HttpUrlsUsage
url 'http://jenkins.usrv.eu:8081/nexus/content/groups/public/'
allowInsecureProtocol = true
//noinspection GroovyAssignabilityCheck
mavenContent {
includeGroup 'com.gtnewhorizons'
includeGroup 'com.gtnewhorizons.retrofuturagradle'
}
}
gradlePluginPortal()
mavenCentral()
mavenLocal()
}
}
plugins {
// Automatic toolchain provisioning
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.4.0'
}
rootProject.name = rootProject.projectDir.getName()
+15 -10
View File
@@ -32,14 +32,14 @@ import net.minecraft.item.ItemStack;
import appeng.api.definitions.IItemDefinition; import appeng.api.definitions.IItemDefinition;
public enum Upgrades { public enum Upgrades
{
/** /**
* Gold Tier Upgrades. * Gold Tier Upgrades.
*/ */
CAPACITY( 0 ), CAPACITY( 0 ),
REDSTONE( 0 ), REDSTONE( 0 ),
CRAFTING( 0 ), CRAFTING( 0 ),
MAGNET(0),
/** /**
* Diamond Tier Upgrades. * Diamond Tier Upgrades.
@@ -47,20 +47,21 @@ public enum Upgrades {
FUZZY( 1 ), FUZZY( 1 ),
SPEED( 1 ), SPEED( 1 ),
INVERTER( 1 ), INVERTER( 1 ),
PATTERN_EXPANSION(1), PATTERN_EXPANSION(1);
QUANTUM_LINK(1);
private final int tier; private final int tier;
private final Map<ItemStack, Integer> supportedMax = new HashMap<>(); private final Map<ItemStack, Integer> supportedMax = new HashMap<>();
Upgrades(final int tier) { Upgrades( final int tier )
{
this.tier = tier; this.tier = tier;
} }
/** /**
* @return list of Items/Blocks that support this upgrade, and how many it supports. * @return list of Items/Blocks that support this upgrade, and how many it supports.
*/ */
public Map<ItemStack, Integer> getSupported() { public Map<ItemStack, Integer> getSupported()
{
return this.supportedMax; return this.supportedMax;
} }
@@ -70,7 +71,8 @@ public enum Upgrades {
* @param item machine in which this upgrade can be installed * @param item machine in which this upgrade can be installed
* @param maxSupported amount how many upgrades can be installed * @param maxSupported amount how many upgrades can be installed
*/ */
public void registerItem(final IItemDefinition item, final int maxSupported) { public void registerItem( final IItemDefinition item, final int maxSupported )
{
item.maybeStack( 1 ).ifPresent( is -> this.registerItem( is, maxSupported ) ); item.maybeStack( 1 ).ifPresent( is -> this.registerItem( is, maxSupported ) );
} }
@@ -80,13 +82,16 @@ public enum Upgrades {
* @param stack machine in which this upgrade can be installed * @param stack machine in which this upgrade can be installed
* @param maxSupported amount how many upgrades can be installed * @param maxSupported amount how many upgrades can be installed
*/ */
public void registerItem(final ItemStack stack, final int maxSupported) { public void registerItem( final ItemStack stack, final int maxSupported )
if (stack != null) { {
if( stack != null )
{
this.supportedMax.put( stack, maxSupported ); this.supportedMax.put( stack, maxSupported );
} }
} }
public int getTier() { public int getTier()
{
return this.tier; return this.tier;
} }
} }
@@ -30,7 +30,8 @@ import appeng.api.util.AEColoredItemDefinition;
/** /**
* A list of all items in AE * A list of all items in AE
*/ */
public interface IItems { public interface IItems
{
IItemDefinition certusQuartzAxe(); IItemDefinition certusQuartzAxe();
IItemDefinition certusQuartzHoe(); IItemDefinition certusQuartzHoe();
@@ -63,12 +64,6 @@ public interface IItems {
IItemDefinition wirelessTerminal(); IItemDefinition wirelessTerminal();
IItemDefinition wirelessCraftingTerminal();
IItemDefinition wirelessPatternTerminal();
IItemDefinition wirelessFluidTerminal();
IItemDefinition biometricCard(); IItemDefinition biometricCard();
IItemDefinition chargedStaff(); IItemDefinition chargedStaff();
@@ -27,7 +27,8 @@ package appeng.api.definitions;
/** /**
* A list of all materials in AE * A list of all materials in AE
*/ */
public interface IMaterials { public interface IMaterials
{
IItemDefinition cell2SpatialPart(); IItemDefinition cell2SpatialPart();
IItemDefinition cell16SpatialPart(); IItemDefinition cell16SpatialPart();
@@ -90,10 +91,6 @@ public interface IMaterials {
IItemDefinition cardPatternExpansion(); IItemDefinition cardPatternExpansion();
IItemDefinition cardQuantumLink();
IItemDefinition cardMagnet();
IItemDefinition cardFuzzy(); IItemDefinition cardFuzzy();
IItemDefinition cardInverter(); IItemDefinition cardInverter();
@@ -30,7 +30,8 @@ import appeng.api.util.AEColoredItemDefinition;
/** /**
* A list of all parts in AE * A list of all parts in AE
*/ */
public interface IParts { public interface IParts
{
AEColoredItemDefinition cableSmart(); AEColoredItemDefinition cableSmart();
AEColoredItemDefinition cableCovered(); AEColoredItemDefinition cableCovered();
@@ -107,10 +108,6 @@ public interface IParts {
IItemDefinition expandedProcessingPatternTerminal(); IItemDefinition expandedProcessingPatternTerminal();
IItemDefinition interfaceConfigurationTerminal();
IItemDefinition fluidInterfaceConfigurationTerminal();
IItemDefinition craftingTerminal(); IItemDefinition craftingTerminal();
IItemDefinition terminal(); IItemDefinition terminal();
@@ -28,16 +28,17 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import appeng.api.util.IConfigManager; import appeng.api.util.IConfigManager;
import net.minecraftforge.fml.common.network.IGuiHandler;
/** /**
* A handler for a wireless terminal. * A handler for a wireless terminal.
*/ */
public interface IWirelessTermHandler extends INetworkEncodable { public interface IWirelessTermHandler extends INetworkEncodable
{
/** /**
* @param is wireless terminal * @param is wireless terminal
*
* @return true, if usePower, hasPower, etc... can be called for the provided item * @return true, if usePower, hasPower, etc... can be called for the provided item
*/ */
boolean canHandle( ItemStack is ); boolean canHandle( ItemStack is );
@@ -48,6 +49,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 * @param amount is in AE units ( 5 per MJ ), if you return false, the item should be dead and return false for
* hasPower * hasPower
* @param is wireless terminal * @param is wireless terminal
*
* @return true if wireless terminal uses power * @return true if wireless terminal uses power
*/ */
boolean usePower( EntityPlayer player, double amount, ItemStack is ); boolean usePower( EntityPlayer player, double amount, ItemStack is );
@@ -56,6 +58,7 @@ public interface IWirelessTermHandler extends INetworkEncodable {
* gets the power status of the item. * gets the power status of the item.
* *
* @param is wireless terminal * @param is wireless terminal
*
* @return returns true if there is any power left. * @return returns true if there is any power left.
*/ */
boolean hasPower( EntityPlayer player, double amount, ItemStack is ); boolean hasPower( EntityPlayer player, double amount, ItemStack is );
@@ -64,9 +67,8 @@ public interface IWirelessTermHandler extends INetworkEncodable {
* Return the config manager for the wireless terminal. * Return the config manager for the wireless terminal.
* *
* @param is wireless terminal * @param is wireless terminal
*
* @return config manager of wireless terminal * @return config manager of wireless terminal
*/ */
IConfigManager getConfigManager( ItemStack is ); IConfigManager getConfigManager( ItemStack is );
IGuiHandler getGuiHandler(ItemStack is);
} }
@@ -1,7 +0,0 @@
package appeng.api.implementations;
public interface IUpgradeableCellContainer {
int availableUpgrades();
void setupUpgrades();
}
@@ -1,41 +0,0 @@
/*
* 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;
import appeng.api.config.Upgrades;
import appeng.api.implementations.tiles.ISegmentedInventory;
import appeng.api.util.IConfigurableObject;
public interface IUpgradeableCellHost extends IConfigurableObject, ISegmentedInventory {
/**
* determine how many of an upgrade are installed.
*/
default int getInstalledUpgrades(Upgrades u) {
return 0;
}
}
@@ -28,8 +28,6 @@ import appeng.api.networking.security.IActionSource;
import appeng.api.networking.storage.IBaseMonitor; import appeng.api.networking.storage.IBaseMonitor;
import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEItemStack;
import javax.annotation.Nullable;
public interface ICraftingCPU extends IBaseMonitor<IAEItemStack> public interface ICraftingCPU extends IBaseMonitor<IAEItemStack>
{ {
@@ -58,30 +56,4 @@ public interface ICraftingCPU extends IBaseMonitor<IAEItemStack>
* @return an empty string or the name of the cpu. * @return an empty string or the name of the cpu.
*/ */
String getName(); String getName();
/**
* @return final output of the current crafting operation, or null if not crafting
*/
@Nullable
default IAEItemStack getFinalOutput()
{
return null;
}
/**
* @return remaining count of items (or other units of processing) for the current crafting job
*/
default long getRemainingItemCount()
{
return 0;
}
/**
* @return total count of items (or other units of processing) for the current crafting job
*/
default long getStartItemCount()
{
return 0;
}
} }
+1 -1
View File
@@ -22,7 +22,7 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/ */
@API(apiVersion = "rv6", owner = "appliedenergistics2", provides = "appliedenergistics2|API") @API( apiVersion = "@aeversion@", owner = "appliedenergistics2", provides = "appliedenergistics2|API" )
package appeng.api; package appeng.api;
@@ -1,11 +0,0 @@
package com.enderio.core.common.interfaces;
import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull;
public interface IOverlayRenderAware {
public void renderItemOverlayIntoGUI(@Nonnull ItemStack stack, int xPosition, int yPosition);
}
+166 -81
View File
@@ -19,12 +19,11 @@
package appeng.block; package appeng.block;
import appeng.api.util.IOrientable; import java.util.ArrayList;
import appeng.api.util.IOrientableBlock; import java.util.List;
import appeng.helpers.AEGlassMaterial;
import appeng.helpers.ICustomCollision; import javax.annotation.Nullable;
import appeng.util.LookDirection;
import appeng.util.Platform;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.SoundType; import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
@@ -47,12 +46,16 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import javax.annotation.Nullable; import appeng.api.util.IOrientable;
import java.util.ArrayList; import appeng.api.util.IOrientableBlock;
import java.util.List; import appeng.helpers.AEGlassMaterial;
import appeng.helpers.ICustomCollision;
import appeng.util.LookDirection;
import appeng.util.Platform;
public abstract class AEBaseBlock extends Block { public abstract class AEBaseBlock extends Block
{
private boolean isOpaque = true; private boolean isOpaque = true;
private boolean isFullSize = true; private boolean isFullSize = true;
@@ -61,16 +64,24 @@ public abstract class AEBaseBlock extends Block {
protected AxisAlignedBB boundingBox = FULL_BLOCK_AABB; protected AxisAlignedBB boundingBox = FULL_BLOCK_AABB;
protected AEBaseBlock(final Material mat) { protected AEBaseBlock( final Material mat )
{
super( mat ); super( mat );
if (mat == AEGlassMaterial.INSTANCE || mat == Material.GLASS) { if( mat == AEGlassMaterial.INSTANCE || mat == Material.GLASS )
{
this.setSoundType( SoundType.GLASS ); this.setSoundType( SoundType.GLASS );
} else if (mat == Material.ROCK) { }
else if( mat == Material.ROCK )
{
this.setSoundType( SoundType.STONE ); this.setSoundType( SoundType.STONE );
} else if (mat == Material.WOOD) { }
else if( mat == Material.WOOD )
{
this.setSoundType( SoundType.WOOD ); this.setSoundType( SoundType.WOOD );
} else { }
else
{
this.setSoundType( SoundType.METAL ); this.setSoundType( SoundType.METAL );
} }
@@ -84,35 +95,44 @@ public abstract class AEBaseBlock extends Block {
} }
@Override @Override
protected BlockStateContainer createBlockState() { protected BlockStateContainer createBlockState()
{
return new BlockStateContainer( this, this.getAEStates() ); return new BlockStateContainer( this, this.getAEStates() );
} }
@Override @Override
public final boolean isNormalCube(IBlockState state) { public final boolean isNormalCube( IBlockState state )
{
return this.isFullSize() && this.isOpaque(); return this.isFullSize() && this.isOpaque();
} }
@Override @Override
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { public AxisAlignedBB getBoundingBox( IBlockState state, IBlockAccess source, BlockPos pos )
{
return this.boundingBox; return this.boundingBox;
} }
@SuppressWarnings( "deprecation" ) @SuppressWarnings( "deprecation" )
@Override @Override
public void addCollisionBoxToList(final IBlockState state, final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, @Nullable final Entity e, boolean p_185477_7_) { public void addCollisionBoxToList( final IBlockState state, final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, @Nullable final Entity e, boolean p_185477_7_ )
{
final ICustomCollision collisionHandler = this.getCustomCollision( w, pos ); final ICustomCollision collisionHandler = this.getCustomCollision( w, pos );
if (collisionHandler != null && bb != null) { if( collisionHandler != null && bb != null )
{
final List<AxisAlignedBB> tmp = new ArrayList<>(); final List<AxisAlignedBB> tmp = new ArrayList<>();
collisionHandler.addCollidingBlockToList( w, pos, bb, tmp, e ); collisionHandler.addCollidingBlockToList( w, pos, bb, tmp, e );
for (final AxisAlignedBB b : tmp) { for( final AxisAlignedBB b : tmp )
{
final AxisAlignedBB offset = b.offset( pos.getX(), pos.getY(), pos.getZ() ); final AxisAlignedBB offset = b.offset( pos.getX(), pos.getY(), pos.getZ() );
if (bb.intersects(offset)) { if( bb.intersects( offset ) )
{
out.add( offset ); out.add( offset );
} }
} }
} else { }
else
{
super.addCollisionBoxToList( state, w, pos, bb, out, e, p_185477_7_ ); super.addCollisionBoxToList( state, w, pos, bb, out, e, p_185477_7_ );
} }
} }
@@ -120,11 +140,14 @@ public abstract class AEBaseBlock extends Block {
@SuppressWarnings( "deprecation" ) @SuppressWarnings( "deprecation" )
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public AxisAlignedBB getSelectedBoundingBox(IBlockState state, final World w, final BlockPos pos) { public AxisAlignedBB getSelectedBoundingBox( IBlockState state, final World w, final BlockPos pos )
{
final ICustomCollision collisionHandler = this.getCustomCollision( w, pos ); final ICustomCollision collisionHandler = this.getCustomCollision( w, pos );
if (collisionHandler != null) { if( collisionHandler != null )
if (Platform.isClient()) { {
if( Platform.isClient() )
{
final EntityPlayer player = Minecraft.getMinecraft().player; final EntityPlayer player = Minecraft.getMinecraft().player;
final LookDirection ld = Platform.getPlayerRay( player, Platform.getEyeOffset( player ) ); final LookDirection ld = Platform.getPlayerRay( player, Platform.getEyeOffset( player ) );
@@ -133,28 +156,32 @@ public abstract class AEBaseBlock extends Block {
double lastDist = 0; double lastDist = 0;
for (final AxisAlignedBB bb : bbs) { for( final AxisAlignedBB bb : bbs )
{
this.boundingBox = bb; this.boundingBox = bb;
final RayTraceResult r = super.collisionRayTrace( state, w, pos, ld.getA(), ld.getB() ); final RayTraceResult r = super.collisionRayTrace( state, w, pos, ld.getA(), ld.getB() );
this.boundingBox = FULL_BLOCK_AABB; this.boundingBox = FULL_BLOCK_AABB;
if (r != null) { if( r != null )
{
final double xLen = ( ld.getA().x - r.hitVec.x ); final double xLen = ( ld.getA().x - r.hitVec.x );
final double yLen = ( ld.getA().y - r.hitVec.y ); final double yLen = ( ld.getA().y - r.hitVec.y );
final double zLen = ( ld.getA().z - r.hitVec.z ); final double zLen = ( ld.getA().z - r.hitVec.z );
final double thisDist = xLen * xLen + yLen * yLen + zLen * zLen; final double thisDist = xLen * xLen + yLen * yLen + zLen * zLen;
if (br == null || lastDist > thisDist) { if( br == null || lastDist > thisDist )
{
lastDist = thisDist; lastDist = thisDist;
br = bb; br = bb;
} }
} }
} }
if (br != null) { if( br != null )
{
br = new AxisAlignedBB( br.minX + pos.getX(), br.minY + pos.getY(), br.minZ + pos.getZ(), br.maxX + pos.getX(), br.maxY + pos br = new AxisAlignedBB( br.minX + pos.getX(), br.minY + pos.getY(), br.minZ + pos.getZ(), br.maxX + pos.getX(), br.maxY + pos
.getY(), br.maxZ + pos.getZ() ); .getY(), br.maxZ + pos.getZ() );
return br; return br;
@@ -163,8 +190,10 @@ public abstract class AEBaseBlock extends Block {
AxisAlignedBB b = null; // new AxisAlignedBB( 16d, 16d, 16d, 0d, 0d, 0d ); AxisAlignedBB b = null; // new AxisAlignedBB( 16d, 16d, 16d, 0d, 0d, 0d );
for (final AxisAlignedBB bx : collisionHandler.getSelectedBoundingBoxesFromPool(w, pos, null, false)) { for( final AxisAlignedBB bx : collisionHandler.getSelectedBoundingBoxesFromPool( w, pos, null, false ) )
if (b == null) { {
if( b == null )
{
b = bx; b = bx;
continue; continue;
} }
@@ -179,9 +208,12 @@ public abstract class AEBaseBlock extends Block {
b = new AxisAlignedBB( minX, minY, minZ, maxX, maxY, maxZ ); b = new AxisAlignedBB( minX, minY, minZ, maxX, maxY, maxZ );
} }
if (b == null) { if( b == null )
{
b = new AxisAlignedBB( 16d, 16d, 16d, 0d, 0d, 0d ); b = new AxisAlignedBB( 16d, 16d, 16d, 0d, 0d, 0d );
} else { }
else
{
b = new AxisAlignedBB( b.minX + pos.getX(), b.minY + pos.getY(), b.minZ + pos.getZ(), b.maxX + pos.getX(), b.maxY + pos.getY(), b.maxZ + pos b = new AxisAlignedBB( b.minX + pos.getX(), b.minY + pos.getY(), b.minZ + pos.getZ(), b.maxX + pos.getX(), b.maxY + pos.getY(), b.maxZ + pos
.getZ() ); .getZ() );
} }
@@ -193,80 +225,101 @@ public abstract class AEBaseBlock extends Block {
} }
@Override @Override
public final boolean isOpaqueCube(IBlockState state) { public final boolean isOpaqueCube( IBlockState state )
{
return this.isOpaque(); return this.isOpaque();
} }
@SuppressWarnings( "deprecation" ) @SuppressWarnings( "deprecation" )
@Override @Override
public RayTraceResult collisionRayTrace(final IBlockState state, final World w, final BlockPos pos, final Vec3d a, final Vec3d b) { public RayTraceResult collisionRayTrace( final IBlockState state, final World w, final BlockPos pos, final Vec3d a, final Vec3d b )
{
final ICustomCollision collisionHandler = this.getCustomCollision( w, pos ); final ICustomCollision collisionHandler = this.getCustomCollision( w, pos );
if (collisionHandler != null) { if( collisionHandler != null )
{
final Iterable<AxisAlignedBB> bbs = collisionHandler.getSelectedBoundingBoxesFromPool( w, pos, null, true ); final Iterable<AxisAlignedBB> bbs = collisionHandler.getSelectedBoundingBoxesFromPool( w, pos, null, true );
RayTraceResult br = null; RayTraceResult br = null;
double lastDist = 0; double lastDist = 0;
for (final AxisAlignedBB bb : bbs) { for( final AxisAlignedBB bb : bbs )
{
this.boundingBox = bb; this.boundingBox = bb;
final RayTraceResult r = super.collisionRayTrace( state, w, pos, a, b ); final RayTraceResult r = super.collisionRayTrace( state, w, pos, a, b );
this.boundingBox = FULL_BLOCK_AABB; this.boundingBox = FULL_BLOCK_AABB;
if (r != null) { if( r != null )
{
final double xLen = ( a.x - r.hitVec.x ); final double xLen = ( a.x - r.hitVec.x );
final double yLen = ( a.y - r.hitVec.y ); final double yLen = ( a.y - r.hitVec.y );
final double zLen = ( a.z - r.hitVec.z ); final double zLen = ( a.z - r.hitVec.z );
final double thisDist = xLen * xLen + yLen * yLen + zLen * zLen; final double thisDist = xLen * xLen + yLen * yLen + zLen * zLen;
if (br == null || lastDist > thisDist) { if( br == null || lastDist > thisDist )
{
lastDist = thisDist; lastDist = thisDist;
br = r; br = r;
} }
} }
} }
if( br != null )
{
return br; return br;
} }
return null;
}
this.boundingBox = FULL_BLOCK_AABB; this.boundingBox = FULL_BLOCK_AABB;
return super.collisionRayTrace( state, w, pos, a, b ); return super.collisionRayTrace( state, w, pos, a, b );
} }
@Override @Override
public boolean hasComparatorInputOverride(IBlockState state) { public boolean hasComparatorInputOverride( IBlockState state )
{
return this.isInventory(); return this.isInventory();
} }
@Override @Override
public int getComparatorInputOverride(IBlockState state, final World worldIn, final BlockPos pos) { public int getComparatorInputOverride( IBlockState state, final World worldIn, final BlockPos pos )
{
return 0; return 0;
} }
@Override @Override
public final boolean isNormalCube(IBlockState state, final IBlockAccess world, final BlockPos pos) { public final boolean isNormalCube( IBlockState state, final IBlockAccess world, final BlockPos pos )
{
return this.isFullSize(); return this.isFullSize();
} }
@Override @Override
public boolean rotateBlock(final World w, final BlockPos pos, final EnumFacing axis) { public boolean rotateBlock( final World w, final BlockPos pos, final EnumFacing axis )
{
final IOrientable rotatable = this.getOrientable( w, pos ); final IOrientable rotatable = this.getOrientable( w, pos );
if (rotatable != null && rotatable.canBeRotated()) { if( rotatable != null && rotatable.canBeRotated() )
if (this.hasCustomRotation()) { {
if( this.hasCustomRotation() )
{
this.customRotateBlock( rotatable, axis ); this.customRotateBlock( rotatable, axis );
return true; return true;
} else { }
else
{
EnumFacing forward = rotatable.getForward(); EnumFacing forward = rotatable.getForward();
EnumFacing up = rotatable.getUp(); EnumFacing up = rotatable.getUp();
for (int rs = 0; rs < 4; rs++) { for( int rs = 0; rs < 4; rs++ )
{
forward = Platform.rotateAround( forward, axis ); forward = Platform.rotateAround( forward, axis );
up = Platform.rotateAround( up, axis ); up = Platform.rotateAround( up, axis );
if (this.isValidOrientation(w, pos, forward, up)) { if( this.isValidOrientation( w, pos, forward, up ) )
{
rotatable.setOrientation( forward, up ); rotatable.setOrientation( forward, up );
return true; return true;
} }
@@ -278,21 +331,25 @@ public abstract class AEBaseBlock extends Block {
} }
@Override @Override
public EnumFacing[] getValidRotations(final World w, final BlockPos pos) { public EnumFacing[] getValidRotations( final World w, final BlockPos pos )
{
return new EnumFacing[0]; return new EnumFacing[0];
} }
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
@Override @Override
public void addInformation(final ItemStack is, final World world, final List<String> lines, final ITooltipFlag advancedItemTooltips) { public void addInformation( final ItemStack is, final World world, final List<String> lines, final ITooltipFlag advancedItemTooltips )
{
} }
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
{
return false; return false;
} }
public final EnumFacing mapRotation(final IOrientable ori, final EnumFacing dir) { public final EnumFacing mapRotation( final IOrientable ori, final EnumFacing dir )
{
// case DOWN: return bottomIcon; // case DOWN: return bottomIcon;
// case UP: return blockIcon; // case UP: return blockIcon;
// case NORTH: return northIcon; // case NORTH: return northIcon;
@@ -303,7 +360,8 @@ public abstract class AEBaseBlock extends Block {
final EnumFacing forward = ori.getForward(); final EnumFacing forward = ori.getForward();
final EnumFacing up = ori.getUp(); final EnumFacing up = ori.getUp();
if (forward == null || up == null) { if( forward == null || up == null )
{
return dir; return dir;
} }
@@ -312,34 +370,43 @@ public abstract class AEBaseBlock extends Block {
final int west_z = forward.getFrontOffsetX() * up.getFrontOffsetY() - forward.getFrontOffsetY() * up.getFrontOffsetX(); final int west_z = forward.getFrontOffsetX() * up.getFrontOffsetY() - forward.getFrontOffsetY() * up.getFrontOffsetX();
EnumFacing west = null; EnumFacing west = null;
for (final EnumFacing dx : EnumFacing.VALUES) { for( final EnumFacing dx : EnumFacing.VALUES )
if (dx.getFrontOffsetX() == west_x && dx.getFrontOffsetY() == west_y && dx.getFrontOffsetZ() == west_z) { {
if( dx.getFrontOffsetX() == west_x && dx.getFrontOffsetY() == west_y && dx.getFrontOffsetZ() == west_z )
{
west = dx; west = dx;
} }
} }
if (west == null) { if( west == null )
{
return dir; return dir;
} }
if (dir == forward) { if( dir == forward )
{
return EnumFacing.SOUTH; return EnumFacing.SOUTH;
} }
if (dir == forward.getOpposite()) { if( dir == forward.getOpposite() )
{
return EnumFacing.NORTH; return EnumFacing.NORTH;
} }
if (dir == up) { if( dir == up )
{
return EnumFacing.UP; return EnumFacing.UP;
} }
if (dir == up.getOpposite()) { if( dir == up.getOpposite() )
{
return EnumFacing.DOWN; return EnumFacing.DOWN;
} }
if (dir == west) { if( dir == west )
{
return EnumFacing.WEST; return EnumFacing.WEST;
} }
if (dir == west.getOpposite()) { if( dir == west.getOpposite() )
{
return EnumFacing.EAST; return EnumFacing.EAST;
} }
@@ -347,77 +414,95 @@ public abstract class AEBaseBlock extends Block {
} }
@Override @Override
public String toString() { public String toString()
{
String regName = this.getRegistryName() != null ? this.getRegistryName().getResourcePath() : "unregistered"; String regName = this.getRegistryName() != null ? this.getRegistryName().getResourcePath() : "unregistered";
return this.getClass().getSimpleName() + "[" + regName + "]"; return this.getClass().getSimpleName() + "[" + regName + "]";
} }
protected String getUnlocalizedName(final ItemStack is) { protected String getUnlocalizedName( final ItemStack is )
{
return this.getUnlocalizedName(); return this.getUnlocalizedName();
} }
protected boolean hasCustomRotation() { protected boolean hasCustomRotation()
{
return false; return false;
} }
protected void customRotateBlock(final IOrientable rotatable, final EnumFacing axis) { protected void customRotateBlock( final IOrientable rotatable, final EnumFacing axis )
{
} }
protected IOrientable getOrientable(final IBlockAccess w, final BlockPos pos) { protected IOrientable getOrientable( final IBlockAccess w, final BlockPos pos )
if (this instanceof IOrientableBlock) { {
if( this instanceof IOrientableBlock )
{
IOrientableBlock orientable = (IOrientableBlock) this; IOrientableBlock orientable = (IOrientableBlock) this;
return orientable.getOrientable( w, pos ); return orientable.getOrientable( w, pos );
} }
return null; return null;
} }
protected boolean isValidOrientation(final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up) { protected boolean isValidOrientation( final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up )
{
return true; return true;
} }
protected ICustomCollision getCustomCollision(final World w, final BlockPos pos) { protected ICustomCollision getCustomCollision( final World w, final BlockPos pos )
if (this instanceof ICustomCollision) { {
if( this instanceof ICustomCollision )
{
return (ICustomCollision) this; return (ICustomCollision) this;
} }
return null; return null;
} }
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
{
return new IProperty[0]; return new IProperty[0];
} }
protected boolean isOpaque() { protected boolean isOpaque()
{
return this.isOpaque; return this.isOpaque;
} }
protected boolean setOpaque(final boolean isOpaque) { protected boolean setOpaque( final boolean isOpaque )
{
this.isOpaque = isOpaque; this.isOpaque = isOpaque;
return isOpaque; return isOpaque;
} }
protected boolean hasSubtypes() { protected boolean hasSubtypes()
{
return this.hasSubtypes; return this.hasSubtypes;
} }
protected void setHasSubtypes(final boolean hasSubtypes) { protected void setHasSubtypes( final boolean hasSubtypes )
{
this.hasSubtypes = hasSubtypes; this.hasSubtypes = hasSubtypes;
} }
protected boolean isFullSize() { protected boolean isFullSize()
{
return this.isFullSize; return this.isFullSize;
} }
protected boolean setFullSize(final boolean isFullSize) { protected boolean setFullSize( final boolean isFullSize )
{
this.isFullSize = isFullSize; this.isFullSize = isFullSize;
return isFullSize; return isFullSize;
} }
protected boolean isInventory() { protected boolean isInventory()
{
return this.isInventory; return this.isInventory;
} }
protected void setInventory(final boolean isInventory) { protected void setInventory( final boolean isInventory )
{
this.isInventory = isInventory; this.isInventory = isInventory;
} }
+73 -37
View File
@@ -19,13 +19,8 @@
package appeng.block; package appeng.block;
import appeng.api.util.IOrientable; import java.util.List;
import appeng.api.util.IOrientableBlock;
import appeng.block.misc.BlockLightDetector;
import appeng.block.misc.BlockSkyCompass;
import appeng.block.networking.BlockWireless;
import appeng.me.helpers.IGridProxyable;
import appeng.tile.AEBaseTile;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.client.util.ITooltipFlag; import net.minecraft.client.util.ITooltipFlag;
@@ -39,22 +34,32 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.List; import appeng.api.util.IOrientable;
import appeng.api.util.IOrientableBlock;
import appeng.block.misc.BlockLightDetector;
import appeng.block.misc.BlockSkyCompass;
import appeng.block.networking.BlockWireless;
import appeng.me.helpers.IGridProxyable;
import appeng.tile.AEBaseTile;
public class AEBaseItemBlock extends ItemBlock { public class AEBaseItemBlock extends ItemBlock
{
private final AEBaseBlock blockType; private final AEBaseBlock blockType;
public AEBaseItemBlock(final Block id) { public AEBaseItemBlock( final Block id )
{
super( id ); super( id );
this.blockType = (AEBaseBlock) id; this.blockType = (AEBaseBlock) id;
this.hasSubtypes = this.blockType.hasSubtypes(); this.hasSubtypes = this.blockType.hasSubtypes();
} }
@Override @Override
public int getMetadata(final int dmg) { public int getMetadata( final int dmg )
if (this.hasSubtypes) { {
if( this.hasSubtypes )
{
return dmg; return dmg;
} }
return 0; return 0;
@@ -62,51 +67,69 @@ public class AEBaseItemBlock extends ItemBlock {
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public final void addInformation(final ItemStack itemStack, final World world, final List<String> toolTip, final ITooltipFlag advancedTooltips) { public final void addInformation( final ItemStack itemStack, final World world, final List<String> toolTip, final ITooltipFlag advancedTooltips )
{
this.addCheckedInformation( itemStack, world, toolTip, advancedTooltips ); this.addCheckedInformation( itemStack, world, toolTip, advancedTooltips );
} }
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void addCheckedInformation(final ItemStack itemStack, final World world, final List<String> toolTip, final ITooltipFlag advancedTooltips) { public void addCheckedInformation( final ItemStack itemStack, final World world, final List<String> toolTip, final ITooltipFlag advancedTooltips )
{
this.blockType.addInformation( itemStack, world, toolTip, advancedTooltips ); this.blockType.addInformation( itemStack, world, toolTip, advancedTooltips );
} }
@Override @Override
public boolean isBookEnchantable(final ItemStack itemstack1, final ItemStack itemstack2) { public boolean isBookEnchantable( final ItemStack itemstack1, final ItemStack itemstack2 )
{
return false; return false;
} }
@Override @Override
public String getUnlocalizedName(final ItemStack is) { public String getUnlocalizedName( final ItemStack is )
{
return this.blockType.getUnlocalizedName( is ); return this.blockType.getUnlocalizedName( is );
} }
@Override @Override
public boolean placeBlockAt(final ItemStack stack, final EntityPlayer player, final World w, final BlockPos pos, final EnumFacing side, final float hitX, final float hitY, final float hitZ, final IBlockState newState) { public boolean placeBlockAt( final ItemStack stack, final EntityPlayer player, final World w, final BlockPos pos, final EnumFacing side, final float hitX, final float hitY, final float hitZ, final IBlockState newState )
{
EnumFacing up = null; EnumFacing up = null;
EnumFacing forward = null; EnumFacing forward = null;
if (this.blockType instanceof AEBaseTileBlock) { if( this.blockType instanceof AEBaseTileBlock )
if (this.blockType instanceof BlockLightDetector) { {
if( this.blockType instanceof BlockLightDetector )
{
up = side; up = side;
if (up == EnumFacing.UP || up == EnumFacing.DOWN) { if( up == EnumFacing.UP || up == EnumFacing.DOWN )
{
forward = EnumFacing.SOUTH; forward = EnumFacing.SOUTH;
} else { }
else
{
forward = EnumFacing.UP; forward = EnumFacing.UP;
} }
} else if (this.blockType instanceof BlockWireless || this.blockType instanceof BlockSkyCompass) { }
else if( this.blockType instanceof BlockWireless || this.blockType instanceof BlockSkyCompass )
{
forward = side; forward = side;
if (forward == EnumFacing.UP || forward == EnumFacing.DOWN) { if( forward == EnumFacing.UP || forward == EnumFacing.DOWN )
{
up = EnumFacing.SOUTH; up = EnumFacing.SOUTH;
} else { }
else
{
up = EnumFacing.UP; up = EnumFacing.UP;
} }
} else { }
else
{
up = EnumFacing.UP; up = EnumFacing.UP;
final byte rotation = (byte) ( MathHelper.floor( ( player.rotationYaw * 4F ) / 360F + 2.5D ) & 3 ); final byte rotation = (byte) ( MathHelper.floor( ( player.rotationYaw * 4F ) / 360F + 2.5D ) & 3 );
switch (rotation) { switch( rotation )
{
default: default:
case 0: case 0:
forward = EnumFacing.SOUTH; forward = EnumFacing.SOUTH;
@@ -122,10 +145,13 @@ public class AEBaseItemBlock extends ItemBlock {
break; break;
} }
if (player.rotationPitch > 65) { if( player.rotationPitch > 65 )
{
up = forward.getOpposite(); up = forward.getOpposite();
forward = EnumFacing.UP; forward = EnumFacing.UP;
} else if (player.rotationPitch < -65) { }
else if( player.rotationPitch < -65 )
{
up = forward.getOpposite(); up = forward.getOpposite();
forward = EnumFacing.DOWN; forward = EnumFacing.DOWN;
} }
@@ -133,38 +159,48 @@ public class AEBaseItemBlock extends ItemBlock {
} }
IOrientable ori = null; IOrientable ori = null;
if (this.blockType instanceof IOrientableBlock) { if( this.blockType instanceof IOrientableBlock )
{
ori = ( (IOrientableBlock) this.blockType ).getOrientable( w, pos ); ori = ( (IOrientableBlock) this.blockType ).getOrientable( w, pos );
up = side; up = side;
forward = EnumFacing.SOUTH; forward = EnumFacing.SOUTH;
if (up.getFrontOffsetY() == 0) { if( up.getFrontOffsetY() == 0 )
{
forward = EnumFacing.UP; forward = EnumFacing.UP;
} }
} }
if (!this.blockType.isValidOrientation(w, pos, forward, up)) { if( !this.blockType.isValidOrientation( w, pos, forward, up ) )
{
return false; return false;
} }
if (super.placeBlockAt(stack, player, w, pos, side, hitX, hitY, hitZ, newState)) { if( super.placeBlockAt( stack, player, w, pos, side, hitX, hitY, hitZ, newState ) )
if (this.blockType instanceof AEBaseTileBlock && !(this.blockType instanceof BlockLightDetector)) { {
if( this.blockType instanceof AEBaseTileBlock && !( this.blockType instanceof BlockLightDetector ) )
{
final AEBaseTile tile = ( (AEBaseTileBlock) this.blockType ).getTileEntity( w, pos ); final AEBaseTile tile = ( (AEBaseTileBlock) this.blockType ).getTileEntity( w, pos );
ori = tile; ori = tile;
if (tile == null) { if( tile == null )
{
return true; return true;
} }
if (ori.canBeRotated() && !this.blockType.hasCustomRotation()) { if( ori.canBeRotated() && !this.blockType.hasCustomRotation() )
{
ori.setOrientation( forward, up ); ori.setOrientation( forward, up );
} }
if (tile instanceof IGridProxyable) { if( tile instanceof IGridProxyable )
{
( (IGridProxyable) tile ).getProxy().setOwner( player ); ( (IGridProxyable) tile ).getProxy().setOwner( player );
} }
tile.onPlacement( stack, player, side ); tile.onPlacement( stack, player, side );
} else if (this.blockType instanceof IOrientableBlock) { }
else if( this.blockType instanceof IOrientableBlock )
{
ori.setOrientation( forward, up ); ori.setOrientation( forward, up );
} }
@@ -19,14 +19,9 @@
package appeng.block; package appeng.block;
import appeng.api.config.AccessRestriction; import java.text.MessageFormat;
import appeng.api.config.Actionable; import java.util.List;
import appeng.api.config.PowerUnits;
import appeng.api.definitions.IBlockDefinition;
import appeng.api.implementations.items.IAEItemPowerStorage;
import appeng.core.Api;
import appeng.core.localization.GuiText;
import appeng.util.Platform;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.client.util.ITooltipFlag; import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@@ -35,25 +30,36 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.text.MessageFormat; import appeng.api.config.AccessRestriction;
import java.util.List; import appeng.api.config.Actionable;
import appeng.api.config.PowerUnits;
import appeng.api.definitions.IBlockDefinition;
import appeng.api.implementations.items.IAEItemPowerStorage;
import appeng.core.Api;
import appeng.core.localization.GuiText;
import appeng.util.Platform;
public class AEBaseItemBlockChargeable extends AEBaseItemBlock implements IAEItemPowerStorage { public class AEBaseItemBlockChargeable extends AEBaseItemBlock implements IAEItemPowerStorage
{
public AEBaseItemBlockChargeable(final Block id) { public AEBaseItemBlockChargeable( final Block id )
{
super( id ); super( id );
} }
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void addCheckedInformation(final ItemStack stack, final World world, final List<String> lines, final ITooltipFlag advancedTooltips) { public void addCheckedInformation( final ItemStack stack, final World world, final List<String> lines, final ITooltipFlag advancedTooltips )
{
final NBTTagCompound tag = stack.getTagCompound(); final NBTTagCompound tag = stack.getTagCompound();
double internalCurrentPower = 0; double internalCurrentPower = 0;
final double internalMaxPower = this.getMaxEnergyCapacity(); final double internalMaxPower = this.getMaxEnergyCapacity();
if (internalMaxPower > 0) { if( internalMaxPower > 0 )
if (tag != null) { {
if( tag != null )
{
internalCurrentPower = tag.getDouble( "internalCurrentPower" ); internalCurrentPower = tag.getDouble( "internalCurrentPower" );
} }
@@ -65,13 +71,15 @@ public class AEBaseItemBlockChargeable extends AEBaseItemBlock implements IAEIte
} }
@Override @Override
public double injectAEPower(final ItemStack is, double amount, Actionable mode) { public double injectAEPower( final ItemStack is, double amount, Actionable mode )
{
final double internalCurrentPower = this.getInternal( is ); final double internalCurrentPower = this.getInternal( is );
final double internalMaxPower = this.getAEMaxPower( is ); final double internalMaxPower = this.getAEMaxPower( is );
final double required = internalMaxPower - internalCurrentPower; final double required = internalMaxPower - internalCurrentPower;
final double overflow = Math.max( 0, amount - required ); final double overflow = Math.max( 0, amount - required );
if (mode == Actionable.MODULATE) { if( mode == Actionable.MODULATE )
{
final double toAdd = Math.min( required, amount ); final double toAdd = Math.min( required, amount );
final double newPowerStored = internalCurrentPower + toAdd; final double newPowerStored = internalCurrentPower + toAdd;
@@ -82,11 +90,13 @@ public class AEBaseItemBlockChargeable extends AEBaseItemBlock implements IAEIte
} }
@Override @Override
public double extractAEPower(final ItemStack is, double amount, Actionable mode) { public double extractAEPower( final ItemStack is, double amount, Actionable mode )
{
final double internalCurrentPower = this.getInternal( is ); final double internalCurrentPower = this.getInternal( is );
final double fulfillable = Math.min( amount, internalCurrentPower ); final double fulfillable = Math.min( amount, internalCurrentPower );
if (mode == Actionable.MODULATE) { if( mode == Actionable.MODULATE )
{
final double newPowerStored = internalCurrentPower - fulfillable; final double newPowerStored = internalCurrentPower - fulfillable;
this.setInternal( is, newPowerStored ); this.setInternal( is, newPowerStored );
@@ -96,40 +106,49 @@ public class AEBaseItemBlockChargeable extends AEBaseItemBlock implements IAEIte
} }
@Override @Override
public double getAEMaxPower(final ItemStack is) { public double getAEMaxPower( final ItemStack is )
{
return this.getMaxEnergyCapacity(); return this.getMaxEnergyCapacity();
} }
@Override @Override
public double getAECurrentPower(final ItemStack is) { public double getAECurrentPower( final ItemStack is )
{
return this.getInternal( is ); return this.getInternal( is );
} }
@Override @Override
public AccessRestriction getPowerFlow(final ItemStack is) { public AccessRestriction getPowerFlow( final ItemStack is )
{
return AccessRestriction.WRITE; return AccessRestriction.WRITE;
} }
private double getMaxEnergyCapacity() { private double getMaxEnergyCapacity()
{
final Block blockID = Block.getBlockFromItem( this ); final Block blockID = Block.getBlockFromItem( this );
final IBlockDefinition energyCell = Api.INSTANCE.definitions().blocks().energyCell(); final IBlockDefinition energyCell = Api.INSTANCE.definitions().blocks().energyCell();
return energyCell.maybeBlock().map( block -> return energyCell.maybeBlock().map( block ->
{ {
if (blockID == block) { if( blockID == block )
{
return 200000; return 200000;
} else { }
else
{
return 8 * 200000; return 8 * 200000;
} }
} ).orElse( 0 ); } ).orElse( 0 );
} }
private double getInternal(final ItemStack is) { private double getInternal( final ItemStack is )
{
final NBTTagCompound nbt = Platform.openNbtData( is ); final NBTTagCompound nbt = Platform.openNbtData( is );
return nbt.getDouble( "internalCurrentPower" ); return nbt.getDouble( "internalCurrentPower" );
} }
private void setInternal(final ItemStack is, final double amt) { private void setInternal( final ItemStack is, final double amt )
{
final NBTTagCompound nbt = Platform.openNbtData( is ); final NBTTagCompound nbt = Platform.openNbtData( is );
nbt.setDouble( "internalCurrentPower", amt ); nbt.setDouble( "internalCurrentPower", amt );
} }
@@ -20,19 +20,16 @@ package appeng.block;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockStairs; import net.minecraft.block.BlockStairs;
import net.minecraft.block.state.IBlockState;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import javax.annotation.Nonnull;
public abstract class AEBaseStairBlock extends BlockStairs { public abstract class AEBaseStairBlock extends BlockStairs
{
protected AEBaseStairBlock(final Block block, final String type) { protected AEBaseStairBlock( final Block block, final String type )
{
super( block.getDefaultState() ); super( block.getDefaultState() );
Preconditions.checkNotNull( block ); Preconditions.checkNotNull( block );
@@ -44,14 +41,10 @@ public abstract class AEBaseStairBlock extends BlockStairs {
} }
@Override @Override
public String toString() { public String toString()
{
String regName = this.getRegistryName() != null ? this.getRegistryName().getResourcePath() : "unregistered"; String regName = this.getRegistryName() != null ? this.getRegistryName().getResourcePath() : "unregistered";
return this.getClass().getSimpleName() + "[" + regName + "]"; return this.getClass().getSimpleName() + "[" + regName + "]";
} }
@Override
public boolean doesSideBlockChestOpening(@Nonnull IBlockState blockState, @Nonnull IBlockAccess world, @Nonnull BlockPos pos, @Nonnull EnumFacing side) {
return false;
}
} }
+139 -87
View File
@@ -19,23 +19,14 @@
package appeng.block; package appeng.block;
import appeng.api.implementations.items.IMemoryCard; import java.util.ArrayList;
import appeng.api.implementations.items.MemoryCardMessages; import java.util.List;
import appeng.api.implementations.tiles.IColorableTile;
import appeng.api.util.AEColor; import javax.annotation.Nonnull;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.api.util.IOrientable;
import appeng.block.networking.BlockCableBus;
import appeng.core.sync.GuiBridge;
import appeng.helpers.ICustomCollision;
import appeng.items.tools.quartz.ToolQuartzCuttingKnife;
import appeng.tile.AEBaseInvTile;
import appeng.tile.AEBaseTile;
import appeng.tile.networking.TileCableBus;
import appeng.tile.storage.TileSkyChest;
import appeng.util.Platform;
import appeng.util.SettingsFrom;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.ITileEntityProvider;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
@@ -55,21 +46,31 @@ import net.minecraft.world.World;
import net.minecraftforge.common.property.ExtendedBlockState; import net.minecraftforge.common.property.ExtendedBlockState;
import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IExtendedBlockState;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
import net.minecraftforge.event.ForgeEventFactory;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import javax.annotation.Nonnull; import appeng.api.implementations.items.IMemoryCard;
import javax.annotation.Nullable; import appeng.api.implementations.items.MemoryCardMessages;
import java.util.ArrayList; import appeng.api.implementations.tiles.IColorableTile;
import java.util.List; import appeng.api.util.AEColor;
import appeng.api.util.IOrientable;
import appeng.block.networking.BlockCableBus;
import appeng.helpers.ICustomCollision;
import appeng.tile.AEBaseInvTile;
import appeng.tile.AEBaseTile;
import appeng.tile.networking.TileCableBus;
import appeng.tile.storage.TileSkyChest;
import appeng.util.Platform;
import appeng.util.SettingsFrom;
public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntityProvider { public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntityProvider
{
@Nonnull @Nonnull
private Class<? extends AEBaseTile> tileEntityType; private Class<? extends AEBaseTile> tileEntityType;
public AEBaseTileBlock(final Material mat) { public AEBaseTileBlock( final Material mat )
{
super( mat ); super( mat );
} }
@@ -77,14 +78,17 @@ public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntity
public static final UnlistedDirection UP = new UnlistedDirection( "up" ); public static final UnlistedDirection UP = new UnlistedDirection( "up" );
@Override @Override
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
{
// A subclass may decide it doesn't want extended block state for whatever reason // A subclass may decide it doesn't want extended block state for whatever reason
if (!(state instanceof IExtendedBlockState)) { if( !( state instanceof IExtendedBlockState ) )
{
return state; return state;
} }
AEBaseTile tile = this.getTileEntity( world, pos ); AEBaseTile tile = this.getTileEntity( world, pos );
if (tile == null) { if( tile == null )
{
return state; // No info available return state; // No info available
} }
@@ -93,7 +97,8 @@ public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntity
} }
@Override @Override
protected BlockStateContainer createBlockState() { protected BlockStateContainer createBlockState()
{
return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] { return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] {
FORWARD, FORWARD,
UP UP
@@ -101,42 +106,51 @@ public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntity
} }
@Override @Override
public int getMetaFromState(IBlockState state) { public int getMetaFromState( IBlockState state )
{
return 0; return 0;
} }
// TODO : Was this change needed? // TODO : Was this change needed?
public void setTileEntity(final Class<? extends AEBaseTile> c) { public void setTileEntity( final Class<? extends AEBaseTile> c )
{
this.tileEntityType = c; this.tileEntityType = c;
this.setInventory( AEBaseInvTile.class.isAssignableFrom( c ) ); this.setInventory( AEBaseInvTile.class.isAssignableFrom( c ) );
} }
@Override @Override
public boolean hasTileEntity(IBlockState state) { public boolean hasTileEntity( IBlockState state )
{
return this.hasBlockTileEntity(); return this.hasBlockTileEntity();
} }
private boolean hasBlockTileEntity() { private boolean hasBlockTileEntity()
{
return this.tileEntityType != null; return this.tileEntityType != null;
} }
public Class<? extends AEBaseTile> getTileEntityClass() { public Class<? extends AEBaseTile> getTileEntityClass()
{
return this.tileEntityType; return this.tileEntityType;
} }
@Nullable @Nullable
public <T extends AEBaseTile> T getTileEntity(final IBlockAccess w, final int x, final int y, final int z) { public <T extends AEBaseTile> T getTileEntity( final IBlockAccess w, final int x, final int y, final int z )
{
return this.getTileEntity( w, new BlockPos( x, y, z ) ); return this.getTileEntity( w, new BlockPos( x, y, z ) );
} }
@Nullable @Nullable
public <T extends AEBaseTile> T getTileEntity(final IBlockAccess w, final BlockPos pos) { public <T extends AEBaseTile> T getTileEntity( final IBlockAccess w, final BlockPos pos )
if (!this.hasBlockTileEntity()) { {
if( !this.hasBlockTileEntity() )
{
return null; return null;
} }
final TileEntity te = w.getTileEntity( pos ); final TileEntity te = w.getTileEntity( pos );
if (this.tileEntityType.isInstance(te)) { if( this.tileEntityType.isInstance( te ) )
{
return (T) te; return (T) te;
} }
@@ -144,13 +158,20 @@ public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntity
} }
@Override @Override
public final TileEntity createNewTileEntity(final World var1, final int var2) { public final TileEntity createNewTileEntity( final World var1, final int var2 )
if (this.hasBlockTileEntity()) { {
try { if( this.hasBlockTileEntity() )
{
try
{
return this.tileEntityType.newInstance(); return this.tileEntityType.newInstance();
} catch (final InstantiationException e) { }
catch( final InstantiationException e )
{
throw new IllegalStateException( "Failed to create a new instance of an illegal class " + this.tileEntityType, e ); throw new IllegalStateException( "Failed to create a new instance of an illegal class " + this.tileEntityType, e );
} catch (final IllegalAccessException e) { }
catch( final IllegalAccessException e )
{
throw new IllegalStateException( "Failed to create a new instance of " + this.tileEntityType + ", because lack of permissions", e ); throw new IllegalStateException( "Failed to create a new instance of " + this.tileEntityType + ", because lack of permissions", e );
} }
} }
@@ -159,13 +180,18 @@ public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntity
} }
@Override @Override
public void breakBlock(final World w, final BlockPos pos, final IBlockState state) { public void breakBlock( final World w, final BlockPos pos, final IBlockState state )
{
final AEBaseTile te = this.getTileEntity( w, pos ); final AEBaseTile te = this.getTileEntity( w, pos );
if (te != null) { if( te != null )
{
final ArrayList<ItemStack> drops = new ArrayList<>(); final ArrayList<ItemStack> drops = new ArrayList<>();
if (te.dropItems()) { if( te.dropItems() )
{
te.getDrops( w, pos, drops ); te.getDrops( w, pos, drops );
} else { }
else
{
te.getNoDrops( w, pos, drops ); te.getNoDrops( w, pos, drops );
} }
@@ -178,9 +204,11 @@ public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntity
} }
@Override @Override
public final EnumFacing[] getValidRotations(final World w, final BlockPos pos) { public final EnumFacing[] getValidRotations( final World w, final BlockPos pos )
{
final AEBaseTile obj = this.getTileEntity( w, pos ); final AEBaseTile obj = this.getTileEntity( w, pos );
if (obj != null && obj.canBeRotated()) { if( obj != null && obj.canBeRotated() )
{
return EnumFacing.VALUES; return EnumFacing.VALUES;
} }
@@ -188,15 +216,18 @@ public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntity
} }
@Override @Override
public boolean recolorBlock(final World world, final BlockPos pos, final EnumFacing side, final EnumDyeColor color) { public boolean recolorBlock( final World world, final BlockPos pos, final EnumFacing side, final EnumDyeColor color )
{
final TileEntity te = this.getTileEntity( world, pos ); final TileEntity te = this.getTileEntity( world, pos );
if (te instanceof IColorableTile) { if( te instanceof IColorableTile )
{
final IColorableTile ct = (IColorableTile) te; final IColorableTile ct = (IColorableTile) te;
final AEColor c = ct.getColor(); final AEColor c = ct.getColor();
final AEColor newColor = AEColor.values()[color.getMetadata()]; final AEColor newColor = AEColor.values()[color.getMetadata()];
if (c != newColor) { if( c != newColor )
{
ct.recolourBlock( side, newColor, null ); ct.recolourBlock( side, newColor, null );
return true; return true;
} }
@@ -207,11 +238,14 @@ public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntity
} }
@Override @Override
public int getComparatorInputOverride(IBlockState state, final World w, final BlockPos pos) { public int getComparatorInputOverride( IBlockState state, final World w, final BlockPos pos )
{
final TileEntity te = this.getTileEntity( w, pos ); final TileEntity te = this.getTileEntity( w, pos );
if (te instanceof AEBaseInvTile) { if( te instanceof AEBaseInvTile )
{
AEBaseInvTile invTile = (AEBaseInvTile) te; AEBaseInvTile invTile = (AEBaseInvTile) te;
if (invTile.getInternalInventory().getSlots() > 0) { if( invTile.getInternalInventory().getSlots() > 0 )
{
return ItemHandlerHelper.calcRedstoneFromInventory( invTile.getInternalInventory() ); return ItemHandlerHelper.calcRedstoneFromInventory( invTile.getInternalInventory() );
} }
} }
@@ -219,59 +253,73 @@ public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntity
} }
@Override @Override
public boolean eventReceived(final IBlockState state, final World worldIn, final BlockPos pos, final int eventID, final int eventParam) { public boolean eventReceived( final IBlockState state, final World worldIn, final BlockPos pos, final int eventID, final int eventParam )
{
super.eventReceived( state, worldIn, pos, eventID, eventParam ); super.eventReceived( state, worldIn, pos, eventID, eventParam );
final TileEntity tileentity = worldIn.getTileEntity( pos ); final TileEntity tileentity = worldIn.getTileEntity( pos );
return tileentity != null && tileentity.receiveClientEvent(eventID, eventParam); return tileentity != null ? tileentity.receiveClientEvent( eventID, eventParam ) : false;
} }
@Override @Override
public void onBlockPlacedBy(final World w, final BlockPos pos, final IBlockState state, final EntityLivingBase placer, final ItemStack is) { public void onBlockPlacedBy( final World w, final BlockPos pos, final IBlockState state, final EntityLivingBase placer, final ItemStack is )
if (is.hasDisplayName()) { {
if( is.hasDisplayName() )
{
final TileEntity te = this.getTileEntity( w, pos ); final TileEntity te = this.getTileEntity( w, pos );
if (te instanceof AEBaseTile) { if( te instanceof AEBaseTile )
{
( (AEBaseTile) w.getTileEntity( pos ) ).setName( is.getDisplayName() ); ( (AEBaseTile) w.getTileEntity( pos ) ).setName( is.getDisplayName() );
} }
} }
} }
@Override @Override
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { public boolean onBlockActivated( World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ )
{
ItemStack heldItem; ItemStack heldItem;
if (player != null && !player.getHeldItem(hand).isEmpty()) { if( player != null && !player.getHeldItem( hand ).isEmpty() )
{
heldItem = player.getHeldItem( hand ); heldItem = player.getHeldItem( hand );
if (Platform.isWrench(player, heldItem, pos) && player.isSneaking()) { if( Platform.isWrench( player, heldItem, pos ) && player.isSneaking() )
{
final IBlockState blockState = world.getBlockState( pos ); final IBlockState blockState = world.getBlockState( pos );
final Block block = blockState.getBlock(); final Block block = blockState.getBlock();
if (block == null) { if( block == null )
{
return false; return false;
} }
final AEBaseTile tile = this.getTileEntity( world, pos ); final AEBaseTile tile = this.getTileEntity( world, pos );
if (tile == null) { if( tile == null )
{
return false; return false;
} }
if (tile instanceof TileCableBus || tile instanceof TileSkyChest) { if( tile instanceof TileCableBus || tile instanceof TileSkyChest )
{
return false; return false;
} }
final ItemStack[] itemDropCandidates = Platform.getBlockDrops( world, pos ); final ItemStack[] itemDropCandidates = Platform.getBlockDrops( world, pos );
final ItemStack op = new ItemStack( this ); final ItemStack op = new ItemStack( this );
for (final ItemStack ol : itemDropCandidates) { for( final ItemStack ol : itemDropCandidates )
if (Platform.itemComparisons().isEqualItemType(ol, op)) { {
if( Platform.itemComparisons().isEqualItemType( ol, op ) )
{
final NBTTagCompound tag = tile.downloadSettings( SettingsFrom.DISMANTLE_ITEM ); final NBTTagCompound tag = tile.downloadSettings( SettingsFrom.DISMANTLE_ITEM );
if (tag != null) { if( tag != null )
{
ol.setTagCompound( tag ); ol.setTagCompound( tag );
} }
} }
} }
if (block.removedByPlayer(blockState, world, pos, player, false)) { if( block.removedByPlayer( blockState, world, pos, player, false ) )
{
final List<ItemStack> itemsToDrop = Lists.newArrayList( itemDropCandidates ); final List<ItemStack> itemsToDrop = Lists.newArrayList( itemDropCandidates );
Platform.spawnDrops( world, pos, itemsToDrop ); Platform.spawnDrops( world, pos, itemsToDrop );
world.setBlockToAir( pos ); world.setBlockToAir( pos );
@@ -280,58 +328,62 @@ public abstract class AEBaseTileBlock extends AEBaseBlock implements ITileEntity
return false; return false;
} }
if (heldItem.getItem() instanceof IMemoryCard && !(this instanceof BlockCableBus)) { if( heldItem.getItem() instanceof IMemoryCard && !( this instanceof BlockCableBus ) )
{
final IMemoryCard memoryCard = (IMemoryCard) heldItem.getItem(); final IMemoryCard memoryCard = (IMemoryCard) heldItem.getItem();
final AEBaseTile tileEntity = this.getTileEntity( world, pos ); final AEBaseTile tileEntity = this.getTileEntity( world, pos );
if (tileEntity == null) { if( tileEntity == null )
{
return false; return false;
} }
final String name = this.getUnlocalizedName(); final String name = this.getUnlocalizedName();
if (player.isSneaking()) { if( player.isSneaking() )
{
final NBTTagCompound data = tileEntity.downloadSettings( SettingsFrom.MEMORY_CARD ); final NBTTagCompound data = tileEntity.downloadSettings( SettingsFrom.MEMORY_CARD );
if (data != null) { if( data != null )
{
memoryCard.setMemoryCardContents( heldItem, name, data ); memoryCard.setMemoryCardContents( heldItem, name, data );
memoryCard.notifyUser( player, MemoryCardMessages.SETTINGS_SAVED ); memoryCard.notifyUser( player, MemoryCardMessages.SETTINGS_SAVED );
} }
} else { }
else
{
final String savedName = memoryCard.getSettingsName( heldItem ); final String savedName = memoryCard.getSettingsName( heldItem );
final NBTTagCompound data = memoryCard.getData( heldItem ); final NBTTagCompound data = memoryCard.getData( heldItem );
if (this.getUnlocalizedName().equals(savedName)) { if( this.getUnlocalizedName().equals( savedName ) )
tileEntity.uploadSettings(SettingsFrom.MEMORY_CARD, data, player); {
tileEntity.uploadSettings( SettingsFrom.MEMORY_CARD, data );
memoryCard.notifyUser( player, MemoryCardMessages.SETTINGS_LOADED ); memoryCard.notifyUser( player, MemoryCardMessages.SETTINGS_LOADED );
} else { }
else
{
memoryCard.notifyUser( player, MemoryCardMessages.INVALID_MACHINE ); memoryCard.notifyUser( player, MemoryCardMessages.INVALID_MACHINE );
} }
} }
return true; return true;
} }
if (heldItem.getItem() instanceof ToolQuartzCuttingKnife && !(this instanceof BlockCableBus)) {
if (ForgeEventFactory.onItemUseStart(player, heldItem, 1) <= 0) return false;
final AEBaseTile tile = this.getTileEntity(world, pos);
if (tile == null) return false;
Platform.openGUI(player, tile, AEPartLocation.fromFacing(facing), GuiBridge.GUI_RENAMER);
return true;
}
} }
return this.onActivated( world, pos, player, hand, player.getHeldItem( hand ), facing, hitX, hitY, hitZ ); return this.onActivated( world, pos, player, hand, player.getHeldItem( hand ), facing, hitX, hitY, hitZ );
} }
@Override @Override
public IOrientable getOrientable(final IBlockAccess w, final BlockPos pos) { public IOrientable getOrientable( final IBlockAccess w, final BlockPos pos )
{
return this.getTileEntity( w, pos ); return this.getTileEntity( w, pos );
} }
@Override @Override
public ICustomCollision getCustomCollision(final World w, final BlockPos pos) { public ICustomCollision getCustomCollision( final World w, final BlockPos pos )
{
final AEBaseTile te = this.getTileEntity( w, pos ); final AEBaseTile te = this.getTileEntity( w, pos );
if (te instanceof ICustomCollision) { if( te instanceof ICustomCollision )
{
return (ICustomCollision) te; return (ICustomCollision) te;
} }
@@ -22,8 +22,10 @@ package appeng.block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
public abstract class AEDecorativeBlock extends AEBaseBlock { public abstract class AEDecorativeBlock extends AEBaseBlock
public AEDecorativeBlock(final Material mat) { {
public AEDecorativeBlock( final Material mat )
{
super( mat ); super( mat );
} }
} }
@@ -23,24 +23,29 @@ import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
public final class UnlistedBlockAccess implements IUnlistedProperty<IBlockAccess> { public final class UnlistedBlockAccess implements IUnlistedProperty<IBlockAccess>
{
@Override @Override
public String getName() { public String getName()
{
return "ba"; return "ba";
} }
@Override @Override
public boolean isValid(final IBlockAccess value) { public boolean isValid( final IBlockAccess value )
{
return true; return true;
} }
@Override @Override
public Class<IBlockAccess> getType() { public Class<IBlockAccess> getType()
{
return IBlockAccess.class; return IBlockAccess.class;
} }
@Override @Override
public String valueToString(final IBlockAccess value) { public String valueToString( final IBlockAccess value )
{
return null; return null;
} }
} }
@@ -23,24 +23,29 @@ import net.minecraft.util.math.BlockPos;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
public final class UnlistedBlockPos implements IUnlistedProperty<BlockPos> { public final class UnlistedBlockPos implements IUnlistedProperty<BlockPos>
{
@Override @Override
public String getName() { public String getName()
{
return "pos"; return "pos";
} }
@Override @Override
public boolean isValid(final BlockPos value) { public boolean isValid( final BlockPos value )
{
return true; return true;
} }
@Override @Override
public Class<BlockPos> getType() { public Class<BlockPos> getType()
{
return BlockPos.class; return BlockPos.class;
} }
@Override @Override
public String valueToString(final BlockPos value) { public String valueToString( final BlockPos value )
{
return null; return null;
} }
} }
@@ -23,31 +23,37 @@ import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
public class UnlistedDirection implements IUnlistedProperty<EnumFacing> { public class UnlistedDirection implements IUnlistedProperty<EnumFacing>
{
private final String name; private final String name;
public UnlistedDirection(String name) { public UnlistedDirection( String name )
{
this.name = name; this.name = name;
} }
@Override @Override
public String getName() { public String getName()
{
return this.name; return this.name;
} }
@Override @Override
public boolean isValid(EnumFacing value) { public boolean isValid( EnumFacing value )
{
return value != null; return value != null;
} }
@Override @Override
public Class<EnumFacing> getType() { public Class<EnumFacing> getType()
{
return EnumFacing.class; return EnumFacing.class;
} }
@Override @Override
public String valueToString(EnumFacing value) { public String valueToString( EnumFacing value )
{
return value.getName(); return value.getName();
} }
@@ -19,9 +19,6 @@
package appeng.block.crafting; package appeng.block.crafting;
import appeng.api.util.AEColor;
import appeng.client.UnlistedProperty;
import appeng.tile.crafting.TileCraftingMonitorTile;
import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs; import net.minecraft.creativetab.CreativeTabs;
@@ -36,17 +33,24 @@ import net.minecraftforge.common.property.IUnlistedProperty;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.util.AEColor;
import appeng.client.UnlistedProperty;
import appeng.tile.crafting.TileCraftingMonitorTile;
public class BlockCraftingMonitor extends BlockCraftingUnit {
public class BlockCraftingMonitor extends BlockCraftingUnit
{
public static final UnlistedProperty<AEColor> COLOR = new UnlistedProperty<>( "color", AEColor.class ); public static final UnlistedProperty<AEColor> COLOR = new UnlistedProperty<>( "color", AEColor.class );
public BlockCraftingMonitor() { public BlockCraftingMonitor()
{
super( CraftingUnitType.MONITOR ); super( CraftingUnitType.MONITOR );
} }
@Override @Override
protected BlockStateContainer createBlockState() { protected BlockStateContainer createBlockState()
{
return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] { return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] {
STATE, STATE,
COLOR, COLOR,
@@ -56,13 +60,15 @@ public class BlockCraftingMonitor extends BlockCraftingUnit {
} }
@Override @Override
public IExtendedBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { public IExtendedBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
{
AEColor color = AEColor.TRANSPARENT; AEColor color = AEColor.TRANSPARENT;
EnumFacing forward = EnumFacing.NORTH; EnumFacing forward = EnumFacing.NORTH;
EnumFacing up = EnumFacing.UP; EnumFacing up = EnumFacing.UP;
TileCraftingMonitorTile te = this.getTileEntity( world, pos ); TileCraftingMonitorTile te = this.getTileEntity( world, pos );
if (te != null) { if( te != null )
{
color = te.getColor(); color = te.getColor();
forward = te.getForward(); forward = te.getForward();
up = te.getUp(); up = te.getUp();
@@ -76,7 +82,8 @@ public class BlockCraftingMonitor extends BlockCraftingUnit {
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void getSubBlocks(final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks) { public void getSubBlocks( final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks )
{
itemStacks.add( new ItemStack( this, 1, 0 ) ); itemStacks.add( new ItemStack( this, 1, 0 ) );
} }
} }
@@ -19,9 +19,11 @@
package appeng.block.crafting; package appeng.block.crafting;
public class BlockCraftingStorage extends BlockCraftingUnit { public class BlockCraftingStorage extends BlockCraftingUnit
{
public BlockCraftingStorage(final CraftingUnitType type) { public BlockCraftingStorage( final CraftingUnitType type )
{
super( type ); super( type );
} }
@@ -19,13 +19,8 @@
package appeng.block.crafting; package appeng.block.crafting;
import appeng.api.util.AEPartLocation; import java.util.EnumSet;
import appeng.block.AEBaseTileBlock;
import appeng.client.UnlistedProperty;
import appeng.client.render.crafting.CraftingCubeState;
import appeng.core.sync.GuiBridge;
import appeng.tile.crafting.TileCraftingTile;
import appeng.util.Platform;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
@@ -43,34 +38,46 @@ import net.minecraftforge.common.property.ExtendedBlockState;
import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IExtendedBlockState;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
import java.util.EnumSet; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.client.UnlistedProperty;
import appeng.client.render.crafting.CraftingCubeState;
import appeng.core.sync.GuiBridge;
import appeng.tile.crafting.TileCraftingTile;
import appeng.util.Platform;
public class BlockCraftingUnit extends AEBaseTileBlock { public class BlockCraftingUnit extends AEBaseTileBlock
{
public static final PropertyBool FORMED = PropertyBool.create( "formed" ); public static final PropertyBool FORMED = PropertyBool.create( "formed" );
public static final PropertyBool POWERED = PropertyBool.create( "powered" ); public static final PropertyBool POWERED = PropertyBool.create( "powered" );
public static final UnlistedProperty<CraftingCubeState> STATE = new UnlistedProperty<>( "state", CraftingCubeState.class ); public static final UnlistedProperty<CraftingCubeState> STATE = new UnlistedProperty<>( "state", CraftingCubeState.class );
public final CraftingUnitType type; public final CraftingUnitType type;
public BlockCraftingUnit(final CraftingUnitType type) { public BlockCraftingUnit( final CraftingUnitType type )
{
super( Material.IRON ); super( Material.IRON );
this.type = type; this.type = type;
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
{
return new IProperty[] { POWERED, FORMED }; return new IProperty[] { POWERED, FORMED };
} }
@Override @Override
public IExtendedBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { public IExtendedBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
{
EnumSet<EnumFacing> connections = EnumSet.noneOf( EnumFacing.class ); EnumSet<EnumFacing> connections = EnumSet.noneOf( EnumFacing.class );
for (EnumFacing facing : EnumFacing.values()) { for( EnumFacing facing : EnumFacing.values() )
if (this.isConnected(world, pos, facing)) { {
if( this.isConnected( world, pos, facing ) )
{
connections.add( facing ); connections.add( facing );
} }
} }
@@ -80,45 +87,54 @@ public class BlockCraftingUnit extends AEBaseTileBlock {
return extState.withProperty( STATE, new CraftingCubeState( connections ) ); return extState.withProperty( STATE, new CraftingCubeState( connections ) );
} }
private boolean isConnected(IBlockAccess world, BlockPos pos, EnumFacing side) { private boolean isConnected( IBlockAccess world, BlockPos pos, EnumFacing side )
{
BlockPos adjacentPos = pos.offset( side ); BlockPos adjacentPos = pos.offset( side );
return world.getBlockState( adjacentPos ).getBlock() instanceof BlockCraftingUnit; return world.getBlockState( adjacentPos ).getBlock() instanceof BlockCraftingUnit;
} }
@Override @Override
protected BlockStateContainer createBlockState() { protected BlockStateContainer createBlockState()
{
return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] { STATE } ); return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] { STATE } );
} }
@Override @Override
public IBlockState getStateFromMeta(final int meta) { public IBlockState getStateFromMeta( final int meta )
{
return this.getDefaultState().withProperty( POWERED, ( meta & 1 ) == 1 ).withProperty( FORMED, ( meta & 2 ) == 2 ); return this.getDefaultState().withProperty( POWERED, ( meta & 1 ) == 1 ).withProperty( FORMED, ( meta & 2 ) == 2 );
} }
@Override @Override
public int getMetaFromState(final IBlockState state) { public int getMetaFromState( final IBlockState state )
{
boolean p = state.getValue( POWERED ); boolean p = state.getValue( POWERED );
boolean f = state.getValue( FORMED ); boolean f = state.getValue( FORMED );
return ( p ? 1 : 0 ) | ( f ? 2 : 0 ); return ( p ? 1 : 0 ) | ( f ? 2 : 0 );
} }
@Override @Override
public void neighborChanged(final IBlockState state, final World worldIn, final BlockPos pos, final Block blockIn, final BlockPos fromPos) { public void neighborChanged( final IBlockState state, final World worldIn, final BlockPos pos, final Block blockIn, final BlockPos fromPos )
{
final TileCraftingTile cp = this.getTileEntity( worldIn, pos ); final TileCraftingTile cp = this.getTileEntity( worldIn, pos );
if (cp != null) { if( cp != null )
{
cp.updateMultiBlock(); cp.updateMultiBlock();
} }
} }
@Override @Override
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
{
return BlockRenderLayer.CUTOUT; return BlockRenderLayer.CUTOUT;
} }
@Override @Override
public void breakBlock(final World w, final BlockPos pos, final IBlockState state) { public void breakBlock( final World w, final BlockPos pos, final IBlockState state )
{
final TileCraftingTile cp = this.getTileEntity( w, pos ); final TileCraftingTile cp = this.getTileEntity( w, pos );
if (cp != null) { if( cp != null )
{
cp.breakCluster(); cp.breakCluster();
} }
@@ -126,11 +142,14 @@ public class BlockCraftingUnit extends AEBaseTileBlock {
} }
@Override @Override
public boolean onBlockActivated(final World w, final BlockPos pos, final IBlockState state, final EntityPlayer p, final EnumHand hand, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onBlockActivated( final World w, final BlockPos pos, final IBlockState state, final EntityPlayer p, final EnumHand hand, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
{
final TileCraftingTile tg = this.getTileEntity( w, pos ); final TileCraftingTile tg = this.getTileEntity( w, pos );
if (tg != null && !p.isSneaking() && tg.isFormed() && tg.isActive()) { if( tg != null && !p.isSneaking() && tg.isFormed() && tg.isActive() )
if (Platform.isClient()) { {
if( Platform.isClient() )
{
return true; return true;
} }
@@ -141,7 +160,8 @@ public class BlockCraftingUnit extends AEBaseTileBlock {
return super.onBlockActivated( w, pos, state, p, hand, side, hitX, hitY, hitZ ); return super.onBlockActivated( w, pos, state, p, hand, side, hitX, hitY, hitZ );
} }
public enum CraftingUnitType { public enum CraftingUnitType
{
UNIT, ACCELERATOR, STORAGE_1K, STORAGE_4K, STORAGE_16K, STORAGE_64K, MONITOR UNIT, ACCELERATOR, STORAGE_1K, STORAGE_4K, STORAGE_16K, STORAGE_64K, MONITOR
} }
} }
@@ -19,11 +19,6 @@
package appeng.block.crafting; package appeng.block.crafting;
import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.crafting.TileMolecularAssembler;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.properties.PropertyBool;
@@ -38,12 +33,20 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.crafting.TileMolecularAssembler;
import appeng.util.Platform;
public class BlockMolecularAssembler extends AEBaseTileBlock {
public class BlockMolecularAssembler extends AEBaseTileBlock
{
public static final PropertyBool POWERED = PropertyBool.create( "powered" ); public static final PropertyBool POWERED = PropertyBool.create( "powered" );
public BlockMolecularAssembler() { public BlockMolecularAssembler()
{
super( Material.IRON ); super( Material.IRON );
this.setOpaque( false ); this.setOpaque( false );
@@ -51,15 +54,18 @@ public class BlockMolecularAssembler extends AEBaseTileBlock {
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
{
return new IProperty[]{POWERED}; return new IProperty[]{POWERED};
} }
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { public IBlockState getActualState( IBlockState state, IBlockAccess worldIn, BlockPos pos )
{
boolean powered = false; boolean powered = false;
TileMolecularAssembler te = this.getTileEntity( worldIn, pos ); TileMolecularAssembler te = this.getTileEntity( worldIn, pos );
if (te != null) { if( te != null )
{
powered = te.isPowered(); powered = te.isPowered();
} }
@@ -72,25 +78,30 @@ public class BlockMolecularAssembler extends AEBaseTileBlock {
*/ */
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
@Override @Override
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
{
return BlockRenderLayer.CUTOUT; return BlockRenderLayer.CUTOUT;
} }
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
@Override @Override
public boolean canRenderInLayer(IBlockState state, BlockRenderLayer layer) { public boolean canRenderInLayer( IBlockState state, BlockRenderLayer layer )
{
return layer == BlockRenderLayer.CUTOUT || layer == BlockRenderLayer.TRANSLUCENT; return layer == BlockRenderLayer.CUTOUT || layer == BlockRenderLayer.TRANSLUCENT;
} }
@Override @Override
public boolean isFullCube(IBlockState state) { public boolean isFullCube( IBlockState state )
{
return false; return false;
} }
@Override @Override
public boolean onBlockActivated(final World w, final BlockPos pos, final IBlockState state, final EntityPlayer p, final EnumHand hand, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onBlockActivated( final World w, final BlockPos pos, final IBlockState state, final EntityPlayer p, final EnumHand hand, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
{
final TileMolecularAssembler tg = this.getTileEntity( w, pos ); final TileMolecularAssembler tg = this.getTileEntity( w, pos );
if (tg != null && !p.isSneaking()) { if( tg != null && !p.isSneaking() )
{
Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_MAC ); Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_MAC );
return true; return true;
} }
@@ -99,9 +110,11 @@ public class BlockMolecularAssembler extends AEBaseTileBlock {
} }
@Override @Override
public void onNeighborChange(IBlockAccess world, BlockPos pos, BlockPos neighbor) { public void onNeighborChange( IBlockAccess world, BlockPos pos, BlockPos neighbor )
{
final TileMolecularAssembler tg = this.getTileEntity( world, pos ); final TileMolecularAssembler tg = this.getTileEntity( world, pos );
if (tg != null) { if( tg != null )
{
tg.updateNeighbors( world, pos, neighbor ); tg.updateNeighbors( world, pos, neighbor );
} }
} }
@@ -19,27 +19,32 @@
package appeng.block.crafting; package appeng.block.crafting;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
import appeng.api.AEApi; import appeng.api.AEApi;
import appeng.block.AEBaseItemBlock; import appeng.block.AEBaseItemBlock;
import appeng.core.AEConfig; import appeng.core.AEConfig;
import appeng.core.features.AEFeature; import appeng.core.features.AEFeature;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
public class ItemCraftingStorage extends AEBaseItemBlock { public class ItemCraftingStorage extends AEBaseItemBlock
{
public ItemCraftingStorage(final Block id) { public ItemCraftingStorage( final Block id )
{
super( id ); super( id );
} }
@Override @Override
public ItemStack getContainerItem(final ItemStack itemStack) { public ItemStack getContainerItem( final ItemStack itemStack )
{
return AEApi.instance().definitions().blocks().craftingUnit().maybeStack( 1 ).orElse( ItemStack.EMPTY ); return AEApi.instance().definitions().blocks().craftingUnit().maybeStack( 1 ).orElse( ItemStack.EMPTY );
} }
@Override @Override
public boolean hasContainerItem(final ItemStack stack) { public boolean hasContainerItem( final ItemStack stack )
{
return AEConfig.instance().isFeatureEnabled( AEFeature.ENABLE_DISASSEMBLY_CRAFTING ); return AEConfig.instance().isFeatureEnabled( AEFeature.ENABLE_DISASSEMBLY_CRAFTING );
} }
} }
@@ -19,11 +19,8 @@
package appeng.block.grindstone; package appeng.block.grindstone;
import appeng.api.implementations.tiles.ICrankable; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.stats.Stats;
import appeng.tile.AEBaseTile;
import appeng.tile.grindstone.TileCrank;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.BlockFaceShape; import net.minecraft.block.state.BlockFaceShape;
@@ -40,12 +37,18 @@ import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.common.util.FakePlayer;
import javax.annotation.Nullable; import appeng.api.implementations.tiles.ICrankable;
import appeng.block.AEBaseTileBlock;
import appeng.core.stats.Stats;
import appeng.tile.AEBaseTile;
import appeng.tile.grindstone.TileCrank;
public class BlockCrank extends AEBaseTileBlock { public class BlockCrank extends AEBaseTileBlock
{
public BlockCrank() { public BlockCrank()
{
super( Material.WOOD ); super( Material.WOOD );
this.setLightOpacity( 0 ); this.setLightOpacity( 0 );
@@ -54,15 +57,19 @@ public class BlockCrank extends AEBaseTileBlock {
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (player instanceof FakePlayer || player == null) { {
if( player instanceof FakePlayer || player == null )
{
this.dropCrank( w, pos ); this.dropCrank( w, pos );
return true; return true;
} }
final AEBaseTile tile = this.getTileEntity( w, pos ); final AEBaseTile tile = this.getTileEntity( w, pos );
if (tile instanceof TileCrank) { if( tile instanceof TileCrank )
if (((TileCrank) tile).power()) { {
if( ( (TileCrank) tile ).power() )
{
Stats.TurnedCranks.addToPlayer( player, 1 ); Stats.TurnedCranks.addToPlayer( player, 1 );
} }
} }
@@ -70,42 +77,53 @@ public class BlockCrank extends AEBaseTileBlock {
return true; return true;
} }
private void dropCrank(final World world, final BlockPos pos) { private void dropCrank( final World world, final BlockPos pos )
{
world.destroyBlock( pos, true ); // w.destroyBlock( x, y, z, true ); world.destroyBlock( pos, true ); // w.destroyBlock( x, y, z, true );
world.notifyBlockUpdate( pos, this.getDefaultState(), world.getBlockState( pos ), 3 ); world.notifyBlockUpdate( pos, this.getDefaultState(), world.getBlockState( pos ), 3 );
} }
@Override @Override
public void onBlockPlacedBy(final World world, final BlockPos pos, final IBlockState state, final EntityLivingBase placer, final ItemStack stack) { public void onBlockPlacedBy( final World world, final BlockPos pos, final IBlockState state, final EntityLivingBase placer, final ItemStack stack )
{
final AEBaseTile tile = this.getTileEntity( world, pos ); final AEBaseTile tile = this.getTileEntity( world, pos );
if (tile != null) { if( tile != null )
{
final EnumFacing mnt = this.findCrankable( world, pos ); final EnumFacing mnt = this.findCrankable( world, pos );
EnumFacing forward = EnumFacing.UP; EnumFacing forward = EnumFacing.UP;
if (mnt == EnumFacing.UP || mnt == EnumFacing.DOWN) { if( mnt == EnumFacing.UP || mnt == EnumFacing.DOWN )
{
forward = EnumFacing.SOUTH; forward = EnumFacing.SOUTH;
} }
tile.setOrientation( forward, mnt.getOpposite() ); tile.setOrientation( forward, mnt.getOpposite() );
} else { }
else
{
this.dropCrank( world, pos ); this.dropCrank( world, pos );
} }
} }
@Override @Override
public boolean isValidOrientation(final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up) { public boolean isValidOrientation( final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up )
{
final TileEntity te = w.getTileEntity( pos ); final TileEntity te = w.getTileEntity( pos );
return !( te instanceof TileCrank ) || this.isCrankable( w, pos, up.getOpposite() ); return !( te instanceof TileCrank ) || this.isCrankable( w, pos, up.getOpposite() );
} }
private EnumFacing findCrankable(final World world, final BlockPos pos) { private EnumFacing findCrankable( final World world, final BlockPos pos )
for (final EnumFacing dir : EnumFacing.VALUES) { {
if (this.isCrankable(world, pos, dir)) { for( final EnumFacing dir : EnumFacing.VALUES )
{
if( this.isCrankable( world, pos, dir ) )
{
return dir; return dir;
} }
} }
return null; return null;
} }
private boolean isCrankable(final World world, final BlockPos pos, final EnumFacing offset) { private boolean isCrankable( final World world, final BlockPos pos, final EnumFacing offset )
{
final BlockPos o = pos.offset( offset ); final BlockPos o = pos.offset( offset );
final TileEntity te = world.getTileEntity( o ); final TileEntity te = world.getTileEntity( o );
@@ -113,40 +131,50 @@ public class BlockCrank extends AEBaseTileBlock {
} }
@Override @Override
public EnumBlockRenderType getRenderType(IBlockState state) { public EnumBlockRenderType getRenderType( IBlockState state )
{
return EnumBlockRenderType.ENTITYBLOCK_ANIMATED; return EnumBlockRenderType.ENTITYBLOCK_ANIMATED;
} }
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
{
final AEBaseTile tile = this.getTileEntity( world, pos ); final AEBaseTile tile = this.getTileEntity( world, pos );
if (tile != null) { if( tile != null )
if (!this.isCrankable(world, pos, tile.getUp().getOpposite())) { {
if( !this.isCrankable( world, pos, tile.getUp().getOpposite() ) )
{
this.dropCrank( world, pos ); this.dropCrank( world, pos );
} }
} else { }
else
{
this.dropCrank( world, pos ); this.dropCrank( world, pos );
} }
} }
@Override @Override
public boolean canPlaceBlockAt(final World world, final BlockPos pos) { public boolean canPlaceBlockAt( final World world, final BlockPos pos )
{
return this.findCrankable( world, pos ) != null; return this.findCrankable( world, pos ) != null;
} }
@Override @Override
public boolean isFullCube(IBlockState state) { public boolean isFullCube( IBlockState state )
{
return false; return false;
} }
@Override @Override
public boolean canPlaceTorchOnTop(IBlockState state, IBlockAccess world, BlockPos pos) { public boolean canPlaceTorchOnTop( IBlockState state, IBlockAccess world, BlockPos pos )
{
return false; return false;
} }
@Override @Override
public BlockFaceShape getBlockFaceShape(IBlockAccess worldIn, IBlockState state, BlockPos pos, EnumFacing face) { public BlockFaceShape getBlockFaceShape( IBlockAccess worldIn, IBlockState state, BlockPos pos, EnumFacing face )
{
return BlockFaceShape.UNDEFINED; return BlockFaceShape.UNDEFINED;
} }
@@ -19,11 +19,8 @@
package appeng.block.grindstone; package appeng.block.grindstone;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.grindstone.TileGrinder;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@@ -32,21 +29,29 @@ import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.grindstone.TileGrinder;
import appeng.util.Platform;
public class BlockGrinder extends AEBaseTileBlock { public class BlockGrinder extends AEBaseTileBlock
{
public BlockGrinder() { public BlockGrinder()
{
super( Material.ROCK ); super( Material.ROCK );
this.setHardness( 3.2F ); this.setHardness( 3.2F );
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
{
final TileGrinder tg = this.getTileEntity( w, pos ); final TileGrinder tg = this.getTileEntity( w, pos );
if (tg != null && !p.isSneaking()) { if( tg != null && !p.isSneaking() )
{
Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_GRINDER ); Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_GRINDER );
return true; return true;
} }
@@ -19,19 +19,22 @@
package appeng.block.grindstone; package appeng.block.grindstone;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import appeng.client.render.tesr.CrankTESR; import appeng.client.render.tesr.CrankTESR;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class CrankRendering extends BlockRenderingCustomizer { public class CrankRendering extends BlockRenderingCustomizer
{
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
{
rendering.tesr( new CrankTESR() ); rendering.tesr( new CrankTESR() );
} }
} }
@@ -19,11 +19,8 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileCellWorkbench;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@@ -32,24 +29,34 @@ import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileCellWorkbench;
import appeng.util.Platform;
public class BlockCellWorkbench extends AEBaseTileBlock { public class BlockCellWorkbench extends AEBaseTileBlock
{
public BlockCellWorkbench() { public BlockCellWorkbench()
{
super( Material.IRON ); super( Material.IRON );
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (p.isSneaking()) { {
if( p.isSneaking() )
{
return false; return false;
} }
final TileCellWorkbench tg = this.getTileEntity( w, pos ); final TileCellWorkbench tg = this.getTileEntity( w, pos );
if (tg != null) { if( tg != null )
if (Platform.isServer()) { {
if( Platform.isServer() )
{
Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_CELL_WORKBENCH ); Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_CELL_WORKBENCH );
} }
return true; return true;
@@ -19,18 +19,17 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.AEApi; import java.util.Collections;
import appeng.api.util.AEAxisAlignedBB; import java.util.List;
import appeng.block.AEBaseTileBlock; import java.util.Random;
import appeng.client.render.effects.LightningFX;
import appeng.client.render.renderable.ItemRenderable; import javax.annotation.Nullable;
import appeng.client.render.tesr.ModularTESR;
import appeng.core.AEConfig; import org.apache.commons.lang3.tuple.ImmutablePair;
import appeng.core.AppEng; import org.apache.commons.lang3.tuple.Pair;
import appeng.helpers.ICustomCollision; import org.lwjgl.util.vector.Matrix4f;
import appeng.tile.AEBaseTile; import org.lwjgl.util.vector.Vector3f;
import appeng.tile.misc.TileCharger;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@@ -45,20 +44,26 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.lwjgl.util.vector.Matrix4f;
import org.lwjgl.util.vector.Vector3f;
import javax.annotation.Nullable; import appeng.api.AEApi;
import java.util.Collections; import appeng.api.util.AEAxisAlignedBB;
import java.util.List; import appeng.block.AEBaseTileBlock;
import java.util.Random; import appeng.client.render.effects.LightningFX;
import appeng.client.render.renderable.ItemRenderable;
import appeng.client.render.tesr.ModularTESR;
import appeng.core.AEConfig;
import appeng.core.AppEng;
import appeng.helpers.ICustomCollision;
import appeng.tile.AEBaseTile;
import appeng.tile.misc.TileCharger;
import appeng.util.Platform;
public class BlockCharger extends AEBaseTileBlock implements ICustomCollision { public class BlockCharger extends AEBaseTileBlock implements ICustomCollision
{
public BlockCharger() { public BlockCharger()
{
super( Material.IRON ); super( Material.IRON );
this.setLightOpacity( 2 ); this.setLightOpacity( 2 );
@@ -66,14 +71,18 @@ public class BlockCharger extends AEBaseTileBlock implements ICustomCollision {
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (player.isSneaking()) { {
if( player.isSneaking() )
{
return false; return false;
} }
if (Platform.isServer()) { if( Platform.isServer() )
{
final TileCharger tc = this.getTileEntity( w, pos ); final TileCharger tc = this.getTileEntity( w, pos );
if (tc != null) { if( tc != null )
{
tc.activate( player ); tc.activate( player );
} }
} }
@@ -83,26 +92,33 @@ public class BlockCharger extends AEBaseTileBlock implements ICustomCollision {
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void randomDisplayTick(final IBlockState state, final World w, final BlockPos pos, final Random r) { public void randomDisplayTick( final IBlockState state, final World w, final BlockPos pos, final Random r )
if (!AEConfig.instance().isEnableEffects()) { {
if( !AEConfig.instance().isEnableEffects() )
{
return; return;
} }
if (r.nextFloat() < 0.98) { if( r.nextFloat() < 0.98 )
{
return; return;
} }
final AEBaseTile tile = this.getTileEntity( w, pos ); final AEBaseTile tile = this.getTileEntity( w, pos );
if (tile instanceof TileCharger) { if( tile instanceof TileCharger )
{
final TileCharger tc = (TileCharger) tile; final TileCharger tc = (TileCharger) tile;
if (AEApi.instance().definitions().materials().certusQuartzCrystalCharged().isSameAs(tc.getInternalInventory().getStackInSlot(0))) { if( AEApi.instance().definitions().materials().certusQuartzCrystalCharged().isSameAs( tc.getInternalInventory().getStackInSlot( 0 ) ) )
{
final double xOff = 0.0; final double xOff = 0.0;
final double yOff = 0.0; final double yOff = 0.0;
final double zOff = 0.0; final double zOff = 0.0;
for (int bolts = 0; bolts < 3; bolts++) { for( int bolts = 0; bolts < 3; bolts++ )
if (AppEng.proxy.shouldAddParticles(r)) { {
if( AppEng.proxy.shouldAddParticles( r ) )
{
final LightningFX fx = new LightningFX( w, xOff + 0.5 + pos.getX(), yOff + 0.5 + pos.getY(), zOff + 0.5 + pos final LightningFX fx = new LightningFX( w, xOff + 0.5 + pos.getX(), yOff + 0.5 + pos.getY(), zOff + 0.5 + pos
.getZ(), 0.0D, 0.0D, 0.0D ); .getZ(), 0.0D, 0.0D, 0.0D );
Minecraft.getMinecraft().effectRenderer.addEffect( fx ); Minecraft.getMinecraft().effectRenderer.addEffect( fx );
@@ -113,28 +129,34 @@ public class BlockCharger extends AEBaseTileBlock implements ICustomCollision {
} }
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
{
final TileCharger tile = this.getTileEntity( w, pos ); final TileCharger tile = this.getTileEntity( w, pos );
if (tile != null) { if( tile != null )
{
final double twoPixels = 2.0 / 16.0; final double twoPixels = 2.0 / 16.0;
final EnumFacing up = tile.getUp(); final EnumFacing up = tile.getUp();
final EnumFacing forward = tile.getForward(); final EnumFacing forward = tile.getForward();
final AEAxisAlignedBB bb = new AEAxisAlignedBB( twoPixels, twoPixels, twoPixels, 1.0 - twoPixels, 1.0 - twoPixels, 1.0 - twoPixels ); final AEAxisAlignedBB bb = new AEAxisAlignedBB( twoPixels, twoPixels, twoPixels, 1.0 - twoPixels, 1.0 - twoPixels, 1.0 - twoPixels );
if (up.getFrontOffsetX() != 0) { if( up.getFrontOffsetX() != 0 )
{
bb.minX = 0; bb.minX = 0;
bb.maxX = 1; bb.maxX = 1;
} }
if (up.getFrontOffsetY() != 0) { if( up.getFrontOffsetY() != 0 )
{
bb.minY = 0; bb.minY = 0;
bb.maxY = 1; bb.maxY = 1;
} }
if (up.getFrontOffsetZ() != 0) { if( up.getFrontOffsetZ() != 0 )
{
bb.minZ = 0; bb.minZ = 0;
bb.maxZ = 1; bb.maxZ = 1;
} }
switch (forward) { switch( forward )
{
case DOWN: case DOWN:
bb.maxY = 1; bb.maxY = 1;
break; break;
@@ -163,17 +185,20 @@ public class BlockCharger extends AEBaseTileBlock implements ICustomCollision {
} }
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) { public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
{
out.add( new AxisAlignedBB( 0.0, 0.0, 0.0, 1.0, 1.0, 1.0 ) ); out.add( new AxisAlignedBB( 0.0, 0.0, 0.0, 1.0, 1.0, 1.0 ) );
} }
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public static TileEntitySpecialRenderer<TileCharger> createTesr() { public static TileEntitySpecialRenderer<TileCharger> createTesr()
{
return new ModularTESR<>( new ItemRenderable<>( BlockCharger::getRenderedItem ) ); return new ModularTESR<>( new ItemRenderable<>( BlockCharger::getRenderedItem ) );
} }
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
private static Pair<ItemStack, Matrix4f> getRenderedItem(TileCharger tile) { private static Pair<ItemStack, Matrix4f> getRenderedItem( TileCharger tile )
{
Matrix4f transform = new Matrix4f(); Matrix4f transform = new Matrix4f();
transform.translate( new Vector3f( 0.5f, 0.4f, 0.5f ) ); transform.translate( new Vector3f( 0.5f, 0.4f, 0.5f ) );
return new ImmutablePair<>( tile.getInternalInventory().getStackInSlot( 0 ), transform ); return new ImmutablePair<>( tile.getInternalInventory().getStackInSlot( 0 ), transform );
@@ -19,11 +19,8 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileCondenser;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@@ -32,24 +29,34 @@ import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileCondenser;
import appeng.util.Platform;
public class BlockCondenser extends AEBaseTileBlock { public class BlockCondenser extends AEBaseTileBlock
{
public BlockCondenser() { public BlockCondenser()
{
super( Material.IRON ); super( Material.IRON );
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (player.isSneaking()) { {
if( player.isSneaking() )
{
return false; return false;
} }
if (Platform.isServer()) { if( Platform.isServer() )
{
final TileCondenser tc = this.getTileEntity( w, pos ); final TileCondenser tc = this.getTileEntity( w, pos );
if (tc != null && !player.isSneaking()) { if( tc != null && !player.isSneaking() )
{
Platform.openGUI( player, tc, AEPartLocation.fromFacing( side ), GuiBridge.GUI_CONDENSER ); Platform.openGUI( player, tc, AEPartLocation.fromFacing( side ), GuiBridge.GUI_CONDENSER );
return true; return true;
} }
@@ -19,11 +19,8 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileInscriber;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
@@ -34,12 +31,18 @@ import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileInscriber;
import appeng.util.Platform;
public class BlockInscriber extends AEBaseTileBlock { public class BlockInscriber extends AEBaseTileBlock
{
public BlockInscriber() { public BlockInscriber()
{
super( Material.IRON ); super( Material.IRON );
this.setLightOpacity( 2 ); this.setLightOpacity( 2 );
@@ -47,14 +50,18 @@ public class BlockInscriber extends AEBaseTileBlock {
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (p.isSneaking()) { {
if( p.isSneaking() )
{
return false; return false;
} }
final TileInscriber tg = this.getTileEntity( w, pos ); final TileInscriber tg = this.getTileEntity( w, pos );
if (tg != null) { if( tg != null )
if (Platform.isServer()) { {
if( Platform.isServer() )
{
Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_INSCRIBER ); Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_INSCRIBER );
} }
return true; return true;
@@ -63,12 +70,14 @@ public class BlockInscriber extends AEBaseTileBlock {
} }
@Override @Override
public EnumBlockRenderType getRenderType(IBlockState state) { public EnumBlockRenderType getRenderType( IBlockState state )
{
return EnumBlockRenderType.MODEL; return EnumBlockRenderType.MODEL;
} }
@Override @Override
public String getUnlocalizedName(final ItemStack is) { public String getUnlocalizedName( final ItemStack is )
{
return super.getUnlocalizedName( is ); return super.getUnlocalizedName( is );
} }
} }
@@ -19,12 +19,8 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.api.util.IOrientable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileInterface;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.properties.PropertyBool;
@@ -37,28 +33,38 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.api.util.IOrientable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileInterface;
import appeng.util.Platform;
public class BlockInterface extends AEBaseTileBlock { public class BlockInterface extends AEBaseTileBlock
{
private static final PropertyBool OMNIDIRECTIONAL = PropertyBool.create( "omnidirectional" ); private static final PropertyBool OMNIDIRECTIONAL = PropertyBool.create( "omnidirectional" );
public BlockInterface() { public BlockInterface()
{
super( Material.IRON ); super( Material.IRON );
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
{
return new IProperty[] { OMNIDIRECTIONAL }; return new IProperty[] { OMNIDIRECTIONAL };
} }
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getActualState( IBlockState state, IBlockAccess world, BlockPos pos )
{
// Determine whether the interface is omni-directional or not // Determine whether the interface is omni-directional or not
TileInterface te = this.getTileEntity( world, pos ); TileInterface te = this.getTileEntity( world, pos );
boolean omniDirectional = true; // The default boolean omniDirectional = true; // The default
if (te != null) { if( te != null )
{
omniDirectional = te.isOmniDirectional(); omniDirectional = te.isOmniDirectional();
} }
@@ -67,14 +73,18 @@ public class BlockInterface extends AEBaseTileBlock {
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (p.isSneaking()) { {
if( p.isSneaking() )
{
return false; return false;
} }
final TileInterface tg = this.getTileEntity( w, pos ); final TileInterface tg = this.getTileEntity( w, pos );
if (tg != null) { if( tg != null )
if (Platform.isServer()) { {
if( Platform.isServer() )
{
Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_INTERFACE ); Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_INTERFACE );
} }
return true; return true;
@@ -83,13 +93,16 @@ public class BlockInterface extends AEBaseTileBlock {
} }
@Override @Override
protected boolean hasCustomRotation() { protected boolean hasCustomRotation()
{
return true; return true;
} }
@Override @Override
protected void customRotateBlock(final IOrientable rotatable, final EnumFacing axis) { protected void customRotateBlock( final IOrientable rotatable, final EnumFacing axis )
if (rotatable instanceof TileInterface) { {
if( rotatable instanceof TileInterface )
{
( (TileInterface) rotatable ).setSide( axis ); ( (TileInterface) rotatable ).setSide( axis );
} }
} }
@@ -19,12 +19,10 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.IOrientable; import java.util.Collections;
import appeng.api.util.IOrientableBlock; import java.util.List;
import appeng.block.AEBaseTileBlock; import java.util.Random;
import appeng.helpers.ICustomCollision;
import appeng.helpers.MetaRotation;
import appeng.tile.misc.TileLightDetector;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
@@ -41,12 +39,16 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.Collections; import appeng.api.util.IOrientable;
import java.util.List; import appeng.api.util.IOrientableBlock;
import java.util.Random; import appeng.block.AEBaseTileBlock;
import appeng.helpers.ICustomCollision;
import appeng.helpers.MetaRotation;
import appeng.tile.misc.TileLightDetector;
public class BlockLightDetector extends AEBaseTileBlock implements IOrientableBlock, ICustomCollision { public class BlockLightDetector extends AEBaseTileBlock implements IOrientableBlock, ICustomCollision
{
// Cannot use the vanilla FACING property here because it excludes facing DOWN // Cannot use the vanilla FACING property here because it excludes facing DOWN
public static final PropertyDirection FACING = PropertyDirection.create( "facing" ); public static final PropertyDirection FACING = PropertyDirection.create( "facing" );
@@ -54,7 +56,8 @@ public class BlockLightDetector extends AEBaseTileBlock implements IOrientableBl
// Used to alternate between two variants of the fixture on adjacent blocks // Used to alternate between two variants of the fixture on adjacent blocks
public static final PropertyBool ODD = PropertyBool.create( "odd" ); public static final PropertyBool ODD = PropertyBool.create( "odd" );
public BlockLightDetector() { public BlockLightDetector()
{
super( Material.CIRCUITS ); super( Material.CIRCUITS );
this.setDefaultState( this.blockState.getBaseState().withProperty( FACING, EnumFacing.UP ).withProperty( ODD, false ) ); this.setDefaultState( this.blockState.getBaseState().withProperty( FACING, EnumFacing.UP ).withProperty( ODD, false ) );
@@ -64,24 +67,29 @@ public class BlockLightDetector extends AEBaseTileBlock implements IOrientableBl
} }
@Override @Override
public int getMetaFromState(final IBlockState state) { public int getMetaFromState( final IBlockState state )
{
return state.getValue( FACING ).ordinal(); return state.getValue( FACING ).ordinal();
} }
@Override @Override
public IBlockState getStateFromMeta(final int meta) { public IBlockState getStateFromMeta( final int meta )
{
EnumFacing facing = EnumFacing.values()[meta]; EnumFacing facing = EnumFacing.values()[meta];
return this.getDefaultState().withProperty( FACING, facing ); return this.getDefaultState().withProperty( FACING, facing );
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
{
return new IProperty[] { FACING, ODD }; return new IProperty[] { FACING, ODD };
} }
@Override @Override
public int getWeakPower(final IBlockState state, final IBlockAccess w, final BlockPos pos, final EnumFacing side) { public int getWeakPower( final IBlockState state, final IBlockAccess w, final BlockPos pos, final EnumFacing side )
if (w instanceof World && ((TileLightDetector) this.getTileEntity(w, pos)).isReady()) { {
if( w instanceof World && ( (TileLightDetector) this.getTileEntity( w, pos ) ).isReady() )
{
return ( (World) w ).getLightFromNeighbors( pos ) - 6; return ( (World) w ).getLightFromNeighbors( pos ) - 6;
} }
@@ -89,31 +97,37 @@ public class BlockLightDetector extends AEBaseTileBlock implements IOrientableBl
} }
@Override @Override
public void onNeighborChange(final IBlockAccess world, final BlockPos pos, final BlockPos neighbor) { public void onNeighborChange( final IBlockAccess world, final BlockPos pos, final BlockPos neighbor )
{
super.onNeighborChange( world, pos, neighbor ); super.onNeighborChange( world, pos, neighbor );
final TileLightDetector tld = this.getTileEntity( world, pos ); final TileLightDetector tld = this.getTileEntity( world, pos );
if (tld != null) { if( tld != null )
{
tld.updateLight(); tld.updateLight();
} }
} }
@Override @Override
public void randomDisplayTick(final IBlockState state, final World worldIn, final BlockPos pos, final Random rand) { public void randomDisplayTick( final IBlockState state, final World worldIn, final BlockPos pos, final Random rand )
{
// cancel out lightning // cancel out lightning
} }
@Override @Override
public boolean isValidOrientation(final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up) { public boolean isValidOrientation( final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up )
{
return this.canPlaceAt( w, pos, up.getOpposite() ); return this.canPlaceAt( w, pos, up.getOpposite() );
} }
private boolean canPlaceAt(final World w, final BlockPos pos, final EnumFacing dir) { private boolean canPlaceAt( final World w, final BlockPos pos, final EnumFacing dir )
{
return w.isSideSolid( pos.offset( dir ), dir.getOpposite(), false ); return w.isSideSolid( pos.offset( dir ), dir.getOpposite(), false );
} }
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
{
final EnumFacing up = this.getOrientable( w, pos ).getUp(); final EnumFacing up = this.getOrientable( w, pos ).getUp();
final double xOff = -0.3 * up.getFrontOffsetX(); final double xOff = -0.3 * up.getFrontOffsetX();
final double yOff = -0.3 * up.getFrontOffsetY(); final double yOff = -0.3 * up.getFrontOffsetY();
@@ -122,7 +136,8 @@ public class BlockLightDetector extends AEBaseTileBlock implements IOrientableBl
} }
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) {/* public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
{/*
* double xOff = -0.15 * getUp().offsetX; double yOff = -0.15 * * double xOff = -0.15 * getUp().offsetX; double yOff = -0.15 *
* getUp().offsetY; double zOff = -0.15 * getUp().offsetZ; out.add( * getUp().offsetY; double zOff = -0.15 * getUp().offsetZ; out.add(
* AxisAlignedBB.getBoundingBox( xOff + (double) x + 0.15, yOff + * AxisAlignedBB.getBoundingBox( xOff + (double) x + 0.15, yOff +
@@ -132,23 +147,29 @@ public class BlockLightDetector extends AEBaseTileBlock implements IOrientableBl
} }
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
{
final EnumFacing up = this.getOrientable( world, pos ).getUp(); final EnumFacing up = this.getOrientable( world, pos ).getUp();
if (!this.canPlaceAt(world, pos, up.getOpposite())) { if( !this.canPlaceAt( world, pos, up.getOpposite() ) )
{
this.dropTorch( world, pos ); this.dropTorch( world, pos );
} }
} }
private void dropTorch(final World w, final BlockPos pos) { private void dropTorch( final World w, final BlockPos pos )
{
final IBlockState prev = w.getBlockState( pos ); final IBlockState prev = w.getBlockState( pos );
w.destroyBlock( pos, true ); w.destroyBlock( pos, true );
w.notifyBlockUpdate( pos, prev, w.getBlockState( pos ), 3 ); w.notifyBlockUpdate( pos, prev, w.getBlockState( pos ), 3 );
} }
@Override @Override
public boolean canPlaceBlockAt(final World w, final BlockPos pos) { public boolean canPlaceBlockAt( final World w, final BlockPos pos )
for (final EnumFacing dir : EnumFacing.VALUES) { {
if (this.canPlaceAt(w, pos, dir)) { for( final EnumFacing dir : EnumFacing.VALUES )
{
if( this.canPlaceAt( w, pos, dir ) )
{
return true; return true;
} }
} }
@@ -156,23 +177,27 @@ public class BlockLightDetector extends AEBaseTileBlock implements IOrientableBl
} }
@Override @Override
public boolean usesMetadata() { public boolean usesMetadata()
{
return false; return false;
} }
@Override @Override
public boolean isFullCube(IBlockState state) { public boolean isFullCube( IBlockState state )
{
return false; return false;
} }
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
{
return BlockRenderLayer.CUTOUT; return BlockRenderLayer.CUTOUT;
} }
@Override @Override
public IOrientable getOrientable(final IBlockAccess w, final BlockPos pos) { public IOrientable getOrientable( final IBlockAccess w, final BlockPos pos )
{
return new MetaRotation( w, pos, FACING ); return new MetaRotation( w, pos, FACING );
} }
@@ -19,14 +19,10 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.IOrientable; import java.util.Collections;
import appeng.api.util.IOrientableBlock; import java.util.List;
import appeng.block.AEBaseBlock; import java.util.Random;
import appeng.client.render.effects.LightningFX;
import appeng.core.AEConfig;
import appeng.core.AppEng;
import appeng.helpers.ICustomCollision;
import appeng.helpers.MetaRotation;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
@@ -44,12 +40,18 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.Collections; import appeng.api.util.IOrientable;
import java.util.List; import appeng.api.util.IOrientableBlock;
import java.util.Random; import appeng.block.AEBaseBlock;
import appeng.client.render.effects.LightningFX;
import appeng.core.AEConfig;
import appeng.core.AppEng;
import appeng.helpers.ICustomCollision;
import appeng.helpers.MetaRotation;
public class BlockQuartzFixture extends AEBaseBlock implements IOrientableBlock, ICustomCollision { public class BlockQuartzFixture extends AEBaseBlock implements IOrientableBlock, ICustomCollision
{
// Cannot use the vanilla FACING property here because it excludes facing DOWN // Cannot use the vanilla FACING property here because it excludes facing DOWN
public static final PropertyDirection FACING = PropertyDirection.create( "facing" ); public static final PropertyDirection FACING = PropertyDirection.create( "facing" );
@@ -57,7 +59,8 @@ public class BlockQuartzFixture extends AEBaseBlock implements IOrientableBlock,
// Used to alternate between two variants of the fixture on adjacent blocks // Used to alternate between two variants of the fixture on adjacent blocks
public static final PropertyBool ODD = PropertyBool.create( "odd" ); public static final PropertyBool ODD = PropertyBool.create( "odd" );
public BlockQuartzFixture() { public BlockQuartzFixture()
{
super( Material.CIRCUITS ); super( Material.CIRCUITS );
this.setDefaultState( this.blockState.getBaseState().withProperty( FACING, EnumFacing.UP ).withProperty( ODD, false ) ); this.setDefaultState( this.blockState.getBaseState().withProperty( FACING, EnumFacing.UP ).withProperty( ODD, false ) );
@@ -71,7 +74,8 @@ public class BlockQuartzFixture extends AEBaseBlock implements IOrientableBlock,
* Sets the "ODD" property of the block state according to the placement of the block. * Sets the "ODD" property of the block state according to the placement of the block.
*/ */
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { public IBlockState getActualState( IBlockState state, IBlockAccess worldIn, BlockPos pos )
{
boolean oddPlacement = ( ( pos.getX() + pos.getY() + pos.getZ() ) % 2 ) != 0; boolean oddPlacement = ( ( pos.getX() + pos.getY() + pos.getZ() ) % 2 ) != 0;
return super.getActualState( state, worldIn, pos ) return super.getActualState( state, worldIn, pos )
@@ -79,33 +83,39 @@ public class BlockQuartzFixture extends AEBaseBlock implements IOrientableBlock,
} }
@Override @Override
public int getMetaFromState(final IBlockState state) { public int getMetaFromState( final IBlockState state )
{
return state.getValue( FACING ).ordinal(); return state.getValue( FACING ).ordinal();
} }
@Override @Override
public IBlockState getStateFromMeta(final int meta) { public IBlockState getStateFromMeta( final int meta )
{
EnumFacing facing = EnumFacing.values()[meta]; EnumFacing facing = EnumFacing.values()[meta];
return this.getDefaultState().withProperty( FACING, facing ); return this.getDefaultState().withProperty( FACING, facing );
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
{
return new IProperty[] { FACING, ODD }; return new IProperty[] { FACING, ODD };
} }
@Override @Override
public boolean isValidOrientation(final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up) { public boolean isValidOrientation( final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up )
{
return this.canPlaceAt( w, pos, up.getOpposite() ); return this.canPlaceAt( w, pos, up.getOpposite() );
} }
private boolean canPlaceAt(final World w, final BlockPos pos, final EnumFacing dir) { private boolean canPlaceAt( final World w, final BlockPos pos, final EnumFacing dir )
{
final BlockPos test = pos.offset( dir ); final BlockPos test = pos.offset( dir );
return w.isSideSolid( test, dir.getOpposite(), false ); return w.isSideSolid( test, dir.getOpposite(), false );
} }
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity e, final boolean isVisual) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity e, final boolean isVisual )
{
final EnumFacing up = this.getOrientable( w, pos ).getUp(); final EnumFacing up = this.getOrientable( w, pos ).getUp();
final double xOff = -0.3 * up.getFrontOffsetX(); final double xOff = -0.3 * up.getFrontOffsetX();
final double yOff = -0.3 * up.getFrontOffsetY(); final double yOff = -0.3 * up.getFrontOffsetY();
@@ -114,7 +124,8 @@ public class BlockQuartzFixture extends AEBaseBlock implements IOrientableBlock,
} }
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List out, final Entity e) {/* public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List out, final Entity e )
{/*
* double xOff = -0.15 * getUp().offsetX; double yOff = -0.15 * getUp().offsetY; double zOff = -0.15 * * double xOff = -0.15 * getUp().offsetX; double yOff = -0.15 * getUp().offsetY; double zOff = -0.15 *
* getUp().offsetZ; out.add( AxisAlignedBB.getBoundingBox( xOff + (double) x + 0.15, yOff + (double) y + 0.15, * getUp().offsetZ; out.add( AxisAlignedBB.getBoundingBox( xOff + (double) x + 0.15, yOff + (double) y + 0.15,
* zOff * zOff
@@ -124,12 +135,15 @@ public class BlockQuartzFixture extends AEBaseBlock implements IOrientableBlock,
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void randomDisplayTick(final IBlockState state, final World w, final BlockPos pos, final Random r) { public void randomDisplayTick( final IBlockState state, final World w, final BlockPos pos, final Random r )
if (!AEConfig.instance().isEnableEffects()) { {
if( !AEConfig.instance().isEnableEffects() )
{
return; return;
} }
if (r.nextFloat() < 0.98) { if( r.nextFloat() < 0.98 )
{
return; return;
} }
@@ -137,8 +151,10 @@ public class BlockQuartzFixture extends AEBaseBlock implements IOrientableBlock,
final double xOff = -0.3 * up.getFrontOffsetX(); final double xOff = -0.3 * up.getFrontOffsetX();
final double yOff = -0.3 * up.getFrontOffsetY(); final double yOff = -0.3 * up.getFrontOffsetY();
final double zOff = -0.3 * up.getFrontOffsetZ(); final double zOff = -0.3 * up.getFrontOffsetZ();
for (int bolts = 0; bolts < 3; bolts++) { for( int bolts = 0; bolts < 3; bolts++ )
if (AppEng.proxy.shouldAddParticles(r)) { {
if( AppEng.proxy.shouldAddParticles( r ) )
{
final LightningFX fx = new LightningFX( w, xOff + 0.5 + pos.getX(), yOff + 0.5 + pos.getY(), zOff + 0.5 + pos.getZ(), 0.0D, 0.0D, 0.0D ); final LightningFX fx = new LightningFX( w, xOff + 0.5 + pos.getX(), yOff + 0.5 + pos.getY(), zOff + 0.5 + pos.getZ(), 0.0D, 0.0D, 0.0D );
Minecraft.getMinecraft().effectRenderer.addEffect( fx ); Minecraft.getMinecraft().effectRenderer.addEffect( fx );
@@ -147,23 +163,29 @@ public class BlockQuartzFixture extends AEBaseBlock implements IOrientableBlock,
} }
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
{
final EnumFacing up = this.getOrientable( world, pos ).getUp(); final EnumFacing up = this.getOrientable( world, pos ).getUp();
if (!this.canPlaceAt(world, pos, up.getOpposite())) { if( !this.canPlaceAt( world, pos, up.getOpposite() ) )
{
this.dropTorch( world, pos ); this.dropTorch( world, pos );
} }
} }
private void dropTorch(final World w, final BlockPos pos) { private void dropTorch( final World w, final BlockPos pos )
{
final IBlockState prev = w.getBlockState( pos ); final IBlockState prev = w.getBlockState( pos );
w.destroyBlock( pos, true ); w.destroyBlock( pos, true );
w.notifyBlockUpdate( pos, prev, w.getBlockState( pos ), 3 ); w.notifyBlockUpdate( pos, prev, w.getBlockState( pos ), 3 );
} }
@Override @Override
public boolean canPlaceBlockAt(final World w, final BlockPos pos) { public boolean canPlaceBlockAt( final World w, final BlockPos pos )
for (final EnumFacing dir : EnumFacing.VALUES) { {
if (this.canPlaceAt(w, pos, dir)) { for( final EnumFacing dir : EnumFacing.VALUES )
{
if( this.canPlaceAt( w, pos, dir ) )
{
return true; return true;
} }
} }
@@ -171,28 +193,33 @@ public class BlockQuartzFixture extends AEBaseBlock implements IOrientableBlock,
} }
@Override @Override
public boolean usesMetadata() { public boolean usesMetadata()
{
return true; return true;
} }
@Override @Override
public IOrientable getOrientable(final IBlockAccess w, final BlockPos pos) { public IOrientable getOrientable( final IBlockAccess w, final BlockPos pos )
{
return new MetaRotation( w, pos, FACING ); return new MetaRotation( w, pos, FACING );
} }
@Override @Override
public boolean isOpaque() { public boolean isOpaque()
{
return false; return false;
} }
@Override @Override
public boolean isFullCube(IBlockState state) { public boolean isFullCube( IBlockState state )
{
return false; return false;
} }
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
{
return BlockRenderLayer.CUTOUT; return BlockRenderLayer.CUTOUT;
} }
@@ -19,13 +19,8 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.IOrientableBlock; import java.util.Random;
import appeng.block.AEBaseTileBlock;
import appeng.client.render.effects.LightningFX;
import appeng.core.AEConfig;
import appeng.core.AppEng;
import appeng.tile.misc.TileQuartzGrowthAccelerator;
import appeng.util.Platform;
import net.minecraft.block.SoundType; import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
@@ -39,21 +34,30 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.Random; import appeng.api.util.IOrientableBlock;
import appeng.block.AEBaseTileBlock;
import appeng.client.render.effects.LightningFX;
import appeng.core.AEConfig;
import appeng.core.AppEng;
import appeng.tile.misc.TileQuartzGrowthAccelerator;
import appeng.util.Platform;
public class BlockQuartzGrowthAccelerator extends AEBaseTileBlock implements IOrientableBlock { public class BlockQuartzGrowthAccelerator extends AEBaseTileBlock implements IOrientableBlock
{
private static final PropertyBool POWERED = PropertyBool.create( "powered" ); private static final PropertyBool POWERED = PropertyBool.create( "powered" );
public BlockQuartzGrowthAccelerator() { public BlockQuartzGrowthAccelerator()
{
super( Material.ROCK ); super( Material.ROCK );
this.setSoundType( SoundType.METAL ); this.setSoundType( SoundType.METAL );
this.setDefaultState( this.getDefaultState().withProperty( POWERED, false ) ); this.setDefaultState( this.getDefaultState().withProperty( POWERED, false ) );
} }
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getActualState( IBlockState state, IBlockAccess world, BlockPos pos )
{
TileQuartzGrowthAccelerator te = this.getTileEntity( world, pos ); TileQuartzGrowthAccelerator te = this.getTileEntity( world, pos );
boolean powered = te != null && te.isPowered(); boolean powered = te != null && te.isPowered();
@@ -62,20 +66,24 @@ public class BlockQuartzGrowthAccelerator extends AEBaseTileBlock implements IOr
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
{
return new IProperty[] { POWERED }; return new IProperty[] { POWERED };
} }
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
@Override @Override
public void randomDisplayTick(final IBlockState state, final World w, final BlockPos pos, final Random r) { public void randomDisplayTick( final IBlockState state, final World w, final BlockPos pos, final Random r )
if (!AEConfig.instance().isEnableEffects()) { {
if( !AEConfig.instance().isEnableEffects() )
{
return; return;
} }
final TileQuartzGrowthAccelerator cga = this.getTileEntity( w, pos ); final TileQuartzGrowthAccelerator cga = this.getTileEntity( w, pos );
if (cga != null && cga.isPowered() && AppEng.proxy.shouldAddParticles(r)) { if( cga != null && cga.isPowered() && AppEng.proxy.shouldAddParticles( r ) )
{
final double d0 = r.nextFloat() - 0.5F; final double d0 = r.nextFloat() - 0.5F;
final double d1 = r.nextFloat() - 0.5F; final double d1 = r.nextFloat() - 0.5F;
@@ -99,7 +107,8 @@ public class BlockQuartzGrowthAccelerator extends AEBaseTileBlock implements IOr
double dx = 0; double dx = 0;
BlockPos pt = null; BlockPos pt = null;
switch (r.nextInt(4)) { switch( r.nextInt( 4 ) )
{
case 0: case 0:
dx = 0.6; dx = 0.6;
dz = d1; dz = d1;
@@ -126,7 +135,8 @@ public class BlockQuartzGrowthAccelerator extends AEBaseTileBlock implements IOr
break; break;
} }
if (!w.getBlockState(pt).getBlock().isAir(w.getBlockState(pt), w, pt)) { if( !w.getBlockState( pt ).getBlock().isAir( w.getBlockState( pt ), w, pt ) )
{
return; return;
} }
@@ -144,7 +154,8 @@ public class BlockQuartzGrowthAccelerator extends AEBaseTileBlock implements IOr
} }
@Override @Override
public boolean usesMetadata() { public boolean usesMetadata()
{
return false; return false;
} }
@@ -19,11 +19,8 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileSecurityStation;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.properties.PropertyBool;
@@ -37,34 +34,44 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.misc.TileSecurityStation;
import appeng.util.Platform;
public class BlockSecurityStation extends AEBaseTileBlock { public class BlockSecurityStation extends AEBaseTileBlock
{
private static final PropertyBool POWERED = PropertyBool.create( "powered" ); private static final PropertyBool POWERED = PropertyBool.create( "powered" );
public BlockSecurityStation() { public BlockSecurityStation()
{
super( Material.IRON ); super( Material.IRON );
this.setDefaultState( this.getDefaultState().withProperty( POWERED, false ) ); this.setDefaultState( this.getDefaultState().withProperty( POWERED, false ) );
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
{
return new IProperty[] { POWERED }; return new IProperty[] { POWERED };
} }
@Override @Override
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
{
return BlockRenderLayer.CUTOUT; return BlockRenderLayer.CUTOUT;
} }
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getActualState( IBlockState state, IBlockAccess world, BlockPos pos )
{
boolean powered = false; boolean powered = false;
TileSecurityStation te = this.getTileEntity( world, pos ); TileSecurityStation te = this.getTileEntity( world, pos );
if (te != null) { if( te != null )
{
powered = te.isActive(); powered = te.isActive();
} }
@@ -73,14 +80,18 @@ public class BlockSecurityStation extends AEBaseTileBlock {
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (p.isSneaking()) { {
if( p.isSneaking() )
{
return false; return false;
} }
final TileSecurityStation tg = this.getTileEntity( w, pos ); final TileSecurityStation tg = this.getTileEntity( w, pos );
if (tg != null) { if( tg != null )
if (Platform.isClient()) { {
if( Platform.isClient() )
{
return true; return true;
} }
@@ -19,9 +19,9 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.block.AEBaseTileBlock; import java.util.Collections;
import appeng.helpers.ICustomCollision; import java.util.List;
import appeng.tile.misc.TileSkyCompass;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.BlockStateContainer;
@@ -36,16 +36,19 @@ import net.minecraftforge.common.property.ExtendedBlockState;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
import net.minecraftforge.common.property.PropertyFloat; import net.minecraftforge.common.property.PropertyFloat;
import java.util.Collections; import appeng.block.AEBaseTileBlock;
import java.util.List; import appeng.helpers.ICustomCollision;
import appeng.tile.misc.TileSkyCompass;
public class BlockSkyCompass extends AEBaseTileBlock implements ICustomCollision { public class BlockSkyCompass extends AEBaseTileBlock implements ICustomCollision
{
// Rotation is expressed as radians // Rotation is expressed as radians
public static final PropertyFloat ROTATION = new PropertyFloat( "rotation" ); public static final PropertyFloat ROTATION = new PropertyFloat( "rotation" );
public BlockSkyCompass() { public BlockSkyCompass()
{
super( Material.CIRCUITS ); super( Material.CIRCUITS );
this.setLightOpacity( 0 ); this.setLightOpacity( 0 );
this.setFullSize( false ); this.setFullSize( false );
@@ -53,42 +56,52 @@ public class BlockSkyCompass extends AEBaseTileBlock implements ICustomCollision
} }
@Override @Override
protected BlockStateContainer createBlockState() { protected BlockStateContainer createBlockState()
{
return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] { FORWARD, UP, ROTATION } ); return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] { FORWARD, UP, ROTATION } );
} }
@Override @Override
public boolean isValidOrientation(final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up) { public boolean isValidOrientation( final World w, final BlockPos pos, final EnumFacing forward, final EnumFacing up )
{
final TileSkyCompass sc = this.getTileEntity( w, pos ); final TileSkyCompass sc = this.getTileEntity( w, pos );
if (sc != null) { if( sc != null )
{
return false; return false;
} }
return this.canPlaceAt( w, pos, forward.getOpposite() ); return this.canPlaceAt( w, pos, forward.getOpposite() );
} }
private boolean canPlaceAt(final World w, final BlockPos pos, final EnumFacing dir) { private boolean canPlaceAt( final World w, final BlockPos pos, final EnumFacing dir )
{
return w.isSideSolid( pos.offset( dir ), dir.getOpposite(), false ); return w.isSideSolid( pos.offset( dir ), dir.getOpposite(), false );
} }
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
{
final TileSkyCompass sc = this.getTileEntity( world, pos ); final TileSkyCompass sc = this.getTileEntity( world, pos );
final EnumFacing forward = sc.getForward(); final EnumFacing forward = sc.getForward();
if (!this.canPlaceAt(world, pos, forward.getOpposite())) { if( !this.canPlaceAt( world, pos, forward.getOpposite() ) )
{
this.dropTorch( world, pos ); this.dropTorch( world, pos );
} }
} }
private void dropTorch(final World w, final BlockPos pos) { private void dropTorch( final World w, final BlockPos pos )
{
final IBlockState prev = w.getBlockState( pos ); final IBlockState prev = w.getBlockState( pos );
w.destroyBlock( pos, true ); w.destroyBlock( pos, true );
w.notifyBlockUpdate( pos, prev, w.getBlockState( pos ), 3 ); w.notifyBlockUpdate( pos, prev, w.getBlockState( pos ), 3 );
} }
@Override @Override
public boolean canPlaceBlockAt(final World w, final BlockPos pos) { public boolean canPlaceBlockAt( final World w, final BlockPos pos )
for (final EnumFacing dir : EnumFacing.VALUES) { {
if (this.canPlaceAt(w, pos, dir)) { for( final EnumFacing dir : EnumFacing.VALUES )
{
if( this.canPlaceAt( w, pos, dir ) )
{
return true; return true;
} }
} }
@@ -96,9 +109,11 @@ public class BlockSkyCompass extends AEBaseTileBlock implements ICustomCollision
} }
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
{
final TileSkyCompass tile = this.getTileEntity( w, pos ); final TileSkyCompass tile = this.getTileEntity( w, pos );
if (tile != null) { if( tile != null )
{
final EnumFacing forward = tile.getForward(); final EnumFacing forward = tile.getForward();
double minX = 0; double minX = 0;
@@ -108,7 +123,8 @@ public class BlockSkyCompass extends AEBaseTileBlock implements ICustomCollision
double maxY = 1; double maxY = 1;
double maxZ = 1; double maxZ = 1;
switch (forward) { switch( forward )
{
case DOWN: case DOWN:
minZ = minX = 5.0 / 16.0; minZ = minX = 5.0 / 16.0;
maxZ = maxX = 11.0 / 16.0; maxZ = maxX = 11.0 / 16.0;
@@ -155,17 +171,20 @@ public class BlockSkyCompass extends AEBaseTileBlock implements ICustomCollision
} }
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) { public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
{
} }
@Override @Override
public EnumBlockRenderType getRenderType(IBlockState state) { public EnumBlockRenderType getRenderType( IBlockState state )
{
return EnumBlockRenderType.ENTITYBLOCK_ANIMATED; return EnumBlockRenderType.ENTITYBLOCK_ANIMATED;
} }
@Override @Override
public boolean isFullBlock(IBlockState state) { public boolean isFullBlock( IBlockState state )
{
return false; return false;
} }
@@ -19,9 +19,11 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.block.AEBaseBlock; import java.util.Collections;
import appeng.entity.EntityTinyTNTPrimed; import java.util.List;
import appeng.helpers.ICustomCollision;
import javax.annotation.Nullable;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.SoundType; import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
@@ -41,14 +43,16 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.Explosion; import net.minecraft.world.Explosion;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.block.AEBaseBlock;
import java.util.Collections; import appeng.entity.EntityTinyTNTPrimed;
import java.util.List; import appeng.helpers.ICustomCollision;
public class BlockTinyTNT extends AEBaseBlock implements ICustomCollision { public class BlockTinyTNT extends AEBaseBlock implements ICustomCollision
{
public BlockTinyTNT() { public BlockTinyTNT()
{
super( Material.TNT ); super( Material.TNT );
this.boundingBox = new AxisAlignedBB( 0.25f, 0.0f, 0.25f, 0.75f, 0.5f, 0.75f ); this.boundingBox = new AxisAlignedBB( 0.25f, 0.0f, 0.25f, 0.75f, 0.5f, 0.75f );
@@ -62,24 +66,31 @@ public class BlockTinyTNT extends AEBaseBlock implements ICustomCollision {
} }
@Override @Override
public boolean isFullCube(IBlockState state) { public boolean isFullCube( IBlockState state )
{
return false; return false;
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (heldItem != null && heldItem.getItem() == Items.FLINT_AND_STEEL) { {
if( heldItem != null && heldItem.getItem() == Items.FLINT_AND_STEEL )
{
this.startFuse( w, pos, player ); this.startFuse( w, pos, player );
w.setBlockToAir( pos ); w.setBlockToAir( pos );
heldItem.damageItem( 1, player ); heldItem.damageItem( 1, player );
return true; return true;
} else { }
else
{
return super.onActivated( w, pos, player, hand, heldItem, side, hitX, hitY, hitZ ); return super.onActivated( w, pos, player, hand, heldItem, side, hitX, hitY, hitZ );
} }
} }
public void startFuse(final World w, final BlockPos pos, final EntityLivingBase igniter) { public void startFuse( final World w, final BlockPos pos, final EntityLivingBase igniter )
if (!w.isRemote) { {
if( !w.isRemote )
{
final EntityTinyTNTPrimed primedTinyTNTEntity = new EntityTinyTNTPrimed( w, pos.getX() + 0.5F, pos.getY() + 0.5F, pos.getZ() + 0.5F, igniter ); final EntityTinyTNTPrimed primedTinyTNTEntity = new EntityTinyTNTPrimed( w, pos.getX() + 0.5F, pos.getY() + 0.5F, pos.getZ() + 0.5F, igniter );
w.spawnEntity( primedTinyTNTEntity ); w.spawnEntity( primedTinyTNTEntity );
w.playSound( null, primedTinyTNTEntity.posX, primedTinyTNTEntity.posY, primedTinyTNTEntity.posZ, SoundEvents.ENTITY_TNT_PRIMED, w.playSound( null, primedTinyTNTEntity.posX, primedTinyTNTEntity.posY, primedTinyTNTEntity.posZ, SoundEvents.ENTITY_TNT_PRIMED,
@@ -88,29 +99,36 @@ public class BlockTinyTNT extends AEBaseBlock implements ICustomCollision {
} }
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
if (world.isBlockIndirectlyGettingPowered(pos) > 0) { {
if( world.isBlockIndirectlyGettingPowered( pos ) > 0 )
{
this.startFuse( world, pos, null ); this.startFuse( world, pos, null );
world.setBlockToAir( pos ); world.setBlockToAir( pos );
} }
} }
@Override @Override
public void onBlockAdded(final World w, final BlockPos pos, final IBlockState state) { public void onBlockAdded( final World w, final BlockPos pos, final IBlockState state )
{
super.onBlockAdded( w, pos, state ); super.onBlockAdded( w, pos, state );
if (w.isBlockIndirectlyGettingPowered(pos) > 0) { if( w.isBlockIndirectlyGettingPowered( pos ) > 0 )
{
this.startFuse( w, pos, null ); this.startFuse( w, pos, null );
w.setBlockToAir( pos ); w.setBlockToAir( pos );
} }
} }
@Override @Override
public void onEntityWalk(final World w, final BlockPos pos, final Entity entity) { public void onEntityWalk( final World w, final BlockPos pos, final Entity entity )
if (entity instanceof EntityArrow && !w.isRemote) { {
if( entity instanceof EntityArrow && !w.isRemote )
{
final EntityArrow entityarrow = (EntityArrow) entity; final EntityArrow entityarrow = (EntityArrow) entity;
if (entityarrow.isBurning()) { if( entityarrow.isBurning() )
{
this.startFuse( w, pos, entityarrow.shootingEntity instanceof EntityLivingBase ? (EntityLivingBase) entityarrow.shootingEntity : null ); this.startFuse( w, pos, entityarrow.shootingEntity instanceof EntityLivingBase ? (EntityLivingBase) entityarrow.shootingEntity : null );
w.setBlockToAir( pos ); w.setBlockToAir( pos );
} }
@@ -118,14 +136,17 @@ public class BlockTinyTNT extends AEBaseBlock implements ICustomCollision {
} }
@Override @Override
public boolean canDropFromExplosion(final Explosion exp) { public boolean canDropFromExplosion( final Explosion exp )
{
return false; return false;
} }
@Override @Override
public void onBlockExploded(final World w, final BlockPos pos, final Explosion exp) { public void onBlockExploded( final World w, final BlockPos pos, final Explosion exp )
{
super.onBlockExploded( w, pos, exp ); super.onBlockExploded( w, pos, exp );
if (!w.isRemote) { if( !w.isRemote )
{
final EntityTinyTNTPrimed primedTinyTNTEntity = new EntityTinyTNTPrimed( w, pos.getX() + 0.5F, pos.getY() + 0.5F, pos.getZ() + 0.5F, exp final EntityTinyTNTPrimed primedTinyTNTEntity = new EntityTinyTNTPrimed( w, pos.getX() + 0.5F, pos.getY() + 0.5F, pos.getZ() + 0.5F, exp
.getExplosivePlacedBy() ); .getExplosivePlacedBy() );
primedTinyTNTEntity.setFuse( w.rand.nextInt( primedTinyTNTEntity.getFuse() / 4 ) + primedTinyTNTEntity.getFuse() / 8 ); primedTinyTNTEntity.setFuse( w.rand.nextInt( primedTinyTNTEntity.getFuse() / 4 ) + primedTinyTNTEntity.getFuse() / 8 );
@@ -134,12 +155,14 @@ public class BlockTinyTNT extends AEBaseBlock implements ICustomCollision {
} }
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
{
return Collections.singletonList( new AxisAlignedBB( 0.25, 0, 0.25, 0.75, 0.5, 0.75 ) ); return Collections.singletonList( new AxisAlignedBB( 0.25, 0, 0.25, 0.75, 0.5, 0.75 ) );
} }
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) { public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
{
out.add( new AxisAlignedBB( 0.25, 0, 0.25, 0.75, 0.5, 0.75 ) ); out.add( new AxisAlignedBB( 0.25, 0, 0.25, 0.75, 0.5, 0.75 ) );
} }
} }
@@ -19,13 +19,10 @@
package appeng.block.misc; package appeng.block.misc;
import appeng.api.util.AEPartLocation; import java.util.Random;
import appeng.block.AEBaseTileBlock;
import appeng.core.AEConfig; import javax.annotation.Nullable;
import appeng.core.sync.GuiBridge;
import appeng.tile.AEBaseTile;
import appeng.tile.misc.TileVibrationChamber;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.properties.PropertyBool;
@@ -39,23 +36,31 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import java.util.Random; import appeng.block.AEBaseTileBlock;
import appeng.core.AEConfig;
import appeng.core.sync.GuiBridge;
import appeng.tile.AEBaseTile;
import appeng.tile.misc.TileVibrationChamber;
import appeng.util.Platform;
public final class BlockVibrationChamber extends AEBaseTileBlock { public final class BlockVibrationChamber extends AEBaseTileBlock
{
// Indicates that the vibration chamber is currently working // Indicates that the vibration chamber is currently working
private static final PropertyBool ACTIVE = PropertyBool.create( "active" ); private static final PropertyBool ACTIVE = PropertyBool.create( "active" );
public BlockVibrationChamber() { public BlockVibrationChamber()
{
super( Material.IRON ); super( Material.IRON );
this.setHardness( 4.2F ); this.setHardness( 4.2F );
this.setDefaultState( this.getDefaultState().withProperty( ACTIVE, false ) ); this.setDefaultState( this.getDefaultState().withProperty( ACTIVE, false ) );
} }
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getActualState( IBlockState state, IBlockAccess world, BlockPos pos )
{
TileVibrationChamber te = this.getTileEntity( world, pos ); TileVibrationChamber te = this.getTileEntity( world, pos );
boolean active = te != null && te.isOn; boolean active = te != null && te.isOn;
@@ -64,19 +69,24 @@ public final class BlockVibrationChamber extends AEBaseTileBlock {
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
{
return new IProperty[] { ACTIVE }; return new IProperty[] { ACTIVE };
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (player.isSneaking()) { {
if( player.isSneaking() )
{
return false; return false;
} }
if (Platform.isServer()) { if( Platform.isServer() )
{
final TileVibrationChamber tc = this.getTileEntity( w, pos ); final TileVibrationChamber tc = this.getTileEntity( w, pos );
if (tc != null && !player.isSneaking()) { if( tc != null && !player.isSneaking() )
{
Platform.openGUI( player, tc, AEPartLocation.fromFacing( side ), GuiBridge.GUI_VIBRATION_CHAMBER ); Platform.openGUI( player, tc, AEPartLocation.fromFacing( side ), GuiBridge.GUI_VIBRATION_CHAMBER );
return true; return true;
} }
@@ -86,15 +96,19 @@ public final class BlockVibrationChamber extends AEBaseTileBlock {
} }
@Override @Override
public void randomDisplayTick(final IBlockState state, final World w, final BlockPos pos, final Random r) { public void randomDisplayTick( final IBlockState state, final World w, final BlockPos pos, final Random r )
if (!AEConfig.instance().isEnableEffects()) { {
if( !AEConfig.instance().isEnableEffects() )
{
return; return;
} }
final AEBaseTile tile = this.getTileEntity( w, pos ); final AEBaseTile tile = this.getTileEntity( w, pos );
if (tile instanceof TileVibrationChamber) { if( tile instanceof TileVibrationChamber )
{
final TileVibrationChamber tc = (TileVibrationChamber) tile; final TileVibrationChamber tc = (TileVibrationChamber) tile;
if (tc.isOn) { if( tc.isOn )
{
float f1 = pos.getX() + 0.5F; float f1 = pos.getX() + 0.5F;
float f2 = pos.getY() + 0.5F; float f2 = pos.getY() + 0.5F;
float f3 = pos.getZ() + 0.5F; float f3 = pos.getZ() + 0.5F;
@@ -121,8 +135,8 @@ public final class BlockVibrationChamber extends AEBaseTileBlock {
f2 += west_y * ( 0.3 * ox - 0.15 ); f2 += west_y * ( 0.3 * ox - 0.15 );
f3 += west_z * ( 0.3 * ox - 0.15 ); f3 += west_z * ( 0.3 * ox - 0.15 );
w.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, f1, f2, f3, 0.0D, 0.0D, 0.0D); w.spawnParticle( EnumParticleTypes.SMOKE_NORMAL, f1, f2, f3, 0.0D, 0.0D, 0.0D, new int[0] );
w.spawnParticle(EnumParticleTypes.FLAME, f1, f2, f3, 0.0D, 0.0D, 0.0D); w.spawnParticle( EnumParticleTypes.FLAME, f1, f2, f3, 0.0D, 0.0D, 0.0D, new int[0] );
} }
} }
} }
@@ -1,19 +1,23 @@
package appeng.block.misc; package appeng.block.misc;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import appeng.client.render.tesr.InscriberTESR; import appeng.client.render.tesr.InscriberTESR;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class InscriberRendering extends BlockRenderingCustomizer { public class InscriberRendering extends BlockRenderingCustomizer
{
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
@Override @Override
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
{
rendering.tesr( new InscriberTESR() ); rendering.tesr( new InscriberTESR() );
} }
@@ -19,21 +19,24 @@
package appeng.block.misc; package appeng.block.misc;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.util.AEColor; import appeng.api.util.AEColor;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import appeng.client.render.ColorableTileBlockColor; import appeng.client.render.ColorableTileBlockColor;
import appeng.client.render.StaticItemColor; import appeng.client.render.StaticItemColor;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class SecurityStationRendering extends BlockRenderingCustomizer { public class SecurityStationRendering extends BlockRenderingCustomizer
{
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
{
rendering.blockColor( ColorableTileBlockColor.INSTANCE ); rendering.blockColor( ColorableTileBlockColor.INSTANCE );
itemRendering.color( new StaticItemColor( AEColor.TRANSPARENT ) ); itemRendering.color( new StaticItemColor( AEColor.TRANSPARENT ) );
} }
@@ -19,23 +19,26 @@
package appeng.block.misc; package appeng.block.misc;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import appeng.client.render.model.SkyCompassModel; import appeng.client.render.model.SkyCompassModel;
import appeng.client.render.tesr.SkyCompassTESR; import appeng.client.render.tesr.SkyCompassTESR;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class SkyCompassRendering extends BlockRenderingCustomizer { public class SkyCompassRendering extends BlockRenderingCustomizer
{
private static final ModelResourceLocation ITEM_MODEL = new ModelResourceLocation( "appliedenergistics2:sky_compass", "normal" ); private static final ModelResourceLocation ITEM_MODEL = new ModelResourceLocation( "appliedenergistics2:sky_compass", "normal" );
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
{
rendering.tesr( new SkyCompassTESR() ); rendering.tesr( new SkyCompassTESR() );
itemRendering.model( ITEM_MODEL ); itemRendering.model( ITEM_MODEL );
itemRendering.builtInModel( "models/block/builtin/sky_compass", new SkyCompassModel() ); itemRendering.builtInModel( "models/block/builtin/sky_compass", new SkyCompassModel() );
@@ -19,32 +19,14 @@
package appeng.block.networking; package appeng.block.networking;
import appeng.api.parts.IFacadeContainer; import java.util.EnumSet;
import appeng.api.parts.IFacadePart; import java.util.List;
import appeng.api.parts.PartItemStack; import java.util.Random;
import appeng.api.parts.SelectedPart;
import appeng.api.util.AEColor; import javax.annotation.Nullable;
import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.client.UnlistedProperty;
import appeng.client.render.cablebus.CableBusBakedModel;
import appeng.client.render.cablebus.CableBusRenderState;
import appeng.core.Api;
import appeng.core.AppEng;
import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketClick;
import appeng.helpers.AEGlassMaterial;
import appeng.integration.abstraction.IAEFacade;
import appeng.parts.ICableBusContainer;
import appeng.parts.NullCableBusContainer;
import appeng.tile.AEBaseTile;
import appeng.tile.networking.CableBusTESR;
import appeng.tile.networking.TileCableBus;
import appeng.tile.networking.TileCableBusTESR;
import appeng.util.Platform;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
import net.minecraft.block.state.BlockFaceShape;
import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
@@ -79,13 +61,33 @@ import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import javax.annotation.Nullable; import appeng.api.parts.IFacadeContainer;
import java.util.EnumSet; import appeng.api.parts.IFacadePart;
import java.util.List; import appeng.api.parts.PartItemStack;
import java.util.Random; import appeng.api.parts.SelectedPart;
import appeng.api.util.AEColor;
import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.client.UnlistedProperty;
import appeng.client.render.cablebus.CableBusBakedModel;
import appeng.client.render.cablebus.CableBusRenderState;
import appeng.core.Api;
import appeng.core.AppEng;
import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketClick;
import appeng.helpers.AEGlassMaterial;
import appeng.integration.abstraction.IAEFacade;
import appeng.parts.ICableBusContainer;
import appeng.parts.NullCableBusContainer;
import appeng.tile.AEBaseTile;
import appeng.tile.networking.CableBusTESR;
import appeng.tile.networking.TileCableBus;
import appeng.tile.networking.TileCableBusTESR;
import appeng.util.Platform;
public class BlockCableBus extends AEBaseTileBlock implements IAEFacade { public class BlockCableBus extends AEBaseTileBlock implements IAEFacade
{
public static final UnlistedProperty<CableBusRenderState> RENDER_STATE_PROPERTY = new UnlistedProperty<>( "cable_bus_render_state", CableBusRenderState.class ); public static final UnlistedProperty<CableBusRenderState> RENDER_STATE_PROPERTY = new UnlistedProperty<>( "cable_bus_render_state", CableBusRenderState.class );
@@ -95,7 +97,8 @@ public class BlockCableBus extends AEBaseTileBlock implements IAEFacade {
private static Class<? extends AEBaseTile> tesrTile; private static Class<? extends AEBaseTile> tesrTile;
public BlockCableBus() { public BlockCableBus()
{
super( AEGlassMaterial.INSTANCE ); super( AEGlassMaterial.INSTANCE );
this.setLightOpacity( 0 ); this.setLightOpacity( 0 );
this.setFullSize( false ); this.setFullSize( false );
@@ -107,17 +110,20 @@ public class BlockCableBus extends AEBaseTileBlock implements IAEFacade {
} }
@Override @Override
public boolean isFullCube(IBlockState state) { public boolean isFullCube( IBlockState state )
{
return false; return false;
} }
@Override @Override
protected BlockStateContainer createBlockState() { protected BlockStateContainer createBlockState()
{
return new ExtendedBlockState( this, new IProperty[0], new IUnlistedProperty[] { RENDER_STATE_PROPERTY } ); return new ExtendedBlockState( this, new IProperty[0], new IUnlistedProperty[] { RENDER_STATE_PROPERTY } );
} }
@Override @Override
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
{
CableBusRenderState renderState = this.cb( world, pos ).getRenderState(); CableBusRenderState renderState = this.cb( world, pos ).getRenderState();
renderState.setWorld( world ); renderState.setWorld( world );
renderState.setPos( pos ); renderState.setPos( pos );
@@ -125,72 +131,87 @@ public class BlockCableBus extends AEBaseTileBlock implements IAEFacade {
} }
@Override @Override
public void randomDisplayTick(final IBlockState state, final World worldIn, final BlockPos pos, final Random rand) { public void randomDisplayTick( final IBlockState state, final World worldIn, final BlockPos pos, final Random rand )
{
this.cb( worldIn, pos ).randomDisplayTick( worldIn, pos, rand ); this.cb( worldIn, pos ).randomDisplayTick( worldIn, pos, rand );
} }
@Override @Override
public void onNeighborChange(final IBlockAccess w, final BlockPos pos, final BlockPos neighbor) { public void onNeighborChange( final IBlockAccess w, final BlockPos pos, final BlockPos neighbor )
{
this.cb( w, pos ).onNeighborChanged( w, pos, neighbor ); this.cb( w, pos ).onNeighborChanged( w, pos, neighbor );
} }
@Override @Override
public Item getItemDropped(final IBlockState state, final Random rand, final int fortune) { public Item getItemDropped( final IBlockState state, final Random rand, final int fortune )
{
return null; return null;
} }
@Override @Override
public int getWeakPower(final IBlockState state, final IBlockAccess w, final BlockPos pos, final EnumFacing side) { public int getWeakPower( final IBlockState state, final IBlockAccess w, final BlockPos pos, final EnumFacing side )
{
return this.cb( w, pos ).isProvidingWeakPower( side.getOpposite() ); // TODO: return this.cb( w, pos ).isProvidingWeakPower( side.getOpposite() ); // TODO:
// IS // IS
// OPPOSITE!? // OPPOSITE!?
} }
@Override @Override
public boolean canProvidePower(final IBlockState state) { public boolean canProvidePower( final IBlockState state )
{
return true; return true;
} }
@Override @Override
public void onEntityCollidedWithBlock(final World w, final BlockPos pos, final IBlockState state, final Entity entityIn) { public void onEntityCollidedWithBlock( final World w, final BlockPos pos, final IBlockState state, final Entity entityIn )
{
this.cb( w, pos ).onEntityCollision( entityIn ); this.cb( w, pos ).onEntityCollision( entityIn );
} }
@Override @Override
public int getStrongPower(final IBlockState state, final IBlockAccess w, final BlockPos pos, final EnumFacing side) { public int getStrongPower( final IBlockState state, final IBlockAccess w, final BlockPos pos, final EnumFacing side )
{
return this.cb( w, pos ).isProvidingStrongPower( side.getOpposite() ); // TODO: return this.cb( w, pos ).isProvidingStrongPower( side.getOpposite() ); // TODO:
// IS // IS
// OPPOSITE!? // OPPOSITE!?
} }
@Override @Override
public int getLightValue(final IBlockState state, final IBlockAccess world, final BlockPos pos) { public int getLightValue( final IBlockState state, final IBlockAccess world, final BlockPos pos )
if (state.getBlock() != this) { {
if( state.getBlock() != this )
{
return state.getBlock().getLightValue( state, world, pos ); return state.getBlock().getLightValue( state, world, pos );
} }
return this.cb( world, pos ).getLightValue(); return this.cb( world, pos ).getLightValue();
} }
@Override @Override
public boolean isLadder(final IBlockState state, final IBlockAccess world, final BlockPos pos, final EntityLivingBase entity) { public boolean isLadder( final IBlockState state, final IBlockAccess world, final BlockPos pos, final EntityLivingBase entity )
{
return this.cb( world, pos ).isLadder( entity ); return this.cb( world, pos ).isLadder( entity );
} }
@Override @Override
public boolean isSideSolid(final IBlockState state, final IBlockAccess w, final BlockPos pos, final EnumFacing side) { public boolean isSideSolid( final IBlockState state, final IBlockAccess w, final BlockPos pos, final EnumFacing side )
{
return this.cb( w, pos ).isSolidOnSide( side ); return this.cb( w, pos ).isSolidOnSide( side );
} }
@Override @Override
public boolean isReplaceable(final IBlockAccess w, final BlockPos pos) { public boolean isReplaceable( final IBlockAccess w, final BlockPos pos )
{
return this.cb( w, pos ).isEmpty(); return this.cb( w, pos ).isEmpty();
} }
@Override @Override
public boolean removedByPlayer(final IBlockState state, final World world, final BlockPos pos, final EntityPlayer player, final boolean willHarvest) { public boolean removedByPlayer( final IBlockState state, final World world, final BlockPos pos, final EntityPlayer player, final boolean willHarvest )
if (player.capabilities.isCreativeMode) { {
if( player.capabilities.isCreativeMode )
{
final AEBaseTile tile = this.getTileEntity( world, pos ); final AEBaseTile tile = this.getTileEntity( world, pos );
if (tile != null) { if( tile != null )
{
tile.disableDrops(); tile.disableDrops();
} }
// maybe ray trace? // maybe ray trace?
@@ -199,8 +220,10 @@ public class BlockCableBus extends AEBaseTileBlock implements IAEFacade {
} }
@Override @Override
public boolean canConnectRedstone(final IBlockState state, final IBlockAccess w, final BlockPos pos, EnumFacing side) { public boolean canConnectRedstone( final IBlockState state, final IBlockAccess w, final BlockPos pos, EnumFacing side )
if (side == null) { {
if( side == null )
{
side = EnumFacing.UP; side = EnumFacing.UP;
} }
@@ -208,13 +231,17 @@ public class BlockCableBus extends AEBaseTileBlock implements IAEFacade {
} }
@Override @Override
public ItemStack getPickBlock(final IBlockState state, final RayTraceResult target, final World world, final BlockPos pos, final EntityPlayer player) { public ItemStack getPickBlock( final IBlockState state, final RayTraceResult target, final World world, final BlockPos pos, final EntityPlayer player )
{
final Vec3d v3 = target.hitVec.subtract( pos.getX(), pos.getY(), pos.getZ() ); final Vec3d v3 = target.hitVec.subtract( pos.getX(), pos.getY(), pos.getZ() );
final SelectedPart sp = this.cb( world, pos ).selectPart( v3 ); final SelectedPart sp = this.cb( world, pos ).selectPart( v3 );
if (sp.part != null) { if( sp.part != null )
{
return sp.part.getItemStack( PartItemStack.PICK ); return sp.part.getItemStack( PartItemStack.PICK );
} else if (sp.facade != null) { }
else if( sp.facade != null )
{
return sp.facade.getItemStack(); return sp.facade.getItemStack();
} }
@@ -223,11 +250,13 @@ public class BlockCableBus extends AEBaseTileBlock implements IAEFacade {
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public boolean addHitEffects(final IBlockState state, final World world, final RayTraceResult target, final ParticleManager effectRenderer) { public boolean addHitEffects( final IBlockState state, final World world, final RayTraceResult target, final ParticleManager effectRenderer )
{
// Half the particle rate. Since we're spawning concentrated on a specific spot, // Half the particle rate. Since we're spawning concentrated on a specific spot,
// our particle effect otherwise looks too strong // our particle effect otherwise looks too strong
if (Platform.getRandom().nextBoolean()) { if( Platform.getRandom().nextBoolean() )
{
return true; return true;
} }
@@ -237,7 +266,8 @@ public class BlockCableBus extends AEBaseTileBlock implements IAEFacade {
IBakedModel model = Minecraft.getMinecraft().getBlockRendererDispatcher().getModelForState( this.getDefaultState() ); IBakedModel model = Minecraft.getMinecraft().getBlockRendererDispatcher().getModelForState( this.getDefaultState() );
// We cannot add the effect if we don't have the model // We cannot add the effect if we don't have the model
if (!(model instanceof CableBusBakedModel)) { if( !( model instanceof CableBusBakedModel ) )
{
return true; return true;
} }
@@ -247,7 +277,8 @@ public class BlockCableBus extends AEBaseTileBlock implements IAEFacade {
// Spawn a particle for one of the particle textures // Spawn a particle for one of the particle textures
TextureAtlasSprite texture = Platform.pickRandom( cableBusModel.getParticleTextures( renderState ) ); TextureAtlasSprite texture = Platform.pickRandom( cableBusModel.getParticleTextures( renderState ) );
if (texture != null) { if( texture != null )
{
double x = target.hitVec.x; double x = target.hitVec.x;
double y = target.hitVec.y; double y = target.hitVec.y;
double z = target.hitVec.z; double z = target.hitVec.z;
@@ -262,14 +293,16 @@ public class BlockCableBus extends AEBaseTileBlock implements IAEFacade {
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public boolean addDestroyEffects(final World world, final BlockPos pos, final ParticleManager effectRenderer) { public boolean addDestroyEffects( final World world, final BlockPos pos, final ParticleManager effectRenderer )
{
ICableBusContainer cb = this.cb( world, pos ); ICableBusContainer cb = this.cb( world, pos );
// Our built-in model has the actual baked sprites we need // Our built-in model has the actual baked sprites we need
IBakedModel model = Minecraft.getMinecraft().getBlockRendererDispatcher().getModelForState( this.getDefaultState() ); IBakedModel model = Minecraft.getMinecraft().getBlockRendererDispatcher().getModelForState( this.getDefaultState() );
// We cannot add the effect if we dont have the model // We cannot add the effect if we dont have the model
if (!(model instanceof CableBusBakedModel)) { if( !( model instanceof CableBusBakedModel ) )
{
return true; return true;
} }
@@ -279,11 +312,15 @@ public class BlockCableBus extends AEBaseTileBlock implements IAEFacade {
List<TextureAtlasSprite> textures = cableBusModel.getParticleTextures( renderState ); List<TextureAtlasSprite> textures = cableBusModel.getParticleTextures( renderState );
if (!textures.isEmpty()) { if( !textures.isEmpty() )
{
// Shamelessly inspired by ParticleManager.addBlockDestroyEffects // Shamelessly inspired by ParticleManager.addBlockDestroyEffects
for (int j = 0; j < 4; ++j) { for( int j = 0; j < 4; ++j )
for (int k = 0; k < 4; ++k) { {
for (int l = 0; l < 4; ++l) { for( int k = 0; k < 4; ++k )
{
for( int l = 0; l < 4; ++l )
{
// Randomly select one of the textures if the cable bus has more than just one possibility here // Randomly select one of the textures if the cable bus has more than just one possibility here
final TextureAtlasSprite texture = Platform.pickRandom( textures ); final TextureAtlasSprite texture = Platform.pickRandom( textures );
@@ -304,17 +341,21 @@ public class BlockCableBus extends AEBaseTileBlock implements IAEFacade {
} }
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
if (Platform.isServer()) { {
if( Platform.isServer() )
{
this.cb( world, pos ).onNeighborChanged( world, pos, fromPos ); this.cb( world, pos ).onNeighborChanged( world, pos, fromPos );
} }
} }
private ICableBusContainer cb(final IBlockAccess w, final BlockPos pos) { private ICableBusContainer cb( final IBlockAccess w, final BlockPos pos )
{
final TileEntity te = w.getTileEntity( pos ); final TileEntity te = w.getTileEntity( pos );
ICableBusContainer out = null; ICableBusContainer out = null;
if (te instanceof TileCableBus) { if( te instanceof TileCableBus )
{
out = ( (TileCableBus) te ).getCableBus(); out = ( (TileCableBus) te ).getCableBus();
} }
@@ -322,11 +363,13 @@ public class BlockCableBus extends AEBaseTileBlock implements IAEFacade {
} }
@Nullable @Nullable
private IFacadeContainer fc(final IBlockAccess w, final BlockPos pos) { private IFacadeContainer fc( final IBlockAccess w, final BlockPos pos )
{
final TileEntity te = w.getTileEntity( pos ); final TileEntity te = w.getTileEntity( pos );
IFacadeContainer out = null; IFacadeContainer out = null;
if (te instanceof TileCableBus) { if( te instanceof TileCableBus )
{
out = ( (TileCableBus) te ).getCableBus().getFacadeContainer(); out = ( (TileCableBus) te ).getCableBus().getFacadeContainer();
} }
@@ -334,13 +377,17 @@ public class BlockCableBus extends AEBaseTileBlock implements IAEFacade {
} }
@Override @Override
public void onBlockClicked(World worldIn, BlockPos pos, EntityPlayer playerIn) { public void onBlockClicked( World worldIn, BlockPos pos, EntityPlayer playerIn )
if (Platform.isClient()) { {
if( Platform.isClient() )
{
final RayTraceResult rtr = Minecraft.getMinecraft().objectMouseOver; final RayTraceResult rtr = Minecraft.getMinecraft().objectMouseOver;
if (rtr != null && rtr.typeOfHit == Type.BLOCK && pos.equals(rtr.getBlockPos())) { if( rtr != null && rtr.typeOfHit == Type.BLOCK && pos.equals( rtr.getBlockPos() ) )
{
final Vec3d hitVec = rtr.hitVec.subtract( new Vec3d( pos ) ); final Vec3d hitVec = rtr.hitVec.subtract( new Vec3d( pos ) );
if (this.cb(worldIn, pos).clicked(playerIn, EnumHand.MAIN_HAND, hitVec)) { if( this.cb( worldIn, pos ).clicked( playerIn, EnumHand.MAIN_HAND, hitVec ) )
{
NetworkHandler.instance() NetworkHandler.instance()
.sendToServer( .sendToServer(
new PacketClick( pos, rtr.sideHit, (float) hitVec.x, (float) hitVec.y, (float) hitVec.z, EnumHand.MAIN_HAND, true ) ); new PacketClick( pos, rtr.sideHit, (float) hitVec.x, (float) hitVec.y, (float) hitVec.z, EnumHand.MAIN_HAND, true ) );
@@ -349,64 +396,80 @@ public class BlockCableBus extends AEBaseTileBlock implements IAEFacade {
} }
} }
public void onBlockClickPacket(World worldIn, BlockPos pos, EntityPlayer playerIn, EnumHand hand, Vec3d hitVec) { public void onBlockClickPacket( World worldIn, BlockPos pos, EntityPlayer playerIn, EnumHand hand, Vec3d hitVec )
{
this.cb( worldIn, pos ).clicked( playerIn, hand, hitVec ); this.cb( worldIn, pos ).clicked( playerIn, hand, hitVec );
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
{
return this.cb( w, pos ).activate( player, hand, new Vec3d( hitX, hitY, hitZ ) ); return this.cb( w, pos ).activate( player, hand, new Vec3d( hitX, hitY, hitZ ) );
} }
@Override @Override
public boolean recolorBlock(final World world, final BlockPos pos, final EnumFacing side, final EnumDyeColor color) { public boolean recolorBlock( final World world, final BlockPos pos, final EnumFacing side, final EnumDyeColor color )
{
return this.recolorBlock( world, pos, side, color, null ); return this.recolorBlock( world, pos, side, color, null );
} }
public boolean recolorBlock(final World world, final BlockPos pos, final EnumFacing side, final EnumDyeColor color, final EntityPlayer who) { public boolean recolorBlock( final World world, final BlockPos pos, final EnumFacing side, final EnumDyeColor color, final EntityPlayer who )
try { {
try
{
return this.cb( world, pos ).recolourBlock( side, AEColor.values()[color.ordinal()], who ); return this.cb( world, pos ).recolourBlock( side, AEColor.values()[color.ordinal()], who );
} catch (final Throwable ignored) { }
catch( final Throwable ignored )
{
} }
return false; return false;
} }
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void getSubBlocks(final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks) { public void getSubBlocks( final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks )
{
// do nothing // do nothing
} }
public void setupTile() { public void setupTile()
{
noTesrTile = Api.INSTANCE.partHelper().getCombinedInstance( TileCableBus.class ); noTesrTile = Api.INSTANCE.partHelper().getCombinedInstance( TileCableBus.class );
this.setTileEntity( noTesrTile ); this.setTileEntity( noTesrTile );
GameRegistry.registerTileEntity( noTesrTile, AppEng.MOD_ID.toLowerCase() + ":" + "BlockCableBus" ); GameRegistry.registerTileEntity( noTesrTile, AppEng.MOD_ID.toLowerCase() + ":" + "BlockCableBus" );
if (Platform.isClient()) { if( Platform.isClient() )
{
setupTesr(); setupTesr();
} }
} }
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
private static void setupTesr() { private static void setupTesr()
{
tesrTile = Api.INSTANCE.partHelper().getCombinedInstance( TileCableBusTESR.class ); tesrTile = Api.INSTANCE.partHelper().getCombinedInstance( TileCableBusTESR.class );
GameRegistry.registerTileEntity( tesrTile, AppEng.MOD_ID.toLowerCase() + ":" + "ClientOnly_TESR_CableBus" ); GameRegistry.registerTileEntity( tesrTile, AppEng.MOD_ID.toLowerCase() + ":" + "ClientOnly_TESR_CableBus" );
ClientRegistry.bindTileEntitySpecialRenderer( BlockCableBus.getTesrTile(), new CableBusTESR() ); ClientRegistry.bindTileEntitySpecialRenderer( BlockCableBus.getTesrTile(), new CableBusTESR() );
} }
@Override @Override
public boolean canRenderInLayer(IBlockState state, BlockRenderLayer layer) { public boolean canRenderInLayer( IBlockState state, BlockRenderLayer layer )
{
return true; return true;
} }
@Override @Override
public IBlockState getFacadeState(IBlockAccess world, BlockPos pos, EnumFacing side) { public IBlockState getFacadeState( IBlockAccess world, BlockPos pos, EnumFacing side )
if (side != null) { {
if( side != null )
{
IFacadeContainer container = this.fc( world, pos ); IFacadeContainer container = this.fc( world, pos );
if (container != null) { if( container != null )
{
IFacadePart facade = container.getFacade( AEPartLocation.fromFacing( side ) ); IFacadePart facade = container.getFacade( AEPartLocation.fromFacing( side ) );
if (facade != null) { if( facade != null )
{
return facade.getBlockState(); return facade.getBlockState();
} }
} }
@@ -414,42 +477,22 @@ public class BlockCableBus extends AEBaseTileBlock implements IAEFacade {
return world.getBlockState( pos ); return world.getBlockState( pos );
} }
@Override public static Class<? extends AEBaseTile> getNoTesrTile()
public BlockFaceShape getBlockFaceShape(IBlockAccess world, IBlockState state, BlockPos pos, EnumFacing side) { {
IFacadeContainer container = this.fc(world, pos);
if (container != null) {
IFacadePart facade = container.getFacade(AEPartLocation.fromFacing(side));
if (facade != null) {
return BlockFaceShape.SOLID;
}
}
return BlockFaceShape.UNDEFINED;
}
@Override
public void onEntityWalk(World world, BlockPos pos, Entity entityIn) {
IFacadeContainer container = this.fc(world, pos);
if (container != null) {
IFacadePart facade = container.getFacade(AEPartLocation.fromFacing(EnumFacing.UP));
if (facade != null) {
facade.getBlockState().getBlock().onEntityWalk(world, pos, entityIn);
}
}
super.onEntityWalk(world, pos, entityIn);
}
public static Class<? extends AEBaseTile> getNoTesrTile() {
return noTesrTile; return noTesrTile;
} }
public static Class<? extends AEBaseTile> getTesrTile() { public static Class<? extends AEBaseTile> getTesrTile()
{
return tesrTile; return tesrTile;
} }
// Helper to get access to the protected constructor // Helper to get access to the protected constructor
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
private static class DestroyFX extends ParticleDigging { private static class DestroyFX extends ParticleDigging
DestroyFX(World worldIn, double xCoordIn, double yCoordIn, double zCoordIn, double xSpeedIn, double ySpeedIn, double zSpeedIn, IBlockState state) { {
DestroyFX( World worldIn, double xCoordIn, double yCoordIn, double zCoordIn, double xSpeedIn, double ySpeedIn, double zSpeedIn, IBlockState state )
{
super( worldIn, xCoordIn, yCoordIn, zCoordIn, xSpeedIn, ySpeedIn, zSpeedIn, state ); super( worldIn, xCoordIn, yCoordIn, zCoordIn, xSpeedIn, ySpeedIn, zSpeedIn, state );
} }
} }
@@ -19,8 +19,6 @@
package appeng.block.networking; package appeng.block.networking;
import appeng.block.AEBaseTileBlock;
import appeng.tile.networking.TileController;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
@@ -33,14 +31,20 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import appeng.block.AEBaseTileBlock;
import appeng.tile.networking.TileController;
public class BlockController extends AEBaseTileBlock {
public enum ControllerBlockState implements IStringSerializable { public class BlockController extends AEBaseTileBlock
{
public enum ControllerBlockState implements IStringSerializable
{
offline, online, conflicted; offline, online, conflicted;
@Override @Override
public String getName() { public String getName()
{
return this.name(); return this.name();
} }
@@ -51,11 +55,13 @@ public class BlockController extends AEBaseTileBlock {
* inside_a and inside_b are alternating patterns for a controller that is enclosed by other controllers, * inside_a and inside_b are alternating patterns for a controller that is enclosed by other controllers,
* and since they are always offline, they do not have the usual sub-states. * and since they are always offline, they do not have the usual sub-states.
*/ */
public enum ControllerRenderType implements IStringSerializable { public enum ControllerRenderType implements IStringSerializable
{
block, column_x, column_y, column_z, inside_a, inside_b; block, column_x, column_y, column_z, inside_a, inside_b;
@Override @Override
public String getName() { public String getName()
{
return this.name(); return this.name();
} }
@@ -65,7 +71,8 @@ public class BlockController extends AEBaseTileBlock {
public static final PropertyEnum<ControllerRenderType> CONTROLLER_TYPE = PropertyEnum.create( "type", ControllerRenderType.class ); public static final PropertyEnum<ControllerRenderType> CONTROLLER_TYPE = PropertyEnum.create( "type", ControllerRenderType.class );
public BlockController() { public BlockController()
{
super( Material.IRON ); super( Material.IRON );
this.setHardness( 6 ); this.setHardness( 6 );
this.setDefaultState( this.getDefaultState() this.setDefaultState( this.getDefaultState()
@@ -74,12 +81,14 @@ public class BlockController extends AEBaseTileBlock {
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
{
return new IProperty[] { CONTROLLER_STATE, CONTROLLER_TYPE }; return new IProperty[] { CONTROLLER_STATE, CONTROLLER_TYPE };
} }
@Override @Override
protected BlockStateContainer createBlockState() { protected BlockStateContainer createBlockState()
{
return new BlockStateContainer( this, this.getAEStates() ); return new BlockStateContainer( this, this.getAEStates() );
} }
@@ -89,7 +98,8 @@ public class BlockController extends AEBaseTileBlock {
* get a rudimentary connected texture feel for the controller based on how it is placed. * get a rudimentary connected texture feel for the controller based on how it is placed.
*/ */
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getActualState( IBlockState state, IBlockAccess world, BlockPos pos )
{
// Only used for columns, really // Only used for columns, really
ControllerRenderType type = ControllerRenderType.block; ControllerRenderType type = ControllerRenderType.block;
@@ -106,20 +116,30 @@ public class BlockController extends AEBaseTileBlock {
final boolean zz = this.getTileEntity( world, x, y, z - 1 ) instanceof TileController && this.getTileEntity( world, x, y, final boolean zz = this.getTileEntity( world, x, y, z - 1 ) instanceof TileController && this.getTileEntity( world, x, y,
z + 1 ) instanceof TileController; z + 1 ) instanceof TileController;
if (xx && !yy && !zz) { if( xx && !yy && !zz )
{
type = ControllerRenderType.column_x; type = ControllerRenderType.column_x;
} else if (!xx && yy && !zz) { }
else if( !xx && yy && !zz )
{
type = ControllerRenderType.column_y; type = ControllerRenderType.column_y;
} else if (!xx && !yy && zz) { }
else if( !xx && !yy && zz )
{
type = ControllerRenderType.column_z; type = ControllerRenderType.column_z;
} else if ((xx ? 1 : 0) + (yy ? 1 : 0) + (zz ? 1 : 0) >= 2) { }
else if( ( xx ? 1 : 0 ) + ( yy ? 1 : 0 ) + ( zz ? 1 : 0 ) >= 2 )
{
final int v = ( Math.abs( x ) + Math.abs( y ) + Math.abs( z ) ) % 2; final int v = ( Math.abs( x ) + Math.abs( y ) + Math.abs( z ) ) % 2;
// While i'd like this to be based on the blockstate randomization feature, this generates // While i'd like this to be based on the blockstate randomization feature, this generates
// an alternating pattern based on world position, so this is not 100% doable with blockstates. // an alternating pattern based on world position, so this is not 100% doable with blockstates.
if (v == 0) { if( v == 0 )
{
type = ControllerRenderType.inside_a; type = ControllerRenderType.inside_a;
} else { }
else
{
type = ControllerRenderType.inside_b; type = ControllerRenderType.inside_b;
} }
} }
@@ -128,30 +148,36 @@ public class BlockController extends AEBaseTileBlock {
} }
@Override @Override
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
{
return state; return state;
} }
@Override @Override
public int getMetaFromState(final IBlockState state) { public int getMetaFromState( final IBlockState state )
{
return state.getValue( CONTROLLER_STATE ).ordinal(); return state.getValue( CONTROLLER_STATE ).ordinal();
} }
@Override @Override
public IBlockState getStateFromMeta(final int meta) { public IBlockState getStateFromMeta( final int meta )
{
ControllerBlockState state = ControllerBlockState.values()[meta]; ControllerBlockState state = ControllerBlockState.values()[meta];
return this.getDefaultState().withProperty( CONTROLLER_STATE, state ); return this.getDefaultState().withProperty( CONTROLLER_STATE, state );
} }
@Override @Override
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
{
return BlockRenderLayer.CUTOUT; return BlockRenderLayer.CUTOUT;
} }
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
{
final TileController tc = this.getTileEntity( world, pos ); final TileController tc = this.getTileEntity( world, pos );
if (tc != null) { if( tc != null )
{
tc.onNeighborChange( false ); tc.onNeighborChange( false );
} }
} }
@@ -23,9 +23,11 @@ import appeng.block.AEBaseTileBlock;
import appeng.helpers.AEGlassMaterial; import appeng.helpers.AEGlassMaterial;
public class BlockCreativeEnergyCell extends AEBaseTileBlock { public class BlockCreativeEnergyCell extends AEBaseTileBlock
{
public BlockCreativeEnergyCell() { public BlockCreativeEnergyCell()
{
super( AEGlassMaterial.INSTANCE ); super( AEGlassMaterial.INSTANCE );
} }
} }
@@ -19,14 +19,17 @@
package appeng.block.networking; package appeng.block.networking;
public class BlockDenseEnergyCell extends BlockEnergyCell { public class BlockDenseEnergyCell extends BlockEnergyCell
{
public BlockDenseEnergyCell() { public BlockDenseEnergyCell()
{
} }
@Override @Override
public double getMaxPower() { public double getMaxPower()
{
return 200000.0 * 8.0; return 200000.0 * 8.0;
} }
} }
@@ -19,13 +19,16 @@
package appeng.block.networking; package appeng.block.networking;
import appeng.block.AEBaseTileBlock;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import appeng.block.AEBaseTileBlock;
public class BlockEnergyAcceptor extends AEBaseTileBlock {
public BlockEnergyAcceptor() { public class BlockEnergyAcceptor extends AEBaseTileBlock
{
public BlockEnergyAcceptor()
{
super( Material.IRON ); super( Material.IRON );
} }
} }
@@ -19,9 +19,6 @@
package appeng.block.networking; package appeng.block.networking;
import appeng.block.AEBaseTileBlock;
import appeng.helpers.AEGlassMaterial;
import appeng.util.Platform;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyInteger; import net.minecraft.block.properties.PropertyInteger;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@@ -32,28 +29,37 @@ import net.minecraft.util.NonNullList;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.block.AEBaseTileBlock;
import appeng.helpers.AEGlassMaterial;
import appeng.util.Platform;
public class BlockEnergyCell extends AEBaseTileBlock {
public class BlockEnergyCell extends AEBaseTileBlock
{
public static final PropertyInteger ENERGY_STORAGE = PropertyInteger.create( "fullness", 0, 7 ); public static final PropertyInteger ENERGY_STORAGE = PropertyInteger.create( "fullness", 0, 7 );
@Override @Override
public int getMetaFromState(final IBlockState state) { public int getMetaFromState( final IBlockState state )
{
return state.getValue( ENERGY_STORAGE ); return state.getValue( ENERGY_STORAGE );
} }
@Override @Override
public IBlockState getStateFromMeta(final int meta) { public IBlockState getStateFromMeta( final int meta )
{
return this.getDefaultState().withProperty( ENERGY_STORAGE, Math.min( 7, Math.max( 0, meta ) ) ); return this.getDefaultState().withProperty( ENERGY_STORAGE, Math.min( 7, Math.max( 0, meta ) ) );
} }
public BlockEnergyCell() { public BlockEnergyCell()
{
super( AEGlassMaterial.INSTANCE ); super( AEGlassMaterial.INSTANCE );
} }
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void getSubBlocks(final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks) { public void getSubBlocks( final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks )
{
super.getSubBlocks( tabs, itemStacks ); super.getSubBlocks( tabs, itemStacks );
final ItemStack charged = new ItemStack( this, 1 ); final ItemStack charged = new ItemStack( this, 1 );
@@ -64,12 +70,14 @@ public class BlockEnergyCell extends AEBaseTileBlock {
itemStacks.add( charged ); itemStacks.add( charged );
} }
public double getMaxPower() { public double getMaxPower()
{
return 200000.0; return 200000.0;
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
{
return new IProperty[] { ENERGY_STORAGE }; return new IProperty[] { ENERGY_STORAGE };
} }
@@ -19,27 +19,31 @@
package appeng.block.networking; package appeng.block.networking;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import appeng.api.implementations.items.IAEItemPowerStorage; import appeng.api.implementations.items.IAEItemPowerStorage;
import appeng.block.AEBaseItemBlockChargeable; import appeng.block.AEBaseItemBlockChargeable;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import appeng.tile.networking.TileEnergyCell; import appeng.tile.networking.TileEnergyCell;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
public class BlockEnergyCellRendering extends BlockRenderingCustomizer { public class BlockEnergyCellRendering extends BlockRenderingCustomizer
{
private final ResourceLocation baseModel; private final ResourceLocation baseModel;
public BlockEnergyCellRendering(ResourceLocation baseModel) { public BlockEnergyCellRendering( ResourceLocation baseModel )
{
this.baseModel = baseModel; this.baseModel = baseModel;
} }
@Override @Override
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
{
itemRendering.meshDefinition( this::getItemModel ); itemRendering.meshDefinition( this::getItemModel );
// Note: Since we use the block models, we dont need to register custom variants // Note: Since we use the block models, we dont need to register custom variants
} }
@@ -48,7 +52,8 @@ public class BlockEnergyCellRendering extends BlockRenderingCustomizer {
* Determines which version of the energy cell model should be used depending on the fill factor * Determines which version of the energy cell model should be used depending on the fill factor
* of the item stack. * of the item stack.
*/ */
private ModelResourceLocation getItemModel(ItemStack is) { private ModelResourceLocation getItemModel( ItemStack is )
{
double fillFactor = getFillFactor( is ); double fillFactor = getFillFactor( is );
int storageLevel = TileEnergyCell.getStorageLevelFromFillFactor( fillFactor ); int storageLevel = TileEnergyCell.getStorageLevelFromFillFactor( fillFactor );
@@ -59,8 +64,10 @@ public class BlockEnergyCellRendering extends BlockRenderingCustomizer {
* Helper method that returns the energy fill factor (between 0 and 1) of a given item stack. * Helper method that returns the energy fill factor (between 0 and 1) of a given item stack.
* Returns 0 if the item stack has no fill factor. * Returns 0 if the item stack has no fill factor.
*/ */
private static double getFillFactor(ItemStack is) { private static double getFillFactor( ItemStack is )
if (!(is.getItem() instanceof IAEItemPowerStorage)) { {
if( !( is.getItem() instanceof IAEItemPowerStorage ) )
{
return 0; return 0;
} }
@@ -19,13 +19,9 @@
package appeng.block.networking; package appeng.block.networking;
import appeng.api.util.AEPartLocation; import java.util.Collections;
import appeng.block.AEBaseTileBlock; import java.util.List;
import appeng.core.sync.GuiBridge;
import appeng.helpers.AEGlassMaterial;
import appeng.helpers.ICustomCollision;
import appeng.tile.networking.TileWireless;
import appeng.util.Platform;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@@ -40,26 +36,35 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import java.util.Collections; import appeng.api.util.AEPartLocation;
import java.util.List; import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.helpers.AEGlassMaterial;
import appeng.helpers.ICustomCollision;
import appeng.tile.networking.TileWireless;
import appeng.util.Platform;
public class BlockWireless extends AEBaseTileBlock implements ICustomCollision { public class BlockWireless extends AEBaseTileBlock implements ICustomCollision
{
enum State implements IStringSerializable { enum State implements IStringSerializable
{
OFF, OFF,
ON, ON,
HAS_CHANNEL; HAS_CHANNEL;
@Override @Override
public String getName() { public String getName()
{
return this.name().toLowerCase(); return this.name().toLowerCase();
} }
} }
public static final PropertyEnum<State> STATE = PropertyEnum.create( "state", State.class ); public static final PropertyEnum<State> STATE = PropertyEnum.create( "state", State.class );
public BlockWireless() { public BlockWireless()
{
super( AEGlassMaterial.INSTANCE ); super( AEGlassMaterial.INSTANCE );
this.setLightOpacity( 0 ); this.setLightOpacity( 0 );
this.setFullSize( false ); this.setFullSize( false );
@@ -68,19 +73,25 @@ public class BlockWireless extends AEBaseTileBlock implements ICustomCollision {
} }
@Override @Override
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
{
return BlockRenderLayer.CUTOUT; return BlockRenderLayer.CUTOUT;
} }
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { public IBlockState getActualState( IBlockState state, IBlockAccess worldIn, BlockPos pos )
{
State teState = State.OFF; State teState = State.OFF;
TileWireless te = this.getTileEntity( worldIn, pos ); TileWireless te = this.getTileEntity( worldIn, pos );
if (te != null) { if( te != null )
if (te.isActive()) { {
if( te.isActive() )
{
teState = State.HAS_CHANNEL; teState = State.HAS_CHANNEL;
} else if (te.isPowered()) { }
else if( te.isPowered() )
{
teState = State.ON; teState = State.ON;
} }
} }
@@ -90,16 +101,20 @@ public class BlockWireless extends AEBaseTileBlock implements ICustomCollision {
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
{
return new IProperty[] { STATE }; return new IProperty[] { STATE };
} }
@Override @Override
public boolean onBlockActivated(final World w, final BlockPos pos, final IBlockState state, final EntityPlayer player, final EnumHand hand, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onBlockActivated( final World w, final BlockPos pos, final IBlockState state, final EntityPlayer player, final EnumHand hand, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
{
final TileWireless tg = this.getTileEntity( w, pos ); final TileWireless tg = this.getTileEntity( w, pos );
if (tg != null && !player.isSneaking()) { if( tg != null && !player.isSneaking() )
if (Platform.isServer()) { {
if( Platform.isServer() )
{
Platform.openGUI( player, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_WIRELESS ); Platform.openGUI( player, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_WIRELESS );
} }
return true; return true;
@@ -109,9 +124,11 @@ public class BlockWireless extends AEBaseTileBlock implements ICustomCollision {
} }
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
{
final TileWireless tile = this.getTileEntity( w, pos ); final TileWireless tile = this.getTileEntity( w, pos );
if (tile != null) { if( tile != null )
{
final EnumFacing forward = tile.getForward(); final EnumFacing forward = tile.getForward();
double minX = 0; double minX = 0;
@@ -121,7 +138,8 @@ public class BlockWireless extends AEBaseTileBlock implements ICustomCollision {
double maxY = 1; double maxY = 1;
double maxZ = 1; double maxZ = 1;
switch (forward) { switch( forward )
{
case DOWN: case DOWN:
minZ = minX = 3.0 / 16.0; minZ = minX = 3.0 / 16.0;
maxZ = maxX = 13.0 / 16.0; maxZ = maxX = 13.0 / 16.0;
@@ -168,9 +186,11 @@ public class BlockWireless extends AEBaseTileBlock implements ICustomCollision {
} }
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) { public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
{
final TileWireless tile = this.getTileEntity( w, pos ); final TileWireless tile = this.getTileEntity( w, pos );
if (tile != null) { if( tile != null )
{
final EnumFacing forward = tile.getForward(); final EnumFacing forward = tile.getForward();
double minX = 0; double minX = 0;
@@ -180,7 +200,8 @@ public class BlockWireless extends AEBaseTileBlock implements ICustomCollision {
double maxY = 1; double maxY = 1;
double maxZ = 1; double maxZ = 1;
switch (forward) { switch( forward )
{
case DOWN: case DOWN:
minZ = minX = 3.0 / 16.0; minZ = minX = 3.0 / 16.0;
maxZ = maxX = 13.0 / 16.0; maxZ = maxX = 13.0 / 16.0;
@@ -222,13 +243,16 @@ public class BlockWireless extends AEBaseTileBlock implements ICustomCollision {
} }
out.add( new AxisAlignedBB( minX, minY, minZ, maxX, maxY, maxZ ) ); out.add( new AxisAlignedBB( minX, minY, minZ, maxX, maxY, maxZ ) );
} else { }
else
{
out.add( new AxisAlignedBB( 0.0, 0.0, 0.0, 1.0, 1.0, 1.0 ) ); out.add( new AxisAlignedBB( 0.0, 0.0, 0.0, 1.0, 1.0, 1.0 ) );
} }
} }
@Override @Override
public boolean isFullCube(IBlockState state) { public boolean isFullCube( IBlockState state )
{
return false; return false;
} }
@@ -19,8 +19,6 @@
package appeng.block.networking; package appeng.block.networking;
import appeng.api.util.AEColor;
import appeng.client.render.cablebus.CableBusRenderState;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.color.IBlockColor; import net.minecraft.client.renderer.color.IBlockColor;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@@ -29,21 +27,28 @@ import net.minecraftforge.common.property.IExtendedBlockState;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.util.AEColor;
import appeng.client.render.cablebus.CableBusRenderState;
/** /**
* Exposes the cable bus color as tint indices 0 (dark variant), 1 (medium variant) and 2 (bright variant). * Exposes the cable bus color as tint indices 0 (dark variant), 1 (medium variant) and 2 (bright variant).
*/ */
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public class CableBusColor implements IBlockColor { public class CableBusColor implements IBlockColor
{
@Override @Override
public int colorMultiplier(IBlockState state, IBlockAccess worldIn, BlockPos pos, int color) { public int colorMultiplier( IBlockState state, IBlockAccess worldIn, BlockPos pos, int color )
{
AEColor busColor = AEColor.TRANSPARENT; AEColor busColor = AEColor.TRANSPARENT;
if (state instanceof IExtendedBlockState) { if( state instanceof IExtendedBlockState )
{
CableBusRenderState renderState = ( (IExtendedBlockState) state ).getValue( BlockCableBus.RENDER_STATE_PROPERTY ); CableBusRenderState renderState = ( (IExtendedBlockState) state ).getValue( BlockCableBus.RENDER_STATE_PROPERTY );
if (renderState != null) { if( renderState != null )
{
busColor = renderState.getCableColor(); busColor = renderState.getCableColor();
} }
} }
@@ -19,28 +19,32 @@
package appeng.block.networking; package appeng.block.networking;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import appeng.client.render.cablebus.CableBusModel; import appeng.client.render.cablebus.CableBusModel;
import appeng.core.features.registries.PartModels; import appeng.core.features.registries.PartModels;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
/** /**
* Customizes the rendering behavior for cable busses, which are the biggest multipart of AE2. * Customizes the rendering behavior for cable busses, which are the biggest multipart of AE2.
*/ */
public class CableBusRendering extends BlockRenderingCustomizer { public class CableBusRendering extends BlockRenderingCustomizer
{
private final PartModels partModels; private final PartModels partModels;
public CableBusRendering(PartModels partModels) { public CableBusRendering( PartModels partModels )
{
this.partModels = partModels; this.partModels = partModels;
} }
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
{
rendering.builtInModel( "models/block/builtin/cable_bus", new CableBusModel( this.partModels ) ); rendering.builtInModel( "models/block/builtin/cable_bus", new CableBusModel( this.partModels ) );
rendering.blockColor( new CableBusColor() ); rendering.blockColor( new CableBusColor() );
rendering.modelCustomizer( ( loc, model ) -> model ); rendering.modelCustomizer( ( loc, model ) -> model );
@@ -24,9 +24,11 @@ import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
public class ControllerRendering extends BlockRenderingCustomizer { public class ControllerRendering extends BlockRenderingCustomizer
{
@Override @Override
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
{
// Disables the default model rotator // Disables the default model rotator
rendering.modelCustomizer( ( loc, model ) -> model ); rendering.modelCustomizer( ( loc, model ) -> model );
} }
@@ -1,19 +1,23 @@
package appeng.block.networking; package appeng.block.networking;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.util.AEColor; import appeng.api.util.AEColor;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import appeng.client.render.StaticBlockColor; import appeng.client.render.StaticBlockColor;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class WirelessRendering extends BlockRenderingCustomizer { public class WirelessRendering extends BlockRenderingCustomizer
{
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
{
rendering.blockColor( new StaticBlockColor( AEColor.TRANSPARENT ) ); rendering.blockColor( new StaticBlockColor( AEColor.TRANSPARENT ) );
} }
} }
@@ -19,10 +19,10 @@
package appeng.block.paint; package appeng.block.paint;
import appeng.block.AEBaseTileBlock; import java.util.Collection;
import appeng.helpers.Splotch; import java.util.Collections;
import appeng.tile.misc.TilePaint; import java.util.Random;
import appeng.util.Platform;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.MapColor; import net.minecraft.block.material.MapColor;
import net.minecraft.block.material.MaterialLiquid; import net.minecraft.block.material.MaterialLiquid;
@@ -44,16 +44,19 @@ import net.minecraftforge.common.property.IUnlistedProperty;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.Collection; import appeng.block.AEBaseTileBlock;
import java.util.Collections; import appeng.helpers.Splotch;
import java.util.Random; import appeng.tile.misc.TilePaint;
import appeng.util.Platform;
public class BlockPaint extends AEBaseTileBlock { public class BlockPaint extends AEBaseTileBlock
{
static final PaintSplotchesProperty SPLOTCHES = new PaintSplotchesProperty(); static final PaintSplotchesProperty SPLOTCHES = new PaintSplotchesProperty();
public BlockPaint() { public BlockPaint()
{
super( new MaterialLiquid( MapColor.AIR ) ); super( new MaterialLiquid( MapColor.AIR ) );
this.setLightOpacity( 0 ); this.setLightOpacity( 0 );
@@ -62,18 +65,21 @@ public class BlockPaint extends AEBaseTileBlock {
} }
@Override @Override
protected BlockStateContainer createBlockState() { protected BlockStateContainer createBlockState()
{
return new ExtendedBlockState( this, new IProperty[0], new IUnlistedProperty[] { SPLOTCHES } ); return new ExtendedBlockState( this, new IProperty[0], new IUnlistedProperty[] { SPLOTCHES } );
} }
@Override @Override
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
{
IExtendedBlockState extState = (IExtendedBlockState) state; IExtendedBlockState extState = (IExtendedBlockState) state;
TilePaint te = this.getTileEntity( world, pos ); TilePaint te = this.getTileEntity( world, pos );
Collection<Splotch> splotches = Collections.emptyList(); Collection<Splotch> splotches = Collections.emptyList();
if (te != null) { if( te != null )
{
splotches = te.getDots(); splotches = te.getDots();
} }
@@ -81,57 +87,69 @@ public class BlockPaint extends AEBaseTileBlock {
} }
@Override @Override
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
{
return BlockRenderLayer.CUTOUT; return BlockRenderLayer.CUTOUT;
} }
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void getSubBlocks(final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks) { public void getSubBlocks( final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks )
{
// do nothing // do nothing
} }
@Override @Override
public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) { public AxisAlignedBB getCollisionBoundingBox( IBlockState blockState, IBlockAccess worldIn, BlockPos pos )
{
return null; return null;
} }
@Override @Override
public boolean canCollideCheck(final IBlockState state, final boolean hitIfLiquid) { public boolean canCollideCheck( final IBlockState state, final boolean hitIfLiquid )
{
return false; return false;
} }
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
{
final TilePaint tp = this.getTileEntity( world, pos ); final TilePaint tp = this.getTileEntity( world, pos );
if (tp != null) { if( tp != null )
{
tp.neighborChanged(); tp.neighborChanged();
} }
} }
@Override @Override
public Item getItemDropped(final IBlockState state, final Random rand, final int fortune) { public Item getItemDropped( final IBlockState state, final Random rand, final int fortune )
{
return null; return null;
} }
@Override @Override
public void dropBlockAsItemWithChance(final World worldIn, final BlockPos pos, final IBlockState state, final float chance, final int fortune) { public void dropBlockAsItemWithChance( final World worldIn, final BlockPos pos, final IBlockState state, final float chance, final int fortune )
{
} }
@Override @Override
public void fillWithRain(final World w, final BlockPos pos) { public void fillWithRain( final World w, final BlockPos pos )
if (Platform.isServer()) { {
if( Platform.isServer() )
{
w.setBlockToAir( pos ); w.setBlockToAir( pos );
} }
} }
@Override @Override
public int getLightValue(final IBlockState state, final IBlockAccess w, final BlockPos pos) { public int getLightValue( final IBlockState state, final IBlockAccess w, final BlockPos pos )
{
final TilePaint tp = this.getTileEntity( w, pos ); final TilePaint tp = this.getTileEntity( w, pos );
if (tp != null) { if( tp != null )
{
return tp.getLightLevel(); return tp.getLightLevel();
} }
@@ -139,12 +157,14 @@ public class BlockPaint extends AEBaseTileBlock {
} }
@Override @Override
public boolean isAir(final IBlockState state, final IBlockAccess world, final BlockPos pos) { public boolean isAir( final IBlockState state, final IBlockAccess world, final BlockPos pos )
{
return true; return true;
} }
@Override @Override
public boolean isReplaceable(final IBlockAccess worldIn, final BlockPos pos) { public boolean isReplaceable( final IBlockAccess worldIn, final BlockPos pos )
{
return true; return true;
} }
@@ -1,10 +1,16 @@
package appeng.block.paint; package appeng.block.paint;
import appeng.client.render.cablebus.CubeBuilder; import java.util.ArrayList;
import appeng.core.AppEng; import java.util.Collections;
import appeng.helpers.Splotch; import java.util.List;
import java.util.function.Function;
import javax.annotation.Nullable;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.IBakedModel;
@@ -16,11 +22,9 @@ import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IExtendedBlockState;
import javax.annotation.Nullable; import appeng.client.render.cablebus.CubeBuilder;
import java.util.ArrayList; import appeng.core.AppEng;
import java.util.Collections; import appeng.helpers.Splotch;
import java.util.List;
import java.util.function.Function;
/** /**
@@ -28,7 +32,8 @@ import java.util.function.Function;
* a * a
* matter cannon with paint balls. * matter cannon with paint balls.
*/ */
class PaintBakedModel implements IBakedModel { class PaintBakedModel implements IBakedModel
{
private static final ResourceLocation TEXTURE_PAINT1 = new ResourceLocation( AppEng.MOD_ID, "blocks/paint1" ); private static final ResourceLocation TEXTURE_PAINT1 = new ResourceLocation( AppEng.MOD_ID, "blocks/paint1" );
private static final ResourceLocation TEXTURE_PAINT2 = new ResourceLocation( AppEng.MOD_ID, "blocks/paint2" ); private static final ResourceLocation TEXTURE_PAINT2 = new ResourceLocation( AppEng.MOD_ID, "blocks/paint2" );
@@ -38,7 +43,8 @@ class PaintBakedModel implements IBakedModel {
private final TextureAtlasSprite[] textures; private final TextureAtlasSprite[] textures;
PaintBakedModel(VertexFormat vertexFormat, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) { PaintBakedModel( VertexFormat vertexFormat, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter )
{
this.vertexFormat = vertexFormat; this.vertexFormat = vertexFormat;
this.textures = new TextureAtlasSprite[] { this.textures = new TextureAtlasSprite[] {
bakedTextureGetter.apply( TEXTURE_PAINT1 ), bakedTextureGetter.apply( TEXTURE_PAINT1 ),
@@ -48,12 +54,15 @@ class PaintBakedModel implements IBakedModel {
} }
@Override @Override
public List<BakedQuad> getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) { public List<BakedQuad> getQuads( @Nullable IBlockState state, @Nullable EnumFacing side, long rand )
if (side != null) { {
if( side != null )
{
return Collections.emptyList(); return Collections.emptyList();
} }
if (!(state instanceof IExtendedBlockState)) { if( !( state instanceof IExtendedBlockState ) )
{
// This is the inventory model which should usually not be used other than in special cases // This is the inventory model which should usually not be used other than in special cases
List<BakedQuad> quads = new ArrayList<>( 1 ); List<BakedQuad> quads = new ArrayList<>( 1 );
CubeBuilder builder = new CubeBuilder( this.vertexFormat, quads ); CubeBuilder builder = new CubeBuilder( this.vertexFormat, quads );
@@ -65,7 +74,8 @@ class PaintBakedModel implements IBakedModel {
IExtendedBlockState extendedBlockState = (IExtendedBlockState) state; IExtendedBlockState extendedBlockState = (IExtendedBlockState) state;
PaintSplotches splotchesState = extendedBlockState.getValue( BlockPaint.SPLOTCHES ); PaintSplotches splotchesState = extendedBlockState.getValue( BlockPaint.SPLOTCHES );
if (splotchesState == null) { if( splotchesState == null )
{
return Collections.emptyList(); return Collections.emptyList();
} }
@@ -74,12 +84,16 @@ class PaintBakedModel implements IBakedModel {
CubeBuilder builder = new CubeBuilder( this.vertexFormat ); CubeBuilder builder = new CubeBuilder( this.vertexFormat );
float offsetConstant = 0.001f; float offsetConstant = 0.001f;
for (final Splotch s : splotches) { for( final Splotch s : splotches )
{
if (s.isLumen()) { if( s.isLumen() )
{
builder.setColorRGB( s.getColor().whiteVariant ); builder.setColorRGB( s.getColor().whiteVariant );
builder.setRenderFullBright( true ); builder.setRenderFullBright( true );
} else { }
else
{
builder.setColorRGB( s.getColor().mediumVariant ); builder.setColorRGB( s.getColor().mediumVariant );
builder.setRenderFullBright( false ); builder.setRenderFullBright( false );
} }
@@ -99,7 +113,8 @@ class PaintBakedModel implements IBakedModel {
builder.setTexture( ico ); builder.setTexture( ico );
builder.setCustomUv( s.getSide().getOpposite(), 0, 0, 16, 16 ); builder.setCustomUv( s.getSide().getOpposite(), 0, 0, 16, 16 );
switch (s.getSide()) { switch( s.getSide() )
{
case UP: case UP:
offset = 1.0f - offset; offset = 1.0f - offset;
builder.addQuad( EnumFacing.DOWN, pos_x - buffer, offset, pos_y - buffer, builder.addQuad( EnumFacing.DOWN, pos_x - buffer, offset, pos_y - buffer,
@@ -141,36 +156,43 @@ class PaintBakedModel implements IBakedModel {
} }
@Override @Override
public boolean isAmbientOcclusion() { public boolean isAmbientOcclusion()
{
return false; return false;
} }
@Override @Override
public boolean isGui3d() { public boolean isGui3d()
{
return true; return true;
} }
@Override @Override
public boolean isBuiltInRenderer() { public boolean isBuiltInRenderer()
{
return false; return false;
} }
@Override @Override
public TextureAtlasSprite getParticleTexture() { public TextureAtlasSprite getParticleTexture()
{
return this.textures[0]; return this.textures[0];
} }
@Override @Override
public ItemCameraTransforms getItemCameraTransforms() { public ItemCameraTransforms getItemCameraTransforms()
{
return ItemCameraTransforms.DEFAULT; return ItemCameraTransforms.DEFAULT;
} }
@Override @Override
public ItemOverrideList getOverrides() { public ItemOverrideList getOverrides()
{
return ItemOverrideList.NONE; return ItemOverrideList.NONE;
} }
static List<ResourceLocation> getRequiredTextures() { static List<ResourceLocation> getRequiredTextures()
{
return ImmutableList.of( return ImmutableList.of(
TEXTURE_PAINT1, TEXTURE_PAINT2, TEXTURE_PAINT3 ); TEXTURE_PAINT1, TEXTURE_PAINT2, TEXTURE_PAINT3 );
} }
@@ -1,6 +1,11 @@
package appeng.block.paint; package appeng.block.paint;
import java.util.Collection;
import java.util.Collections;
import java.util.function.Function;
import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.client.renderer.vertex.VertexFormat;
@@ -9,30 +14,31 @@ import net.minecraftforge.client.model.IModel;
import net.minecraftforge.common.model.IModelState; import net.minecraftforge.common.model.IModelState;
import net.minecraftforge.common.model.TRSRTransformation; import net.minecraftforge.common.model.TRSRTransformation;
import java.util.Collection;
import java.util.Collections;
import java.util.function.Function;
class PaintModel implements IModel
class PaintModel implements IModel { {
@Override @Override
public Collection<ResourceLocation> getDependencies() { public Collection<ResourceLocation> getDependencies()
{
return Collections.emptyList(); return Collections.emptyList();
} }
@Override @Override
public Collection<ResourceLocation> getTextures() { public Collection<ResourceLocation> getTextures()
{
return PaintBakedModel.getRequiredTextures(); return PaintBakedModel.getRequiredTextures();
} }
@Override @Override
public IBakedModel bake(IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) { public IBakedModel bake( IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter )
{
return new PaintBakedModel( format, bakedTextureGetter ); return new PaintBakedModel( format, bakedTextureGetter );
} }
@Override @Override
public IModelState getDefaultState() { public IModelState getDefaultState()
{
return TRSRTransformation.identity(); return TRSRTransformation.identity();
} }
@@ -1,18 +1,22 @@
package appeng.block.paint; package appeng.block.paint;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class PaintRendering extends BlockRenderingCustomizer { public class PaintRendering extends BlockRenderingCustomizer
{
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
{
rendering.builtInModel( "models/block/paint", new PaintModel() ); rendering.builtInModel( "models/block/paint", new PaintModel() );
// Disable auto rotation // Disable auto rotation
rendering.modelCustomizer( ( location, model ) -> model ); rendering.modelCustomizer( ( location, model ) -> model );
@@ -1,25 +1,30 @@
package appeng.block.paint; package appeng.block.paint;
import appeng.helpers.Splotch;
import com.google.common.collect.ImmutableList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import com.google.common.collect.ImmutableList;
import appeng.helpers.Splotch;
/** /**
* Used to transfer the state about paint splotches from the game thread to the render thread. * Used to transfer the state about paint splotches from the game thread to the render thread.
*/ */
class PaintSplotches { class PaintSplotches
{
private final List<Splotch> splotches; private final List<Splotch> splotches;
PaintSplotches(Collection<Splotch> splotches) { PaintSplotches( Collection<Splotch> splotches )
{
this.splotches = ImmutableList.copyOf( splotches ); this.splotches = ImmutableList.copyOf( splotches );
} }
List<Splotch> getSplotches() { List<Splotch> getSplotches()
{
return this.splotches; return this.splotches;
} }
@@ -1,28 +1,34 @@
package appeng.block.paint; package appeng.block.paint;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
class PaintSplotchesProperty implements IUnlistedProperty<PaintSplotches> { class PaintSplotchesProperty implements IUnlistedProperty<PaintSplotches>
{
@Override @Override
public String getName() { public String getName()
{
return "paint_splots"; return "paint_splots";
} }
@Override @Override
public boolean isValid(PaintSplotches value) { public boolean isValid( PaintSplotches value )
{
return value != null; return value != null;
} }
@Override @Override
public Class<PaintSplotches> getType() { public Class<PaintSplotches> getType()
{
return PaintSplotches.class; return PaintSplotches.class;
} }
@Override @Override
public String valueToString(PaintSplotches value) { public String valueToString( PaintSplotches value )
{
return null; return null;
} }
} }
@@ -19,9 +19,6 @@
package appeng.block.qnb; package appeng.block.qnb;
import appeng.block.AEBaseTileBlock;
import appeng.helpers.ICustomCollision;
import appeng.tile.qnb.TileQuantumBridge;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
@@ -37,14 +34,20 @@ import net.minecraftforge.common.property.ExtendedBlockState;
import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IExtendedBlockState;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
import appeng.block.AEBaseTileBlock;
import appeng.helpers.ICustomCollision;
import appeng.tile.qnb.TileQuantumBridge;
public abstract class BlockQuantumBase extends AEBaseTileBlock implements ICustomCollision {
public abstract class BlockQuantumBase extends AEBaseTileBlock implements ICustomCollision
{
public static final PropertyBool FORMED = PropertyBool.create( "formed" ); public static final PropertyBool FORMED = PropertyBool.create( "formed" );
public static final QnbFormedStateProperty FORMED_STATE = new QnbFormedStateProperty(); public static final QnbFormedStateProperty FORMED_STATE = new QnbFormedStateProperty();
public BlockQuantumBase(final Material mat) { public BlockQuantumBase( final Material mat )
{
super( mat ); super( mat );
final float shave = 2.0f / 16.0f; final float shave = 2.0f / 16.0f;
this.boundingBox = new AxisAlignedBB( shave, shave, shave, 1.0f - shave, 1.0f - shave, 1.0f - shave ); this.boundingBox = new AxisAlignedBB( shave, shave, shave, 1.0f - shave, 1.0f - shave, 1.0f - shave );
@@ -54,21 +57,25 @@ public abstract class BlockQuantumBase extends AEBaseTileBlock implements ICusto
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
{
return new IProperty[] { FORMED }; return new IProperty[] { FORMED };
} }
@Override @Override
protected BlockStateContainer createBlockState() { protected BlockStateContainer createBlockState()
{
return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] { FORMED_STATE } ); return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] { FORMED_STATE } );
} }
@Override @Override
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
{
IExtendedBlockState extState = (IExtendedBlockState) state; IExtendedBlockState extState = (IExtendedBlockState) state;
TileQuantumBridge bridge = this.getTileEntity( world, pos ); TileQuantumBridge bridge = this.getTileEntity( world, pos );
if (bridge != null) { if( bridge != null )
{
QnbFormedState formedState = new QnbFormedState( bridge.getAdjacentQuantumBridges(), bridge.isCorner(), bridge.isPowered() ); QnbFormedState formedState = new QnbFormedState( bridge.getAdjacentQuantumBridges(), bridge.isCorner(), bridge.isPowered() );
extState = extState.withProperty( FORMED_STATE, formedState ); extState = extState.withProperty( FORMED_STATE, formedState );
} }
@@ -77,31 +84,38 @@ public abstract class BlockQuantumBase extends AEBaseTileBlock implements ICusto
} }
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { public IBlockState getActualState( IBlockState state, IBlockAccess worldIn, BlockPos pos )
{
TileQuantumBridge bridge = this.getTileEntity( worldIn, pos ); TileQuantumBridge bridge = this.getTileEntity( worldIn, pos );
if (bridge != null) { if( bridge != null )
{
state = state.withProperty( FORMED, bridge.isFormed() ); state = state.withProperty( FORMED, bridge.isFormed() );
} }
return state; return state;
} }
@Override @Override
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
{
return BlockRenderLayer.CUTOUT; return BlockRenderLayer.CUTOUT;
} }
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
{
final TileQuantumBridge bridge = this.getTileEntity( world, pos ); final TileQuantumBridge bridge = this.getTileEntity( world, pos );
if (bridge != null) { if( bridge != null )
{
bridge.neighborUpdate(); bridge.neighborUpdate();
} }
} }
@Override @Override
public void breakBlock(final World w, final BlockPos pos, final IBlockState state) { public void breakBlock( final World w, final BlockPos pos, final IBlockState state )
{
final TileQuantumBridge bridge = this.getTileEntity( w, pos ); final TileQuantumBridge bridge = this.getTileEntity( w, pos );
if (bridge != null) { if( bridge != null )
{
bridge.breakCluster(); bridge.breakCluster();
} }
@@ -109,7 +123,8 @@ public abstract class BlockQuantumBase extends AEBaseTileBlock implements ICusto
} }
@Override @Override
public boolean isFullCube(IBlockState state) { public boolean isFullCube( IBlockState state )
{
return false; return false;
} }
} }
@@ -19,13 +19,12 @@
package appeng.block.qnb; package appeng.block.qnb;
import appeng.api.util.AEPartLocation; import java.util.Collections;
import appeng.client.EffectType; import java.util.List;
import appeng.core.AppEng; import java.util.Random;
import appeng.core.sync.GuiBridge;
import appeng.helpers.AEGlassMaterial; import javax.annotation.Nullable;
import appeng.tile.qnb.TileQuantumBridge;
import appeng.util.Platform;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
@@ -36,24 +35,33 @@ import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import java.util.Collections; import appeng.client.EffectType;
import java.util.List; import appeng.core.AppEng;
import java.util.Random; import appeng.core.sync.GuiBridge;
import appeng.helpers.AEGlassMaterial;
import appeng.tile.qnb.TileQuantumBridge;
import appeng.util.Platform;
public class BlockQuantumLinkChamber extends BlockQuantumBase { public class BlockQuantumLinkChamber extends BlockQuantumBase
{
public BlockQuantumLinkChamber() { public BlockQuantumLinkChamber()
{
super( AEGlassMaterial.INSTANCE ); super( AEGlassMaterial.INSTANCE );
} }
@Override @Override
public void randomDisplayTick(final IBlockState state, final World w, final BlockPos pos, final Random rand) { public void randomDisplayTick( final IBlockState state, final World w, final BlockPos pos, final Random rand )
{
final TileQuantumBridge bridge = this.getTileEntity( w, pos ); final TileQuantumBridge bridge = this.getTileEntity( w, pos );
if (bridge != null) { if( bridge != null )
if (bridge.hasQES()) { {
if (AppEng.proxy.shouldAddParticles(rand)) { if( bridge.hasQES() )
{
if( AppEng.proxy.shouldAddParticles( rand ) )
{
AppEng.proxy.spawnEffect( EffectType.Energy, w, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, null ); AppEng.proxy.spawnEffect( EffectType.Energy, w, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, null );
} }
} }
@@ -61,14 +69,18 @@ public class BlockQuantumLinkChamber extends BlockQuantumBase {
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (p.isSneaking()) { {
if( p.isSneaking() )
{
return false; return false;
} }
final TileQuantumBridge tg = this.getTileEntity( w, pos ); final TileQuantumBridge tg = this.getTileEntity( w, pos );
if (tg != null) { if( tg != null )
if (Platform.isServer()) { {
if( Platform.isServer() )
{
Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_QNB ); Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_QNB );
} }
return true; return true;
@@ -77,13 +89,15 @@ public class BlockQuantumLinkChamber extends BlockQuantumBase {
} }
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
{
final double onePixel = 2.0 / 16.0; final double onePixel = 2.0 / 16.0;
return Collections.singletonList( new AxisAlignedBB( onePixel, onePixel, onePixel, 1.0 - onePixel, 1.0 - onePixel, 1.0 - onePixel ) ); return Collections.singletonList( new AxisAlignedBB( onePixel, onePixel, onePixel, 1.0 - onePixel, 1.0 - onePixel, 1.0 - onePixel ) );
} }
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) { public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
{
final double onePixel = 2.0 / 16.0; final double onePixel = 2.0 / 16.0;
out.add( new AxisAlignedBB( onePixel, onePixel, onePixel, 1.0 - onePixel, 1.0 - onePixel, 1.0 - onePixel ) ); out.add( new AxisAlignedBB( onePixel, onePixel, onePixel, 1.0 - onePixel, 1.0 - onePixel, 1.0 - onePixel ) );
} }
@@ -19,42 +19,53 @@
package appeng.block.qnb; package appeng.block.qnb;
import appeng.tile.qnb.TileQuantumBridge; import java.util.Collections;
import java.util.List;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import java.util.Collections; import appeng.tile.qnb.TileQuantumBridge;
import java.util.List;
public class BlockQuantumRing extends BlockQuantumBase { public class BlockQuantumRing extends BlockQuantumBase
{
public BlockQuantumRing() { public BlockQuantumRing()
{
super( Material.IRON ); super( Material.IRON );
} }
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
{
double onePixel = 2.0 / 16.0; double onePixel = 2.0 / 16.0;
final TileQuantumBridge bridge = this.getTileEntity( w, pos ); final TileQuantumBridge bridge = this.getTileEntity( w, pos );
if (bridge != null && bridge.isCorner()) { if( bridge != null && bridge.isCorner() )
{
onePixel = 4.0 / 16.0; onePixel = 4.0 / 16.0;
} else if (bridge != null && bridge.isFormed()) { }
else if( bridge != null && bridge.isFormed() )
{
onePixel = 1.0 / 16.0; onePixel = 1.0 / 16.0;
} }
return Collections.singletonList( new AxisAlignedBB( onePixel, onePixel, onePixel, 1.0 - onePixel, 1.0 - onePixel, 1.0 - onePixel ) ); return Collections.singletonList( new AxisAlignedBB( onePixel, onePixel, onePixel, 1.0 - onePixel, 1.0 - onePixel, 1.0 - onePixel ) );
} }
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) { public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
{
double onePixel = 2.0 / 16.0; double onePixel = 2.0 / 16.0;
final TileQuantumBridge bridge = this.getTileEntity( w, pos ); final TileQuantumBridge bridge = this.getTileEntity( w, pos );
if (bridge != null && bridge.isCorner()) { if( bridge != null && bridge.isCorner() )
{
onePixel = 4.0 / 16.0; onePixel = 4.0 / 16.0;
} else if (bridge != null && bridge.isFormed()) { }
else if( bridge != null && bridge.isFormed() )
{
onePixel = 1.0 / 16.0; onePixel = 1.0 / 16.0;
} }
out.add( new AxisAlignedBB( onePixel, onePixel, onePixel, 1.0 - onePixel, 1.0 - onePixel, 1.0 - onePixel ) ); out.add( new AxisAlignedBB( onePixel, onePixel, onePixel, 1.0 - onePixel, 1.0 - onePixel, 1.0 - onePixel ) );
@@ -1,10 +1,16 @@
package appeng.block.qnb; package appeng.block.qnb;
import appeng.api.AEApi; import java.util.EnumSet;
import appeng.client.render.cablebus.CubeBuilder; import java.util.List;
import appeng.core.AppEng; import java.util.Set;
import java.util.function.Function;
import javax.annotation.Nullable;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BakedQuad;
@@ -17,14 +23,13 @@ import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IExtendedBlockState;
import javax.annotation.Nullable; import appeng.api.AEApi;
import java.util.EnumSet; import appeng.client.render.cablebus.CubeBuilder;
import java.util.List; import appeng.core.AppEng;
import java.util.Set;
import java.util.function.Function;
class QnbFormedBakedModel implements IBakedModel { class QnbFormedBakedModel implements IBakedModel
{
private static final ResourceLocation TEXTURE_LINK = new ResourceLocation( AppEng.MOD_ID, "blocks/quantum_link" ); private static final ResourceLocation TEXTURE_LINK = new ResourceLocation( AppEng.MOD_ID, "blocks/quantum_link" );
private static final ResourceLocation TEXTURE_RING = new ResourceLocation( AppEng.MOD_ID, "blocks/quantum_ring" ); private static final ResourceLocation TEXTURE_RING = new ResourceLocation( AppEng.MOD_ID, "blocks/quantum_ring" );
@@ -55,7 +60,8 @@ class QnbFormedBakedModel implements IBakedModel {
private final TextureAtlasSprite lightTexture; private final TextureAtlasSprite lightTexture;
private final TextureAtlasSprite lightCornerTexture; private final TextureAtlasSprite lightCornerTexture;
public QnbFormedBakedModel(VertexFormat vertexFormat, IBakedModel baseModel, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) { public QnbFormedBakedModel( VertexFormat vertexFormat, IBakedModel baseModel, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter )
{
this.vertexFormat = vertexFormat; this.vertexFormat = vertexFormat;
this.baseModel = baseModel; this.baseModel = baseModel;
this.linkTexture = bakedTextureGetter.apply( TEXTURE_LINK ); this.linkTexture = bakedTextureGetter.apply( TEXTURE_LINK );
@@ -68,9 +74,11 @@ class QnbFormedBakedModel implements IBakedModel {
} }
@Override @Override
public List<BakedQuad> getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) { public List<BakedQuad> getQuads( @Nullable IBlockState state, @Nullable EnumFacing side, long rand )
{
// Get the correct base model // Get the correct base model
if (!(state instanceof IExtendedBlockState)) { if( !( state instanceof IExtendedBlockState ) )
{
return this.baseModel.getQuads( state, side, rand ); return this.baseModel.getQuads( state, side, rand );
} }
@@ -80,10 +88,12 @@ class QnbFormedBakedModel implements IBakedModel {
return this.getQuads( formedState, state, side, rand ); return this.getQuads( formedState, state, side, rand );
} }
private List<BakedQuad> getQuads(QnbFormedState formedState, IBlockState state, EnumFacing side, long rand) { private List<BakedQuad> getQuads( QnbFormedState formedState, IBlockState state, EnumFacing side, long rand )
{
CubeBuilder builder = new CubeBuilder( this.vertexFormat ); CubeBuilder builder = new CubeBuilder( this.vertexFormat );
if (state.getBlock() == this.linkBlock) { if( state.getBlock() == this.linkBlock )
{
Set<EnumFacing> sides = formedState.getAdjacentQuantumBridges(); Set<EnumFacing> sides = formedState.getAdjacentQuantumBridges();
this.renderCableAt( builder, 0.11f * 16, this.glassCableTexture, 0.141f * 16, sides ); this.renderCableAt( builder, 0.11f * 16, this.glassCableTexture, 0.141f * 16, sides );
@@ -92,17 +102,22 @@ class QnbFormedBakedModel implements IBakedModel {
builder.setTexture( this.linkTexture ); builder.setTexture( this.linkTexture );
builder.addCube( DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX ); builder.addCube( DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX );
} else { }
if (formedState.isCorner()) { else
{
if( formedState.isCorner() )
{
this.renderCableAt( builder, 0.188f * 16, this.coveredCableTexture, 0.05f * 16, formedState.getAdjacentQuantumBridges() ); this.renderCableAt( builder, 0.188f * 16, this.coveredCableTexture, 0.05f * 16, formedState.getAdjacentQuantumBridges() );
builder.setTexture( this.ringTexture ); builder.setTexture( this.ringTexture );
builder.addCube( DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX ); builder.addCube( DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX );
if (formedState.isPowered()) { if( formedState.isPowered() )
{
builder.setTexture( this.lightCornerTexture ); builder.setTexture( this.lightCornerTexture );
builder.setRenderFullBright( true ); builder.setRenderFullBright( true );
for (EnumFacing facing : EnumFacing.values()) { for( EnumFacing facing : EnumFacing.values() )
{
// Offset the face by a slight amount so that it is drawn over the already drawn ring texture // Offset the face by a slight amount so that it is drawn over the already drawn ring texture
// (avoids z-fighting) // (avoids z-fighting)
float xOffset = Math.abs( facing.getFrontOffsetX() * 0.01f ); float xOffset = Math.abs( facing.getFrontOffsetX() * 0.01f );
@@ -115,7 +130,9 @@ class QnbFormedBakedModel implements IBakedModel {
DEFAULT_RENDER_MAX + xOffset, DEFAULT_RENDER_MAX + yOffset, DEFAULT_RENDER_MAX + zOffset ); DEFAULT_RENDER_MAX + xOffset, DEFAULT_RENDER_MAX + yOffset, DEFAULT_RENDER_MAX + zOffset );
} }
} }
} else { }
else
{
builder.setTexture( this.ringTexture ); builder.setTexture( this.ringTexture );
builder.addCube( 0, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, 16, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX ); builder.addCube( 0, DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, 16, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX );
@@ -124,10 +141,12 @@ class QnbFormedBakedModel implements IBakedModel {
builder.addCube( DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, 0, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX, 16 ); builder.addCube( DEFAULT_RENDER_MIN, DEFAULT_RENDER_MIN, 0, DEFAULT_RENDER_MAX, DEFAULT_RENDER_MAX, 16 );
if (formedState.isPowered()) { if( formedState.isPowered() )
{
builder.setTexture( this.lightTexture ); builder.setTexture( this.lightTexture );
builder.setRenderFullBright( true ); builder.setRenderFullBright( true );
for (EnumFacing facing : EnumFacing.values()) { for( EnumFacing facing : EnumFacing.values() )
{
// Offset the face by a slight amount so that it is drawn over the already drawn ring texture // Offset the face by a slight amount so that it is drawn over the already drawn ring texture
// (avoids z-fighting) // (avoids z-fighting)
float xOffset = Math.abs( facing.getFrontOffsetX() * 0.01f ); float xOffset = Math.abs( facing.getFrontOffsetX() * 0.01f );
@@ -146,65 +165,79 @@ class QnbFormedBakedModel implements IBakedModel {
return builder.getOutput(); return builder.getOutput();
} }
private void renderCableAt(CubeBuilder builder, float thickness, TextureAtlasSprite texture, float pull, Set<EnumFacing> connections) { private void renderCableAt( CubeBuilder builder, float thickness, TextureAtlasSprite texture, float pull, Set<EnumFacing> connections )
{
builder.setTexture( texture ); builder.setTexture( texture );
if (connections.contains(EnumFacing.WEST)) { if( connections.contains( EnumFacing.WEST ) )
{
builder.addCube( 0, 8 - thickness, 8 - thickness, 8 - thickness - pull, 8 + thickness, 8 + thickness ); builder.addCube( 0, 8 - thickness, 8 - thickness, 8 - thickness - pull, 8 + thickness, 8 + thickness );
} }
if (connections.contains(EnumFacing.EAST)) { if( connections.contains( EnumFacing.EAST ) )
{
builder.addCube( 8 + thickness + pull, 8 - thickness, 8 - thickness, 16, 8 + thickness, 8 + thickness ); builder.addCube( 8 + thickness + pull, 8 - thickness, 8 - thickness, 16, 8 + thickness, 8 + thickness );
} }
if (connections.contains(EnumFacing.NORTH)) { if( connections.contains( EnumFacing.NORTH ) )
{
builder.addCube( 8 - thickness, 8 - thickness, 0, 8 + thickness, 8 + thickness, 8 - thickness - pull ); builder.addCube( 8 - thickness, 8 - thickness, 0, 8 + thickness, 8 + thickness, 8 - thickness - pull );
} }
if (connections.contains(EnumFacing.SOUTH)) { if( connections.contains( EnumFacing.SOUTH ) )
{
builder.addCube( 8 - thickness, 8 - thickness, 8 + thickness + pull, 8 + thickness, 8 + thickness, 16 ); builder.addCube( 8 - thickness, 8 - thickness, 8 + thickness + pull, 8 + thickness, 8 + thickness, 16 );
} }
if (connections.contains(EnumFacing.DOWN)) { if( connections.contains( EnumFacing.DOWN ) )
{
builder.addCube( 8 - thickness, 0, 8 - thickness, 8 + thickness, 8 - thickness - pull, 8 + thickness ); builder.addCube( 8 - thickness, 0, 8 - thickness, 8 + thickness, 8 - thickness - pull, 8 + thickness );
} }
if (connections.contains(EnumFacing.UP)) { if( connections.contains( EnumFacing.UP ) )
{
builder.addCube( 8 - thickness, 8 + thickness + pull, 8 - thickness, 8 + thickness, 16, 8 + thickness ); builder.addCube( 8 - thickness, 8 + thickness + pull, 8 - thickness, 8 + thickness, 16, 8 + thickness );
} }
} }
@Override @Override
public boolean isAmbientOcclusion() { public boolean isAmbientOcclusion()
{
return this.baseModel.isAmbientOcclusion(); return this.baseModel.isAmbientOcclusion();
} }
@Override @Override
public boolean isGui3d() { public boolean isGui3d()
{
return true; return true;
} }
@Override @Override
public boolean isBuiltInRenderer() { public boolean isBuiltInRenderer()
{
return false; return false;
} }
@Override @Override
public TextureAtlasSprite getParticleTexture() { public TextureAtlasSprite getParticleTexture()
{
return this.baseModel.getParticleTexture(); return this.baseModel.getParticleTexture();
} }
@Override @Override
public ItemCameraTransforms getItemCameraTransforms() { public ItemCameraTransforms getItemCameraTransforms()
{
return this.baseModel.getItemCameraTransforms(); return this.baseModel.getItemCameraTransforms();
} }
@Override @Override
public ItemOverrideList getOverrides() { public ItemOverrideList getOverrides()
{
return this.baseModel.getOverrides(); return this.baseModel.getOverrides();
} }
public static List<ResourceLocation> getRequiredTextures() { public static List<ResourceLocation> getRequiredTextures()
{
return ImmutableList.of( return ImmutableList.of(
TEXTURE_LINK, TEXTURE_RING, TEXTURE_CABLE_GLASS, TEXTURE_COVERED_CABLE, TEXTURE_RING_LIGHT, TEXTURE_RING_LIGHT_CORNER ); TEXTURE_LINK, TEXTURE_RING, TEXTURE_CABLE_GLASS, TEXTURE_COVERED_CABLE, TEXTURE_RING_LIGHT, TEXTURE_RING_LIGHT_CORNER );
} }
@@ -1,8 +1,12 @@
package appeng.block.qnb; package appeng.block.qnb;
import appeng.core.AppEng; import java.util.Collection;
import java.util.function.Function;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.client.renderer.vertex.VertexFormat;
@@ -12,40 +16,48 @@ import net.minecraftforge.client.model.ModelLoaderRegistry;
import net.minecraftforge.common.model.IModelState; import net.minecraftforge.common.model.IModelState;
import net.minecraftforge.common.model.TRSRTransformation; import net.minecraftforge.common.model.TRSRTransformation;
import java.util.Collection; import appeng.core.AppEng;
import java.util.function.Function;
public class QnbFormedModel implements IModel { public class QnbFormedModel implements IModel
{
private static final ResourceLocation MODEL_RING = new ResourceLocation( AppEng.MOD_ID, "block/qnb/ring" ); private static final ResourceLocation MODEL_RING = new ResourceLocation( AppEng.MOD_ID, "block/qnb/ring" );
@Override @Override
public Collection<ResourceLocation> getDependencies() { public Collection<ResourceLocation> getDependencies()
{
return ImmutableList.of( MODEL_RING ); return ImmutableList.of( MODEL_RING );
} }
@Override @Override
public Collection<ResourceLocation> getTextures() { public Collection<ResourceLocation> getTextures()
{
return QnbFormedBakedModel.getRequiredTextures(); return QnbFormedBakedModel.getRequiredTextures();
} }
@Override @Override
public IBakedModel bake(IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) { public IBakedModel bake( IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter )
{
IBakedModel ringModel = this.getBaseModel( MODEL_RING, state, format, bakedTextureGetter ); IBakedModel ringModel = this.getBaseModel( MODEL_RING, state, format, bakedTextureGetter );
return new QnbFormedBakedModel( format, ringModel, bakedTextureGetter ); return new QnbFormedBakedModel( format, ringModel, bakedTextureGetter );
} }
@Override @Override
public IModelState getDefaultState() { public IModelState getDefaultState()
{
return TRSRTransformation.identity(); return TRSRTransformation.identity();
} }
private IBakedModel getBaseModel(ResourceLocation model, IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) { private IBakedModel getBaseModel( ResourceLocation model, IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter )
{
// Load the base model // Load the base model
try { try
{
return ModelLoaderRegistry.getModel( model ).bake( state, format, bakedTextureGetter ); return ModelLoaderRegistry.getModel( model ).bake( state, format, bakedTextureGetter );
} catch (Exception e) { }
catch( Exception e )
{
throw new RuntimeException( e ); throw new RuntimeException( e );
} }
} }
@@ -1,12 +1,14 @@
package appeng.block.qnb; package appeng.block.qnb;
import net.minecraft.util.EnumFacing;
import java.util.Set; import java.util.Set;
import net.minecraft.util.EnumFacing;
public class QnbFormedState {
public class QnbFormedState
{
private final Set<EnumFacing> adjacentQuantumBridges; private final Set<EnumFacing> adjacentQuantumBridges;
@@ -14,21 +16,25 @@ public class QnbFormedState {
private final boolean powered; private final boolean powered;
public QnbFormedState(Set<EnumFacing> adjacentQuantumBridges, boolean corner, boolean powered) { public QnbFormedState( Set<EnumFacing> adjacentQuantumBridges, boolean corner, boolean powered )
{
this.adjacentQuantumBridges = adjacentQuantumBridges; this.adjacentQuantumBridges = adjacentQuantumBridges;
this.corner = corner; this.corner = corner;
this.powered = powered; this.powered = powered;
} }
public Set<EnumFacing> getAdjacentQuantumBridges() { public Set<EnumFacing> getAdjacentQuantumBridges()
{
return this.adjacentQuantumBridges; return this.adjacentQuantumBridges;
} }
public boolean isCorner() { public boolean isCorner()
{
return this.corner; return this.corner;
} }
public boolean isPowered() { public boolean isPowered()
{
return this.powered; return this.powered;
} }
@@ -1,28 +1,34 @@
package appeng.block.qnb; package appeng.block.qnb;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
public class QnbFormedStateProperty implements IUnlistedProperty<QnbFormedState> { public class QnbFormedStateProperty implements IUnlistedProperty<QnbFormedState>
{
@Override @Override
public String getName() { public String getName()
{
return "qnb_formed"; return "qnb_formed";
} }
@Override @Override
public boolean isValid(QnbFormedState value) { public boolean isValid( QnbFormedState value )
{
return value != null; return value != null;
} }
@Override @Override
public Class<QnbFormedState> getType() { public Class<QnbFormedState> getType()
{
return QnbFormedState.class; return QnbFormedState.class;
} }
@Override @Override
public String valueToString(QnbFormedState value) { public String valueToString( QnbFormedState value )
{
return null; return null;
} }
} }
@@ -1,18 +1,22 @@
package appeng.block.qnb; package appeng.block.qnb;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class QuantumBridgeRendering extends BlockRenderingCustomizer { public class QuantumBridgeRendering extends BlockRenderingCustomizer
{
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
{
rendering.builtInModel( "models/block/qnb/qnb_formed", new QnbFormedModel() ); rendering.builtInModel( "models/block/qnb/qnb_formed", new QnbFormedModel() );
// Disable auto rotation // Disable auto rotation
rendering.modelCustomizer( ( location, model ) -> model ); rendering.modelCustomizer( ( location, model ) -> model );
@@ -19,8 +19,9 @@
package appeng.block.spatial; package appeng.block.spatial;
import appeng.block.AEBaseBlock; import java.util.Arrays;
import appeng.helpers.ICustomCollision; import java.util.List;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs; import net.minecraft.creativetab.CreativeTabs;
@@ -35,13 +36,15 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.Arrays; import appeng.block.AEBaseBlock;
import java.util.List; import appeng.helpers.ICustomCollision;
public class BlockMatrixFrame extends AEBaseBlock implements ICustomCollision { public class BlockMatrixFrame extends AEBaseBlock implements ICustomCollision
{
public BlockMatrixFrame() { public BlockMatrixFrame()
{
super( Material.ANVIL ); super( Material.ANVIL );
this.setResistance( 6000000.0F ); this.setResistance( 6000000.0F );
this.setBlockUnbreakable(); this.setBlockUnbreakable();
@@ -51,33 +54,39 @@ public class BlockMatrixFrame extends AEBaseBlock implements ICustomCollision {
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void getSubBlocks(final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks) { public void getSubBlocks( final CreativeTabs tabs, final NonNullList<ItemStack> itemStacks )
{
// do nothing // do nothing
} }
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
{
return Arrays.asList( new AxisAlignedBB[] {} );// AxisAlignedBB.getBoundingBox( 0.25, 0, 0.25, 0.75, 0.5, 0.75 ) return Arrays.asList( new AxisAlignedBB[] {} );// AxisAlignedBB.getBoundingBox( 0.25, 0, 0.25, 0.75, 0.5, 0.75 )
// } ); // } );
} }
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) { public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
{
out.add( new AxisAlignedBB( 0.0, 0.0, 0.0, 1.0, 1.0, 1.0 ) ); out.add( new AxisAlignedBB( 0.0, 0.0, 0.0, 1.0, 1.0, 1.0 ) );
} }
@Override @Override
public boolean canPlaceBlockAt(final World worldIn, final BlockPos pos) { public boolean canPlaceBlockAt( final World worldIn, final BlockPos pos )
{
return false; return false;
} }
@Override @Override
public void onBlockExploded(final World world, final BlockPos pos, final Explosion explosion) { public void onBlockExploded( final World world, final BlockPos pos, final Explosion explosion )
{
// Don't explode. // Don't explode.
} }
@Override @Override
public boolean canEntityDestroy(final IBlockState state, final IBlockAccess world, final BlockPos pos, final Entity entity) { public boolean canEntityDestroy( final IBlockState state, final IBlockAccess world, final BlockPos pos, final Entity entity )
{
return false; return false;
} }
} }
@@ -19,11 +19,8 @@
package appeng.block.spatial; package appeng.block.spatial;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.spatial.TileSpatialIOPort;
import appeng.util.Platform;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@@ -34,32 +31,44 @@ import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.spatial.TileSpatialIOPort;
import appeng.util.Platform;
public class BlockSpatialIOPort extends AEBaseTileBlock { public class BlockSpatialIOPort extends AEBaseTileBlock
{
public BlockSpatialIOPort() { public BlockSpatialIOPort()
{
super( Material.IRON ); super( Material.IRON );
} }
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
{
final TileSpatialIOPort te = this.getTileEntity( world, pos ); final TileSpatialIOPort te = this.getTileEntity( world, pos );
if (te != null) { if( te != null )
{
te.updateRedstoneState(); te.updateRedstoneState();
} }
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (p.isSneaking()) { {
if( p.isSneaking() )
{
return false; return false;
} }
final TileSpatialIOPort tg = this.getTileEntity( w, pos ); final TileSpatialIOPort tg = this.getTileEntity( w, pos );
if (tg != null) { if( tg != null )
if (Platform.isServer()) { {
if( Platform.isServer() )
{
Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_SPATIAL_IO_PORT ); Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_SPATIAL_IO_PORT );
} }
return true; return true;
@@ -19,10 +19,6 @@
package appeng.block.spatial; package appeng.block.spatial;
import appeng.block.AEBaseTileBlock;
import appeng.client.render.spatial.SpatialPylonStateProperty;
import appeng.helpers.AEGlassMaterial;
import appeng.tile.spatial.TileSpatialPylon;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@@ -34,48 +30,63 @@ import net.minecraftforge.common.property.ExtendedBlockState;
import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IExtendedBlockState;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
import appeng.block.AEBaseTileBlock;
import appeng.client.render.spatial.SpatialPylonStateProperty;
import appeng.helpers.AEGlassMaterial;
import appeng.tile.spatial.TileSpatialPylon;
public class BlockSpatialPylon extends AEBaseTileBlock {
public class BlockSpatialPylon extends AEBaseTileBlock
{
public static final SpatialPylonStateProperty STATE = new SpatialPylonStateProperty(); public static final SpatialPylonStateProperty STATE = new SpatialPylonStateProperty();
public BlockSpatialPylon() { public BlockSpatialPylon()
{
super( AEGlassMaterial.INSTANCE ); super( AEGlassMaterial.INSTANCE );
} }
@Override @Override
protected BlockStateContainer createBlockState() { protected BlockStateContainer createBlockState()
{
return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] { STATE } ); return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] { STATE } );
} }
@Override @Override
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
{
IExtendedBlockState extState = (IExtendedBlockState) state; IExtendedBlockState extState = (IExtendedBlockState) state;
return extState.withProperty( STATE, this.getDisplayState( world, pos ) ); return extState.withProperty( STATE, this.getDisplayState( world, pos ) );
} }
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
{
final TileSpatialPylon tsp = this.getTileEntity( world, pos ); final TileSpatialPylon tsp = this.getTileEntity( world, pos );
if (tsp != null) { if( tsp != null )
{
tsp.neighborChanged(); tsp.neighborChanged();
} }
} }
@Override @Override
public int getLightValue(final IBlockState state, final IBlockAccess w, final BlockPos pos) { public int getLightValue( final IBlockState state, final IBlockAccess w, final BlockPos pos )
{
final TileSpatialPylon tsp = this.getTileEntity( w, pos ); final TileSpatialPylon tsp = this.getTileEntity( w, pos );
if (tsp != null) { if( tsp != null )
{
return tsp.getLightValue(); return tsp.getLightValue();
} }
return super.getLightValue( state, w, pos ); return super.getLightValue( state, w, pos );
} }
private int getDisplayState(IBlockAccess world, BlockPos pos) { private int getDisplayState( IBlockAccess world, BlockPos pos )
{
TileSpatialPylon te = this.getTileEntity( world, pos ); TileSpatialPylon te = this.getTileEntity( world, pos );
if (te == null) { if( te == null )
{
return 0; return 0;
} }
@@ -83,7 +94,8 @@ public class BlockSpatialPylon extends AEBaseTileBlock {
} }
@Override @Override
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
{
return BlockRenderLayer.CUTOUT; return BlockRenderLayer.CUTOUT;
} }
@@ -19,12 +19,8 @@
package appeng.block.storage; package appeng.block.storage;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.localization.PlayerMessages;
import appeng.core.sync.GuiBridge;
import appeng.tile.storage.TileChest;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.properties.PropertyEnum;
@@ -38,40 +34,53 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess; import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.localization.PlayerMessages;
import appeng.core.sync.GuiBridge;
import appeng.tile.storage.TileChest;
import appeng.util.Platform;
public class BlockChest extends AEBaseTileBlock { public class BlockChest extends AEBaseTileBlock
{
private final static PropertyEnum<DriveSlotState> SLOT_STATE = PropertyEnum.create( "slot_state", DriveSlotState.class ); private final static PropertyEnum<DriveSlotState> SLOT_STATE = PropertyEnum.create( "slot_state", DriveSlotState.class );
public BlockChest() { public BlockChest()
{
super( Material.IRON ); super( Material.IRON );
this.setDefaultState( this.getDefaultState().withProperty( SLOT_STATE, DriveSlotState.EMPTY ) ); this.setDefaultState( this.getDefaultState().withProperty( SLOT_STATE, DriveSlotState.EMPTY ) );
} }
@Override @Override
protected IProperty[] getAEStates() { protected IProperty[] getAEStates()
{
return new IProperty[] { SLOT_STATE }; return new IProperty[] { SLOT_STATE };
} }
@Override @Override
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
{
return BlockRenderLayer.CUTOUT; return BlockRenderLayer.CUTOUT;
} }
@Override @Override
public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { public IBlockState getActualState( IBlockState state, IBlockAccess worldIn, BlockPos pos )
{
DriveSlotState slotState = DriveSlotState.EMPTY; DriveSlotState slotState = DriveSlotState.EMPTY;
TileChest te = this.getTileEntity( worldIn, pos ); TileChest te = this.getTileEntity( worldIn, pos );
if (te != null) { if( te != null )
if (te.getCellCount() >= 1) { {
if( te.getCellCount() >= 1 )
{
slotState = DriveSlotState.fromCellStatus( te.getCellStatus( 0 ) ); slotState = DriveSlotState.fromCellStatus( te.getCellStatus( 0 ) );
} }
// Power-state has to be checked separately // Power-state has to be checked separately
if (!te.isPowered() && slotState != DriveSlotState.EMPTY) { if( !te.isPowered() && slotState != DriveSlotState.EMPTY )
{
slotState = DriveSlotState.OFFLINE; slotState = DriveSlotState.OFFLINE;
} }
} }
@@ -81,17 +90,24 @@ public class BlockChest extends AEBaseTileBlock {
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
{
final TileChest tg = this.getTileEntity( w, pos ); final TileChest tg = this.getTileEntity( w, pos );
if (tg != null && !p.isSneaking()) { if( tg != null && !p.isSneaking() )
if (Platform.isClient()) { {
if( Platform.isClient() )
{
return true; return true;
} }
if (side != tg.getUp()) { if( side != tg.getUp() )
{
Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_CHEST ); Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_CHEST );
} else { }
if (!tg.openGui(p)) { else
{
if( !tg.openGui( p ) )
{
p.sendMessage( PlayerMessages.ChestCannotReadStorageCell.get() ); p.sendMessage( PlayerMessages.ChestCannotReadStorageCell.get() );
} }
} }
@@ -19,12 +19,8 @@
package appeng.block.storage; package appeng.block.storage;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.client.UnlistedProperty;
import appeng.core.sync.GuiBridge;
import appeng.tile.storage.TileDrive;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@@ -40,24 +36,33 @@ import net.minecraftforge.common.property.ExtendedBlockState;
import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IExtendedBlockState;
import net.minecraftforge.common.property.IUnlistedProperty; import net.minecraftforge.common.property.IUnlistedProperty;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.client.UnlistedProperty;
import appeng.core.sync.GuiBridge;
import appeng.tile.storage.TileDrive;
import appeng.util.Platform;
public class BlockDrive extends AEBaseTileBlock { public class BlockDrive extends AEBaseTileBlock
{
public static final UnlistedProperty<DriveSlotsState> SLOTS_STATE = new UnlistedProperty<>( "drive_slots_state", DriveSlotsState.class ); public static final UnlistedProperty<DriveSlotsState> SLOTS_STATE = new UnlistedProperty<>( "drive_slots_state", DriveSlotsState.class );
public BlockDrive() { public BlockDrive()
{
super( Material.IRON ); super( Material.IRON );
} }
@Override @Override
public BlockRenderLayer getBlockLayer() { public BlockRenderLayer getBlockLayer()
{
return BlockRenderLayer.CUTOUT; return BlockRenderLayer.CUTOUT;
} }
@Override @Override
protected BlockStateContainer createBlockState() { protected BlockStateContainer createBlockState()
{
return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] { return new ExtendedBlockState( this, this.getAEStates(), new IUnlistedProperty[] {
SLOTS_STATE, SLOTS_STATE,
FORWARD, FORWARD,
@@ -66,21 +71,26 @@ public class BlockDrive extends AEBaseTileBlock {
} }
@Override @Override
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) { public IBlockState getExtendedState( IBlockState state, IBlockAccess world, BlockPos pos )
{
TileDrive te = this.getTileEntity( world, pos ); TileDrive te = this.getTileEntity( world, pos );
IExtendedBlockState extState = (IExtendedBlockState) super.getExtendedState( state, world, pos ); IExtendedBlockState extState = (IExtendedBlockState) super.getExtendedState( state, world, pos );
return extState.withProperty( SLOTS_STATE, te == null ? DriveSlotsState.createEmpty( 10 ) : DriveSlotsState.fromChestOrDrive( te ) ); return extState.withProperty( SLOTS_STATE, te == null ? DriveSlotsState.createEmpty( 10 ) : DriveSlotsState.fromChestOrDrive( te ) );
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (p.isSneaking()) { {
if( p.isSneaking() )
{
return false; return false;
} }
final TileDrive tg = this.getTileEntity( w, pos ); final TileDrive tg = this.getTileEntity( w, pos );
if (tg != null) { if( tg != null )
if (Platform.isServer()) { {
if( Platform.isServer() )
{
Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_DRIVE ); Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_DRIVE );
} }
return true; return true;
@@ -19,11 +19,8 @@
package appeng.block.storage; package appeng.block.storage;
import appeng.api.util.AEPartLocation; import javax.annotation.Nullable;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.storage.TileIOPort;
import appeng.util.Platform;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@@ -34,32 +31,44 @@ import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import appeng.block.AEBaseTileBlock;
import appeng.core.sync.GuiBridge;
import appeng.tile.storage.TileIOPort;
import appeng.util.Platform;
public class BlockIOPort extends AEBaseTileBlock { public class BlockIOPort extends AEBaseTileBlock
{
public BlockIOPort() { public BlockIOPort()
{
super( Material.IRON ); super( Material.IRON );
} }
@Override @Override
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos) { public void neighborChanged( IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos )
{
final TileIOPort te = this.getTileEntity( world, pos ); final TileIOPort te = this.getTileEntity( world, pos );
if (te != null) { if( te != null )
{
te.updateRedstoneState(); te.updateRedstoneState();
} }
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer p, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (p.isSneaking()) { {
if( p.isSneaking() )
{
return false; return false;
} }
final TileIOPort tg = this.getTileEntity( w, pos ); final TileIOPort tg = this.getTileEntity( w, pos );
if (tg != null) { if( tg != null )
if (Platform.isServer()) { {
if( Platform.isServer() )
{
Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_IOPORT ); Platform.openGUI( p, tg, AEPartLocation.fromFacing( side ), GuiBridge.GUI_IOPORT );
} }
return true; return true;
@@ -19,12 +19,11 @@
package appeng.block.storage; package appeng.block.storage;
import appeng.api.util.AEPartLocation; import java.util.Collections;
import appeng.block.AEBaseTileBlock; import java.util.List;
import appeng.core.sync.GuiBridge;
import appeng.helpers.ICustomCollision; import javax.annotation.Nullable;
import appeng.tile.storage.TileSkyChest;
import appeng.util.Platform;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
@@ -37,24 +36,30 @@ import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nullable; import appeng.api.util.AEPartLocation;
import java.util.Collections; import appeng.block.AEBaseTileBlock;
import java.util.List; import appeng.core.sync.GuiBridge;
import appeng.helpers.ICustomCollision;
import appeng.tile.storage.TileSkyChest;
import appeng.util.Platform;
public class BlockSkyChest extends AEBaseTileBlock implements ICustomCollision { public class BlockSkyChest extends AEBaseTileBlock implements ICustomCollision
{
private static final double AABB_OFFSET_BOTTOM = 0.00; private static final double AABB_OFFSET_BOTTOM = 0.00;
private static final double AABB_OFFSET_SIDES = 0.06; private static final double AABB_OFFSET_SIDES = 0.06;
private static final double AABB_OFFSET_TOP = 0.125; private static final double AABB_OFFSET_TOP = 0.125;
public enum SkyChestType { public enum SkyChestType
{
STONE, BLOCK STONE, BLOCK
} };
public final SkyChestType type; public final SkyChestType type;
public BlockSkyChest(final SkyChestType type) { public BlockSkyChest( final SkyChestType type )
{
super( Material.ROCK ); super( Material.ROCK );
this.setOpaque( this.setFullSize( false ) ); this.setOpaque( this.setFullSize( false ) );
this.lightOpacity = 0; this.lightOpacity = 0;
@@ -64,13 +69,16 @@ public class BlockSkyChest extends AEBaseTileBlock implements ICustomCollision {
} }
@Override @Override
public EnumBlockRenderType getRenderType(IBlockState state) { public EnumBlockRenderType getRenderType( IBlockState state )
{
return EnumBlockRenderType.ENTITYBLOCK_ANIMATED; return EnumBlockRenderType.ENTITYBLOCK_ANIMATED;
} }
@Override @Override
public boolean onActivated(final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ) { public boolean onActivated( final World w, final BlockPos pos, final EntityPlayer player, final EnumHand hand, final @Nullable ItemStack heldItem, final EnumFacing side, final float hitX, final float hitY, final float hitZ )
if (Platform.isServer()) { {
if( Platform.isServer() )
{
Platform.openGUI( player, this.getTileEntity( w, pos ), AEPartLocation.fromFacing( side ), GuiBridge.GUI_SKYCHEST ); Platform.openGUI( player, this.getTileEntity( w, pos ), AEPartLocation.fromFacing( side ), GuiBridge.GUI_SKYCHEST );
} }
@@ -78,24 +86,28 @@ public class BlockSkyChest extends AEBaseTileBlock implements ICustomCollision {
} }
@Override @Override
public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool(final World w, final BlockPos pos, final Entity thePlayer, final boolean b) { public Iterable<AxisAlignedBB> getSelectedBoundingBoxesFromPool( final World w, final BlockPos pos, final Entity thePlayer, final boolean b )
{
final AxisAlignedBB aabb = this.computeAABB( w, pos ); final AxisAlignedBB aabb = this.computeAABB( w, pos );
return Collections.singletonList( aabb ); return Collections.singletonList( aabb );
} }
@Override @Override
public void addCollidingBlockToList(final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e) { public void addCollidingBlockToList( final World w, final BlockPos pos, final AxisAlignedBB bb, final List<AxisAlignedBB> out, final Entity e )
{
final AxisAlignedBB aabb = this.computeAABB( w, pos ); final AxisAlignedBB aabb = this.computeAABB( w, pos );
out.add( aabb ); out.add( aabb );
} }
private AxisAlignedBB computeAABB(final World w, final BlockPos pos) { private AxisAlignedBB computeAABB( final World w, final BlockPos pos )
{
final TileSkyChest sk = this.getTileEntity( w, pos ); final TileSkyChest sk = this.getTileEntity( w, pos );
EnumFacing o = EnumFacing.UP; EnumFacing o = EnumFacing.UP;
if (sk != null) { if( sk != null )
{
o = sk.getUp(); o = sk.getUp();
} }
@@ -19,21 +19,24 @@
package appeng.block.storage; package appeng.block.storage;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.util.AEColor; import appeng.api.util.AEColor;
import appeng.bootstrap.BlockRenderingCustomizer; import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering; import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering; import appeng.bootstrap.IItemRendering;
import appeng.client.render.ColorableTileBlockColor; import appeng.client.render.ColorableTileBlockColor;
import appeng.client.render.StaticItemColor; import appeng.client.render.StaticItemColor;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class ChestRendering extends BlockRenderingCustomizer { public class ChestRendering extends BlockRenderingCustomizer
{
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
{
// I checked, the ME chest doesn't keep its color in item form // I checked, the ME chest doesn't keep its color in item form
itemRendering.color( new StaticItemColor( AEColor.TRANSPARENT ) ); itemRendering.color( new StaticItemColor( AEColor.TRANSPARENT ) );
rendering.blockColor( new ColorableTileBlockColor() ); rendering.blockColor( new ColorableTileBlockColor() );
@@ -25,9 +25,11 @@ import appeng.bootstrap.IItemRendering;
import appeng.client.render.model.DriveModel; import appeng.client.render.model.DriveModel;
public class DriveRendering extends BlockRenderingCustomizer { public class DriveRendering extends BlockRenderingCustomizer
{
@Override @Override
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
{
rendering.builtInModel( "models/block/builtin/drive", new DriveModel() ); rendering.builtInModel( "models/block/builtin/drive", new DriveModel() );
} }
} }
@@ -25,7 +25,8 @@ import net.minecraft.util.IStringSerializable;
/** /**
* Describes the different states a single slot of a BlockDrive can be in in terms of rendering. * Describes the different states a single slot of a BlockDrive can be in in terms of rendering.
*/ */
public enum DriveSlotState implements IStringSerializable { public enum DriveSlotState implements IStringSerializable
{
// No cell in slot // No cell in slot
EMPTY( "empty" ), EMPTY( "empty" ),
@@ -44,17 +45,21 @@ public enum DriveSlotState implements IStringSerializable {
private final String name; private final String name;
DriveSlotState(String name) { DriveSlotState( String name )
{
this.name = name; this.name = name;
} }
@Override @Override
public String getName() { public String getName()
{
return this.name; return this.name;
} }
public static DriveSlotState fromCellStatus(int cellStatus) { public static DriveSlotState fromCellStatus( int cellStatus )
switch (cellStatus) { {
switch( cellStatus )
{
default: default:
case 0: case 0:
return DriveSlotState.EMPTY; return DriveSlotState.EMPTY;
@@ -25,47 +25,62 @@ import appeng.api.implementations.tiles.IChestOrDrive;
/** /**
* Contains the full information about what the state of the slots in a BlockDrive is. * Contains the full information about what the state of the slots in a BlockDrive is.
*/ */
public class DriveSlotsState { public class DriveSlotsState
{
private final DriveSlotState[] slots; private final DriveSlotState[] slots;
private DriveSlotsState(DriveSlotState[] slots) { private DriveSlotsState( DriveSlotState[] slots )
{
this.slots = slots; this.slots = slots;
} }
public DriveSlotState getState(int index) { public DriveSlotState getState( int index )
if (index >= this.slots.length) { {
if( index >= this.slots.length )
{
return DriveSlotState.EMPTY; return DriveSlotState.EMPTY;
} }
return this.slots[index]; return this.slots[index];
} }
public int getSlotCount() { public int getSlotCount()
{
return this.slots.length; return this.slots.length;
} }
/** /**
* Retrieve an array that describes the state of each slot in this drive or chest. * Retrieve an array that describes the state of each slot in this drive or chest.
*/ */
public static DriveSlotsState fromChestOrDrive(IChestOrDrive chestOrDrive) { public static DriveSlotsState fromChestOrDrive( IChestOrDrive chestOrDrive )
{
DriveSlotState[] slots = new DriveSlotState[chestOrDrive.getCellCount()]; DriveSlotState[] slots = new DriveSlotState[chestOrDrive.getCellCount()];
for (int i = 0; i < chestOrDrive.getCellCount(); i++) { for( int i = 0; i < chestOrDrive.getCellCount(); i++ )
if (!chestOrDrive.isPowered()) { {
if (chestOrDrive.getCellStatus(i) != 0) { if( !chestOrDrive.isPowered() )
{
if( chestOrDrive.getCellStatus( i ) != 0 )
{
slots[i] = DriveSlotState.OFFLINE; slots[i] = DriveSlotState.OFFLINE;
} else { }
else
{
slots[i] = DriveSlotState.EMPTY; slots[i] = DriveSlotState.EMPTY;
} }
} else { }
else
{
slots[i] = DriveSlotState.fromCellStatus( chestOrDrive.getCellStatus( i ) ); slots[i] = DriveSlotState.fromCellStatus( chestOrDrive.getCellStatus( i ) );
} }
} }
return new DriveSlotsState( slots ); return new DriveSlotsState( slots );
} }
public static DriveSlotsState createEmpty(int slotCount) { public static DriveSlotsState createEmpty( int slotCount )
{
DriveSlotState[] slots = new DriveSlotState[slotCount]; DriveSlotState[] slots = new DriveSlotState[slotCount];
for (int i = 0; i < slotCount; i++) { for( int i = 0; i < slotCount; i++ )
{
slots[i] = DriveSlotState.EMPTY; slots[i] = DriveSlotState.EMPTY;
} }
return new DriveSlotsState( slots ); return new DriveSlotsState( slots );
@@ -19,26 +19,30 @@
package appeng.block.storage; package appeng.block.storage;
import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering;
import appeng.client.render.tesr.SkyChestTESR;
import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.bootstrap.BlockRenderingCustomizer;
import appeng.bootstrap.IBlockRendering;
import appeng.bootstrap.IItemRendering;
import appeng.client.render.tesr.SkyChestTESR;
public class SkyChestRenderingCustomizer extends BlockRenderingCustomizer {
public class SkyChestRenderingCustomizer extends BlockRenderingCustomizer
{
private final BlockSkyChest.SkyChestType type; private final BlockSkyChest.SkyChestType type;
public SkyChestRenderingCustomizer(BlockSkyChest.SkyChestType type) { public SkyChestRenderingCustomizer( BlockSkyChest.SkyChestType type )
{
this.type = type; this.type = type;
} }
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
@Override @Override
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
{
rendering.tesr( new SkyChestTESR() ); rendering.tesr( new SkyChestTESR() );
// Register a custom non-tesr item model // Register a custom non-tesr item model
@@ -47,9 +51,11 @@ public class SkyChestRenderingCustomizer extends BlockRenderingCustomizer {
itemRendering.model( model ).variants( model ); itemRendering.model( model ).variants( model );
} }
private String getModelFromType() { private String getModelFromType()
{
final String modelName; final String modelName;
switch (this.type) { switch( this.type )
{
default: default:
case STONE: case STONE:
modelName = "sky_stone_chest"; modelName = "sky_stone_chest";
@@ -19,6 +19,25 @@
package appeng.bootstrap; package appeng.bootstrap;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
import javax.annotation.Nullable;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.definitions.IBlockDefinition; import appeng.api.definitions.IBlockDefinition;
import appeng.block.AEBaseBlock; import appeng.block.AEBaseBlock;
import appeng.block.AEBaseItemBlock; import appeng.block.AEBaseItemBlock;
@@ -30,29 +49,17 @@ import appeng.bootstrap.definitions.TileEntityDefinition;
import appeng.core.AEConfig; import appeng.core.AEConfig;
import appeng.core.AppEng; import appeng.core.AppEng;
import appeng.core.CreativeTab; import appeng.core.CreativeTab;
import appeng.core.features.*; import appeng.core.features.AEFeature;
import appeng.core.features.ActivityState;
import appeng.core.features.BlockDefinition;
import appeng.core.features.BlockStackSrc;
import appeng.core.features.TileDefinition;
import appeng.tile.AEBaseTile; import appeng.tile.AEBaseTile;
import appeng.util.Platform; import appeng.util.Platform;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
class BlockDefinitionBuilder implements IBlockBuilder { class BlockDefinitionBuilder implements IBlockBuilder
{
private final FeatureFactory factory; private final FeatureFactory factory;
@@ -64,7 +71,7 @@ class BlockDefinitionBuilder implements IBlockBuilder {
private final EnumSet<AEFeature> features = EnumSet.noneOf( AEFeature.class ); private final EnumSet<AEFeature> features = EnumSet.noneOf( AEFeature.class );
private final CreativeTabs creativeTab = CreativeTab.instance; private CreativeTabs creativeTab = CreativeTab.instance;
private TileEntityDefinition tileEntityDefinition; private TileEntityDefinition tileEntityDefinition;
@@ -78,39 +85,46 @@ class BlockDefinitionBuilder implements IBlockBuilder {
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
private ItemRendering itemRendering; private ItemRendering itemRendering;
BlockDefinitionBuilder(FeatureFactory factory, String id, Supplier<? extends Block> blockSupplier) { BlockDefinitionBuilder( FeatureFactory factory, String id, Supplier<? extends Block> blockSupplier )
{
this.factory = factory; this.factory = factory;
this.registryName = id; this.registryName = id;
this.blockSupplier = blockSupplier; this.blockSupplier = blockSupplier;
if (Platform.isClient()) { if( Platform.isClient() )
{
this.blockRendering = new BlockRendering(); this.blockRendering = new BlockRendering();
this.itemRendering = new ItemRendering(); this.itemRendering = new ItemRendering();
} }
} }
@Override @Override
public BlockDefinitionBuilder bootstrap(BiFunction<Block, Item, IBootstrapComponent> callback) { public BlockDefinitionBuilder bootstrap( BiFunction<Block, Item, IBootstrapComponent> callback )
{
this.bootstrapComponents.add( callback ); this.bootstrapComponents.add( callback );
return this; return this;
} }
@Override @Override
public IBlockBuilder features(AEFeature... features) { public IBlockBuilder features( AEFeature... features )
{
this.features.clear(); this.features.clear();
this.addFeatures( features ); this.addFeatures( features );
return this; return this;
} }
@Override @Override
public IBlockBuilder addFeatures(AEFeature... features) { public IBlockBuilder addFeatures( AEFeature... features )
{
Collections.addAll( this.features, features ); Collections.addAll( this.features, features );
return this; return this;
} }
@Override @Override
public BlockDefinitionBuilder rendering(BlockRenderingCustomizer callback) { public BlockDefinitionBuilder rendering( BlockRenderingCustomizer callback )
if (Platform.isClient()) { {
if( Platform.isClient() )
{
this.customizeForClient( callback ); this.customizeForClient( callback );
} }
@@ -118,17 +132,21 @@ class BlockDefinitionBuilder implements IBlockBuilder {
} }
@Override @Override
public IBlockBuilder tileEntity(TileEntityDefinition tileEntityDefinition) { public IBlockBuilder tileEntity( TileEntityDefinition tileEntityDefinition )
{
this.tileEntityDefinition = tileEntityDefinition; this.tileEntityDefinition = tileEntityDefinition;
return this; return this;
} }
@Override @Override
public IBlockBuilder useCustomItemModel() { public IBlockBuilder useCustomItemModel()
this.rendering(new BlockRenderingCustomizer() { {
this.rendering( new BlockRenderingCustomizer()
{
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public void customize(IBlockRendering rendering, IItemRendering itemRendering) { public void customize( IBlockRendering rendering, IItemRendering itemRendering )
{
ModelResourceLocation model = new ModelResourceLocation( new ResourceLocation( AppEng.MOD_ID, BlockDefinitionBuilder.this.registryName ), "inventory" ); ModelResourceLocation model = new ModelResourceLocation( new ResourceLocation( AppEng.MOD_ID, BlockDefinitionBuilder.this.registryName ), "inventory" );
itemRendering.model( model ).variants( model ); itemRendering.model( model ).variants( model );
} }
@@ -138,26 +156,31 @@ class BlockDefinitionBuilder implements IBlockBuilder {
} }
@Override @Override
public IBlockBuilder item(Function<Block, ItemBlock> factory) { public IBlockBuilder item( Function<Block, ItemBlock> factory )
{
this.itemFactory = factory; this.itemFactory = factory;
return this; return this;
} }
@Override @Override
public IBlockBuilder disableItem() { public IBlockBuilder disableItem()
{
this.disableItem = true; this.disableItem = true;
return this; return this;
} }
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
private void customizeForClient(BlockRenderingCustomizer callback) { private void customizeForClient( BlockRenderingCustomizer callback )
{
callback.customize( this.blockRendering, this.itemRendering ); callback.customize( this.blockRendering, this.itemRendering );
} }
@SuppressWarnings( "unchecked" ) @SuppressWarnings( "unchecked" )
@Override @Override
public <T extends IBlockDefinition> T build() { public <T extends IBlockDefinition> T build()
if (!AEConfig.instance().areFeaturesEnabled(this.features)) { {
if( !AEConfig.instance().areFeaturesEnabled( this.features ) )
{
return (T) new TileDefinition( this.registryName, null, null ); return (T) new TileDefinition( this.registryName, null, null );
} }
@@ -167,13 +190,15 @@ class BlockDefinitionBuilder implements IBlockBuilder {
block.setUnlocalizedName( "appliedenergistics2." + this.registryName ); block.setUnlocalizedName( "appliedenergistics2." + this.registryName );
ItemBlock item = this.constructItemFromBlock( block ); ItemBlock item = this.constructItemFromBlock( block );
if (item != null) { if( item != null )
{
item.setRegistryName( AppEng.MOD_ID, this.registryName ); item.setRegistryName( AppEng.MOD_ID, this.registryName );
} }
// Register the item and block with the game // Register the item and block with the game
this.factory.addBootstrapComponent( (IBlockRegistrationComponent) ( side, registry ) -> registry.register( block ) ); this.factory.addBootstrapComponent( (IBlockRegistrationComponent) ( side, registry ) -> registry.register( block ) );
if (item != null) { if( item != null )
{
this.factory.addBootstrapComponent( (IItemRegistrationComponent) ( side, registry ) -> registry.register( item ) ); this.factory.addBootstrapComponent( (IItemRegistrationComponent) ( side, registry ) -> registry.register( item ) );
} }
@@ -182,28 +207,36 @@ class BlockDefinitionBuilder implements IBlockBuilder {
// Register all extra handlers // Register all extra handlers
this.bootstrapComponents.forEach( component -> this.factory.addBootstrapComponent( component.apply( block, item ) ) ); this.bootstrapComponents.forEach( component -> this.factory.addBootstrapComponent( component.apply( block, item ) ) );
if (this.tileEntityDefinition != null && block instanceof AEBaseTileBlock) { if( this.tileEntityDefinition != null && block instanceof AEBaseTileBlock )
{
( (AEBaseTileBlock) block ).setTileEntity( this.tileEntityDefinition.getTileEntityClass() ); ( (AEBaseTileBlock) block ).setTileEntity( this.tileEntityDefinition.getTileEntityClass() );
if (this.tileEntityDefinition.getName() == null) { if( this.tileEntityDefinition.getName() == null )
{
this.tileEntityDefinition.setName( this.registryName ); this.tileEntityDefinition.setName( this.registryName );
} }
} }
if (Platform.isClient()) { if( Platform.isClient() )
if (block instanceof AEBaseTileBlock) { {
if( block instanceof AEBaseTileBlock )
{
AEBaseTileBlock tileBlock = (AEBaseTileBlock) block; AEBaseTileBlock tileBlock = (AEBaseTileBlock) block;
this.blockRendering.apply( this.factory, block, tileBlock.getTileEntityClass() ); this.blockRendering.apply( this.factory, block, tileBlock.getTileEntityClass() );
} else { }
else
{
this.blockRendering.apply( this.factory, block, null ); this.blockRendering.apply( this.factory, block, null );
} }
if (item != null) { if( item != null )
{
this.itemRendering.apply( this.factory, item ); this.itemRendering.apply( this.factory, item );
} }
} }
if (block instanceof AEBaseTileBlock) { if( block instanceof AEBaseTileBlock )
{
this.factory.addBootstrapComponent( (IPreInitComponent) side -> this.factory.addBootstrapComponent( (IPreInitComponent) side ->
{ {
AEBaseTile.registerTileItem( AEBaseTile.registerTileItem(
@@ -211,27 +244,37 @@ class BlockDefinitionBuilder implements IBlockBuilder {
new BlockStackSrc( block, 0, ActivityState.Enabled ) ); new BlockStackSrc( block, 0, ActivityState.Enabled ) );
} ); } );
if (this.tileEntityDefinition != null) { if( this.tileEntityDefinition != null )
{
this.factory.tileEntityComponent.addTileEntity( this.tileEntityDefinition ); this.factory.tileEntityComponent.addTileEntity( this.tileEntityDefinition );
} }
return (T) new TileDefinition( this.registryName, (AEBaseTileBlock) block, item ); return (T) new TileDefinition( this.registryName, (AEBaseTileBlock) block, item );
} else { }
else
{
return (T) new BlockDefinition( this.registryName, block, item ); return (T) new BlockDefinition( this.registryName, block, item );
} }
} }
@Nullable @Nullable
private ItemBlock constructItemFromBlock(Block block) { private ItemBlock constructItemFromBlock( Block block )
if (this.disableItem) { {
if( this.disableItem )
{
return null; return null;
} }
if (this.itemFactory != null) { if( this.itemFactory != null )
{
return this.itemFactory.apply( block ); return this.itemFactory.apply( block );
} else if (block instanceof AEBaseBlock) { }
else if( block instanceof AEBaseBlock )
{
return new AEBaseItemBlock( block ); return new AEBaseItemBlock( block );
} else { }
else
{
return new ItemBlock( block ); return new ItemBlock( block );
} }
} }
@@ -19,37 +19,29 @@
package appeng.bootstrap; package appeng.bootstrap;
import appeng.block.AEBaseTileBlock; import java.util.HashMap;
import appeng.bootstrap.components.BlockColorComponent; import java.util.Map;
import appeng.bootstrap.components.StateMapperComponent; import java.util.function.BiFunction;
import appeng.bootstrap.components.TesrComponent;
import appeng.client.render.model.AutoRotatingModel;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.block.statemap.IStateMapper; import net.minecraft.client.renderer.block.statemap.IStateMapper;
import net.minecraft.client.renderer.color.IBlockColor; import net.minecraft.client.renderer.color.IBlockColor;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.client.resources.IReloadableResourceManager;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.resources.IResourceManagerReloadListener;
import net.minecraftforge.client.model.IModel; import net.minecraftforge.client.model.IModel;
import net.minecraftforge.client.resource.IResourceType;
import net.minecraftforge.client.resource.ISelectiveResourceReloadListener;
import net.minecraftforge.client.resource.VanillaResourceType;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.ArrayList; import appeng.block.AEBaseTileBlock;
import java.util.HashMap; import appeng.bootstrap.components.BlockColorComponent;
import java.util.List; import appeng.bootstrap.components.StateMapperComponent;
import java.util.Map; import appeng.bootstrap.components.TesrComponent;
import java.util.function.BiFunction; import appeng.client.render.model.AutoRotatingModel;
import java.util.function.Predicate;
class BlockRendering implements IBlockRendering, ISelectiveResourceReloadListener { class BlockRendering implements IBlockRendering
{
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
private BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> modelCustomizer; private BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> modelCustomizer;
@@ -64,87 +56,80 @@ class BlockRendering implements IBlockRendering, ISelectiveResourceReloadListene
private IStateMapper stateMapper; private IStateMapper stateMapper;
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
private final Map<String, IModel> builtInModels = new HashMap<>(); private Map<String, IModel> builtInModels = new HashMap<>();
@SideOnly(Side.CLIENT)
private final List<IResourceManagerReloadListener> reloads = new ArrayList<>();
BlockRendering() {
((IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager()).registerReloadListener(this);
}
@Override @Override
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public IBlockRendering modelCustomizer(BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> customizer) { public IBlockRendering modelCustomizer( BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> customizer )
{
this.modelCustomizer = customizer; this.modelCustomizer = customizer;
return this; return this;
} }
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
@Override @Override
public IBlockRendering blockColor(IBlockColor blockColor) { public IBlockRendering blockColor( IBlockColor blockColor )
{
this.blockColor = blockColor; this.blockColor = blockColor;
return this; return this;
} }
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
@Override @Override
public IBlockRendering tesr(TileEntitySpecialRenderer<?> tesr) { public IBlockRendering tesr( TileEntitySpecialRenderer<?> tesr )
{
this.tesr = tesr; this.tesr = tesr;
return this; return this;
} }
@Override @Override
public IBlockRendering builtInModel(String name, IModel model) { public IBlockRendering builtInModel( String name, IModel model )
{
this.builtInModels.put( name, model ); this.builtInModels.put( name, model );
return this; return this;
} }
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
@Override @Override
public IBlockRendering stateMapper(IStateMapper mapper) { public IBlockRendering stateMapper( IStateMapper mapper )
{
this.stateMapper = mapper; this.stateMapper = mapper;
return this; return this;
} }
void apply(FeatureFactory factory, Block block, Class<?> tileEntityClass) { void apply( FeatureFactory factory, Block block, Class<?> tileEntityClass )
if (this.tesr != null) { {
if (tileEntityClass == null) { if( this.tesr != null )
{
if( tileEntityClass == null )
{
throw new IllegalStateException( "Tried to register a TESR for " + block + " even though no tile entity has been specified." ); throw new IllegalStateException( "Tried to register a TESR for " + block + " even though no tile entity has been specified." );
} }
factory.addBootstrapComponent( new TesrComponent( tileEntityClass, this.tesr ) ); factory.addBootstrapComponent( new TesrComponent( tileEntityClass, this.tesr ) );
} }
if (this.modelCustomizer != null) { if( this.modelCustomizer != null )
{
factory.addModelOverride( block.getRegistryName().getResourcePath(), this.modelCustomizer ); factory.addModelOverride( block.getRegistryName().getResourcePath(), this.modelCustomizer );
} else if (block instanceof AEBaseTileBlock) { }
else if( block instanceof AEBaseTileBlock )
{
// This is a default rotating model if the base-block uses an AE tile entity which exposes UP/FRONT as // This is a default rotating model if the base-block uses an AE tile entity which exposes UP/FRONT as
// extended props // extended props
factory.addModelOverride(block.getRegistryName().getResourcePath(), (l, m) -> { factory.addModelOverride( block.getRegistryName().getResourcePath(), ( l, m ) -> new AutoRotatingModel( m ) );
AutoRotatingModel model = new AutoRotatingModel(m);
BlockRendering.this.reloads.add(model);
return model;
});
} }
// TODO : 1.12 // TODO : 1.12
this.builtInModels.forEach( factory::addBuiltInModel ); this.builtInModels.forEach( factory::addBuiltInModel );
if (this.blockColor != null) { if( this.blockColor != null )
{
factory.addBootstrapComponent( new BlockColorComponent( block, this.blockColor ) ); factory.addBootstrapComponent( new BlockColorComponent( block, this.blockColor ) );
} }
if (this.stateMapper != null) { if( this.stateMapper != null )
{
factory.addBootstrapComponent( new StateMapperComponent( block, this.stateMapper ) ); factory.addBootstrapComponent( new StateMapperComponent( block, this.stateMapper ) );
} }
} }
@Override
@SideOnly(Side.CLIENT)
public void onResourceManagerReload(IResourceManager resourceManager, Predicate<IResourceType> resourcePredicate) {
if (resourcePredicate.test(VanillaResourceType.MODELS)) {
this.reloads.forEach(listener -> listener.onResourceManagerReload(resourceManager));
}
}
} }
@@ -28,7 +28,8 @@ import net.minecraftforge.fml.relauncher.SideOnly;
* used * used
* due to them not being able to be annotated with @SideOnly(CLIENT). * due to them not being able to be annotated with @SideOnly(CLIENT).
*/ */
public abstract class BlockRenderingCustomizer { public abstract class BlockRenderingCustomizer
{
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
public abstract void customize( IBlockRendering rendering, IItemRendering itemRendering ); public abstract void customize( IBlockRendering rendering, IItemRendering itemRendering );
@@ -19,6 +19,24 @@
package appeng.bootstrap; package appeng.bootstrap;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.function.BiFunction;
import java.util.function.Supplier;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import appeng.api.definitions.IItemDefinition; import appeng.api.definitions.IItemDefinition;
import appeng.api.util.AEColor; import appeng.api.util.AEColor;
import appeng.api.util.AEColoredItemDefinition; import appeng.api.util.AEColoredItemDefinition;
@@ -30,20 +48,10 @@ import appeng.core.features.ActivityState;
import appeng.core.features.ColoredItemDefinition; import appeng.core.features.ColoredItemDefinition;
import appeng.core.features.ItemStackSrc; import appeng.core.features.ItemStackSrc;
import appeng.util.Platform; import appeng.util.Platform;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Supplier;
public class FeatureFactory { public class FeatureFactory
{
private final AEFeature[] defaultFeatures; private final AEFeature[] defaultFeatures;
@@ -57,14 +65,16 @@ public class FeatureFactory {
public final TileEntityComponent tileEntityComponent; public final TileEntityComponent tileEntityComponent;
public FeatureFactory() { public FeatureFactory()
{
this.defaultFeatures = new AEFeature[] { AEFeature.CORE }; this.defaultFeatures = new AEFeature[] { AEFeature.CORE };
this.bootstrapComponents = new HashMap<>(); this.bootstrapComponents = new HashMap<>();
this.tileEntityComponent = new TileEntityComponent(); this.tileEntityComponent = new TileEntityComponent();
this.addBootstrapComponent( this.tileEntityComponent ); this.addBootstrapComponent( this.tileEntityComponent );
if (Platform.isClient()) { if( Platform.isClient() )
{
this.modelOverrideComponent = new ModelOverrideComponent(); this.modelOverrideComponent = new ModelOverrideComponent();
this.addBootstrapComponent( this.modelOverrideComponent ); this.addBootstrapComponent( this.modelOverrideComponent );
@@ -73,30 +83,36 @@ public class FeatureFactory {
} }
} }
private FeatureFactory(FeatureFactory parent, AEFeature... defaultFeatures) { private FeatureFactory( FeatureFactory parent, AEFeature... defaultFeatures )
{
this.defaultFeatures = defaultFeatures.clone(); this.defaultFeatures = defaultFeatures.clone();
this.bootstrapComponents = parent.bootstrapComponents; this.bootstrapComponents = parent.bootstrapComponents;
this.tileEntityComponent = parent.tileEntityComponent; this.tileEntityComponent = parent.tileEntityComponent;
if (Platform.isClient()) { if( Platform.isClient() )
{
this.modelOverrideComponent = parent.modelOverrideComponent; this.modelOverrideComponent = parent.modelOverrideComponent;
this.builtInModelComponent = parent.builtInModelComponent; this.builtInModelComponent = parent.builtInModelComponent;
} }
} }
public IBlockBuilder block(String id, Supplier<Block> block) { public IBlockBuilder block( String id, Supplier<Block> block )
{
return new BlockDefinitionBuilder( this, id, block ).features( this.defaultFeatures ); return new BlockDefinitionBuilder( this, id, block ).features( this.defaultFeatures );
} }
public IItemBuilder item(String id, Supplier<Item> item) { public IItemBuilder item( String id, Supplier<Item> item )
{
return new ItemDefinitionBuilder( this, id, item ).features( this.defaultFeatures ); return new ItemDefinitionBuilder( this, id, item ).features( this.defaultFeatures );
} }
public AEColoredItemDefinition colored(IItemDefinition target, int offset) { public AEColoredItemDefinition colored( IItemDefinition target, int offset )
{
ColoredItemDefinition definition = new ColoredItemDefinition(); ColoredItemDefinition definition = new ColoredItemDefinition();
target.maybeItem().ifPresent( targetItem -> target.maybeItem().ifPresent( targetItem ->
{ {
for (final AEColor color : AEColor.VALID_COLORS) { for( final AEColor color : AEColor.VALID_COLORS )
{
final ActivityState state = ActivityState.from( target.isEnabled() ); final ActivityState state = ActivityState.from( target.isEnabled() );
definition.add( color, new ItemStackSrc( targetItem, offset + color.ordinal(), state ) ); definition.add( color, new ItemStackSrc( targetItem, offset + color.ordinal(), state ) );
@@ -106,31 +122,37 @@ public class FeatureFactory {
return definition; return definition;
} }
public FeatureFactory features(AEFeature... features) { public FeatureFactory features( AEFeature... features )
{
return new FeatureFactory( this, features ); return new FeatureFactory( this, features );
} }
public void addBootstrapComponent(IBootstrapComponent component) { public void addBootstrapComponent( IBootstrapComponent component )
{
Arrays.stream( component.getClass().getInterfaces() ) Arrays.stream( component.getClass().getInterfaces() )
.filter( i -> IBootstrapComponent.class.isAssignableFrom( i ) ) .filter( i -> IBootstrapComponent.class.isAssignableFrom( i ) )
.forEach( i -> this.addBootstrapComponent( (Class<? extends IBootstrapComponent>) i, component ) ); .forEach( i -> this.addBootstrapComponent( (Class<? extends IBootstrapComponent>) i, component ) );
} }
private <T extends IBootstrapComponent> void addBootstrapComponent(Class<? extends IBootstrapComponent> eventType, T component) { private <T extends IBootstrapComponent> void addBootstrapComponent( Class<? extends IBootstrapComponent> eventType, T component )
{
this.bootstrapComponents.computeIfAbsent( eventType, c -> new ArrayList<IBootstrapComponent>() ).add( component ); this.bootstrapComponents.computeIfAbsent( eventType, c -> new ArrayList<IBootstrapComponent>() ).add( component );
} }
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
void addBuiltInModel(String path, IModel model) { void addBuiltInModel( String path, IModel model )
{
this.builtInModelComponent.addModel( path, model ); this.builtInModelComponent.addModel( path, model );
} }
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
void addModelOverride(String resourcePath, BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> customizer) { void addModelOverride( String resourcePath, BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> customizer )
{
this.modelOverrideComponent.addOverride( resourcePath, customizer ); this.modelOverrideComponent.addOverride( resourcePath, customizer );
} }
public <T extends IBootstrapComponent> Iterator<T> getBootstrapComponents(Class<T> eventType) { public <T extends IBootstrapComponent> Iterator<T> getBootstrapComponents( Class<T> eventType )
{
return (Iterator<T>) this.bootstrapComponents.getOrDefault( eventType, Collections.emptyList() ).iterator(); return (Iterator<T>) this.bootstrapComponents.getOrDefault( eventType, Collections.emptyList() ).iterator();
} }
} }
@@ -19,18 +19,20 @@
package appeng.bootstrap; package appeng.bootstrap;
import appeng.api.definitions.IBlockDefinition; import java.util.function.BiFunction;
import appeng.bootstrap.definitions.TileEntityDefinition; import java.util.function.Function;
import appeng.core.features.AEFeature;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemBlock;
import java.util.function.BiFunction; import appeng.api.definitions.IBlockDefinition;
import java.util.function.Function; import appeng.bootstrap.definitions.TileEntityDefinition;
import appeng.core.features.AEFeature;
public interface IBlockBuilder { public interface IBlockBuilder
{
IBlockBuilder bootstrap( BiFunction<Block, Item, IBootstrapComponent> component ); IBlockBuilder bootstrap( BiFunction<Block, Item, IBootstrapComponent> component );
IBlockBuilder features( AEFeature... features ); IBlockBuilder features( AEFeature... features );
@@ -19,6 +19,8 @@
package appeng.bootstrap; package appeng.bootstrap;
import java.util.function.BiFunction;
import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.block.statemap.IStateMapper; import net.minecraft.client.renderer.block.statemap.IStateMapper;
@@ -28,13 +30,12 @@ import net.minecraftforge.client.model.IModel;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.function.BiFunction;
/** /**
* Allows for client-side rendering to be customized in the context of block/item registration. * Allows for client-side rendering to be customized in the context of block/item registration.
*/ */
public interface IBlockRendering { public interface IBlockRendering
{
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
IBlockRendering modelCustomizer( BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> customizer ); IBlockRendering modelCustomizer( BiFunction<ModelResourceLocation, IBakedModel, IBakedModel> customizer );
@@ -23,5 +23,6 @@ package appeng.bootstrap;
* Bootstrap components can be registered to take part in the various initialization phases of Forge. * Bootstrap components can be registered to take part in the various initialization phases of Forge.
* See the individual subclasses for a specific forge initalization event. * See the individual subclasses for a specific forge initalization event.
*/ */
public interface IBootstrapComponent { public interface IBootstrapComponent
{
} }

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