Compare commits

...
99 Commits
Author SHA1 Message Date
Martin Robertz ebe4279799 Merge pull request #29 from GTNewHorizons/maven
maven publication
2022-02-09 18:20:04 +01:00
bombcar aa7e3736a0 maven publication 2022-02-09 11:08:25 -06:00
Martin Robertz 1f61ef15e3 Merge pull request #28 from GTNewHorizons/feature/ethereal-shard-fix
Actually fix ethereal shard rendering
2022-02-05 11:29:07 +01:00
repo_alt 943ae13bc0 Actually fix ethereal shard rendering 2022-01-31 13:02:48 +03:00
Johann Bernhardt 48d1b9f0c6 Merge pull request #27 from GTNewHorizons/migrate-build-script
Migrate to unified build script
2022-01-15 17:20:08 +01:00
Johann Bernhardt e89a4a53ba Remove unused repository 2022-01-15 17:13:42 +01:00
Johann Bernhardt 5d777104d5 Migrate to unified build script 2022-01-15 17:10:47 +01:00
Martin Robertz 2cf251b539 Merge pull request #26 from Savallator/master
Fix for very large Ethereal shard nodes
2022-01-13 09:40:07 +01:00
Moritz Grothe 84d7860d3c making longs 2022-01-12 02:03:45 +01:00
Moritz Grothe 9838790974 dirty fix of color overflow 2022-01-11 23:59:31 +01:00
Martin Robertz 6161f3a1c4 Merge pull request #25 from pulsemageadvocate/fixTumor
fix tumor
2022-01-09 14:06:11 +01:00
pulsemageadvocate 1173060c64 fix tumor 2022-01-09 17:43:30 +09:00
Martin Robertz b48ae835bd Merge pull request #24 from bombcar/master
remove broken unicode, replace with EnumChatFormatting;
2021-11-29 23:02:56 +01:00
Tom Dickson 7f874b0646 Revert "remove extra + """
This reverts commit 32efd39fee.
2021-11-23 12:13:07 -06:00
Tom Dickson 32efd39fee remove extra + "" 2021-11-22 07:34:00 -06:00
Tom Dickson 0ecb1d2c51 Merge branch 'master' of https://github.com/bombcar/ThaumicHorizons 2021-11-22 07:23:47 -06:00
Tom Dickson d16d00d911 Remove unicode errors, fix chat handling 2021-11-22 07:23:44 -06:00
bombcar 92a0865a4d Merge branch 'GTNewHorizons:master' into master 2021-11-21 11:34:43 -06:00
Tom Dickson e609874d2d Ignore filesystem junk 2021-11-21 08:08:47 -06:00
Martin Robertz 4bf23df25b Merge pull request #23 from bombcar/master
Set build to use stable-2021-11-20
2021-11-21 15:04:38 +01:00
Tom Dickson f0adb5d09a Set build to use stable-2021-11-20 2021-11-21 08:00:08 -06:00
Martin Robertz 35182626f7 Merge pull request #22 from GTNewHorizons/Warp-Tumour-Fix
Probably fixed shitty handling of Warp Tumours.
2021-11-21 11:58:53 +01:00
Alkalus 8c9d1ece5d Probably fixed shitty handling of Warp Tumours. 2021-11-17 10:15:13 +00:00
DreamMasterXXL 206f8a33f5 bump version 2021-08-13 19:29:18 +02:00
Martin Robertz 5d7edb5d5c Merge pull request #21 from pulsemageadvocate/patchToggleInvisibility
Patch toggle invisibility
2021-08-13 19:14:16 +02:00
pulsemageadvocate 0f8a7f0be3 fix entering Exit Portal cause player infusions to be lost 2021-08-03 13:20:44 +09:00
pulsemageadvocate 41855e0c7a patch to toggle chameleon skin and spider climb 2021-06-07 22:42:04 +09:00
DreamMasterXXL a62e675bc5 bump version 2021-05-16 12:57:58 +02:00
DreamMasterXXL f306f4b23f fix derp 2021-05-01 10:43:34 +02:00
DreamMasterXXL 275789f75e update builscript 2021-05-01 10:42:56 +02:00
Martin Robertz c403d90a1f Merge pull request #20 from Reystlin/patch-1
Create ru_RU.lang
2021-05-01 10:30:44 +02:00
Reystlin 203f19f1d6 Create ru_RU.lang 2021-05-01 08:36:23 +07:00
DreamMasterXXL 62db3abe63 bump version 2021-02-26 07:32:58 +01:00
KiloJoel ea9a5fa857 avoided running code on the client that can produce an NPE (#19)
* avoided running code on the client that can produce an NPE

* changed to early exit
2021-02-22 13:09:48 +01:00
Martin Robertz 8d122d3ba8 Merge pull request #18 from KiloJoel/oldPlaneNewPortalFix
Old plane new portal fix
2021-02-07 11:16:34 +01:00
KiloJoel 1600812b71 fixed outofbounds from creating portal for a plane created in old version 2021-02-07 01:58:01 +00:00
KiloJoel c0717e993d added IC2 lib 2021-02-07 01:55:13 +00:00
Martin Robertz 0806af3ad0 Merge pull request #17 from KiloJoel/teleportDimFix
Added dim to portal values
2021-01-18 19:39:42 +01:00
KiloJoel df54e81c14 removed old switch and corrected order in new 2021-01-18 18:29:28 +00:00
KiloJoel d981421721 took repeated code out of switch 2021-01-18 17:49:34 +00:00
DreamMasterXXL f6e2abcc8e bump version 2021-01-18 17:16:02 +01:00
Martin Robertz 972fd950c0 Merge pull request #16 from KiloJoel/portalCooldownFix
Reduced portal cooldown
2021-01-18 13:19:31 +01:00
KiloJoel 3f54a201c7 added dim to portal values 2021-01-17 23:44:13 +00:00
KiloJoel 59479ad703 reduced portal cooldown 2021-01-17 17:43:07 +00:00
Martin Robertz f20371ba3d Merge pull request #15 from GTNewHorizons/patch-fxsonic
Patch fxsonic
2021-01-14 14:16:58 +01:00
Glease cbf51834e2 Invalidate cached obj model upon reload 2021-01-14 16:47:39 +08:00
Glease 2dcd2f9877 Stop reloading obj model for every FXSonic 2021-01-14 16:39:24 +08:00
Martin Robertz 46fdf7f730 Merge pull request #14 from KiloJoel/colourCrashFix
added null check
2020-12-03 08:33:08 +01:00
Martin Robertz 9adc79358b Merge pull request #13 from GTNewHorizons/Teleporter-Rebalance
Teleporter rebalance
2020-12-03 08:32:22 +01:00
DreamMasterXXL 10626ce52b fix(ThaumicHorizons)Gated Keystone Recptacles behind Enderium Plates 2020-12-02 23:29:22 +01:00
KiloJoel e18f6433ef added null check 2020-12-02 11:16:29 +00:00
DreamMasterXXL 4019d6e24f add(thaumic Horizons)GT version as dependencies in Pocket Plane
bump version
2020-12-01 21:22:33 +01:00
DreamMasterXXL c1a1fddba3 change(Thauic Horizons)recipes cahnges around The Pocket Plane
add GT item to recipes via code because it cant be done vie Minetweaker
add GT lib
2020-12-01 20:35:43 +01:00
Martin Robertz 3134edcc72 Merge pull request #12 from GTNewHorizons/test
feat(Thaumic Horizons)Change Planar Gateway
2020-11-30 09:34:07 +01:00
DreamMasterXXL d6c5dd93f3 bump version 2020-11-29 22:35:48 +01:00
DreamMasterXXL 0755e67053 more fixes 2020-11-29 21:37:45 +01:00
DreamMasterXXL 14f0bf4dd4 fix blocks 2020-11-29 21:03:08 +01:00
DreamMasterXXL 4e515ff6a2 more fixes 2020-11-29 20:33:24 +01:00
DreamMasterXXL 5bbdb325c1 update texure for Portal 2020-11-29 20:25:01 +01:00
DreamMasterXXL dbd14c0859 partly done 2020-11-29 19:48:38 +01:00
Martin Robertz cc8e0291c4 Merge pull request #11 from KiloJoel/snowFix
ensure a block is placed on the top layer when generating pocket plane terrain
2020-11-24 10:56:11 +01:00
KiloJoel db9016aa4b ensure a block is placed on the top layer 2020-11-23 19:56:07 +00:00
Martin Robertz 14806fba4e Merge pull request #10 from KiloJoel/stabiliserFix
changed vortex attenuator hardness from 0 to 10
2020-11-15 17:22:25 +01:00
KiloJoel c44f5e36f8 removed .idea folder 2020-11-15 15:35:47 +00:00
KiloJoel 8868440769 added .idea to gitignore 2020-11-15 15:31:43 +00:00
KiloJoel 6935b8cdfc changed vortex attenuator hardness from 0 to 10 2020-11-15 14:32:17 +00:00
Prometheus0000 9e43dc7ffc Merge pull request #9 from Prometheus0000/vpfix
Add missing ';'
2020-10-13 14:23:17 -04:00
Prometheus0000 ae9b960420 Add missing ';' 2020-10-13 14:02:14 -04:00
Martin Robertz b9b3de0836 Merge pull request #8 from Prometheus0000/vpfix
Check to see if item is actually repairable first
2020-10-13 19:24:32 +02:00
Prometheus0000 be1b40d4e3 Check to see if item is actually repairable first 2020-10-13 12:26:58 -04:00
Martin Robertz 97c59ab777 Merge pull request #7 from msifd/master
Fix client crash due to ArrayIndexOutOfBoundsException
2020-06-11 19:26:37 +02:00
msifeed 00a6ff30b8 Fix client crash due to ArrayIndexOutOfBoundsException 2020-06-11 19:08:23 +03:00
DreamMasterXXL a21235ba0f bump version 2020-05-24 16:25:09 +02:00
Martin Robertz 42ce6d3844 Merge pull request #6 from Kiwi233/master
Create zh_CN.lang
2020-05-24 13:01:04 +02:00
[Kiwi233] f635840e6b Create zh_CN.lang 2020-05-24 18:58:08 +08:00
bartimaeusnek 1986d7c81b Fixed Renderer
+ fixed gradle version replacement
+ added idea plugin
+ increased version

Signed-off-by: bartimaeusnek <33183715+bartimaeusnek@users.noreply.github.com>
2020-03-26 17:52:09 +01:00
Dream-Master 8695409a6d A very very cheap way to remove all permanent warp 2 #5404
https://github.com/GTNewHorizons/NewHorizons/issues/5404
2020-01-26 17:31:46 +01:00
Dream-Master c91562fd5c reduce aspects on recipes 2020-01-26 11:49:19 +01:00
Dream-Master a2d32edf64 fix recipe 2020-01-20 23:25:21 +01:00
Dream-Master a712e7a065 remove gregtech dependencies 2020-01-20 22:39:11 +01:00
Dream-Master 8c241ca3dc A very very cheap way to remove all permanent warp 2 #5404
https://github.com/GTNewHorizons/NewHorizons/issues/5404
2020-01-20 22:34:15 +01:00
Martin Robertz d961d0ee21 Merge pull request #5 from GTNewHorizons/fix_npe
Fix npe
2020-01-10 06:50:39 +01:00
Jason Mitchell 214e003e38 Fix NPE 2020-01-09 20:21:21 -08:00
Jason Mitchell 21b97e5fdb Update gradle wrapper 2020-01-09 20:21:11 -08:00
Dream-Master a4176b4aed bump version 2019-12-14 21:37:08 +01:00
Martin Robertz 83880c4dfb Merge pull request #4 from Fibis-Ra/master
Serum fix pull
2019-12-14 21:36:25 +01:00
Elias a3b5f6efce Issue: when user opens serumconverter and hovers over specific thaum-aspects, error occures:
java.lang.ArrayIndexOutOfBoundsException: -1
	at com.kentington.thaumichorizons.client.gui.GuiBloodInfuser.func_146979_b(GuiBloodInfuser.java:149)

Fix: wrap logic into simple check, if "key" actually could act as array's index (>= 0)
2019-12-14 22:26:19 +02:00
Dream-Master cf527d5bcc bump version 2019-10-15 13:12:46 +02:00
yukieiji 9279d736ba Fix OreBoar eating stone Logic (#3)
* Fix AIEatStone Logic

* Fix Path check

* Some Fix
2019-10-14 18:41:14 +02:00
Dream-MasterXXL 6b06ecce87 bump version 2019-07-08 11:31:16 +02:00
bartimaeusnek cfb697d5ee Update build.gradle 2019-07-05 15:16:51 +02:00
bartimaeusnek a0bedc6a88 Merge pull request #2 from GTNewHorizons/dev
Dev
2019-07-05 15:16:22 +02:00
bartimaeusnek c905bfeb26 fixed teleport issues with pocketplane after restart/unload
Signed-off-by: bartimaeusnek <33183715+bartimaeusnek@users.noreply.github.com>
2019-07-05 15:14:39 +02:00
bartimaeusnek b9015211d0 fixes
-added creature limit to pocket plane dim
-fixed keystone

Signed-off-by: bartimaeusnek <33183715+bartimaeusnek@users.noreply.github.com>
2019-07-05 13:02:28 +02:00
bartimaeusnek 9152f64b45 Merge pull request #1 from GTNewHorizons/dev
outcommented a bugging part of the pocket plane dim generation
2019-07-05 11:32:18 +02:00
bartimaeusnek 53de68fe23 outcommented a bugging part of the pocket plane dim generation 2019-07-05 11:31:14 +02:00
Dream-Master 81bb8e60da bump version 2019-06-04 22:42:19 +02:00
bartimaeusnek 0fee272bb6 Merge branch 'master' of https://github.com/GTNewHorizons/ThaumicHorizons 2019-06-04 22:25:51 +02:00
bartimaeusnek 8c183ef6df fixed another NPE
Signed-off-by: bartimaeusnek <33183715+bartimaeusnek@users.noreply.github.com>
2019-06-04 22:25:37 +02:00
77 changed files with 2778 additions and 575 deletions

No files matched your search

+27
View File
@@ -0,0 +1,27 @@
if [[ -d "run/crash-reports" ]]; then
echo "Crash reports detected:"
cat $directory/*
exit 1
fi
if grep --quiet "Fatal errors were detected" server.log; then
echo "Fatal errors detected:"
cat server.log
exit 1
fi
if grep --quiet "The state engine was in incorrect state ERRORED and forced into state SERVER_STOPPED" server.log; then
echo "Server force stopped:"
cat server.log
exit 1
fi
if grep --quiet 'Done .+ For help, type "help" or "?"' server.log; then
echo "Server didn't finish startup:"
cat server.log
exit 1
fi
echo "No crash reports detected"
exit 0
+45
View File
@@ -0,0 +1,45 @@
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Build and test
on:
pull_request:
branches: [ master, main ]
push:
branches: [ master, main ]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Set up JDK 8
uses: actions/setup-java@v2
with:
java-version: '8'
distribution: 'adopt'
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Setup the workspace
run: ./gradlew setupCIWorkspace
- name: Build the mod
run: ./gradlew build
- name: Run server for 1.5 minutes
run: |
mkdir run
echo "eula=true" > run/eula.txt
timeout 90 ./gradlew runServer | tee --append server.log || true
- name: Test no errors reported during server run
run: |
chmod +x .github/scripts/test-no-error-reports.sh
.github/scripts/test-no-error-reports.sh
+51
View File
@@ -0,0 +1,51 @@
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Release tagged build
on:
push:
tags:
- '*'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Set release version
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: Set up JDK 8
uses: actions/setup-java@v2
with:
java-version: '8'
distribution: 'adopt'
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Setup the workspace
run: ./gradlew setupCIWorkspace
- name: Build the mod
run: ./gradlew build
- name: Release under current tag
uses: "marvinpinto/action-automatic-releases@latest"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: "${{ env.RELEASE_VERSION }}"
prerelease: false
title: "${{ env.RELEASE_VERSION }}"
files: build/libs/*.jar
- name: Publish to Maven
run: ./gradlew publish
env:
MAVEN_USER: ${{ secrets.MAVEN_USER }}
MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}
+29 -6
View File
@@ -1,8 +1,31 @@
.gradle/
eclipse/
out/
gradle/
*.iws
*.ipr
.gradle
.settings
/.idea/
/run/
/build/
/eclipse/
.classpath
.project
/bin/
/config/
/crash-reports/
/logs/
options.txt
/saves/
usernamecache.json
banned-ips.json
banned-players.json
eula.txt
ops.json
server.properties
servers.dat
usercache.json
whitelist.json
/out/
*.iml
*.ipr
*.iws
src/main/resources/mixins.*.json
*.bat
*.DS_Store
!gradlew.bat
+3
View File
@@ -0,0 +1,3 @@
# Any Github changes require admin approval
/.github/** @GTNewHorizons/admin
+676 -33
View File
@@ -1,54 +1,404 @@
//version: 1644349045
/*
DO NOT CHANGE THIS FILE!
Also, you may replace this file at any time if there is an update available.
Please check https://github.com/GTNewHorizons/ExampleMod1.7.10/blob/main/build.gradle for updates.
*/
import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import java.util.concurrent.TimeUnit
buildscript {
repositories {
mavenCentral()
maven {
name = "forge"
url = "http://files.minecraftforge.net/maven"
url = "https://maven.minecraftforge.net"
}
maven {
name = "sonatype"
url = "https://oss.sonatype.org/content/repositories/snapshots/"
}
maven {
name = "Scala CI dependencies"
url = "https://repo1.maven.org/maven2/"
}
maven {
name = "jitpack"
url = "https://jitpack.io"
}
}
dependencies {
classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT'
classpath 'com.github.GTNewHorizons:ForgeGradle:1.2.7'
}
}
plugins {
id 'idea'
id 'eclipse'
id 'scala'
id 'maven-publish'
id('org.jetbrains.kotlin.jvm') version ('1.6.10') apply false
id('org.ajoberstar.grgit') version('4.1.1')
id('com.github.johnrengelman.shadow') version('4.0.4')
id('com.palantir.git-version') version('0.13.0') apply false
id('de.undercouch.download') version('5.0.1')
}
apply plugin: 'java'
if (project.file('.git/HEAD').isFile()) {
apply plugin: 'com.palantir.git-version'
}
apply plugin: 'forge'
group= "com.kentington.thaumichorizons" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
def projectJavaVersion = JavaLanguageVersion.of(8)
targetCompatibility = "1.8"
sourceCompatibility = "1.8"
java {
toolchain {
languageVersion.set(projectJavaVersion)
}
}
version = "1.1.9.8"
archivesBaseName = "ThaumicHorizons-1.7.10"
idea {
module {
inheritOutputDirs = true
downloadJavadoc = true
downloadSources = true
}
}
if(JavaVersion.current() != JavaVersion.VERSION_1_8) {
throw new GradleException("This project requires Java 8, but it's running on " + JavaVersion.current())
}
checkPropertyExists("modName")
checkPropertyExists("modId")
checkPropertyExists("modGroup")
checkPropertyExists("autoUpdateBuildScript")
checkPropertyExists("minecraftVersion")
checkPropertyExists("forgeVersion")
checkPropertyExists("replaceGradleTokenInFile")
checkPropertyExists("gradleTokenModId")
checkPropertyExists("gradleTokenModName")
checkPropertyExists("gradleTokenVersion")
checkPropertyExists("gradleTokenGroupName")
checkPropertyExists("apiPackage")
checkPropertyExists("accessTransformersFile")
checkPropertyExists("usesMixins")
checkPropertyExists("mixinPlugin")
checkPropertyExists("mixinsPackage")
checkPropertyExists("coreModClass")
checkPropertyExists("containsMixinsAndOrCoreModOnly")
checkPropertyExists("usesShadowedDependencies")
checkPropertyExists("developmentEnvironmentUserName")
boolean noPublishedSources = project.findProperty("noPublishedSources") ? project.noPublishedSources.toBoolean() : false
String javaSourceDir = "src/main/java/"
String scalaSourceDir = "src/main/scala/"
String kotlinSourceDir = "src/main/kotlin/"
String targetPackageJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/")
String targetPackageScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/")
String targetPackageKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/")
if(!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) {
throw new GradleException("Could not resolve \"modGroup\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin)
}
if(apiPackage) {
targetPackageJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/")
targetPackageScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/")
targetPackageKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/")
if(!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) {
throw new GradleException("Could not resolve \"apiPackage\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin)
}
}
if(accessTransformersFile) {
String targetFile = "src/main/resources/META-INF/" + accessTransformersFile
if(!getFile(targetFile).exists()) {
throw new GradleException("Could not resolve \"accessTransformersFile\"! Could not find " + targetFile)
}
}
if(usesMixins.toBoolean()) {
if(mixinsPackage.isEmpty() || mixinPlugin.isEmpty()) {
throw new GradleException("\"mixinPlugin\" requires \"mixinsPackage\" and \"mixinPlugin\" to be set!")
}
targetPackageJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinsPackage.toString().replaceAll("\\.", "/")
targetPackageScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinsPackage.toString().replaceAll("\\.", "/")
targetPackageKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinsPackage.toString().replaceAll("\\.", "/")
if(!(getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists() || getFile(targetPackageKotlin).exists())) {
throw new GradleException("Could not resolve \"mixinsPackage\"! Could not find " + targetPackageJava + " or " + targetPackageScala + " or " + targetPackageKotlin)
}
String targetFileJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinPlugin.toString().replaceAll("\\.", "/") + ".java"
String targetFileScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinPlugin.toString().replaceAll("\\.", "/") + ".scala"
String targetFileScalaJava = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinPlugin.toString().replaceAll("\\.", "/") + ".java"
String targetFileKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + mixinPlugin.toString().replaceAll("\\.", "/") + ".kt"
if(!(getFile(targetFileJava).exists() || getFile(targetFileScala).exists() || getFile(targetFileScalaJava).exists() || getFile(targetFileKotlin).exists())) {
throw new GradleException("Could not resolve \"mixinPlugin\"! Could not find " + targetFileJava + " or " + targetFileScala + " or " + targetFileScalaJava + " or " + targetFileKotlin)
}
}
if(coreModClass) {
String targetFileJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + coreModClass.toString().replaceAll("\\.", "/") + ".java"
String targetFileScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + coreModClass.toString().replaceAll("\\.", "/") + ".scala"
String targetFileScalaJava = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + coreModClass.toString().replaceAll("\\.", "/") + ".java"
String targetFileKotlin = kotlinSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + coreModClass.toString().replaceAll("\\.", "/") + ".kt"
if(!(getFile(targetFileJava).exists() || getFile(targetFileScala).exists() || getFile(targetFileScalaJava).exists() || getFile(targetFileKotlin).exists())) {
throw new GradleException("Could not resolve \"coreModClass\"! Could not find " + targetFileJava + " or " + targetFileScala + " or " + targetFileScalaJava + " or " + targetFileKotlin)
}
}
configurations.all {
resolutionStrategy.cacheChangingModulesFor(0, TimeUnit.SECONDS)
// Make sure GregTech build won't time out
System.setProperty("org.gradle.internal.http.connectionTimeout", 120000 as String)
System.setProperty("org.gradle.internal.http.socketTimeout", 120000 as String)
}
// Fix Jenkins' Git: chmod a file should not be detected as a change and append a '.dirty' to the version
try {
'git config core.fileMode false'.execute()
}
catch (Exception e) {
logger.error("\u001B[31mgit isn't installed at all\u001B[0m")
}
// Pulls version first from the VERSION env and then git tag
String identifiedVersion
String versionOverride = System.getenv("VERSION") ?: null
try {
identifiedVersion = versionOverride == null ? gitVersion() : versionOverride
}
catch (Exception e) {
logger.error("\n\u001B[1;31mThis mod must be version controlled by Git AND the repository must provide at least one tag,\n" +
"or the VERSION override must be set! \u001B[32m(Don't download from GitHub using the ZIP option, instead\n" +
"clone the repository, see\u001B[33m https://gtnh.miraheze.org/wiki/Development \u001B[32mfor details.)\u001B[0m\n");
versionOverride = 'NO-GIT-TAG-SET'
identifiedVersion = versionOverride
}
version = minecraftVersion + '-' + identifiedVersion
String modVersion = identifiedVersion
if( identifiedVersion.equals(versionOverride) ) {
logger.error('\u001B[31m\u001B[7mWe hope you know what you\'re doing using\u001B[0m\u001B[1;34m ' + modVersion + '\u001B[0m\n');
logger.error('\7\u001B[31mGoing to blindly try to use\u001B[1;34m ' + modVersion + '\u001B[0m\u001B[31m, this probably won\'t work the way you expect!!\u001B[0m\n');
}
group = modGroup
if(project.hasProperty("customArchiveBaseName") && customArchiveBaseName) {
archivesBaseName = customArchiveBaseName
}
else {
archivesBaseName = modId
}
def arguments = []
def jvmArguments = []
if(usesMixins.toBoolean()) {
arguments += [
"--tweakClass org.spongepowered.asm.launch.MixinTweaker"
]
jvmArguments += [
"-Dmixin.debug.countInjections=true", "-Dmixin.debug.verbose=true", "-Dmixin.debug.export=true"
]
}
minecraft {
version = "1.7.10-10.13.4.1614-1.7.10"
replace '${version}', project.version
runDir = "eclipse"
version = minecraftVersion + "-" + forgeVersion + "-" + minecraftVersion
runDir = "run"
if (replaceGradleTokenInFile) {
replaceIn replaceGradleTokenInFile
if(gradleTokenModId) {
replace gradleTokenModId, modId
}
if(gradleTokenModName) {
replace gradleTokenModName, modName
}
if(gradleTokenVersion) {
replace gradleTokenVersion, modVersion
}
if(gradleTokenGroupName) {
replace gradleTokenGroupName, modGroup
}
}
clientIntellijRun {
args(arguments)
jvmArgs(jvmArguments)
if(developmentEnvironmentUserName) {
args("--username", developmentEnvironmentUserName)
}
}
serverIntellijRun {
args(arguments)
jvmArgs(jvmArguments)
}
}
if(file("addon.gradle").exists()) {
apply from: "addon.gradle"
}
apply from: 'repositories.gradle'
configurations {
implementation.extendsFrom(shadowImplementation) // TODO: remove after all uses are refactored
implementation.extendsFrom(shadowCompile)
implementation.extendsFrom(shadeCompile)
}
repositories {
maven {
name = "Overmind forge repo mirror"
url = "https://gregtech.overminddl1.com/"
}
if(usesMixins.toBoolean()) {
maven {
name = "sponge"
url = "https://repo.spongepowered.org/repository/maven-public"
}
maven {
url = "https://jitpack.io"
}
}
}
dependencies {
// you may put jars on which you depend on in ./libs
// or you may define them like so..
//compile "some.group:artifact:version:classifier"
//compile "some.group:artifact:version"
// real examples
//compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env
//compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env
if(usesMixins.toBoolean()) {
annotationProcessor("org.ow2.asm:asm-debug-all:5.0.3")
annotationProcessor("com.google.guava:guava:24.1.1-jre")
annotationProcessor("com.google.code.gson:gson:2.8.6")
annotationProcessor("org.spongepowered:mixin:0.8-SNAPSHOT")
// using 0.8 to workaround a issue in 0.7 which fails mixin application
compile("com.github.GTNewHorizons:SpongePoweredMixin:0.7.12-GTNH") {
// Mixin includes a lot of dependencies that are too up-to-date
exclude module: "launchwrapper"
exclude module: "guava"
exclude module: "gson"
exclude module: "commons-io"
exclude module: "log4j-core"
}
compile("com.github.GTNewHorizons:SpongeMixins:1.5.0")
}
}
// for more info...
// http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
// http://www.gradle.org/docs/current/userguide/dependency_management.html
apply from: 'dependencies.gradle'
def mixingConfigRefMap = "mixins." + modId + ".refmap.json"
def refMap = "${tasks.compileJava.temporaryDir}" + File.separator + mixingConfigRefMap
def mixinSrg = "${tasks.reobf.temporaryDir}" + File.separator + "mixins.srg"
task generateAssets {
if(usesMixins.toBoolean()) {
getFile("/src/main/resources/mixins." + modId + ".json").text = """{
"required": true,
"minVersion": "0.7.11",
"package": "${modGroup}.${mixinsPackage}",
"plugin": "${modGroup}.${mixinPlugin}",
"refmap": "${mixingConfigRefMap}",
"target": "@env(DEFAULT)",
"compatibilityLevel": "JAVA_8"
}
"""
}
}
task relocateShadowJar(type: ConfigureShadowRelocation) {
target = tasks.shadowJar
prefix = modGroup + ".shadow"
}
shadowJar {
project.configurations.shadeCompile.each { dep ->
from(project.zipTree(dep)) {
exclude 'META-INF', 'META-INF/**'
}
}
manifest {
attributes(getManifestAttributes())
}
minimize() // This will only allow shading for actually used classes
configurations = [project.configurations.shadowImplementation, project.configurations.shadowCompile]
dependsOn(relocateShadowJar)
}
jar {
project.configurations.shadeCompile.each { dep ->
from(project.zipTree(dep)) {
exclude 'META-INF', 'META-INF/**'
}
}
manifest {
attributes(getManifestAttributes())
}
if(usesShadowedDependencies.toBoolean()) {
dependsOn(shadowJar)
enabled = false
}
}
reobf {
if(usesMixins.toBoolean()) {
addExtraSrgFile mixinSrg
}
}
afterEvaluate {
if(usesMixins.toBoolean()) {
tasks.compileJava {
options.compilerArgs += [
"-AreobfSrgFile=${tasks.reobf.srg}",
"-AoutSrgFile=${mixinSrg}",
"-AoutRefMapFile=${refMap}",
// Elan: from what I understand they are just some linter configs so you get some warning on how to properly code
"-XDenableSunApiLintControl",
"-XDignore.symbol.file"
]
}
}
}
runClient {
if(developmentEnvironmentUserName) {
arguments += [
"--username",
developmentEnvironmentUserName
]
}
args(arguments)
jvmArgs(jvmArguments)
}
runServer {
args(arguments)
jvmArgs(jvmArguments)
}
tasks.withType(JavaExec).configureEach {
javaLauncher.set(
javaToolchains.launcherFor {
languageVersion = projectJavaVersion
}
)
}
processResources
@@ -56,24 +406,317 @@ processResources
// this will ensure that this task is redone when the versions change.
inputs.property "version", project.version
inputs.property "mcversion", project.minecraft.version
// replace stuff in mcmod.info, nothing else
from(sourceSets.main.resources.srcDirs) {
include 'mcmod.info'
// replace version and mcversion
expand 'version':project.version, 'mcversion':project.minecraft.version
// replace modVersion and minecraftVersion
expand "minecraftVersion": project.minecraft.version,
"modVersion": modVersion,
"modId": modId,
"modName": modName
}
// copy everything else, thats not the mcmod.info
if(usesMixins.toBoolean()) {
from refMap
}
// copy everything else that's not the mcmod.info
from(sourceSets.main.resources.srcDirs) {
exclude 'mcmod.info'
}
}
jar {
//rename the default output, for some better... sanity with scipts
archiveName = "${baseName} ${version}.${extension}"
def getManifestAttributes() {
def manifestAttributes = [:]
if(containsMixinsAndOrCoreModOnly.toBoolean() == false && (usesMixins.toBoolean() || coreModClass)) {
manifestAttributes += ["FMLCorePluginContainsFMLMod": true]
}
if(accessTransformersFile) {
manifestAttributes += ["FMLAT" : accessTransformersFile.toString()]
}
if(coreModClass) {
manifestAttributes += ["FMLCorePlugin": modGroup + "." + coreModClass]
}
if(usesMixins.toBoolean()) {
manifestAttributes += [
"TweakClass" : "org.spongepowered.asm.launch.MixinTweaker",
"MixinConfigs" : "mixins." + modId + ".json",
"ForceLoadAsMod" : containsMixinsAndOrCoreModOnly.toBoolean() == false
]
}
return manifestAttributes
}
defaultTasks 'build', 'sort' //remove clean if you want faster builds, this will stop rare inconsistancies.
task sourcesJar(type: Jar) {
from (sourceSets.main.allJava)
from (file("$projectDir/LICENSE"))
getArchiveClassifier().set('sources')
}
task shadowDevJar(type: ShadowJar) {
project.configurations.shadeCompile.each { dep ->
from(project.zipTree(dep)) {
exclude 'META-INF', 'META-INF/**'
}
}
from sourceSets.main.output
getArchiveClassifier().set("dev")
manifest {
attributes(getManifestAttributes())
}
minimize() // This will only allow shading for actually used classes
configurations = [project.configurations.shadowImplementation, project.configurations.shadowCompile]
}
task relocateShadowDevJar(type: ConfigureShadowRelocation) {
target = tasks.shadowDevJar
prefix = modGroup + ".shadow"
}
task circularResolverJar(type: Jar) {
dependsOn(relocateShadowDevJar)
dependsOn(shadowDevJar)
enabled = false
}
task devJar(type: Jar) {
project.configurations.shadeCompile.each { dep ->
from(project.zipTree(dep)) {
exclude 'META-INF', 'META-INF/**'
}
}
from sourceSets.main.output
getArchiveClassifier().set("dev")
manifest {
attributes(getManifestAttributes())
}
if(usesShadowedDependencies.toBoolean()) {
dependsOn(circularResolverJar)
enabled = false
}
}
task apiJar(type: Jar) {
from (sourceSets.main.allJava) {
include modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/") + '/**'
}
from (sourceSets.main.output) {
include modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/") + '/**'
}
from (sourceSets.main.resources.srcDirs) {
include("LICENSE")
}
getArchiveClassifier().set('api')
}
artifacts {
if(!noPublishedSources) {
archives sourcesJar
}
archives devJar
if(apiPackage) {
archives apiJar
}
}
// The gradle metadata includes all of the additional deps that we disabled from POM generation (including forgeBin with no groupID),
// and isn't strictly needed with the POM so just disable it.
tasks.withType(GenerateModuleMetadata) {
enabled = false
}
publishing {
publications {
maven(MavenPublication) {
from components.java
if(usesShadowedDependencies.toBoolean()) {
artifact source: shadowJar, classifier: ""
}
if(!noPublishedSources) {
artifact source: sourcesJar, classifier: "src"
}
artifact source: usesShadowedDependencies.toBoolean() ? shadowDevJar : devJar, classifier: "dev"
if (apiPackage) {
artifact source: apiJar, classifier: "api"
}
groupId = System.getenv("ARTIFACT_GROUP_ID") ?: "com.github.GTNewHorizons"
artifactId = System.getenv("ARTIFACT_ID") ?: project.name
// Using the identified version, not project.version as it has the prepended 1.7.10
version = System.getenv("RELEASE_VERSION") ?: identifiedVersion
// remove extra garbage from who knows where
pom.withXml {
def badPomGroup = ['net.minecraft', 'com.google.code.findbugs', 'org.ow2.asm', 'com.typesafe.akka', 'com.typesafe', 'org.scala-lang',
'org.scala-lang.plugins', 'net.sf.jopt-simple', 'lzma', 'com.mojang', 'org.apache.commons', 'org.apache.httpcomponents',
'commons-logging', 'java3d', 'net.sf.trove4j', 'com.ibm.icu', 'com.paulscode', 'io.netty', 'com.google.guava',
'commons-io', 'commons-codec', 'net.java.jinput', 'net.java.jutils', 'com.google.code.gson', 'org.apache.logging.log4j',
'org.lwjgl.lwjgl', 'tv.twitch', '']
Node pomNode = asNode()
pomNode.dependencies.'*'.findAll() {
badPomGroup.contains(it.groupId.text())
}.each() {
it.parent().remove(it)
}
}
}
}
repositories {
maven {
url = "http://jenkins.usrv.eu:8081/nexus/content/repositories/releases"
credentials {
username = System.getenv("MAVEN_USER") ?: "NONE"
password = System.getenv("MAVEN_PASSWORD") ?: "NONE"
}
}
}
}
// Updating
task updateBuildScript {
doLast {
if (performBuildScriptUpdate(projectDir.toString())) return
print("Build script already up-to-date!")
}
}
if (isNewBuildScriptVersionAvailable(projectDir.toString())) {
if (autoUpdateBuildScript.toBoolean()) {
performBuildScriptUpdate(projectDir.toString())
} else {
println("Build script update available! Run 'gradle updateBuildScript'")
}
}
static URL availableBuildScriptUrl() {
new URL("https://raw.githubusercontent.com/GTNewHorizons/ExampleMod1.7.10/main/build.gradle")
}
boolean performBuildScriptUpdate(String projectDir) {
if (isNewBuildScriptVersionAvailable(projectDir)) {
def buildscriptFile = getFile("build.gradle")
availableBuildScriptUrl().withInputStream { i -> buildscriptFile.withOutputStream { it << i } }
print("Build script updated. Please REIMPORT the project or RESTART your IDE!")
return true
}
return false
}
boolean isNewBuildScriptVersionAvailable(String projectDir) {
Map parameters = ["connectTimeout": 2000, "readTimeout": 2000]
String currentBuildScript = getFile("build.gradle").getText()
String currentBuildScriptHash = getVersionHash(currentBuildScript)
String availableBuildScript = availableBuildScriptUrl().newInputStream(parameters).getText()
String availableBuildScriptHash = getVersionHash(availableBuildScript)
boolean isUpToDate = currentBuildScriptHash.empty || availableBuildScriptHash.empty || currentBuildScriptHash == availableBuildScriptHash
return !isUpToDate
}
static String getVersionHash(String buildScriptContent) {
String versionLine = buildScriptContent.find("^//version: [a-z0-9]*")
if(versionLine != null) {
return versionLine.split(": ").last()
}
return ""
}
configure(updateBuildScript) {
group = 'forgegradle'
description = 'Updates the build script to the latest version'
}
// Deobfuscation
def deobf(String sourceURL) {
try {
URL url = new URL(sourceURL)
String fileName = url.getFile()
//get rid of directories:
int lastSlash = fileName.lastIndexOf("/")
if(lastSlash > 0) {
fileName = fileName.substring(lastSlash + 1)
}
//get rid of extension:
if(fileName.endsWith(".jar")) {
fileName = fileName.substring(0, fileName.lastIndexOf("."))
}
String hostName = url.getHost()
if(hostName.startsWith("www.")) {
hostName = hostName.substring(4)
}
List parts = Arrays.asList(hostName.split("\\."))
Collections.reverse(parts)
hostName = String.join(".", parts)
return deobf(sourceURL, hostName + "/" + fileName)
} catch(Exception e) {
return deobf(sourceURL, "deobf/" + String.valueOf(sourceURL.hashCode()))
}
}
// The method above is to be preferred. Use this method if the filename is not at the end of the URL.
def deobf(String sourceURL, String fileName) {
String cacheDir = System.getProperty("user.home") + "/.gradle/caches/"
String bon2Dir = cacheDir + "forge_gradle/deobf"
String bon2File = bon2Dir + "/BON2-2.5.0.jar"
String obfFile = cacheDir + "modules-2/files-2.1/" + fileName + ".jar"
String deobfFile = cacheDir + "modules-2/files-2.1/" + fileName + "-deobf.jar"
if(file(deobfFile).exists()) {
return files(deobfFile)
}
download.run {
src 'https://github.com/GTNewHorizons/BON2/releases/download/2.5.0/BON2-2.5.0.CUSTOM-all.jar'
dest bon2File
quiet true
overwrite false
}
download.run {
src sourceURL
dest obfFile
quiet true
overwrite false
}
exec {
commandLine 'java', '-jar', bon2File, '--inputJar', obfFile, '--outputJar', deobfFile, '--mcVer', '1.7.10', '--mappingsVer', 'stable_12', '--notch'
workingDir bon2Dir
standardOutput = new ByteArrayOutputStream()
}
return files(deobfFile)
}
// Helper methods
def checkPropertyExists(String propertyName) {
if (project.hasProperty(propertyName) == false) {
throw new GradleException("This project requires a property \"" + propertyName + "\"! Please add it your \"gradle.properties\". You can find all properties and their description here: https://github.com/GTNewHorizons/ExampleMod1.7.10/blob/main/gradle.properties")
}
}
def getFile(String relativePath) {
return new File(projectDir, relativePath)
}
+9
View File
@@ -0,0 +1,9 @@
// Add your dependencies here
dependencies {
compile('com.github.GTNewHorizons:Baubles:1.0.1.14:dev')
compile('thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev')
compileOnly('com.github.GTNewHorizons:GT5-Unofficial:5.09.40.33:dev') {transitive = false}
}
+64
View File
@@ -0,0 +1,64 @@
modName = ThaumicHorizons
# This is a case-sensitive string to identify your mod. Convention is to use lower case.
modId = ThaumicHorizons
modGroup = com.kentington.thaumichorizons
# 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
# 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
# Define a source file of your project with:
# 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 = ThaumicHorizons.java
gradleTokenModId =
gradleTokenModName =
gradleTokenVersion = GRADLETOKEN_VERSION
gradleTokenGroupName =
# 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/
# Example value: mymodid_at.cfg
accessTransformersFile =
# Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled!
usesMixins = 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 =
# 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 =
# 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
# If enabled, you may use 'shadowCompile' for dependencies. They will be integrated in your jar. It is your
# responsibility check the licence and request permission for distribution, if required.
usesShadowedDependencies = false
# 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 =
Binary file not shown.
+5
View File
@@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Vendored Regular → Executable
+77 -53
View File
@@ -1,4 +1,20 @@
#!/usr/bin/env bash
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
@@ -6,47 +22,6 @@
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
@@ -61,9 +36,49 @@ while [ -h "$PRG" ] ; do
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >&-
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >&-
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# 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
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -90,7 +105,7 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@@ -110,10 +125,11 @@ if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
@@ -154,11 +170,19 @@ if $cygwin ; then
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
APP_ARGS=$(save "$@")
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"
Vendored
+20 -10
View File
@@ -1,3 +1,19 @@
@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
@@ -8,14 +24,14 @@
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@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=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@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
@@ -46,10 +62,9 @@ echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
@@ -60,11 +75,6 @@ set _SKIP=2
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
+2
View File
@@ -0,0 +1,2 @@
before_install:
- ./gradlew setupCIWorkspace
Binary file not shown.
Binary file not shown.
+20
View File
@@ -0,0 +1,20 @@
// Add any additional repositories for your dependencies here
repositories {
maven {
name 'GTNH Maven'
url 'http://jenkins.usrv.eu:8081/nexus/content/groups/public/'
allowInsecureProtocol
}
maven {
name 'ic2'
url 'https://maven.ic2.player.to/'
metadataSources {
mavenPom()
artifact()
}
}
maven {
url 'https://jitpack.io'
}
}
@@ -5,6 +5,9 @@
package com.kentington.thaumichorizons.client;
import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.IReloadableResourceManager;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.resources.IResourceManagerReloadListener;
import net.minecraft.block.Block;
import thaumcraft.client.fx.ParticleEngine;
import thaumcraft.client.fx.particles.FXWisp;
@@ -143,6 +146,7 @@ import com.kentington.thaumichorizons.common.tiles.TileSoulBeacon;
import com.kentington.thaumichorizons.client.renderer.tile.TileBloodInfuserRender;
import com.kentington.thaumichorizons.common.tiles.TileBloodInfuser;
import com.kentington.thaumichorizons.client.renderer.tile.TileVatMatrixRender;
import com.kentington.thaumichorizons.client.fx.FXSonic;
import com.kentington.thaumichorizons.common.tiles.TileVatMatrix;
import com.kentington.thaumichorizons.client.renderer.tile.TileVatSlaveRender;
import com.kentington.thaumichorizons.common.tiles.TileVatSlave;
@@ -181,6 +185,15 @@ public class ClientProxy extends CommonProxy
@Override
public void registerHandlers() {
MinecraftForge.EVENT_BUS.register((Object)ThaumicHorizons.instance.renderEventHandler);
final IResourceManager resourceManager = Minecraft.getMinecraft().getResourceManager();
if (resourceManager instanceof IReloadableResourceManager) {
((IReloadableResourceManager) resourceManager).registerReloadListener(new IResourceManagerReloadListener() {
@Override
public void onResourceManagerReload(IResourceManager ignored) {
FXSonic.model = null;
}
});
}
}
@Override
@@ -19,7 +19,7 @@ public class FXSonic extends EntityFX
{
float yaw;
float pitch;
private IModelCustom model;
public static IModelCustom model;
private static final ResourceLocation MODEL;
public FXSonic(final World world, final double d, final double d1, final double d2, final int age, final int dir) {
@@ -146,43 +146,40 @@ public class GuiBloodInfuser extends GuiContainer
int k = 0;
if (this.bottomOut == 38 && this.mousedEffects != null) {
for (final Integer key : this.mousedEffects.keySet()) {
final Potion potion = Potion.potionTypes[key];
if (potion.hasStatusIcon()) {
this.mc.getTextureManager().bindTexture(GuiBloodInfuser.field_147001_a);
final int l = potion.getStatusIconIndex();
this.drawTexturedModalRect(j * 18 + 171, k * 18 + 72, 0 + l % 8 * 18, 198 + l / 8 * 18, 18, 18);
this.fontRendererObj.drawString("" + this.mousedEffects.get(key), j * 18 + 171, k * 18 + 72, Color.GRAY.getRGB());
GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
if (j == 0) {
j = 1;
}
else {
j = 0;
++k;
}
}
else {
this.mc.getTextureManager().bindTexture(new ResourceLocation("thaumichorizons", "textures/misc/potions.png"));
int ecks2 = 0;
final int why2 = 216;
if (potion.getId() == 23) {
ecks2 = 36;
}
else if (potion.getId() == Potion.heal.id) {
ecks2 = 0;
}
else if (potion.getId() == Potion.harm.id) {
ecks2 = 18;
}
this.drawTexturedModalRect(j * 18 + 171, k * 18 + 72, ecks2, why2, 18, 18);
this.fontRendererObj.drawString("" + this.mousedEffects.get(key), j * 18 + 171, k * 18 + 72, Color.GRAY.getRGB());
GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
if (j == 0) {
j = 1;
}
else {
j = 0;
++k;
if (key >=0) {
final Potion potion = Potion.potionTypes[key];
if (potion.hasStatusIcon()) {
this.mc.getTextureManager().bindTexture(GuiBloodInfuser.field_147001_a);
final int l = potion.getStatusIconIndex();
this.drawTexturedModalRect(j * 18 + 171, k * 18 + 72, 0 + l % 8 * 18, 198 + l / 8 * 18, 18, 18);
this.fontRendererObj.drawString("" + this.mousedEffects.get(key), j * 18 + 171, k * 18 + 72, Color.GRAY.getRGB());
GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
if (j == 0) {
j = 1;
} else {
j = 0;
++k;
}
} else {
this.mc.getTextureManager().bindTexture(new ResourceLocation("thaumichorizons", "textures/misc/potions.png"));
int ecks2 = 0;
final int why2 = 216;
if (potion.getId() == 23) {
ecks2 = 36;
} else if (potion.getId() == Potion.heal.id) {
ecks2 = 0;
} else if (potion.getId() == Potion.harm.id) {
ecks2 = 18;
}
this.drawTexturedModalRect(j * 18 + 171, k * 18 + 72, ecks2, why2, 18, 18);
this.fontRendererObj.drawString("" + this.mousedEffects.get(key), j * 18 + 171, k * 18 + 72, Color.GRAY.getRGB());
GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
if (j == 0) {
j = 1;
} else {
j = 0;
++k;
}
}
}
}
@@ -199,6 +196,8 @@ public class GuiBloodInfuser extends GuiContainer
if (this.topOut == 38) {
for (int index = 0; index < this.cachedEffects.tagCount(); ++index) {
final Byte id = this.cachedEffects.getCompoundTagAt(index).getByte("Id");
if (id < 0 || id >= Potion.potionTypes.length)
continue;
final Potion potion = Potion.potionTypes[id];
if (potion != null) {
this.mc.getTextureManager().bindTexture(GuiBloodInfuser.field_147001_a);
@@ -24,8 +24,8 @@ import org.lwjgl.input.Mouse;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.inventory.IInventory;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import com.kentington.thaumichorizons.common.lib.PacketLensChangeToServer;
import com.kentington.thaumichorizons.common.lib.PacketHandler;
import com.kentington.thaumichorizons.common.lib.networking.PacketLensChangeToServer;
import com.kentington.thaumichorizons.common.lib.networking.PacketHandler;
import org.lwjgl.opengl.Display;
import com.kentington.thaumichorizons.common.items.lenses.ItemLensCase;
import net.minecraft.entity.player.EntityPlayer;
@@ -168,14 +168,20 @@ public class ModelReceptacle extends ModelBase
this.Side3B.render(f5);
this.Side3C.render(f5);
this.Side3D.render(f5);
if (keystone) {
if (keystone && PocketPlaneData.planes.size() > plane) {
final Color col = new Color(PocketPlaneData.planes.get(plane).color);
GL11.glColor4f(col.getRed() / 255.0f, col.getGreen() / 255.0f, col.getBlue() / 255.0f, 1.0f);
this.Keystone.render(f5);
GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
renderKeystone(col.getRed() / 255.0f, col.getGreen() / 255.0f, col.getBlue() / 255.0f, f5);
} else if (keystone) {
renderKeystone(1f,1f,1f, f5);
}
}
private void renderKeystone(float r, float g, float b, float f5){
GL11.glColor4f(r, g, b, 1.0f);
this.Keystone.render(f5);
GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
}
private void setRotation(final ModelRenderer model, final float x, final float y, final float z) {
model.rotateAngleX = x;
model.rotateAngleY = y;
@@ -34,14 +34,14 @@ public class TileEtherealShardRender extends TileEntitySpecialRenderer
public void renderTileEntityAt(final TileEntity te, final double x, final double y, final double z, final float f) {
GL11.glPushMatrix();
final TileSyntheticNode tco = (TileSyntheticNode)te;
int red = 255;
int green = 255;
int blue = 255;
int numPoints = 0;
int numPointsFilled = 0;
long red = 255;
long green = 255;
long blue = 255;
long numPoints = 0;
long numPointsFilled = 0;
if (tco != null && tco.getAspectsBase() != null && tco.getAspects() != null && tco.getAspects().size() > 0 && tco.getAspectsBase().size() > 0) {
for (final Aspect asp : tco.getAspectsBase().getAspects()) {
final int amt = tco.getAspectsBase().getAmount(asp);
final long amt = tco.getAspectsBase().getAmount(asp);
final Color col = new Color(asp.getColor());
red += col.getRed() * amt;
green += col.getGreen() * amt;
@@ -52,67 +52,80 @@ public class TileEtherealShardRender extends TileEntitySpecialRenderer
red /= numPoints + 1;
green /= numPoints + 1;
blue /= numPoints + 1;
red = Math.min(255,Math.max(red, 0));
green = Math.min(255,Math.max(green, 0));
blue = Math.min(255,Math.max(blue, 0));
}
final Color col2 = new Color(red, green, blue);
UtilsFX.bindTexture("textures/models/crystal.png");
final Random rand = new Random(tco.getBlockMetadata() + tco.xCoord + tco.yCoord * tco.zCoord);
this.drawCrystal(0, (float)x, (float)y, (float)z, tco.rotation, 0.0f, rand, col2.getRGB(), 1.1f);
final long nt = System.nanoTime();
UtilsFX.bindTexture(TileEtherealShardRender.tx2);
final int frames = 32;
final int i = (int)((nt / 40000000L + x) % frames);
if (tco != null && tco.getAspectsBase() != null && tco.getAspects() != null && tco.getAspectsBase().size() > 0 && tco.getAspects().getAspects()[0] != null && tco.getAspectsBase().getAspects()[0] != null) {
final double offset = 6.283185307179586 / tco.getAspectsBase().size();
int which = 0;
GL11.glAlphaFunc(516, 0.003921569f);
GL11.glDepthMask(false);
for (final Aspect asp2 : tco.getAspectsBase().getAspects()) {
if (asp2 == null) {
break;
try {
final Color col2 = new Color((int)red, (int)green, (int)blue);
UtilsFX.bindTexture("textures/models/crystal.png");
final Random rand = new Random(tco.getBlockMetadata() + tco.xCoord + tco.yCoord * tco.zCoord);
this.drawCrystal(0, (float) x, (float) y, (float) z, tco.rotation, 0.0f, rand, col2.getRGB(), 1.1f);
final long nt = System.nanoTime();
UtilsFX.bindTexture(TileEtherealShardRender.tx2);
final int frames = 32;
final int i = (int) ((nt / 40000000L + x) % frames);
if (tco != null && tco.getAspectsBase() != null && tco.getAspects() != null && tco.getAspectsBase().size() > 0 && tco.getAspects().getAspects()[0] != null && tco.getAspectsBase().getAspects()[0] != null) {
final double offset = 6.283185307179586 / tco.getAspectsBase().size();
int which = 0;
GL11.glAlphaFunc(516, 0.003921569f);
GL11.glDepthMask(false);
for (final Aspect asp2 : tco.getAspectsBase().getAspects()) {
if (asp2 == null) {
break;
}
final Color colo = new Color(asp2.getColor());
GL11.glPushMatrix();
GL11.glEnable(3042);
GL11.glBlendFunc(770, 771);
final double radian = Math.toRadians(tco.rotation);
final double dist = 0.4 + 0.1 * Math.cos(radian);
UtilsFX.renderFacingStrip(tco.xCoord + 0.5 + dist * Math.sin(2.0 * radian + offset * which), tco.yCoord + 0.64 + 0.10000000149011612 * Math.sin(Math.toRadians(tco.rotation)), tco.zCoord + 0.5 + dist * Math.cos(2.0 * radian + offset * which), 0.0f, 0.1f + 0.005f * tco.getAspects().getAmount(asp2), 0.9f, frames, 1, (int) tco.rotation % frames, f, colo.getRGB());
GL11.glDisable(3042);
GL11.glPopMatrix();
++which;
}
final Color colo = new Color(asp2.getColor());
GL11.glPushMatrix();
GL11.glEnable(3042);
GL11.glBlendFunc(770, 771);
final double radian = Math.toRadians(tco.rotation);
final double dist = 0.4 + 0.1 * Math.cos(radian);
UtilsFX.renderFacingStrip(tco.xCoord + 0.5 + dist * Math.sin(2.0 * radian + offset * which), tco.yCoord + 0.64 + 0.10000000149011612 * Math.sin(Math.toRadians(tco.rotation)), tco.zCoord + 0.5 + dist * Math.cos(2.0 * radian + offset * which), 0.0f, 0.1f + 0.005f * tco.getAspects().getAmount(asp2), 0.9f, frames, 1, (int)tco.rotation % frames, f, colo.getRGB());
GL11.glDisable(3042);
GL11.glPopMatrix();
++which;
GL11.glDepthMask(true);
GL11.glAlphaFunc(516, 0.1f);
}
GL11.glDepthMask(true);
if (tco != null && tco.drainEntity != null && tco.drainCollision != null) {
final Entity drainEntity = tco.drainEntity;
if (drainEntity instanceof EntityPlayer && !((EntityPlayer) drainEntity).isUsingItem()) {
tco.drainEntity = null;
tco.drainCollision = null;
return;
}
final MovingObjectPosition drainCollision = tco.drainCollision;
GL11.glPushMatrix();
float f2 = 0.0f;
final int iiud = ((EntityPlayer) drainEntity).getItemInUseDuration();
if (drainEntity instanceof EntityPlayer) {
f2 = MathHelper.sin(iiud / 10.0f) * 10.0f;
}
final Vec3 vec3 = Vec3.createVectorHelper(-0.1, -0.1, 0.5);
vec3.rotateAroundX(-(drainEntity.prevRotationPitch + (drainEntity.rotationPitch - drainEntity.prevRotationPitch) * f) * 3.141593f / 180.0f);
vec3.rotateAroundY(-(drainEntity.prevRotationYaw + (drainEntity.rotationYaw - drainEntity.prevRotationYaw) * f) * 3.141593f / 180.0f);
vec3.rotateAroundY(-f2 * 0.01f);
vec3.rotateAroundX(-f2 * 0.015f);
final double d3 = drainEntity.prevPosX + (drainEntity.posX - drainEntity.prevPosX) * f + vec3.xCoord;
final double d4 = drainEntity.prevPosY + (drainEntity.posY - drainEntity.prevPosY) * f + vec3.yCoord;
final double d5 = drainEntity.prevPosZ + (drainEntity.posZ - drainEntity.prevPosZ) * f + vec3.zCoord;
final double d6 = (drainEntity == Minecraft.getMinecraft().thePlayer) ? 0.0 : drainEntity.getEyeHeight();
UtilsFX.drawFloatyLine(d3, d4 + d6, d5, drainCollision.blockX + 0.5, drainCollision.blockY + 0.5, drainCollision.blockZ + 0.5, f, tco.color.getRGB(), "textures/misc/wispy.png", -0.02f, Math.min(iiud, 10) / 10.0f);
GL11.glPopMatrix();
}
GL11.glDisable(3042);
GL11.glAlphaFunc(516, 0.1f);
}
if (tco != null && tco.drainEntity != null && tco.drainCollision != null) {
final Entity drainEntity = tco.drainEntity;
if (drainEntity instanceof EntityPlayer && !((EntityPlayer)drainEntity).isUsingItem()) {
tco.drainEntity = null;
tco.drainCollision = null;
return;
}
final MovingObjectPosition drainCollision = tco.drainCollision;
GL11.glPushMatrix();
float f2 = 0.0f;
final int iiud = ((EntityPlayer)drainEntity).getItemInUseDuration();
if (drainEntity instanceof EntityPlayer) {
f2 = MathHelper.sin(iiud / 10.0f) * 10.0f;
}
final Vec3 vec3 = Vec3.createVectorHelper(-0.1, -0.1, 0.5);
vec3.rotateAroundX(-(drainEntity.prevRotationPitch + (drainEntity.rotationPitch - drainEntity.prevRotationPitch) * f) * 3.141593f / 180.0f);
vec3.rotateAroundY(-(drainEntity.prevRotationYaw + (drainEntity.rotationYaw - drainEntity.prevRotationYaw) * f) * 3.141593f / 180.0f);
vec3.rotateAroundY(-f2 * 0.01f);
vec3.rotateAroundX(-f2 * 0.015f);
final double d3 = drainEntity.prevPosX + (drainEntity.posX - drainEntity.prevPosX) * f + vec3.xCoord;
final double d4 = drainEntity.prevPosY + (drainEntity.posY - drainEntity.prevPosY) * f + vec3.yCoord;
final double d5 = drainEntity.prevPosZ + (drainEntity.posZ - drainEntity.prevPosZ) * f + vec3.zCoord;
final double d6 = (drainEntity == Minecraft.getMinecraft().thePlayer) ? 0.0 : drainEntity.getEyeHeight();
UtilsFX.drawFloatyLine(d3, d4 + d6, d5, drainCollision.blockX + 0.5, drainCollision.blockY + 0.5, drainCollision.blockZ + 0.5, f, tco.color.getRGB(), "textures/misc/wispy.png", -0.02f, Math.min(iiud, 10) / 10.0f);
catch (Exception e)
{
System.out.println(e.getMessage());
}
finally
{
GL11.glPopMatrix();
}
GL11.glDisable(3042);
GL11.glAlphaFunc(516, 0.1f);
GL11.glPopMatrix();
}
private void drawCrystal(final int ori, final float x, final float y, final float z, final float a1, final float a2, final Random rand, final int color, final float size) {
@@ -6,7 +6,6 @@
package com.kentington.thaumichorizons.common;
import com.kentington.thaumichorizons.client.lib.RenderEventHandler;
import com.kentington.thaumichorizons.common.CommonProxy;
import com.kentington.thaumichorizons.common.blocks.BlockAlchemite;
import com.kentington.thaumichorizons.common.blocks.BlockBloodInfuser;
import com.kentington.thaumichorizons.common.blocks.BlockBone;
@@ -131,7 +130,7 @@ import com.kentington.thaumichorizons.common.lib.CreativeTabTH;
import com.kentington.thaumichorizons.common.lib.CreatureInfusionRecipe;
import com.kentington.thaumichorizons.common.lib.EventHandlerEntity;
import com.kentington.thaumichorizons.common.lib.EventHandlerWorld;
import com.kentington.thaumichorizons.common.lib.PacketHandler;
import com.kentington.thaumichorizons.common.lib.networking.PacketHandler;
import com.kentington.thaumichorizons.common.lib.SelfInfusionRecipe;
import com.kentington.thaumichorizons.common.lib.WorldProviderPocketPlane;
import com.kentington.thaumichorizons.common.lib.potion.PotionShock;
@@ -163,6 +162,7 @@ import com.kentington.thaumichorizons.common.tiles.TileVortex;
import com.kentington.thaumichorizons.common.tiles.TileVortexStabilizer;
import cpw.mods.fml.client.event.ConfigChangedEvent.OnConfigChangedEvent;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.Mod.EventHandler;
@@ -173,16 +173,18 @@ import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.common.registry.ExistingSubstitutionException;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.GameRegistry.Type;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import gregtech.api.enums.Materials;
import gregtech.api.enums.OrePrefixes;
import gregtech.api.util.GT_OreDictUnificator;
import net.minecraft.block.Block;
import net.minecraft.block.material.MapColor;
import net.minecraft.block.material.Material;
@@ -212,12 +214,10 @@ import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.ShapelessRecipes;
import net.minecraft.launchwrapper.LaunchClassLoader;
import net.minecraft.nbt.NBTTagByte;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.potion.Potion;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.config.Configuration;
@@ -250,18 +250,18 @@ import thaumcraft.common.entities.monster.EntityPech;
import thaumcraft.common.entities.monster.EntityWisp;
import thaumcraft.common.lib.utils.Utils;
import javax.xml.transform.Transformer;
@Mod(
modid = "ThaumicHorizons",
name = "ThaumicHorizons",
version = "1.1.9.7",
dependencies = "required-after:Forge@[10.13.2,);required-after:Thaumcraft@[4.2.3.4,)",
modid = ThaumicHorizons.MODID,
name = ThaumicHorizons.MODID,
version = ThaumicHorizons.VERSION,
dependencies = "required-after:Forge@[10.13.2,);" +
"required-after:Thaumcraft@[4.2.3.4,)",
guiFactory = "com.kentington.thaumichorizons.common.lib.THGuiFactory"
)
public class ThaumicHorizons {
public static final String MODID = "ThaumicHorizons";
public static final String VERSION = "1.1.9.7";
public static final String VERSION = "GRADLETOKEN_VERSION";
@Instance("ThaumicHorizons")
public static ThaumicHorizons instance;
@SidedProxy(
@@ -481,6 +481,7 @@ public class ThaumicHorizons {
PacketHandler.init();
MinecraftForge.EVENT_BUS.register(this.eventHandlerEntity);
MinecraftForge.EVENT_BUS.register(this.eventHandlerWorld);
FMLCommonHandler.instance().bus().register(this.eventHandlerEntity);
FMLCommonHandler.instance().bus().register(this.renderEventHandler);
DimensionManager.registerProviderType(providerID, WorldProviderPocketPlane.class, true);
DimensionManager.registerDimension(dimensionPocketId, providerID);
@@ -793,8 +794,7 @@ public class ThaumicHorizons {
ResearchCategories.addResearch(alcheponics);
}
recipeAlcheponicsWheat = ThaumcraftApi.addCrucibleRecipe("alcheponics", new ItemStack(Items.wheat, 2), new ItemStack(Items.wheat_seeds), (new AspectList()).add(Aspect.LIGHT, 2).add(Aspect.EARTH, 2).add(Aspect.WATER, 2));
recipeAlcheponicsCarrot = ThaumcraftApi.addCrucibleRecipe("alcheponics", new ItemStack(Items.carrot, 2), new ItemStack(Items.carrot), (new AspectList()).add(Aspect.LIGHT, 2).add(Aspect.EARTH, 2).add(Aspect.WATER, 2));
recipeAlcheponicsWheat = ThaumcraftApi.addCrucibleRecipe("alcheponics", new ItemStack(Items.wheat, 2), new ItemStack(Items.wheat_seeds), (new AspectList()).add(Aspect.LIGHT, 2).add(Aspect.EARTH, 2).add(Aspect.WATER, 2));recipeAlcheponicsCarrot = ThaumcraftApi.addCrucibleRecipe("alcheponics", new ItemStack(Items.carrot, 2), new ItemStack(Items.carrot), (new AspectList()).add(Aspect.LIGHT, 2).add(Aspect.EARTH, 2).add(Aspect.WATER, 2));
recipeAlcheponicsPotato = ThaumcraftApi.addCrucibleRecipe("alcheponics", new ItemStack(Items.potato, 2), new ItemStack(Items.potato), (new AspectList()).add(Aspect.LIGHT, 2).add(Aspect.EARTH, 2).add(Aspect.WATER, 2));
recipeAlcheponicsMelon = ThaumcraftApi.addCrucibleRecipe("alcheponics", new ItemStack(Blocks.melon_block, 1), new ItemStack(Items.melon_seeds), (new AspectList()).add(Aspect.LIGHT, 3).add(Aspect.EARTH, 3).add(Aspect.WATER, 3));
recipeAlcheponicsPumpkin = ThaumcraftApi.addCrucibleRecipe("alcheponics", new ItemStack(Blocks.pumpkin, 1), new ItemStack(Items.pumpkin_seeds), (new AspectList()).add(Aspect.LIGHT, 3).add(Aspect.EARTH, 3).add(Aspect.WATER, 3));
@@ -1232,51 +1232,54 @@ public class ThaumicHorizons {
ResearchPage infusion12;
ResearchPage infusion13b;
if(enablePocket) {
ResearchItem dummyTag = new ResearchItem("pocketPlane", "ThaumicHorizons", (new AspectList()).add(Aspect.VOID, 6).add(Aspect.CRAFT, 6).add(Aspect.AURA, 6).add(Aspect.MECHANISM, 6).add(Aspect.ELDRITCH, 6), 18, 8, 3, new ResourceLocation("thaumichorizons", "textures/misc/pocketplane.png"));
recipeKeystone = ThaumcraftApi.addInfusionCraftingRecipe("pocketPlane", new ItemStack(itemKeystone), 6, (new AspectList()).add(Aspect.TRAVEL, 32).add(Aspect.VOID, 32).add(Aspect.EXCHANGE, 16), new ItemStack(itemPlanarConduit), new ItemStack[]{new ItemStack(Items.quartz), new ItemStack(ConfigItems.itemShard, 1, 6), new ItemStack(Items.quartz), new ItemStack(ConfigItems.itemShard, 1, 6), new ItemStack(Items.quartz), new ItemStack(ConfigItems.itemShard, 1, 6), new ItemStack(Items.quartz), new ItemStack(ConfigItems.itemShard, 1, 6)});
ResearchPage dummyStack = new ResearchPage("pocketPlane1");
ResearchPage dummyInputStack = new ResearchPage("pocketPlane2");
ResearchPage generalInfusion = new ResearchPage("pocketPlane3");
infusion1 = new ResearchPage(recipeKeystone);
dummyTag.setPages(new ResearchPage[]{dummyStack, dummyInputStack, generalInfusion, infusion1});
dummyTag.setParents(new String[]{"planarRift", "PRIMPEARL"});
dummyTag.setConcealed();
ResearchCategories.addResearch(dummyTag);
ResearchItem infusion2 = new ResearchItem("planarClouds", "ThaumicHorizons", new AspectList(), 20, 6, 1, new ItemStack(blockCloud));
infusion3 = new ResearchPage("planarClouds1");
infusion4 = new ResearchPage("planarClouds2");
infusion5 = new ResearchPage("planarClouds3");
infusion2.setPages(new ResearchPage[]{infusion3, infusion4, infusion5});
infusion2.setItemTriggers(new ItemStack[]{new ItemStack(blockCloud, 1, 32767), new ItemStack(blockCloudGlowing, 1, 32767)});
infusion2.setLost();
infusion2.setRound();
infusion2.setParents(new String[]{"pocketPlane"});
ResearchCategories.addResearch(infusion2);
ResearchItem infusion6 = new ResearchItem("leviathan", "ThaumicHorizons", new AspectList(), 20, 10, 1, new ItemStack(blockLeviathan));
infusion7 = new ResearchPage("leviathan1");
infusion8 = new ResearchPage("leviathan2");
infusion6.setPages(new ResearchPage[]{infusion7, infusion8});
infusion6.setItemTriggers(new ItemStack[]{new ItemStack(blockLeviathan)});
infusion6.setLost();
infusion6.setRound();
infusion6.setParents(new String[]{"pocketPlane"});
ResearchCategories.addResearch(infusion6);
ResearchItem infusion9 = new ResearchItem("planarKeystone", "ThaumicHorizons", (new AspectList()).add(Aspect.TRAVEL, 4).add(Aspect.VOID, 4).add(Aspect.ELDRITCH, 2), 20, 8, 2, new ItemStack(blockSlot));
infusion10 = new ResearchPage("planarKeystone1");
recipeKeystone = ThaumcraftApi.addInfusionCraftingRecipe("planarKeystone", new ItemStack(itemKeystone), 6, (new AspectList()).add(Aspect.TRAVEL, 24).add(Aspect.VOID, 24).add(Aspect.ELDRITCH, 12), new ItemStack(Items.diamond), new ItemStack[]{new ItemStack(ConfigItems.itemResource, 1, 3), new ItemStack(ConfigItems.itemShard, 1, 6), new ItemStack(ConfigItems.itemResource, 1, 3), new ItemStack(ConfigItems.itemShard, 1, 6)});
infusion11 = new ResearchPage(recipeKeystone);
infusion12 = new ResearchPage("planarKeystone2");
recipeSlot = ThaumcraftApi.addInfusionCraftingRecipe("planarKeystone", new ItemStack(blockSlot), 8, (new AspectList()).add(Aspect.VOID, 32).add(Aspect.TRAVEL, 24).add(Aspect.MECHANISM, 24).add(Aspect.ELDRITCH, 24), new ItemStack(itemPlanarConduit), new ItemStack[]{new ItemStack(Items.gold_ingot), new ItemStack(ConfigItems.itemResource, 1, 16), new ItemStack(Items.gold_ingot), new ItemStack(ConfigItems.itemResource, 1, 16), new ItemStack(Items.gold_ingot), new ItemStack(ConfigItems.itemResource, 1, 16), new ItemStack(Items.gold_ingot), new ItemStack(ConfigItems.itemResource, 1, 16)});
ResearchPage instilledLoyalty = new ResearchPage(recipeSlot);
ItemStack infusion13 = new ItemStack(ConfigBlocks.blockHole, 1, 15);
ConfigResearch.recipes.put("PlanarGateway", Arrays.asList(new Object[]{(new AspectList()).add(Aspect.ENTROPY, 50).add(Aspect.ORDER, 50), Integer.valueOf(5), Integer.valueOf(5), Integer.valueOf(1), Arrays.asList(new Object[]{new ItemStack(Blocks.lapis_block), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 6), new ItemStack(blockSlot), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 6), new ItemStack(Blocks.lapis_block), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 6), infusion13, infusion13, infusion13, new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 6), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 6), infusion13, infusion13, infusion13, new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 6), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 6), infusion13, infusion13, infusion13, new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 6), new ItemStack(Blocks.lapis_block), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 6), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 6), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 6), new ItemStack(Blocks.lapis_block)})}));
infusion13b = new ResearchPage((List)ConfigResearch.recipes.get("PlanarGateway"));
infusion9.setPages(new ResearchPage[]{infusion10, infusion11, infusion12, instilledLoyalty, infusion13b});
infusion9.setParents(new String[]{"pocketPlane"});
infusion9.setConcealed();
ResearchCategories.addResearch(infusion9);
if (Loader.isModLoaded("gregtech")) {
ThaumcraftApi.addWarpToResearch("pocketPlane", 4);
ResearchItem dummyTag = new ResearchItem("pocketPlane", "ThaumicHorizons", (new AspectList()).add(Aspect.TRAVEL, 24).add(Aspect.VOID, 21).add(Aspect.CRAFT, 18).add(Aspect.AURA, 15).add(Aspect.MECHANISM, 12).add(Aspect.ELDRITCH, 6).add(Aspect.MECHANISM, 9).add(Aspect.MAGIC, 6).add(Aspect.MIND, 3), 18, 8, 4, new ResourceLocation("thaumichorizons", "textures/misc/pocketplane.png"));
recipeKeystone = ThaumcraftApi.addInfusionCraftingRecipe("pocketPlane", new ItemStack(itemKeystone), 12, (new AspectList()).add(Aspect.TRAVEL, 128).add(Aspect.VOID, 64).add(Aspect.EXCHANGE, 48).add(Aspect.AURA, 32).add(Aspect.MIND, 16).add(Aspect.ELDRITCH, 64), new ItemStack(itemPlanarConduit), new ItemStack[]{new ItemStack(ConfigItems.itemShard, 1, 6), GT_OreDictUnificator.get(OrePrefixes.gemExquisite, Materials.Glass, 1L), GT_OreDictUnificator.get(OrePrefixes.lens, Materials.InfusedOrder, 1L), new ItemStack(ConfigItems.itemShard, 1, 6), GT_OreDictUnificator.get(OrePrefixes.gemExquisite, Materials.Glass, 1L), GT_OreDictUnificator.get(OrePrefixes.lens, Materials.InfusedOrder, 1L), new ItemStack(ConfigItems.itemShard, 1, 6), GT_OreDictUnificator.get(OrePrefixes.gemExquisite, Materials.Glass, 1L), GT_OreDictUnificator.get(OrePrefixes.lens, Materials.InfusedOrder, 1L), new ItemStack(ConfigItems.itemShard, 1, 6), GT_OreDictUnificator.get(OrePrefixes.gemExquisite, Materials.Glass, 1L), GT_OreDictUnificator.get(OrePrefixes.lens, Materials.InfusedOrder, 1L)});
ResearchPage dummyStack = new ResearchPage("pocketPlane1");
ResearchPage dummyInputStack = new ResearchPage("pocketPlane2");
ResearchPage generalInfusion = new ResearchPage("pocketPlane3");
infusion1 = new ResearchPage(recipeKeystone);
dummyTag.setPages(new ResearchPage[]{dummyStack, dummyInputStack, generalInfusion, infusion1});
dummyTag.setParents(new String[]{"planarRift", "PRIMPEARL"});
dummyTag.setConcealed();
ResearchCategories.addResearch(dummyTag);
ResearchItem infusion2 = new ResearchItem("planarClouds", "ThaumicHorizons", new AspectList(), 20, 6, 1, new ItemStack(blockCloud));
infusion3 = new ResearchPage("planarClouds1");
infusion4 = new ResearchPage("planarClouds2");
infusion5 = new ResearchPage("planarClouds3");
infusion2.setPages(new ResearchPage[]{infusion3, infusion4, infusion5});
infusion2.setItemTriggers(new ItemStack[]{new ItemStack(blockCloud, 1, 32767), new ItemStack(blockCloudGlowing, 1, 32767)});
infusion2.setLost();
infusion2.setRound();
infusion2.setParents(new String[]{"pocketPlane"});
ResearchCategories.addResearch(infusion2);
ResearchItem infusion6 = new ResearchItem("leviathan", "ThaumicHorizons", new AspectList(), 20, 10, 1, new ItemStack(blockLeviathan));
infusion7 = new ResearchPage("leviathan1");
infusion8 = new ResearchPage("leviathan2");
infusion6.setPages(new ResearchPage[]{infusion7, infusion8});
infusion6.setItemTriggers(new ItemStack[]{new ItemStack(blockLeviathan)});
infusion6.setLost();
infusion6.setRound();
infusion6.setParents(new String[]{"pocketPlane"});
ResearchCategories.addResearch(infusion6);
ThaumcraftApi.addWarpToResearch("planarKeystone", 5);
ResearchItem infusion9 = new ResearchItem("planarKeystone", "ThaumicHorizons", (new AspectList()).add(Aspect.TRAVEL, 15).add(Aspect.VOID, 12).add(Aspect.AURA, 9).add(Aspect.ELDRITCH, 6).add(Aspect.MAGIC, 3), 20, 8, 4, new ItemStack(blockSlot));
infusion10 = new ResearchPage("planarKeystone1");
recipeKeystone = ThaumcraftApi.addInfusionCraftingRecipe("planarKeystone", new ItemStack(itemKeystone), 9, (new AspectList()).add(Aspect.TRAVEL, 64).add(Aspect.VOID, 48).add(Aspect.MECHANISM, 32).add(Aspect.ELDRITCH, 32), new ItemStack(Items.ender_eye), new ItemStack[]{new ItemStack(ConfigItems.itemShard, 1, 6), new ItemStack(ConfigItems.itemResource, 1, 3), GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Glass, 1L), new ItemStack(ConfigItems.itemResource, 1, 3), new ItemStack(ConfigItems.itemShard, 1, 6), new ItemStack(ConfigItems.itemResource, 1, 3), GT_OreDictUnificator.get(OrePrefixes.lens, Materials.Glass, 1L), new ItemStack(ConfigItems.itemResource, 1, 3)});
infusion11 = new ResearchPage(recipeKeystone);
infusion12 = new ResearchPage("planarKeystone2");
recipeSlot = ThaumcraftApi.addInfusionCraftingRecipe("planarKeystone", new ItemStack(blockSlot), 12, (new AspectList()).add(Aspect.VOID, 48).add(Aspect.TRAVEL, 64).add(Aspect.AIR, 64).add(Aspect.MECHANISM, 32).add(Aspect.ELDRITCH, 64).add(Aspect.MAGIC, 16), new ItemStack(itemPlanarConduit), new ItemStack[]{GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Void, 1L), GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 1L), GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Enderium, 1L), GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Void, 1L), GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.InfusedGold, 1L), GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 1L), GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Void, 1L), GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 1L), GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.InfusedGold, 1L), GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Void, 1L), GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Enderium, 1L), GT_OreDictUnificator.get(OrePrefixes.screw, Materials.Titanium, 1L)});
ResearchPage instilledLoyalty = new ResearchPage(recipeSlot);
ItemStack infusion13 = new ItemStack(ConfigBlocks.blockHole, 1, 15);
ConfigResearch.recipes.put("PlanarGateway", Arrays.asList(new Object[]{(new AspectList()).add(Aspect.AIR, 250).add(Aspect.FIRE, 250).add(Aspect.WATER, 250).add(Aspect.EARTH, 250).add(Aspect.ENTROPY, 250).add(Aspect.ORDER, 250), Integer.valueOf(5), Integer.valueOf(5), Integer.valueOf(1), Arrays.asList(new Object[]{new ItemStack(ConfigBlocks.blockMetalDevice, 1, 3), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 11), new ItemStack(blockSlot), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 11), new ItemStack(ConfigBlocks.blockMetalDevice, 1, 3), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 11), infusion13, infusion13, infusion13, new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 11), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 11), infusion13, infusion13, infusion13, new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 11), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 11), infusion13, infusion13, infusion13, new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 11), new ItemStack(ConfigBlocks.blockMetalDevice, 1, 3), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 11), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 11), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 11), new ItemStack(ConfigBlocks.blockMetalDevice, 1, 3)})}));
infusion13b = new ResearchPage((List) ConfigResearch.recipes.get("PlanarGateway"));
infusion9.setPages(new ResearchPage[]{infusion10, infusion11, infusion12, instilledLoyalty, infusion13b});
infusion9.setParents(new String[]{"pocketPlane"});
infusion9.setConcealed();
ResearchCategories.addResearch(infusion9);
}
}
ResearchItem generalInfusion1 = new ResearchItem("generalInfusion", "ThaumicHorizons", (new AspectList()).add(Aspect.BEAST, 1), 12, -3, 1, new ItemStack(itemInfusionCheat, 1, 5));
infusion1 = new ResearchPage("generalInfusion1");
ItemStack dummyStack1 = new ItemStack(itemInfusionCheat, 1, 1);
@@ -1611,14 +1614,14 @@ public class ThaumicHorizons {
amphibious.setConcealed();
amphibious.setPages(amphibious1, amphibious2);
ResearchCategories.addResearch(amphibious);
ResearchItem warpedTumor = new ResearchItem("warpedTumor", "ThaumicHorizons", (new AspectList()).add(Aspect.MAN, 3).add(Aspect.TAINT, 3).add(Aspect.ELDRITCH, 3).add(Aspect.FLESH, 3), 19, 4, 2, new ResourceLocation("thaumichorizons", "textures/items/warpedtumor.png"));
ResearchItem warpedTumor = new ResearchItem("warpedTumor", "ThaumicHorizons", (new AspectList()).add(Aspect.MAN, 15).add(Aspect.TAINT, 12).add(Aspect.ELDRITCH, 9).add(Aspect.FLESH, 6).add(Aspect.EXCHANGE, 3), 19, 4, 3, new ResourceLocation("thaumichorizons", "textures/items/warpedtumor.png"));
ResearchPage warpedTumor1 = new ResearchPage("warpedTumor1");
dummyTag1 = new NBTTagCompound();
dummyTag1.setString("infName", "selfInfusions.warpedTumor");
dummyStack1 = new ItemStack(itemDummy, 1, 15);
dummyStack1.setTagCompound(dummyTag1);
dummyInputStack1 = new ItemStack(itemDummy, 1, 15);
ResearchPage warpedTumor2 = new ResearchPage(new InfusionRecipe("warpedTumor", dummyStack1, 9, (new AspectList()).add(Aspect.TAINT, 32).add(Aspect.ELDRITCH, 32).add(Aspect.TRAP, 32).add(Aspect.FLESH, 32), dummyInputStack1, new ItemStack[]{new ItemStack(ConfigBlocks.blockTaint, 1, 2), new ItemStack(ConfigItems.itemResource, 1, 17), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 0), new ItemStack(ConfigItems.itemResource, 1, 17)}));
ResearchPage warpedTumor2 = new ResearchPage(new InfusionRecipe("warpedTumor", dummyStack1, 12, (new AspectList()).add(Aspect.TAINT, 64).add(Aspect.ELDRITCH, 48).add(Aspect.TRAP, 32).add(Aspect.FLESH, 24).add(Aspect.EXCHANGE, 16), dummyInputStack1, new ItemStack[]{new ItemStack(ConfigBlocks.blockTaint, 1, 2), new ItemStack(ConfigItems.itemSanitySoap, 1, 0), new ItemStack(Items.nether_star, 1, 0), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 0), new ItemStack(Items.nether_star, 1, 0), new ItemStack(ConfigItems.itemBathSalts, 1, 0)}));
warpedTumor.setParents("humanInfusion");
warpedTumor.setConcealed();
warpedTumor.setPages(warpedTumor1, warpedTumor2);
@@ -1721,9 +1724,10 @@ public class ThaumicHorizons {
selfRecipes.add(new SelfInfusionRecipe("silverHeart", 7, (new AspectList()).add(Aspect.ORDER, 32).add(Aspect.HEAL, 32).add(Aspect.EXCHANGE, 16), new ItemStack[]{new ItemStack(ConfigBlocks.blockCustomPlant, 1, 1), new ItemStack(ConfigBlocks.blockMagicalLog, 1, 1), new ItemStack(ConfigBlocks.blockCustomPlant, 1, 2), new ItemStack(ConfigBlocks.blockMagicalLog, 1, 1)}, 5));
selfRecipes.add(new SelfInfusionRecipe("synthSkin", 6, (new AspectList()).add(Aspect.PLANT, 32).add(Aspect.HUNGER, 32).add(Aspect.LIGHT, 32).add(Aspect.MAN, 16), new ItemStack[]{new ItemStack(Blocks.leaves, 1, 32767), new ItemStack(Blocks.sapling, 1, 32767), new ItemStack(Blocks.red_flower, 1, 32767), new ItemStack(Blocks.vine)}, 6));
selfRecipes.add(new SelfInfusionRecipe("amphibious", 7, (new AspectList()).add(Aspect.WATER, 64).add(Aspect.AIR, 64).add(Aspect.LIFE, 32).add(Aspect.EXCHANGE, 16), new ItemStack[]{new ItemStack(Items.fish, 1, 32767), new ItemStack(Items.potionitem, 1, 8269), new ItemStack(Items.fish, 1, 32767), new ItemStack(Items.potionitem, 1, 8269)}, 7));
selfRecipes.add(new SelfInfusionRecipe("warpedTumor", 9, (new AspectList()).add(Aspect.TAINT, 32).add(Aspect.ELDRITCH, 32).add(Aspect.TRAP, 32).add(Aspect.FLESH, 32), new ItemStack[]{new ItemStack(ConfigBlocks.blockTaint, 1, 2), new ItemStack(ConfigItems.itemResource, 1, 17), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 0), new ItemStack(ConfigItems.itemResource, 1, 17)}, 8));
selfRecipes.add(new SelfInfusionRecipe("warpedTumor", 12, (new AspectList()).add(Aspect.TAINT, 64).add(Aspect.ELDRITCH, 48).add(Aspect.TRAP, 32).add(Aspect.FLESH, 24).add(Aspect.EXCHANGE, 16), new ItemStack[]{new ItemStack(ConfigBlocks.blockTaint, 1, 2), new ItemStack(ConfigItems.itemBathSalts, 1, 0), new ItemStack(Items.nether_star, 1, 0), new ItemStack(ConfigBlocks.blockCosmeticSolid, 1, 0), new ItemStack(Items.nether_star, 1, 0), new ItemStack(ConfigItems.itemSanitySoap, 1, 0)}, 8));
selfRecipes.add(new SelfInfusionRecipe("spiderClimb", 8, (new AspectList()).add(Aspect.BEAST, 32).add(Aspect.MOTION, 48).add(Aspect.SLIME, 32), new ItemStack[]{new ItemStack(Blocks.web), new ItemStack(ConfigItems.itemResource, 1, 7), new ItemStack(Blocks.web), new ItemStack(Blocks.ladder), new ItemStack(Blocks.web), new ItemStack(ConfigItems.itemResource, 1, 7), new ItemStack(Blocks.web), new ItemStack(Blocks.ladder)}, 9));
selfRecipes.add(new SelfInfusionRecipe("chameleonSkin", 7, (new AspectList()).add(Aspect.SENSES, 48).add(Aspect.EXCHANGE, 32).add(Aspect.VOID, 32), new ItemStack[]{new ItemStack(Items.spider_eye), new ItemStack(Items.dye, 1, 1), new ItemStack(Items.dye, 1, 4), new ItemStack(Items.dye, 1, 11), new ItemStack(Items.dye, 1, 0), new ItemStack(Items.dye, 1, 15)}, 10));
//selfRecipes.add(new SelfInfusionRecipe("runicSkin", 12, (new AspectList()).add(Aspect.ARMOR, 128).add(Aspect.MAGIC, 512).add(Aspect.ENERGY, 128).add(Aspect.FLESH, 64), new ItemStack[]{new ItemStack(Items.diamond), new ItemStack(ConfigItems.itemResource, 1, 6), new ItemStack(ConfigItems.itemResource, 1, 7), new ItemStack(ConfigItems.itemResource, 1, 1), new ItemStack(ConfigItems.itemInkwell)}, 11));
addAspectsToAllTheThings();
}
@@ -1903,7 +1907,7 @@ public class ThaumicHorizons {
alternateBell.comment = "Enable alternate golemancer\'s bell recipe (in case of mod conflict).";
alternateBell.setRequiresMcRestart(true);
useAlternateBell = true;// alternateBell.getBoolean();
Property enablePocketPlane = config.get("general", "enablePocketPlane", false);
Property enablePocketPlane = config.get("general", "enablePocketPlane", true);
enablePocketPlane.comment = "Enable pocket plane content (currently incomplete - many aspects will not generate the cool stuff they are supposed to). World backups are highly suggested.";
enablePocketPlane.setRequiresMcRestart(true);
enablePocket = enablePocketPlane.getBoolean();
@@ -82,7 +82,7 @@ public class BlockLight extends BlockContainer
}
public TileEntity createNewTileEntity(final World var1, final int md) {
return null;
return new TileLight();
}
public AxisAlignedBB getCollisionBoundingBoxFromPool(final World world, final int x, final int y, final int z) {
@@ -27,6 +27,7 @@ public class BlockPortalTH extends BlockBreakable
public BlockPortalTH() {
super("portal", ThaumicHorizons.portal, false);
this.setTickRandomly(true);
this.setBlockUnbreakable();
}
public AxisAlignedBB getCollisionBoundingBoxFromPool(final World p_149668_1_, final int p_149668_2_, final int p_149668_3_, final int p_149668_4_) {
@@ -69,7 +70,7 @@ public class BlockPortalTH extends BlockBreakable
@SideOnly(Side.CLIENT)
public Item getItem(final World p_149694_1_, final int p_149694_2_, final int p_149694_3_, final int p_149694_4_) {
return Item.getItemById(0);
return null;
}
public int quantityDropped(final Random p_149745_1_) {
@@ -79,44 +80,46 @@ public class BlockPortalTH extends BlockBreakable
public void onEntityCollidedWithBlock(final World world, final int x, final int y, final int z, final Entity player) {
if (player.ridingEntity == null && player.riddenByEntity == null && player instanceof EntityPlayerMP) {
if (player.timeUntilPortal > 0) {
player.timeUntilPortal = 100;
player.timeUntilPortal = 10;
return;
}
player.timeUntilPortal = 100;
player.timeUntilPortal = 10;
int targetX = 0;
int targetY = 0;
int targetZ = 0;
int targetDim = 0;
if (world.provider.dimensionId == ThaumicHorizons.dimensionPocketId) {
final int planeNum = (z + 128) / 256;
final int which = world.getBlockMetadata(x, y, z);
final PocketPlaneData plane = PocketPlaneData.planes.get(planeNum);
final int[] portal;
//Note the order ACBD
switch (which) {
case 0: {
targetX = PocketPlaneData.planes.get(planeNum).portalA[0];
targetY = PocketPlaneData.planes.get(planeNum).portalA[1] - 2;
targetZ = PocketPlaneData.planes.get(planeNum).portalA[2];
case 0:
portal = plane.portalA;
break;
}
case 2: {
targetX = PocketPlaneData.planes.get(planeNum).portalB[0];
targetY = PocketPlaneData.planes.get(planeNum).portalB[1] - 2;
targetZ = PocketPlaneData.planes.get(planeNum).portalB[2];
case 1:
portal = plane.portalC;
break;
}
case 1: {
targetX = PocketPlaneData.planes.get(planeNum).portalC[0];
targetY = PocketPlaneData.planes.get(planeNum).portalC[1] - 2;
targetZ = PocketPlaneData.planes.get(planeNum).portalC[2];
case 2:
portal = plane.portalB;
break;
}
case 3: {
targetX = PocketPlaneData.planes.get(planeNum).portalD[0];
targetY = PocketPlaneData.planes.get(planeNum).portalD[1] - 2;
targetZ = PocketPlaneData.planes.get(planeNum).portalD[2];
case 3:
portal = plane.portalD;
break;
}
default:
return;
}
targetX = portal[0];
targetY = portal[1] - 2;
targetZ = portal[2];
if (portal.length > 3)
targetDim = portal[3];
final MinecraftServer mServer = FMLCommonHandler.instance().getMinecraftServerInstance();
((EntityPlayerMP)player).mcServer.getConfigurationManager().transferPlayerToDimension((EntityPlayerMP)player, 0, (Teleporter)new GatewayTeleporter(mServer.worldServerForDimension(ThaumicHorizons.dimensionPocketId), targetX, targetY, targetZ, player.rotationYaw));
((EntityPlayerMP)player).mcServer.getConfigurationManager().transferPlayerToDimension((EntityPlayerMP)player, targetDim, (Teleporter)new GatewayTeleporter(mServer.worldServerForDimension(ThaumicHorizons.dimensionPocketId), targetX, targetY, targetZ, player.rotationYaw));
}
else {
int slotY = y;
@@ -23,6 +23,7 @@ public class BlockVortexStabilizer extends BlockContainer
public BlockVortexStabilizer() {
super(Material.iron);
this.setBlockName("ThaumicHorizons_vortexStabilizer");
this.setHardness(10.0f);
this.setCreativeTab(ThaumicHorizons.tabTH);
}
@@ -48,7 +49,10 @@ public class BlockVortexStabilizer extends BlockContainer
}
public void onNeighborBlockChange(final World world, final int x, final int y, final int z, final Block nbid) {
final TileVortexStabilizer tile = (TileVortexStabilizer)world.getTileEntity(x, y, z);
if (world.isRemote)
return;
final TileVortexStabilizer tile = (TileVortexStabilizer) world.getTileEntity(x, y, z);
tile.redstoned = world.isBlockIndirectlyGettingPowered(x, y, z);
if ((!tile.redstoned && !world.isBlockIndirectlyGettingPowered(x, y, z)) || (tile.redstoned && world.isBlockIndirectlyGettingPowered(x, y, z))) {
tile.markDirty();
@@ -12,26 +12,22 @@ import io.netty.buffer.ByteBuf;
import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.NetworkRegistry;
import com.kentington.thaumichorizons.common.lib.PacketFXBlocksplosion;
import com.kentington.thaumichorizons.common.lib.PacketHandler;
import com.kentington.thaumichorizons.common.lib.networking.PacketFXBlocksplosion;
import com.kentington.thaumichorizons.common.lib.networking.PacketHandler;
import net.minecraft.item.ItemStack;
import net.minecraft.util.*;
import thaumcraft.common.config.ConfigItems;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.renderer.texture.ITextureObject;
import net.minecraft.client.Minecraft;
import com.kentington.thaumichorizons.client.lib.GolemTHTexture;
import net.minecraft.util.IIcon;
import thaumcraft.common.entities.golems.EnumGolemType;
import net.minecraft.nbt.NBTTagCompound;
import thaumcraft.common.entities.monster.EntityEldritchGuardian;
import thaumcraft.common.Thaumcraft;
import net.minecraft.util.IChatComponent;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.StatCollector;
import net.minecraft.init.Blocks;
import thaumcraft.common.config.ConfigBlocks;
import net.minecraft.util.DamageSource;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.ai.EntityAILookIdle;
import net.minecraft.entity.EntityLiving;
@@ -50,7 +46,6 @@ import net.minecraft.entity.Entity;
import net.minecraft.block.material.Material;
import net.minecraft.world.World;
import net.minecraft.block.Block;
import net.minecraft.util.ResourceLocation;
import thaumcraft.common.entities.golems.EntityGolemBase;
public class EntityGolemTH extends EntityGolemBase
@@ -253,21 +248,21 @@ public class EntityGolemTH extends EntityGolemBase
switch (this.voidCount) {
case 0: {
if (player != null) {
player.addChatMessage((IChatComponent)new ChatComponentText("\u00ef¿½5\u00ef¿½o" + StatCollector.translateToLocal("thaumichorizons.golemWarning1")));
player.addChatMessage((IChatComponent)new ChatComponentText(EnumChatFormatting.ITALIC + "" + EnumChatFormatting.DARK_PURPLE + StatCollector.translateToLocal("thaumichorizons.golemWarning1")));
break;
}
break;
}
case 1: {
if (player != null) {
player.addChatMessage((IChatComponent)new ChatComponentText("\u00ef¿½5\u00ef¿½o" + StatCollector.translateToLocal("thaumichorizons.golemWarning2")));
player.addChatMessage((IChatComponent)new ChatComponentText(EnumChatFormatting.ITALIC + "" + EnumChatFormatting.DARK_PURPLE + StatCollector.translateToLocal("thaumichorizons.golemWarning2")));
break;
}
break;
}
case 2: {
if (player != null) {
player.addChatMessage((IChatComponent)new ChatComponentText("\u00ef¿½5\u00ef¿½o" + StatCollector.translateToLocal("thaumichorizons.golemWarning3")));
player.addChatMessage((IChatComponent)new ChatComponentText(EnumChatFormatting.ITALIC + "" + EnumChatFormatting.DARK_PURPLE + StatCollector.translateToLocal("thaumichorizons.golemWarning3")));
break;
}
break;
@@ -15,8 +15,8 @@ import net.minecraft.entity.EntityList;
import net.minecraft.world.Teleporter;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import net.minecraft.entity.player.EntityPlayer;
import com.kentington.thaumichorizons.common.lib.PacketMountNightmare;
import com.kentington.thaumichorizons.common.lib.PacketHandler;
import com.kentington.thaumichorizons.common.lib.networking.PacketMountNightmare;
import com.kentington.thaumichorizons.common.lib.networking.PacketHandler;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.entity.Entity;
import net.minecraft.server.MinecraftServer;
@@ -18,8 +18,8 @@ import thaumcraft.common.config.ConfigBlocks;
import thaumcraft.common.config.ConfigItems;
import net.minecraft.entity.player.EntityPlayer;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import com.kentington.thaumichorizons.common.lib.PacketGetCowData;
import com.kentington.thaumichorizons.common.lib.PacketHandler;
import com.kentington.thaumichorizons.common.lib.networking.PacketGetCowData;
import com.kentington.thaumichorizons.common.lib.networking.PacketHandler;
import net.minecraft.world.World;
import thaumcraft.api.aspects.AspectList;
import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData;
@@ -1,6 +1,6 @@
//
//
// Decompiled by Procyon v0.5.30
//
//
package com.kentington.thaumichorizons.common.entities.ai;
@@ -20,44 +20,49 @@ public class EntityAIEatStone extends EntityAIBase
private EntityOrePig thePig;
private Entity targetEntity;
int count;
public EntityAIEatStone(final EntityOrePig par1EntityCreature) {
this.count = 0;
this.thePig = par1EntityCreature;
}
public boolean shouldExecute() {
return this.findItem();
}
private boolean findItem() {
final float dmod = 16.0f;
double mindis_e = 128.0f;
final List<Entity> targets = (List<Entity>)this.thePig.worldObj.getEntitiesWithinAABBExcludingEntity((Entity)this.thePig, AxisAlignedBB.getBoundingBox(this.thePig.posX - 16.0, this.thePig.posY - 16.0, this.thePig.posZ - 16.0, this.thePig.posX + 16.0, this.thePig.posY + 16.0, this.thePig.posZ + 16.0));
if (targets.size() == 0) {
return false;
}
for (final Entity e : targets) {
for ( Entity e :targets ) {
if (e instanceof EntityItem && ((EntityItem)e).getEntityItem().getItem() == Item.getItemFromBlock(Blocks.cobblestone) && ((EntityItem)e).delayBeforeCanPickup < 5) {
final double distance2 = e.getDistanceSq(this.thePig.posX, this.thePig.posY, this.thePig.posZ);
if (distance2 >= dmod * dmod) {
double distance2 = e.getDistanceSq(this.thePig.posX, this.thePig.posY, this.thePig.posZ);
if (distance2 >= dmod * dmod || mindis_e < distance2 ){
continue;
}
mindis_e = distance2;
this.targetEntity = e;
}
}
return this.targetEntity != null;
}
public boolean continueExecuting() {
return this.count-- > 0 && !this.thePig.getNavigator().noPath() && this.targetEntity.isEntityAlive();
}
public void resetTask() {
this.count = 0;
this.targetEntity = null;
this.thePig.getNavigator().clearPathEntity();
}
public void updateTask() {
this.thePig.getLookHelper().setLookPositionWithEntity(this.targetEntity, 30.0f, 30.0f);
final double dist = this.thePig.getDistanceSqToEntity(this.targetEntity);
@@ -65,7 +70,7 @@ public class EntityAIEatStone extends EntityAIBase
this.pickUp();
}
}
private void pickUp() {
final int amount = 0;
if (this.targetEntity instanceof EntityItem) {
@@ -78,7 +83,7 @@ public class EntityAIEatStone extends EntityAIBase
}
this.targetEntity.worldObj.playSoundAtEntity(this.targetEntity, "random.burp", 0.2f, ((this.targetEntity.worldObj.rand.nextFloat() - this.targetEntity.worldObj.rand.nextFloat()) * 0.7f + 1.0f) * 2.0f);
}
public void startExecuting() {
this.count = 500;
this.thePig.getNavigator().tryMoveToEntityLiving(this.targetEntity, (double)(this.thePig.getAIMoveSpeed() + 1.0f));
@@ -9,6 +9,7 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.block.Block;
import net.minecraft.util.IChatComponent;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.StatCollector;
import net.minecraft.nbt.NBTTagString;
import net.minecraftforge.common.DimensionManager;
@@ -111,7 +112,7 @@ public class ItemAmuletMirror extends Item implements IBauble, IRunicArmor
itemstack.setTagInfo("linkDim", (NBTBase)new NBTTagInt(world.provider.dimensionId));
itemstack.setTagInfo("dimname", (NBTBase)new NBTTagString(DimensionManager.getProvider(world.provider.dimensionId).getDimensionName()));
world.playSoundEffect((double)x, (double)y, (double)z, "thaumcraft:jar", 1.0f, 2.0f);
player.addChatMessage((IChatComponent)new ChatComponentText("\u00ef¿½5\u00ef¿½o" + StatCollector.translateToLocal("tc.handmirrorlinked")));
player.addChatMessage((IChatComponent)new ChatComponentText(EnumChatFormatting.GRAY + StatCollector.translateToLocal("tc.handmirrorlinked")));
player.inventoryContainer.detectAndSendChanges();
}
return true;
@@ -12,8 +12,8 @@ import java.util.List;
import net.minecraft.util.Vec3;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.NetworkRegistry;
import com.kentington.thaumichorizons.common.lib.PacketFXContainment;
import com.kentington.thaumichorizons.common.lib.PacketHandler;
import com.kentington.thaumichorizons.common.lib.networking.PacketFXContainment;
import com.kentington.thaumichorizons.common.lib.networking.PacketHandler;
import thaumcraft.common.lib.utils.InventoryUtils;
import thaumcraft.common.config.ConfigBlocks;
import net.minecraft.entity.EntityList;
@@ -45,7 +45,7 @@ public class ItemGolemPlacer extends thaumcraft.common.entities.golems.ItemGolem
@SideOnly(Side.CLIENT)
public int getColorFromItemStack(final ItemStack stack, final int p_82790_2_) {
if (!stack.getTagCompound().hasKey("block")) {
if (!stack.hasTagCompound() || !stack.getTagCompound().hasKey("block")) {
return 0;
}
final int[] block = stack.getTagCompound().getIntArray("block");
@@ -4,6 +4,7 @@
package com.kentington.thaumichorizons.common.items;
import com.kentington.thaumichorizons.common.tiles.TileVortex;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import com.kentington.thaumichorizons.common.lib.PocketPlaneData;
@@ -52,19 +53,33 @@ public class ItemKeystone extends Item
}
@SideOnly(Side.CLIENT)
public int getColorFromItemStack(final ItemStack par1ItemStack, final int p_82790_2_) {
public int getColorFromItemStack(ItemStack par1ItemStack, int p_82790_2_) {
if (par1ItemStack.getTagCompound() != null) {
return PocketPlaneData.planes.get(par1ItemStack.getTagCompound().getInteger("dimension")).color;
int dimID = par1ItemStack.getTagCompound().getInteger("dimension");
if (dimID < PocketPlaneData.planes.size())
return PocketPlaneData.planes.get(dimID).color;
else
par1ItemStack = null;
}
return 16777215;
}
public ItemStack onItemRightClick(final ItemStack stack, final World world, final EntityPlayer p) {
if (stack.getTagCompound() == null && p.dimension == ThaumicHorizons.dimensionPocketId) {
final ItemStack newStack = new ItemStack(ThaumicHorizons.itemKeystone);
(newStack.stackTagCompound = new NBTTagCompound()).setInteger("dimension", ((int)p.posZ + 128) / 256);
return newStack;
@Override
public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) {
if (stack.getTagCompound() == null && player.dimension == ThaumicHorizons.dimensionPocketId && !world.isRemote) {
if (world.getTileEntity(x,y,z) instanceof TileVortex)
(stack.stackTagCompound = new NBTTagCompound()).setInteger("dimension", (z + 128) / 256);
return true;
}
return stack;
return super.onItemUseFirst(stack, player, world, x, y, z, side, hitX, hitY, hitZ);
}
// public ItemStack onItemRightClick(final ItemStack stack, final World world, final EntityPlayer p) {
// if (stack.getTagCompound() == null && p.dimension == ThaumicHorizons.dimensionPocketId && !world.isRemote) {
// final ItemStack newStack = new ItemStack(ThaumicHorizons.itemKeystone);
// (newStack.stackTagCompound = new NBTTagCompound()).setInteger("dimension", ((int)p.posZ + 128) / 256);
// return newStack;
// }
// return stack;
// }
}
@@ -10,6 +10,7 @@ import java.util.ArrayList;
import net.minecraft.item.ItemStack;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.Item;
public class RecipeVoidPuttyRepair implements IRecipe
{
@@ -19,7 +20,7 @@ public class RecipeVoidPuttyRepair implements IRecipe
for (int i = 0; i < par1InventoryCrafting.getSizeInventory(); ++i) {
final ItemStack itemstack2 = par1InventoryCrafting.getStackInSlot(i);
if (itemstack2 != null) {
if (itemstack2.getItem().isDamageable() && itemstack2.getItem().isDamaged(itemstack2)) {
if (itemstack2.getItem().isDamageable() && itemstack2.getItem().isRepairable() && itemstack2.getItem().isDamaged(itemstack2)) {
if (itemstack != null) {
return null;
}
@@ -6,8 +6,8 @@ package com.kentington.thaumichorizons.common.items.lenses;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import net.minecraft.entity.player.EntityPlayerMP;
import com.kentington.thaumichorizons.common.lib.PacketRemoveNightvision;
import com.kentington.thaumichorizons.common.lib.PacketHandler;
import com.kentington.thaumichorizons.common.lib.networking.PacketRemoveNightvision;
import com.kentington.thaumichorizons.common.lib.networking.PacketHandler;
import net.minecraft.entity.player.EntityPlayer;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@@ -6,8 +6,8 @@ package com.kentington.thaumichorizons.common.items.lenses;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import net.minecraft.entity.player.EntityPlayerMP;
import com.kentington.thaumichorizons.common.lib.PacketRemoveNightvision;
import com.kentington.thaumichorizons.common.lib.PacketHandler;
import com.kentington.thaumichorizons.common.lib.networking.PacketRemoveNightvision;
import com.kentington.thaumichorizons.common.lib.networking.PacketHandler;
import net.minecraft.entity.player.EntityPlayer;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@@ -32,8 +32,8 @@ public class EntityInfusionProperties implements IExtendedEntityProperties
public boolean toggleInvisible;
public EntityInfusionProperties() {
this.infusions = new int[12];
this.playerInfusions = new int[12];
this.infusions = new int[NUM_INFUSIONS];
this.playerInfusions = new int[NUM_INFUSIONS];
this.infusionCosts = new AspectList();
this.infusionsApplied = false;
}
@@ -64,14 +64,14 @@ public class EntityInfusionProperties implements IExtendedEntityProperties
this.owner = properties.getString("owner");
this.sitting = properties.getBoolean("sitting");
this.infusions = properties.getIntArray("Infusions");
if (this.infusions.length < 12) {
if (this.infusions.length < NUM_INFUSIONS) {
this.convertInfusions();
}
this.playerInfusions = properties.getIntArray("PlayerInfusions");
if (this.playerInfusions.length == 0) {
this.playerInfusions = new int[12];
this.playerInfusions = new int[NUM_INFUSIONS];
}
else if (this.playerInfusions.length < 12) {
else if (this.playerInfusions.length < NUM_INFUSIONS) {
this.convertPlayerInfusions();
}
this.tumorWarp = properties.getInteger("tumorWarp");
@@ -89,13 +89,13 @@ public class EntityInfusionProperties implements IExtendedEntityProperties
}
void convertInfusions() {
final int[] newArray = new int[12];
final int[] newArray = new int[NUM_INFUSIONS];
System.arraycopy(this.infusions, 0, newArray, 0, this.infusions.length);
this.infusions = newArray;
}
void convertPlayerInfusions() {
final int[] newArray = new int[12];
final int[] newArray = new int[NUM_INFUSIONS];
System.arraycopy(this.playerInfusions, 0, newArray, 0, this.playerInfusions.length);
this.playerInfusions = newArray;
}
@@ -157,7 +157,8 @@ public class EntityInfusionProperties implements IExtendedEntityProperties
}
public void resetPlayerInfusions() {
this.playerInfusions = new int[12];
this.playerInfusions = new int[NUM_INFUSIONS];
this.tumorWarpPermanent = 0;
this.tumorWarp = 0;
this.tumorWarpTemp = 0;
}
@@ -4,7 +4,10 @@
package com.kentington.thaumichorizons.common.lib;
import net.minecraft.item.Item;
import com.kentington.thaumichorizons.common.lib.networking.PacketFXContainment;
import com.kentington.thaumichorizons.common.lib.networking.PacketHandler;
import com.kentington.thaumichorizons.common.lib.networking.PacketNoMoreItems;
import com.kentington.thaumichorizons.common.lib.networking.PacketPlayerInfusionSync;
import net.minecraft.util.IChatComponent;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
@@ -64,7 +67,6 @@ import com.kentington.thaumichorizons.common.entities.ai.EntityAIFollowOwnerTH;
import com.kentington.thaumichorizons.common.entities.ai.EntityAIAttackOnCollideTH;
import net.minecraft.entity.ai.EntityAILeapAtTarget;
import com.kentington.thaumichorizons.common.entities.ai.EntityAISitTH;
import net.minecraft.entity.ai.EntityAIBase;
import net.minecraft.entity.ai.EntityAISwimming;
import net.minecraft.entity.ai.EntityAITasks;
import thaumcraft.common.Thaumcraft;
@@ -79,7 +81,6 @@ import net.minecraft.entity.player.EntityPlayer;
import com.kentington.thaumichorizons.common.entities.EntityNightmare;
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.common.IExtendedEntityProperties;
import net.minecraft.entity.EntityLivingBase;
import net.minecraftforge.event.entity.EntityEvent;
import cpw.mods.fml.relauncher.Side;
@@ -114,20 +115,29 @@ public class EventHandlerEntity
}
}
@SubscribeEvent
public void Respawn(cpw.mods.fml.common.gameevent.PlayerEvent.PlayerRespawnEvent event) {
// Exit Portal fix
if (!event.player.worldObj.isRemote) {
this.applyInfusions(event.player);
}
}
public void applyInfusions(final EntityLivingBase entity) {
final StackTraceElement[] above = Thread.currentThread().getStackTrace();
EntityInfusionProperties infusionProperties = (EntityInfusionProperties)entity.getExtendedProperties("CreatureInfusion");
if (entity instanceof EntityPlayer) {
final int[] infusions = ((EntityInfusionProperties)entity.getExtendedProperties("CreatureInfusion")).getPlayerInfusions();
final int[] infusions = infusionProperties.getPlayerInfusions();
for (int i = 0; i < infusions.length; ++i) {
if (infusions[i] != 0) {
if (infusions[i] == 8 && !entity.worldObj.isRemote) {
this.warpTumor((EntityPlayer)entity, 50 - ((EntityInfusionProperties)entity.getExtendedProperties("CreatureInfusion")).tumorWarpPermanent - ((EntityInfusionProperties)entity.getExtendedProperties("CreatureInfusion")).tumorWarp - ((EntityInfusionProperties)entity.getExtendedProperties("CreatureInfusion")).tumorWarpTemp);
this.warpTumor((EntityPlayer)entity, 50 - infusionProperties.tumorWarpPermanent - infusionProperties.tumorWarp - infusionProperties.tumorWarpTemp);
}
}
}
this.applyPlayerPotionInfusions((EntityPlayer)entity, infusions, ((EntityInfusionProperties)entity.getExtendedProperties("CreatureInfusion")).toggleInvisible);
this.applyPlayerPotionInfusions((EntityPlayer)entity, infusions, infusionProperties.toggleInvisible);
if (!entity.worldObj.isRemote) {
PacketHandler.INSTANCE.sendToAll((IMessage)new PacketPlayerInfusionSync(entity.getCommandSenderName(), infusions));
PacketHandler.INSTANCE.sendToAll((IMessage)new PacketPlayerInfusionSync(entity.getCommandSenderName(), infusions, infusionProperties.toggleClimb, infusionProperties.toggleInvisible));
}
}
else {
@@ -136,8 +146,8 @@ public class EventHandlerEntity
return;
}
}
final int[] infusions = ((EntityInfusionProperties)entity.getExtendedProperties("CreatureInfusion")).getInfusions();
for (int i = 0; i < 12; ++i) {
final int[] infusions = infusionProperties.getInfusions();
for (int i = 0; i < EntityInfusionProperties.NUM_INFUSIONS; ++i) {
if (infusions[i] != 0) {
if (infusions[i] == 1) {
final PotionEffect effect = new PotionEffect(Potion.jump.id, Integer.MAX_VALUE, 0, true);
@@ -323,7 +333,7 @@ public class EventHandlerEntity
player.setAir(300);
}
if (event.entityLiving.ticksExisted % 30 == 0) {
if (prop.hasPlayerInfusion(8)) {
if (prop.hasPlayerInfusion(8) && !event.entityLiving.worldObj.isRemote) {
this.warpTumor((EntityPlayer)event.entityLiving, 50 - prop.tumorWarpPermanent - prop.tumorWarp - prop.tumorWarpTemp);
}
this.applyPlayerPotionInfusions(player, prop.playerInfusions, prop.toggleInvisible);
@@ -521,6 +531,17 @@ public class EventHandlerEntity
else if (event.entityLiving instanceof EntityMercurialSlime && ((EntityMercurialSlime)event.entityLiving).getSlimeSize() == 1) {
event.entityLiving.entityDropItem(new ItemStack(ConfigItems.itemResource, 1, 3), 0.0f);
}
else if (event.entityLiving instanceof EntityPlayer) {
final EntityInfusionProperties prop = (EntityInfusionProperties)event.entity.getExtendedProperties("CreatureInfusion");
if (prop != null) {
if (prop.tumorWarpPermanent > 0 || prop.tumorWarp > 0 || prop.tumorWarpTemp > 0) {
Thaumcraft.proxy.getPlayerKnowledge().addWarpPerm(event.entity.getCommandSenderName(), prop.tumorWarpPermanent);
Thaumcraft.proxy.getPlayerKnowledge().addWarpSticky(event.entity.getCommandSenderName(), prop.tumorWarp);
Thaumcraft.proxy.getPlayerKnowledge().addWarpTemp(event.entity.getCommandSenderName(), prop.tumorWarpTemp);
}
prop.resetPlayerInfusions();
}
}
}
}
@@ -534,7 +555,7 @@ public class EventHandlerEntity
}
if (!event.entity.worldObj.isRemote && event.entity instanceof EntityPlayer && event.entityLiving.getHealth() - event.ammount <= 0.0f) {
final EntityPlayer player = (EntityPlayer)event.entity;
if (prop.tumorWarp > 0 || prop.tumorWarpTemp > 0) {
if (prop.tumorWarpPermanent > 0 || prop.tumorWarp > 0 || prop.tumorWarpTemp > 0) {
Thaumcraft.proxy.getPlayerKnowledge().addWarpPerm(event.entity.getCommandSenderName(), prop.tumorWarpPermanent);
Thaumcraft.proxy.getPlayerKnowledge().addWarpSticky(event.entity.getCommandSenderName(), prop.tumorWarp);
Thaumcraft.proxy.getPlayerKnowledge().addWarpTemp(event.entity.getCommandSenderName(), prop.tumorWarpTemp);
@@ -1,63 +0,0 @@
//
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
public class PacketPlayerInfusionSync implements IMessage, IMessageHandler<PacketPlayerInfusionSync, IMessage>
{
int[] infusions;
String name;
public PacketPlayerInfusionSync() {
this.infusions = new int[10];
this.name = "";
}
public PacketPlayerInfusionSync(final String name, final int[] infusions) {
this.infusions = new int[10];
this.name = "";
this.name = name;
this.infusions = infusions;
}
public IMessage onMessage(final PacketPlayerInfusionSync message, final MessageContext ctx) {
if (Minecraft.getMinecraft().theWorld != null && Minecraft.getMinecraft().theWorld.getPlayerEntityByName(message.name) != null && Minecraft.getMinecraft().theWorld.getPlayerEntityByName(message.name).getExtendedProperties("CreatureInfusion") != null) {
((EntityInfusionProperties)Minecraft.getMinecraft().theWorld.getPlayerEntityByName(message.name).getExtendedProperties("CreatureInfusion")).playerInfusions = message.infusions;
}
return null;
}
public void fromBytes(final ByteBuf buf) {
final int length = buf.readInt();
final byte[] bites = new byte[length];
final char[] chars = new char[length];
buf.readBytes(bites);
for (int i = 0; i < length; ++i) {
chars[i] = (char)bites[i];
}
this.name = String.copyValueOf(chars);
for (int i = 0; i < 10; ++i) {
this.infusions[i] = buf.readInt();
}
}
public void toBytes(final ByteBuf buf) {
buf.writeInt(this.name.length());
final byte[] bites = new byte[this.name.length()];
final char[] chars = this.name.toCharArray();
for (int i = 0; i < this.name.length(); ++i) {
bites[i] = (byte)chars[i];
}
buf.writeBytes(bites);
for (int i = 0; i < 10; ++i) {
buf.writeInt(this.infusions[i]);
}
}
}
@@ -35,10 +35,7 @@ import thaumcraft.common.lib.world.ThaumcraftWorldGenerator;
import java.awt.*;
import java.io.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Set;
import java.util.*;
public class PocketPlaneData {
public int radius;
@@ -49,8 +46,11 @@ public class PocketPlaneData {
public int[] portalC;
public int[] portalD;
public String name;
public static final LinkedList < PocketPlaneData > planes = new LinkedList < > ();
public static final LinkedList < Vec3 > positions = new LinkedList < > ();
private static final short MAX_CREATURES = 100;
private static short creatures;
public static final LinkedList<PocketPlaneData> planes = new LinkedList<>();
public static final HashMap<Integer,Vec3> positions = new HashMap<>();
public static int pocketPlaneMAXID;
public PocketPlaneData() {
this.radius = 32;
@@ -102,14 +102,16 @@ public class PocketPlaneData {
vortex.dimensionID = PocketPlaneData.planes.size();
vortex.createdDimension = true;
world.setTileEntity(xCenter, yCenter + 1, zCenter,vortex);
data.portalA = new int[3];
data.portalB = new int[3];
data.portalC = new int[3];
data.portalD = new int[3];
data.portalA = new int[4];
data.portalB = new int[4];
data.portalC = new int[4];
data.portalD = new int[4];
PocketPlaneData.planes.add(data);
PocketPlaneData.positions.add(Vec3.createVectorHelper((double) vortexX, (double) vortexY, (double) vortexZ));
PocketPlaneData.positions.put(pocketPlaneMAXID,Vec3.createVectorHelper((double) vortexX, (double) vortexY, (double) vortexZ));
//System.out.println("Finished with pocket plane generation!");
world.getChunkFromBlockCoords(vortexX,vortexZ).isModified=true;
creatures = 0;
++pocketPlaneMAXID;
}
}
@@ -118,10 +120,12 @@ public class PocketPlaneData {
int g = 0;
int b = 0;
for (final Aspect asp: aspects.getAspects()) {
final Color aspColor = new Color(asp.getColor());
r += (int)(aspColor.getRed() * aspectFraction(asp, aspects));
g += (int)(aspColor.getGreen() * aspectFraction(asp, aspects));
b += (int)(aspColor.getBlue() * aspectFraction(asp, aspects));
if (asp != null) {
final Color aspColor = new Color(asp.getColor());
r += (int) (aspColor.getRed() * aspectFraction(asp, aspects));
g += (int) (aspColor.getGreen() * aspectFraction(asp, aspects));
b += (int) (aspColor.getBlue() * aspectFraction(asp, aspects));
}
}
final int color = r * 256 * 256 + g * 256 + b;
//System.out.println("Plane color is " + color);
@@ -174,11 +178,11 @@ public class PocketPlaneData {
drawSphere(xCenter, yCenter, zCenter, data.radius - numRings, Blocks.obsidian, 0, world);
drewAnything = true;
}
if (aspects.getAmount(Aspect.LIGHT) > 0) {
++numRings;
drawSphere(xCenter, yCenter, zCenter, data.radius - numRings, ThaumicHorizons.blockLight, 11, world);
drewAnything = true;
}
// if (aspects.getAmount(Aspect.LIGHT) > 0) {
// ++numRings;
// drawSphere(xCenter, yCenter, zCenter, data.radius - numRings, ThaumicHorizons.blockLight, 11, world);
// drewAnything = true;
// }
if (aspects.getAmount(Aspect.ELDRITCH) > 0) {
++numRings;
drawSphere(xCenter, yCenter, zCenter, data.radius - numRings, ConfigBlocks.blockCosmeticSolid, 11, world);
@@ -354,16 +358,20 @@ public class PocketPlaneData {
for (int bottom = y = -bmax; y <= top; ++y) {
if (top != bottom && level + y > 0) {
if (y == top) {
if (block != null) {
world.setBlock(x + xCenter, y + level, z + zCenter, block, md, 0);
}
if (block == Blocks.water) {
if (bio != null && bio.getTempCategory() == BiomeGenBase.TempCategory.COLD) {
world.setBlock(x + xCenter, y + level, z + zCenter, Blocks.ice, 0, 0);
} else {
world.setBlock(x + xCenter, y + level, z + zCenter, block, 0, 0);
if ((life > 40 || aspects.getAmount(Aspect.BEAST) > 0) && world.rand.nextInt(100) > 98) {
if ((life > 40 || aspects.getAmount(Aspect.BEAST) > 0) && world.rand.nextInt(100) > 98 && creatures < MAX_CREATURES) {
final EntitySquid squiddie = new EntitySquid(world);
squiddie.setPosition((double)(x + xCenter), (double)(y + level), (double)(z + zCenter));
squiddie.func_110163_bv();
world.spawnEntityInWorld((Entity) squiddie);
++creatures;
}
if (life > 0 && world.rand.nextInt(100) > 98) {
world.setBlock(x + xCenter, y + level + 1, z + zCenter, Blocks.waterlily, 0, 0);
@@ -562,25 +570,29 @@ public class PocketPlaneData {
break;
}
}
if (critter != null) {
if (critter != null && creatures < MAX_CREATURES) {
critter.setPosition(x + xCenter + 0.5, (double)(y + level + 1), z + zCenter + 0.5);
world.spawnEntityInWorld((Entity) critter);
++creatures;
}
}
if ((aspects.getAmount(Aspect.POISON) > 0 || aspects.getAmount(Aspect.EXCHANGE) > 0 || aspects.getAmount(Aspect.METAL) > 0 || aspects.getAmount(Aspect.MECHANISM) > 0) && world.rand.nextInt(100) > 98) {
if ((aspects.getAmount(Aspect.POISON) > 0 || aspects.getAmount(Aspect.EXCHANGE) > 0 || aspects.getAmount(Aspect.METAL) > 0 || aspects.getAmount(Aspect.MECHANISM) > 0) && world.rand.nextInt(100) > 98 && creatures < MAX_CREATURES) {
final EntityMercurialSlime slime = new EntityMercurialSlime(world);
slime.setPosition(x + xCenter + 0.5, (double)(y + level + 1), z + zCenter + 0.5);
world.spawnEntityInWorld((Entity) slime);
++creatures;
}
if ((aspects.getAmount(Aspect.SLIME) > 0 || aspects.getAmount(Aspect.FLESH) > 0 || aspects.getAmount(Aspect.HUNGER) > 0) && world.rand.nextInt(100) > 98) {
if ((aspects.getAmount(Aspect.SLIME) > 0 || aspects.getAmount(Aspect.FLESH) > 0 || aspects.getAmount(Aspect.HUNGER) > 0) && world.rand.nextInt(100) > 98 && creatures < MAX_CREATURES) {
final EntityMeatSlime slime2 = new EntityMeatSlime(world);
slime2.setPosition(x + xCenter + 0.5, (double)(y + level + 1), z + zCenter + 0.5);
world.spawnEntityInWorld((Entity) slime2);
++creatures;
}
if (aspects.getAmount(Aspect.SLIME) > 0 && world.rand.nextInt(100) > 98) {
if (aspects.getAmount(Aspect.SLIME) > 0 && world.rand.nextInt(100) > 98 && creatures < MAX_CREATURES) {
final EntitySlime slime3 = new EntitySlime(world);
slime3.setPosition(x + xCenter + 0.5, (double)(y + level + 1), z + zCenter + 0.5);
world.spawnEntityInWorld((Entity) slime3);
++creatures;
}
if (aspects.getAmount(Aspect.ELDRITCH) > 0 && world.rand.nextInt(200) > 198) {
world.setBlock(x + xCenter, y + level, z + zCenter, ConfigBlocks.blockCosmeticSolid, 1, 0);
@@ -594,15 +606,17 @@ public class PocketPlaneData {
if (aspects.getAmount(Aspect.TAINT) > 0 && world.rand.nextInt(100) > 98) {
world.setBlock(x + xCenter, y + level, z + zCenter, ConfigBlocks.blockTaintFibres, 0, 0);
}
if (aspects.getAmount(Aspect.TAINT) > 0 && world.rand.nextInt(200) > 198) {
if (aspects.getAmount(Aspect.TAINT) > 0 && world.rand.nextInt(200) > 198 && creatures < MAX_CREATURES) {
final EntityTaintacle slime4 = new EntityTaintacle(world);
slime4.setPosition(x + xCenter + 0.5, (double)(y + level + 1), z + zCenter + 0.5);
world.spawnEntityInWorld((Entity) slime4);
++creatures;
}
if (aspects.getAmount(Aspect.TAINT) > 0 && world.rand.nextInt(200) > 198) {
if (aspects.getAmount(Aspect.TAINT) > 0 && world.rand.nextInt(200) > 198 && creatures < MAX_CREATURES) {
final EntityTaintSporeSwarmer slime5 = new EntityTaintSporeSwarmer(world);
slime5.setPosition(x + xCenter + 0.5, (double)(y + level + 1), z + zCenter + 0.5);
world.spawnEntityInWorld((Entity) slime5);
++creatures;
}
} else if (block != null) {
world.setBlock(x + xCenter, y + level, z + zCenter, block, md, 0);
@@ -1107,14 +1121,13 @@ public class PocketPlaneData {
if (planeFile.exists()) {
try {
root = CompressedStreamTools.readCompressed((InputStream) new FileInputStream(planeFile));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e2) {
e2.printStackTrace();
}
if (root != null) {
PocketPlaneData.planes.clear();
final NBTTagList planeNBT = root.getTagList("Data", 10);
pocketPlaneMAXID = root.getInteger("MaxID");
for (int i = 0; i < planeNBT.tagCount(); ++i) {
final NBTTagCompound thePlane = planeNBT.getCompoundTagAt(i);
final PocketPlaneData data = new PocketPlaneData();
@@ -1130,9 +1143,9 @@ public class PocketPlaneData {
}
final NBTTagCompound positionz = root.getCompoundTag("Positions");
PocketPlaneData.positions.clear();
Set < String > list1 = positionz.func_150296_c();
Set <String> list1 = positionz.func_150296_c();
for (final String id: list1) {
PocketPlaneData.positions.add(Vec3.createVectorHelper(positionz.getIntArray(id)[0] + 0.5, (double)(positionz.getIntArray(id)[1] + 1), positionz.getIntArray(id)[2] + 0.5));
PocketPlaneData.positions.put(Integer.valueOf(id),Vec3.createVectorHelper(positionz.getIntArray(id)[0] + 0.5, (double)(positionz.getIntArray(id)[1] + 1), positionz.getIntArray(id)[2] + 0.5));
}
}
}
@@ -1142,13 +1155,14 @@ public class PocketPlaneData {
final File planeFile = new File(world.getSaveHandler().getWorldDirectory(), "pocketplane.dat");
final NBTTagCompound root = new NBTTagCompound();
final NBTTagCompound positionz = new NBTTagCompound();
int which = 0;
for (final Vec3 pos: PocketPlaneData.positions) {
positionz.setIntArray(which + "", new int[] {
(int) pos.xCoord, (int) pos.yCoord, (int) pos.zCoord
Iterator it = PocketPlaneData.positions.entrySet().iterator();
while (it.hasNext()){
Map.Entry<Integer,Vec3> idToPos = (Map.Entry<Integer,Vec3>) it.next();
positionz.setIntArray(idToPos.getKey() + "", new int[] {
(int) idToPos.getValue().xCoord, (int) idToPos.getValue().yCoord, (int) idToPos.getValue().zCoord
});
++which;
}
root.setInteger("MaxID",pocketPlaneMAXID);
root.setTag("Positions", (NBTBase) positionz);
final NBTTagList planeNBT = new NBTTagList();
root.setTag("Data", (NBTBase) planeNBT);
@@ -1168,8 +1182,6 @@ public class PocketPlaneData {
}
try {
CompressedStreamTools.writeCompressed(root, (OutputStream) new FileOutputStream(planeFile));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e2) {
e2.printStackTrace();
}
@@ -4,6 +4,7 @@
package com.kentington.thaumichorizons.common.lib;
import com.kentington.thaumichorizons.common.lib.networking.*;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.entity.player.EntityPlayer;
@@ -4,6 +4,7 @@
package com.kentington.thaumichorizons.common.lib;
import com.kentington.thaumichorizons.common.ThaumicHorizons;
import net.minecraft.entity.Entity;
import net.minecraft.world.Teleporter;
import net.minecraft.world.WorldServer;
@@ -20,7 +21,7 @@ public class VortexTeleporter extends Teleporter
}
public void placeInPortal(final Entity p_77185_1_, final double p_77185_2_, final double p_77185_4_, final double p_77185_6_, final float p_77185_8_) {
if (this.worldServerInstance.provider.dimensionId != 0) {
if (this.worldServerInstance.provider.dimensionId == ThaumicHorizons.dimensionPocketId) {
p_77185_1_.setPosition(0.5, 129.0, (double)(256 * this.planeNum + 0.5f));
}
else {
@@ -2,7 +2,7 @@
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib;
package com.kentington.thaumichorizons.common.lib.networking;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.Entity;
@@ -2,7 +2,7 @@
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib;
package com.kentington.thaumichorizons.common.lib.networking;
import io.netty.buffer.ByteBuf;
import net.minecraft.block.Block;
@@ -2,7 +2,7 @@
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib;
package com.kentington.thaumichorizons.common.lib.networking;
import io.netty.buffer.ByteBuf;
import cpw.mods.fml.relauncher.Side;
@@ -2,7 +2,7 @@
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib;
package com.kentington.thaumichorizons.common.lib.networking;
import io.netty.buffer.ByteBuf;
import cpw.mods.fml.relauncher.Side;
@@ -2,7 +2,7 @@
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib;
package com.kentington.thaumichorizons.common.lib.networking;
import io.netty.buffer.ByteBuf;
import cpw.mods.fml.relauncher.Side;
@@ -2,7 +2,7 @@
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib;
package com.kentington.thaumichorizons.common.lib.networking;
import io.netty.buffer.ByteBuf;
import cpw.mods.fml.relauncher.Side;
@@ -2,7 +2,7 @@
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib;
package com.kentington.thaumichorizons.common.lib.networking;
import net.minecraft.world.World;
import com.kentington.thaumichorizons.common.ThaumicHorizons;
@@ -2,7 +2,7 @@
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib;
package com.kentington.thaumichorizons.common.lib.networking;
import java.util.Iterator;
import java.util.Set;
@@ -2,7 +2,7 @@
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib;
package com.kentington.thaumichorizons.common.lib.networking;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.relauncher.Side;
@@ -2,7 +2,7 @@
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib;
package com.kentington.thaumichorizons.common.lib.networking;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@@ -2,7 +2,7 @@
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib;
package com.kentington.thaumichorizons.common.lib.networking;
import net.minecraft.entity.Entity;
import net.minecraft.world.World;
@@ -2,8 +2,9 @@
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib;
package com.kentington.thaumichorizons.common.lib.networking;
import com.kentington.thaumichorizons.common.lib.EventHandlerEntity;
import io.netty.buffer.ByteBuf;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import net.minecraft.entity.player.EntityPlayer;
@@ -2,7 +2,7 @@
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib;
package com.kentington.thaumichorizons.common.lib.networking;
import io.netty.buffer.ByteBuf;
import cpw.mods.fml.relauncher.Side;
@@ -0,0 +1,97 @@
//
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib.networking;
import java.util.ArrayList;
import java.util.List;
import com.kentington.thaumichorizons.common.lib.EntityInfusionProperties;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
public class PacketPlayerInfusionSync implements IMessage, IMessageHandler<PacketPlayerInfusionSync, IMessage>
{
int[] infusions;
String name;
boolean toggleClimb;
boolean toggleInvisible;
public PacketPlayerInfusionSync() {
this.infusions = new int[EntityInfusionProperties.NUM_INFUSIONS];
this.name = "";
this.toggleClimb = false;
this.toggleInvisible = false;
}
public PacketPlayerInfusionSync(final String name, final int[] infusions, final boolean toggleClimb, final boolean toggleInvisible) {
this.infusions = new int[EntityInfusionProperties.NUM_INFUSIONS];
this.name = "";
this.name = name;
this.infusions = infusions;
this.toggleClimb = toggleClimb;
this.toggleInvisible = toggleInvisible;
}
public IMessage onMessage(final PacketPlayerInfusionSync message, final MessageContext ctx) {
if (Minecraft.getMinecraft().theWorld != null && Minecraft.getMinecraft().theWorld.getPlayerEntityByName(message.name) != null && Minecraft.getMinecraft().theWorld.getPlayerEntityByName(message.name).getExtendedProperties("CreatureInfusion") != null) {
EntityPlayer player = Minecraft.getMinecraft().theWorld.getPlayerEntityByName(message.name);
EntityInfusionProperties prop = (EntityInfusionProperties)player.getExtendedProperties("CreatureInfusion");
prop.playerInfusions = message.infusions;
if (prop.toggleClimb != message.toggleClimb) {
prop.toggleClimb = message.toggleClimb;
}
if (prop.toggleInvisible != message.toggleInvisible) {
prop.toggleInvisible = message.toggleInvisible;
if (prop.toggleInvisible) {
player.removePotionEffectClient(Potion.invisibility.id);
player.setInvisible(false);
}
else {
final PotionEffect effect = new PotionEffect(Potion.invisibility.id, Integer.MAX_VALUE, 0, true);
effect.setCurativeItems((List)new ArrayList());
player.addPotionEffect(effect);
player.setInvisible(true);
}
}
}
return null;
}
public void fromBytes(final ByteBuf buf) {
final int length = buf.readInt();
final byte[] bites = new byte[length];
final char[] chars = new char[length];
buf.readBytes(bites);
for (int i = 0; i < length; ++i) {
chars[i] = (char)bites[i];
}
this.name = String.copyValueOf(chars);
for (int i = 0; i < EntityInfusionProperties.NUM_INFUSIONS; ++i) {
this.infusions[i] = buf.readInt();
}
this.toggleClimb = buf.readBoolean();
this.toggleInvisible = buf.readBoolean();
}
public void toBytes(final ByteBuf buf) {
buf.writeInt(this.name.length());
final byte[] bites = new byte[this.name.length()];
final char[] chars = this.name.toCharArray();
for (int i = 0; i < this.name.length(); ++i) {
bites[i] = (byte)chars[i];
}
buf.writeBytes(bites);
for (int i = 0; i < EntityInfusionProperties.NUM_INFUSIONS; ++i) {
buf.writeInt(this.infusions[i]);
}
buf.writeBoolean(this.toggleClimb);
buf.writeBoolean(this.toggleInvisible);
}
}
@@ -1,4 +1,4 @@
package com.kentington.thaumichorizons.common.lib;
package com.kentington.thaumichorizons.common.lib.networking;
import com.kentington.thaumichorizons.common.tiles.TileCloud;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
@@ -2,7 +2,7 @@
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib;
package com.kentington.thaumichorizons.common.lib.networking;
import io.netty.buffer.ByteBuf;
import cpw.mods.fml.relauncher.Side;
@@ -2,8 +2,9 @@
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib;
package com.kentington.thaumichorizons.common.lib.networking;
import com.kentington.thaumichorizons.common.lib.EntityInfusionProperties;
import net.minecraft.world.World;
import net.minecraftforge.common.DimensionManager;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
@@ -2,8 +2,9 @@
// Decompiled by Procyon v0.5.30
//
package com.kentington.thaumichorizons.common.lib;
package com.kentington.thaumichorizons.common.lib.networking;
import com.kentington.thaumichorizons.common.lib.EntityInfusionProperties;
import net.minecraft.world.World;
import java.util.List;
import java.util.ArrayList;
@@ -42,8 +43,8 @@ public class PacketToggleInvisibleToServer implements IMessage, IMessageHandler<
public IMessage onMessage(final PacketToggleInvisibleToServer message, final MessageContext ctx) {
final World world = (World)DimensionManager.getWorld(message.dim);
final EntityPlayer player = (EntityPlayer)world.getEntityByID(message.playerid);
((EntityInfusionProperties)player.getExtendedProperties("CreatureInfusion")).toggleClimb = !((EntityInfusionProperties)player.getExtendedProperties("CreatureInfusion")).toggleClimb;
if (((EntityInfusionProperties)player.getExtendedProperties("CreatureInfusion")).toggleClimb) {
((EntityInfusionProperties)player.getExtendedProperties("CreatureInfusion")).toggleInvisible = !((EntityInfusionProperties)player.getExtendedProperties("CreatureInfusion")).toggleInvisible;
if (((EntityInfusionProperties)player.getExtendedProperties("CreatureInfusion")).toggleInvisible) {
player.removePotionEffect(Potion.invisibility.id);
player.setInvisible(false);
}
@@ -4,11 +4,8 @@
package com.kentington.thaumichorizons.common.tiles;
import com.kentington.thaumichorizons.common.lib.PacketHandler;
import com.kentington.thaumichorizons.common.lib.PacketNoMoreItems;
import com.kentington.thaumichorizons.common.lib.PacketRainState;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import net.minecraft.entity.player.EntityPlayerMP;
import com.kentington.thaumichorizons.common.lib.networking.PacketHandler;
import com.kentington.thaumichorizons.common.lib.networking.PacketRainState;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.Vec3;
import net.minecraft.util.AxisAlignedBB;
@@ -16,10 +13,9 @@ import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.nbt.NBTTagCompound;
import com.kentington.thaumichorizons.common.entities.EntityItemInvulnerable;
import java.util.Iterator;
import java.util.List;
import net.minecraft.world.World;
import net.minecraftforge.common.DimensionManager;
import thaumcraft.common.config.ConfigBlocks;
import net.minecraft.entity.item.EntityXPOrb;
@@ -43,7 +39,6 @@ import net.minecraftforge.common.util.ForgeDirection;
import net.minecraft.init.Blocks;
import com.kentington.thaumichorizons.common.ThaumicHorizons;
import com.kentington.thaumichorizons.common.items.ItemFocusLiquefaction;
import net.minecraft.server.MinecraftServer;
import net.minecraft.block.Block;
import thaumcraft.api.TileThaumcraft;
@@ -22,7 +22,7 @@ public class TileSlot extends TileThaumcraft
public int pocketID;
public int which;
public boolean xAligned;
public TileSlot() {
this.hasKeystone = false;
this.portalOpen = false;
@@ -30,7 +30,7 @@ public class TileSlot extends TileThaumcraft
this.which = 0;
this.xAligned = false;
}
@Override
public void writeCustomNBT(final NBTTagCompound nbttagcompound) {
super.writeCustomNBT(nbttagcompound);
@@ -40,7 +40,7 @@ public class TileSlot extends TileThaumcraft
nbttagcompound.setBoolean("portalOpen", this.portalOpen);
nbttagcompound.setBoolean("aligned", this.xAligned);
}
@Override
public void readCustomNBT(final NBTTagCompound nbttagcompound) {
super.readCustomNBT(nbttagcompound);
@@ -50,27 +50,27 @@ public class TileSlot extends TileThaumcraft
this.portalOpen = nbttagcompound.getBoolean("portalOpen");
this.xAligned = nbttagcompound.getBoolean("aligned");
}
public void destroyPortal() {
if (this.worldObj.isRemote) {
return;
}
if (this.xAligned) {
this.worldObj.setBlock(this.xCoord - 2, this.yCoord, this.zCoord, Blocks.lapis_block);
this.worldObj.setBlock(this.xCoord + 2, this.yCoord, this.zCoord, Blocks.lapis_block);
this.worldObj.setBlock(this.xCoord - 2, this.yCoord - 4, this.zCoord, Blocks.lapis_block);
this.worldObj.setBlock(this.xCoord + 2, this.yCoord - 4, this.zCoord, Blocks.lapis_block);
this.worldObj.setBlock(this.xCoord - 1, this.yCoord, this.zCoord, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord + 1, this.yCoord, this.zCoord, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord - 1, this.yCoord - 4, this.zCoord, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord, this.yCoord - 4, this.zCoord, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord + 1, this.yCoord - 4, this.zCoord, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord - 2, this.yCoord - 1, this.zCoord, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord - 2, this.yCoord - 2, this.zCoord, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord - 2, this.yCoord - 3, this.zCoord, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord + 2, this.yCoord - 1, this.zCoord, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord + 2, this.yCoord - 2, this.zCoord, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord + 2, this.yCoord - 3, this.zCoord, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord - 2, this.yCoord, this.zCoord, ConfigBlocks.blockMetalDevice, 3, 1);
this.worldObj.setBlock(this.xCoord + 2, this.yCoord, this.zCoord, ConfigBlocks.blockMetalDevice, 3, 1);
this.worldObj.setBlock(this.xCoord - 2, this.yCoord - 4, this.zCoord, ConfigBlocks.blockMetalDevice, 3, 1);
this.worldObj.setBlock(this.xCoord + 2, this.yCoord - 4, this.zCoord, ConfigBlocks.blockMetalDevice, 3, 1);
this.worldObj.setBlock(this.xCoord - 1, this.yCoord, this.zCoord, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord + 1, this.yCoord, this.zCoord, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord - 1, this.yCoord - 4, this.zCoord, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord, this.yCoord - 4, this.zCoord, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord + 1, this.yCoord - 4, this.zCoord, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord - 2, this.yCoord - 1, this.zCoord, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord - 2, this.yCoord - 2, this.zCoord, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord - 2, this.yCoord - 3, this.zCoord, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord + 2, this.yCoord - 1, this.zCoord, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord + 2, this.yCoord - 2, this.zCoord, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord + 2, this.yCoord - 3, this.zCoord, ConfigBlocks.blockCosmeticSolid, 11, 1);
for (int x = -1; x <= 1; ++x) {
for (int y = -1; y >= -3; --y) {
this.worldObj.setBlockToAir(this.xCoord + x, this.yCoord + y, this.zCoord);
@@ -83,21 +83,21 @@ public class TileSlot extends TileThaumcraft
}
}
else {
this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord - 2, Blocks.lapis_block);
this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord + 2, Blocks.lapis_block);
this.worldObj.setBlock(this.xCoord, this.yCoord - 4, this.zCoord - 2, Blocks.lapis_block);
this.worldObj.setBlock(this.xCoord, this.yCoord - 4, this.zCoord + 2, Blocks.lapis_block);
this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord - 1, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord + 1, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord, this.yCoord - 4, this.zCoord - 1, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord, this.yCoord - 4, this.zCoord, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord, this.yCoord - 4, this.zCoord + 1, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord, this.yCoord - 1, this.zCoord - 2, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord, this.yCoord - 2, this.zCoord - 2, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord, this.yCoord - 3, this.zCoord - 2, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord, this.yCoord - 1, this.zCoord + 2, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord, this.yCoord - 2, this.zCoord + 2, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord, this.yCoord - 3, this.zCoord + 2, ConfigBlocks.blockCosmeticSolid, 6, 3);
this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord - 2, ConfigBlocks.blockMetalDevice, 3, 1);
this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord + 2, ConfigBlocks.blockMetalDevice, 3, 1);
this.worldObj.setBlock(this.xCoord, this.yCoord - 4, this.zCoord - 2, ConfigBlocks.blockMetalDevice, 3, 1);
this.worldObj.setBlock(this.xCoord, this.yCoord - 4, this.zCoord + 2, ConfigBlocks.blockMetalDevice, 3, 1);
this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord - 1, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord, this.yCoord, this.zCoord + 1, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord, this.yCoord - 4, this.zCoord - 1, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord, this.yCoord - 4, this.zCoord, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord, this.yCoord - 4, this.zCoord + 1, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord, this.yCoord - 1, this.zCoord - 2, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord, this.yCoord - 2, this.zCoord - 2, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord, this.yCoord - 3, this.zCoord - 2, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord, this.yCoord - 1, this.zCoord + 2, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord, this.yCoord - 2, this.zCoord + 2, ConfigBlocks.blockCosmeticSolid, 11, 1);
this.worldObj.setBlock(this.xCoord, this.yCoord - 3, this.zCoord + 2, ConfigBlocks.blockCosmeticSolid, 11, 1);
for (int z = -1; z <= 1; ++z) {
for (int y = -1; y >= -3; --y) {
this.worldObj.setBlockToAir(this.xCoord, this.yCoord + y, this.zCoord + z);
@@ -115,14 +115,14 @@ public class TileSlot extends TileThaumcraft
this.markDirty();
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
}
public void makePortal(final EntityPlayer player) {
if (this.worldObj.isRemote) {
return;
}
final int portalNum = PocketPlaneData.firstAvailablePortal(this.pocketID);
final ItemWandCasting wand = (ItemWandCasting)player.getHeldItem().getItem();
if (portalNum != 0 && wand.consumeAllVisCrafting(player.getHeldItem(), player, new AspectList().add(Aspect.WATER, 100).add(Aspect.EARTH, 100).add(Aspect.ORDER, 100).add(Aspect.FIRE, 100).add(Aspect.AIR, 100).add(Aspect.ENTROPY, 100), false)) {
if (portalNum != 0 && wand.consumeAllVisCrafting(player.getHeldItem(), player, new AspectList().add(Aspect.WATER, 250).add(Aspect.EARTH, 250).add(Aspect.ORDER, 250).add(Aspect.FIRE, 250).add(Aspect.AIR, 250).add(Aspect.ENTROPY, 250), false)) {
boolean madePortal = false;
if (this.checkPortalX()) {
this.xAligned = true;
@@ -157,43 +157,44 @@ public class TileSlot extends TileThaumcraft
madePortal = true;
}
if (madePortal) {
PocketPlaneData planeData = PocketPlaneData.planes.get(this.pocketID);
int[] portal;
switch (portalNum) {
case 1: {
PocketPlaneData.planes.get(this.pocketID).portalA[0] = this.xCoord;
PocketPlaneData.planes.get(this.pocketID).portalA[1] = this.yCoord;
PocketPlaneData.planes.get(this.pocketID).portalA[2] = this.zCoord;
case 1:
planeData.portalA = new int[4];
portal = planeData.portalA;
break;
}
case 2: {
PocketPlaneData.planes.get(this.pocketID).portalB[0] = this.xCoord;
PocketPlaneData.planes.get(this.pocketID).portalB[1] = this.yCoord;
PocketPlaneData.planes.get(this.pocketID).portalB[2] = this.zCoord;
case 2:
planeData.portalB = new int[4];
portal = planeData.portalB;
break;
}
case 3: {
PocketPlaneData.planes.get(this.pocketID).portalC[0] = this.xCoord;
PocketPlaneData.planes.get(this.pocketID).portalC[1] = this.yCoord;
PocketPlaneData.planes.get(this.pocketID).portalC[2] = this.zCoord;
case 3:
planeData.portalC = new int[4];
portal = planeData.portalC;
break;
}
case 4: {
PocketPlaneData.planes.get(this.pocketID).portalD[0] = this.xCoord;
PocketPlaneData.planes.get(this.pocketID).portalD[1] = this.yCoord;
PocketPlaneData.planes.get(this.pocketID).portalD[2] = this.zCoord;
case 4:
planeData.portalD = new int[4];
portal = planeData.portalD;
break;
}
default:
return;
}
portal[0] = this.xCoord;
portal[1] = this.yCoord;
portal[2] = this.zCoord;
portal[3] = player.dimension;
PocketPlaneData.makePortal(this.pocketID, portalNum, this.xCoord, this.yCoord, this.zCoord);
this.which = portalNum;
this.portalOpen = true;
wand.consumeAllVisCrafting(player.getHeldItem(), player, new AspectList().add(Aspect.WATER, 100).add(Aspect.EARTH, 100).add(Aspect.ORDER, 100).add(Aspect.FIRE, 100).add(Aspect.AIR, 100).add(Aspect.ENTROPY, 100), true);
wand.consumeAllVisCrafting(player.getHeldItem(), player, new AspectList().add(Aspect.WATER, 250).add(Aspect.EARTH, 250).add(Aspect.ORDER, 250).add(Aspect.FIRE, 250).add(Aspect.AIR, 250).add(Aspect.ENTROPY, 250), true);
this.worldObj.playSoundEffect(this.xCoord + 0.5, this.yCoord + 0.5, this.zCoord + 0.5, "thaumcraft:wand", 1.0f, 1.0f);
this.markDirty();
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
}
}
}
boolean checkPortalX() {
for (int x = -1; x <= 1; ++x) {
for (int y = -1; y >= -3; --y) {
@@ -202,9 +203,10 @@ public class TileSlot extends TileThaumcraft
}
}
}
return this.worldObj.getBlock(this.xCoord - 2, this.yCoord, this.zCoord) == Blocks.lapis_block && this.worldObj.getBlock(this.xCoord + 2, this.yCoord, this.zCoord) == Blocks.lapis_block && this.worldObj.getBlock(this.xCoord - 2, this.yCoord - 4, this.zCoord) == Blocks.lapis_block && this.worldObj.getBlock(this.xCoord + 2, this.yCoord - 4, this.zCoord) == Blocks.lapis_block && this.isArcStone(this.xCoord - 1, this.yCoord, this.zCoord) && this.isArcStone(this.xCoord + 1, this.yCoord, this.zCoord) && this.isArcStone(this.xCoord - 2, this.yCoord - 1, this.zCoord) && this.isArcStone(this.xCoord - 2, this.yCoord - 2, this.zCoord) && this.isArcStone(this.xCoord - 2, this.yCoord - 3, this.zCoord) && this.isArcStone(this.xCoord + 2, this.yCoord - 1, this.zCoord) && this.isArcStone(this.xCoord + 2, this.yCoord - 2, this.zCoord) && this.isArcStone(this.xCoord + 2, this.yCoord - 3, this.zCoord) && this.isArcStone(this.xCoord - 1, this.yCoord - 4, this.zCoord) && this.isArcStone(this.xCoord, this.yCoord - 4, this.zCoord) && this.isArcStone(this.xCoord + 1, this.yCoord - 4, this.zCoord);
return checkBlocksX(this.xCoord, this.yCoord, this.zCoord);
}
boolean checkPortalZ() {
for (int z = -1; z <= 1; ++z) {
for (int y = -1; y >= -3; --y) {
@@ -213,20 +215,71 @@ public class TileSlot extends TileThaumcraft
}
}
}
return this.worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord - 2) == Blocks.lapis_block && this.worldObj.getBlock(this.xCoord, this.yCoord, this.zCoord + 2) == Blocks.lapis_block && this.worldObj.getBlock(this.xCoord, this.yCoord - 4, this.zCoord - 2) == Blocks.lapis_block && this.worldObj.getBlock(this.xCoord, this.yCoord - 4, this.zCoord + 2) == Blocks.lapis_block && this.isArcStone(this.xCoord, this.yCoord, this.zCoord - 1) && this.isArcStone(this.xCoord, this.yCoord, this.zCoord + 1) && this.isArcStone(this.xCoord, this.yCoord - 1, this.zCoord - 2) && this.isArcStone(this.xCoord, this.yCoord - 2, this.zCoord - 2) && this.isArcStone(this.xCoord, this.yCoord - 3, this.zCoord - 2) && this.isArcStone(this.xCoord, this.yCoord - 1, this.zCoord + 2) && this.isArcStone(this.xCoord, this.yCoord - 2, this.zCoord + 2) && this.isArcStone(this.xCoord, this.yCoord - 3, this.zCoord + 2) && this.isArcStone(this.xCoord, this.yCoord - 4, this.zCoord - 1) && this.isArcStone(this.xCoord, this.yCoord - 4, this.zCoord) && this.isArcStone(this.xCoord, this.yCoord - 4, this.zCoord + 1);
return checkBlocksZ(this.xCoord, this.yCoord, this.zCoord);
}
boolean isArcStone(final int x, final int y, final int z) {
return this.worldObj.getBlock(x, y, z) == ConfigBlocks.blockCosmeticSolid && this.worldObj.getBlockMetadata(x, y, z) == 6;
boolean checkBlocksX(int x, int y, int z) {
boolean isValid = true;
isValid &= checkCornerBlock(x - 2, y, z);
isValid &= checkCornerBlock(x + 2, y, z);
isValid &= checkCornerBlock(x - 2, y - 4, z);
isValid &= checkCornerBlock(x + 2, y - 4, z);
isValid &= checkEdgeBlock(x - 1, y, z);
isValid &= checkEdgeBlock(x + 1, y, z);
isValid &= checkEdgeBlock(x - 2, y - 1, z);
isValid &= checkEdgeBlock(x + 2, y - 1, z);
isValid &= checkEdgeBlock(x - 2, y - 2, z);
isValid &= checkEdgeBlock(x + 2, y - 2, z);
isValid &= checkEdgeBlock(x - 2, y - 3, z);
isValid &= checkEdgeBlock(x + 2, y - 3, z);
isValid &= checkEdgeBlock(x - 1, y - 4, z);
isValid &= checkEdgeBlock(x, y - 4, z);
isValid &= checkEdgeBlock(x + 1, y - 4, z);
return isValid;
}
boolean checkBlocksZ(int x, int y, int z) {
boolean isValid = true;
isValid &= checkCornerBlock(x, y, z - 2);
isValid &= checkCornerBlock(x, y, z + 2);
isValid &= checkCornerBlock(x, y - 4, z - 2);
isValid &= checkCornerBlock(x, y - 4, z + 2);
isValid &= checkEdgeBlock(x, y, z - 1);
isValid &= checkEdgeBlock(x, y, z + 1);
isValid &= checkEdgeBlock(x, y - 1, z - 2);
isValid &= checkEdgeBlock(x, y - 1, z + 2);
isValid &= checkEdgeBlock(x, y - 2, z - 2);
isValid &= checkEdgeBlock(x, y - 2, z + 2);
isValid &= checkEdgeBlock(x, y - 3, z - 2);
isValid &= checkEdgeBlock(x, y - 3, z + 2);
isValid &= checkEdgeBlock(x, y - 4, z - 1);
isValid &= checkEdgeBlock(x, y - 4, z);
isValid &= checkEdgeBlock(x, y - 4, z + 1);
return isValid;
}
boolean checkCornerBlock(final int x, final int y, final int z) {
return this.worldObj.getBlock(x, y, z) == ConfigBlocks.blockMetalDevice && this.worldObj.getBlockMetadata(x, y, z) == 3;
}
boolean checkEdgeBlock(final int x, final int y, final int z) {
return this.worldObj.getBlock(x, y, z) == ConfigBlocks.blockCosmeticSolid && this.worldObj.getBlockMetadata(x, y, z) == 11;
}
public void insertKeystone(final int pocketNum) {
this.hasKeystone = true;
this.pocketID = pocketNum;
this.markDirty();
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
}
public int removeKeystone() {
this.hasKeystone = false;
this.markDirty();
@@ -4,7 +4,7 @@
package com.kentington.thaumichorizons.common.tiles;
import com.kentington.thaumichorizons.common.lib.PacketFXEssentiaBubble;
import com.kentington.thaumichorizons.common.lib.networking.PacketFXEssentiaBubble;
import net.minecraft.init.Items;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.INpc;
@@ -15,7 +15,7 @@ import net.minecraft.entity.monster.EntityGolem;
import java.util.Set;
import com.google.common.collect.Multimap;
import com.kentington.thaumichorizons.common.lib.PacketFXInfusionDone;
import com.kentington.thaumichorizons.common.lib.networking.PacketFXInfusionDone;
import net.minecraft.entity.ai.attributes.AttributeModifier;
import com.google.common.collect.HashMultimap;
import com.kentington.thaumichorizons.common.entities.IEntityInfusedStats;
@@ -30,10 +30,9 @@ import java.util.List;
import net.minecraft.util.DamageSource;
import thaumcraft.common.lib.network.fx.PacketFXBlockZap;
import net.minecraft.util.AxisAlignedBB;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.NetworkRegistry;
import com.kentington.thaumichorizons.common.lib.PacketInfusionFX;
import com.kentington.thaumichorizons.common.lib.PacketHandler;
import com.kentington.thaumichorizons.common.lib.networking.PacketInfusionFX;
import com.kentington.thaumichorizons.common.lib.networking.PacketHandler;
import thaumcraft.api.crafting.InfusionRecipe;
import thaumcraft.api.visnet.VisNetHandler;
import net.minecraft.item.Item;
@@ -23,6 +23,7 @@ import net.minecraft.util.*;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.Teleporter;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import net.minecraftforge.common.DimensionManager;
import thaumcraft.api.ThaumcraftApiHelper;
import thaumcraft.api.TileThaumcraft;
@@ -39,6 +40,8 @@ import thaumcraft.common.items.wands.ItemWandCasting;
import java.util.ArrayList;
import java.util.List;
import static com.kentington.thaumichorizons.common.lib.PocketPlaneData.pocketPlaneMAXID;
public class TileVortex extends TileThaumcraft implements IWandable, IAspectContainer
{
final int MAX_COUNT = 2400;
@@ -87,7 +90,10 @@ public class TileVortex extends TileThaumcraft implements IWandable, IAspectCont
++this.count;
if (this.count > 25) {
if (this.createdDimension) {
MinecraftServer.getServer().worldServerForDimension(ThaumicHorizons.dimensionPocketId).setBlockToAir(0, 129, this.dimensionID * 256);
WorldServer wsd = DimensionManager.getWorld(ThaumicHorizons.dimensionPocketId);
if (wsd != null) {
wsd.setBlockToAir(0, 129, this.dimensionID * 256);
}
}
this.worldObj.setBlockToAir(this.xCoord, this.yCoord, this.zCoord);
if (worldObj.isRemote)
@@ -102,13 +108,13 @@ public class TileVortex extends TileThaumcraft implements IWandable, IAspectCont
else {
if (!this.ateDevices) {
if (!this.cheat && this.worldObj.provider.dimensionId != ThaumicHorizons.dimensionPocketId) {
for (int dx = -1; dx < 2; ++dx) {
for (int dy = -1; dy < 2; ++dy) {
for (int dz = -1; dz < 2; ++dz) {
for (int dx = -2; dx <= 2; ++dx) {
for (int dy = -2; dy <= 2; ++dy) {
for (int dz = -2; dz <= 2; ++dz) {
if (dx != 0 || dy != 0 || dz != 0) {
this.worldObj.setBlockToAir(this.xCoord + dx, this.yCoord + dy, this.zCoord + dz);
if (worldObj.isRemote)
Thaumcraft.proxy.burst(this.worldObj, (double)(this.xCoord + dx), (double)(this.yCoord + dy), (double)(this.zCoord + dz), 2.0f);
Thaumcraft.proxy.burst(this.worldObj, (double)(this.xCoord + dx), (double)(this.yCoord + dy), (double)(this.zCoord + dz), 4.0f);
}
}
}
@@ -137,14 +143,14 @@ public class TileVortex extends TileThaumcraft implements IWandable, IAspectCont
if (player.ridingEntity == null && player.riddenByEntity == null) {
final MinecraftServer mServer = FMLCommonHandler.instance().getMinecraftServerInstance();
if (player.timeUntilPortal > 0) {
player.timeUntilPortal = 100;
player.timeUntilPortal = 10;
}
else if (player.dimension != ThaumicHorizons.dimensionPocketId) {
player.timeUntilPortal = 100;
player.timeUntilPortal = 10;
player.mcServer.getConfigurationManager().transferPlayerToDimension(player, ThaumicHorizons.dimensionPocketId, (Teleporter)new VortexTeleporter(mServer.worldServerForDimension(ThaumicHorizons.dimensionPocketId), this.dimensionID));
}
else {
player.timeUntilPortal = 100;
player.timeUntilPortal = 10;
player.mcServer.getConfigurationManager().transferPlayerToDimension(player, this.returnID, (Teleporter)new VortexTeleporter(mServer.worldServerForDimension(this.returnID), this.dimensionID));
}
}
@@ -241,7 +247,7 @@ public class TileVortex extends TileThaumcraft implements IWandable, IAspectCont
name = pearl.func_145800_j() + StatCollector.translateToLocal("thaumichorizons.pocketplane");
}
data.name = name;
this.dimensionID = PocketPlaneData.planes.size();
this.dimensionID = pocketPlaneMAXID;
if (DimensionManager.getWorld(ThaumicHorizons.dimensionPocketId) == null) {
DimensionManager.initDimension(ThaumicHorizons.dimensionPocketId);
}
@@ -0,0 +1,547 @@
itemGroup.thaumichorizons=Новые горизонты
#v3 by TimeConqueror
thaumichorizons.noJar=У вас должна быть пустая банка, чтобы поймать существо!
thaumichorizons.setBeacon=Маяк душ был установлен!
thaumichorizons.startSitting=в ожидании дальнейших действий.
thaumichorizons.stopSitting=будет сопровождать вас.
thaumichorizons.revived=Пустая оболочка
thaumichorizons.pocketplane=Карманное измерение
thaumichorizons.golemWarning1=Один из ваших големов ведет себя странно.
thaumichorizons.golemWarning2=Один из ваших големов начал тихо петь.
thaumichorizons.golemWarning3=Вдали вы слышите чей-то смех.
focus.upgrade.slow.name=Замедление
focus.upgrade.slow.text=Существа, попавшие под влияние луча смирения, будут временно замедляться, что упростит фокусирование на цели.
focus.upgrade.golemDuration.name=Время жизни голема
focus.upgrade.golemDuration.text=Големы, созданные этим набалдашником, будут иметь дополнительные 10 секунд жизни.
focus.upgrade.berserk.name=Безумие
focus.upgrade.berserk.text=Големы, созданные таким набалдашником, агрессивнее обычных. При наличии боевых сердец такие големы будут атаковать все живое вокруг, даже игроков, кроме своего создателя.
focus.upgrade.detonation.name=Детонация
focus.upgrade.detonation.text=Големы, созданные этим набалдашником, разрываются на части, если умирают в бою или время их жизни подходит к концу. Голем будет следовать за хозяином на безопасной дистанции.
focus.upgrade.nuggets.name=Самородки
focus.upgrade.nuggets.text=Этот набалдашник плавит руду более эффективно, производя бонусные самородки, как в адской печи.
focus.upgrade.purity.name=Очищение
focus.upgrade.purity.text=Этот набалдашник будет очищать руды и создавать из них кластеры, а потом плавить их, производя большее количество слитков.
focus.upgrade.enervation.name=Расслабление
focus.upgrade.enervation.text=Существа, попавшие под действие этого луча, теряют жизненные силы, подвергаются большему урону и замедляются.
focus.upgrade.solar.name=Жгучесть
focus.upgrade.solar.text=Сферы, созданные этим набалдашником, будут сжигать нежить при контакте.
focus.upgrade.headlightfluid.name=Жидкий свет
focus.upgrade.headlightfluid.text=Этим набалдашником можно наполнить один кубический метр жидкости мягким эфирным светом. Эфир довольно хрупок, поэтому, если эту воду взять в ведро — эффект будет рассеян.
focus.upgrade.fission.name=Расщепление Вис
focus.upgrade.fission.text=Этот набалдашник с шансом 20% наполнит одно очко всех начальных аспектов, существующих в вытягиваемом составном аспекте.
focus.upgrade.escape.name=Побег
focus.upgrade.escape.text=С помощью этого улучшения можно создавать портал во Внешние Земли.
critterInfusions.quicksilver=Ртутные конечности
critterInfusions.thaumClaws=Таум-когти
critterInfusions.awakeBlood=Пробужденная кровь
critterInfusions.diamondSkin=Алмазная плоть
critterInfusions.enderHeart=Сердце Края
critterInfusions.shockSkin=Электрическая кожа
critterInfusions.instilledLoyalty=Внушение верности
critterInfusions.runicHide=Руническая оболочка
critterInfusions.eldritchFangs=Клыки Древних
critterInfusions.portability=Портативность
selfInfusions.quicksilver=Для себя: Ртутные конечности
selfInfusions.morphic=Для себя: Морфические пальцы
selfInfusions.awakeBlood=Для себя: Пробужденная кровь
selfInfusions.diamondSkin=Для себя: Алмазная плоть
selfInfusions.silverHeart=Для себя: Серебрянодревесное сердце
selfInfusions.synthSkin=Для себя: Синтетическая кожа
selfInfusions.amphibious=Для себя: Дыхание амфибии
selfInfusions.warpedTumor=Для себя: Орган искажения
selfInfusions.spiderClimb=Для себя: Паучье восхождение
selfInfusions.chameleonSkin=Для себя: Шкура хамелеона
###ENTITIES###
entity.ThaumicHorizons.PrimedAlchemite.name=Горящий алхимит
entity.ThaumicHorizons.ChromaticSheep.name=Разноцветная овца
entity.ThaumicHorizons.SelfShearingSheep.name=Самостригущаяся овца
entity.ThaumicHorizons.GuardianPanther.name=Пантера-страж
entity.ThaumicHorizons.Gravekeeper.name=Могильщик
entity.ThaumicHorizons.Familiar.name=Компаньон
entity.ThaumicHorizons.ChocolateCow.name=Шоколадная корова
entity.ThaumicHorizons.WizardCow.name=Эфирная корова
entity.ThaumicHorizons.ScholarChicken.name=Курица Ученого
entity.ThaumicHorizons.GoldChicken.name=Золотоносная курица
entity.ThaumicHorizons.OrePig.name=Рудный кабан
entity.ThaumicHorizons.TaintEaterPig.name=Пожиратель порчи
entity.ThaumicHorizons.Thunderhorse.name=Громовая лошадь
entity.ThaumicHorizons.Endersteed.name=Скакун Края
entity.ThaumicHorizons.Nightmare.name=Ночной кошмар
entity.ThaumicHorizons.NightmareTH.name=Ночной кошмар
entity.ThaumicHorizons.HorseZombie.name=Лошадь-зомби
entity.ThaumicHorizons.HorseSkeleton.name=Лошадь-скелет
entity.ThaumicHorizons.Seawolf.name=Морской волк
entity.ThaumicHorizons.NetherHound.name=Адская гончая
entity.ThaumicHorizons.LunarWolf.name=Лунный волк
entity.ThaumicHorizons.Syringe.name=Шприц
entity.ThaumicHorizons.BlastPhial.name=Взрывной пузырёк
entity.ThaumicHorizons.BoatGreatwood.name=Великодревесная лодка
entity.ThaumicHorizons.BoatThaumium.name=Таум-лодка
entity.ThaumicHorizons.MeatSlime.name=Мясной слизень
entity.ThaumicHorizons.MercurialSlime.name=Ртутный слизень
entity.ThaumicHorizons.VoltSlime.name=Электрический слизень
entity.ThaumicHorizons.MedSlime.name=Грязевой слизень
entity.ThaumicHorizons.Sheeder.name=Овцеук
entity.ThaumicHorizons.LostSoul.name=Потерянная душа
###POTIONS###
potion.visboost=Увеличение Вис
potion.visregen=Генерация Вис
potion.vacuum=Магнит
potion.shock=Статический Шок
potion.synthesis=Фотосинтез
###ITEMS###
item.Wand.disposable.rod=Кристаллический
item.Wand.disposable.cap=Одноразовый
item.eggIncubated.name=Инкубированное яйцо
item.lensCase.name=Сумка для линз
item.LensFire.name=Линза изучения
item.LensWater.name=Линза эхолокации
item.LensAir.name=Линза обнаружения биоэлектрических полей
item.LensEarth.name=Линза исчезновения
item.LensOrderEntropy.name=Линза открытий
item.focusContainment.name=Набалдашник: Сдерживание
item.jarredSoul.0.name=Стазисная банка
item.jarredSoul.1.name=Закупоренная душа
item.jarredSoul.jarred=В банке:
item.jarredSoul.soul=Душа
item.amuletMirror.name=Зеркальный амулет
item.injection.0.name=Сыворотка
item.injection.1.name=Взрывной пузырёк
item.syringeBlood.0.name=Шприц с кровью
item.syringeBlood.1.name=Взрывной пузырёк
item.syringeEmpty.name=Пустой шприц
item.syringeSample.name=Образец крови
item.injector.name=Арбалет для инъекций
item.corpseEffigy.name=Гомункулус
item.nutrients.name=Питательная смесь
item.chocolate.name=Плитка шоколада
item.chocolateMilk.name=Ведро шоколадного молока
item.icecream.name=Шоколадное мороженое
item.inkEgg.name=Чернильное яйцо
item.goldEgg.name=Позолоченное яйцо
item.infusion.name=Настойка из сущности
item.suicidePill.name=Эвтаназия
item.focusAnimation.name=Набалдашник: Одушевление
item.focusLiquefaction.name=Набалдашник: Расплавление
item.focusDisintegration.name=Набалдашник: Распад
item.focusIllumination.0.name=Набалдашник: Освещение (Черный)
item.focusIllumination.1.name=Набалдашник: Освещение (Красный)
item.focusIllumination.2.name=Набалдашник: Освещение (Зеленый)
item.focusIllumination.3.name=Набалдашник: Освещение (Коричневый)
item.focusIllumination.4.name=Набалдашник: Освещение (Синий)
item.focusIllumination.5.name=Набалдашник: Освещение (Фиолетовый)
item.focusIllumination.6.name=Набалдашник: Освещение (Голубой)
item.focusIllumination.7.name=Набалдашник: Освещение (Серебряный)
item.focusIllumination.8.name=Набалдашник: Освещение (Серый)
item.focusIllumination.9.name=Набалдашник: Освещение (Розовый)
item.focusIllumination.10.name=Набалдашник: Освещение (Лаймовый)
item.focusIllumination.11.name=Набалдашник: Освещение (Желтый)
item.focusIllumination.12.name=Набалдашник: Освещение (Голубой)
item.focusIllumination.13.name=Набалдашник: Освещение (Фиолетовый)
item.focusIllumination.14.name=Набалдашник: Освещение (Оранжевый)
item.focusIllumination.15.name=Набалдашник: Освещение (Белый)
item.focusAnimation.name=Набалдашник: Одушевление
item.golemPowder.name=Порошок одушевления
item.golemPlacer.name=Одушевленный голем
item.GolemBell.name=Колокольчик Голема
item.boatGreatwood.name=Великодревесная лодка
item.boatThaumium.name=Таум-лодка
item.conduit.name=Пространственный тоннель
item.keystoneBlank.name=Пустой пространственный ключ-камень
item.keystoneTH.name=Пространственный ключ-камень
item.crystalWand.name=Инертный кристаллический жезл
item.voidPutty.name=Пустотная замазка
item.meatTH.name="Мясо неизвестного существа"
item.meatcookedTH.name=Стейк из неизвестного существа
item.meatnuggetTH.name=Кусочек стейка из неизвестного существа
item.nodeCheat.name=Узел-Создатель
###BLOCKS###
tile.ThaumicHorizons_synthNode.name=Эфирный Кристалл
tile.ThaumicHorizons_alchemite.name=Алхимит
tile.ThaumicHorizons_visDynamo.name=Вис-Динамо
tile.ThaumicHorizons_essentiaDynamo.name=Динамо-реле эссенции
tile.ThaumicHorizons_nodeMonitor.name=Узел-наблюдатель
tile.ThaumicHorizons_soulSieve.name=Просеиватель душ
tile.ThaumicHorizons_inspiratron.name=Поглотитель мыслей
tile.ThaumicHorizons_soulforge.name=Кузница душ
tile.ThaumicHorizons_soulJar.name=%CRITTER в банке
tile.ThaumicHorizons_bloodInfuser.name=Сывороточный куб
tile.ThaumicHorizons_vat.name=Исцеляющий чан
tile.ThaumicHorizons_vatSolid.name=Исцеляющий чан
tile.ThaumicHorizons_soulBeacon.name=Маяк душ
tile.ThaumicHorizons_modMatrix.name=Модифицированная руническая матрица
tile.ThaumicHorizons_chocolate.name=Блок шоколада
tile.ThaumicHorizons_transductionAmplifier.name=Узел-стимулятор
tile.ThaumicHorizons_recombinator.name=Последовательный объединитель Вис
tile.ThaumicHorizons_vortexStabilizer.name=Вихревой сдерживатель
tile.ThaumicHorizons_light.name=Световой шар
tile.ThaumicHorizons_vortex.0.name=Подпространственный вихрь
tile.ThaumicHorizons_vortex.1.name=Подпространственный вихрь (творческий, стабильный)
tile.ThaumicHorizons_void.name=Граница пространства
tile.ThaumicHorizons_slot.name=Вместилище Ключ-камня
tile.ThaumicHorizons_cloud.0.name=Облако
tile.ThaumicHorizons_cloud.1.name=Облако плазмы
tile.ThaumicHorizons_cloud.2.name=Грозовое облако
tile.ThaumicHorizons_cloud.3.name=Кислотное облако
tile.ThaumicHorizons_cloud.4.name=Облако из жидкого сплава
tile.ThaumicHorizons_cloud.5.name=Тучное облако
tile.ThaumicHorizons_cloud.6.name=Облако Вис
tile.ThaumicHorizons_cloud.7.name=Глифовое облако
tile.ThaumicHorizons_cloud.8.name=Облако со спорами
tile.ThaumicHorizons_cloud.9.name=Облако оживления
tile.ThaumicHorizons_brain.name=Разбухший мозг
tile.ThaumicHorizons_dust.name=Пыль
tile.ThaumicHorizons_eye.name=Глазное скопление
tile.ThaumicHorizons_flesh.name=Разбухшая плоть
tile.ThaumicHorizons_bone.name=Кость
tile.ThaumicHorizons_spike.name=Металлический шип
tile.ThaumicHorizons_spikeWood.name=Деревянный шип
tile.ThaumicHorizons_spikeTooth.name=Зуб
tile.ThaumicHorizons_crystal.0.name=Белый кристалл
tile.ThaumicHorizons_crystal.1.name=Оранжевый кристалл
tile.ThaumicHorizons_crystal.2.name=Пурпурный кристалл
tile.ThaumicHorizons_crystal.3.name=Голубой кристалл
tile.ThaumicHorizons_crystal.4.name=Желтый кристалл
tile.ThaumicHorizons_crystal.5.name=Лаймовый кристалл
tile.ThaumicHorizons_crystal.6.name=Розовый кристалл
tile.ThaumicHorizons_crystal.7.name=Серый кристалл
tile.ThaumicHorizons_crystal.8.name=Светло-серый кристалл
tile.ThaumicHorizons_crystal.9.name=Бирюзовый кристалл
tile.ThaumicHorizons_crystal.10.name=Фиолетовый кристалл
tile.ThaumicHorizons_crystal.11.name=Синий кристалл
tile.ThaumicHorizons_crystal.12.name=Коричневый кристалл
tile.ThaumicHorizons_crystal.13.name=Зеленый кристалл
tile.ThaumicHorizons_crystal.14.name=Красный кристалл
tile.ThaumicHorizons_crystal.15.name=Черный кристалл
tile.ThaumicHorizons_deepcrystal.name=Насыщенный кристалл
tile.ThaumicHorizons_leviathan.name=Первичное ископаемое
tile.ThaumicHorizons_gateway.name=Пространственные Врата
###RESEARCH###
tc.research_category.ThaumicHorizons=Новые горизонты
tc.research_name.alcheponics=Аграрная Алхимия
tc.research_text.alcheponics=Нужда в посевах
alcheponics1=В то время как неживая материя достаточно легко подвергается изменениям с помощью алхимии, живые существа зачастую погибают при попытке подвергнуть их преобразованиям. Темой вашего последнего исследования стала иная тактика - вместо того, чтобы пытаться модифицировать растения, вы просто использовали алхимию, чтобы ускорить их естественный жизненный цикл.<BR> Путем наполнения семян эссенцией Света, Воды и Земли, вы открываете способность растений к мгновенному росту.
alcheponics2=К сожалению, этот процесс берет свое; растение тут же растворяется, оставляя вам лишь плоды. Все культуры (кроме пшеницы), полученные с помощью алхимии, можно вырастить еще раз, так как полученные побеги оказались стерильными.<BR>Перевод Аддона выполнен игроками §4TimeConqueror§0 & §5M§3udresistor
tc.research_name.alchIncubation=Алхимическая инкубация
tc.research_text.alchIncubation=Курица в каждом тигеле
alchIncubation1=После успешного применения Аграрной Алхимии, вы решаете повторить ваши опыты над животными. Обеспечение куриного яйцо Ignis и Victus гарантирует, что эмбрион внутри яйца сформируется в полноценный организм. При разбивании такого яйца со 100% шансом вылупляется курица. <BR> Более того, изучив процесс роста цыпленка, вы, кажется, нашли решение проблемы увядания растений, полученных вами.
tc.research_name.meatGrowth=Выращивание плоти
tc.research_text.meatGrowth=Скажи жестокости нет
meatGrowth1=Теперь у вас есть твердое понимание того, как алхимия взаимодействует с естественным ростом организма. Путем выборочного применения этих методов, вы можете выращивать отдельные ткани без необходимости выращивать животное целиком! <BR> Наиболее очевидное применение этого открытия заключается в производстве продуктов питания. Небольшой образец сырого мяса можно выращивать до произвольного размера без потери формы или вкуса.
tc.research_name.shardTrans=Трансмутация Кристаллов
tc.research_text.shardTrans=Несбалансированные кристаллы
shardTrans1=Одна из самых распространённых проблем тауматургии, когда у вас кончились кристаллы одного, именно сейчас нужного вам вида, а вокруг навалена куча других, будто в насмешку над вами. Эта досада, наконец, осталась в прошлом. <BR> Хотя любой кристалл может быть легко превращен в сбалансированный, вы только что открыли способ, чтобы обратить этот процесс вспять. Заряжая осколок с переизбытком нужного аспекта и используя небольшое количество §5Permutatio§0, чтобы "смыть" остаток, вы получите обычный кристалл.
tc.research_name.fleshLeather=Закалка Плоти
tc.research_text.fleshLeather=От еды – к моде
fleshLeather1=Несмотря на ваш успех в выращивании мяса, выращивание кожи оказалось более неприятной проблемой. Теперь вы, возможно, обнаружили альтернативный способ производства кожи. <BR> При кипячении в правильной смеси эссенций, большинство сортов плоти затвердевают, становясь неотличимыми от настоящей кожи. Вам даже удалось преобразовать гнилую плоть Зомби, но небольшая порция эссенции §7Ordo§0 необходима, чтобы обратить ее разложение.
tc.research_name.etherealShard=Эфирный Кристалл
tc.research_text.etherealShard=Изящное хранилище вис
etherealShard1=Эфирная эссенция, остающаяся от разбитых узлов ауры, долго оставалась для вас загадкой. Похоже что она хранит вис в иной форме, непохожей на узел ауры, потому что не может поддерживать форму, не имея стабильного ядра, в отличие от самого узла. <BR> Вы, возможно, обнаружили обходные пути для обоих этих вопросов. Используя наполнение, вы смогли создать искусственное подобие этого ядра. Полученное ядро, к большому вашему сожалению, не производит вис, как узел, но может хранить его в легкодоступной форме, накапливая санти-вис, полученный из возбужденных узлов.
etherealShard2=Сам по себе Эфирный Осколок инертен; Вы должны щелкнуть по нему правой кнопкой мыши, держа эфирную эссенцию в руке, чтобы задать тип виса и немного увеличить емкость. После того, как осколок заряжен, накопленный вис можно извлечь из него, как будто это узел ауры. <BR> Составные аспекты могут быть помещены в осколок только если получаемый им санти-вис содержит все первичные аспекты, присутствующие в этом соединении. Будучи разрушенным, осколок выбрасывает всю эфирные эссенции, помещенные в него.
tc.research_name.alchemite=Алхимит
tc.research_text.alchemite=Ничего ужасного не произойдет…
alchemite1=Земные взрывчатые вещества имеют свое применение в добыче ресурсов и создании ловушек, но их склонность к полному разрушению объектов ограничивает их применение. Вы думаете, что вы решили эту проблему путем трансформации взрывной волны в волну таумической энергии разложения, разбивая объекты на составные аспекты. <BR> Блоки, уничтоженные Алхимитом превращаются в кристаллизованные аспекты, которые в них содержатся. Та же участь уготована и всем живым существам, попавшим в область взрыва, хотя все вещи, упавшие с них, сохранятся. <BR> Вам не кажется хорошей идеей попытаться подвергнуть узел ауры воздействию этой энергии…
tc.research_name.visDynamo=Вис-Динамо
tc.research_text.visDynamo=Переносная мощность
visDynamo1=Время от времени Вы оказываетесь в ситуации, когда Вам необходим санти-вис, но у Вас нет возбужденного узла под рукой. Этот небольшой агрегат искусно решает Вашу проблему, используя Вис непосредственно из Вашего жезла.<BR>Удерживая ПКМ жезлом на установленном Вис-Динамо, вы создадите поток мощностью 5 санти-вис, расходуя по 1 Вис каждого типа в секунду. По умолчанию, динамо будет создавать поток из всех шести первичных аспектов, но экономный тауматург может настроить излучаемый поток, просто убрав ненужные аспекты в интерфейсе устройства.
tc.research_name.essentiaDynamo=Динамо-реле эссенции
tc.research_text.essentiaDynamo=Жидкое топливо
essentiaDynamo1=Хотя Вис-Динамо, безусловно, оказался полезным, но необходимость оперировать им вручную делает его не очень удобным. Интересно, что получится, если соединить Ваше динамо с жидкой эссенцией с помощью труб?<BR>Помня Вашу давнюю разработку - Алхимическую центрифугу, Вы также вспомнили, что связать Вис, получаемый из испарения эссенции не так то просто. Обычно эта энергия просто утекает в разрывы ауры и теряется для Вас навсегда... но что, если проводить испарение в стабильном поле? - Может быть это сможет стать потоком санти-Вис...
essentiaDynamo2=Динамо потребляет одну единицу эссенции в секунду и выдает в общей сложности 12 санти-Вис. Он также принимает и сложные аспекты, которые равномерно делятся на простые аспекты, содержащиеся в них. Например, эссенция §5Arbor§0 будет производить 4 санти-Вис §6Aer§0, §3Aqua§0, и §2Terra§0, в то время как §5Humanus§0 будет производить по 2 санти-Вис всех шести первичных аспектов.
tc.research_name.nodeMonitor=Узел-наблюдатель
tc.research_text.nodeMonitor=Наблюдение за вещами
nodeMonitor1=Узлы ауры, пожалуй, являются самыми ценными ресурсами в арсенале тауматурга, которые заслуживают более трепетного отношения.<BR>Немного модифицировав Ваш Таумометр, вы создали устройство, которое парит рядом с узлом и отслеживает его состояние. Если какой-либо из аспектов узла упадет до одного Вис, Узел-наблюдатель выдаст сигнал красного камня до тех пор, пока в узле не станет больше одного Вис.<BR>Быть может, это даст Вам шанс спасти увядающий узел...
tc.research_name.essentiaInjection=Кровавая алхимия
tc.research_text.essentiaInjection=Не для слабонервных
essentiaInjection1=Искусство зельеварения практикуется на протяжении веков, но потребность в секретных ингредиентах ограничивает его область применения. Что если бы Вы могли достичь тех же целей, используя эссенцию?<BR>Конечно, идея выпить эссенцию ошарашит тауматургов, и не зря - человеческий желудок не создан для того, чтобы обрабатывать сырую магическую энергию. С другой стороны, алхимическая обработка собственной крови и инъекция обратно в себя, как оказалось, является надежным методом применения временных магических эффектов.
essentiaInjection2=Шприц с кровью поможет провести алхимические инъекции, а через сывороточный куб его можно наполнить любой комбинацией эссенций, вплоть до восьми. Эффекты сывороток зависят от выбранных Вами аспектов и могут быть немного непредсказуемыми. Каждый аспект можно использовать для нескольких эффектов зелий, но инъекция обеспечит только один эффект за две использованные эссенции. Судя по всему, проявляются только эффекты с самым высоким значением. Так как почти каждый аспект используется и для положительных, и для отрицательных эффектов, было бы мудрым решением поэкспериментировать с различными комбинациями, дабы убрать нежелательные эффекты.
essentiaInjection3=К примеру, эссенция §5Lux§0 имеет сильную предрасположенность(сокращ. Пред-ность) к Ночному видению и слабую к Слепоте. Вы можете создать кратковременную сыворотку Ночного видения с двумя §5Lux§0, но добавив третью - получите вдобавок Слепоту. Если четвертой станет эссенция §5Perfodio§0, которая имеет сильную пред-ность к ускорению, полученная сыворотка будет накладывать ночное видение и ускорение.<BR>Сывороточный куб может работать в режимах: "Одиночный" или "Бесконечный". С последним режимом куб продолжит создавать сыворотки, пока не кончится кровь или эссенция
essentiaInjection4=(и пока будут свободны слоты на выходе), в то время как "Одиночный" остановится после создания одной сыворотки. Чтобы наполнить Шприц, просто нажмите ПКМ. Вы также можете взять кровь из живого существа, для этого просто нажмите ПКМ по нему пустым шприцем. Стоит отметить, что кровь животных не подходит для алхимической обработки.<BR>Сыворотку можно применить на себя , нажав ПКМ или, чтобы ввести его в существо, подойдите и ударьте его сывороткой(ЛКМ). Чтобы не допустить опасность заражения крови, шприцы были сделаны одноразовыми.
tc.research_name.blastPhial=Взрывные пузырьки
tc.research_text.blastPhial=Буквальное кровопролитие
blastPhial1=Уже полностью овладев искусством создания простых сывороток, Вы решили воплотить их взрывные аналоги. Просто наполните стеклянный пузырёк кровью из шприца и смешайте полученную кровь с порохом. Получившийся пузырёк взрывается при броске, подобно взрывному зелью, и вводит всем ближайшим существам кровь, наполненную магией.<BR>Это, конечно, не самый гигиеничный способ, но зато эффективный.
tc.research_name.injector=Арбалет для инъекций
tc.research_text.injector=Осторожнее при наведении этой штуки
injector1=Ближний бой с противником на шприцах может и веселая вещь, но иногда Вы бы предпочли оставаться на безопасном расстоянии.<BR>Вы остановили свой выбор на модифицированном арбалете... Боеприпасы (Шприцы или Взрывные пузырьки) можно вставить во вращающийся барабан арбалета нажатием Shift+ПКМ. Устройство можно использовать, как любой другой лук; он способен нанести урон и при этом применить эффекты боеприпасов. Шприцы, не попавшие в цель, можно поднять, и эффект сохранится. На Арбалет не действует зачарование "Бесконечность".
tc.research_name.focusContainment=Набалдашник: Сдерживание
tc.research_text.focusContainment=Поймайте их всех!
focusContainment1=Путешествуя, Вы могли столкнутся со многими редкими существами, которые нуждаются в исследовании, но перенесение их в Вашу лабораторию - дело не из легких. И конечно же, Тауматургия может предложить иной способ решения этой проблемы, нежели тащить животное на привязи.<BR>Ряд модификаций набалдашника, способного открыть червоточину, смог сделать его полезным в данной ситуации. Разрушая пространственно-временной континуум вокруг объекта, Вы можете поместить его в стазис и заточить в банке.<BR>
focusContainment2=После заключения в состояние стазиса, существо можно хранить сколько угодно, оно не подвергается жажде, голоду или старению. <BR>Ловить обычных существ достаточно просто, но вот более сильных поймать намного сложнее; Вы должны сначала ранить существо или держать луч набалдашника достаточно долго, чтобы поймать его. Определенных существ, включая големов, дракона и других магов, невозможно заточить этим способом.<BR>Чтобы разрушить банку и освободить заключенное существо, нажмите по ней ПКМ с жезлом в руке.
tc.research_name.incarnationVat=Клонирование
tc.research_text.incarnationVat=Больше и больше...
incarnationVat1=Вы подобрались достаточно близко к освоению самой жизни! Пора сделать следующий шаг: искусственно выращивать целые организмы.<BR>Эту процедуру можно провести в исцеляющем чане, но потребуется несколько специальных ингредиентов. Первым из них является образец ткани существа, которого Вы хотите клонировать - кусок мяса или шприц с кровью того существа.<BR>Как только первый ингредиент будет помещён в чан, нужно залить в него четыре эссенции §5Victus§0 для ускоренного роста. А ещё, клону нужно питаться,
incarnationVat2=чтобы достигнуть взрослого размера. Для таких случаев Вы разработали специальную Питательную смесь. Как только Вы добавите все ингредиенты, клон начнет очень быстро расти до нормального состояния. Вы можете извлечь клонированное существо, нажав по чану ПКМ с банкой в руке.<BR>У процедуры выращивания есть одно любопытное ограничение. В то время как душа животных способна сама развиться в процессе роста (очевидно из-за влияния местной ауры), чан не сможет скопировать человеческую душу, обрекая создание человеческих клонов на неудачу.<BR>Разрушение чана, содержащего существо, вероятно, будет губительным для существа.
tc.research_name.healingVat=Исцеляющий чан
tc.research_text.healingVat=Исцели себя
healingVat1=С Вашим новообретенным понимаем клонирования тканей, должна появиться возможность для приспособления этих методов, чтобы быстро исцелить раны существа.<BR>Эта процедура довольно деликатна и не может быть выполнена в обычном тигеле. Вместо этого, вы спроектировали специализированный чан, который способен диагностировать пациента и перекачивать необходимые эссенции, чтобы помочь больному:<BR>§5Victus§0 восстанавливает здоровье, хоть и медленно.<BR>§5Fames§0 утоляет ваш голод.
healingVat2=§5Sano§0 быстро восстанавливает здоровье. Он также сводит на нет самые сильные негативные эффекты. Чтобы войти или выйти из чана, просто кликните ПКМ по крышке люка. В теории, чан способен и к исцелению, и к поддержанию жизни внутри себя, но до сих пор вам не удалось надолго поместить туда животное.<BR>Подозревая, что Ваши чаны могут быть улучшены, Вы разработали двойную крышку люка.
healingVatContainment= §nНабалдашник сдерживания разблокирован§r<BR>Существ, находящихся в стазисных банках, можно перенести в чан, нажав по нему ПКМ с банкой в руках. ПКМ банкой снова извлечет из чана существо. Если сломать чан с существом внутри, это приведет к его мучительной смерти; внезапное соединение потока магии и жизненной силы существа, которое происходит при поломке чана, вызовет его разложение в порчу.<BR>Кстати, Ваш исцеляющий чан может излечить и нежить! §5Mortuus§0 будет медленно восстанавливать их здоровье, а пошустрее восстанавливает §5Exanimis§0.
tc.research_name.infusionVat=Наполнение животных магией
tc.research_text.infusionVat=Быстрее, выше, сильнее
infusionVat1=Удачное зачарование живого существа магией стало бы беспрецедентным подвигом: ходят легенды, что тауматурги могли создать ужасных монстров из-за того, что тело любого существа отвергает чуждую магию. Однако, Ваши исцеляющие чаны могут помочь успешно провести такую процедуру, приостановив жизненные функции организма во время зачарования. Для начала вы должны поставить на чан модифицированную руническую матрицу. Мудрый тауматург стабилизировал бы ее для начала, поскольку порчи от нее много...
infusionVat2=Как только Вы создали чан для зачарования, Вы поняли, что он работает идентично матрице, только эссенцию придется подавать по трубам.<BR>Однако такой процесс намного опаснее, чем наполнение неживой материи. В дополнение к обычным эффектам нестабильности, она может ранить подопытное существо. Что еще хуже, процесс зачарования невозможно прервать; он может закончиться как и успешно, так и смертельно для животного.<BR>Слабые существа могут не пережить наполнение без помощи извне. Ваши эксперименты доказали, что комбинация эссенций §3Aqua§0, §6Ordo§0, и §2Terra§0 снизят шанс ранения существа.
infusionVat3=У чана для зачарований есть несколько ограничений. Людей (и других разумных существ) не возможно наполнить магией, поскольку человеческая душа отвергают любую магическую энергию. Аналогично, существа, что созданы магией, к примеру нежить или големы, не поддаются зачарованию.<BR>Существо может быть зачаровано на любое количество общих зачарований и только на одно зачарование, специальное для его вида.<BR>К сожалению, зачарование не передается по наследству.
infusionVatClone= §nКлонирование разблокировано§r<BR>Теперь Вы можете клонировать даже зачарованных существ! Однако, это потребует дополнительную эссенцию; Вам придется использовать то количество аспектов, которое пошло на все зачарования существа.<BR>Любопытно, что из образца крови можно вырастить уже зачарованный организм, не используя матрицу. Это делает клонирование легким способом размножения зачарованных видов.
tc.research_name.generalInfusion=Общие зачарования
tc.research_text.generalInfusion=Новые возможности
generalInfusion1=Чан можно использовать для улучшения характеристик любого живого существа. Указанные ниже зачарования можно использовать для одного существа лишь раз (Кроме тех, где указано по-другому):<BR>§5Ртутные конечности§0 увеличивают мышцы и сухожилия существа, делая его сильнее и проворнее. Его скорость и высота прыжка увеличивается.
generalInfusion2=§5Таум-когти§0 способны вырастить на лапах существа острые таум-пластины, которые увеличивают его урон. Однако, мирные существа не поймут, как пользоваться такими когтями...
generalInfusion3=§5Пробужденная кровь§0 изменяет циркуляцию крови существа. Его раны начинают быстрее заживать. Животное, которое подверглось влиянию этого зачарования будет медленно исцеляться после ранения.
generalInfusion4=§5Алмазная плоть§0 способна сделать шкуру животного прочнее. Существа, которые подверглись этому зачарованию, обрели незначительное сопротивление ко всем видам урона.<BR>Кожа этих существ, кажется, приобрела и некоторые другие свойства алмаза и начала искриться ярким светом.
generalInfusion5=Мало, кто знает о том, что жемчуг, выпадающий с умерших странников Края - живой орган. Он, кажется, жизненно важен для способности к телепортации существа, но абсолютно несовместим с земными существами.<BR>Однако, Вы можете это исправить, используя чан зачарования. Зачарование §5Сердце Края§0 сначала выращивает эмбриональные ткани со способностями к телепортации, а затем пересаживает их в существо. Животное не способно сознательно телепортироваться, но может рефлекторно "отскочить" на короткое расстояние, чтобы избежать попадания снарядов.
generalInfusion6=§5Электрическая кожа§0 выращивает маленькие биоэлектрические железы по телу животного, позволяя ему испускать маленькие молнии. Даже невраждебные существа выпустят молнию, если на них нападут.
generalInfusion7=Вы обнаружили метод использования диких животных в Ваших собственных целях. Зачарование §5Внушение верности§0 насильно переписывает часть мозга подопытного, убирая любую враждебность. Это дает возможность заменить его агрессию на преданность к Вам, как к "приемному родителю".<BR>Существа, подвергнутые этому процессу, защитят Вас, подобно прирученному волку, даже если первоначально у них не было агрессивных инстинктов. Также, им можно приказать остаться на месте, нажав ПКМ.<BR>
generalInfusion7b=Это зачарование нельзя применить к существам с особенно примитивными нервными системами - к паукам, спрутам, слизням, и т.п. <BR> Нужно отметить, что определенные существа могут потерять способности, когда их мозг будет переписан - например, криперы забудут, как взрываться.
generalInfusion8=Теперь, когда Вы можете изменять живых существ, пора попытаться добавить специфические магические свойства.<BR>Зачарование §5Руническая оболочка§0 покрывает кожу существа особыми защитными рунами, создавая защитный слой.<BR>В отличие от рунических предметов, этот щит восстанавливается без подачи Вис, но вместо этого поглощает выносливость существа. Вам пришлось ограничить скорость этого процесса, чтобы избежать ранения существа, поэтому руническая защита восстанавливает свой заряд медленнее, чем Ваши предметы.
generalInfusion9=Пора использовать ваш чан в полную силу. Есть несколько материалов, несовместимых с живой материей, такие как пустотный металл, но если бы клыки существа были наделены его свойствами, они были бы остры, как бритва, а так же источали древние яды.<BR>Зачарование §5Клыки Древних§0 как раз способно на это: оно изолирует ткани подопытного от ядовитых эффектов этого металла. Процесс довольно опасен... но это же Вас никогда не останавливало.
generalInfusion10=§5Бессмертные§0 существа были наполнены сырой энергией мироздания, взятой из сингулярной жемчужины. Также, такое существо нельзя полностью уничтожить; если его убьют, он быстро уменьшится и превратится в что-то, похожее на жемчужину, содержащее душу животного.<BR>Поместив эти останки в исцеляющий чан и добавив шестнадцать единиц эссенции Victus и Sano, вы сможете воскресить существо. Воскрешенные животные содержат все те же зачарования и особенности, какими обладали до смерти.<BR>В отличие от всех других зачарований, Бессмертие невозможно передать клонам существа.
tc.research_name.runicCreature=Руническая оболочка
tc.research_text.runicCreature=Новая безделушка?
tc.research_name.eldritchFangs=Клыки Древних
tc.research_text.eldritchFangs=За пределами возможного...
tc.research_name.instilledLoyalty=Внушение верности
tc.research_text.instilledLoyalty=Вы будете подчиняться!
tc.research_name.deathless=Бессмертие
tc.research_text.deathless=Защита Ваших инвестиций
tc.research_name.portability=Портативность
tc.research_text.portability=Переносные слуги
portability1=Ваш набалдашник Сдерживания бесценен, но процесс заточения существ в банку и освобождения из нее может быть дорогостоящим и по стеклу, и по затрате Вис. Теперь есть более эффективная альтернатива!<BR>Зачарование §5Портативность§0 ускоряет процесс заточения животного в банку. Один взмах Вашим жезлом отправит существо в карманное измерение банки; ещё один взмах вновь освободит животное и отправит банку назад в пустоту, где она восстановится и будет готова для последующего использования.
tc.research_name.cowInfusion=Зачарования для коров
tc.research_text.cowInfusion=Мистическое молоко
cowInfusion1=Вы нашли два метода улучшения обычной коровы.<BR>Первый (и самый простой) изменяет вымя коровы для производства густого шоколадного молока. Оно, как и простое молоко, может избавить Вас от эффектов, а еще из него можно делать шоколад. Добавив немного магии, Вы можете охладить молоко, сделав из него восхитительное мороженое.<BR>Объединив девять плиток, можно создать блок шоколада, но какой сумасшедший стал бы использовать его для строительства?
cowInfusion2=Второе зачарование способно соединить ДНК коровы с ДНК гриба для создания экзотического гибрида под названием Мууухомор.<BR>Доказывает ли это, что Муухомор - искусственная форма жизни, созданная древними магами, или это Вы просто скопировали природное явление, всё еще остается загадкой. В отличие от других зачарованных существ, Мууухомор может размножаться естественным способом.
cowInfusion3=Третье и самое сложное зачарование помогает корове стать частью не только материального мира, позволяя ее телу содержать узел ауры. (Самостоятельно ее тело не способно создать узел ауры; Вам придется покормить ее узлом в банке, нажав ПКМ)<BR>Как только создаться узел ауры внутри тела, корова начнет давать эссенцию вместо молока! Скорость процесса зависит непосредственно от узла: чем он ярче и больше, тем быстрее будет формироваться эссенция. Держа банку, просто щелкайте ПКМ по корове, чтобы собрать эссенцию.
tc.research_name.sheepInfusion=Зачарования для овец
tc.research_text.sheepInfusion=Дикое и мохнатое
sheepInfusion1=Ваши исследования овец позволили открыть два особых зачарования, которые помогут Вам собирать шерсть.<BR>Первое зачарование дает способность овце переливаться шестнадцатью цветами (легко собирать все цвета шерсти). Второе зачарование позволяет овце состригать с себя шерсть при необходимости.
tc.research_name.pigInfusion=Зачарования для свиней
tc.research_text.pigInfusion=Съедят, что угодно...
pigInfusion1=Многие фермеры считают, что со свиней можно получить не только мясо. К счастью, Вы были более мудры и нашли хорошее применение постоянному голоду свиньи.<BR>Первое такое зачарование создаст Рудного кабана, непригодного в пищу, но крайне полезного в металлургии. Однако это даст гигантское преимущество. Этот "счастливчик" пожирает кинутый ему булыжник и производит самородки разных руд.
pigInfusion2=Вы также можете использовать ваш чан для создания симбиоза между свиньей и Эфирным цветком. Созданный в итоге организм жадно пожирает всю порчу вокруг, не перенося вредных инфекций, что делает его идеальным для чистки гигантских зараженных территорий.
tc.research_name.chickenInfusion=Зачарования для куриц
tc.research_text.chickenInfusion=Волшебные несушки
chickenInfusion1=Даже взрослая курица не способна раскрыть свой потенциал на сто процентов; но ведь это не проблема для тауматурга?<BR>Первое зачарование превращает курицу в живую фабрику по производству полезных материалов. Она начинает постоянно сбрасывать перья, которые подойдут в качестве письменных принадлежностей, а также несёт яйца, желток которых наполнен черным, как смола, пигментом, который можно использовать для наполнения чернильниц и в качестве красителя.
chickenInfusion2=Недавно Вы обнаружили более впечатляющее зачарование для куриц. Они могут нести золотые яйца, которые можно переплавить в самородки!<BR>Стоит отметить, что процесс создания такого яйца довольно медленный. С убитой золотоносной курицы не выпадет золото.
tc.research_name.catInfusion=Зачарования для кошек
tc.research_text.catInfusion=Сомурршенствование ваших питомцев
catInfusion1=Ваши кошки могут быть отличными помощниками, но, приложив усилия, можно найти для них более практичное применение.<BR>Первое зачарование, которое вы обнаружили, способно увеличить кота до человеческих размеров, сохраняя его кошачью грацию и мощь. Сверхстимулируя его инстинкты, Вы привили безграничную преданность получившейся пантере. Она способна защитить Вас, как прирученный волк, но она быстрее и сильнее него. Криперы будут бояться пантеры также, как боялись обычной кошки.
catInfusion2=Очень странно, мех кошки сильно взаимодействует с аурой, даже если поблизости нет узла. Оптимизируя этот процесс, вы создали Компаньона, специальную кошку, которая, несмотря на свою крохотность, заманивает капельки Вис в ловушку. К сожалению, Вы не придумали способа для долгого удержания энергии, но Вы вполне можете подойти к ней и заряжать свои жезлы. Это также может зарядить Амулет-хранилище Вис.<BR>Чем больше Компаньонов рядом, тем быстрее будут заряжатся Ваши предметы.
catInfusion3=Многие древние культуры почитали кошек, как хранителей загробного мира. Ваше исследование показало, что в этих мифах есть доля правды, поскольку эссенция Examinis странно реагирует на присутствие кошек.<BR>Вы использовали этот феномен, чтобы создать Могильщика, зачарованную кошку, способную убивать нежить поблизости. Кажется, что у нее имеется сильная антипатия к таким существам, поэтому она будет активно выискивать их, пока Вы не прикажете ей оставаться на месте.<BR>Все представители нежити, кроме самых разумных, не нападают на Могильщика, вызывая у Вас подозрение, что он для них невидим.
tc.research_name.dogInfusion=Зачарования для собак
tc.research_text.dogInfusion=Лучший друг тауматурга
dogInfusion1=Приручение волков лишило их храбрости, но они, в конечном счете, оказались преданными компаньонами. Теперь Вы можете вознаградить их верность, улучшив их способности несколькими способами.<BR>Самое простое из этих зачарований создает подводное существо, способное воевать, которое Вы назвали Морским Волком. Он может дышать под водой, и столь же проворен там, как и на суше. Эта собака способна защитить ее владельца от любых опасностей в глубине океана.
dogInfusion2=Многие легенды рассказывают о проклятых жителях, что превращаются в волков под полной луной. Хоть Вы не поверили этим легендам об оборотнях, Ваши эксперименты над волками, доказали их мистическую связь с лунным циклом. <BR>Ваше второе зачарование усиливает это природное явление, давая прирученному волку способность вытягивать Вис из луны ночью. У него нет способности долгое время удерживать эту энергию, поэтому, если хотите зарядить Ваш жезл, стойте поблизости, держа его в руках. Это также может зарядить Амулет-хранилище Вис.<BR>Чем больше Лунных волков рядом, тем быстрее будут заряжатся Ваши предметы.
dogInfusion3=Наконец, придавая прирученному волку инфернальную энергию, Вы можете создать смертоносную адскую гончую. Мало того, что она - сторожевая собака, она еще и обладает отравляющим укусом, огнестойкостью, и может извергать пламя на своих врагов.<BR>Она остается, на удивление, дружелюбной.
tc.research_name.horseInfusion=Зачарования для лошади
tc.research_text.horseInfusion=Что может быть лучше тауматургии?
horseInfusion1=Многие тауматурги презирают лошадей за их неспособность к полетам, да и любой ученик в Сапогах Путешественника может опередить их. Ваше новое зачарование скоро заставит Ваших коллег выглядеть довольно глупо.<BR>Тело лошади хорошо приспосабливается к зачарованиям и достаточно легко взаимодействует с магическими предметами. Вам удалось внедрить Таумостатический пояс в копыта лошади, создав коня, который быстрее обычной лошади, умеет летать и не получает урон при падении. Таумостатические механизмы работают засчёт выносливости животного, поэтому они требуют немного отдыха после приземления.
horseInfusion2=Большинство существ не переносит зачарование "Сердце Края", но, по неизвестным причинам, тело лошади не отторгает инородный орган. Основываясь на этом открытии, Вы создали улучшенную версию раннего зачарования, которое помогло Вам создать §5Скакуна Края§0.<BR>Мало того, что эта лошадь может нести наездника, она способна мгновенно перемещаться на небольшие расстояния в пространстве, и этими телепортациями можно управлять. Надевав седло на лошадь, Вы можете заставить ее телепортироваться на короткие расстояния даже через твердые объекты.
horseInfusion3=Это заменяет управление прыжками обычной лошади.<BR> Конская анатомия необычна тем, что после смерти и возрождения в виде зомби или скелета, она не имеет агрессивных инстинктов, свойственных нежити. Кроме того, она, на удивление, обучаема, и способна вспомнить любой навык, который она имела в жизни. Она может носить наездника так же легко, как ее живые собратья.<BR>В создании таких лошадей Вам поможет достаточно легкое зачарование. Лошади-скелеты быстрее своих живых собратьев, а Лошади-зомби более выносливы.
tc.research_name.nightmareInfusion=Ночной кошмар
tc.research_text.nightmareInfusion=Дорога в ад
nightmareInfusion1=Невидимые пространственные червоточины, созданные способностью Скакуна Края к телепортации, можно контролировать. Если бы Вы наполнили вашего Скакуна энергией из артефакта, который связан с Нижним миром, Вы могли бы управлять разломами для создания порталов между измерениями. Зачарование зачарованных существ станет новым открытием...<BR>С помощью этого зачарования тело существа изменится - оно выдержит даже жаркий климат Ада. Если наполнить его копыта способностями Магического подъемника, оно сможет идти по лаве,
nightmareInfusion2=позволив быстро перемещаться по Нижнему миру. Существо, которое вы назвали "§5Ночной кошмар§0", будет телепортироваться, как Лошадь Края, если индикатор прыжка не поднимется выше 90%. В этом случае Лошадь прорвет грань между Обычным миром и Адом и телепортируется сквозь измерение(Обратный манёвр тоже возможен).<BR>Такое перемещение в пространстве обычно нестабильно, поэтому Вас может перенести не в точное место, а к ближайшему открытому разлому. При межпространственном прыжке не создастся портал, но возможно появится дымящийся кратер...
tc.research_name.soulExtractor=Просеиватель душ
tc.research_text.soulExtractor=Пища для мозга
soulExtractor1=Песок душ, который Вы обнаружили во время своих походов в ад, всегда тревожил Вас, и неспроста. Страшные, корчащиеся лица на его поверхности, не являются иллюзией; Ваши исследования обнаружили крохотные остатки неисчислимых разрушенных душ... Люди, животные, кого только нет там...<BR>Вы пока не приблизились к пониманию происхождения песка душ, но одно применение ему Вы все-таки нашли. Создав механизм, содержащий особый просеиватель и ловец душ, Вы можете отделить песок от фрагментов души, которые в нем содержатся.
soulExtractor2=Просеиватель душ пропускает песок под себя (и автоматически кладет, к примеру, в сундук), в то время как освобожденные души поднимаются вверх. Если поместить наверх просеивателя Мозг в банке, то он будет потреблять фрагменты души и преобразовывать их в очки опыта.<BR>Само по себе просеиватель работает медленно, но при подаче санти-Вис Aer его работа заметно ускорится. Это также имеет встроенный механизм отключения, чтобы избежать траты фрагментов души впустую, и не будет функционировать, если нет нужного блока над ним.
tc.research_name.soulKnowledge=Поглотитель мыслей
tc.research_text.soulKnowledge=Показано, но не забыто
soulKnowledge1=Оставляя в стороне этические нормы, кормление мозга в банке фрагментами души кажется Вам расточительным. Древние маги обладали многими неизвестными знаниями. Что, если эти исследования можно было найти, благодаря остаткам их душ?<BR>Уставившись на заключенный в банку мозг, Вас посетила странная идея. Ведь если избавить мозг зомби от его стремления утолять голод, у Вас останется мозг, который может воссоздавать мысли фрагментов душ, проходящих через него.
soulKnowledge2=Название "Поглотитель мыслей" говорит само за себя. Если его разместить над просеивателем душ и дать ему бумагу, он будет искать нужные воспоминания, и извлекать из них фрагменты знаний, что весьма полезно для любого мага...<BR>В одном блоке песка душ может содержаться разное количество полезных воспоминаний. То есть блоки песка душ могут дать, как много полезных знаний, так и не одного.
tc.research_name.soulAssembler=Кузница душ
tc.research_text.soulAssembler=Восстановление разума
soulAssembler1=Во время поиска неисправностей аномального выхода из строя вашего Поглотителя, вы сделали любопытное открытие: освобожденные фрагменты души могут объединится друг с другом. Это взаимодействие довольно сложное и основывается на фрагментах, имеющих связанные идеи, но вы достаточно хорошо понимаете это явление и пробуете ускорить его.<BR>Связывая воедино два очищенных мозга зомби, вы можете поймать эти фрагменты души в бесконечные мысленные петли, гарантируя то, что они быстро столкнутся с другими.
soulAssembler2=Как только душа станет достаточно большой, чтобы заполнить мозг, петли перестанут удерживать ее, и она вытолкнется в верхний сегмент устройства. <BR>Кузница душ должна быть размещена непосредственно над просеивателем душ и требует постоянного ввода эссенции §5Cognitio§0 сверху. Она может содержать любое количество восстановленных душ, но чтобы забрать одну из них, Вы должны кликнуть ПКМ, держа банку.<BR>К сожалению, Вы не сможете создать конкретную душу, так как шанс найти ее фрагменты крайне мал, однако гибридные души, созданные устройством,
soulAssembler3=вполне способны создать особенную личность с особенным набором навыков. Так Вы можете создать душу кузнеца, библиотекаря или даже мага. Пока что, восстановление душ - всего лишь проявление любопытства, но, возможно скоро, вы найдете им применение...
tc.research_name.cloneVillager=Воскрешение
tc.research_text.cloneVillager=Игра в Бога
cloneVillager1=Момент настал! Освоив клонирование плоти и восстановление душ, вы сможете объединить их, чтобы создать человекоподобное существо в исцеляющем чане.<BR>Однако на пути серьезное препятствие: рост такого организма зависит от наличия детских душ, поэтому вы не сможете растить ваших клонов из образцов ткани. Но вы можете сконструировать Гомункулуса - взрослый мертвый человеческий организм, построенный из остатков нежити - и оживить его ткани, перед вселением в него души.
cloneVillager2=Это не так сложно, как кажется. Эксперименты показали, что если налить в чан восемь единиц эссенции §5Sano§0 и §5Victus§0 во время нахождения Гомункулуса в чане, а затем вселить в него душу в банке, нажав ПКМ, это даст возможность оживить его... Пока что только немного замешкавшегося жителя.<BR>Было бы лучше выпустить воскрешенных сельских жителей в какие-нибудь дома, чтобы они не блуждали.
tc.research_name.nightmare=Размышления о жизни и смерти
tc.research_text.nightmare=Горькая правда
nightmare1=Иногда Вам жаль от того, что Вы не копались так глубоко в природе смерти. Жители проводят свою жизнь в блаженном неведении, веруя в высшие силы и никогда не подозревая, что беспощадные естественные процессы обратят их души в прах. И дело не во вселенской справедливости или злобном намерении... Это просто закон природы.<BR>Когда-то вы слышали рассказы... и даже может сами были незначительным героем в них... когда говорили об умерших тауматургах, возвращавшихся к жизни в самый последний момент, когда уже не было надежды.
nightmare2=Даже если есть некая сила, способная воскресить их, Вам не удается разглядеть какую-либо закономерность в том, кого спасут... <BR> Вы не можете позволить себе полагаться на сверхъестественных существ, чтобы спасти себя от забвения. Вы должны как-то заставить смерть играть по Вашим правилам, или Вы никогда не будете чувствовать себя снова в безопасности.<BR>И Вы так близко... очень близко... Если бы Вы могли гарантировать, что Ваша душа вернется к одному из ваших исцеляющих чанов, где тело уже ждет ее...
tc.research_name.cloneSelf=Самовозрождение
tc.research_text.cloneSelf=Обман смерти
cloneSelf1=Когда Вы впервые изучили сингулярную жемчужину, Вы и не догадывались, что это станет вашим спасением. Это - не что иное, как лазейка в законах магии, сконцентрированная в физической форме. С ее властью можно, наконец, избежать судьбы смертных душ.<BR>Особый маяк, созданный вами, может мистически связать себя с вашей душой. Связь с ним будет сильнее, чем притяжение пустоты; он, в буквальном смысле, будет вырывать вашу душу в момент смерти... Но это не будет длится вечно после активации.
cloneSelf2=Перед этим Вы должны убедиться, что маяк находится наверху исцеляющего чана, и что чан уже содержит оживленного Гомункулуса.<BR> Если все пойдет по плану, в случае Вашей смерти Ваше старое тело, взрываясь, распадется в поток, и Вы проснетесь в новом теле, без потери опыта. Нет угрозы вечного забвения. Не нужна вера в высшие силы. <BR> Может быть, теперь даже кошмары вас не остановят.
tc.research_name.mirrorAmulet=Зеркальный амулет
tc.research_text.mirrorAmulet=Что было мое, то останется со мной
mirrorAmulet1=Материальные вещи не нужны мертвым... Но ведь когда у вас есть то, что может обмануть смерть, почему бы не сохранить свое имущество при себе... И Вашим ответом снова стала сингулярная жемчужина. Усиливая пространственную связь волшебного зеркала и связывая его с Вашей жизненной силой, ваша смерть создаст (хотя и не надолго) Тессеракт, который сохранит вещи в безопасности. Амулет разрушится в процессе, и высвободит жемчужину в том месте, где вы погибли. Для связывания амулета и зеркала на выходе, просто щелкните ПКМ на одном из них, удерживая амулет.
tc.research_name.lensFire=Волшебные линзы
tc.research_text.lensFire=Улучшение зрения
lensFire1=Очки откровения являются незаменимым инструментом, но что если Ваши чувства немного улучшить?<BR>Размещая специальные линзы на одном глазу, вы можете извлечь выгоду как из очков откровения, так и из уникальных способностей линзы. Линзы можно быстро заменить, удерживая V или снять, нажав Shift+V.<BR>Первая изобретенная Вами линза усиливает поступающий на нее свет, предоставляя вам постоянное ночное видение. К сожалению, первородный огонь, используемый в создании линзы, плохо реагирует на жидкости, так что это усиление не работает под водой.
tc.research_name.lensWater=Линза эхолокации
tc.research_text.lensWater=Прозрачное синее море
lensWater1=Тёмные глубины океана уже давно являются загадкой, но Ваше последнее открытие поможет раскрыть их секреты.<BR>Эта необычная волшебная линза испускает импульсы ультразвука и преобразовывает их отголоски в визуальное представление о водной среде. Эффект очень похож на ночное видение и позволяет более эффективно видеть сквозь толщи воды.
tc.research_name.lensOrderEntropy=Линза изучения
tc.research_text.lensOrderEntropy=Сделаем изучения легче!
lensOrderEntropy1=При первом проектировании очков откровения, Вам показалась оправданной потеря сканирующей способности таумометра. Теперь в этом неудобстве больше нет необходимости. <BR>Как только Вы наденете линзу изучения, все предметы и существа, на которых вы посмотрите, будут автоматически сканироваться.
tc.research_name.lensAir=Линза обнаружения биоэлектрических полей
tc.research_text.lensAir=Ясновидение
lensAir1=Ваше исследование показывает, что живые существа своей энергией создают колебания в ауре, вызывая рябь, как камень, брошенный в пруд. Точно так же возмущает её и нежить.<BR>Вы разработали необычную линзу, способную обнаружить эти явления, что позволяет Вам видеть существ сквозь стены. Живые существа подсвечиваются синим цветом, в то время как нежить - красной рябью.
tc.research_name.lensEarth=Линза исчезновения
tc.research_text.lensEarth=Рентгеновские очки
lensEarth1=Свет не может проникнуть через большинство форм материи, но магию не так легко остановить. Вы спроектировали линзу, которая позволит Вам видеть сквозь блоки площадью 3x3.<BR>К сожалению, даже под действием магии световые волны не способны пройти сквозь сложные объекты, таким образом они останутся непрозрачными.
tc.research_name.lensCase=Сумка для линз
tc.research_text.lensCase=Безопасное хранилище
lensCase1=Учитывая Вашу растущую коллекцию волшебных линз, Вы немного изменили сумку для набалдашников, приспособив ее как раз для них. Сумка работает также, как и её предшественник.
tc.research_name.silverSap=Сок Серебряного дерева
tc.research_text.silverSap=Волшебно-восхитительный
silverSap1=Способности серебряного дерева к очищению широко используются в тауматургических конструкциях, но пиломатериалы бывают слишком громоздки, чтобы делать из них ювелирные и тонкие предметы. Теперь вы обнаружили способ измельчения древесных бревен, для создания густого сиропа, который сохраняет большинство магических свойств.<BR>Серебрянодревесный сок является мощным дезинфицирующим средством, и при этом удивительно нетоксичным. В самом деле, сироп со вкусом ванили является мощным стимулятором и может даже улучшить Вашу способность управлять Вис, если конечно Вы не против незначительных галлюцинаций...<BR>Сок, вроде бы, не вызывает привыкания, но лучше иметь запасную порцию, так... на всякий случай.
tc.research_name.silverBed=Серебрянодревесная кровать
tc.research_text.silverBed=Сладких снов
silverBed1=С тех пор, как вы начали углубляться в запрещенную магию, ваш сон стал ночным кошмаром. Возможно, специальная кровать поможет немного расслабиться от проявлений искажения.<BR>Изготовленная из серебряного дерева и зачарованной ткани, а также ароматно пахнущая солями для ванн, эта кровать позволит даже самым искаженным тауматургам спать спокойно. А еще, утром вы проснетесь с недолгим эффектом защиты от проявлений искажения.
tc.research_name.enchantClay=Таум-глина
tc.research_text.enchantClay=Покорное волшебство
enchantClay1=Процесс зачарования вплетается магической энергией в инструмент, позволяя сделать такую форму, которая способна существовать как физически, так и метафизически. Именно поэтому чары на двух одинаковых физических объектах - скажем, два железных меча - могут быть объединены через наковальню, а меч и топор - нет. До этих пор.<BR> Соединив особую смесь из глины, ртути и таумиума с зачарованным объектом в окне крафта, Вы можете передать его зачарование глине, которую затем можно обработать и изменить ее физическую и магическую форму, позволяя Вам соединять её с другими инструментами на наковальне. Это всё ещё требует опыта...
tc.research_name.golemPowder=Порошок одушевления
tc.research_text.golemPowder=Улучшенное големопроизводство
golemPowder1=Способности такого голема зависят от материала блока - твердые блоки создадут более прочного голема, а, к примеру, кактус может ранить нападавших, и т.д. Создание обычных големов обычно подразумевает конкретные материалы - глина, плоть, железо и так далее, - которые качественно наполняются эссенцией и позволяют оживить материал. Ваше недавнее исследование нашло другой подход - смешав соответствующую эссенцию с горсткой Salis Mundus, вы создали порошок, способный на время оживить почти любой блок.<BR>Если нажать ПКМ по блоку этим порошком, он временно превратится в голема.
golemPowder2=Особенно сложную материю невозможно оживить таким способом. Но может быть получится оживить несколько конкретных некубических блоков.<BR>Без сердца такие големы работают засчёт основных инстинктов и живут недолго. Будучи оживленными, они будут всегда следовать за их создателем, попутно нападая на враждебных существ. Когда время жизни голема кончится, он превратится в блок, из которого был создан.
golemPowder3=Вы также можете преждевременно превратить его в блок при помощи колокольчика. Если Вы хотите, чтобы такой голем не превратился обратно в блок и постоянно служил Вам, прикрепите к нему Сердце голема. Он будет вести себя как обычный голем, на него можно будет надеть улучшения или создать улучшенную копию с помощью инфузии. Вы также можете забрать его при помощи колокольчика (ЛКМ). Однако, если забрать у него сердце, он немедленно превратится в неживую материю, потеряв все улучшения.
tc.research_name.focusAnimation=Набалдашник: Одушевление
tc.research_text.focusAnimation=Оживление на максимум!
focusAnimation1=Создание голема является сложным и преднамеренным процессом - вряд ли можно сделать такое движением волшебной палочки. До этих пор.<BR> Будучи фрагментом мироздания, сингулярная жемчужина способна изменять материю. Капнув на нее немного крови, Вы можете создать такое приспособление, способное быстро и легко даровать жизнь неодушевленным предметам.<BR>Конечно, такая магия вряд ли может быть столь проста, но благодаря Вашему мастерству големоведения, Вы готовы превратить эту теорию в реальность.
focusAnimation2=Големы, порожденные таким набалдашником, идентичны своим собратьям, что созданы порошком одушевления. Требования Вис зависят от материала, но, как правило сильные големы потребует больше энергии для одушевления.
tc.research_name.focusRecharge=Набалдашник: Перезарядка
tc.research_text.focusRecharge=Теперь на 50% более портативный!
focusRecharge1=Некоторые эксперименты с пьедесталом перезарядки помогли создать более компактное устройство, которое работает по тем же принципам. Если надеть его на жезл, как обычный набалдашник, эта конструкция из Вис фильтров позволит выкачивать непосредственно составные аспекты из узлов ауры.<BR>Аналогично своему предшественнику, набалдашник перезарядки получит в итоге лишь 1 Начальный Вис во время выкачивания сложных аспектов, но Вы подозреваете, что его можно улучшить с помощью набалдашникового верстака.
tc.research_name.focusLiquefaction=Набалдашник: Расплавление
tc.research_text.focusLiquefaction=Пол - ЛАВА!!! Я серьезно!!!
focusLiquefaction1=Наполнив алмаз энергией набалдашников копания и огня, а также добавив щепотку šalis mundus, Вы получили любопытный результат: набалдашник, создающий лучи направленного жара, который не обжигает живых существ, но способен обжечь неживую материю.<BR>Если такой луч огня поразит блоки и просто выброшенные на пол предметы, они быстро переплавятся подобно тому, как если бы их положили в печь. Огненный луч также плавит лед, медленно превращает камень в лаву и сжигает органику.
tc.research_name.focusDisintegration=Набалдашник: Распад
tc.research_text.focusDisintegration=Разрушение материи
focusDisintegration1=Иногда Вам хотелось бы собирать эссенцию из материалов где угодно, безо всяких хлопот и перетаскивания их в алхимическую печь. После Ваших экспериментов над Алхимитом и Жидкой смертью, Вы чувствуете себя готовым к тому, чтобы создать набалдашник с подобными эффектами. Набалдашник распада функционирует подобно набалдашнику копания, вот только он не ломает блоки полностью, а превращает их в кристаллизованную эссенцию. Он не особо хорошо действует на животных, но если Вы сможете убить хотя бы одного, с него также упадет кристаллизованная эссенция.
tc.research_name.focusIllumination=Набалдашник: Освещение
tc.research_text.focusIllumination=Да будет свет!
focusIllumination1=Простая алхимическая обработка позволяет использовать светящийся камень в качестве проводника Вис, функционирующего подобно набалдашнику. При использовании он преобразует небольшое количество Вис Aer и Ignis в стабильные шары света. Ваши экспедиции больше не требуют десятков факелов!<BR>Как ни странно, если этот набалдашник покрыть красителем, он изменит цвет создаваемых шаров.
tc.research_name.greatwoodBoat=Великодревесная лодка
tc.research_text.greatwoodBoat=Безопасные путешествия
greatwoodBoat1=У вас есть много навыков, но создание крепкой лодки и ее пилотаж не среди них. Теперь это не имеет значения.<BR>С небольшой помощью тауматургического "Know-How" и некоторых великодревесных бревен, Вы можете построить лодку, способную не разрушаться на палки и доски даже после самых неловких столкновений. Дополнительные чары сделают ее немного быстрее обычной лодки.<BR>Великодревесная лодка никогда не разрушится при столкновении, но взять ее можно так же, как и обычную лодку.
tc.research_name.thaumiumBoat=Таум-лодка
tc.research_text.thaumiumBoat=Сверхпрочное покрытие
thaumiumBoat1=Температура плавления таум-металла не намного выше, чем железа, но его близость к магии позволяет принимать свойства от лежащих рядом осколков. Установка водных осколков на поверхность таум-пластины даст почти идеальную теплоизоляцию.<BR>Вы использовали это явление для создания лодки, способной выдержать продолжительное плавание по лаве. Она все так же защищена от поломок, но плавает немного быстрее, чем ее великодревесная предшественница.
tc.research_name.selfInfusion=Зачарование самого себя
tc.research_text.selfInfusion=Человечнее чем человек
selfInfusion1=Когда-то Вы дрожали в страхе перед смертью. Теперь Вы будете использовать ее!<BR>Все предыдущие попытки зачарования человека потерпели неудачу, так как души разумных существ отвергают любые магические вмешательства в их тела. Однако, если бы Вы смогли наполнить ею бездушное тело, созданное во время Вашего воскрешения, то не исключено, что Вы сможете возродиться в зачарованном теле.<BR>Неопытные тауматурги непременно посчитали бы эту идею безумной. Пусть смеются. Скоро Вы будете жить в сверхчеловеческом теле собственного изготовления!
selfInfusion2=Перед процессом зачарования Гомункулуса нужно излечить с помощью эссенций §5Sano§0 и §5Victus§0. После этого, Вы должны поместить Модифицированную матрицу на вершине чана, выполнить необходимое зачарование, а затем заменить матрицу на Маяк души. Свяжите себя с маяком, покончите с собой, и если все пойдет по плану, Вы проснетесь в новом обличии. Это перевернет все представление о магии!<BR>Конечно, тауматургия редко так проста на практике. Ваше новое тело будет немного повреждено в процессе зачарования из-за нестабильности и не сможет быть исцелено, пока Вы не переместитесь в него.
selfInfusion3=Таким образом, количество зачарований ограничивается лишь стабильностью Вашего чана. Как ни странно, души жителей не смогут обрести новое тело - только Ваша душа может пройти воскрешение в маяке...<BR>Замечательно! Они не заслужили этой власти. Ты заслужил!
tc.research_name.humanInfusion=Основные зачарования для людей
tc.research_text.humanInfusion=Немного настроим там, чуть-чуть подкрутим здесь...
humanInfusion1=Наполнение наполовину живого, бездушного тела - грязный и неточной процесс. Большинство разработанных Вами зачарований для животных невозможно применить к себе и другим более разумным существам. С другой стороны, у Вас есть несколько идей для особого наполнения людей...<BR> Список основных зачарований, которые можно применить к Вашему новому телу: §5Ртутные конечности§0 достаточно легко наполняют человеческое тело, но Вам понадобится укрепить свои сухожилия пустотным металлом.
humanInfusion2=§5Таум-кулаки§0 значительно улучшат ваш урон от руки без оружия (сопоставимо с уроном таум-меча), но затраты...
humanInfusion3=§5Пробужденную кровь§0 трудно применить без ущерба для функций мозга, но добавление мозгов должно решить проблему.
humanInfusion4=§5Алмазная плоть§0 требует гораздо больше материала, чтобы преодолеть относительную тонкость человеческой кожи.
tc.research_name.silverHeart=Серебрянодревесное сердце
tc.research_text.silverHeart=Очищение тела
silverHeart1=Ваши исследования порчи показывают странную двойственность: она может существовать как в виде органического патогена, так и в виде магического волнения, что позволяет ей инфицировать и живую, и неживую (скорее всего взаимодействующую с магией) материю. Единственная известная защита от этого ужаса - Серебряное дерево и Эфирный цветок, у которых, кажется, развился естественный иммунитет.<BR>Теперь Вы нашли способ наделить Ваше новое тело такими защитными качествами.
silverHeart2=Добавляя специальные мембраны в сердце, Вы можете отфильтровать и избавиться от любой заразы, которая входит в ваш кровоток. <BR>С этим зачарованием, Вы будете иметь иммунитет к порче: как от прямого контакта, так и от долгосрочных последствий яда. Плюс ко всему, Ваше измененное сердце может также отфильтровать другие токсины, и естественного, и магического происхождения. К сожалению, §5Серебрянодревесное сердце§0 не предоставит полный иммунитет к яду, иссушению, и эффектам искажения, но позволит снизить их тяжесть.
tc.research_name.synthSkin=Синтетическая кожа
tc.research_text.synthSkin=Энергия Солнца
synthSkin1=Перед Вами относительно простая задача: наполнить кожу вашего нового тела фотосинтезирующими способностями растений. В то время как обычной еды может не хватить на Вашу бурную деятельность, §5Синтетическая кожа§0 может стать Вашим спасителем в случае, если Ваши экспедиции унесут Вас далеко от дома.<BR>Пока Вы находитесь под прямыми солнечными лучами, Ваш голод будет медленно пополняться. Фотосинтез не дает эффектов насыщения, поэтому в темноте или в тени вы снова начнете голодать.
tc.research_name.amphibious=Дыхание амфибии
tc.research_text.amphibious=В глубины океанов...
amphibious1=Дышать воздухом в некоторых случаях, к примеру под водой, не представляется возможным. Вы можете исправить этот недостаток, дополнив лёгкие множеством жабр, что позволит Вашему новому телу дышать и на воздухе, и под водой.<BR>Нужно отметить, что жабры - это весьма чувствительная часть тела. Пожалуйста, не тыкайте в них и не чешите, даже если они кажутся Вам неудобными и некрасивыми.
tc.research_name.morphicFingers=Морфические пальцы
tc.research_text.morphicFingers=Ловкость рук и никакого верстака
morphicFingers1=Будучи ремесленником, Вы всегда хотели бы иметь все необходимые инструменты при себе - вдруг пригодятся?. А раз Вы Тауматург, Вы можете гарантировать, что эти инструменты всегда будут под рукой (буквально).<BR>Зачарование §5Морфические Пальцы§0 позволит пальцам трансформироваться в огромное количество различных форм: будь то инструменты, различные амулеты или резонаторы. Чтобы активировать эту способность - нажмите клавишу M, после чего откроется интерфейс, похожий на магический верстак (но он не может хранить предметы).
tc.research_name.spiderClimb=Паучье восхождение
tc.research_text.spiderClimb=Укушен радиоактивным тауматургом...
spiderClimb1=Вы когда-нибудь завидовали способности паука взбираться по стенам и высасывать все соки из испуганных шахтеров? Теперь Вы можете имитировать первую из них, по крайней мере...<BR>Зачарование §5 Паучье восхождение§0 наполнит руки специальными волокнами, которые цепляются к стенам, позволяя подняться по любой вертикальной поверхности, как по лестнице. Эту способность можно включить с помощью кнопки C. <BR> §4Не пытайтесь выпить соки из испуганных шахтеров!
tc.research_name.fistAugment=Увеличенные кулаки
tc.research_text.fistAugment=И новым чемпионом в тяжелом весе становится...
fistAugment1=Таумические кулаки - существенное улучшение по сравнению с тем, что Вам дала природа, но они не могут соперничать с Мечом Бури или Сингулярным крушителем; кулаки по сравнению с ними - ничто. Обычные чары не могут дать таких способностей, но Вы обнаружили несколько методов улучшения кулаков Вашего нового организма.<BR>Все чары из списка ниже можно накладывать друг на друга, но стоимость эссенции удвоится, в сравнении с предыдущим зачарованием.<BR>§5Мощные кулаки§0 увеличат собственную массу в момент удара, нанеся при этом дополнительный урон.
fistAugment2=§5Горящие кулаки§0 поджигают существ при ударе. Вы установили несколько защитных механизмов, чтобы Ваши кулаки загорались только в бою - в противном случае, Ваша повседневная деятельность может стать гораздо труднее.
fistAugment3=§5Кинетические кулаки§0 вызывают волнение в ауре при ударе, при этом швыряя врагов назад.
fistAugment4=§5Вампирические кулаки§0 перекачивают жизненную энергию от пораженных живых целей, исцеляя Вас (при небольшом количестве повреждений).
fistAugment5=§5Кулаки удачи§0, скорее всего, оставляют тела врагов в особом состоянии, увеличивая при этом шанс выпадения предметов.
fistAugment6=§5Оглушающие кулаки§0 создают резонанс с нервами мишени, временно замедляя ее движения.
tc.research_name.warpedTumor=Орган искажения
tc.research_text.warpedTumor=Враг моего врага - мой...
warpedTumor1=Искажение разума оказалось упрямым, идущим вслед за вашей душой от тела к телу. Раз Вы не можете избавиться от него полностью, лучшей мыслью было бы заточить Ваше искажение там, где оно не сможет причинить много вреда. При помощи зачарования §5Орган искажения§0, Вы можете создать особый орган в брюшной полости Вашего нового тела с родством к искажению. Он не сможет вместить в себя всю энергию, пронизывающую Вас, но вполне сможет содержать до пятидесяти очков искажения. В случае Вашей смерти, заточенное в органе искажение, скорее всего, вернется к Вашей душе.
tc.research_name.chameleonSkin=Шкура хамелеона
tc.research_text.chameleonSkin=Видишь меня?
chameleonSkin1=Хотели бы Вы проникнуть в лабораторию соперника или наблюдать за жизненным циклом древнего краба, оставаясь незамеченным? Смогли бы придумать как огромное количество времени оставаться невидимкой, кроме как пить залпом зелья невидимости? <BR>§5Шкура хамелеона§0 создаст в Вашем новом теле особые магические пигменты и микроскопические глаза в кожу, изменяющие ее цвет на уровне рефлексов, чтобы подстраиваться под окружающую среду. Эффект очень похож на эффект постоянной невидимости с его неспособностью скрывать броню.<BR>Этот эффект можно включить нажатием X.
tc.research_name.tumorOops=Апофеоз Древних
tc.research_name.tumorOops=Всё - лишь шаблон
tumorOops1=Вы думаете, что знаете все о вашем мире, о каждой вещи в нем. Самонадеянный. <BR>Наконец, ясно. Древние не являются живыми существами в вашем представлении, не глупые животные из мяса и костей, как и вы когда-то. Они – это часть холста, расписанного звездами, они текут и вращаются в течениях и водоворотах самой магии, закодированы, вписаны в саму суть, в структуру Жизни как таковой <BR> Но Шаблон, сам холст был разорван и раскидан мельчайшими фрагментами по просторам космоса впоследствии первородного катаклизма – большого взрыва. Куски Шаблона стремились воссоединиться с самого начала времен, еще со времен Сотворения. И вот, вы сыграли свою роль в жизненном цикле древних…
tumorOops2=Все ваши исследования, ваши экспедиции, ваши знания и открытия, все служило для Шаблона, для первородного холста жизни. Изучение магических законов привело его в ваш разум. Создание вами запрещенных артефактов помогло ему обрести физическое обличие. И, как только вы прошли испытание во внешних землях, Шаблон посчитал вас достойным содержать много его сути, больше осколков, больше Шаблона… <BR> Достаточно, ровно столько, чтобы превратиться в нечто большее. Следующий этап его древнего жизненного цикла. Но вы до сих пор живы. Возможно, еще не конец, еще не поздно. Быть может, у вас еще есть время узнать больше о Шаблоне, чтобы остановить его… Или выносить больше. Значительно больше.
tc.research_name.construction=Строительство Арканы
tc.research_text.construction=Не говорите это големам...
construction1=ТооооДооо
tc.research_name.planarTheory=Теория Подпространств
tc.research_text.planarTheory=Все глубже и глубже
planarTheory1=Космос обширнее и разнообразнее, чем вы могли себе представить, но некоторые аспекты мульти-вселенной начинают проясняться для вас, например, пустота. Только тогда, когда «Межвещество» протекает в наш мир с установленными законами и временным ходом из другого измерения, через узел ауры, он трансформируется в вис, потому как его потенциал может быть реализован в этом мире. <BR> Отсюда исходит вся магия.
planarTheory2=Понимание этой теории все еще оставляет вне досягаемости применение на практике. До сих пор ваши попытки создать узел ауры приводили к неудачам. Чего-то не хватает, чего-то важного... Однако результат одного из ваших спонтанных экспериментов может служить пищей для дальнейшей работы. Разбив жемчуг эндера и связав его энергию с помощью небольшого количества эфирной эссенции, взятой из уничтоженного узла и заключив все это в пустотном металле, вы создали устройство невероятной мощи, отличающееся стабильностью, в отличие от ваших предыдущих, способное контролировать разрывы во временной ткани. Очень может быть, что это окажется чрезвычайно полезным в ваших дальнейших исследованиях.
tc.research_name.transductionAmplifier=Узел-Стимулятор
tc.research_text.transductionAmplifier=Вис, сэр!
transductionAmplifier1=Без вмешательства извне, узел ауры накапливает вис рывками, вызванными флуктуациями во временном разрыве. Ваш узел-преобразователь может держать узел открытым, но его размер строго ограничен количеством базового вис, который в нем содержится, увеличение объема узла было невозможным до того момента, как вы разработали теорию подпространств. <BR> Используя новое устройство, полученное вами в ходе исследований, вы создали механизм, позволяющий создавать микроскопические подпространственные разломы внутри ядра возбужденного узла.
transductionAmplifier2=Подсоединение Узел-Стимулятора к возбужденному узлу и подача редстоун-сигнала увеличит количество санти-вис в узле, как если бы в используемом узле было на 10 вис каждого типа больше. Увеличивая размеры узла, вы подвергаете пространственные нарушения значительным нагрузкам. После присоединения одного стимулятора ничего не случится, но подсоединяя второй, будьте готовы к выбросам межпространственной энергии, третий стимулятор даст огромное количество выбросов энергии заражения. <BR> Совет: не пытайтесь присоединять четвертый. Это приведет к катастрофе!
tc.research_name.vortexStabilizer=Вихревой Сдерживатель
tc.research_text.vortexStabilizer=Сажаем узлы на диету
vortexStabilizer1=Огромное количество вис, присутствующее в голодных узлах, свело в могилу не одного начинающего тауматурга. Такая нелепая смерть не подобает тауматургу вашего класса, поэтому вы разработали способ временного «усмирения» таких узлов.<BR>Снабженный редстоун-сигналом, Сдерживатель проецирует синий луч в ядро голодного узла, трансформируя его поле. Любой голодный узел, находящийся под воздействием луча, перестанет поглощать блоки и предметы, пока луч не будет удален.<BR>Возможно, луч может также сдерживать и некоторые другие явления...
tc.research_name.planarKeystone=Пространственные Врата
tc.research_text.planarKeystone=Размышления над порталами
planarKeystone1=Огромных усилий стоит создание нового измерения, зато чрезвычайно легко навсегда потерять к нему доступ. Но это все в прошлом! Вы разработали гораздо более эффективный способ межпространственного транспорта, который больше не основывается на брешах в материи, остающихся открытыми.<BR>Основу этого метода составляют два важных компонента: объект, привязанный к целевому измерению, известный как ключ-камень, и врата, внутри которых может быть создан стабильный портал.<BR>Только что созданный ключ-камень должен быть привязан к определенному миру, поэтому, перед началом работы с ним, ПКМ им в руке, стоя в другом измерении.
planarKeystone2= После того, как ключ опечатан, он может быть помещен в слот в верхней части Пространственных Врат. Направив по 100 вис первичных аспектов с помощью жезла к ключ-камню, вставленному во врата, вы откроете портал к выбранному измерению. При желании, вы можете закрыть портал, просто убрав ключ-камень.<BR>Оказалось, что каждое карманное измерение может поддерживать до четырех открытых порталов. Это открытие позволяет быстро путешествовать между дальними точками мира, используя карманное измерение, как промежуточный пункт.<BR>Однако, врата не могут быть созданы во внешних землях или карманном измерении.
tc.research_name.pocketPlane=Карманное измерение
tc.research_text.pocketPlane=Создание пространства
pocketPlane1=Далеко не каждому смертному удается оставить свой след в мире. Но что, если Вам мало, и Вы хотите оставить не просто след, а новый мир?<BR>Манией величия тут не ограничиться. Если вам это удастся, то вы можете смело называть себя Богом.<BR>И такое триумфальное достижение уже лежит в пределах вашей досягаемости, ведь вы не абы кто, а Великий Тауматург! Вам уже удавалось прорвать ткань материи; бесконечные возможности лежат за ее пределами, но им нужно что-то особенное, чтобы сформировать новый мир... Сингулярная жемчужина! <BR>Погруженная в поток бесконечного вис жемчужина создает вокруг себя взрыв первородной материи, формируя остров в бескрайней пустоте…
pocketPlane2=Полученный мирок, однако, ограничен в размерах. По вашим расчетам, остров получится размерами в диапазоне 64-128 блоков в радиусе, который зависит от количества вис в Вихре. Некоторые сочетания аспектов могут привести к появлению аномалий, постоянных эффектов (как от зелий) внутри измерения или даже к появлению живых существ...<BR> Вы также можете почувствовать себя Богом в полной мере, назвав свой мир, просто переименовав жемчужину на наковальне перед использованием. В противном случае, он будет носить имя своего создателя.<BR>Вихрь, который был использован для создания измерения теряет свои остальные свойства, так как ведет теперь не в пустоту...
pocketPlane3=До тех пор, пока разлом стабилизируется ослабляющими лучами, его можно использовать в качестве портала, чтобы достичь Вашего нового мира.<BR>Вы уверены, что при помощи дальнейших исследований, Вы сможете открыть портал на более долгий срок.
tc.research_name.planarRift=Новые Горизонты
tc.research_text.planarRift=В пустоту
planarRift1=Почему узлы ограничены? Если бы количество Вис было случайным, то в мире бы встречались узлы, содержащие тысячи вис, но размер, похоже, строго ограничен. Новое исследование помогло Вам найти ответ! В больших масштабах времени, небольшие нарушения в узле могут накапливаться и искажаться, трансформируя его в голодный. Узлы, обладающие большей энергией сильнее подвержены этой участи, и если голодный узел не будет получать пищу в виде материи, он исчезнет, пропадет в другое измерение; этим и объясняется отсутствие мега-узлов. Сверхмощные узлы должны были быть только в прошлом...
planarRift2=Это печально, ведь вы только недавно поняли, что большие узлы могут быть проводниками в пустоту, причем не только для энергии, но и для физических объектов. Тем не менее, надежда еще есть.<BR>Подсоединив четыре Узел-Стимулятора к возбужденному узлу вы можете создать кратковременный пространственный разлом. Раньше такие эксперименты приводили лишь к тому, что полученный разлом быстро вбирал в себя материю, как огромный голодный узел и взрывался, но что если вам удастся сдержать его мощь совместным воздействием шести Вихревых Сдерживателей...
planarRift3=Что дальше? Погружение физических объектов в пустоту, в море первичных вис? Что же происходит с вещами внутри голодных узлов? Никто и представить не мог, какие просторы открывает перед тауматургом это исследование.<BR>После небольших экспериментов вам удалось понять суть процесса. Большинство земных объектов не выдерживает перегрузок и просто разбивается на первичный вис, но некоторые обьекты показывают устойчивость к первородным энергиям. Вы разработали заклинание эфирного потока, способное вытаскивать из разлома преобразованные объекты, просто нажимая ПКМ жезлом по нему.<BR>Настало время узнать, что можно получить таким образом...
tc.research_name.wispSpawn=Создание Виспов
tc.research_text.wispSpawn=Разорение Улья
wispSpawn1=Бросая щепотку Salis Mundus в потоки вихря, вы обнаружили странное свойство: зерна соли слипаются вместе, вбирая в себя энергию первородных Вис, формируя некое подобие жизни.<BR>Эти искусственно полученные существа практически идентичны виспам, которых вы могли встретить в местах скопления магии. Обратите внимание, что аспекты виспов зависят от аспектов узла, с помощью которого был получен вихрь.<BR>Количество виспов, полученных от одной щепотки соли, всегда разное, поэтому неосторожный тауматург вдруг может обнаружить, что виспы везде...
tc.research_name.crystalWand=Кристаллический жезл
tc.research_text.crystalWand=Одноразовая магия
crystalWand1=Все продвинутые жезлы включают в свои конструкции кристаллы, но только для усиления проводящих свойств других материалов. Сами по себе кристаллы инертны и не способны поглощать энергию узла, но что, если дать узлу поглотить их?<BR>Создав подобие жезла, используя кристаллы, вы бросаете полученную конструкцию в ваш разлом, получая жезл с относительно большой емкостью, по отношению к остальным, но без возможности перезарядки. Вы предполагаете, что это может сильно пригодиться при создании предметов, где невозможно использовать жезлы стандартной емкости.
tc.research_name.voidPutty=Пустотная замазка
tc.research_text.voidPutty=Как новенький!
voidPutty1=Пустотный металл чрезвычайно устойчив к магии, но даже он не выдерживает перегрузок, действующих на него в стабилизированном разломе. Нахождение вещества в потоке первичной энергии расщепляет его твердую составляющую, но сильно увеличивает его магические свойства, преобразуя его в вязкую массу, постоянно меняющую свою форму. Если замазка попадает на поверхность поврежденного объекта, она заполняет все трещины, принимая форму вещества, на которое попадет. Не важно, броня или оружие – все может быть починено с использованием кусочка Пустотной замазки.
tc.research_name.voidGolem=Голем из пустоты
tc.research_text.voidGolem=Загляни в бездну, и она заглянет в тебя
voidGolem1=Дикая идея захватила вас – если бросая в пустоту salis mundus, вы получили виспов, то что можно получить, бросив Порошок одушевления?<BR>Интригующий результат, который Вы окрестили Голем из пустоты, несет в себе тревожное сходство с Древними Стражами. Если бросать порошок небольшими порциями, чары схватываются и не позволяют формироваться стражам. Мало того, что эти големы послушны, они также могут выживать без сердца. Тем не менее, что-то в этих умных конструкциях Вам кажется странным. Вы должны следить за ними.
tc.research_name.recombinator=Последовательный объединитель Вис
tc.research_text.recombinator=Когда два узла любят друг друга очень сильно...
recombinator1=Хорошо известно, что два узла, находясь в непосредственной близости, могут повредить друг друга при обмене Вис. Этот примитивный процесс «высасывания» был единственным способом добавить аспекты в узел. До этих пор.<BR>Ваше исследование сингулярной жемчужины дало интересный результат – вы создали устройство, позволяющее создавать вакуум, похожий на тот, в котором происходило Сотворение мира. Именно под действием этих сил были созданы первичные аспекты, и именно эти силы способствуют их объединению в более сложные.
recombinator2=Устройство, которое вы окрестили Объединителем Вис, должно быть размещено над узлом ауры и быть запитано редстоун-сигналом. Подверженный этому эффекту узел начнет быстро вбирать в себя вис от других узлов, трансформируя свои собственные аспекты.<BR>Например, если центральный узел содержит Оrdo и Perditio, он может выкачать один аспект Ignis из соседних узлов, преобразуя один Оrdo в Potentia или Perditio в Gelum. Получаемые аспекты выбираются случайно, но объединитель всегда будет преобразовывать простые аспекты в более сложные, если есть подходящий Вис в других узлах.
recombinator3=Также вы заметили, что этот процесс никак не влияет на способность более крупных узлов «есть» те, что помельче, так что используйте стабилизатор при желании. Снабжая ваш узел нужным "кормом", вы можете получить необходимые вам аспекты.<BR>Странно, но устройство, кажется, следует определенной философии мироздания - по законам вселенной простое становится сложным, но что-то, похоже, удерживает узел от переполнения аспектами. Почему-то Вам кажется, что существует некое ограничение... Какая сила удерживает космическую энергию от достижения точки бесконечной мощи?<IMG>thaumichorizons:textures/misc/recombinatortext.png:0:128:255:128:0.5</IMG>
tc.research_name.planarClouds=Пространственные облака
tc.research_text.planarClouds=Циклон
planarClouds1=Создание «карманного» измерения высвобождает силы, берущие свое начало от Сотворения мира, и не удивительно, что существование этого измерения сопровождается явлениями, которых Вы никогда не видели.<BR>Наиболее часто появляются «Пространственные облака» - небольшие туманности, содержащие в себе воду и магическую энергию. Дождь из них идет синхронно с обычным миром, но в их мерцающих цветах проявляется мистическая энергия, отличающая их от обычных облаков. Вы выделили несколько основных типов: <BR> §5Земное§0 - просто облако, из которого может пойти дождь.
planarClouds2=5Грозовое§0 - вместе с дождем испускает разряды молний .<BR> Дождь из облаков §5Плазмы§0 идет из горящих угольков, поджигая все, на что попадет.<BR>Дождь §5Кислотных§0 облаков всё разъедает.<BR>§5Тучные§0 облака вместо дождя роняют на землю большие куски плоти. Некоторые из них даже напоминают мясо известных земных существ.<BR>Облака из §5жидкого сплава§0 состоят из кипящего металла. Из-за большого количества примесей в структуре, сами по себе облака невозможны для использования, но они проливаются дождем из самородков.<BR>Облака §5Вис§0 содержат в себе остатки ядер нестабильных узлов и проливаются на землю дождем из сфер аспектов.
planarClouds3=§5Глифовые§0 облака содержат забытые воспоминания, проливая их в виде сфер опыта.<BR>Облака §5оживления§0 напитывают первичной энергией жизни твердые блоки, формируя из них големов, агрессивных и непослушных, но Сердце голема должно решить эту проблему.<BR>Облака со §5спорами§0 проливаются дождем из различных семян и грибных спор, которые прорастают на плодородной почве, также споры могут вселиться в незадачливых коров, решивших погулять под дождиком.<BR> Вы также придумали простое заклинание, позволяющее перемещать облака, как твердые блоки, просто нажимая по нему ПКМ палочкой, Вы получаете твёрдый блок облака.
tc.research_name.sheederInfusion=Овцеук
tc.research_text.sheederInfusion=Делает то, что может паук
sheederInfusion1=Нить, создаваемая пауками, является очень ценным ресурсом, но охота на паукообразных занимает слишком много времени. Но может пересадить паучьи железы другому существу? <BR>Гибрид, полученный вами может быть создан, как из тела овцы, так и паука. Кожа Овцеука покрыта длинными шелковистыми нитями, схожими с паучьими. Эти нити могут быть острижены ножницами и довольно быстро вырастают снова. Овцеуки ведут себя, как обычные овцы, ну, разве что, умеют карабкаться по стенам...
tc.research_name.leviathan=Первородные ископаемые
tc.research_text.leviathan=То, что мертво, умереть не может... или может?
leviathan1=Какое странное, мрачное открытие. Выходит, пустота вовсе не настолько пустая, как Вам казалось - Ваше карманное измерение поглотило окаменелые останки неизвестного живого существа, как только сформировалось.<BR>На данный момент вы можете только догадываться о природе этого древнего Левиафана. Несколько костей, выброшенных в Ваш мир, не дают представления об общей анатомии этого существа, но их магические свойства поразительны! Даже будучи мертвыми окаменелостями, они пульсируют первородными аспектами, нарушая почти каждый закон Тауматургии.
leviathan2=Все очень странно... Вы не можете избавиться от ощущения, что кости наблюдают за Вами. Каждый раз, когда вы пытаетесь извлечь из них уникальные силы, используя один из доступных тауматургу способов, первородные кости изменяют структуру вещества так, чтобы этот способ оказывался бесполезным.<BR>Вероятно, что они не так мертвы, как кажется на первый взгляд; похоже, что процессы обмена веществ в них сильно разнятся с земными существами... что повышает вероятность их пробуждения.<BR>Вы должны внимательно следить за окаменелостями, а также за любыми устройствами, которые Вы, возможно, когда-нибудь создадите из них.
tc.research_name.alternateGolemBell=Колокольчик Голема
tc.research_text.alternateGolemBell=Обратите внимание
alternateGolemBell1=В случае конфликтов модификаций, Колокольчик Голема может быть создан по альтернативному рецепту.
@@ -0,0 +1,545 @@
itemGroup.thaumichorizons=神秘视界
thaumichorizons.noJar=你需要一个空要素罐子来捕捉生物!
thaumichorizons.setBeacon=已设定灵魂信标!
thaumichorizons.startSitting=等待中.
thaumichorizons.stopSitting=将时刻跟随于你.
thaumichorizons.revived=无魂躯壳
thaumichorizons.pocketplane=的口袋异次元
thaumichorizons.golemWarning1=你的一个傀儡看上去有些奇怪.
thaumichorizons.golemWarning2=你的一个傀儡开始轻声吟诵.
thaumichorizons.golemWarning3=你听到附近有虚伪的笑声.
focus.upgrade.slow.name=缓慢
focus.upgrade.slow.text=被收容之光击中的任何实体都将在短时间内减速,这使得光束瞄准目标会更加容易.
focus.upgrade.golemDuration.name=持久
focus.upgrade.golemDuration.text=这个核心创造出的傀儡将会存有额外十秒的运转时间.
focus.upgrade.berserk.name=狂暴
focus.upgrade.berserk.text=这个核心创造出的傀儡已经被暴怒吞噬.除非附加以非攻击性的运转核心,他们会攻击周围的一切生物,包括其它方块创造出的傀儡,和其它所有玩家,除了它的主人以外.
focus.upgrade.detonation.name=爆炸
focus.upgrade.detonation.text=这个核心创造出的傀儡将会在战败或时限已至时爆炸.他们仍将会以一个(相对)安全的距离跟随着主人.
focus.upgrade.nuggets.name=颗粒
focus.upgrade.nuggets.text=这个核心将更有效率地熔炼金属,可以像炼狱熔炉那样产出额外的金属颗粒.
focus.upgrade.purity.name=纯化
focus.upgrade.purity.text=这个核心将可以把矿石像熔炼的过程一样纯化为原矿簇,以产出更多有用的金属.
focus.upgrade.enervation.name=衰弱
focus.upgrade.enervation.text=解离之光将削弱生物的生命力,给予它们更多的伤害,减慢它们逃亡的步伐.
focus.upgrade.solar.name=日光
focus.upgrade.solar.text=这个核心制造的光球将烧尽所有它接触到的东西.
focus.upgrade.headlightfluid.name=液体光芒
focus.upgrade.headlightfluid.text=在水下时,这个核心可向一立方米水中注入以柔和的荧光.这个效果异常脆弱:只要那些水被桶取走后它就会失去核心所带来的魔力.
focus.upgrade.fission.name=灵气裂变
focus.upgrade.fission.text=这个核心将有20%的几率产生额外一点原始要素的Vis,由其抽取的复合要素的组成决定元始要素的种类.
focus.upgrade.escape.name=逃逸
focus.upgrade.escape.text=这块要石可以创造一个来自外域的传送门.
critterInfusions.quicksilver=水银之肢
critterInfusions.thaumClaws=神秘之爪
critterInfusions.awakeBlood=苏醒之血
critterInfusions.diamondSkin=金刚之躯
critterInfusions.enderHeart=末影之心
critterInfusions.shockSkin=电击之肤
critterInfusions.instilledLoyalty=蛊惑人心
critterInfusions.runicHide=符文皮毛
critterInfusions.eldritchFangs=邪术毒牙
critterInfusions.portability=便携虚空
selfInfusions.quicksilver=自我注魔:水银之肢
selfInfusions.morphic=自我注魔:变形之指
selfInfusions.awakeBlood=自我注魔:苏醒之血
selfInfusions.diamondSkin=自我注魔:金刚之躯
selfInfusions.silverHeart=自我注魔:银树之心
selfInfusions.synthSkin=自我注魔:光合皮肤
selfInfusions.amphibious=自我注魔:两栖水肺
selfInfusions.warpedTumor=自我注魔:扭曲毒瘤
selfInfusions.spiderClimb=自我注魔:飞檐走壁
selfInfusions.chameleonSkin=自我注魔:变色皮肤
###ENTITIES###
entity.ThaumicHorizons.PrimedAlchemite.name=激活的炼金炸药
entity.ThaumicHorizons.ChromaticSheep.name=七彩羊
entity.ThaumicHorizons.SelfShearingSheep.name=自动脱毛羊
entity.ThaumicHorizons.GuardianPanther.name=守卫者美洲豹
entity.ThaumicHorizons.Gravekeeper.name=守墓者
entity.ThaumicHorizons.Familiar.name=神秘之子
entity.ThaumicHorizons.ChocolateCow.name=巧克力奶牛
entity.ThaumicHorizons.WizardCow.name=天域牛
entity.ThaumicHorizons.ScholarChicken.name=学者鸡
entity.ThaumicHorizons.GoldChicken.name=黄金鸡
entity.ThaumicHorizons.OrePig.name=冶金猪
entity.ThaumicHorizons.TaintEaterPig.name=腐化吞噬之猪
entity.ThaumicHorizons.Thunderhorse.name=奔雷驹
entity.ThaumicHorizons.Endersteed.name=末影骥
entity.ThaumicHorizons.NightmareTH.name=梦魇马
entity.ThaumicHorizons.HorseZombie.name=僵尸马
entity.ThaumicHorizons.HorseSkeleton.name=骷髅马
entity.ThaumicHorizons.Seawolf.name=海之狼
entity.ThaumicHorizons.NetherHound.name=地狱猎犬
entity.ThaumicHorizons.LunarWolf.name=月之狼
entity.ThaumicHorizons.Syringe.name=注射器
entity.ThaumicHorizons.BlastPhial.name=爆裂安瓿
entity.ThaumicHorizons.BoatGreatwood.name=宏伟之木船
entity.ThaumicHorizons.BoatThaumium.name=神秘船
entity.ThaumicHorizons.MeatSlime.name=肉质史莱姆
entity.ThaumicHorizons.MercurialSlime.name=水银史莱姆
entity.ThaumicHorizons.VoltSlime.name=伏特史莱姆
entity.ThaumicHorizons.MedSlime.name=梅德史莱姆
entity.ThaumicHorizons.Sheeder.name=蛛羊
entity.ThaumicHorizons.LostSoul.name=迷失灵魂
###POTIONS###
potion.visboost=灵气增幅
potion.visregen=灵气创生
potion.vacuum=物件真空
potion.shock=静电震击
potion.synthesis=光合作用
###ITEMS###
item.Wand.disposable.rod=水晶质
item.Wand.disposable.cap=一次性
item.eggIncubated.name=孵化的蛋
item.lensCase.name=透镜之匣
item.LensFire.name=火之辉光之镜
item.LensWater.name=水之共鸣之镜
item.LensAir.name=气之魂灵之镜
item.LensEarth.name=地之遗忘之镜
item.LensOrderEntropy.name=阴阳学究之镜
item.focusContainment.name=法杖核心:收容
item.jarredSoul.0.name=停滞罐子
item.jarredSoul.1.name=缸中灵魂
item.jarredSoul.jarred=缸中
item.jarredSoul.soul=灵魂
item.amuletMirror.name=镜像护身符
item.injection.0.name=注射剂
item.injection.1.name=爆裂安瓿
item.syringeBlood.0.name=含血奥术针筒
item.syringeBlood.1.name=爆裂安瓿
item.syringeEmpty.name=奥术针筒
item.syringeSample.name=血之样品
item.injector.name=针筒发射器
item.corpseEffigy.name=死尸雕像
item.nutrients.name=富营养混合物
item.chocolate.name=巧克力块
item.chocolateMilk.name=巧克力牛奶桶
item.icecream.name=巧克力冰淇淋
item.inkEgg.name=暗黑鸡蛋
item.goldEgg.name=金蛋
item.infusion.name=生物注魔
item.suicidePill.name=自尽注射剂
item.focusAnimation.name=法杖核心:活化
item.focusLiquefaction.name=法杖核心:熔析
item.focusDisintegration.name=法杖核心:解离
item.focusIllumination.0.name=法杖核心:光明(黑)
item.focusIllumination.1.name=法杖核心:光明(红)
item.focusIllumination.2.name=法杖核心:光明(绿)
item.focusIllumination.3.name=法杖核心:光明(棕)
item.focusIllumination.4.name=法杖核心:光明(蓝)
item.focusIllumination.5.name=法杖核心:光明(紫)
item.focusIllumination.6.name=法杖核心:光明(青)
item.focusIllumination.7.name=法杖核心:光明(银白)
item.focusIllumination.8.name=法杖核心:光明(灰)
item.focusIllumination.9.name=法杖核心:光明(粉)
item.focusIllumination.10.name=法杖核心:光明(黄绿)
item.focusIllumination.11.name=法杖核心:光明(黄)
item.focusIllumination.12.name=法杖核心:光明(浅蓝)
item.focusIllumination.13.name=法杖核心:光明(品红)
item.focusIllumination.14.name=法杖核心:光明(橙)
item.focusIllumination.15.name=法杖核心:光明(白)
item.focusAnimation.name=法杖核心:活化
item.golemPowder.name=傀儡火化粉
item.golemPlacer.name=活化傀儡
item.GolemBellTH.name=傀儡使铃铛(TC)
item.boatGreatwood.name=宏伟之木船
item.boatThaumium.name=神秘船
item.conduit.name=异界传导物质
item.keystoneBlank.name=空白异界要石
item.keystoneTH.name=平面异界要石
item.crystalWand.name=惰性水晶杖芯
item.voidPutty.name=虚空油灰
item.meatTH.name=无法辨认的肉
item.meatcookedTH.name=无法辨认的熟肉
item.meatnuggetTH.name=无法辨认的肉粒
item.nodeCheat.name=节点开启器
###BLOCKS###
tile.ThaumicHorizons_synthNode.name=天域碎片
tile.ThaumicHorizons_alchemite.name=炼金炸药
tile.ThaumicHorizons_visDynamo.name=魔力反应炉
tile.ThaumicHorizons_essentiaDynamo.name=源质反应炉
tile.ThaumicHorizons_nodeMonitor.name=节点透视之镜
tile.ThaumicHorizons_soulSieve.name=灵魂滤网
tile.ThaumicHorizons_inspiratron.name=摄魂之脑
tile.ThaumicHorizons_soulforge.name=灵魂熔炼炉
tile.ThaumicHorizons_soulJar.name=缸中 %CRITTER
tile.ThaumicHorizons_bloodInfuser.name=血液转化器
tile.ThaumicHorizons_vat.name=治愈之缸
tile.ThaumicHorizons_vatSolid.name=治愈之缸
tile.ThaumicHorizons_soulBeacon.name=灵魂信标
tile.ThaumicHorizons_modMatrix.name=改版符文矩阵
tile.ThaumicHorizons_chocolate.name=巧克力块
tile.ThaumicHorizons_transductionAmplifier.name=传导增幅器
tile.ThaumicHorizons_recombinator.name=因果重组器
tile.ThaumicHorizons_vortexStabilizer.name=漩涡弱化设备
tile.ThaumicHorizons_light.name=光球
tile.ThaumicHorizons_vortex.0.name=平面漩涡
tile.ThaumicHorizons_vortex.1.name=平面漩涡(创造)
tile.ThaumicHorizons_void.name=异界边境
tile.ThaumicHorizons_slot.name=要石容器
tile.ThaumicHorizons_cloud.0.name=云
tile.ThaumicHorizons_cloud.1.name=等离子云
tile.ThaumicHorizons_cloud.2.name=雷云
tile.ThaumicHorizons_cloud.3.name=酸云
tile.ThaumicHorizons_cloud.4.name=合金云
tile.ThaumicHorizons_cloud.5.name=肿胀云
tile.ThaumicHorizons_cloud.6.name=Vis云
tile.ThaumicHorizons_cloud.7.name=符文云
tile.ThaumicHorizons_cloud.8.name=孢子云
tile.ThaumicHorizons_cloud.9.name=憎恶云
tile.ThaumicHorizons_brain.name=大脑团
tile.ThaumicHorizons_dust.name=尘埃
tile.ThaumicHorizons_eye.name=眼簇
tile.ThaumicHorizons_flesh.name=肉疙瘩
tile.ThaumicHorizons_bone.name=骨头
tile.ThaumicHorizons_spike.name=金属钉
tile.ThaumicHorizons_spikeWood.name=木钉
tile.ThaumicHorizons_spikeTooth.name=牙齿
tile.ThaumicHorizons_crystal.0.name=白色水晶
tile.ThaumicHorizons_crystal.1.name=橙色水晶
tile.ThaumicHorizons_crystal.2.name=品红水晶
tile.ThaumicHorizons_crystal.3.name=淡蓝水晶
tile.ThaumicHorizons_crystal.4.name=黄色水晶
tile.ThaumicHorizons_crystal.5.name=黄绿水晶
tile.ThaumicHorizons_crystal.6.name=粉色水晶
tile.ThaumicHorizons_crystal.7.name=灰色水晶
tile.ThaumicHorizons_crystal.8.name=淡灰水晶
tile.ThaumicHorizons_crystal.9.name=青色水晶
tile.ThaumicHorizons_crystal.10.name=紫色水晶
tile.ThaumicHorizons_crystal.11.name=蓝色水晶
tile.ThaumicHorizons_crystal.12.name=棕色水晶
tile.ThaumicHorizons_crystal.13.name=绿色水晶
tile.ThaumicHorizons_crystal.14.name=红色水晶
tile.ThaumicHorizons_crystal.15.name=黑色水晶
tile.ThaumicHorizons_deepcrystal.name=深度水晶
tile.ThaumicHorizons_leviathan.name=原始化石
tile.ThaumicHorizons_gateway.name=平面之门
###RESEARCH###
tc.research_category.ThaumicHorizons=神秘视界
tc.research_name.alcheponics=炼金栽培
tc.research_text.alcheponics=需要大量谷物
alcheponics1=虽然针对无生命物质的炼金变换已经足够简单,但鲜有活体在被实施炼金术之后生还的案例.你在最近的研究中应用了一些不一样的思路-你只是简单用炼金术加速了它们自然生长的过程,而非尝试去直接"修改"它们.<BR>通过把普通食用作物的种子浸入浓缩的光,水,土的混合精华之中,植物可以以令人震惊的速度生长.但很不幸,这个过程是把双刃剑;这些植物毫无例外地在它们结出果实前就已经死亡了.
alcheponics2=大多数植物可以通过炼金栽培的产物进行进一步的繁衍,但这种方式对小麦的生长没有效果.
tc.research_name.alchIncubation=炼金孵化
tc.research_text.alchIncubation=每个坩锅里都有一只鸡
alchIncubation1=在炼金栽培的成功之后,将类似的方法应用于动物上似乎是一个符合逻辑的选择.向一个鸡蛋提供温暖而原始的生命能量将保证鸡蛋中的胚胎在破壳时能够存活.<BR>但更好的消息是,通过对鸡的初期生长过程的限制,你好像已经解决了作物快速老化的灾难性问题.
tc.research_name.meatGrowth=肉类复制
tc.research_text.meatGrowth=零屠宰零痛苦
meatGrowth1=你现在有了对炼金术是如何作用于有机生命的自然生长过程的坚定认识.通过细心选择并应用这些技术,你可以在无需饲养整个动物体的条件下单独培育出动物组织.<BR>这个发现最明显的应用就是食物生产 - 一小块生肉样本可以"长"成任意大小,还不失原本的色泽和味道.
tc.research_name.shardTrans=碎片嬗变
tc.research_text.shardTrans=不平衡的碎片
shardTrans1=少数神秘学上的麻烦就好比是这样:你突然发现某种要素的碎片用完了,但一堆其它的碎片在墙角一边吃灰一边嘲讽地看着你.这种抱怨终究会成为过去.<BR>在你可以轻松转换任意碎片嬗变为平衡碎片之后,你最近正好发现了逆向执行此过程的把戏.通过向碎片中注入过量的你所期望的要素,辅以少量§5Permutatio§0要素以"洗净"剩余要素,你所剩下的就是普通的碎片.
tc.research_name.fleshLeather=肉类硬化
tc.research_text.fleshLeather=从食物到时尚
fleshLeather1=尽管你在复制肉类的实验中大获成功,培养实用皮革已被证明是一个更让人上火的问题.现在你也许已经发现了解决皮革生产问题的另一种替代方法.<BR>肉类若在合适的混合要素源质中煮沸,大多数将会硬化直到它们无法和普通皮革分辨开来.你甚至还成功把少量僵尸肉嬗变为更有用的形式,尽管在这种情况下你需要一点点§7Ordo§0要素以阻止它们腐烂.
tc.research_name.etherealShard=天域碎片
tc.research_text.etherealShard=人工灵气存储设备
etherealShard1=破坏灵气节点所掉落的天域之华在很长时间以来都是一个烦人的谜团.它似乎仍保留有节点的转储灵气为容易获取的形式的能力,但是它无法在重创节点核心的情况下给自己充能,并且在无人看管的情况下趋于蒸发.<BR>你也许已经发现了解决这些问题的方法.辅以合适的注魔,一个平衡碎片可以像节点核心一样工作.尽管自身没有任何灵气,充能节点产生的CentiVis可以被轻松转移到天域碎片中,以一种方便储存方式进行存储.
etherealShard2=这个碎片本身没有任何存储灵气的能力;你必须手持天域之华右击碎片来使其获取灵气存储的能力.一旦它被充能,灵气就可以像一个灵气节点一样从碎片中流出来.<BR>复合要素只有在组成其自身的所有元始要素都可以由存储于碎片中的CentiVis提供时才能充入碎片中.损坏时,碎片会掉落所有其存储的源质精华.
tc.research_name.alchemite=炼金炸药
tc.research_text.alchemite=这绝不会变得超级坏...
alchemite1=普通的爆炸在采矿和陷阱制作方面有它们的用途,但它们破坏一切的欲望限制了它们的应用.你认为你已经解决了这个问题,通过把一般爆炸产生的冲击波转化为神秘场中的涟波,将所有触及到的物体粉碎为要素.<BR>炼金炸药所破坏的方块将会掉落晶化源质而非一般的物品.所有因爆炸而死的生物也会有类似的命运,尽管它们依旧掉落常规物品.<BR>让一个灵气节点去承受这种爆炸所产生的力场绝对不是一个好主意...
tc.research_name.visDynamo=魔力反应炉
tc.research_text.visDynamo=便携式能源
visDynamo1=你偶然发现你需要CentiVis但是手头却没有充能节点.这个设备干脆利落地解决了此问题,它可以直接通过使用者手中的法杖来驱动各种设备.<BR>手持法杖按住鼠标右键将会给反应炉充能,每秒从法杖中获取1点cV并发射出5点cV.默认条件下灵气反应炉将同时产出六种元始要素的Vis,但是朴素的神秘使还可以限制它只产出一种Vis,为此她需要GUI.
tc.research_name.essentiaDynamo=源质反应炉
tc.research_text.essentiaDynamo=液态燃料
essentiaDynamo1=尽管灵气反应炉相当有用,需要时刻看管这一点经常导致它并不实用.如果你能通过用管道注入源质从而自动进行这个过程将会发生什么?<BR>从你早期改进奥法离心机的尝试中,你回想起来偶尔把源质气化为Vis实在是太简单了.通常这种能量将只是扩散至周围的灵气中使得你无法获取,但如果你在真正执行这个过程时还附带了合适的收容力场,那会产生一股强烈的CentiVis流.
essentiaDynamo2=这个反应炉每秒消耗一点源质并输出总量为12点的cV.它可以接受任何复合源质,虽然这样做会导致能量按照元始要素的组成比例均匀分割为数股.例如,一点§5Arbor§0源质将产出§6Aer§0,§3Aqua§0,和§2Terra§0的cV各四点,然而§5Humanus§0将产出全部六种元始要素各两点.
tc.research_name.nodeMonitor=节点透视之镜
tc.research_text.nodeMonitor=时刻注意一切
nodeMonitor1=节点也许是一个神秘使最宝贵的资产,并且它本身也需要你大量的时间来看护.<BR>在对魔导手镜做出少许修改后,你创造了一个设备,它可以悬浮在一个灵气节点之上,并时刻追踪它当前的状态.只要节点里任何一种要素Vis含量下降到一定值,它就会发出红石信号直到要素含量恢复.<BR>但愿这玩意能给你足够的警告,让你去挽救一个传奇的节点.
tc.research_name.essentiaInjection=血之炼金术
tc.research_text.essentiaInjection=并不是为了软弱的心灵
essentiaInjection1=药水酿造的艺术已经被人们实践了数个世纪,但是秘传药剂的使用却约束了人们的想像力.如果你用要素源质达成了一样的结果会怎样?<BR>当然,饮用源质这种想法使得神秘使们退缩了,因为一个正当的理由-人类的胃本是不能消化天然的魔法能量的.但另一方面,从炼金术角度来讲,处理一份你自己的血并将其重新注入回自己体内被证明是一种可靠的获取短暂魔法效果的方法.
essentiaInjection2=通过一个血液注射器可以制造炼金注射剂,至多可以使用八点任意要素源质的组合,你需要通过血液转化器的交互界面来选择要素.这种注射剂所带来的效果取决于所选取的要素,并且这种效果有那么一点不可预测的成分,但是你已经留意到了几个固定的模式.<BR>每种要素似乎都有一种对特定几个效果的作用倾向,但是一剂注射剂只能消耗两点要素源质并提供一种效果.这种情况只有在累积倾向最高的效果真正显现时才会发生.<BR>因为单独一种要素源质经常同时有正面和负面的效果,实验不同组合以冲淡期望之外的效果将会是一个理智的选择.
essentiaInjection3=例如,§5Lux§0源质对夜视有强烈倾向但它对失明的倾向就很微弱.你可以用两点§5Lux§0要素源质创造一个短寿的夜视注射剂,但你添加第三点一样的要素会带来失明的效果.如果第四点要素是带有强烈的急迫倾向的§5Perfodio§0,那么这支注射剂反倒会同时提供夜视和急迫两种效果.<BR>血液转化器可以以自动或者单次两种模式工作.前者将持续制造注射剂,只要不断向设备提供血液和要素源质(当然还有足够的输出格),但是后者将会在成功一次后停下来.
essentiaInjection4=只需要简单的右击就可以使用奥术针筒来抽出你的血.如果你需要的话,你也可以通过手持空注射器右击其它活体生物,以从中获取血液.值得注意的是动物血并不适合炼金术的处理过程.<BR>注射剂可以直接右击来作用到你身上,或者用其攻击别的生物以此来作用到别的生物身上.出于卫生考虑,奥术注射器应为一次性物品,使用后应丢弃.
tc.research_name.blastPhial=爆裂安瓿
tc.research_text.blastPhial=一次直截了当的血浴
blastPhial1=在淘汰掉经典的药水之后,以相同的方式改造喷溅药水就变得理所当然了.只需要向要素安瓿中填充血液和火药的混合物,然后就像奥术注射器一样使用它.发射出去的安瓿在受到撞击后即刻爆炸,任何附近的生物都将会受到魔力之血的洗礼.<BR>这个东西并不是很卫生,但绝对高效.
tc.research_name.injector=针筒发射器
tc.research_text.injector=小心你瞄准目标的地方
injector1=用针筒打击你的敌人已经满足需求了,但有时你还是更喜欢与敌人保持一段安全距离.<BR>针筒发射器,一种改版的十字弩,也许是两者之间最好的选择.弹药(针筒或者爆裂安瓿)可以通过潜行+右击装填入其转筒中.然后这个设备就可以像普通的弓弩一样使用,爆炸后造成伤害,并产生子弹所附带的药水效果.<BR>失去了目标的的针筒可以回收,但是注入器本身不会受无限附魔的加成.
tc.research_name.focusContainment=法杖核心:收容
tc.research_text.focusContainment=去,收容全部对象
focusContainment1=在你的旅途中你会遇到很多有必要进一步研究的来自异国的生物,但通常把它们带回你的实验室里是困难的.可以肯定的是,神秘学可以提供一个更合适的解决方案:你只需要用带子系上那些动物就可以了.<BR>一系列对便携式洞穴核心的改进已经充分证明它可以胜任此工作.通过塌缩目标周围的时空为一个口袋,你可以将目标静止在一个要素罐子之中.<BR>一旦被封印于要素罐子之中,动物实例就可以无限期储存,无需对抗饥渴,乃至寿命.
focusContainment2=一般的生物很容易捕捉,但是更强大的生物已经被证明难以收容;你要么先发制人,对目标造成一定伤害,要么就只能不断对目标释放收容之光以克服其防御力.某些特定实体,包括傀儡和其他神秘使在内,是无法捕捉的.<BR>想打破罐子释放生物的话,只需要手持法杖右击即可.
tc.research_name.incarnationVat=化身
tc.research_text.incarnationVat=有求必应的牲畜
incarnationVat1=你现在正迫不及待地想统御"生命"的本身.是时候进行下一步行动了:人工繁育整个有机生物.<BR>整个过程可以在一个未经修改的治愈之缸中完成,但这需要一些特别的材料.首先是待复制的生物的组织样本-它的一小块肉,或是一针筒它身上的血.<BR>一旦样本就绪,用管道输送四点§5Victus§0源质到缸中,这将激发整个生长流程.最后,整个复制流程需要大量营养来使其长为成年的大小.为此你研发出了一种优化过的富营养混合物.
incarnationVat2=当所有材料就绪时,复制体将会快速长为成年一样的大小.你可以手持要素罐子右击治愈之缸来取出你的杰作.<BR>但这整个复制过程中有一个奇特的限制.在动物复制体的生长阶段中产生自己的灵魂时(显然是通过合并附近的灵气实现的),它却不能复制人类的灵魂,人类的复制终究会失败.<BR>破坏含有生物的治愈之缸很可能是致命的.
tc.research_name.healingVat=治愈之缸
tc.research_text.healingVat=神秘使,治愈它们吧
healingVat1=伴随着你对组织复制的新的发现和理解,将此技术应用于为生物快速疗伤已经成为可能.<BR>这个过程异常脆弱,并不适合在坩锅中进行.正好相反,为此你设计出了一个特殊的大缸,它可以为病人做出诊断,并通过管道获取合适的要素源质以治疗它的病人们:<BR>§5Victus§0要素将回复失去的生命值,尽管速度很慢.<BR>§5Fames§0源质将重新填满你的饥饿条.<BR>§5Sano§0源质将快速回复生命值.它还可以使大多数负面效果无效化.
healingVat2=要进入或离开治愈之缸,只需右击通路阀门.理论上大缸应该可以治愈所有生物,但目前为止没有任何牲畜被证明可以在足够配合的条件下进入.<BR>你认为你的缸还可以进一步改进,你设计了双重接口作为扩展.
healingVatContainment= §n收容核心 解锁§r<IMG>thaumichorizons:textures/items/focus_containment_static.png:0:0:255:255:0.0625</IMG>被捕捉到要素罐子中的生物可以通过手持罐子右击治愈之缸来放入.相同的方式还可以把其中的生物转移到空的缸中.<BR>试图破坏一个含有生物的治愈之缸必将招致可怕的死亡;缸的魔力与生物的生命力之间的连接的突然断裂将会使得生物的身体溶解为咒波,并像爆炸一样从缸中喷出.<BR>另一个有趣的事情是,你的治愈之缸还能治疗不死族.§5Mortuus§0源质将缓慢回复其生命值,但使用§5Exanimis§0源质会更有效率.
tc.research_name.infusionVat=生物注魔
tc.research_text.infusionVat=更坚实,更快速,更强健
infusionVat1=注魔生物绝对是一门没有先例的技艺:神秘学文献中到处充斥着各种荒谬畸形的警告式的描述,他们的结论无一例外都是生物的身体拒绝外来的异域魔法.你的治愈之缸也许终将允许这个过程成功实施,方法则是在注魔进行过程中暂停生物的关键功能.<BR>你必须先在缸顶安装一个改版符文矩阵.但这听起来容易做起来难,因为试图注魔一个符文矩阵会在两个矩阵之间产生值得深思的魔导反馈现象.谨慎的神秘使会保证她的祭坛准备妥当的.
infusionVat2=注魔之缸准备就绪后,它的操作方法和标准注魔祭坛几乎一样,尽管源质需要直接用管道输送进去.<BR>然而,此过程相比于注魔非生命体,还是有那么一点危险的.进一步来讲,就是通常会出现的反应,不断累积的不稳定性将会对注魔目标造成伤害.更糟糕的是,这个过程不可能中断;你只能选择破釜沉舟.<BR>那些并不强壮的生物或许无法在没有外界帮助的情况下挺过复杂的注魔.你的实验已经表明提供§3Aqua§0,§7Ordo§0,和§2Terra§0要素的centivis组合可以降低受伤的风险.
infusionVat3=注魔之缸也有少许局限性.首当其冲的是人类(以及其它有感觉的生物)无法被注魔的事实,因为人类灵魂的活动干涉了魔法能量的加成反应.类似的,本身就出自自然魔法的生物,例如不死族和傀儡,也不会受影响.<BR>还有,虽然一个生物可以进行多次常规生物注魔,但它却只能进行一次特种生物注魔.<BR>不幸的是,注魔生物无法将其自身的注魔遗传给后代.
infusionVatClone= §n化身 解锁§r<BR>你的化身制造可以复制那些注魔过的生物了.这需要一些额外的要素源质;你需要一次性提供此生物的注魔所消耗的所有要素的总量.<BR>有趣的是,血液样品提了一个培养有机体的完美样本,且不产生不稳定性,也不需要任何物理条件,这使得复制成为了一条高效繁育你的杰作的途径.
tc.research_name.generalInfusion=常规注魔
tc.research_text.generalInfusion=机会平等的附魔
generalInfusion1=注魔之缸可用于想动物身上追加大量增强属性.除非有特别说明,每个个体都只能从下列每种注魔中受益至多一次:<BR>§5水银之肢§0 增强生物的肌肉和肌腱,得到一个更强健灵活的动物.它的移动速度和跳跃能力都会有所提升.
generalInfusion2=§5神秘之爪§0 将动物的趾甲全以神秘锭材质替换,可提升其造成的伤害.然而,那些生来不会主动攻击的生物或许不会去使用这强化过的爪.
generalInfusion3=§5苏醒之血§0 首先要同意对动物的循环系统的基础认识.其凝血块会快速并活跃地从受伤位置自我重定向为加速治疗.接受此注魔的生物将会在受伤后缓慢回复生命值.
generalInfusion4=§5金刚之躯§0 在保留弹性的前提下强化动物的毛皮.通过此法注魔的生物将获得少许全伤害减免的能力.<BR>你的目标的皮肤似乎还继承了另外一些钻石的属性,隐隐约约能感受到闪光的倾向.
generalInfusion5=一个鲜为人知的事实是,死去的末影人留下的玻璃状珍珠是活体器官.它们对于生物的传送功能异常重要,但这和陆栖生物完全不兼容.<BR>你或许可以通过注魔之缸架起一道横跨这两者之间的桥梁.§5末影之心§0注魔会向珍珠灌输功能类似的初期组织,并将这个混合器官移植到目标动物身上.虽然这些动物无法进行有意识地传送,它们会条件反射似的"闪烁"一段距离以回避投掷物.
generalInfusion6=§5电击之肤§0 通过构建一个贯通动物全身的小型生物电腺体,将允许生物产生雷电电击效果.甚至那些天性不会主动进攻的动物也会在受到攻击时放电.
generalInfusion7=§5蛊惑人心§0 强制重写目标心灵的一小部分,去除它们可能针对你的任何敌意,并替换以狂热的为它的养"父母"牺牲的精神.<BR>经过此种处理的动物会像被驯服的狼一样守护你,即使它们的天性不会让它们主动发起攻击.右击可以命令它们原地待命.
generalInfusion7b=值得注意的是,一些特定生物的大脑被重写后将失去它们的一些本能 - 例如,爬行者将忘记如何自爆.
generalInfusion8=现在你已经可以放心地修改你的动物了,是时候尝试追加更奇异的魔法属性了.<BR>§5符文皮毛§0注魔向动物的表皮中压印入了古代符文的力量,在这薄薄的保护层上叠加了一层符文护盾.<BR>和追加到物品上的符文护盾不一样,这种护盾的自我复原不是使用额外的Vis,而是消耗动物本身的体力.为避免对动物本身造成伤害你不得不限制了这个过程的反应速率,所以符文护盾的再充能速度要比你的物品慢很多.
generalInfusion9=是时候推倒注魔之缸本身的局限性了.依然有少数对有机生命有害的材料,就比如说虚空金属,如果一个生物的利齿可以灌入以虚空金属的特性,这个野兽将会造成举世无双的咬伤,并将充满了邪恶的毒液注入它的猎物体内.<BR>§5邪术毒牙§0注魔成功做到了这一点,与此同时其周围的生物组织也被以魔法隔离开来.这个过程真的很危险...但这并不能阻挡你前进的步伐.
generalInfusion10=§5不死之躯§0 这个注魔将天然的创生精华通过元始珍珠注入到了动物体内.这样做之后,它们就不可能被真正消灭;一旦被杀死,它们很快就会缩小为一个珍珠一样的球,这个球中含有此生物最初的灵魂.<BR>将这个幸存者放入治愈之缸并提供Victus和Sano要素源质各十六点将令这些生物重生.重生后的动物会保留有注魔和其它一切属性.<BR>不像其它的注魔,不死之躯的属性是无法通过复制来传承下去的.
tc.research_name.runicCreature=符文皮毛
tc.research_text.runicCreature=首饰?什么首饰?
tc.research_name.eldritchFangs=邪术毒牙
tc.research_text.eldritchFangs=正面撕咬
tc.research_name.instilledLoyalty=蛊惑人心
tc.research_text.instilledLoyalty=你终将会服从!
tc.research_name.deathless=不死之躯
tc.research_text.deathless=保护你的投资
tc.research_name.portability=便携虚空
tc.research_text.portability=可移动仆从
portability1=你的收容核心是个无价之宝,但装罐和释放生物的过程不论是从玻璃来说还是从Vis来说都极其昂贵.现在我们有革命性的新选择了.<BR>你的§5便携虚空§0注魔将会置生物于一个容器之中并将其稍稍位移到一个更高的维度上去.只需法杖敲击一下就可以将罐子放出到物质平面上,以困住生物;再次敲击将会释放生物并将罐子转移至虚空,在那里罐子和虚空融为一体,以便未来不时之需.
tc.research_name.cowInfusion=牛注魔
tc.research_text.cowInfusion=神秘牛奶
cowInfusion1=你发现了两种增强你的普普通通的奶牛的方法.<BR>首先,也是最简单的,修改奶牛的udders使其产出糖浆一样的巧克力牛奶.可以直接饮用来获取一般牛奶的效果,或者把它晾干获取巧克力棒.使用魔法捏制你还可以急速冷冻它使其变成美味的冰淇淋.<BR>有些人声称九个巧克力棒可以合成一个巧克力块,不过又有什么不正常的人会拿巧克力盖房子?
cowInfusion2=第二种牛的注魔,将融合牛以及菌类生物,以产生著名的稀有共生体,哞菇.<BR>这是否可以说明哞菇是一种古代神秘使制造的人造生物,或者说明你重演了一遍自然现象,依旧不得而知.不像其它的注魔生物,哞菇是可以生产后代的.
cowInfusion3=第三种,也是最困难的一个,稍稍将牛的相位修改出了物质世界的范围,这将允许它的身体里容纳一个灵气节点.(它自己不能制造出节点;你必须手持缸中节点右击才行)<BR>一旦节点被放置入其体内,这个奶牛产出的牛奶中就会有它分泌出的要素源质!反应速率取决于你提供的节点-节点越明亮,要素点数越多,产生要素源质的速度就越快.手持空要素罐子右击奶牛来收获吧.
tc.research_name.sheepInfusion=羊注魔
tc.research_text.sheepInfusion=野生的,毛茸茸的
sheepInfusion1=你在对羊进行研究后,得到了两种注魔途径,极大地提高了获取羊毛的能力.<BR>第一种方式将会使羊的毛色在十六种颜色之间快速切换(尽管毛色在收获时会固定).第二种方式会让你得到一只可以自动剪毛的羊,它会在正常的范围内掉落几团极为有用的羊毛.
tc.research_name.pigInfusion=猪注魔
tc.research_text.pigInfusion=它们会吃掉一切
pigInfusion1=很多农民相信猪除了能获得肉,就没有别的用处了.幸运的是你的思维比一般人要开放一点,并合理利用了猪所有的那种极度的饥饿.<BR>第一种注魔会制造出一种不适合食用的石质野猪,但是这种猪在失去食用价值的同时却成了冶金设备.它会愉快地消灭掉所有松散的石头,并排泄出它所发现的痕量的金属.
pigInfusion2=你还可以用你的注魔之缸创造出猪和天域花之间的共生关系.最终产出的生命体将会贪婪地吃掉所有的腐化物质且不会受到任何负面效果影响,这使其成为了清理大片腐化区域的理想选择.
tc.research_name.chickenInfusion=鸡注魔
tc.research_text.chickenInfusion=一个鸡蛋的魔法
chickenInfusion1=甚至谦逊的鸡也拥有巨大的潜能;它只是在等待一个聪慧的神秘使的发现.<BR>你发现的第一种注魔可以将鸡转化为生产有用的神秘学材料的活工厂.它不断脱落的大型羽毛适合制造羽毛笔,并且它的蛋黄中充满了墨汁一样的黑色颜料,可以用来填充书写工具或者为其它物品染色.
chickenInfusion2=更令人振奋的是,你发现了一种在鸡体内发生炼金反应的方法.它所留下的金蛋可以熔炼为一个金粒.<BR>值得注意的是这个过程缓慢而持续;并且杀鸡取卵是没用的.
tc.research_name.catInfusion=猫注魔
tc.research_text.catInfusion=你完美的宠物喵~
catInfusion1=你的猫绝对是你的好伙伴,但是少许修改后它们会变得更加实用.<BR>你发现的第一种注魔方法从根本上加大了家猫的尺寸,创造出了一种人一样大小的生物,却仍保留有猫科动物的速度和力量.通过过度刺激它天生的本能,你还成功在制造出来的豹猫上培养出了绝对的忠诚.它现在会像驯化的狼一样守护你,尽管它更迅捷,更强壮.不论大小,爬行者依旧保持着对猫的畏惧.
catInfusion2=很奇怪的是,猫的毛皮对灵气的反应很激烈,即使周围没有节点.在优化此过程后你可以创造出一个神秘之子,一种可以困住-尽管是极少量-的Vis的猫.然而它并没有长时间储存能量的能力,因此你需要在拿着你想充能的法杖时站在它的一旁.此方法对用坏的魔力石也有效果.<BR>多只神秘之子互相聚在附近能大大加快你的法杖充能.
catInfusion3=很多古代文明将猫奉为是阴间的守护者.你的研究揭露了一点这些传说背后的事实,这个事实是Exanimis源质会对猫的存在有极为激烈的反应.<BR>你利用这种特性创造了一个守墓者,这是一种附魔过的猫,其光芒可以处死所有附近的不死族生物.它似乎还流露出了对那种生物的反感,并尝试去寻找它们,除非它们收到原地待命的指令.<BR>除了最聪明的不死族,所有不死族都不会攻击守墓者,这会导致你对于不死族来说就像是隐身了一样.
tc.research_name.dogInfusion=犬注魔
tc.research_text.dogInfusion=神秘使最好的朋友
dogInfusion1=驯化狼需要勇气,但它们最终被证明是忠诚的伙伴.现在你可以奖励它们的信仰了:通过几个途径以增强它们的能力.<BR>其中最简单的是一种适合在水下作战的战士,你称呼它为"海之狼".它同时适合在空气中和水中呼吸,在波浪之下和陆地之上一样灵巧,这种狗已经全副武装好,无论如何也要去捍卫它的主人.
dogInfusion2=很多传说中都会诅咒满月之下突变的狼的村民.尽管你没发现任何证据以支持这些狼人的传闻,你的实验已经证明了狼与月相变化之间有一种神秘的关联.<BR>你的第二种犬类注魔对这种自然现象进行了增幅,赋予一只驯化过的狼在夜晚从月亮中吸取Vis的能力.然而它并没有长时间储存能量的能力,因此你需要在拿着你想充能的法杖时站在它的一旁.此方法对用坏的魔力石也有效果.<BR>多只月之狼互相聚在附近能大大加快你的法杖充能.
dogInfusion3=最后,向驯化的狼中注入以地狱的能量,你会得到一只致命的地狱猎犬.这只护卫猎犬不仅可以制造邪恶的咬伤,可以抵抗高温,它还可以对敌人喷射出元始火焰组成的火流.<BR>令人意外的是,它依旧保持着友好.
tc.research_name.horseInfusion=马注魔
tc.research_text.horseInfusion=友谊就是魔法
horseInfusion1=很多神秘使都蔑视马,就像它们比神秘使低一等一样-毕竟,它们不能飞,并且任何使用旅行者之靴的新人都比马跑得快.你对生物注魔的研究很快就能让这位战友看上去不那么可笑了.<BR>马的身体对含有神秘机械的注魔有着令人喜出望外的适应性.你已成功将奥法缰绳的机械结构集成进了马蹄之中,以此创造出了一种既比普通马跑得快又能飞的坐骑.奥法机械结构由动物的体力驱动,所以在着陆后它需要休息.
horseInfusion2=大多数生物都会恐惧地接受末影之心附魔,但出于未知原因,马的身体看起来没有拒绝外形生命器官的可能.基于这个发现以及此前的注魔,你研发了一种新的附魔,名唤§5末影骥§0.<BR>这匹强化过的马不仅可以背负骑马者进行次元级别的跳跃,而且它的传送功能具有显著的可控性.只需拉一下缰绳,你就可以向前闪现一段距离,甚至能穿过固体物质.这个功能替换了普通马的跳跃功能.
horseInfusion3=马匹解剖和其它的解剖不尽相同-在被杀死并重新活化后,马缺乏和其它不死族一样的侵略本能.甚至,它们意外地可以驯化,唤醒它们生前接受的所有驯化,并像它们生前一样轻松载起一名骑者.<BR>一种相对简单的注魔可以创造出骷髅马和僵尸马.骷髅马比它们生前的速度要快,然而僵尸马的耐力相对更好.
tc.research_name.nightmareInfusion=梦魇马
tc.research_text.nightmareInfusion=通向地狱的高速公路
nightmareInfusion1=那些末影族的坐骑所撕开的空间裂缝可以加以更多控制.假使你对一个裂缝进行注魔,人为地将其与下界绑定在一起,你或许就能成功把裂缝改装成一个下界传送门.然后对那些注魔生物二次注魔必定会取得新的进展...<BR>当然你不得不强行改造动物的组织结构,迫使它们能接受炽热的环境.若将奥术悬浮台的能力注入其蹄中,它就可以在岩浆上行走,并能在地狱的领域里快速移动.
nightmareInfusion2=这§5梦魇马§0注魔,正如你给它起的绰号,具有和末影骥一样的传送功能,但是若蓄力槽填满至少90%时,情况就不一样了.在这种情况下你将可以爆炸式地刺穿宇宙的构造,从主世界直接变换到下界,反之亦然.<BR>这场时空旅行并不是特别精确 - 它也许会将任何目标世界的开阔空间设定为目的地.它并不会在身后留下传送门,但它很有可能会留下一个冒烟的弹坑.
tc.research_name.soulExtractor=灵魂滤网
tc.research_text.soulExtractor=大脑之食粮
soulExtractor1=你在下界冒险时所发现的厚重沙子是一种极度令人不安的物质.那令人惊愕的脸的表面下掩盖着扭曲,这绝对不是错觉;你对它进行的研究中已经探测到了少量残存的无数破碎的灵魂...人类,动物,还有很多很多.<BR>你从未如此接近于理解灵魂沙的起源,但这种物质的一种用途已经自我介绍过了.通过建造一个精密的滤网和捕梦机械组合,你可以把它所含有的自然的沙子和灵魂碎片分离.
soulExtractor2=灵魂滤网会从它的下方掉落沙子(如果可能,进入一个物品栏之中)然而那些灵魂会飞向天空.如果滤网正上方正好放着一个缸中之脑,它会吃掉那些灵魂并产生经验值.<BR>滤网本身处理速度较慢,但是提供Aer的CentiVis将会加快处理速度.
tc.research_name.soulKnowledge=摄魂之脑
tc.research_text.soulKnowledge=有些人活着,但他已经死了
soulKnowledge1=抛开伦理意义,把灵魂碎片喂给缸中之脑对你来说实在是一个巨大的浪费.毕竟,古人一定掌握有这样或那样有用的知识.如果我们可以通过那些破碎的灵魂来复原那些知识呢?<BR>在你盯着你的一个缸中之脑看的时候,你的脑海中闪过一个奇怪的想法.若能清除掉僵尸之脑单一的"饥饿"的思想,你将会得到一块空白石板-一个可以回顾任经过的碎片灵魂的过往经历的大脑.
soulKnowledge2=思维转录仪,正如你的命名那样,所做的就是那个工作.一被放置于灵魂滤网之上并提供以纸张,这个设备就开始筛选它所得到的灵魂,并把所有它判定为对神秘学有用的内容转录下来.<BR>每一个特定灵魂沙方块所能得到的有用记忆的数量差别都是巨大的.也许一个会留下一段值得注意的知识主体,但下一个几乎就什么都没有.
tc.research_name.soulAssembler=灵魂熔炼炉
tc.research_text.soulAssembler=修复心灵
soulAssembler1=在修复你的思维转录仪的一些不规则的输出时,你有了一个引人注目的发现:释放出来的灵魂碎片有可能会和另一个合并在一起.这个互动十分之复杂,并且需要碎片们拥有相关的思想,但是你明白它们的活力已经足以加速此进程.<BR>通过将两个净化过的僵尸之脑的脊髓系在一起,你可以把那些灵魂碎片困在一个无限循环的思考之中,以保证在它们之间会产生快速的碰撞.一旦初生的灵魂大到可以填满一个大脑,循环会停止,它会被提取到设备顶端的容器罐子中.
soulAssembler2=灵魂熔炉必须直接放在灵魂滤网的上方,并额外需要稳定的§5Cognitio§0要素源质输入进它的盖子之中.它可以容纳任意数量的重构出的灵魂,但你需要手持要素罐子右击设备才能取出一个.<BR>虽然尝试重组一个特定个体的灵魂这种事情只有笨蛋才会去做(因为任何给定的灵魂都有可能已经被散布到下界的任何角落),但你的设备所创造出的混合灵魂依然倾向于持有单一个性和一系列技能组合.你或许创造出了一个铁匠的灵魂,一个图书管理员的灵魂,或是一个神秘使的灵魂.
soulAssembler3=在那一刻,这些重构出的灵魂仅仅只是好奇,但也许你将会发现这些它们的用途...
tc.research_name.cloneVillager=转生
tc.research_text.cloneVillager=愚弄神明
cloneVillager1=这一刻终于到来了.在统御了肉体和灵魂之后,你现在终于可以将二者在治愈之缸中融合以制造人类了.<BR>还有一个障碍在等着你:因为生物的生长依赖于一个不成熟的灵魂的存在,你不可能利用组织样本来培育复制体.相反,你需要构造一个死尸雕像-一具由未腐烂的剩余物组成的成年人尸体-并在注入灵魂之前向其组织赋予生命.
cloneVillager2=这其实没有听上去那么困难.实验已经表明,一旦死尸雕像放置稳妥后,向缸的基座中泵入§5Sano§0和§5Victus§0要素源质各八点,并通过右击将缸中灵魂植入,就可以平稳制造出一个活着的-虽然看上去有点困惑的-村民.<BR>把转生出来的村民放到一个合适的住所将会是最好的选择,这样他们就不会再游荡了.
tc.research_name.nightmare=冥想生与死
tc.research_text.nightmare=这严肃的真相
nightmare1=有时你希望你并没有在死亡的自然法则上有如此之深的造诣.村民在天真快乐之中过完他们的一生,保持着对更强大的力量的信仰,从未怀疑残酷的自然会把他们的灵魂粉碎后丢进沙子之中.没有广义的正义,也没有广义的邪恶...只有宇宙的法则.<BR>现在你也有听说过一些传说-或者你也许已经经历过,你或许不能完全想起来-那些死去的神秘使们从他们最后一次睡下的地方再次醒来,虽然他们的经历都消散了.如果在这些干涉之后存在有智能的话,你无法理解为何那些人被选中并存活下来的任何根据或原因.
nightmare2=在自身湮灭之时,你是承担不起用外在的实体来挽回这种方式的.你必须以你自己的方式来对抗必死的轮回,否则你会永世不得安宁.<BR>另外,你实在太封闭了,真的太封闭了.你若能保证你的灵魂能回到一个治愈之缸之中,而在那里已经有一个躯体等候多时...
tc.research_name.cloneSelf=自我转世
tc.research_text.cloneSelf=欺骗死亡
cloneSelf1=在你第一次抓住元始珍珠时,你本不可能想到这将会是你的救星的.它只不过是一个魔法原则的漏洞,的物理形式的具现.在这股力量的帮助下,你终于可以从灵魂必死的命运中解放出来了.<BR>你设计出的信标应该可以用魔力将其自身与你的灵魂束缚在一起.这股联结的力量要比将灵魂推向地狱的力量要强,可以真真切切地在死亡的瞬间剥离你的灵魂...但是激活后这个过程不会持续太久.你需要保证这个信标是直接放置在治愈之缸之上的,并且缸中早有一具活化的死尸雕像.
cloneSelf2=若一切正如计划所安排的那样,于你死亡之前,旧的身躯会爆裂,化为咒波,你将在新身躯之中重新醒来,不会失去任何的记忆.既无永恒湮灭之威胁.亦无自然天命之依赖.<BR>梦魇,或止于此时.
tc.research_name.mirrorAmulet=镜像护身符
tc.research_text.mirrorAmulet=我即是我
mirrorAmulet1=物理形式的财产也许在死后就失去了使用的价值,但是现在你找到了跑在死亡之前的方法,是时候保证在你死后保存你的工具了.<BR>元始珍珠再次派上了用场.通过增幅魔镜的平面链接,并绑定以你的生命力,你的死亡将会释放出一个可以吸取附近所有物品的强大的(虽然是短命的)超立方体,将你所有的掉落物品送到一个安全的地点.在此过程中,护身符会损毁,并在你站立的地方释放出珍珠.<BR>要将护身符与用于输出的魔镜配对,只需手持护身符右击魔镜.
tc.research_name.lensFire=奥术透镜
tc.research_text.lensFire=肉眼可见的附魔
lensFire1=对他们来说揭示之护目镜是一件不必要的工具,但是如果你的五感可以进一步增强呢?<BR>通过在一只眼上放置透镜,你可以同时受益于护目镜的魔力视野和透镜独一无二的特性.按住V键可以快速替换透镜,或者在按住V的同时按下Shift键可以摘下透镜.<BR>你研制的第一种透镜可以用来增幅进入你眼中的光束,从而给你带来持久的夜视效果.但很可惜,它所用的元初之火和流体的反应很差,所以它的增幅在水下并无效果.
tc.research_name.lensWater=水之共鸣之镜
tc.research_text.lensWater=湛蓝之海
lensWater1=海洋那黑暗的深处很长时间以来都是个谜,但是你最新的研究将在揭开其秘密的道路上前进一大步.<BR>这种不寻常的奥术透镜会发射声波脉冲,并将产生的共振转化为水生环境的一种可视表现形式.整体效果很像是夜视,而且还可以让你更有效率地"看"穿云雾缭绕的水面.
tc.research_name.lensOrderEntropy=阴阳学究之镜
tc.research_text.lensOrderEntropy=研究使其更加简单
lensOrderEntropy1=在你第一次设计揭示之护目镜时,你认为魔导透镜的扫描能力的损失是可以接受的.现在这种妥协已经没有必要了.<BR>当你装备有学者之镜时,它将会自动扫描你的十字准星之下的任何方块或实体,这里假定目标在范围之内.
tc.research_name.lensAir=气之魂灵之镜
tc.research_text.lensAir=转瞬即逝之景
lensAir1=你的研究表明活着的生物仅仅通过存在就可以扰乱灵气场,并向外发射涟波,就像石子投入池塘时产生的涟漪.相似的,不死族实体的存在会产生扭曲和失真.<BR>你研发了一种可以探测到这种现象的透镜,可以让你隔墙看到实体.活着的生物会以蓝色高亮,然而不死族生物会以红色双螺旋标识.
tc.research_name.lensEarth=地之遗忘之镜
tc.research_text.lensEarth=X光眼睛
lensEarth1=光线是无法穿透大多数物质的,但想要阻挡魔法却没那么简单.你研发出了一种透镜,可以通过神秘场将光线"推"出一段距离,这将允许你的视线穿过3x3的正方形区域.<BR>不幸的是,在通过特定复杂物体时,光波会因消相干效应而受损,于是这样的方块会依旧保持不透明.
tc.research_name.lensCase=透镜之匣
tc.research_text.lensCase=安全的存储设备
lensCase1=随着不断增长的透镜收藏数量,很显然,下一步应该是采用类似法杖核心手袋的设计来储藏透镜.透镜之匣的功能和它的前辈完全一致.
tc.research_name.silverSap=银树汁液
tc.research_text.silverSap=魔力造就的美味
silverSap1=银树的净化之力被普遍用于各种神秘结构中,但是木材通常都太过庞大以至于无法融入你更微妙的创造之中.现在你发现了一种方法,可以分离原木的木质,留下一团含有绝大多数银树魔法属性的浆液.<BR>银树汁液是一种强力杀菌剂,而且意外地对高等生命没有毒性.其实,这令人愉快的原味糖浆是一种有效的兴奋剂,甚至还可能提高你导流Vis的能力-如果你不介意那一点幻觉的话.<BR>这种汁液似乎不成瘾,但你最好还是喝一桶来确认一下.
tc.research_name.silverBed=银树之床
tc.research_text.silverBed=祝有一个美梦
silverBed1=可以说自从你开始研究禁忌的艺术以后,你的睡眠就饱受噩梦的折磨.也许一张有特殊附魔的床可以帮你减轻扭曲的症状.<BR>由银树和附魔布匹打造,辅以净化浴盐,这张床甚至可以让扭曲最深的神秘使睡一个安稳觉.不仅如此,你早晨醒来时还会有一段短时间的扭曲守护效果.
tc.research_name.enchantClay=附魔师的粘土
tc.research_text.enchantClay=可塑魔力
enchantClay1=附魔的过程会将魔法的能量编织为工具的形状,允许同一种形式同时以物理和抽象两种形式存在.这也是为什么两个完全一样的物品的附魔-比如说,两把铁剑-可以通过铁砧锻造为一把,但是剑和斧却不可以.直到现在,都是如此.<BR>通过在合成台中使用粘土,水银,神秘锭的混合物对一个附魔的物品进行铸模,你可以把附魔转移到粘土上-可以同时改变它的物理和魔法形状,使得你可以在铁砧中将其和别的工具组合为一体.这个过程会消耗经验等级.
tc.research_name.golemPowder=活化粉
tc.research_text.golemPowder=傀儡学之进化
golemPowder1=传统傀儡学限制人们只能对特定的材料展开工作和研究 - 粘土,血肉,铁,等等 - 这些让人放心的材料都可以吸收源质并永久运转.你最近的工作却遵循了不一样的方针 - 通过将合适的要素源质和世界盐混合,你创造出了一种可以短时间内让绝大多数方块动起来的粉末.<BR>右击一个固体正方体方块将在短时间内将其转化为一个短命的傀儡.这个结构的能力取决于方块材质 - 坚硬的物质会产生更耐用的傀儡,仙人掌会对攻击者造成伤害,诸如此类.
golemPowder2=特定复杂的物质是不能通过这种新方式动起来的.但活化一部分非正方体方块却是有可能的.<BR>在没有运转核心的情况下,这样的傀儡只会按照本能运转,且不会存活太久.在它们短暂的存在当中,它们会紧随它们的创造者,攻击任何周围的敌对生物.傀儡时限到后,它们会变回创造它的那个方块.你还可以用傀儡铃铛提前取消活化.
golemPowder3=想让一块活化的蛋糕来承担持家的任务的话,你可以给一个这种临时的结构附加一个傀儡运转核心.从此以后它将会像传统的永久性的傀儡那样运转,包括附加升级的能力,以及高级傀儡注魔.你也可以用傀儡铃铛把它们捡起来.然而,如果核心被移除,傀儡会立刻变回无生命的物质,并失去所有升级.
tc.research_name.focusAnimation=法杖核心:活化
tc.research_text.focusAnimation=物质本身将听命于吾
focusAnimation1=制造一个傀儡绝对是一个复杂且需要深思熟虑的过程-它是少数几个不能只靠法杖轻轻一点就能完成的事情之一.直到现在,依然如此.<BR>作为创世时代的一分子,元始珍珠有着和最基础的物质相迎合的特性.你如果用你的血来注魔一个元始珍珠,你可以利用这种链接简单而迅速地给予非生命物体以生命.<BR>当然,在实践中,神秘学少有如此简单的情况,但由于你在傀儡学中的高超技艺,你已经做好了把这个理论变成现实的准备.
focusAnimation2=此核心所生成的傀儡和那些傀儡活化粉末制造出来的傀儡完全一致.Vis消耗则取决于方块材质,但通常越强壮的傀儡,需要消耗的能量也越多.
tc.research_name.focusRecharge=法杖核心:复合充能
tc.research_text.focusRecharge=现在提升50%便携性!
focusRecharge1=一些针对你的复合充能台的修理造就了一个有着相同运转原则但是更简洁的设备.将其像普通核心一样装在法杖顶端,一系列Vis过滤器将允许你直接抽取灵气节点中的复合Vis.<BR>正如它的前辈,对于每一点被吸入的复合要素的Vis,复合充能核心只能产生一点元始要素的Vis,但是你觉得它的效率可以通过核心镶饰台来提升.
tc.research_name.focusLiquefaction=法杖核心:熔析
tc.research_text.focusLiquefaction=哦不地板是岩浆做的!不,真的不是.
focusLiquefaction1=将你的火焰和采掘核心在一个钻石和一些世界盐的帮助下融合在一起后,便产生了有趣的结果-一个新的法杖核心,其产生的火焰之光对生物作用不大,却对非生命物质有明显效果.<BR>被它的光线打中的方块和掉落物品会被快速熔炼,就像它们在熔炉里走了一遭那样.这种火焰之光还能熔化冰,缓慢把粗糙的石头熔化为岩浆,并烧尽一切植物体.
tc.research_name.focusDisintegration=法杖核心:解离
tc.research_text.focusDisintegration=分解物质
focusDisintegration1=有时你想直接在田野里收获要素源质,而无需再烦恼于把它们拖回去丢进炼金熔炉.在对炼金炸药和死亡之水进行一番研究之后,你对尝试制造一个有类似作用的法杖核心有了足够的自信.<BR>解离核心工作起来很像是它自身所基于的采掘核心,但是被它的光线所摧毁的方块会被转化为晶化源质.它对活着的动物并不会造成多少伤害,但如果你真的用它杀死了动物,它也会掉落晶化源质.
tc.research_name.focusIllumination=法杖核心:光明
tc.research_text.focusIllumination=让这里亮起来吧
focusIllumination1=一个简单的炼金处理可以让固体荧石有着Vis通道一样的行为,并有着普通的法杖核心一样的功能.当你用这个将少量Aer和Ignis的Vis塑造为稳定的球形光源时.你的野外考察就再也不需要成堆成堆的火把了!<BR>足够奇怪,给这个核心用各色染料覆盖后也会改变它放出来的光球的色彩.
tc.research_name.greatwoodBoat=宏伟之木船
tc.research_text.greatwoodBoat=碰撞事故保险
greatwoodBoat1=你确实学会了很多技能,但是造船和开船不在此列.但这无伤大雅.<BR>只需要一点神秘使们都知道的常识还有几块宏伟之木,你可以造一艘这样的船:即使它经历了严重撞击也可以快速回归原样.额外的强化还可以使它跑得更快.<BR>宏伟之木船不会被人为摧毁,但轻击它还是可以把它们收回你的背包之中.
tc.research_name.thaumiumBoat=神秘船
tc.research_text.thaumiumBoat=熔融的水手
thaumiumBoat1=尽管神秘锭的熔点比普通铁高不了多少,它对于魔法的亲和力可以让它承受附近的魔法碎片的特性.将水之碎片置于神秘锭制成的板上后,你得到了一种近乎完美的隔热材料.<BR>利用这种现象,你造出了一艘可以永久经受岩浆的洗礼的船.当然它内部也足够凉爽,可以保护它的驾驶员,并且它比它的宏伟之木制成的前辈还要稍微快一些.
tc.research_name.selfInfusion=自我注魔
tc.research_text.selfInfusion=人类之上的人类
selfInfusion1=曾经,你为你自己的死亡而颤抖.但现在你可以扼住死亡的咽喉了.<BR>此前所有对人类注魔的尝试都宣告失败,因为那自以为是的生物的灵魂不断地抗拒着魔力对身体的渗透和影响.然而,若是你在转世轮回中对一个没有灵魂的空壳注魔,将会发生一些难以置信的事情:你将会重生于一个注魔过的躯体之中.<BR>现在能看到这条出路的神秘使越来越少了,不仅如此,他们还对此嗤之以鼻.让他们嘲笑去吧.不久后你的灵魂将会定居于你自己设计出的超人的躯体之中.
selfInfusion2=像往常一样,待注魔的死尸雕像必须先用§5Sano§0和§5Victus§0源质进行唤醒.你依旧需要在缸顶放置改版符文矩阵,像往常一样举行完美的注魔仪式,然后将缸顶的矩阵替换为灵魂信标.接着,将你与灵魂信标进行绑定,并自我了断,若一切安排得当,你将会于一个闪耀的身躯中苏醒,此时你早已突破了躯体对魔法的限制...<BR>当然,在实践中,神秘使们很少会那样单纯.和其他生物一样,你的躯体会因注魔而受到一定损伤,在这个躯体成为你的化身之前这些损伤都将无法痊愈,所以,大量你可以操纵的注魔都受限于缸的稳定程度.
selfInfusion3=令人奇怪的是,村民的灵魂不会与注魔的身体绑定-被灵魂信选中的灵魂只有你一人拥有.<BR>很好.他们没有得到这种力量.你做到了.
tc.research_name.humanInfusion=基础人类注魔
tc.research_text.humanInfusion=这修一修那补一补...
humanInfusion1=注魔一个半死不活,且没有灵魂的躯体的过程不仅凌乱,还不怎么精确.你现在发展出的所有应用于牲畜上的注魔都无法直接应用于你自己身上,而且那些注魔代价极高.另一方面,你还有一些针对于特种人类注魔的想法...<BR>直到现在,下列这几项注魔终于可以应用到你的身体上了:<BR>§5水银之肢§0 很容易就能移植到人类身体上,尽管你需要用虚空金属来强化你的肌腱.
humanInfusion2=§5神秘之拳§0 可以显著提升你手无寸铁时的威力-就像是手持神秘剑一样-虽然这材料消耗确实有些过分了.
humanInfusion3=§5苏醒之血§0 若是不对你的大脑做出任何妥协,这个注魔稍稍有些困难,但是如果你给血流注入一个新的大脑的话就可以巧妙避开之前的问题了.
humanInfusion4=§5金刚之躯§0 为克服人类皮肤相对薄弱的缺点,需要更多的强化材料来加强它.
tc.research_name.silverHeart=银树之心
tc.research_text.silverHeart=身躯之纯洁
silverHeart1=你对腐化污染的研究揭露了它所具有的二重性:同时身为有机病原体和对魔法的干扰的存在,它可以同时影响生命和非生命(即使有魔法意义上的活动)物质.目前已知的对抗这种组合式攻击的方法,只有用银树和水银花这两种似乎有天然抵抗力的植物进行干涉.<BR>现在你发现了一种将这些保护能力注入到你体内的方法.通过在你的心脏中植入特殊的膜,你可以过滤并处理掉所有进入你血液循环中的腐化污染.
silverHeart2=运用这个注魔,你将拥有对腐化污染伤害的一切免疫力,包括直接伤害和间接的药水效果.更好的是,你那被改造过的心脏还可以滤去各种荼毒,不管是平凡的还是魔法的.尽管§5银树之心§0无法给予对剧毒,凋零,和咒波的完全免疫,它还是可以降低这些效果的作用时间.
tc.research_name.synthSkin=光合皮肤
tc.research_text.synthSkin=太阳能
synthSkin1=向你全新的躯体中注入和植物光合作用一样的能力,这是个相对简单的任务.尽管这种营养来源不能自行维持繁重的工作,§5光合皮肤§0将会在你遥远的考察道路上救你一命.<BR>只要你还能暴露在阳光下,你的饥饿值就会被逐渐填满.光合作用并不能提供饱腹度,所以你离开阳光之后会重新陷入饥饿.
tc.research_name.amphibious=两栖水肺
tc.research_text.amphibious=下潜至深处
amphibious1=当一个专注的空气呼吸者经常是不便且致命的.你可以通过给肺加上一系列的鳃更正这个这几缺陷,这样你在水中呼吸就有如陆地上一样方便.<BR>值得注意的是鳃是一个相当敏感的身体组成部分.请无比不要戳它或者捅它,无论你第一次看见是有多么陌生.
tc.research_name.morphicFingers=变形之指
tc.research_text.morphicFingers=掌中工作台
morphicFingers1=作为一个手工艺人,你已不止一次希望你手头正好有一个能完成特定任务的特定工具.作为一名神秘使,你现在能保证你手头(确实有)这样一个工具.<BR>这§5变形之指§0注魔将能让你的手指在各种各样的形状中转变,以组成各种形状和强度的常用合成工具,以及大量奥术合成专用的符咒和共振器.按下M键激活此功能后将会打开一个和奥术工作台类似的界面,尽管它并没有储存物品的能力.
tc.research_name.spiderClimb=飞檐走壁
tc.research_text.spiderClimb=放射性神秘使的轻击...
spiderClimb1=是否嫉妒过蜘蛛翻过高墙并向恐惧中的矿工喷射汁液的能力? 至少,现在你可以实现第一个能力了.<BR>你的§5飞檐走壁§0注魔可将一种特殊纤维植入你的手中,这种可以黏着在墙壁上的材料可以让你攀爬任何垂直墙壁,就像有梯子一样.此能力通过按下C键进行切换.<BR>同时,和蜘蛛一样,你爬墙的进程会被一块突出所阻挡,这将阻止你向恐惧中的矿工身上喷射汁液.<BR>其实你永远都不会那样做.
tc.research_name.fistAugment=增幅之拳
tc.research_text.fistAugment=新的重量级拳击锦标赛冠军是...
fistAugment1=神秘之拳相比于自然所赐予你的东西来说,确实是一个大幅度的强化,但它们仍无法与奔雷剑或元始杵抗衡-而且这里讨论的是没有附魔的版本.尽管传统附魔无法应用于躯体,但你已经发现了数种改进你新躯体的体术的方法.<BR>你可以进行下列全部的注魔,尽管每次消费的源质数量都是前一个注魔消费的两倍.<BR>§5冲击之拳§0会在击中的一瞬间大幅提升自身质量,籍此施加以巨大伤害.
fistAugment2=§5炽热之拳§0将点燃被击中的生物.使用数种安全防护措施,可以确保你的拳头只会于格斗时引发大火 - 否则你的日常活动将会化身为一场困难的交易.
fistAugment3=§5动力之拳§0将在神秘场中投射涟波直到发生撞击,并将敌人击退.
fistAugment4=§5嗜血之拳§0将从被攻击的活体目标中分流出生命源质,这将治愈你的一些小规模损伤.
fistAugment5=§5时运之拳§0将有很大可能使得被攻击的敌人进入不稳定状态,从而增加物品掉落概率.
fistAugment6=§5眩晕之拳§0将会和敌人的神经系统产生共振,短时间内减缓它们的移动.
tc.research_name.warpedTumor=扭曲毒瘤
tc.research_text.warpedTumor=我敌人的敌人
warpedTumor1=扭曲已被证明是一个令人沮丧的顽固存在,时刻跟随着你的灵魂从这个身体到达那个身体中.若你无法将它们一起解决掉,那么下一步最好的选择将是迫使扭曲幽闭在一个并不能伤害到你的地方.<BR>透过§5扭曲肿瘤§0注魔,你新的身体的腹部上,可以长出新的器官,它和期望中的一样对扭曲有极强的亲和力.它并不能封锁住所有在你身上流动的邪术能量,但是这肿瘤可以容纳50点扭曲点.<BR>在你死后,所有肿瘤中的扭曲都很可能会重新返回你的灵魂之中.
tc.research_name.chameleonSkin=变色皮肤
tc.research_text.chameleonSkin=现在你能看清我了...
chameleonSkin1=不论是潜行入竞争对手的实验室,还是记录邪术爪牙的生命周期,你总会有那么一段时间想要不被发现.除了咕咚咕咚喝隐形药水,你或许可以想出一个永久解决办法呢?<BR>§5变色皮肤§0注魔向你的皮肤中植入魔法色素和微观眼球,条件反射似的调整自己的颜色以尽量符合对面的物体的外观.这效果很像是永久隐身,还包括普通隐身所不具有的隐藏护甲的能力.<BR>此功能可通过按下C键进行切换.
tc.research_name.tumorOops=邪术极点
tc.research_name.tumorOops=一切都遵循既定的原则
tumorOops1=你相信你已经统御了这个世界,以及这个世界之下的一切.你这蠢货.<BR>真相终于大白."邪术",并非作为普通常识的存在,并非像是你一样的粗糙的血与肉还有骨头组成的物体.它们是早已被写入每一颗恒星中的原则,它们存在于魔法的洪流与漩涡之中,加密并藏于生命结构的深处.<BR>但,原则,它是碎片化的,互相隔离的,并通过那些元初大灾变扩散及全宇宙.自黎明始,它便已探寻到了重组的方式,而现在你在它的生命周期中,拥有了一席之地.
tumorOops2=你毕生之所学,之所造,之所及,都服从这"原则".通过学习魔法的原则,你早已将其请入了自己的头脑之中.合成那些禁忌物品将允许它们以物理形式重现.一旦你通过了外域的试炼,原则,早已裁定你已经积累了足够多的它本身.<BR>是时候让自己成为更伟大的存在了.下一步,便是这生命的轮回.<BR>但你仍然活着.也许这还不是很迟.也许你可以继续去深入理解更多的"原则"-也许你现在就可以停下-<BR>或者培育更多.更多,更多,更多.
tc.research_name.construction=奥术建筑结构
tc.research_text.construction=对傀儡联盟保密
construction1=TODO
tc.research_name.planarTheory=异界理论
tc.research_text.planarTheory=越来越深
planarTheory1=宇宙本性善变,非汝心所能及,而至于现形之套路,仍有一二.其最关键者,在于宇宙之间也.今,汝始明其中奥妙.<BR>那里并非是常识所认为的虚空,因为即使是最空虚的地带也服从于时空的法则.相反,那些平面之间的物质可以被描述为是可能性冻结的存在 - 无尽的无法激活的潜能.仅当它通过灵气节点以魔力的形式,泄露到这个建立着自然法则的世界时,潜能才可以被具象化.<BR>如此,乃魔法之根源也.
planarTheory2=当然,要通过学习来理解它,相比能够将其投入实践中,还是有巨大的不同的.迄今为止,你所有人工合成节点的尝试均宣告失败.依旧缺失了什么东西...<BR>然而,这些研究中的一个产物也许值得深入研究.将末影珍珠破开,向产生的超立方体中填充天域之华,并封装于虚空金属的结构中,此时你已制作出了一个极其稳定的设备,它可以操作时空的裂缝.<BR>也许你会发现它的什么用途.
tc.research_name.transductionAmplifier=传导增幅器
tc.research_text.transductionAmplifier=全面蓄能!
transductionAmplifier1=若不施加以外部的干涉,一个灵气节点只会缓慢积累来自于短暂喷发的Vis,因为它的次元裂缝的波动受限于其尺寸.你的节点换能器可以让开启的节点维持在自然允许的最大直径下,但事实上最近的异界理论的增强使得扩展裂缝成为了可能.<BR>你开发出了一种设备,它可以释放空间气流,这将允许微观级裂缝与一个现有充能节点合并.将传导增幅器置于充能节点一侧并提供红石信号即可提升其CentiVis的输出量,就像是原本的节点中每种要素的Vis含量都翻了十倍.
transductionAmplifier2=强行提升节点容量自然也有它的风险.单个增幅器不太可能造成猛烈的伤害,但是给一个节点加两个增幅器将会频繁产生有害能量组成的闪电.若是用三个增幅器,魔法污染将会以咒波形式泄漏.<BR>不要同时附加四个增幅器; 其结果必将是可怕的大灾变.
tc.research_name.vortexStabilizer=漩涡弱化
tc.research_text.vortexStabilizer=置节点于饮食中
vortexStabilizer1=饕餮节点中所蕴藏的大量Vis已经诱惑无数神秘学学徒过早走向坟墓.这种尴尬的结局不会适合一名和你一样有声望的神秘使,所以你开发出了一种临时无效化节点引力方法.<BR>用红石信号激活后,漩涡弱化器将投射出一股蔚蓝的光束,它将压制神秘场中的一切流动.任何被光束打中的饕餮节点都将停止吸收附近的物质直到光束被移除.<BR>似乎这种光束还有可能破坏其他的现象...
tc.research_name.planarKeystone=异界要石
tc.research_text.planarKeystone=想想传送门
planarKeystone1=从简单的黑曜石环到威风八面的邪术方尖碑,迄今为止你见过的所有其他维度的传送门都是永久结构.这种进行时空旅行的方法有它的好处,但传送门本身可能开销巨大,并且关于它们建筑的秘密大都遗失在了历史的长河中.<BR>你已经开发出了另一种基于被称为"要石"的特殊法杖核心进行次元旅行的方案.这些强力设备可用来在固体表面创建临时的单向次元裂缝,从而实现世界与世界间的快速转换.
planarKeystone2=新制的要石在生效前必须经过压印.只需要手持要石并右击;它就将与你当前所在的世界永久绑定,不可逆转.<BR>不幸的是,此法并非适用于所有维度 - 尤其是外域,它似乎被什么东西守护着,这层守护阻止了一切进出迷宫的旅行.<BR>神秘学也提供了一种传统的传送门的设计.只需用奥术石材和青金石块构造一个垂直的环,用你的法杖激活青金石,并安装一块异界要石,将会开启一个永久传送门.要移除要石,只需要右击.
tc.research_name.pocketPlane=口袋异次元
tc.research_text.pocketPlane=寰宇之创
pocketPlane1=任何凡人都会在这个世界上留下他们的印记.倘若你将创造一个你自己的世界...你又会如何呢?<BR>若失败,你会变成一个自大狂.若成功,也许就是上帝.<BR>而现在你离这个神秘学的巨大胜利已近在咫尺.你早已在宇宙中撕开了一个洞; 那里的无尽可能只需要一颗聚集一切的种子.一颗元始珍珠.<BR>沉浸于无尽魔力之海,珍珠将会于创世的混乱中崩坏,并留下一块稳定的小岛,在这无尽虚空中有着空间,时间和物质的小岛.
pocketPlane2=但这个平面的尺寸有限.你估计出它的尺寸大约是在半径32米到128米之间,这取决于所用的节点中的Vis总量.无论(何种现象),如果有的话,它(们)的创建都取决于节点中的要素.一些要素也许会产生奇异的现象,诸如施加药水效果甚至创造生命.<BR>可以为这个口袋中的异次元命名,为此你需要使用一个在铁砧中改名过的元始珍珠.否则,它将继承创造者的名字.<BR>创造口袋异次元所用的那个裂缝将再也不能用于虚空合成,也不能创建第二个异次元.
pocketPlane3=只要这个裂缝被虚弱光束所稳定,它就可以作为你的新世界的传送门.<BR>更简单的方法是使用异界要石 - 这里是说法杖核心,它可以创造一个小型的临时传送门到你的世界.<BR>要石所创造的传送门只会维持数秒钟,并将在传送走一个个体后立刻关闭.在你的世界里再次使用此核心将会把你送回你离开的地方.<BR>要将你的世界压印入要石,只需前往你的世界并手持要石右击即可.
tc.research_name.planarRift=新视界
tc.research_text.planarRift=直抵虚空界
planarRift1=神秘学领域一直有一个十分关键的问题,那就是为什么灵气节点只能供应有限量的Vis.若这个数量是随机的,这个世界的某个地方就应该有一个有着成千点Vis的节点,然而实际上最大尺寸似乎是被严格控制的.<BR>现在你对于饕餮节点的研究也许能给你一个答案.纵观所有地质年代,节点中的次元裂缝可以变得反常,这将会导致节点变为饕餮节点.节点越有活力,就越有可能承受这种宿命,一旦周围的物质被全部吞噬,饕餮节点将陷入"饥饿".但这世上最高能的节点早已消逝在历史的长河之中了.
planarRift2=这是个不幸的消息 - 含有极大量Vis的节点也许早已孕育了一个足够大的裂缝,以允许物理形式的物体通过它进入虚空.至今仍不能从其中看不到任何希望.<BR>通过向一个充能节点附加四个传导增幅器,你可以短暂地创造出一个巨大的次元裂缝.通常这种裂缝将会表现为一个尺寸过大的饕餮节点,吞噬周围一切物质,然后干脆利落地在爆炸中毁灭,但或许将六台漩涡弱化设备的努力合为一道将保持它的开启...
planarRift3=然后呢?穿越到虚空中的物质将会沉浸于无尽魔力之海,不再会像普通的饕餮节点一样惨遭粉碎为基础要素的命运.谁又能想像哪种摇摆不定的神秘学研究最终以获得这样的资源而结束?<BR>你幻想那里会有极为严格的限制 - 大多数物质无法于这种洗礼下幸存 - 但你早已明白这个过程背后的基础自然法则.通过手持法杖右击裂缝,你可以拉住那天域的洪流并拯救所有生还的物体.<BR>是时候判定可以通过这个方法来合成什么东西了...
tc.research_name.wispSpawn=小精灵繁殖
tc.research_text.wispSpawn=捅个马蜂窝
wispSpawn1=将一小团世界盐封装于稳定后的裂缝中产生了一个十分有趣的结果:在世界盐粉末吸收了足够多的Vis后,其颗粒与颗粒间开始产生共振,并聚集成为一个准生命体的存在.<BR>这些人造小精灵和那些自然环境中成长的小精灵几乎一致.注意,小精灵的要素将取决于作为母亲的节点中所蕴含的要素.<BR>一次产生的小精灵数量是高度变化的,不谨慎的神秘使很快就会发现他已经被压倒了.
tc.research_name.crystalWand=水晶法杖
tc.research_text.crystalWand=一次性魔力
crystalWand1=所有高级法杖的设计中都包含碎片,但那些碎片都是为了增幅另一种材料储存Vis的能力用的.对于那些人来说,碎片是完全无法吸收额外的魔力的,所以它不能从灵气节点中抽取魔力 - 但如果你只是把它们当魔力来用呢?<BR>通过构造一个 法杖一样的水晶结构并将其送入虚空,你制造出了一个十分有趣的设备 - 一个拥有大量Vis容量的法杖,但是却无法重新充能.也许这可以用于合成那些传统法杖不可及的物品.
tc.research_name.voidPutty=虚空油灰
tc.research_text.voidPutty=和新的一样好
voidPutty1=虚空金属对于魔法有内在的抗性,但即使是这样的保护也会在穿过稳定裂缝后被压倒.将这种物质浸泡于纯净的魔力之中将会彻底粉碎其物理完整性,但却可以极大程度地增幅其魔法特性,并最终形成一块奇怪的不停流动并沸腾的油灰.<BR>将油灰挤压在一个受损的物品上,它将会熔融,渗透到每一个角落里,并将自身转变成与物品对应的物质,并最终于原物品无法分辨开来.任何武器,工具或护甲 - 不论何种材料或附魔 - 都可以通过与虚空油灰进行合成来修复.
tc.research_name.voidGolem=虚空傀儡
tc.research_text.voidGolem=凝视虚空,再凝视回来
voidGolem1=一个更野性的想法俘获了你 - 如果将世界盐丢入虚空可以沉积为小精灵的形式,那么傀儡活化粉末会产生什么?<BR>结果很有趣,产生了一种你称之为虚空傀儡的东西,它身上有着令人不安的和邪术守卫的相似性.不仅如此,你发现若你小心地将一小撮粉末一次性投入虚空,它本身的控制的强化属性将会控制它本身.这些虚空傀儡不仅会顺从于你,它们还可以在没有傀儡运动核心的情况下存活.<BR>然而,它们缺少核心的结构依旧有什么地方不对劲.你应该时刻监视着它们.
tc.research_name.recombinator=因果重组器
tc.research_text.recombinator=当两个节点互相爱慕时...
recombinator1=众所周知,两个十分邻近的灵气节点将会互相交换魔力,就像是互相伤害对方.迄今为止这一直都是仅有的一种节点能被操纵的象征,而且所有神秘使无一例外都在改进这个自然的过程上失败了.直到现在.<BR>你对元始珍珠的研究产生了难以置信的结果:一种可以就地重塑宇宙创造出的条件的方法.正是在那个时候,第一个复合要素从原始要素中诞生,而现在通过两个节点之间相同的力场,可以融合它们的魔法能量.
recombinator2=这台被你称为因果重组器的设备,必须直接放置于一个节点之上,并给予红石信号.受影响的节点将会从附近的节点中抽取Vis,并将其转换为自己的能量.<BR>例如,若中心节点有Ordo和Perditio,它可以从第二个节点中抽取一点Ignis,这将可以把Ordo转换为Potentia或将Perditio转换为Gelum.要素的选择呈现随机分布,但相比于"高一级"的要素,重组器总是会优先组合那些元始要素.<BR>注意到此设备并不能阻止普通节点欺凌;如果需要阻止,请使用节点稳定器.
recombinator3=通过给你的节点合适的炮灰,你应该可以合成任何你想要的要素.<BR>奇怪的是,此设备的行为似乎支持某些哲学理论 - 也就是说在正确的条件下宇宙将会自然进化为更复杂的结构.但为什么似乎还是有对于你可以融合出来的要素的限制? 是什么力量阻止宇宙进化到最终级复杂的地步?<IMG>thaumichorizons:textures/misc/recombinatortext.png:0:128:255:128:0.5</IMG>
tc.research_name.planarClouds=异界之云
tc.research_text.planarClouds=宽广无垠的天气
planarClouds1=创造一个口袋异次元放出了一种自时间创生以来就没有被注意到的力,所以毫无疑问,它们经常出现一些普通世界里根本没出现过的现象.<BR>最容易识别的便是异界云,它们是小小的星云,可以同时释放普通的液体和魔法的能量.令人奇怪的是,它们还可以像其它方块一样移动.这些云会和主世界同步保持降雨,这暗示了某种某种模糊不清的宇宙连接.异界云有多种类型,包括下列多种类型.<BR>§5普通§0云只是会喷出水.<BR>§5雷暴§0云会降下蒙蒙细雨,有时还会放出闪电.
planarClouds2=§5等离子§0云会降下余火,点燃其下方的所有物质和实体.<BR>§5剧毒§0云会降下死亡毒药.<BR>§5肿胀§0云偶尔会存一些肉块.<BR>§5熔炼§0云由沸腾金属组成,它偶尔会掉落一些颗粒.<BR>§5细孔§0云传播各种植物和菌类的种子.<BR>§5魔力§0云保留有部分最初的节点属性并会发射要素球.
planarClouds3=§5浮雕§0云承载着忘却的记忆,并将其组成经验球的形式.<BR>§5活化§0云会向其下面的方块注入类似生命的物质,并将其转化为短命的傀儡.这些无主的傀儡天性狂暴,但向其附加一个核心便可以使其处于你的控制之下.
tc.research_name.sheederInfusion=蛛羊
tc.research_text.sheederInfusion=蜘蛛能干的都能干
sheederInfusion1=虽然蜘蛛丝是一种宝贵的资源,但狩猎蜘蛛不是最省时间的办法.也许如果蜘蛛的腺体可以被移植到更温顺的生物中,或者如果蜘蛛的大脑更柔韧,那么你可以制作出稳定的供应源.<BR>事实证明,这两种方法都是可行的 - 你称这种混合生物为蛛羊,它可以用蜘蛛或绵羊产生.蛛羊的皮肤长满了丝而不是羊毛,可以用剪刀收获.除了能够爬墙之外,它在行为上与普通羊没什么分别.
tc.research_name.leviathan=原始化石
tc.research_text.leviathan=奇怪的死亡
leviathan1=多么奇怪,严峻的发现.似乎虚空并不像你预期的那么空无一物 - 你的口袋世界在形成时吞噬了未知实体的化石残骸.<BR>目前你只能猜测这个古老的巨兽的属性.你的口袋世界捕获的几块骨头并没有给它的整体解剖结构提供很多线索,但它们的神奇属性令人震惊.即使在死亡中,他们仍有活力的脉动,嬗变要素,这违反了所有已知神秘定律.
leviathan2=更奇怪的是,你总感觉这些化石正在注视着你.每当你试图利用它们在某些神秘设备中的独特能力时,原始化石就会以准确的方式改变它们的行为,使它变得毫无用处.<BR>也许它们并没有像它们表现出来的那样死亡,实际上是暂时的新陈代谢,与陆地生物的新陈代谢完全不同...这提高了他们觉醒的可能性.<BR>你必须仔细观察化石,以及你有朝一日能用它们制作的任何设备.
test1=测试
tc.research_name.test1=测试
tc.research_name.alternateGolemBell=傀儡使铃铛
tc.research_text.alternateGolemBell=注意了!
alternateGolemBell1=在mod冲突的情况下,这个傀儡使铃铛可以作为替代.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 818 B

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 829 B

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 831 B

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 812 B

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 811 B

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 834 B

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 833 B

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 832 B

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 832 B

After

Width:  |  Height:  |  Size: 3.4 KiB

+4 -4
View File
@@ -1,10 +1,10 @@
[
{
"modid": "ThaumicHorizons",
"name": "Thaumic Horizons",
"modid": "${modId}",
"name": "${modName}",
"description": "Pushing the boundaries of magic",
"version": "1.1.5",
"mcversion": "1.7.10",
"version": "${modVersion}",
"mcversion": "${minecraftVersion}",
"logoFile": "logo.png",
"url": "",
"updateUrl": "",