mirror of
https://github.com/GTNewHorizons/ThaumicHorizons.git
synced 2026-10-26 14:33:47 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
48d1b9f0c6 | ||
|
|
e89a4a53ba | ||
|
|
5d777104d5 | ||
|
|
2cf251b539 | ||
|
|
84d7860d3c | ||
|
|
9838790974 | ||
|
|
6161f3a1c4 | ||
|
|
1173060c64 | ||
|
|
b48ae835bd | ||
|
|
7f874b0646 | ||
|
|
32efd39fee | ||
|
|
0ecb1d2c51 | ||
|
|
d16d00d911 | ||
|
|
92a0865a4d | ||
|
|
e609874d2d | ||
|
|
4bf23df25b | ||
|
|
f0adb5d09a | ||
|
|
35182626f7 | ||
|
|
8c9d1ece5d | ||
|
|
206f8a33f5 | ||
|
|
5d7edb5d5c | ||
|
|
0f8a7f0be3 | ||
|
|
41855e0c7a | ||
|
|
a62e675bc5 | ||
|
|
f306f4b23f | ||
|
|
275789f75e | ||
|
|
c403d90a1f | ||
|
|
203f19f1d6 | ||
|
|
62db3abe63 | ||
|
|
ea9a5fa857 | ||
|
|
8d122d3ba8 | ||
|
|
1600812b71 | ||
|
|
c0717e993d | ||
|
|
0806af3ad0 | ||
|
|
df54e81c14 | ||
|
|
d981421721 | ||
|
|
3f54a201c7 |
No files matched your search
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,61 @@
|
||||
# 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: Set repository owner and name
|
||||
run: |
|
||||
echo "REPOSITORY_OWNER=${GITHUB_REPOSITORY%/*}" >> $GITHUB_ENV
|
||||
echo "REPOSITORY_NAME=${GITHUB_REPOSITORY#*/}" >> $GITHUB_ENV
|
||||
|
||||
- name: Publish package
|
||||
run: ./gradlew publish
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
ARTIFACT_GROUP_ID: com.github.${{ env.REPOSITORY_OWNER }}
|
||||
ARTIFACT_ID: "${{ env.REPOSITORY_NAME }}"
|
||||
ARTIFACT_VERSION: "${{ env.RELEASE_VERSION }}"
|
||||
REPOSITORY_NAME: "${{ env.REPOSITORY_NAME }}"
|
||||
REPOSITORY_OWNER: "${{ env.REPOSITORY_OWNER }}"
|
||||
|
||||
+30
-7
@@ -1,8 +1,31 @@
|
||||
.gradle/
|
||||
eclipse/
|
||||
out/
|
||||
.idea/
|
||||
*.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
|
||||
*.bat
|
||||
*.ipr
|
||||
*.iws
|
||||
src/main/resources/mixins.*.json
|
||||
*.bat
|
||||
*.DS_Store
|
||||
!gradlew.bat
|
||||
+540
-33
@@ -1,56 +1,360 @@
|
||||
//version: 1641429628
|
||||
/*
|
||||
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/SinTh0r4s/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.5'
|
||||
}
|
||||
}
|
||||
|
||||
plugins {
|
||||
id 'idea'
|
||||
id 'scala'
|
||||
id("org.ajoberstar.grgit") version("3.1.1")
|
||||
id("com.github.johnrengelman.shadow") version("4.0.4")
|
||||
id("com.palantir.git-version") version("0.12.3")
|
||||
id("maven-publish")
|
||||
}
|
||||
|
||||
apply plugin: 'java'
|
||||
apply plugin: 'idea'
|
||||
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.2.0.2"
|
||||
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")
|
||||
|
||||
|
||||
String javaSourceDir = "src/main/java/"
|
||||
String scalaSourceDir = "src/main/scala/"
|
||||
|
||||
String targetPackageJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/")
|
||||
String targetPackageScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/")
|
||||
if((getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists()) == false) {
|
||||
throw new GradleException("Could not resolve \"modGroup\"! Could not find " + targetPackageJava + " or " + targetPackageScala)
|
||||
}
|
||||
|
||||
if(apiPackage) {
|
||||
targetPackageJava = javaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/")
|
||||
targetPackageScala = scalaSourceDir + modGroup.toString().replaceAll("\\.", "/") + "/" + apiPackage.toString().replaceAll("\\.", "/")
|
||||
if((getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists()) == false) {
|
||||
throw new GradleException("Could not resolve \"apiPackage\"! Could not find " + targetPackageJava + " or " + targetPackageScala)
|
||||
}
|
||||
}
|
||||
|
||||
if(accessTransformersFile) {
|
||||
String targetFile = "src/main/resources/META-INF/" + accessTransformersFile
|
||||
if(getFile(targetFile).exists() == false) {
|
||||
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("\\.", "/")
|
||||
if((getFile(targetPackageJava).exists() || getFile(targetPackageScala).exists()) == false) {
|
||||
throw new GradleException("Could not resolve \"mixinsPackage\"! Could not find " + targetPackageJava + " or " + targetPackageScala)
|
||||
}
|
||||
|
||||
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"
|
||||
if((getFile(targetFileJava).exists() || getFile(targetFileScala).exists() || getFile(targetFileScalaJava).exists()) == false) {
|
||||
throw new GradleException("Could not resolve \"mixinPlugin\"! Could not find " + targetFileJava + " or " + targetFileScala + " or " + targetFileScalaJava)
|
||||
}
|
||||
}
|
||||
|
||||
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"
|
||||
if((getFile(targetFileJava).exists() || getFile(targetFileScala).exists() || getFile(targetFileScalaJava).exists()) == false) {
|
||||
throw new GradleException("Could not resolve \"coreModClass\"! Could not find " + targetFileJava + " or " + targetFileScala + " or " + targetFileScalaJava)
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
'git config core.fileMode false'.execute()
|
||||
// Pulls version from git tag
|
||||
try {
|
||||
version = minecraftVersion + "-" + gitVersion()
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new IllegalStateException("This mod must be version controlled by Git AND the repository must provide at least one tag!");
|
||||
}
|
||||
|
||||
group = modGroup
|
||||
if(project.hasProperty("customArchiveBaseName") && customArchiveBaseName) {
|
||||
archivesBaseName = customArchiveBaseName
|
||||
}
|
||||
else {
|
||||
archivesBaseName = modId
|
||||
}
|
||||
|
||||
minecraft {
|
||||
version = "1.7.10-10.13.4.1614-1.7.10"
|
||||
replace '${version}', project.version
|
||||
replaceIn "ThaumicHorizons.java"
|
||||
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, versionDetails().lastTag
|
||||
}
|
||||
if(gradleTokenGroupName) {
|
||||
replace gradleTokenGroupName, modGroup
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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("org.spongepowered:mixin:0.7.11-SNAPSHOT") {
|
||||
// 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.3.3:dev")
|
||||
}
|
||||
}
|
||||
|
||||
// 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 {
|
||||
def arguments = []
|
||||
|
||||
if(usesMixins.toBoolean()) {
|
||||
arguments += [
|
||||
"--mods=../build/libs/$modId-${version}.jar",
|
||||
"--tweakClass org.spongepowered.asm.launch.MixinTweaker"
|
||||
]
|
||||
}
|
||||
|
||||
if(developmentEnvironmentUserName) {
|
||||
arguments += [
|
||||
"--username",
|
||||
developmentEnvironmentUserName
|
||||
]
|
||||
}
|
||||
|
||||
args(arguments)
|
||||
}
|
||||
|
||||
runServer {
|
||||
def arguments = []
|
||||
|
||||
if (usesMixins.toBoolean()) {
|
||||
arguments += [
|
||||
"--mods=../build/libs/$modId-${version}.jar",
|
||||
"--tweakClass org.spongepowered.asm.launch.MixinTweaker"
|
||||
]
|
||||
}
|
||||
|
||||
args(arguments)
|
||||
}
|
||||
|
||||
tasks.withType(JavaExec).configureEach {
|
||||
javaLauncher.set(
|
||||
javaToolchains.launcherFor {
|
||||
languageVersion = projectJavaVersion
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
processResources
|
||||
@@ -62,20 +366,223 @@ processResources
|
||||
// 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
|
||||
expand "minecraftVersion": project.minecraft.version,
|
||||
"modVersion": versionDetails().lastTag,
|
||||
"modId": modId,
|
||||
"modName": modName
|
||||
}
|
||||
|
||||
|
||||
if(usesMixins.toBoolean()) {
|
||||
from refMap
|
||||
}
|
||||
|
||||
// copy everything else, thats 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 {
|
||||
archives sourcesJar
|
||||
archives devJar
|
||||
if(apiPackage) {
|
||||
archives apiJar
|
||||
}
|
||||
}
|
||||
|
||||
// publishing
|
||||
publishing {
|
||||
publications {
|
||||
maven(MavenPublication) {
|
||||
artifact source: jar
|
||||
artifact source: sourcesJar, classifier: "src"
|
||||
artifact source: devJar, classifier: "dev"
|
||||
if (apiPackage) {
|
||||
artifact source: apiJar, classifier: "api"
|
||||
}
|
||||
|
||||
groupId = System.getenv("ARTIFACT_GROUP_ID") ?: group
|
||||
artifactId = System.getenv("ARTIFACT_ID") ?: project.name
|
||||
version = System.getenv("ARTIFACT_VERSION") ?: project.version
|
||||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
String owner = System.getenv("REPOSITORY_OWNER") ?: "Unknown"
|
||||
String repositoryName = System.getenv("REPOSITORY_NAME") ?: "Unknown"
|
||||
String githubRepositoryUrl = "https://maven.pkg.github.com/$owner/$repositoryName"
|
||||
name = "GitHubPackages"
|
||||
url = githubRepositoryUrl
|
||||
credentials {
|
||||
username = System.getenv("GITHUB_ACTOR") ?: "NONE"
|
||||
password = System.getenv("GITHUB_TOKEN") ?: "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/SinTh0r4s/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'
|
||||
}
|
||||
|
||||
// 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/SinTh0r4s/ExampleMod1.7.10/blob/main/gradle.properties")
|
||||
}
|
||||
}
|
||||
|
||||
def getFile(String relativePath) {
|
||||
return new File(projectDir, relativePath)
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
// Add your dependencies here
|
||||
|
||||
dependencies {
|
||||
compile("com.github.GTNewHorizons:Baubles:master-SNAPSHOT:dev")
|
||||
|
||||
compile("thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev")
|
||||
|
||||
compileOnly("com.github.GTNewHorizons:GT5-Unofficial:master-SNAPSHOT:dev") {
|
||||
transitive = false
|
||||
}
|
||||
}
|
||||
@@ -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 user name 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 mods 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. I 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 =
|
||||
Vendored
BIN
Binary file not shown.
+1
-1
@@ -1,5 +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
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-bin.zip
|
||||
@@ -1,5 +1,21 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
#
|
||||
# Copyright 2015 the original author or authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
@@ -28,7 +44,7 @@ APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS=""
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
@@ -109,8 +125,8 @@ 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"`
|
||||
|
||||
Vendored
+17
-1
@@ -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
|
||||
@@ -14,7 +30,7 @@ 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=
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
before_install:
|
||||
- ./gradlew setupCIWorkspace
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
// Add any additional repositories for your dependencies here
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
url = "https://jitpack.io"
|
||||
}
|
||||
}
|
||||
+69
-59
@@ -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,77 @@ 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(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;
|
||||
}
|
||||
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.glDepthMask(true);
|
||||
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();
|
||||
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);
|
||||
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();
|
||||
++which;
|
||||
}
|
||||
GL11.glDepthMask(true);
|
||||
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);
|
||||
GL11.glPopMatrix();
|
||||
}
|
||||
GL11.glDisable(3042);
|
||||
GL11.glAlphaFunc(516, 0.1f);
|
||||
GL11.glPopMatrix();
|
||||
catch (Exception e)
|
||||
{
|
||||
System.out.println(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
|
||||
@@ -251,8 +251,8 @@ import thaumcraft.common.entities.monster.EntityWisp;
|
||||
import thaumcraft.common.lib.utils.Utils;
|
||||
|
||||
@Mod(
|
||||
modid = "ThaumicHorizons",
|
||||
name = "ThaumicHorizons",
|
||||
modid = ThaumicHorizons.MODID,
|
||||
name = ThaumicHorizons.MODID,
|
||||
version = ThaumicHorizons.VERSION,
|
||||
dependencies = "required-after:Forge@[10.13.2,);" +
|
||||
"required-after:Thaumcraft@[4.2.3.4,)",
|
||||
@@ -260,7 +260,7 @@ import thaumcraft.common.lib.utils.Utils;
|
||||
)
|
||||
public class ThaumicHorizons {
|
||||
public static final String MODID = "ThaumicHorizons";
|
||||
public static final String VERSION = "@version@";
|
||||
public static final String VERSION = "GRADLETOKEN_VERSION";
|
||||
|
||||
@Instance("ThaumicHorizons")
|
||||
public static ThaumicHorizons instance;
|
||||
@@ -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);
|
||||
|
||||
@@ -87,37 +87,39 @@ public class BlockPortalTH extends BlockBreakable
|
||||
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;
|
||||
|
||||
+4
-1
@@ -49,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();
|
||||
|
||||
@@ -15,23 +15,19 @@ import cpw.mods.fml.common.network.NetworkRegistry;
|
||||
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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
+9
-8
@@ -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;
|
||||
}
|
||||
|
||||
@@ -115,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 {
|
||||
@@ -137,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);
|
||||
@@ -324,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);
|
||||
@@ -522,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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -535,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);
|
||||
|
||||
@@ -102,10 +102,10 @@ 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.put(pocketPlaneMAXID,Vec3.createVectorHelper((double) vortexX, (double) vortexY, (double) vortexZ));
|
||||
//System.out.println("Finished with pocket plane generation!");
|
||||
|
||||
+39
-6
@@ -4,9 +4,14 @@
|
||||
|
||||
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;
|
||||
@@ -15,22 +20,46 @@ public class PacketPlayerInfusionSync implements IMessage, IMessageHandler<Packe
|
||||
{
|
||||
int[] infusions;
|
||||
String name;
|
||||
boolean toggleClimb;
|
||||
boolean toggleInvisible;
|
||||
|
||||
public PacketPlayerInfusionSync() {
|
||||
this.infusions = new int[10];
|
||||
this.infusions = new int[EntityInfusionProperties.NUM_INFUSIONS];
|
||||
this.name = "";
|
||||
this.toggleClimb = false;
|
||||
this.toggleInvisible = false;
|
||||
}
|
||||
|
||||
public PacketPlayerInfusionSync(final String name, final int[] infusions) {
|
||||
this.infusions = new int[10];
|
||||
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) {
|
||||
((EntityInfusionProperties)Minecraft.getMinecraft().theWorld.getPlayerEntityByName(message.name).getExtendedProperties("CreatureInfusion")).playerInfusions = message.infusions;
|
||||
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;
|
||||
}
|
||||
@@ -44,9 +73,11 @@ public class PacketPlayerInfusionSync implements IMessage, IMessageHandler<Packe
|
||||
chars[i] = (char)bites[i];
|
||||
}
|
||||
this.name = String.copyValueOf(chars);
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
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) {
|
||||
@@ -57,8 +88,10 @@ public class PacketPlayerInfusionSync implements IMessage, IMessageHandler<Packe
|
||||
bites[i] = (byte)chars[i];
|
||||
}
|
||||
buf.writeBytes(bites);
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
for (int i = 0; i < EntityInfusionProperties.NUM_INFUSIONS; ++i) {
|
||||
buf.writeInt(this.infusions[i]);
|
||||
}
|
||||
buf.writeBoolean(this.toggleClimb);
|
||||
buf.writeBoolean(this.toggleInvisible);
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -43,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);
|
||||
}
|
||||
|
||||
@@ -157,32 +157,33 @@ 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;
|
||||
|
||||
@@ -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=В случае конфликтов модификаций, Колокольчик Голема может быть создан по альтернативному рецепту.
|
||||
@@ -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": "",
|
||||
|
||||
Reference in new issue
Block a user