Initializing repository

main
Shinare 2 years ago
parent 249b75e3d8
commit 0f3c080c31

@ -0,0 +1,22 @@
# This is the universal Text Editor Configuration
# for all GTNewHorizons projects
# See: https://editorconfig.org/
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[*.{bat,ini}]
end_of_line = crlf
[*.{dtd,json,info,mcmeta,md,sh,svg,xml,xsd,xsl,yaml,yml}]
indent_size = 2
[*.lang]
trim_trailing_whitespace = false

44
.gitattributes vendored

@ -0,0 +1,44 @@
* text eol=lf
*.[jJ][aA][rR] binary
*.[pP][nN][gG] binary
*.[jJ][pP][gG] binary
*.[jJ][pP][eE][gG] binary
*.[gG][iI][fF] binary
*.[tT][iI][fF] binary
*.[tT][iI][fF][fF] binary
*.[iI][cC][oO] binary
*.[sS][vV][gG] text
*.[eE][pP][sS] binary
*.[xX][cC][fF] binary
*.[kK][aA][rR] binary
*.[mM]4[aA] binary
*.[mM][iI][dD] binary
*.[mM][iI][dD][iI] binary
*.[mM][pP]3 binary
*.[oO][gG][gG] binary
*.[rR][aA] binary
*.7[zZ] binary
*.[gG][zZ] binary
*.[tT][aA][rR] binary
*.[tT][gG][zZ] binary
*.[zZ][iI][pP] binary
*.[tT][cC][nN] binary
*.[sS][oO] binary
*.[dD][lL][lL] binary
*.[dD][yY][lL][iI][bB] binary
*.[pP][sS][dD] binary
*.[tT][tT][fF] binary
*.[oO][tT][fF] binary
*.[pP][aA][tT][cC][hH] -text
*.[bB][aA][tT] text eol=crlf
*.[cC][mM][dD] text eol=crlf
*.[pP][sS]1 text eol=crlf
*[aA][uU][tT][oO][gG][eE][nN][eE][rR][aA][tT][eE][dD]* binary

@ -0,0 +1,13 @@
name: Build and test
on:
pull_request:
branches: [ master, main ]
push:
branches: [ master, main ]
jobs:
build-and-test:
uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/build-and-test.yml@master
secrets: inherit

@ -0,0 +1,14 @@
name: Release tagged build
on:
push:
tags: [ '*' ]
permissions:
contents: write
jobs:
release-tags:
uses: GTNewHorizons/GTNH-Actions-Workflows/.github/workflows/release-tags.yml@master
secrets: inherit

@ -0,0 +1,2 @@
#Thu Nov 30 11:14:33 EET 2023
gradle.version=8.2.1

Binary file not shown.

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>CinderCore</name>
<comment>Project CinderCore created by Buildship.</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
</projectDescription>

@ -0,0 +1,13 @@
arguments=
auto.sync=false
build.scans.enabled=false
connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER)
connection.project.dir=
eclipse.preferences.version=1
gradle.user.home=/usr/share/java/gradle
java.home=
jvm.arguments=
offline.mode=false
override.workspace.settings=true
show.console.view=true
show.executions.view=true

@ -0,0 +1,3 @@
# Any Github changes require admin approval
/.github/** @GTNewHorizons/admin

@ -0,0 +1,21 @@
MIT License
Copyright (c) <year> <copyright holders>
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.

File diff suppressed because it is too large Load Diff

@ -0,0 +1,40 @@
/*
* Add your dependencies here. Supported configurations:
* - api("group:name:version:classifier"): if you use the types from this dependency in the public API of this mod
* Available at runtime and compiletime for mods depending on this mod
* - implementation("g:n:v:c"): if you need this for internal implementation details of the mod, but none of it is visible via the public API
* Available at runtime but not compiletime for mods depending on this mod
* - compileOnly("g:n:v:c"): if the mod you're building doesn't need this dependency during runtime at all, e.g. for optional mods
* Not available at all for mods depending on this mod, only visible at compiletime for this mod
* - compileOnlyApi("g:n:v:c"): like compileOnly, but also visible at compiletime for mods depending on this mod
* Available at compiletime but not runtime for mods depending on this mod
* - runtimeOnlyNonPublishable("g:n:v:c"): if you want to include a mod in this mod's runClient/runServer runs, but not publish it as a dependency
* Not available at all for mods depending on this mod, only visible at runtime for this mod
* - devOnlyNonPublishable("g:n:v:c"): a combination of runtimeOnlyNonPublishable and compileOnly for dependencies present at both compiletime and runtime,
* but not published as Maven dependencies - useful for RFG-deobfuscated dependencies or local testing
* - runtimeOnly("g:n:v:c"): if you don't need this at compile time, but want it to be present at runtime
* Available at runtime for mods depending on this mod
* - annotationProcessor("g:n:v:c"): mostly for java compiler plugins, if you know you need this, use it, otherwise don't worry
* - testCONFIG("g:n:v:c") - replace CONFIG by one of the above (except api), same as above but for the test sources instead of main
*
* - shadowImplementation("g:n:v:c"): effectively the same as API, but the dependency is included in your jar under a renamed package name
* Requires you to enable usesShadowedDependencies in gradle.properties
*
* - compile("g:n:v:c"): deprecated, replace with "api" (works like the old "compile") or "implementation" (can be more efficient)
*
* You can exclude transitive dependencies (dependencies of the chosen dependency) by appending { transitive = false } if needed,
* but use this sparingly as it can break using your mod as another mod's dependency if you're not careful.
*
* To depend on obfuscated jars you can use `devOnlyNonPublishable(rfg.deobf("dep:spec:1.2.3"))` to fetch an obfuscated jar from maven,
* or `devOnlyNonPublishable(rfg.deobf(project.files("libs/my-mod-jar.jar")))` to use a file.
*
* Gradle names for some of the configuration can be misleading, compileOnlyApi and runtimeOnly both get published as dependencies in Maven, but compileOnly does not.
* The buildscript adds runtimeOnlyNonPublishable to also have a runtime dependency that's not published.
*
* For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph
*/
dependencies {
implementation files('libs/cindercore_modlist.jar')
implementation files('libs/lotr.jar')
// shadowImplementation files('libs/cindercore_modlist.jar')
}

@ -0,0 +1,152 @@
modName = CinderCore
# This is a case-sensitive string to identify your mod. Convention is to use lower case.
modId = cindercore
modGroup = com.zivilon.cindercore
# WHY is there no version field?
# The build script relies on git to provide a version via tags. It is super easy and will enable you to always know the
# code base or your binary. Check out this tutorial: https://blog.mattclemente.com/2017/10/13/versioning-with-git-tags/
# Will update your build.gradle automatically whenever an update is available
autoUpdateBuildScript = false
minecraftVersion = 1.7.10
forgeVersion = 10.13.4.1614
# Specify a MCP channel and mappings version for dependency deobfuscation and the deobfParams task.
channel = stable
mappingsVersion = 12
# Define other MCP mappings for dependency deobfuscation
remoteMappings = https://raw.githubusercontent.com/MinecraftForge/FML/1.7.10/conf/
# 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
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.
enableModernJavaSyntax = true
# Enables injecting missing generics into the decompiled source code for a better coding experience
# Turns most publicly visible List, Map, etc. into proper List<Type>, Map<K, V> types
enableGenericInjection = false
# Generate a class with String fields for the mod id, name, version and group name named with the fields below
generateGradleTokenClass = com.zivilon.cindercore.Tags
gradleTokenModId = MODID
gradleTokenModName = MODNAME
gradleTokenVersion = VERSION
gradleTokenGroupName = GROUPNAME
# [DEPRECATED]
# Multiple source files can be defined here by providing a comma-seperated list: Class1.java,Class2.java,Class3.java
# public static final String VERSION = "GRADLETOKEN_VERSION";
# The string's content will be replaced with your mod's version when compiled. You should use this to specify your mod's
# version in @Mod([...], version = VERSION, [...])
# Leave these properties empty to skip individual token replacements
replaceGradleTokenInFile =
# 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 =
# Specify the configuration file for Forge's access transformers here. It must be placed into /src/main/resources/META-INF/
# There can be multiple files in a space-separated list.
# Example value: mymodid_at.cfg nei_at.cfg
accessTransformersFile =
# Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled!
usesMixins = true
# Adds some debug arguments like verbose output and export
usesMixinDebug = false
# Specify the location of your implementation of IMixinConfigPlugin. Leave it empty otherwise.
mixinPlugin =
# Specify the package that contains all of your Mixins. You may only place Mixins in this package or the build will fail!
mixinsPackage = mixins
# Specify the core mod entry class if you use a core mod. This class must implement IFMLLoadingPlugin!
# This parameter is for legacy compatibility only
# Example value: coreModClass = asm.FMLPlugin + modGroup = com.myname.mymodid -> com.myname.mymodid.asm.FMLPlugin
coreModClass = coremod.CoreMod
# If your project is only a consolidation of mixins or a core mod and does NOT contain a 'normal' mod ( = some class
# that is 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 = 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 = true
# If disabled, won't remove unused classes from shaded dependencies. Some libraries use reflection to access
# their own classes, making the minimization unreliable.
minimizeShadowedDependencies = false
# If disabled, won't rename the shadowed classes.
relocateShadowedDependencies = false
# Adds the GTNH maven, CurseMaven, IC2/Player maven, and some more well-known 1.7.10 repositories
includeWellKnownRepositories = true
# Change these to your Maven coordinates if you want to publish to a custom Maven repository instead of the default GTNH Maven.
# Authenticate with the MAVEN_USERNAME and MAVEN_PASSWORD environment variables.
# If you need a more complex setup disable maven publishing here and add a publishing repository to addon.gradle.
usesMavenPublishing = false
# mavenPublishUrl = http://jenkins.usrv.eu:8081/nexus/content/repositories/releases
# Publishing to modrinth requires you to set the MODRINTH_TOKEN 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.
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:fplib;optional-project:gasstation;incompatible-project:gregtech
# Note: GTNH Mixins is automatically set as a required dependency if usesMixins = true
modrinthRelations =
# Publishing to CurseForge requires you to set the CURSEFORGE_TOKEN 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.
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
# Note: GTNH Mixins is automatically set as a required dependency if usesMixins = true
curseForgeRelations =
# Optional parameter to customize the produced artifacts. Use this to preserver artifact naming when migrating older
# projects. New projects should not use this parameter.
# customArchiveBaseName =
# Optional parameter to prevent the source code from being published
# noPublishedSources =
# Uncomment this to disable spotless checks
# This should only be uncommented to keep it easier to sync with upstream/other forks.
# That is, if there is no other active fork/upstream, NEVER change this.
disableSpotless = true
# Uncomment this to disable checkstyle checks (currently wildcard import check).
disableCheckstyle = true
# Override the IDEA build type. Valid value is "" (leave blank, do not override), "idea" (force use native IDEA build), "gradle"
# (force use delegated build).
# This is meant to be set in $HOME/.gradle/gradle.properties.
# e.g. add "systemProp.org.gradle.project.ideaOverrideBuildType=idea" will override the build type to be always native build.
# WARNING: If you do use this option, it will overwrite whatever you have in your existing projects. This might not be what you want!
# Usually there is no need to uncomment this here as other developers do not necessarily use the same build type as you.
# ideaOverrideBuildType = idea

Binary file not shown.

@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

248
gradlew vendored

@ -0,0 +1,248 @@
#!/bin/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.
#
# 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
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
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
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -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
# 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
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# 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"'
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
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" "$@"

92
gradlew.bat vendored

@ -0,0 +1,92 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

@ -0,0 +1,2 @@
before_install:
- ./gradlew setupCIWorkspace

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,5 @@
// Add any additional repositories for your dependencies here
repositories {
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,28 @@
pluginManagement {
repositories {
maven {
// RetroFuturaGradle
name "GTNH Maven"
url "http://jenkins.usrv.eu:8081/nexus/content/groups/public/"
allowInsecureProtocol = true
mavenContent {
includeGroup("com.gtnewhorizons.retrofuturagradle")
}
}
gradlePluginPortal()
mavenCentral()
mavenLocal()
}
}
plugins {
id 'com.diffplug.blowdryerSetup' version '1.6.0'
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.4.0' // Provides java toolchains
}
blowdryerSetup {
repoSubfolder 'gtnhShared'
github('GTNewHorizons/ExampleMod1.7.10', 'tag', '0.2.2')
//devLocal '.' // Use this when testing config updates locally
}

@ -0,0 +1 @@
src/main/java/com/zivilon/cindercore/

@ -0,0 +1,202 @@
package com.zivilon.cindercore;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent.PlayerChangedDimensionEvent;
import cpw.mods.fml.common.network.FMLNetworkEvent;
import cpw.mods.fml.common.network.FMLNetworkEvent.ServerConnectionFromClientEvent;
import cpw.mods.fml.common.registry.EntityRegistry;
import java.util.Collections;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelHandler;
import io.netty.channel.Channel;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.ChannelPromise;
import net.minecraft.command.CommandHandler;
import net.minecraft.command.ICommand;
import net.minecraft.command.ICommandSender;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.NetHandlerPlayServer;
import net.minecraft.network.play.server.S30PacketWindowItems;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ChatComponentText;
import net.minecraft.world.World;
import io.netty.channel.Channel;
import com.zivilon.cindercore.network.PacketInterceptor;
import com.zivilon.cindercore.mixins.MixinEntityList;
import com.zivilon.cindercore_modlist.CinderCoreModlist;
import com.zivilon.cindercore_modlist.CustomFallbackEntry;
import com.zivilon.cindercore_modlist.FallbackEntry;
@Mod(modid = CinderCore.MODID, version = CinderCore.VERSION, dependencies = "required-after:spongemixins@[1.1.0,)", acceptableRemoteVersions = "*", useMetadata = true)
public class CinderCore
{
public static final String MODID = "cindercore";
public static final String VERSION = "1.0";
public static final Map<Channel, UUID> playerChannelMap = new HashMap<>();
public static final boolean debug = false;
@EventHandler
public void init(FMLInitializationEvent event)
{
System.out.println("Cinder Core initialized");
if (FMLCommonHandler.instance().getEffectiveSide().isServer()) {
FMLCommonHandler.instance().bus().register(new PlayerEventHandler());
}
}
public static void registerItemFallback(int item_id, int fallback_id, String mod_name, String mod_version) {
FallbackEntry fallback = new FallbackEntry(item_id, fallback_id, mod_name, mod_version);
CinderCoreModlist.register_item_fallback(item_id, fallback);
}
public static void registerEntityFallback(Class<? extends Entity> entity_class, Class<? extends Entity> fallback_class, String mod_name, String mod_version) {
EntityRegistry registry_instance = EntityRegistry.instance();
int entity_id = registry_instance.lookupModSpawn(entity_class, false).getModEntityId();
int fallback_id;
EntityRegistry.EntityRegistration modRegistration = registry_instance.lookupModSpawn(fallback_class, false);
if (modRegistration != null) {
fallback_id = modRegistration.getModEntityId();
} else {
// If it's not a mod entity, check if it's a vanilla entity
Integer vanillaId = getEntityIDFromClass(fallback_class);
if (vanillaId != null) {
fallback_id = vanillaId;
} else {
System.out.println("[CinderCore] Attempted to register fallback with unregistered entity class. This will not work!");
return;
}
}
FallbackEntry fallback = new FallbackEntry(entity_id, fallback_id, mod_name, mod_version);
if (debug) System.out.println("[CinderCore] Registering entity " + entity_id + " with fallback " + fallback_id);
CinderCoreModlist.register_entity_fallback(entity_id, fallback);
}
public static int getEntityIDFromClass(Class<? extends Entity> entityClass) {
MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance();
World world = (World) server.worldServers[0];
try {
Entity entity = entityClass.getConstructor(World.class).newInstance(world);
return EntityList.getEntityID(entity);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
public static void registerCustomFallback(int original_id, int fallback_id, String type, String mod_name, String mod_version) {
CustomFallbackEntry fallback = new CustomFallbackEntry(original_id, fallback_id, type, mod_name, mod_version);
CinderCoreModlist.register_custom_fallback(type, fallback);
}
public static Map<Integer, Integer> getItemFallbackMap(UUID uuid) {
return CinderCoreModlist.getPlayerItemFallbacks(uuid);
}
public static Map<Integer, Integer> getEntityFallbackMap(UUID uuid) {
return CinderCoreModlist.getPlayerEntityFallbacks(uuid);
}
public static Map<String, Map<Integer, Integer>> getCustomFallbackMap(UUID uuid) {
return CinderCoreModlist.getPlayerCustomFallbacks(uuid);
}
public static UUID getPlayerFromChannel(Channel channel) {
return CinderCore.playerChannelMap.get(channel);
}
// Debug method
public static void printMapContents(Map<Integer, Integer> map) {
if (map.isEmpty()) {
System.out.println("Map is empty.");
} else {
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
}
}
public class PlayerEventHandler {
@SubscribeEvent
public void onConnectionFromClient(FMLNetworkEvent.ServerConnectionFromClientEvent event) {
// Record channel to map
Channel channel = event.manager.channel();
UUID uuid = ((NetHandlerPlayServer) event.handler).playerEntity.getUniqueID();
if (event.handler instanceof NetHandlerPlayServer) {
playerChannelMap.put(channel, uuid);
}
Map<Integer, Integer> itemFallbackMap = getItemFallbackMap(uuid);
Map<Integer, Integer> entityFallbackMap = getEntityFallbackMap(uuid);
if (debug) {
System.out.println("[CinderCore] Initiating Cinder for UUID: " + uuid);
if (itemFallbackMap == null) {
System.out.println("[CinderCore] Item fallback map is null");
} else if (itemFallbackMap.isEmpty()) {
System.out.println("[CinderCore] Item fallback map is empty");
} else {
System.out.println("[CinderCore] Item fallback map:");
printMapContents(itemFallbackMap);
}
if (entityFallbackMap == null) {
System.out.println("[CinderCore] Entity fallback map is null");
} else if (entityFallbackMap.isEmpty()) {
System.out.println("[CinderCore] Entity fallback map is empty");
} else {
System.out.println("[CinderCore] Entity fallback map:");
printMapContents(entityFallbackMap);
}
printMapContentsCustom(getCustomFallbackMap(uuid));
}
if (uuid != null) {
// Only attach packet listener if fallback maps are not empty
if (itemFallbackMap != null && !itemFallbackMap.isEmpty() && entityFallbackMap != null && !entityFallbackMap.isEmpty()) {
System.out.println("[CinderCore] Attaching packet interceptor to " + getPlayerFromChannel(channel));
channel.pipeline().addLast("modification_handler", new PacketInterceptor(uuid));
} else if (debug) {
System.out.println("[CinderCore] No item fallbacks needed for UUID: " + uuid);
}
}
}
}
// Debug method
public static void printMapContentsCustom(Map<String, Map<Integer, Integer>> data) {
if (data == null || data.isEmpty()) {
System.out.println("Map is empty.");
return;
}
for (String outerKey : data.keySet()) {
System.out.println("Key: " + outerKey);
Map<Integer, Integer> innerMap = data.get(outerKey);
for (Integer innerKey : innerMap.keySet()) {
System.out.println(" - " + innerKey + ": " + innerMap.get(innerKey));
}
}
}
}

@ -0,0 +1,39 @@
package com.zivilon.cindercore.coremod;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.AnnotationNode;
import net.minecraft.launchwrapper.IClassTransformer;
public class ChunkMethodsTransformer implements IClassTransformer {
@Override
public byte[] transform(String name, String transformedName, byte[] classBytes) {
if ("net.minecraft.world.chunk.Chunk".equals(transformedName)) {
ClassReader reader = new ClassReader(classBytes);
ClassNode classNode = new ClassNode();
reader.accept(classNode, 0);
for (Object methodObj : classNode.methods) {
MethodNode method = (MethodNode) methodObj;
if ((method.name.equals("func_76607_a") && method.desc.equals("([BIIZ)V")) ||
(method.name.equals("func_76590_a") && method.desc.equals("()V"))) {
if (method.visibleAnnotations != null) {
method.visibleAnnotations.removeIf(annotation ->
((AnnotationNode)annotation).desc.equals("Lcpw/mods/fml/relauncher/SideOnly;"));
}
}
}
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
classNode.accept(writer);
return writer.toByteArray();
}
return classBytes;
}
}

@ -0,0 +1,40 @@
package com.zivilon.cindercore.coremod;
import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
import cpw.mods.fml.relauncher.IFMLLoadingPlugin.MCVersion;
import cpw.mods.fml.relauncher.IFMLLoadingPlugin.SortingIndex;
import cpw.mods.fml.relauncher.IFMLLoadingPlugin.TransformerExclusions;
import org.spongepowered.asm.launch.MixinBootstrap;
import org.spongepowered.asm.mixin.Mixins;
import java.util.Map;
@TransformerExclusions({"com.zivilon.cindercore.coremod"})
@SortingIndex(1001)
@MCVersion("1.7.10")
public class CoreMod implements IFMLLoadingPlugin {
@Override
public String[] getASMTransformerClass() {
return new String[] { "com.zivilon.cindercore.coremod.PacketWindowItemsTransformer", "com.zivilon.cindercore.coremod.ChunkMethodsTransformer" };
}
@Override
public String getModContainerClass() {
return null;
}
@Override
public String getSetupClass() {
return null;
}
@Override
public void injectData(Map<String, Object> data) {
MixinBootstrap.init();
Mixins.addConfiguration("mixins.cindercore.json");
}
@Override
public String getAccessTransformerClass() {
return null;
}
}

@ -0,0 +1,51 @@
package com.zivilon.cindercore.coremod;
import net.minecraft.launchwrapper.IClassTransformer;
import org.objectweb.asm.*;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.FileOutputStream;
public class PacketWindowItemsTransformer implements IClassTransformer {
@Override
public byte[] transform(String name, String transformedName, byte[] classBytes) {
if (transformedName.equals("net.minecraft.network.play.server.S30PacketWindowItems")) {
System.out.println("Transforming: " + transformedName);
ClassReader reader = new ClassReader(classBytes);
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
reader.accept(new ClassVisitor(Opcodes.ASM5, writer) {
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
if (name.equals("func_148911_c") || name.equals("func_148910_d")) {
return new MethodVisitor(Opcodes.ASM5, mv) {
@Override
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
if (desc.equals("Lcpw/mods/fml/relauncher/SideOnly;")) {
return null;
}
return super.visitAnnotation(desc, visible);
}
};
}
return mv;
}
}, 0);
byte[] transformedBytes = writer.toByteArray();
writeToFile(transformedBytes, "S30PacketWindowItems.class");
return transformedBytes;
}
return classBytes;
}
private void writeToFile(byte[] data, String fileName) {
try (FileOutputStream out = new FileOutputStream(fileName)) {
out.write(data);
} catch (IOException e) {
e.printStackTrace();
}
}
}

@ -0,0 +1,5 @@
package com.zivilon.cindercore.interfaces;
public interface ICustomChunk {
void fillChunk(byte[] data, int additionalData1, int additionalData2, boolean flag);
}

@ -0,0 +1,18 @@
package com.zivilon.cindercore.interfaces;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.Packet;
import cpw.mods.fml.common.registry.EntityRegistry.EntityRegistration;
public interface IFMLNetworkHandlerMixin {
static Packet getEntitySpawningPacket(Entity entity, EntityPlayerMP player) {
throw new UnsupportedOperationException("This method should be implemented in a mixin");
}
static EntityRegistration get_entity_registration_by_entity_id(int entityId) {
throw new UnsupportedOperationException("This method should be implemented in a mixin");
}
}

@ -0,0 +1,17 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.entity.Entity;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.common.registry.EntityRegistry.EntityRegistration;
import com.google.common.collect.BiMap;
@Mixin(EntityRegistry.class)
public interface EntityRegistryAccessor {
@Accessor("entityClassRegistrations")
BiMap<Class<? extends Entity>, EntityRegistration> getEntityClassRegistrations();
}

@ -0,0 +1,22 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.entity.Entity;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.common.registry.EntityRegistry.EntityRegistration;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.common.network.FMLEmbeddedChannel;
import java.util.EnumMap;
@Mixin(FMLNetworkHandler.class)
public interface FMLNetworkHandlerAccessor {
@Accessor("channelPair")
static EnumMap<Side, FMLEmbeddedChannel> getChannelPair() { throw new AssertionError(); }
}

@ -0,0 +1,149 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.lang.reflect.Field;
import net.minecraft.item.ItemStack;
import com.zivilon.cindercore.network.PacketInterceptor;
import com.zivilon.cindercore.CinderCore;
import net.minecraft.entity.Entity;
import net.minecraft.entity.DataWatcher;
import lotr.common.item.LOTRItemBanner;
import lotr.common.entity.item.LOTREntityBanner;
import lotr.common.entity.item.LOTREntityBannerWall;
@Mixin(PacketInterceptor.class)
public abstract class LOTRPatches {
@Inject(method = "process_custom_item_datavalue", at = @At("HEAD"), cancellable = true, remap = false)
private void process(ItemStack item, UUID uuid, CallbackInfo ci) {
System.out.println("Running process_custom_item_datavalue");
int datavalue = item.getItemDamage();
String item_name = item.getItem().getUnlocalizedName();
if (item_name.equals("item.lotr:banner")) {
Map<String, Map<Integer, Integer>> fallbacks = CinderCore.getCustomFallbackMap(uuid);
Map<Integer, Integer> bannerFallbacks = fallbacks.get("banner");
if (bannerFallbacks != null) {
Integer replacementDataValue = bannerFallbacks.get(datavalue);
if (replacementDataValue != null) {
item.setItemDamage(replacementDataValue);
}
}
}
}
@Inject(method = "process_custom_item_datavalue_int", at = @At("HEAD"), cancellable = true, remap = false)
private void process(int datavalue, String item_name, UUID uuid, CallbackInfoReturnable ci) {
System.out.println("Running process_custom_item_datavalue_int");
if (item_name.equals("item.lotr:banner")) {
Map<String, Map<Integer, Integer>> fallbacks = CinderCore.getCustomFallbackMap(uuid);
Map<Integer, Integer> bannerFallbacks = fallbacks.get("banner");
if (bannerFallbacks != null) {
Integer replacementDataValue = bannerFallbacks.get(datavalue);
if (replacementDataValue != null) {
datavalue = replacementDataValue;
}
}
}
}
@Inject(method = "process_custom_entity", at = @At("HEAD"), cancellable = true, remap = false)
private static void process(Entity entity, UUID uuid, CallbackInfo ci) {
System.out.println("Running process_custom_entity");
if (entity == null) System.out.println("Entity is null");
String class_name = entity.getClass().getName();
System.out.println("[DEBUG] Entity class: " + class_name);
DataWatcher dataWatcher = null;
Field dataWatcherField = null;
Class<?> currentClass = entity.getClass();
while (currentClass != null) {
try {
dataWatcherField = currentClass.getDeclaredField("field_70180_af");
dataWatcherField.setAccessible(true);
break;
} catch (NoSuchFieldException e) {
if (currentClass.getSuperclass() == null) System.out.println("Superclass is null");
currentClass = currentClass.getSuperclass();
}
}
try {
if (dataWatcherField == null) System.out.println("DataWatcherField is null");
dataWatcher = (DataWatcher)dataWatcherField.get(entity);
} catch (IllegalAccessException e) {
System.err.println("IllegalAccessException" + e);
}
if (dataWatcher == null) System.out.println("DataWatcher is null");
if (dataWatcher != null) System.out.println("DataWatcher is not null");
if (entity instanceof LOTREntityBanner || entity instanceof LOTREntityBannerWall) {
Map<String, Map<Integer, Integer>> fallbacks = CinderCore.getCustomFallbackMap(uuid);
System.out.println("Got custom fallbacks list");
Map<Integer, Integer> bannerFallbacks = fallbacks.get("banner");
System.out.println("Got fallbacks list for banners");
if (bannerFallbacks != null) {
int originalBannerTypeID = dataWatcher.getWatchableObjectByte(18);;
Integer fallbackBannerTypeID = bannerFallbacks.get(originalBannerTypeID);
if (fallbackBannerTypeID != null) {
int id = fallbackBannerTypeID;
dataWatcher.updateObject(18, Byte.valueOf((byte)id));
}
}
}
}
@Inject(method = "process_custom_entity_metadata", at = @At("HEAD"), cancellable = true, remap = false)
private void process(Entity entity, int i, List<DataWatcher.WatchableObject> originalMetadata, UUID uuid, CallbackInfo ci) {
System.out.println("Running process_custom_entity_metadata");
System.out.println("Sending metadata of entity class " + entity.getClass().getName());
DataWatcher.WatchableObject watchableObject = originalMetadata.get(i);
DataWatcher.WatchableObject modifiedWatchableObject = new DataWatcher.WatchableObject(watchableObject.getObjectType(), watchableObject.getDataValueId(), watchableObject.getObject());
Object obj = modifiedWatchableObject.getObject();
Map<String, Map<Integer, Integer>> fallbacks = CinderCore.getCustomFallbackMap(uuid);
if (entity != null && (entity instanceof LOTREntityBanner || entity instanceof LOTREntityBannerWall)) {
Map<Integer, Integer> bannerFallbacks = fallbacks.get("banner");
System.out.println("Passed banner get");
if (bannerFallbacks != null) {
System.out.println("Fallbacks are not null");
if (obj instanceof Byte) {
System.out.println("Is byte");
Byte byteObj = (Byte) obj;
if (watchableObject.getDataValueId() == 18) {
System.out.println("Value is 18");
Integer fallbackBannerTypeID = bannerFallbacks.get((int)byteObj);
System.out.println("Fallback banner ID got: " + fallbackBannerTypeID);
if (fallbackBannerTypeID != null) {
System.out.println("Yes");
byteObj = (byte) fallbackBannerTypeID.byteValue();
modifiedWatchableObject.setObject(byteObj);
}
}
}
} else {
if (obj instanceof Byte) {
Byte byteObj = (Byte) obj;
System.out.println("Getting watchable object ID to check if banner: " + watchableObject.getDataValueId() + " with value " + byteObj);
}
}
}
originalMetadata.set(i, modifiedWatchableObject);
}
}

@ -0,0 +1,239 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.NibbleArray;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.chunk.storage.ExtendedBlockStorage;
import net.minecraft.world.World;
import net.minecraft.block.Block;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.logging.log4j.Logger;
import java.util.List;
import java.util.Map;
import com.zivilon.cindercore.interfaces.ICustomChunk;
import com.zivilon.cindercore.util.MethodChecker;
@Mixin(Chunk.class)
public abstract class MixinChunk implements ICustomChunk {
@Shadow public static boolean isLit;
@Shadow private ExtendedBlockStorage[] storageArrays;
@Shadow private byte[] blockBiomeArray;
@Shadow public int[] precipitationHeightMap;
@Shadow public boolean[] updateSkylightColumns;
@Shadow public boolean isChunkLoaded;
@Shadow public World worldObj;
@Shadow public int[] heightMap;
@Shadow private boolean isGapLightingUpdated;
@Shadow public Map chunkTileEntityMap;
@Shadow public List[] entityLists;
@Shadow public boolean isTerrainPopulated;
@Shadow public boolean isLightPopulated;
@Shadow public boolean field_150815_m;
@Shadow public boolean isModified;
@Shadow public boolean hasEntities;
@Shadow public long lastSaveTime;
@Shadow public boolean sendUpdates;
@Shadow public int heightMapMinimum;
@Shadow public long inhabitedTime;
@Shadow private int queuedLightChecks;
@Shadow
public abstract Block getBlock(final int p_150810_1_, final int p_150810_2_, final int p_150810_3_);
@Shadow
public abstract int getBlockMetadata(int p_76628_1_, int p_76628_2_, int p_76628_3_);
@Shadow
public abstract int getTopFilledSegment();
@Shadow
public abstract int func_150808_b(int p_150808_1_, int p_150808_2_, int p_150808_3_);
@Dynamic
public void fillChunk(byte[] p_76607_1_, int p_76607_2_, int p_76607_3_, boolean p_76607_4_) {
Iterator iterator = chunkTileEntityMap.values().iterator();
while(iterator.hasNext())
{
TileEntity tileEntity = (TileEntity)iterator.next();
tileEntity.updateContainingBlockInfo();
tileEntity.getBlockMetadata();
tileEntity.getBlockType();
}
int k = 0;
boolean flag1 = !this.worldObj.provider.hasNoSky;
int l;
for (l = 0; l < this.storageArrays.length; ++l)
{
if ((p_76607_2_ & 1 << l) != 0)
{
if (this.storageArrays[l] == null)
{
this.storageArrays[l] = new ExtendedBlockStorage(l << 4, flag1);
}
byte[] abyte1 = this.storageArrays[l].getBlockLSBArray();
System.arraycopy(p_76607_1_, k, abyte1, 0, abyte1.length);
k += abyte1.length;
}
else if (p_76607_4_ && this.storageArrays[l] != null)
{
this.storageArrays[l] = null;
}
}
NibbleArray nibblearray;
for (l = 0; l < this.storageArrays.length; ++l)
{
if ((p_76607_2_ & 1 << l) != 0 && this.storageArrays[l] != null)
{
nibblearray = this.storageArrays[l].getMetadataArray();
System.arraycopy(p_76607_1_, k, nibblearray.data, 0, nibblearray.data.length);
k += nibblearray.data.length;
}
}
for (l = 0; l < this.storageArrays.length; ++l)
{
if ((p_76607_2_ & 1 << l) != 0 && this.storageArrays[l] != null)
{
nibblearray = this.storageArrays[l].getBlocklightArray();
System.arraycopy(p_76607_1_, k, nibblearray.data, 0, nibblearray.data.length);
k += nibblearray.data.length;
}
}
if (flag1)
{
for (l = 0; l < this.storageArrays.length; ++l)
{
if ((p_76607_2_ & 1 << l) != 0 && this.storageArrays[l] != null)
{
nibblearray = this.storageArrays[l].getSkylightArray();
System.arraycopy(p_76607_1_, k, nibblearray.data, 0, nibblearray.data.length);
k += nibblearray.data.length;
}
}
}
for (l = 0; l < this.storageArrays.length; ++l)
{
if ((p_76607_3_ & 1 << l) != 0)
{
if (this.storageArrays[l] == null)
{
k += 2048;
}
else
{
nibblearray = this.storageArrays[l].getBlockMSBArray();
if (nibblearray == null)
{
nibblearray = this.storageArrays[l].createBlockMSBArray();
}
System.arraycopy(p_76607_1_, k, nibblearray.data, 0, nibblearray.data.length);
k += nibblearray.data.length;
}
}
else if (p_76607_4_ && this.storageArrays[l] != null && this.storageArrays[l].getBlockMSBArray() != null)
{
this.storageArrays[l].clearMSBArray();
}
}
if (p_76607_4_)
{
System.arraycopy(p_76607_1_, k, this.blockBiomeArray, 0, this.blockBiomeArray.length);
int i1 = k + this.blockBiomeArray.length;
}
for (l = 0; l < this.storageArrays.length; ++l)
{
if (this.storageArrays[l] != null && (p_76607_2_ & 1 << l) != 0)
{
this.storageArrays[l].removeInvalidBlocks();
}
}
this.isLightPopulated = true;
this.isTerrainPopulated = true;
this.generateHeightMap();
List<TileEntity> invalidList = new ArrayList<TileEntity>();
iterator = this.chunkTileEntityMap.values().iterator();
while (iterator.hasNext())
{
TileEntity tileentity = (TileEntity)iterator.next();
int x = tileentity.xCoord & 15;
int y = tileentity.yCoord;
int z = tileentity.zCoord & 15;
Block block = tileentity.getBlockType();
if ((block != getBlock(x, y, z) || tileentity.blockMetadata != this.getBlockMetadata(x, y, z)) && tileentity.shouldRefresh(block, getBlock(x, y, z), tileentity.blockMetadata, this.getBlockMetadata(x, y, z), worldObj, x, y, z))
{
invalidList.add(tileentity);
}
tileentity.updateContainingBlockInfo();
}
for (TileEntity te : invalidList)
{
te.invalidate();
}
}
@Dynamic
public void generateHeightMap()
{
int i = this.getTopFilledSegment();
this.heightMapMinimum = Integer.MAX_VALUE;
for (int j = 0; j < 16; ++j)
{
int k = 0;
while (k < 16)
{
this.precipitationHeightMap[j + (k << 4)] = -999;
int l = i + 16 - 1;
while (true)
{
if (l > 0)
{
Block block = this.getBlock(j, l - 1, k);
if (func_150808_b(j, l - 1, k) == 0)
{
--l;
continue;
}
this.heightMap[k << 4 | j] = l;
if (l < this.heightMapMinimum)
{
this.heightMapMinimum = l;
}
}
++k;
break;
}
}
}
this.isModified = true;
}
}

@ -0,0 +1,18 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.DataWatcher;
import java.util.List;
import java.util.Map;
@Mixin(EntityList.class)
public interface MixinEntityList {
@Accessor("classToIDMapping")
Map<Class<? extends Entity>, Integer> get_class_to_id_mapping();
}

@ -0,0 +1,18 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.entity.Entity;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.common.registry.EntityRegistry.EntityRegistration;
import com.google.common.collect.BiMap;
import com.zivilon.cindercore.mixins.EntityRegistryAccessor;
@Mixin(EntityRegistry.class)
public abstract class MixinEntityRegistry implements EntityRegistryAccessor {
}

@ -0,0 +1,209 @@
package com.zivilon.cindercore.mixins;
import cpw.mods.fml.common.network.NetworkRegistry;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import cpw.mods.fml.common.FMLLog;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.common.registry.GameData;
import cpw.mods.fml.common.registry.GameData.GameDataSnapshot;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.common.registry.EntityRegistry.EntityRegistration;
import cpw.mods.fml.common.network.internal.FMLMessage;
import com.zivilon.cindercore.network.PacketInterceptor;
import com.zivilon.cindercore_modlist.CinderCoreModlist;
import com.zivilon.cindercore_modlist.util.HandshakeUtils;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.Map;
import java.util.UUID;
import net.minecraft.block.Block;
import net.minecraft.entity.ai.attributes.ServersideAttributeMap;
import net.minecraft.entity.boss.EntityDragon;
import net.minecraft.entity.item.EntityBoat;
import net.minecraft.entity.item.EntityEnderCrystal;
import net.minecraft.entity.item.EntityEnderEye;
import net.minecraft.entity.item.EntityEnderPearl;
import net.minecraft.entity.item.EntityExpBottle;
import net.minecraft.entity.item.EntityFallingBlock;
import net.minecraft.entity.item.EntityFireworkRocket;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.item.EntityItemFrame;
import net.minecraft.entity.item.EntityMinecart;
import net.minecraft.entity.item.EntityPainting;
import net.minecraft.entity.item.EntityTNTPrimed;
import net.minecraft.entity.item.EntityXPOrb;
import net.minecraft.entity.passive.IAnimals;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.entity.projectile.EntityArrow;
import net.minecraft.entity.projectile.EntityEgg;
import net.minecraft.entity.projectile.EntityFireball;
import net.minecraft.entity.projectile.EntityFishHook;
import net.minecraft.entity.projectile.EntityPotion;
import net.minecraft.entity.projectile.EntitySmallFireball;
import net.minecraft.entity.projectile.EntitySnowball;
import net.minecraft.entity.projectile.EntityWitherSkull;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.EntityLeashKnot;
import net.minecraft.entity.EntityTrackerEntry;
import net.minecraft.init.Items;
import net.minecraft.item.ItemMap;
import net.minecraft.item.ItemStack;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S04PacketEntityEquipment;
import net.minecraft.network.play.server.S0APacketUseBed;
import net.minecraft.network.play.server.S0CPacketSpawnPlayer;
import net.minecraft.network.play.server.S0EPacketSpawnObject;
import net.minecraft.network.play.server.S0FPacketSpawnMob;
import net.minecraft.network.play.server.S10PacketSpawnPainting;
import net.minecraft.network.play.server.S11PacketSpawnExperienceOrb;
import net.minecraft.network.play.server.S12PacketEntityVelocity;
import net.minecraft.network.play.server.S14PacketEntity;
import net.minecraft.network.play.server.S18PacketEntityTeleport;
import net.minecraft.network.play.server.S19PacketEntityHeadLook;
import net.minecraft.network.play.server.S1BPacketEntityAttach;
import net.minecraft.network.play.server.S1CPacketEntityMetadata;
import net.minecraft.network.play.server.S1DPacketEntityEffect;
import net.minecraft.network.play.server.S20PacketEntityProperties;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.MathHelper;
import net.minecraft.world.storage.MapData;
import org.apache.logging.log4j.Logger;
import com.zivilon.cindercore.interfaces.IFMLNetworkHandlerMixin;
import com.zivilon.cindercore.mixins.MixinFMLNetworkHandler;
import com.zivilon.cindercore.util.NetworkUtil;
@Mixin(EntityTrackerEntry.class)
public abstract class MixinEntityTrackerEntry {
private EntityPlayerMP capturedPlayer;
@Shadow public Entity myEntity;
@Shadow public int lastHeadMotion;
@Inject(method = "tryStartWachingThis", at = @At("HEAD"), locals = LocalCapture.CAPTURE_FAILHARD)
private void onTryStartWatchingThis(EntityPlayerMP player, CallbackInfo ci) {
this.capturedPlayer = player;
}
@Redirect(method = "tryStartWachingThis", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/EntityTrackerEntry;func_151260_c()Lnet/minecraft/network/Packet;"))
private Packet redirectFunc_151260_c(EntityTrackerEntry instance) {
return this.customFunc_151260_c(this.capturedPlayer);
}
private Packet customFunc_151260_c(EntityPlayerMP player) {
if (this.myEntity.isDead) {
System.err.println("Fetching addPacket for removed entity");
}
Packet pkt = NetworkUtil.getEntitySpawningPacket(myEntity, player);
if (pkt != null) {
return pkt;
}
if (this.myEntity instanceof EntityItem) {
return new S0EPacketSpawnObject(this.myEntity, 2, 1);
} else if (this.myEntity instanceof EntityPlayerMP) {
return new S0CPacketSpawnPlayer((EntityPlayer)this.myEntity);
} else if (this.myEntity instanceof EntityMinecart) {
EntityMinecart entityminecart = (EntityMinecart)this.myEntity;
return new S0EPacketSpawnObject(this.myEntity, 10, entityminecart.getMinecartType());
} else if (this.myEntity instanceof EntityBoat) {
return new S0EPacketSpawnObject(this.myEntity, 1);
} else if (!(this.myEntity instanceof IAnimals) && !(this.myEntity instanceof EntityDragon)) {
if (this.myEntity instanceof EntityFishHook) {
EntityPlayer entityplayer = ((EntityFishHook)this.myEntity).field_146042_b;
return new S0EPacketSpawnObject(this.myEntity, 90, entityplayer != null ? entityplayer.getEntityId() : this.myEntity.getEntityId());
} else if (this.myEntity instanceof EntityArrow) {
Entity entity = ((EntityArrow)this.myEntity).shootingEntity;
return new S0EPacketSpawnObject(this.myEntity, 60, entity != null ? entity.getEntityId() : this.myEntity.getEntityId());
} else if (this.myEntity instanceof EntitySnowball) {
return new S0EPacketSpawnObject(this.myEntity, 61);
} else if (this.myEntity instanceof EntityPotion) {
return new S0EPacketSpawnObject(this.myEntity, 73, ((EntityPotion)this.myEntity).getPotionDamage());
} else if (this.myEntity instanceof EntityExpBottle) {
return new S0EPacketSpawnObject(this.myEntity, 75);
} else if (this.myEntity instanceof EntityEnderPearl) {
return new S0EPacketSpawnObject(this.myEntity, 65);
} else if (this.myEntity instanceof EntityEnderEye) {
return new S0EPacketSpawnObject(this.myEntity, 72);
} else if (this.myEntity instanceof EntityFireworkRocket) {
return new S0EPacketSpawnObject(this.myEntity, 76);
} else {
S0EPacketSpawnObject s0epacketspawnobject;
if (this.myEntity instanceof EntityFireball) {
EntityFireball entityfireball = (EntityFireball)this.myEntity;
s0epacketspawnobject = null;
byte b0 = 63;
if (this.myEntity instanceof EntitySmallFireball) {
b0 = 64;
} else if (this.myEntity instanceof EntityWitherSkull) {
b0 = 66;
}
if (entityfireball.shootingEntity != null) {
s0epacketspawnobject = new S0EPacketSpawnObject(this.myEntity, b0, ((EntityFireball)this.myEntity).shootingEntity.getEntityId());
} else {
s0epacketspawnobject = new S0EPacketSpawnObject(this.myEntity, b0, 0);
}
s0epacketspawnobject.func_149003_d((int)(entityfireball.accelerationX * 8000.0D));
s0epacketspawnobject.func_149000_e((int)(entityfireball.accelerationY * 8000.0D));
s0epacketspawnobject.func_149007_f((int)(entityfireball.accelerationZ * 8000.0D));
return s0epacketspawnobject;
} else if (this.myEntity instanceof EntityEgg) {
return new S0EPacketSpawnObject(this.myEntity, 62);
} else if (this.myEntity instanceof EntityTNTPrimed) {
return new S0EPacketSpawnObject(this.myEntity, 50);
} else if (this.myEntity instanceof EntityEnderCrystal) {
return new S0EPacketSpawnObject(this.myEntity, 51);
} else if (this.myEntity instanceof EntityFallingBlock) {
EntityFallingBlock entityfallingblock = (EntityFallingBlock)this.myEntity;
return new S0EPacketSpawnObject(this.myEntity, 70, Block.getIdFromBlock(entityfallingblock.func_145805_f()) | entityfallingblock.field_145814_a << 16);
} else if (this.myEntity instanceof EntityPainting) {
return new S10PacketSpawnPainting((EntityPainting)this.myEntity);
} else if (this.myEntity instanceof EntityItemFrame) {
EntityItemFrame entityitemframe = (EntityItemFrame)this.myEntity;
s0epacketspawnobject = new S0EPacketSpawnObject(this.myEntity, 71, entityitemframe.hangingDirection);
s0epacketspawnobject.func_148996_a(MathHelper.floor_float((float)(entityitemframe.field_146063_b * 32)));
s0epacketspawnobject.func_148995_b(MathHelper.floor_float((float)(entityitemframe.field_146064_c * 32)));
s0epacketspawnobject.func_149005_c(MathHelper.floor_float((float)(entityitemframe.field_146062_d * 32)));
return s0epacketspawnobject;
} else if (this.myEntity instanceof EntityLeashKnot) {
EntityLeashKnot entityleashknot = (EntityLeashKnot)this.myEntity;
s0epacketspawnobject = new S0EPacketSpawnObject(this.myEntity, 77);
s0epacketspawnobject.func_148996_a(MathHelper.floor_float((float)(entityleashknot.field_146063_b * 32)));
s0epacketspawnobject.func_148995_b(MathHelper.floor_float((float)(entityleashknot.field_146064_c * 32)));
s0epacketspawnobject.func_149005_c(MathHelper.floor_float((float)(entityleashknot.field_146062_d * 32)));
return s0epacketspawnobject;
} else if (this.myEntity instanceof EntityXPOrb) {
return new S11PacketSpawnExperienceOrb((EntityXPOrb)this.myEntity);
} else {
throw new IllegalArgumentException("Don\'t know how to add " + this.myEntity.getClass() + "!");
}
}
} else {
this.lastHeadMotion = MathHelper.floor_float(this.myEntity.getRotationYawHead() * 256.0F / 360.0F);
return new S0FPacketSpawnMob((EntityLivingBase)this.myEntity);
}
}
}

@ -0,0 +1,22 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.world.chunk.storage.ExtendedBlockStorage;
@Mixin(ExtendedBlockStorage.class)
public interface MixinExtendedBlockStorage {
@Accessor("blockRefCount")
int getBlockRefCount();
@Accessor("tickRefCount")
int getTickRefCount();
@Accessor("blockRefCount")
void setBlockRefCount(int count);
@Accessor("tickRefCount")
void setTickRefCount(int count);
}

@ -0,0 +1,50 @@
package com.zivilon.cindercore.mixins;
import cpw.mods.fml.common.network.NetworkRegistry;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import cpw.mods.fml.common.FMLLog;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.common.network.FMLEmbeddedChannel;
import cpw.mods.fml.common.registry.GameData;
import cpw.mods.fml.common.registry.GameData.GameDataSnapshot;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.common.registry.EntityRegistry.EntityRegistration;
import cpw.mods.fml.common.network.internal.FMLMessage;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.Packet;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.Map;
import java.util.UUID;
import java.util.EnumMap;
import org.apache.logging.log4j.Logger;
import com.google.common.collect.BiMap;
import com.zivilon.cindercore.interfaces.IFMLNetworkHandlerMixin;
import com.zivilon.cindercore.CinderCore;
import com.zivilon.cindercore.mixins.MixinEntityRegistry;
import com.zivilon.cindercore.mixins.EntityRegistryAccessor;
@Mixin(FMLNetworkHandler.class)
public class MixinFMLNetworkHandler implements IFMLNetworkHandlerMixin {
private EntityPlayerMP capturedPlayer;
@Shadow private static EnumMap<Side, FMLEmbeddedChannel> channelPair;
}

@ -0,0 +1,12 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.world.chunk.NibbleArray;
@Mixin(NibbleArray.class)
public interface MixinNibbleArray {
@Accessor("depthBits")
int getDepthBits();
}

@ -0,0 +1,14 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.world.WorldServer;
import net.minecraft.server.management.PlayerManager;
import java.util.List;
@Mixin(PlayerManager.class)
public interface MixinPlayerManager {
@Accessor("players")
List getPlayers();
}

@ -0,0 +1,19 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import net.minecraft.item.ItemStack;
import net.minecraft.network.play.server.S04PacketEntityEquipment;
@Mixin(S04PacketEntityEquipment.class)
public abstract class MixinS04PacketEntityEquipment {
@Shadow private ItemStack field_149393_c;
@Dynamic
public ItemStack func_149390_c()
{
return this.field_149393_c;
}
}

@ -0,0 +1,20 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.network.play.server.S0CPacketSpawnPlayer;
@Mixin(S0CPacketSpawnPlayer.class)
public interface MixinS0CPacketSpawnPlayer {
@Accessor("field_148959_h")
int get_item_ID();
@Accessor("field_148959_h")
void set_item_ID(int entity_ID);
}

@ -0,0 +1,25 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.network.play.server.S0EPacketSpawnObject;
@Mixin(S0EPacketSpawnObject.class)
public interface MixinS0EPacketSpawnObject {
@Accessor("field_149019_j")
int get_id();
@Accessor("field_149019_j")
void set_id(int entity_ID);
@Accessor("field_149020_k")
int get_item_id();
@Accessor("field_149020_k")
void set_item_id(int item_ID);
}

@ -0,0 +1,18 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.network.play.server.S0FPacketSpawnMob;
@Mixin(S0FPacketSpawnMob.class)
public interface MixinS0FPacketSpawnMob {
@Accessor("field_149040_b")
int get_id();
@Accessor("field_149040_b")
void set_id(int entity_ID);
}

@ -0,0 +1,26 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.network.play.server.S1CPacketEntityMetadata;
import net.minecraft.entity.DataWatcher;
import java.util.List;
@Mixin(S1CPacketEntityMetadata.class)
public interface MixinS1CPacketEntityMetadata {
@Accessor("field_149379_a")
int get_entity_id();
@Accessor("field_149379_a")
void set_entity_id(int entityId);
@Accessor("field_149378_b")
List<DataWatcher.WatchableObject> get_metadata();
@Accessor("field_149378_b")
void set_metadata(List<DataWatcher.WatchableObject> metadata);
}

@ -0,0 +1,53 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import net.minecraft.network.play.server.S21PacketChunkData;
@Mixin(S21PacketChunkData.class)
public abstract class MixinS21PacketChunkData {
@Shadow private int field_149284_a; // X Coordinates
@Shadow private int field_149282_b; // Z Coordinates
// I have no idea but these are needed to decode the packet
@Shadow private int field_149283_c;
@Shadow private int field_149280_d;
@Shadow private byte[] field_149278_f;
@Shadow private boolean field_149279_g;
@Dynamic // Get Chunk X coordinates in packet
public int func_149273_e()
{
return this.field_149284_a;
}
@Dynamic // Get Chunk Z coordinates in packet
public int func_149271_f()
{
return this.field_149282_b;
}
// I have no idea but these are needed to decode the packet
@Dynamic
public byte[] func_149272_d()
{
return this.field_149278_f;
}
@Dynamic
public int func_149276_g()
{
return this.field_149283_c;
}
@Dynamic
public int func_149270_h()
{
return this.field_149280_d;
}
@Dynamic
public boolean func_149274_i()
{
return this.field_149279_g;
}
}

@ -0,0 +1,19 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.network.play.server.S22PacketMultiBlockChange;
import net.minecraft.block.Block;
@Mixin(S22PacketMultiBlockChange.class)
public interface MixinS22PacketMultiBlockChange {
@Accessor("field_148926_c")
byte[] get_block_data_array();
@Accessor("field_148926_c")
void set_block_data_array(byte[] array);
}

@ -0,0 +1,29 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.network.play.server.S23PacketBlockChange;
import net.minecraft.block.Block;
@Mixin(S23PacketBlockChange.class)
public interface MixinS23PacketBlockChange {
@Accessor("field_148887_a")
int get_x();
@Accessor("field_148885_b")
int get_y();
@Accessor("field_148886_c")
int get_z();
@Accessor("field_148883_d")
Block get_block();
@Accessor("field_148883_d")
void set_block(Block block);
}

@ -0,0 +1,20 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.network.play.server.S24PacketBlockAction;
import net.minecraft.block.Block;
@Mixin(S24PacketBlockAction.class)
public interface MixinS24PacketBlockAction {
@Accessor("field_148871_f")
Block get_block();
@Accessor("field_148871_f")
void set_block(Block block);
}

@ -0,0 +1,48 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import net.minecraft.network.play.server.S26PacketMapChunkBulk;
@Mixin(S26PacketMapChunkBulk.class)
public abstract class MixinS26PacketMapChunkBulk {
@Shadow private int[] field_149266_a; // X Coordinates
@Shadow private int[] field_149264_b; // Z Coordinates
// I have no idea but these are needed to decode the packet
@Shadow private int[] field_149265_c;
@Shadow private int[] field_149262_d;
@Shadow private byte[][] field_149260_f;
@Dynamic // Get Chunk X coordinates in packet
public int func_149255_a(int index) {
return this.field_149266_a[index];
}
@Dynamic // Get Chunk Z coordinates in packet
public int func_149253_b(int index) {
return this.field_149264_b[index];
}
@Dynamic // Get length of coordinate array (i.e. get number of chunks)
public int func_149254_d() {
return this.field_149266_a.length;
}
// I have no idea but these are needed to decode the packet
@Dynamic
public byte[] func_149256_c(int p_149256_1_) {
return this.field_149260_f[p_149256_1_];
}
@Dynamic
public int[] func_149252_e() {
return this.field_149265_c;
}
@Dynamic
public int[] func_149257_f() {
return this.field_149262_d;
}
}

@ -0,0 +1,30 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import net.minecraft.item.ItemStack;
import net.minecraft.network.play.server.S2FPacketSetSlot;
@Mixin(S2FPacketSetSlot.class)
public abstract class MixinS2FPacketSetSlot {
@Shadow private int field_149179_a;
@Shadow private int field_149177_b;
@Shadow private ItemStack field_149178_c;
@Dynamic
public int func_149175_c() {
return this.field_149179_a;
}
@Dynamic
public int func_149173_d() {
return this.field_149177_b;
}
@Dynamic
public ItemStack func_149174_e() {
return this.field_149178_c;
}
}

@ -0,0 +1,18 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.item.ItemStack;
import net.minecraft.network.play.server.S30PacketWindowItems;
@Mixin(S30PacketWindowItems.class)
public interface MixinS30PacketWindowItems {
@Accessor("field_148914_a")
int func_148911_c();
@Accessor("field_148913_b")
ItemStack[] func_148910_d();
}

@ -0,0 +1,13 @@
package com.zivilon.cindercore.mixins;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.world.WorldServer;
import net.minecraft.server.management.PlayerManager;
@Mixin(WorldServer.class)
public interface MixinWorldServer {
@Accessor("thePlayerManager")
PlayerManager getPlayerManager();
}

@ -0,0 +1,561 @@
package com.zivilon.cindercore.network;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLServerStartingEvent;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.gameevent.PlayerEvent;
import cpw.mods.fml.common.network.FMLNetworkEvent;
import cpw.mods.fml.common.network.FMLNetworkEvent.ServerConnectionFromClientEvent;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.network.handshake.FMLHandshakeMessage;
import cpw.mods.fml.common.network.internal.EntitySpawnHandler;
import cpw.mods.fml.common.network.internal.FMLMessage;
import net.minecraftforge.common.MinecraftForge;
import net.minecraft.entity.DataWatcher;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.block.Block;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetHandlerPlayServer;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S00PacketKeepAlive;
import net.minecraft.network.play.server.S02PacketChat;
import net.minecraft.network.play.server.S03PacketTimeUpdate;
import net.minecraft.network.play.server.S04PacketEntityEquipment;
import net.minecraft.network.play.server.S05PacketSpawnPosition;
import net.minecraft.network.play.server.S06PacketUpdateHealth;
import net.minecraft.network.play.server.S08PacketPlayerPosLook;
import net.minecraft.network.play.server.S0CPacketSpawnPlayer;
import net.minecraft.network.play.server.S0EPacketSpawnObject;
import net.minecraft.network.play.server.S0FPacketSpawnMob;
import net.minecraft.network.play.server.S12PacketEntityVelocity;
import net.minecraft.network.play.server.S13PacketDestroyEntities;
import net.minecraft.network.play.server.S14PacketEntity;
import net.minecraft.network.play.server.S18PacketEntityTeleport;
import net.minecraft.network.play.server.S19PacketEntityHeadLook;
import net.minecraft.network.play.server.S1BPacketEntityAttach;
import net.minecraft.network.play.server.S1CPacketEntityMetadata;
import net.minecraft.network.play.server.S1FPacketSetExperience;
import net.minecraft.network.play.server.S20PacketEntityProperties;
import net.minecraft.network.play.server.S21PacketChunkData;
import net.minecraft.network.play.server.S22PacketMultiBlockChange;
import net.minecraft.network.play.server.S23PacketBlockChange;
import net.minecraft.network.play.server.S24PacketBlockAction;
import net.minecraft.network.play.server.S26PacketMapChunkBulk;
import net.minecraft.network.play.server.S28PacketEffect;
import net.minecraft.network.play.server.S29PacketSoundEffect;
import net.minecraft.network.play.server.S2FPacketSetSlot;
import net.minecraft.network.play.server.S30PacketWindowItems;
import net.minecraft.network.play.server.S33PacketUpdateSign;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.network.play.server.S3FPacketCustomPayload;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.WorldServer;
import net.minecraft.world.World;
import cpw.mods.fml.common.network.internal.FMLProxyPacket;
import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.Channel;
import io.netty.channel.ChannelPromise;
import io.netty.buffer.UnpooledUnsafeDirectByteBuf;
import java.io.DataInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.List;
import java.util.UUID;
import java.util.zip.Inflater;
import java.text.DecimalFormat;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.zivilon.cindercore.CinderCore;
import com.zivilon.cindercore.interfaces.ICustomChunk;
import com.zivilon.cindercore_modlist.CinderCoreModlist;
import com.zivilon.cindercore.mixins.MixinS0CPacketSpawnPlayer;
import com.zivilon.cindercore.mixins.MixinS0EPacketSpawnObject;
import com.zivilon.cindercore.mixins.MixinS0FPacketSpawnMob;
import com.zivilon.cindercore.mixins.MixinS1CPacketEntityMetadata;
import com.zivilon.cindercore.mixins.MixinS22PacketMultiBlockChange;
import com.zivilon.cindercore.mixins.MixinS23PacketBlockChange;
import com.zivilon.cindercore.mixins.MixinS24PacketBlockAction;
import com.zivilon.cindercore.mixins.MixinS30PacketWindowItems;
import com.zivilon.cindercore.mixins.MixinPlayerManager;
import com.zivilon.cindercore.mixins.MixinWorldServer;
import com.zivilon.cindercore.util.ChunkDeepCopy;
import net.minecraft.server.management.PlayerManager;
public class PacketInterceptor extends ChannelDuplexHandler {
public static boolean debug = false;
public UUID uuid;
public PacketInterceptor(UUID player_uuid) {
this.uuid = player_uuid;
}
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
if (msg instanceof S30PacketWindowItems) {
S30PacketWindowItems packet = (S30PacketWindowItems) msg;
handle_window_items(packet, uuid);
}
if (msg instanceof S2FPacketSetSlot) {
S2FPacketSetSlot packet = (S2FPacketSetSlot) msg;
handle_set_slot(packet, uuid);
}
if (msg instanceof S26PacketMapChunkBulk) {
S26PacketMapChunkBulk packet = (S26PacketMapChunkBulk) msg;
List<Chunk> chunks = handle_map_chunk_bulk(packet, uuid);
if (chunks != null) {
msg = new S26PacketMapChunkBulk(chunks);
}
}
if (msg instanceof S21PacketChunkData) {
S21PacketChunkData packet = (S21PacketChunkData) msg;
Chunk chunk = handle_chunk_data(packet, uuid);
if (chunk != null) {
msg = new S21PacketChunkData(chunk, packet.func_149274_i(), 0);
}
}
if (msg instanceof S04PacketEntityEquipment) {
S04PacketEntityEquipment packet = (S04PacketEntityEquipment) msg;
handle_entity_equipment(packet, uuid);
}
if (msg instanceof S0FPacketSpawnMob) {
S0FPacketSpawnMob packet = (S0FPacketSpawnMob) msg;
handle_spawn_mob(packet, uuid);
}
if (msg instanceof S0EPacketSpawnObject) {
S0EPacketSpawnObject packet = (S0EPacketSpawnObject) msg;
handle_spawn_object(packet, uuid);
}
if (msg instanceof S23PacketBlockChange) {
S23PacketBlockChange packet = (S23PacketBlockChange) msg;
msg = handle_block_change(packet, uuid);
}
if (msg instanceof S1CPacketEntityMetadata) {
S1CPacketEntityMetadata packet = (S1CPacketEntityMetadata) msg;
packet = handle_entity_metadata(packet, uuid);
msg = packet;
}
if (msg instanceof S0CPacketSpawnPlayer) {
S0CPacketSpawnPlayer packet = (S0CPacketSpawnPlayer) msg;
handle_spawn_player(packet, uuid);
}
if (msg instanceof S22PacketMultiBlockChange) {
S22PacketMultiBlockChange packet = (S22PacketMultiBlockChange) msg;
handle_multi_block_change(packet, uuid);
msg = packet;
}
if (msg instanceof S24PacketBlockAction) {
S24PacketBlockAction packet = (S24PacketBlockAction) msg;
handle_block_action(packet, uuid);
}
super.write(ctx, msg, promise);
}
public S1CPacketEntityMetadata handle_entity_metadata(S1CPacketEntityMetadata packet, UUID uuid) {
// Rebuild the packet because it is a shared reference and otherwise changes propagate to other clients too
Integer entity_id = ((MixinS1CPacketEntityMetadata)packet).get_entity_id();
if (entity_id == null) return packet;
Entity entity = getPlayerByUUID(uuid).worldObj.getEntityByID(entity_id);
if (entity == null) return packet;
DataWatcher data_watcher = entity.getDataWatcher();
if (data_watcher == null) return packet;
// Apply any changes to this new packet instead of old packet
S1CPacketEntityMetadata new_packet = new S1CPacketEntityMetadata(entity_id, data_watcher, true);
List<DataWatcher.WatchableObject> originalMetadataReference = ((MixinS1CPacketEntityMetadata)new_packet).get_metadata();
// Create new List object to dereference it from possible shared packets. Objects within are still shared references but List itself is not.
List<DataWatcher.WatchableObject> originalMetadata = new ArrayList<>();
for (DataWatcher.WatchableObject watchableObject : originalMetadataReference) {
originalMetadata.add(watchableObject);
}
for (int i = 0; i < originalMetadata.size(); i++) {
DataWatcher.WatchableObject watchableObject = originalMetadata.get(i);
Object obj = watchableObject.getObject();
process_custom_entity_metadata(entity, i, originalMetadata, uuid); // Contents of originalMetadata are likely shared references here
if (obj instanceof ItemStack) {
ItemStack originalItem = (ItemStack) obj;
ItemStack modifiedItem = new ItemStack(originalItem.getItem(), originalItem.stackSize, originalItem.getItemDamage());
process_custom_item_datavalue(modifiedItem, uuid);
if (originalItem != null && (CinderCore.getItemFallbackMap(uuid).containsKey(Item.getIdFromItem(originalItem.getItem()))) || originalItem.getItemDamage() != modifiedItem.getItemDamage()) {
Integer fallbackItemId = CinderCore.getItemFallbackMap(uuid).get(Item.getIdFromItem(originalItem.getItem()));
if (fallbackItemId != null) modifiedItem.func_150996_a(Item.getItemById(fallbackItemId));
// Copy the NBT data from the original item, if present
if (originalItem.hasTagCompound()) {
NBTTagCompound originalTagCompound = originalItem.getTagCompound();
NBTTagCompound modifiedTagCompound = (NBTTagCompound) originalTagCompound.copy();
// Recursively process the NBT to handle nested items
process_item_nbt(modifiedTagCompound, uuid);
modifiedItem.setTagCompound(modifiedTagCompound);
}
// Construct a new WatchableObject with the modified item
DataWatcher.WatchableObject modifiedWatchableObject = new DataWatcher.WatchableObject(watchableObject.getObjectType(), watchableObject.getDataValueId(), modifiedItem);
// Replace the object at the same position
originalMetadata.set(i, modifiedWatchableObject);
}
}
}
((MixinS1CPacketEntityMetadata)new_packet).set_metadata(originalMetadata);
return new_packet;
}
public void handle_block_action(S24PacketBlockAction packet, UUID uuid) {
EntityPlayerMP player = getPlayerByUUID(uuid);
Block block = ((MixinS24PacketBlockAction)packet).get_block();
Block processed_block = process_block(block, uuid);
((MixinS24PacketBlockAction)packet).set_block(processed_block);
}
public S23PacketBlockChange handle_block_change(S23PacketBlockChange packet, UUID uuid) {
EntityPlayerMP player = getPlayerByUUID(uuid);
if (player != null) {
World world = player.worldObj;
int x = ((MixinS23PacketBlockChange)packet).get_x();
int y = ((MixinS23PacketBlockChange)packet).get_y();
int z = ((MixinS23PacketBlockChange)packet).get_z();
Block block = process_block(((MixinS23PacketBlockChange)packet).get_block(), uuid);
S23PacketBlockChange new_packet = new S23PacketBlockChange(x, y, z, world);
((MixinS23PacketBlockChange)new_packet).set_block(block);
return new_packet;
}
return packet;
}
public void handle_multi_block_change(S22PacketMultiBlockChange packet, UUID uuid) {
byte[] blockDataArray = ((MixinS22PacketMultiBlockChange)packet).get_block_data_array();
DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(blockDataArray));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream);
try {
while (dataInputStream.available() > 0) {
short positionShort = dataInputStream.readShort();
short blockStateShort = dataInputStream.readShort();
int blockId = (blockStateShort >> 4) & 4095; // Extract block ID
int metadata = blockStateShort & 15; // Extract metadata
// Apply fallback logic to block ID
if (CinderCore.getItemFallbackMap(uuid).containsKey(blockId)) {
blockId = CinderCore.getItemFallbackMap(uuid).get(blockId);
}
dataOutputStream.writeShort(positionShort);
short newBlockStateShort = (short)((blockId << 4) | metadata);
dataOutputStream.writeShort(newBlockStateShort);
}
byte[] modifiedBlockDataArray = byteArrayOutputStream.toByteArray();
((MixinS22PacketMultiBlockChange)packet).set_block_data_array(modifiedBlockDataArray);
} catch (IOException e) {
}
}
public void handle_spawn_player(S0CPacketSpawnPlayer packet, UUID uuid) {
int item_id = ((MixinS0CPacketSpawnPlayer)packet).get_item_ID();
if (CinderCore.getItemFallbackMap(uuid).containsKey(item_id)) {
((MixinS0CPacketSpawnPlayer)packet).set_item_ID(CinderCore.getItemFallbackMap(uuid).get(item_id));
}
}
public Block process_block(Block block, UUID uuid) {
Map<Integer, Integer> fallbacks = CinderCore.getItemFallbackMap(uuid);
int originalBlockId = Block.getIdFromBlock(block);
if (fallbacks.containsKey(originalBlockId)) {
int fallbackBlockId = fallbacks.get(originalBlockId);
Block fallbackBlock = Block.getBlockById(fallbackBlockId);
return fallbackBlock;
}
return block;
}
public int process_entity(int entity_ID, UUID uuid) {
Map<Integer, Integer> fallbacks = CinderCore.getEntityFallbackMap(uuid);
if (fallbacks.containsKey(entity_ID)) {
entity_ID = fallbacks.get(entity_ID);
}
return entity_ID;
}
public void handle_spawn_mob(S0FPacketSpawnMob packet, UUID uuid) {
int entity_ID = ((MixinS0FPacketSpawnMob)packet).get_id();
((MixinS0FPacketSpawnMob)packet).set_id(process_entity(entity_ID, uuid));
}
public void handle_spawn_object(S0EPacketSpawnObject packet, UUID uuid) {
int entity_type = ((MixinS0EPacketSpawnObject)packet).get_id();
((MixinS0EPacketSpawnObject)packet).set_id(process_entity(entity_type, uuid));
if (entity_type == 70) { // Test if entity is EntityFallingBlock
int item_id = ((MixinS0EPacketSpawnObject)packet).get_item_id();
if (CinderCore.getItemFallbackMap(uuid).containsKey(item_id)) {
int fallback_id = CinderCore.getItemFallbackMap(uuid).get(item_id);
((MixinS0EPacketSpawnObject)packet).set_item_id(fallback_id);
}
}
}
public List<Chunk> handle_map_chunk_bulk(S26PacketMapChunkBulk packet, UUID uuid) {
List<Chunk> modified_chunks = null;
List<Chunk> chunks = new ArrayList<>();
boolean isChunkModified = false;
Integer chunk_count = packet.func_149254_d();
EntityPlayerMP player = getPlayerByUUID(uuid);
World world;
if (player != null) {
world = player.worldObj;
} else {
world = (World)getPlayerWorldByUUID(uuid);
if (world == null) {
world = MinecraftServer.getServer().worldServers[0]; // Default to overworld because bad data is probably better than crash
System.out.println("Defaulting to Overworld to save from crash");
}
}
for (int i = 0; i < chunk_count; i++) { // Get number of chunks and run once for each of them
Integer x = packet.func_149255_a(i); // Get chunk X coordinate
Integer z = packet.func_149253_b(i); // Get chunk Z coordinate
// Original in-world chunk. DO NOT MODIFY
Chunk originalChunk = world.getChunkFromChunkCoords(x, z);
Chunk chunk = ChunkDeepCopy.deepCopyChunk(originalChunk);
chunks.add(chunk);
}
for (int i = 0; i < packet.func_149254_d(); i++) {
if (process_chunk(chunks.get(i), uuid)) {
isChunkModified = true;
}
}
if (isChunkModified == true) {
modified_chunks = chunks;
}
return modified_chunks;
}
public Chunk handle_chunk_data(S21PacketChunkData packet, UUID uuid) {
Chunk modified_chunk = null; // Create null return value that can be replaced with chunk if modified
int x = packet.func_149273_e(); // Get chunk X coordinate
int z = packet.func_149271_f(); // Get chunk Z coordinate
EntityPlayerMP player = getPlayerByUUID(uuid);
World world;
if (player != null) {
world = player.worldObj;
} else {
world = (World)getPlayerWorldByUUID(uuid);
if (world == null) {
world = MinecraftServer.getServer().worldServers[0]; // Default to overworld because bad data is probably better than crash
System.out.println("Defaulting to Overworld to save from crash");
}
}
Chunk originalChunk = world.getChunkFromChunkCoords(x, z);
Chunk chunk = ChunkDeepCopy.deepCopyChunk(originalChunk);
if (process_chunk(chunk, uuid)) {
modified_chunk = chunk;
}
return modified_chunk;
}
public void handle_window_items(S30PacketWindowItems packet, UUID uuid) {
try {
ItemStack[] items = packet.func_148910_d();
if (items != null) {
boolean modified = false;
for (int i = 0; i < items.length; i++) {
if (items[i] != null) {
process_itemstack(items[i], uuid);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void handle_set_slot(S2FPacketSetSlot packet, UUID uuid) {
try {
ItemStack item = packet.func_149174_e();
if (item != null) {
process_itemstack(item, uuid);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void handle_entity_equipment(S04PacketEntityEquipment packet, UUID uuid) {
ItemStack item = packet.func_149390_c();
if (item != null) {
process_itemstack(item, uuid);
}
}
public void process_itemstack(ItemStack item, UUID uuid) {
Integer item_id = Item.getIdFromItem(item.getItem());
if (item_id == null) {
System.out.println("Item ID is null!");
return;
}
if (CinderCore.getItemFallbackMap(uuid).containsKey(item_id)) {
Item fallback_item = Item.getItemById(CinderCore.getItemFallbackMap(uuid).get(item_id));
item.func_150996_a(fallback_item);
}
process_custom_item_datavalue(item, uuid);
if (item.hasTagCompound()) {
process_item_nbt(item.getTagCompound(), uuid);
}
}
public void process_custom_item_datavalue(ItemStack item, UUID uuid) {
// Inject to HEAD with mixins if your mod needs custom handling
}
public int process_custom_item_datavalue_int(int datavalue, String item_name, UUID uuid) {
// Inject to HEAD with mixins if your mod needs custom handling
return datavalue;
}
public static void process_custom_entity(Entity entity, UUID uuid) {
// Inject to HEAD with mixins if your mod needs custom handling
}
public void process_custom_entity_metadata(Entity entity, int i, List<DataWatcher.WatchableObject> originalMetadata, UUID uuid) {
// Inject to HEAD with mixins if your mod needs custom handling
}
public void process_item_nbt(NBTBase nbt, UUID uuid) {
if (nbt instanceof NBTTagCompound) {
NBTTagCompound compound = (NBTTagCompound) nbt;
// Check if this compound is an item by looking for 'id' and 'Count'
if (compound.hasKey("id", 99) && compound.hasKey("Count", 99)) {
int item_id = compound.getInteger("id");
if (CinderCore.getItemFallbackMap(uuid).containsKey(item_id)) {
int fallback_item_id = CinderCore.getItemFallbackMap(uuid).get(item_id);
compound.setInteger("id", fallback_item_id);
}
if (compound.hasKey("Damage")) {
int datavalue = compound.getInteger("Damage");
String item_type = Item.getItemById(item_id).getUnlocalizedName();
compound.setInteger("Damage", process_custom_item_datavalue_int(datavalue, item_type, uuid));
}
}
Set<String> keySet = (Set<String>) compound.func_150296_c();
for (String key : keySet) {
NBTBase inner_nbt = compound.getTag(key);
process_item_nbt(inner_nbt, uuid);
}
} else if (nbt instanceof NBTTagList) {
NBTTagList list = (NBTTagList) nbt;
for (int i = 0; i < list.tagCount(); i++) {
NBTBase inner_nbt = list.getCompoundTagAt(i);
process_item_nbt(inner_nbt, uuid);
}
}
}
public boolean process_chunk(Chunk chunk, UUID uuid) {
boolean isModified = false;
for (int x = 0; x < 16; x++) {
for (int z = 0; z < 16; z++) {
for (int y = 0; y < 256; y++) {
Block block = chunk.getBlock(x, y, z);
int blockId = Block.getIdFromBlock(block);
if (CinderCore.getItemFallbackMap(uuid).containsKey(blockId)) {
isModified = true;
int fallbackId = CinderCore.getItemFallbackMap(uuid).get(blockId);
Block fallbackBlock = Block.getBlockById(fallbackId);
int metadata = chunk.getBlockMetadata(x, y, z);
chunk.func_150807_a(x, y, z, fallbackBlock, metadata);
}
}
}
}
return isModified;
}
public static EntityPlayerMP getPlayerByUUID(UUID playerUUID) {
MinecraftServer server = MinecraftServer.getServer();
if (server == null) {
return null;
}
for (Object obj : server.getConfigurationManager().playerEntityList) {
if (obj instanceof EntityPlayerMP) {
EntityPlayerMP player = (EntityPlayerMP) obj;
if (player.getUniqueID().equals(playerUUID)) {
return player;
}
} else {
System.err.println("[CinderCore] Player list having non-players, WHAT?!?!?!");
}
}
return null; // Player not found or not online
}
public static World getPlayerWorldByUUID(UUID uuid) {
WorldServer[] worlds = MinecraftServer.getServer().worldServers;
for (WorldServer world : worlds) {
PlayerManager pm = ((MixinWorldServer)world).getPlayerManager();
List players = ((MixinPlayerManager)pm).getPlayers();
for (Object obj : players) {
EntityPlayerMP player = (EntityPlayerMP)obj;
if (uuid.equals(player.getUniqueID())) {
return world;
}
}
}
return null;
}
}

@ -0,0 +1,91 @@
package com.zivilon.cindercore.util;
import java.lang.reflect.Method;
import java.lang.reflect.Field;
import java.util.Vector;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import net.minecraft.world.chunk.storage.ExtendedBlockStorage;
import net.minecraft.world.chunk.NibbleArray;
import net.minecraft.world.chunk.Chunk;
import java.util.Arrays;
import com.zivilon.cindercore.mixins.MixinExtendedBlockStorage;
import com.zivilon.cindercore.mixins.MixinNibbleArray;
public class ChunkDeepCopy {
public static Chunk deepCopyChunk(Chunk original) {
Chunk copy = new Chunk(original.worldObj, original.xPosition, original.zPosition);
copy.isLit = original.isLit;
copy.setBiomeArray(original.getBiomeArray());
copy.precipitationHeightMap = original.precipitationHeightMap;
copy.updateSkylightColumns = original.updateSkylightColumns;
copy.isChunkLoaded = original.isChunkLoaded;
copy.heightMap = original.heightMap;
copy.chunkTileEntityMap = original.chunkTileEntityMap;
copy.entityLists = original.entityLists;
copy.isTerrainPopulated = original.isTerrainPopulated;
copy.isLightPopulated = original.isLightPopulated;
copy.field_150815_m = original.field_150815_m;
copy.isModified = original.isModified;
copy.hasEntities = original.hasEntities;
copy.lastSaveTime = original.lastSaveTime;
copy.sendUpdates = original.sendUpdates;
copy.heightMapMinimum = original.heightMapMinimum;
copy.inhabitedTime = original.inhabitedTime;
// Deep copy ExtendedBlockStorages
ExtendedBlockStorage[] original_arrays = original.getBlockStorageArray();
ExtendedBlockStorage[] copy_arrays = copy.getBlockStorageArray();
for (int i = 0; i < original_arrays.length; i++) {
if (original_arrays[i] != null) {
copy_arrays[i] = deepCopyExtendedBlockStorage(original_arrays[i]);
}
}
return copy;
}
public static ExtendedBlockStorage deepCopyExtendedBlockStorage(ExtendedBlockStorage original) {
ExtendedBlockStorage copy = new ExtendedBlockStorage(original.getYLocation(), false);
// Copies of primitives
((MixinExtendedBlockStorage)copy).setBlockRefCount(((MixinExtendedBlockStorage)original).getBlockRefCount());
((MixinExtendedBlockStorage)copy).setTickRefCount(((MixinExtendedBlockStorage)original).getTickRefCount());
copy.setBlockLSBArray(Arrays.copyOf(original.getBlockLSBArray(), original.getBlockLSBArray().length));
// NibbleArrays. Needs deep copy for each!
if (original.getBlockMSBArray() != null) {
copy.setBlockMSBArray(deepCopyNibbleArray(original.getBlockMSBArray()));
}
if (original.getBlocklightArray() != null) {
copy.setBlocklightArray(deepCopyNibbleArray(original.getBlocklightArray()));
}
if (original.getSkylightArray() != null) {
copy.setSkylightArray(deepCopyNibbleArray(original.getSkylightArray()));
}
if (original.getMetadataArray() != null) {
copy.setBlockMetadataArray(deepCopyNibbleArray(original.getMetadataArray()));
}
return copy;
}
public static NibbleArray deepCopyNibbleArray(NibbleArray original) {
int depthBits = ((MixinNibbleArray)original).getDepthBits();
byte[] data;
if (original.data == null) {
data = new byte[(1 << depthBits) * 2];
return new NibbleArray(data, depthBits);
} else {
data = Arrays.copyOf(original.data, original.data.length);
}
return new NibbleArray(data, depthBits);
}
}

@ -0,0 +1,74 @@
package com.zivilon.cindercore.util;
import java.lang.reflect.Method;
import java.lang.reflect.Field;
import java.util.Vector;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class MethodChecker {
public static boolean isMethodValid() {
try {
Class<?> chunkClass = Class.forName("net.minecraft.world.chunk.Chunk");
Class<?>[] parameterTypes = new Class[] { byte[].class, int.class, int.class, boolean.class };
Method fillChunkMethod = chunkClass.getDeclaredMethod("fillChunk", parameterTypes);
if (fillChunkMethod != null) {
return true;
}
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException e) {
System.err.println("Failed to validate method: " + e.getMessage());
}
return false;
}
public static void main() {
boolean isValid = isMethodValid();
}
public static void dumpClass(String className, String outputFilePath, Class<?> contextClass) {
String resourcePath = className.replace('.', '/') + ".class";
try (InputStream classStream = contextClass.getClassLoader().getResourceAsStream(resourcePath)) {
if (classStream == null) {
System.err.println("Class " + className + " could not be found.");
return;
}
try (OutputStream outputStream = new FileOutputStream(outputFilePath)) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = classStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
System.out.println("Dumped " + className + " to " + outputFilePath);
} catch (IOException e) {
System.err.println("Failed to write class file: " + e.getMessage());
}
} catch (IOException e) {
System.err.println("Failed to read class file: " + e.getMessage());
}
}
public static void printLoadedClasses() {
try {
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
Field classesField = ClassLoader.class.getDeclaredField("classes");
classesField.setAccessible(true);
@SuppressWarnings("unchecked")
Vector<Class<?>> classes = (Vector<Class<?>>) classesField.get(systemClassLoader);
for (Class<?> clazz : classes) {
System.out.println(clazz.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

@ -0,0 +1,139 @@
package com.zivilon.cindercore.util;
import cpw.mods.fml.common.network.NetworkRegistry;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import cpw.mods.fml.common.FMLLog;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.common.network.FMLEmbeddedChannel;
import cpw.mods.fml.common.registry.GameData;
import cpw.mods.fml.common.registry.GameData.GameDataSnapshot;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.common.registry.EntityRegistry.EntityRegistration;
import cpw.mods.fml.common.network.internal.FMLMessage;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.Packet;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.WorldServer;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.Map;
import java.util.UUID;
import java.util.EnumMap;
import org.apache.logging.log4j.Logger;
import com.google.common.collect.BiMap;
import com.zivilon.cindercore.interfaces.IFMLNetworkHandlerMixin;
import com.zivilon.cindercore.CinderCore;
import com.zivilon.cindercore.network.PacketInterceptor;
import com.zivilon.cindercore.mixins.MixinEntityRegistry;
import com.zivilon.cindercore.mixins.EntityRegistryAccessor;
import com.zivilon.cindercore.mixins.FMLNetworkHandlerAccessor;
public class NetworkUtil {
private static EnumMap<Side, FMLEmbeddedChannel> channelPair;
private static EnumMap<Side, FMLEmbeddedChannel> getChannelPair() {
if (channelPair == null) {
channelPair = FMLNetworkHandlerAccessor.getChannelPair();
}
return channelPair;
}
public static Packet getEntitySpawningPacket(Entity entity, EntityPlayerMP player) {
Entity new_entity = null;
UUID uuid = player.getUniqueID();
boolean modified = false;
Map<String, Map<Integer, Integer>> custom_fallback_map = CinderCore.getCustomFallbackMap(uuid);
if (custom_fallback_map != null && !(custom_fallback_map.isEmpty())) {
modified = true;
new_entity = deepCopy(entity);
PacketInterceptor.process_custom_entity(new_entity, uuid);
}
EntityRegistration er = EntityRegistry.instance().lookupModSpawn(entity.getClass(), false);
if (er == null || er.usesVanillaSpawning()) {
return null;
}
Map<Integer, Integer> fallback_map = CinderCore.getEntityFallbackMap(uuid);
Integer entity_ID = er.getModEntityId();
if (fallback_map != null && fallback_map.containsKey(entity_ID)) {
modified = true;
int fallback_ID = fallback_map.get(entity_ID);
er = get_entity_registration_by_entity_id(fallback_ID) ;
}
if (!modified) {
FMLMessage.EntitySpawnMessage msg = new FMLMessage.EntitySpawnMessage(er, entity, er.getContainer());
return getChannelPair().get(Side.SERVER).generatePacketFrom(msg);
}
if (new_entity == null) {
new_entity = deepCopy(entity);
}
FMLMessage.EntitySpawnMessage msg = new FMLMessage.EntitySpawnMessage(er, new_entity, er.getContainer());
return getChannelPair().get(Side.SERVER).generatePacketFrom(msg);
}
public static EntityRegistration get_entity_registration_by_entity_id(int entityId) {
EntityRegistryAccessor accessor = (EntityRegistryAccessor) EntityRegistry.instance();
BiMap<Class<? extends Entity>, EntityRegistration> entityClassRegistrations = accessor.getEntityClassRegistrations();
for (EntityRegistration registration : entityClassRegistrations.values()) {
if (registration.getModEntityId() == entityId) {
return registration;
}
}
return null;
}
public static Entity deepCopy(Entity entity) {
MinecraftServer minecraftserver = MinecraftServer.getServer();
WorldServer worldserver = minecraftserver.worldServerForDimension(entity.dimension);
if (worldserver == null) return entity;
Entity new_entity = EntityList.createEntityByName(EntityList.getEntityString(entity), worldserver);
if (new_entity == null) return entity;
new_entity.copyDataFrom(entity, true);
int old_entity_id = entity.getEntityId();
int new_entity_id = new_entity.getEntityId();
new_entity.setEntityId(old_entity_id);
return new_entity;
}
public static void writeLog(String message) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter("custom_log.txt", true))) {
LocalDateTime now = LocalDateTime.now();
String timestamp = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
writer.write(timestamp + " - " + message + "\n");
} catch (IOException e) {
e.printStackTrace();
}
}
}

@ -0,0 +1 @@
Code of CinderCore is marked with CC0 1.0 Universal. To view a copy of this license, visit http://creativecommons.org/publicdomain/zero/1.0

@ -0,0 +1 @@
public cpw.mods.fml.common.network.handshake.NetworkDispatcher player

@ -0,0 +1,2 @@
public cpw.mods.fml.common.network.handshake.FMLHandshakeServerState
public cpw.mods.fml.common.network.handshake.NetworkDispatcher player

@ -0,0 +1,16 @@
[
{
"modid": "cindercore",
"name": "Cinder Core",
"description": "Mod that powers the Cinder Project. Responsible for providing fallbacks and mod lists.",
"version": "1.0",
"mcversion": "1.7.10",
"url": "",
"updateUrl": "",
"authorList": ["Shinare"],
"credits": "",
"logoFile": "",
"screenshots": [],
"dependencies": []
}
]

@ -0,0 +1,33 @@
{
"required": true,
"minVersion": "0.7.11",
"package": "com.zivilon.cindercore.mixins",
"refmap": "mixins.cindercore.refmap.json",
"target": "@env(DEFAULT)",
"compatibilityLevel": "JAVA_8",
"mixins": [
"MixinS30PacketWindowItems",
"MixinS2FPacketSetSlot",
"MixinS26PacketMapChunkBulk",
"MixinS21PacketChunkData",
"MixinS04PacketEntityEquipment",
"MixinS0FPacketSpawnMob",
"MixinS0EPacketSpawnObject",
"MixinS22PacketMultiBlockChange",
"MixinS23PacketBlockChange",
"MixinS24PacketBlockAction",
"MixinS1CPacketEntityMetadata",
"MixinS0CPacketSpawnPlayer",
"EntityRegistryAccessor",
"FMLNetworkHandlerAccessor",
"MixinEntityTrackerEntry",
"MixinExtendedBlockStorage",
"MixinNibbleArray",
"MixinChunk",
"MixinEntityList",
"MixinPlayerManager",
"MixinWorldServer",
"LOTRPatches"
],
"client": []
}
Loading…
Cancel
Save