Compare commits
35 commits
Author | SHA1 | Date | |
---|---|---|---|
53572b6e84 | |||
4792caa473 | |||
263308e4a1 | |||
![]() |
5643a2dbcc | ||
a3035fadcd | |||
![]() |
8ded7e50d5 | ||
13613d0003 | |||
022b9b7390 | |||
![]() |
053486a22a | ||
![]() |
003380f696 | ||
![]() |
cfb01a4205 | ||
a017d6988a | |||
77f01b8596 | |||
ee3485783e | |||
8f5eec5b02 | |||
c3947d8fb3 | |||
![]() |
eb74d01183 | ||
f6a3d3272f | |||
ca02eb69a5 | |||
68594537d1 | |||
![]() |
f641916e24 | ||
0e2a366fbb | |||
5c882edfb0 | |||
![]() |
70cd4eb724 | ||
![]() |
462b8700af | ||
d135b38708 | |||
7b747eb291 | |||
541e6e1ae6 | |||
328f07d6f6 | |||
93df8513bc | |||
af67a59000 | |||
![]() |
3221c1946a | ||
33ee87f506 | |||
1af6d3efc3 | |||
![]() |
a88fa55da5 |
91 changed files with 12045 additions and 1146 deletions
38
.forgejo/workflows/build.yaml
Normal file
38
.forgejo/workflows/build.yaml
Normal file
|
@ -0,0 +1,38 @@
|
|||
on:
|
||||
push:
|
||||
tags:
|
||||
- '*'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: docker
|
||||
|
||||
steps:
|
||||
- name: checkout repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: make gradle wrapper executable
|
||||
run: chmod +x ./gradlew
|
||||
|
||||
- name: set up jdk
|
||||
run: |
|
||||
INSTALL_DIR="/opt/java"
|
||||
mkdir -p "$INSTALL_DIR"
|
||||
|
||||
JDK8_URL="https://cdn.azul.com/zulu/bin/zulu8.84.0.15-ca-jdk8.0.442-linux_x64.tar.gz"
|
||||
JRE17_URL="https://cdn.azul.com/zulu/bin/zulu17.56.15-ca-jre17.0.14-linux_x64.tar.gz"
|
||||
|
||||
echo "Downloading JDK8 from $JDK8_URL"
|
||||
curl -L "$JDK8_URL" | tar -xz -C "$INSTALL_DIR"
|
||||
|
||||
echo "Downloading JRE17 from $JRE17_URL"
|
||||
curl -L "$JRE17_URL" | tar -xz -C "$INSTALL_DIR"
|
||||
|
||||
- name: build
|
||||
run: JDK8=/opt/java/zulu8.84.0.15-ca-jdk8.0.442-linux_x64 JAVA_HOME=/opt/java/zulu17.56.15-ca-jre17.0.14-linux_x64 ./gradlew build
|
||||
|
||||
- name: capture build artifacts
|
||||
uses: https://code.forgejo.org/forgejo/upload-artifact@v3
|
||||
with:
|
||||
name: Artifacts
|
||||
path: 'build/libs'
|
4
.gitattributes
vendored
Normal file
4
.gitattributes
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
gradlew* linguist-vendored
|
||||
gradle/wrapper/* linguist-vendored
|
||||
*.bat text eol=crlf
|
||||
|
22
.github/workflows/build.yml
vendored
22
.github/workflows/build.yml
vendored
|
@ -1,22 +0,0 @@
|
|||
name: Run Gradle Build
|
||||
on: [push, pull_request]
|
||||
jobs:
|
||||
gradle:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout source
|
||||
uses: actions/checkout@v3
|
||||
- uses: actions/setup-java@v3
|
||||
name: Setup Java
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: 17
|
||||
- name: Setup Gradle
|
||||
uses: gradle/gradle-build-action@v2
|
||||
- name: Execute Gradle build
|
||||
run: ./gradlew build
|
||||
- uses: actions/upload-artifact@v3
|
||||
name: Upload built mod JAR
|
||||
with:
|
||||
name: latest-autobuild
|
||||
path: build/libs/*.jar
|
10
.github/workflows/gradle-wrapper-validation.yml
vendored
10
.github/workflows/gradle-wrapper-validation.yml
vendored
|
@ -1,10 +0,0 @@
|
|||
name: "Validate Gradle Wrapper"
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
validation:
|
||||
name: "Validation"
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: gradle/wrapper-validation-action@v1
|
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -1,6 +1,3 @@
|
|||
.idea/
|
||||
.vscode/
|
||||
run/
|
||||
build/
|
||||
.gradle/
|
||||
|
||||
|
|
96
README.md
96
README.md
|
@ -1,42 +1,80 @@
|
|||
# zombies-utils
|
||||
##### Download latest release: [v1.2.4-pre6](https://github.com/Stachelbeere1248/zombies-utils/releases/tag/v1.2.4-pre6).
|
||||
|
||||
##### Download the latest release [here](https://github.com/Stachelbeere1248/zombies-utils/releases/latest)
|
||||
|
||||
Hello, I am currently working on this mod. More features will come. For now it has:
|
||||
|
||||
- An accurate timer + Automatic splitting
|
||||
- Tracking of splits & segment PBs (with custom categories)
|
||||
- SLA hud
|
||||
- 1 chat macro
|
||||
- Spawntime (no aa colors yet, but Rocket Launcher mode)
|
||||
- A chat macro
|
||||
- Spawn-times HUD: visual, auditory, RL-mode
|
||||
- Player Visibility
|
||||
|
||||
#### Disclaimers
|
||||
- If you are using a Hypixel language other than english the mod may not work entirely. Use /lang en.
|
||||
|
||||
- If you are using a Hypixel language other than the selected one the mod may not work entirely. Check config.
|
||||
|
||||
## For Users
|
||||
The timer automatically splits every round. The Personal-Best-recorder automatically distinguishes between maps and difficulties.
|
||||
|
||||
The timer automatically splits every round. The PB/Segment recorder automatically distinguishes maps and difficulties,
|
||||
but not player count.
|
||||
|
||||
### Config
|
||||
- SLA Launcher: if on, sets and displays SLA when the mod starts the timer
|
||||
- short SLA: if on, hides inactive windows & rooms from the SLA display
|
||||
- chat macro: the text to be sent when pressing the respective keybind (-> control settings), DO NOT use "§" as symbol
|
||||
- default category name: the category to be tracked until /category is used
|
||||
- Rocket Launcher offset: The amount of ticks to be added to wave-spawn times during RL mode
|
||||
- passed Waves: Whether to show or hide spawn-times for previous waves.
|
||||
|
||||
- `Language`: The selected Hypixel language. Currently supports EN,FR,DE.
|
||||
- ###### Timer:
|
||||
- `Default Category`: The record-category to be selected when starting the game.
|
||||
- `PB Announcements`: Whether to show **\*\*\*NEW PERSONAL BEST\*\*\*** on PB in summaries.
|
||||
- ###### SST:
|
||||
- `Enabled`: Enables / disables this feature.
|
||||
- `Auditory`: A List of tick offsets that a sound should be played. Default (-40, -20, 0) means 2s and 1s in
|
||||
advance, as well as on spawn.
|
||||
- `RL pre-timing`: During RL mode, how much SST times sohuld be offsetted. Defaults to 1.4s earlier. Affects HUD as
|
||||
well as auditory.
|
||||
- `Truncate`: Whether to show passed rounds in the HUD.
|
||||
- ###### SLA:
|
||||
- `Enabled`: Whether the SLA HUD should automatically be shown when starting a game.
|
||||
- `Truncate`: Whether inactive windows and rooms should be shown.
|
||||
- ###### Player Visibility:
|
||||
- `Enabled`: Whether to enable PlayerVisibility by default.
|
||||
- `Range`: The range within which players are hidden while enabled.
|
||||
- `Macro Message`: The Message to be sent when pressing the Chat Macro Key. Do NOT use "§" as symbol.
|
||||
- `CPS Counter`: A simple CPS Counter which shows the amount of clicks within the last 20 gameticks.
|
||||
|
||||
### Commands
|
||||
- /category \<name> - Switches to the category called name. All recorded times are bound to its category. Tabcomplete suggests already existing categories, but you can insert a new (clean) one as well.
|
||||
- Examples:
|
||||
- /category pistol_only
|
||||
- /category no_doors_solo
|
||||
- note: you do NOT need to make your own categories to seperate difficulties or map
|
||||
|
||||
- /category \<name> - Switches to the category called name. All recorded times are bound to its category. Tabcomplete
|
||||
suggests already existing categories, but you can insert a new (clean) one as well.
|
||||
- Examples:
|
||||
- /category pistol_only
|
||||
- /category no_doors_solo
|
||||
- note: you do NOT need to make your own categories to seperate difficulties or map
|
||||
- /sla \<off|map|quick|rotate|mirror|offset>
|
||||
- /sla off - Disables the SLA hud
|
||||
- /sla map \<de|bb|aa> - forcefully set the map
|
||||
- /sla quick \<mogi_a|ghxula|ghxula-garden>
|
||||
- /sla rotate - rotates all windows around the axis (0,y,0)
|
||||
- /sla mirror \<x|z> - mirrors all windows along the plane (0,y,z) or (x,y,0)
|
||||
- /sla offset \<x> \<y> \<z> - set an offset, allowing you to use sla on map-recreations, such as housings
|
||||
- /sla off - Disables the SLA hud
|
||||
- /sla map \<de|bb|aa|p> - forcefully set the map
|
||||
- /sla quick \<mogi_a|ghxula|ghxula-garden>
|
||||
- useless for most players:
|
||||
- /sla rotate - rotates all windows around the axis (0,y,0)
|
||||
- /sla mirror \<x|z> - mirrors all windows along the plane (0,y,z) or (x,y,0)
|
||||
- /sla offset \<x> \<y> \<z> - set an offset, allowing you to use sla on map-recreations, such as housings
|
||||
- /zombiesutils \<timer>
|
||||
- /zombiesutils timer \<kill|split>
|
||||
- /zombiesutils timer kill - Stops the running timer completely
|
||||
- /zombiesutils timer split \<round> - Splits as if \<round> was passed, not recommended to use as it might create impossible PBs
|
||||
- /qz \<de|bb|aa> - sends you to a new game of Dead End, Bad Blood or Alien Arcadium
|
||||
- /zombiesutils timer \<kill|split>
|
||||
- /zombiesutils timer kill - Stops the running timer completely
|
||||
- /zombiesutils timer split \<round> - Splits as if \<round> was passed, not recommended to use as it might
|
||||
create impossible PBs.
|
||||
- /qz \<de|bb|aa|p> - sends you to a new game of Dead End, Bad Blood, Alien Arcadium or Prison
|
||||
|
||||
### Hotkeys
|
||||
- Chat Macro: sends the message specified in the config
|
||||
- RL Mode: Toggle usage of the rocket launcher mode spawn-time offset.
|
||||
|
||||
- Chat Macro: Sends the message specified in the config.
|
||||
- RL Mode: Toggles usage of the rocket launcher mode spawn-time offset.
|
||||
- Player Visibility: Toggles whether to show players that are within a 4 block radius.
|
||||
|
||||
### Extra
|
||||
- Managing split-categories: In your minecraft folder is a folder called "zombies" which contains the folder "splits". You can simply rename or delete the folders inside "splits". You can also edit your splits, the data is stored in ticks inside the MAP_DIFFICULTY.times files, a simple text editor should be able to edit it (UTF-16 encoded text).
|
||||
|
||||
- Managing split-categories: In your game directory (aka `.minecraft`) is a folder called `zombies` which contains the
|
||||
folder `splits`. You can simply rename or delete the folders inside `splits`, they represent your categories. You can
|
||||
also edit your splits, the data is stored as a list of ticks inside the `MAP_DIFFICULTY.times` files, a simple text
|
||||
editor (such as Notepad on Windows) should be able to edit it (UTF-16 encoded text). The other subfolder, runs, logs
|
||||
all the splits for every run you play.
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import org.apache.commons.lang3.SystemUtils
|
||||
|
||||
plugins {
|
||||
idea
|
||||
java
|
||||
|
@ -8,11 +10,12 @@ plugins {
|
|||
|
||||
//Constants:
|
||||
|
||||
val baseGroup = "com.github.stachelbeere1248.zombiesutils"
|
||||
val baseGroup: String by project
|
||||
val mcVersion: String by project
|
||||
val version: String by project
|
||||
val mixinGroup = "$baseGroup.mixin"
|
||||
val modid: String by project
|
||||
val transformerFile = file("src/main/resources/accesstransformer.cfg")
|
||||
|
||||
// Toolchains:
|
||||
java {
|
||||
|
@ -26,14 +29,26 @@ loom {
|
|||
"client" {
|
||||
// If you don't want mixins, remove these lines
|
||||
property("mixin.debug", "true")
|
||||
property("asmhelper.verbose", "true")
|
||||
arg("--tweakClass", "org.spongepowered.asm.launch.MixinTweaker")
|
||||
}
|
||||
}
|
||||
runConfigs {
|
||||
"client" {
|
||||
if (SystemUtils.IS_OS_MAC_OSX) {
|
||||
// This argument causes a crash on macOS
|
||||
vmArgs.remove("-XstartOnFirstThread")
|
||||
}
|
||||
}
|
||||
remove(getByName("server"))
|
||||
}
|
||||
forge {
|
||||
pack200Provider.set(dev.architectury.pack200.java.Pack200Adapter())
|
||||
// If you don't want mixins, remove this lines
|
||||
mixinConfig("mixins.$modid.json")
|
||||
if (transformerFile.exists()) {
|
||||
println("Installing access transformer")
|
||||
accessTransformer(transformerFile)
|
||||
}
|
||||
}
|
||||
// If you don't want mixins, remove these lines
|
||||
mixin {
|
||||
|
@ -50,8 +65,6 @@ sourceSets.main {
|
|||
repositories {
|
||||
mavenCentral()
|
||||
maven("https://repo.spongepowered.org/maven/")
|
||||
// If you don't want to log in with your real minecraft account, remove this line
|
||||
maven("https://pkgs.dev.azure.com/djtheredstoner/DevAuth/_packaging/public/maven/v1")
|
||||
}
|
||||
|
||||
val shadowImpl: Configuration by configurations.creating {
|
||||
|
@ -68,10 +81,6 @@ dependencies {
|
|||
isTransitive = false
|
||||
}
|
||||
annotationProcessor("org.spongepowered:mixin:0.8.5-SNAPSHOT")
|
||||
|
||||
// If you don't want to log in with your real minecraft account, remove this line
|
||||
runtimeOnly("me.djtheredstoner:DevAuth-forge-legacy:1.1.2")
|
||||
|
||||
}
|
||||
|
||||
// Tasks:
|
||||
|
@ -80,7 +89,7 @@ tasks.withType(JavaCompile::class) {
|
|||
options.encoding = "UTF-8"
|
||||
}
|
||||
|
||||
tasks.withType(Jar::class) {
|
||||
tasks.withType(org.gradle.jvm.tasks.Jar::class) {
|
||||
archiveBaseName.set(modid)
|
||||
manifest.attributes.run {
|
||||
this["FMLCorePluginContainsFMLMod"] = "true"
|
||||
|
@ -89,6 +98,8 @@ tasks.withType(Jar::class) {
|
|||
// If you don't want mixins, remove these lines
|
||||
this["TweakClass"] = "org.spongepowered.asm.launch.MixinTweaker"
|
||||
this["MixinConfigs"] = "mixins.$modid.json"
|
||||
if (transformerFile.exists())
|
||||
this["FMLAT"] = "${modid}_at.cfg"
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -96,13 +107,13 @@ tasks.processResources {
|
|||
inputs.property("version", project.version)
|
||||
inputs.property("mcversion", mcVersion)
|
||||
inputs.property("modid", modid)
|
||||
inputs.property("mixinGroup", mixinGroup)
|
||||
inputs.property("basePackage", baseGroup)
|
||||
|
||||
filesMatching(listOf("mcmod.info", "mixins.$modid.json")) {
|
||||
expand(inputs.properties)
|
||||
}
|
||||
|
||||
rename("(.+_at.cfg)", "META-INF/$1")
|
||||
rename("accesstransformer.cfg", "META-INF/${modid}_at.cfg")
|
||||
}
|
||||
|
||||
|
||||
|
@ -114,16 +125,16 @@ val remapJar by tasks.named<net.fabricmc.loom.task.RemapJarTask>("remapJar") {
|
|||
|
||||
tasks.jar {
|
||||
archiveClassifier.set("without-deps")
|
||||
destinationDirectory.set(layout.buildDirectory.dir("badjars"))
|
||||
destinationDirectory.set(layout.buildDirectory.dir("intermediates"))
|
||||
}
|
||||
|
||||
tasks.shadowJar {
|
||||
destinationDirectory.set(layout.buildDirectory.dir("badjars"))
|
||||
archiveClassifier.set("all-dev")
|
||||
destinationDirectory.set(layout.buildDirectory.dir("intermediates"))
|
||||
archiveClassifier.set("non-obfuscated-with-deps")
|
||||
configurations = listOf(shadowImpl)
|
||||
doLast {
|
||||
configurations.forEach {
|
||||
println("Copying jars into mod: ${it.files}")
|
||||
println("Copying dependencies into mod: ${it.files}")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
loom.platform=forge
|
||||
org.gradle.jvmargs=-Xmx2g
|
||||
baseGroup = com.github.stachelbeere1248.zombiesutils
|
||||
baseGroup = xyz.stachel.zombiesutils
|
||||
mcVersion = 1.8.9
|
||||
modid = zombiesutils
|
||||
version = 1.2.4
|
||||
version = 1.4.0
|
||||
org.gradle.java.installations.fromEnv=JDK8,JRE17
|
||||
|
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,6 +1,6 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
|
19
gradlew
vendored
19
gradlew
vendored
|
@ -55,7 +55,7 @@
|
|||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
|
@ -83,7 +83,8 @@ done
|
|||
# This is normally unused
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
|
@ -144,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
|||
case $MAX_FD in #(
|
||||
max*)
|
||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
|
@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
|||
'' | soft) :;; #(
|
||||
*)
|
||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
|
@ -201,11 +202,11 @@ fi
|
|||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Collect all arguments for the java command;
|
||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
# double quotes to make sure that they get re-expanded; and
|
||||
# * put everything else in single quotes, so that it's not re-expanded.
|
||||
# Collect all arguments for the java command:
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||
# and any embedded shellness will be escaped.
|
||||
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
||||
# treated as '${Hostname}' itself on the command line.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
|
|
20
gradlew.bat
vendored
20
gradlew.bat
vendored
|
@ -43,11 +43,11 @@ set JAVA_EXE=java.exe
|
|||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if %ERRORLEVEL% equ 0 goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
|
@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
|||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@ pluginManagement {
|
|||
maven("https://maven.fabricmc.net")
|
||||
maven("https://maven.minecraftforge.net/")
|
||||
maven("https://repo.spongepowered.org/maven/")
|
||||
maven("https://repo.sk1er.club/repository/maven-releases/")
|
||||
maven("https://repo.essential.gg/repository/maven-releases/")
|
||||
}
|
||||
resolutionStrategy {
|
||||
eachPlugin {
|
||||
|
|
|
@ -1,133 +0,0 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.config;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.LanguageSupport;
|
||||
import net.minecraftforge.common.config.Configuration;
|
||||
import net.minecraftforge.common.config.Property;
|
||||
import net.minecraftforge.fml.client.event.ConfigChangedEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class ZombiesUtilsConfig {
|
||||
public static Configuration config;
|
||||
private static Property slaToggle;
|
||||
private static Property slaShortener;
|
||||
private static Property shortSpawntime;
|
||||
private static Property sst;
|
||||
private static Property chatMacro;
|
||||
private static Property defaultCategory;
|
||||
private static Property waveOffset;
|
||||
private static Property language;
|
||||
private static Property auditory;
|
||||
|
||||
public static void load() {
|
||||
ZombiesUtils.getInstance().getLogger().debug("Loading config...");
|
||||
config.load();
|
||||
ZombiesUtils.getInstance().getLogger().debug("Config loaded.");
|
||||
|
||||
language = config.get(
|
||||
Configuration.CATEGORY_GENERAL,
|
||||
"Language",
|
||||
"EN",
|
||||
"Your Hypixel language",
|
||||
LanguageSupport.getLanguages()
|
||||
);
|
||||
slaToggle = config.get(
|
||||
Configuration.CATEGORY_GENERAL,
|
||||
"SLA Launcher",
|
||||
false,
|
||||
"Should SLA be started when a game starts?"
|
||||
);
|
||||
slaShortener = config.get(
|
||||
Configuration.CATEGORY_GENERAL,
|
||||
"shortened SLA",
|
||||
true,
|
||||
"If on, inactive windows / rooms will not show"
|
||||
);
|
||||
chatMacro = config.get(
|
||||
Configuration.CATEGORY_GENERAL,
|
||||
"Chat Macro",
|
||||
"T",
|
||||
"The Text to be sent when pressing the chat-macro hotkey"
|
||||
);
|
||||
defaultCategory = config.get(
|
||||
Configuration.CATEGORY_GENERAL,
|
||||
"Default Category",
|
||||
"general",
|
||||
"name of the category to be selected unless specified using /runCategory"
|
||||
);
|
||||
waveOffset = config.get(
|
||||
Configuration.CATEGORY_GENERAL,
|
||||
"RL-mode offset",
|
||||
-28,
|
||||
"ticks to be added to the wave spawn time",
|
||||
-200,
|
||||
200
|
||||
);
|
||||
shortSpawntime = config.get(
|
||||
Configuration.CATEGORY_GENERAL,
|
||||
"passed wave spawns",
|
||||
true,
|
||||
"Display spawn-time for passed waves"
|
||||
);
|
||||
auditory = config.get(Configuration.CATEGORY_GENERAL,
|
||||
"auditory sst",
|
||||
new int[]{-40, -20, 0},
|
||||
"Tick-offset to play sound",
|
||||
-200,
|
||||
200,
|
||||
false,
|
||||
5
|
||||
);
|
||||
sst = config.get(
|
||||
Configuration.CATEGORY_GENERAL,
|
||||
"SST HUD",
|
||||
false,
|
||||
"Enable if not using SST by Sosean"
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
public static short getWaveOffset() {
|
||||
return (short) waveOffset.getInt();
|
||||
}
|
||||
|
||||
public static boolean isSlaToggled() {
|
||||
return slaToggle.getBoolean();
|
||||
}
|
||||
|
||||
public static boolean isSlaShortened() {
|
||||
return slaShortener.getBoolean();
|
||||
}
|
||||
|
||||
public static boolean isSpawntimeNotShortened() {
|
||||
return shortSpawntime.getBoolean();
|
||||
}
|
||||
|
||||
public static String getChatMacro() {
|
||||
return chatMacro.getString();
|
||||
}
|
||||
|
||||
public static String getDefaultCategory() {
|
||||
return defaultCategory.getString();
|
||||
}
|
||||
|
||||
public static String getLanguage() {
|
||||
return language.getString();
|
||||
}
|
||||
|
||||
public static int[] getAuditory() {
|
||||
return auditory.getIntList();
|
||||
}
|
||||
public static boolean getSST() {
|
||||
return sst.getBoolean();
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onConfigChange(ConfigChangedEvent.@NotNull OnConfigChangedEvent event) {
|
||||
if (event.modID.equals("zombiesutils") && event.configID == null) {
|
||||
config.save();
|
||||
ZombiesUtilsConfig.load();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,43 +0,0 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.game;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Difficulty;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Map;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class GameMode {
|
||||
private final Map map;
|
||||
private Difficulty difficulty;
|
||||
|
||||
public GameMode(@NotNull Map map) {
|
||||
this.map = map;
|
||||
this.difficulty = Difficulty.NORMAL;
|
||||
}
|
||||
|
||||
public GameMode(@NotNull Map map, @NotNull Difficulty difficulty) {
|
||||
this.map = map;
|
||||
this.difficulty = difficulty;
|
||||
}
|
||||
|
||||
public Map getMap() {
|
||||
return map;
|
||||
}
|
||||
|
||||
public Difficulty getDifficulty() {
|
||||
return difficulty;
|
||||
}
|
||||
|
||||
public void changeDifficulty(@NotNull Difficulty difficulty) {
|
||||
switch (map) {
|
||||
case DEAD_END:
|
||||
case BAD_BLOOD:
|
||||
this.difficulty = difficulty;
|
||||
break;
|
||||
case ALIEN_ARCADIUM:
|
||||
throw new RuntimeException("Achievement Get: Alien Arcadium Hard/RIP" + Map.ALIEN_ARCADIUM);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean is(Map map, Difficulty difficulty) {
|
||||
return this.getDifficulty() == difficulty && this.getMap() == map;
|
||||
}
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.game.enums;
|
||||
|
||||
public enum Map {
|
||||
DEAD_END, BAD_BLOOD, ALIEN_ARCADIUM, PRISON
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.game.waves;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.config.ZombiesUtilsConfig;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.Timer;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class WaveTiming {
|
||||
public static int rl = 0;
|
||||
|
||||
public static byte[] getWaves(@NotNull Timer timer) {
|
||||
return Waves.get(
|
||||
timer.getGameMode().getMap(),
|
||||
timer.getRound()
|
||||
);
|
||||
}
|
||||
public static byte getLastWave(@NotNull Timer timer) {
|
||||
return Waves.getLastWave(
|
||||
timer.getGameMode().getMap(),
|
||||
timer.getRound()
|
||||
);
|
||||
}
|
||||
|
||||
public static void onTick() {
|
||||
Timer.getInstance().ifPresent(timer -> {
|
||||
int wave = (getLastWave(timer)*20)+rl;
|
||||
final int roundTime = timer.roundTime();
|
||||
final int[] auditory = ZombiesUtilsConfig.getAuditory();
|
||||
final Integer pre = roundTime-wave;
|
||||
if (Arrays.stream(auditory).anyMatch(pre::equals)) {
|
||||
Minecraft.getMinecraft().thePlayer.playSound("note.pling",1,2);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static void toggleRL() {
|
||||
if (rl == 0) rl = ZombiesUtilsConfig.getWaveOffset();
|
||||
else rl = 0;
|
||||
}
|
||||
}
|
|
@ -1,54 +0,0 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.game.waves;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Map;
|
||||
import org.jetbrains.annotations.Contract;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@SuppressWarnings("DuplicatedCode")
|
||||
public class Waves {
|
||||
private static final byte[][] deadEndWaveTimes = {{10, 20}, {10, 20}, {10, 20, 35}, {10, 20, 35}, {10, 22, 37}, {10, 22, 44}, {10, 25, 47}, {10, 25, 50}, {10, 22, 38}, {10, 24, 45}, {10, 25, 48}, {10, 25, 50}, {10, 25, 50}, {10, 25, 45}, {10, 25, 46}, {10, 24, 47}, {10, 24, 47}, {10, 24, 47}, {10, 24, 47}, {10, 24, 49}, {10, 23, 44}, {10, 23, 45}, {10, 23, 42}, {10, 23, 43}, {10, 23, 43}, {10, 23, 36}, {10, 24, 44}, {10, 24, 42}, {10, 24, 42}, {10, 24, 45}},
|
||||
badBloodWaveTimes = {{10, 22}, {10, 22}, {10, 22}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34}, {10, 24, 38}, {10, 24, 38}, {10, 22, 34}, {10, 24, 38}, {10, 22, 34}},
|
||||
alienArcadiumWaveTimes = {{10, 13, 16, 19}, {10, 14, 18, 22}, {10, 13, 16, 19}, {10, 14, 17, 21, 25, 28}, {10, 14, 18, 22, 26, 30}, {10, 14, 19, 23, 28, 32}, {10, 15, 19, 23, 27, 31}, {10, 15, 20, 25, 30, 35}, {10, 14, 19, 23, 28, 32}, {10, 16, 22, 27, 33, 38}, {10, 16, 21, 27, 32, 38}, {10, 16, 22, 28, 34, 40}, {10, 16, 22, 28, 34, 40}, {10, 16, 21, 26, 31, 36}, {10, 17, 24, 31, 38, 46}, {10, 16, 22, 27, 33, 38}, {10, 14, 19, 23, 28, 32}, {10, 14, 19, 23, 28, 32}, {10, 14, 18, 22, 26, 30}, {10, 15, 21, 26, 31, 36}, {10, 14, 19, 23, 28, 32}, {10, 14, 19, 23, 28, 34}, {10, 14, 18, 22, 26, 30}, {10, 14, 19, 23, 28, 32}, {10}, {10, 23, 36}, {10, 22, 34}, {10, 20, 30}, {10, 24, 38}, {10, 22, 34}, {10, 22, 34}, {10, 21, 32}, {10, 22, 34}, {10, 22, 34}, {10}, {10, 22, 34}, {10, 20, 31}, {10, 22, 34}, {10, 22, 34}, {10, 22, 34, 37, 45}, {10, 21, 32}, {10, 22, 34}, {10, 13, 22, 25, 34, 37}, {10, 22, 34}, {10, 22, 34, 35}, {10, 21, 32, 35}, {10, 20, 30}, {10, 20, 30, 33}, {10, 21, 32}, {10, 22, 34, 37}, {10, 20, 30, 33}, {10, 22, 34, 37}, {10, 22, 34, 37}, {10, 20, 32, 35, 39}, {10, 16, 22, 28, 34, 40}, {10, 14, 18}, {10, 14, 18}, {10, 22, 34, 37, 38}, {10, 14, 18, 22, 26, 30}, {10, 20, 30, 33}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 27, 32}, {10, 14, 18, 22, 27, 32}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {10, 14, 18, 22, 26, 30}, {5}, {5}, {5}, {5}, {5}};
|
||||
private static final short[] deadEndRoundTimesSum = {0, 20, 40, 75, 110, 147, 191, 238, 288, 326, 371, 419, 469, 519, 564, 610, 657, 704, 751, 798, 847, 891, 936, 978, 1021, 1064, 1100, 1144, 1186, 1228, 1273},
|
||||
badBloodRoundTimesSum = {0, 22, 44, 66, 100, 134, 168, 202, 236, 270, 304, 338, 372, 406, 440, 474, 508, 542, 576, 610, 644, 678, 712, 746, 780, 814, 852, 890, 924, 962, 996},
|
||||
alienArcadiumRoundTimesSum = {0, 19, 41, 60, 88, 118, 150, 181, 216, 248, 286, 324, 364, 404, 440, 486, 524, 556, 588, 618, 654, 686, 720, 750, 782, 792, 828, 862, 892, 930, 964, 998, 1030, 1064, 1098, 1108, 1142, 1173, 1207, 1241, 1286, 1318, 1352, 1389, 1423, 1458, 1493, 1523, 1556, 1588, 1625, 1658, 1695, 1732, 1771, 1811, 1829, 1847, 1885, 1915, 1948, 1978, 2008, 2038, 2068, 2098, 2128, 2158, 2188, 2218, 2248, 2278, 2308, 2338, 2368, 2400, 2432, 2462, 2492, 2522, 2552, 2582, 2612, 2642, 2672, 2702, 2732, 2762, 2792, 2822, 2852, 2882, 2912, 2942, 2972, 3002, 3032, 3062, 3092, 3122, 3152, 3157, 3162, 3167, 3172, 3177};
|
||||
|
||||
|
||||
@Contract(pure = true)
|
||||
public static byte[] get(@NotNull Map map, byte round) {
|
||||
switch (map) {
|
||||
case DEAD_END:
|
||||
return deadEndWaveTimes[round - 1];
|
||||
case BAD_BLOOD:
|
||||
return badBloodWaveTimes[round - 1];
|
||||
case ALIEN_ARCADIUM:
|
||||
return alienArcadiumWaveTimes[round - 1];
|
||||
default:
|
||||
throw new IllegalStateException("Unexpected value: " + map);
|
||||
}
|
||||
}
|
||||
|
||||
public static short getSum(@NotNull Map map, byte round) {
|
||||
short sum;
|
||||
switch (map) {
|
||||
case DEAD_END:
|
||||
sum = deadEndRoundTimesSum[round - 1];
|
||||
break;
|
||||
case BAD_BLOOD:
|
||||
sum = badBloodRoundTimesSum[round - 1];
|
||||
break;
|
||||
case ALIEN_ARCADIUM:
|
||||
sum = alienArcadiumRoundTimesSum[round - 1];
|
||||
break;
|
||||
default:
|
||||
throw new IllegalStateException("Unexpected value: " + map);
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
public static byte getLastWave(@NotNull Map map, byte round) {
|
||||
byte[] aByte = get(map, round);
|
||||
return aByte[aByte.length - 1];
|
||||
}
|
||||
|
||||
}
|
|
@ -1,32 +0,0 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.handlers;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Difficulty;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.GameMode;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.Timer;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.LanguageSupport;
|
||||
import net.minecraftforge.client.event.ClientChatReceivedEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class ChatHandler {
|
||||
private static final Pattern STRIP_COLOR_PATTERN = Pattern.compile("§[0-9A-FK-ORZ]", Pattern.CASE_INSENSITIVE);
|
||||
|
||||
public ChatHandler() {
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void difficultyChange(@NotNull ClientChatReceivedEvent event) {
|
||||
if (!Timer.getInstance().isPresent()) return;
|
||||
String message = STRIP_COLOR_PATTERN.matcher(event.message.getUnformattedText()).replaceAll("").trim();
|
||||
GameMode gameMode = Timer.getInstance().get().getGameMode();
|
||||
|
||||
if (message.contains(":")) return;
|
||||
if (LanguageSupport.containsHard(message)) {
|
||||
gameMode.changeDifficulty(Difficulty.HARD);
|
||||
} else if (LanguageSupport.containsRIP(message)) {
|
||||
gameMode.changeDifficulty(Difficulty.RIP);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.handlers;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.config.ZombiesUtilsConfig;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
|
||||
public class HandlerRegistry {
|
||||
public static void registerAll() {
|
||||
MinecraftForge.EVENT_BUS.register(new ZombiesUtilsConfig());
|
||||
MinecraftForge.EVENT_BUS.register(new RenderGameOverlayHandler());
|
||||
MinecraftForge.EVENT_BUS.register(new TickHandler());
|
||||
MinecraftForge.EVENT_BUS.register(new ChatHandler());
|
||||
MinecraftForge.EVENT_BUS.register(new KeyInputHandler());
|
||||
}
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.handlers;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.config.Hotkeys;
|
||||
import com.github.stachelbeere1248.zombiesutils.config.ZombiesUtilsConfig;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.waves.WaveTiming;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraftforge.event.entity.player.PlayerUseItemEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.gameevent.InputEvent;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
|
||||
|
||||
public class KeyInputHandler {
|
||||
@SubscribeEvent
|
||||
public void onKeyInput(InputEvent.KeyInputEvent event) {
|
||||
if (Keyboard.getEventKeyState() && Minecraft.getMinecraft().currentScreen == null) {
|
||||
Hotkeys hotkeys = ZombiesUtils.getInstance().getHotkeys();
|
||||
if (Keyboard.getEventKey() == hotkeys.getChatMacro().getKeyCode()) {
|
||||
Minecraft.getMinecraft().thePlayer.sendChatMessage(
|
||||
ZombiesUtilsConfig.getChatMacro()
|
||||
);
|
||||
} else if (Keyboard.getEventKey() == hotkeys.getRlSpawn().getKeyCode()) {
|
||||
RenderGameOverlayHandler.toggleRL();
|
||||
WaveTiming.toggleRL();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,131 +0,0 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.handlers;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.config.ZombiesUtilsConfig;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.SLA;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.waves.Waves;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.windows.Room;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.Timer;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.Scoreboard;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.client.gui.ScaledResolution;
|
||||
import net.minecraftforge.client.event.RenderGameOverlayEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class RenderGameOverlayHandler {
|
||||
private static int rl = 0;
|
||||
private final FontRenderer fontRenderer;
|
||||
|
||||
public RenderGameOverlayHandler() {
|
||||
this.fontRenderer = Objects.requireNonNull(Minecraft.getMinecraft().fontRendererObj, "FontRenderer must not be null!");
|
||||
}
|
||||
|
||||
private static String getTimeString(long timerTicks) {
|
||||
final long minutesPart = (timerTicks * 50) / 60000;
|
||||
final long secondsPart = ((timerTicks * 50) % 60000) / 1000;
|
||||
final long tenthSecondsPart = ((timerTicks * 50) % 1000) / 100;
|
||||
return String.format("%d:%02d.%d", minutesPart, secondsPart, tenthSecondsPart);
|
||||
}
|
||||
|
||||
private static String getWaveString(long waveTicks, int wave) {
|
||||
final long minutesPart = (waveTicks * 50) / 60000;
|
||||
final long secondsPart = ((waveTicks * 50) % 60000) / 1000;
|
||||
final long tenthSecondsPart = ((waveTicks * 50) % 1000) / 100;
|
||||
return String.format("W%d %d:%02d.%d", wave, minutesPart, secondsPart, tenthSecondsPart);
|
||||
}
|
||||
|
||||
static void toggleRL() {
|
||||
if (rl == 0) rl = ZombiesUtilsConfig.getWaveOffset();
|
||||
else rl = 0;
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onRenderGameOverlay(RenderGameOverlayEvent.@NotNull Post event) {
|
||||
if (event.type != RenderGameOverlayEvent.ElementType.TEXT) return;
|
||||
Timer.getInstance().ifPresent(timer -> {
|
||||
renderTime(timer.roundTime());
|
||||
renderSpawnTime(
|
||||
Waves.get(
|
||||
timer.getGameMode().getMap(),
|
||||
timer.getRound()
|
||||
),
|
||||
timer.roundTime()
|
||||
);
|
||||
});
|
||||
SLA.getInstance().ifPresent(sla -> {
|
||||
sla.refreshActives();
|
||||
renderSla(sla.getRooms());
|
||||
});
|
||||
}
|
||||
|
||||
private void renderTime(long timerTicks) {
|
||||
if (Scoreboard.isNotZombies()) return;
|
||||
|
||||
final String time = getTimeString(timerTicks);
|
||||
final int width = fontRenderer.getStringWidth(time);
|
||||
|
||||
final ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
|
||||
final int screenWidth = scaledResolution.getScaledWidth();
|
||||
final int screenHeight = scaledResolution.getScaledHeight();
|
||||
|
||||
fontRenderer.drawStringWithShadow(
|
||||
time,
|
||||
screenWidth - width,
|
||||
screenHeight - fontRenderer.FONT_HEIGHT,
|
||||
0xFFFFFF
|
||||
);
|
||||
}
|
||||
|
||||
private void renderSla(Room @NotNull [] rooms) {
|
||||
int y = 0;
|
||||
for (Room room : rooms) {
|
||||
if (ZombiesUtilsConfig.isSlaShortened() && room.getActiveWindowCount() == 0) continue;
|
||||
fontRenderer.drawStringWithShadow(
|
||||
room.getSlaString(),
|
||||
1,
|
||||
1 + y * fontRenderer.FONT_HEIGHT,
|
||||
0xFFFFFF
|
||||
);
|
||||
y++;
|
||||
}
|
||||
}
|
||||
|
||||
private void renderSpawnTime(byte @NotNull [] waveTimes, short roundTicks) {
|
||||
if (Scoreboard.isNotZombies() || !ZombiesUtilsConfig.getSST()) return;
|
||||
|
||||
final int length = waveTimes.length + 1;
|
||||
int heightIndex = 0;
|
||||
int color = 0xFFFF55;
|
||||
|
||||
for (byte waveTime : waveTimes) {
|
||||
int clonedColor = color;
|
||||
final short waveTicks = (short) ((waveTime * 20) + rl);
|
||||
|
||||
if (roundTicks > waveTicks) {
|
||||
if (ZombiesUtilsConfig.isSpawntimeNotShortened()) clonedColor = 0x555555;
|
||||
else {
|
||||
heightIndex++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
final String time = getWaveString(waveTicks, heightIndex + 1);
|
||||
final int width = fontRenderer.getStringWidth(time);
|
||||
final ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
|
||||
final int screenWidth = scaledResolution.getScaledWidth();
|
||||
final int screenHeight = scaledResolution.getScaledHeight();
|
||||
|
||||
fontRenderer.drawStringWithShadow(
|
||||
time,
|
||||
screenWidth - width,
|
||||
screenHeight - fontRenderer.FONT_HEIGHT * (length - heightIndex),
|
||||
clonedColor
|
||||
);
|
||||
if (clonedColor != 0x555555) color = 0xAAAAAA;
|
||||
heightIndex++;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,21 +0,0 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.handlers;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.Timer;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.monster.EntityZombie;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class Round1Correction {
|
||||
|
||||
@SubscribeEvent
|
||||
public void onWaveSpawn(@NotNull EntityJoinWorldEvent event) {
|
||||
final Entity entity = event.entity;
|
||||
if (entity instanceof EntityZombie) {
|
||||
Timer.getInstance().ifPresent(Timer::correctRn);
|
||||
MinecraftForge.EVENT_BUS.unregister(this);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,96 +0,0 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.mixin;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.Timer;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.LanguageSupport;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.Scoreboard;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.network.NetHandlerPlayClient;
|
||||
import net.minecraft.network.play.server.S29PacketSoundEffect;
|
||||
import net.minecraft.network.play.server.S45PacketTitle;
|
||||
import net.minecraft.util.ChatComponentText;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(NetHandlerPlayClient.class)
|
||||
public class MixinNetHandlerPlayClient {
|
||||
@Unique
|
||||
private boolean zombies_utils$alienUfoOpened;
|
||||
|
||||
@Inject(method = "handleSoundEffect", at = @At(value = "HEAD"))
|
||||
private void handleSound(S29PacketSoundEffect packetIn, CallbackInfo ci) {
|
||||
zombies_utils$handleSound(packetIn);
|
||||
}
|
||||
|
||||
@Inject(method = "handleTitle", at = @At(value = "HEAD"))
|
||||
private void handleTitle(S45PacketTitle packetIn, CallbackInfo ci) {
|
||||
zombies_utils$handleTitle(packetIn);
|
||||
}
|
||||
|
||||
@Unique
|
||||
private void zombies_utils$handleSound(@NotNull S29PacketSoundEffect packet) {
|
||||
if (Scoreboard.isNotZombies()) return;
|
||||
final String soundEffect = packet.getSoundName();
|
||||
if (!(
|
||||
soundEffect.equals("mob.wither.spawn")
|
||||
|| (soundEffect.equals("mob.guardian.curse") && !zombies_utils$alienUfoOpened)
|
||||
)) return;
|
||||
zombies_utils$alienUfoOpened = soundEffect.equals("mob.guardian.curse");
|
||||
try {
|
||||
if (Timer.getInstance().isPresent()) {
|
||||
final Timer running = Timer.getInstance().get();
|
||||
final byte round = Scoreboard.getRound();
|
||||
|
||||
if (round == 0) {
|
||||
if (Scoreboard.getLineCount() < 13) Timer.instance = new Timer(
|
||||
Scoreboard.getServerNumber().orElseThrow(Timer.TimerException.ServerNumberException::new),
|
||||
Scoreboard.getMap().orElseThrow(Timer.TimerException.MapException::new),
|
||||
round
|
||||
);
|
||||
} else if (!running.equalsServerOrNull(Scoreboard.getServerNumber().orElse(null))) {
|
||||
Timer.instance = new Timer(
|
||||
Scoreboard.getServerNumber().orElseThrow(Timer.TimerException.ServerNumberException::new),
|
||||
Scoreboard.getMap().orElseThrow(Timer.TimerException.MapException::new),
|
||||
round
|
||||
);
|
||||
} else running.split(round);
|
||||
} else Timer.instance = new Timer(
|
||||
Scoreboard.getServerNumber().orElseThrow(Timer.TimerException.ServerNumberException::new),
|
||||
Scoreboard.getMap().orElseThrow(Timer.TimerException.MapException::new),
|
||||
Scoreboard.getRound()
|
||||
);
|
||||
} catch (Timer.TimerException e) {
|
||||
Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§cFailed to start or split timer.\nData parsing error. Blame scoreboard."));
|
||||
ZombiesUtils.getInstance().getLogger().warn(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Unique
|
||||
private void zombies_utils$handleTitle(@NotNull S45PacketTitle packet) {
|
||||
if (packet.getType() != S45PacketTitle.Type.TITLE) return;
|
||||
final String message = packet.getMessage().getUnformattedText().trim();
|
||||
|
||||
Timer.getInstance().ifPresent(timer -> {
|
||||
if (Scoreboard.isNotZombies()) return;
|
||||
|
||||
if (LanguageSupport.isWin(message)) {
|
||||
switch (timer.getGameMode().getMap()) {
|
||||
case DEAD_END:
|
||||
case BAD_BLOOD:
|
||||
timer.split((byte) 30);
|
||||
Timer.dropInstances();
|
||||
break;
|
||||
case ALIEN_ARCADIUM:
|
||||
timer.split((byte) 105);
|
||||
Timer.dropInstances();
|
||||
break;
|
||||
}
|
||||
} else if (LanguageSupport.isLoss(message)) Timer.dropInstances();
|
||||
});
|
||||
}
|
||||
|
||||
}
|
|
@ -1,80 +0,0 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.timer;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.recorder.Category;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.recorder.files.CategoryFile;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.util.ChatComponentText;
|
||||
import org.jetbrains.annotations.Contract;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class RecordManager {
|
||||
private static final String bar = "§l§a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬";
|
||||
|
||||
public static void compareSegment(byte round, short roundTime, @NotNull Category category) throws IndexOutOfBoundsException {
|
||||
String segmentMessage = bar +
|
||||
"\n§e Category: §d" + category.getName();
|
||||
|
||||
|
||||
@SuppressWarnings("OptionalGetWithoutIsPresent") final CategoryFile categoryFile = category.getByGameMode(Timer.getInstance().get().getGameMode());
|
||||
short bestSegment = categoryFile.getBestSegment(round);
|
||||
if (bestSegment == (short) 0) {
|
||||
categoryFile.setBestSegment(round, roundTime);
|
||||
|
||||
segmentMessage += "\n§e§l***§6§l NEW BEST SEGMENT! §e§l***";
|
||||
final String timeString = formattedTime(roundTime);
|
||||
segmentMessage += "\n§cRound " + round + "§e took §a" + timeString + "§e!";
|
||||
} else {
|
||||
if (roundTime < bestSegment) {
|
||||
segmentMessage += "\n§e§l***§6§l NEW BEST SEGMENT! §e§l***";
|
||||
categoryFile.setBestSegment(round, roundTime);
|
||||
}
|
||||
final String timeString = formattedTime(roundTime);
|
||||
segmentMessage += "\n§cRound " + round + "§e took §a" + timeString + " §9" + formattedDelta(roundTime, bestSegment);
|
||||
}
|
||||
segmentMessage += "\n" + bar;
|
||||
Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(segmentMessage));
|
||||
}
|
||||
|
||||
public static void compareBest(byte round, int gameTime, @NotNull Category category) throws IndexOutOfBoundsException {
|
||||
String bestMessage = bar +
|
||||
"\n§e Category: §d" + category.getName();
|
||||
|
||||
@SuppressWarnings("OptionalGetWithoutIsPresent") final CategoryFile categoryFile = category.getByGameMode(Timer.getInstance().get().getGameMode());
|
||||
int personalBest = categoryFile.getPersonalBest(round);
|
||||
if (personalBest == 0) {
|
||||
categoryFile.setPersonalBest(round, gameTime);
|
||||
|
||||
bestMessage += "\n§e§l***§6§l NEW PERSONAL BEST! §e§l***";
|
||||
final String timeString = formattedTime(gameTime);
|
||||
bestMessage += "\n§cRound " + round + "§e finished at §a" + timeString + "§e!";
|
||||
} else {
|
||||
if (gameTime < personalBest) {
|
||||
bestMessage += "\n§e§l***§6§l NEW PERSONAL BEST! §e§l***";
|
||||
categoryFile.setPersonalBest(round, gameTime);
|
||||
}
|
||||
|
||||
final String timeString = formattedTime(gameTime);
|
||||
bestMessage += "\n§cRound " + round + "§e finished at §a" + timeString + " §9" + formattedDelta(gameTime, personalBest);
|
||||
}
|
||||
bestMessage += "\n" + bar;
|
||||
Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(bestMessage));
|
||||
}
|
||||
|
||||
private static String formattedTime(int gameTime) {
|
||||
gameTime *= 50;
|
||||
return String.format("%d:%02d.%d%d",
|
||||
gameTime / 60000,
|
||||
(gameTime % 60000) / 1000,
|
||||
(gameTime % 1000) / 100,
|
||||
(gameTime % 100) / 10
|
||||
);
|
||||
}
|
||||
|
||||
@Contract(pure = true)
|
||||
private static @NotNull String formattedDelta(int newTime, int prevTime) {
|
||||
double delta = (double) (newTime - prevTime) / 20;
|
||||
if (delta < 0) {
|
||||
return String.valueOf(delta);
|
||||
} else return ("+" + delta);
|
||||
}
|
||||
}
|
|
@ -1,152 +0,0 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.timer;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.config.ZombiesUtilsConfig;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.GameMode;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Map;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.SLA;
|
||||
import com.github.stachelbeere1248.zombiesutils.handlers.Round1Correction;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.recorder.Category;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.recorder.files.GameFile;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.util.ChatComponentText;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public class Timer {
|
||||
|
||||
public static Timer instance;
|
||||
private final GameMode gameMode;
|
||||
private final String serverNumber;
|
||||
private final GameFile gameFile;
|
||||
public Category category;
|
||||
private long savedTotalWorldTime;
|
||||
private int passedRoundsTickSum = 0;
|
||||
private boolean pbTracking = false;
|
||||
private int round;
|
||||
private boolean r1Corrected = false;
|
||||
|
||||
/**
|
||||
* @param serverNumber The game's server the timer should be bound to.
|
||||
* @param map The map the timer should be started for.
|
||||
* @param round If available, round to begin splitting.
|
||||
*/
|
||||
public Timer(@NotNull String serverNumber, @NotNull Map map, byte round) throws TimerException.ServerNumberException {
|
||||
this.savedTotalWorldTime = getCurrentTotalWorldTime();
|
||||
if (!serverNumber.trim().isEmpty()) this.serverNumber = serverNumber.trim();
|
||||
else throw new Timer.TimerException.ServerNumberException();
|
||||
|
||||
this.category = new Category();
|
||||
this.gameFile = new GameFile(serverNumber.trim(), map);
|
||||
|
||||
this.gameMode = new GameMode(map);
|
||||
this.round = round;
|
||||
if (ZombiesUtilsConfig.isSlaToggled()) SLA.instance = new SLA(map);
|
||||
|
||||
MinecraftForge.EVENT_BUS.register(new Round1Correction());
|
||||
}
|
||||
|
||||
public static Optional<Timer> getInstance() {
|
||||
return Optional.ofNullable(instance);
|
||||
}
|
||||
|
||||
/**
|
||||
* Call to invalidate {@link #instance} to trigger the garbage collector
|
||||
*/
|
||||
public static void dropInstances() {
|
||||
instance = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* The main splitting function.
|
||||
* Cancels on the second occurring sound-effect, important for {@link RecordManager} to not override values incorrectly.
|
||||
*
|
||||
* @param passedRound The round that has been passed.
|
||||
*/
|
||||
public void split(byte passedRound) {
|
||||
final int gameTime = gameTime();
|
||||
final short roundTime = (short) (gameTime - passedRoundsTickSum);
|
||||
|
||||
if ((round == passedRound) || (passedRound == 0) || (roundTime < 100)) {
|
||||
ZombiesUtils.getInstance().getLogger().debug("SPLIT CANCELLED");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
record(passedRound, roundTime, gameTime);
|
||||
} catch (Exception e) {
|
||||
ZombiesUtils.getInstance().getLogger().error(ExceptionUtils.getStackTrace(e));
|
||||
Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("Error saving splits"));
|
||||
}
|
||||
|
||||
passedRoundsTickSum = gameTime;
|
||||
round = passedRound;
|
||||
}
|
||||
|
||||
public void correctRn() {
|
||||
if (r1Corrected) return;
|
||||
savedTotalWorldTime = getCurrentTotalWorldTime() - 200L;
|
||||
r1Corrected = true;
|
||||
}
|
||||
|
||||
private void record(byte passedRound, short roundTime, int gameTime) {
|
||||
if (passedRound == (byte) 1) pbTracking = true;
|
||||
|
||||
try {
|
||||
RecordManager.compareSegment(passedRound, roundTime, category);
|
||||
if (pbTracking) RecordManager.compareBest(passedRound, gameTime, category);
|
||||
|
||||
gameFile.setSegment(passedRound, roundTime);
|
||||
} catch (IndexOutOfBoundsException exception) {
|
||||
Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
|
||||
String.format("Split not recorded. (invalid round parsed from scoreboard: %s)", passedRound)
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
private long getCurrentTotalWorldTime() {
|
||||
if (Minecraft.getMinecraft() == null) return 0;
|
||||
if (Minecraft.getMinecraft().theWorld == null) return 0;
|
||||
return Minecraft.getMinecraft().theWorld.getTotalWorldTime();
|
||||
}
|
||||
|
||||
public int gameTime() {
|
||||
return (int) (getCurrentTotalWorldTime() - savedTotalWorldTime);
|
||||
}
|
||||
|
||||
public short roundTime() {
|
||||
return (short) (gameTime() - passedRoundsTickSum);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param serverNumber Servernumber to be compared
|
||||
* @return false, if and only if input exists and is unequal to {@link #serverNumber}
|
||||
*/
|
||||
public boolean equalsServerOrNull(String serverNumber) {
|
||||
return (serverNumber == null || serverNumber.equals(this.serverNumber) || serverNumber.isEmpty());
|
||||
}
|
||||
|
||||
public void setCategory(Category category) {
|
||||
this.category = category;
|
||||
}
|
||||
|
||||
public byte getRound() {
|
||||
return (byte) (round + 1);
|
||||
}
|
||||
|
||||
public GameMode getGameMode() {
|
||||
return gameMode;
|
||||
}
|
||||
|
||||
public static abstract class TimerException extends Exception {
|
||||
|
||||
public static class MapException extends TimerException {
|
||||
}
|
||||
|
||||
public static class ServerNumberException extends TimerException {
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.timer.recorder;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.config.ZombiesUtilsConfig;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Difficulty;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.GameMode;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Map;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.Timer;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.recorder.files.CategoryFile;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class Category {
|
||||
private static String selectedCategory = ZombiesUtilsConfig.getDefaultCategory();
|
||||
public final CategoryFile[] categoryFiles = new CategoryFile[7];
|
||||
private final String name;
|
||||
|
||||
public Category() {
|
||||
final File category;
|
||||
if (ZombiesUtils.isHypixel()) category = new File(new File("zombies", "splits"), selectedCategory);
|
||||
else category = new File(new File("zombies", "practise-splits"), selectedCategory);
|
||||
categoryFiles[0] = new CategoryFile(category, new GameMode(Map.DEAD_END));
|
||||
categoryFiles[1] = new CategoryFile(category, new GameMode(Map.DEAD_END, Difficulty.HARD));
|
||||
categoryFiles[2] = new CategoryFile(category, new GameMode(Map.DEAD_END, Difficulty.RIP));
|
||||
|
||||
categoryFiles[3] = new CategoryFile(category, new GameMode(Map.BAD_BLOOD));
|
||||
categoryFiles[4] = new CategoryFile(category, new GameMode(Map.BAD_BLOOD, Difficulty.HARD));
|
||||
categoryFiles[5] = new CategoryFile(category, new GameMode(Map.BAD_BLOOD, Difficulty.RIP));
|
||||
|
||||
categoryFiles[6] = new CategoryFile(category, new GameMode(Map.ALIEN_ARCADIUM));
|
||||
this.name = Category.selectedCategory;
|
||||
}
|
||||
|
||||
public static void setSelectedCategory(String selectedCategory) {
|
||||
Category.selectedCategory = selectedCategory;
|
||||
Timer.getInstance().ifPresent(timer -> timer.setCategory(new Category()));
|
||||
}
|
||||
|
||||
public static String[] getCategories() {
|
||||
File dir;
|
||||
if (ZombiesUtils.isHypixel()) dir = new File("zombies" + File.separator + "splits");
|
||||
else dir = new File("zombies" + File.separator + "practise-splits");
|
||||
if (dir.isDirectory()) return dir.list();
|
||||
else return new String[0];
|
||||
}
|
||||
|
||||
public CategoryFile getByGameMode(@NotNull GameMode gameMode) {
|
||||
if (gameMode.is(Map.DEAD_END, Difficulty.NORMAL)) return categoryFiles[0];
|
||||
else if (gameMode.is(Map.BAD_BLOOD, Difficulty.NORMAL)) return categoryFiles[3];
|
||||
else if (gameMode.is(Map.ALIEN_ARCADIUM, Difficulty.NORMAL)) return categoryFiles[6];
|
||||
|
||||
else if (gameMode.is(Map.DEAD_END, Difficulty.HARD)) return categoryFiles[1];
|
||||
else if (gameMode.is(Map.DEAD_END, Difficulty.RIP)) return categoryFiles[2];
|
||||
|
||||
else if (gameMode.is(Map.BAD_BLOOD, Difficulty.HARD)) return categoryFiles[4];
|
||||
else if (gameMode.is(Map.BAD_BLOOD, Difficulty.RIP)) return categoryFiles[5];
|
||||
else throw new IllegalStateException("Unexpected value: " + gameMode);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.timer.recorder;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public abstract class SplitsFile extends File {
|
||||
public SplitsFile(String parent, @NotNull String child) {
|
||||
super(parent, child);
|
||||
}
|
||||
|
||||
public SplitsFile(File category, String child) {
|
||||
super(category, child);
|
||||
}
|
||||
|
||||
}
|
22
src/main/java/xyz/stachel/zombiesutils/ResourceLoader.java
Normal file
22
src/main/java/xyz/stachel/zombiesutils/ResourceLoader.java
Normal file
|
@ -0,0 +1,22 @@
|
|||
package com.github.stachelbeere1248.zombiesutils;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonParser;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.Reader;
|
||||
import java.util.Optional;
|
||||
|
||||
public class ResourceLoader {
|
||||
public static Optional<JsonElement> readJsonResource(final String resourcePath) {
|
||||
ResourceLocation resourceLocation = new ResourceLocation("zombiesutils", resourcePath);
|
||||
try (Reader reader = new InputStreamReader(Minecraft.getMinecraft().getResourceManager().getResource(resourceLocation).getInputStream())) {
|
||||
return Optional.ofNullable(new JsonParser().parse(reader));
|
||||
} catch (Exception e) {
|
||||
ZombiesUtils.getInstance().getLogger().error(e.fillInStackTrace());
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -3,9 +3,10 @@ package com.github.stachelbeere1248.zombiesutils;
|
|||
import com.github.stachelbeere1248.zombiesutils.commands.CommandRegistry;
|
||||
import com.github.stachelbeere1248.zombiesutils.config.Hotkeys;
|
||||
import com.github.stachelbeere1248.zombiesutils.config.ZombiesUtilsConfig;
|
||||
import com.github.stachelbeere1248.zombiesutils.handlers.HandlerRegistry;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.GameData;
|
||||
import com.github.stachelbeere1248.zombiesutils.handlers.Handlers;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.GameManager;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.common.config.Configuration;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
|
||||
|
@ -17,10 +18,16 @@ import org.jetbrains.annotations.NotNull;
|
|||
public class ZombiesUtils {
|
||||
private static ZombiesUtils instance;
|
||||
private final Hotkeys hotkeys;
|
||||
private final GameManager gameManager;
|
||||
private ZombiesUtilsConfig config;
|
||||
private Handlers handlers;
|
||||
private Logger logger;
|
||||
private GameData gameData;
|
||||
|
||||
public ZombiesUtils() {
|
||||
hotkeys = new Hotkeys();
|
||||
gameManager = new GameManager();
|
||||
|
||||
instance = this;
|
||||
}
|
||||
|
||||
|
@ -28,21 +35,26 @@ public class ZombiesUtils {
|
|||
return instance;
|
||||
}
|
||||
|
||||
public static boolean isHypixel() {
|
||||
String ip = Minecraft.getMinecraft().getCurrentServerData().serverIP;
|
||||
return (ip.equals("localhost") || ip.matches("(.+\\.)?(hypixel\\.net)(:25565)?"));
|
||||
}
|
||||
|
||||
@Mod.EventHandler
|
||||
public void preInit(@NotNull FMLPreInitializationEvent event) {
|
||||
logger = event.getModLog();
|
||||
ZombiesUtilsConfig.config = new Configuration(
|
||||
event.getSuggestedConfigurationFile(),
|
||||
"1.2.4"
|
||||
this.logger = event.getModLog();
|
||||
this.config = new ZombiesUtilsConfig(new Configuration(
|
||||
event.getSuggestedConfigurationFile())
|
||||
);
|
||||
ZombiesUtilsConfig.load();
|
||||
}
|
||||
|
||||
@Mod.EventHandler
|
||||
public void init(FMLInitializationEvent event) {
|
||||
HandlerRegistry.registerAll();
|
||||
handlers = new Handlers();
|
||||
handlers.registerAll();
|
||||
CommandRegistry.registerAll();
|
||||
hotkeys.registerAll();
|
||||
gameData = new GameData();
|
||||
}
|
||||
|
||||
public Logger getLogger() {
|
||||
|
@ -52,7 +64,20 @@ public class ZombiesUtils {
|
|||
public Hotkeys getHotkeys() {
|
||||
return hotkeys;
|
||||
}
|
||||
public static boolean isHypixel() {
|
||||
return Minecraft.getMinecraft().getCurrentServerData().serverIP.matches("(.+\\.)?(hypixel\\.net)(:25565)?");
|
||||
|
||||
public Handlers getHandlers() {
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public ZombiesUtilsConfig getConfig() {
|
||||
return config;
|
||||
}
|
||||
|
||||
public GameManager getGameManager() {
|
||||
return gameManager;
|
||||
}
|
||||
|
||||
public GameData getGameData() {
|
||||
return gameData;
|
||||
}
|
||||
}
|
|
@ -1,19 +1,20 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.commands;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.Timer;
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.recorder.Category;
|
||||
import net.minecraft.command.CommandBase;
|
||||
import net.minecraft.command.CommandException;
|
||||
import net.minecraft.command.ICommand;
|
||||
import net.minecraft.command.ICommandSender;
|
||||
import net.minecraft.command.WrongUsageException;
|
||||
import net.minecraft.util.BlockPos;
|
||||
import net.minecraft.util.ChatComponentText;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class CategoryCommand extends CommandBase {
|
||||
public class CategoryCommand implements ICommand {
|
||||
public CategoryCommand() {
|
||||
|
||||
}
|
||||
|
@ -28,15 +29,21 @@ public class CategoryCommand extends CommandBase {
|
|||
return "/category <category-name>";
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getCommandAliases() {
|
||||
return Arrays.asList("runCategory", "cat");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processCommand(ICommandSender sender, String @NotNull [] args) throws CommandException {
|
||||
if (args.length == 0) throw new WrongUsageException("Please enter a name for the category");
|
||||
else {
|
||||
String cat = args[0];
|
||||
if (cat.contains(File.separator))
|
||||
throw new WrongUsageException("Your name must not contain '" + File.separator + "' as this is the systems separator character for folder" + File.separator + "subfolder");
|
||||
throw new WrongUsageException("Your name must not contain '" + File.separator + "' as this is the systems separator character for folder" + File.separator + "sub-folder");
|
||||
Category.setSelectedCategory(cat);
|
||||
Timer.getInstance().ifPresent(timer -> timer.setCategory(new Category()));
|
||||
ZombiesUtils.getInstance().getGameManager().getGame().ifPresent(game -> game.setCategory(new Category()));
|
||||
sender.addChatMessage(new ChatComponentText("§eSet category to §c" + cat));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -45,8 +52,18 @@ public class CategoryCommand extends CommandBase {
|
|||
return Arrays.asList(Category.getCategories());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isUsernameIndex(String[] args, int index) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canCommandSenderUseCommand(ICommandSender sender) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(@NotNull ICommand command) {
|
||||
return this.getCommandName().compareTo(command.getCommandName());
|
||||
}
|
||||
}
|
|
@ -20,13 +20,13 @@ public class QuickZombiesCommand extends CommandBase {
|
|||
|
||||
@Override
|
||||
public String getCommandUsage(ICommandSender sender) {
|
||||
return "/qz <de|bb|aa>";
|
||||
return "/qz <de|bb|aa|p>";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processCommand(ICommandSender sender, String @NotNull [] args) throws CommandException {
|
||||
if (args.length == 0) throw new WrongUsageException(
|
||||
"[Missing option] options: de, bb, aa");
|
||||
"[Missing option] options: de, bb, aa, p");
|
||||
else switch (args[0]) {
|
||||
case "de":
|
||||
Minecraft.getMinecraft().thePlayer.sendChatMessage("/play arcade_zombies_dead_end");
|
||||
|
@ -37,9 +37,12 @@ public class QuickZombiesCommand extends CommandBase {
|
|||
case "aa":
|
||||
Minecraft.getMinecraft().thePlayer.sendChatMessage("/play arcade_zombies_alien_arcadium");
|
||||
break;
|
||||
case "p":
|
||||
Minecraft.getMinecraft().thePlayer.sendChatMessage("/play arcade_zombies_prison");
|
||||
break;
|
||||
default:
|
||||
throw new WrongUsageException(
|
||||
"[Invalid option] options: de, bb, aa", args[0]);
|
||||
"[Invalid option] options: de, bb, aa, p", args[0]);
|
||||
|
||||
}
|
||||
}
|
|
@ -2,7 +2,7 @@ package com.github.stachelbeere1248.zombiesutils.commands;
|
|||
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Map;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.sla.QuickSLA;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.SLA;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.windows.SLA;
|
||||
import net.minecraft.command.*;
|
||||
import net.minecraft.util.BlockPos;
|
||||
import net.minecraft.util.ChatComponentText;
|
||||
|
@ -21,7 +21,7 @@ public class SlaCommand extends CommandBase {
|
|||
|
||||
@Override
|
||||
public String getCommandUsage(ICommandSender sender) {
|
||||
return "/sla off\n/sla offset [x] [x] [x]\n/sla rotate\n/sla mirror\n/sla map <de|bb|aa>\n/sla quick";
|
||||
return "/sla off\n/sla offset [x] [x] [x]\n/sla rotate\n/sla mirror\n/sla map <de|bb|aa|p>\n/sla quick";
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -83,9 +83,12 @@ public class SlaCommand extends CommandBase {
|
|||
case "aa":
|
||||
SLA.instance = new SLA(Map.ALIEN_ARCADIUM);
|
||||
break;
|
||||
case "p":
|
||||
SLA.instance = new SLA(Map.PRISON);
|
||||
break;
|
||||
default:
|
||||
throw new WrongUsageException(
|
||||
"[Invalid option] options: de, bb, aa", args[1]);
|
||||
"[Invalid option] options: de, bb, aa, p", args[1]);
|
||||
}
|
||||
break;
|
||||
case "quick":
|
||||
|
@ -119,12 +122,12 @@ public class SlaCommand extends CommandBase {
|
|||
List<String> options = new ArrayList<>();
|
||||
if (args.length == 1) options.addAll(Arrays.asList("off", "offset", "rotate", "mirror", "map", "quick"));
|
||||
else {
|
||||
if (args.length > 1) switch (args[0]) {
|
||||
if (args.length >= 2) switch (args[0]) {
|
||||
case "offset":
|
||||
if (args.length < 5) options.add("0");
|
||||
break;
|
||||
case "map":
|
||||
options.addAll(Arrays.asList("de", "bb", "aa"));
|
||||
options.addAll(Arrays.asList("de", "bb", "aa", "p"));
|
||||
break;
|
||||
case "mirror":
|
||||
options.addAll(Arrays.asList("x", "z"));
|
|
@ -1,6 +1,9 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.commands;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.Timer;
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.InvalidMapException;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.ScoardboardException;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.Scoreboard;
|
||||
import net.minecraft.command.*;
|
||||
import net.minecraft.util.BlockPos;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
@ -29,18 +32,24 @@ public class ZombiesUtilsCommand extends CommandBase {
|
|||
case "timer":
|
||||
switch (args[1]) {
|
||||
case "kill":
|
||||
Timer.dropInstances();
|
||||
String serverNumber = Scoreboard.getServerNumber().orElse("");
|
||||
if (args.length == 3) serverNumber = args[2];
|
||||
ZombiesUtils.getInstance().getGameManager().endGame(serverNumber, false);
|
||||
break;
|
||||
case "killall":
|
||||
ZombiesUtils.getInstance().getGameManager().killAll();
|
||||
case "split":
|
||||
try {
|
||||
Timer.getInstance().ifPresent(timer -> timer.split(Byte.parseByte(args[2])));
|
||||
ZombiesUtils.getInstance().getGameManager().splitOrNew(Integer.parseInt(args[2]));
|
||||
} catch (NumberFormatException | NullPointerException ignored) {
|
||||
throw new NumberInvalidException("t", args[2]);
|
||||
} catch (ScoardboardException | InvalidMapException e) {
|
||||
ZombiesUtils.getInstance().getLogger().error(e.getStackTrace());
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new WrongUsageException(
|
||||
"[Invalid option] options: kill, split", args[0]);
|
||||
"[Invalid option] options: kill, killall, split", args[0]);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -52,12 +61,24 @@ public class ZombiesUtilsCommand extends CommandBase {
|
|||
@Override
|
||||
public List<String> addTabCompletionOptions(ICommandSender sender, String @NotNull [] args, BlockPos blockPos) {
|
||||
if (args.length == 1) return new ArrayList<>(Collections.singleton("timer"));
|
||||
switch (args[0]) {
|
||||
case "timer":
|
||||
return new ArrayList<>(Arrays.asList("kill", "split"));
|
||||
default:
|
||||
return Collections.emptyList();
|
||||
}
|
||||
else if (args.length == 2) {
|
||||
switch (args[0]) {
|
||||
case "timer":
|
||||
return new ArrayList<>(Arrays.asList("kill", "killall", "split"));
|
||||
default:
|
||||
return Collections.emptyList();
|
||||
}
|
||||
} else if (args.length == 3) {
|
||||
switch (args[0]) {
|
||||
case "timer":
|
||||
switch (args[1]) {
|
||||
case "kill":
|
||||
return new ArrayList<>(ZombiesUtils.getInstance().getGameManager().getGames());
|
||||
}
|
||||
default:
|
||||
return Collections.emptyList();
|
||||
}
|
||||
} else return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
|
@ -0,0 +1,244 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.config;
|
||||
|
||||
import net.minecraftforge.common.config.ConfigCategory;
|
||||
import net.minecraftforge.common.config.ConfigElement;
|
||||
import net.minecraftforge.common.config.Property;
|
||||
import net.minecraftforge.fml.client.config.ConfigGuiType;
|
||||
import net.minecraftforge.fml.client.config.GuiConfigEntries;
|
||||
import net.minecraftforge.fml.client.config.GuiEditArrayEntries;
|
||||
import net.minecraftforge.fml.client.config.IConfigElement;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class CustomConfigElement implements IConfigElement {
|
||||
|
||||
private final String name;
|
||||
private final boolean isProperty;
|
||||
private Property prop;
|
||||
private ConfigCategory category;
|
||||
|
||||
public CustomConfigElement(String name, Property prop) {
|
||||
this.prop = prop;
|
||||
this.isProperty = true;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public CustomConfigElement(String name, ConfigCategory category) {
|
||||
this.category = category;
|
||||
this.isProperty = false;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public static ConfigGuiType getType(Property prop) {
|
||||
return prop.getType() == Property.Type.BOOLEAN ? ConfigGuiType.BOOLEAN : prop.getType() == Property.Type.DOUBLE ? ConfigGuiType.DOUBLE :
|
||||
prop.getType() == Property.Type.INTEGER ? ConfigGuiType.INTEGER : prop.getType() == Property.Type.COLOR ? ConfigGuiType.COLOR :
|
||||
prop.getType() == Property.Type.MOD_ID ? ConfigGuiType.MOD_ID : ConfigGuiType.STRING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<IConfigElement> getChildElements() {
|
||||
if (!isProperty) {
|
||||
List<IConfigElement> elements = new ArrayList<>();
|
||||
|
||||
for (Property property : category.getOrderedValues()) {
|
||||
ConfigElement temp = new ConfigElement(property);
|
||||
if (temp.showInGui())
|
||||
elements.add(temp);
|
||||
}
|
||||
return elements;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isProperty() {
|
||||
return isProperty;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<? extends GuiConfigEntries.IConfigEntry> getConfigEntryClass() {
|
||||
return isProperty ? prop.getConfigEntryClass() : category.getConfigEntryClass();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<? extends GuiEditArrayEntries.IArrayEntry> getArrayEntryClass() {
|
||||
return isProperty ? prop.getArrayEntryClass() : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getQualifiedName() {
|
||||
return isProperty ? prop.getName() : category.getQualifiedName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConfigGuiType getType() {
|
||||
return isProperty ? getType(this.prop) : ConfigGuiType.CONFIG_CATEGORY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isList() {
|
||||
return isProperty && prop.isList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isListLengthFixed() {
|
||||
return isProperty && prop.isListLengthFixed();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxListLength() {
|
||||
return isProperty ? prop.getMaxListLength() : -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getComment() {
|
||||
return isProperty ? prop.comment : category.getComment();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDefault() {
|
||||
return !isProperty || prop.isDefault();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setToDefault() {
|
||||
if (isProperty)
|
||||
prop.setToDefault();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean requiresWorldRestart() {
|
||||
return isProperty ? prop.requiresWorldRestart() : category.requiresWorldRestart();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean showInGui() {
|
||||
return isProperty ? prop.showInGui() : category.showInGui();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean requiresMcRestart() {
|
||||
return isProperty ? prop.requiresMcRestart() : category.requiresMcRestart();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getValidValues() {
|
||||
return isProperty ? prop.getValidValues() : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLanguageKey() {
|
||||
return isProperty ? prop.getLanguageKey() : category.getLanguagekey();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getDefault() {
|
||||
return isProperty ? prop.getDefault() : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] getDefaults() {
|
||||
if (isProperty) {
|
||||
String[] aVal = prop.getDefaults();
|
||||
return getObjects(aVal);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private Object[] getObjects(String[] aVal) {
|
||||
if (prop.getType() == Property.Type.BOOLEAN) {
|
||||
Boolean[] ba = new Boolean[aVal.length];
|
||||
for (int i = 0; i < aVal.length; i++)
|
||||
ba[i] = Boolean.valueOf(aVal[i]);
|
||||
return ba;
|
||||
} else if (prop.getType() == Property.Type.DOUBLE) {
|
||||
Double[] da = new Double[aVal.length];
|
||||
for (int i = 0; i < aVal.length; i++)
|
||||
da[i] = Double.valueOf(aVal[i]);
|
||||
return da;
|
||||
} else if (prop.getType() == Property.Type.INTEGER) {
|
||||
Integer[] ia = new Integer[aVal.length];
|
||||
for (int i = 0; i < aVal.length; i++)
|
||||
ia[i] = Integer.valueOf(aVal[i]);
|
||||
return ia;
|
||||
} else
|
||||
return aVal;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pattern getValidationPattern() {
|
||||
return isProperty ? prop.getValidationPattern() : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object get() {
|
||||
return isProperty ? prop.getString() : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] getList() {
|
||||
if (isProperty) {
|
||||
String[] aVal = prop.getStringList();
|
||||
return getObjects(aVal);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(Object value) {
|
||||
if (isProperty) {
|
||||
if (prop.getType() == Property.Type.BOOLEAN)
|
||||
prop.set(Boolean.parseBoolean(value.toString()));
|
||||
else if (prop.getType() == Property.Type.DOUBLE)
|
||||
prop.set(Double.parseDouble(value.toString()));
|
||||
else if (prop.getType() == Property.Type.INTEGER)
|
||||
prop.set(Integer.parseInt(value.toString()));
|
||||
else
|
||||
prop.set(value.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(Object[] aVal) {
|
||||
if (isProperty) {
|
||||
if (prop.getType() == Property.Type.BOOLEAN) {
|
||||
boolean[] ba = new boolean[aVal.length];
|
||||
for (int i = 0; i < aVal.length; i++)
|
||||
ba[i] = Boolean.parseBoolean(aVal[i].toString());
|
||||
prop.set(ba);
|
||||
} else if (prop.getType() == Property.Type.DOUBLE) {
|
||||
double[] da = new double[aVal.length];
|
||||
for (int i = 0; i < aVal.length; i++)
|
||||
da[i] = Double.parseDouble(aVal[i].toString());
|
||||
prop.set(da);
|
||||
} else if (prop.getType() == Property.Type.INTEGER) {
|
||||
int[] ia = new int[aVal.length];
|
||||
for (int i = 0; i < aVal.length; i++)
|
||||
ia[i] = Integer.parseInt(aVal[i].toString());
|
||||
prop.set(ia);
|
||||
} else {
|
||||
String[] is = new String[aVal.length];
|
||||
for (int i = 0; i < aVal.length; i++)
|
||||
is[i] = aVal[i].toString();
|
||||
prop.set(is);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getMinValue() {
|
||||
return isProperty ? prop.getMinValue() : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getMaxValue() {
|
||||
return isProperty ? prop.getMaxValue() : null;
|
||||
}
|
||||
}
|
|
@ -1,14 +1,13 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.config;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
import net.minecraftforge.common.config.ConfigElement;
|
||||
import net.minecraftforge.common.config.Configuration;
|
||||
|
||||
public class GuiConfig extends net.minecraftforge.fml.client.config.GuiConfig {
|
||||
public GuiConfig(GuiScreen parentScreen) {
|
||||
super(
|
||||
parentScreen,
|
||||
new ConfigElement(ZombiesUtilsConfig.config.getCategory(Configuration.CATEGORY_GENERAL)).getChildElements(),
|
||||
ZombiesUtils.getInstance().getConfig().getRootElements(),
|
||||
"zombiesutils",
|
||||
false,
|
||||
false,
|
|
@ -7,6 +7,7 @@ import org.lwjgl.input.Keyboard;
|
|||
public class Hotkeys {
|
||||
private final KeyBinding chatMacro;
|
||||
private final KeyBinding rlSpawn;
|
||||
private final KeyBinding playerVisiblity;
|
||||
|
||||
public Hotkeys() {
|
||||
chatMacro = new KeyBinding(
|
||||
|
@ -16,7 +17,12 @@ public class Hotkeys {
|
|||
);
|
||||
rlSpawn = new KeyBinding(
|
||||
"Rocket Launcher Mode",
|
||||
Keyboard.KEY_NONE,
|
||||
Keyboard.KEY_UP,
|
||||
"Zombies Utils"
|
||||
);
|
||||
playerVisiblity = new KeyBinding(
|
||||
"Player Visibility",
|
||||
Keyboard.KEY_RIGHT,
|
||||
"Zombies Utils"
|
||||
);
|
||||
|
||||
|
@ -25,6 +31,7 @@ public class Hotkeys {
|
|||
public void registerAll() {
|
||||
ClientRegistry.registerKeyBinding(this.chatMacro);
|
||||
ClientRegistry.registerKeyBinding(this.rlSpawn);
|
||||
ClientRegistry.registerKeyBinding(this.playerVisiblity);
|
||||
}
|
||||
|
||||
public KeyBinding getChatMacro() {
|
||||
|
@ -34,4 +41,8 @@ public class Hotkeys {
|
|||
public KeyBinding getRlSpawn() {
|
||||
return rlSpawn;
|
||||
}
|
||||
|
||||
public KeyBinding getPlayerVisiblity() {
|
||||
return playerVisiblity;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,242 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.config;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.LanguageSupport;
|
||||
import net.minecraftforge.common.config.Configuration;
|
||||
import net.minecraftforge.common.config.Property;
|
||||
import net.minecraftforge.fml.client.config.DummyConfigElement;
|
||||
import net.minecraftforge.fml.client.config.IConfigElement;
|
||||
import net.minecraftforge.fml.client.event.ConfigChangedEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class ZombiesUtilsConfig {
|
||||
public final Configuration config;
|
||||
private Property sstHud;
|
||||
private Property offset;
|
||||
private Property slaToggle;
|
||||
private Property slaShortener;
|
||||
private Property shortSpawntime;
|
||||
private Property chatMacro;
|
||||
private Property defaultCategory;
|
||||
private Property language;
|
||||
private Property auditory;
|
||||
private Property cpsCounter;
|
||||
private Property announcePB;
|
||||
private Property playerVis;
|
||||
private Property playerVisRange;
|
||||
|
||||
public ZombiesUtilsConfig(Configuration config) {
|
||||
this.config = config;
|
||||
this.read();
|
||||
}
|
||||
|
||||
private void read() {
|
||||
config.load();
|
||||
|
||||
//SST
|
||||
sstHud = config.get(
|
||||
"SST",
|
||||
"enabled",
|
||||
true,
|
||||
"Show the spawn-time HUD?"
|
||||
);
|
||||
auditory = config.get(
|
||||
"SST",
|
||||
"auditory",
|
||||
new int[]{-40, -20, 0},
|
||||
"For every entry a sound will be played x ticks before the wave spawn.",
|
||||
-200,
|
||||
200,
|
||||
false,
|
||||
5
|
||||
);
|
||||
//noinspection SpellCheckingInspection
|
||||
shortSpawntime = config.get(
|
||||
"SST",
|
||||
"autohide",
|
||||
false,
|
||||
"Hide passed rounds?"
|
||||
);
|
||||
offset = config.get(
|
||||
"SST",
|
||||
"offset",
|
||||
-28,
|
||||
"Offset is added while in RL-mode",
|
||||
-200,
|
||||
200
|
||||
);
|
||||
|
||||
//SLA
|
||||
slaToggle = config.get(
|
||||
"SLA",
|
||||
"autostart",
|
||||
false,
|
||||
"Should SLA be started when a game starts?"
|
||||
);
|
||||
slaShortener = config.get(
|
||||
"SLA",
|
||||
"shortened SLA",
|
||||
true,
|
||||
"If on, inactive windows / rooms will not show"
|
||||
);
|
||||
|
||||
//Timer
|
||||
defaultCategory = config.get(
|
||||
"timer",
|
||||
"Default Category",
|
||||
"general",
|
||||
"name of the category to be selected unless specified using /runCategory"
|
||||
);
|
||||
announcePB = config.get(
|
||||
"timer",
|
||||
"announce",
|
||||
true,
|
||||
"Whether to announce PBs."
|
||||
);
|
||||
|
||||
//Player Visibility
|
||||
playerVis = config.get(
|
||||
"PlayerVis",
|
||||
"default",
|
||||
false,
|
||||
"If players should always be visible"
|
||||
);
|
||||
playerVisRange = config.get(
|
||||
"PlayerVis",
|
||||
"range",
|
||||
4,
|
||||
"The range within which players are hidden",
|
||||
0,
|
||||
50
|
||||
);
|
||||
|
||||
|
||||
//ROOT
|
||||
language = config.get(
|
||||
Configuration.CATEGORY_GENERAL,
|
||||
"Language",
|
||||
"EN",
|
||||
"Your Hypixel language",
|
||||
LanguageSupport.getLanguages()
|
||||
);
|
||||
chatMacro = config.get(
|
||||
Configuration.CATEGORY_GENERAL,
|
||||
"Chat Macro",
|
||||
"T",
|
||||
"The Text to be sent when pressing the chat-macro hotkey"
|
||||
);
|
||||
cpsCounter = config.get(
|
||||
Configuration.CATEGORY_GENERAL,
|
||||
"cps",
|
||||
false,
|
||||
"whether to show cps"
|
||||
);
|
||||
}
|
||||
|
||||
private List<IConfigElement> getSpawntimeElements() {
|
||||
return Arrays.asList(
|
||||
new CustomConfigElement("Enabled", sstHud),
|
||||
new CustomConfigElement("Auditory", auditory),
|
||||
new CustomConfigElement("RL pre-timing", offset),
|
||||
new CustomConfigElement("Truncate", shortSpawntime)
|
||||
);
|
||||
}
|
||||
|
||||
private List<IConfigElement> getSlaElements() {
|
||||
return Arrays.asList(
|
||||
new CustomConfigElement("Enabled", slaToggle),
|
||||
new CustomConfigElement("Truncate", slaShortener)
|
||||
);
|
||||
}
|
||||
|
||||
private List<IConfigElement> getTimerElements() {
|
||||
return Arrays.asList(
|
||||
new CustomConfigElement("Default category", defaultCategory),
|
||||
new CustomConfigElement("PB announcements", announcePB)
|
||||
);
|
||||
}
|
||||
|
||||
private List<IConfigElement> getPlayerVisElements() {
|
||||
return Arrays.asList(
|
||||
new CustomConfigElement("Enabled", playerVis),
|
||||
new CustomConfigElement("Range", playerVisRange)
|
||||
);
|
||||
}
|
||||
|
||||
List<IConfigElement> getRootElements() {
|
||||
return Arrays.asList(
|
||||
new CustomConfigElement("Language", language),
|
||||
new DummyConfigElement.DummyCategoryElement("Timer", "", getTimerElements()),
|
||||
new DummyConfigElement.DummyCategoryElement("SST", "", getSpawntimeElements()),
|
||||
new DummyConfigElement.DummyCategoryElement("SLA", "", getSlaElements()),
|
||||
new DummyConfigElement.DummyCategoryElement("Player Visibility", "", getPlayerVisElements()),
|
||||
new CustomConfigElement("Macro message", chatMacro),
|
||||
new CustomConfigElement("CPS counter", cpsCounter)
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
public short getOffset() {
|
||||
return (short) offset.getInt();
|
||||
}
|
||||
|
||||
public boolean isSlaToggled() {
|
||||
return slaToggle.getBoolean();
|
||||
}
|
||||
|
||||
public boolean isSlaShortened() {
|
||||
return slaShortener.getBoolean();
|
||||
}
|
||||
|
||||
public boolean isSpawntimeShortened() {
|
||||
return shortSpawntime.getBoolean();
|
||||
}
|
||||
|
||||
public String getChatMacro() {
|
||||
return chatMacro.getString();
|
||||
}
|
||||
|
||||
public String getDefaultCategory() {
|
||||
return defaultCategory.getString();
|
||||
}
|
||||
|
||||
public String getLanguage() {
|
||||
return language.getString();
|
||||
}
|
||||
|
||||
public int[] getAuditory() {
|
||||
return auditory.getIntList();
|
||||
}
|
||||
|
||||
public boolean getSST() {
|
||||
return sstHud.getBoolean();
|
||||
}
|
||||
|
||||
public boolean getCpsToggle() {
|
||||
return cpsCounter.getBoolean();
|
||||
}
|
||||
|
||||
public boolean getAnnouncePB() {
|
||||
return announcePB.getBoolean();
|
||||
}
|
||||
|
||||
public boolean getPlayerVis() {
|
||||
return playerVis.getBoolean();
|
||||
}
|
||||
|
||||
public int getPlayerVisRange() {
|
||||
return playerVisRange.getInt();
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onConfigChange(ConfigChangedEvent.@NotNull OnConfigChangedEvent event) {
|
||||
if (event.modID.equals("zombiesutils") && event.configID == null) {
|
||||
config.save();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
57
src/main/java/xyz/stachel/zombiesutils/game/GameData.java
Normal file
57
src/main/java/xyz/stachel/zombiesutils/game/GameData.java
Normal file
|
@ -0,0 +1,57 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.game;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ResourceLoader;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.waves.Round;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonElement;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class GameData {
|
||||
private final Round[][] roundData;
|
||||
|
||||
public GameData() {
|
||||
roundData = new Round[10][];
|
||||
roundData[0] = readFromFile("data/rounds/DEAD_END_NORMAL.json");
|
||||
roundData[1] = readFromFile("data/rounds/DEAD_END_HARD.json");
|
||||
roundData[2] = readFromFile("data/rounds/DEAD_END_RIP.json");
|
||||
roundData[3] = readFromFile("data/rounds/BAD_BLOOD_NORMAL.json");
|
||||
roundData[4] = readFromFile("data/rounds/BAD_BLOOD_HARD.json");
|
||||
roundData[5] = readFromFile("data/rounds/BAD_BLOOD_RIP.json");
|
||||
roundData[6] = readFromFile("data/rounds/ALIEN_ARCADIUM.json");
|
||||
roundData[7] = readFromFile("data/rounds/PRISON_NORMAL.json");
|
||||
roundData[8] = readFromFile("data/rounds/PRISON_HARD.json");
|
||||
roundData[9] = readFromFile("data/rounds/PRISON_RIP.json");
|
||||
}
|
||||
|
||||
public Round getRound(@NotNull GameMode gameMode, int round) {
|
||||
switch (gameMode) {
|
||||
case DEAD_END:
|
||||
return roundData[0][round - 1];
|
||||
case DEAD_END_HARD:
|
||||
return roundData[1][round - 1];
|
||||
case DEAD_END_RIP:
|
||||
return roundData[2][round - 1];
|
||||
case BAD_BLOOD:
|
||||
return roundData[3][round - 1];
|
||||
case BAD_BLOOD_HARD:
|
||||
return roundData[4][round - 1];
|
||||
case BAD_BLOOD_RIP:
|
||||
return roundData[5][round - 1];
|
||||
case ALIEN_ARCADIUM:
|
||||
return roundData[6][round - 1];
|
||||
case PRISON:
|
||||
return roundData[7][round - 1];
|
||||
case PRISON_HARD:
|
||||
return roundData[8][round - 1];
|
||||
case PRISON_RIP:
|
||||
return roundData[9][round - 1];
|
||||
default:
|
||||
throw new IllegalStateException("Invalid GameMode: " + gameMode);
|
||||
}
|
||||
}
|
||||
|
||||
private Round[] readFromFile(final String resourcePath) {
|
||||
final JsonElement roundsJsonElement = ResourceLoader.readJsonResource(resourcePath).orElseThrow(RuntimeException::new);
|
||||
return new Gson().fromJson(roundsJsonElement, Round[].class);
|
||||
}
|
||||
}
|
84
src/main/java/xyz/stachel/zombiesutils/game/GameMode.java
Normal file
84
src/main/java/xyz/stachel/zombiesutils/game/GameMode.java
Normal file
|
@ -0,0 +1,84 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.game;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Difficulty;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Map;
|
||||
import org.jetbrains.annotations.Contract;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public enum GameMode {
|
||||
DEAD_END(Map.DEAD_END, Difficulty.NORMAL), DEAD_END_HARD(Map.DEAD_END, Difficulty.HARD), DEAD_END_RIP(Map.DEAD_END, Difficulty.RIP),
|
||||
BAD_BLOOD(Map.BAD_BLOOD, Difficulty.NORMAL), BAD_BLOOD_HARD(Map.BAD_BLOOD, Difficulty.HARD), BAD_BLOOD_RIP(Map.BAD_BLOOD, Difficulty.RIP),
|
||||
ALIEN_ARCADIUM(Map.ALIEN_ARCADIUM, Difficulty.NORMAL),
|
||||
PRISON(Map.PRISON, Difficulty.NORMAL), PRISON_HARD(Map.PRISON, Difficulty.HARD), PRISON_RIP(Map.PRISON, Difficulty.RIP);
|
||||
private final Map map;
|
||||
private final Difficulty difficulty;
|
||||
|
||||
GameMode(final @NotNull Map map, final @NotNull Difficulty difficulty) {
|
||||
this.map = map;
|
||||
this.difficulty = difficulty;
|
||||
}
|
||||
|
||||
@Contract(pure = true)
|
||||
public static GameMode getNormalForMap(final @NotNull Map map) {
|
||||
switch (map) {
|
||||
case DEAD_END:
|
||||
return DEAD_END;
|
||||
case BAD_BLOOD:
|
||||
return BAD_BLOOD;
|
||||
case ALIEN_ARCADIUM:
|
||||
return ALIEN_ARCADIUM;
|
||||
case PRISON:
|
||||
return PRISON;
|
||||
default:
|
||||
throw new IllegalStateException("Unexpected value: " + map);
|
||||
}
|
||||
}
|
||||
|
||||
public Map getMap() {
|
||||
return this.map;
|
||||
}
|
||||
|
||||
public Difficulty getDifficulty() {
|
||||
return this.difficulty;
|
||||
}
|
||||
|
||||
public GameMode appliedDifficulty(final Difficulty difficulty) {
|
||||
switch (this.map) {
|
||||
case DEAD_END:
|
||||
switch (difficulty) {
|
||||
case NORMAL:
|
||||
return DEAD_END;
|
||||
case HARD:
|
||||
return DEAD_END_HARD;
|
||||
case RIP:
|
||||
return DEAD_END_RIP;
|
||||
}
|
||||
case BAD_BLOOD:
|
||||
switch (difficulty) {
|
||||
case NORMAL:
|
||||
return BAD_BLOOD;
|
||||
case HARD:
|
||||
return BAD_BLOOD_HARD;
|
||||
case RIP:
|
||||
return BAD_BLOOD_RIP;
|
||||
}
|
||||
case PRISON:
|
||||
switch (difficulty) {
|
||||
case NORMAL:
|
||||
return PRISON;
|
||||
case HARD:
|
||||
return PRISON_HARD;
|
||||
case RIP:
|
||||
return PRISON_RIP;
|
||||
}
|
||||
case ALIEN_ARCADIUM:
|
||||
return ALIEN_ARCADIUM;
|
||||
default:
|
||||
throw new IllegalStateException("Invalid Map: " + this.map);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isMap(Map map) {
|
||||
return this.getMap() == map;
|
||||
}
|
||||
}
|
28
src/main/java/xyz/stachel/zombiesutils/game/enums/Map.java
Normal file
28
src/main/java/xyz/stachel/zombiesutils/game/enums/Map.java
Normal file
|
@ -0,0 +1,28 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.game.enums;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.Scoreboard;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.util.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public enum Map {
|
||||
DEAD_END, BAD_BLOOD, ALIEN_ARCADIUM, PRISON;
|
||||
|
||||
public static Optional<Map> getMap() {
|
||||
World world = Minecraft.getMinecraft().theWorld;
|
||||
BlockPos pos = new BlockPos(44, 71, 0);
|
||||
if (!world.isBlockLoaded(pos) || Scoreboard.isNotZombies()) return Optional.empty();
|
||||
Block block = world.getBlockState(pos).getBlock();
|
||||
|
||||
if (block.equals(Blocks.air)) return Optional.of(Map.DEAD_END);
|
||||
if (block.equals(Blocks.wool)) return Optional.of(Map.BAD_BLOOD);
|
||||
if (block.equals(Blocks.stone_slab)) return Optional.of(Map.ALIEN_ARCADIUM);
|
||||
if (block.equals(Blocks.wooden_slab)) return Optional.of(Map.PRISON);
|
||||
|
||||
else return Optional.empty();
|
||||
}
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.game.sla;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.game.SLA;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Map;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.windows.SLA;
|
||||
|
||||
@SuppressWarnings("SpellCheckingInspection")
|
||||
public class QuickSLA {
|
|
@ -0,0 +1,37 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.game.waves;
|
||||
|
||||
public enum Prefix {
|
||||
BOSS(0xCC5555, "B", 0x7A3333),
|
||||
BLAZES(0xEFB61F, "BL", 0x8F6D0F),
|
||||
SLIME(0x88FF88, "S", 0x51A951),
|
||||
HBM(0x2A415F, "HBM", 0x193241),
|
||||
WITHER_SKELETON(0x888888, "WS", 0x515151),
|
||||
OLD_ONE(0x55AA55, "O1", 0x336633),
|
||||
GIANT(0x00FFFF, "G", 0x009999),
|
||||
POLICE(0x16537E, "P", 0x0E324D),
|
||||
CELL(0xFF8234, "C", 0x99501F),
|
||||
WINDOW(0xAAAAAA, "W", 0x666666);
|
||||
|
||||
private final int color;
|
||||
private final int fadedColor;
|
||||
private final String prefix;
|
||||
|
||||
Prefix(final int color, final String prefix, final int fadedColor) {
|
||||
this.color = color;
|
||||
this.prefix = prefix;
|
||||
this.fadedColor = fadedColor;
|
||||
}
|
||||
|
||||
public int getColor() {
|
||||
return color;
|
||||
}
|
||||
|
||||
public String getPrefix() {
|
||||
return prefix;
|
||||
}
|
||||
|
||||
public int getFadedColor() {
|
||||
return fadedColor;
|
||||
}
|
||||
|
||||
}
|
21
src/main/java/xyz/stachel/zombiesutils/game/waves/Round.java
Normal file
21
src/main/java/xyz/stachel/zombiesutils/game/waves/Round.java
Normal file
|
@ -0,0 +1,21 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.game.waves;
|
||||
|
||||
public class Round {
|
||||
private final Wave[] waves;
|
||||
|
||||
public Round(final Wave[] waves) {
|
||||
this.waves = waves;
|
||||
}
|
||||
|
||||
public Wave[] getWaves() {
|
||||
return waves;
|
||||
}
|
||||
|
||||
public short[] getWaveTimes() {
|
||||
short[] ret = new short[waves.length];
|
||||
for (int i = 0; i < waves.length; i++) {
|
||||
ret[i] = waves[i].getTime();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
25
src/main/java/xyz/stachel/zombiesutils/game/waves/Wave.java
Normal file
25
src/main/java/xyz/stachel/zombiesutils/game/waves/Wave.java
Normal file
|
@ -0,0 +1,25 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.game.waves;
|
||||
|
||||
@SuppressWarnings("DuplicatedCode")
|
||||
public class Wave {
|
||||
private final short ticks;
|
||||
private final Prefix[] prefixes;
|
||||
|
||||
public Wave(final short ticks, final Prefix[] prefixes) {
|
||||
this.ticks = ticks;
|
||||
this.prefixes = prefixes;
|
||||
}
|
||||
|
||||
public Wave(final short ticks) {
|
||||
this.ticks = ticks;
|
||||
this.prefixes = new Prefix[]{ Prefix.WINDOW };
|
||||
}
|
||||
|
||||
public short getTime() {
|
||||
return this.ticks;
|
||||
}
|
||||
|
||||
public Prefix[] getPrefixes() {
|
||||
return this.prefixes;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.game.waves;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.Scoreboard;
|
||||
import net.minecraft.client.Minecraft;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class WaveTiming {
|
||||
public static int rl = 0;
|
||||
|
||||
public static void onTick() {
|
||||
if (Scoreboard.isNotZombies()) return;
|
||||
ZombiesUtils.getInstance().getGameManager().getGame().ifPresent(
|
||||
game -> {
|
||||
short[] waves = ZombiesUtils.getInstance().getGameData().getRound(game.getGameMode(), game.getRound()).getWaveTimes();
|
||||
final int roundTime = game.getTimer().getRoundTime();
|
||||
final int[] auditory = ZombiesUtils.getInstance().getConfig().getAuditory();
|
||||
for (short wave : waves) {
|
||||
wave = (short) (wave + rl);
|
||||
final Integer pre = roundTime - wave;
|
||||
if (Arrays.stream(auditory).anyMatch(pre::equals)) {
|
||||
Minecraft.getMinecraft().thePlayer.playSound("note.pling", 1, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
public static void toggleRL() {
|
||||
if (rl == 0) rl = ZombiesUtils.getInstance().getConfig().getOffset();
|
||||
else rl = 0;
|
||||
}
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.game.windows;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.config.ZombiesUtilsConfig;
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import net.minecraft.util.Vec3;
|
||||
import org.jetbrains.annotations.Contract;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
@ -151,8 +151,116 @@ public class Room {
|
|||
}
|
||||
|
||||
@Contract(" -> new")
|
||||
public static Room @NotNull [] getPrison() {
|
||||
return new Room[0];
|
||||
public static Room @NotNull [] getP() {
|
||||
return new Room[]{
|
||||
new Room("Cell Blocks", "cb", new Window[]{
|
||||
new Window(1, 109, 144, 21),
|
||||
new Window(2, 109, 144, -19),
|
||||
new Window(3, 193, 158, -17),
|
||||
new Window(4, 193, 158, 19),
|
||||
}),
|
||||
new Room("Corridors", "co", new Window[]{
|
||||
new Window(1, 189, 144, 21),
|
||||
new Window(2, 251, 144, 31),
|
||||
new Window(3, 219, 144, -21),
|
||||
new Window(4, 233, 144, -49),
|
||||
new Window(5, 221, 158, -21),
|
||||
new Window(6, 255, 158, 9),
|
||||
new Window(7, 273, 158, 51),
|
||||
}),
|
||||
new Room("Cafeteria", "ca", new Window[]{
|
||||
new Window(1, 249, 144, 73),
|
||||
new Window(2, 189, 144, 25),
|
||||
}),
|
||||
new Room("Visitor's Room", "v", new Window[]{
|
||||
new Window(1, 261, 144, -45),
|
||||
new Window(2, 273, 144, 13)
|
||||
}),
|
||||
new Room("Library", "l", new Window[]{
|
||||
new Window(1, 265, 158, 9),
|
||||
new Window(2, 263, 158, -47),
|
||||
}),
|
||||
new Room("Monitor Room", "mt", new Window[]{
|
||||
new Window(1, 201, 158, 25),
|
||||
new Window(2, 197, 158, 3),
|
||||
}),
|
||||
new Room("Medical Bay", "mt", new Window[]{
|
||||
new Window(1, 249, 158, 31),
|
||||
new Window(2, 223, 158, 53),
|
||||
}),
|
||||
new Room("The Courts", "cs", new Window[]{
|
||||
new Window(1, 285, 144, 81),
|
||||
new Window(2, 247, 144, 157),
|
||||
new Window(3, 211, 144, 157),
|
||||
}),
|
||||
new Room("Offices", "o", new Window[]{
|
||||
new Window(1, 153, 144, 161),
|
||||
new Window(2, 151, 144, 191),
|
||||
new Window(3, 99, 144, 181),
|
||||
new Window(4, 123, 144, 163),
|
||||
new Window(5, 71, 144, 163),
|
||||
}),
|
||||
new Room("Head Manager's Office", "h", new Window[]{
|
||||
new Window(1, 179, 158, 169),
|
||||
new Window(2, 179, 158, 177),
|
||||
new Window(3, 79, 158, 177),
|
||||
new Window(4, 79, 158, 169),
|
||||
}),
|
||||
new Room("Basement Corridor", "bc", new Window[]{
|
||||
new Window(1, 231, 130, 29),
|
||||
new Window(2, 193, 130, 31),
|
||||
}),
|
||||
new Room("The Deep", "d", new Window[]{
|
||||
new Window(1, 167, 126, -45),
|
||||
new Window(2, 163, 122, 13),
|
||||
new Window(3, 193, 122, 13),
|
||||
}),
|
||||
new Room("Boiler Room", "b", new Window[]{
|
||||
new Window(1, 107, 126, -11),
|
||||
new Window(2, 125, 126, 25),
|
||||
new Window(3, 163, 130, -45),
|
||||
new Window(4, 107, 130, -45),
|
||||
}),
|
||||
new Room("Yard", "y", new Window[]{
|
||||
new Window(1, 185, 144, 79),
|
||||
new Window(2, 189, 144, 119),
|
||||
new Window(3, 107, 144, 121),
|
||||
}),
|
||||
new Room("Alleyway", "a", new Window[]{
|
||||
new Window(1, 101, 144, 133),
|
||||
new Window(2, 147, 144, 117)
|
||||
}),
|
||||
new Room("Guard's Gunroom", "gr", new Window[]{
|
||||
new Window(1, 29, 148, 75),
|
||||
new Window(2, 29, 144, 43),
|
||||
new Window(3, 65, 126, 5),
|
||||
}),
|
||||
new Room("Guard's Quarters", "q", new Window[]{
|
||||
new Window(1, 83, 148, 83),
|
||||
new Window(2, 57, 148, 35),
|
||||
}),
|
||||
new Room("Stockage", "st", new Window[]{
|
||||
new Window(1, 241, 130, -25),
|
||||
new Window(2, 227, 130, -45),
|
||||
}),
|
||||
new Room("Kitchen", "k", new Window[]{
|
||||
new Window(1, 261, 144, 33),
|
||||
new Window(2, 271, 144, 45),
|
||||
}),
|
||||
new Room("Isolation", "i", new Window[]{
|
||||
new Window(1, 75, 144, 91),
|
||||
new Window(2, 29, 144, 87),
|
||||
}),
|
||||
new Room("Showers", "sh", new Window[]{
|
||||
new Window(1, 37, 144, 15),
|
||||
new Window(2, 37, 144, -11),
|
||||
}),
|
||||
new Room("???", "?", new Window[]{
|
||||
new Window(1, 191, 126, -67),
|
||||
new Window(2, 207, 126, -67),
|
||||
}),
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
|
@ -179,7 +287,8 @@ public class Room {
|
|||
StringBuilder slaString = new StringBuilder(String.format("§6%s§r§d %x§e:", this.getName(), activeWindowCount));
|
||||
for (Window window : this.windows) {
|
||||
if (window.isActive()) slaString.append("§2 ").append(alias).append(window.getID());
|
||||
else if (!ZombiesUtilsConfig.isSlaShortened()) slaString.append("§c ").append(alias).append(window.getID());
|
||||
else if (!ZombiesUtils.getInstance().getConfig().isSlaShortened())
|
||||
slaString.append("§c ").append(alias).append(window.getID());
|
||||
}
|
||||
return slaString.toString();
|
||||
}
|
|
@ -1,9 +1,7 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.game;
|
||||
package com.github.stachelbeere1248.zombiesutils.game.windows;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Map;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.windows.Room;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.windows.Window;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.entity.EntityPlayerSP;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
@ -28,6 +26,9 @@ public class SLA {
|
|||
case ALIEN_ARCADIUM:
|
||||
this.rooms = Room.getAA();
|
||||
break;
|
||||
case PRISON:
|
||||
this.rooms = new Room[0];
|
||||
break;
|
||||
default:
|
||||
throw new IllegalStateException("Unexpected value: " + map);
|
||||
}
|
||||
|
@ -68,15 +69,14 @@ public class SLA {
|
|||
ZombiesUtils.getInstance().getLogger().info("Window \"0\" is now at %s %s %s" + (double) win0[0] / 2 + (double) win0[1] / 2 + (double) win0[2] / 2);
|
||||
}
|
||||
|
||||
public void refreshActives() {
|
||||
private void refreshActives() {
|
||||
final EntityPlayerSP player = Minecraft.getMinecraft().thePlayer;
|
||||
final double[] playerCoords = {
|
||||
(player.posX - offset[0]),
|
||||
player.posY - offset[1],
|
||||
player.posZ - offset[2]
|
||||
};
|
||||
for (Room room : rooms
|
||||
) {
|
||||
for (Room room : rooms) {
|
||||
room.resetActiveWindowCount();
|
||||
for (Window window : room.getWindows()
|
||||
) {
|
||||
|
@ -86,7 +86,8 @@ public class SLA {
|
|||
}
|
||||
|
||||
// (2x)²+(2y)²+(2z)² = 4(x²+y²+z²) = 4d²
|
||||
if (distanceDoubledThenSquared < 10000) {
|
||||
final int slaRange = 50;
|
||||
if (distanceDoubledThenSquared < 4 * slaRange * slaRange) {
|
||||
window.setActive(true);
|
||||
room.increaseActiveWindowCount();
|
||||
} else window.setActive(false);
|
||||
|
@ -95,7 +96,8 @@ public class SLA {
|
|||
}
|
||||
|
||||
public Room[] getRooms() {
|
||||
return rooms;
|
||||
this.refreshActives();
|
||||
return this.rooms;
|
||||
}
|
||||
|
||||
public void resetOffset() {
|
|
@ -0,0 +1,35 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.handlers;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Difficulty;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.LanguageSupport;
|
||||
import net.minecraftforge.client.event.ClientChatReceivedEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class ChatHandler {
|
||||
private static final Pattern STRIP_COLOR_PATTERN = Pattern.compile("§[0-9A-FK-ORZ]", Pattern.CASE_INSENSITIVE);
|
||||
|
||||
public ChatHandler() {
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void difficultyChange(@NotNull final ClientChatReceivedEvent event) {
|
||||
if (event.message.getUnformattedText().contains(":")) return;
|
||||
final String message = STRIP_COLOR_PATTERN.matcher(event.message.getUnformattedText()).replaceAll("").trim();
|
||||
|
||||
if (LanguageSupport.containsHard(message)) {
|
||||
ZombiesUtils.getInstance().getGameManager().setDifficulty(Difficulty.HARD);
|
||||
} else if (LanguageSupport.containsRIP(message)) {
|
||||
ZombiesUtils.getInstance().getGameManager().setDifficulty(Difficulty.RIP);
|
||||
} else {
|
||||
ZombiesUtils.getInstance().getGameManager().getGame().ifPresent(
|
||||
game -> {
|
||||
if (LanguageSupport.isHelicopterIncoming(message)) game.helicopter();
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.handlers;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
|
||||
public class Handlers {
|
||||
private final RenderGameOverlayHandler renderer;
|
||||
private final RenderPlayerHandler renderPlayerHandler;
|
||||
|
||||
public Handlers() {
|
||||
renderer = new RenderGameOverlayHandler();
|
||||
renderPlayerHandler = new RenderPlayerHandler();
|
||||
}
|
||||
|
||||
public void registerAll() {
|
||||
MinecraftForge.EVENT_BUS.register(ZombiesUtils.getInstance().getConfig());
|
||||
MinecraftForge.EVENT_BUS.register(renderer);
|
||||
MinecraftForge.EVENT_BUS.register(renderPlayerHandler);
|
||||
MinecraftForge.EVENT_BUS.register(new TickHandler());
|
||||
MinecraftForge.EVENT_BUS.register(new ChatHandler());
|
||||
MinecraftForge.EVENT_BUS.register(new KeyInputHandler());
|
||||
}
|
||||
|
||||
public RenderGameOverlayHandler getRenderer() {
|
||||
return renderer;
|
||||
}
|
||||
|
||||
public RenderPlayerHandler getRenderPlayerHandler() {
|
||||
return renderPlayerHandler;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.handlers;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.config.Hotkeys;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.waves.WaveTiming;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.gameevent.InputEvent;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
import org.lwjgl.input.Mouse;
|
||||
|
||||
|
||||
public class KeyInputHandler {
|
||||
@SubscribeEvent
|
||||
public void onKeyInput(InputEvent event) {
|
||||
if (Minecraft.getMinecraft().currentScreen != null) return;
|
||||
if (event instanceof InputEvent.KeyInputEvent) {
|
||||
if (Keyboard.getEventKey() == '\0') return;
|
||||
if (Keyboard.getEventKeyState()) {
|
||||
final Hotkeys hotkeys = ZombiesUtils.getInstance().getHotkeys();
|
||||
if (Keyboard.getEventKey() == hotkeys.getChatMacro().getKeyCode()) Minecraft.getMinecraft().thePlayer
|
||||
.sendChatMessage(ZombiesUtils.getInstance().getConfig().getChatMacro());
|
||||
else if (Keyboard.getEventKey() == hotkeys.getRlSpawn().getKeyCode()) {
|
||||
ZombiesUtils.getInstance().getHandlers().getRenderer().toggleRL();
|
||||
WaveTiming.toggleRL();
|
||||
} else if (Keyboard.getEventKey() == hotkeys.getPlayerVisiblity().getKeyCode()) {
|
||||
ZombiesUtils.getInstance().getHandlers().getRenderPlayerHandler().togglePlayerVisibility();
|
||||
}
|
||||
}
|
||||
} else if (event instanceof InputEvent.MouseInputEvent) {
|
||||
if (Mouse.getEventButtonState()) {
|
||||
if (Mouse.getEventButton() == 1) ZombiesUtils.getInstance().getHandlers().getRenderer().addClick();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,166 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.handlers;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.waves.Prefix;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.waves.Wave;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.windows.Room;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.windows.SLA;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.Game;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.Scoreboard;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.client.gui.ScaledResolution;
|
||||
import net.minecraftforge.client.event.RenderGameOverlayEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class RenderGameOverlayHandler {
|
||||
private final byte[] clicks = new byte[20];
|
||||
private final FontRenderer fontRenderer;
|
||||
private int rl = 0;
|
||||
private int clickPointer = 0;
|
||||
|
||||
public RenderGameOverlayHandler() {
|
||||
this.fontRenderer = Objects.requireNonNull(Minecraft.getMinecraft().fontRendererObj, "FontRenderer must not be null!");
|
||||
}
|
||||
|
||||
private static String getTimeString(long timerTicks) {
|
||||
final long minutesPart = (timerTicks * 50) / 60000;
|
||||
final long secondsPart = ((timerTicks * 50) % 60000) / 1000;
|
||||
final long tenthSecondsPart = ((timerTicks * 50) % 1000) / 100;
|
||||
return String.format("%d:%02d.%d", minutesPart, secondsPart, tenthSecondsPart);
|
||||
}
|
||||
|
||||
void toggleRL() {
|
||||
if (rl == 0) rl = ZombiesUtils.getInstance().getConfig().getOffset();
|
||||
else rl = 0;
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onRenderGameOverlay(RenderGameOverlayEvent.@NotNull Post event) {
|
||||
if (event.type != RenderGameOverlayEvent.ElementType.TEXT) return;
|
||||
|
||||
ZombiesUtils.getInstance().getGameManager().getGame().ifPresent(
|
||||
game -> {
|
||||
renderTime(game.getTimer().getRoundTime());
|
||||
renderSpawnTime(
|
||||
game
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
if (!Minecraft.getMinecraft().gameSettings.showDebugInfo)
|
||||
SLA.getInstance().ifPresent(sla -> renderSla(sla.getRooms()));
|
||||
if (ZombiesUtils.getInstance().getConfig().getCpsToggle()) renderCPS();
|
||||
}
|
||||
|
||||
private void renderTime(short timerTicks) {
|
||||
if (Scoreboard.isNotZombies()) return;
|
||||
|
||||
final String time = getTimeString(timerTicks);
|
||||
final int width = fontRenderer.getStringWidth(time);
|
||||
|
||||
final ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
|
||||
final int screenWidth = scaledResolution.getScaledWidth();
|
||||
final int screenHeight = scaledResolution.getScaledHeight();
|
||||
|
||||
fontRenderer.drawStringWithShadow(
|
||||
time,
|
||||
screenWidth - width,
|
||||
screenHeight - fontRenderer.FONT_HEIGHT,
|
||||
0xFFFFFF
|
||||
);
|
||||
}
|
||||
|
||||
private void renderSla(Room @NotNull [] rooms) {
|
||||
int y = 0;
|
||||
for (Room room : rooms) {
|
||||
if (ZombiesUtils.getInstance().getConfig().isSlaShortened() && room.getActiveWindowCount() == 0) continue;
|
||||
fontRenderer.drawStringWithShadow(
|
||||
room.getSlaString(),
|
||||
1,
|
||||
1 + y * fontRenderer.FONT_HEIGHT,
|
||||
0xFFFFFF
|
||||
);
|
||||
y++;
|
||||
}
|
||||
}
|
||||
|
||||
private void renderSpawnTime(final Game game) {
|
||||
if (!ZombiesUtils.getInstance().getConfig().getSST() || Scoreboard.isNotZombies()) return;
|
||||
final ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
|
||||
final int screenWidth = scaledResolution.getScaledWidth();
|
||||
final int screenHeight = scaledResolution.getScaledHeight();
|
||||
final Wave[] round = ZombiesUtils.getInstance().getGameData().getRound(game.getGameMode(), game.getRound()).getWaves();
|
||||
final int roundTime = game.getTimer().getRoundTime();
|
||||
final int length = round.length + 1;
|
||||
int heightIndex = 0;
|
||||
int color = 0xFFFF55;
|
||||
boolean faded = false;
|
||||
|
||||
for (Wave wave : round) {
|
||||
final short spawnTime = (short) (wave.getTime() + rl);
|
||||
if (roundTime > spawnTime) {
|
||||
if (!ZombiesUtils.getInstance().getConfig().isSpawntimeShortened()) faded = true;
|
||||
else {
|
||||
heightIndex++;
|
||||
continue;
|
||||
}
|
||||
} else faded = false;
|
||||
final String spawnTimeString = " W" + (heightIndex + 1) + ": " + getTimeString(spawnTime);
|
||||
int width = fontRenderer.getStringWidth(spawnTimeString);
|
||||
fontRenderer.drawStringWithShadow(
|
||||
spawnTimeString,
|
||||
screenWidth - width,
|
||||
screenHeight - fontRenderer.FONT_HEIGHT * (length - heightIndex),
|
||||
faded ? 0x666666 : color
|
||||
);
|
||||
for (Prefix prefix : wave.getPrefixes()) {
|
||||
final String prefixString = prefix.getPrefix() + " ";
|
||||
width += fontRenderer.getStringWidth(prefixString);
|
||||
fontRenderer.drawStringWithShadow(
|
||||
prefixString,
|
||||
screenWidth - width,
|
||||
screenHeight - fontRenderer.FONT_HEIGHT * (length - heightIndex),
|
||||
faded ? prefix.getFadedColor() : prefix.getColor()
|
||||
);
|
||||
}
|
||||
if (!faded) color = 0xAAAAAA;
|
||||
heightIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void renderCPS() {
|
||||
final String cps = String.format("%2d", getClicks());
|
||||
final ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
|
||||
final int screenWidth = scaledResolution.getScaledWidth();
|
||||
final int width = fontRenderer.getStringWidth(cps);
|
||||
|
||||
fontRenderer.drawStringWithShadow(
|
||||
cps,
|
||||
screenWidth - width,
|
||||
0,
|
||||
0xAAAAAA
|
||||
);
|
||||
}
|
||||
|
||||
public int getClicks() {
|
||||
int i = 0;
|
||||
for (byte tick : clicks) {
|
||||
i += tick;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
public void addClick() {
|
||||
clicks[clickPointer]++;
|
||||
}
|
||||
|
||||
public void tick() {
|
||||
clickPointer = (clickPointer + 1) % 20;
|
||||
clicks[clickPointer] = 0;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.handlers;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.util.ChatComponentText;
|
||||
import net.minecraft.util.Vec3;
|
||||
import net.minecraftforge.client.event.RenderPlayerEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class RenderPlayerHandler {
|
||||
private boolean visible;
|
||||
|
||||
public RenderPlayerHandler() {
|
||||
this.visible = ZombiesUtils.getInstance().getConfig().getPlayerVis();
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onRender(RenderPlayerEvent.@NotNull Pre event) {
|
||||
if (event.entityPlayer.isPlayerSleeping() || event.entityPlayer.isUser()) return;
|
||||
if (inRange(event.entityPlayer.getPositionVector())) {
|
||||
event.setCanceled(!visible);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean inRange(@NotNull Vec3 playerOther) {
|
||||
final int range = ZombiesUtils.getInstance().getConfig().getPlayerVisRange();
|
||||
return playerOther.squareDistanceTo(Minecraft.getMinecraft().thePlayer.getPositionVector()) <= range * range;
|
||||
}
|
||||
|
||||
public void togglePlayerVisibility() {
|
||||
this.visible = !this.visible;
|
||||
final String s;
|
||||
if (this.visible) {
|
||||
s = "§dPlayer Visibility §e is now §rON";
|
||||
} else {
|
||||
s = "§dPlayer Visibility §e is now §8OFF";
|
||||
}
|
||||
Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(
|
||||
s
|
||||
));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.handlers;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.Timer;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.Scoreboard;
|
||||
import net.minecraft.entity.monster.EntityZombie;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public class Round1Correction {
|
||||
|
||||
private final Timer timer;
|
||||
private final String serverNumber;
|
||||
|
||||
public Round1Correction(Timer timer, String serverNumber) {
|
||||
this.timer = timer;
|
||||
this.serverNumber = serverNumber;
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onWaveSpawn(@NotNull EntityJoinWorldEvent event) {
|
||||
if (!(event.entity instanceof EntityZombie)) return;
|
||||
if (Scoreboard.isNotZombies()) return;
|
||||
final Optional<String> s = Scoreboard.getServerNumber();
|
||||
if (!s.isPresent()) return;
|
||||
if (!s.get().equals(serverNumber)) {
|
||||
MinecraftForge.EVENT_BUS.unregister(this);
|
||||
return;
|
||||
}
|
||||
this.timer.correctStartTick();
|
||||
MinecraftForge.EVENT_BUS.unregister(this);
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.handlers;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.waves.WaveTiming;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.Scoreboard;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
|
@ -12,5 +13,6 @@ public class TickHandler {
|
|||
if (event.phase == TickEvent.Phase.START) return;
|
||||
Scoreboard.refresh();
|
||||
WaveTiming.onTick();
|
||||
ZombiesUtils.getInstance().getHandlers().getRenderer().tick();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,188 @@
|
|||
package xyz.stachel.zombiesutils.init;
|
||||
|
||||
import org.spongepowered.asm.lib.tree.ClassNode;
|
||||
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
|
||||
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Stream;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipInputStream;
|
||||
|
||||
/**
|
||||
* A mixin plugin to automatically discover all mixins in the current JAR.
|
||||
* <p>
|
||||
* This mixin plugin automatically scans your entire JAR (or class directory, in case of an in-IDE launch) for classes inside of your
|
||||
* mixin package and registers those. It does this recursively for sub packages of the mixin package as well. This means you will need
|
||||
* to only have mixin classes inside of your mixin package, which is good style anyway.
|
||||
*
|
||||
* @author Linnea Gräf
|
||||
*/
|
||||
public class AutoDiscoveryMixinPlugin implements IMixinConfigPlugin {
|
||||
private static final List<AutoDiscoveryMixinPlugin> mixinPlugins = new ArrayList<>();
|
||||
|
||||
public static List<AutoDiscoveryMixinPlugin> getMixinPlugins() {
|
||||
return mixinPlugins;
|
||||
}
|
||||
|
||||
private String mixinPackage;
|
||||
|
||||
@Override
|
||||
public void onLoad(String mixinPackage) {
|
||||
this.mixinPackage = mixinPackage;
|
||||
mixinPlugins.add(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves the base class root for a given class URL. This resolves either the JAR root, or the class file root.
|
||||
* In either case the return value of this + the class name will resolve back to the original class url, or to other
|
||||
* class urls for other classes.
|
||||
*/
|
||||
public URL getBaseUrlForClassUrl(URL classUrl) {
|
||||
String string = classUrl.toString();
|
||||
if (classUrl.getProtocol().equals("jar")) {
|
||||
try {
|
||||
return new URL(string.substring(4).split("!")[0]);
|
||||
} catch (MalformedURLException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
if (string.endsWith(".class")) {
|
||||
try {
|
||||
return new URL(string.replace("\\", "/")
|
||||
.replace(getClass().getCanonicalName()
|
||||
.replace(".", "/") + ".class", ""));
|
||||
} catch (MalformedURLException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
return classUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the package that contains all the mixins. This value is set by mixin itself using {@link #onLoad}.
|
||||
*/
|
||||
public String getMixinPackage() {
|
||||
return mixinPackage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the path inside the class root to the mixin package
|
||||
*/
|
||||
public String getMixinBaseDir() {
|
||||
return mixinPackage.replace(".", "/");
|
||||
}
|
||||
|
||||
/**
|
||||
* A list of all discovered mixins.
|
||||
*/
|
||||
private List<String> mixins = null;
|
||||
|
||||
/**
|
||||
* Try to add mixin class ot the mixins based on the filepath inside of the class root.
|
||||
* Removes the {@code .class} file suffix, as well as the base mixin package.
|
||||
* <p><b>This method cannot be called after mixin initialization.</p>
|
||||
*
|
||||
* @param className the name or path of a class to be registered as a mixin.
|
||||
*/
|
||||
public void tryAddMixinClass(String className) {
|
||||
String norm = (className.endsWith(".class") ? className.substring(0, className.length() - ".class".length()) : className)
|
||||
.replace("\\", "/")
|
||||
.replace("/", ".");
|
||||
if (norm.startsWith(getMixinPackage() + ".") && !norm.endsWith(".")) {
|
||||
mixins.add(norm.substring(getMixinPackage().length() + 1));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Search through the JAR or class directory to find mixins contained in {@link #getMixinPackage()}
|
||||
*/
|
||||
@Override
|
||||
public List<String> getMixins() {
|
||||
if (mixins != null) return mixins;
|
||||
System.out.println("Trying to discover mixins");
|
||||
mixins = new ArrayList<>();
|
||||
URL classUrl = getClass().getProtectionDomain().getCodeSource().getLocation();
|
||||
System.out.println("Found classes at " + classUrl);
|
||||
Path file;
|
||||
try {
|
||||
file = Paths.get(getBaseUrlForClassUrl(classUrl).toURI());
|
||||
} catch (URISyntaxException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
System.out.println("Base directory found at " + file);
|
||||
if (Files.isDirectory(file)) {
|
||||
walkDir(file);
|
||||
} else {
|
||||
walkJar(file);
|
||||
}
|
||||
System.out.println("Found mixins: " + mixins);
|
||||
|
||||
return mixins;
|
||||
}
|
||||
|
||||
/**
|
||||
* Search through directory for mixin classes based on {@link #getMixinBaseDir}.
|
||||
*
|
||||
* @param classRoot The root directory in which classes are stored for the default package.
|
||||
*/
|
||||
private void walkDir(Path classRoot) {
|
||||
System.out.println("Trying to find mixins from directory");
|
||||
try (Stream<Path> classes = Files.walk(classRoot.resolve(getMixinBaseDir()))) {
|
||||
classes.map(it -> classRoot.relativize(it).toString())
|
||||
.forEach(this::tryAddMixinClass);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read through a JAR file, trying to find all mixins inside.
|
||||
*/
|
||||
private void walkJar(Path file) {
|
||||
System.out.println("Trying to find mixins from jar file");
|
||||
try (ZipInputStream zis = new ZipInputStream(Files.newInputStream(file))) {
|
||||
ZipEntry next;
|
||||
while ((next = zis.getNextEntry()) != null) {
|
||||
tryAddMixinClass(next.getName());
|
||||
zis.closeEntry();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRefMapperConfig() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.mixin;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.InvalidMapException;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.LanguageSupport;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.ScoardboardException;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.Scoreboard;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.network.NetHandlerPlayClient;
|
||||
import net.minecraft.network.play.server.S29PacketSoundEffect;
|
||||
import net.minecraft.network.play.server.S45PacketTitle;
|
||||
import net.minecraft.util.ChatComponentText;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Unique;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||
|
||||
@Mixin(NetHandlerPlayClient.class)
|
||||
public class MixinNetHandlerPlayClient {
|
||||
@Unique
|
||||
private boolean zombies_utils$alienUfoOpened;
|
||||
|
||||
@Inject(method = "handleSoundEffect", at = @At(value = "HEAD"))
|
||||
private void handleSound(S29PacketSoundEffect packetIn, CallbackInfo ci) {
|
||||
zombies_utils$handleSound(packetIn);
|
||||
}
|
||||
|
||||
@Inject(method = "handleTitle", at = @At(value = "HEAD"))
|
||||
private void handleTitle(S45PacketTitle packetIn, CallbackInfo ci) {
|
||||
zombies_utils$handleTitle(packetIn);
|
||||
}
|
||||
|
||||
@Unique
|
||||
private void zombies_utils$handleSound(@NotNull S29PacketSoundEffect packet) {
|
||||
if (Scoreboard.isNotZombies()) return;
|
||||
final String soundEffect = packet.getSoundName();
|
||||
|
||||
if (!(
|
||||
soundEffect.equals("mob.wither.spawn")
|
||||
|| (soundEffect.equals("mob.guardian.curse")
|
||||
&& !zombies_utils$alienUfoOpened)
|
||||
)) return;
|
||||
|
||||
zombies_utils$alienUfoOpened = soundEffect.equals("mob.guardian.curse");
|
||||
|
||||
try {
|
||||
ZombiesUtils.getInstance().getGameManager().splitOrNew(Scoreboard.getRound());
|
||||
} catch (ScoardboardException | InvalidMapException e) {
|
||||
Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§cFailed to start or split timer. Please send a log to Stachelbeere1248."));
|
||||
ZombiesUtils.getInstance().getLogger().error(e.fillInStackTrace());
|
||||
}
|
||||
}
|
||||
|
||||
@Unique
|
||||
private void zombies_utils$handleTitle(@NotNull S45PacketTitle packet) {
|
||||
if (packet.getType() != S45PacketTitle.Type.TITLE) return;
|
||||
if (Scoreboard.isNotZombies()) return;
|
||||
final String message = packet.getMessage().getUnformattedText().trim();
|
||||
String serverNumber;
|
||||
serverNumber = Scoreboard.getServerNumber().orElse("");
|
||||
if (LanguageSupport.isWin(message)) ZombiesUtils.getInstance().getGameManager().endGame(serverNumber, true);
|
||||
if (LanguageSupport.isLoss(message)) ZombiesUtils.getInstance().getGameManager().endGame(serverNumber, false);
|
||||
}
|
||||
|
||||
}
|
129
src/main/java/xyz/stachel/zombiesutils/timer/Game.java
Normal file
129
src/main/java/xyz/stachel/zombiesutils/timer/Game.java
Normal file
|
@ -0,0 +1,129 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.timer;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.GameMode;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Difficulty;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Map;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.windows.SLA;
|
||||
import com.github.stachelbeere1248.zombiesutils.handlers.Round1Correction;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.recorder.Category;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.recorder.files.CategoryFile;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.recorder.files.GameFile;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.util.ChatComponentText;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class Game {
|
||||
private final Timer timer;
|
||||
private final GameFile gameFile;
|
||||
private final boolean roundOneRecorded;
|
||||
private GameMode gameMode;
|
||||
private Category category;
|
||||
private int round;
|
||||
private boolean escaping;
|
||||
|
||||
public Game(@NotNull final Map map, final String serverNumber) {
|
||||
this.gameMode = GameMode.getNormalForMap(map);
|
||||
this.timer = new Timer();
|
||||
this.gameFile = new GameFile(serverNumber, map);
|
||||
this.category = new Category();
|
||||
this.round = 1;
|
||||
this.roundOneRecorded = true;
|
||||
|
||||
MinecraftForge.EVENT_BUS.register(new Round1Correction(this.timer, serverNumber));
|
||||
if (ZombiesUtils.getInstance().getConfig().isSlaToggled()) SLA.instance = new SLA(map);
|
||||
}
|
||||
|
||||
public Game(@NotNull final Map map, final String serverNumber, final int round) {
|
||||
this.gameMode = GameMode.getNormalForMap(map);
|
||||
this.timer = new Timer();
|
||||
this.gameFile = new GameFile(serverNumber, map);
|
||||
this.category = new Category();
|
||||
this.round = round;
|
||||
this.roundOneRecorded = (round == 1);
|
||||
|
||||
MinecraftForge.EVENT_BUS.register(new Round1Correction(this.timer, serverNumber));
|
||||
if (ZombiesUtils.getInstance().getConfig().isSlaToggled()) SLA.instance = new SLA(map);
|
||||
|
||||
}
|
||||
|
||||
public Timer getTimer() {
|
||||
return this.timer;
|
||||
}
|
||||
|
||||
public void setCategory(Category category) {
|
||||
this.category = category;
|
||||
}
|
||||
|
||||
public void changeDifficulty(final Difficulty difficulty) {
|
||||
this.gameMode = this.gameMode.appliedDifficulty(difficulty);
|
||||
}
|
||||
|
||||
public int getRound() {
|
||||
return round;
|
||||
}
|
||||
|
||||
public GameMode getGameMode() {
|
||||
return gameMode;
|
||||
}
|
||||
|
||||
public void pass(int round) {
|
||||
if ((round == 0) || (this.round == round + 1) || (this.timer.getRoundTime() < 100)) {
|
||||
ZombiesUtils.getInstance().getLogger().debug("SPLIT CANCELLED");
|
||||
return;
|
||||
}
|
||||
try {
|
||||
record();
|
||||
} catch (Exception e) {
|
||||
ZombiesUtils.getInstance().getLogger().error(ExceptionUtils.getStackTrace(e));
|
||||
Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§cError recording splits"));
|
||||
}
|
||||
this.timer.split();
|
||||
this.round = round + 1;
|
||||
}
|
||||
|
||||
public void helicopter() {
|
||||
if (!gameMode.isMap(Map.PRISON)) {
|
||||
Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("§cEscaping without playing prison???"));
|
||||
ZombiesUtils.getInstance().getLogger().error(Thread.currentThread().getStackTrace());
|
||||
return;
|
||||
}
|
||||
this.escaping = true;
|
||||
this.pass(30);
|
||||
}
|
||||
|
||||
private void record() {
|
||||
this.compareSegment();
|
||||
if (this.roundOneRecorded) this.compareBest();
|
||||
this.gameFile.setSegment(this.round, this.timer.getRoundTime());
|
||||
}
|
||||
|
||||
public void compareSegment() throws IndexOutOfBoundsException {
|
||||
if (this.escaping) return;
|
||||
final CategoryFile categoryFile = this.category.getByGameMode(this.gameMode);
|
||||
final short bestSegment = categoryFile.getBestSegment(round);
|
||||
final int roundTime = this.getTimer().getRoundTime();
|
||||
|
||||
if (bestSegment == (short) 0) categoryFile.setBestSegment(round, roundTime);
|
||||
else if (roundTime < bestSegment) categoryFile.setBestSegment(round, roundTime);
|
||||
final RecordMessageSender recordMessageSender = new RecordMessageSender(this.category.getName(), round, roundTime, bestSegment);
|
||||
recordMessageSender.roundSplit();
|
||||
recordMessageSender.sendRecordMessage();
|
||||
}
|
||||
|
||||
public void compareBest() throws IndexOutOfBoundsException {
|
||||
final CategoryFile categoryFile = this.category.getByGameMode(this.gameMode);
|
||||
final int round = this.escaping ? 31 : this.round;
|
||||
final int personalBest = categoryFile.getPersonalBest(round);
|
||||
final int gameTime = this.timer.getGameTime();
|
||||
|
||||
if (personalBest == 0) categoryFile.setPersonalBest(round, gameTime);
|
||||
else if (gameTime < personalBest) categoryFile.setPersonalBest(round, gameTime);
|
||||
final RecordMessageSender recordMessageSender = new RecordMessageSender(category.getName(), round, gameTime, personalBest);
|
||||
if (!escaping) recordMessageSender.gameSplit();
|
||||
else recordMessageSender.helicopterSplit();
|
||||
recordMessageSender.sendRecordMessage();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.timer;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Difficulty;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Map;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.InvalidMapException;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.ScoardboardException;
|
||||
import com.github.stachelbeere1248.zombiesutils.utils.Scoreboard;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
public class GameManager {
|
||||
private final HashMap<String, Game> GAMES;
|
||||
private Optional<Difficulty> queuedDifficulty = Optional.empty();
|
||||
private String queuedDifficultyServer = "INVALID";
|
||||
|
||||
public GameManager() {
|
||||
GAMES = new HashMap<>();
|
||||
}
|
||||
|
||||
public Optional<Game> getGame() {
|
||||
return Scoreboard.getServerNumber().map(GAMES::get);
|
||||
}
|
||||
|
||||
public void endGame(final String serverNumber, final boolean isWin) {
|
||||
if (!GAMES.containsKey(serverNumber)) return;
|
||||
final Game game = GAMES.get(serverNumber);
|
||||
if (isWin) {
|
||||
switch (game.getGameMode().getMap()) {
|
||||
case DEAD_END:
|
||||
case BAD_BLOOD:
|
||||
case PRISON:
|
||||
game.pass(30);
|
||||
break;
|
||||
case ALIEN_ARCADIUM:
|
||||
game.pass(105);
|
||||
break;
|
||||
}
|
||||
}
|
||||
GAMES.remove(serverNumber);
|
||||
|
||||
}
|
||||
|
||||
public void splitOrNew(int round) throws ScoardboardException, InvalidMapException {
|
||||
final String serverNumber = Scoreboard.getServerNumber().orElseThrow(ScoardboardException::new);
|
||||
if (GAMES.containsKey(serverNumber)) {
|
||||
if (round == 0) newGame(serverNumber);
|
||||
else GAMES.get(serverNumber).pass(round);
|
||||
} else newGame(serverNumber);
|
||||
}
|
||||
|
||||
private void newGame(@NotNull String serverNumber) throws InvalidMapException {
|
||||
final Game game = new Game(Map.getMap().orElseThrow(InvalidMapException::new), serverNumber);
|
||||
if (serverNumber.equals(queuedDifficultyServer)) {
|
||||
this.queuedDifficulty.ifPresent(game::changeDifficulty);
|
||||
}
|
||||
this.queuedDifficulty = Optional.empty();
|
||||
this.GAMES.put(serverNumber, game);
|
||||
}
|
||||
|
||||
public void setDifficulty(@NotNull Difficulty difficulty) {
|
||||
this.queuedDifficultyServer = Scoreboard.getServerNumber().orElse("INVALID");
|
||||
if (this.GAMES.containsKey(this.queuedDifficultyServer)) {
|
||||
this.GAMES.get(this.queuedDifficultyServer).changeDifficulty(difficulty);
|
||||
} else this.queuedDifficulty = Optional.of(difficulty);
|
||||
}
|
||||
|
||||
public Set<String> getGames() {
|
||||
return this.GAMES.keySet();
|
||||
}
|
||||
|
||||
public void killAll() {
|
||||
GAMES.clear();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,104 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.timer;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.event.ClickEvent;
|
||||
import net.minecraft.util.ChatComponentText;
|
||||
import net.minecraft.util.ChatStyle;
|
||||
import org.jetbrains.annotations.Contract;
|
||||
|
||||
public class RecordMessageSender {
|
||||
private final StringBuilder recordMessage;
|
||||
private final int newTime;
|
||||
private final int oldTime;
|
||||
private final int round;
|
||||
private final String deltaString;
|
||||
private final String timeString;
|
||||
private String copyString;
|
||||
|
||||
public RecordMessageSender(final String categoryName, final int round, final int newTime, final int oldTime) {
|
||||
this.recordMessage = new StringBuilder(
|
||||
"§l§a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬\n§e Category: §d" + categoryName
|
||||
);
|
||||
this.newTime = newTime;
|
||||
this.oldTime = oldTime;
|
||||
this.deltaString = oldTime != 0 ? " " + formattedDelta(newTime, oldTime) : "";
|
||||
this.timeString = formattedTime(newTime);
|
||||
this.round = round;
|
||||
}
|
||||
|
||||
public void sendRecordMessage() {
|
||||
final ChatComponentText message = new ChatComponentText(
|
||||
this.recordMessage
|
||||
.append("\n§l§a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬")
|
||||
.toString()
|
||||
);
|
||||
message.setChatStyle(new ChatStyle().setChatClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, this.copyString)));
|
||||
Minecraft.getMinecraft().thePlayer.addChatMessage(message);
|
||||
}
|
||||
|
||||
public void gameSplit() {
|
||||
final String announcement = newTime < oldTime && ZombiesUtils.getInstance().getConfig().getAnnouncePB() ?
|
||||
"\n§e§l***§6§l NEW PERSONAL BEST! §e§l***" : "";
|
||||
this.recordMessage.append(announcement)
|
||||
.append("\n§cRound ")
|
||||
.append(round)
|
||||
.append("§e finished at §a")
|
||||
.append(timeString)
|
||||
.append("§9")
|
||||
.append(deltaString)
|
||||
.append("§e!");
|
||||
this.copyString = deltaString.isEmpty() ?
|
||||
String.format("Round %d finished at %s!", round, timeString) :
|
||||
String.format("Round %d finished at %s (%s)!", round, timeString, deltaString);
|
||||
}
|
||||
|
||||
public void roundSplit() {
|
||||
final String announcement = newTime < oldTime && ZombiesUtils.getInstance().getConfig().getAnnouncePB() ?
|
||||
"\n§e§l***§6§l NEW BEST SEGMENT! §e§l***" : "";
|
||||
final String timeString = formattedTime(newTime);
|
||||
final String deltaString = oldTime != 0 ? formattedDelta(newTime, oldTime) : "";
|
||||
this.recordMessage.append(announcement)
|
||||
.append("\n§cRound ")
|
||||
.append(round)
|
||||
.append("§e took §a")
|
||||
.append(timeString)
|
||||
.append("§9")
|
||||
.append(deltaString)
|
||||
.append("§e!");
|
||||
this.copyString = deltaString.isEmpty() ?
|
||||
String.format("Round %d took %s!", round, timeString) :
|
||||
String.format("Round %d took %s (%s)!", round, timeString, deltaString);
|
||||
}
|
||||
|
||||
public void helicopterSplit() {
|
||||
final String announcement = newTime < oldTime && ZombiesUtils.getInstance().getConfig().getAnnouncePB() ?
|
||||
"\n§e§l***§6§l NEW PERSONAL BEST! §e§l***" : "";
|
||||
this.recordMessage.append(announcement)
|
||||
.append("\n§8§lHelicopter §r§ecalled at §a")
|
||||
.append(timeString)
|
||||
.append("§9")
|
||||
.append(deltaString)
|
||||
.append("§e!");
|
||||
this.copyString = deltaString.isEmpty() ?
|
||||
String.format("Helicopter called at %s!", timeString) :
|
||||
String.format("Helicopter called at %s (%s)!", timeString, deltaString);
|
||||
}
|
||||
|
||||
@Contract(pure = true)
|
||||
private String formattedTime(int time) {
|
||||
time *= 50;
|
||||
return String.format("%d:%02d.%d%d",
|
||||
time / 60000,
|
||||
(time % 60000) / 1000,
|
||||
(time % 1000) / 100,
|
||||
(time % 100) / 10
|
||||
);
|
||||
}
|
||||
|
||||
@Contract(pure = true)
|
||||
private String formattedDelta(int newTime, int oldTime) {
|
||||
final double delta = (double) (newTime - oldTime) / 20;
|
||||
return String.format("%+.2f", delta);
|
||||
}
|
||||
}
|
35
src/main/java/xyz/stachel/zombiesutils/timer/Timer.java
Normal file
35
src/main/java/xyz/stachel/zombiesutils/timer/Timer.java
Normal file
|
@ -0,0 +1,35 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.timer;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
|
||||
public class Timer {
|
||||
|
||||
private long startTick;
|
||||
private int roundStart;
|
||||
|
||||
public Timer() {
|
||||
this.startTick = this.getCurrentTick();
|
||||
}
|
||||
|
||||
public void correctStartTick() {
|
||||
this.startTick = this.getCurrentTick() - 200;
|
||||
}
|
||||
|
||||
void split() {
|
||||
this.roundStart = this.getGameTime();
|
||||
}
|
||||
|
||||
public int getGameTime() {
|
||||
return (int) (getCurrentTick() - startTick);
|
||||
}
|
||||
|
||||
public short getRoundTime() {
|
||||
return (short) (getGameTime() - roundStart);
|
||||
}
|
||||
|
||||
private long getCurrentTick() {
|
||||
if (Minecraft.getMinecraft() == null || Minecraft.getMinecraft().theWorld == null) return 0;
|
||||
return Minecraft.getMinecraft().theWorld.getTotalWorldTime();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,79 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.timer.recorder;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.GameMode;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.recorder.files.CategoryFile;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class Category {
|
||||
private static String selectedCategory = ZombiesUtils.getInstance().getConfig().getDefaultCategory();
|
||||
public final CategoryFile[] categoryFiles = new CategoryFile[10];
|
||||
private final String name;
|
||||
|
||||
public Category() {
|
||||
final File category;
|
||||
if (ZombiesUtils.isHypixel()) category = new File(new File("zombies", "splits"), selectedCategory);
|
||||
else category = new File(new File("zombies", "practise-splits"), selectedCategory);
|
||||
categoryFiles[0] = new CategoryFile(category, GameMode.DEAD_END);
|
||||
categoryFiles[1] = new CategoryFile(category, GameMode.DEAD_END_HARD);
|
||||
categoryFiles[2] = new CategoryFile(category, GameMode.DEAD_END_RIP);
|
||||
|
||||
categoryFiles[3] = new CategoryFile(category, GameMode.BAD_BLOOD);
|
||||
categoryFiles[4] = new CategoryFile(category, GameMode.BAD_BLOOD_HARD);
|
||||
categoryFiles[5] = new CategoryFile(category, GameMode.BAD_BLOOD_RIP);
|
||||
|
||||
categoryFiles[6] = new CategoryFile(category, GameMode.ALIEN_ARCADIUM);
|
||||
|
||||
categoryFiles[7] = new CategoryFile(category, GameMode.PRISON);
|
||||
categoryFiles[8] = new CategoryFile(category, GameMode.PRISON_HARD);
|
||||
categoryFiles[9] = new CategoryFile(category, GameMode.PRISON_RIP);
|
||||
|
||||
this.name = Category.selectedCategory;
|
||||
}
|
||||
|
||||
public static void setSelectedCategory(String selectedCategory) {
|
||||
Category.selectedCategory = selectedCategory;
|
||||
ZombiesUtils.getInstance().getGameManager().getGame().ifPresent(game -> game.setCategory(new Category()));
|
||||
}
|
||||
|
||||
public static String[] getCategories() {
|
||||
File dir;
|
||||
if (ZombiesUtils.isHypixel()) dir = new File("zombies" + File.separator + "splits");
|
||||
else dir = new File("zombies" + File.separator + "practise-splits");
|
||||
if (dir.isDirectory()) return dir.list();
|
||||
else return new String[0];
|
||||
}
|
||||
|
||||
public CategoryFile getByGameMode(@NotNull GameMode gameMode) {
|
||||
switch (gameMode) {
|
||||
case DEAD_END:
|
||||
return categoryFiles[0];
|
||||
case DEAD_END_HARD:
|
||||
return categoryFiles[1];
|
||||
case DEAD_END_RIP:
|
||||
return categoryFiles[2];
|
||||
case BAD_BLOOD:
|
||||
return categoryFiles[3];
|
||||
case BAD_BLOOD_HARD:
|
||||
return categoryFiles[4];
|
||||
case BAD_BLOOD_RIP:
|
||||
return categoryFiles[5];
|
||||
case ALIEN_ARCADIUM:
|
||||
return categoryFiles[6];
|
||||
case PRISON:
|
||||
return categoryFiles[7];
|
||||
case PRISON_HARD:
|
||||
return categoryFiles[8];
|
||||
case PRISON_RIP:
|
||||
return categoryFiles[9];
|
||||
default:
|
||||
throw new IllegalStateException("Unexpected value: " + gameMode);
|
||||
}
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
}
|
|
@ -28,7 +28,7 @@ public class FileManager {
|
|||
return gson.fromJson(dataJson, CategoryData.class);
|
||||
}
|
||||
|
||||
public static void createDataFile(@NotNull SplitsFile file, ISplitsData data) {
|
||||
public static void createDataFile(@NotNull File file, ISplitsData data) {
|
||||
try {
|
||||
//noinspection ResultOfMethodCallIgnored
|
||||
file.getParentFile().mkdirs();
|
||||
|
@ -40,7 +40,7 @@ public class FileManager {
|
|||
}
|
||||
}
|
||||
|
||||
public static void writeDataToFile(SplitsFile file, @NotNull ISplitsData data) throws IOException {
|
||||
public static void writeDataToFile(File file, @NotNull ISplitsData data) throws IOException {
|
||||
FileUtils.writeStringToFile(file, data.toJSON(), StandardCharsets.UTF_16);
|
||||
}
|
||||
|
|
@ -22,6 +22,10 @@ public class CategoryData implements ISplitsData {
|
|||
bestSegments = new short[30];
|
||||
personalBests = new int[30];
|
||||
break;
|
||||
case PRISON:
|
||||
bestSegments = new short[30];
|
||||
personalBests = new int[31];
|
||||
break;
|
||||
default:
|
||||
throw new IllegalStateException("Not a map: " + map);
|
||||
}
|
||||
|
@ -29,7 +33,8 @@ public class CategoryData implements ISplitsData {
|
|||
Arrays.fill(personalBests, 0);
|
||||
}
|
||||
|
||||
@Override @NotNull
|
||||
@Override
|
||||
@NotNull
|
||||
public String toJSON() {
|
||||
Gson gson = new Gson();
|
||||
return gson.toJson(this, CategoryData.class);
|
||||
|
@ -43,8 +48,8 @@ public class CategoryData implements ISplitsData {
|
|||
return personalBests[index];
|
||||
}
|
||||
|
||||
public void setBestSegment(int index, short ticks) {
|
||||
bestSegments[index] = ticks;
|
||||
public void setBestSegment(int index, int ticks) {
|
||||
bestSegments[index] = (short) ticks;
|
||||
}
|
||||
|
||||
public void setPersonalBest(int index, int ticks) {
|
|
@ -19,19 +19,23 @@ public class GameData implements ISplitsData {
|
|||
case BAD_BLOOD:
|
||||
segments = new short[30];
|
||||
break;
|
||||
case PRISON:
|
||||
segments = new short[31];
|
||||
break;
|
||||
default:
|
||||
throw new IllegalStateException("Not a map: " + map);
|
||||
}
|
||||
Arrays.fill(segments, (short) 0);
|
||||
}
|
||||
|
||||
@Override @NotNull
|
||||
@Override
|
||||
@NotNull
|
||||
public String toJSON() {
|
||||
Gson gson = new Gson();
|
||||
return gson.toJson(this.segments);
|
||||
}
|
||||
|
||||
public void setSegment(int index, short ticks) {
|
||||
segments[index] = ticks;
|
||||
public void setSegment(int index, int ticks) {
|
||||
segments[index] = (short) ticks;
|
||||
}
|
||||
}
|
|
@ -3,7 +3,6 @@ package com.github.stachelbeere1248.zombiesutils.timer.recorder.files;
|
|||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.GameMode;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.recorder.FileManager;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.recorder.SplitsFile;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.recorder.data.CategoryData;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.util.ChatComponentText;
|
||||
|
@ -12,14 +11,14 @@ import org.jetbrains.annotations.NotNull;
|
|||
|
||||
import java.io.File;
|
||||
|
||||
public class CategoryFile extends SplitsFile {
|
||||
public class CategoryFile extends File {
|
||||
private final CategoryData data;
|
||||
private final GameMode gameMode;
|
||||
|
||||
public CategoryFile(File category, @NotNull GameMode gameMode) {
|
||||
// Game-directory -> custom category -> file named "MAP_DIFFICULTY.times"
|
||||
// Content encoded in StandardCharsets.UTF_16
|
||||
super(category, gameMode.getMap() + "_" + gameMode.getDifficulty() + ".times");
|
||||
super(category, gameMode + ".times");
|
||||
this.gameMode = gameMode;
|
||||
this.data = FileManager.categoryReadOrCreate(this);
|
||||
}
|
||||
|
@ -28,7 +27,7 @@ public class CategoryFile extends SplitsFile {
|
|||
return this.data.getBestSegment(round - 1);
|
||||
}
|
||||
|
||||
public void setBestSegment(int round, short ticks) {
|
||||
public void setBestSegment(int round, int ticks) {
|
||||
this.data.setBestSegment(round - 1, ticks);
|
||||
|
||||
try {
|
|
@ -4,7 +4,6 @@ package com.github.stachelbeere1248.zombiesutils.timer.recorder.files;
|
|||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Map;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.recorder.FileManager;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.recorder.SplitsFile;
|
||||
import com.github.stachelbeere1248.zombiesutils.timer.recorder.data.GameData;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.util.ChatComponentText;
|
||||
|
@ -16,7 +15,7 @@ import java.time.LocalDateTime;
|
|||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
|
||||
public class GameFile extends SplitsFile {
|
||||
public class GameFile extends File {
|
||||
private final GameData data;
|
||||
|
||||
public GameFile(String serverNumber, Map map) {
|
||||
|
@ -24,13 +23,14 @@ public class GameFile extends SplitsFile {
|
|||
this.data = new GameData(map);
|
||||
FileManager.createDataFile(this, this.data);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static String formattedTime() {
|
||||
final LocalDateTime dateTime = LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES);
|
||||
return dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME).replace(':', '-').replaceFirst("T", "_");
|
||||
}
|
||||
|
||||
public void setSegment(int round, short ticks) {
|
||||
public void setSegment(int round, int ticks) {
|
||||
this.data.setSegment(round - 1, ticks);
|
||||
|
||||
try {
|
|
@ -0,0 +1,4 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.utils;
|
||||
|
||||
public class InvalidMapException extends Exception {
|
||||
}
|
|
@ -7,7 +7,7 @@ import java.util.regex.Pattern;
|
|||
|
||||
@SuppressWarnings("SpellCheckingInspection")
|
||||
public class LanguageSupport {
|
||||
private static final String[] LANGUAGEs = {
|
||||
private static final String[] LANGUAGES = {
|
||||
"EN",
|
||||
"FR",
|
||||
"DE"
|
||||
|
@ -52,6 +52,13 @@ public class LanguageSupport {
|
|||
return Arrays.stream(words).anyMatch(input::contains);
|
||||
}
|
||||
|
||||
public static boolean isHelicopterIncoming(@NotNull String input) {
|
||||
final String[] words = {
|
||||
"The Helicopter is on its way! Hold out for 120 more seconds!"
|
||||
};
|
||||
return Arrays.stream(words).anyMatch(input::contains);
|
||||
}
|
||||
|
||||
public static @NotNull Pattern roundPattern(@NotNull String language) {
|
||||
switch (language) {
|
||||
case "EN":
|
||||
|
@ -65,20 +72,7 @@ public class LanguageSupport {
|
|||
}
|
||||
}
|
||||
|
||||
public static @NotNull Pattern mapPattern(@NotNull String language) {
|
||||
switch (language) {
|
||||
case "EN":
|
||||
return Pattern.compile("Map:.*(Dead End|Bad Blood|Alien Arcadium)");
|
||||
case "FR":
|
||||
return Pattern.compile("Carte:.*(Dead End|Bad Blood|Alien Arcadium)");
|
||||
case "DE":
|
||||
return Pattern.compile("Karte:.*(Dead End|Bad Blood|Alien Arcadium)");
|
||||
default:
|
||||
throw new IllegalStateException("Unexpected value: " + language);
|
||||
}
|
||||
}
|
||||
|
||||
public static String[] getLanguages() {
|
||||
return LANGUAGEs;
|
||||
return LANGUAGES;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.utils;
|
||||
|
||||
public class ScoardboardException extends Exception {
|
||||
public ScoardboardException() {
|
||||
}
|
||||
}
|
|
@ -1,8 +1,6 @@
|
|||
package com.github.stachelbeere1248.zombiesutils.utils;
|
||||
|
||||
import com.github.stachelbeere1248.zombiesutils.ZombiesUtils;
|
||||
import com.github.stachelbeere1248.zombiesutils.config.ZombiesUtilsConfig;
|
||||
import com.github.stachelbeere1248.zombiesutils.game.enums.Map;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Lists;
|
||||
import net.minecraft.client.Minecraft;
|
||||
|
@ -43,31 +41,30 @@ public class Scoreboard {
|
|||
// get
|
||||
title = STRIP_COLOR_PATTERN.matcher(sidebar.getDisplayName().trim()).replaceAll("");
|
||||
Collection<Score> scoreCollection = scoreboard.getSortedScores(sidebar);
|
||||
List<Score> filteredScores = scoreCollection.stream().filter(input -> input.getPlayerName() != null && !input.getPlayerName().startsWith("#")).collect(Collectors.toList());
|
||||
List<Score> filteredScores = scoreCollection
|
||||
.stream()
|
||||
.filter(input -> input.getPlayerName() != null && !input.getPlayerName().startsWith("#"))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
List<Score> scores;
|
||||
if (filteredScores.size() > 15)
|
||||
scores = Lists.newArrayList(Iterables.skip(filteredScores, scoreCollection.size() - 15));
|
||||
else scores = filteredScores;
|
||||
List<Score> scores = (filteredScores.size() > 15) ? Lists.newArrayList(Iterables.skip(filteredScores, scoreCollection.size() - 15)) : filteredScores;
|
||||
scores = Lists.reverse(scores);
|
||||
|
||||
lines = new ArrayList<>();
|
||||
for (Score score : scores
|
||||
) {
|
||||
lines = new ArrayList<>(scores.size());
|
||||
for (Score score : scores) {
|
||||
ScorePlayerTeam team = scoreboard.getPlayersTeam(score.getPlayerName());
|
||||
String scoreboardLine = ScorePlayerTeam.formatPlayerName(team, score.getPlayerName()).trim();
|
||||
lines.add(STRIP_COLOR_PATTERN.matcher(SIDEBAR_EMOJI_PATTERN.matcher(scoreboardLine).replaceAll("")).replaceAll(""));
|
||||
}
|
||||
}
|
||||
|
||||
public static byte getRound() {
|
||||
public static int getRound() {
|
||||
String line;
|
||||
try {
|
||||
line = lines.get(2);
|
||||
} catch (IndexOutOfBoundsException | NullPointerException ignored) {
|
||||
return 0;
|
||||
}
|
||||
final Pattern ROUND_LINE_PATTERN = LanguageSupport.roundPattern(ZombiesUtilsConfig.getLanguage());
|
||||
final Pattern ROUND_LINE_PATTERN = LanguageSupport.roundPattern(ZombiesUtils.getInstance().getConfig().getLanguage());
|
||||
|
||||
String string = ROUND_LINE_PATTERN.matcher(line).replaceAll("$1");
|
||||
|
||||
|
@ -94,36 +91,6 @@ public class Scoreboard {
|
|||
return Optional.ofNullable(string);
|
||||
}
|
||||
|
||||
public static Optional<Map> getMap() {
|
||||
String line;
|
||||
try {
|
||||
line = lines.get(12);
|
||||
} catch (Exception couldBePregame) {
|
||||
try {
|
||||
line = lines.get(2);
|
||||
} catch (IndexOutOfBoundsException | NullPointerException ignored) {
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
final Pattern MAP_PATTERN = LanguageSupport.mapPattern(ZombiesUtilsConfig.getLanguage());
|
||||
String mapString = MAP_PATTERN.matcher(line).replaceAll("$1");
|
||||
switch (mapString) {
|
||||
case "Dead End":
|
||||
return Optional.of(Map.DEAD_END);
|
||||
case "Bad Blood":
|
||||
return Optional.of(Map.BAD_BLOOD);
|
||||
case "Alien Arcadium":
|
||||
return Optional.of(Map.ALIEN_ARCADIUM);
|
||||
default:
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static int getLineCount() {
|
||||
return lines.size();
|
||||
}
|
||||
|
||||
public static boolean isNotZombies() {
|
||||
return (!"ZOMBIES".equals(title));
|
||||
}
|
2
src/main/resources/accesstransformer.cfg
Normal file
2
src/main/resources/accesstransformer.cfg
Normal file
|
@ -0,0 +1,2 @@
|
|||
|
||||
public net.minecraft.client.renderer.GlStateManager$Color
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,692 @@
|
|||
[
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON",
|
||||
"BOSS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 760,
|
||||
"prefixes": [
|
||||
"HBM"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 760,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 760,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM",
|
||||
"BOSS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"HBM",
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
|
@ -0,0 +1,687 @@
|
|||
[
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON",
|
||||
"BOSS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 760,
|
||||
"prefixes": [
|
||||
"HBM"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 760,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 760,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM",
|
||||
"BOSS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
|
@ -0,0 +1,697 @@
|
|||
[
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"SLIME"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON",
|
||||
"BOSS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"WITHER_SKELETON",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 760,
|
||||
"prefixes": [
|
||||
"HBM"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 760,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 760,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM",
|
||||
"BOSS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM",
|
||||
"BOSS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"HBM"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
|
@ -0,0 +1,658 @@
|
|||
[
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 700,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 700,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 740,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 880,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 940,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 760,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 960,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BLAZES"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 920,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 940,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 940,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BLAZES"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 940,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 940,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 980,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 880,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 840,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 860,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 860,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 720,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 880,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 840,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 840,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
|
@ -0,0 +1,655 @@
|
|||
[
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 700,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 700,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 740,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 880,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 940,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 760,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 960,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BLAZES"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 920,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 940,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 940,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BLAZES"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 940,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 940,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 980,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 880,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 840,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 860,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 860,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 720,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 880,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 840,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 840,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
|
@ -0,0 +1,663 @@
|
|||
[
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 700,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 700,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 740,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 880,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 940,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 760,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 960,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BLAZES"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 920,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 940,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 940,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 940,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 940,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 980,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 880,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 840,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 860,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 860,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 460,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 720,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 880,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 840,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 840,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
|
@ -0,0 +1,738 @@
|
|||
[
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 340,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 620,
|
||||
"prefixes": [
|
||||
"CELL",
|
||||
"POLICE"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 340,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 620,
|
||||
"prefixes": [
|
||||
"CELL",
|
||||
"POLICE"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"CELL",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"CELL"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"CELL",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 800,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 700,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 800,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 740,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 740,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 800,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 740,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 840,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 800,
|
||||
"prefixes": [
|
||||
"BOSS",
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 700,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1100,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 800,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1100,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 0,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 300,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1200,
|
||||
"prefixes": [
|
||||
"BOSS",
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1800,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 2100,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
|
@ -0,0 +1,738 @@
|
|||
[
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 340,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 620,
|
||||
"prefixes": [
|
||||
"CELL",
|
||||
"POLICE"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 340,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 620,
|
||||
"prefixes": [
|
||||
"CELL",
|
||||
"POLICE"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"CELL",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"CELL"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"CELL",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 800,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 700,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 800,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 740,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 740,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 800,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 740,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 840,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 800,
|
||||
"prefixes": [
|
||||
"BOSS",
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 700,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1100,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 800,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1100,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 0,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 300,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1200,
|
||||
"prefixes": [
|
||||
"BOSS",
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1800,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 2100,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
|
@ -0,0 +1,738 @@
|
|||
[
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 340,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 620,
|
||||
"prefixes": [
|
||||
"CELL",
|
||||
"POLICE"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 340,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 480,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 620,
|
||||
"prefixes": [
|
||||
"CELL",
|
||||
"POLICE"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"CELL",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"CELL"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"CELL",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 800,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 700,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"CELL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 800,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW",
|
||||
"POLICE"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 740,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 680,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 740,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 800,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 740,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 440,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 840,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 800,
|
||||
"prefixes": [
|
||||
"BOSS",
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 400,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 700,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1100,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 800,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1000,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1100,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 200,
|
||||
"prefixes": [
|
||||
"BOSS"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"waves": [
|
||||
{
|
||||
"ticks": 0,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 300,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 600,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 900,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1200,
|
||||
"prefixes": [
|
||||
"BOSS",
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1500,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 1800,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ticks": 2100,
|
||||
"prefixes": [
|
||||
"WINDOW"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
|
@ -2,17 +2,17 @@
|
|||
{
|
||||
"modid": "${modid}",
|
||||
"name": "Zombies Utils",
|
||||
"description": "",
|
||||
"description": "An all-in-one mod for Hypixel Zombies. Targets legit speed-runners.",
|
||||
"version": "${version}",
|
||||
"mcversion": "${mcversion}",
|
||||
"url": "https://github.com/Stachelbeere1248/zombies-utils",
|
||||
"updateUrl": "https://github.com/Stachelbeere1248/zombies-utils/releases",
|
||||
"updateUrl": "https://github.com/Stachelbeere1248/zombies-utils/blob/master/update.json",
|
||||
"authorList": [
|
||||
"Stachelbeere1248"
|
||||
],
|
||||
"credits": "Seosean, thamid-23",
|
||||
"logoFile": "",
|
||||
"logoFile": "zombiesutils.png",
|
||||
"screenshots": [],
|
||||
"dependencies": []
|
||||
}
|
||||
]
|
||||
]
|
||||
|
|
|
@ -1,11 +1,8 @@
|
|||
{
|
||||
"package": "com.github.stachelbeere1248.zombiesutils.mixin",
|
||||
"package": "${basePackage}.mixin",
|
||||
"plugin": "${basePackage}.init.AutoDiscoveryMixinPlugin",
|
||||
"refmap": "mixins.${modid}.refmap.json",
|
||||
"minVersion": "0.7",
|
||||
"compatibilityLevel": "JAVA_8",
|
||||
"mixins": [
|
||||
],
|
||||
"client": [
|
||||
"MixinNetHandlerPlayClient"
|
||||
]
|
||||
"__comment": "You do not need to manually register mixins in this template. Check the auto discovery mixin plugin for more info."
|
||||
}
|
||||
|
|
BIN
src/main/resources/zombiesutils.png
Normal file
BIN
src/main/resources/zombiesutils.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 273 B |
13
update.json
Normal file
13
update.json
Normal file
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"homepage": "https://github.com/Stachelbeere1248/zombies-utils/releases",
|
||||
"promos": {
|
||||
"1.8.9-latest": "1.3.7",
|
||||
"1.8.9-recommended": "1.3.7"
|
||||
},
|
||||
"1.8.9": {
|
||||
"1.3.6": "SST Prefixes, added update checker url",
|
||||
"1.3.7-PRE_1": "patch: difficiluty detection",
|
||||
"1.3.7-PRE_2": "fix instant crash",
|
||||
"1.3.7": "mark release, fix faded prefix colors"
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue